diff --git a/content/adventures/ca.yaml b/content/adventures/ca.yaml index b3921f4abbb..3696f9b2b2f 100644 --- a/content/adventures/ca.yaml +++ b/content/adventures/ca.yaml @@ -159,9 +159,9 @@ adventures: example_code: | ``` {print} "OH NO! El T-rex s'apropa!" - end = {ask} "Quin final vols, trist o feliç?" - {if} end {is} feliç - {print} "En Ricard salta a temps dins la màquina del temps!" + final = {ask} "Quin final vols, trist o feliç?" + {if} final {is} feliç + {print} "En Ricard torna a temps dins la màquina del temps!" {print} _ {else} {print} "Oh no! En Ricard és massa lent..." @@ -1257,16 +1257,16 @@ adventures: 6: example_code: | ``` - persones = mama, papa, Emma, Sofia + gent = mama, papa, Emma, Sofia emma_renta = 0 - netejadora = persones {at} {random} - {print} 'Li toca rentar plats a ' netejadora - {if} rentadora {is} Emma emma_renta = emma_renta + 1 - {print} 'Emma farà els plats aquesta setmana' emma_renta 'vegades' + netejador = gent {at} {random} + {print} 'Li toca rentar plats a ' netejador + {if} netejador {is} Emma emma_renta = emma_renta + 1 + {print} "L'Emma rentarà els plats aquesta setmana" emma_renta "vegades" ``` - Ara pots copiar de la línia 3 a la 5 unes quantes vegades (pex. 7 vegades per fer una setmana). - Pots fer el codi per calcular tota una setmana? + Now you can copy lines 3 to 5 a few times (e.g. 7 times for a whole week) to calculate for a whole week again. + Do you make the code for the whole week? story_text_2: | Si tens molta mala sort, el programa anterior podria triar-te per a rentar plats de tota la setmana! I això no és just! Per crear un sistema més just, pots utilitzar l'ordre `{remove}` per eliminar la persona escollida de la llista. D'aquesta manera no haureu de tornar a rentar els plats fins que tothom hagi tingut el seu torn. @@ -1280,7 +1280,7 @@ adventures: {print} "Dilluns renta: " netejador {remove} netejador {from} gent netejador = gent {at} {random} - {print} "Dimarts renta:: " netejador + {print} "Dimarts renta: " netejador {remove} netejador {from} gent ``` story_text: "Quantes vegades rentarà els plats cadascú? És just? Pots comptar-ho en aquest nivell.\n" @@ -1293,7 +1293,7 @@ adventures: example_code: | ``` gent = mama, papa, Emma, Sofia - {repeat} _ _ {print} 'Rentar plats li toca a ' _ _ _ + {repeat} _ _ {print} 'Li toca rentar plats a ' _ _ _ ``` 10: story_text: | diff --git a/content/cheatsheets/es.yaml b/content/cheatsheets/es.yaml index 28e9239bc03..80c8df76a07 100644 --- a/content/cheatsheets/es.yaml +++ b/content/cheatsheets/es.yaml @@ -66,21 +66,21 @@ {remove} perro {from} animales 4: - name: '{print}' - explanation: Imprimir exactamente usando comillas. + explanation: Imprime exactamente utilizando comillas. demo_code: '{print} ''Hola bienvenido a Hedy.''' - name: '{is}' - explanation: Dar un nombre al texto e `{print}` sin comillas simples. + explanation: Da un nombre al texto e `{print}` sin comillas simples. demo_code: |- nombre {is} Hedy {print} 'Mi nombre es ' nombre - name: '{ask}' - explanation: Preguntar algo con `{ask}`. + explanation: Pregunta algo con `{ask}`. demo_code: |- color {is} {ask} '¿Cuál es tu color favorito?' {print} 'Tu color favorito es ' color 5: - name: '{print}' - explanation: Imprimir un texto literal usando comillas. + explanation: Imprime exactamente utilizando comillas. demo_code: '{print} ''Hola bienvenido a Hedy.''' - name: '{ask}' explanation: Pregunta algo con `{ask}`. @@ -98,7 +98,7 @@ respuesta {is} {ask} '¿Cuán lejos debería caminar?' {if} respuesta {is} lejos {forward} 100 {else} {forward} 5 - name: '{in}' - explanation: Comprobar elementos con `{in}`. + explanation: Compueba elementos con `{in}`. demo_code: |- colores_bonitos {is} verde, amarillo color {is} {ask} '¿Cuál es tu color favorito?' @@ -108,7 +108,7 @@ demo_code: '{if} a {is} {pressed} {print} ''¡Presionas A!'' {else} {print} ''¡Presionaste otra tecla!''' 6: - name: '{print}' - explanation: Imprime un texto literal con usando comillas simples. + explanation: Imprime exactamente utilizando comillas. demo_code: '{print} ''5 multiplicado por 5 es '' 5 * 5' - name: '{ask}' explanation: Pregunta por una operación y comprueba que sea correcta. @@ -123,7 +123,7 @@ {forward} 50 7: - name: '{print}' - explanation: Imprimir un texto literal usando comillas simples. + explanation: Imprime exactamente utilizando comillas. demo_code: '{print} ''Hola bienvenido a Hedy.''' - name: '{ask}' explanation: Pregunta algo con `{ask}`. @@ -356,12 +356,12 @@ {for} i {in} {range} (1,10): {print}('Hola, veces ', i) - name: '{print} con var' - explanation: Con `{print}` necesita usar paréntesis y comas si imprime más elementos. + explanation: Con `{print}` necesita usar paréntesis y comas si imprimes más elementos. demo_code: |- nombre = 'Hedy' {print}('mi nombre es ', nombre) - name: pregunta algo con {input} - explanation: Use `{input}` en lugar de `{ask}` para preguntar algo. + explanation: Utiliza `{input}` en lugar de `{ask}` para preguntar algo. demo_code: |- nombre = {input}('¿Cómo te llamas?') {print}('Así que tu nombre es ', nombre) diff --git a/content/client-messages/es.yaml b/content/client-messages/es.yaml index dfe1e917eb8..9263591366e 100644 --- a/content/client-messages/es.yaml +++ b/content/client-messages/es.yaml @@ -3,7 +3,7 @@ Connection_error: No se ha podido conectar con el servidor. Empty_output: Este código funciona pero no imprime nada. Agrega un comando print a tu código o usa una tortuga para mostrar el resultado. Errors_found: ¡Has cometido un error! No te preocupes, seguimos ejecutando el programa Execute_error: Algo salió mal mientras se ejecutaba el programa. -Other_error: ¡Ups! Quizás hemos cometido un pequeño error. +Other_error: ¡Ups! Tal vez cometimos un pequeño error. Program_repair: Este podría ser código correcto, ¿lo puedes arreglar? Program_too_long: Tu programa toma demasiado tiempo en ejecutarse. ServerError: Escribiste un programa que no esperábamos. Si quieres ayudar, envíanos un email con el nivel y tu programa a hello@hedy.org. Mientras tanto, intenta algo un poco diferente y échale otro vistazo a los ejemplos. ¡Gracias! diff --git a/content/pages/es.yaml b/content/pages/es.yaml index 2707aa6b157..1510cebcbdf 100644 --- a/content/pages/es.yaml +++ b/content/pages/es.yaml @@ -12,16 +12,16 @@ home-sections: 2. Hedy es gradual, para que puedas aprender un concepto y su sintaxis a la vez 3. Hedy está construido para el aula, permitiendo a los profesores personalizar completamente la experiencia de sus alumnos - title: Programación multilingüe - text: Mientras que casi todos los lenguajes de programación tienen palabras clave en inglés, como `for` o `repeat`, ¡Hedy puede utilizarse en cualquier idioma! Actualmente soportamos 47 idiomas diferentes, incluyendo holandés, español, árabe, turco, chino e hindi. Si tu idioma no está disponible, siempre puedes iniciar una nueva traducción. + text: Mientras que casi todos los lenguajes de programación tienen palabras clave en inglés, como `for` o `repeat`, ¡Hedy puede utilizarse en cualquier idioma! Actualmente admitimos 47 idiomas diferentes, incluyendo neerlandés, español, árabe, turco, chino e hindi. Si tu idioma no está disponible, siempre puedes iniciar una nueva traducción. - title: Aprendizaje paso a paso - text: Aprender un lenguaje de programación puede ser agobiante, ya que los alumnos tienen que aprender los conceptos (por ejemplo condicionales si-sino o bucles) y la sintaxis (como comillas y paréntesis) a la vez. En Hedy, los conceptos se introducen primero con muy poca sintaxis y después se perfeccionan. ¡Una forma de aprender científicamente probada! + text: Aprender un lenguaje de programación puede ser agobiante, ya que los alumnos tienen que aprender los conceptos (por ejemplo, las condicionales si-sino o los bucles) y la sintaxis (como las comillas o los paréntesis) a la vez. En Hedy, los conceptos se introducen primero con muy poca sintaxis y después se perfeccionan. ¡Una forma de aprender científicamente probada! - title: Hecho para el aula text: |- - Hedy es adecuado para niños de 10 años o más y diseñado para usarse en el aula. + Hedy es adecuado para niños de 10 años o más y diseñado para su uso en el aula. Los profesores lo pueden usar gratis, crear planes de estudio integrados, pero también pueden escribir sus propias lecciones y cargarlas en la interfaz de usuario de Hedy. - title: La programación en contexto - text: ¡Hedy está pensado para todos los niños que quieran aprender a programar! Aunque se recomienda que sepan leer inglés con facilidad. -- title: ¿Se necesita tener experiencia como programador? + text: Hedy muestra la programación de la forma más amplia posible, y se puede utilizar de muchas formas interesantes. Hedy permite la creación de historias digitales e interactivas, dibujos coloridos que se pueden mostrar por pantalla pero también dibujar con un trazador de bolígrafos o bordado en una camisa, y se puede utilizar para crear juego o aplicaciónes con acciones de botones y teclado. +- title: ¿Hedy es gratis? text: |- ¡Sí! Hedy es 'Código abierto', lo que significa que cualquiera puede ayudarnos a mejorar Hedy. Puedes encontrar nuestro código en Github. @@ -45,10 +45,10 @@ join-sections: ¿No eres programador? ¡Sin problema! Otra manera de apoyar a Hedy es traduciendo palabras clave, mensajes de error, aventuras y otro contenido. Este es el estado actual, ayúdanos a completar un idioma, ¡o a añadir uno nuevo! - Estado de traducción + Translation status - title: Ayuda a los profesores a empezar text: |- - Hedy está diseñado para ayudar a los profesores a enseñar lecciones de programación en clase. Tenemos funciones específicas para profesores como la opción para crear una clase, personalizarla y ver el progreso de los estudiantes. + Hedy está diseñado para ayudar a los profesores a enseñar lecciones de programación en clase. Tenemos funciones específicas para profesores como la opción para crear una clase, personalizarla y ver el progreso de los alumnos. Si te gusta Hedy, puedes contactar a los colegios que conoces ¡para ayudar a los profesores a empezar! Nosotros podemos ayudar en la búsqueda de escuelas o profesores vía Discord. learn-more-sections: - title: La fundación Hedy @@ -90,12 +90,12 @@ start-sections: * No necesitas saber mucho de programación si empiezas, Hedy trabaja paso a paso, ¡también para ti! * Puedes utilizar Hedy en tu lengua materna, ya que ha sido traducido a muchos otros idiomas. * ¡Todos los niños pueden programar! Hedy es especialmente útil para los niños que tienen problemas de visión, ya que puede leer el material en voz alta sin necesidad de un ratón. - * Estamos aquí para ayudarte, puedes encontrarnos por ejemplo en [Discord](https://discord.gg/8yY7dEme9r) o puedes [email-us](hello@hedy.org). + * Estamos aquí para ayudarte, puedes encontrarnos por ejemplo en [Discord](https://discord.gg/8yY7dEme9r) o puedes [enviarnos un e-mail](hello@hedy.org). - title: Docentes sobre Hedy text: |- Varios profesores de todo el mundo han expresado su pasión por Hedy, como algunos han compartido con nosotros: - *¡Increíblemente inspirador! Una forma excelente de hacer que la programación sea mucho más accesible para ti, pero también para los estudiantes. Es muy divertido jugar con él y tiene mucho potencial para utilizarlo con los estudiantes. ¡Creo que es una herramienta muy buena! Creo que es una forma valiosa para que los niños comiencen a aprender programación. Python y la codificación siempre han sido muy emocionantes, porque la barrera para aprender es muy alta. Ahora todo es un poco más bajo y se explicó que, en realidad, puede ser muy fácil. ¡Disfruté viendo cómo Hedy intenta hacer que la programación sea lo más accesible posible para los usuarios!* + *¡Increíblemente inspirador! Una forma excelente de hacer que la programación sea mucho más accesible para ti, pero también para los alumnos. Es muy divertido jugar con él y tiene mucho potencial para utilizarlo con los alumnos. ¡Creo que es una herramienta muy buena! Creo que es una forma valiosa para que los niños comiencen a aprender programación. Python y la codificación siempre han sido muy emocionantes, porque la barrera para aprender es muy alta. Ahora todo es un poco más bajo y se explicó que, en realidad, puede ser muy fácil. ¡Disfruté viendo cómo Hedy intenta hacer que la programación sea lo más accesible posible para los usuarios!* Países Bajos: Profesores de matemáticas en formación (enseñanza secundaria) *Interfaz sencilla y buenos ejemplos.* Profesor : 3.º a 6.º grado (primaria) @@ -108,7 +108,7 @@ start-sections: *Tanto que la explicación puede estar en holandés (y el código en inglés), como que se va construyendo con cada vez más posibilidades.* Países Bajos: Grupo de clase Plus - *Pero Hedy y sus niveles graduales... qué idea, quería agradecerte personalmente por crear esto. No puedo agradecerte lo suficiente. Además, nunca había visto el nivel de compromiso y entusiasmo de mis estudiantes, como lo he visto con Hedy. Hemos cubierto hasta el nivel 5 y planeamos dedicarle una semana más en clases y laboratorios, antes de comenzar con Python.* Pakistán + *Pero Hedy y sus niveles graduales... qué idea, quería agradecerte personalmente por crear esto. No puedo agradecerte lo suficiente. Además, nunca había visto el nivel de compromiso y entusiasmo de mis alumnos, como lo he visto con Hedy. Hemos cubierto hasta el nivel 5 y planeamos dedicarle una semana más en clases y laboratorios, antes de comenzar con Python.* Pakistán *La "realidad" de la programación, se asemeja a cómo es en realidad.* Países Bajos: Clase Plus grupo 4 a 8 @@ -131,22 +131,22 @@ teacher-guide: Al contrario que los lenguajes de programación para niños, como Scratch, Hedy no usa bloques de código sino código textual. Así con Hedy aprenderás a escribir código como los programadores de verdad, pero dando pequeños pasos con entretenidos ejercicios. De esta forma Hedy puede funcionar como un escalón hacia los lenguajes de programación reales como Python ¡de una forma accesible y divertida! - Si quieres saber más, aquí puedes ver este video sobre el desarrollo de Hedy como lenguaje de programación. + Si quieres saber más, aquí puedes ver este vídeo sobre el desarrollo de Hedy como lenguaje de programación. - title: Público objetivo text: |- - Hedy está desarrollado pensando en los estudiantes de primaria y secundaria (edades 10 - 15). - Es importante que los estudiantes sean capaces de leer bien. Recomendamos no empezar con Hedy hasta que los estudiantes no tengan al menos el nivel de lectura de 3º. - Los estudiantes (¡y profesores!) no necesitan ninguna experiencia en programación para empezar con Hedy. + Hedy está desarrollado pensando en los alumnos de primaria y secundaria (edades 10 - 15). + Es importante que los alumnos sean capaces de leer bien. Recomendamos no empezar con Hedy hasta que los alumnos no tengan al menos el nivel de lectura de 3º. + Los alumnos (¡y profesores!) no necesitan ninguna experiencia en programación para empezar con Hedy. - title: ¿Cómo funciona Hedy? text: |- Hedy se divide en niveles, en los cuales se enseñan nuevos comandos. Cada nivel contiene una variedad de aventuras para practicar los nuevos comandos aprendidos. Como profesor/a, tú decides qué aventuras están disponibles a tu alumnos. ¿Harán un restaurante, una calculadora o una casa encantada en este nivel? En cada nivel, las aventuras están ordenadas de mas fácil a difícil. - De ésta forma tus estudiantes siempre tienen un reto. Las aventuras pueden realizarse por alumnos individuales o puedes enseñarlas en grupos. + De esta forma tus alumnos siempre tienen un reto. Las aventuras pueden realizarse por alumnos individuales o puedes enseñarlas en grupos. Las aventuras también incluyen un código de ejemplo, para asegurarse que ¡incluso profesores con poca experiencia de programación puedan usar Hedy también! ¡Por supuesto Hedy también permite a los profesores más creativos que prefieren crear sus propias aventuras! - Después de resolver todas las aventuras de un nivel concreto, tus alumnos pueden poner a prueba sus conocimientos con la encuesta. + Después de resolver todas las aventuras de un nivel concreto, tus alumnos pueden poner a prueba sus conocimientos con el cuestionario. Puedes revisar el trabajo de tus alumnos y su progreso en la página de la clase. - title: Dispositivos text: |- @@ -154,34 +154,34 @@ teacher-guide: No hay necesidad de descargar nada antes de empezar a trabajar con Hedy, sólo ve a la página web ¡y listo! - title: La comunidad de Hedy text: |- - Todos los profesores de Hedy, programadores y otros fans son bienvenidos a unirse a nuestro servidor de Discord.. Este es el lugar ideal para charlar sobre Hedy: tenemos canales donde puedes mostrar tus interesantes proyectos y lecciones, canales para informar sobre errores, y canales para hablar con otros profesores y con el equipo de Hedy. - Aquí puedes ver un video sobre como unirte a la Comunidad de Discord. + Todos los profesores de Hedy, programadores y otros aficionados son bienvenidos a unirse a nuestro servidor de Discord.. Este es el lugar ideal para charlar sobre Hedy: tenemos canales donde puedes mostrar tus interesantes proyectos y lecciones, canales para informar sobre errores, y canales para hablar con otros profesores y con el equipo de Hedy. + Aquí puedes ver un vídeo sobre como unirte a la comunidad de Discord. - title: Hedy y el RGPD text: |- Las organizaciones en la UE tienen que cumplir con el GDPR (Reglamento General de Protección de Datos) al procesar datos personales. Dado que este es un tema complejo para muchas escuelas, puede utilizar todas las funcionalidades de programación de Hedy sin compartir datos personales. - La forma más sencilla de hacerlo es utilizar Hedy sin crear cuentas para el profesor y los alumnos. Sin cuentas, toda la funcionalidad está disponible, con la excepción de personalizar los niveles, guardar los programas de los estudiantes y ver su progreso. Eso es limitante, pero hay escuelas que utilizan Hedy de esa manera. + La forma más sencilla de hacerlo es utilizar Hedy sin crear cuentas para el profesor y los alumnos. Sin cuentas, toda la funcionalidad está disponible, con la excepción de personalizar los niveles, guardar los programas de los alumnos y ver su progreso. Eso es limitante, pero hay escuelas que utilizan Hedy de esa manera. Una segunda forma es que un profesor cree una cuenta con una dirección de correo electrónico sin datos personales, por ejemplo "docent25@email.com". Aparte de una dirección de correo electrónico, que sólo se requiere para restablecer la contraseña, no es necesario compartir ninguna información cuando se crea una cuenta de profesor. - Con una cuenta de profesor, puede crear cuentas anónimas para los alumnos, por ejemplo, rainbow-alumno1, rainbow-alumno2, etc (consulte el manual "Preparativos para la enseñanza"). De esta manera usted puede utilizar todas las funcionalidades de Hedy, incluyendo guardar el progreso, sin compartir datos personales suyos o de sus estudiantes. + Con una cuenta de profesor, puede crear cuentas anónimas para los alumnos, por ejemplo, rainbow-alumno1, rainbow-alumno2, etc (consulte el manual "Preparativos para la enseñanza"). De esta manera usted puede utilizar todas las funcionalidades de Hedy, incluyendo guardar el progreso, sin compartir datos personales suyos o de sus alumnos. Si lo anterior no es suficiente para su contexto, podemos firmar un acuerdo de procesamiento para el tratamiento de sus datos personales. - title: Tutorial key: tutorial subsections: - title: Tutorial - text: ¿Quieres ver el tutorial (de nuevo)? Haz clic aquí. -- title: Preparaciones - key: preparaciones + text: ¿Quieres ver el tutorial (de nuevo)? Haz clic aquí. +- title: Preparativos para la enseñanza + key: preparativos subsections: - title: Para profesores text: Puedes preparar tus clases en la página Para profesores. En esta página encontrarás todo lo que necesitas para dar clase con Hedy, como tus clases, tus aventuras y diapositivas. Todas las funcionalidades de la página para profesores se explican a continuación. - title: Crear una clase text: |- - Como profesor, puedes crear una clase para tus estudiantes. En esta clase puedes ver las cuentas de cada uno de los estudiantes y sus programas. También puedes monitorear su progreso. + Como profesor, puedes crear una clase para tus alumnos. En esta clase puedes ver las cuentas de cada uno de los alumnos y sus programas. También puedes monitorear su progreso. Este vídeo demuestra cómo crear rápidamente una clase en Hedy. - title: Duplicar una clase - text: "¿Das varias clases? Entonces no tienes que personalizar cada clase individualmente. Simplemente cree una clase, personalice la clase (vea \"Personalice su clase\" para aprender cómo) y luego duplique esta clase tantas veces como quiera.\nPuede duplicar la clase en la página \"Para profesores\". Si duplicas una clase, todos los ajustes de la clase se duplican también. Esto significa que todos los niveles y aventuras que no estén disponibles para la primera clase tampoco lo estarán para la(s) nueva(s) clase(s).\nLas cuentas de los estudiantes y de los segundos profesores de tu clase no se duplicarán en la nueva clase." + text: "¿Das varias clases? Entonces no tienes que personalizar cada clase individualmente. Simplemente cree una clase, personalice la clase (vea \"Personalice su clase\" para aprender cómo) y luego duplique esta clase tantas veces como quiera.\nPuede duplicar la clase en la página \"Para profesores\". Si duplicas una clase, todos los ajustes de la clase se duplican también. Esto significa que todos los niveles y aventuras que no estén disponibles para la primera clase tampoco lo estarán para la(s) nueva(s) clase(s).\nLas cuentas de los alumnos y de los segundos profesores de tu clase no se duplicarán en la nueva clase." - title: Añadir un segundo profesor text: "¿No eres el único profesor que imparte tu clase? Entonces ahora puedes añadir otro profesor a la clase. Ve a la página 'Para profesores' y haz clic en la clase. A continuación, selecciona \"Invitar a un profesor\" e introduce el nombre de usuario de tu colega.\nTu colega recibirá una invitación en su cuenta para unirse a tu clase. Puede ver el mensaje de invitación haciendo clic en su nombre de usuario en la esquina superior derecha de la pantalla y seleccionando \"Mi cuenta\".\nUna vez que el otro profesor acepte la invitación, también podrá personalizar la clase.\nPara eliminar a un segundo profesor de tu clase, ve a la página de la clase y elimina al segundo profesor. El profesor que ha creado la clase no puede ser eliminado." - title: Personalizar tu clase @@ -194,7 +194,7 @@ teacher-guide: En esta sección puedes seleccionar y ordenar aventuras. Las pestañas rosas son aventuras con nuevos comandos. Las pestañas grises son aventuras habituales. Para reorganizar el orden de las aventuras, puedes arrastrar las pestañas. Sin embargo, te recomendamos que utilices el orden habitual de las aventuras, ya que el equipo de Hedy se aseguró de que las aventuras fueran de las más fáciles a las más difíciles. Si desea eliminar una aventura para sus alumnos, simplemente haga clic en la cruz en la pestaña de la aventura. - Si desea agregar aventuras, por ejemplo su propia aventura o una aventura que eliminó accidentalmente, use este menú para agregar la aventura a las aventuras de sus estudiantes. Simplemente haz clic en la aventura que deseas agregar y (re)aparecerá en la línea de aventuras. Para deshacer todos los cambios en las aventuras, haga clic en "Restablecer". + Si desea agregar aventuras, por ejemplo su propia aventura o una aventura que eliminó accidentalmente, use este menú para agregar la aventura a las aventuras de sus alumnos. Simplemente haz clic en la aventura que deseas agregar y (re)aparecerá en la línea de aventuras. Para deshacer todos los cambios en las aventuras, haga clic en "Restablecer". **Fechas de apertura** @@ -203,14 +203,14 @@ teacher-guide: **Desbloquear umbrales de nivel** - Esta característica le permite establecer un umbral para la calificación del examen de sus estudiantes, antes de que puedan continuar al siguiente nivel. Por ejemplo, si ingresa "80", sus estudiantes deben obtener al menos un 80 % en el cuestionario antes de poder pasar al siguiente nivel. Si no han alcanzado el umbral, no podrán continuar y deberán volver a realizar el cuestionario. + Esta característica le permite establecer un umbral para la calificación del cuestionario de sus alumnos, antes de que puedan continuar al siguiente nivel. Por ejemplo, si ingresa "80", sus alumnos deben obtener al menos un 80 % en el cuestionario antes de poder pasar al siguiente nivel. Si no han alcanzado el umbral, no podrán continuar y deberán volver a realizar el cuestionario. ¿No quieres utilizar el umbral? No te preocupes, simplemente mantén esta sección en blanco. **Otros ajustes** - Hay otras configuraciones que también podrían resultarle útiles. Nuestra primera configuración adicional es "Modo de desarrollador obligatorio". En el modo de desarrollador, los estudiantes solo ven sus pantallas de entrada y salida y el botón Ejecutar. Las aventuras están ocultas y no hay hojas de trucos disponibles. Esto podría resultar útil en una situación de prueba. - Si no se selecciona esta opción, el modo de desarrollador también está disponible para los estudiantes como opción voluntaria. + Hay otras configuraciones que también podrían resultarle útiles. Nuestra primera configuración adicional es "Modo de desarrollador obligatorio". En el modo de desarrollador, los alumnos solo ven sus pantallas de entrada y salida y el botón Ejecutar. Las aventuras están ocultas y no hay ficha de ayudas disponibles. Esto podría resultar útil en una situación de prueba. + Si no se selecciona esta opción, el modo de desarrollador también está disponible para los alumnos como opción voluntaria. Si desea que todos sus alumnos sean visibles en la puntuación más alta de la clase, puede seleccionar la segunda opción. Con todas las demás opciones, puede optar por ocultar algunas funciones o contenido para sus alumnos, esto podría ayudarlos a concentrarse más. @@ -218,18 +218,18 @@ teacher-guide: **Guardar** No olvide guardar los cambios cuando haya terminado de personalizar su clase. - - title: Cuentas de Estudiantes + - title: Cuentas de alumno text: |- - Hay 2 formas de permitir que tus estudiantes se unan a tu clase: Puedes dejarles crear sus propias cuentas, o puedes crearlas por ellos. + Para añadir alumnos a tu clase ve a la página de la clase haciendo clic en el nombre de la clase en la página 'Para profesores'. Después haz clic en 'añadir alumnos'. Hay 2 formas de permitir que tus alumnos se unan a tu clase: Puedes dejarles crear sus propias cuentas, o puedes crearlas por ellos. - **Los estudiantes crean sus propias cuentas** - Tus estudiantes pueden in a la página web de Hedy y crear su cuenta, igual que tú lo hiciste. Para tenerlos en tu clase, ellos simplemente deber hacer clic en el enlace de la invitación. - Puedes encontrar el enlace para invitarlos en la página de la clase y enviarlo a tus estudiantes. Ten en cuenta que tus estudiantes deben estar conectados en Hedy cuando hagan clic en el enlace, para hacer que todo funcione fácilmente. + **Tú creas las cuentas para tus alumnos** + Algunas veces es más fácil que tú crees las cuentas para tus alumnos. Esto se hace al hacer clic en el botón 'crear cuentas de alumnos' y rellenando los nombres de usuarios y contraseñas por ellos. + Los alumnos pueden conectarse con el nombre de usuario y contraseña que elegiste. Después, ellos pueden cambiar su nombre de usuario o contraseña si quieren, manteniéndose en tu clase. + Este vídeo muestra cómo agregar alumnos a tu clase de la manera más rápida y fácil. - **Tú creas las cuentas para tus estudiantes** - Algunas veces es más fácil que tú crees las cuentas para tus estudiantes. Esto se hace al hacer clic en el botón 'crear cuentas de estudiantes' y rellenando los nombres de usuarios y contraseñas por ellos. - Los estudiantes pueden conectarse con el nombre de usuario y contraseña que elegiste. Después, ellos pueden cambiar su nombre de usuario o contraseña si quieren, manteniéndose en tu clase. - Este vídeo muestra cómo agregar estudiantes a tu clase de la manera más rápida y fácil. + **Los alumnos crean sus propias cuentas** + Tus alumnos pueden in a la página web de Hedy y crear su cuenta, igual que tú lo hiciste. Para tenerlos en tu clase, ellos simplemente deber hacer clic en el enlace de la invitación. + Puedes encontrar el enlace para invitarlos en la página de la clase y enviarlo a tus alumnos. Ten en cuenta que tus alumnos deben estar conectados en Hedy cuando hagan clic en el enlace, para hacer que todo funcione fácilmente. También puedes invitar manualmente a un alumno a tu clase con el botón 'Invitar por nombre de usuario'. - title: Establecer idioma preferido text: |- @@ -237,13 +237,13 @@ teacher-guide: El idioma siempre se podrá modificar a posteriori navegando a ' Mi cuenta' y 'Mis opciones personales'. **Para no hablantes de la lengua inglesa** - No solo puedes cambiar el idioma de las aventuras a tu propio idioma. También puedes cambiar el idioma de los comandos (por ejemplo 'print' o 'ask'). - De ésta forma, puedes enseñar a tus alumnos con los comandos originales en Inglés pero también puedes permitirles utilizar su propio idioma. Por ejemplo, los estudiantes holandeses pueden utilizar 'vraag' en vez de 'ask'. + No solo puedes cambiar el idioma de las aventuras a tu propio idioma. También puedes cambiar el idioma de los comandos (por ejemplo 'imprimir' o 'preguntar'). + De esta forma, puedes enseñar a tus alumnos con los comandos originales en Inglés pero también puedes permitirles utilizar su propio idioma. Por ejemplo, los alumnos holandeses pueden utilizar 'vraag' en vez de 'ask'. Si un alumno quiere cambiar idiomas, pueden hacer clic en el interruptor de palabras clave. Cambiará las palabras claves de inglés al idioma preferido y viceversa. ¡Dato curioso! ¡Se permite que los alumnos programen tanto en inglés como en su propio idioma al mismo tiempo! Así que, si tienen problemas recordando algunas palabras clave en inglés pero pueden recordar fácilmente otras, pueden usar ambas al mismo tiempo. - **Video** + **Vídeo** Este vídeo muestra cómo establecer el lenguaje preferido y también cómo cambiar los comandos a tu lenguaje preferido. - title: Guardar los programas text: |- @@ -258,17 +258,17 @@ teacher-guide: Si quieres dejar de compartir tu programa, ve a 'Mis programas' y haz clic en 'No compartir'. El icono de avión de papel puede utilizarse para entregar los programas a un profesor de la clase. Los programas que se hayan entregado, no se podrán editar después. -- title: Enseñando con Hedy - key: enseñando +- title: Enseñar con Hedy + key: enseñar subsections: - title: Enseñando con Hedy text: |- Hedy contiene un montón de niveles diferentes que cada uno enseña una nueva habilidad diferente. Recomendamos enseñar un nivel por lección. - Esto da a tus estudiantes el tiempo para comprender plenamente un nuevo comando o concepto y practicar con él, antes de pasar al siguiente nivel. - Nosotros utilizamos esta estructura en nuestras lecciones: Introducción, nuevos conceptos y órdenes, manos a la obra, rompecabezas y pruebas. + Esto da a sus alumnos el tiempo para comprender plenamente un nuevo comando o concepto y práctica con él, antes de pasar al siguiente nivel. + Nosotros utilizamos esta estructura en nuestras lecciones: Introducción, nuevos conceptos y órdenes, manos a la obra, rompecabezas y cuestionarios. - title: Diapositivas text: |- - Al dar instrucciones quizás quieras usar nuestras diapositivas. Están disponibles en la página 'Para profesores'. Hay un conjunto de diapositivas por cada nivel. En las diapositivas se explican todos los nuevos comandos para este nivel. Hemos intentado explicar por qué estos cambios son necesarios o cómo resultan útiles los nuevos comandos. + Para dar instrucciones, puedes utilizar nuestras diapositivas. Están disponibles en la página 'Para profesores'. Hay un conjunto de diapositivas por cada nivel. En las diapositivas se explican todos los nuevos comandos para este nivel. Hemos intentado explicar por qué estos cambios son necesarios o cómo resultan útiles los nuevos comandos. También damos algunos ejemplos de cómo se usan los nuevos comandos. Por supuesto también puedes usar tus propias diapositivas, o abrir Hedy y mostrar a tus alumnos la página web. ¡Lo que tu prefieras para dar las mejores lecciones de Hedy! - title: Introducción text: |- @@ -278,7 +278,7 @@ teacher-guide: text: |- Los nuevos conceptos y comandos pueden ser muy difíciles de entender para algunos alumnos. Por eso es importante enseñar a los alumnos el uso correcto de los nuevos comandos. - Especialmente en los niveles más bajos, donde algunos estudiantes no tienen ninguna experiencia con la programación, puede ser difícil para ellos entender los nuevos conceptos. + Especialmente en los niveles más bajos, donde algunos alumnos no tienen ninguna experiencia con la programación, puede ser difícil para ellos entender los nuevos conceptos. Mostrar muchos ejemplos hace que un concepto (por ejemplo: "¿Qué es una variable?") sea más reconocible y fácil de entender ("Mira, la variable mascota se ha convertido en perro"). Nuestras diapositivas pueden ayudarte con eso. - title: Manos a la obra text: |- @@ -289,14 +289,14 @@ teacher-guide: No siempre tienen que hacer todas las aventuras. Cada aventura contiene un código de ejemplo, que los alumnos pueden probar con el botón verde. El código de ejemplo se copia en el campo de trabajo, donde los alumnos pueden probar el código y ajustarlo para hacerlo suyo. Estimule a sus alumnos para que conviertan el código de ejemplo en sus propios proyectos, añadiendo sus propias ideas y creando su propia variación de la aventura. - - title: Concursos y rompecabezas + - title: Cuestionarios y rompecabezas text: |- Para evaluar si tus alumnos han aprendido toda la nueva información en el nivel, puedes permitirles que hagan un cuestionario. El cuestionario contiene 10 preguntas de respuesta múltiple sobre los nuevos conceptos y comandos de ese nivel. - No todos los niveles tienen un cuestionario aún, ya que aún estamos creando los cuestionarios. - Algunos niveles también contienen puzles. Los puzles muestran al alumno un par de líneas de código que tienen que poner en el orden correcto. + No todos los niveles tienen un cuestionario todavía, ya que aún estamos creando los cuestionarios. + Algunos niveles también contienen rompecabezas. Los rompecabezas muestran al alumno un par de líneas de código que tienen que poner en el orden correcto. - Este video muestra los cuestionarios y los puzles. + Este vídeo muestra los cuestionarios y los rompecabezas. - title: Evaluación text: |- Termina tus lecciones haciendo una pequeña evaluación. ¿Qué aprendieron los alumnos? ¿Qué dificultades encontraron? @@ -309,33 +309,33 @@ teacher-guide: text: "Si desea realizar un seguimiento del progreso de sus alumnos, puede utilizar el panel en vivo. Puede encontrar el tablero en vivo haciendo clic en 'Estadísticas en vivo' en la página de su clase.\n\nTodas las características de este panel se explican a continuación." - title: Selección de nivel text: "\nEn primer lugar, puedes seleccionar los niveles que te gustaría ver en el dahsboard. Selecciona los niveles en los que están trabajando tus alumnos haciendo clic en el número de ese nivel. Deseleccione los niveles que no desee ver haciendo clic de nuevo en ellos.\nEn este ejemplo, los niveles 1 y 2 están seleccionados. Puede hacer clic en Actualizar para actualizar el panel y obtener las estadísticas más recientes." - - title: Descripción general de la clase - text: "\nEn la vista general de la clase puedes ver en qué aventura están trabajando tus alumnos ahora mismo. Puedes ver que un alumno está trabajando en la aventura \"Piedra, papel o tijera\" del nivel 1, otro está trabajando en la aventura \"El adivino\" del nivel 1 y otro está trabajando en la aventura \"Piedra, papel o tijera\" del nivel 2.\nSi quieres saber cuál de tus alumnos está trabajando en la aventura, haz clic en el número y aparecerá el nombre de su cuenta.\nTambién puedes ver cuántos de tus alumnos han terminado la prueba. En este caso, un alumno ha terminado el cuestionario en el nivel 1. De nuevo, puedes hacer clic en el 1 para ver de cuál de tus alumnos se trata.\n\nTambién puede ver que uno de los estudiantes \"falta\" en este resumen. Eso es porque está trabajando en una aventura en el nivel 4, que no está seleccionado." - - title: Lista de estudiantes - text: "\nAquí puedes encontrar una lista de tus estudiantes y puedes ver su progreso individual. El anillo azul te muestra en qué están trabajando actualmente tus alumnos.\n\nEs importante notar que los puntos azules significan que un estudiante 'intentó' la aventura. Esto significa que ejecutaron un código en esta aventura y pasaron a la siguiente aventura, ¡así que esto no significa automáticamente que hayan hecho un buen trabajo!\nSi quieres ver cómo le está yendo a un estudiante en particular, puedes hacer clic en su nombre en esta vista general. Esto es lo que verás si haces clic en marleen_h3a, por ejemplo:\n\nVerás que Marleen está teniendo problemas para programar. Ha intentado ejecutar varias veces un programa que contiene espacios en blanco, por lo que es posible que no se dé cuenta de que tiene que cambiar los ejemplos de código antes de ejecutarlos.\nDe este modo, este resumen puede darte una mejor comprensión de lo que le está costando a un estudiante." + - title: Resumen de la clase + text: "\nEn la vista general de la clase puedes ver en qué aventura están trabajando tus alumnos ahora mismo. Puedes ver que un alumno está trabajando en la aventura \"Piedra, papel o tijera\" del nivel 1, otro está trabajando en la aventura \"El adivino\" del nivel 1 y otro está trabajando en la aventura \"Piedra, papel o tijera\" del nivel 2.\nSi quieres saber cuál de tus alumnos está trabajando en la aventura, haz clic en el número y aparecerá el nombre de su cuenta.\nTambién puedes ver cuántos de tus alumnos han terminado el cuestionario. En este caso, un alumno ha terminado el cuestionario en el nivel 1. De nuevo, puedes hacer clic en el 1 para ver de cuál de tus alumnos se trata.\n\nTambién puede ver que uno de los alumnos \"falta\" en este resumen. Eso es porque está trabajando en una aventura en el nivel 4, que no está seleccionado." + - title: Listado de alumnos + text: "\nAquí puedes encontrar una lista de tus alumnos y puedes ver su progreso individual. El anillo azul te muestra en qué están trabajando actualmente tus alumnos.\n\nEs importante notar que los puntos azules significan que un alumno 'intentó' la aventura. Esto significa que ejecutaron un código en esta aventura y pasaron a la siguiente aventura, ¡así que esto no significa automáticamente que hayan hecho un buen trabajo!\nSi quieres ver cómo le está yendo a un alumno en particular, puedes hacer clic en su nombre en esta vista general. Esto es lo que verás si haces clic en marleen_h3a, por ejemplo:\n\nVerás que Marleen está teniendo problemas para programar. Ha intentado ejecutar varias veces un programa que contiene espacios en blanco, por lo que es posible que no se dé cuenta de que tiene que cambiar los ejemplos de código antes de ejecutarlos.\nDe este modo, este resumen puede darte una mejor comprensión de lo que le está costando a un alumno." - title: Errores comunes - text: "\nSi no sólo está interesado en las dificultades individuales de sus alumnos, sino que también le gustaría saber qué es lo que toda la clase parece estar haciendo mal, puede utilizar esta supervisión de errores comunes.\nLos mensajes de error más comunes que sus estudiantes están recibiendo aparecerán en esta supervisión para usted, para que pueda dar algunas instrucciones más a toda la clase si es necesario.\nAl hacer clic en el error, puede ver qué estudiantes están teniendo problemas con este error. Al hacer clic en resolver, eliminará este error de la lista." + text: "\nSi no sólo está interesado en las dificultades individuales de sus alumnos, sino que también le gustaría saber qué es lo que toda la clase parece estar haciendo mal, puede utilizar esta supervisión de errores comunes.\nLos mensajes de error más comunes que sus alumnos están recibiendo aparecerán en esta supervisión para usted, para que pueda dar algunas instrucciones más a toda la clase si es necesario.\nAl hacer clic en el error, puede ver qué alumnos están teniendo problemas con este error. Al hacer clic en resolver, eliminará este error de la lista." - title: Resumen de programas por aventura text: "\nOtra visión general útil de todos los programas que tus alumnos hicieron en un nivel se puede encontrar en la página de tu clase. Ve a la página de la clase y haz clic en 'Visión general de los programas por aventura'. Aquí encontrarás este resumen.\nPuedes utilizar esta vista general para comprobar el trabajo de tus alumnos. Si han creado un programa en una aventura, aparecerá un ojo en la vista general. Haz clic en el ojo para ver su trabajo. ¿Te ha gustado? Entonces puedes marcar la casilla y aparecerá una marca verde.\nDe esta forma puedes tener una visión general de los resultados de tus alumnos." -- title: Funciones extra de Hedy +- title: Funciones adicionales de Hedy key: funciones subsections: - title: Crea tu propia aventura - text: Para los profesores también es posible crear su propia aventura. Este video te muestra como crear tu propia aventura como un profesor y añadirla a tu(s) clase(s). + text: Para los profesores también es posible crear su propia aventura. Este vídeo te muestra como crear tu propia aventura como un profesor y añadirla a tu(s) clase(s). - title: Aventuras públicas text: |- ¿Te gustaría utilizar aventuras creadas por otros profesores? Entonces puedes visitar nuestra página de aventuras públicas. Aquí puedes encontrar todas las aventuras creadas por otros profesores de todo el mundo. Para encontrar la que mejor se adapte a ti, puedes seleccionar un nivel, un idioma e incluso una etiqueta. ¿Has encontrado una aventura que te gustaría utilizar? Luego puedes presionar "clonar" para hacer una copia de esa aventura en tu propia cuenta. Puedes editar el clon a tu gusto y agregar la aventura a tu clase de la misma manera que lo harías con tus propias aventuras. No puedes editar el original, por lo que el original siempre estará seguro. ¿Has creado una aventura tú mismo que te gustaría agregar a las aventuras públicas? ¡Marca la casilla que hace que tu aventura esté disponible públicamente al crear la aventura! - title: Explorar página - text: "En la página explorar se puede ver el trabajo de otros usuarios de Hedy. Puedes probar sus programas y usarlos como inspiración para crear algo genial.\nTambién puede agregar un programa que ha hecho a la página de exploración usted mismo haciendo clic en 'Guardar y compartir código' en la pantalla de codificación o ir a Mis programas y hacer clic en 'Compartir'.\n ¿Ya no quieres compartir tu trabajo? Simplemente ve a 'Mis programas' y haz clic en 'Unshare'.\nSi desea más información sobre la página de exploración, consulte este vídeo." + text: "En la página explorar se puede ver el trabajo de otros usuarios de Hedy. Puedes probar sus programas y usarlos como inspiración para crear algo genial.\nTambién puede agregar un programa que ha hecho a la página de exploración usted mismo haciendo clic en 'Guardar y compartir código' en la pantalla de codificación o ir a Mis programas y hacer clic en 'Compartir'.\n¿Ya no quieres compartir tu trabajo? Simplemente ve a 'Mis programas' y haz clic en 'Unshare'.\nSi desea más información sobre la página de exploración, consulte este vídeo." - title: Mis logros text: |- Si haces clic en tu nombre de usuario en la esquina superior derecha de la pantalla, podrás ir a Mis logros. En esta página se recogen tus logros. Tus alumnos también tienen una página como esta. Cuando pasas el ratón sobre la insignia, verás cómo conseguirla. También hay insignias ocultas, que tendrás que averiguar por ti mismo cómo obtenerlas. - Si quieres más información sobre los logros, echa un vistazo a este video. + Si quieres más información sobre los logros, echa un vistazo a este vídeo. - title: Mejores Puntuaciones text: |- En esta página puedes ver las mejores puntuaciones de todos los usuarios de Hedy. - En este video puedes aprender más sobre las mejores puntuaciones. + En este vídeo puedes aprender más sobre las mejores puntuaciones. - title: Depurador text: |- ¿No funciona el código de tus alumnos? ¡Debe haber un error (fallo de programación) en él! Puedes usar el depurador para encontrar el fallo. @@ -349,35 +349,35 @@ teacher-guide: El modo programador te permite a ti y tus alumnos usar una pantalla de programación más grande. - title: Fichas de ayuda text: |- - En cada nivel hay un botón con este emoji 🤔. Tú y tus alumnos podéis encontrar allí las "hojas de trucos". En esta hoja de trucos, puedes encontrar todos los comandos que se pueden utilizar en este nivel en su forma correcta. - Así que si has olvidado cómo funciona un comando, ¡simplemente echa un vistazo a la hoja de trucos! - - title: Video + En cada nivel hay un botón con este emoji 🤔. Tú y tus alumnos podéis encontrar allí los "trucos". En estos trucos, podéis encontrar todos los comandos que se pueden utilizar en este nivel en su forma correcta. + Así que si has olvidado cómo funciona un comando, ¡simplemente echa un vistazo a los trucos! + - title: Vídeo text: Este vídeo te muestra aún más funciones de Hedy, como los trucos y el conmutador de las palabras clave. - title: Después de Hedy - key: Después + key: después subsections: - title: ¿Qué hacer después de Hedy? - text: "¡Felicitaciones por finalizar Hedy! Sus estudiantes han aprendido a crear sus propios programas básicos en el lenguaje de programación Python.\nPor supuesto, podrías seguir programando en nuestro compilador Hedy, pero podría ser más emocionante para tus estudiantes transferir a una interfaz \"real\" de Python.\n ¿Te gustaría continuar enseñando Python? Entonces visite la página web de Python para aprender cómo comenzar en otro compilador.\n\nAhora que sus estudiantes tienen un conocimiento básico de programación en general, también puede enseñarles otros lenguajes de programación textual. El lenguaje puede cambiar pero los conceptos no, así que Hedy les dará una gran ventaja." + text: "¡Felicitaciones por finalizar Hedy! Sus alumnos han aprendido a crear sus propios programas básicos en el lenguaje de programación Python.\nPor supuesto, podrías seguir programando en nuestro compilador Hedy, pero podría ser más emocionante para tus alumnos transferir a una interfaz \"real\" de Python.\n¿Te gustaría continuar enseñando Python? Entonces visite la página web de Python para aprender cómo comenzar en otro compilador.\n\nAhora que sus alumnos tienen un conocimiento básico de programación en general, también puede enseñarles otros lenguajes de programación textual. El lenguaje puede cambiar pero los conceptos no, así que Hedy les dará una gran ventaja." - title: Respuestas a los ejercicios key: respuestas intro: |- - Las respuestas a todos los ejercicios se pueden encontrar en el perfil público de la cuenta de usuario 'Hedy_answers'. A menudo alentamos a los estudiantes a usar su propia creatividad en sus respuestas, por lo que estas respuestas son simplemente una guía sobre cómo podría ser una posible respuesta correcta. + Las respuestas a todos los ejercicios se pueden encontrar en el perfil público de la cuenta de usuario 'Hedy_answers'. A menudo alentamos a los alumnos a usar su propia creatividad en sus respuestas, por lo que estas respuestas son simplemente una guía sobre cómo podría ser una posible respuesta correcta. Para ir al perfil 'Hedy_answers', haz clic aquí. - title: Errores frecuentes - key: errores_comunes + key: errores_frecuentes intro: |- - De los errores se aprende, sobre todo en programación. Cometer errores es inevitable y una gran oportunidad para aprender, pero para los profesores puede ser un reto encontrar la solución correcta a un error. Sobre todo porque los programas son cada vez más largos a medida que los alumnos avanzan de nivel. Por eso hemos elaborado una lista con los errores más frecuentes en cada nivel y sus soluciones. + De los errores se aprende, ¡sobre todo en programación! Cometer errores es inevitable y una gran oportunidad para aprender, ¡pero para los profesores puede ser un reto encontrar la solución correcta a un error! Sobre todo porque los programas son cada vez más largos a medida que los alumnos avanzan de nivel. Por eso hemos elaborado una lista con los errores más frecuentes en cada nivel y sus soluciones. levels: - level: '1' sections: - - title: Los estudiantes olvidan escribir los comandos + - title: Los alumnos olvidan escribir los comandos example: error_text: Por ejemplo, escribir una frase sin usar imprimir. error_code: Hedy no puede imprimir esto - solution_text: Enseña a tus estudiantes a siempre comenzar una linea de código con un comando. - solution_code: '{print} Hedy puede imprimir esto!' - - title: Los estudiantes usan mayúsculas al escribir los comandos + solution_text: Enseña a tus alumnos a siempre comenzar una linea de código con un comando. + solution_code: '{print} ¡Hedy puede imprimir esto!' + - title: Los alumnos usan mayúsculas al escribir los comandos example: error_text: Los comandos no funcionarán si están en mayúsculas. error_code: |- @@ -389,15 +389,15 @@ teacher-guide: {print} ¡Porque eliminé las mayúsculas! - title: Alumnos utilizan eco sin preguntar example: - error_text: El comando Echo se utiliza para repetir una respuesta después de un comando ask. Sin ask, echo no hará nada. + error_text: El comando eco se utiliza para repetir una respuesta después de un comando preguntar. Sin preguntar, eco no hará nada. error_code: '{echo} Tu nombre es' - solution_text: Añade un comando ask para que funcione. + solution_text: Añade un comando «pregunta» para que funcione. solution_code: |- {ask} ¿Cómo te llamas? {echo} Tu nombre es - - title: Los alumnos quieren su palabra echo (variable) en el medio de una frase + - title: Los alumnos quieren su palabra eco (variable) en el medio de una frase example: - error_text: Y están en lo cierto! Por eso ellos aprenderán a utilizar variables adecuadas en el siguiente nivel. + error_text: ¡Y tienen razón! Por eso, en el siguiente nivel aprenderán a utilizar las variables adecuadas. error_code: |- {ask} ¿Qué lenguaje de programación es el más divertido? {echo} ¡es el mejor! @@ -405,17 +405,17 @@ teacher-guide: solution_code: |- {ask} ¿Qué lenguaje de programación es el más divertido? {echo} el mejor es... - - title: 'Tortuga: los estudiantes hacen que la tortuga se salga de la pantalla' + - title: 'Tortuga: los alumnos hacen que la tortuga se salga de la pantalla' example: - error_text: A menudo, a los estudiantes les encanta probar números grandes cuando usan la tortuga, lo que hace que la flecha se salga de la pantalla. + error_text: A menudo, a los alumnos les encanta probar números grandes cuando usan la tortuga, lo que hace que la flecha se salga de la pantalla. error_code: |- {forward} 300 {turn} 90 - solution_text: En el ejemplo, los estudiantes tienden a pensar que el comando de giro falló, a pesar de que hizo lo que se suponía que debía hacer. Lo que ocurrió es que la tortuga sobrepasó los límites de la pantalla. Utiliza números más pequeños para evitar que esto ocurra. + solution_text: En el ejemplo, los alumnos tienden a pensar que el comando de giro falló, a pesar de que hizo lo que se suponía que debía hacer. Lo que ocurrió es que la tortuga sobrepasó los límites de la pantalla. Utiliza números más pequeños para evitar que esto ocurra. solution_code: |- {forward} 100 {turn} 90 - - title: 'Tortuga: Los estudiantes usan el comando retroceder, pero no existe.' + - title: 'Tortuga: Los alumnos usan el comando retroceder, pero no existe.' example: error_text: Retroceder no es un comando. error_code: retroceder 100 @@ -423,29 +423,29 @@ teacher-guide: solution_code: '{forward} -100' - level: '2' sections: - - title: Los estudiantes hacen errores de escritura en sus comandos + - title: Los alumnos cometen errores tipográficos en sus comandos example: error_text: Hedy no puede reconocer un comando mal escrito. - error_code: '{print} No hagas errores de escritura' - solution_text: Enseña a tus estudiantes a leer los mensajes de error. De esta forma ellos pueden encontrar por sí solos que es lo que está mal. - solution_code: '{print} ¡No cometas errores tipográficos' - - title: Los estudiantes olvidan que el comando preguntar ha cambiado + error_code: 'prinnt No cometas errores tipográficos' + solution_text: Enseña a tus alumnos a leer los mensajes de error. De esta forma ellos pueden encontrar por sí solos que es lo que está mal. + solution_code: '{print} No cometas errores tipográficos' + - title: Los alumnos olvidan que el comando preguntar ha cambiado example: - error_text: En este nivel, los estudiantes aprender sobre variables. El comando preguntar requiere variables también, peroo los estudiantes olvidan esto. - error_code: preguntar ¿Qué te gustaría comer + error_text: En este nivel, los alumnos aprender sobre variables. El comando preguntar requiere variables también, pero los alumnos olvidan esto. + error_code: preguntar qué te gustaría comer solution_text: En este nivel tienes que decirle a Hedy dónde debe guardar tu respuesta para ser usada luego. Esto se llama una variable. - solution_code: pedir {is} {ask} ¿Qué te gustaría comer + solution_code: pedir {is} {ask} Qué te gustaría comer - title: Los alumnos intentan utilizar el comando `{echo}` example: - error_text: Para algunos estudiantes, puede ser frustrante aprender que el comando `{echo}` ya no funciona. Por eso es muy importante explicar las ventajas de usar variables. ¡Por ejemplo, puedes usar múltiples variables en un código y ponerlas donde quieras en una frase! + error_text: Para algunos alumnos, puede ser frustrante aprender que el comando `{echo}` ya no funciona. Por eso es muy importante explicar las ventajas de usar variables. ¡Por ejemplo, puedes usar múltiples variables en un código y ponerlas donde quieras en una frase! error_code: |- - responder {is} {ask} ¡¿Por qué {echo} ya no funciona?! + respuesta {is} {ask} ¡¿Por qué {echo} ya no funciona?! {echo} solution_text: Usa una variable en su lugar. solution_code: |- respuesta {is} {ask} ¿¡Por qué ya no funciona {echo}?! {print} respuesta - - title: Los estudiantes usan el nombre de una variable o como una palabra normal + - title: Los alumnos usan el nombre de una variable o como una palabra normal example: error_text: En el siguiente ejemplo, se usa la palabra 'nombre' como una variable, pero también como un texto normal. El resultado de este código será 'Hola mi Hedy es Hedy'. error_code: |- @@ -455,25 +455,25 @@ teacher-guide: solution_code: |- nombre {is} Hedy {print} Hola soy nombre - - title: Los estudiantes usan nombres de variables largos que contienen dos palabras. + - title: Los alumnos usan nombres de variables largos que contienen dos palabras. example: - error_text: Las variables deben nombrarse con una sola palabra. Puedes usar un guion bajo (_) para conectar dos palabras. Eso cuenta como una. - error_code: puerta escogida es preguntar ¿Qué puerta eliges + error_text: Una variable debe nombrarse con una palabra. Puede utilizar un guión bajo para unir dos palabras. Eso cuenta como una. + error_code: puerta escogida es preguntar ¿Qué puerta eliges? solution_text: Añade un guion bajo. - solution_code: puerta_elegida {is} {ask} ¿qué puerta escoges - - title: Es posible que los estudiantes usen dos nombres diferentes para la misma variable + solution_code: puerta_elegida {is} {ask} qué puerta escoges + - title: Es posible que los alumnos usen dos nombres diferentes para la misma variable example: - error_text: En este ejemplo, el estudiante ha usado 'horse' y 'name' para la misma variable. + error_text: En este ejemplo, el alumno ha utilizado 'caballo' y 'nombre' para las mismas variables. error_code: |- - caballo {is} {ask} ¿Cómo se llama tu caballo + caballo {is} {ask} Cómo se llama tu caballo {print} Tu caballo se llama nombre solution_text: Comprueba siempre cuando una variable tiene el mismo nombre en todo el código. Las pequeñas diferencias pueden ser difíciles de detectar (por ejemplo los plurales) pero interferirán con tu código. solution_code: |- - nombre {is} {ask} ¿Cómo se llama tu caballo + nombre {is} {ask} Cómo se llama tu caballo {print} Tu caballo se llama nombre - level: '3' sections: - - title: Los estudiantes intentan imprimir listas enteras + - title: Los alumnos intentan imprimir listas enteras example: error_text: No se puede imprimir una lista. Con {at} {random} sólo puedes imprimir un elemento de la lista. error_code: |- @@ -531,9 +531,9 @@ teacher-guide: example: error_text: En una lista los objetos están separados por una coma. error_code: |- - pizzas {is} setas de atún cuatro estaciones + pizas {is} champiñones atún cuatro estaciones {print} pizzas {at} {random} - solution_text: Tras cada objeto de tu lista, debería haber una coma + solution_text: Después de cada elemento de la lista, debe haber una coma solution_code: |- pizzas {is} setas, de atún, cuatro estaciones {print} pizzas {at} {random} @@ -549,7 +549,7 @@ teacher-guide: {print} clubs {at} {random} - title: Los alumnos intentan utilizar añadir/eliminar sin una lista example: - error_text: En el siguiente ejemplo. 'nombres no es una lista, pero sí una variable. No puedes añadirle nada. + error_text: En el ejemplo siguiente 'nombres' no es una lista, sino una variable. No se le puede añadir nada. error_code: |- nombres {is} Jake tu_nombre {is} {ask} ¿Quién eres tú? @@ -561,7 +561,7 @@ teacher-guide: tu_nombre {is} {ask} ¿Quién eres tú? {add} tu_nombre {to} nombres {print} nombres {at} {random} - - title: Los estudiantes olvidan utilizar `{to}`/`{from}` en `{add}`/`{remove}` + - title: Los alumnos olvidan utilizar `{to}`/`{from}` en `{add}`/`{remove}` example: error_text: Sin a/de el comando añadir/borrar no funcionará. error_code: |- @@ -591,7 +591,7 @@ teacher-guide: estado_animo {is} {ask} '¿Cómo estás?' - title: Los alumnos utilizan las comillas equivocadas example: - error_text: Es importante empezar la clase comprobando si los alumnos saben escribir correctamente las comillas. En Hedy, los alumnos pueden utilizar comillas simples ('') y dobles («»). Por otro lado, los puntos suspensivos no se consideran comillas válidas (``). + error_text: Es importante empezar la clase comprobando si los alumnos saben escribir correctamente las comillas. En Hedy, los alumnos pueden utilizar comillas simples ('') y dobles (""). Por otro lado, los puntos suspensivos no se consideran comillas válidas (``). error_code: |- {print} `Bienvenido al restaurante` comida {is} {ask} "¿Qué te gustaría pedir?" @@ -631,9 +631,9 @@ teacher-guide: caballo {is} {ask} 'Cómo se llama tu caballo' {if} caballo {is} Hoguera {print} '¡mola!' {else} {print} '¡no mola tanto!' - - title: Los estudiantes aún olvidan las comillas en ambos lados + - title: Los alumnos siguen olvidando las comillas en ambos lados example: - error_text: El uso del comando `if` puede hacer que las líneas de código sean muy largas y los alumnos tienden a olvidar el uso de las comillas. + error_text: El uso del comando `si` puede hacer que las líneas de código sean muy largas y los alumnos tienden a olvidar el uso de las comillas. error_code: |- {if} nombre {is} Hedy {print} divertido {else} {print} '¡meh! @@ -641,7 +641,7 @@ teacher-guide: solution_code: |- {if} nombre {is} Hedy {print} 'divertido' {else} {print} '¡meh!' - - title: Los estudiantes usan comillas alredeor de los nombres de las variables + - title: Los alumnos usan comillas alrededor de los nombres de las variables example: error_text: En este nivel no hay comillas alrededor de los nombres de variables. error_code: |- @@ -653,9 +653,9 @@ teacher-guide: {else} {print} '¡meh! - title: Los alumnos utilizan nombres de variables largos que contienen dos o más palabras example: - error_text: Las variables en Hedy no pueden contener espacios, por lo que, con el fin de utilizar juntos varias palabras, los estudiantes necesitan para conectarlos utilizando guiones bajos (_) + error_text: Las variables en Hedy no pueden contener espacios, por lo que, con el fin de utilizar juntos varias palabras, los alumnos necesitan para conectarlos utilizando guiones bajos (_) error_code: puerta elegida es preguntar ¿Qué puerta eliges? - solution_text: Añade un guion bajo. + solution_text: Añade un guión bajo. solution_code: puerta_elegida {is} {ask} '¿qué puerta eliges?' - title: Los alumnos quieren varias respuestas correctas example: @@ -754,21 +754,21 @@ teacher-guide: solution_text: 'Este es el código correcto:' solution_code: |- {repeat} 3 {times} - {print} 'hola' + {print} 'hola' - title: Los alumnos sólo repiten 1 línea cuando quieren repetir varias líneas example: error_text: Por ejemplo, en el siguiente código el alumno quiso coger los pedidos de bebida de 3 personas. Pero, en cambio, el programa preguntó 3 veces, pero sólo escribió un pedido. error_code: |- {repeat} 3 {times} - bebida = {ask} '¿Qué quieres beber?' + bebida = {ask} '¿Qué quieres beber?' {print} bebida solution_text: |- En el código correcto la tercera línea empieza también con sangría. Así pertenece al bloque repetir y por tanto se repetirá 3 veces. Enseñar estas diferencias a los alumnos les puede ayudar a entender por qué necesitan sangría para hacer que sus programas funcionen. solution_code: |- {repeat} 3 {times} - bebida = {ask} '¿Qué quieres beber?' - {print} bebida + bebida = {ask} '¿Qué quieres beber?' + {print} bebida - title: Los alumnos quieren anidar sentencias `{if}`, o poner sentencias `{if}` dentro de un bucle example: error_text: |- @@ -777,37 +777,37 @@ teacher-guide: error_code: |- cumpleaños = {ask} '¿Es tu cumpleaños?' {if} cumpleaños = sí - {repeat} 3 {times} - {print} '¡Hip Hip Hurra!' + {repeat} 3 {times} + {print} '¡Hip Hip Hurra!' solution_text: 'Este es el código correcto para este nivel:' solution_code: |- cumpleaños = {ask} '¿Es tu cumpleaños?' {if} cumpleaños = sí - {print} '¡Hip Hip Hurra!' - {print} '¡Hip Hip Hurra!' - {print} '¡Hip Hip Hurra!' + {print} '¡Hip Hip Hurra!' + {print} '¡Hip Hip Hurra!' + {print} '¡Hip Hip Hurra!' - title: Los alumnos hacen programas que tardan demasiado en ejecutar example: error_text: En este nivel es muy fácil hacer programas que tarden mucho en completarse. Si el programa tarda demasiado, se detendrá, esto con la intención de evitar forzar la máquina al alumno. error_code: |- {repeat} 100 {times} - {print} '¿Cuántas veces puedo repetir esto?' + {print} '¿Cuántas veces puedo repetir esto?' solution_text: Asegúrate que el código no tarda mucho en ejecutarse solution_code: |- {repeat} 20 {times} - {print} 'Esto es suficiente' + {print} 'Esto es suficiente' - title: Los alumnos usan el comando `{if}` para comprobar si el valor de la variable es el mismo que el nombre de la variable example: error_text: |- - Hemos observado un error común entre nuestros alumnos: intentan crear un programa que compruebe si hay una contraseña, pero hacen que la contraseña sea 'password'. + Hemos observado un error común entre nuestros alumnos: intentan crear un programa que compruebe si hay una contraseña, pero hacen que la contraseña sea 'contraseña'. En la línea 2 se pide al ordenador que compruebe si la variable contraseña es la misma que la variable contraseña, por lo tanto sí. Lo que significa que la respuesta es siempre sí. Así que con este código la respuesta siempre será 'Puedes entrar' sin importar lo que el jugador rellene. error_code: |- contraseña {is} {ask} '?Cuál es la contraseña?' {if} contraseña {is} contraseña - {print} 'Puedes entrar' + {print} 'Puedes entrar' {else} - {print} 'No puedes entrar' + {print} 'No puedes entrar' solution_text: Puedes arreglar este error añadiendo comillas. Así el ordenador sabe que la segunda contraseña en el `{if} contraseña {is} 'contraseña'` tiene un valor de cadena texto (como texto normal) y no el nombre de la variable. solution_code: |- contraseña {is} {ask} '¿Cuál es la contraseña?' @@ -957,7 +957,7 @@ teacher-guide: sections: - title: Los alumnos confunden los signos < y > example: - error_text: A menudo, los alumnos ya están familiarizados con estos signos de sus clases de matemáticas. Pero si tus alumnos no conocen todavía estos signos, quizá tengan un desafío con esto. + error_text: A menudo, los alumnos ya están familiarizados con estos signos de sus clases de matemáticas. Pero si tus alumnos no conocen todavía estos signos, podrían tener un desafío con esto. error_code: |- edad = {ask} '¿Cuántos años tienes?' {if} edad < 12 @@ -981,7 +981,7 @@ teacher-guide: {print} 'No eres Hedy' - title: Los alumnos olvidan usar el signo == example: - error_text: En este nivel, los alumnos todavía pueden usar el = o es. Pero en otros niveles, o en Python, quizá encuentren problemas por eso. Así que es mejor enseñarles a usarlo. + error_text: En este nivel, los alumnos todavía pueden usar el = o es. Pero en otros niveles, o en Python, podrían tener problemas por eso. Así que es mejor enseñarles a usarlo. error_code: |- nombre = {ask} '¿Cómo te llamas?' {if} nombre = 'Hedy' @@ -1119,9 +1119,9 @@ teacher-guide: {print}('¡Mi nombre es Hedy!') nombre = {input}('¿Cómo te llamas?') {print}('Así que tu nombre es ', nombre) - - title: Los alumnos quizá usen los paréntesis como comillas + - title: Los alumnos pueden utilizar los paréntesis como comillas example: - error_text: Han aprendido a usar las variables fuera de las comillas, así que quizás hagan lo mismo con los paréntesis. Cuál no es la manera correcta de usarlos. + error_text: Han aprendido a usar las variables fuera de las comillas, así que podrían hacer lo mismo con los paréntesis. Lo cuál no es la manera correcta de usarlos. error_code: |- temperatura = 25 {print}('Hay ') temperatura ('grados fuera') @@ -1726,7 +1726,7 @@ workbooks: answer: / lines: '1' - type: texto - contents: '#### ¿Qué te pareció?' + contents: '#### ¿Qué te ha parecido?' - lines: '1' type: pregunta text: ¿Qué ejercicio te ha gustado más de este nivel? diff --git a/content/parsons/es.yaml b/content/parsons/es.yaml index d2b5faefd3e..cc4cfe5dcb0 100644 --- a/content/parsons/es.yaml +++ b/content/parsons/es.yaml @@ -2,7 +2,7 @@ levels: 1: 1: story: |- - Los puzles son ejercicios en los que las líneas de código ya están escritas para ti. Sólo tienes que colocar las líneas en el orden correcto. Arrastra las líneas de código a la pantalla de entrada y ejecuta el código. ¿Puedes hacer que el programa funcione? + Los rompecabezas son ejercicios en los que las líneas de código ya están escritas para ti. Sólo tienes que colocar las líneas en el orden correcto. Arrastra las líneas de código a la pantalla de entrada y ejecuta el código. ¿Puedes hacer que el programa funcione? Eres un cliente de la panadería Hedy. Entras en la panadería y te recibe el panadero. @@ -15,7 +15,7 @@ levels: {echo} Entonces quieres {print} ¡Tu orden está siendo preparada! 2: - story: Estás en la Cabina del DJ pidiendo una canción. Crea un programa que pregunte si estás listo para la fiesta y luego pregunte cuál canción te gustaría escuchar. + story: Estás en la cabina del DJ pidiendo una canción. Crea un programa que pregunte si estás listo para la fiesta y luego pregunte qué canción te gustaría escuchar. code: |- {print} Esta es la DJ Hedy {ask} ¿Estás listo para la fiesta? @@ -24,8 +24,8 @@ levels: 2: 1: story: |- - Tú y tus amigos van a ver Netflix. - ¡Muestra qué película van a ver y deséales a los espectadores que se diviertan mucho! + Tú y tus amigos vais a ver Netflix. + ¡Muestra qué película vais a ver y deséales a los espectadores que se diviertan mucho! code: |- {print} Es hora de una noche de Netflix película {is} Sonic 2: La película @@ -40,7 +40,7 @@ levels: {print} ¡Gracias por comprar con nosotros! 3: 1: - story: "¡Comienza el nuevo curso escolar en Hogwarts! \nEl sombrero seleccionador es el encargado de clasificarte en una de las casas.\n¿En qué casa te van a clasificar? ¿Serás Gryffindor, Hufflepuff, Ravenclaw o Slytherin?\nAntes de que el sombrero clasificador revele tu casa, puedes decirle que no elija una de las casas." + story: "¡Comienza el nuevo curso escolar en Hogwarts! \nEl sombrero seleccionador es el encargado de clasificarte en una de las casas.\n¿En qué casa te van a clasificar? ¿Serás Gryffindor, Hufflepuff, Ravenclaw o Slytherin?\nAntes de que el sombrero seleccionador revele tu casa, puedes decirle que no elija una de las casas." code: |- {print} El sombrero seleccionador está listo para clasificarte en una casa de Hogwarts. casas {is} Gryffindor, Hufflepuf, Ravenclaw, Slytherin @@ -107,7 +107,7 @@ levels: 6: 1: story: |- - Haz un programa que calcule que tan viejo eres en años perros y gatos. + Haz un programa que calcule cómo de viejo eres en años perros y gatos. Primero pregunta la edad del usuario y empieza a calcular. Primero calcula la edad en años perros y luego en años gatos. Muestra al usuario las diferentes edades. @@ -118,7 +118,7 @@ levels: {print} 'En años perros tienes ' edad_perro ' años.' {print} 'En años gatos tienes ' edad_gato ' años.' 2: - story: Crea un programa que te ayude a calcular cuantas tortas deberías comprar para tu fiesta de cumpleaños. + story: Crea un programa que te ayude a calcular cuantos pasteles deberías comprar para tu fiesta de cumpleaños. code: |- {print} '¡Es tu cumpleaños!' personas = {ask} '¿A cuántas personas quieres dar un trozo de tarta?' @@ -148,7 +148,7 @@ levels: {print} equipos {at} {random} {sleep} 2 2: - story: Imprime la cuenta regresiva para un juego de escondidas. + story: Imprime la cuenta atrás para jugar al escondite. code: |- contador = 11 {repeat} 10 {times} @@ -220,7 +220,7 @@ levels: {print} número {sleep} {clear} - {print} '¡Feliz Año Nueva!' + {print} '¡Feliz Año Nuevo!' 2: story: |- Crea un programa que te diga el resultado final de la feria de ciencia. Primero define la variable concursantes, después la variable posición. @@ -243,9 +243,9 @@ levels: ¿Qué haremos con el marinero borracho? ¿Qué haremos con el marinero borracho? Temprano en la mañana - Ella se levanta de un camino de heno - Ella se levanta de un camino de heno - Ella se levanta de un camino de heno + Camino del heno y arriba ella se levanta + Camino del heno y arriba ella se levanta + Camino del heno y arriba ella se levanta Temprano en la mañana code: |- versos = 'Qué haremos con el marinero borracho', 'Ella se levanta de un camino de heno' diff --git a/content/quizzes/kab.yaml b/content/quizzes/kab.yaml index 781eacf766f..e994326ec8c 100644 --- a/content/quizzes/kab.yaml +++ b/content/quizzes/kab.yaml @@ -7,9 +7,12 @@ levels: - option: '`{print}`' feedback: Swaswa! - option: '`azul`' - feedback: Hello isn't a command. + feedback: Azul mačči d taladna. - feedback: With `{ask}`, you can ask a question. option: '`{ask}`' + code: _ Azul + correct_answer: 'B' + question_score: '10' 10: mp_choice_options: - option: Are you ready to go to level 2? @@ -32,7 +35,7 @@ levels: mp_choice_options: - {} - {} - - {} + - feedback: Gedha! - feedback: '`{echo}` yettales-d tiririt ɣef usteqsi-k.' question_score: '10' hint: Tzemreḍ ad tessutreḍ kra s tladna `{ask}` @@ -47,6 +50,20 @@ levels: feedback: D tuccḍa, wali akken ilaq! hint: Izirig 1 yettban ur iseḥḥa ara question_text: D acu-t wugur n tengalt-a? + 8: + mp_choice_options: + - {} + - {} + - feedback: D amahil igerrzen! + - feedback: Ayagi d arameɣtu... + 7: + hint: Senqed tangalt izirig s yizirig + mp_choice_options: + - {} + - {} + - {} + - feedback: Swaswa! + correct_answer: D 9: 10: mp_choice_options: @@ -57,3 +74,14 @@ levels: feedback: Izirig wis 2 ilaq ad ibdu s 4 - option: izirig wis 2 ilaq ad ibdu s 4 tallunin akked yizirig wis 3 s 8 hint: Izirig amezwaru ur ilaq ara ad ibdu s tallunin + 17: + 9: + correct_answer: C + hint: Γeṛ tangalt s leεqel. + question_score: '10' + 8: + mp_choice_options: + - feedback: Ԑreḍ tikkelt niḍen. + option: '`{or}` ur tezmir ara ad tettwaseqdec akked `{if}`.' + 10: + question_text: Acu i d ugur s tengalt-a? diff --git a/content/slides/es.yaml b/content/slides/es.yaml index ad56f4626c0..e230b522487 100644 --- a/content/slides/es.yaml +++ b/content/slides/es.yaml @@ -12,7 +12,7 @@ levels: 3: header: Lenguaje de programación text: |- - ¿Quizá ya conoces algunos lenguajes de programación? + ¿Quizá ya conozcas algunos lenguajes de programación? Algunos ejemplos son: * Scratch * Python @@ -89,13 +89,13 @@ levels: {echo} hola header: '{echo}' 6: - header: ¡Programando! + header: ¡Programación! text: |- Con `{print}`, `{ask}` y `{echo}` ya puedes crear una pequeña historia. Este es un buen momento para probar las aventuras Loro, Cuento y Piedra, papel o tijera. editor: /hedy/1 7: - header: ¡Programando! + header: ¡Programación! text: Las aventuras se muestran en pestañas. editor: /hedy/1 8: @@ -266,7 +266,7 @@ levels: code: '{print} ''¡imprimir con comillas!''' 2: header: Problema - text: 'En los niveles anteriores, quizá te hayas encontrado este problema:' + text: 'En los niveles anteriores, puede que te hayas encontrado este problema:' code: |- nombre {is} Sophie {print} Mi nombre es nombre @@ -355,7 +355,7 @@ levels: nombre {is} {ask} '¿Cómo te llamas?' {if} nombre {is} Hedy {print} 'genial' 3: - header: No te olvides imprimir + header: No te olvides de imprimir text: |- Al usar el comando `{if}`, no te olvides de usar el comando `{print}`. ¡Este código no funcionará! diff --git a/content/tutorials/es.yaml b/content/tutorials/es.yaml index 935cbd2877a..05408154663 100644 --- a/content/tutorials/es.yaml +++ b/content/tutorials/es.yaml @@ -10,10 +10,10 @@ intro: title: La ventana de salida text: El resultado del código que ejecutes va a ser mostrado aquí, ¡acabas de crear esto! 4: - title: El código de ejecución + title: El botón de ejecución text: ¡Con este botón puedes ejecutar tu programa! ¿Deberíamos intentarlo en el próximo paso? 5: - title: ¡Inténtalo! + title: ¡Pruébalo! text: Ejecuta el programa, haz click en 'siguiente paso' cuando termines. 6: title: Lee tu programa en voz alta @@ -31,10 +31,10 @@ intro: title: Aventuras text: Las otras pestañas contienen aventuras, las cuáles puedes programar para cada nivel. Van de las más fácil a la más difícil. 11: - title: Puzles - text: ¿Crees que entienden el nivel bastante bien? ¡Intenta los puzles! Tendrás las líneas de código en el orden equivocado, arregla el orden del programa para hacer que se pueda ejecutar. + title: Rompecabezas + text: ¿Crees que entienden el nivel bastante bien? ¡Prueba los rompecabezas! Tendrás líneas de código en el orden equivocado, arregla el orden del programa para hacer que funcione. 12: - text: Al final de cada nivel puedes tomar el quiz. De esta forma puedes verificar si entiendes todo. + text: Al final de cada nivel puedes hacer el cuestionario. De esta forma puedes verificar si entiendes todo. title: Cuestionario 13: title: Guardar y compartir @@ -51,14 +51,14 @@ teacher: title: ¡Bienvenido a Hedy! text: En este tutorial vamos a explicar todas las características de Hedy paso a paso. 2: - title: Manejo de clases - text: Como profesor puedes crear clases e invitar estudiantes o dejarlos unirse mediante un enlace. Puedes ver los programas y estadísticas de todos tus estudiantes. + title: Gestión de clases + text: Como profesor puedes crear clases e invitar a alumnos o dejar que se unan mediante un enlace. Puedes ver los programas y estadísticas de todos tus alumnos. 3: title: Personalizar clases text: Puedes personalizar clases escondiendo niveles y/o aventuras específicas, así como hacerlas disponibles en una fecha específica. 4: title: Creando aventuras - text: Puedes crear tus propias aventuras y usarlas como tareas para tus estudiantes. Créalas aquí y agrégalas a tus clases in la sección de personalización de clases. + text: Puedes crear tus propias aventuras y usarlas como tareas para tus alumnos. Créalas aquí y agrégalas a tus clases en la sección de personalización de clases. 5: title: Creando cuentas text: Puedes crear múltiples cuentas de una vez, solamente necesitas proveer un nombre de usuario y una contraseña. También puedes agregar directamente estas cuentas a una de tus clases. diff --git a/static/js/appbundle.js b/static/js/appbundle.js index fcf1c5a4918..49f3690c9d7 100644 --- a/static/js/appbundle.js +++ b/static/js/appbundle.js @@ -61138,7 +61138,7 @@ ${o3}` : i3; "Empty_output": "Este c\xF3digo funciona pero no imprime nada. Agrega un comando print a tu c\xF3digo o usa una tortuga para mostrar el resultado.", "Errors_found": "\xA1Has cometido un error! No te preocupes, seguimos ejecutando el programa", "Execute_error": "Algo sali\xF3 mal mientras se ejecutaba el programa.", - "Other_error": "\xA1Ups! Quiz\xE1s hemos cometido un peque\xF1o error.", + "Other_error": "\xA1Ups! Tal vez cometimos un peque\xF1o error.", "Program_repair": "Este podr\xEDa ser c\xF3digo correcto, \xBFlo puedes arreglar?", "Program_too_long": "Tu programa toma demasiado tiempo en ejecutarse.", "ServerError": "Escribiste un programa que no esper\xE1bamos. Si quieres ayudar, env\xEDanos un email con el nivel y tu programa a hello@hedy.org. Mientras tanto, intenta algo un poco diferente y \xE9chale otro vistazo a los ejemplos. \xA1Gracias!", @@ -61168,7 +61168,7 @@ ${o3}` : i3; "selected": "Seleccionado", "songs": "\u{1F3B5},\u{1F3B6}", "successful_runs": "Ejecuciones exitosas: {successful_runs}", - "teacher_welcome": "\xA1Bienvenido/a a Hedy! Tu cuenta es de tipo profesor, por lo que puedes crear clases e invitar estudiantes.", + "teacher_welcome": "\xA1Bienvenido/a a Hedy! Ahora eres el orgulloso due\xF1o de una cuenta de profesor, lo que te permite crear clases e invitar a alumnos.", "turtle": "\u{1F422}", "unsaved_class_changes": "Hay cambios sin guardar, \xBFest\xE1s seguro de que quieres abandonar esta p\xE1gina?" }, diff --git a/static/js/appbundle.js.map b/static/js/appbundle.js.map index 4f2915f2684..36d762972c6 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(/