From db45ae3c64c1c12ba030bef504194f5273598bb6 Mon Sep 17 00:00:00 2001 From: boryanagoncharenko <3010723+boryanagoncharenko@users.noreply.github.com> Date: Mon, 6 Jan 2025 13:58:35 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=93=9C=20Fix=20daily=20Weblate=20errors?= =?UTF-8?q?=20(#6086)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Translated using Weblate (Polish) Currently translated at 99.8% (739 of 740 strings) Translated using Weblate (English) Currently translated at 100.0% (740 of 740 strings) Co-authored-by: Karina Olejnik Translate-URL: https://hosted.weblate.org/projects/hedy/adventures/en/ Translate-URL: https://hosted.weblate.org/projects/hedy/adventures/pl/ Translation: Hedy/Adventures * Translated using Weblate (Tamil) Currently translated at 100.0% (403 of 403 strings) Translated using Weblate (Tamil) Currently translated at 78.2% (579 of 740 strings) Translated using Weblate (Tamil) Currently translated at 100.0% (1207 of 1207 strings) Translated using Weblate (Tamil) Currently translated at 93.5% (2045 of 2185 strings) Translated using Weblate (Tamil) Currently translated at 100.0% (403 of 403 strings) Translated using Weblate (Tamil) Currently translated at 100.0% (44 of 44 strings) Translated using Weblate (Tamil) Currently translated at 95.9% (618 of 644 strings) Translated using Weblate (Tamil) Currently translated at 100.0% (50 of 50 strings) Translated using Weblate (Tamil) Currently translated at 100.0% (24 of 24 strings) Translated using Weblate (Tamil) Currently translated at 85.7% (162 of 189 strings) Translated using Weblate (Tamil) Currently translated at 100.0% (67 of 67 strings) Translated using Weblate (Tamil) Currently translated at 78.2% (579 of 740 strings) Co-authored-by: தமிழ்நேரம் Translate-URL: https://hosted.weblate.org/projects/hedy/adventures/ta/ Translate-URL: https://hosted.weblate.org/projects/hedy/client-messages/ta/ Translate-URL: https://hosted.weblate.org/projects/hedy/commands/ta/ Translate-URL: https://hosted.weblate.org/projects/hedy/keywords/ta/ Translate-URL: https://hosted.weblate.org/projects/hedy/parsons/ta/ Translate-URL: https://hosted.weblate.org/projects/hedy/quizzes/ta/ Translate-URL: https://hosted.weblate.org/projects/hedy/slides/ta/ Translate-URL: https://hosted.weblate.org/projects/hedy/tutorials/ta/ Translate-URL: https://hosted.weblate.org/projects/hedy/web-texts/ta/ Translate-URL: https://hosted.weblate.org/projects/hedy/webpages/ta/ Translation: Hedy/Adventures Translation: Hedy/Cheatsheets Translation: Hedy/Keywords Translation: Hedy/Parsons Translation: Hedy/Quizzes Translation: Hedy/Texts Translation: Hedy/Tutorials Translation: Hedy/Webpages Translation: Hedy/client-messages Translation: Hedy/slides * Translated using Weblate (German) Currently translated at 85.6% (634 of 740 strings) Co-authored-by: wiemachendiedasnur Translate-URL: https://hosted.weblate.org/projects/hedy/adventures/de/ Translation: Hedy/Adventures * Translated using Weblate (Ukrainian) Currently translated at 100.0% (740 of 740 strings) Co-authored-by: Максим Горпиніч Translate-URL: https://hosted.weblate.org/projects/hedy/adventures/uk/ Translation: Hedy/Adventures * Translated using Weblate (Catalan) Currently translated at 63.0% (406 of 644 strings) Translated using Weblate (Catalan) Currently translated at 98.5% (729 of 740 strings) Translated using Weblate (Catalan) Currently translated at 8.9% (36 of 403 strings) Translated using Weblate (Catalan) Currently translated at 100.0% (50 of 50 strings) Translated using Weblate (Catalan) Currently translated at 7.6% (92 of 1207 strings) Translated using Weblate (Catalan) Currently translated at 7.1% (156 of 2185 strings) Translated using Weblate (Catalan) Currently translated at 63.0% (406 of 644 strings) Translated using Weblate (Catalan) Currently translated at 95.9% (710 of 740 strings) Co-authored-by: aniollidon Translate-URL: https://hosted.weblate.org/projects/hedy/adventures/ca/ Translate-URL: https://hosted.weblate.org/projects/hedy/parsons/ca/ Translate-URL: https://hosted.weblate.org/projects/hedy/quizzes/ca/ Translate-URL: https://hosted.weblate.org/projects/hedy/slides/ca/ Translate-URL: https://hosted.weblate.org/projects/hedy/web-texts/ca/ Translate-URL: https://hosted.weblate.org/projects/hedy/webpages/ca/ Translation: Hedy/Adventures Translation: Hedy/Parsons Translation: Hedy/Quizzes Translation: Hedy/Texts Translation: Hedy/Webpages Translation: Hedy/slides * Revert "Translated using Weblate (Tamil)" This reverts commit f036e3325ae9f02ebafc734457041e770c3034f8. * 🤖 Automatically update generated files * Fix a snippet error Catalan for rock adventure in level 9 --------- Co-authored-by: Karina Olejnik Co-authored-by: தமிழ்நேரம் Co-authored-by: wiemachendiedasnur Co-authored-by: Максим Горпиніч Co-authored-by: aniollidon Co-authored-by: boryanagoncharenko --- content/adventures/ca.yaml | 333 ++++++++++++++++++++---- content/adventures/de.yaml | 18 +- content/adventures/en.yaml | 2 +- content/adventures/pl.yaml | 2 +- content/adventures/uk.yaml | 2 +- content/pages/ca.yaml | 9 +- content/parsons/ca.yaml | 2 +- content/quizzes/ca.yaml | 32 +-- content/slides/ca.yaml | 27 +- static/js/appbundle.js | 2 +- static/js/appbundle.js.map | 2 +- static/js/message-translations.ts | 2 +- translations/ca/LC_MESSAGES/messages.po | 201 +++++--------- 13 files changed, 382 insertions(+), 252 deletions(-) diff --git a/content/adventures/ca.yaml b/content/adventures/ca.yaml index 18785a65e05..21a0104c7d2 100644 --- a/content/adventures/ca.yaml +++ b/content/adventures/ca.yaml @@ -2,7 +2,7 @@ adventures: story: name: Història default_save_name: Història - description: Història + description: Crea un conte levels: 1: story_text: | @@ -11,7 +11,7 @@ adventures: A la primera línia, utilitza `{ask}` per preguntar qui serà el protagonista de la història. Després d'aquesta primera línia, comença amb `{print}` quan calgui imprimir la frase. - Feu servir `{echo}` quan vulguis que el nom del protagonista estigui al final de la frase. + Fes servir `{echo}` quan vulguis que el nom del protagonista estigui al final de la frase. example_code: | ``` {ask} Qui és el protagonista d'aquesta història? @@ -22,11 +22,11 @@ adventures: ``` story_text_2: | ### Exercici - Ara crea la teva pròpia història d'almenys 6 línies de codi. + Ara crea una història pròpia d'almenys 6 línies de codi. Aquesta història no pot ser la mateixa que el codi d'exemple. - Utilitzeu almenys una ordre `{ask}` i una `{echo}`. - Podeu fer-ho sobre qualsevol tema que us agradi. - Si no se t'acut un tema, pots fes servir una de les nostres opcions: anar al cinema, un partit esportiu o un dia al zoo. + Fes servir almenys una comanda `{ask}` i una d'`{echo}`. + Pots fer-ho sobre qualsevol tema que t'agradi. + Si no se t'acut cap tema, et proposem algunes opcions: camí cap al cinema, jugant un partit d'algun esport o la visita d'un dia al zoo. 2: story_text: | Al nivell 2 pots fer que la teva història sigui més divertida. El nom del teu protagonista ara pot estar en qualsevol part de la frase. @@ -46,7 +46,7 @@ adventures: story_text_2: | ### Exercici Ara és el moment d'afegir variables a la història que has fet al nivell anterior. - Ves a "Els meus programes", busca la teva aventura d'història de nivell 1 i copia'n el codi. Enganxa'l la pantalla d'entrada en aquest nivell. + Ves a "Els meus programes", busca l'aventura d'història de nivell 1 i copia'n el codi. Enganxa'l la pantalla d'entrada en aquest nivell. Aquest codi no funcionarà en aquest nivell, perquè encara no has utilitzat variables. Canvia les ordres `{ask}` i les ordres `{echo}` del teu codi a la forma correcta que heu après en aquest nivell. @@ -54,7 +54,7 @@ adventures: **Extra** Afegeix una ordre `{sleep}` al teu codi per afegir tensió a la teva història. 3: story_text: | - Al nivell 3 pots fer que la teva història sigui més divertida. Podeu utilitzar l'aleatorietat per a qualsevol monstre, animal o altre obstacle, com aquí: + Al nivell 3 pots fer que la història que vas fer sigui més divertida. Pots utilitzar l'aleatorietat per a qualsevol monstre, animal o altre obstacle, com aquí: example_code: | ``` animals {is} 🦔, 🐿, 🦉, 🦇 @@ -89,7 +89,7 @@ adventures: story_text: | ### Exercici Copia el codi d'exemple i acaba'l afegint cometes als espais en blanc de les línies 1 i 2. - Els espais en blanc de la línia 3 i 4 no s'han de substituir per cometes, sinó per una comanda `{sleep}` i una comanda `{clear}`. Pots fer-ho funcionar? + Els espais buits de la línia 3 i 4 no s'han de substituir per cometes, sinó per una comanda `{sleep}` i una comanda `{clear}`. Pots fer-ho funcionar? ### Exercici 2 Torna als nivells anteriors i copia el teu codi de la història. Fes funcionar el codi en aquest nivell afegint cometes als llocs adequats. @@ -119,7 +119,7 @@ adventures: Programa ambdós finals. ### Exercici 2 - Copia la teva història creada en la teva pròpia aventura d'història dels nivells anteriors. + Copia la història que has creat a l'aventura d'història dels nivells anteriors. Troba una manera d'afegir com a mínim 2 comandes d'`{if}` i `{else}` a la teva història. Això pot ser amb un final feliç o dolent, però també pots provar d'utilitzar altres maneres d'incorporar les comandes. example_code: | @@ -147,15 +147,15 @@ adventures: ``` 8: story_text: | - En aquest nivell podeu utilitzar diverses línies en les comandes `{if}`, d'aquesta manera podeu actualitzar el vostre final feliç o trist. + En aquest nivell pots utilitzar diverses línies en les comandes `{if}`, d'aquesta manera podràs fer que el final sigui feliç o trist. ### Exercici 1 El codi d'exemple mostra dos finals diferents; un on els personatges salten en una màquina de temps i un on no ho fan. - Completa els espais en blanc amb almenys una frase per terminació. - **Extra** Fes la història més llarga. Què passa a la història? Podeu afegir un segon `{ask}` amb opcions diferents. + Completa els espais buits amb almenys una frase per terminació. + **Extra** Fes la història més llarga. Què passa a la història? Pots afegir un segon `{ask}` amb opcions diferents. ### Exercici 2 - Torneu als vostres programes guardats, trieu el vostre programa d’història de nivell 5. Ara escriviu un final feliç o trist d’almenys tres línies! + Torna als vostres programes guardats, tria el teu programa d’història de nivell 5. Ara escriu un final feliç o trist d’almenys tres línies! example_code: | ``` {print} "OH NO! El T-rex s'apropa!" @@ -295,7 +295,6 @@ adventures: story_text_2: | ## La comanda `{echo}` Si vols que l'ordinador et repeteixi la resposta, pots utilitzar l'ordre `{echo}`. La resposta es mostrarà al final de la frase, com en aquest exemple després d'hola. - . example_code_2: | ``` {print} Hola! @@ -304,8 +303,8 @@ adventures: ``` story_text_3: | ### Exercici - Proveu les comandes `{ask}` i `{echo}`. Abans de res, ompliu els buits perquè aquest programa funcioni. - A continuació, feu 2 preguntes més utilitzant la comanda `{ask}`, després de cada `{ask}` utilitzeu `{echo}` per imprimir la resposta a la pantalla. + Prova les comandes `{ask}` i `{echo}`. Abans de res, omple els buits perquè aquest programa funcioni. + A continuació, fes 2 preguntes més utilitzant la comanda `{ask}`, després de cada `{ask}` usa `{echo}` per imprimir la resposta a la pantalla. example_code_3: | ``` _ Com vas? @@ -382,7 +381,7 @@ adventures: {if} _ {else} _ ``` - story_text_2: "### Exercici\nLa calculadora de més amunt calcularà la resposta per a tu, però també pots fer un programa per posar a prova les teves habilitats matemàtiques, com aquest:\nOmple els espais en blanc per completar-lo!\n" + story_text_2: "### Exercici\nLa calculadora de més amunt calcularà la resposta per a tu, però també pots fer un programa per posar a prova les teves habilitats matemàtiques, com aquest:\nOmple els buits per completar-lo!\n" story_text: "Ara que ja pots fer mates, pots fer la teva pròpia calculadora!\n" 9: example_code: "```\npunts = 0\n{repeat} 10 {times}\n nombres = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10\n nombre_1 = nombres {at} {random}\n nombre_2 = nombres {at} {random}\n resposta_correcta = nombre_1 * nombre_2\n {print} \"Quant fa \" nombre_1 \" per \" nombre_2 \"?\"\n answer = {ask} \"Escriu la teva resposta aquí...\"\n {print} \"La teva resposta és \" answer\n {if} _ {is} _\n punts = punts + 1\n{print} \"Bona feina! la teva puntuació és ... \" punts \" sobre 10!\"\n```\n" @@ -413,12 +412,12 @@ adventures: {if} _ _ _ _ _ _ _ {print} _ ``` - story_text: "### Exercici 1\nFem que el programa de pràctica sigui una mica més difícil. Ara el jugador ha de respondre correctament dues preguntes. Omple els espais en blanc per completar el programa.\n\n### Exercici 2\nDe vegades, els càlculs tenen múltiples respostes correctes. Per exemple, 10 es pot dividir entre 5 i entre 2. Així, la pregunta \"Quin nombre divideix 10?\" es pot respondre amb 2 o amb 5.\nPlanteja una pregunta de càlcul que tingui múltiples respostes correctes, demana al jugador que la respongui i determina si és correcta utilitzant `{or}`.\nNeteja l'editor de codi i crea la teva pròpia solució.\n" + story_text: "### Exercici 1\nFem que el programa de pràctica sigui una mica més difícil. Ara el jugador ha de respondre correctament dues preguntes. Omple els buits per completar el programa.\n\n### Exercici 2\nDe vegades, els càlculs tenen múltiples respostes correctes. Per exemple, 10 es pot dividir entre 5 i entre 2. Així, la pregunta \"Quin nombre divideix 10?\" es pot respondre amb 2 o amb 5.\nPlanteja una pregunta de càlcul que tingui múltiples respostes correctes, demana al jugador que la respongui i determina si és correcta utilitzant `{or}`.\nNeteja l'editor de codi i crea la teva pròpia solució.\n" 14: - story_text: "En aquesta aventura construiràs una calculadora que calcula la teva nota mitjana. Si aconsegueixes que la teva calculadora funcioni, pots continuar amb la pròxima aventura, que et permetrà afegir dues funcions extres.\n\n### Exercici 1\nOmple els espais en blanc per fer que la calculadora funcioni.\n* Comença amb la quarta línia, afegeix una pregunta per saber quina nota ha tret l’estudiant.\n* A la cinquena línia vols calcular el total de totes les notes, així que el total = total + nota.\n* Després fixem el valor de retorn. Volem retornar la mitjana, així que el total dividit pel nombre de proves (4).\n* Finalment, acabem el codi cridant la funció a la línia 8.\n\nHo has aconseguit? Genial! T’agradaria afegir encara més funcions a la teva calculadora? **Aquesta aventura continua a la pròxima aventura!**\n" + story_text: "En aquesta aventura construiràs una calculadora que calcula la teva nota mitjana. Si aconsegueixes que la teva calculadora funcioni, pots continuar amb la pròxima aventura, que et permetrà afegir dues funcions extres.\n\n### Exercici 1\nOmple els buits i fes que la calculadora funcioni.\n* Comença amb la quarta línia, afegeix una pregunta per saber quina nota ha tret l’estudiant.\n* A la cinquena línia vols calcular el total de totes les notes, així que el total = total + nota.\n* Després fixem el valor de retorn. Volem retornar la mitjana, així que el total dividit pel nombre de proves (4).\n* Finalment, acabem el codi cridant la funció a la línia 8.\n\nHo has aconseguit? Genial! T’agradaria afegir encara més funcions a la teva calculadora? **Aquesta aventura continua a la pròxima aventura!**\n" example_code: "```\n{define} calcula_mitjana_nota\n total = 0\n {for} i {in} {range} 1 {to} 4\n nota = {ask} _\n total = total + _\n {return} _ / 4\n\nmitjana_nota = {call} _\n{print} \"La teva nota mitjana és \" mitjana_nota\n```\n" 10: - story_text: "Aquest joc de la calculadora t'ajuda a practicar les taules de multiplicar!\n### Exercici\nOmple els espais en blanc. Volem que aquest programa faci aquestes preguntes al jugador:\n```\nQuant fa 1 per 1?\nQuant fa 1 per 2?\nQuant fa 1 per 3?\nQuant fa 2 per 1?\nQuant fa 2 per 2?\nQuant fa 2 per 3?\nQuant fa 3 per 1?\nQuant fa 3 per 2?\nQuant fa 3 per 3?\n_\n```\n" + story_text: "Aquest joc de la calculadora t'ajuda a practicar les taules de multiplicar!\n### Exercici\nOmple els buits. Volem que aquest programa faci aquestes preguntes al jugador:\n```\nQuant fa 1 per 1?\nQuant fa 1 per 2?\nQuant fa 1 per 3?\nQuant fa 2 per 1?\nQuant fa 2 per 2?\nQuant fa 2 per 3?\nQuant fa 3 per 1?\nQuant fa 3 per 2?\nQuant fa 3 per 3?\n_\n```\n" example_code: "```\nnumeros = 1, 2, 3\n{for} _\n {for} _\n resposta = {ask} _\n correcta = numero_1 * numero_2\n {if} resposta {is} correcta\n {print} \"Bona feina!\"\n {else}\n {print} \"Això és incorrecte. La resposta correcta era \" correcta\n```\n" 11: example_code: "```\nnum = 10\n{for} i {in} {range} 1 {to} 10\n {print} i * num\n```\n" @@ -587,10 +586,10 @@ adventures: example_code: | **Atenció!, cal depurar aquest codi!** ``` - noms = Muad Hasan Samira Noura - activitats = volar un estel, anar a nedar, fer senderisme, posar-se moreno + noms = Moad Miquel Núria Marina + activitats = fer volar un estel, nedar, correr per la muntanya, posar-se morena {for} nom {is} noms - {print} A la platja, nom li encanta activity {at} {random} + {print} A la platja, nom li encanta activitat {at} {random} ``` 11: story_text: |- @@ -727,8 +726,8 @@ adventures: example_code: | **Atenció!, cal depurar aquest codi!** ``` - noms = "Tanya", "Romy", "Kayla", "Aldrin", "Ali" - verbs = "caminant", "saltant", "ciclant", "conduint", "corrent" + noms = "Tania", "Omar", "Carla", "Albert", "Aniol" + verbs = "caminant", "saltant", "pedalant", "conduint", "corrent" llocs = "en un cim", "al supermercat", "cap a la piscina" llocs_on = "darrera d'un arbre", "sota d'una taula", "dins d'una caixa" sons = "una trompeta", "un xoc de cotxes", "un tro" @@ -1175,7 +1174,7 @@ adventures: {print} gent {at} {random} li toca rentar plats ``` story_text: "Sempre discuteixes a casa sobre qui ha de rentar els plats o canviar la sorra del gat? \nSi vols pots fer que l'ordinador ho decideixi de manera més justa. Això ja ho pots programar en aquest nivell!\n" - story_text_2: "### Exercici\nCrea la teva pròpia versió del programa del rentaplats. Primer, fes una llista amb els membres de la teva família. \nDesprés, pensa en una tasca que cal fer i deixa que l'ordinador decideixi qui ha de fer la tasca amb la comanda `{at} {random}`.\n\n**Extra** No tens ganes que et toqui a tu? Hackeja el programa eliminant el teu nom de la llista amb la comanda `{remove}` `{from}`.\n" + story_text_2: "### Exercici\nCrea la teva pròpia versió del programa del rentaplats. Primer, fes una llista amb els membres de la teva família.\nDesprés, pensa en una tasca que cal fer i deixa que l'ordinador decideixi qui ha de fer la tasca amb la comanda `{at} {random}`.\n\n**Extra** No tens ganes que et toqui a tu? Hackeja el programa eliminant el teu nom de la llista amb la comanda `{remove}` `{from}`.\n" 4: example_code: | ``` @@ -1184,7 +1183,7 @@ adventures: {sleep} {print} gent {at} _ ``` - story_text: "Amb les cometes pots millorar encara més el teu programa de rentaplats.\n\n### Exercici\nPrimer, omple els símbols o comandes correctes als espais en blanc perquè aquest programa d'exemple funcioni. \nHo has aconseguit? Genial! Ara copia el teu propi codi del nivell anterior i fes-lo funcionar en aquest nivell afegint cometes als llocs adequats.\n" + story_text: "Amb les cometes pots millorar encara més el teu programa de rentaplats.\n\n### Exercici\nPrimer, omple els símbols o comandes correctes als buits perquè aquest programa d'exemple funcioni.\nHo has aconseguit? Genial! Ara copia el teu propi codi del nivell anterior i fes-lo funcionar en aquest nivell afegint cometes als llocs adequats.\n" 5: example_code: "```\ngent {is} mama, papa, Emma, Sofia\nnetejador {is} gent {at} {random}\n_ netejador {is} Sofia {print} _ Pffff... em toca rentar plats _\n_ {print} \"per sort no hi ha plats perquè \" _ \" ja els està rentant\"\n```\n" story_text: "Amb la comanda `{if}` ara pots divertir-te més amb les eleccions al programa. Pots fer que el teu programa respongui a l'elecció que ha fet l'ordinador.\n### Exercici\nPots completar el codi perquè imprimeixi 'mala sort' quan sigui el teu torn i, altrament, 'sí!'? \nNo oblidis les cometes!\n" @@ -1256,7 +1255,7 @@ adventures: example_code_2: "```\naccions = pica de mans, pica de peus, crida Hurra!\n_\n {repeat} 2 {times}\n {print} \"Si ets feliç i ho saps, \" action\n {sleep} 2\n {print} \"Si ets feliç i ho saps, i ho vols fer saber a tothom\"\n {print} \"Si ets feliç i ho saps, \" action\n {sleep} 3\n```\n" 11: example_code: "```\n{for} comptador {in} {range} 1 {to} 10\n {print} comptador\n{print} \"Llest o no. Ves que vinc!\"\n```\n" - story_text: "En aquest nivell, afegim una nova forma de la comanda `{for}`. En nivells anteriors, hem utilitzat `{for}` amb una llista, però també podem usar `{for}` amb números. \nFem això afegint un nom de variable, seguit de `{in}` `{range}`. Després escrivim el número amb el qual començar, `{to}` i el número fins al qual arribar.\n\nProva l'exemple per veure què passa! En aquest nivell, novament hauràs d'utilitzar la indentació a les línies que es troben sota de les comandes `{for}`." + story_text: "En aquest nivell, afegim una nova forma de la comanda `{for}`. En nivells anteriors, hem utilitzat `{for}` amb una llista, però també podem usar `{for}` amb números.\nFem això afegint un nom de variable, seguit de `{in}` `{range}`. Després escrivim el número amb el qual començar, `{to}` i el número fins al qual arribar.\n\nProva l'exemple per veure què passa! En aquest nivell, novament hauràs d'utilitzar la indentació a les línies que es troben sota de les comandes `{for}`." 17: story_text: "Ara canviem una mica la indentació. Cada vegada que necessitem una indentació, hem de posar `:` a la línia abans de la indentació.\n" example_code: "```\n{for} i {in} {range} 1 {to} 10:\n {print} i\n{print} \"Llest o no, ves que vinc!\"\n```\n" @@ -1280,7 +1279,7 @@ adventures: ``` story_text_2: | ### Exercici - Copia el codi d'exemple a la teva pantalla d'entrada i omple els espais en blanc per fer funcionar el teu codi. + Copia el codi d'exemple a la teva pantalla d'entrada i omple els buits per fer funcionar el teu codi. **Extra** Canvia el codi i deixa que l'endevina no només predigui el teu nom, sinó també la teva edat, el teu esport preferit o alguna altra cosa sobre tu mateix. story_text: "Has estat mai a una fira i un endeví t'ha predit el teu futur? O has jugat mai amb la bola màgica de vuit?\nSí és així, segurament saps que realment no es pot predir el teu futur, però que igualment és molt divertit jugar!\n\nAls pròxims nivells aprendrem a crear la teva pròpia màquina de prediccions! \nAl nivell 1 pots començar fent que Hedy es presenti com un endeví i deixar que faci `{echo}` de les respostes dels jugadors. \nCom això:\n" 3: @@ -1395,7 +1394,7 @@ adventures: extremitats = "mà", "cama" colors = "vermell", "blau", "verd", "groc" - {define} turn + {define} torn costat_escollit = costats {at} {random} extremitat_escollida = extremitats _ color_escollit = colors _ @@ -1403,10 +1402,10 @@ adventures: {print} "Juguem al Twister!" {for} i {in} {range} 1 {to} _ - {call} turn + {call} torn {sleep} 2 ``` - story_text: "En aquest nivell aprendràs a utilitzar **funcions**. Una funció és un bloc de codi que pots fer servir fàcilment diverses vegades. Usar funcions ens ajuda a organitzar fragments de codi que podem usar una vegada i una altra.\nPer crear una funció, usa `{define}` i dona-li un nom a la funció. Després, posa totes les línies que vols dins de la funció en un bloc indentat sota la línia `{define}`.\nDeixa una línia buida al teu codi per fer-lo més net i organitzat. Bona feina! Ja has creat una funció!\n\nAra, sempre que necessitem aquest fragment de codi, només hem d'utilitzar {call} amb el nom de la funció per cridar-la! No cal tornar a escriure i repetir el codi.\n\nMira aquest exemple de codi d'un joc de Twister. La funció 'turn' conté un bloc de codi que tria quina part del cos ha d'anar a cada color.\n\n### Exercici\nAcaba aquest codi establint les dues variables 'extremitat_escollida' i 'color_escollit'.\nDesprés, tria quantes vegades vols cridar la funció per fer girar la roda de Twister.\n\n### Exercici 2\nMillora el teu codi afegint una variable anomenada 'persones'. Utilitza la variable per donar a tots els jugadors el seu propi comandament en el joc.\nPer exemple: 'Ahmed, mà dreta al verd' o 'Jessica, peu esquerre al groc'.\n" + story_text: "En aquest nivell aprendràs a utilitzar **funcions**. Una funció és un bloc de codi que pots fer servir fàcilment diverses vegades. Usar funcions ens ajuda a organitzar fragments de codi que podem usar una vegada i una altra.\nPer crear una funció, usa `{define}` i dona-li un nom a la funció. Després, posa totes les línies que vols dins de la funció en un bloc indentat sota la línia `{define}`.\nDeixa una línia buida al teu codi per fer-lo més net i organitzat. Bona feina! Ja has creat una funció!\n\nAra, sempre que necessitem aquest fragment de codi, només hem d'utilitzar {call} amb el nom de la funció per cridar-la! No cal tornar a escriure i repetir el codi.\n\nMira aquest exemple de codi d'un joc de Twister. La funció 'torn' conté un bloc de codi que tria quina part del cos ha d'anar a cada color.\n\n### Exercici\nAcaba aquest codi establint les dues variables 'extremitat_escollida' i 'color_escollit'.\nDesprés, tria quantes vegades vols cridar la funció per fer girar la roda de Twister.\n\n### Exercici 2\nMillora el teu codi afegint una variable anomenada 'persones'. Utilitza la variable per donar a tots els jugadors el seu propi comandament en el joc.\nPer exemple: 'Ahmed, mà dreta al verd' o 'Jessica, peu esquerre al groc'.\n" 14: example_code: | ``` @@ -1445,7 +1444,7 @@ adventures: example_code: "```\n{print} \"Escapa de la casa embruixada!\"\n{print} \"Hi ha tres portes davant teu...\"\nportes {is} 1, 2, 3\nmonstres {is} home llop, mòmia, vampir, zombie\nporta_escollida {is} {ask} \"Quina porta esculls?\"\n{print} \"Has triat la porta ...\" porta_escollida\n{sleep}\nporta_correcte {is} portes {at} {random}\n_ _ _ _ {print} \"Perfecte! T'has pogut escapar!\"\n{else} {print} \"Oh no! S'et menja un ...\" monsters {at} {random}\n```\n" 3: example_code: "```\n_ Escapa de la casa embruixada!\n_ Hi ha tres portes davant teu...\n_ _ _ Quina porta esculls?\n_ Has triat la ... porta\nmonstres _ un zombie, un vampir, RES! HAS ESCAPAT!\n_ Veus ...\n{sleep}\n_ _ _ _\n```\n" - story_text: "En els nivells anteriors has fet una introducció al joc de la casa embruixada, sempre, però la història té un final dolent.\nEn aquest nivell millorarem la història fent-la més interactiva canviant-li el desenllaç; a vegades seràs devorat, i a vegades aconseguiràs escapar!\nHedy ho decidirà aleatòriament!\n\n### Exercici\nCopia els codis d'exemple i omple els espais en blanc perquè funcioni!\n\n**Extra** Aquesta història és bastant senzilla; potser pots fer-la més esgarrifosa i fer-la més emocionant. \nTambé tens resultats molt limitats ara mateix, només hi ha 3 opcions del que hi ha darrere de les portes. Pensa en més monstres per afegir a la llista!\n" + story_text: "En els nivells anteriors has fet una introducció al joc de la casa embruixada, sempre, però la història té un final dolent.\nEn aquest nivell millorarem la història fent-la més interactiva canviant-li el desenllaç; a vegades seràs devorat, i a vegades aconseguiràs escapar!\nHedy ho decidirà aleatòriament!\n\n### Exercici\nCopia els codis d'exemple i omple els buits perquè funcioni!\n\n**Extra** Aquesta història és bastant senzilla; potser pots fer-la més esgarrifosa i fer-la més emocionant. \nTambé tens resultats molt limitats ara mateix, només hi ha 3 opcions del que hi ha darrere de les portes. Pensa en més monstres per afegir a la llista!\n" 11: story_text: "En aquest nivell hem canviat la comanda `{for}` per poder dir al jugador on es troba.\n\n### Exercici 1\nCompleta el programa perquè el jugador sàpiga en quina habitació es troba.\n\n### Exercici 2\nConverteix el programa en una aventura seguint aquests passos:\n\n1. Fes una llista d'opcions (com: lluitar o fugir).\n2. Assegura't que el jugador pugui triar una opció amb `{ask}`.\n3. La resposta és correcta? Aleshores poden avançar al següent monstre. Si donen una resposta incorrecta, fes-ho saber al jugador amb un `{print}`.\n\n**Extra** Si fas una tria equivocada, encara es mostra un monstre! Com podries canviar això?\n" example_code: "```\n{print} \"Escapa de la casa embruixada!\"\nmonstres = zombie, vampir, aranya gegant\n_\n {print} \"Habitació \" i\n monstre = monstres {at} {random}\n```\n" @@ -1473,7 +1472,7 @@ adventures: 2: story_text: | ## Variables - Pots anomenar una paraula amb `{is}`. Això s'anomena **variable**. En aquest exemple hem fet una variable anomenada nom i una variable anomenada edat. Podeu utilitzar la paraula nom a qualsevol part del vostre codi i serà substituït per Hedy així: + Pots anomenar una paraula amb `{is}`. Això s'anomena **variable**. En aquest exemple hem fet una variable anomenada nom i una variable anomenada edat. Pots utilitzar la paraula nom a qualsevol part del vostre codi i Hedy ho substituirà, així: example_code: | ``` nom {is} Hedy @@ -1483,8 +1482,8 @@ adventures: story_text_2: | ### Exercici És hora de crear les teves pròpies variables! - En el codi d'exemple hem fet un exemple de la variable `animal_preferit`. A la línia 1 es defineix la variable, i a la línia 2 hem utilitzat la variable dins una comanda `{print}`. - En primer lloc, acabeu el nostre exemple omplint el vostre animal preferit a l'espai en blanc. A continuació, feu vosaltres mateixos almenys 3 d'aquests codis. Trieu una variable i configureu-la amb la comanda {is}. A continuació, utilitzeu-lo amb una comanda {print}, tal com hem fet abans. + En el codi d'exemple t'hem preparat un exemple on es crea la variable `animal_preferit`. A la línia 1 es defineix la variable, i a la línia 2 l'hem utilitzat dins una comanda `{print}`. + Abans de res, acaba l'exemple omplint el nom del vostre animal preferit a l'espai buit. A continuació, fes almenys 3 codis similars a aquest. Tria una variable i configura-la amb la comanda {is}. Després, fes-la servir amb la comanda {print}, com a l'exemple. example_code_2: "```\nanimal_preferit {is} _\n{print} M'agraden els/les animal_preferit \n```\n" 14: example_code: "```\nedat = {ask} \"Quants anys tens?\"\n{if} edat > 12\n {print} \"Ets més gran que jo!\"\n```\n```\nedat = {ask} \"Quants anys tens?\"\n{if} edat < 12\n {print} \"Ets més petit que jo!\"\n{else}\n {print} \"Ets més gran que jo!\"\n```\n" @@ -1508,7 +1507,7 @@ adventures: example_code: "```\n{print} Sóc Hedy el lloro-robot\nnom _ _ Com et dius?\n{print} nom\n_\n{print} parrup\n_\n{print} nom\n```\n" story_text_2: "### Exercici\nPrimer, acaba la línia 2 amb una comanda `{is}` i una comanda `{ask}`.\nDesprés, omple una comanda `{sleep}` a la línia 4 i 6 per fer que el lloro estigui en silenci una estona.\n\n**Extra** Pots fer que el lloro demani més coses a part del teu nom afegint més línies de codi?\n" 1: - story_text_2: "### Exercici\nCopia el codi d'exemple a la teva pantalla d'entrada fent clic al botó groc.\nFes que el lloro-robot faci una pregunta diferent. Omple els espais en blanc a l'exemple!\n**Extra** També pots fer que el lloro faci múltiples preguntes. Escriu més línies de codi sota el teu propi codi.\n" + story_text_2: "### Exercici\nCopia el codi d'exemple a la teva pantalla d'entrada fent clic al botó groc.\nFes que el lloro-robot faci una pregunta diferent. Omple els buits a l'exemple!\n**Extra** També pots fer que el lloro faci múltiples preguntes. Escriu més línies de codi sota el teu propi codi.\n" example_code_2: "```\n{print} Sóc Hedy el lloro-robot\n{ask} _\n{echo}\n{echo}\n" example_code: "```\n{print} Sóc Hedy el lloro-robot\n{ask} Com et dius?\n{echo}\n{echo}\n```\n" story_text: "Crea el teu propi lloro-robot que repeteixi tot el que dius!\n" @@ -1519,7 +1518,7 @@ adventures: example_code: "```\nparaules {is} parrup, Hedy\n{print} \"Ensenya al teu lloro-robot!\"\nnova_paraula {is} {ask} \"Quina paraula vols ensenyar-li?\"\n{add} nova_paraula {to_list} paraules\nparuala_dita {is} paraules {at} {random}\n{print} \"🧒 Digues \" nova_paraula \", Hedy!\"\n{print} \"🦜 \" paruala_dita\n_ paruala_dita {is} nova_paraula _ \"🧒 Ben fet, Hedy! 🍪\"\n_ _ \"🧒 No, Hedy! Has de dir \" nova_paraula\n```\n" story_text: "Premia el teu lloro-robot si diu la paraula correcta!\n\n### Exercici\nAcaba el codi omplint les 4 comandes que falten.\n" 4: - story_text: "En aquest nivell hem de fer servir cometes amb les comandes `{ask}` i `{print}`.\n### Exercici\nCompleta el codi omplint les cometes als espais en blanc.\n" + story_text: "En aquest nivell hem de fer servir cometes amb les comandes `{ask}` i `{print}`.\n### Exercici\nCompleta el codi omplint les cometes als buits\n" example_code: "```\nparaules {is} parrup, Hedy\n{print} _ Ensenya al teu lloro-robot! _\nnova_paraula {is} {ask} _ Quina paraula vols ensenyar-li? _\n{add} nova_paraula {to_list} paraules\n{print} _ 🧒 Digues _ nova_paraula _, Hedy!_\n{print} _ 🦜 _ paraules {at} {random}\n```\n" default_save_name: Lloro print_command: @@ -1547,8 +1546,8 @@ adventures: ``` 18: story_text: |- - Hem arribat al codi Python real! Això vol dir que hem d'utilitzar parèntesis amb `{print}` i `{range}` d'ara endavant. - Això també significa que podeu utilitzar a partir d'aquest nivell el codi d'Hedy en qualsevol entorn Python sempre que utilitzeu les comandes angleses. Si no has fet encara, pots canviar-ho la pestanya del menú de comandes. + Hem arribat al codi Python real! Caldrà utilitzar parèntesis amb `{print}` i `{range}` d'ara endavant. + Això també significa que podràs fer servir el codi d'aquest nivell d'Hedy en qualsevol entorn Python, només, però seran vàlides les comandes angleses. Si no has fet encara, pots canviar-ho la pestanya del menú de comandes. example_code: | ``` {print}("Hola!") @@ -1634,7 +1633,7 @@ adventures: levels: 14: example_code: "```\n{print} \"Endevina el meu número!\"\nnumeros = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10\nnumero = numeros {at} {random}\njoc = \"jugant\"\n{for} i {in} {range} 1 {to} 10\n {if} joc == \"jugant\"\n resposta = {ask} \"Quin número creus que és?\"\n {if} resposta _ numero\n {print} \"Més petit!\"\n {if} resposta _ numero\n {print} \"Més gran!\"\n {if} resposta _ numero\n {print} \"Has guanyat!\"\n joc = \"final\"\n```\n" - story_text: "En aquest nivell pots programar el joc \"Endevina el meu número\".\n\n### Exercici\nOmple els símbols correctes als espais en blanc per fer que el joc funcioni.\n" + story_text: "En aquest nivell pots programar el joc \"Endevina el meu número\".\n\n### Exercici\nOmple els símbols correctes als buits per fer que el joc funcioni.\n" name: Endevina el meu número description: Endevina el meu número default_save_name: endevina el meu número @@ -1652,7 +1651,7 @@ adventures: description: Aventures Harry Potter levels: 10: - story_text: "### Exercici\nTambé podem fer un endeví de temàtica Harry Potter. Omple els espais en blanc perquè es mostrin 9 línies.\n**Extra** Canvia la temàtica de l'endeví per alguna altra cosa, com el teu llibre, pel·lícula o sèrie de televisió preferida.\n" + story_text: "### Exercici\nTambé podem fer un endeví de temàtica Harry Potter. Omple els buits perquè es mostrin 9 línies.\n**Extra** Canvia la temàtica de l'endeví per alguna altra cosa, com el teu llibre, pel·lícula o sèrie de televisió preferida.\n" example_code: "```\ncases = Gryffindor, Slytherin, Hufflepuff, Ravenclaw\nsubjects = pocions, defensa contra les forces del mal, encanteris, transfiguració\nfears = en Voldemort, les aranyes, suspendre els examens GNOM\nnoms = Harry, Ron, Hermione\n_\n_ {print} nom \" pertany a la casa \" cases {at} {random}\n_ {print} nom \" és bo amb \" subjects {at} {random}\n_ {print} nom \" li aterra \" fears {at} {random}\n```\n" hangman_2: name: El penjat 2 @@ -1682,10 +1681,10 @@ adventures: story_text_2: "Aquesta cançó infantil compta enrere des de 5 pometes fins a una\nSi copies la línia 2 - 7 i l'enganxes sota el codi, pots cantar tota la cançó!\n" 8: example_code: "```\nampolles = 99\n_ 99 {times}\n{print} \"Hi ha \" ampolles \" ampolles a dalt de la paret,\"\n{print} \"Hi ha \" ampolles \" ampolles a dalt de la paret,\"\n{print} \"Pero si una ampolla caiguès per mala sort,\"\nampolles = ampolles - 1\n{print} \"Queden \" ampolles \" ampolles a dalt de la paret.\"\n```\n" - story_text: "En un nivell anterior has programat la cançó \"Ampolles dalt de la paret\". En aquell moment no coneixies la comanda `{repeat}`, i havies de copiar els versos moltes vegades.\nEn aquest nivell pots repetir la cançó 99 vegades, només afegint una línia senzilla!\n\n### Exercici\nAfegeix la comanda correcta als espais en blanc i ajusta la indentació del codi correctament.\n" + story_text: "En un nivell anterior has programat la cançó \"Ampolles dalt de la paret\". En aquell moment no coneixies la comanda `{repeat}`, i havies de copiar els versos moltes vegades.\nEn aquest nivell pots repetir la cançó 99 vegades, només afegint una línia senzilla!\n\n### Exercici\nAfegeix la comanda correcta als buits i ajusta la indentació del codi correctament.\n" 7: example_code: "```\n{repeat} _ _ {print} \"Baby Shark tututudutudu\"\n{print} \"Baby Shark\"\n```\n" - story_text: "Les cançons sovint contenen molta repetició. Per exemple... Baby Shark! Quan ho cantes, repeteixes tota l'estona el mateix:\n\nBaby Shark tututudutudu
\nBaby Shark tututudutudu
\nBaby Shark tututudutudu
\nBaby Shark\n\n### Exercici\nPots imprimir la cançó Baby Shark amb un `{repeat}`? Acaba el codi reemplaçant els espais en blanc?\n**Extra** Després de Baby Shark podràs programar altres cançons. Hi ha moltes cançons amb repetició!\nPots pensar en una altra cançó i imprimir-la?\n" + story_text: "Les cançons sovint contenen molta repetició. Per exemple... Baby Shark! Quan ho cantes, repeteixes tota l'estona el mateix:\n\nBaby Shark tututudutudu
\nBaby Shark tututudutudu
\nBaby Shark tututudutudu
\nBaby Shark\n\n### Exercici\nPots imprimir la cançó Baby Shark amb un `{repeat}`? Acaba el codi reemplaçant els buits.\n**Extra** Després de Baby Shark podràs programar altres cançons. Hi ha moltes cançons amb repetició!\nPots pensar en una altra cançó i imprimir-la?\n" 12: example_code: "```\n_ accions = \"pica de mans\", \"pica de peus\", \"crida Hurra!\"\n_ {for} acció {in} accions\n_ {for} i {in} {range} 1 {to} 2\n_ {print} \"Si ets feliç i ho saps\"\n_ {print} acció\n_ {print} \"Si ets feliç i ho saps i ho vols fer saber a tothom\"\n_ {print} \"Si ets feliç i ho saps\"\n_ {print} acció\n```\n" story_text: "En aquesta cançó podem fer que sigui encara més fàcil programar \"Si ets feliç i ho saps, pica de mans\". Perquè podem posar totes les accions en una variable, mira:\n\n### Exercici\nPots afegir la quantitat correcta d'indentació a cada línia perquè la cançó funcioni correctament?\nConsell: No totes les línies necessiten indentació.\n" @@ -1701,7 +1700,7 @@ adventures: story_text: "En el nivell 16 vam fer cançons utilitzant llistes. Tanmateix, aquests programes ja no funcionen correctament en aquest nivell. Els dos punts del nivell 17 i els claudàtors del nivell 18 encara s'han d'afegir.\n\n### Exercici 1 \nT'hem donat la cançó \"The Drunken Sailor\" com a exemple, però encara no funciona.\nPots assegurar-te que funcioni de nou? Per ajudar-te, hem posat _ en lloc d'alguns errors.\n\n### Exercici 2 \nAra també busca la teva cançó \"Old MacDonald\" del nivell 16 i corregeix-la.\n" example_code: "```\nlinies = [\"what shall we do with the drunken sailor\", \"shave his belly with a rusty razor\", \"put him in a long boat till hes sober\"]\n{for} linia {in} linies _\n {for} i {in} {range} 1 {to} 3 _\n {print} _ linia _\n {print} \"early in the morning\"\n {for} i {in} {range} 1 {to} 3\n {print} \"way hay and up she rises\"\n {print} \"early in the morning\"\n```\n" 11: - story_text: "En aquest nivell pots utilitzar `{for}` amb `{range}` per fer cançons que usin el comptatge, com les \"5 pometes té el pomer\".\n\n### Exercici 1\nOmple els espais en blanc i fes que el codi funcioni! Si no recordes la lletra de la cançó, busca-la tu mateix.\n\n### Exercici 2\nSi busques la cançó veuràs que es repeteix l'estrofa de \"Si mireu el vent d'on vé\" entremig. Mostra-la dins del `{for}` i utilitza un `{if}` per fer que no es mostri a l'última repetició.\n" + story_text: "En aquest nivell pots utilitzar `{for}` amb `{range}` per fer cançons que usin el comptatge, com les \"5 pometes té el pomer\".\n\n### Exercici 1\nOmple els buits i fes que el codi funcioni! Si no recordes la lletra de la cançó, busca-la tu mateix.\n\n### Exercici 2\nSi busques la cançó veuràs que es repeteix l'estrofa de \"Si mireu el vent d'on vé\" entremig. Mostra-la dins del `{for}` i utilitza un `{if}` per fer que no es mostri a l'última repetició.\n" example_code: "```\n_ pomes _ _ 5 _ 1\n {print} pomes \" pomtes té el pomer\"\n _\n```\n" description: Imprimeix una cançó name: Canta una cançó! @@ -1723,7 +1722,7 @@ adventures: example_code_2: "```\nanimals {is} gos, vaca, ovella\nresposta {is} {ask} \"Quin és el teu animal preferit?\"\n_ resposta _ animals _ \"Ala, el meu també!\"\n_ _ \"Els meus animals preferits són els gossos, les vaques i les ovelles.\"\n```\n" story_text: "## Llistes\nSi volem comprovar que una cosa és dins d'una llista utilitzem la comanda `{in}`. \nEl codi següent imprimeix \"Bé!\" si tries verd o groc, i \"Buu\" en cas contrari.\n" example_code: "```\ncolors_bonics {is} verd, groc\ncolor_preferit {is} {ask} \"Quin és el teu color preferit?\"\n{if} color_preferit {in} colors_bonics {print} \"Bé!\"\n{else} {print} \"Buu\"\n```\n" - story_text_2: "### Exercici\nCompleta el codi d'exemple omplint els espais en blanc amb les comandes que has après.\nQuan hagis acabat el codi, intenta crear un codi propi i fes servir una pregunta que hagis pensat tu mateix.\n" + story_text_2: "### Exercici\nCompleta el codi d'exemple omplint els buits amb les comandes que has après.\nQuan hagis acabat el codi, intenta crear un codi propi i fes servir una pregunta que hagis pensat tu mateix.\n" if_command: levels: 5: @@ -1776,7 +1775,7 @@ adventures: example_code_2: "```\n{print} Quan les oques van al camp\n{play} C\n{play} C\n{play} G\n{play} G\n{play} A\n{play} A\n{play} G\n{sleep} 1\n{play} F\n{play} F\n```\n" story_text: "### Exercici \nAcaba les cançons! Ja hem començat el codi per algunes melodies.\n" 1: - story_text: "En aquest nivell aprendràs com utilitzar la comanda `{play}` per tocar una melodia!\n\nEscriu `{play}` seguit de la nota que vols tocar. L'escala és C-D-E-F-G-A-B. \nCom pots veure, hi ha 7 lletres diferents, però podem tocar més que només 7 notes. \nEscriu un número entre 0 i 9 darrere de la lletra per triar l'escala, per exemple, després de B4 ve C5. \nC0 és la nota més baixa que pots tocar, B9 és la més alta.\n\n### Exercici \nProva el codi d'exemple i després experimenta amb ell! Pots crear la teva pròpia melodia? \nEn el següent nivell aprendràs a tocar algunes cançons ja existents." + story_text: "En aquest nivell aprendràs com utilitzar la comanda `{play}` per a tocar una melodia!\n\nEscriu `{play}` seguit de la nota que vols tocar. Farem servir l'escala alfabètica que té les notes C-D-E-F-G-A-B i que s'equivalen a Do (C), Re (D), Mi (E), Fa (F), Sol (G), La (A), Si (B).\nCom pots veure, hi ha només 7 lletres, però podem tocar-ne més canviant l'escala.\nEscriu un número entre 0 i 9 darrere de la lletra per triar l'escala, per exemple, després de B4 ve C5.\nC0 és la nota més baixa que pots tocar, B9 és la més alta.\n\n### Exercici\nProva el codi d'exemple i experimenta amb ell! Ets capaç de crear una melodia pròpia?\nEn el següent nivell aprendràs a tocar algunes cançons existents." example_code: "```\n{play} C4\n{play} D4\n{play} E4\n{play} F4\n{play} G4\n{play} A4\n{play} B4\n{play} C5\n```" 4: story_text: "Utilitza la comanda `{clear}` per crear una màquina de karaoke!\n\n### Exercici\nAcaba la versió de karaoke de \"Plou i fa sol\".\nDesprés, crea una versió de karaoke de qualsevol cançó que t'agradi!\n" @@ -1830,6 +1829,7 @@ adventures: story_text_2: "### Exercici 2\nAra crea el teu propi codi per a la cançó infantil \"Les rodes de l'autobús\" de la mateixa manera!\n" example_code: "```\ndia = [\"dilluns\", \"dimarts\", \"dimecres\", \"dijous\", \"divendres\", \"dissabte\", \"diumenge\"]\ncompra = [\"llums\", \"naps\", \"nespres\", \"nous\", \"faves tendres\", \"tot s'ho gasta!\", \"tot s'ho menja!\"]\n\n_\n {print} \"La masovera s'en va al mercat\"\n {print} \"El mercat és el \" _\n {print} \"El \" _ \" en compra \" _\n {print} \"El \" _ \", \" _\n {print} \"O lai la, la masovera, la masovera.\"\n {print} \"O lai la, la masovera s'en va al mercat.\"\n {sleep} 2\n {clear}\n```\n" example_code_2: "```\nobjecte = [\"rodes\", \"portes\", _]\nmoviment = [ \"van girant\", \"obrint tancant\", _]\n```\n" + story_text: "### Exercici\nAcaba la cançó infantil!\n" name: Canta una cançó! 2 default_save_name: Cançó 2 description: Canta una cançó 2 @@ -1854,7 +1854,7 @@ adventures: name: Guardiola levels: 14: - story_text: "### Exercici\nEn aquest nivell pots fer que Hedy t'expliqui si has estalviat prou diners!\nAcaba aquest codi omplint els espais en blanc!\n" + story_text: "### Exercici\nEn aquest nivell pots fer que Hedy t'expliqui si has estalviat prou diners!\nAcaba aquest codi omplint els buits!\n" example_code: "```\n_ calcula_pressupost {with} desitg, diners, paga\n a_estalviar = desitg - diners\n setmanes = a_estalviar / paga\n {if} desitg _ diners\n {print} \"Has d'estalviar més!\"\n {print} \"Necessites \" setmanes \" setmanes més.\"\n {else}\n {print} \"Perfecte! Ja en tens suficient\"\n {print} \"Ja ho pots comprar!\"\n\ndiners = {ask} \"Quant has estalviat?\"\ndesitg = {ask} \"Quants diners necessites?\"\npaga = {ask} \"Quants diners aconsegueixes cada setmana?\"\n\n{call} _\n```\n" 12: example_code: "```\n{print} \"La teva guardiola digital\"\ndesig = {ask} \"Què vols comprar?\"\npreu = {ask} \"Quant costa?\"\nestalviat = {ask} \"Quants diners ja has estalviat?\"\npaga = {ask} \"Quants diners aconsegueixes cada setmana?\"\na_estalviar = preu - estalviat\nweeks = a_estalviar / paga\n{print} \"Ho podràs comprar \" _ \" en \" _ \" setmanes.\"\n```\n" @@ -1864,7 +1864,7 @@ adventures: default_save_name: Entrevistador levels: 14: - story_text: "### Exercici\nEn aquesta aventura pots crear el teu propi test! Omple els espais en blanc, afegeix més preguntes i gaudeix del teu propi qüestionari!\nPots fer un qüestionari sobre qualsevol cosa que t'agradi: el teu hobby, el teu animal preferit, el teu llibre preferit o qualsevol altra cosa!\n" + story_text: "### Exercici\nEn aquesta aventura pots crear el teu propi test! Omple els buits, afegeix més preguntes i gaudeix del teu propi qüestionari!\nPots fer un qüestionari sobre qualsevol cosa que t'agradi: el teu hobby, el teu animal preferit, el teu llibre preferit o qualsevol altra cosa!\n" example_code: "```\n{print} \"Prepara el teu test!\"\npunts_a = 0\npunts_b = 0\n{print} \"Pregunta\"\n{print} \"Resposta opció A\"\n{print} \"Resposta opció B\"\nresposta = {ask} \"Quina resposta esculls?\"\n{if} resposta == \"A\"\n punts_a = punts_a + 1\n{if} resposta == \"B\"\n punts_b = punts_b + 1\n{print} \"Fi del test!\"\n{print} \"Vegem els resultats!\"\n{if} punts_a > punts_b\n {print} \"Pertanys al club A\"\n{if} punts_b > punts_a\n {print} \"Pertanys al club B\"\n```\n" name: Entrevistador description: Crea el teu propi test! @@ -1911,18 +1911,50 @@ adventures: example_code_2: "```\n{print} \"Eii! És el teu aniversari!\"\nedat = {ask} \"Quants anys fas?\"\n{repeat} edat {times} {print} \"Visca!\"\n```\n" 8: example_code: "```\n_ {print} \"El gegant del Pi\"\n_ {repeat} 2 {times}\n_ {print} \"ara balla\"\n_ {print} \"El gegant del Pi ara balla pel camí\"\n```\n" - story_text: "### En el bloc o no?\nEn aquest nivell has de pensar detingudament quines línies de codi haurien d'estar en el bloc i quines no.\nPer exemple: Si vols cantar la cançó *el gegant del Pi*. Només vols que la línia amb el text \"ara balla\" es repeteixi dues vegades.\nAixò vol dir que l'última línia no hauria de començar amb indentació, ja que no pertany al bloc.\nSi comences l'última línia amb indentació, la cançó no sortirà bé.\n\n### Exercici\nCada línia del codi d'exemple comença amb un espai en blanc. Elimina els espais en blanc i intenta esbrinar quina línia necessita indentació i quina no per fer la cançó del *gegant del Pi*.\n" + story_text: "### En el bloc o no?\nEn aquest nivell has de pensar detingudament quines línies de codi haurien d'estar en el bloc i quines no.\nPer exemple: Si vols cantar la cançó *el gegant del Pi*. Només vols que la línia amb el text \"ara balla\" es repeteixi dues vegades.\nAixò vol dir que l'última línia no hauria de començar amb indentació, ja que no pertany al bloc.\nSi comences l'última línia amb indentació, la cançó no sortirà bé.\n\n### Exercici\nCada línia del codi d'exemple comença amb un espai buit. Elimina els buits i intenta esbrinar quina línia necessita indentació i quina no per fer la cançó del *gegant del Pi*.\n" rock: description: Crea el teu propi joc de pedra, paper, tisores name: Pedra, paper, tisores default_save_name: Pedra_2 + levels: + 1: + example_code_2: "```\n{print} què vols escollir?\n{ask} tria entre _\n{echo} la teva elecció és:\n```\n" + story_text: "En el nivell 1 pots començar amb el joc de pedra, paper, tisores.\n\nAmb la comanda `{ask}` pots fer una elecció, i amb la comanda `{echo}` pots repetir-la mostrant-la per pantalla.\n" + story_text_2: "### Exercici\nEn lloc d'utilitzar paraules, també pots fer servir emojis: ✊✋✌\nPots crear un codi usant emojis?\n" + example_code: "```\n{print} què vols escollir?\n{ask} tria entre pedra, paper o tisores\n{echo} la teva elecció és:\n```\n" + 2: + example_code: "```\neleccio {is} pedra\n{print} Escullo _\n```" + story_text: "En aquest nivell pots practicar l'ús de variables, i així podràs fer el joc de pedra, paper, tisores al pròxim nivell!\n### Exercici\nAcaba el codi omplint la **variable** en el buit.\nAquest joc no és molt interactiu, però no et preocupis! A la pròxima aventura aprendràs com utilitzar variables amb la comanda `{ask}` per fer el teu joc interactiu!\n" + 3: + example_code: "```\nopcions {is} pedra, paper, tisores\n{print} opcions _\n```\n" + story_text_2: "**Extra** Fes un joc per a dos jugadors. Primer demana als dos jugadors que introdueixin els seus noms. Després deixa que l'ordinador triï les seves eleccions aleatòriament.\n" + story_text: "Pots utilitzar la comanda `{at} {random}` per fer que l'ordinador triï pedra, paper o tisores!\n\n### Exercici\nAcaba el codi fent servir la comanda `{at} {random}`.\n" + example_code_2: "```\nopcions {is} pedra, paper, tisores\njugador_1 {is} {ask} Nom del jugador 1:\n_\n```\n" + 15: + story_text: "### Exercici\nJuga fins a guanyar l'ordinador! Però primer, acaba el codi d'exemple...\n" + example_code: "```\nguanyar = \"no\"\nopcions = \"pedra\", \"paper\", \"tisores\"\n{while} guanyar == \"no\"\n teva_eleccio = {ask} \"Què esculls?\"\n ordinador_eleccio = opcions {at} {random}\n {print} \"Has escollit \" teva_eleccio\n {print} \"L'Ordinador ha escollit \" ordinador_eleccio\n {if} ordinador_eleccio == teva_eleccio\n {print} \"Empat\"\n {if} ordinador_eleccio == \"pedra\" {and} teva_eleccio == \"tisores\"\n {print} \"Has perdut!\"\n {if} ordinador_eleccio == \"pedra\" {and} teva_eleccio == \"paper\"\n {print} \"Has gunayat!\"\n guanyar = \"sí\"\n_\n```\n" + 13: + story_text: "Amb la comanda `{and}` pots escurçar el teu codi de pedra, paper, tisores! Dona una ullada al codi d'exemple.\n\n### Exercici\nAcaba el codi de manera que sempre es decideixi un guanyador. Executa el teu codi unes quantes vegades per verificar que sempre s'imprimeix un guanyador.\n" + example_code: "```\nopcions = \"pedra\", \"paper\", \"tisores\"\nteva_eleccio = {ask} \"Què esculls?\"\nordinador_eleccio = opcions {at} {random}\n{print} \"Has escollit \" teva_eleccio\n{print} \"L'ordinador ha escollit \" ordinador_eleccio\n{if} ordinador_eleccio {is} teva_eleccio\n {print} \"Empat\"\n{if} ordinador_eleccio {is} \"pedra\" {and} teva_eleccio {is} \"paper\"\n {print} \"Has guanyat!\"\n{if} ordinador_eleccio {is} \"pedra\" {and} teva_eleccio {is} \"tisores\"\n {print} \"L'ordinador guanya!\"\n_\n```\n" + 9: + example_code: "```\nopcions = pedra, paper, tisores\nteva_eleccio {is} {ask} \"Què vols escollir?\"\n{print} \"Has escollit \" teva_eleccio\nordinador_eleccio {is} opcions {at} {random}\n{print} \"L'ordinador escull \" ordinador_eleccio\n{if} ordinador_eleccio {is} teva_eleccio\n {print} \"Empat\"\n{if} ordinador_eleccio {is} pedra\n {if} teva_eleccio {is} paper\n {print} \"Has guanyat!\"\n {if} teva_eleccio {is} tisores\n {print} \"Has perdut!\"\n# Acaba aquest codi\n```\n" + story_text: "En aquest nivell pots programar tot el joc de pedra, paper, tisores niant les comandes `{if}` (posant condicions dins altres condicions).\n\n### Exercici\nPots acabar el codi? El programa ha de dir qui ha guanyat per a cada combinació.\n\n**Extra** Vols jugar més d'una partida? Amplia el codi perquè puguis jugar múltiples rondes. Fins i tot pots utilitzar una comanda `{ask}` per preguntar a l'usuari quantes rondes vol jugar.\n" + 10: + story_text: "### Exercici\nEn els nivells anteriors has fet sovint el teu propi joc de pedra, paper, tisores. Pots acabar el codi i utilitzar correctament la comanda `{for}` i fer que el joc funcioni?\n" + example_code: "```\nopcions = _\njugadors = _\n{for} _\n```\n" + 4: + story_text: "En aquest nivell podem programar encara més el joc de pedra, paper, tisores. Però si vols afegir text recorda que hauràs d'utilitzar cometes.\n### Exercici\nOmple les cometes en els buits. Recorda que la variable `opcions` ha d'estar fora de les cometes.\n" + example_code: "```\nopcions {is} pedra, paper, tisores\n{print} _ L'ordinador ha escollit ..._ opcions {at} {random}\n```\n" + 5: + example_code: "```\nopcions {is} pedra, paper, tisores\neleccio_ordinador {is} _\neleccio {is} _\n{print} \"Has escollit \" _\n{print} \"L'ordinador ha escollit \" _\n{if} _ {is} _ {print} \"empat!\" {else} {print} \"no hi ha empat\"\n```\n\nOmple els buits amb codi correcte per veure si és un empat.\n" + story_text: "En aquest nivell podem determinar si hi ha empat o no. Per això necessites la nova comanda `{if}`.\n\n### Exercici\nAcaba el codi omplint els buits:\n* Fes que l'ordinador triï una opció aleatòria\n* Pregunta al jugador què vol triar\n* Omple les variables correctes a la línia 4 i 5\n* Acaba la línia 6 perquè Hedy pugui comprovar si hi ha empat o no.\n" restaurant: default_save_name: Restaurant levels: 1: - story_text: "En el nivell 1 pots crear el teu propi restaurant virtual i prendre les comandes dels teus convidats.\n" + story_text: "En el nivell 1 pots crear el teu propi restaurant virtual i prendre les comandes dels clients.\n" example_code_2: "```\n{print} Benvingut al restaurant de Hedy 🍟 \n_ Què voldria prendre? \n{echo} Així que voldria\n {print} Gràcies per la teva comanda!\n{print} Ja està de camí!\n```\n" - story_text_2: "### Exercici\nCopia el codi d'exemple a la teva pantalla d'entrada fent clic al botó groc.\nPrimer, omple amb la comanda correcta els espais en blanc perquè el codi funcioni correctament.\nA continuació, afegeix almenys 4 línies més de codi al programa del restaurant.\nPregunta al client què li agradaria beure i pregunta si vol pagar en efectiu o amb targeta.\nFinalment, pensa en una manera agradable d'acomiadar el teu client.\n" + story_text_2: "### Exercici\nCopia el codi d'exemple a la teva pantalla d'entrada fent clic al botó groc.\nPrimer, omple amb la comanda correcta als buits perquè el codi funcioni correctament.\nA continuació, afegeix almenys 4 línies més de codi al programa del restaurant.\nPregunta al client què li agradaria beure i pregunta si vol pagar en efectiu o amb targeta.\nFinalment, pensa en una manera agradable d'acomiadar el teu client.\n" 3: example_code_2: "```\n{print} Benvingut al teu restaurant aleatori!\nprimers {is} _\nsegons {is} _\npostres {is} _\nbegudes {is} _\npreus {is} _\n_\n```\n" story_text: "Tens problemes per decidir què vols prendre per a sopar? Pots deixar que Hedy triï per tu!\nSimplement, afegeix llistes dels teus menjars preferits (o dels menys preferits) i Hedy escollirà el teu sopar de manera aleatòria.\nTambé pots divertir-te una mica deixant que Hedy triï el preu del teu sopar! Què n'obtindràs?\n" @@ -1933,9 +1965,10 @@ adventures: example_code: "```\n{print} Benvinguts al restaurant de Hedy!\n{print} Avui servim pizza i lasanya.\nmenjar {is} {ask} Què t'agradria menjar?\n{print} Bona elecció! La menjar m'encanta!\nguarnició {is} {ask} Què hi prefereixes verdures o carn?\n{print} menjar amb guarnició en marxa!\n```\n" story_text_2: "### Exercici\nCopia el teu propi codi del restaurant del nivell anterior a la pantalla d'entrada a continuació.\nCorregeix el codi substituint les comandes `{ask}` i `{echo}` i utilitzant variables, com has après en aquest nivell.\n\nAra que el teu codi torna a funcionar, és hora d'afegir-hi alguna cosa més.\nMira l'última línia del codi d'exemple: `{print} menjar amb guarnició en marxa!`\nEn aquesta única línia s'han fet servir 2 variables per crear un resum de la comanda.\nAra afegeix el teu propi resum amb el menjar i les begudes que ha demanat el client.\n\n**Extra** Ara que has après a utilitzar variables, pots fer servir tantes variables com vulguis en una línia. Pots afegir més variables al teu codi, com menjar al local o emportar-s'ho a casa, pagar en efectiu o amb targeta, amb palleta o sense, etc.?\n" 10: - story_text: "En aquest nivell aprendràs com demanar fàcilment comandes per a diferents plats.\n\n### Exercici 1\nAcaba el codi amb una comanda `{ask}` en els espais en blanc de manera que se li pregunti al client què vol menjar per a cada plat.\n" + story_text: "En aquest nivell aprendràs com demanar fàcilment comandes per a diferents plats.\n\n### Exercici 1\nAcaba el codi amb una comanda `{ask}` en els buits de manera que se li pregunti al client què vol menjar per a cada plat.\n" example_code: "```\nplats = entrant, primer plat, postres\n{for} plat {in} plats\n {print} \"Què vol de \" plat \"?\"\n _ \n _\n```\n" story_text_2: "### Exercici\nPer descomptat, també pots fer una comanda per a diverses persones!\nPots afegir la quantitat correcta d'indentació abans de cada línia perquè el codi funcioni correctament?\nConsell: algunes línies no necessiten cap indentació.\n" + example_code_2: "```\n_ plats = primer plat, segon plat, postre\n_ noms= Toni, Olga\n_ {for} nom {in} noms\n_ {for} plat {in} plats\n_ menjar = {ask} nom ', què t'agradaria menjar com a ' course '?'\n_ {print} nom' demana ' menjar ' com a ' plat\n```\n" 8: story_text: "En aquest nivell pots fer que el teu restaurant virtual sigui més elaborat repetint diverses línies de codi. Com això:\n\n### Exercici\nAquest codi es pot ampliar amb més elements al menú, per exemple oferint begudes i/o diversos plats o postres. Afegeix almenys un element més.\n**Extra** Afegeix encara més elements, tantes opcions com vulguis!\n" example_code: "```\n{print} \"Benvinguts al restaurant del Chef Hedy\"\ngent = {ask} \"Quanta gent son a taula?\"\n{print} \"Perfecte!\"\n{repeat} gent {times}\n menjar = {ask} \"Què voldrà menjar?\"\n {print} menjar\n{print} \"Moltes gràcies per la comanda!\"\n{print} \"Bon profit!\"\n```\n" @@ -1954,5 +1987,197 @@ adventures: 9: story_text: "En aquest nivell pots utilitzar la nidificació per fer que el teu restaurant sigui més realista i divertit!\n\n### Exercici\nLa indentació s'ha eliminat del codi d'exemple.\nPots esbrinar quanta indentació necessita cada línia perquè el codi funcioni correctament?\nSi el client demana pizza, Hedy no hauria de preguntar quina salsa vol el client.\n\n**Extra** El restaurant no disposa de totes les salses. Fes una llista de les salses disponibles i dona una resposta amb cada comanda en funció de si està disponible.
\n**Extra** Les pizzes tenen ingredients. Pregunta als clients què volen.
\n**Extra** Els clients potser volen beguda. Pregunta'ls-hi també!
\n" example_code: "```\n{print} \"Benvinguts al restaurant del Chef Hedy\"\ngent = {ask} \"Quanta gent son a taula?\"\n{print} \"Perfecte!\"\npreu = 0\n{repeat} gent {times}\n_ menjar = {ask} \"Què voldrà menjar?\"\n_ {print} menjar\n_ {if} menjar {is} patates fregides\n_ preu = preu + 3\n_ salsa = {ask} \"Quina salsa vol per les patates?\"\n_ {if} salsa {is} no\n_ {print} \"sense salsa\"\n_ {else}\n_ preu = preu + 1\n_ {print} \"amb \" salsa\n_ {if} menjar {is} pizza\n_ preu = preu + 4\n{print} \"En total costarà \" preu \" euros\"\n{print} \"Bon profit!\"\n```\n" + 12: + story_text: "A partir d'aquest nivell, pots utilitzar nombres decimals per fer el teu menú una mica més realista.\n\n### Exercici\nSeries capaç de pensar un fragment de codi que oferís als teus amics i família un descompte del 15%?\n" + example_code: "```\npreu = 0.0\nmenjar = {ask} \"Què voldria menjar?\"\nbeguda = {ask} \"I per veure que voldria?\"\n{if} menjar {is} \"hamburguesa\"\n preu = preu + 6.50\n{if} menjar {is} \"pizza\"\n preu = preu + 5.75\n{if} beguda {is} \"aigua\"\n preu = preu + 1.20\n{if} beguda {is} \"refresc\"\n preu = preu + 2.35\n{print} \"Costarà un total de \" preu \" euros, siusplau\"\n```\n" + 13: + story_text: "En aquest nivell aprendràs noves comandes per estendre el teu codi encara més.\n\n### Exercici 1\nCol·loca un `{and}` i un `{or}` en el lloc lògic del programa.\n\n### Exercici 2\nAmplia el teu restaurant amb almenys un `{and}` i un `{or}` més.\nPer exemple, crea un cupó de descompte especial que només s'apliqui a la pizza, o ofereix al teu client una beguda gratis\namb patates fregides i pancakes. O alguna cosa completament diferent, és clar!\n" + example_code: "```\npreu = 10\nmenjar = {ask} \"Què voldia menjar?\"\nbeguda = {ask} \"I què li agradaria per beure?\"\n{if} menjar {is} \"bikini\" _ beguda {is} \"suc\"\n {print} \"Aquest és el nostre menú amb descompte\"\n preu = preu - 3\n{if} beguda {is} \"aigua\" _ beguda {is} \"suc\"\n {print} \"Has escollit una beguda saludable\"\n{print} \"Costarà \" preu \" euros, siusplau\"\n```\n" + 15: + story_text: "Amb la comanda `{while}` pots assegurar-te que els teus clients puguin continuar afegint comandes fins que hagin acabat.\n\n### Exercici\nAfegeix correctament la comanda `{while}` a aquest codi.\n" + example_code: "```\n{print} \"Benvinguts al McHedy\"\ncontinuar = \"sí\"\n_\n comanda = {ask} \"Què vol demanar?\"\n {print} comanda\n continuar = {ask} \"Voldria demanar alguna cosa més?\"\n{print} \"Gràcies!\"\n```\n" + 11: + example_code: "```\n{print} \"Benvinguts al Restaurant can Hedy!\"\ngent = {ask} \"Per a quanta gent voleu demanar?\"\n{print} \"Sereu \" gent \" persones.\"\n{print} \"Som-hi!\"\n```\n" + story_text: "Podem utilitzar la comanda `{for}` amb `{range}` per imprimir les comandes de múltiples clients de manera ordenada.\n\n### Exercici \nAcaba el codi del restaurant, perquè puguis demanar la comanda de diverses persones. Imprimeix el número de comanda cada vegada: \"Comanda 1\", \"Comanda 2\" etc.\nNo estàs segur de com fer-ho? Dona una ullada al teu codi del nivell 8.\n\n**Extra** En el nivell 9 el restaurant també utilitzava preus. Pots afegir-ho aquí també!\n" name: Restaurant description: Crea el teu propi restaurant virtual + turtle: + levels: + 8: + example_code: "```\nangle = 90\n{repeat} 4 {times}\n {turn} angle\n {forward} 50\n```\n" + story_text_2: "**Extra** Ara podem millorar el programa que dibuixa diferents figures. Acaba el codi i podràs dibuixar qualsevol polígon que vulguis!\n" + example_code_2: "```\nfigura = {ask} \"Quants angles haig de dibuixar?\"\nangle = 360 / figura\n{repeat} figura {times}\n {turn} _\n {forward} _\n```\n" + story_text: "Ara que podem repetir diverses línies, podem fer figures més fàcilment.\nNomés hem d'establir l'angle una vegada i després utilitzar aquesta variable en el `{repeat}`.\n\n### Exercici 1\nEl codi d'exemple crea un quadrat. Canvia el codi perquè creï una altra figura, com un triangle o un hexàgon.\nAixò requereix un canvi en dues línies de codi.\nConsell: Un cercle complet són 360 graus.\n\n### Exercici 2\nAra crea un dibuix format per almenys dos polígons.\n" + 1: + example_code_2: "```\n{forward} 20\n{turn} {right}\n{forward} 20\n{turn} {left}\n{forward} 20\n```\n" + story_text: "També pots utilitzar Hedy per dibuixar. Combinant girs i línies, pots fer un quadrat o escales!\n\nFent servir `{forward}` es dibuixa una línia cap endavant. El número que hi ha darrere determina quant caminarà la tortuga. `{turn} {right}` gira un quart de volta en sentit horari, `{turn} {left}` gira en sentit antihorari.\n\nPer anar cap enrere, has de fer servir la comanda `{forward}` però amb un número negatiu. Així, per exemple, `{forward} -100`.\n" + example_code: "```\n{forward} 100\n{turn} {left}\n```\n" + story_text_2: "### Exercici\nAquest és l'inici d'una petita escala. Pots fer que tingui 5 graons?\n" + 9: + example_code: "```\n{color} {black}\n{repeat} 3 {times}\n {repeat} 3 {times}\n {forward} 10\n {turn} 120\n {color} {white}\n {forward} 50\n {color} {black}\n```\n" + story_text: "Ara que podem utilitzar un `{repeat}` dins d'un `{repeat}`, podem crear figures més complexes.\n\n### Exercici 1\nAquest codi crea tres triangles negres, canvia-ho per cinc quadrats roses.\n\n**Extra** Crea una figura de la teva elecció que consti d'almenys dos tipus de formes diferents.\n" + 5: + story_text: "Al nivell 5 pots fer una elecció amb `{if}`. Per exemple, entre diferents tipus de figures.\n" + example_code: "```\n{print} \"Dibuixant figures\"\nfigura {is} {ask} \"Vols un quadrat o un triangle?\"\n{if} figura {is} triangle angle {is} 120\n{else} angle {is} 90\n{turn} angle\n{forward} 25\n{turn} angle\n{forward} 25\n{turn} angle\n{forward} 25\n{turn} angle\n{forward} 25\n```\n" + story_text_2: "### Exercici\nOmple els números correctes en aquest codi per fer-lo funcionar.\nDesprés d'haver-ho fet, pots provar d'afegir l'opció cap enrere.\n\n**Extra** En lloc d'utilitzar \"left\" i \"right\", torna a fer el programa amb Nord, Est, Sud i Oest.\nD'aquesta manera podries afegir encara més direccions com Nord-est i Sud-oest, etc.\n" + example_code_2: "```\ndireccio {is} {ask} \"Vols anar dreta, esquerra o cap endavant?\"\n{if} direccio {is} dreta {turn} _\n{if} direccio {is} esquerra {turn} _\n{forward} 100\n```\n" + 2: + example_code: "```\n{forward} 80\n{turn} 90\n{forward} 50\n{turn} 180\n{forward} 100\n```\n" + story_text: "Al nivell 1 la tortuga només podia girar a l'esquerra o a la dreta. Tot plegat una mica avorrit!\nAl nivell 2 pot apuntar el seu nas en totes direccions.\n\nUtilitza 90 graus per girar un quart, 180 per girar mig, i un cercle complet són 360 graus.\n\n### Exercici\nAquest codi ara crea la lletra T. Pots canviar-lo per fer la lletra B?\n\n**Extra** Canvia la lletra a una lletra diferent, com la primera del teu nom.\nTambé pots fer múltiples lletres, establint el color a `{color}` `{white}` enmig. \n" + story_text_2: "Pots utilitzar variables per al `turn` de la tortuga.\n\n### Exercici\nCanvia el codi de manera que creï un triangle. Pista: només has de canviar el codi en un lloc.\n" + example_code_2: "```\n{print} Dibuixant figures\nangle {is} 90\n{turn} angle\n{forward} 25\n{turn} angle\n{forward} 25\n{turn} angle\n{forward} 25\n```\n" + 6: + story_text: "En aquest nivell pots utilitzar càlculs per dibuixar diferents figures.\nPotser has après a l'escola que per a girar un cercle complet són 360 graus. Si no, ara ho saps!\nÉs per això que també fas servir 90 graus per a un quadrat. 360 dividit per 4 és 90.\nAra que podem fer matemàtiques amb Hedy, podem dibuixar totes les figures que vulguem!\n" + example_code: "```\nangles = {ask} \"Quants angles vols?\"\nangle = 360 / angles\n{forward} 50\n{turn} angle\n{forward} 50\n{turn} angle\n{forward} 50\n{turn} angle\n{forward} 50\n{turn} angle\n{forward} 50\n{turn} angle\n{forward} 50\n{turn} angle\n```\n" + 12: + example_code: "```\n{define} quadrat\n {repeat} 4 {times}\n {turn} _\n {forward} _\n{call} quadrat\n{forward} 50\n{call} quadrat\n{forward} 50\n{call} quadrat\n```\n" + story_text: "Podem utilitzar funcions per dibuixar figures més complexes amb menys codi.\n### Exercici 1\nOmple la funció perquè es creïn tres quadrats. Si vols que la imatge es vegi més bonica, pots fer que les línies entre els quadrats siguin blanques.\n\n### Exercici 2\nEl codi es pot fer encara més curt. Col·loca les línies finals en un `{repeat}` perquè la figura encara sigui la mateixa.\n\n### Exercici 3\nCrea el teu propi dibuix amb figures diferents.\nCanvia tant el nombre de figures amb el `{repeat}` com la forma de les figures en el `{define}`\n" + 3: + story_text: "En aquest nivell pots utilitzar `{at} {random}` amb la tortuga de dibuix. Una elecció aleatòria fa que la tortuga camini per un camí diferent cada vegada.\nFes servir `{at} {random}` per triar un valor d'una llista.\n### Exercici\nPots copiar i enganxar les línies 2 i 3 per crear un camí aleatori més llarg?\n" + example_code: "```\nangles {is} 10, 50, 90, 150, 250\n{turn} angles {at} {random}\n{forward} 25\n```\n" + 4: + story_text: "Al nivell 4 has d'utilitzar cometes amb `{print}` i `{ask}`. També quan dibuixes!\n" + story_text_2: "També pots canviar el color de les línies amb la comanda `{color}`. Dona una ullada a l'exemple.\nTambé pots utilitzar la comanda `{color} {white}` per fer línies \"invisibles\". Pots fer servir aquestes línies blanques per moure la tortuga a qualsevol lloc de la pantalla abans de començar a dibuixar.\n" + example_code: "```\n{print} _ Dibuixant figures _\nangle {is} 90\n{turn} angle\n{forward} 25\n{turn} angle\n{forward} 25\n```\n" + example_code_2: "```\n{color} {white}\n{forward} -80\n{color} {green}\n{forward} 50\n{color} {yellow}\n{forward} 50\n{color} {red}\n{forward} 50\n```\n" + 10: + example_code: "```\n{turn} 90\ndistancies = 10, 20, 30, 40, 50, 60\n{for} distancia {in} distancies\n {forward} distancia \n```\n" + story_text: "En aquest nivell pots fer que la tortuga dibuixi una figura.\nLa tortuga recorrerà les distàncies de la llista, una per una, fent passos cada vegada més grans.\n### Exercici 1\nAfegeix un gir de 90 graus en el bucle, perquè es dibuixi una espiral.\nAfegeix almenys 5 números a la llista, perquè l'espiral creixi més.\n**(extra)** pots canviar l'espiral a una altra forma? Experimenta amb números per al gir!\n### Exercici 2\nL'espiral es dibuixa cap a fora, fes que vagi cap a dins?\n" + default_save_name: Tortuga + name: Tortuga + description: Crea el teu dibuix + sleep_command: + description: introduint la comanda {sleep} + name: '{sleep}' + default_save_name: comanda_sleep + levels: + 2: + example_code: "```\n{print} El meu color preferit és el ...\n{sleep} 2\n{print} verd!\n```\n" + story_text: "Una altra comanda nova en aquest nivell és `{sleep}`, que pausa el teu programa durant un segon. Si escrius un número després de la comanda {sleep}, el programa es pausa durant aquest nombre de segons.\n\n### Exercici\nPractica aquesta nova comanda fent un codi propi en què utilitzis la comanda {sleep} almenys 3 vegades. Amb cada comanda {sleep} el temps de pausa ha de ser diferent.\n" + turtle_draw_it: + default_save_name: Dibuixa-ho + levels: + 5: + example_code: "Pista:\n```\nllestra_Escollida{is} {ask} \"Quina lletra prefereixes veure F, E o L?\"\n{if} _\n```\n" + story_text: "### Exercici\nRecrea els dibuixos amb la tortuga!\n\n**Extra** Fes només un codi que permeti al jugador decidir quina lletra vol veure! I pots afegir encara més lletres?\n\n
\nF \nE \nL \n
\n" + 6: + example_code: "Pista per el quadrat:\n```\ncolor_escollit = {ask} _\n```\n" + story_text: "### Exercici\nRecrea els dibuixos amb la tortuga!\n\n**Extra** Deixa que el jugador decideixi de quin color ha de ser el quadrat.\n\n***Extra*** Pots fer la lletra del teu propi nom i la bandera del teu propi país també?\n\n
\nQuadrat \nLletres \nBandera \n
\n" + 3: + story_text: "### Exercici\nRecrea els dibuixos amb la tortuga!\n\n
\nTriangle \nEstrella \nFletxa \n
\n" + 4: + example_code: "**Extra** Preparat per a un veritable repte? Assegura't que els colors d'aquestes figures se seleccionin aleatòriament, de manera que cada vegada que executis el teu programa es vegi diferent!\n\n```\ncolors {is} vermell, taronja, groc, verd, blau, lila, rosa, marró, gris, negre\ncolor _\n```\n" + story_text: "### Exercici\nRecrea els dibuixos amb la tortuga!\n\n
\nEstrella de colors \nArc de Sant Martí \nQuadrats niats \n
\n" + 7: + story_text: "### Exercici\nRecrea els dibuixos amb la tortuga!\n\n
\nHexàgon \nTriangle \nVentall \n
\n" + 9: + story_text: "### Exercici\nRecrea els dibuixos amb la tortuga!\n\n**Extra** El número entre parèntesis indica en quantes línies de codi es pot dibuixar aquesta figura. Pots fer-ho en la mateixa quantitat de línies?\n\n**Extra** Dóna al jugador l'opció de triar de quin país vol veure la bandera.\n\n
\nCreu (7) \nQuadrats niats de colors aleatoris (8) \nBanderes \n
\n" + 1: + story_text: "### Exercici\nRecrea els dibuixos amb la tortuga!\n\n
\n Rectangle \n Quadrat \n Escales\n
\n" + 2: + story_text: "### Exercici\nRecrea els dibuixos amb la tortuga!\n\n
\nTriangle \nFletxa \nVaixell \n
\n" + 8: + story_text: "### Exercici\nRecrea els dibuixos amb la tortuga!\n\n**Extra** El número entre parèntesis indica en quantes línies de codi es pot dibuixar aquesta figura. Pots fer-ho en la mateixa quantitat de línies?\n\n
\nQuadrat (3) \nEstrella de colors aleatoris (5) \nEspiral de colors aleatoris (7) \n
\n" + 12: + story_text: "### Exercici\nRecrea els dibuixos amb la tortuga!\n\nPrimer, defineix una funció **per a cada forma** que vulguis utilitzar a la polsera. Després, afegeix les formes a la polsera així:\n\nPrograma de disseny de polseres \n" + 15: + example_code_3: "Estrella\nUna estrella normalment es dibuixa utilitzant girs de 144 graus. Si canvies això lleugerament a 143 graus, per exemple, i repeteixes el patró múltiples vegades amb un bucle {while}, pots fer aquesta figura.\n" + story_text_2: "Ventilador \n" + story_text_3: "Estrella \n" + story_text: "### Exercici\nRecrea els dibuixos amb la tortuga!\n\nEspiral \n" + 11: + story_text: "### Exercici\nRecrea els dibuixos amb la tortuga!\n\n
\nRusc (6) \nVentall (5) \nFloc de neu (13) \n
\n" + 10: + story_text_2: "Llums de Nadal \n" + story_text: "### Exercici\n\nRecrea els dibuixos amb la tortuga!\n
\nHexàgons niats \nSemàfors \n
\n" + 13: + story_text: "### Exercici\nRecrea els dibuixos amb la tortuga!\n\nCarrer en diferents mides \nCarrer de colors \nTempesta de neu \n" + 14: + story_text: "### Exercici\nCrea un programa que pregunti al jugador quants costats ha de tenir la seva figura i després crea aquesta figura.\nLa figura de la imatge és el resultat quan el jugador introdueix 10.\n\n
\n \n \n
\n" + description: Dibuixa la imatge amb la tortuga + name: Dibuixa-ho! + tic: + name: 3 en ratlla + description: Jugant el 3 en ratlla! + default_save_name: 3-en-ratlla + levels: + 16: + story_text: "Programem un joc de tres en ratlla!\n\n### Exercici\nEn aquesta aventura començarem creant un camp buit.\n\n***Crea una llista anomenada camp*** Aquesta llista serà el nostre camp de joc. Aquesta llista s'omple amb 9 punts, ja que encara no hi ha x's i o's al començament del nostre joc.\n\n***Crea una funció que imprimeixi el camp*** Primer, neteja la pantalla perquè els camps de joc antics siguin eliminats. Després imprimim la primera línia del nostre camp de tres en ratlla. Aquesta línia consta de les primeres 3 posicions de la nostra llista camp.\nJa hem programat aquesta línia per tu. Ara acaba el camp imprimint les posicions 4, 5 i 6 a la segona fila i les posicions 7, 8 i 9 a la tercera fila.\n\n***Crida la funció que imprimeix el camp*** Ara crida la funció.\n
\n Executa el codi. La teva sortida hauria de semblar-se a això: \n
\n\n***Continua a la pròxima aventura*** A la pròxima aventura aprendràs com programar el joc en si.\n" + example_code: "```\n# Crea una llista anomenada camp\n_ = ['.', '.', '.', '.', '.', '.', '.', '.', '.']\n\n# Crea una funció que mostri el camp\n{define} pinta_camp\n _\n {print} '3 en ratlla'\n {print} camp[1] camp[2] camp[3]\n _\n _\n\n# Crida la funció\n```\n" + 17: + example_code: "```\n# Enganxa el teu codi aquí fes-lo apte per el nivell 17\n\n# Crea una funció que detecti si algú ha guanyat\n{define} detecta_guanyador {with} camp, simbol:\n {if} camp[1] == camp[2] {and} camp[2] == camp[3] {and} camp[1] != \".\":\n final_joc = \"Sí\"\n {print} \"Jugador \" simbol \" guanya!\"\n {elif}:\n _\n {else}:\n final_joc = \"no\"\n{return} _\n```\n" + story_text: "Al nivell anterior has après com fer un joc de tres en ratlla. El joc funciona, però és bastant molest perquè no para de preguntar-te si has guanyat.\nAra que tenim la comanda {elif}, podem fer que el joc decideixi si algú ha guanyat i que deixi de preguntar-nos!\n\n### Exercici\n***Enganxa el teu codi*** Enganxa el teu codi del nivell anterior aquí i fes-lo compatible amb el nivell 17. En aquest nivell has après a utilitzar dos punts cada vegada que crees un bloc de codi. Si us plau, afegeix els dos punts als llocs correctes.\n\n***Crea una funció que detecti si algú ha guanyat*** Hem començat la funció per tu, enganxa-la sota la funció `pinta_camp` i acaba la funció. Pots veure que aquesta primera part del codi comprova si les posicions 1, 2 i 3 són les mateixes, perquè si ho són, tens 3 en ratlla.\nTambé comprova si no són un punt, perquè si ho són, la línia podria tenir els mateixos símbols, però això és només perquè encara està buida.\nSi es compleixen totes aquestes condicions, el joc s'acaba i s'imprimeix el guanyador.\nAcaba aquesta funció amb totes les maneres possibles de guanyar. Això vol dir que has de fer-ho per les altres 2 files, 3 columnes i 2 diagonals.\nSi has acabat totes les altres opcions, la funció hauria de retornar la variable `final_joc` perquè puguem utilitzar-la al nostre joc.\n\n***Crida la funció al joc*** Ves a la línia `final_joc = {ask} \"Has guanyat?\"` i canvia-la a `final_joc= {call} detecta_guanyador {with} camp, simbol`. Ara la funció comprovarà si hi ha un guanyador i el joc no haurà de continuar preguntant més!\n\n***Gaudeix del teu joc!*** Gran feina! Has acabat el joc! Gaudeix jugant-hi!\n" + rock_2: + levels: + 2: + example_code: "```\neleccio {is} _\n{print} Escullo eleccio\n```\n" + story_text: "Ara que has après a utilitzar la comanda `{ask}`, també pots fer que el teu codi de pedra, paper, tisores sigui interactiu!\n\n### Exercici\nFes que el codi de pedra, paper, tisores sigui interactiu afegint la comanda `{ask}` amb una pregunta al teu codi de pedra, paper, tisores.\n" + default_save_name: pedra_2 + description: 2a part de pedra, paper, tisores + name: Pedra, paper, tisores 2 + secret: + name: SuperEspia + levels: + 13: + example_code: "```\nnom = {ask} \"Com et dius?\"\npassword = {ask} \"Quina és la contrasenya?\"\n{if} nom {is} \"Agent007\" _ password {is} \"TOPSECRET\"\n {print} \"Ves a l'aeroport demà a les 02:00\"\n{else}\n {print} \"Ves a l'estació de tren avui a les 10:00\"\n ```\n" + story_text: "Podem simplificar el codi de superespia amb `{and}`, de manera que només necessitem un `{if}`.\n\n### Exercici 1\nCompleta el codi omplint la comanda correcta en el buit. Consell: El superespia ha de respondre TOTES les preguntes correctament abans d'obtenir la informació confidencial!\n\n### Exercici 2\nVolem confondre encara més l'enemic! Crea una llista amb respostes falses i selecciona'n una a l'atzar quan es doni una resposta incorrecta.\n" + 12: + story_text: "En aquesta aventura pots crear el teu propi codi de superespia. Codifica un missatge que només l'agent correcte pugui desxifrar.\nSi l'enemic intenta desxifrar el codi, obtindrà informació falsa per fer-li perdre el temps.\n\n### Exercici 1\nCrea el teu propi codi secret per al teu superespia i retorna les dues parts només a l'espia real.\n\n### Exercici 2\nAfegeix un tercer component al codi, com una peça de roba o un objecte.\n" + example_code: "```\nnom = {ask} \"Com et dius?\"\n{if} nom {is} _\n a = \"Ves a l'aeroport \"\n{else}\n a = \"Ves a l'estació de trens \"\npassword = {ask} \"Quina és la constrasenya?\"\n{if} password {is} _\n b = \"demà a les 02:00\"\n{else}\n b = \"avui a les 10:00\"\n{print} _ _ _\n```\n" + default_save_name: SuperEspia + description: Fes el teu propi codi espia + simon: + name: Simon Says + default_save_name: Simon + levels: + 16: + story_text: "Fem un joc de Simon Says! Simon Says és un joc de memòria en què es dona un color al jugador. Ell després haurà de repetir aquest color.\nSi ho fa bé, s'afegeix un color a la seqüència, de manera que ara ha de recordar 2 colors, després 3, després 4, etc. El joc s'acaba en el moment que el jugador s'equivoca.\n\n### Exercici\nEn aquesta primera part de l'aventura de Simon Says, farem que l'ordinador triï un color a l'atzar i l'afegeixi a una llista.\n\n***Fes 2 llistes*** Primer, fes una llista anomenada `colors` i omple-la amb els colors vermell, groc, verd i blau.\nDesprés fes una llista anomenada `sequencia_simon`. Aquesta llista s'utilitzarà com a resposta.\nAl començament del joc, aquestes llistes han d'estar buides. Malauradament, no podem crear una llista buida (encara), així que l'omplirem amb les paraules 'no' i 'llista' i les eliminarem de la llista immediatament.\n\n***Crea una funció que afegeixi un color a la seqüència*** Ara que tenim una llista buida anomenada sequencia_simon, podem començar a omplir-la amb colors aleatoris.\nHo fem amb una funció, perquè puguem cridar-la cada vegada que hi hagi un nou nivell al nostre joc. Crea una funció anomenada `afegeix_color_aleatori`.\nDesprés crea la variable color_aleatori i estableix-la a un color aleatori. A continuació, afegeix aquest color aleatori a la sequencia_simon.\n\n***Crea una funció que mostri la sequencia_simon*** Comença anomenant la nova funció `mostra_sequencia_simon` amb `nivell` com a argument. Ara volem mostrar tants colors com el nivell en què estem (al nivell 1 veus 1 color, al nivell 2 veus 2 colors, etc.).\nAixí que repetim `nivell` vegades, per imprimir `sequencia_simon[i]`. Cada vegada que es mostra un color, espera 1 segon i després neteja la pantalla.\n\n***Prova el teu programa*** Abans de passar al següent nivell, prova si les funcions funcionen cridant totes dues funcions. Si funcionen, hauries de veure un color aleatori a la pantalla de sortida.\nElimina aquesta part de prova del teu codi, copia el codi i continua a la pròxima aventura per aprendre més sobre el joc de Simon Says!\n" + example_code: "```\n# Crea dues llistes\ncolors = _\n_ = ['no', 'llista']\n{remove} _ {from} sequencia_simon\n{remove} _\n# Crea una funció que afegeix un color\n_ afegeix_color_random\n _\n {add} _\n\n# Crea una funció que mostra la sequencia_simon\n{define} _\n {for} i {in} {range} 1 {to} _\n {print} _\n _\n _\n\n# Prova el teu programa\n{call} _\n{call} mostra_sequencia_simon {with} 1\n```\n" + description: Fes el joc del Simon Says + simon_3: + name: Simon Says 3 + default_save_name: Simon + description: Fes el joc del Simon Says + levels: + 16: + example_code: "```\n# Enganxa el teu codi aquí 👇\n\n# El joc\n{while} final_joc _\n {print} _\n _\n _\n _ = ['no', 'llista']\n {remove} _\n {remove} _\n {call} _\n {call} _ {with} _\n {call} _ {with} _\n {if} sequencia_jugador == _\n _\n _\n _\n {else}\n _\n final_joc = _\n```\n" + story_text: "En aquesta aventura programarem el joc de Simon Says!\n\n### Exercici\n***Enganxa el teu codi*** Copia el teu codi de l'aventura anterior i enganxa'l aquí.\n\n***Programa el joc*** Comencem assegurant-nos que el joc continuï mentre no s'acabi. Després imprimim en quin nivell està el jugador, utilitzem la variable level per això. Només ho mostrem durant 1 segon i després netegem la pantalla de nou.\nAra, hem de crear la llista buida sequencia_jugador. Ja hem programat com omplir la llista, amb la nostra funció `sequencia_jugador`, però mai hem fet la llista en si. Per crear la llista utilitzem el mateix truc que vam fer a la pestanya anterior.\nFarem una llista amb les paraules \"no\" i \"llista\" i després eliminarem ambdues paraules. A continuació, cridarem totes les 3 funcions que hem creat.\nFinalment, haurem de comprovar si el jugador ha donat les respostes correctes (és a dir, si la sequencia_jugador i la sequencia_simon són iguals).\nSi és així, felicitarem el jugador. Esperem 1 segon i augmentem el nivell amb 1.\nEl jugador ha donat una resposta incorrecta? Li direm i acabarem el joc establint final_joc a \"True\".\n\n***Gaudeix del teu joc!*** Gran feina! El teu joc no funciona? Utilitza el botó de la marieta per depurar el teu codi!\n" + simon_2: + levels: + 16: + example_code: "```\n# Enganxa el teu codi aquí 👇\n\n\n# Crea una funció que crei la sequencia_jugador\n{define} _\n {for} _\n _ \"Quin és el color número \" i \"?\"\n {add} resposta {to} _\n\n# Configuració inicial\nnivell = _\nfinal_joc= _\n{print} _\n_ 1\n_\n```\n" + story_text: "Continuem amb el nostre joc de Simon Says!\n\n### Exercici\n***Enganxa el teu codi aquí*** Enganxa el teu codi del nivell anterior aquí. No t'oblidis d'eliminar la part que només s'utilitzava per provar les funcions.\n\n***Crea una funció que creï la sequencia_jugador*** La llista `sequencia_jugador` s'usa per capturar les respostes del jugador. Primer definim la funció amb l'argument level.\nA continuació, preguntem tantes vegades com nivell quin és el color que trien. Anomenem aquesta variable `resposta`. Després afegim la variable `resposta` a la llista sequencia_jugador.\n\n***Configuració del joc*** Abans de programar el joc a la pròxima aventura, necessitarem algunes variables inicials. Primer, establim la variable `nivell` a 1 i la variable `final_joc` a False.\nDesprés fem una introducció per al joc. Imprimim \"Benvingut a Simon Says!\" i netegem la pantalla després d'1 segon.\n\n***Continua a la propera aventura per acabar el joc!**** No t'oblidis de copiar el teu codi i portar-lo a la propera aventura.\n" + name: Simon Says 2 + default_save_name: Simon + description: Fes el joc del Simon Says + tic_2: + default_save_name: 3-en-ratlla + description: Jugant al 3 en ratlla! + levels: + 16: + example_code: "```\n# Enganxa el codi de l'aventura anterior aquí\n\n# Afegeix variables\nfinal_joc = _\nsimbol = _\n\n# The game\n{while} _\n posicio = _ \"Jugador \" simbol \"_?\"\n camp[posicio] = _\n _ pinta_camp\n final_joc = {ask} _\n {if} simbol = \"o\"\n simbol = _\n _\n simbol = _\n```\n" + story_text: "A l'aventura anterior has après com crear un camp de joc. Ara aprendràs com crear el joc!\n\n### Exercici\n***Enganxa el teu codi*** Comença enganxant el teu codi de l'aventura anterior aquí.\n\n***Afegeix variables*** Sota la teva llista anomenada `camp` afegirem 2 variables més que necessitarem per programar el joc.\nLa variable `final_joc` ens diu si el joc ha acabat, i ha de ser \"no\" al començament del joc.\nLa variable `simbol` ens diu si és el torn del jugador x o del jugador o. Estableix la variable a \"x\".\n\n***El joc*** Primer utilitza una comanda {while}, per assegurar-te que el joc continuï jugant mentre la variable final_joc estigui establerta a \"no\".\nDurant el joc, primer preguntem al jugador quina posició prefereix. Després canviem el camp amb el número que ha escollit pel seu símbol.\nPosteriorment, imprimim el camp de nou i preguntem al jugador si ha guanyat. Finalment, volem canviar de torn, així que si el símbol és \"x\" ha de passar a ser \"o\" i viceversa.\n\n***Prova el teu joc*** Funciona el teu joc? Genial, diverteix-te jugant! Si no, utilitza el botó de la marieta per depurar el teu codi.\nPotser has descobert una vulnerabilitat al programa: que pots robar la posició de l'altre jugador! Si l'altra persona escull la posició 1, pots introduir un 1 després d'ells i robar-los la posició.\nAixò no és just! Ves la pròxima aventura per aprendre com solucionar aquest problema.\n" + name: 3 en ratlla v2 + tic_3: + description: Jugant el 3 en ratlla! + name: 3 en ratlla v3 + default_save_name: 3-en-ratlla + levels: + 16: + example_code: "```\n# Enganxa el teu codi aquí\n\n# Fes servir aixó per arreglar l'error\n{if} _ = '.'\n camp[posicio] = simbol\n{else}\n {print} _\n _\n```\n" + story_text: "Potser t'has adonat d'un error al codi de l'aventura anterior. Pots robar la posició de l'altre jugador! Si l'altra persona escull la posició 1, pots introduir 1 després d'ells i robar-los la posició.\nAixò no és just! En aquesta aventura arreglarem aquest error.\n\n### Exercici\n***Enganxa el teu codi aquí*** Enganxa el teu codi de l'aventura anterior aquí.\n\n***Arregla l'error*** Per arreglar l'error substituïm la línia que diu `camp[posicio] = sign`. Això converteix qualsevol posició que el jugador hagi triat en el seu símbol.\nVes fins al títol que diu \"Utilitza això per arreglar l'error\" i acaba el codi. Primer volem comprovar si la posició triada encara està buida, així que `if camp[posicio] = '.'`. Si és així pot ser ocupada.\nDesprés fem una comanda else i imprimim \"Ho sento, aquesta posició ja està ocupada\" si la posició no està buida. Finalment, afegim una comanda {sleep}, perquè els jugadors puguin llegir el text abans que es netegi de nou.\nAra copia aquest tros de codi i substitueix la línia `camp[posicio] = simbol` amb aquest nou tros de codi.\n\n***Juga al teu joc!*** Ara el joc hauria de funcionar correctament! Bona feina!\nL'únic defecte és que pot ser una mica molest que el joc continuï preguntant-te si has guanyat. Vols arreglar-ho? Ves al nivell 17, que ho arreglarem!\n" + years: + default_save_name: Compte enrere d'any nou + levels: + 11: + example_code: "```\n{for} num {in} {range} _ {to} _\n {print} num\n {sleep}\n{print} \"Bon any nou!\"\n```\n" + story_text: "En aquest nivell pots utilitzar la comanda `{for}` número `{in}` `{range}` per fer un compte enrere cap a l'Any Nou.\n\n### Exercici\nOmple els buits i fes que el codi funcioni!\n" + description: Compte enrere d'any nou! + name: Any nou + while_command: + description: '{while}' + default_save_name: comanda_while + name: '{while}' + levels: + 15: + story_text: "Aprendrem un nou bucle, el bucle `{while}`! Continuem el bucle mentre la declaració sigui certa.\nAixí que no oblidis canviar el valor dins del bucle.\n\nEn el codi d'exemple, continuem fins que s'hagi donat una resposta correcta.\nSi mai es dóna la resposta correcta, el bucle mai acaba!" diff --git a/content/adventures/de.yaml b/content/adventures/de.yaml index 79a0bced437..368604edfb0 100644 --- a/content/adventures/de.yaml +++ b/content/adventures/de.yaml @@ -2,7 +2,7 @@ adventures: story: name: Geschichte default_save_name: Geschichte - description: Geschichte + description: Schreib eine Kurzgeschichte levels: 1: story_text: | @@ -367,9 +367,9 @@ adventures: ``` story_text_2: | ### Übung - In vorherigen Übung hast du das Setzen von Variablen mit dem `{is}` Befehl geübt. - Du hast mindestens 3 Variablen definiert und sie im drucke Befehl verwendet. - Jetzt wollen wir die Variablen wie unserem Beispiel interaktiv machen, statt sie zu setzen. + In der vorherigen Übung hast du die Definition von Variablen mit dem `{is}` Befehl geübt. + Du hast mindestens 3 Variablen festgelegt und sie mit dem Druckbefehl verwendet. + Jetzt wollen wir die Variablen nicht einfach festlegen, sondern flexibel machen - so wie in unserem Beispiel. Kopiere den Code der vorherigen Übung hierher und mache sie mit `{ask}` Befehlen interaktiv. example_code_2: | @@ -391,8 +391,8 @@ adventures: levels: 17: story_text: | - Blackjack ist ein einfaches Kartenspiel, bei dem du so nahe wie möglich an die 21 herankommen musst. Du bekommst zwei Karten. Jede Karte hat den Wert ihrer abgebildeten zahl und die Karten mit Bildern (Bube, Dame, König) sind 10 Punkte Wert. - Das Ass is entweder 1 oder 11 Punkte wert (das kannst du dir aussuchen). Der Kartengeber, dein Gegner, erhält auch zwei Karten. + Blackjack ist ein einfaches Kartenspiel, bei dem du so nahe wie möglich an die 21 herankommen musst. Du bekommst zwei Karten. Jede Karte hat den Wert ihrer abgebildeten Zahl. Die Karten mit Bildern (Bube, Dame, König) sind 10 Punkte wert. + Das Ass ist entweder 1 oder 11 Punkte wert - das kannst du dir aussuchen. Der Kartengeber, dein Gegner, erhält auch zwei Karten. Wenn du möchtest, kannst du noch eine Karte ziehen und ihre Punkte werden zu deinen dazugerechnet. Der Kartengeber darf auch noch eine Karte ziehen. Aber pass auf, dass du nicht mehr als 21 Punkte bekommst, denn dann verlierst du! Der Spieler, der am nächsten an 21 herankommt ohne sie zu überschreiten, gewinnt! @@ -401,16 +401,16 @@ adventures: In diesem Abenteuer programmieren wir den ersten Teil unseres Blackjack Spiels. Wir schreiben eine Funktion, die berechnet, wie viele Punkte eine Karte zählt. ***Setze die Variablen*** - Beginne, indem du eine Liste mit Karten anlegst, von der 2 bis zum Ass. Als nächstes, mache eine Liste mit den Bildkarte, also Bube, Dame und König. Dann wähle eine zufällige Karte aus der Liste der Karte als karte_1. + Beginne, indem du eine Liste mit Karten anlegst, von der 2 bis zum Ass. Als nächstes mache eine Liste mit den Bildkarten, also Bube, Dame und König. Dann wähle eine zufällige Karte aus der Liste der Karte als karte_1. ***Schreibe eine Funktion, um die Punkte zu berechnen*** Schreibe eine Funktion, die berechnet, wie viele Punkte eine Karte zählt. Alle Bildkarten zählen 10 Punkte, ein Ass 11 und alle anderen Karten zählen ihren Zahlenwert - Die die Variable `punkte` am Ende der Funktion zurück. + Gib die Variable `punkte` am Ende der Funktion zurück. ***Teste die Funktion*** Teste, ob deine Funktion richtig funktioniert. Vervollständige den ersten `{print}`Befehl, indem du die Karte ergänzt, die du gezogen hast. Dann vervollständige die zweite Zeile, indem du die Funktion mit karte_1 aufrufst. - Lass dein Programm ein paar mal laufen. Bist du mit den Ergebnissen zufrieden? Dann kannst du den Testteil entfernen und zum nächsten Tab wechseln! + Lass dein Programm ein paar Mal laufen. Bist du mit den Ergebnissen zufrieden? Dann kannst du den Testteil entfernen und zum nächsten Tab wechseln! example_code: | ``` {print} 'BLACKJACK' diff --git a/content/adventures/en.yaml b/content/adventures/en.yaml index 000c9245b6a..8908ba5347f 100644 --- a/content/adventures/en.yaml +++ b/content/adventures/en.yaml @@ -2,7 +2,7 @@ adventures: story: name: Story default_save_name: Story - description: Story + description: Make a short story levels: 1: story_text: | diff --git a/content/adventures/pl.yaml b/content/adventures/pl.yaml index 4a0220b95cd..5ad965b26c8 100644 --- a/content/adventures/pl.yaml +++ b/content/adventures/pl.yaml @@ -1699,7 +1699,7 @@ adventures: ``` 18: story_text: | - Na koniec zmienimy `{for} i {in} {range} 1 to 5` w prawdziwy kod Pythona, taki jak: + Na koniec zmienimy `{for} i {in} {range} 1 {to} 5` w prawdziwy kod Pythona, taki jak: example_code: "```\n{for} i {in} {range}(1,5):\n {print} (i)\n```\n" default_save_name: for name: '{for}' diff --git a/content/adventures/uk.yaml b/content/adventures/uk.yaml index 58cbbb25b1b..90094492142 100644 --- a/content/adventures/uk.yaml +++ b/content/adventures/uk.yaml @@ -2,7 +2,7 @@ adventures: story: name: Історія default_save_name: Історія - description: Створіть коротку історію + description: Складіть коротке оповідання levels: 1: story_text: | diff --git a/content/pages/ca.yaml b/content/pages/ca.yaml index c0f564fe17e..b50c62301b6 100644 --- a/content/pages/ca.yaml +++ b/content/pages/ca.yaml @@ -69,7 +69,7 @@ learn-more-sections: * [AG Connect (Dutch), April 2020](https://www.agconnect.nl/artikel/stapsgewijs-python-leren-programmeren-met-nieuwe-taal-hedy) start-sections: - title: Primeres passes amb Hedy - text: '*Something about teachers accounts, slides etc*' + text: '' - title: Docents sobre Hedy text: "A while ago we ran a few short Hedy teachers surveys. \nThe questions span between suggestions of improvement and Hedy’s best features. \nBelow is a testimony of their thoughts:\n\nSimple interface and good examples. *Teacher: 3rd - 6th grades (elementary)*\n\nMultilingual programming and just the gradual programming concept itself. - *US: middle school, 6th-8th grade*\n\nThe gradual nature of introducing programming. *Australia: High school*\n\nThe construction is so good. *Netherlands: Lower secondary school HAVO-VWO*\n\nI can keep the pace of the class. *Netherlands: group 7 en 8* \n\nContinues automatically. *Netherlands: 2 HAVO-VWO*\n\nBoth that the explanation can be in Dutch (and the code in English), and that it builds up with more \nand more possibilities. *Netherlands: Plus class group 7*\n\nThe 'realness' of programming, it resembles how it is in reality. *Netherlands: Plus class group 4 to 8*\n\nStep-by-step activities. Fun activities. *Netherlands: 1e All levels, 2e VWO/HAVO 2e VWO +, 3e HAVO 3e VWO*\n\nBut Hedy and its gradual levels... what an idea, \nI wanted to personally thank you for creating this. I cannot thank you enough. Also, I have never seen the level of engagement and enthusiasm of my \nstudents, as I have seen with Hedy. We have covered till level 5, and plan to spend one more week on it in classes and labs, \nbefore starting Python. *Pakistan*\n\nI really like Hedy very much and it is also nicely set up, which makes it good to use in primary school. \nHedy's gradual approach works very well. \nThe short explanation at the beginning of each level and the short example programs help to give the children a quick insight into what is new in the chosen level. \nThe different assignments that the children can choose also work very well. \nYou see the children choose assignments that appeal to them and they then get to work with them, \nthrough the levels. Hedy is great fun for children who are good at programming and want to get a \ntaste of a real programming language. It is good preparation for secondary school as soon as more ICT \neducation is given there. *Netherlands: Oegstgeest Montessori school*\n\n" teacher-guide: @@ -111,7 +111,7 @@ teacher-guide: key: tutorial subsections: - title: Tutorial - text: Vols seguir el tutorial (un altre cop)? Clica aquí + text: Vols seguir el tutorial (un altre cop)? Clica aquí. - title: Teaching preparations key: preparations subsections: @@ -153,7 +153,6 @@ teacher-guide: - text: |- Com que ja heu iniciat sessió, veureu el bàner blau amb El meu perfil i Els meus programes. Aquestes pestanyes també existeixen per als vostres estudiants. A Els meus programes pots trobar tots els codis que has desat. - Podeu desar els vostres projectes fàcilment donant-li un nom a la barra blanca i prement el botó verd Desa el codi. Tu (i els teus estudiants) també pots compartir programes. Aquests programes es publicaran a la nostra pàgina d'exploració, perquè tothom els pugui veure i utilitzar. Si voleu deixar de compartir el vostre programa, aneu a "Els meus programes" i feu clic a "Deixa de compartir". @@ -166,9 +165,7 @@ teacher-guide: D'aquesta manera, els vostres estudiants tenen el temps d'entendre completament un nou comandament o concepte i practicar-lo abans de passar al següent nivell. Utilitzem aquesta estructura a les nostres lliçons: Introducció, Nous conceptes i comandes, anem a treballar, puzles i qüestionaris. - title: Diapositives - text: |- - When giving instructions you might want to use our slides. Our slides are available on the 'For teachers' page. There is a set of slides for each level. In the slides all the new commands for that level are explained. We have aimed to explain why these changes are nessecary or how the new commands come in handy. - We also give some examples of how the new commands can be used. You could of course also use your own slides, or just open Hedy and show your students around the website. Whichever you prefer to give the best Hedy lessons! + text: | - title: Introducció text: |- You can start your lessons by activating your students' prior knowledge: What do they already know about the subject, what did they learn in the previous lesson and which mistakes did they make that they've now learned from? diff --git a/content/parsons/ca.yaml b/content/parsons/ca.yaml index 69b905d7054..021ad7bd2a8 100644 --- a/content/parsons/ca.yaml +++ b/content/parsons/ca.yaml @@ -20,7 +20,7 @@ levels: {print} Soc DJ Hedy {ask} Esteu preparats per a la festa? {ask} Quina cançó t'agradaria escoltar? - {echo} Bona elecció!, m'encanta la cançó. + {echo} Bona elecció!, m'encanta la cançó 2: 1: story: |- diff --git a/content/quizzes/ca.yaml b/content/quizzes/ca.yaml index 4ee910400d6..b1141064c68 100644 --- a/content/quizzes/ca.yaml +++ b/content/quizzes/ca.yaml @@ -18,24 +18,16 @@ levels: code: _ Hola! mp_choice_options: - option: |- - ``` - {echo} - ``` + `{echo}` feedback: '`{echo}` repeats a given answer.' - option: |- - ``` - {print} - ``` + `{print}` feedback: Correcte! - option: |- - ``` - hola - ``` + `hello` feedback: Hola no és una comanda. - option: |- - ``` - {ask} - ``` + `{ask}` feedback: With `{ask}`, you can ask a question. hint: _ Hola món! correct_answer: B @@ -82,24 +74,16 @@ levels: _ Així que el teu animal preferit és... mp_choice_options: - option: |- - ``` - {print} - ``` + `{print}` feedback: No, you would like the answer to be repeated back to you. - option: |- - ``` - Hedy - ``` + `Hedy` feedback: Hedy no és una comanda. - option: |- - ``` - {ask} - ``` + `{ask}` feedback: With `{ask}` you can ask a question. - option: |- - ``` - {echo} - ``` + `{echo}` feedback: Endavant! 6: question_text: Què falla en aquest codi? diff --git a/content/slides/ca.yaml b/content/slides/ca.yaml index 49d97fb2a72..bcd2ba6df6d 100644 --- a/content/slides/ca.yaml +++ b/content/slides/ca.yaml @@ -63,32 +63,27 @@ levels: `{ask}` s'utilitza per fer una pregunta que es pot respondre. code: |- - {print} Welcome to your own rock scissors paper! - {ask} What will you choose? + {print} Us donem la benvinguda a Hedy! + {ask} Comença a programar! 4: header: 'Hedy nivell 1: {echo}' text: |- El codi de text final que podeu utilitzar al nivell 1 és `{echo}`. `{echo}` s'utilitza per repetir la resposta d'un `{ask}`. - code: |- - {print} Hello! - {ask} What is your name? - {echo} hello + code: | 5: - header: Programació! - text: |- - amb `{print}`, `{ask}` i `{echo}` ja podeu crear una petita història. - És un bon moment per provar les aventures del lloro, la història i la roca, les tisores de paper. + header: '{echo}' + text: | 6: header: Programació! - text: Les aventures es mostren en pestanyes. + text: '' 7: header: Programació! text: Els botons de fletxa groga es poden utilitzar per copiar exemples. editor: /hedy#print_command 8: - header: Dibuixant amb la tortuga + header: Programant! text: Ara que hem vist els codis de text, ara veurem els codis de dibuix a continuació. 9: header: 'Dibuix amb la tortuga: {forward}' @@ -98,19 +93,13 @@ levels: text: '`{turn}` s''utilitza per fer que la tortuga giri a l''esquerra o a la dreta.' code: |- {forward} 50 - {turn} left 11: code: |- {forward} 50 {turn} left 2: 3: - text: |- - We can also set a variable by asking questions. - - The answer to the question is stored in the variable. - - This way we don't need the `{echo}` command. + text: | 4: text: Now that we use variables, we can use multiple variables instead of just one `{echo}`command. 4: diff --git a/static/js/appbundle.js b/static/js/appbundle.js index cd39bb85c45..206920e1a6b 100644 --- a/static/js/appbundle.js +++ b/static/js/appbundle.js @@ -60836,7 +60836,7 @@ ${o3}` : i3; "disabled": "Desactivat", "errors": "Errors", "fortune": "\u{1F52E}, \u2728", - "graph_title": "Errors per adventure completed on level {level}", + "graph_title": "Errors per aventura completada al nivell {level}", "haunted": "\u{1F987}, \u{1F47B}, \u{1F383}", "level_title": "Nivell", "multiple_keywords_warning": "You are trying to use the keyword {orig_keyword}, but this keyword might have several meanings. Please choose the one you're trying to use from this list and copy paste it in your code, curly braces included: {keyword_list}", diff --git a/static/js/appbundle.js.map b/static/js/appbundle.js.map index 4da75b2e1b4..2ed5e5464be 100644 --- a/static/js/appbundle.js.map +++ b/static/js/appbundle.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../node_modules/jszip/dist/jszip.min.js", "../../node_modules/@babel/runtime/helpers/arrayWithHoles.js", "../../node_modules/@babel/runtime/helpers/iterableToArrayLimit.js", "../../node_modules/@babel/runtime/helpers/arrayLikeToArray.js", "../../node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js", "../../node_modules/@babel/runtime/helpers/nonIterableRest.js", "../../node_modules/@babel/runtime/helpers/slicedToArray.js", "../../node_modules/@babel/runtime/helpers/classCallCheck.js", "../../node_modules/@babel/runtime/helpers/typeof.js", "../../node_modules/@babel/runtime/helpers/toPrimitive.js", "../../node_modules/@babel/runtime/helpers/toPropertyKey.js", "../../node_modules/@babel/runtime/helpers/createClass.js", "../../node_modules/automation-events/build/es5/bundle.js", "../../node_modules/dompurify/src/utils.js", "../../node_modules/dompurify/src/tags.js", "../../node_modules/dompurify/src/attrs.js", "../../node_modules/dompurify/src/regexp.js", "../../node_modules/dompurify/src/purify.js", "ckeditor.js", "index.ts", "message-translations.ts", "client-messages.ts", "modal.ts", "app.ts", "../../node_modules/tone/Tone/version.ts", "../../node_modules/standardized-audio-context/src/module.ts", "../../node_modules/standardized-audio-context/src/factories/abort-error.ts", "../../node_modules/standardized-audio-context/src/factories/add-active-input-connection-to-audio-node.ts", "../../node_modules/standardized-audio-context/src/factories/add-audio-node-connections.ts", "../../node_modules/standardized-audio-context/src/factories/add-audio-param-connections.ts", "../../node_modules/standardized-audio-context/src/globals.ts", "../../node_modules/standardized-audio-context/src/helpers/is-constructible.ts", "../../node_modules/standardized-audio-context/src/helpers/split-import-statements.ts", "../../node_modules/standardized-audio-context/src/factories/add-audio-worklet-module.ts", "../../node_modules/standardized-audio-context/src/helpers/get-value-for-key.ts", "../../node_modules/standardized-audio-context/src/helpers/pick-element-from-set.ts", "../../node_modules/standardized-audio-context/src/helpers/delete-passive-input-connection-to-audio-node.ts", "../../node_modules/standardized-audio-context/src/helpers/get-event-listeners-of-audio-node.ts", "../../node_modules/standardized-audio-context/src/helpers/set-internal-state-to-active.ts", "../../node_modules/standardized-audio-context/src/guards/audio-worklet-node.ts", "../../node_modules/standardized-audio-context/src/helpers/set-internal-state-to-passive.ts", "../../node_modules/standardized-audio-context/src/helpers/set-internal-state-to-passive-when-necessary.ts", "../../node_modules/standardized-audio-context/src/factories/add-connection-to-audio-node.ts", "../../node_modules/standardized-audio-context/src/factories/add-passive-input-connection-to-audio-node.ts", "../../node_modules/standardized-audio-context/src/factories/add-silent-connection.ts", "../../node_modules/standardized-audio-context/src/factories/add-unrendered-audio-worklet-node.ts", "../../node_modules/standardized-audio-context/src/factories/analyser-node-constructor.ts", "../../node_modules/standardized-audio-context/src/helpers/is-owned-by-context.ts", "../../node_modules/standardized-audio-context/src/factories/analyser-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/helpers/test-audio-buffer-copy-channel-methods-out-of-bounds-support.ts", "../../node_modules/standardized-audio-context/src/factories/index-size-error.ts", "../../node_modules/standardized-audio-context/src/helpers/wrap-audio-buffer-get-channel-data-method.ts", "../../node_modules/standardized-audio-context/src/factories/audio-buffer-constructor.ts", "../../node_modules/standardized-audio-context/src/constants.ts", "../../node_modules/standardized-audio-context/src/helpers/is-active-audio-node.ts", "../../node_modules/standardized-audio-context/src/factories/audio-buffer-source-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/audio-buffer-source-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/guards/audio-buffer-source-node.ts", "../../node_modules/standardized-audio-context/src/guards/biquad-filter-node.ts", "../../node_modules/standardized-audio-context/src/guards/constant-source-node.ts", "../../node_modules/standardized-audio-context/src/guards/gain-node.ts", "../../node_modules/standardized-audio-context/src/guards/oscillator-node.ts", "../../node_modules/standardized-audio-context/src/guards/stereo-panner-node.ts", "../../node_modules/standardized-audio-context/src/helpers/get-audio-node-connections.ts", "../../node_modules/standardized-audio-context/src/helpers/get-audio-param-connections.ts", "../../node_modules/standardized-audio-context/src/helpers/deactivate-active-audio-node-input-connections.ts", "../../node_modules/standardized-audio-context/src/helpers/deactivate-audio-graph.ts", "../../node_modules/standardized-audio-context/src/helpers/is-valid-latency-hint.ts", "../../node_modules/standardized-audio-context/src/factories/audio-context-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/audio-destination-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/audio-destination-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/audio-listener-factory.ts", "../../node_modules/standardized-audio-context/src/guards/audio-node.ts", "../../node_modules/standardized-audio-context/src/guards/audio-node-output-connection.ts", "../../node_modules/standardized-audio-context/src/helpers/insert-element-in-set.ts", "../../node_modules/standardized-audio-context/src/helpers/add-active-input-connection-to-audio-param.ts", "../../node_modules/standardized-audio-context/src/helpers/add-passive-input-connection-to-audio-param.ts", "../../node_modules/standardized-audio-context/src/guards/native-audio-node-faker.ts", "../../node_modules/standardized-audio-context/src/helpers/connect-native-audio-node-to-native-audio-node.ts", "../../node_modules/standardized-audio-context/src/helpers/delete-active-input-connection.ts", "../../node_modules/standardized-audio-context/src/helpers/delete-active-input-connection-to-audio-param.ts", "../../node_modules/standardized-audio-context/src/helpers/delete-event-listeners-of-audio-node.ts", "../../node_modules/standardized-audio-context/src/helpers/delete-passive-input-connection-to-audio-param.ts", "../../node_modules/standardized-audio-context/src/helpers/disconnect-native-audio-node-from-native-audio-node.ts", "../../node_modules/standardized-audio-context/src/helpers/get-native-audio-node.ts", "../../node_modules/standardized-audio-context/src/helpers/get-native-audio-param.ts", "../../node_modules/standardized-audio-context/src/helpers/is-part-of-a-cycle.ts", "../../node_modules/standardized-audio-context/src/helpers/is-passive-audio-node.ts", "../../node_modules/standardized-audio-context/src/helpers/test-audio-node-disconnect-method-support.ts", "../../node_modules/standardized-audio-context/src/helpers/visit-each-audio-node-once.ts", "../../node_modules/standardized-audio-context/src/guards/native-audio-node.ts", "../../node_modules/standardized-audio-context/src/helpers/wrap-audio-node-disconnect-method.ts", "../../node_modules/standardized-audio-context/src/factories/audio-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/audio-param-factory.ts", "../../node_modules/standardized-audio-context/src/factories/audio-param-renderer.ts", "../../node_modules/standardized-audio-context/src/read-only-map.ts", "../../node_modules/standardized-audio-context/src/factories/audio-worklet-node-constructor.ts", "../../node_modules/standardized-audio-context/src/helpers/copy-from-channel.ts", "../../node_modules/standardized-audio-context/src/helpers/copy-to-channel.ts", "../../node_modules/standardized-audio-context/src/helpers/create-nested-arrays.ts", "../../node_modules/standardized-audio-context/src/helpers/get-audio-worklet-processor.ts", "../../node_modules/standardized-audio-context/src/factories/audio-worklet-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/base-audio-context-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/biquad-filter-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/biquad-filter-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/cache-test-result.ts", "../../node_modules/standardized-audio-context/src/factories/channel-merger-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/channel-merger-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/channel-splitter-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/channel-splitter-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/connect-audio-param.ts", "../../node_modules/standardized-audio-context/src/factories/connect-multiple-outputs.ts", "../../node_modules/standardized-audio-context/src/factories/connected-native-audio-buffer-source-node-factory.ts", "../../node_modules/standardized-audio-context/src/factories/constant-source-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/constant-source-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/convert-number-to-unsigned-long.ts", "../../node_modules/standardized-audio-context/src/factories/convolver-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/convolver-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/create-native-offline-audio-context.ts", "../../node_modules/standardized-audio-context/src/factories/data-clone-error.ts", "../../node_modules/standardized-audio-context/src/helpers/detach-array-buffer.ts", "../../node_modules/standardized-audio-context/src/factories/decode-audio-data.ts", "../../node_modules/standardized-audio-context/src/factories/decrement-cycle-counter.ts", "../../node_modules/standardized-audio-context/src/factories/delay-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/delay-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/delete-active-input-connection-to-audio-node.ts", "../../node_modules/standardized-audio-context/src/factories/delete-unrendered-audio-worklet-node.ts", "../../node_modules/standardized-audio-context/src/guards/delay-node.ts", "../../node_modules/standardized-audio-context/src/factories/detect-cycles.ts", "../../node_modules/standardized-audio-context/src/factories/disconnect-multiple-outputs.ts", "../../node_modules/standardized-audio-context/src/factories/dynamics-compressor-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/dynamics-compressor-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/encoding-error.ts", "../../node_modules/standardized-audio-context/src/factories/evaluate-source.ts", "../../node_modules/standardized-audio-context/src/factories/event-target-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/expose-current-frame-and-current-time.ts", "../../node_modules/standardized-audio-context/src/factories/fetch-source.ts", "../../node_modules/standardized-audio-context/src/factories/gain-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/gain-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/get-active-audio-worklet-node-inputs.ts", "../../node_modules/standardized-audio-context/src/factories/get-audio-node-renderer.ts", "../../node_modules/standardized-audio-context/src/factories/get-audio-node-tail-time.ts", "../../node_modules/standardized-audio-context/src/factories/get-audio-param-renderer.ts", "../../node_modules/standardized-audio-context/src/factories/get-backup-offline-audio-context.ts", "../../node_modules/standardized-audio-context/src/factories/invalid-state-error.ts", "../../node_modules/standardized-audio-context/src/factories/get-native-context.ts", "../../node_modules/standardized-audio-context/src/factories/get-or-create-backup-offline-audio-context.ts", "../../node_modules/standardized-audio-context/src/factories/get-unrendered-audio-worklet-nodes.ts", "../../node_modules/standardized-audio-context/src/factories/invalid-access-error.ts", "../../node_modules/standardized-audio-context/src/helpers/wrap-iir-filter-node-get-frequency-response-method.ts", "../../node_modules/standardized-audio-context/src/factories/iir-filter-node-constructor.ts", "../../node_modules/standardized-audio-context/src/helpers/filter-buffer.ts", "../../node_modules/standardized-audio-context/src/factories/iir-filter-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/increment-cycle-counter-factory.ts", "../../node_modules/standardized-audio-context/src/factories/is-any-audio-context.ts", "../../node_modules/standardized-audio-context/src/factories/is-any-audio-node.ts", "../../node_modules/standardized-audio-context/src/factories/is-any-audio-param.ts", "../../node_modules/standardized-audio-context/src/factories/is-any-offline-audio-context.ts", "../../node_modules/standardized-audio-context/src/factories/is-native-audio-context.ts", "../../node_modules/standardized-audio-context/src/factories/is-native-audio-node.ts", "../../node_modules/standardized-audio-context/src/factories/is-native-audio-param.ts", "../../node_modules/standardized-audio-context/src/factories/is-native-context.ts", "../../node_modules/standardized-audio-context/src/factories/is-native-offline-audio-context.ts", "../../node_modules/standardized-audio-context/src/factories/is-secure-context.ts", "../../node_modules/standardized-audio-context/src/factories/media-element-audio-source-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/media-stream-audio-destination-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/media-stream-audio-source-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/media-stream-track-audio-source-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/minimal-audio-context-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/minimal-base-audio-context-constructor.ts", "../../node_modules/standardized-audio-context/src/helpers/test-promise-support.ts", "../../node_modules/standardized-audio-context/src/factories/minimal-offline-audio-context-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/monitor-connections.ts", "../../node_modules/standardized-audio-context/src/helpers/assign-native-audio-node-option.ts", "../../node_modules/standardized-audio-context/src/helpers/assign-native-audio-node-options.ts", "../../node_modules/standardized-audio-context/src/helpers/test-analyser-node-get-float-time-domain-data-method-support.ts", "../../node_modules/standardized-audio-context/src/helpers/wrap-analyser-node-get-float-time-domain-data-method.ts", "../../node_modules/standardized-audio-context/src/factories/native-analyser-node-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-audio-buffer-constructor.ts", "../../node_modules/standardized-audio-context/src/helpers/assign-native-audio-node-audio-param-value.ts", "../../node_modules/standardized-audio-context/src/helpers/wrap-audio-buffer-source-node-start-method-consecutive-calls.ts", "../../node_modules/standardized-audio-context/src/helpers/wrap-audio-scheduled-source-node-start-method-negative-parameters.ts", "../../node_modules/standardized-audio-context/src/helpers/wrap-audio-scheduled-source-node-stop-method-negative-parameters.ts", "../../node_modules/standardized-audio-context/src/factories/native-audio-buffer-source-node-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-audio-context-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/native-audio-destination-node.ts", "../../node_modules/standardized-audio-context/src/factories/native-audio-worklet-node-constructor.ts", "../../node_modules/standardized-audio-context/src/helpers/test-clonability-of-audio-worklet-node-options.ts", "../../node_modules/standardized-audio-context/src/factories/native-audio-worklet-node-factory.ts", "../../node_modules/standardized-audio-context/src/helpers/compute-buffer-size.ts", "../../node_modules/standardized-audio-context/src/helpers/clone-audio-worklet-node-options.ts", "../../node_modules/standardized-audio-context/src/helpers/create-audio-worklet-processor-promise.ts", "../../node_modules/standardized-audio-context/src/helpers/create-audio-worklet-processor.ts", "../../node_modules/standardized-audio-context/src/factories/native-audio-worklet-node-faker-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-biquad-filter-node.ts", "../../node_modules/standardized-audio-context/src/factories/native-channel-merger-node-factory.ts", "../../node_modules/standardized-audio-context/src/helpers/wrap-channel-splitter-node.ts", "../../node_modules/standardized-audio-context/src/factories/native-channel-splitter-node.ts", "../../node_modules/standardized-audio-context/src/factories/native-constant-source-node-factory.ts", "../../node_modules/standardized-audio-context/src/helpers/intercept-connections.ts", "../../node_modules/standardized-audio-context/src/factories/native-constant-source-node-faker-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-convolver-node-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-delay-node.ts", "../../node_modules/standardized-audio-context/src/factories/native-dynamics-compressor-node-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-gain-node.ts", "../../node_modules/standardized-audio-context/src/factories/native-iir-filter-node-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-iir-filter-node-faker-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-media-element-audio-source-node.ts", "../../node_modules/standardized-audio-context/src/factories/native-media-stream-audio-destination-node.ts", "../../node_modules/standardized-audio-context/src/factories/native-media-stream-audio-source-node.ts", "../../node_modules/standardized-audio-context/src/factories/native-media-stream-track-audio-source-node-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-offline-audio-context-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/native-oscillator-node-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-panner-node-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-panner-node-faker-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-periodic-wave-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-script-processor-node.ts", "../../node_modules/standardized-audio-context/src/factories/native-stereo-panner-node-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-stereo-panner-node-faker-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-wave-shaper-node-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-wave-shaper-node-faker-factory.ts", "../../node_modules/standardized-audio-context/src/factories/not-supported-error.ts", "../../node_modules/standardized-audio-context/src/factories/offline-audio-context-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/oscillator-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/oscillator-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/panner-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/panner-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/periodic-wave-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/render-automation.ts", "../../node_modules/standardized-audio-context/src/factories/render-inputs-of-audio-node.ts", "../../node_modules/standardized-audio-context/src/factories/render-inputs-of-audio-param.ts", "../../node_modules/standardized-audio-context/src/factories/render-native-offline-audio-context.ts", "../../node_modules/standardized-audio-context/src/factories/set-active-audio-worklet-node-inputs.ts", "../../node_modules/standardized-audio-context/src/factories/set-audio-node-tail-time.ts", "../../node_modules/standardized-audio-context/src/factories/start-rendering.ts", "../../node_modules/standardized-audio-context/src/factories/stereo-panner-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/stereo-panner-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/test-audio-buffer-constructor-support.ts", "../../node_modules/standardized-audio-context/src/factories/test-audio-worklet-processor-post-message-support.ts", "../../node_modules/standardized-audio-context/src/factories/test-offline-audio-context-current-time-support.ts", "../../node_modules/standardized-audio-context/src/factories/unknown-error.ts", "../../node_modules/standardized-audio-context/src/factories/wave-shaper-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/wave-shaper-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/window.ts", "../../node_modules/standardized-audio-context/src/factories/wrap-audio-buffer-copy-channel-methods.ts", "../../node_modules/standardized-audio-context/src/factories/wrap-audio-buffer-copy-channel-methods-out-of-bounds.ts", "../../node_modules/standardized-audio-context/src/factories/wrap-audio-buffer-source-node-stop-method-nullified-buffer.ts", "../../node_modules/standardized-audio-context/src/factories/wrap-channel-merger-node.ts", "../../node_modules/standardized-audio-context/src/helpers/get-first-sample.ts", "../../node_modules/standardized-audio-context/src/helpers/is-dc-curve.ts", "../../node_modules/standardized-audio-context/src/helpers/overwrite-accessors.ts", "../../node_modules/standardized-audio-context/src/helpers/sanitize-audio-worklet-node-options.ts", "../../node_modules/standardized-audio-context/src/helpers/sanitize-channel-splitter-options.ts", "../../node_modules/standardized-audio-context/src/helpers/sanitize-periodic-wave-options.ts", "../../node_modules/standardized-audio-context/src/helpers/set-value-at-time-until-possible.ts", "../../node_modules/standardized-audio-context/src/helpers/test-audio-buffer-source-node-start-method-consecutive-calls-support.ts", "../../node_modules/standardized-audio-context/src/helpers/test-audio-buffer-source-node-start-method-offset-clamping-support.ts", "../../node_modules/standardized-audio-context/src/helpers/test-audio-buffer-source-node-stop-method-nullified-buffer-support.ts", "../../node_modules/standardized-audio-context/src/helpers/test-audio-scheduled-source-node-start-method-negative-parameters-support.ts", "../../node_modules/standardized-audio-context/src/helpers/test-audio-scheduled-source-node-stop-method-consecutive-calls-support.ts", "../../node_modules/standardized-audio-context/src/helpers/test-audio-scheduled-source-node-stop-method-negative-parameters-support.ts", "../../node_modules/standardized-audio-context/src/helpers/test-audio-worklet-node-options-clonability.ts", "../../node_modules/standardized-audio-context/src/helpers/wrap-audio-buffer-source-node-start-method-offset-clamping.ts", "../../node_modules/standardized-audio-context/src/helpers/wrap-audio-scheduled-source-node-stop-method-consecutive-calls.ts", "../../node_modules/standardized-audio-context/src/helpers/wrap-event-listener.ts", "../../node_modules/tone/Tone/core/util/Debug.ts", "../../node_modules/tone/Tone/core/util/TypeCheck.ts", "../../node_modules/tone/Tone/core/context/AudioContext.ts", "../../node_modules/tslib/tslib.es6.mjs", "../../node_modules/tone/Tone/core/clock/Ticker.ts", "../../node_modules/tone/Tone/core/util/AdvancedTypeCheck.ts", "../../node_modules/tone/Tone/core/util/Defaults.ts", "../../node_modules/tone/Tone/core/Tone.ts", "../../node_modules/tone/Tone/core/util/Math.ts", "../../node_modules/tone/Tone/core/util/Timeline.ts", "../../node_modules/tone/Tone/core/context/ContextInitialization.ts", "../../node_modules/tone/Tone/core/util/Emitter.ts", "../../node_modules/tone/Tone/core/context/BaseContext.ts", "../../node_modules/tone/Tone/core/context/Context.ts", "../../node_modules/tone/Tone/core/context/DummyContext.ts", "../../node_modules/tone/Tone/core/util/Interface.ts", "../../node_modules/tone/Tone/core/context/ToneAudioBuffer.ts", "../../node_modules/tone/Tone/core/context/OfflineContext.ts", "../../node_modules/tone/Tone/core/Global.ts", "../../node_modules/tone/Tone/core/type/Conversions.ts", "../../node_modules/tone/Tone/core/type/TimeBase.ts", "../../node_modules/tone/Tone/core/type/Time.ts", "../../node_modules/tone/Tone/core/type/Frequency.ts", "../../node_modules/tone/Tone/core/type/TransportTime.ts", "../../node_modules/tone/Tone/core/context/ToneWithContext.ts", "../../node_modules/tone/Tone/core/util/StateTimeline.ts", "../../node_modules/tone/Tone/core/context/Param.ts", "../../node_modules/tone/Tone/core/context/ToneAudioNode.ts", "../../node_modules/tone/Tone/core/context/Gain.ts", "../../node_modules/tone/Tone/source/OneShotSource.ts", "../../node_modules/tone/Tone/signal/ToneConstantSource.ts", "../../node_modules/tone/Tone/signal/Signal.ts", "../../node_modules/tone/Tone/core/clock/TickParam.ts", "../../node_modules/tone/Tone/core/clock/TickSignal.ts", "../../node_modules/tone/Tone/core/clock/TickSource.ts", "../../node_modules/tone/Tone/core/clock/Clock.ts", "../../node_modules/tone/Tone/core/context/ToneAudioBuffers.ts", "../../node_modules/tone/Tone/core/type/Midi.ts", "../../node_modules/tone/Tone/core/type/Ticks.ts", "../../node_modules/tone/Tone/core/util/Draw.ts", "../../node_modules/tone/Tone/core/util/IntervalTimeline.ts", "../../node_modules/tone/Tone/component/channel/Volume.ts", "../../node_modules/tone/Tone/core/context/Destination.ts", "../../node_modules/tone/Tone/core/util/TimelineValue.ts", "../../node_modules/tone/Tone/core/clock/TransportEvent.ts", "../../node_modules/tone/Tone/core/clock/TransportRepeatEvent.ts", "../../node_modules/tone/Tone/core/clock/Transport.ts", "../../node_modules/tone/Tone/source/Source.ts", "../../node_modules/tone/Tone/source/buffer/ToneBufferSource.ts", "../../node_modules/tone/Tone/source/Noise.ts", "../../node_modules/tone/Tone/source/oscillator/OscillatorInterface.ts", "../../node_modules/tone/Tone/source/oscillator/ToneOscillatorNode.ts", "../../node_modules/tone/Tone/source/oscillator/Oscillator.ts", "../../node_modules/tone/Tone/signal/SignalOperator.ts", "../../node_modules/tone/Tone/signal/WaveShaper.ts", "../../node_modules/tone/Tone/signal/AudioToGain.ts", "../../node_modules/tone/Tone/signal/Multiply.ts", "../../node_modules/tone/Tone/source/oscillator/AMOscillator.ts", "../../node_modules/tone/Tone/source/oscillator/FMOscillator.ts", "../../node_modules/tone/Tone/source/oscillator/PulseOscillator.ts", "../../node_modules/tone/Tone/source/oscillator/FatOscillator.ts", "../../node_modules/tone/Tone/source/oscillator/PWMOscillator.ts", "../../node_modules/tone/Tone/source/oscillator/OmniOscillator.ts", "../../node_modules/tone/Tone/core/util/Decorator.ts", "../../node_modules/tone/Tone/source/buffer/Player.ts", "../../node_modules/tone/Tone/component/envelope/Envelope.ts", "../../node_modules/tone/Tone/instrument/Instrument.ts", "../../node_modules/tone/Tone/instrument/Monophonic.ts", "../../node_modules/tone/Tone/component/envelope/AmplitudeEnvelope.ts", "../../node_modules/tone/Tone/instrument/Synth.ts", "../../node_modules/tone/Tone/instrument/MembraneSynth.ts", "../../node_modules/tone/Tone/core/worklet/WorkletGlobalScope.ts", "../../node_modules/tone/Tone/core/worklet/ToneAudioWorkletProcessor.worklet.ts", "../../node_modules/tone/Tone/core/worklet/SingleIOProcessor.worklet.ts", "../../node_modules/tone/Tone/core/worklet/DelayLine.worklet.ts", "../../node_modules/tone/Tone/component/filter/FeedbackCombFilter.worklet.ts", "../../node_modules/tone/Tone/instrument/PolySynth.ts", "../../node_modules/tone/Tone/instrument/Sampler.ts", "../../node_modules/tone/Tone/component/channel/Panner.ts", "../../node_modules/tone/Tone/effect/BitCrusher.worklet.ts", "../../node_modules/tone/Tone/effect/Freeverb.ts", "../../node_modules/tone/Tone/effect/JCReverb.ts", "../../node_modules/tone/Tone/component/channel/Solo.ts", "../../node_modules/tone/Tone/component/channel/PanVol.ts", "../../node_modules/tone/Tone/component/channel/Channel.ts", "../../node_modules/tone/Tone/core/context/Listener.ts", "../../node_modules/tone/Tone/index.ts", "event-emitter.ts", "tabs.ts", "pythonPrefixes.ts", "types.ts", "tutorials/utils.ts", "tutorials/intro.ts", "tutorials/teacher.ts", "tutorials/level1.ts", "tutorials/tutorial.ts", "editor.ts", "../../node_modules/@codemirror/state/dist/index.js", "../../node_modules/style-mod/src/style-mod.js", "../../node_modules/w3c-keyname/index.js", "../../node_modules/@codemirror/view/dist/index.js", "../../node_modules/@lezer/common/dist/index.js", "../../node_modules/@lezer/highlight/dist/index.js", "../../node_modules/@codemirror/language/dist/index.js", "../../node_modules/@codemirror/commands/dist/index.js", "../../node_modules/crelt/index.js", "../../node_modules/@codemirror/search/dist/index.js", "cm-decorations.ts", "../../node_modules/@lezer/lr/dist/index.js", "lezer-parsers/level1-parser.terms.ts", "lezer-parsers/level2-parser.terms.ts", "lezer-parsers/level3-parser.terms.ts", "lezer-parsers/level4-parser.terms.ts", "lezer-parsers/level5-parser.terms.ts", "lezer-parsers/level6-parser.terms.ts", "lezer-parsers/level7-parser.terms.ts", "lezer-parsers/level8-parser.terms.ts", "lezer-parsers/level10-parser.terms.ts", "lezer-parsers/level11-parser.terms.ts", "lezer-parsers/level12-parser.terms.ts", "lezer-parsers/level13-parser.terms.ts", "lezer-parsers/level14-parser.terms.ts", "lezer-parsers/level15-parser.terms.ts", "lezer-parsers/level16-parser.terms.ts", "lezer-parsers/level17-parser.terms.ts", "lezer-parsers/level18-parser.terms.ts", "utils.ts", "lezer-parsers/tokens.ts", "lezer-parsers/level1-parser.ts", "lezer-parsers/level2-parser.ts", "lezer-parsers/level3-parser.ts", "lezer-parsers/level4-parser.ts", "lezer-parsers/level5-parser.ts", "lezer-parsers/level6-parser.ts", "lezer-parsers/level7-parser.ts", "lezer-parsers/level8-parser.ts", "lezer-parsers/level9-parser.ts", "lezer-parsers/level10-parser.ts", "lezer-parsers/level11-parser.ts", "lezer-parsers/level12-parser.ts", "lezer-parsers/level13-parser.ts", "lezer-parsers/level14-parser.ts", "lezer-parsers/level15-parser.ts", "lezer-parsers/level16-parser.ts", "lezer-parsers/level17-parser.ts", "lezer-parsers/level18-parser.ts", "lezer-parsers/language-packages.ts", "cm-monokai-theme.ts", "cm-editor.ts", "../../node_modules/sortablejs/modular/sortable.esm.js", "parsons.ts", "browser-helpers/on-element-becomes-visible.ts", "debugging.ts", "local.ts", "teachers.ts", "adventure.ts", "autosave.ts", "../../node_modules/@kurkle/color/dist/color.esm.js", "../../node_modules/chart.js/src/helpers/helpers.core.ts", "../../node_modules/chart.js/src/helpers/helpers.math.ts", "../../node_modules/chart.js/src/helpers/helpers.collection.ts", "../../node_modules/chart.js/src/helpers/helpers.extras.ts", "../../node_modules/chart.js/src/helpers/helpers.easing.ts", "../../node_modules/chart.js/src/helpers/helpers.color.ts", "../../node_modules/chart.js/src/core/core.animations.defaults.js", "../../node_modules/chart.js/src/core/core.layouts.defaults.js", "../../node_modules/chart.js/src/helpers/helpers.intl.ts", "../../node_modules/chart.js/src/core/core.ticks.js", "../../node_modules/chart.js/src/core/core.scale.defaults.js", "../../node_modules/chart.js/src/core/core.defaults.js", "../../node_modules/chart.js/src/helpers/helpers.canvas.ts", "../../node_modules/chart.js/src/helpers/helpers.options.ts", "../../node_modules/chart.js/src/helpers/helpers.config.ts", "../../node_modules/chart.js/src/helpers/helpers.curve.ts", "../../node_modules/chart.js/src/helpers/helpers.dom.ts", "../../node_modules/chart.js/src/helpers/helpers.interpolation.ts", "../../node_modules/chart.js/src/helpers/helpers.rtl.ts", "../../node_modules/chart.js/src/helpers/helpers.segment.js", "../../node_modules/chart.js/src/core/core.animator.js", "../../node_modules/chart.js/src/core/core.animation.js", "../../node_modules/chart.js/src/core/core.animations.js", "../../node_modules/chart.js/src/core/core.datasetController.js", "../../node_modules/chart.js/src/controllers/controller.bar.js", "../../node_modules/chart.js/src/controllers/controller.bubble.js", "../../node_modules/chart.js/src/controllers/controller.doughnut.js", "../../node_modules/chart.js/src/controllers/controller.line.js", "../../node_modules/chart.js/src/controllers/controller.polarArea.js", "../../node_modules/chart.js/src/controllers/controller.pie.js", "../../node_modules/chart.js/src/controllers/controller.radar.js", "../../node_modules/chart.js/src/controllers/controller.scatter.js", "../../node_modules/chart.js/src/core/core.adapters.ts", "../../node_modules/chart.js/src/core/core.interaction.js", "../../node_modules/chart.js/src/core/core.layouts.js", "../../node_modules/chart.js/src/platform/platform.base.js", "../../node_modules/chart.js/src/platform/platform.basic.js", "../../node_modules/chart.js/src/platform/platform.dom.js", "../../node_modules/chart.js/src/platform/index.js", "../../node_modules/chart.js/src/core/core.element.ts", "../../node_modules/chart.js/src/core/core.scale.autoskip.js", "../../node_modules/chart.js/src/core/core.scale.js", "../../node_modules/chart.js/src/core/core.typedRegistry.js", "../../node_modules/chart.js/src/core/core.registry.js", "../../node_modules/chart.js/src/core/core.plugins.js", "../../node_modules/chart.js/src/core/core.config.js", "../../node_modules/chart.js/src/core/core.controller.js", "../../node_modules/chart.js/src/elements/element.arc.ts", "../../node_modules/chart.js/src/elements/element.line.js", "../../node_modules/chart.js/src/elements/element.point.ts", "../../node_modules/chart.js/src/elements/element.bar.js", "../../node_modules/chart.js/src/plugins/plugin.colors.ts", "../../node_modules/chart.js/src/plugins/plugin.decimation.js", "../../node_modules/chart.js/src/plugins/plugin.filler/filler.segment.js", "../../node_modules/chart.js/src/plugins/plugin.filler/filler.helper.js", "../../node_modules/chart.js/src/plugins/plugin.filler/filler.options.js", "../../node_modules/chart.js/src/plugins/plugin.filler/filler.target.stack.js", "../../node_modules/chart.js/src/plugins/plugin.filler/simpleArc.js", "../../node_modules/chart.js/src/plugins/plugin.filler/filler.target.js", "../../node_modules/chart.js/src/plugins/plugin.filler/filler.drawing.js", "../../node_modules/chart.js/src/plugins/plugin.filler/index.js", "../../node_modules/chart.js/src/plugins/plugin.legend.js", "../../node_modules/chart.js/src/plugins/plugin.title.js", "../../node_modules/chart.js/src/plugins/plugin.subtitle.js", "../../node_modules/chart.js/src/plugins/plugin.tooltip.js", "../../node_modules/chart.js/src/scales/scale.category.js", "../../node_modules/chart.js/src/scales/scale.linearbase.js", "../../node_modules/chart.js/src/scales/scale.linear.js", "../../node_modules/chart.js/src/scales/scale.logarithmic.js", "../../node_modules/chart.js/src/scales/scale.radialLinear.js", "../../node_modules/chart.js/src/scales/scale.time.js", "../../node_modules/chart.js/src/scales/scale.timeseries.js", "../../node_modules/chart.js/src/index.ts", "loading.ts", "comm.ts", "auth.ts", "local-save-warning.ts", "user-activity.ts", "index-tabs.ts", "htmx-integration.ts", "statistics.ts", "logs.ts", "admin.ts", "profile.ts", "initialize.ts", "../../node_modules/tw-elements/src/js/dom/data.js", "../../node_modules/tw-elements/src/js/util/index.js", "../../node_modules/tw-elements/src/js/dom/event-handler.js", "../../node_modules/tw-elements/src/js/base-component.js", "../../node_modules/tw-elements/src/js/components/button.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/enums.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getNodeName.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getWindow.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/instanceOf.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/modifiers/applyStyles.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/getBasePlacement.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/math.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/userAgent.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/contains.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/isTableElement.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getParentNode.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/within.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/getFreshSideObject.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/mergePaddingObject.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/expandToHashMap.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/modifiers/arrow.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/getVariation.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/modifiers/computeStyles.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/modifiers/eventListeners.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/getOppositePlacement.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/rectToClientRect.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/computeOffsets.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/detectOverflow.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/modifiers/flip.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/modifiers/hide.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/modifiers/offset.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/modifiers/popperOffsets.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/getAltAxis.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/modifiers/preventOverflow.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/orderModifiers.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/debounce.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/format.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/validateModifiers.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/uniqueBy.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/mergeByName.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/createPopper.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/popper-lite.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/popper.js", "../../node_modules/tw-elements/src/js/dom/manipulator.js", "../../node_modules/tw-elements/src/js/dom/selector-engine.js", "../../node_modules/tw-elements/src/js/components/dropdown.js", "../../node_modules/tw-elements/src/js/components/collapse.js", "../../node_modules/tw-elements/src/js/util/scrollbar.js", "../../node_modules/tw-elements/src/js/util/backdrop.js", "../../node_modules/tw-elements/src/js/util/focusTrap.js", "../../node_modules/tw-elements/src/js/util/component-functions.js", "../../node_modules/tw-elements/src/js/components/offcanvas.js", "../../node_modules/tw-elements/src/js/components/alert.js", "../../node_modules/tw-elements/src/js/components/carousel.js", "../../node_modules/tw-elements/src/js/components/modal.js", "../../node_modules/tw-elements/src/js/util/sanitizer.js", "../../node_modules/tw-elements/src/js/components/tooltip.js", "../../node_modules/tw-elements/src/js/components/popover.js", "../../node_modules/tw-elements/src/js/navigation/scrollspy.js", "../../node_modules/tw-elements/src/js/navigation/tab.js", "../../node_modules/tw-elements/src/js/components/toast.js", "../../node_modules/tw-elements/node_modules/detect-autofill/dist/detect-autofill.js", "../../node_modules/tw-elements/src/js/forms/input.js", "../../node_modules/tw-elements/src/js/content-styles/animate.js", "../../node_modules/tw-elements/src/js/methods/ripple.js", "../../node_modules/tw-elements/src/js/forms/datepicker/date-utils.js", "../../node_modules/tw-elements/src/js/forms/datepicker/templates.js", "../../node_modules/tw-elements/src/js/util/keycodes.js", "../../node_modules/tw-elements/src/js/forms/datepicker/index.js", "../../node_modules/tw-elements/src/js/forms/timepicker/templates.js", "../../node_modules/tw-elements/src/js/forms/timepicker/utils.js", "../../node_modules/tw-elements/src/js/forms/timepicker/index.js", "../../node_modules/tw-elements/src/js/util/touch/swipe.js", "../../node_modules/tw-elements/src/js/util/touch/index.js", "../../node_modules/tw-elements/src/js/navigation/sidenav.js", "../../node_modules/tw-elements/src/js/components/stepper.js", "../../node_modules/tw-elements/src/js/forms/select/select-option.js", "../../node_modules/tw-elements/src/js/forms/select/selection-model.js", "../../node_modules/tw-elements/src/js/forms/select/util.js", "../../node_modules/tw-elements/src/js/forms/select/templates.js", "../../node_modules/tw-elements/src/js/forms/select/index.js", "../../node_modules/tw-elements/src/js/components/chips/templates.js", "../../node_modules/tw-elements/src/js/components/chips/chip.js", "../../node_modules/tw-elements/src/js/components/chips/index.js", "../../node_modules/tw-elements/src/js/data/chart/chartDefaults.js", "../../node_modules/tw-elements/node_modules/deepmerge/dist/cjs.js", "../../node_modules/tw-elements/src/js/data/chart/charts.js", "../../node_modules/tw-elements/node_modules/perfect-scrollbar/dist/perfect-scrollbar.esm.js", "../../node_modules/tw-elements/src/js/methods/perfect-scrollbar.js", "../../node_modules/tw-elements/src/js/data/datatables/html/pagination.js", "../../node_modules/tw-elements/src/js/data/datatables/html/columns.js", "../../node_modules/tw-elements/src/js/data/datatables/html/rows.js", "../../node_modules/tw-elements/src/js/data/datatables/html/table.js", "../../node_modules/tw-elements/src/js/data/datatables/util.js", "../../node_modules/tw-elements/src/js/data/datatables/index.js", "../../node_modules/tw-elements/src/js/components/rating.js", "../../node_modules/tw-elements/src/js/components/popconfirm.js", "../../node_modules/tw-elements/src/js/components/lightbox.js", "../../node_modules/tw-elements/src/js/forms/validation/rules.js", "../../node_modules/tw-elements/src/js/forms/validation/validation.js", "../../node_modules/tw-elements/src/js/methods/touch/touchUtil.js", "../../node_modules/tw-elements/src/js/methods/touch/press.js", "../../node_modules/tw-elements/src/js/methods/touch/swipe.js", "../../node_modules/tw-elements/src/js/methods/touch/pan.js", "../../node_modules/tw-elements/src/js/methods/touch/pinch.js", "../../node_modules/tw-elements/src/js/methods/touch/tap.js", "../../node_modules/tw-elements/src/js/methods/touch/rotate.js", "../../node_modules/tw-elements/src/js/methods/touch/index.js", "../../node_modules/tw-elements/src/js/methods/smooth-scroll.js", "../../node_modules/tw-elements/src/js/methods/lazy-load.js", "../../node_modules/tw-elements/src/js/methods/clipboard.js", "../../node_modules/tw-elements/src/js/methods/infinite-scroll.js", "../../node_modules/tw-elements/src/js/methods/loading-management/templates.js", "../../node_modules/tw-elements/src/js/methods/loading-management/index.js", "../../node_modules/tw-elements/src/js/forms/dateTimepicker/utils.js", "../../node_modules/tw-elements/src/js/forms/dateTimepicker/templates.js", "../../node_modules/tw-elements/src/js/forms/dateTimepicker/index.js", "../../node_modules/tw-elements/src/js/methods/sticky.js", "../../node_modules/tw-elements/src/js/autoinit/jqueryInit.js", "../../node_modules/tw-elements/src/js/autoinit/autoinitCallbacks.js", "../../node_modules/tw-elements/src/js/autoinit/chartsInit.js", "../../node_modules/tw-elements/src/js/autoinit/Register.js", "../../node_modules/tw-elements/src/js/autoinit/index.js", "tailwind.ts", "public-adventures.ts", "microbit.ts", "custom-elements.ts"], - "sourcesContent": ["/*!\n\nJSZip v3.10.1 - A JavaScript class for generating and reading zip files\n\n\n(c) 2009-2016 Stuart Knightley \nDual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/main/LICENSE.markdown.\n\nJSZip uses the library pako released under the MIT license :\nhttps://github.com/nodeca/pako/blob/main/LICENSE\n*/\n\n!function(e){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=e();else if(\"function\"==typeof define&&define.amd)define([],e);else{(\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this).JSZip=e()}}(function(){return function s(a,o,h){function u(r,e){if(!o[r]){if(!a[r]){var t=\"function\"==typeof require&&require;if(!e&&t)return t(r,!0);if(l)return l(r,!0);var n=new Error(\"Cannot find module '\"+r+\"'\");throw n.code=\"MODULE_NOT_FOUND\",n}var i=o[r]={exports:{}};a[r][0].call(i.exports,function(e){var t=a[r][1][e];return u(t||e)},i,i.exports,s,a,o,h)}return o[r].exports}for(var l=\"function\"==typeof require&&require,e=0;e>2,s=(3&t)<<4|r>>4,a=1>6:64,o=2>4,r=(15&i)<<4|(s=p.indexOf(e.charAt(o++)))>>2,n=(3&s)<<6|(a=p.indexOf(e.charAt(o++))),l[h++]=t,64!==s&&(l[h++]=r),64!==a&&(l[h++]=n);return l}},{\"./support\":30,\"./utils\":32}],2:[function(e,t,r){\"use strict\";var n=e(\"./external\"),i=e(\"./stream/DataWorker\"),s=e(\"./stream/Crc32Probe\"),a=e(\"./stream/DataLengthProbe\");function o(e,t,r,n,i){this.compressedSize=e,this.uncompressedSize=t,this.crc32=r,this.compression=n,this.compressedContent=i}o.prototype={getContentWorker:function(){var e=new i(n.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new a(\"data_length\")),t=this;return e.on(\"end\",function(){if(this.streamInfo.data_length!==t.uncompressedSize)throw new Error(\"Bug : uncompressed data size mismatch\")}),e},getCompressedWorker:function(){return new i(n.Promise.resolve(this.compressedContent)).withStreamInfo(\"compressedSize\",this.compressedSize).withStreamInfo(\"uncompressedSize\",this.uncompressedSize).withStreamInfo(\"crc32\",this.crc32).withStreamInfo(\"compression\",this.compression)}},o.createWorkerFrom=function(e,t,r){return e.pipe(new s).pipe(new a(\"uncompressedSize\")).pipe(t.compressWorker(r)).pipe(new a(\"compressedSize\")).withStreamInfo(\"compression\",t)},t.exports=o},{\"./external\":6,\"./stream/Crc32Probe\":25,\"./stream/DataLengthProbe\":26,\"./stream/DataWorker\":27}],3:[function(e,t,r){\"use strict\";var n=e(\"./stream/GenericWorker\");r.STORE={magic:\"\\0\\0\",compressWorker:function(){return new n(\"STORE compression\")},uncompressWorker:function(){return new n(\"STORE decompression\")}},r.DEFLATE=e(\"./flate\")},{\"./flate\":7,\"./stream/GenericWorker\":28}],4:[function(e,t,r){\"use strict\";var n=e(\"./utils\");var o=function(){for(var e,t=[],r=0;r<256;r++){e=r;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[r]=e}return t}();t.exports=function(e,t){return void 0!==e&&e.length?\"string\"!==n.getTypeOf(e)?function(e,t,r,n){var i=o,s=n+r;e^=-1;for(var a=n;a>>8^i[255&(e^t[a])];return-1^e}(0|t,e,e.length,0):function(e,t,r,n){var i=o,s=n+r;e^=-1;for(var a=n;a>>8^i[255&(e^t.charCodeAt(a))];return-1^e}(0|t,e,e.length,0):0}},{\"./utils\":32}],5:[function(e,t,r){\"use strict\";r.base64=!1,r.binary=!1,r.dir=!1,r.createFolders=!0,r.date=null,r.compression=null,r.compressionOptions=null,r.comment=null,r.unixPermissions=null,r.dosPermissions=null},{}],6:[function(e,t,r){\"use strict\";var n=null;n=\"undefined\"!=typeof Promise?Promise:e(\"lie\"),t.exports={Promise:n}},{lie:37}],7:[function(e,t,r){\"use strict\";var n=\"undefined\"!=typeof Uint8Array&&\"undefined\"!=typeof Uint16Array&&\"undefined\"!=typeof Uint32Array,i=e(\"pako\"),s=e(\"./utils\"),a=e(\"./stream/GenericWorker\"),o=n?\"uint8array\":\"array\";function h(e,t){a.call(this,\"FlateWorker/\"+e),this._pako=null,this._pakoAction=e,this._pakoOptions=t,this.meta={}}r.magic=\"\\b\\0\",s.inherits(h,a),h.prototype.processChunk=function(e){this.meta=e.meta,null===this._pako&&this._createPako(),this._pako.push(s.transformTo(o,e.data),!1)},h.prototype.flush=function(){a.prototype.flush.call(this),null===this._pako&&this._createPako(),this._pako.push([],!0)},h.prototype.cleanUp=function(){a.prototype.cleanUp.call(this),this._pako=null},h.prototype._createPako=function(){this._pako=new i[this._pakoAction]({raw:!0,level:this._pakoOptions.level||-1});var t=this;this._pako.onData=function(e){t.push({data:e,meta:t.meta})}},r.compressWorker=function(e){return new h(\"Deflate\",e)},r.uncompressWorker=function(){return new h(\"Inflate\",{})}},{\"./stream/GenericWorker\":28,\"./utils\":32,pako:38}],8:[function(e,t,r){\"use strict\";function A(e,t){var r,n=\"\";for(r=0;r>>=8;return n}function n(e,t,r,n,i,s){var a,o,h=e.file,u=e.compression,l=s!==O.utf8encode,f=I.transformTo(\"string\",s(h.name)),c=I.transformTo(\"string\",O.utf8encode(h.name)),d=h.comment,p=I.transformTo(\"string\",s(d)),m=I.transformTo(\"string\",O.utf8encode(d)),_=c.length!==h.name.length,g=m.length!==d.length,b=\"\",v=\"\",y=\"\",w=h.dir,k=h.date,x={crc32:0,compressedSize:0,uncompressedSize:0};t&&!r||(x.crc32=e.crc32,x.compressedSize=e.compressedSize,x.uncompressedSize=e.uncompressedSize);var S=0;t&&(S|=8),l||!_&&!g||(S|=2048);var z=0,C=0;w&&(z|=16),\"UNIX\"===i?(C=798,z|=function(e,t){var r=e;return e||(r=t?16893:33204),(65535&r)<<16}(h.unixPermissions,w)):(C=20,z|=function(e){return 63&(e||0)}(h.dosPermissions)),a=k.getUTCHours(),a<<=6,a|=k.getUTCMinutes(),a<<=5,a|=k.getUTCSeconds()/2,o=k.getUTCFullYear()-1980,o<<=4,o|=k.getUTCMonth()+1,o<<=5,o|=k.getUTCDate(),_&&(v=A(1,1)+A(B(f),4)+c,b+=\"up\"+A(v.length,2)+v),g&&(y=A(1,1)+A(B(p),4)+m,b+=\"uc\"+A(y.length,2)+y);var E=\"\";return E+=\"\\n\\0\",E+=A(S,2),E+=u.magic,E+=A(a,2),E+=A(o,2),E+=A(x.crc32,4),E+=A(x.compressedSize,4),E+=A(x.uncompressedSize,4),E+=A(f.length,2),E+=A(b.length,2),{fileRecord:R.LOCAL_FILE_HEADER+E+f+b,dirRecord:R.CENTRAL_FILE_HEADER+A(C,2)+E+A(p.length,2)+\"\\0\\0\\0\\0\"+A(z,4)+A(n,4)+f+b+p}}var I=e(\"../utils\"),i=e(\"../stream/GenericWorker\"),O=e(\"../utf8\"),B=e(\"../crc32\"),R=e(\"../signature\");function s(e,t,r,n){i.call(this,\"ZipFileWorker\"),this.bytesWritten=0,this.zipComment=t,this.zipPlatform=r,this.encodeFileName=n,this.streamFiles=e,this.accumulate=!1,this.contentBuffer=[],this.dirRecords=[],this.currentSourceOffset=0,this.entriesCount=0,this.currentFile=null,this._sources=[]}I.inherits(s,i),s.prototype.push=function(e){var t=e.meta.percent||0,r=this.entriesCount,n=this._sources.length;this.accumulate?this.contentBuffer.push(e):(this.bytesWritten+=e.data.length,i.prototype.push.call(this,{data:e.data,meta:{currentFile:this.currentFile,percent:r?(t+100*(r-n-1))/r:100}}))},s.prototype.openedSource=function(e){this.currentSourceOffset=this.bytesWritten,this.currentFile=e.file.name;var t=this.streamFiles&&!e.file.dir;if(t){var r=n(e,t,!1,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);this.push({data:r.fileRecord,meta:{percent:0}})}else this.accumulate=!0},s.prototype.closedSource=function(e){this.accumulate=!1;var t=this.streamFiles&&!e.file.dir,r=n(e,t,!0,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);if(this.dirRecords.push(r.dirRecord),t)this.push({data:function(e){return R.DATA_DESCRIPTOR+A(e.crc32,4)+A(e.compressedSize,4)+A(e.uncompressedSize,4)}(e),meta:{percent:100}});else for(this.push({data:r.fileRecord,meta:{percent:0}});this.contentBuffer.length;)this.push(this.contentBuffer.shift());this.currentFile=null},s.prototype.flush=function(){for(var e=this.bytesWritten,t=0;t=this.index;t--)r=(r<<8)+this.byteAt(t);return this.index+=e,r},readString:function(e){return n.transformTo(\"string\",this.readData(e))},readData:function(){},lastIndexOfSignature:function(){},readAndCheckSignature:function(){},readDate:function(){var e=this.readInt(4);return new Date(Date.UTC(1980+(e>>25&127),(e>>21&15)-1,e>>16&31,e>>11&31,e>>5&63,(31&e)<<1))}},t.exports=i},{\"../utils\":32}],19:[function(e,t,r){\"use strict\";var n=e(\"./Uint8ArrayReader\");function i(e){n.call(this,e)}e(\"../utils\").inherits(i,n),i.prototype.readData=function(e){this.checkOffset(e);var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{\"../utils\":32,\"./Uint8ArrayReader\":21}],20:[function(e,t,r){\"use strict\";var n=e(\"./DataReader\");function i(e){n.call(this,e)}e(\"../utils\").inherits(i,n),i.prototype.byteAt=function(e){return this.data.charCodeAt(this.zero+e)},i.prototype.lastIndexOfSignature=function(e){return this.data.lastIndexOf(e)-this.zero},i.prototype.readAndCheckSignature=function(e){return e===this.readData(4)},i.prototype.readData=function(e){this.checkOffset(e);var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{\"../utils\":32,\"./DataReader\":18}],21:[function(e,t,r){\"use strict\";var n=e(\"./ArrayReader\");function i(e){n.call(this,e)}e(\"../utils\").inherits(i,n),i.prototype.readData=function(e){if(this.checkOffset(e),0===e)return new Uint8Array(0);var t=this.data.subarray(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{\"../utils\":32,\"./ArrayReader\":17}],22:[function(e,t,r){\"use strict\";var n=e(\"../utils\"),i=e(\"../support\"),s=e(\"./ArrayReader\"),a=e(\"./StringReader\"),o=e(\"./NodeBufferReader\"),h=e(\"./Uint8ArrayReader\");t.exports=function(e){var t=n.getTypeOf(e);return n.checkSupport(t),\"string\"!==t||i.uint8array?\"nodebuffer\"===t?new o(e):i.uint8array?new h(n.transformTo(\"uint8array\",e)):new s(n.transformTo(\"array\",e)):new a(e)}},{\"../support\":30,\"../utils\":32,\"./ArrayReader\":17,\"./NodeBufferReader\":19,\"./StringReader\":20,\"./Uint8ArrayReader\":21}],23:[function(e,t,r){\"use strict\";r.LOCAL_FILE_HEADER=\"PK\u0003\u0004\",r.CENTRAL_FILE_HEADER=\"PK\u0001\u0002\",r.CENTRAL_DIRECTORY_END=\"PK\u0005\u0006\",r.ZIP64_CENTRAL_DIRECTORY_LOCATOR=\"PK\u0006\u0007\",r.ZIP64_CENTRAL_DIRECTORY_END=\"PK\u0006\u0006\",r.DATA_DESCRIPTOR=\"PK\u0007\\b\"},{}],24:[function(e,t,r){\"use strict\";var n=e(\"./GenericWorker\"),i=e(\"../utils\");function s(e){n.call(this,\"ConvertWorker to \"+e),this.destType=e}i.inherits(s,n),s.prototype.processChunk=function(e){this.push({data:i.transformTo(this.destType,e.data),meta:e.meta})},t.exports=s},{\"../utils\":32,\"./GenericWorker\":28}],25:[function(e,t,r){\"use strict\";var n=e(\"./GenericWorker\"),i=e(\"../crc32\");function s(){n.call(this,\"Crc32Probe\"),this.withStreamInfo(\"crc32\",0)}e(\"../utils\").inherits(s,n),s.prototype.processChunk=function(e){this.streamInfo.crc32=i(e.data,this.streamInfo.crc32||0),this.push(e)},t.exports=s},{\"../crc32\":4,\"../utils\":32,\"./GenericWorker\":28}],26:[function(e,t,r){\"use strict\";var n=e(\"../utils\"),i=e(\"./GenericWorker\");function s(e){i.call(this,\"DataLengthProbe for \"+e),this.propName=e,this.withStreamInfo(e,0)}n.inherits(s,i),s.prototype.processChunk=function(e){if(e){var t=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=t+e.data.length}i.prototype.processChunk.call(this,e)},t.exports=s},{\"../utils\":32,\"./GenericWorker\":28}],27:[function(e,t,r){\"use strict\";var n=e(\"../utils\"),i=e(\"./GenericWorker\");function s(e){i.call(this,\"DataWorker\");var t=this;this.dataIsReady=!1,this.index=0,this.max=0,this.data=null,this.type=\"\",this._tickScheduled=!1,e.then(function(e){t.dataIsReady=!0,t.data=e,t.max=e&&e.length||0,t.type=n.getTypeOf(e),t.isPaused||t._tickAndRepeat()},function(e){t.error(e)})}n.inherits(s,i),s.prototype.cleanUp=function(){i.prototype.cleanUp.call(this),this.data=null},s.prototype.resume=function(){return!!i.prototype.resume.call(this)&&(!this._tickScheduled&&this.dataIsReady&&(this._tickScheduled=!0,n.delay(this._tickAndRepeat,[],this)),!0)},s.prototype._tickAndRepeat=function(){this._tickScheduled=!1,this.isPaused||this.isFinished||(this._tick(),this.isFinished||(n.delay(this._tickAndRepeat,[],this),this._tickScheduled=!0))},s.prototype._tick=function(){if(this.isPaused||this.isFinished)return!1;var e=null,t=Math.min(this.max,this.index+16384);if(this.index>=this.max)return this.end();switch(this.type){case\"string\":e=this.data.substring(this.index,t);break;case\"uint8array\":e=this.data.subarray(this.index,t);break;case\"array\":case\"nodebuffer\":e=this.data.slice(this.index,t)}return this.index=t,this.push({data:e,meta:{percent:this.max?this.index/this.max*100:0}})},t.exports=s},{\"../utils\":32,\"./GenericWorker\":28}],28:[function(e,t,r){\"use strict\";function n(e){this.name=e||\"default\",this.streamInfo={},this.generatedError=null,this.extraStreamInfo={},this.isPaused=!0,this.isFinished=!1,this.isLocked=!1,this._listeners={data:[],end:[],error:[]},this.previous=null}n.prototype={push:function(e){this.emit(\"data\",e)},end:function(){if(this.isFinished)return!1;this.flush();try{this.emit(\"end\"),this.cleanUp(),this.isFinished=!0}catch(e){this.emit(\"error\",e)}return!0},error:function(e){return!this.isFinished&&(this.isPaused?this.generatedError=e:(this.isFinished=!0,this.emit(\"error\",e),this.previous&&this.previous.error(e),this.cleanUp()),!0)},on:function(e,t){return this._listeners[e].push(t),this},cleanUp:function(){this.streamInfo=this.generatedError=this.extraStreamInfo=null,this._listeners=[]},emit:function(e,t){if(this._listeners[e])for(var r=0;r \"+e:e}},t.exports=n},{}],29:[function(e,t,r){\"use strict\";var h=e(\"../utils\"),i=e(\"./ConvertWorker\"),s=e(\"./GenericWorker\"),u=e(\"../base64\"),n=e(\"../support\"),a=e(\"../external\"),o=null;if(n.nodestream)try{o=e(\"../nodejs/NodejsStreamOutputAdapter\")}catch(e){}function l(e,o){return new a.Promise(function(t,r){var n=[],i=e._internalType,s=e._outputType,a=e._mimeType;e.on(\"data\",function(e,t){n.push(e),o&&o(t)}).on(\"error\",function(e){n=[],r(e)}).on(\"end\",function(){try{var e=function(e,t,r){switch(e){case\"blob\":return h.newBlob(h.transformTo(\"arraybuffer\",t),r);case\"base64\":return u.encode(t);default:return h.transformTo(e,t)}}(s,function(e,t){var r,n=0,i=null,s=0;for(r=0;r>>6:(r<65536?t[s++]=224|r>>>12:(t[s++]=240|r>>>18,t[s++]=128|r>>>12&63),t[s++]=128|r>>>6&63),t[s++]=128|63&r);return t}(e)},s.utf8decode=function(e){return h.nodebuffer?o.transformTo(\"nodebuffer\",e).toString(\"utf-8\"):function(e){var t,r,n,i,s=e.length,a=new Array(2*s);for(t=r=0;t>10&1023,a[r++]=56320|1023&n)}return a.length!==r&&(a.subarray?a=a.subarray(0,r):a.length=r),o.applyFromCharCode(a)}(e=o.transformTo(h.uint8array?\"uint8array\":\"array\",e))},o.inherits(a,n),a.prototype.processChunk=function(e){var t=o.transformTo(h.uint8array?\"uint8array\":\"array\",e.data);if(this.leftOver&&this.leftOver.length){if(h.uint8array){var r=t;(t=new Uint8Array(r.length+this.leftOver.length)).set(this.leftOver,0),t.set(r,this.leftOver.length)}else t=this.leftOver.concat(t);this.leftOver=null}var n=function(e,t){var r;for((t=t||e.length)>e.length&&(t=e.length),r=t-1;0<=r&&128==(192&e[r]);)r--;return r<0?t:0===r?t:r+u[e[r]]>t?r:t}(t),i=t;n!==t.length&&(h.uint8array?(i=t.subarray(0,n),this.leftOver=t.subarray(n,t.length)):(i=t.slice(0,n),this.leftOver=t.slice(n,t.length))),this.push({data:s.utf8decode(i),meta:e.meta})},a.prototype.flush=function(){this.leftOver&&this.leftOver.length&&(this.push({data:s.utf8decode(this.leftOver),meta:{}}),this.leftOver=null)},s.Utf8DecodeWorker=a,o.inherits(l,n),l.prototype.processChunk=function(e){this.push({data:s.utf8encode(e.data),meta:e.meta})},s.Utf8EncodeWorker=l},{\"./nodejsUtils\":14,\"./stream/GenericWorker\":28,\"./support\":30,\"./utils\":32}],32:[function(e,t,a){\"use strict\";var o=e(\"./support\"),h=e(\"./base64\"),r=e(\"./nodejsUtils\"),u=e(\"./external\");function n(e){return e}function l(e,t){for(var r=0;r>8;this.dir=!!(16&this.externalFileAttributes),0==e&&(this.dosPermissions=63&this.externalFileAttributes),3==e&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||\"/\"!==this.fileNameStr.slice(-1)||(this.dir=!0)},parseZIP64ExtraField:function(){if(this.extraFields[1]){var e=n(this.extraFields[1].value);this.uncompressedSize===s.MAX_VALUE_32BITS&&(this.uncompressedSize=e.readInt(8)),this.compressedSize===s.MAX_VALUE_32BITS&&(this.compressedSize=e.readInt(8)),this.localHeaderOffset===s.MAX_VALUE_32BITS&&(this.localHeaderOffset=e.readInt(8)),this.diskNumberStart===s.MAX_VALUE_32BITS&&(this.diskNumberStart=e.readInt(4))}},readExtraFields:function(e){var t,r,n,i=e.index+this.extraFieldsLength;for(this.extraFields||(this.extraFields={});e.index+4>>6:(r<65536?t[s++]=224|r>>>12:(t[s++]=240|r>>>18,t[s++]=128|r>>>12&63),t[s++]=128|r>>>6&63),t[s++]=128|63&r);return t},r.buf2binstring=function(e){return l(e,e.length)},r.binstring2buf=function(e){for(var t=new h.Buf8(e.length),r=0,n=t.length;r>10&1023,o[n++]=56320|1023&i)}return l(o,n)},r.utf8border=function(e,t){var r;for((t=t||e.length)>e.length&&(t=e.length),r=t-1;0<=r&&128==(192&e[r]);)r--;return r<0?t:0===r?t:r+u[e[r]]>t?r:t}},{\"./common\":41}],43:[function(e,t,r){\"use strict\";t.exports=function(e,t,r,n){for(var i=65535&e|0,s=e>>>16&65535|0,a=0;0!==r;){for(r-=a=2e3>>1:e>>>1;t[r]=e}return t}();t.exports=function(e,t,r,n){var i=o,s=n+r;e^=-1;for(var a=n;a>>8^i[255&(e^t[a])];return-1^e}},{}],46:[function(e,t,r){\"use strict\";var h,c=e(\"../utils/common\"),u=e(\"./trees\"),d=e(\"./adler32\"),p=e(\"./crc32\"),n=e(\"./messages\"),l=0,f=4,m=0,_=-2,g=-1,b=4,i=2,v=8,y=9,s=286,a=30,o=19,w=2*s+1,k=15,x=3,S=258,z=S+x+1,C=42,E=113,A=1,I=2,O=3,B=4;function R(e,t){return e.msg=n[t],t}function T(e){return(e<<1)-(4e.avail_out&&(r=e.avail_out),0!==r&&(c.arraySet(e.output,t.pending_buf,t.pending_out,r,e.next_out),e.next_out+=r,t.pending_out+=r,e.total_out+=r,e.avail_out-=r,t.pending-=r,0===t.pending&&(t.pending_out=0))}function N(e,t){u._tr_flush_block(e,0<=e.block_start?e.block_start:-1,e.strstart-e.block_start,t),e.block_start=e.strstart,F(e.strm)}function U(e,t){e.pending_buf[e.pending++]=t}function P(e,t){e.pending_buf[e.pending++]=t>>>8&255,e.pending_buf[e.pending++]=255&t}function L(e,t){var r,n,i=e.max_chain_length,s=e.strstart,a=e.prev_length,o=e.nice_match,h=e.strstart>e.w_size-z?e.strstart-(e.w_size-z):0,u=e.window,l=e.w_mask,f=e.prev,c=e.strstart+S,d=u[s+a-1],p=u[s+a];e.prev_length>=e.good_match&&(i>>=2),o>e.lookahead&&(o=e.lookahead);do{if(u[(r=t)+a]===p&&u[r+a-1]===d&&u[r]===u[s]&&u[++r]===u[s+1]){s+=2,r++;do{}while(u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&sh&&0!=--i);return a<=e.lookahead?a:e.lookahead}function j(e){var t,r,n,i,s,a,o,h,u,l,f=e.w_size;do{if(i=e.window_size-e.lookahead-e.strstart,e.strstart>=f+(f-z)){for(c.arraySet(e.window,e.window,f,f,0),e.match_start-=f,e.strstart-=f,e.block_start-=f,t=r=e.hash_size;n=e.head[--t],e.head[t]=f<=n?n-f:0,--r;);for(t=r=f;n=e.prev[--t],e.prev[t]=f<=n?n-f:0,--r;);i+=f}if(0===e.strm.avail_in)break;if(a=e.strm,o=e.window,h=e.strstart+e.lookahead,u=i,l=void 0,l=a.avail_in,u=x)for(s=e.strstart-e.insert,e.ins_h=e.window[s],e.ins_h=(e.ins_h<=x&&(e.ins_h=(e.ins_h<=x)if(n=u._tr_tally(e,e.strstart-e.match_start,e.match_length-x),e.lookahead-=e.match_length,e.match_length<=e.max_lazy_match&&e.lookahead>=x){for(e.match_length--;e.strstart++,e.ins_h=(e.ins_h<=x&&(e.ins_h=(e.ins_h<=x&&e.match_length<=e.prev_length){for(i=e.strstart+e.lookahead-x,n=u._tr_tally(e,e.strstart-1-e.prev_match,e.prev_length-x),e.lookahead-=e.prev_length-1,e.prev_length-=2;++e.strstart<=i&&(e.ins_h=(e.ins_h<e.pending_buf_size-5&&(r=e.pending_buf_size-5);;){if(e.lookahead<=1){if(j(e),0===e.lookahead&&t===l)return A;if(0===e.lookahead)break}e.strstart+=e.lookahead,e.lookahead=0;var n=e.block_start+r;if((0===e.strstart||e.strstart>=n)&&(e.lookahead=e.strstart-n,e.strstart=n,N(e,!1),0===e.strm.avail_out))return A;if(e.strstart-e.block_start>=e.w_size-z&&(N(e,!1),0===e.strm.avail_out))return A}return e.insert=0,t===f?(N(e,!0),0===e.strm.avail_out?O:B):(e.strstart>e.block_start&&(N(e,!1),e.strm.avail_out),A)}),new M(4,4,8,4,Z),new M(4,5,16,8,Z),new M(4,6,32,32,Z),new M(4,4,16,16,W),new M(8,16,32,32,W),new M(8,16,128,128,W),new M(8,32,128,256,W),new M(32,128,258,1024,W),new M(32,258,258,4096,W)],r.deflateInit=function(e,t){return Y(e,t,v,15,8,0)},r.deflateInit2=Y,r.deflateReset=K,r.deflateResetKeep=G,r.deflateSetHeader=function(e,t){return e&&e.state?2!==e.state.wrap?_:(e.state.gzhead=t,m):_},r.deflate=function(e,t){var r,n,i,s;if(!e||!e.state||5>8&255),U(n,n.gzhead.time>>16&255),U(n,n.gzhead.time>>24&255),U(n,9===n.level?2:2<=n.strategy||n.level<2?4:0),U(n,255&n.gzhead.os),n.gzhead.extra&&n.gzhead.extra.length&&(U(n,255&n.gzhead.extra.length),U(n,n.gzhead.extra.length>>8&255)),n.gzhead.hcrc&&(e.adler=p(e.adler,n.pending_buf,n.pending,0)),n.gzindex=0,n.status=69):(U(n,0),U(n,0),U(n,0),U(n,0),U(n,0),U(n,9===n.level?2:2<=n.strategy||n.level<2?4:0),U(n,3),n.status=E);else{var a=v+(n.w_bits-8<<4)<<8;a|=(2<=n.strategy||n.level<2?0:n.level<6?1:6===n.level?2:3)<<6,0!==n.strstart&&(a|=32),a+=31-a%31,n.status=E,P(n,a),0!==n.strstart&&(P(n,e.adler>>>16),P(n,65535&e.adler)),e.adler=1}if(69===n.status)if(n.gzhead.extra){for(i=n.pending;n.gzindex<(65535&n.gzhead.extra.length)&&(n.pending!==n.pending_buf_size||(n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),F(e),i=n.pending,n.pending!==n.pending_buf_size));)U(n,255&n.gzhead.extra[n.gzindex]),n.gzindex++;n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),n.gzindex===n.gzhead.extra.length&&(n.gzindex=0,n.status=73)}else n.status=73;if(73===n.status)if(n.gzhead.name){i=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),F(e),i=n.pending,n.pending===n.pending_buf_size)){s=1;break}s=n.gzindexi&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),0===s&&(n.gzindex=0,n.status=91)}else n.status=91;if(91===n.status)if(n.gzhead.comment){i=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),F(e),i=n.pending,n.pending===n.pending_buf_size)){s=1;break}s=n.gzindexi&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),0===s&&(n.status=103)}else n.status=103;if(103===n.status&&(n.gzhead.hcrc?(n.pending+2>n.pending_buf_size&&F(e),n.pending+2<=n.pending_buf_size&&(U(n,255&e.adler),U(n,e.adler>>8&255),e.adler=0,n.status=E)):n.status=E),0!==n.pending){if(F(e),0===e.avail_out)return n.last_flush=-1,m}else if(0===e.avail_in&&T(t)<=T(r)&&t!==f)return R(e,-5);if(666===n.status&&0!==e.avail_in)return R(e,-5);if(0!==e.avail_in||0!==n.lookahead||t!==l&&666!==n.status){var o=2===n.strategy?function(e,t){for(var r;;){if(0===e.lookahead&&(j(e),0===e.lookahead)){if(t===l)return A;break}if(e.match_length=0,r=u._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++,r&&(N(e,!1),0===e.strm.avail_out))return A}return e.insert=0,t===f?(N(e,!0),0===e.strm.avail_out?O:B):e.last_lit&&(N(e,!1),0===e.strm.avail_out)?A:I}(n,t):3===n.strategy?function(e,t){for(var r,n,i,s,a=e.window;;){if(e.lookahead<=S){if(j(e),e.lookahead<=S&&t===l)return A;if(0===e.lookahead)break}if(e.match_length=0,e.lookahead>=x&&0e.lookahead&&(e.match_length=e.lookahead)}if(e.match_length>=x?(r=u._tr_tally(e,1,e.match_length-x),e.lookahead-=e.match_length,e.strstart+=e.match_length,e.match_length=0):(r=u._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++),r&&(N(e,!1),0===e.strm.avail_out))return A}return e.insert=0,t===f?(N(e,!0),0===e.strm.avail_out?O:B):e.last_lit&&(N(e,!1),0===e.strm.avail_out)?A:I}(n,t):h[n.level].func(n,t);if(o!==O&&o!==B||(n.status=666),o===A||o===O)return 0===e.avail_out&&(n.last_flush=-1),m;if(o===I&&(1===t?u._tr_align(n):5!==t&&(u._tr_stored_block(n,0,0,!1),3===t&&(D(n.head),0===n.lookahead&&(n.strstart=0,n.block_start=0,n.insert=0))),F(e),0===e.avail_out))return n.last_flush=-1,m}return t!==f?m:n.wrap<=0?1:(2===n.wrap?(U(n,255&e.adler),U(n,e.adler>>8&255),U(n,e.adler>>16&255),U(n,e.adler>>24&255),U(n,255&e.total_in),U(n,e.total_in>>8&255),U(n,e.total_in>>16&255),U(n,e.total_in>>24&255)):(P(n,e.adler>>>16),P(n,65535&e.adler)),F(e),0=r.w_size&&(0===s&&(D(r.head),r.strstart=0,r.block_start=0,r.insert=0),u=new c.Buf8(r.w_size),c.arraySet(u,t,l-r.w_size,r.w_size,0),t=u,l=r.w_size),a=e.avail_in,o=e.next_in,h=e.input,e.avail_in=l,e.next_in=0,e.input=t,j(r);r.lookahead>=x;){for(n=r.strstart,i=r.lookahead-(x-1);r.ins_h=(r.ins_h<>>=y=v>>>24,p-=y,0===(y=v>>>16&255))C[s++]=65535&v;else{if(!(16&y)){if(0==(64&y)){v=m[(65535&v)+(d&(1<>>=y,p-=y),p<15&&(d+=z[n++]<>>=y=v>>>24,p-=y,!(16&(y=v>>>16&255))){if(0==(64&y)){v=_[(65535&v)+(d&(1<>>=y,p-=y,(y=s-a)>3,d&=(1<<(p-=w<<3))-1,e.next_in=n,e.next_out=s,e.avail_in=n>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function s(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new I.Buf16(320),this.work=new I.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function a(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,e.msg=\"\",t.wrap&&(e.adler=1&t.wrap),t.mode=P,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new I.Buf32(n),t.distcode=t.distdyn=new I.Buf32(i),t.sane=1,t.back=-1,N):U}function o(e){var t;return e&&e.state?((t=e.state).wsize=0,t.whave=0,t.wnext=0,a(e)):U}function h(e,t){var r,n;return e&&e.state?(n=e.state,t<0?(r=0,t=-t):(r=1+(t>>4),t<48&&(t&=15)),t&&(t<8||15=s.wsize?(I.arraySet(s.window,t,r-s.wsize,s.wsize,0),s.wnext=0,s.whave=s.wsize):(n<(i=s.wsize-s.wnext)&&(i=n),I.arraySet(s.window,t,r-n,i,s.wnext),(n-=i)?(I.arraySet(s.window,t,r-n,n,0),s.wnext=n,s.whave=s.wsize):(s.wnext+=i,s.wnext===s.wsize&&(s.wnext=0),s.whave>>8&255,r.check=B(r.check,E,2,0),l=u=0,r.mode=2;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&u)<<8)+(u>>8))%31){e.msg=\"incorrect header check\",r.mode=30;break}if(8!=(15&u)){e.msg=\"unknown compression method\",r.mode=30;break}if(l-=4,k=8+(15&(u>>>=4)),0===r.wbits)r.wbits=k;else if(k>r.wbits){e.msg=\"invalid window size\",r.mode=30;break}r.dmax=1<>8&1),512&r.flags&&(E[0]=255&u,E[1]=u>>>8&255,r.check=B(r.check,E,2,0)),l=u=0,r.mode=3;case 3:for(;l<32;){if(0===o)break e;o--,u+=n[s++]<>>8&255,E[2]=u>>>16&255,E[3]=u>>>24&255,r.check=B(r.check,E,4,0)),l=u=0,r.mode=4;case 4:for(;l<16;){if(0===o)break e;o--,u+=n[s++]<>8),512&r.flags&&(E[0]=255&u,E[1]=u>>>8&255,r.check=B(r.check,E,2,0)),l=u=0,r.mode=5;case 5:if(1024&r.flags){for(;l<16;){if(0===o)break e;o--,u+=n[s++]<>>8&255,r.check=B(r.check,E,2,0)),l=u=0}else r.head&&(r.head.extra=null);r.mode=6;case 6:if(1024&r.flags&&(o<(d=r.length)&&(d=o),d&&(r.head&&(k=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Array(r.head.extra_len)),I.arraySet(r.head.extra,n,s,d,k)),512&r.flags&&(r.check=B(r.check,n,d,s)),o-=d,s+=d,r.length-=d),r.length))break e;r.length=0,r.mode=7;case 7:if(2048&r.flags){if(0===o)break e;for(d=0;k=n[s+d++],r.head&&k&&r.length<65536&&(r.head.name+=String.fromCharCode(k)),k&&d>9&1,r.head.done=!0),e.adler=r.check=0,r.mode=12;break;case 10:for(;l<32;){if(0===o)break e;o--,u+=n[s++]<>>=7&l,l-=7&l,r.mode=27;break}for(;l<3;){if(0===o)break e;o--,u+=n[s++]<>>=1)){case 0:r.mode=14;break;case 1:if(j(r),r.mode=20,6!==t)break;u>>>=2,l-=2;break e;case 2:r.mode=17;break;case 3:e.msg=\"invalid block type\",r.mode=30}u>>>=2,l-=2;break;case 14:for(u>>>=7&l,l-=7&l;l<32;){if(0===o)break e;o--,u+=n[s++]<>>16^65535)){e.msg=\"invalid stored block lengths\",r.mode=30;break}if(r.length=65535&u,l=u=0,r.mode=15,6===t)break e;case 15:r.mode=16;case 16:if(d=r.length){if(o>>=5,l-=5,r.ndist=1+(31&u),u>>>=5,l-=5,r.ncode=4+(15&u),u>>>=4,l-=4,286>>=3,l-=3}for(;r.have<19;)r.lens[A[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,S={bits:r.lenbits},x=T(0,r.lens,0,19,r.lencode,0,r.work,S),r.lenbits=S.bits,x){e.msg=\"invalid code lengths set\",r.mode=30;break}r.have=0,r.mode=19;case 19:for(;r.have>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<>>=_,l-=_,r.lens[r.have++]=b;else{if(16===b){for(z=_+2;l>>=_,l-=_,0===r.have){e.msg=\"invalid bit length repeat\",r.mode=30;break}k=r.lens[r.have-1],d=3+(3&u),u>>>=2,l-=2}else if(17===b){for(z=_+3;l>>=_)),u>>>=3,l-=3}else{for(z=_+7;l>>=_)),u>>>=7,l-=7}if(r.have+d>r.nlen+r.ndist){e.msg=\"invalid bit length repeat\",r.mode=30;break}for(;d--;)r.lens[r.have++]=k}}if(30===r.mode)break;if(0===r.lens[256]){e.msg=\"invalid code -- missing end-of-block\",r.mode=30;break}if(r.lenbits=9,S={bits:r.lenbits},x=T(D,r.lens,0,r.nlen,r.lencode,0,r.work,S),r.lenbits=S.bits,x){e.msg=\"invalid literal/lengths set\",r.mode=30;break}if(r.distbits=6,r.distcode=r.distdyn,S={bits:r.distbits},x=T(F,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,S),r.distbits=S.bits,x){e.msg=\"invalid distances set\",r.mode=30;break}if(r.mode=20,6===t)break e;case 20:r.mode=21;case 21:if(6<=o&&258<=h){e.next_out=a,e.avail_out=h,e.next_in=s,e.avail_in=o,r.hold=u,r.bits=l,R(e,c),a=e.next_out,i=e.output,h=e.avail_out,s=e.next_in,n=e.input,o=e.avail_in,u=r.hold,l=r.bits,12===r.mode&&(r.back=-1);break}for(r.back=0;g=(C=r.lencode[u&(1<>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<>v)])>>>16&255,b=65535&C,!(v+(_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<>>=v,l-=v,r.back+=v}if(u>>>=_,l-=_,r.back+=_,r.length=b,0===g){r.mode=26;break}if(32&g){r.back=-1,r.mode=12;break}if(64&g){e.msg=\"invalid literal/length code\",r.mode=30;break}r.extra=15&g,r.mode=22;case 22:if(r.extra){for(z=r.extra;l>>=r.extra,l-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=23;case 23:for(;g=(C=r.distcode[u&(1<>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<>v)])>>>16&255,b=65535&C,!(v+(_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<>>=v,l-=v,r.back+=v}if(u>>>=_,l-=_,r.back+=_,64&g){e.msg=\"invalid distance code\",r.mode=30;break}r.offset=b,r.extra=15&g,r.mode=24;case 24:if(r.extra){for(z=r.extra;l>>=r.extra,l-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){e.msg=\"invalid distance too far back\",r.mode=30;break}r.mode=25;case 25:if(0===h)break e;if(d=c-h,r.offset>d){if((d=r.offset-d)>r.whave&&r.sane){e.msg=\"invalid distance too far back\",r.mode=30;break}p=d>r.wnext?(d-=r.wnext,r.wsize-d):r.wnext-d,d>r.length&&(d=r.length),m=r.window}else m=i,p=a-r.offset,d=r.length;for(hd?(m=R[T+a[v]],A[I+a[v]]):(m=96,0),h=1<>S)+(u-=h)]=p<<24|m<<16|_|0,0!==u;);for(h=1<>=1;if(0!==h?(E&=h-1,E+=h):E=0,v++,0==--O[b]){if(b===w)break;b=t[r+a[v]]}if(k>>7)]}function U(e,t){e.pending_buf[e.pending++]=255&t,e.pending_buf[e.pending++]=t>>>8&255}function P(e,t,r){e.bi_valid>d-r?(e.bi_buf|=t<>d-e.bi_valid,e.bi_valid+=r-d):(e.bi_buf|=t<>>=1,r<<=1,0<--t;);return r>>>1}function Z(e,t,r){var n,i,s=new Array(g+1),a=0;for(n=1;n<=g;n++)s[n]=a=a+r[n-1]<<1;for(i=0;i<=t;i++){var o=e[2*i+1];0!==o&&(e[2*i]=j(s[o]++,o))}}function W(e){var t;for(t=0;t>1;1<=r;r--)G(e,s,r);for(i=h;r=e.heap[1],e.heap[1]=e.heap[e.heap_len--],G(e,s,1),n=e.heap[1],e.heap[--e.heap_max]=r,e.heap[--e.heap_max]=n,s[2*i]=s[2*r]+s[2*n],e.depth[i]=(e.depth[r]>=e.depth[n]?e.depth[r]:e.depth[n])+1,s[2*r+1]=s[2*n+1]=i,e.heap[1]=i++,G(e,s,1),2<=e.heap_len;);e.heap[--e.heap_max]=e.heap[1],function(e,t){var r,n,i,s,a,o,h=t.dyn_tree,u=t.max_code,l=t.stat_desc.static_tree,f=t.stat_desc.has_stree,c=t.stat_desc.extra_bits,d=t.stat_desc.extra_base,p=t.stat_desc.max_length,m=0;for(s=0;s<=g;s++)e.bl_count[s]=0;for(h[2*e.heap[e.heap_max]+1]=0,r=e.heap_max+1;r<_;r++)p<(s=h[2*h[2*(n=e.heap[r])+1]+1]+1)&&(s=p,m++),h[2*n+1]=s,u>=7;n>>=1)if(1&r&&0!==e.dyn_ltree[2*t])return o;if(0!==e.dyn_ltree[18]||0!==e.dyn_ltree[20]||0!==e.dyn_ltree[26])return h;for(t=32;t>>3,(s=e.static_len+3+7>>>3)<=i&&(i=s)):i=s=r+5,r+4<=i&&-1!==t?J(e,t,r,n):4===e.strategy||s===i?(P(e,2+(n?1:0),3),K(e,z,C)):(P(e,4+(n?1:0),3),function(e,t,r,n){var i;for(P(e,t-257,5),P(e,r-1,5),P(e,n-4,4),i=0;i>>8&255,e.pending_buf[e.d_buf+2*e.last_lit+1]=255&t,e.pending_buf[e.l_buf+e.last_lit]=255&r,e.last_lit++,0===t?e.dyn_ltree[2*r]++:(e.matches++,t--,e.dyn_ltree[2*(A[r]+u+1)]++,e.dyn_dtree[2*N(t)]++),e.last_lit===e.lit_bufsize-1},r._tr_align=function(e){P(e,2,3),L(e,m,z),function(e){16===e.bi_valid?(U(e,e.bi_buf),e.bi_buf=0,e.bi_valid=0):8<=e.bi_valid&&(e.pending_buf[e.pending++]=255&e.bi_buf,e.bi_buf>>=8,e.bi_valid-=8)}(e)}},{\"../utils/common\":41}],53:[function(e,t,r){\"use strict\";t.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg=\"\",this.state=null,this.data_type=2,this.adler=0}},{}],54:[function(e,t,r){(function(e){!function(r,n){\"use strict\";if(!r.setImmediate){var i,s,t,a,o=1,h={},u=!1,l=r.document,e=Object.getPrototypeOf&&Object.getPrototypeOf(r);e=e&&e.setTimeout?e:r,i=\"[object process]\"==={}.toString.call(r.process)?function(e){process.nextTick(function(){c(e)})}:function(){if(r.postMessage&&!r.importScripts){var e=!0,t=r.onmessage;return r.onmessage=function(){e=!1},r.postMessage(\"\",\"*\"),r.onmessage=t,e}}()?(a=\"setImmediate$\"+Math.random()+\"$\",r.addEventListener?r.addEventListener(\"message\",d,!1):r.attachEvent(\"onmessage\",d),function(e){r.postMessage(a+e,\"*\")}):r.MessageChannel?((t=new MessageChannel).port1.onmessage=function(e){c(e.data)},function(e){t.port2.postMessage(e)}):l&&\"onreadystatechange\"in l.createElement(\"script\")?(s=l.documentElement,function(e){var t=l.createElement(\"script\");t.onreadystatechange=function(){c(e),t.onreadystatechange=null,s.removeChild(t),t=null},s.appendChild(t)}):function(e){setTimeout(c,0,e)},e.setImmediate=function(e){\"function\"!=typeof e&&(e=new Function(\"\"+e));for(var t=new Array(arguments.length-1),r=0;r arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n return arr2;\n}\nmodule.exports = _arrayLikeToArray, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "var arrayLikeToArray = require(\"./arrayLikeToArray.js\");\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}\nmodule.exports = _unsupportedIterableToArray, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nmodule.exports = _nonIterableRest, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "var arrayWithHoles = require(\"./arrayWithHoles.js\");\nvar iterableToArrayLimit = require(\"./iterableToArrayLimit.js\");\nvar unsupportedIterableToArray = require(\"./unsupportedIterableToArray.js\");\nvar nonIterableRest = require(\"./nonIterableRest.js\");\nfunction _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n}\nmodule.exports = _slicedToArray, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\nmodule.exports = _classCallCheck, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return (module.exports = _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports), _typeof(o);\n}\nmodule.exports = _typeof, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "var _typeof = require(\"./typeof.js\")[\"default\"];\nfunction toPrimitive(t, r) {\n if (\"object\" != _typeof(t) || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != _typeof(i)) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nmodule.exports = toPrimitive, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "var _typeof = require(\"./typeof.js\")[\"default\"];\nvar toPrimitive = require(\"./toPrimitive.js\");\nfunction toPropertyKey(t) {\n var i = toPrimitive(t, \"string\");\n return \"symbol\" == _typeof(i) ? i : String(i);\n}\nmodule.exports = toPropertyKey, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "var toPropertyKey = require(\"./toPropertyKey.js\");\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, toPropertyKey(descriptor.key), descriptor);\n }\n}\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n Object.defineProperty(Constructor, \"prototype\", {\n writable: false\n });\n return Constructor;\n}\nmodule.exports = _createClass, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@babel/runtime/helpers/slicedToArray'), require('@babel/runtime/helpers/classCallCheck'), require('@babel/runtime/helpers/createClass')) :\n typeof define === 'function' && define.amd ? define(['exports', '@babel/runtime/helpers/slicedToArray', '@babel/runtime/helpers/classCallCheck', '@babel/runtime/helpers/createClass'], factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.automationEvents = {}, global._slicedToArray, global._classCallCheck, global._createClass));\n})(this, (function (exports, _slicedToArray, _classCallCheck, _createClass) { 'use strict';\n\n var createExtendedExponentialRampToValueAutomationEvent = function createExtendedExponentialRampToValueAutomationEvent(value, endTime, insertTime) {\n return {\n endTime: endTime,\n insertTime: insertTime,\n type: 'exponentialRampToValue',\n value: value\n };\n };\n\n var createExtendedLinearRampToValueAutomationEvent = function createExtendedLinearRampToValueAutomationEvent(value, endTime, insertTime) {\n return {\n endTime: endTime,\n insertTime: insertTime,\n type: 'linearRampToValue',\n value: value\n };\n };\n\n var createSetValueAutomationEvent = function createSetValueAutomationEvent(value, startTime) {\n return {\n startTime: startTime,\n type: 'setValue',\n value: value\n };\n };\n\n var createSetValueCurveAutomationEvent = function createSetValueCurveAutomationEvent(values, startTime, duration) {\n return {\n duration: duration,\n startTime: startTime,\n type: 'setValueCurve',\n values: values\n };\n };\n\n var getTargetValueAtTime = function getTargetValueAtTime(time, valueAtStartTime, _ref) {\n var startTime = _ref.startTime,\n target = _ref.target,\n timeConstant = _ref.timeConstant;\n return target + (valueAtStartTime - target) * Math.exp((startTime - time) / timeConstant);\n };\n\n var isExponentialRampToValueAutomationEvent = function isExponentialRampToValueAutomationEvent(automationEvent) {\n return automationEvent.type === 'exponentialRampToValue';\n };\n\n var isLinearRampToValueAutomationEvent = function isLinearRampToValueAutomationEvent(automationEvent) {\n return automationEvent.type === 'linearRampToValue';\n };\n\n var isAnyRampToValueAutomationEvent = function isAnyRampToValueAutomationEvent(automationEvent) {\n return isExponentialRampToValueAutomationEvent(automationEvent) || isLinearRampToValueAutomationEvent(automationEvent);\n };\n\n var isSetValueAutomationEvent = function isSetValueAutomationEvent(automationEvent) {\n return automationEvent.type === 'setValue';\n };\n\n var isSetValueCurveAutomationEvent = function isSetValueCurveAutomationEvent(automationEvent) {\n return automationEvent.type === 'setValueCurve';\n };\n\n var getValueOfAutomationEventAtIndexAtTime = function getValueOfAutomationEventAtIndexAtTime(automationEvents, index, time, defaultValue) {\n var automationEvent = automationEvents[index];\n return automationEvent === undefined ? defaultValue : isAnyRampToValueAutomationEvent(automationEvent) || isSetValueAutomationEvent(automationEvent) ? automationEvent.value : isSetValueCurveAutomationEvent(automationEvent) ? automationEvent.values[automationEvent.values.length - 1] : getTargetValueAtTime(time, getValueOfAutomationEventAtIndexAtTime(automationEvents, index - 1, automationEvent.startTime, defaultValue), automationEvent);\n };\n\n var getEndTimeAndValueOfPreviousAutomationEvent = function getEndTimeAndValueOfPreviousAutomationEvent(automationEvents, index, currentAutomationEvent, nextAutomationEvent, defaultValue) {\n return currentAutomationEvent === undefined ? [nextAutomationEvent.insertTime, defaultValue] : isAnyRampToValueAutomationEvent(currentAutomationEvent) ? [currentAutomationEvent.endTime, currentAutomationEvent.value] : isSetValueAutomationEvent(currentAutomationEvent) ? [currentAutomationEvent.startTime, currentAutomationEvent.value] : isSetValueCurveAutomationEvent(currentAutomationEvent) ? [currentAutomationEvent.startTime + currentAutomationEvent.duration, currentAutomationEvent.values[currentAutomationEvent.values.length - 1]] : [currentAutomationEvent.startTime, getValueOfAutomationEventAtIndexAtTime(automationEvents, index - 1, currentAutomationEvent.startTime, defaultValue)];\n };\n\n var isCancelAndHoldAutomationEvent = function isCancelAndHoldAutomationEvent(automationEvent) {\n return automationEvent.type === 'cancelAndHold';\n };\n\n var isCancelScheduledValuesAutomationEvent = function isCancelScheduledValuesAutomationEvent(automationEvent) {\n return automationEvent.type === 'cancelScheduledValues';\n };\n\n var getEventTime = function getEventTime(automationEvent) {\n if (isCancelAndHoldAutomationEvent(automationEvent) || isCancelScheduledValuesAutomationEvent(automationEvent)) {\n return automationEvent.cancelTime;\n }\n if (isExponentialRampToValueAutomationEvent(automationEvent) || isLinearRampToValueAutomationEvent(automationEvent)) {\n return automationEvent.endTime;\n }\n return automationEvent.startTime;\n };\n\n var getExponentialRampValueAtTime = function getExponentialRampValueAtTime(time, startTime, valueAtStartTime, _ref) {\n var endTime = _ref.endTime,\n value = _ref.value;\n if (valueAtStartTime === value) {\n return value;\n }\n if (0 < valueAtStartTime && 0 < value || valueAtStartTime < 0 && value < 0) {\n return valueAtStartTime * Math.pow(value / valueAtStartTime, (time - startTime) / (endTime - startTime));\n }\n return 0;\n };\n\n var getLinearRampValueAtTime = function getLinearRampValueAtTime(time, startTime, valueAtStartTime, _ref) {\n var endTime = _ref.endTime,\n value = _ref.value;\n return valueAtStartTime + (time - startTime) / (endTime - startTime) * (value - valueAtStartTime);\n };\n\n var interpolateValue = function interpolateValue(values, theoreticIndex) {\n var lowerIndex = Math.floor(theoreticIndex);\n var upperIndex = Math.ceil(theoreticIndex);\n if (lowerIndex === upperIndex) {\n return values[lowerIndex];\n }\n return (1 - (theoreticIndex - lowerIndex)) * values[lowerIndex] + (1 - (upperIndex - theoreticIndex)) * values[upperIndex];\n };\n\n var getValueCurveValueAtTime = function getValueCurveValueAtTime(time, _ref) {\n var duration = _ref.duration,\n startTime = _ref.startTime,\n values = _ref.values;\n var theoreticIndex = (time - startTime) / duration * (values.length - 1);\n return interpolateValue(values, theoreticIndex);\n };\n\n var isSetTargetAutomationEvent = function isSetTargetAutomationEvent(automationEvent) {\n return automationEvent.type === 'setTarget';\n };\n\n var AutomationEventList = /*#__PURE__*/function (_Symbol$iterator) {\n function AutomationEventList(defaultValue) {\n _classCallCheck(this, AutomationEventList);\n this._automationEvents = [];\n this._currenTime = 0;\n this._defaultValue = defaultValue;\n }\n _createClass(AutomationEventList, [{\n key: _Symbol$iterator,\n value: function value() {\n return this._automationEvents[Symbol.iterator]();\n }\n }, {\n key: \"add\",\n value: function add(automationEvent) {\n var eventTime = getEventTime(automationEvent);\n if (isCancelAndHoldAutomationEvent(automationEvent) || isCancelScheduledValuesAutomationEvent(automationEvent)) {\n var index = this._automationEvents.findIndex(function (currentAutomationEvent) {\n if (isCancelScheduledValuesAutomationEvent(automationEvent) && isSetValueCurveAutomationEvent(currentAutomationEvent)) {\n return currentAutomationEvent.startTime + currentAutomationEvent.duration >= eventTime;\n }\n return getEventTime(currentAutomationEvent) >= eventTime;\n });\n var removedAutomationEvent = this._automationEvents[index];\n if (index !== -1) {\n this._automationEvents = this._automationEvents.slice(0, index);\n }\n if (isCancelAndHoldAutomationEvent(automationEvent)) {\n var lastAutomationEvent = this._automationEvents[this._automationEvents.length - 1];\n if (removedAutomationEvent !== undefined && isAnyRampToValueAutomationEvent(removedAutomationEvent)) {\n if (lastAutomationEvent !== undefined && isSetTargetAutomationEvent(lastAutomationEvent)) {\n throw new Error('The internal list is malformed.');\n }\n var startTime = lastAutomationEvent === undefined ? removedAutomationEvent.insertTime : isSetValueCurveAutomationEvent(lastAutomationEvent) ? lastAutomationEvent.startTime + lastAutomationEvent.duration : getEventTime(lastAutomationEvent);\n var startValue = lastAutomationEvent === undefined ? this._defaultValue : isSetValueCurveAutomationEvent(lastAutomationEvent) ? lastAutomationEvent.values[lastAutomationEvent.values.length - 1] : lastAutomationEvent.value;\n var value = isExponentialRampToValueAutomationEvent(removedAutomationEvent) ? getExponentialRampValueAtTime(eventTime, startTime, startValue, removedAutomationEvent) : getLinearRampValueAtTime(eventTime, startTime, startValue, removedAutomationEvent);\n var truncatedAutomationEvent = isExponentialRampToValueAutomationEvent(removedAutomationEvent) ? createExtendedExponentialRampToValueAutomationEvent(value, eventTime, this._currenTime) : createExtendedLinearRampToValueAutomationEvent(value, eventTime, this._currenTime);\n this._automationEvents.push(truncatedAutomationEvent);\n }\n if (lastAutomationEvent !== undefined && isSetTargetAutomationEvent(lastAutomationEvent)) {\n this._automationEvents.push(createSetValueAutomationEvent(this.getValue(eventTime), eventTime));\n }\n if (lastAutomationEvent !== undefined && isSetValueCurveAutomationEvent(lastAutomationEvent) && lastAutomationEvent.startTime + lastAutomationEvent.duration > eventTime) {\n var duration = eventTime - lastAutomationEvent.startTime;\n var ratio = (lastAutomationEvent.values.length - 1) / lastAutomationEvent.duration;\n var length = Math.max(2, 1 + Math.ceil(duration * ratio));\n var fraction = duration / (length - 1) * ratio;\n var values = lastAutomationEvent.values.slice(0, length);\n if (fraction < 1) {\n for (var i = 1; i < length; i += 1) {\n var factor = fraction * i % 1;\n values[i] = lastAutomationEvent.values[i - 1] * (1 - factor) + lastAutomationEvent.values[i] * factor;\n }\n }\n this._automationEvents[this._automationEvents.length - 1] = createSetValueCurveAutomationEvent(values, lastAutomationEvent.startTime, duration);\n }\n }\n } else {\n var _index = this._automationEvents.findIndex(function (currentAutomationEvent) {\n return getEventTime(currentAutomationEvent) > eventTime;\n });\n var previousAutomationEvent = _index === -1 ? this._automationEvents[this._automationEvents.length - 1] : this._automationEvents[_index - 1];\n if (previousAutomationEvent !== undefined && isSetValueCurveAutomationEvent(previousAutomationEvent) && getEventTime(previousAutomationEvent) + previousAutomationEvent.duration > eventTime) {\n return false;\n }\n var persistentAutomationEvent = isExponentialRampToValueAutomationEvent(automationEvent) ? createExtendedExponentialRampToValueAutomationEvent(automationEvent.value, automationEvent.endTime, this._currenTime) : isLinearRampToValueAutomationEvent(automationEvent) ? createExtendedLinearRampToValueAutomationEvent(automationEvent.value, eventTime, this._currenTime) : automationEvent;\n if (_index === -1) {\n this._automationEvents.push(persistentAutomationEvent);\n } else {\n if (isSetValueCurveAutomationEvent(automationEvent) && eventTime + automationEvent.duration > getEventTime(this._automationEvents[_index])) {\n return false;\n }\n this._automationEvents.splice(_index, 0, persistentAutomationEvent);\n }\n }\n return true;\n }\n }, {\n key: \"flush\",\n value: function flush(time) {\n var index = this._automationEvents.findIndex(function (currentAutomationEvent) {\n return getEventTime(currentAutomationEvent) > time;\n });\n if (index > 1) {\n var remainingAutomationEvents = this._automationEvents.slice(index - 1);\n var firstRemainingAutomationEvent = remainingAutomationEvents[0];\n if (isSetTargetAutomationEvent(firstRemainingAutomationEvent)) {\n remainingAutomationEvents.unshift(createSetValueAutomationEvent(getValueOfAutomationEventAtIndexAtTime(this._automationEvents, index - 2, firstRemainingAutomationEvent.startTime, this._defaultValue), firstRemainingAutomationEvent.startTime));\n }\n this._automationEvents = remainingAutomationEvents;\n }\n }\n }, {\n key: \"getValue\",\n value: function getValue(time) {\n if (this._automationEvents.length === 0) {\n return this._defaultValue;\n }\n var indexOfNextEvent = this._automationEvents.findIndex(function (automationEvent) {\n return getEventTime(automationEvent) > time;\n });\n var nextAutomationEvent = this._automationEvents[indexOfNextEvent];\n var indexOfCurrentEvent = (indexOfNextEvent === -1 ? this._automationEvents.length : indexOfNextEvent) - 1;\n var currentAutomationEvent = this._automationEvents[indexOfCurrentEvent];\n if (currentAutomationEvent !== undefined && isSetTargetAutomationEvent(currentAutomationEvent) && (nextAutomationEvent === undefined || !isAnyRampToValueAutomationEvent(nextAutomationEvent) || nextAutomationEvent.insertTime > time)) {\n return getTargetValueAtTime(time, getValueOfAutomationEventAtIndexAtTime(this._automationEvents, indexOfCurrentEvent - 1, currentAutomationEvent.startTime, this._defaultValue), currentAutomationEvent);\n }\n if (currentAutomationEvent !== undefined && isSetValueAutomationEvent(currentAutomationEvent) && (nextAutomationEvent === undefined || !isAnyRampToValueAutomationEvent(nextAutomationEvent))) {\n return currentAutomationEvent.value;\n }\n if (currentAutomationEvent !== undefined && isSetValueCurveAutomationEvent(currentAutomationEvent) && (nextAutomationEvent === undefined || !isAnyRampToValueAutomationEvent(nextAutomationEvent) || currentAutomationEvent.startTime + currentAutomationEvent.duration > time)) {\n if (time < currentAutomationEvent.startTime + currentAutomationEvent.duration) {\n return getValueCurveValueAtTime(time, currentAutomationEvent);\n }\n return currentAutomationEvent.values[currentAutomationEvent.values.length - 1];\n }\n if (currentAutomationEvent !== undefined && isAnyRampToValueAutomationEvent(currentAutomationEvent) && (nextAutomationEvent === undefined || !isAnyRampToValueAutomationEvent(nextAutomationEvent))) {\n return currentAutomationEvent.value;\n }\n if (nextAutomationEvent !== undefined && isExponentialRampToValueAutomationEvent(nextAutomationEvent)) {\n var _getEndTimeAndValueOf = getEndTimeAndValueOfPreviousAutomationEvent(this._automationEvents, indexOfCurrentEvent, currentAutomationEvent, nextAutomationEvent, this._defaultValue),\n _getEndTimeAndValueOf2 = _slicedToArray(_getEndTimeAndValueOf, 2),\n startTime = _getEndTimeAndValueOf2[0],\n value = _getEndTimeAndValueOf2[1];\n return getExponentialRampValueAtTime(time, startTime, value, nextAutomationEvent);\n }\n if (nextAutomationEvent !== undefined && isLinearRampToValueAutomationEvent(nextAutomationEvent)) {\n var _getEndTimeAndValueOf3 = getEndTimeAndValueOfPreviousAutomationEvent(this._automationEvents, indexOfCurrentEvent, currentAutomationEvent, nextAutomationEvent, this._defaultValue),\n _getEndTimeAndValueOf4 = _slicedToArray(_getEndTimeAndValueOf3, 2),\n _startTime = _getEndTimeAndValueOf4[0],\n _value = _getEndTimeAndValueOf4[1];\n return getLinearRampValueAtTime(time, _startTime, _value, nextAutomationEvent);\n }\n return this._defaultValue;\n }\n }]);\n return AutomationEventList;\n }(Symbol.iterator);\n\n var createCancelAndHoldAutomationEvent = function createCancelAndHoldAutomationEvent(cancelTime) {\n return {\n cancelTime: cancelTime,\n type: 'cancelAndHold'\n };\n };\n\n var createCancelScheduledValuesAutomationEvent = function createCancelScheduledValuesAutomationEvent(cancelTime) {\n return {\n cancelTime: cancelTime,\n type: 'cancelScheduledValues'\n };\n };\n\n var createExponentialRampToValueAutomationEvent = function createExponentialRampToValueAutomationEvent(value, endTime) {\n return {\n endTime: endTime,\n type: 'exponentialRampToValue',\n value: value\n };\n };\n\n var createLinearRampToValueAutomationEvent = function createLinearRampToValueAutomationEvent(value, endTime) {\n return {\n endTime: endTime,\n type: 'linearRampToValue',\n value: value\n };\n };\n\n var createSetTargetAutomationEvent = function createSetTargetAutomationEvent(target, startTime, timeConstant) {\n return {\n startTime: startTime,\n target: target,\n timeConstant: timeConstant,\n type: 'setTarget'\n };\n };\n\n exports.AutomationEventList = AutomationEventList;\n exports.createCancelAndHoldAutomationEvent = createCancelAndHoldAutomationEvent;\n exports.createCancelScheduledValuesAutomationEvent = createCancelScheduledValuesAutomationEvent;\n exports.createExponentialRampToValueAutomationEvent = createExponentialRampToValueAutomationEvent;\n exports.createLinearRampToValueAutomationEvent = createLinearRampToValueAutomationEvent;\n exports.createSetTargetAutomationEvent = createSetTargetAutomationEvent;\n exports.createSetValueAutomationEvent = createSetValueAutomationEvent;\n exports.createSetValueCurveAutomationEvent = createSetValueCurveAutomationEvent;\n\n}));\n", "const {\n hasOwnProperty,\n setPrototypeOf,\n isFrozen,\n getPrototypeOf,\n getOwnPropertyDescriptor,\n} = Object;\n\nlet { freeze, seal, create } = Object; // eslint-disable-line import/no-mutable-exports\nlet { apply, construct } = typeof Reflect !== 'undefined' && Reflect;\n\nif (!apply) {\n apply = function (fun, thisValue, args) {\n return fun.apply(thisValue, args);\n };\n}\n\nif (!freeze) {\n freeze = function (x) {\n return x;\n };\n}\n\nif (!seal) {\n seal = function (x) {\n return x;\n };\n}\n\nif (!construct) {\n construct = function (Func, args) {\n return new Func(...args);\n };\n}\n\nconst arrayForEach = unapply(Array.prototype.forEach);\nconst arrayIndexOf = unapply(Array.prototype.indexOf);\nconst arrayPop = unapply(Array.prototype.pop);\nconst arrayPush = unapply(Array.prototype.push);\nconst arraySlice = unapply(Array.prototype.slice);\n\nconst stringToLowerCase = unapply(String.prototype.toLowerCase);\nconst stringToString = unapply(String.prototype.toString);\nconst stringMatch = unapply(String.prototype.match);\nconst stringReplace = unapply(String.prototype.replace);\nconst stringIndexOf = unapply(String.prototype.indexOf);\nconst stringTrim = unapply(String.prototype.trim);\n\nconst regExpTest = unapply(RegExp.prototype.test);\n\nconst typeErrorCreate = unconstruct(TypeError);\n\nexport function numberIsNaN(x) {\n // eslint-disable-next-line unicorn/prefer-number-properties\n return typeof x === 'number' && isNaN(x);\n}\n\nexport function unapply(func) {\n return (thisArg, ...args) => apply(func, thisArg, args);\n}\n\nexport function unconstruct(func) {\n return (...args) => construct(func, args);\n}\n\n/* Add properties to a lookup table */\nexport function addToSet(set, array, transformCaseFunc) {\n transformCaseFunc = transformCaseFunc ?? stringToLowerCase;\n if (setPrototypeOf) {\n // Make 'in' and truthy checks like Boolean(set.constructor)\n // independent of any properties defined on Object.prototype.\n // Prevent prototype setters from intercepting set as a this value.\n setPrototypeOf(set, null);\n }\n\n let l = array.length;\n while (l--) {\n let element = array[l];\n if (typeof element === 'string') {\n const lcElement = transformCaseFunc(element);\n if (lcElement !== element) {\n // Config presets (e.g. tags.js, attrs.js) are immutable.\n if (!isFrozen(array)) {\n array[l] = lcElement;\n }\n\n element = lcElement;\n }\n }\n\n set[element] = true;\n }\n\n return set;\n}\n\n/* Shallow clone an object */\nexport function clone(object) {\n const newObject = create(null);\n\n let property;\n for (property in object) {\n if (apply(hasOwnProperty, object, [property]) === true) {\n newObject[property] = object[property];\n }\n }\n\n return newObject;\n}\n\n/* IE10 doesn't support __lookupGetter__ so lets'\n * simulate it. It also automatically checks\n * if the prop is function or getter and behaves\n * accordingly. */\nfunction lookupGetter(object, prop) {\n while (object !== null) {\n const desc = getOwnPropertyDescriptor(object, prop);\n if (desc) {\n if (desc.get) {\n return unapply(desc.get);\n }\n\n if (typeof desc.value === 'function') {\n return unapply(desc.value);\n }\n }\n\n object = getPrototypeOf(object);\n }\n\n function fallbackValue(element) {\n console.warn('fallback value for', element);\n return null;\n }\n\n return fallbackValue;\n}\n\nexport {\n // Array\n arrayForEach,\n arrayIndexOf,\n arrayPop,\n arrayPush,\n arraySlice,\n // Object\n freeze,\n getPrototypeOf,\n getOwnPropertyDescriptor,\n hasOwnProperty,\n isFrozen,\n setPrototypeOf,\n seal,\n // RegExp\n regExpTest,\n // String\n stringIndexOf,\n stringMatch,\n stringReplace,\n stringToLowerCase,\n stringToString,\n stringTrim,\n // Errors\n typeErrorCreate,\n // Other\n lookupGetter,\n};\n", "import { freeze } from './utils.js';\n\nexport const html = freeze([\n 'a',\n 'abbr',\n 'acronym',\n 'address',\n 'area',\n 'article',\n 'aside',\n 'audio',\n 'b',\n 'bdi',\n 'bdo',\n 'big',\n 'blink',\n 'blockquote',\n 'body',\n 'br',\n 'button',\n 'canvas',\n 'caption',\n 'center',\n 'cite',\n 'code',\n 'col',\n 'colgroup',\n 'content',\n 'data',\n 'datalist',\n 'dd',\n 'decorator',\n 'del',\n 'details',\n 'dfn',\n 'dialog',\n 'dir',\n 'div',\n 'dl',\n 'dt',\n 'element',\n 'em',\n 'fieldset',\n 'figcaption',\n 'figure',\n 'font',\n 'footer',\n 'form',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'head',\n 'header',\n 'hgroup',\n 'hr',\n 'html',\n 'i',\n 'img',\n 'input',\n 'ins',\n 'kbd',\n 'label',\n 'legend',\n 'li',\n 'main',\n 'map',\n 'mark',\n 'marquee',\n 'menu',\n 'menuitem',\n 'meter',\n 'nav',\n 'nobr',\n 'ol',\n 'optgroup',\n 'option',\n 'output',\n 'p',\n 'picture',\n 'pre',\n 'progress',\n 'q',\n 'rp',\n 'rt',\n 'ruby',\n 's',\n 'samp',\n 'section',\n 'select',\n 'shadow',\n 'small',\n 'source',\n 'spacer',\n 'span',\n 'strike',\n 'strong',\n 'style',\n 'sub',\n 'summary',\n 'sup',\n 'table',\n 'tbody',\n 'td',\n 'template',\n 'textarea',\n 'tfoot',\n 'th',\n 'thead',\n 'time',\n 'tr',\n 'track',\n 'tt',\n 'u',\n 'ul',\n 'var',\n 'video',\n 'wbr',\n]);\n\n// SVG\nexport const svg = freeze([\n 'svg',\n 'a',\n 'altglyph',\n 'altglyphdef',\n 'altglyphitem',\n 'animatecolor',\n 'animatemotion',\n 'animatetransform',\n 'circle',\n 'clippath',\n 'defs',\n 'desc',\n 'ellipse',\n 'filter',\n 'font',\n 'g',\n 'glyph',\n 'glyphref',\n 'hkern',\n 'image',\n 'line',\n 'lineargradient',\n 'marker',\n 'mask',\n 'metadata',\n 'mpath',\n 'path',\n 'pattern',\n 'polygon',\n 'polyline',\n 'radialgradient',\n 'rect',\n 'stop',\n 'style',\n 'switch',\n 'symbol',\n 'text',\n 'textpath',\n 'title',\n 'tref',\n 'tspan',\n 'view',\n 'vkern',\n]);\n\nexport const svgFilters = freeze([\n 'feBlend',\n 'feColorMatrix',\n 'feComponentTransfer',\n 'feComposite',\n 'feConvolveMatrix',\n 'feDiffuseLighting',\n 'feDisplacementMap',\n 'feDistantLight',\n 'feFlood',\n 'feFuncA',\n 'feFuncB',\n 'feFuncG',\n 'feFuncR',\n 'feGaussianBlur',\n 'feImage',\n 'feMerge',\n 'feMergeNode',\n 'feMorphology',\n 'feOffset',\n 'fePointLight',\n 'feSpecularLighting',\n 'feSpotLight',\n 'feTile',\n 'feTurbulence',\n]);\n\n// List of SVG elements that are disallowed by default.\n// We still need to know them so that we can do namespace\n// checks properly in case one wants to add them to\n// allow-list.\nexport const svgDisallowed = freeze([\n 'animate',\n 'color-profile',\n 'cursor',\n 'discard',\n 'fedropshadow',\n 'font-face',\n 'font-face-format',\n 'font-face-name',\n 'font-face-src',\n 'font-face-uri',\n 'foreignobject',\n 'hatch',\n 'hatchpath',\n 'mesh',\n 'meshgradient',\n 'meshpatch',\n 'meshrow',\n 'missing-glyph',\n 'script',\n 'set',\n 'solidcolor',\n 'unknown',\n 'use',\n]);\n\nexport const mathMl = freeze([\n 'math',\n 'menclose',\n 'merror',\n 'mfenced',\n 'mfrac',\n 'mglyph',\n 'mi',\n 'mlabeledtr',\n 'mmultiscripts',\n 'mn',\n 'mo',\n 'mover',\n 'mpadded',\n 'mphantom',\n 'mroot',\n 'mrow',\n 'ms',\n 'mspace',\n 'msqrt',\n 'mstyle',\n 'msub',\n 'msup',\n 'msubsup',\n 'mtable',\n 'mtd',\n 'mtext',\n 'mtr',\n 'munder',\n 'munderover',\n]);\n\n// Similarly to SVG, we want to know all MathML elements,\n// even those that we disallow by default.\nexport const mathMlDisallowed = freeze([\n 'maction',\n 'maligngroup',\n 'malignmark',\n 'mlongdiv',\n 'mscarries',\n 'mscarry',\n 'msgroup',\n 'mstack',\n 'msline',\n 'msrow',\n 'semantics',\n 'annotation',\n 'annotation-xml',\n 'mprescripts',\n 'none',\n]);\n\nexport const text = freeze(['#text']);\n", "import { freeze } from './utils.js';\n\nexport const html = freeze([\n 'accept',\n 'action',\n 'align',\n 'alt',\n 'autocapitalize',\n 'autocomplete',\n 'autopictureinpicture',\n 'autoplay',\n 'background',\n 'bgcolor',\n 'border',\n 'capture',\n 'cellpadding',\n 'cellspacing',\n 'checked',\n 'cite',\n 'class',\n 'clear',\n 'color',\n 'cols',\n 'colspan',\n 'controls',\n 'controlslist',\n 'coords',\n 'crossorigin',\n 'datetime',\n 'decoding',\n 'default',\n 'dir',\n 'disabled',\n 'disablepictureinpicture',\n 'disableremoteplayback',\n 'download',\n 'draggable',\n 'enctype',\n 'enterkeyhint',\n 'face',\n 'for',\n 'headers',\n 'height',\n 'hidden',\n 'high',\n 'href',\n 'hreflang',\n 'id',\n 'inputmode',\n 'integrity',\n 'ismap',\n 'kind',\n 'label',\n 'lang',\n 'list',\n 'loading',\n 'loop',\n 'low',\n 'max',\n 'maxlength',\n 'media',\n 'method',\n 'min',\n 'minlength',\n 'multiple',\n 'muted',\n 'name',\n 'nonce',\n 'noshade',\n 'novalidate',\n 'nowrap',\n 'open',\n 'optimum',\n 'pattern',\n 'placeholder',\n 'playsinline',\n 'poster',\n 'preload',\n 'pubdate',\n 'radiogroup',\n 'readonly',\n 'rel',\n 'required',\n 'rev',\n 'reversed',\n 'role',\n 'rows',\n 'rowspan',\n 'spellcheck',\n 'scope',\n 'selected',\n 'shape',\n 'size',\n 'sizes',\n 'span',\n 'srclang',\n 'start',\n 'src',\n 'srcset',\n 'step',\n 'style',\n 'summary',\n 'tabindex',\n 'title',\n 'translate',\n 'type',\n 'usemap',\n 'valign',\n 'value',\n 'width',\n 'xmlns',\n 'slot',\n]);\n\nexport const svg = freeze([\n 'accent-height',\n 'accumulate',\n 'additive',\n 'alignment-baseline',\n 'ascent',\n 'attributename',\n 'attributetype',\n 'azimuth',\n 'basefrequency',\n 'baseline-shift',\n 'begin',\n 'bias',\n 'by',\n 'class',\n 'clip',\n 'clippathunits',\n 'clip-path',\n 'clip-rule',\n 'color',\n 'color-interpolation',\n 'color-interpolation-filters',\n 'color-profile',\n 'color-rendering',\n 'cx',\n 'cy',\n 'd',\n 'dx',\n 'dy',\n 'diffuseconstant',\n 'direction',\n 'display',\n 'divisor',\n 'dur',\n 'edgemode',\n 'elevation',\n 'end',\n 'fill',\n 'fill-opacity',\n 'fill-rule',\n 'filter',\n 'filterunits',\n 'flood-color',\n 'flood-opacity',\n 'font-family',\n 'font-size',\n 'font-size-adjust',\n 'font-stretch',\n 'font-style',\n 'font-variant',\n 'font-weight',\n 'fx',\n 'fy',\n 'g1',\n 'g2',\n 'glyph-name',\n 'glyphref',\n 'gradientunits',\n 'gradienttransform',\n 'height',\n 'href',\n 'id',\n 'image-rendering',\n 'in',\n 'in2',\n 'k',\n 'k1',\n 'k2',\n 'k3',\n 'k4',\n 'kerning',\n 'keypoints',\n 'keysplines',\n 'keytimes',\n 'lang',\n 'lengthadjust',\n 'letter-spacing',\n 'kernelmatrix',\n 'kernelunitlength',\n 'lighting-color',\n 'local',\n 'marker-end',\n 'marker-mid',\n 'marker-start',\n 'markerheight',\n 'markerunits',\n 'markerwidth',\n 'maskcontentunits',\n 'maskunits',\n 'max',\n 'mask',\n 'media',\n 'method',\n 'mode',\n 'min',\n 'name',\n 'numoctaves',\n 'offset',\n 'operator',\n 'opacity',\n 'order',\n 'orient',\n 'orientation',\n 'origin',\n 'overflow',\n 'paint-order',\n 'path',\n 'pathlength',\n 'patterncontentunits',\n 'patterntransform',\n 'patternunits',\n 'points',\n 'preservealpha',\n 'preserveaspectratio',\n 'primitiveunits',\n 'r',\n 'rx',\n 'ry',\n 'radius',\n 'refx',\n 'refy',\n 'repeatcount',\n 'repeatdur',\n 'restart',\n 'result',\n 'rotate',\n 'scale',\n 'seed',\n 'shape-rendering',\n 'specularconstant',\n 'specularexponent',\n 'spreadmethod',\n 'startoffset',\n 'stddeviation',\n 'stitchtiles',\n 'stop-color',\n 'stop-opacity',\n 'stroke-dasharray',\n 'stroke-dashoffset',\n 'stroke-linecap',\n 'stroke-linejoin',\n 'stroke-miterlimit',\n 'stroke-opacity',\n 'stroke',\n 'stroke-width',\n 'style',\n 'surfacescale',\n 'systemlanguage',\n 'tabindex',\n 'targetx',\n 'targety',\n 'transform',\n 'transform-origin',\n 'text-anchor',\n 'text-decoration',\n 'text-rendering',\n 'textlength',\n 'type',\n 'u1',\n 'u2',\n 'unicode',\n 'values',\n 'viewbox',\n 'visibility',\n 'version',\n 'vert-adv-y',\n 'vert-origin-x',\n 'vert-origin-y',\n 'width',\n 'word-spacing',\n 'wrap',\n 'writing-mode',\n 'xchannelselector',\n 'ychannelselector',\n 'x',\n 'x1',\n 'x2',\n 'xmlns',\n 'y',\n 'y1',\n 'y2',\n 'z',\n 'zoomandpan',\n]);\n\nexport const mathMl = freeze([\n 'accent',\n 'accentunder',\n 'align',\n 'bevelled',\n 'close',\n 'columnsalign',\n 'columnlines',\n 'columnspan',\n 'denomalign',\n 'depth',\n 'dir',\n 'display',\n 'displaystyle',\n 'encoding',\n 'fence',\n 'frame',\n 'height',\n 'href',\n 'id',\n 'largeop',\n 'length',\n 'linethickness',\n 'lspace',\n 'lquote',\n 'mathbackground',\n 'mathcolor',\n 'mathsize',\n 'mathvariant',\n 'maxsize',\n 'minsize',\n 'movablelimits',\n 'notation',\n 'numalign',\n 'open',\n 'rowalign',\n 'rowlines',\n 'rowspacing',\n 'rowspan',\n 'rspace',\n 'rquote',\n 'scriptlevel',\n 'scriptminsize',\n 'scriptsizemultiplier',\n 'selection',\n 'separator',\n 'separators',\n 'stretchy',\n 'subscriptshift',\n 'supscriptshift',\n 'symmetric',\n 'voffset',\n 'width',\n 'xmlns',\n]);\n\nexport const xml = freeze([\n 'xlink:href',\n 'xml:id',\n 'xlink:title',\n 'xml:space',\n 'xmlns:xlink',\n]);\n", "import { seal } from './utils.js';\n\n// eslint-disable-next-line unicorn/better-regex\nexport const MUSTACHE_EXPR = seal(/\\{\\{[\\w\\W]*|[\\w\\W]*\\}\\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode\nexport const ERB_EXPR = seal(/<%[\\w\\W]*|[\\w\\W]*%>/gm);\nexport const TMPLIT_EXPR = seal(/\\${[\\w\\W]*}/gm);\nexport const DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]/); // eslint-disable-line no-useless-escape\nexport const ARIA_ATTR = seal(/^aria-[\\-\\w]+$/); // eslint-disable-line no-useless-escape\nexport const IS_ALLOWED_URI = seal(\n /^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i // eslint-disable-line no-useless-escape\n);\nexport const IS_SCRIPT_OR_DATA = seal(/^(?:\\w+script|data):/i);\nexport const ATTR_WHITESPACE = seal(\n /[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g // eslint-disable-line no-control-regex\n);\nexport const DOCTYPE_NAME = seal(/^html$/i);\nexport const CUSTOM_ELEMENT = seal(/^[a-z][.\\w]*(-[.\\w]+)+$/i);\n", "import * as TAGS from './tags.js';\nimport * as ATTRS from './attrs.js';\nimport * as EXPRESSIONS from './regexp.js';\nimport {\n addToSet,\n clone,\n freeze,\n arrayForEach,\n arrayPop,\n arrayPush,\n stringMatch,\n stringReplace,\n stringToLowerCase,\n stringToString,\n stringIndexOf,\n stringTrim,\n numberIsNaN,\n regExpTest,\n typeErrorCreate,\n lookupGetter,\n} from './utils.js';\n\nconst getGlobal = () => (typeof window === 'undefined' ? null : window);\n\n/**\n * Creates a no-op policy for internal use only.\n * Don't export this function outside this module!\n * @param {?TrustedTypePolicyFactory} trustedTypes The policy factory.\n * @param {Document} document The document object (to determine policy name suffix)\n * @return {?TrustedTypePolicy} The policy created (or null, if Trusted Types\n * are not supported).\n */\nconst _createTrustedTypesPolicy = function (trustedTypes, document) {\n if (\n typeof trustedTypes !== 'object' ||\n typeof trustedTypes.createPolicy !== 'function'\n ) {\n return null;\n }\n\n // Allow the callers to control the unique policy name\n // by adding a data-tt-policy-suffix to the script element with the DOMPurify.\n // Policy creation with duplicate names throws in Trusted Types.\n let suffix = null;\n const ATTR_NAME = 'data-tt-policy-suffix';\n if (\n document.currentScript &&\n document.currentScript.hasAttribute(ATTR_NAME)\n ) {\n suffix = document.currentScript.getAttribute(ATTR_NAME);\n }\n\n const policyName = 'dompurify' + (suffix ? '#' + suffix : '');\n\n try {\n return trustedTypes.createPolicy(policyName, {\n createHTML(html) {\n return html;\n },\n createScriptURL(scriptUrl) {\n return scriptUrl;\n },\n });\n } catch (_) {\n // Policy creation failed (most likely another DOMPurify script has\n // already run). Skip creating the policy, as this will only cause errors\n // if TT are enforced.\n console.warn(\n 'TrustedTypes policy ' + policyName + ' could not be created.'\n );\n return null;\n }\n};\n\nfunction createDOMPurify(window = getGlobal()) {\n const DOMPurify = (root) => createDOMPurify(root);\n\n /**\n * Version label, exposed for easier checks\n * if DOMPurify is up to date or not\n */\n DOMPurify.version = VERSION;\n\n /**\n * Array of elements that DOMPurify removed during sanitation.\n * Empty if nothing was removed.\n */\n DOMPurify.removed = [];\n\n if (!window || !window.document || window.document.nodeType !== 9) {\n // Not running in a browser, provide a factory function\n // so that you can pass your own Window\n DOMPurify.isSupported = false;\n\n return DOMPurify;\n }\n\n const originalDocument = window.document;\n\n let { document } = window;\n const {\n DocumentFragment,\n HTMLTemplateElement,\n Node,\n Element,\n NodeFilter,\n NamedNodeMap = window.NamedNodeMap || window.MozNamedAttrMap,\n HTMLFormElement,\n DOMParser,\n trustedTypes,\n } = window;\n\n const ElementPrototype = Element.prototype;\n\n const cloneNode = lookupGetter(ElementPrototype, 'cloneNode');\n const getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');\n const getChildNodes = lookupGetter(ElementPrototype, 'childNodes');\n const getParentNode = lookupGetter(ElementPrototype, 'parentNode');\n\n // As per issue #47, the web-components registry is inherited by a\n // new document created via createHTMLDocument. As per the spec\n // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)\n // a new empty registry is used when creating a template contents owner\n // document, so we use that as our parent document to ensure nothing\n // is inherited.\n if (typeof HTMLTemplateElement === 'function') {\n const template = document.createElement('template');\n if (template.content && template.content.ownerDocument) {\n document = template.content.ownerDocument;\n }\n }\n\n const trustedTypesPolicy = _createTrustedTypesPolicy(\n trustedTypes,\n originalDocument\n );\n const emptyHTML = trustedTypesPolicy ? trustedTypesPolicy.createHTML('') : '';\n\n const {\n implementation,\n createNodeIterator,\n createDocumentFragment,\n getElementsByTagName,\n } = document;\n const { importNode } = originalDocument;\n\n let documentMode = {};\n try {\n documentMode = clone(document).documentMode ? document.documentMode : {};\n } catch (_) {}\n\n let hooks = {};\n\n /**\n * Expose whether this browser supports running the full DOMPurify.\n */\n DOMPurify.isSupported =\n typeof getParentNode === 'function' &&\n implementation &&\n implementation.createHTMLDocument !== undefined &&\n documentMode !== 9;\n\n const {\n MUSTACHE_EXPR,\n ERB_EXPR,\n TMPLIT_EXPR,\n DATA_ATTR,\n ARIA_ATTR,\n IS_SCRIPT_OR_DATA,\n ATTR_WHITESPACE,\n CUSTOM_ELEMENT,\n } = EXPRESSIONS;\n\n let { IS_ALLOWED_URI } = EXPRESSIONS;\n\n /**\n * We consider the elements and attributes below to be safe. Ideally\n * don't add any new ones but feel free to remove unwanted ones.\n */\n\n /* allowed element names */\n let ALLOWED_TAGS = null;\n const DEFAULT_ALLOWED_TAGS = addToSet({}, [\n ...TAGS.html,\n ...TAGS.svg,\n ...TAGS.svgFilters,\n ...TAGS.mathMl,\n ...TAGS.text,\n ]);\n\n /* Allowed attribute names */\n let ALLOWED_ATTR = null;\n const DEFAULT_ALLOWED_ATTR = addToSet({}, [\n ...ATTRS.html,\n ...ATTRS.svg,\n ...ATTRS.mathMl,\n ...ATTRS.xml,\n ]);\n\n /*\n * Configure how DOMPUrify should handle custom elements and their attributes as well as customized built-in elements.\n * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements)\n * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list)\n * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`.\n */\n let CUSTOM_ELEMENT_HANDLING = Object.seal(\n Object.create(null, {\n tagNameCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null,\n },\n attributeNameCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null,\n },\n allowCustomizedBuiltInElements: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: false,\n },\n })\n );\n\n /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */\n let FORBID_TAGS = null;\n\n /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */\n let FORBID_ATTR = null;\n\n /* Decide if ARIA attributes are okay */\n let ALLOW_ARIA_ATTR = true;\n\n /* Decide if custom data attributes are okay */\n let ALLOW_DATA_ATTR = true;\n\n /* Decide if unknown protocols are okay */\n let ALLOW_UNKNOWN_PROTOCOLS = false;\n\n /* Decide if self-closing tags in attributes are allowed.\n * Usually removed due to a mXSS issue in jQuery 3.0 */\n let ALLOW_SELF_CLOSE_IN_ATTR = true;\n\n /* Output should be safe for common template engines.\n * This means, DOMPurify removes data attributes, mustaches and ERB\n */\n let SAFE_FOR_TEMPLATES = false;\n\n /* Output should be safe even for XML used within HTML and alike.\n * This means, DOMPurify removes comments when containing risky content.\n */\n let SAFE_FOR_XML = true;\n\n /* Decide if document with ... should be returned */\n let WHOLE_DOCUMENT = false;\n\n /* Track whether config is already set on this instance of DOMPurify. */\n let SET_CONFIG = false;\n\n /* Decide if all elements (e.g. style, script) must be children of\n * document.body. By default, browsers might move them to document.head */\n let FORCE_BODY = false;\n\n /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html\n * string (or a TrustedHTML object if Trusted Types are supported).\n * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead\n */\n let RETURN_DOM = false;\n\n /* Decide if a DOM `DocumentFragment` should be returned, instead of a html\n * string (or a TrustedHTML object if Trusted Types are supported) */\n let RETURN_DOM_FRAGMENT = false;\n\n /* Try to return a Trusted Type object instead of a string, return a string in\n * case Trusted Types are not supported */\n let RETURN_TRUSTED_TYPE = false;\n\n /* Output should be free from DOM clobbering attacks?\n * This sanitizes markups named with colliding, clobberable built-in DOM APIs.\n */\n let SANITIZE_DOM = true;\n\n /* Achieve full DOM Clobbering protection by isolating the namespace of named\n * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules.\n *\n * HTML/DOM spec rules that enable DOM Clobbering:\n * - Named Access on Window (\u00A77.3.3)\n * - DOM Tree Accessors (\u00A73.1.5)\n * - Form Element Parent-Child Relations (\u00A74.10.3)\n * - Iframe srcdoc / Nested WindowProxies (\u00A74.8.5)\n * - HTMLCollection (\u00A74.2.10.2)\n *\n * Namespace isolation is implemented by prefixing `id` and `name` attributes\n * with a constant string, i.e., `user-content-`\n */\n let SANITIZE_NAMED_PROPS = false;\n const SANITIZE_NAMED_PROPS_PREFIX = 'user-content-';\n\n /* Keep element content when removing element? */\n let KEEP_CONTENT = true;\n\n /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead\n * of importing it into a new Document and returning a sanitized copy */\n let IN_PLACE = false;\n\n /* Allow usage of profiles like html, svg and mathMl */\n let USE_PROFILES = {};\n\n /* Tags to ignore content of when KEEP_CONTENT is true */\n let FORBID_CONTENTS = null;\n const DEFAULT_FORBID_CONTENTS = addToSet({}, [\n 'annotation-xml',\n 'audio',\n 'colgroup',\n 'desc',\n 'foreignobject',\n 'head',\n 'iframe',\n 'math',\n 'mi',\n 'mn',\n 'mo',\n 'ms',\n 'mtext',\n 'noembed',\n 'noframes',\n 'noscript',\n 'plaintext',\n 'script',\n 'style',\n 'svg',\n 'template',\n 'thead',\n 'title',\n 'video',\n 'xmp',\n ]);\n\n /* Tags that are safe for data: URIs */\n let DATA_URI_TAGS = null;\n const DEFAULT_DATA_URI_TAGS = addToSet({}, [\n 'audio',\n 'video',\n 'img',\n 'source',\n 'image',\n 'track',\n ]);\n\n /* Attributes safe for values like \"javascript:\" */\n let URI_SAFE_ATTRIBUTES = null;\n const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, [\n 'alt',\n 'class',\n 'for',\n 'id',\n 'label',\n 'name',\n 'pattern',\n 'placeholder',\n 'role',\n 'summary',\n 'title',\n 'value',\n 'style',\n 'xmlns',\n ]);\n\n const MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\n const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n const HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n /* Document namespace */\n let NAMESPACE = HTML_NAMESPACE;\n let IS_EMPTY_INPUT = false;\n\n /* Allowed XHTML+XML namespaces */\n let ALLOWED_NAMESPACES = null;\n const DEFAULT_ALLOWED_NAMESPACES = addToSet(\n {},\n [MATHML_NAMESPACE, SVG_NAMESPACE, HTML_NAMESPACE],\n stringToString\n );\n\n /* Parsing of strict XHTML documents */\n let PARSER_MEDIA_TYPE;\n const SUPPORTED_PARSER_MEDIA_TYPES = ['application/xhtml+xml', 'text/html'];\n const DEFAULT_PARSER_MEDIA_TYPE = 'text/html';\n let transformCaseFunc;\n\n /* Keep a reference to config to pass to hooks */\n let CONFIG = null;\n\n /* Specify the maximum element nesting depth to prevent mXSS */\n const MAX_NESTING_DEPTH = 255;\n\n /* Ideally, do not touch anything below this line */\n /* ______________________________________________ */\n\n const formElement = document.createElement('form');\n\n const isRegexOrFunction = function (testValue) {\n return testValue instanceof RegExp || testValue instanceof Function;\n };\n\n /**\n * _parseConfig\n *\n * @param {Object} cfg optional config literal\n */\n // eslint-disable-next-line complexity\n const _parseConfig = function (cfg) {\n if (CONFIG && CONFIG === cfg) {\n return;\n }\n\n /* Shield configuration object from tampering */\n if (!cfg || typeof cfg !== 'object') {\n cfg = {};\n }\n\n /* Shield configuration object from prototype pollution */\n cfg = clone(cfg);\n\n PARSER_MEDIA_TYPE =\n // eslint-disable-next-line unicorn/prefer-includes\n SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1\n ? (PARSER_MEDIA_TYPE = DEFAULT_PARSER_MEDIA_TYPE)\n : (PARSER_MEDIA_TYPE = cfg.PARSER_MEDIA_TYPE);\n\n // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is.\n transformCaseFunc =\n PARSER_MEDIA_TYPE === 'application/xhtml+xml'\n ? stringToString\n : stringToLowerCase;\n\n /* Set configuration parameters */\n ALLOWED_TAGS =\n 'ALLOWED_TAGS' in cfg\n ? addToSet({}, cfg.ALLOWED_TAGS, transformCaseFunc)\n : DEFAULT_ALLOWED_TAGS;\n ALLOWED_ATTR =\n 'ALLOWED_ATTR' in cfg\n ? addToSet({}, cfg.ALLOWED_ATTR, transformCaseFunc)\n : DEFAULT_ALLOWED_ATTR;\n ALLOWED_NAMESPACES =\n 'ALLOWED_NAMESPACES' in cfg\n ? addToSet({}, cfg.ALLOWED_NAMESPACES, stringToString)\n : DEFAULT_ALLOWED_NAMESPACES;\n URI_SAFE_ATTRIBUTES =\n 'ADD_URI_SAFE_ATTR' in cfg\n ? addToSet(\n clone(DEFAULT_URI_SAFE_ATTRIBUTES), // eslint-disable-line indent\n cfg.ADD_URI_SAFE_ATTR, // eslint-disable-line indent\n transformCaseFunc // eslint-disable-line indent\n ) // eslint-disable-line indent\n : DEFAULT_URI_SAFE_ATTRIBUTES;\n DATA_URI_TAGS =\n 'ADD_DATA_URI_TAGS' in cfg\n ? addToSet(\n clone(DEFAULT_DATA_URI_TAGS), // eslint-disable-line indent\n cfg.ADD_DATA_URI_TAGS, // eslint-disable-line indent\n transformCaseFunc // eslint-disable-line indent\n ) // eslint-disable-line indent\n : DEFAULT_DATA_URI_TAGS;\n FORBID_CONTENTS =\n 'FORBID_CONTENTS' in cfg\n ? addToSet({}, cfg.FORBID_CONTENTS, transformCaseFunc)\n : DEFAULT_FORBID_CONTENTS;\n FORBID_TAGS =\n 'FORBID_TAGS' in cfg\n ? addToSet({}, cfg.FORBID_TAGS, transformCaseFunc)\n : {};\n FORBID_ATTR =\n 'FORBID_ATTR' in cfg\n ? addToSet({}, cfg.FORBID_ATTR, transformCaseFunc)\n : {};\n USE_PROFILES = 'USE_PROFILES' in cfg ? cfg.USE_PROFILES : false;\n ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true\n ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true\n ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false\n ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false; // Default true\n SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false\n SAFE_FOR_XML = cfg.SAFE_FOR_XML !== false; // Default true\n WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false\n RETURN_DOM = cfg.RETURN_DOM || false; // Default false\n RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false\n RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false\n FORCE_BODY = cfg.FORCE_BODY || false; // Default false\n SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true\n SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false\n KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true\n IN_PLACE = cfg.IN_PLACE || false; // Default false\n IS_ALLOWED_URI = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI;\n NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;\n CUSTOM_ELEMENT_HANDLING = cfg.CUSTOM_ELEMENT_HANDLING || {};\n if (\n cfg.CUSTOM_ELEMENT_HANDLING &&\n isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck)\n ) {\n CUSTOM_ELEMENT_HANDLING.tagNameCheck =\n cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck;\n }\n\n if (\n cfg.CUSTOM_ELEMENT_HANDLING &&\n isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)\n ) {\n CUSTOM_ELEMENT_HANDLING.attributeNameCheck =\n cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck;\n }\n\n if (\n cfg.CUSTOM_ELEMENT_HANDLING &&\n typeof cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements ===\n 'boolean'\n ) {\n CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements =\n cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements;\n }\n\n if (SAFE_FOR_TEMPLATES) {\n ALLOW_DATA_ATTR = false;\n }\n\n if (RETURN_DOM_FRAGMENT) {\n RETURN_DOM = true;\n }\n\n /* Parse profile info */\n if (USE_PROFILES) {\n ALLOWED_TAGS = addToSet({}, [...TAGS.text]);\n ALLOWED_ATTR = [];\n if (USE_PROFILES.html === true) {\n addToSet(ALLOWED_TAGS, TAGS.html);\n addToSet(ALLOWED_ATTR, ATTRS.html);\n }\n\n if (USE_PROFILES.svg === true) {\n addToSet(ALLOWED_TAGS, TAGS.svg);\n addToSet(ALLOWED_ATTR, ATTRS.svg);\n addToSet(ALLOWED_ATTR, ATTRS.xml);\n }\n\n if (USE_PROFILES.svgFilters === true) {\n addToSet(ALLOWED_TAGS, TAGS.svgFilters);\n addToSet(ALLOWED_ATTR, ATTRS.svg);\n addToSet(ALLOWED_ATTR, ATTRS.xml);\n }\n\n if (USE_PROFILES.mathMl === true) {\n addToSet(ALLOWED_TAGS, TAGS.mathMl);\n addToSet(ALLOWED_ATTR, ATTRS.mathMl);\n addToSet(ALLOWED_ATTR, ATTRS.xml);\n }\n }\n\n /* Merge configuration parameters */\n if (cfg.ADD_TAGS) {\n if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {\n ALLOWED_TAGS = clone(ALLOWED_TAGS);\n }\n\n addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);\n }\n\n if (cfg.ADD_ATTR) {\n if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {\n ALLOWED_ATTR = clone(ALLOWED_ATTR);\n }\n\n addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);\n }\n\n if (cfg.ADD_URI_SAFE_ATTR) {\n addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);\n }\n\n if (cfg.FORBID_CONTENTS) {\n if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n FORBID_CONTENTS = clone(FORBID_CONTENTS);\n }\n\n addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc);\n }\n\n /* Add #text in case KEEP_CONTENT is set to true */\n if (KEEP_CONTENT) {\n ALLOWED_TAGS['#text'] = true;\n }\n\n /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */\n if (WHOLE_DOCUMENT) {\n addToSet(ALLOWED_TAGS, ['html', 'head', 'body']);\n }\n\n /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */\n if (ALLOWED_TAGS.table) {\n addToSet(ALLOWED_TAGS, ['tbody']);\n delete FORBID_TAGS.tbody;\n }\n\n // Prevent further manipulation of configuration.\n // Not available in IE8, Safari 5, etc.\n if (freeze) {\n freeze(cfg);\n }\n\n CONFIG = cfg;\n };\n\n const MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, [\n 'mi',\n 'mo',\n 'mn',\n 'ms',\n 'mtext',\n ]);\n\n const HTML_INTEGRATION_POINTS = addToSet({}, [\n 'foreignobject',\n 'annotation-xml',\n ]);\n\n // Certain elements are allowed in both SVG and HTML\n // namespace. We need to specify them explicitly\n // so that they don't get erroneously deleted from\n // HTML namespace.\n const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, [\n 'title',\n 'style',\n 'font',\n 'a',\n 'script',\n ]);\n\n /* Keep track of all possible SVG and MathML tags\n * so that we can perform the namespace checks\n * correctly. */\n const ALL_SVG_TAGS = addToSet({}, TAGS.svg);\n addToSet(ALL_SVG_TAGS, TAGS.svgFilters);\n addToSet(ALL_SVG_TAGS, TAGS.svgDisallowed);\n\n const ALL_MATHML_TAGS = addToSet({}, TAGS.mathMl);\n addToSet(ALL_MATHML_TAGS, TAGS.mathMlDisallowed);\n\n /**\n *\n *\n * @param {Element} element a DOM element whose namespace is being checked\n * @returns {boolean} Return false if the element has a\n * namespace that a spec-compliant parser would never\n * return. Return true otherwise.\n */\n const _checkValidNamespace = function (element) {\n let parent = getParentNode(element);\n\n // In JSDOM, if we're inside shadow DOM, then parentNode\n // can be null. We just simulate parent in this case.\n if (!parent || !parent.tagName) {\n parent = {\n namespaceURI: NAMESPACE,\n tagName: 'template',\n };\n }\n\n const tagName = stringToLowerCase(element.tagName);\n const parentTagName = stringToLowerCase(parent.tagName);\n\n if (!ALLOWED_NAMESPACES[element.namespaceURI]) {\n return false;\n }\n\n if (element.namespaceURI === SVG_NAMESPACE) {\n // The only way to switch from HTML namespace to SVG\n // is via . If it happens via any other tag, then\n // it should be killed.\n if (parent.namespaceURI === HTML_NAMESPACE) {\n return tagName === 'svg';\n }\n\n // The only way to switch from MathML to SVG is via`\n // svg if parent is either or MathML\n // text integration points.\n if (parent.namespaceURI === MATHML_NAMESPACE) {\n return (\n tagName === 'svg' &&\n (parentTagName === 'annotation-xml' ||\n MATHML_TEXT_INTEGRATION_POINTS[parentTagName])\n );\n }\n\n // We only allow elements that are defined in SVG\n // spec. All others are disallowed in SVG namespace.\n return Boolean(ALL_SVG_TAGS[tagName]);\n }\n\n if (element.namespaceURI === MATHML_NAMESPACE) {\n // The only way to switch from HTML namespace to MathML\n // is via . If it happens via any other tag, then\n // it should be killed.\n if (parent.namespaceURI === HTML_NAMESPACE) {\n return tagName === 'math';\n }\n\n // The only way to switch from SVG to MathML is via\n // and HTML integration points\n if (parent.namespaceURI === SVG_NAMESPACE) {\n return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];\n }\n\n // We only allow elements that are defined in MathML\n // spec. All others are disallowed in MathML namespace.\n return Boolean(ALL_MATHML_TAGS[tagName]);\n }\n\n if (element.namespaceURI === HTML_NAMESPACE) {\n // The only way to switch from SVG to HTML is via\n // HTML integration points, and from MathML to HTML\n // is via MathML text integration points\n if (\n parent.namespaceURI === SVG_NAMESPACE &&\n !HTML_INTEGRATION_POINTS[parentTagName]\n ) {\n return false;\n }\n\n if (\n parent.namespaceURI === MATHML_NAMESPACE &&\n !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]\n ) {\n return false;\n }\n\n // We disallow tags that are specific for MathML\n // or SVG and should never appear in HTML namespace\n return (\n !ALL_MATHML_TAGS[tagName] &&\n (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName])\n );\n }\n\n // For XHTML and XML documents that support custom namespaces\n if (\n PARSER_MEDIA_TYPE === 'application/xhtml+xml' &&\n ALLOWED_NAMESPACES[element.namespaceURI]\n ) {\n return true;\n }\n\n // The code should never reach this place (this means\n // that the element somehow got namespace that is not\n // HTML, SVG, MathML or allowed via ALLOWED_NAMESPACES).\n // Return false just in case.\n return false;\n };\n\n /**\n * _forceRemove\n *\n * @param {Node} node a DOM node\n */\n const _forceRemove = function (node) {\n arrayPush(DOMPurify.removed, { element: node });\n try {\n // eslint-disable-next-line unicorn/prefer-dom-node-remove\n node.parentNode.removeChild(node);\n } catch (_) {\n try {\n node.outerHTML = emptyHTML;\n } catch (_) {\n node.remove();\n }\n }\n };\n\n /**\n * _removeAttribute\n *\n * @param {String} name an Attribute name\n * @param {Node} node a DOM node\n */\n const _removeAttribute = function (name, node) {\n try {\n arrayPush(DOMPurify.removed, {\n attribute: node.getAttributeNode(name),\n from: node,\n });\n } catch (_) {\n arrayPush(DOMPurify.removed, {\n attribute: null,\n from: node,\n });\n }\n\n node.removeAttribute(name);\n\n // We void attribute values for unremovable \"is\"\" attributes\n if (name === 'is' && !ALLOWED_ATTR[name]) {\n if (RETURN_DOM || RETURN_DOM_FRAGMENT) {\n try {\n _forceRemove(node);\n } catch (_) {}\n } else {\n try {\n node.setAttribute(name, '');\n } catch (_) {}\n }\n }\n };\n\n /**\n * _initDocument\n *\n * @param {String} dirty a string of dirty markup\n * @return {Document} a DOM, filled with the dirty markup\n */\n const _initDocument = function (dirty) {\n /* Create a HTML document */\n let doc;\n let leadingWhitespace;\n\n if (FORCE_BODY) {\n dirty = '' + dirty;\n } else {\n /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */\n const matches = stringMatch(dirty, /^[\\r\\n\\t ]+/);\n leadingWhitespace = matches && matches[0];\n }\n\n if (\n PARSER_MEDIA_TYPE === 'application/xhtml+xml' &&\n NAMESPACE === HTML_NAMESPACE\n ) {\n // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict)\n dirty =\n '' +\n dirty +\n '';\n }\n\n const dirtyPayload = trustedTypesPolicy\n ? trustedTypesPolicy.createHTML(dirty)\n : dirty;\n /*\n * Use the DOMParser API by default, fallback later if needs be\n * DOMParser not work for svg when has multiple root element.\n */\n if (NAMESPACE === HTML_NAMESPACE) {\n try {\n doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);\n } catch (_) {}\n }\n\n /* Use createHTMLDocument in case DOMParser is not available */\n if (!doc || !doc.documentElement) {\n doc = implementation.createDocument(NAMESPACE, 'template', null);\n try {\n doc.documentElement.innerHTML = IS_EMPTY_INPUT\n ? emptyHTML\n : dirtyPayload;\n } catch (_) {\n // Syntax error if dirtyPayload is invalid xml\n }\n }\n\n const body = doc.body || doc.documentElement;\n\n if (dirty && leadingWhitespace) {\n body.insertBefore(\n document.createTextNode(leadingWhitespace),\n body.childNodes[0] || null\n );\n }\n\n /* Work on whole document or just its body */\n if (NAMESPACE === HTML_NAMESPACE) {\n return getElementsByTagName.call(\n doc,\n WHOLE_DOCUMENT ? 'html' : 'body'\n )[0];\n }\n\n return WHOLE_DOCUMENT ? doc.documentElement : body;\n };\n\n /**\n * _createIterator\n *\n * @param {Document} root document/fragment to create iterator for\n * @return {Iterator} iterator instance\n */\n const _createIterator = function (root) {\n return createNodeIterator.call(\n root.ownerDocument || root,\n root,\n // eslint-disable-next-line no-bitwise\n NodeFilter.SHOW_ELEMENT |\n NodeFilter.SHOW_COMMENT |\n NodeFilter.SHOW_TEXT |\n NodeFilter.SHOW_PROCESSING_INSTRUCTION |\n NodeFilter.SHOW_CDATA_SECTION,\n null,\n false\n );\n };\n\n /**\n * _isClobbered\n *\n * @param {Node} elm element to check for clobbering attacks\n * @return {Boolean} true if clobbered, false if safe\n */\n const _isClobbered = function (elm) {\n return (\n elm instanceof HTMLFormElement &&\n ((typeof elm.__depth !== 'undefined' &&\n typeof elm.__depth !== 'number') ||\n (typeof elm.__removalCount !== 'undefined' &&\n typeof elm.__removalCount !== 'number') ||\n typeof elm.nodeName !== 'string' ||\n typeof elm.textContent !== 'string' ||\n typeof elm.removeChild !== 'function' ||\n !(elm.attributes instanceof NamedNodeMap) ||\n typeof elm.removeAttribute !== 'function' ||\n typeof elm.setAttribute !== 'function' ||\n typeof elm.namespaceURI !== 'string' ||\n typeof elm.insertBefore !== 'function' ||\n typeof elm.hasChildNodes !== 'function')\n );\n };\n\n /**\n * _isNode\n *\n * @param {Node} obj object to check whether it's a DOM node\n * @return {Boolean} true is object is a DOM node\n */\n const _isNode = function (object) {\n return typeof Node === 'object'\n ? object instanceof Node\n : object &&\n typeof object === 'object' &&\n typeof object.nodeType === 'number' &&\n typeof object.nodeName === 'string';\n };\n\n /**\n * _executeHook\n * Execute user configurable hooks\n *\n * @param {String} entryPoint Name of the hook's entry point\n * @param {Node} currentNode node to work on with the hook\n * @param {Object} data additional hook parameters\n */\n const _executeHook = function (entryPoint, currentNode, data) {\n if (!hooks[entryPoint]) {\n return;\n }\n\n arrayForEach(hooks[entryPoint], (hook) => {\n hook.call(DOMPurify, currentNode, data, CONFIG);\n });\n };\n\n /**\n * _sanitizeElements\n *\n * @protect nodeName\n * @protect textContent\n * @protect removeChild\n *\n * @param {Node} currentNode to check for permission to exist\n * @return {Boolean} true if node was killed, false if left alive\n */\n const _sanitizeElements = function (currentNode) {\n let content;\n\n /* Execute a hook if present */\n _executeHook('beforeSanitizeElements', currentNode, null);\n\n /* Check if element is clobbered or can clobber */\n if (_isClobbered(currentNode)) {\n _forceRemove(currentNode);\n return true;\n }\n\n /* Check if tagname contains Unicode */\n if (regExpTest(/[\\u0080-\\uFFFF]/, currentNode.nodeName)) {\n _forceRemove(currentNode);\n return true;\n }\n\n /* Now let's check the element's type and name */\n const tagName = transformCaseFunc(currentNode.nodeName);\n\n /* Execute a hook if present */\n _executeHook('uponSanitizeElement', currentNode, {\n tagName,\n allowedTags: ALLOWED_TAGS,\n });\n\n /* Detect mXSS attempts abusing namespace confusion */\n if (\n currentNode.hasChildNodes() &&\n !_isNode(currentNode.firstElementChild) &&\n (!_isNode(currentNode.content) ||\n !_isNode(currentNode.content.firstElementChild)) &&\n regExpTest(/<[/\\w]/g, currentNode.innerHTML) &&\n regExpTest(/<[/\\w]/g, currentNode.textContent)\n ) {\n _forceRemove(currentNode);\n return true;\n }\n\n /* Mitigate a problem with templates inside select */\n if (\n tagName === 'select' &&\n regExpTest(/