Source document http://teachtogether.tech/

Cómo crear y entregar lecciones que funcionen y construir una comunidad docente a su alrededor

Greg Wilson

Taylor & Francis, 2019, 978-0-367-35328-5

Dedicatoria

Para mi madre, Doris Wilson, quien enseñó a cientos de niños a leer y creer en sí mismos. Y para mi hermano Jeff, que no vivió para verlo terminado. “Recuerda, todavía tienes muchos buenos momentos frente a ti”. Todas las regalías de la venta de este libro se donan a las carpinterías, una organización de voluntarios que enseña habilidades básicas de codificación y ciencia de datos a investigadores de todo el mundo.

Las reglas

  1. Sé amable: todo lo demás son detalles.
  2. Recuerda que no eres tu alumno …
  3. … que la mayoría de la gente prefiere fallar que cambiar …
  4. … y ese noventa por ciento de magia consiste en saber una cosa extra.
  5. Nunca enseñes solo.
  6. Nunca dudes en sacrificar la verdad por la claridad.
  7. Haz de cada error una lección.
  8. Recuerde que ninguna lección sobrevive al primer contacto con los alumnos …
  9. … que cada lección es demasiado corta para el profesor y demasiado larga para el alumno …
  10. … y que nadie estará más entusiasmado con la lección que tú.

Introducción

Los grupos de base han surgido en todo el mundo para enseñar programación, diseño web, robótica y otras habilidades a los estudiantes de campo libre. Estos grupos existen para que las personas no tengan que aprender estas cosas por su cuenta, pero irónicamente, sus fundadores y maestros a menudo se enseñan a sí mismos cómo enseñar.

Hay una mejor manera. Así como conocer algunos datos básicos sobre gérmenes y nutrición puede ayudarlo a mantenerse saludable, conocer algunas cosas sobre psicología cognitiva, diseño de instrucción, inclusión y organización comunitaria puede ayudarlo a ser un maestro más efectivo. Este libro presenta ideas clave que puede usar en este momento, explica por qué creemos que son verdaderas y le señala otros recursos que lo ayudarán a llegar más lejos.

Reutilizar

Partes de este libro se crearon originalmente para el programa de capacitación de instructores de Carpintería de software, y todo se puede distribuir y reutilizar libremente bajo la licencia Creative Commons Attribution-NonCommercial 4.0 (Apéndice 16). Puede usar la versión en línea en http://teachtogether.tech/ en cualquier clase (gratuita o de pago), y puede citar extractos breves en virtud de las disposiciones de uso justo, pero no puede volver a publicar grandes piezas en obras comerciales sin permiso previo.

Las contribuciones, correcciones y sugerencias son bienvenidas, y todos los contribuyentes serán reconocidos cada vez que se publique una nueva versión. Consulte el Apéndice 18 para más detalles y el Apéndice 17 para nuestro código de conducta.

¿Quienes somos?

La Sección 6.1 explica cómo descubrir quiénes son sus alumnos. Los cuatro para los que sirve este libro son todos maestros de usuarios finales: la enseñanza no es su ocupación principal, tienen poca o ninguna experiencia en pedagogía y pueden trabajar fuera de las aulas institucionales.

Emily

Se formó como bibliotecario y ahora trabaja como diseñador web y gerente de proyectos en una pequeña empresa de consultoría. En su tiempo libre, ella ayuda a organizar clases de diseño web para mujeres que ingresan a la tecnología como una segunda carrera. Ahora está reclutando colegas para impartir más clases en su área, y quiere saber cómo hacer lecciones que otros puedan usar y hacer crecer una organización de enseñanza voluntaria.

Moshe

Es un programador profesional con dos hijos adolescentes cuya escuela no ofrece clases de programación. Se ha ofrecido como voluntario para dirigir un club de programación mensual después de la escuela, y aunque frecuentemente hace presentaciones a colegas, no tiene experiencia en el aula. Quiere aprender a construir lecciones efectivas en un tiempo razonable y le gustaría saber más sobre los pros y los contras de las clases en línea a su propio ritmo.

Samira

Es un estudiante universitario en robótica que está pensando en convertirse en maestra después de graduarse. Ella quiere ayudar en los talleres de robótica de fin de semana para sus compañeros, pero nunca ha enseñado una clase antes y siente mucho síndrome de impostor. Quiere aprender más sobre educación en general para decidir si es para ella, y también está buscando consejos específicos para ayudarla a impartir lecciones de manera más efectiva.

Gene

Es profesor de informática. Han estado impartiendo cursos de pregrado sobre sistemas operativos durante seis años, y cada vez más creen que tiene que haber una mejor manera. La única capacitación disponible a través del centro de enseñanza y aprendizaje de su universidad consiste en publicar tareas y presentar calificaciones en el sistema de gestión de aprendizaje en línea, por lo que quieren saber qué más deberían pedir. Estas personas tienen una variedad de antecedentes técnicos y alguna experiencia docente previa, pero no tienen capacitación formal en enseñanza, diseño de lecciones u organización comunitaria. La mayoría trabaja con estudiantes de rango libre y se enfoca en adolescentes y adultos en lugar de niños; Todos tienen tiempo y recursos limitados. Esperamos que nuestro cuarteto use este material de la siguiente manera:

Emily Participará en un grupo semanal de lectura en línea con sus voluntarios.

Moshe Cubrirá parte de este libro en un taller de fin de semana de un día y estudiará el resto por su cuenta.

Samira Utilizará este libro en un curso de pregrado de un semestre con tareas, un proyecto y un examen final.

Gene Leerá el libro solo en su oficina o mientras viaja, deseando todo el tiempo que las universidades hagan más para apoyar la enseñanza de alta calidad.

Qué leer en su lugar

Si tiene prisa o quiere saber qué cubrirá este libro, [Brow2018] presenta diez consejos basados en la evidencia para enseñar computación. También puedes disfrutar de:

  • La capacitación de instructores de carpintería, de la cual se deriva este libro.

  • [Lang2016] y [Hust2012], que son breves y accesibles, y que conectan las cosas que puede hacer ahora mismo con la investigación que las respalda.

  • [Berg2012, Lemo2014, Majo2015, Broo2016, Rice2018, Wein2018b] están llenos de sugerencias prácticas sobre las cosas que puede hacer en su clase, pero pueden tener más sentido una vez que tenga un marco para comprender por qué funcionan sus ideas.

  • [DeBr2015], que explica lo que es verdad sobre la educación al explicar lo que no es, y [Dida2016], que fundamenta la teoría del aprendizaje en psicología cognitiva.

  • [Pape1993], que sigue siendo una visión inspiradora de cómo las computadoras pueden cambiar la educación. La excelente descripción de Amy Ko hace un mejor trabajo al resumir las ideas de Papert de lo que posiblemente podría, y [Craw2010] es un compañero estimulante para ambos.

  • [Gree2014, McMi2017, Watt2014] explican por qué tantos intentos de reforma educativa han fracasado en los últimos cuarenta años, cómo las universidades con fines de lucro están explotando y exacerbando la creciente desigualdad en nuestra sociedad, y cómo la tecnología ha fallado repetidamente en revolucionar la educación.

  • [Brow2007] y [Mann2015], porque no puedes enseñar bien sin cambiar el sistema en el que enseñamos, y no puedes hacerlo solo.

Aquellos que quieran más material académico también pueden encontrar [Guzd2015a, Hazz2014, Sent2018, Finc2019, Hpl2018] gratificante, mientras que el blog de Mark Guzdial ha sido consistentemente informativo y estimulante.

Agradecimientos

Este libro no existiría sin las contribuciones de Laura Acion, Jorge Aranda, Mara Averick, Erin Becker, Yanina Bellini Saibene, Azalee Bostroem, Hugo Bowne-Anderson, Neil Brown, Gerard Capes, Francis Castro, Daniel Chen, Dav Clark, Warren Code , Ben Cotton, Richie Cotton, Karen Cranston, Katie Cunningham, Natasha Danas, Matt Davis, Neal Davis, Mark Degani, Tim Dennis, Paul Denny, Michael Deutsch, Brian Dillingham, Grae Drake, Kathi Fisler, Denae Ford, Auriel Fournier, Bob Freeman, Nathan Garrett, Mark Guzdial, Rayna Harris, Ahmed Hasan, Ian Hawke, Felienne Hermans, Kate Hertweck, Toby Hodges, Roel Hogervorst, Mike Hoye, Dan Katz, Christina Koch, Shriram Krishnamurthi, Katrin Leinweber, Colleen Lewis, Dave Loyall, Paweł Marczewski, Lenny Markus, Sue McClatchy, Jessica McKellar, Ian Milligan, Julie Moronuki, Lex Nederbragt, Aleksandra Nenadic, Jeramia Ory, Joel Ostblom, Elizabeth Patitsas, Aleksandra Pawlik, Sorawee Porncharoenwase, Emily Porta, Alex Pounds, Thomas Price Inn, Ian Ragsdale, Erin Robinson, Rosario Robinson, Ariel Rokem, Pat Schloss, Malvika Sharan, Florian Shkurti, Dan Sholler, Juha Sorva, Igor Steinmacher, Tracy Teal, Tiffany Timbers, Richard Tomsett, Preston Tunnell Wilson, Matt Turk, Fiona Tweedie , Martin Ukrop, Anelda van der Walt, Stéfan van der Walt, Allegra Via, Petr Viktorin, Belinda Weaver, Hadley Wickham, Jason Williams, Simon Willison, Karen Word, John Wrenn y Andromeda Yelton. También estoy agradecido a Lukas Blakk por el logotipo, a Shashi Kumar por la ayuda de LaTeX, a Markku Rontu por hacer que los diagramas se vean mejor, y a todos los que han usado este material a lo largo de los años. Cualquier error que quede es mío.

Ejercicios

Cada capítulo finaliza con una variedad de ejercicios que incluyen un formato sugerido y cuánto tiempo suelen llevar en persona. La mayoría se puede usar en otros formatos, en particular, si está leyendo este libro por su cuenta, aún puede hacer muchos de los ejercicios destinados a grupos, y siempre puede dedicar más tiempo a lo que se sugiere.

Si está utilizando este material en un taller de capacitación de maestros, puede dar los ejercicios a continuación a los participantes con uno o dos días de anticipación para tener una idea de quiénes son y cómo puede ayudarlos mejor. Lea las advertencias en la Sección 9.4 antes de hacer esto.

Altas y bajas (toda la clase / 5)

Escriba respuestas breves a las siguientes preguntas y compártalas con sus compañeros. (Si está tomando notas juntas en línea como se describe en la Sección 9.7, ponga sus respuestas allí).

¿Cuál es la mejor clase o taller que hayas tomado? ¿Qué lo hizo tan bueno?

¿Cuál fue el peor? ¿Qué lo hizo tan malo?

Conócete a ti mismo (toda la clase / 10)

Comparta breves respuestas a las siguientes preguntas con sus compañeros. Registre sus respuestas para que pueda consultarlas a medida que avance en el resto de este libro.

¿Qué es lo que más quieres enseñar?

¿A quién más quieres enseñar?

¿Por qué quieres enseñar?

¿Cómo sabrás si estás enseñando bien?

¿Qué es lo que más quieres aprender sobre la enseñanza y el aprendizaje?

¿Cuál es una cosa específica que crees que es verdad acerca de la enseñanza y el aprendizaje?

¿Por qué aprender a programar? (individual / 20)

Los políticos, los líderes empresariales y los educadores a menudo dicen que las personas deberían aprender a programar porque los trabajos del futuro lo requerirán. Sin embargo, como señaló Benjamin Doxtdator, muchas de esas afirmaciones se basan en un terreno inestable. Incluso si fueran ciertas, la educación no debería preparar a las personas para los trabajos del futuro: debería darles el poder de decidir qué tipo de trabajos hay y garantizar que esos trabajos valgan la pena. Y como señala Mark Guzdial, en realidad hay muchas razones para aprender a programar:

  1. Para entender nuestro mundo.

  2. Estudiar y comprender procesos.

  3. Poder hacer preguntas sobre las influencias en sus vidas.

  4. Usar una nueva forma importante de alfabetización.

  5. Tener una nueva forma de aprender arte, música, ciencias y matemáticas.

  6. Como una habilidad laboral.

  7. Para usar mejor las computadoras.

  8. Como medio para aprender a resolver problemas.

Dibuje una cuadrícula de 3 × 3 cuyos ejes estén etiquetados como “bajo”, “medio” y “alto” y coloque cada razón en un sector de acuerdo con lo importante que es para usted (el eje X) y para las personas que planea enseñar. (el eje Y).

  1. ¿Qué puntos están estrechamente alineados en importancia (es decir, en la diagonal en su cuadrícula)?

  2. ¿Qué puntos están desalineados (es decir, en las esquinas fuera de la diagonal)?

  3. ¿Cómo debería afectar esto lo que enseñas?

Modelos mentales y evaluación formativa

La primera tarea en la enseñanza es descubrir quiénes son sus alumnos. Nuestro enfoque se basa en el trabajo de investigadores como Patricia Benner, quienes estudiaron cómo las enfermeras progresan de principiantes a expertos [Benn2000]. Benner identificó cinco etapas de desarrollo cognitivo que la mayoría de las personas atraviesan de manera bastante consistente. Para nuestros propósitos, simplificaremos esta progresión a tres etapas:

Novicios

No saben lo que no saben, es decir, todavía no tienen un modelo mental utilizable del dominio del problema.

Practicantes competentes

tener un modelo mental que sea adecuado para los propósitos cotidianos. Pueden realizar tareas normales con un esfuerzo normal en circunstancias normales y comprender los límites de su conocimiento (es decir, saben lo que no saben).

Expertos

tienen modelos mentales que incluyen excepciones y casos especiales, lo que les permite manejar situaciones que están fuera de lo común. Discutiremos la experiencia con más detalle en el Capítulo 3.

Entonces, ¿qué es un modelo mental? Como su nombre indica, es una representación simplificada de las partes más importantes de algún dominio de problemas que es lo suficientemente buena como para permitir la resolución de problemas. Un ejemplo son los modelos de moléculas de bola y resorte utilizados en la química de la escuela secundaria. Los átomos no son en realidad bolas, y sus enlaces no son en realidad resortes, pero el modelo permite a las personas razonar sobre los compuestos químicos y sus reacciones. Un modelo más sofisticado de un átomo tiene una pequeña bola central (el núcleo) rodeada de electrones en órbita. También está mal, pero la complejidad adicional permite a las personas explicar más y resolver más problemas. (Al igual que el software, los modelos mentales nunca se terminan: solo se usan).

Presentar a un novato con un montón de hechos es contraproducente porque todavía no tienen un modelo para encajar esos hechos. De hecho, presentar demasiados hechos demasiado pronto puede reforzar el modelo mental incorrecto que han improvisado. Como [Mull2007a] observó en un estudio de instrucción en video para estudiantes de ciencias:

Los estudiantes tienen ideas existentes sobre … fenómenos antes de ver un video. Si el video presenta … conceptos de una manera clara y bien ilustrada, los estudiantes creen que están aprendiendo, pero no se involucran con los medios en un nivel lo suficientemente profundo como para darse cuenta de que lo que se presenta difiere de su conocimiento previo … Sin embargo, hay esperanza. Presentar los conceptos erróneos comunes de los estudiantes en un video junto con los … conceptos ha demostrado que aumenta el aprendizaje al aumentar la cantidad de esfuerzo mental que los estudiantes gastan mientras lo ven.

Por lo tanto, su objetivo al enseñar a los novatos debe ser ayudarlos a construir un modelo mental para que tengan un lugar donde poner los hechos. Por ejemplo, la lección de Software Carpentry sobre el shell de Unix introduce quince comandos en tres horas. Ese es un comando cada doce minutos, que parece glacialmente lento hasta que te das cuenta de que el verdadero propósito de la lección no es enseñar esos quince comandos: es enseñar rutas, historia, finalización de tabulaciones, comodines, tuberías, argumentos de línea de comandos y redirección. Los comandos específicos no tienen sentido hasta que los novatos entiendan esos conceptos; Una vez que lo hacen, pueden comenzar a leer las páginas del manual, buscar las palabras clave correctas en la web y saber si los resultados de sus búsquedas son útiles o no.

Las diferencias cognitivas entre los principiantes y los profesionales competentes apuntalan las diferencias entre dos tipos de materiales didácticos. Un tutorial ayuda a los recién llegados a un campo a construir un modelo mental; un manual, por otro lado, ayuda a los profesionales competentes a llenar los vacíos en su conocimiento. Los tutoriales frustran a los profesionales competentes porque se mueven muy lentamente y dicen cosas que son obvias (aunque para los principiantes no son obvias) Igualmente, los manuales frustran a los principiantes porque usan jerga y no explican las cosas. Este fenómeno se llama efecto de reversión de experiencia [Kaly2003], y es una de las razones por las que tiene que decidir temprano para quién son sus lecciones.

Un puñado de excepciones

Una de las razones por las que Unix y C se hicieron populares es que [Kern1978, Kern1983, Kern1988] de alguna manera se las arreglaron para ser buenos tutoriales y buenos manuales al mismo tiempo. [Fehi2008] y [Ray2014] se encuentran entre los pocos libros de computación que logran esta; incluso después de releerlos varias veces, no sé cómo lo lograron.

¿Están aprendiendo las personas?

Mark Twain escribió una vez: “No es lo que no sabes lo que te mete en problemas. Es lo que sabes con certeza que no es así”. Por lo tanto, uno de los ejercicios para construir un modelo mental es eliminar las cosas que no pertenecen. En términos generales, los conceptos erróneos de los novatos se dividen en tres categorías:

Errores de hecho Como creer que Vancouver es la capital de la Columbia Británica (es Victoria). Estos suelen ser fáciles de corregir.

Modelos rotos Como creer que el movimiento y la aceleración deben estar en la misma dirección. Podemos abordar esto haciendo que los novatos razonen a través de ejemplos en los que sus modelos dan la respuesta incorrecta.

Creencias fundamentales Como “el mundo tiene solo unos pocos miles de años” o “algunos tipos de personas son naturalmente mejores en programación que otros” [Guzd2015b, Pati2016]. Estos errores a menudo están profundamente conectados con la identidad social del alumno, por lo que resisten la evidencia y racionalizan las contradicciones.

Las personas aprenden más rápido cuando los maestros identifican y aclaran las ideas falsas de los alumnos a medida que se imparte la lección. Esto se llama evaluación formativa porque forma (o moldea) la enseñanza mientras se lleva a cabo. Los alumnos no aprueban ni reproban la evaluación formativa; en su lugar, brinda retroalimentación tanto al maestro como al alumno sobre qué tan bien lo están haciendo y en qué deben enfocarse a continuación. Por ejemplo, un profesor de música podría pedirle a un alumno que toque una escala muy lentamente para controlar su respiración. El alumno descubre si está respirando correctamente, mientras que el maestro recibe comentarios sobre si la explicación que acaba de dar tiene sentido.

¿Están aprendiendo las personas?

Mark Twain escribió una vez: “No es lo que no sabes lo que te mete en problemas. Es lo que sabes con certeza que no es así”. Por lo tanto, uno de los ejercicios para construir un modelo mental es eliminar las cosas que no pertenecen. En términos generales, los conceptos erróneos de los novatos se dividen en tres categorías:

Resumiendo

El contrapunto a la evaluación formativa es la evaluación sumativa, que tiene lugar al final de la lección. La evaluación sumativa es como una prueba de manejo: le dice al alumno si ha dominado el tema y al maestro si su lección fue exitosa. Una forma de pensar en la diferencia es que un chef que prueba la comida mientras la cocina es evaluaciones formativas, pero los invitados que la prueban una vez que se sirve es sumativa.

Desafortunadamente, la escuela ha capacitado a la mayoría de las personas para que crean que toda evaluación es sumativa, es decir, que si algo se siente como una prueba, un mal desempeño contará en su contra. Hacer que las evaluaciones formativas se sientan informales ayuda a reducir esta ansiedad; En mi experiencia, el uso de cuestionarios en línea, clics o cualquier otra cosa parece aumentarlo, ya que la mayoría de las personas creen que todo lo que hacen en la web se está viendo y grabando.

Para ser útil durante la enseñanza, una evaluación formativa debe ser rápida de administrar (para que no interrumpa el flujo de la lección) y tener una respuesta correcta inequívoca (para que pueda usarse con grupos). El tipo de evaluación formativa más utilizado es probablemente la pregunta de opción múltiple (MCQ). Muchos maestros tienen una baja opinión de ellos, pero cuando están bien diseñados, pueden revelar mucho más que solo si alguien conoce hechos específicos. Por ejemplo, suponga que está enseñando a los niños cómo hacer una suma de varios dígitos [Ojos2015] y les da esta MCQ:

What is 37 + 15?

  1. 52
  2. 42
  3. 412
  4. 43

La respuesta correcta es 52, pero las otras respuestas proporcionan información valiosa:

  • Si el niño elige 42, no entiende lo que significa “cargar”. (Ella bien podría escribir 12 como las respuestas a 7 + 5, luego sobrescribir el 1 con el 4 que obtiene de 3 + 1).

  • Si elige 412, está tratando cada columna de números como un problema separado. Esto todavía está mal, pero está mal por una razón diferente.

  • Si elige 43, entonces sabe que tiene que cargar el 1, pero lo está llevando de vuelta a la columna de la que proviene. Nuevamente, este es un error diferente y requiere una explicación clarificadora diferente del maestro.

Cada una de estas respuestas incorrectas es un distractor plausible con poder de diagnóstico. Un distractor es una respuesta incorrecta o menos que mejor; “Plausible” significa que parece que podría ser correcto, mientras que “poder de diagnóstico” significa que cada uno de los distractores ayuda al maestro a descubrir qué explicar junto a ese alumno en particular.

La difusión de las respuestas a una evaluación formativa guía lo que haces a continuación. Si suficiente de la clase tiene la respuesta correcta, sigue adelante. Si la mayoría de la clase elige la misma respuesta incorrecta, debe regresar y trabajar para corregir el error que señala el distractor. Si sus respuestas se dividen equitativamente entre varias opciones, probablemente solo estén adivinando, por lo que debe respaldar y volver a explicar la idea de una manera diferente. (Repetir exactamente la misma explicación probablemente no sea útil, lo cual es una de las cosas que hace que muchos cursos de video sean pedagógicamente ineficaces).

¿Qué pasa si la mayoría de la clase vota por la respuesta correcta pero algunos votan por la incorrecta? En ese caso, debe decidir si debe pasar tiempo atrapando a la minoría o si es más importante mantener a la mayoría comprometida. No importa cuán duro trabaje o qué prácticas de enseñanza use, no siempre podrá brindar a todos lo que necesitan; es su responsabilidad como maestro hacer la llamada.

¿De dónde vienen las respuestas incorrectas?

Para encontrar distractores plausibles, piense en las preguntas que hicieron sus alumnos o en los problemas que tuvieron la última vez que enseñó esta materia. Si no lo ha enseñado antes, piense en sus propios conceptos erróneos, pregunte a sus colegas sobre sus experiencias o mire la historia de su campo: si todos entendieron mal su tema de alguna manera hace cincuenta años, lo más probable es que muchos de sus los estudiantes todavía lo entenderán mal de esa manera hoy. También puede hacer preguntas abiertas en clase para recopilar ideas erróneas sobre el material que se cubrirá en una clase posterior, o consultar sitios de preguntas y respuestas como Quora o Stack Overflow para ver con qué se confunden las personas que aprenden el tema en otra parte.

El desarrollo de evaluaciones formativas mejora sus lecciones porque lo obliga a pensar en los modelos mentales de sus alumnos. En mi experiencia, una vez que hago esto, escribo automáticamente la lección para cubrir los vacíos y errores más probables. Por lo tanto, las evaluaciones formativas dan sus frutos incluso si no se utilizan (aunque la enseñanza es más efectiva si lo son).

Las MCQ no son el único tipo de evaluación formativa: el Capítulo 12 describe otros tipos de ejercicios que son rápidos e inequívocos. Lo que elija, debe hacer algo que tome uno o dos minutos cada 10–15 minutos para asegurarse de que sus alumnos realmente estén aprendiendo. Este ritmo no se basa en un límite de atención intrínseco: [Wils2007] encontró poco apoyo para la afirmación repetida a menudo de que los alumnos solo pueden prestar atención durante 10-15 minutos. En cambio, la directriz asegura que si un número significativo de personas se ha quedado atrás, solo tiene que repetir una pequeña parte de la lección. Las evaluaciones formativas frecuentes también mantienen a los alumnos interesados, especialmente si involucraron discusiones en grupos pequeños (Sección 9.2).

Las evaluaciones formativas también se pueden usar antes de las lecciones. Si comienza una clase con un MCQ y todos responden correctamente, puede evitar explicar algo que sus alumnos ya saben. Este tipo de enseñanza activa te da más tiempo para concentrarte en cosas que no saben. También muestra a los alumnos que respetas su tiempo lo suficiente como para no desperdiciarlo, lo que ayuda con la motivación (Capítulo 10).

Inventarios conceptuales

Con suficientes datos, las MCQ pueden hacerse sorprendentemente precisas. El ejemplo más conocido es el Force Concept Inventory [Hest1992], que evalúa la comprensión de la mecánica newtoniana básica. Al entrevistar a un gran número de encuestados, correlacionar sus conceptos erróneos con patrones de respuestas correctas e incorrectas, y luego mejorar las preguntas, sus creadores construyeron una herramienta de diagnóstico que puede identificar conceptos erróneos específicos. Los investigadores pueden usar esa herramienta para medir el efecto de los cambios en los métodos de enseñanza [Hake1998].

Tew y otros desarrollaron y validaron una evaluación independiente del lenguaje para la programación introductoria [Tew2011], [Park2016] la replicó y [Hamo2017] está desarrollando un inventario conceptual para la recursividad. Sin embargo, es muy costoso crear herramientas como esta, y la capacidad de los alumnos para buscar respuestas en línea es una amenaza cada vez mayor para su validez.

Trabajar evaluaciones formativas en clase solo requiere un poco de preparación y práctica. Dar a los alumnos tarjetas coloreadas o numeradas para que todos puedan responder a un MCQ a la vez (en lugar de levantar las manos por turnos), tener una de las opciones: “No tengo idea” y animarlos a hablar con sus vecinos para Unos segundos antes de responder ayudará a asegurar que su flujo de enseñanza no se vea interrumpido. La Sección 9.2 describe un poderoso método de enseñanza basado en evidencia que se basa en estas ideas simples.

Humor

Los maestros a veces ponen respuestas supuestamente tontas como “¡mi nariz!” en MCQ, particularmente aquellas destinadas a estudiantes más jóvenes. Sin embargo, estos no proporcionan ninguna idea de los conceptos erróneos de los alumnos, y la mayoría de las personas no los encuentran divertidos. Como regla general, solo debe incluir un chiste en una lección si le resulta gracioso la tercera vez que lo vuelve a leer.

Las evaluaciones formativas de una lección deberían preparar a los alumnos para su evaluación sumativa: nadie debería encontrar una pregunta en un examen para el que la enseñanza no los preparó. Esto no significa que nunca debas poner nuevos tipos de problemas en un examen, pero si lo haces, deberías haber dado a los alumnos práctica para abordar problemas nuevos de antemano. El Capítulo 6 explora esto en profundidad.

Máquinas nocionales (¿modelos mentales?)

El término pensamiento computacional está muy extendido, en parte porque la gente puede estar de acuerdo en que es importante y que significa cosas muy diferentes. En lugar de discutir sobre lo que incluye y lo que no incluye, es más útil pensar en la máquina nocional que desea que los alumnos comprendan [DuBo1986]. Según [Sorv2013], una máquina nocional:

  • Es una abstracción idealizada del hardware de la computadora y otros aspectos de los entornos de tiempo de ejecución de los programas;

  • Permite describir la semántica de los programas; y

  • Refleja correctamente lo que hacen los programas cuando se ejecutan.

Por ejemplo, mi máquina nocional para Python es:

  1. Los programas en ejecución viven en la memoria, que se divide entre una pila de llamadas y un montón.

  2. La memoria para datos siempre se asigna desde el montón.

  3. Cada pieza de datos se almacena en una estructura de dos partes. La primera parte dice de qué tipo son los datos, y la segunda parte es el valor real.

  4. Los booleanos, los números y las cadenas de caracteres nunca se modifican después de crearlos.

  5. Las listas, conjuntos y otras colecciones almacenan referencias a otros datos en lugar de almacenar esos valores directamente. Se pueden modificar después de su creación, es decir, se puede ampliar una lista o se pueden agregar nuevos valores a un conjunto.

  6. Cuando el código se carga en la memoria, Python lo convierte en una secuencia de instrucciones que se almacenan como cualquier otro dato. Es por eso que es posible asignar funciones a variables y pasarlas como parámetros.

  7. Cuando se ejecuta el código, Python sigue las instrucciones, haciendo lo que cada uno le dice a su vez.

  8. Algunas instrucciones hacen que Python lea datos, haga cálculos y cree nuevos datos. Otras instrucciones controlan qué instrucciones ejecuta Python, que es cómo funcionan los bucles y condicionales. Otra instrucción más le dice a Python que llame a una función.

  9. Cuando se llama a una función, Python empuja un nuevo marco de pila en la pila de llamadas.

  10. Cada marco de pila almacena nombres de variables y referencias a datos. Los parámetros de función son solo otro tipo de variable.

  11. Cuando se usa una variable, Python la busca en el marco de la pila superior. Si no está allí, se ve en el marco inferior (global).

  12. Cuando finaliza la función, Python borra su marco de pila y vuelve a las instrucciones que estaba ejecutando antes de la llamada a la función. Si no hay un “antes”, el programa ha finalizado.

Uso esta versión de dibujos animados de la realidad cada vez que enseño Python. Después de aproximadamente 25 horas de instrucción y 100 horas de trabajo en su propio tiempo, espero que la mayoría de los alumnos tengan un modelo mental que incluya la mayoría o todas estas características.

Ejercicios

Sus modelos mentales (think-pair-share / 15)

¿Cuál es un modelo mental que utiliza para comprender su trabajo? Escribe unas pocas oraciones que lo describan y da tu opinión sobre la de un compañero. Una vez que haya hecho eso, haga que algunas personas compartan sus modelos con todo el grupo. ¿Están todos de acuerdo en qué es un modelo mental? ¿Es posible dar una definición precisa o el concepto es útil precisamente porque es difuso?

Síntomas de ser un novato (toda la clase / 5)

Decir que los novatos no tienen un modelo mental de un dominio particular no es lo mismo que decir que no tienen un modelo mental en absoluto. Los principiantes tienden a razonar por analogía y conjeturas, tomando prestados fragmentos de modelos mentales de otros dominios que parecen superficialmente similares.

Las personas que hacen esto a menudo dicen cosas que ni siquiera están mal. Como clase, discuta cuáles son algunos otros síntomas de ser un novato. ¿Qué hace o dice alguien que lo lleva a clasificarlo como novato en algún dominio?

Modelado de modelos mentales para principiantes (pares / 20)

Cree una pregunta de opción múltiple relacionada con un tema que haya enseñado o intente enseñar y explique el poder de diagnóstico de cada uno de sus distractores (es decir, qué concepto erróneo debe identificar cada distractor).

Cuando haya terminado, intercambie MCQ con un socio. ¿Es su pregunta ambigua? ¿Son plausibles los conceptos erróneos? ¿Los distractores realmente los prueban? ¿Hay alguna idea errónea probable que no se haya probado?

Pensando en las cosas (toda la clase / 15)

Una buena evaluación formativa requiere que las personas piensen en un problema. Por ejemplo, imagine que ha colocado un bloque de hielo en una bañera y luego ha llenado la bañera hasta el borde con agua. Cuando el hielo se derrite, ¿sube el nivel del agua (para que la bañera se desborde), baja o permanece igual (Figura [f: modelos-bañera])?

Bañera y hielo

La respuesta correcta es que el nivel se mantiene igual: el hielo desplaza su propio peso en el agua, por lo que llena exactamente el “agujero” que ha hecho cuando se derrite. Averiguar por qué ayuda a las personas a construir un modelo de la relación entre peso, volumen y densidad [Epst2002].

Describa otra evaluación formativa que haya visto o utilizado que requiera que las personas piensen detenidamente e identifiquen defectos en su razonamiento. Cuando haya terminado, explique su ejemplo a un compañero y dele comentarios sobre el suyo.

Una progresión diferente (individual / 15)

El modelo novato-competente-experto de desarrollo de habilidades a veces se llama modelo Dreyfus. Otra progresión comúnmente utilizada son las cuatro etapas de competencia:

Incompetencia inconsciente: la persona no sabe lo que no sabe.

Incompetencia consciente: la persona se da cuenta de que no sabe algo.

Competencia consciente: la persona ha aprendido cómo hacer algo, pero solo puede hacerlo mientras se concentra y aún puede necesitar dividir las cosas en pasos.

Competencia inconsciente: la habilidad se ha convertido en una segunda naturaleza y la persona puede hacerlo reflexivamente.

Identifique un tema donde se encuentra en cada nivel. ¿En qué nivel se encuentran la mayoría de sus alumnos en la materia que enseña con más frecuencia? ¿A qué nivel estás tratando de llegar? ¿Cómo se relacionan estas cuatro etapas con la clasificación novato-competente-experto?

¿Qué tipo de computación? (individual / 10)

[Tedr2008] resume tres tradiciones en informática:

Matemático: Los programas son la encarnación de algoritmos. Son correctos o incorrectos, así como más o menos eficientes.

Científico: Los programas son modelos más o menos precisos de procesos de información que pueden estudiarse utilizando el método científico.

Ingenieria: Los programas son objetos construidos como represas y aviones, y son más o menos efectivos y confiables.

¿Cuál de estos coincide mejor con su modelo mental de computación? Si ninguno de ellos lo hace, ¿qué modelo tienes?

Explicando por qué no (pares / 5)

Uno de sus alumnos piensa que hay algún tipo de diferencia entre el texto que escriben carácter por carácter y el texto idéntico que copian y pegan. Piensa en una razón por la que podrían creer esto o algo que podría haberles sucedido para darles esta impresión, luego finge ser ese aprendiz mientras tu pareja explica por qué este no es el caso. Intercambie roles e intente nuevamente.

Su modelo ahora (toda la clase / 5)

Como clase, cree una lista de los elementos clave de su modelo mental de aprendizaje. ¿Cuáles son la media docena de conceptos más importantes y cómo se relacionan?

Sus máquinas nocionales (grupos pequeños / 20)

Trabajando en grupos pequeños, escriba una descripción de la máquina nocional que desea que los alumnos usen para comprender cómo funcionan sus programas. ¿En qué se diferencia una máquina nocional para un lenguaje basado en bloques como Scratch de la de Python? ¿Qué pasa con una máquina nocional para hojas de cálculo o para un navegador que interpreta HTML y CSS al representar una página web?

Disfrutando sin aprender (individual / 5)

Múltiples estudios han demostrado que las evaluaciones de enseñanza no se correlacionan con los resultados del aprendizaje [Star2014, Uttl2017], es decir, qué tan bien los estudiantes califican un curso no predice cuánto recuerdan. ¿Alguna vez has disfrutado de una clase de la que realmente no aprendiste nada? Si es así, ¿qué lo hizo agradable?

Resumen

Modelo mental

Efaluación formativa

Experiencia y memoria

La memoria es el residuo del pensamiento.

Daniel Willingham, ¿Por qué a los estudiantes no les gusta la escuela?

El capítulo anterior explicaba las diferencias entre los principiantes y los profesionales competentes. Este analiza la experiencia: qué es, cómo la adquiere la gente y cómo puede ser perjudicial y útil. Luego presentamos uno de los límites más importantes para el aprendizaje y observamos cómo hacer dibujos de modelos mentales puede ayudarnos a convertir el conocimiento en lecciones.

Para empezar, ¿qué queremos decir cuando decimos que alguien es un experto? La respuesta habitual es que pueden resolver problemas mucho más rápido que las personas que son “simplemente competentes”, o que pueden reconocer y tratar casos en los que no se aplican las reglas normales. También hacen que esto parezca sin esfuerzo: en muchos casos, parecen saber la respuesta correcta de un vistazo [Parn2017].

La experiencia es más que solo conocer más hechos: los profesionales competentes pueden memorizar muchas curiosidades sin mejorar notablemente su rendimiento. En cambio, imagine por un momento que almacenamos el conocimiento como una red o gráfico en el que los hechos son nodos y las relaciones son arcos. La diferencia clave entre expertos y profesionales competentes es que los modelos mentales de los expertos están mucho más densamente conectados, es decir, es más probable que conozcan una conexión entre dos hechos.

La metáfora del gráfico explica por qué ayudar a los alumnos a hacer conexiones es tan importante como presentarles los hechos: sin esas conexiones, las personas no pueden recordar y usar lo que saben. También explica muchos aspectos observados del comportamiento experto:

El último de estos puntos se llama punto ciego experto. Como se definió originalmente en [Nath2003], es la tendencia de los expertos a organizar la explicación de acuerdo con los principios profundos del tema en lugar de guiarse por lo que sus alumnos ya saben. Se puede superar con el entrenamiento, pero es parte de la razón por la que no existe una correlación entre lo bueno que alguien es para investigar en un área y lo bueno que es para enseñarlo [Mars2002].

La palabra “solo”

Los expertos a menudo traicionan su punto ciego usando la palabra “solo”, como en “Oh, es fácil, simplemente enciendes una nueva máquina virtual y luego solo instalas estos cuatro parches en Ubuntu y luego reescribes todo programa en un lenguaje funcional puro”. Como discutimos en el Capítulo 10, hacer esto indica que el orador piensa que el problema es trivial y que la persona que lucha con él debe ser estúpida, así que no hagas esto.

Mapas conceptuales

Nuestra herramienta de elección para representar el modelo mental de alguien es un mapa conceptual, en el que los hechos son burbujas y las conexiones están etiquetadas como conexiones. Como ejemplos, la Figura [f: memoria-estaciones] muestra por qué la Tierra tiene estaciones (de IHMC), y el Apéndice 22 presenta mapas conceptuales para bibliotecas desde tres puntos de vista.

Estaciones

Para mostrar cómo se pueden usar los mapas conceptuales en la enseñanza de programación, considere esto para el bucle en Python:

for letter in "abc":
    print(letter)
whose output is:

a
b
c

Las tres “cosas” clave en este ciclo se muestran en la parte superior de la Figura [f: loop de memoria], pero son solo la mitad de la historia. La versión ampliada en la parte inferior muestra las relaciones entre esas cosas, que son tan importantes para la comprensión como los conceptos mismos.

for loop

Los mapas conceptuales se pueden usar de muchas maneras:

Ayudar a los maestros a descubrir qué están tratando de enseñar. Un mapa conceptual separa el contenido del orden: en nuestra experiencia, las personas rara vez terminan enseñando cosas en el orden en que las dibujaron por primera vez.

Ayuda a la comunicación entre diseñadores de lecciones. Es probable que los maestros con ideas muy diferentes de lo que están tratando de enseñar dirijan a sus alumnos en diferentes direcciones. Dibujar y compartir mapas conceptuales puede ayudar a prevenir esto. Y sí, diferentes personas pueden tener diferentes mapas conceptuales para el mismo tema, pero el mapeo conceptual hace explícitas esas diferencias.

Ayuda a la comunicación con los alumnos. Si bien es posible dar a los alumnos un mapa previamente dibujado al comienzo de una lección para que lo anoten, es mejor dibujarlo pieza por pieza mientras se enseña a reforzar los lazos entre lo que está en el mapa y lo que dijo el maestro. Volveremos a esta idea en la Sección 4.1.

Para evaluación Hacer que los alumnos dibujen lo que creen que acaban de aprender le muestra al maestro lo que se perdió y lo que se comunicó mal. La revisión de los mapas conceptuales de los alumnos lleva demasiado tiempo como una evaluación formativa durante la clase, pero es muy útil en clases semanales una vez que los alumnos están familiarizados con la técnica. La calificación es necesaria porque cualquier nueva forma de hacer las cosas inicialmente ralentiza a las personas; si un alumno está tratando de entender la programación básica, pedirles que descubran cómo dibujar sus pensamientos al mismo tiempo es una carga injusta.

Algunos maestros también son escépticos sobre si los novatos pueden mapear efectivamente su comprensión, ya que la introspección y la explicación de la comprensión son generalmente habilidades más avanzadas que la comprensión misma. Por ejemplo, [Kepp2008] analizó el uso del mapeo conceptual en la educación informática. Uno de sus hallazgos fue que, “… el mapeo conceptual es problemático para muchos estudiantes porque pone a prueba la comprensión personal en lugar del conocimiento que se aprendió simplemente de memoria”. Como alguien que valora la comprensión sobre el conocimiento de memoria, considero que es un beneficio.

Comience en cualquier lugar

Cuando se les pide por primera vez que dibujen un mapa conceptual, muchas personas no sabrán por dónde comenzar. Cuando esto suceda, escriba dos palabras asociadas con el tema que está tratando de mapear, luego dibuje una línea entre ellas y agregue una etiqueta que explique cómo se relacionan esas dos ideas. Luego puede preguntar qué otras cosas están relacionadas de la misma manera, qué partes tienen esas cosas o qué sucede antes o después de los conceptos que ya están en la página para descubrir más nodos y arcos. Después de eso, la parte difícil a menudo se detiene.

Los mapas conceptuales son solo una forma de representar nuestra comprensión de un tema [Eppl2006]; otros incluyen diagramas de Venn, diagramas de flujo y árboles de decisión [Abel2009]. Todo esto externaliza la cognición, es decir, hace que los modelos mentales sean visibles para que puedan compararse y combinarse.

Trabajo rudo y honestidad

Muchos diseñadores de interfaces de usuario creen que es mejor mostrar a la gente bocetos de sus ideas en lugar de maquetas pulidas porque es más probable que las personas den comentarios honestos sobre algo que creen que solo tomó unos minutos para crear: si parece que Están criticando que tomaron horas crear, la mayoría sacará sus golpes. Al dibujar mapas conceptuales para motivar la discusión, por lo tanto, debe usar lápices y papel de desecho (o bolígrafos y una pizarra) en lugar de herramientas de dibujo de computadora sofisticadas.

Siete más o menos dos

Si bien el modelo gráfico del conocimiento es incorrecto pero útil, otro modelo simple tiene una base fisiológica más sólida. Como una aproximación aproximada, la memoria humana se puede dividir en dos capas distintas. El primero, llamado memoria a largo plazo o persistente, es donde almacenamos cosas como los nombres de nuestros amigos, la dirección de nuestra casa y lo que hizo el payaso en nuestra fiesta de octavo cumpleaños que tanto nos asustó. Su capacidad es esencialmente ilimitada, pero su acceso es lento, demasiado lento para ayudarnos a lidiar con leones hambrientos y familiares descontentos.

Por lo tanto, la evolución nos ha dado un segundo sistema llamado memoria de trabajo o de corto plazo. Es mucho más rápido, pero también mucho más pequeño: [Mill1956] estimó que la memoria de trabajo del adulto promedio solo podía contener 7 ± 2 elementos a la vez. Esta es la razón por la cual los números de teléfono tienen 7 u 8 dígitos de largo: cuando los teléfonos tenían marcaciones en lugar de teclados, esa era la cadena de números más larga que la mayoría de los adultos podía recordar con precisión por el tiempo que tardó en marcar varias veces.

Participación

El tamaño de la memoria de trabajo a veces se usa para explicar por qué los equipos deportivos tienden a tener aproximadamente media docena de miembros o se dividen en subgrupos como los delanteros y los de atrás en el rugby. También se usa para explicar por qué las reuniones solo son productivas hasta un cierto número de participantes: si veinte personas intentan discutir algo, se están celebrando tres reuniones a la vez o media docena de personas están hablando mientras todos escuchan. El argumento es que la capacidad de las personas para realizar un seguimiento de sus pares está limitada por el tamaño de la memoria de trabajo, pero que yo sepa, el vínculo nunca ha sido probado.

7 ± 2 es el número más importante en la enseñanza. Un maestro no puede colocar información directamente en la memoria a largo plazo de un alumno. En cambio, lo que presenten primero se almacena en la memoria a corto plazo del alumno, y solo se transfiere a la memoria a largo plazo después de que se haya mantenido allí y ensayado (Sección 5.1). Si el maestro presenta demasiada información demasiado rápido, la nueva información desplaza a la anterior antes de que se transfiera la última.

Esta es una de las formas de utilizar un mapa conceptual al diseñar una lección: ayuda a garantizar que los recuerdos a corto plazo de los alumnos no se sobrecarguen. Una vez que se dibuja el mapa, el maestro elige una subsección que se ajustará a la memoria a corto plazo y conducirá a una evaluación formativa (Figura [f: memoria-fotosíntesis]), luego agrega otra subsección para el próximo episodio de la lección y así sucesivamente.

Fotosintesis

Construyendo Mapas Conceptuales Juntos

La próxima vez que tenga una reunión de equipo, entregue a todos una hoja de papel y pídales que pasen unos minutos dibujando su propio mapa conceptual del proyecto en el que están trabajando. A la cuenta de tres, haga que todos revelen sus mapas conceptuales a su grupo. La discusión que sigue puede ayudar a las personas a entender por qué se han estado tropezando.

Tenga en cuenta que el modelo simple de memoria presentado aquí ha sido reemplazado en gran medida por uno más sofisticado en el que la memoria a corto plazo se divide en varias tiendas modales (por ejemplo, para memoria visual frente a memoria lingüística), cada una de las cuales realiza un preprocesamiento involuntario [Mill2016a ] Por lo tanto, nuestra presentación es un ejemplo de un modelo mental que ayuda al aprendizaje y al trabajo diario.

Reconocimiento de patrones

Investigaciones recientes sugieren que el tamaño real de la memoria a corto plazo podría ser tan bajo como 4 ± 1 ítems [Dida2016]. Para manejar conjuntos de información más grandes, nuestras mentes crean fragmentos. Por ejemplo, la mayoría de nosotros recuerda las palabras como elementos individuales en lugar de secuencias de letras. Del mismo modo, el patrón formado por cinco puntos en cartas o dados se recuerda como un todo en lugar de como cinco piezas de información separadas.

Los expertos tienen más y más fragmentos que los no expertos, es decir, los expertos “ven” patrones más grandes y tienen más patrones para comparar cosas. Esto les permite razonar a un nivel superior y buscar información de manera más rápida y precisa. Sin embargo, la fragmentación también puede inducirnos a error si identificamos erróneamente las cosas: los recién llegados a veces realmente pueden ver cosas que los expertos han visto y perdido.

Dada la importancia de la fragmentación para pensar, es tentador identificar patrones de diseño y enseñarlos directamente. Estos patrones ayudan a los profesionales competentes a pensar y hablar entre ellos en muchos dominios (incluida la enseñanza [Berg2012]), pero los catálogos de patrones son demasiado secos y demasiado abstractos para que los novatos tengan sentido por sí mismos. Dicho esto, dar nombres a un pequeño número de patrones parece ayudar con la enseñanza, principalmente al dar a los alumnos un vocabulario más rico para pensar y comunicarse. [Kuit2004, Byck2005, Saja2006] Volveremos a esto en la Sección 7.5.

Convertirse en un experto

Entonces, ¿cómo se convierte alguien en un experto? La idea de que diez mil horas de práctica lo harán es ampliamente citada, pero probablemente no sea cierto: hacer lo mismo una y otra vez es mucho más probable que solidifique los malos hábitos que mejore el rendimiento. Lo que realmente funciona es hacer cosas similares pero sutilmente diferentes, prestar atención a lo que funciona y lo que no funciona, y luego cambiar el comportamiento en respuesta a esa retroalimentación para mejorar acumulativamente. Esto se llama práctica deliberada o reflexiva, y una progresión común es que las personas pasen por tres etapas:

Actuar sobre la retroalimentación de otros.

Un alumno podría escribir un ensayo sobre lo que hicieron en sus vacaciones de verano y recibir comentarios de un maestro que les diga cómo mejorarlo.

Dar comentarios sobre el trabajo de otros.

El alumno puede criticar el desarrollo del personaje en una novela de Harry Potter y obtener comentarios del maestro sobre su crítica.

Dar retroalimentación a ellos mismos.

En algún momento, el alumno comienza a criticar su propio trabajo a medida que lo hace utilizando las habilidades que ahora ha desarrollado. Hacer esto es mucho más rápido que esperar los comentarios de otros que la competencia de repente comienza a despegar.

¿Qué cuenta como práctica deliberada?

[Macn2014] descubrió que, “… la práctica deliberada explicó el 26% de la variación en el rendimiento de los juegos, el 21% de la música, el 18% de los deportes, el 4% de la educación y menos del 1% de las profesiones”. Sin embargo, [Eric2016] criticó este hallazgo diciendo: “Resumir cada hora de cualquier tipo de práctica durante la carrera de un individuo implica que el impacto de todos los tipos de actividad práctica en el rendimiento es igual, una suposición de que … es inconsistente con la evidencia.” Para ser efectiva, la práctica deliberada requiere un objetivo de rendimiento claro y una retroalimentación informativa inmediata, que son cosas por las que los maestros deben esforzarse de todos modos.

Ejercicios

Mapeo de conceptos (pares / 30)*

Dibuja un mapa conceptual de algo que enseñarías en cinco minutos. Negocie con un socio y critique los mapas de los demás. ¿Presentan conceptos o detalles de superficie? ¿Cuál de las relaciones en el mapa de su compañero considera conceptos y viceversa?

Mapeo de conceptos (nuevamente) (grupos pequeños / 20)

Trabajando en grupos de 3 a 4, haga que cada persona dibuje de forma independiente un mapa conceptual que muestre su modelo mental de lo que sucede en el aula. Cuando todos hayan terminado, compare los mapas conceptuales. ¿Dónde están de acuerdo y en desacuerdo sus modelos mentales?

Mejora de la memoria a corto plazo (individual / 5 minutos)

[Cher2007] sugiere que la razón principal por la que las personas dibujan diagramas cuando están discutiendo cosas es para ampliar su memoria a corto plazo: señalar una burbuja ondulante dibujada hace unos minutos provoca el recuerdo de varios minutos de debate. Cuando intercambiaste mapas conceptuales en el ejercicio anterior, ¿qué tan fácil fue para otras personas entender lo que significaba tu mapa? ¿Qué tan fácil sería para ti si lo dejas de lado por un día o dos y luego lo miras de nuevo?

Eso es un poco autorreferencial, ¿no? (clase completa / 30)

Trabajando independientemente, dibuje un mapa conceptual para mapas conceptuales. Compare su mapa conceptual con los dibujados por otras personas. ¿Qué incluyó la mayoría de la gente? ¿Cuáles fueron las diferencias significativas?

Darse cuenta de su punto ciego (grupos pequeños / 10)

Elizabeth Wickes enumeró todas las cosas que necesita comprender para leer esta línea de Python:

  • respuestas = [‘tuatara’, ‘tuataras’, ‘bus’, “lamer”] Los corchetes que rodean el contenido significan que estamos trabajando con una lista (a diferencia de los corchetes inmediatamente a la derecha de algo, que es una notación de extracción de datos).

  • Los elementos están separados por comas fuera y entre comillas (en lugar de dentro, como lo serían para el discurso citado).

  • Cada elemento es una cadena de caracteres, y lo sabemos por las comillas. Podríamos tener números u otros tipos de datos aquí si quisiéramos; necesitamos citas porque estamos trabajando con cadenas.

  • Estamos mezclando nuestro uso de comillas simples y dobles; A Python no le importa mientras se equilibren alrededor de las cadenas individuales.

  • Cada coma va seguida de un espacio, que Python no requiere, pero que preferimos para la legibilidad.

Cada uno de estos detalles puede ser pasado por alto por un experto. Trabajando en grupos de 3 a 4, seleccione algo igualmente corto de una lección que haya enseñado o aprendido recientemente y divídalo en este nivel de detalle.

Qué enseñar a continuación (individual / 5)

Consulte el mapa conceptual para la fotosíntesis en la Figura [f: memoria-fotosíntesis]. ¿Cuántos conceptos y enlaces hay en los fragmentos seleccionados? ¿Qué incluirías en la próxima parte de la lección y por qué?

El poder de fragmentar (individual / 5)

Mire la Figura [f: sin memoria] durante 10 segundos, luego mire hacia otro lado e intente escribir su número de teléfono con estos símbolos. (Use un espacio para ‘0’). Cuando haya terminado, mire la representación alternativa en el Apéndice 23. ¿Qué tan fáciles son los símbolos para recordar cuando el patrón se hace explícito?

Fragmentos

Arquitectura cognitiva

Hemos estado hablando de modelos mentales como si fueran cosas reales, pero ¿qué sucede realmente en el cerebro de un alumno cuando está aprendiendo? La respuesta corta es que no lo sabemos; la respuesta más larga es que sabemos mucho más de lo que solíamos saber. Este capítulo profundizará un poco más en lo que hacen los cerebros mientras aprenden y cómo podemos aprovechar eso para diseñar y brindar lecciones de manera más efectiva.

¿Qué está pasando allí?

f: arch-model

La figura [f: arch-model] es un modelo simplificado de arquitectura cognitiva humana. El núcleo de este modelo es la separación entre la memoria a corto y largo plazo discutida en la Sección 3.2. La memoria a largo plazo es como su sótano: almacena cosas de manera más o menos permanente, pero no puede acceder a su contenido directamente. En cambio, confía en su memoria a corto plazo, que es la mesa de la cocina desordenada de su mente.

Cuando necesita algo, su cerebro lo recupera de la memoria a largo plazo y lo guarda en la memoria a corto plazo. Por el contrario, la nueva información que llega a la memoria a corto plazo debe codificarse para almacenarse en la memoria a largo plazo. Si esa información no está codificada y almacenada, no se recuerda y el aprendizaje no ha tenido lugar.

La información ingresa a la memoria a corto plazo principalmente a través de su canal verbal (para el habla) y el canal visual (para las imágenes) 50. La mayoría de las personas confían principalmente en su canal visual, pero cuando las imágenes y las palabras se complementan entre sí, el cerebro hace un mejor trabajo al recordarlas a ambas: están codificadas juntas, por lo que recordar una más adelante ayuda a activar la recuperación de la otra.

Las entradas lingüísticas y visuales son procesadas por diferentes partes del cerebro humano, y las memorias lingüísticas y visuales también se almacenan por separado. Esto significa que la correlación de los flujos lingüísticos y visuales de información requiere un esfuerzo cognitivo: cuando alguien lee algo mientras lo escucha en voz alta, su cerebro no puede evitar comprobar que está obteniendo la misma información en ambos canales.

Por lo tanto, el aprendizaje aumenta cuando la información se presenta simultáneamente en dos canales diferentes, pero se reduce cuando esa información es redundante en lugar de complementaria, un fenómeno llamado efecto de atención dividida [Maye2003]. Por ejemplo, a las personas generalmente les resulta más difícil aprender de un video que tiene narración y subtítulos en pantalla que de uno que tiene la narración o los subtítulos, pero no ambos, porque parte de su atención debe dedicarse a verificar que La narración y los subtítulos concuerdan entre sí. Dos excepciones notables a esto son las personas que aún no hablan bien el idioma y las personas con problemas de audición u otras necesidades especiales, quienes pueden encontrar que el valor de la información redundante supera el esfuerzo de procesamiento adicional.

Pieza por pieza

El efecto de atención dividida explica por qué es más efectivo dibujar un diagrama pieza por pieza mientras se enseña que presentar todo de una vez. Si partes del diagrama aparecen al mismo tiempo que se dicen las cosas, las dos se correlacionarán en la memoria del alumno. Señalar una parte del diagrama más adelante es más probable que active el recuerdo de lo que se dijo cuando se dibujó esa parte.

El efecto de atención dividida no significa que los alumnos no deberían tratar de conciliar múltiples flujos de información entrantes; después de todo, esto es lo que tienen que hacer en el mundo real [Atki2000]. En cambio, significa que la instrucción no debería requerir que las personas lo hagan mientras dominan por primera vez las habilidades de la unidad; en cambio, el uso de múltiples fuentes de información simultáneamente debe tratarse como una tarea de aprendizaje separada.

No todos los gráficos son iguales

[Sung2012] presenta un estudio elegante que distingue gráficos seductores (que son muy interesantes pero no directamente relevantes para el objetivo de instrucción), gráficos decorativos (que son neutrales pero no directamente relevantes para el objetivo de instrucción) y gráficos instructivos (que son directamente relevantes a la meta de instrucción). Los estudiantes que recibieron cualquier tipo de gráfico dieron al material calificaciones de satisfacción más altas que aquellos que no obtuvieron gráficos, pero solo los estudiantes que obtuvieron gráficos instructivos en realidad obtuvieron mejores resultados.

Del mismo modo, [Stam2013, Stam2014] descubrió que tener más información en realidad puede reducir el rendimiento. Mostraron a los niños fotos, dibujos y números, o simplemente números para dos tareas. Para algunos, tener imágenes o imágenes y números superó a tener números solamente, pero para otros, tener imágenes superó a imágenes y números, que superaron simplemente tener números.

Carga cognitiva

En [Kirs2006], Kirschner, Sweller y Clark escribieron:

Aunque los enfoques de instrucción no guiados o mínimamente guiados son muy populares e intuitivamente atractivos … estos enfoques ignoran tanto las estructuras que constituyen la arquitectura cognitiva humana como la evidencia de los estudios empíricos durante el último medio siglo que constantemente indican que la instrucción mínimamente guiada es menos efectiva y menos eficiente que enfoques de instrucción que ponen un fuerte énfasis en la orientación del proceso de aprendizaje del alumno. La ventaja de la orientación comienza a retroceder solo cuando los alumnos tienen un conocimiento previo suficientemente alto para proporcionar orientación “interna”.

Debajo de la jerga, los autores afirmaban que hacer que los alumnos hagan sus propias preguntas, establezcan sus propios objetivos y encuentren su propio camino a través de un tema es menos efectivo que mostrarles cómo hacer las cosas paso a paso. El enfoque de “elige tu propia aventura” se conoce como aprendizaje basado en la indagación, y es intuitivamente atractivo: después de todo, ¿quién argumentaría en contra de que los estudiantes usen su propia iniciativa para resolver problemas del mundo real de manera realista? Sin embargo, pedirles a los alumnos que hagan esto en un nuevo dominio los sobrecarga al exigirles que dominen el contenido real de un dominio y sus estrategias de resolución de problemas al mismo tiempo.

Más específicamente, la teoría de la carga cognitiva propuso que las personas tienen que lidiar con tres cosas cuando están aprendiendo:

Carga intrínseca Es lo que la gente debe tener en cuenta para absorber material nuevo.

Carga pertinente Es el esfuerzo mental (deseable) requerido para vincular información nueva a información antigua, que es una de las cosas que distingue el aprendizaje de la memorización.

Carga extraña Es cualquier cosa que distraiga del aprendizaje.

La teoría de la carga cognitiva sostiene que las personas tienen que dividir una cantidad fija de memoria de trabajo entre estas tres cosas. Nuestro objetivo como maestros es maximizar la memoria disponible para manejar la carga intrínseca, lo que significa reducir la carga pertinente en cada paso y eliminar la carga extraña.

Problemas de Parsons

Un tipo de ejercicio que puede explicarse en términos de carga cognitiva a menudo se usa al enseñar idiomas. Supongamos que le pide a alguien que traduzca la oración, “¿Cómo está su rodilla hoy?” en frisón. Para resolver el problema, necesitan recordar tanto el vocabulario como la gramática, que es una doble carga cognitiva. Si les pide que pongan “azada”, “har”, “es”, “hjoed” y “knie” en el orden correcto, por otro lado, les está permitiendo centrarse únicamente en aprender gramática. Sin embargo, si escribe estas palabras en cinco fuentes o colores diferentes, habrá aumentado la carga cognitiva extraña, porque involuntariamente (y posiblemente inconscientemente) gastarán algún esfuerzo tratando de descubrir si las diferencias son significativas (Figura [f: arquitectura- frisio]).

f:architecture-frisian

El equivalente de codificación de esto se llama Parsons Problem56 [Pars2006]. Al enseñar a las personas a programar, puede darles las líneas de código que necesitan para resolver un problema y pedirles que las pongan en el orden correcto. Esto les permite concentrarse en el flujo de control y las dependencias de datos sin distraerse con nombres variables o tratar de recordar qué funciones llamar. Múltiples estudios han demostrado que los problemas de Parsons toman menos tiempo para que los alumnos lo hagan, pero producen resultados educativos equivalentes [Eric2017].

Ejemplos descoloridos

Otro tipo de ejercicio que se puede explicar en términos de carga cognitiva es dar a los alumnos una serie de ejemplos desvaídos. El primer ejemplo de una serie presenta un uso completo de una estrategia particular de resolución de problemas. El siguiente problema es del mismo tipo, pero tiene algunas lagunas para que el alumno las complete. Cada problema sucesivo le da al andamiaje menos andamios, hasta que se les pide que resuelvan un problema completo desde cero. Cuando enseñamos álgebra en la escuela secundaria, por ejemplo, podríamos comenzar con esto:

  (4x + 8)/2    =   5
  4x + 8    =   2 * 5
  4x + 8    =   10
  4x    =   10 - 8
  4x    =   2
  x =   2 / 4
  x =   1 / 2
  

Y luego pida a los alumnos que resuelvan esto:

  (3x - 1)*3    =   12
  3x - 1    =   _ / _
  3x - 1    =   4
  3x    =   _
  x =   _ / 3
  x =   _
  

y esto:

  (5x + 1)*3    =   4
  5x + 1    =   _
  5x    =   _
  x =   _
  

y finalmente esto:

  (2x + 8)/4    =   1
  x =   _

Un ejercicio similar para enseñar Python podría comenzar mostrando a los alumnos cómo encontrar la longitud total de una lista de palabras:

# total_length(["red", "green", "blue"]) => 12
define total_length(list_of_words):
    total = 0
    for word in list_of_words:
        total = total + length(word)
    return total
    

y luego pídales que llenen los espacios en blanco en esto (que enfoca su atención en las estructuras de control):

# word_lengths(["red", "green", "blue"]) => [3, 5, 4]
define word_lengths(list_of_words):
    list_of_lengths = []
    for ____ in ____:
        append(list_of_lengths, ____)
    return list_of_lengths
    

El siguiente problema podría ser este (que centra su atención en actualizar el resultado final):

# join_all(["red", "green", "blue"]) => "redgreenblue"
define join_all(list_of_words):
    joined_words = ____
    for ____ in ____:
        ____
    return joined_words
    

Finalmente, se les pedirá a los alumnos que escriban una función completa por su cuenta:

# make_acronym(["red", "green", "blue"]) => "RGB"
define make_acronym(list_of_words):

Los ejemplos descoloridos funcionan porque introducen la estrategia de resolución de problemas pieza por pieza: en cada paso, los alumnos tienen un nuevo problema que abordar, que es menos intimidante que una pantalla en blanco o una hoja de papel en blanco (Sección 9.11). También alienta a los alumnos a pensar en las similitudes y diferencias entre varios enfoques, lo que ayuda a crear los vínculos en sus modelos mentales que ayudan a la recuperación.

La clave para construir un buen ejemplo desvanecido es pensar en la estrategia de resolución de problemas que debe enseñar. Por ejemplo, los problemas de programación sobre todo usan el patrón de diseño del acumulador, en el que los resultados del procesamiento de elementos de una colección se agregan repetidamente a una sola variable de alguna manera para crear el resultado final.

Aprendizaje Cognitivo

Un modelo alternativo de aprendizaje e instrucción que también usa andamiaje y desvanecimiento es el aprendizaje cognitivo, que enfatiza la forma en que un maestro transmite habilidades y conocimientos a un aprendiz. El maestro proporciona modelos de desempeño y resultados, luego entrena a los novatos explicando lo que están haciendo y por qué [Coll1991, Casp2007]. El aprendiz reflexiona sobre su propia resolución de problemas, p. pensando en voz alta o criticando su propio trabajo, y eventualmente explora problemas de su propia elección.

Este modelo nos dice que los maestros deben presentar varios ejemplos al presentar una nueva idea para que los alumnos puedan ver qué generalizar, y que debemos variar la forma del problema para dejar en claro cuáles son y cuáles no son características superficiales60. Los problemas deben presentarse en contextos del mundo real, y debemos alentar la autoexplicación para ayudar a los alumnos a organizarse y dar sentido a lo que se les acaba de enseñar (Sección 5.1).

Submetas marcadas

Etiquetar submetas significa dar nombres a los pasos en una descripción paso a paso de un proceso de resolución de problemas. [Marg2016, Morr2016] descubrieron que los alumnos con submetas marcadas resolvieron los problemas de Parsons mejor que los alumnos sin ellos, y el mismo beneficio se ve en otros dominios [Marg2012]. Volviendo al ejemplo de Python utilizado anteriormente, los objetivos secundarios para encontrar la longitud total de una lista de palabras o construir un acrónimo son:

  1. Cree un valor vacío del tipo que se devolverá.

  2. Obtenga el valor que se agregará al resultado de la variable de bucle.

  3. Actualice el resultado con ese valor.

El etiquetado de submetas funciona porque agrupar los pasos relacionados en fragmentos con nombre (Sección 3.2) ayuda a los alumnos a distinguir qué es genérico de lo que es específico para el problema en cuestión. También les ayuda a construir un modelo mental de ese tipo de problema para que puedan resolver otros problemas de ese tipo, y les brinda una oportunidad natural para explicarse por sí mismos (Sección 5.1).

Manuales Minimos

La aplicación más pura de la teoría de la carga cognitiva puede ser el manual mínimo de John Carroll [Carr1987, Carr2014]. Su punto de partida es una cita de un usuario: “Quiero hacer algo, no aprender a hacer todo”. Carroll y sus colegas rediseñaron la capacitación para presentar cada idea como una tarea autónoma de una sola página: un título que describe de qué se trataba la página, instrucciones paso a paso de cómo hacer una sola cosa (por ejemplo, cómo eliminar una línea en blanco en un editor de texto), y luego varias notas sobre cómo reconocer y depurar problemas comunes. Descubrieron que reescribir los materiales de capacitación de esta manera los acortaba en general y que las personas que los usaban aprendían más rápido. Estudios posteriores confirmaron que este enfoque superó al enfoque tradicional independientemente de la experiencia previa con las computadoras [Lazo1993]. [Carr2014] resumió este trabajo diciendo:

Nuestros diseños “minimalistas” buscaban aprovechar la iniciativa del usuario y el conocimiento previo, en lugar de controlarlo a través de advertencias y pasos ordenados. Hizo hincapié en que los usuarios suelen aportar mucha experiencia y conocimientos a este aprendizaje, por ejemplo, conocimiento sobre el dominio de la tarea, y que dicho conocimiento podría ser un recurso para los diseñadores de instrucción. El minimalismo aprovechó los episodios de reconocimiento de errores, diagnóstico y recuperación, en lugar de intentar simplemente evitar el error. Enmarcó la resolución de problemas y la recuperación como oportunidades de aprendizaje en lugar de como aberraciones.

Otros modelos de aprendizaje

Los críticos de la teoría de la carga cognitiva a veces han argumentado que cualquier resultado puede justificarse después del hecho al etiquetar las cosas que perjudican el rendimiento como cargas extrañas y las que no son intrínsecas o relevantes. Sin embargo, la instrucción basada en la teoría de la carga cognitiva es indudablemente efectiva. Por ejemplo, [Maso2016] rediseñó un curso de base de datos para eliminar la atención dividida y los efectos de redundancia y proporcionar ejemplos y objetivos secundarios trabajados. El nuevo curso redujo la tasa de fracaso del examen en un 34% y aumentó la satisfacción del alumno.

Una década después de la publicación de [Kirs2006], un número creciente de personas cree que la teoría de la carga cognitiva y los enfoques basados en la indagación son compatibles si se ven de la manera correcta. [Kaly2015] argumenta que la teoría de la carga cognitiva es básicamente una microgestión del aprendizaje dentro de un contexto más amplio que considera cosas como la motivación, mientras que [Kirs2018] extiende la teoría de la carga cognitiva para incluir aspectos colaborativos del aprendizaje. Al igual que con [Mark2018] (discutido en la Sección 5.1), las perspectivas de los investigadores pueden diferir, pero la implementación práctica de sus teorías a menudo termina siendo la misma.

Uno de los desafíos en la investigación educativa es que lo que entendemos por “aprendizaje” resulta complicado una vez que se mira más allá del aula occidental estandarizada. Dos perspectivas específicas de la psicología educativa han influido en este libro. El que hemos usado hasta ahora es el cognitivismo, que se enfoca en cosas como el reconocimiento de patrones, la formación de la memoria y el recuerdo. Es bueno para responder preguntas de bajo nivel, pero generalmente ignora cuestiones más grandes como, “¿Qué queremos decir con” aprendizaje “?” y, “¿Quién puede decidir?” El otro es el aprendizaje situado, que se enfoca en atraer a las personas a una comunidad y reconoce que la enseñanza y el aprendizaje siempre están enraizados en quiénes somos y a quién aspiramos ser. Lo discutiremos con más detalle en el Capítulo 13.

El sitio web de Learning Theories y [Wibu2016] tienen buenos resúmenes de estas y otras perspectivas. Además del cognitivismo, los que se encuentran con mayor frecuencia incluyen el conductismo (que trata la educación como un condicionamiento de estímulo / respuesta), el constructivismo (que considera el aprendizaje como un proceso activo durante el cual los alumnos construyen conocimiento por sí mismos) y el conectivismo (que sostiene que el conocimiento se distribuye, que el aprendizaje es el proceso de navegación, crecimiento y poda de conexiones, y que enfatiza los aspectos sociales del aprendizaje hechos posibles por internet). Estas perspectivas pueden ayudarnos a organizar nuestros pensamientos, pero en la práctica, siempre tenemos que probar nuevos métodos en la clase, con estudiantes reales, para descubrir qué tan bien equilibran las muchas fuerzas en juego.

Ejercicios

Crear un ejemplo desvanecido (pares / 30)

Es muy común que los programas cuenten cuántas cosas se dividen en diferentes categorías: por ejemplo, cuántas veces aparecen diferentes colores en una imagen, o cuántas veces aparecen diferentes palabras en un párrafo de texto.

  1. Cree un breve ejemplo (no más de 10 líneas de código) que muestre a las personas cómo hacer esto, y luego cree un segundo ejemplo que resuelva un problema similar de una manera similar pero que tenga un par de espacios en blanco para que los alumnos completen. usted decide qué desvanecerse? ¿Cuál sería el siguiente ejemplo de la serie?

  2. Defina la audiencia para sus ejemplos. Por ejemplo, ¿son estos principiantes que solo conocen algunos conceptos básicos de programación? ¿O son estos alumnos con alguna experiencia en programación?

  3. Muestre su ejemplo a un compañero, pero no le diga para qué nivel cree que es. Una vez que hayan completado los espacios en blanco, pídales que adivinen el nivel deseado.

Si hay personas entre los aprendices que no programan nada, intente ubicarlos en diferentes grupos y haga que jueguen el papel de aprendices para esos grupos. Alternativamente, elija un dominio de problema diferente y desarrolle un ejemplo desvanecido para él.

Carga de clasificación (grupos pequeños / 15)

  1. Elija una breve lección que un miembro de su grupo haya enseñado o tomado recientemente.

  2. Haga una lista en forma de puntos de las ideas, instrucciones y explicaciones que contiene.

  3. Clasifique cada uno como intrínseco, pertinente o extraño. ¿En qué estaban todos de acuerdo? ¿Dónde estabas en desacuerdo y por qué?

(El ejercicio “Cómo notar su punto ciego” en la Sección 3.4 le dará una idea de cuán detallada debe ser su lista de puntos).

Crear un problema de Parsons (pares / 20)

Escriba cinco o seis líneas de código que hagan algo útil, mézclelas y pídale a su compañero que las ordene. Si está utilizando un lenguaje basado en sangría como Python, no sangra ninguna de las líneas; Si está utilizando un lenguaje de llaves como Java, no incluya ninguna de las llaves. (Si su grupo incluye personas que no son programadores, use un dominio problemático diferente, como hacer pan de plátano).

Manuales mínimos (individual / 20)

Escriba una guía de una página para hacer algo que sus alumnos puedan encontrar en una de sus clases, como centrar el texto horizontalmente o imprimir un número con un cierto número de dígitos después del punto decimal. Intente enumerar al menos tres o cuatro comportamientos o resultados incorrectos que el alumno pueda ver e incluya una explicación de una o dos líneas de por qué sucede cada uno y cómo corregirlo.

Aprendizaje cognitivo (pares / 15)

Elija un problema de codificación que pueda resolver en dos o tres minutos y piense en voz alta mientras lo resuelve mientras su compañero le hace preguntas sobre lo que está haciendo y por qué. No solo explique lo que está haciendo, sino también por qué lo está haciendo, cómo sabe que es lo correcto y qué alternativas ha considerado pero descartado. Cuando termines, intercambia roles con tu pareja y repite el ejercicio.

Ejemplos resueltos (pares / 15)

Ver ejemplos prácticos ayuda a las personas a aprender a programar más rápido que simplemente escribir mucho código [Skud2014], y deconstruir el código al rastrearlo o depurarlo también aumenta el aprendizaje [Grif2016]. Trabajando en parejas, revise un código de 10 a 15 líneas y explique qué hace cada declaración y por qué es necesaria. ¿Cuánto tiempo se tarda? ¿Cuántas cosas cree que necesita explicar por línea de código?

Gráficos críticos (individual / 30)

[Maye2009, Mill2016a] presenta seis principios para buenos gráficos de enseñanza:

Señalización: resalte visualmente los puntos más importantes para que se destaquen del material menos crítico.

Contigüidad espacial: coloque subtítulos tan cerca de los gráficos como sea práctico para compensar el costo de cambiar entre los dos.

Contigüidad temporal: Presentar narración hablada y gráficos tan cercanos en el tiempo como sea práctico. (Presentar ambos a la vez es mejor que presentarlos uno tras otro).

Segmentación: Cuando presente una secuencia larga de material o cuando los alumnos no tengan experiencia con el tema, divida la presentación en segmentos cortos y permita que los alumnos controlen la rapidez con la que avanzan al siguiente.

Pre-entrenamiento: Si los alumnos no conocen los conceptos y la terminología principales utilizados en su presentación, enseñe solo esos conceptos y términos de antemano.

Modalidad: las personas aprenden mejor de las imágenes más la narración que de las imágenes más el texto, a menos que sean hablantes no nativos o que tengan palabras o símbolos técnicos.

Elija un video de una lección o hable en línea que use diapositivas u otras presentaciones estáticas y califique sus gráficos como “pobre”, “promedio” o “bueno” de acuerdo con estos seis criterios.

Resumen

f:cognitive-load

Aprendizaje individual

Los capítulos anteriores han explorado lo que los maestros pueden hacer para ayudar a los alumnos. Este capítulo analiza lo que los alumnos pueden hacer por sí mismos al cambiar sus estrategias de estudio y descansar lo suficiente.

La estrategia más efectiva es cambiar del aprendizaje pasivo al aprendizaje activo [Hpl2018], lo que mejora significativamente el rendimiento y reduce las tasas de fracaso [Free2014]:

Passive                   Active
Read about something      Do exercises
Watch a video             Discuss a topic
Attend a lecture          Try to explain it

Refiriéndose a nuestro modelo simplificado de arquitectura cognitiva (Figura [f: modelo de arco]), el aprendizaje activo es más efectivo porque mantiene la información nueva en la memoria a corto plazo por más tiempo, lo que aumenta las probabilidades de que se codifique con éxito y se almacene en memoria a largo plazo. Y al usar nueva información a medida que llega, los alumnos desarrollan o fortalecen los lazos entre esa información y lo que ya saben, lo que a su vez aumenta las posibilidades de que puedan recuperarla más tarde.

La otra clave para sacar más provecho del aprendizaje es la metacognición, o pensar en el propio pensamiento. Así como los buenos músicos escuchan su propia interpretación y los buenos maestros reflexionan sobre su enseñanza (Capítulo 8), los alumnos aprenderán mejor y más rápido si hacen planes, establecen metas y monitorean su progreso. Es difícil para los estudiantes dominar estas habilidades en abstracto, solo decirles que hagan planes no tiene ningún efecto, pero las lecciones pueden diseñarse para fomentar buenas prácticas de estudio, y llamar la atención sobre estas prácticas en clase ayuda a los estudiantes a darse cuenta de que aprender es una habilidad que pueden mejorar como cualquier otra [McGu2015, Miya2018].

El gran premio es la transferencia de aprendizaje, que ocurre cuando una cosa que hemos aprendido nos ayuda a aprender otras cosas más rápidamente. Los investigadores distinguen entre transferencia cercana, que ocurre entre áreas similares o relacionadas, como fracciones y decimales en matemáticas, y transferencia remota, que ocurre entre dominios diferentes, por ejemplo, la idea de que aprender a jugar al ajedrez ayudará al razonamiento matemático o viceversa.

Sin lugar a dudas, se produce una transferencia cercana, si no fuera así, podría ocurrir un tipo de aprendizaje más allá de la simple memorización, y los maestros lo aprovechan todo el tiempo dando a los alumnos ejercicios que son similares al material que se acaba de presentar en una lección. Sin embargo, [Sala2017] analizó muchos estudios de transferencia lejana y concluyó que:

… los resultados muestran efectos pequeños a moderados. Sin embargo, los tamaños del efecto están inversamente relacionados con la calidad del diseño experimental … Llegamos a la conclusión de que rara vez se produce una transferencia lejana del aprendizaje.

Cuando se produce una transferencia lejana, parece suceder solo una vez que un sujeto ha sido dominado [Gick1987]. En la práctica, esto significa que aprender a programar no te ayudará a jugar ajedrez y viceversa.

Seis estrategias

Los psicólogos estudian el aprendizaje de una gran variedad de formas, pero han llegado a conclusiones similares sobre lo que realmente funciona [Mark2018]. Los científicos del aprendizaje han catalogado seis de estas estrategias y las resumieron en un conjunto de carteles descargables. Enseñar estas estrategias a los alumnos, y mencionarlas por su nombre cuando las use en clase, puede ayudarlos a aprender cómo aprender más rápido y mejor [Wein2018a, Wein2018b].

Práctica espaciada

Diez horas de estudio repartidas en cinco días es más efectivo que dos días de cinco horas, y mucho mejor que un día de diez horas. Por lo tanto, debe crear un cronograma de estudio que difunda las actividades de estudio a lo largo del tiempo: bloquee al menos media hora para estudiar cada tema cada día en lugar de tratar de meter todo en la noche anterior a un examen [Kang2016].

También debe revisar el material después de cada clase, pero no inmediatamente después: tome al menos un descanso de media hora. Cuando revise, asegúrese de incluir al menos un poco de material antiguo: por ejemplo, pase veinte minutos revisando las notas de la clase de ese día y luego cinco minutos revisando el material del día anterior y de una semana antes. Hacer esto también lo ayuda a detectar vacíos o errores en los conjuntos de notas anteriores mientras todavía hay tiempo para corregirlos o hacer preguntas: es doloroso darse cuenta la noche anterior al examen de que no tiene idea de por qué subrayó “¡Demodular!” tres veces.

Al revisar, tome notas sobre cosas que había olvidado: por ejemplo, haga una tarjeta de memoria para cada hecho que no pudo recordar o que recordaba incorrectamente [Matt2019]. Esto lo ayudará a enfocar la próxima ronda de estudio en las cosas que más necesitan atención.

El valor de las conferencias

Según [Mill2016a], “las conferencias que predominan en los cursos presenciales son formas relativamente ineficaces de enseñar, pero probablemente contribuyen a espaciar el material con el tiempo, porque se desarrollan en un horario establecido a lo largo del tiempo. Por el contrario, dependiendo de cómo estén configurados los cursos, los estudiantes en línea a veces pueden evitar la exposición al material por completo hasta que una tarea esté cerca”.

Práctica de recuperación

El factor limitante para la memoria a largo plazo no es la retención (lo que está almacenado) sino la recuperación (a lo que se puede acceder). La recuperación de información específica mejora con la práctica, por lo que los resultados en situaciones reales pueden mejorarse tomando exámenes de práctica o resumiendo los detalles de un tema de memoria y luego verificando lo que fue y no fue recordado. Por ejemplo, [Karp2008] descubrió que las pruebas repetidas mejoraron el recuerdo de las listas de palabras del 35% al 80%.

La recuperación es mejor cuando la práctica utiliza actividades similares a las utilizadas en las pruebas. Por ejemplo, escribir entradas de diario personales ayuda con cuestionarios de opción múltiple, pero menos que hacer cuestionarios de práctica [Mill2016a]. Este fenómeno se llama procesamiento apropiado para la transferencia.

Una forma de ejercitar las habilidades de recuperación es resolver problemas dos veces. La primera vez, hágalo completamente de memoria sin notas o discusión con sus compañeros. Después de calificar su propio trabajo con una rúbrica provista por el maestro, resuelva el problema nuevamente utilizando los recursos que desee. La diferencia entre los dos le muestra qué tan bien pudo recuperar y aplicar el conocimiento.

Otro método (mencionado anteriormente) es crear tarjetas flash. Las tarjetas físicas tienen una pregunta u otro mensaje en un lado y la respuesta en el otro, y muchas aplicaciones de tarjetas flash están disponibles para teléfonos. Si está estudiando como parte de un grupo, intercambiar tarjetas con un compañero lo ayuda a descubrir ideas importantes que puede haber perdido o malinterpretado.

Leer-cubrir-recuperar es una alternativa rápida a las tarjetas flash. Mientras lee algo, cubra los términos o secciones clave con pequeñas notas adhesivas. Cuando haya terminado, repáselo por segunda vez y vea qué tan bien puede adivinar qué hay debajo de cada una de esas notas adhesivas. Independientemente del método que utilice, no solo practique recordar hechos y definiciones: asegúrese de verificar también su comprensión de las grandes ideas y las conexiones entre ellas. Dibujar un mapa conceptual y luego compararlo con sus notas o con un mapa conceptual dibujado previamente es una forma rápida de hacerlo.

Hipercorrección

Un hallazgo poderoso en la investigación del aprendizaje es el efecto de hipercorrección [Metc2016]. A la mayoría de las personas no les gusta que les digan que están equivocadas, por lo que sería razonable suponer que cuanto más confiada esté alguien en la respuesta que han dado en una prueba, más difícil será cambiar de opinión si realmente incorrecto. Resulta que lo contrario es cierto: cuanto más seguro esté alguien de que tenía razón, es más probable que no repita el error si se corrige.

Intercalar

Una forma en que puede espaciar su práctica es intercalar el estudio de diferentes temas: en lugar de dominar un tema, luego una segunda y tercera sesión de estudio aleatorio. Aún mejor, cambie el orden: A-B-C-B-A-C es mejor que A-B-C-A-B-C, que a su vez es mejor que A-A-B-B-C-C [Rohr2015]. Esto funciona porque el intercalado fomenta la creación de más vínculos entre diferentes temas, lo que a su vez mejora el recuerdo.

El tiempo que debe dedicar a cada artículo depende del tema y qué tan bien lo conozca. En algún lugar entre 10 y 30 minutos es lo suficientemente largo para que pueda entrar en un estado de flujo (Sección 5.2) pero no para que su mente divague. El estudio de entrelazado inicialmente se sentirá más difícil que centrarse en un tema a la vez, pero eso es una señal de que está funcionando. Si está usando tarjetas de memoria flash o pruebas de práctica para medir su progreso, debería ver una mejora después de solo un par de días.

Elaboración

Explicarte las cosas a medida que las pasas te ayuda a comprenderlas y recordarlas. Una forma de hacerlo es hacer un seguimiento de cada respuesta en un cuestionario de práctica con una explicación de por qué esa respuesta es correcta o, por el contrario, con una explicación de por qué otra respuesta plausible no lo es. Otra es decirte cómo una nueva idea es similar o diferente de la que has visto anteriormente.

Hablar contigo mismo puede parecer una forma extraña de estudiar, pero [Biel1995] descubrió que las personas capacitadas en autoexplicación superaron a las que no habían sido capacitadas. Del mismo modo, [Chi1989] descubrió que algunos estudiantes simplemente se detienen cuando alcanzan un paso que no entienden cuando intentan resolver problemas. Otros hacen una pausa y generan una explicación de lo que está sucediendo, y el último grupo aprende más rápido. Un ejercicio para desarrollar esta habilidad es pasar por un programa de ejemplo línea por línea con una clase, haciendo que una persona diferente explique cada línea y diga por qué está allí y qué logra.

Ejemplos concretos

Una forma particularmente útil de elaboración es el uso de ejemplos concretos. Siempre que tenga una declaración de un principio general, intente proporcionar uno o más ejemplos de su uso o, por el contrario, tome cada problema en particular y enumere los principios generales que encarna. [Raws2014] descubrió que los ejemplos y definiciones entrelazados lo hacen más probable que los alumnos recordarían esto último correctamente.

Una forma estructurada de hacer esto es el método ADEPT: dar una analogía, dibujar un diagrama, presentar un ejemplo, describir la idea en lenguaje sencillo y luego dar los detalles técnicos. Nuevamente, si está estudiando con un compañero o en un grupo, puede intercambiar y verificar el trabajo: vea si está de acuerdo en que los ejemplos de otras personas realmente incorporan el principio que se está discutiendo o qué principios se usan en un ejemplo que no se han enumerado.

Otra técnica útil es enseñar por el contrario, es decir, mostrar a los alumnos qué solución no es o qué tipo de problema no resolverá una técnica. Por ejemplo, cuando se les muestra a los niños cómo simplificar fracciones, es importante darles unos 5/7 que no se pueden simplificar para que no se sientan frustrados buscando respuestas que no existen.

Codificación dual

La última de las seis estrategias principales que describen los científicos del aprendizaje es presentar palabras e imágenes juntas. Como se discutió en la Sección 4.1, diferentes subsistemas en nuestros cerebros manejan y almacenan información lingüística y visual, por lo que si se presenta información complementaria a través de ambos canales, pueden reforzarse mutuamente. Sin embargo, el aprendizaje es menos efectivo cuando la misma información se presenta simultáneamente en dos canales diferentes, porque entonces el cerebro tiene que hacer un esfuerzo para verificar los canales entre sí [Maye2003].

Una forma de aprovechar la codificación dual es dibujar o etiquetar líneas de tiempo, mapas, árboles genealógicos o cualquier otra cosa que parezca apropiada para el material. (Personalmente me gustan las imágenes que muestran qué funciones llaman a qué otros en un programa). Dibujar un diagrama sin etiquetas y luego volver a etiquetarlo es una excelente práctica de recuperación.

Gestión del tiempo

Solía alardear de las horas que estaba trabajando. No en muchas palabras, por supuesto, tenía algunas habilidades sociales, pero me presentaba a clase alrededor del mediodía, sin afeitar y bostezando, y mencionaba casualmente a quien escuchara que había estado trabajando hasta las 6:00 a.m.

Mirando hacia atrás, no puedo recordar a quién estaba tratando de impresionar. Lo que recuerdo en cambio es cuánto trabajo hice en esas noches de descanso que tiré una vez que dormí un poco, y cuánto daño causaron a mis notas las cosas que no tiré.

Mi error fue confundir “trabajar” con “ser productivo”. No puede producir software (o cualquier otra cosa) sin hacer algo de trabajo, pero puede hacer mucho trabajo fácilmente sin producir nada de valor. Convencer a las personas de esto puede ser difícil, especialmente cuando están en la adolescencia o en la veintena, pero paga enormes dividendos.

El estudio científico del exceso de trabajo y la privación del sueño se remonta al menos a la década de 1890; consulte [Robi2005] para obtener un resumen breve y legible. Los resultados más importantes para los alumnos son:

  1. Trabajar más de 8 horas al día durante un período prolongado reduce su productividad total, no solo su productividad por hora, es decir. En total, realiza menos tareas (no solo por hora) cuando está en modo crujiente.

  2. Trabajar más de 21 horas seguidas aumenta las posibilidades de que cometa un error catastrófico tanto como estar legalmente borracho.

  3. La productividad varía a lo largo de la jornada laboral, y la mayor productividad se produce en las primeras 4 a 6 horas. Después de suficientes horas, la productividad se acerca a cero; eventualmente se vuelve negativo.

Estos hechos han sido reproducidos y verificados durante más de un siglo, y los datos detrás de ellos son tan sólidos como los datos que vinculan el tabaquismo con el cáncer de pulmón. El problema es que las personas generalmente no notan que sus habilidades disminuyen. Al igual que los borrachos que piensan que todavía pueden conducir, las personas privadas de sueño no se dan cuenta de que no están terminando sus oraciones (o pensamientos). Se ha demostrado que cinco días de 8 horas por semana maximizan la producción total a largo plazo en todas las industrias que se hayan estudiado; estudiar o programar no son diferentes.

Pero, ¿qué pasa con las ráfagas cortas de vez en cuando, como tirar una noche entera para cumplir con una fecha límite? Eso también se ha estudiado y los resultados no son agradables. Tu capacidad de pensar cae un 25% por cada 24 horas que estés despierto. Dicho de otra manera, el coeficiente intelectual de una persona promedio es de solo 75 después de una noche entera, lo que lo ubica en el 5% inferior de la población. Si haces dos noches seguidas, tu coeficiente intelectual efectivo es 50, que es el nivel en el que las personas generalmente se consideran incapaces de vivir de forma independiente.

“¡Pero, pero tengo muchas tareas que hacer!” tu dices. "¡Y todos vencen a la vez! ¡Tengo que trabajar horas extra para hacerlos todos! No: las personas deben priorizar y enfocarse para ser productivos, y para hacerlo, se les debe enseñar cómo. Una técnica muy utilizada es hacer una lista de las cosas que deben hacerse, ordenarlas por prioridad y luego apagar el correo electrónico y otras interrupciones durante 30 a 60 minutos y completar una de esas tareas. Si cualquier tarea en una lista de tareas pendientes dura más de una hora, divídala en partes más pequeñas y priorícelas por separado.

La parte más importante de esto es apagar las interrupciones. A pesar de lo que muchas personas quieren creer, los seres humanos no son buenos en la multitarea. En lo que podemos llegar a ser buenos es en la automaticidad, que es la capacidad de hacer algo rutinario en segundo plano mientras hacemos otra cosa [Mill2016a]. La mayoría de nosotros podemos hablar mientras picamos cebollas, o tomar café mientras leemos; con la práctica, también podemos tomar notas mientras escuchamos, pero no podemos estudiar de manera efectiva, programar o realizar otras tareas mentalmente desafiantes mientras prestamos atención a otra cosa, solo creemos que podemos hacerlo.

El objetivo de organizarse y prepararse es entrar en el estado mental más productivo posible. Los psicólogos lo llaman flujo [Csik2008]; los atletas lo llaman “estar en la zona”, y los músicos hablan de perderse en lo que tocan. Cualquiera sea el nombre que use, las personas producen mucho más por unidad de tiempo en este estado de lo normal. La mala noticia es que toma aproximadamente 10 minutos volver a un estado de flujo después de una interrupción, sin importar cuán corta sea la interrupción. Esto significa que si se le interrumpe media docena de veces por hora, nunca se encuentra en su pico productivo.

¿Cómo lo supo?

En su cuento de 1961 “Harrison Bergeron”, Kurt Vonnegut describió un futuro en el que todos se ven obligados a ser iguales. Las personas atractivas tienen que usar máscaras, las personas atléticas tienen que usar pesas y las personas inteligentes se ven obligadas a llevar radios que interrumpen sus pensamientos a intervalos aleatorios. A veces me pregunto si, oh, espera, mi teléfono solo, lo siento, ¿de qué estábamos hablando?

Evaluación por pares

Pedirle a la gente de un equipo que califique a sus pares es una práctica común en la industria. [Sond2012] encuestó la literatura sobre evaluación de pares, distinguiendo entre calificación y revisión. Descubrieron que la evaluación por pares aumentó la cantidad, la diversidad y la puntualidad de la retroalimentación, ayudó a los estudiantes a ejercitar el pensamiento de alto nivel, alentó la práctica reflexiva y apoyó el desarrollo de habilidades sociales. Las preocupaciones eran predecibles: validez y fiabilidad, motivación y procrastinación, trolls, colusión y plagio.

Sin embargo, la evidencia muestra que estas preocupaciones no son significativas en la mayoría de las clases. Por ejemplo, [Kauf2000] comparó las calificaciones y calificaciones confidenciales de sus pares en varios ejes para dos cursos de ingeniería de pregrado y descubrió que la autoevaluación y las calificaciones de los pares estaban estadísticamente de acuerdo, que la colusión no era significativa (es decir, las personas no solo daban un alto puntaje a todos sus pares) grados), que los alumnos no inflan sus autoevaluaciones y, lo que es más importante, que las calificaciones no están sesgadas por género o raza.

Una forma de implementar la evaluación por pares es contribuir con la pedagogía del alumno, en la cual los alumnos producen artefactos para contribuir al aprendizaje de los demás. Esto puede ser desarrollar una breve lección y compartirla con la clase, agregarla a un banco de preguntas o escribir notas de una clase particular para su publicación en clase. Por ejemplo, [Fran2018] descubrió que los estudiantes que hicieron videos cortos para enseñar conceptos a sus compañeros tuvieron un aumento significativo en su propio aprendizaje en comparación con aquellos que solo estudiaron el material o vieron los videos. Descubrí que pedirles a los alumnos que compartan un error y su solución con la clase todos los días ayuda a sus habilidades analíticas y reduce el síndrome del impostor.

Otro enfoque es la revisión por pares calibrada, en la cual un alumno revisa uno o más ejemplos usando una rúbrica y compara su evaluación con la revisión del maestro del mismo trabajo [Kulk2013]. Una vez que las evaluaciones de los alumnos están lo suficientemente cerca de las del maestro, comienzan a evaluar el trabajo real de sus compañeros. Si se combinan las evaluaciones de varios pares, esto puede ser tan preciso como la evaluación de los maestros [Pare2008].

Como todo lo demás, la evaluación es ayudada por rúbricas. El formulario de evaluación en la Sección 21.2 muestra una muestra para comenzar. Para usarlo, clasifícate a ti mismo y a cada uno de tus compañeros de equipo, luego calcula y compara los puntajes. Las grandes disparidades generalmente indican la necesidad de una conversación más larga.

Ejercicios

Estrategias de aprendizaje (individual / 20)

  1. ¿Cuál de las seis estrategias de aprendizaje usa regularmente? ¿Cuáles no?

  2. Escriba tres conceptos generales que desea que sus alumnos dominen y dé dos ejemplos específicos de cada uno (práctica de ejemplos concretos). Para cada uno de esos conceptos, trabaje hacia atrás desde uno de sus ejemplos para explicar cómo lo explica el concepto (elaboración).

Ideas de conexión (pares / 5)

Este ejercicio es un ejemplo del uso de la elaboración para mejorar la retención. Elija un compañero, haga que cada persona elija independientemente una idea, luego anuncie sus ideas e intente encontrar una cadena de cuatro eslabones que conduzca de una a la otra. Por ejemplo, si las dos ideas son “Saskatchewan” y “estadísticas”, los enlaces podrían ser:

  • Saskatchewan es una provincia de Canadá;

  • Canadá es un país;

  • los países tienen gobiernos;

  • Los gobiernos utilizan estadísticas para analizar la opinión pública.

Evolución convergente (pares / 15)

Una práctica que no se cubrió anteriormente son las notas guiadas, que son notas preparadas por el maestro que indican a los alumnos que respondan a la información clave en una conferencia o discusión. Las señales pueden ser espacios en blanco donde los alumnos agregan información, asteriscos junto a los términos que los alumnos deben definir, y así sucesivamente.

Cree de dos a cuatro tarjetas de notas guiadas para una lección que haya enseñado recientemente o que vaya a enseñar. Intercambie tarjetas con su pareja: ¿qué tan fácil es entender lo que se solicita? ¿Cuánto tiempo tomaría completar los mensajes? ¿Qué tan bien funciona esto para ejemplos de programación?

Mentes cambiantes (pares / 10)

[Kirs2013] argumenta que los mitos sobre los nativos digitales, los estilos de aprendizaje y los autodidactas son reflejos de la creencia errónea de que los alumnos saben lo que es mejor para ellos, y advierte que podemos estar en una espiral descendente en la que cada intento de los investigadores en educación refutar estos mitos confirma la creencia de sus oponentes de que aprender ciencia es una pseudociencia. Elija una cosa que haya aprendido sobre el aprendizaje hasta ahora en este libro que lo sorprendió o contradijo algo que creía anteriormente y practique explicárselo a un compañero en 1–2 minutos. ¿Qué tan convincente eres?

Tarjetas Flash (individuales / 15)

Use notas adhesivas o cualquier otra cosa que tenga a mano para hacer media docena de tarjetas para un tema que haya enseñado o aprendido recientemente. Opere con un socio y vea cuánto tiempo le lleva a cada uno de ustedes lograr un recuerdo 100% perfecto. Deje las tarjetas a un lado cuando haya terminado, luego regrese después de media hora y vea cuál es su tasa de recuperación.

Usando ADEPT (toda la clase / 15)

Elija algo que haya enseñado recientemente o que le hayan enseñado y describa una breve lección que utilice el método ADEPT de cinco pasos para presentarlo.

El costo de la multitarea (pares / 10)

El blog de Learning Scientists describe un experimento simple que puede hacer con solo un cronómetro para demostrar el costo mental de la multitarea. Trabajando en parejas, mida cuánto tiempo le toma a cada persona realizar cada una de estas tres tareas:

  • Cuente del 1 al 26 dos veces.

  • Recita el alfabeto de la A a la Z dos veces.

  • Intercalar los números y letras, es decir, “1, A, 2, B, …” y así sucesivamente.

Haga que cada par informe sus números. Sin una práctica específica, la tercera tarea siempre lleva mucho más tiempo que cualquiera de las tareas componentes.

Mitos en la educación informática (toda la clase / 20)

[Guzd2015b] presenta una lista de las diez creencias erróneas principales sobre la educación informática, que incluye:

  1. La falta de mujeres en Ciencias de la Computación es como todos los demás campos STEM.

  2. Para obtener más mujeres en CS, necesitamos más profesores femeninos de CS.

  3. Las evaluaciones de los estudiantes son la mejor manera de evaluar la enseñanza.

  4. Los buenos maestros personalizan la educación para los estilos de aprendizaje de los estudiantes.

  5. Un buen maestro de CS debe modelar buenas prácticas de desarrollo de software porque su trabajo es producir excelentes ingenieros de software.

  6. Algunas personas son naturalmente mejores programadores que otras.

Haga que todos voten +1 (de acuerdo), -1 (en desacuerdo) o 0 (no estoy seguro) por cada punto, luego lea las explicaciones completas en el artículo original y vote nuevamente. ¿En cuáles cambiaron de opinión las personas? ¿Cuáles creen que todavía son verdad y por qué?

Revisión por pares calibrada (pares / 20)

  1. Cree una rúbrica de 5–10 puntos con entradas como “nombres de variables buenos”, “sin código redundante” y “flujo de control anidado adecuadamente” para calificar el tipo de programas que le gustaría que escribieran sus alumnos.

  2. Elija o cree un pequeño programa que contenga 3–4 violaciones de estas entradas.

  3. Califique el programa de acuerdo con su rúbrica.

  4. Haga que un compañero califique el mismo programa con la misma rúbrica. ¿Qué aceptan que no lo hiciste? ¿Qué critican que no hiciste?

Resumen

Concepts: Active learning

Un proceso de diseño de lecciones

La mayoría de la gente diseña lecciones como esta:

  1. Alguien te pide que enseñes algo que apenas sabes o en lo que no has pensado en años.

  2. Empiezas a escribir diapositivas para explicar lo que sabes sobre el tema.

  3. Después de 2 o 3 semanas, haces una tarea basada en lo que has enseñado hasta ahora.

  4. Repite el paso 3 varias veces.

  5. Te mantienes despierto hasta altas horas de la madrugada para crear un examen final y prometerte que estarás más organizado la próxima vez.

Un método más efectivo es similar en espíritu a una práctica de programación llamada desarrollo basado en pruebas (TDD). Los programadores que usan TDD no escriben software y luego prueban que funciona correctamente. En cambio, escriben las pruebas primero, luego escriben suficiente software nuevo para que esas pruebas pasen.

TDD funciona porque escribir pruebas obliga a los programadores a ser precisos sobre lo que intentan lograr y cómo se ve “hecho”. TDD también evita el pulido sin fin: cuando pasan las pruebas, deja de codificar. Finalmente, reduce el riesgo de sesgo de confirmación: alguien que aún no ha escrito una pieza de software será más objetivo que alguien que acaba de dedicar varias horas de arduo trabajo y realmente quiere terminar.

Un método similar llamado diseño hacia atrás funciona muy bien para el diseño de lecciones. Este método se desarrolló de forma independiente en [Wigg2005, Bigg2011, Fink2013] y se resume en [McTi2013]. En forma simplificada, sus pasos son:

  1. Cree o recicle personas aprendices (discutidas en la siguiente sección) para descubrir a quién está tratando de ayudar y qué les resultará atractivo.

  2. Haga una lluvia de ideas para tener una idea aproximada de lo que quiere cubrir, cómo lo va a hacer, qué problemas o ideas erróneas espera encontrar, qué no se va a incluir, etc. Dibujar mapas conceptuales puede ayudar mucho en esta etapa (Sección 3.1).

  3. Cree una evaluación sumativa (Sección 2.1) para definir su objetivo general. Este puede ser el examen final de un curso o el proyecto final para un taller de un día; independientemente de su forma o tamaño, muestra hasta qué punto espera llegar más claramente que una lista de objetivos en forma de puntos.

  4. Cree evaluaciones formativas que brinden a las personas la oportunidad de practicar las cosas que están aprendiendo. Estos también le dirán (y a ellos) si están progresando y dónde deben centrar su atención. La mejor manera de hacer esto es detallar los conocimientos y habilidades utilizados en la evaluación sumativa que desarrolló en el paso anterior y luego crear al menos una evaluación formativa para cada uno.

  5. Ordene las evaluaciones formativas para crear un esquema del curso basado en su complejidad, sus dependencias y qué tan bien los temas motivarán a sus alumnos (Sección 10.1).

  6. Escriba material para que los alumnos pasen de una evaluación formativa a la siguiente. Cada hora de instrucción debe constar de tres a cinco episodios de este tipo.

  7. Escriba una descripción resumida del curso para ayudar a su público objetivo a encontrarlo y determinar si es adecuado para ellos.

Este método ayuda a mantener la enseñanza enfocada en sus objetivos. También garantiza que los alumnos no enfrenten nada al final del curso para el que no estén preparados.

Incentivos perversos

El diseño hacia atrás no es lo mismo que enseñar a la prueba. Al usar el diseño hacia atrás, los maestros establecen metas para ayudar en el diseño de la lección; Es posible que nunca den el examen final que escribieron. En muchos sistemas escolares, por otro lado, una autoridad externa define los criterios de evaluación para todos los alumnos, independientemente de sus situaciones individuales. Los resultados de esas evaluaciones sumativas afectan directamente el salario y la promoción de los docentes, lo que significa que los docentes tienen un incentivo para centrarse en que los alumnos aprueben las pruebas en lugar de ayudarlos a aprender.

[Gree2014] argumenta que centrarse en las pruebas y la medición atrae a quienes tienen el poder de establecer las pruebas, pero es poco probable que mejore los resultados a menos que se combine con el apoyo para que los maestros realicen mejoras basadas en los resultados de las pruebas. A menudo falta lo último porque las grandes organizaciones generalmente valoran la uniformidad sobre la productividad [Scot1998].

El diseño inverso se describe como una secuencia, pero casi nunca se hace de esa manera. Podemos, por ejemplo, cambiar de opinión sobre lo que queremos enseñar en base a algo que se nos ocurre mientras escribimos un MCQ, o reevaluar a quién estamos tratando de ayudar una vez que tengamos un resumen de la lección. Sin embargo, las notas que dejamos atrás deben presentar las cosas en el orden descrito anteriormente para que quien tenga que usar o mantener la lección después de nosotros pueda volver sobre nuestro pensamiento. [Parn1986]

Personas aprendices

El primer paso en el proceso de diseño inverso es descubrir quién es su audiencia. Una forma de hacerlo es escribir dos o tres personas aprendices como las de la Sección 1.1. Esta técnica se toma prestada de los diseñadores de experiencia de usuario, que crean perfiles cortos de usuarios típicos para ayudarlos a pensar en su audiencia.

Una persona de aprendizaje consiste en:

  1. los antecedentes generales de la persona;

  2. lo que ya saben;

  3. lo que quieren hacer; y

  4. cualquier necesidad especial que tengan.

Las personas en la Sección 1.1 tienen los cuatro puntos enumerados anteriormente, junto con un breve resumen de cómo este libro los ayudará. Una persona que aprende para un grupo de voluntarios que organiza talleres de Python los fines de semana podría ser:

  1. Jorge acaba de mudarse de Costa Rica a Canadá para estudiar ingeniería agrícola. Se ha unido al equipo de fútbol de la universidad y espera aprender a jugar hockey sobre hielo.

  2. Además de usar Excel, Word e Internet, la experiencia previa más importante de Jorge con las computadoras es ayudar a su hermana a construir un sitio de WordPress para el negocio familiar en casa.

  3. Jorge quiere medir las propiedades del suelo de granjas cercanas utilizando un dispositivo portátil que envía datos a su computadora. En este momento tiene que abrir cada archivo de datos en Excel, eliminar la primera y la última columna, y calcular algunas estadísticas sobre lo que queda. Tiene que recolectar al menos 600 mediciones en los próximos meses, y realmente no quiere tener que hacer estos pasos a mano para cada uno.

  4. Jorge sabe leer bien el inglés, pero a veces le cuesta mantenerse al día con la conversación hablada que involucra mucha jerga.

En lugar de escribir nuevas personas para cada lección o curso, los maestros generalmente crean y comparten media docena que cubren a todos los que probablemente enseñarán, luego eligen algunos de ese conjunto para describir a la audiencia para un material en particular. Las personas que se utilizan de esta manera se convierten en una forma abreviada conveniente para los problemas de diseño: al hablar entre ellos, los maestros pueden decir: “¿Entendería Jorge por qué estamos haciendo esto?” o “¿Qué problemas de instalación enfrentaría Jorge?”

Sus objetivos, no los tuyos

Las personas siempre deben describir lo que el alumno quiere hacer en lugar de lo que crees que realmente necesitan. Pregúntese qué están buscando en línea; probablemente no incluirá jerga que aún no conocen, por lo que parte de lo que tiene que hacer como diseñador de instrucción es descubrir cómo hacer que su lección sea fácil de encontrar.

Objetivos de aprendizaje

Las evaluaciones formativas y sumativas ayudan a los maestros a descubrir lo que van a enseñar, pero para comunicarlo a los alumnos y otros maestros, la descripción del curso también debe tener objetivos de aprendizaje. Estos ayudan a asegurar que todos tengan la misma comprensión de lo que se supone que debe lograr una lección. Por ejemplo, una declaración como “entender Git” podría significar cualquiera de los siguientes:

  • Los estudiantes pueden describir tres formas en que los sistemas de control de versiones como Git son mejores que las herramientas para compartir archivos como Dropbox y dos formas en que son peores.

  • Los alumnos pueden enviar un archivo modificado a un repositorio de Git utilizando una herramienta GUI de escritorio.

  • Los alumnos pueden explicar qué es un HEAD separado y recuperarse de él mediante operaciones de línea de comandos.

Objetivos vs. Resultados

Un objetivo de aprendizaje es lo que una lección se esfuerza por lograr. Un resultado de aprendizaje es lo que realmente logra, es decir, lo que los alumnos realmente quitan. El papel de la evaluación sumativa es, por lo tanto, comparar los resultados de aprendizaje con los objetivos de aprendizaje.

Un objetivo de aprendizaje describe cómo el alumno demostrará lo que ha aprendido una vez que haya completado con éxito una lección. Más específicamente, tiene un verbo medible o verificable que establece lo que hará el alumno y especifica los criterios para un rendimiento aceptable. Inicialmente, escribir esto puede parecer restrictivo, pero a largo plazo los hará felices a usted, a sus compañeros maestros y a sus alumnos: terminará con pautas claras tanto para su enseñanza como para su evaluación, y sus alumnos apreciarán tener expectativas claras.

Una forma de entender lo que hace que un buen objetivo de aprendizaje sea ver cómo se puede mejorar uno pobre:

  • El alumno tendrá la oportunidad de aprender buenas prácticas de programación. Esto describe el contenido de la lección, no los atributos de los alumnos exitosos.

  • El alumno apreciará mejor las buenas prácticas de programación. Esto no comienza con un verbo activo ni define el nivel de aprendizaje, y el tema del aprendizaje no tiene contexto y no es específico.

  • El alumno comprenderá cómo programar en R. Si bien esto comienza con un verbo activo, no define el nivel de aprendizaje y el tema del aprendizaje sigue siendo demasiado vago para la evaluación.

  • El alumno escribirá scripts de análisis de datos de una página para leer, filtrar y resumir datos tabulares usando R. Esto comienza con un verbo activo, define el nivel de aprendizaje y proporciona contexto para garantizar que los resultados puedan evaluarse.

Cuando se trata de elegir verbos, muchos maestros usan la Taxonomía de Bloom. Publicado por primera vez en 1956 y actualizado a principios de siglo [Ande2001], es un marco ampliamente utilizado para discutir los niveles de comprensión. Su forma más reciente tiene seis categorías; La lista a continuación proporciona algunos de los verbos que se usan típicamente en los objetivos de aprendizaje escritos para cada uno:

Recordando: Exhiba la memoria del material previamente aprendido al recordar hechos, términos, conceptos básicos y respuestas. (reconocer, enumerar, describir, nombrar, buscar)

Comprensión: Demuestre comprensión de hechos e ideas organizando, comparando, traduciendo, interpretando, dando descripciones y estableciendo ideas principales. (interpretar, resumir, parafrasear, clasificar, explicar)

Aplicando: Resuelva nuevos problemas aplicando los conocimientos adquiridos, los hechos, las técnicas y las reglas de una manera diferente. (construir, identificar, usar, planificar, seleccionar)

Analizando: Examinar y dividir la información en partes identificando motivos o causas; hacer inferencias y encontrar evidencia para apoyar las generalizaciones. (comparar, contrastar, simplificar)

Evaluando: Presente y defienda opiniones emitiendo juicios sobre la información, la validez de las ideas o la calidad del trabajo en función de un conjunto de criterios. (verificar, elegir, criticar, probar, calificar)

Creando: Recopile información de una manera diferente combinando elementos en un nuevo patrón o proponiendo soluciones alternativas. (diseñar, construir, mejorar, adaptar, maximizar, resolver)

La Taxonomía de Bloom aparece en casi todos los libros de texto sobre educación, pero [Masa2018] descubrió que incluso los educadores experimentados tienen problemas para acordar cómo clasificar cosas específicas. Sin embargo, los verbos siguen siendo útiles, como lo es la noción de construir entendimiento en pasos: como ha dicho Daniel Willingham, la gente no puede pensar sin algo en lo que pensar [Will2010], y esta taxonomía puede ayudar a los maestros a asegurar que los alumnos tengan esas cosas cuando los necesitan

Otra forma de pensar sobre los objetivos de aprendizaje proviene de [Fink2013], que define el aprendizaje en términos del cambio que debe producir en el alumno. La taxonomía de Fink también tiene seis categorías, pero a diferencia de Bloom, son complementarias en lugar de jerárquicas:

Conocimiento fundamental: Comprender y recordar información e ideas. (recuerda, comprende, identifica)

Solicitud: habilidades, pensamiento crítico, gestión de proyectos. (usar, resolver, calcular, crear)

Integración: conectando ideas, experiencias de aprendizaje y la vida real. (conectar, relacionar, comparar)

Dimensión humana: aprender sobre uno mismo y los demás. (llegar a verse a sí mismos como, comprender a los demás en términos de, decidir convertirse)

Cuidando: desarrollando nuevos sentimientos, intereses y valores. (Emociónate, prepárate para valorar)

Aprendiendo a aprender: convertirse en un mejor alumno. (identifique la fuente de información para, plantee preguntas útiles sobre)

Un conjunto de objetivos de aprendizaje basados en esta taxonomía para un curso introductorio sobre HTML y CSS podría ser:

  • Explicar qué son las propiedades CSS y cómo funcionan los selectores CSS.

  • Diseñe una página web usando etiquetas comunes y propiedades CSS.

  • Compare y contraste la escritura de HTML y CSS con la escritura con herramientas de publicación de escritorio.

  • Identifique y corrija problemas en páginas web de muestra que dificulten la interacción de las personas con discapacidad visual.

  • Describa las características de los sitios web favoritos cuyo diseño le atraiga particularmente y explique por qué.

  • Describa sus dos fuentes de información en línea favoritas sobre CSS y explique qué le gusta de ellas.

Mantenibilidad

Una vez que se ha creado una lección, alguien necesita mantenerla, y hacerlo es mucho más fácil si se ha desarrollado de manera sostenible. Pero, ¿qué significa exactamente “mantenible”? La respuesta breve es que se puede mantener una lección si es más barato actualizarla que reemplazarla. Esta ecuación depende de cuatro factores:

Cuán bien documentado está el diseño del curso. Si la persona que realiza el mantenimiento no sabe (o no recuerda) qué se supone que debe lograr la lección o por qué se introducen los temas en un orden particular, les llevará más tiempo actualizarla. Una razón para usar el diseño inverso es capturar decisiones sobre por qué cada curso es como es.

Qué fácil es para los colaboradores colaborar técnicamente. Los maestros generalmente comparten material enviándose archivos de PowerPoint entre ellos o colocándolos en una unidad compartida. Las herramientas de escritura colaborativa como Google Docs y wikis son una gran mejora, ya que permiten a muchas personas actualizar el mismo documento y comentar las actualizaciones de otras personas. Los sistemas de control de versiones utilizados por los programadores, como GitHub, son otro enfoque. Permiten que cualquier cantidad de personas trabajen de forma independiente y luego fusionan sus cambios de forma controlada y revisable. Desafortunadamente, los sistemas de control de versiones tienen una curva de aprendizaje empinada y no manejan formatos comunes de documentos de oficina.

Cuán dispuestas están las personas a colaborar. Las herramientas necesarias para construir una Wikipedia para las lecciones han existido durante veinte años, pero la mayoría de los maestros aún no escriben y comparten lecciones de la manera en que escriben y comparten entradas de enciclopedia.

Cuán útil es realmente compartir. La paradoja de la reutilización afirma que cuanto más reutilizable es un objeto de aprendizaje, menos pedagógicamente efectivo es [Wile2002]. La razón es que una buena lección se parece más a una novela que a un programa: sus partes están estrechamente acopladas en lugar de cajas negras independientes. Por lo tanto, la reutilización directa puede ser el objetivo equivocado para las lecciones; podríamos llegar más lejos al intentar hacerlos más fáciles de mezclar.

Si la paradoja de la reutilización es cierta, la colaboración será más probable si las cosas en las que se colabora son pequeñas. Esto encaja bien con la teoría de las explicaciones corales de Mike Caulfield, que argumenta que los sitios como Stack Overflow tienen éxito porque proporcionan un coro de respuestas para cada pregunta, cada una de las cuales es más adecuada para un interrogador ligeramente diferente. Si esto es correcto, las lecciones del mañana pueden ser visitas guiadas a repositorios de preguntas y respuestas curados por la comunidad diseñados para estudiantes en niveles muy diferentes.

Ejercicios

Crear personas aprendices (grupos pequeños / 30)

Trabajando en grupos pequeños, cree una persona de 4 puntos que describa a uno de sus alumnos típicos.

Clasificar los objetivos de aprendizaje (pares / 10)

Mire los ejemplos de objetivos de aprendizaje para un curso introductorio sobre HTML y CSS en la Sección 6.2 y clasifique cada uno según la Taxonomía de Bloom. Compara tus respuestas con las de tu pareja. ¿Dónde estuvo de acuerdo y en desacuerdo?

Escribir objetivos de aprendizaje (pares / 20)

Escribe uno o más objetivos de aprendizaje para algo que enseñas actualmente o planeas enseñar usando la Taxonomía de Bloom. Trabajando con un compañero, critica y mejora los objetivos. ¿Tiene cada uno un verbo verificable y criterios claros para un desempeño aceptable?

Escribir más objetivos de aprendizaje (pares / 20)

Escribe uno o más objetivos de aprendizaje para algo que enseñas actualmente o planeas enseñar usando la taxonomía de Fink. Trabajando con un compañero, critica y mejora los objetivos.

Ayúdame a hacerlo solo (grupos pequeños / 15)

El teórico educativo Lev Vygotsky introdujo la noción de una Zona de Desarrollo Proximal (ZPD), que incluye los problemas que las personas aún no pueden resolver por sí mismas pero que pueden resolver con la ayuda de un mentor. Estos son los problemas que son más fructíferos para abordar a continuación, ya que están fuera del alcance pero son alcanzables.

Trabajando en grupos pequeños, elija una persona de alumno que haya desarrollado y describa dos o tres problemas que se encuentran en la ZPD de ese alumno.

Desarrollar lecciones restando complejidad (individual / 20)

Una forma de construir una lección de programación es escribir el programa con el que desea que los alumnos terminen, luego eliminar la parte más compleja que desea que escriban y convertirlo en el último ejercicio. Luego puede eliminar la siguiente parte más compleja que desea que escriban y convertirla en el penúltimo ejercicio, y así sucesivamente. Cualquier cosa que quede después de que hayas retirado los ejercicios, como cargar bibliotecas o leer datos, se convierte en el código de inicio que les das.

Tome un programa o página web que desee que sus alumnos puedan crear y trabaje hacia atrás para dividirlo en partes digeribles. ¿Cuántos hay? ¿Qué idea clave presenta cada uno?

Rareza no esencial (individual / 15)

Betsy Leondar-Wright acuñó la frase “rareza inesencial” para describir cosas que los grupos hacen que no son realmente necesarias, pero que alienan a las personas que aún no son miembros de ese grupo. Sumana Harihareswara luego utilizó esta noción como base para una charla sobre rarezas no esenciales en software de código abierto, que incluye cosas como el uso de herramientas de línea de comandos con nombres crípticos. Tómese unos minutos para leer estos artículos, luego haga una lista de las rarezas no esenciales que cree que sus alumnos podrían encontrar cuando les enseñe por primera vez. ¿Cuántos de estos puedes evitar?

PETE (individual / 15)

Un patrón que funciona bien para programar lecciones es PETE: presentar el problema, trabajar a través de un ejemplo, explicar la teoría y luego elaborar un segundo ejemplo para que los alumnos puedan ver qué es específico de cada caso y qué se aplica a todos los casos. Elija algo que haya enseñado recientemente o que le hayan enseñado y describa una breve lección que siga estos cinco pasos.

PRIMM (individual / 15)

Otro patrón de lección es PRIMM [Sent2019]: predice el comportamiento o la salida de un programa, ejecútelo para ver lo que realmente hace, investigue por qué lo hace al atravesarlo en un depurador o dibujar el flujo de control, modificarlo (o sus entradas ), y luego hacer algo similar desde cero. Elija algo que haya enseñado recientemente o que le hayan enseñado y describa una breve lección que siga estos cinco pasos.

Concreto-Representacional-Abstracto (pares / 15)

Concrete-Representational-Abstract (CRA) es un enfoque para introducir nuevas ideas que se usa principalmente con los alumnos más jóvenes: manipular físicamente un objeto concreto, representar el objeto con una imagen, luego realizar las mismas operaciones usando números, símbolos o alguna otra abstracción .

  1. Escriba cada uno de los números 2, 7, 5, 10, 6 en una nota adhesiva.

  2. Simule un bucle que encuentre el valor más grande al mirar cada uno a su vez (concreto).

  3. Dibuje un diagrama del proceso que utilizó, etiquetando cada paso (representacional).

  4. Escriba las instrucciones que alguien más podría seguir para seguir los mismos pasos (resumen).

Compare sus materiales representativos y abstractos con los de su compañero.

Evaluación de un repositorio de lecciones (grupos pequeños / 10)

[Leak2017] explora por qué los profesores de informática no usan sitios para compartir lecciones y recomienda formas de hacerlos más atractivos:

  1. La página de destino debe permitir a los visitantes del sitio identificar sus antecedentes y sus intereses en visitar el sitio. Los sitios deben hacer dos preguntas: “¿Cuál es su rol actual?” y “¿En qué curso y nivel de grado está interesado?”

  2. Los sitios deben mostrar todos los recursos de aprendizaje en el contexto del curso completo para que los usuarios potenciales puedan comprender su contexto de uso previsto.

  3. Muchos maestros tienen inquietudes acerca de que sus pares (falta de) conocimiento sean juzgados por sus compañeros si publican en los foros de discusión de los sitios. Por lo tanto, estos foros deberían permitir la publicación anónima.

En pequeños grupos, discuta si estas tres características serían suficientes para convencerlo de que use un sitio para compartir lecciones, y si no, qué sería.

Resumen

pesrsonas

Conocimiento pedagógico del contenido

Cada maestro necesita tres cosas:

El conocimiento del contenido como cómo programar;

Conocimiento pedagógico general como la comprensión de la psicología del aprendizaje; y

Conocimiento de contenido pedagógico (PCK), que es el conocimiento específico del dominio de cómo enseñar un concepto particular a una audiencia particular. En informática, PCK incluye cosas como qué ejemplos usar cuando se enseña cómo se pasan los parámetros a una función o qué conceptos erróneos sobre el anidamiento de etiquetas HTML son más comunes.

Podemos agregar conocimiento técnico a esta mezcla [Koeh2013], pero eso no cambia el punto clave: no es suficiente conocer la materia y cómo enseñar; hay que saber cómo enseñar esa materia en particular [Maye2004]. Por lo tanto, este capítulo resume algunos resultados de la investigación en educación informática que se agregarán a su tienda de PCK.

Como con toda investigación, se requiere cierta precaución al interpretar los resultados:

Las teorías cambian a medida que hay más datos disponibles. La investigación en educación informática (CER) es una disciplina joven: la Sociedad Estadounidense para la Educación en Ingeniería se fundó en 1893 y el Consejo Nacional de Maestros de Matemáticas en 1920, pero la Asociación de Maestros de Ciencias de la Computación no existió hasta 2005. Si bien un flujo constante de Se informan nuevos conocimientos en conferencias como SIGCSE, ITiCSE e ICER, simplemente no sabemos tanto sobre aprender a programar como sobre aprender a leer, practicar un deporte o hacer aritmética básica.

La mayoría de los temas de estos estudios son extraños: son de sociedades occidentales, educativas, industrializadas, ricas y democráticas [Henr2010]. Lo que es más, también son en su mayoría jóvenes y en aulas institucionales, ya que esa es la población a la que la mayoría de los investigadores tienen acceso más fácil. Sabemos mucho menos sobre adultos, miembros de grupos marginados, estudiantes en entornos de campo libre o programadores de usuarios finales, a pesar de que hay muchos más.

Si se tratara de un tratado académico, por lo tanto, sería el prefacio de la mayoría de las afirmaciones con calificadores como “Algunas investigaciones parecen indicar que …” Pero dado que los maestros reales en las aulas reales tienen que tomar decisiones independientemente de si la investigación tiene respuestas claras o no, esto El capítulo presenta mejores conjeturas accionables en lugar de quizás matices.

Jerga

Como cualquier especialidad, CER tiene jerga. CS1 se refiere a un curso introductorio de un semestre en el que los alumnos cumplen con variables, bucles y funciones por primera vez, mientras que CS2 se refiere a un segundo curso que cubre estructuras de datos básicas como pilas y colas, y CS0 se refiere a un curso introductorio para personas sin ninguna experiencia previa que no tengan la intención de continuar con la informática de inmediato. Las definiciones completas de estos términos se pueden encontrar en las Pautas del plan de estudios de ACM.

¿Qué les estamos enseñando ahora?

Se sabe muy poco sobre lo que enseñan los bootcamps de codificación y otras iniciativas de campo libre, en parte porque muchos son reacios a compartir su plan de estudios. Sabemos más sobre lo que enseñan las instituciones [Luxt2017]:

Topic % Topic %
Programming Process 87% Data Types 23%
Abstract Programming Thinking 63% Input/Output 17%
Data Structures 40% Libraries 15%
Object-Oriented Concepts 36% Variables & Assignment 14%
Control Structures 33% Recursion 10%
Operations & Functions 26% Pointers & Memory Management 5%

Las etiquetas de temas de alto nivel como estas pueden ocultar una multitud de pecados. Un resultado más tangible proviene de [Rich2017] que revisó un centenar de artículos para encontrar trayectorias de aprendizaje para las clases de computación en las escuelas primarias y secundarias. Sus resultados para secuenciación, repetición y condicionales son mapas conceptuales esencialmente colectivos que combinan y racionalizan el pensamiento implícito y explícito de muchos educadores diferentes (Figura [f: pck-trayectoria]).

Condicionales

¿Cuánto están aprendiendo?

Puede haber un mundo de diferencia entre lo que los maestros enseñan y cuánto aprenden los alumnos. Para explorar esto último, debemos usar otras medidas o hacer estudios directos. Tomando el enfoque anterior, aproximadamente dos tercios de los estudiantes postsecundarios pasan su primer curso de computación, con algunas variaciones dependiendo del tamaño de la clase, etc., pero sin diferencias significativas en el tiempo o basadas en el idioma [Benn2007a, Wats2014].

¿Cómo afecta la experiencia previa a estos resultados? Para averiguarlo, [Wilc2018] comparó el rendimiento y la confianza de los novatos con y sin experiencia previa en programación en CS1 y CS2 (ver más abajo). Descubrieron que los novatos con experiencia previa superaron a los novatos sin un 10% en CS1, pero esas diferencias desaparecieron al final de CS2. También descubrieron que las mujeres con exposición previa superaron a sus pares masculinos en todas las áreas, pero siempre tenían menos confianza en sus habilidades (Sección 10.4).

En cuanto a los estudios directos de cuánto aprenden los principiantes, [McCr2001] presentó un estudio internacional de múltiples sitios que luego fue replicado por [Utti2013]. Según el primer estudio, “… los resultados decepcionantes sugieren que muchos estudiantes no saben programar al finalizar sus cursos introductorios”. Más específicamente, “Para una muestra combinada de 216 estudiantes de cuatro universidades, el puntaje promedio fue de 22.89 de 110 puntos en los criterios generales de evaluación desarrollados para este estudio”. Este resultado puede decir tanto sobre las expectativas de los maestros como sobre la capacidad de los estudiantes, pero de cualquier manera, nuestra primera recomendación es medir y rastrear los resultados de manera que se puedan comparar con el tiempo para que pueda saber si sus lecciones se están volviendo más o menos. menos efectivo.

¿Qué ideas erróneas tienen los novatos?

El Capítulo 2 explica por qué aclarar los conceptos erróneos de los principiantes es tan importante como enseñarles estrategias para resolver problemas. El error más grande que los novatos tienen, a veces llamado la “superbacteria” en la codificación, es la creencia de que las computadoras entienden lo que las personas quieren decir de la misma manera que otro ser humano [Pea1986]. Por lo tanto, nuestra segunda recomendación es enseñar a los novatos que las computadoras no entienden los programas, es decir, que llamar a un “costo” variable no garantiza que su valor sea realmente un costo.

[Sorv2018] presenta más de cuarenta conceptos erróneos que los maestros también pueden tratar de aclarar, muchos de los cuales también se discuten en la encuesta de [Qian2017]. Una es la creencia de que las variables en los programas funcionan de la misma manera que en las hojas de cálculo, es decir, después de ejecutar:

grado = 65 total = grado + 10 grado = 80 imprimir (total) el valor del total será 90 en lugar de 75 [Kohn2017]. Este es un ejemplo de la forma en que los novatos construyen un modelo mental plausible pero equivocado haciendo analogías; Otros conceptos erróneos incluyen:

Una variable contiene el historial de los valores que le han sido asignados, es decir, recuerda cuál era su valor.

Se garantiza que dos objetos con el mismo valor para un atributo de nombre o id serán el mismo objeto.

Las funciones se ejecutan como se definen o se ejecutan en el orden en que se definen.

¿Qué errores cometen los novatos?

Los errores que cometen los principiantes pueden decirnos qué priorizar en nuestra enseñanza, pero resulta que la mayoría de los maestros no saben cuán comunes son realmente los diferentes tipos de errores. El estudio más grande de esto es, [Brow2017], que encontró que las comillas y paréntesis no coincidentes son el tipo más común de errores en los programas Java novatos, pero también son los más fáciles de corregir, mientras que algunos errores (como poner la condición de un if en {} en lugar de ()) con mayor frecuencia se hacen solo una vez. Como era de esperar, los errores que producen errores de compilación se corrigen mucho más rápido que los que no. Sin embargo, algunos errores se cometen muchas veces, como invocar métodos con argumentos incorrectos (por ejemplo, pasar una cadena en lugar de un entero).

No es correcto o no está hecho

Una dificultad en una investigación como esta es distinguir los errores del trabajo en progreso. Por ejemplo, una instrucción if vacía o un método que se define pero aún no se usa puede ser un signo de código incompleto en lugar de un error.

[Brow2017] también comparó los errores que los principiantes realmente cometen con lo que sus maestros pensaron que cometieron. Descubrieron que, “… los educadores solo formaron un consenso débil sobre qué errores son más frecuentes, que sus clasificaciones solo tenían una correspondencia moderada con los estudiantes en los … datos, y que la experiencia de los educadores no tuvo ningún efecto en este nivel de acuerdo”. Por ejemplo, confundir = (asignación) y == (igualdad) no era tan común como la mayoría de los maestros creían.

No solo por código

[Park2015] recopiló datos de un editor HTML en línea durante un curso introductorio de desarrollo web y descubrió que casi todos los alumnos cometieron errores de sintaxis que permanecieron sin resolver semanas después del curso. El 20% de estos errores se relacionan con las reglas relativamente complejas que dictan cuándo es válido que los elementos HTML se aniden entre sí, pero el 35% se relaciona con la sintaxis de etiqueta más simple que determina cómo se anidan los elementos HTML. La tendencia de muchos maestros a decir: “Pero las reglas son simples”, es un buen ejemplo de punto ciego experto que se analiza en el Capítulo 3 …

¿Cómo se programa de novicios?

[Solo1984, Solo1986] fue pionero en la exploración de estrategias de programación para principiantes y expertos. El hallazgo clave es que los expertos saben tanto “qué” como “cómo”, es decir, entienden qué poner en los programas y tienen un conjunto de patrones o planes de programas para guiar su construcción. Los principiantes carecen de ambos, pero la mayoría de los maestros se centran únicamente en el primero, a pesar de que los errores a menudo son causados por no tener una estrategia para resolver el problema en lugar de la falta de conocimiento sobre el idioma. Un trabajo reciente ha demostrado la efectividad de enseñar cuatro habilidades distintas en un orden específico [Xie2019]:

La condición de un ciclo while se evalúa constantemente y el ciclo se detiene tan pronto como se vuelve falso. Por el contrario, las condiciones en si las declaraciones también se evalúan constantemente, y sus declaraciones se ejecutan tan pronto como la condición se vuelve verdadera, independientemente de dónde esté el flujo de control en ese momento.

La asignación mueve valores, es decir, después de a = b, la variable b está vacía.

semantics of code templates related to goals
reading 1. read code and predict behavior 3. recognize templates and their uses
writing 2. write correct syntax 4. use templates to meet goals

Por lo tanto, nuestras próximas recomendaciones son que los alumnos lean el código, luego lo modifiquen, luego lo escriban e introduzcan patrones comunes explícitamente y que los alumnos practiquen su uso. [Mull2007b] es solo uno de los muchos estudios que demuestran los beneficios de enseñar patrones comunes explícitamente, y descomponer los problemas en patrones crea oportunidades naturales para crear y etiquetar submetas [Marg2012, Marg2016].

¿Cómo se depuran los novatos?

Hace una década, [McCa2008] escribió: “Es sorprendente lo poco que se dedica el espacio de página a errores y depuración en la mayoría de los libros de texto introductorios de programación”. Poco ha cambiado desde entonces: hay cientos de libros sobre compiladores y sistemas operativos, pero solo unos pocos sobre depuración, y nunca he visto un curso de pregrado dedicado al tema.

[List2004, List2009] descubrió que muchos novatos luchaban por predecir la salida de piezas cortas de código y seleccionar la finalización correcta del código de un conjunto de posibilidades cuando se les decía lo que se suponía que debía hacer. Más recientemente, [Harr2018] descubrió que la brecha entre poder rastrear el código y poder escribirlo se ha cerrado en gran medida por CS2, pero que los principiantes que todavía tienen una brecha (en cualquier dirección) probablemente lo hagan mal.

Por lo tanto, nuestra quinta recomendación es enseñar explícitamente a los novatos a depurar. [Fitz2008, Murp2008] descubrió que los buenos depuradores eran buenos programadores, pero no todos los buenos programadores eran buenos para la depuración. Aquellos que usaron un depurador simbólico para recorrer sus programas, rastrearon la ejecución a mano, escribieron pruebas y releyeron las especificaciones con frecuencia, que son todos hábitos de enseñanza. Sin embargo, el seguimiento de la ejecución paso a paso a veces se usaba de manera ineficaz: por ejemplo, un novato podría poner la misma declaración de impresión en ambas partes de un if-else. Los novatos también comentarían las líneas que en realidad eran correctas al tratar de aislar un problema; los maestros pueden cometer estos dos errores deliberadamente, señalarlos y corregirlos para ayudar a los novatos a superarlos.

Enseñar a los principiantes a depurar también puede ayudar a que las clases sean más fáciles de manejar. [Alqa2017] descubrió que los alumnos con más experiencia resolvieron los problemas de depuración significativamente más rápido, pero los tiempos variaron ampliamente: 4-10 minutos era un rango típico para ejercicios individuales, lo que significa que algunos Los alumnos necesitan 2–3 veces más que otros para realizar los mismos ejercicios. Enseñar a los alumnos más lentos lo que hacen los más rápidos ayudará a que el progreso general del grupo sea más uniforme.

La depuración depende de poder leer el código, que múltiples estudios han demostrado que es la forma más efectiva de encontrar errores [Basi1987, Keme2009, Bacc2013]. La rúbrica de calidad de código desarrollada en [Steg2014, Steg2016a] es una buena lista de verificación de las cosas que debe buscar, aunque se presenta mejor en fragmentos en lugar de todos a la vez.

Hacer que los alumnos lean el código y resuman su comportamiento es un buen ejercicio (Sección 5.1), pero a menudo toma demasiado tiempo para ser práctico en clase. Hacer que pronostiquen la salida de un programa justo antes de que se ejecute, por otro lado, ayuda a reforzar el aprendizaje (Sección 9.11) y también les da un momento natural para hacer preguntas de “qué pasaría si”. Los maestros o los alumnos también pueden rastrear los cambios en las variables a medida que avanzan, lo que [Cunn2017] encontró efectivo (Sección 12.2).

¿Qué pasa con las pruebas?

Los programadores novatos parecen tan reacios a probar software como los profesionales. No hay duda de que hacerlo es valioso: [Cart2017] descubrió que los principiantes de alto rendimiento pasaban mucho tiempo probando, mientras que los de bajo rendimiento pasaban mucho más tiempo trabajando en código con errores, y muchos maestros requieren que los alumnos escriban pruebas para las tareas. ¿Pero qué tan bien hacen esto? Una respuesta proviene de [Bria2015], que calificó los programas de los alumnos según la cantidad de casos de prueba proporcionados por el maestro que pasaron esos programas y, a la inversa, califica los casos de prueba escritos por los alumnos de acuerdo con la cantidad de errores sembrados deliberadamente. Descubrieron que las pruebas de los principiantes a menudo tienen una cobertura baja (es decir, no prueban la mayor parte del código) y que a menudo prueban muchas cosas a la vez, lo que dificulta determinar las causas de los errores.

Otra respuesta proviene de [Edwa2014b], que examinó todos los errores en todos los envíos de código de los novatos combinados e identificó los detectados por el conjunto de pruebas de los novatos. Descubrieron que las pruebas de los principiantes solo detectaban un promedio del 13,6% de las fallas presentes en toda la población del programa. Además, el 90% de las pruebas de los principiantes fueron muy similares, lo que indica que los principiantes escriben principalmente pruebas para confirmar que el código está haciendo lo que se supone que debe hacer en lugar de encontrar casos en los que no.

Un enfoque para enseñar mejores prácticas de prueba es definir un problema de programación al proporcionar un conjunto de pruebas que se aprobarán en lugar de a través de una descripción escrita (Sección 12.1). Sin embargo, antes de hacer esto, tómese un momento para ver cuántas pruebas ha escrito recientemente para su propio código, y luego decida si está enseñando qué cree que deberían hacer las personas o qué hacen (y usted) realmente.

¿Importan los idiomas?

La respuesta corta es “sí”: los novatos aprenden a programar más rápido y aprenden más utilizando herramientas basadas en bloques como Scratch (Figura [f: pck-scratch]) [Wein2017]. Una razón es que los sistemas basados en bloques reducen la carga cognitiva al eliminar la posibilidad de errores de sintaxis. Otra es que las interfaces de bloque fomentan la exploración de una manera que el texto no: como todas las buenas herramientas, Scratch se puede aprender accidentalmente [Malo2010].

Pero, ¿qué sucede después de los bloques? [Chen2018] descubrió que los alumnos cuyo primer lenguaje de programación era gráfico tenían calificaciones más altas en los cursos de programación introductoria que aquellos cuyo primer idioma era textual cuando los idiomas se introdujeron en o antes de los primeros años de la adolescencia. Por lo tanto, nuestra sexta recomendación es comenzar a niños y adolescentes con interfaces basadas en bloques antes de pasar a sistemas basados en texto. La calificación de edad está ahí porque Scratch deliberadamente parece que está destinado a usuarios más jóvenes, y aún puede ser difícil convencer a los adultos de que lo tomen en serio.

Scratch

Scratch probablemente ha sido estudiado más que cualquier otra herramienta de programación. Un ejemplo es [Aiva2016], que analizó más de 250,000 proyectos de Scratch y descubrió (entre otras cosas) que aproximadamente el 28% de los proyectos tienen algunos bloques que nunca se llaman o activan. Como en el apartado anterior sobre los programas Java incompletos versus incorrectos, los autores plantean la hipótesis de que los usuarios pueden estar utilizando estos bloques como un bloc de notas para realizar un seguimiento de los bits de código que (todavía) no quieren tirar. Otro ejemplo es [Grov2017, Mlad2017], que estudió a los principiantes aprendiendo sobre bucles en Scratch, Logo y Python. Descubrieron que las ideas erróneas sobre los bucles se minimizan cuando se usa un lenguaje basado en bloques en lugar de un lenguaje basado en texto. Además, a medida que las tareas se vuelven más complejas (como el uso de bucles anidados) las diferencias se hacen más grandes.

Más duro de lo necesario

Los creadores de lenguajes de programación hacen que esos lenguajes sean más difíciles de aprender al no realizar pruebas básicas de usabilidad. Por ejemplo, [Stef2013] descubrió que, “… las tres palabras más comunes para bucles en ciencias de la computación, para, while y foreach, fueron calificadas como las tres opciones menos intuitivas por los no programadores”. Su trabajo muestra que la sintaxis de estilo C (como se usa en Java y Perl) es tan difícil de aprender para los principiantes como una sintaxis diseñada al azar, pero que la sintaxis de lenguajes como Python y Ruby es significativamente más fácil de aprender, y la sintaxis de un lenguaje cuyas características se prueban antes de agregarse al lenguaje es aún más fácil. [Stef2017] es un breve resumen útil de lo que realmente sabemos sobre el diseño de lenguajes de programación y por qué creemos que es cierto, mientras que [Guzd2016] expone cinco principios que los lenguajes de programación para los alumnos deben seguir.

Programación orientada a objetos

Los objetos y las clases son herramientas poderosas para programadores experimentados, y muchos educadores abogan por un primer enfoque de objetos para la programación de la enseñanza (aunque a veces no están de acuerdo exactamente sobre lo que eso significa [Benn2007b]). [Sorv2014] describe y motiva este enfoque, y [Koll2015] describe Tres generaciones de herramientas diseñadas para soportar la programación de principiantes en entornos orientados a objetos.

Introducir objetos temprano tiene algunos desafíos. [Mill2016b] descubrió que la mayoría de los principiantes que usan Python luchaban por comprenderse a sí mismos (lo que se refiere al objeto actual): lo omitieron en las definiciones de métodos, no lo usaron al hacer referencia a los atributos de los objetos, o ambos [ Rago2017] encontró algo similar en los estudiantes de secundaria, y también descubrió que los maestros de secundaria a menudo tampoco tenían claro el concepto. A fin de cuentas, recomendamos que los maestros comiencen con funciones en lugar de objetos, es decir, que a los alumnos no se les enseñe cómo definir clases hasta que comprendan las estructuras de control básicas y los tipos de datos.

Declaraciones de tipo

Los programadores han discutido durante décadas acerca de si los tipos de datos de las variables deberían ser declarados o no, generalmente en función de su experiencia personal como profesionales en lugar de cualquier tipo de datos. los programas tienen cierta complejidad, pero vale la pena con bastante rapidez al actuar como documentación para el uso de un método, en particular al evitar preguntas sobre lo que está disponible y cómo usarlo.

Nomenclatura variable

[Kern1999] escribió: “A menudo se alienta a los programadores a usar nombres de variables largos independientemente del contexto. Esto es un error: la claridad a menudo se logra a través de la brevedad”. Muchos programadores creen esto, pero [Hofm2017] descubrió que el uso de palabras completas en nombres de variables condujo a un promedio de comprensión un 19% más rápido en comparación con letras y abreviaturas. En contraste, [Beni2017] descubrió que el uso de nombres de variables de una letra no afectaba la capacidad de los principiantes para modificar el código. Esto puede deberse a que sus programas son más cortos que los profesionales o porque algunos nombres de variables de una sola letra tienen tipos y significados implícitos. Por ejemplo, la mayoría de los programadores suponen que i, j y n son enteros y que s es una cadena, mientras que x, y y z son números de punto flotante o enteros más o menos equitativamente.

¿Qué tan importante es esto? [Bink2012] informó que leer y comprender el código es fundamentalmente diferente de leer la prosa: “… la estructura más formal y la sintaxis del código fuente permite a los programadores asimilar y comprender partes del código con bastante rapidez independientemente del estilo. En particular … las balizas y los planes de programa juegan un papel importante en la comprensión”. También descubrió que los desarrolladores experimentados no se ven afectados por el estilo del identificador, por lo que nuestra recomendación es utilizar un estilo coherente en todos los ejemplos. Dado que la mayoría de los idiomas tienen guías de estilo (por ejemplo, PEP 8 para Python) y herramientas para verificar que el código siga estas pautas, nuestra recomendación completa es usar herramientas para garantizar que todos los ejemplos de código se adhieran a un estilo consistente.

¿Ayudan los mejores mensajes de error?

Los mensajes de error incomprensibles son una fuente importante de frustración para los principiantes (y también para programadores experimentados). Por lo tanto, varios investigadores han explorado si mejores mensajes de error ayudarían a aliviar esto. Por ejemplo, [Beck2016] reescribió algunos de los mensajes del compilador de Java para que en lugar de:

C:\stj\Hello.java:2: error: cannot find symbol
        public static void main(string[ ] args)
^
1 error
Process terminated ... there were problems.
learners would see:

Looks like a problem on line number 2.
If "string" refers to a datatype, capitalize the 's'!

Efectivamente, los novatos que recibieron estos mensajes cometieron menos errores repetidos y menos errores en general.

[Bari2017] fue más allá y utilizó el seguimiento ocular para mostrar que a pesar de las quejas de los escritores de compiladores, las personas realmente leen los mensajes de error; de hecho, pasan del 13 al 25% de su tiempo haciendo esto. Sin embargo, leer mensajes de error resulta ser tan difícil como leer el código fuente, y lo difícil que es leer los mensajes de error predice fuertemente el rendimiento de la tarea. Por lo tanto, los maestros deben mostrar a los alumnos cómo leer e interpretar los mensajes de error. [Marc2011] tiene una rúbrica para las respuestas a los mensajes de error que pueden ser útiles para calificar tales ejercicios.

¿Ayuda la visualización?

Visualizar la ejecución del programa es una idea cada vez más popular, y las herramientas como el Tutor de Python en línea [Guo2013] y Loupe (que muestra cómo funciona el bucle de eventos de JavaScript) son útiles para la enseñanza. Sin embargo, las personas aprenden más de la construcción de visualizaciones que de la visualización de visualizaciones construidas por otros, [Stas1998, Ceti2016] entonces, ¿la visualización realmente ayuda al aprendizaje?

Para responder a esto, [Cunn2017] replicó un estudio anterior de los tipos de bocetos que los alumnos hacen al rastrear la ejecución del código. Descubrieron que no dibujar en absoluto se correlaciona con un menor éxito, mientras que el seguimiento de los cambios en los valores de las variables escribiendo nuevos valores cerca de sus nombres a medida que cambian era la estrategia más efectiva.

Un posible efecto de confusión que verificaron fue el tiempo: dado que los dibujantes tardan significativamente más tiempo en resolver problemas, ¿lo hacen mejor solo porque piensan por más tiempo? La respuesta es no: no hubo correlación entre el tiempo necesario y el puntaje alcanzado. Por lo tanto, nuestra recomendación es enseñar a los alumnos a rastrear los valores de las variables al depurar.

Diagramas de flujo

Un hallazgo que a menudo se pasa por alto sobre la visualización es que las personas entienden los diagramas de flujo mejor que el pseudocódigo si ambos están igualmente bien estructurados [Scan1989]. Trabajos anteriores que muestran que los diagramas de flujo superados en el pseudocódigo utilizaron pseudocódigo estructurado y diagramas de flujo enredados; Cuando se nivelaba el campo de juego, a los novatos les iba mejor con la representación gráfica.

¿Qué más podemos hacer para ayudar?

[Viha2014] examinó la mejora promedio en las tasas de aprobación de varios tipos de intervención en las clases de programación. Señalan que hay muchas razones para tomar sus conclusiones con un grano de sal: las prácticas de enseñanza previas al cambio rara vez se establecen claramente, la calidad del cambio no se juzga, y solo el 8.3% de los estudios informaron resultados negativos, por lo que es positivo el sesgo de informes o la forma en que enseñamos en este momento es lo peor posible y cualquier cosa sería una mejora. Y como muchos otros estudios discutidos en este capítulo, solo estaban viendo clases universitarias, por lo que sus hallazgos pueden no generalizarse a otros grupos.

Con esas advertencias en mente, encontraron diez cosas que los maestros pueden hacer para mejorar los resultados (Figura [f: pck-intervenciones]):

Colaboración: Actividades que fomentan la colaboración de los alumnos, ya sea en aulas o laboratorios.

Cambio de contenido: Se modificaron o actualizaron partes del material didáctico.

Contextualización: El contenido y las actividades del curso se alinearon con un contexto específico, como juegos o medios.

CS0: Creación de un curso preliminar a tomar antes del curso introductorio de programación; podría organizarse solo para algunos (por ejemplo, estudiantes en riesgo).

Tema del juego: Se introdujo un componente temático del juego en el curso.

Sistema de clasificación: Un cambio en el esquema de calificación, como aumentar el peso de las actividades de programación y reducir el peso del examen.

Trabajo en equipo: Actividades con un mayor compromiso de trabajo en grupo, como el aprendizaje en equipo y el aprendizaje cooperativo.

Computación de medios: Actividades que declaran explícitamente el uso de la computación de medios (Capítulo 10).

Apoyo de los compañeros: Apoyo de pares en forma de pares, grupos, tutores o tutores pares contratados.

Otro apoyo: Un término general para todas las actividades de apoyo, p. aumento de horas docentes, canales de soporte adicionales, etc.

întervention

Esta lista destaca la importancia del aprendizaje cooperativo. [Beck2013] analizó esto específicamente durante tres años académicos en cursos impartidos por dos maestros diferentes y encontró beneficios significativos en general y para muchos subgrupos. Los cooperadores obtuvieron calificaciones más altas y dejaron menos preguntas en blanco en el examen final, lo que indica una mayor autoeficacia y disposición para tratar de depurar las cosas.

Computación sin codificación

Escribir código no es la única forma de enseñar a las personas cómo programar: hacer que los novatos trabajen en ejercicios de creatividad computacional mejora las calificaciones en varios niveles [Shel2017]. Un ejercicio típico es describir un objeto cotidiano (como un clip o un cepillo de dientes) en términos de sus entradas, salidas y funciones. Este tipo de enseñanza a veces se llama desconectado; El sitio CS Unplugged tiene lecciones y ejercicios para hacerlo.

¿Dónde sigue?

Para aquellos que quieren profundizar, [Finc2019] es un resumen completo de CER, [Ihan2016] resume los métodos que los estudios usan con más frecuencia. Espero que algún día tengamos catálogos como [Ojos2015] y más materiales de capacitación para maestros como [Hazz2014, Guzd2015a, Sent2018] para ayudarnos a todos a hacerlo mejor.

La mayor parte de la investigación reportada en este capítulo fue financiada públicamente pero está encerrada detrás de los muros de pago: supuse que violé la ley 250 veces para descargar documentos de sitios como Sci-Hub mientras escribía este libro. Espero que llegue el día en que nadie tenga que hacer eso; Si eres un investigador, acelera ese día publicando tu trabajo en lugares de acceso abierto.

Ejercicios

Malentendidos de sus alumnos (grupos pequeños / 15)

Trabajando en grupos pequeños, vuelva a leer la Sección 7.3 y haga una lista de conceptos erróneos que cree que tienen sus alumnos. ¿Qué tan específicos son? ¿Cómo verificaría qué tan precisa es su lista?

Comprobación de errores comunes (individual / 20)

Estos errores comunes se toman de una lista más larga en [Sirk2012]:

Asignación invertida: El alumno asigna el valor de la variable de la izquierda a la variable de la derecha en lugar de al revés.

Rama equivocada: El alumno piensa que el código en el cuerpo de un if se ejecuta incluso si la condición es falsa.

Función de ejecución en lugar de definirla: El alumno cree que una función se ejecuta como se define.

Escriba un ejercicio para cada uno para verificar que los alumnos no estén cometiendo ese error.

Código destrozado (pares / 15)

[Chen2017] describe ejercicios en los que los alumnos reconstruyen el código que ha sido destrozado al eliminar comentarios, eliminar o reemplazar líneas de código, líneas móviles, etc. El rendimiento en estos se correlaciona fuertemente con el rendimiento en las evaluaciones en las que los alumnos escriben código, pero estas preguntas requieren menos trabajo para marcar. Lleve la solución a un ejercicio de programación que haya creado en el pasado, manipúlelo de dos maneras diferentes, intercambie con un compañero y vea cuánto tiempo le lleva a cada uno responder correctamente a la pregunta del otro.

El problema de la lluvia (pares / 10)

[Solo1986] introdujo el problema de la lluvia, que se ha utilizado en muchos estudios posteriores de programación [Fisl2014, Simo2013, Sepp2015]. Escriba un programa que lea repetidamente en enteros positivos hasta que lea el número entero 99999. Después de ver 99999, el programa imprime el promedio de los números vistos.

  1. Resuelve el problema de la lluvia en el lenguaje de programación que elijas.

  2. Compare su solución con la de su compañero. ¿Qué hace el tuyo que el suyo no y viceversa?

Roles de variables (pares / 15)

[Kuit2004, Byck2005, Saja2006] presentó un conjunto de patrones de una sola variable que he encontrado muy útil en la enseñanza de principiantes:

Valor fijo: Un elemento de datos que no obtiene un nuevo valor adecuado después de su inicialización.

Paso a paso: Un elemento de datos que pasa por una sucesión de valores sistemática y predecible.

Caminante: Un elemento de datos que atraviesa una estructura de datos.

Titular más reciente: Un elemento de datos que contiene el último valor encontrado al pasar por una sucesión de valores.

Titular más buscado: Un elemento de datos que contiene el mejor o más apropiado valor encontrado hasta ahora.

Recolector: Un elemento de datos que acumula el efecto de valores individuales.

Seguidor: Un elemento de datos que siempre obtiene su nuevo valor del valor anterior de algún otro elemento de datos.

Bandera unidireccional: Un elemento de datos de dos valores que no puede obtener su valor inicial una vez que se ha cambiado el valor.

Temporal: Un elemento de datos que tiene algún valor solo por un tiempo muy corto.

Organizador: Una estructura de datos que almacena elementos que se pueden reorganizar.

Envase: Una estructura de datos que almacena elementos que se pueden agregar y eliminar.

Elija un programa de 5–15 líneas y clasifique sus variables usando estas categorías. Compara tus clasificaciones con las de un compañero. Cuando no estuvieron de acuerdo, ¿entendieron la opinión del otro?

¿Qué estás enseñando? (individual / 10)

Compare los temas que enseña con la lista desarrollada en [Luxt2017] (Sección 7.1). ¿Qué temas cubren? ¿Cuál no cubres? ¿Qué temas adicionales cubre que no están en su lista?

Actividades beneficiosas (individual / 10)

Mire la lista de intervenciones desarrolladas por [Viha2014] (Sección 7.10). ¿Cuál de estas cosas ya haces en tus clases? ¿Cuáles podrías agregar fácilmente? ¿Cuáles son irrelevantes?

Conceptos erróneos y desafíos (grupos pequeños / 15)

El sitio de Desarrollo Profesional para la Enseñanza de Principios de CS incluye una lista detallada de las ideas y ejercicios erróneos de los alumnos. Trabajando en grupos pequeños, elija una sección (como estructuras de datos o funciones) y revise su lista. ¿Cuál de estos conceptos erróneos recuerda haber tenido cuando era un alumno? ¿Cuál tienes todavía? ¿Qué has visto en tus alumnos?

¿Qué es lo que más te importa? (toda la clase / 15)

[Denn2019] pidió a las personas que propongan y califiquen varias preguntas de CER, y descubrieron que no había superposición entre las que más les importaban a los investigadores y las que a los no investigadores les importaban más. Los favoritos de los investigadores fueron:

  1. ¿Qué conceptos fundamentales de programación son los más desafiantes para los estudiantes?

  2. ¿Qué estrategias de enseñanza son más efectivas cuando se trata de una amplia gama de experiencia previa en clases de programación introductoria?

  3. ¿Qué afecta la capacidad de los estudiantes para generalizar a partir de ejemplos de programación simples?

  4. ¿Qué prácticas de enseñanza son más efectivas para enseñar computación a los niños?

  5. ¿Qué tipo de problemas encuentran los estudiantes en las clases de programación más interesantes?

  6. ¿Cuáles son las formas más efectivas de enseñar programación a varios grupos?

  7. ¿Cuáles son las formas más efectivas de escalar la educación informática para llegar a la población general de estudiantes?

Mientras que las preguntas más importantes para los no investigadores fueron:

  1. ¿Cómo y cuándo es mejor dar a los estudiantes comentarios sobre su código para mejorar el aprendizaje?

  2. ¿Qué tipo de ejercicios de programación son más efectivos al enseñar a los estudiantes de informática?

  3. ¿Cuáles son los méritos relativos del aprendizaje basado en proyectos, las conferencias y el aprendizaje activo para los estudiantes que aprenden computación?

  4. ¿Cuál es la forma más efectiva de proporcionar comentarios a los estudiantes en las clases de programación?

  5. ¿Qué les resulta más difícil a las personas cuando dividen los problemas en tareas más pequeñas mientras programan?

  6. ¿Cuáles son los conceptos clave que los estudiantes deben entender en las clases introductorias de computación?

  7. ¿Cuáles son las formas más efectivas de desarrollar competencia informática entre los estudiantes en disciplinas no informáticas?

  8. ¿Cuál es el mejor orden para enseñar conceptos y habilidades informáticas básicas?

Haga que cada persona en la clase, independientemente, otorgue un punto a cada una de las ocho preguntas de las listas combinadas que más les interesan, luego calcule un puntaje promedio para cada pregunta. ¿Cuáles son los más populares en tu clase? ¿En qué grupo están las preguntas más populares?


La enseñanza como arte de performance

En Darwin Among the Machines, George Dyson escribió: “En el juego de la vida y la evolución hay tres jugadores en la mesa: los seres humanos, la naturaleza y las máquinas. Estoy firmemente del lado de la naturaleza. Pero sospecho que la naturaleza está del lado de las máquinas …”De manera similar, ahora hay tres jugadores en el juego de la educación: libros de texto y otros materiales de solo lectura, conferencias en vivo y lecciones automatizadas en línea. Puede dar a sus alumnos lecciones escritas y una combinación de videos grabados y ejercicios a su propio ritmo, pero si va a enseñar en persona, debe ofrecer algo diferente (y con suerte mejor que) a cualquiera de ellos. Por lo tanto, este capítulo se centra en cómo enseñar programación al hacerlo realmente.

Codificación en vivo

La enseñanza es teatro, no cine.

– Neal Davis

La forma más efectiva de enseñar programación es la codificación en vivo [Rubi2013, Haar2017, Raj2018]. En lugar de presentar material escrito previamente, el maestro escribe el código en frente de la clase mientras los alumnos siguen, escribiéndolo y ejecutándolo a medida que avanzan. La codificación en vivo funciona mejor que las diapositivas por varias razones:

  • Permite la enseñanza activa al permitir que los maestros sigan los intereses y las preguntas de sus alumnos en el momento. Una plataforma deslizante es como una vía de ferrocarril: puede ser un viaje suave, pero debe decidir de antemano a dónde irá. La codificación en vivo es más como conducir un vehículo todoterreno: puede ser más accidentado, pero es mucho más fácil cambiar de dirección e ir a donde la gente quiere.

  • Ver cómo se escribe un programa es más motivador que mirar a alguien pasar las diapositivas.

  • Facilita la transferencia involuntaria de conocimiento: las personas aprenden más de lo que enseñamos conscientemente al observar cómo hacemos las cosas.

  • Disminuye la velocidad del maestro: si tienen que escribir el programa a medida que avanzan, entonces solo pueden ir dos veces más rápido que sus alumnos en lugar de diez veces más rápido que con las diapositivas.

  • Ayuda a reducir la carga en la memoria a corto plazo porque hace que el maestro sea más consciente de cuánto están tirando a sus alumnos.

  • Los alumnos pueden ver cómo diagnosticar y corregir errores. Pasarán mucho tiempo haciendo esto; a menos que sea un mecanógrafo perfecto, la codificación en vivo garantiza que puedan ver cómo hacerlo.

  • Ver a los maestros cometer errores muestra a los alumnos que está bien cometer errores por su cuenta. Si el maestro no se avergüenza de cometer errores y hablar sobre ellos, los alumnos también se sentirán más cómodos haciéndolo.

Otro beneficio de la codificación en vivo es que demuestra el orden en que se deben escribir los programas. Al observar cómo las personas resolvieron los problemas de Parsons, [Ihan2011] descubrió que los programadores experimentados a menudo arrastraban la firma del método al principio, luego agregaban la mayoría del flujo de control (es decir, bucles y condicionales), y solo luego agregaban detalles como la inicialización y el manejo de variables de vitrinas. Esta autoría fuera de orden es ajena a los novatos, que leen y escriben el código en el orden en que se presenta en la página; verlo les ayuda a aprender a descomponer los problemas en submetas que pueden abordarse una por una. La codificación en vivo también brinda a los maestros la oportunidad de enfatizar la importancia de pequeños pasos con comentarios frecuentes [Blik2014] y la importancia de elegir un plan en lugar de hacer cambios más o menos aleatorios y esperar que las cosas mejoren [Spoh1985].

Se necesita un poco de práctica para sentirse cómodo hablando mientras codifica frente a una audiencia, pero la mayoría de las personas informan que rápidamente no se vuelve más difícil que hablar alrededor de una cubierta de diapositivas. Las secciones a continuación ofrecen consejos sobre cómo mejorar su codificación en vivo.

Abraza tus errores

Los errores tipográficos son la pedagogía.

– Emily Jane McTavish

La regla más importante de la codificación en vivo es aceptar sus errores. No importa qué tan bien te prepares, harás algunos; cuando lo haga, piense en ellos con su audiencia. Si bien es difícil obtener datos, los programadores profesionales dedican del 25% al ​​60% de su tiempo a la depuración; los novatos gastan mucho más (Sección 7.6), pero la mayoría de los libros de texto y tutoriales dedican poco tiempo a diagnosticar y corregir problemas. Si hablas en voz alta mientras descubres qué escribiste mal o dónde tomaste el camino equivocado, y explicas cómo te has corregido, les darás a tus alumnos una caja de herramientas que pueden usar cuando cometen sus propios errores.

Tortas deliberadas

Una vez que haya dado una lección varias veces, es poco probable que cometa algo más que errores básicos de escritura (que aún pueden ser informativos). Puede intentar recordar errores pasados y hacerlos deliberadamente, pero eso a menudo se siente forzado. Un enfoque alternativo es la codificación de contracciones: solicite a los alumnos uno por uno que le digan qué escribir a continuación. Esto está prácticamente garantizado para meterte en algún tipo de problema.

Pedir predicciones

Una forma de mantener a los alumnos interesados mientras está codificando en vivo es pedirles que hagan predicciones sobre lo que hará el código en la pantalla. Luego, puede escribir las primeras sugerencias que hacen, hacer que toda la clase vote sobre lo que ellos piensan que es más probable y luego ejecutar el código. Esta es una forma ligera de instrucción entre pares, que discutiremos en la Sección 9.2; además de mantener su atención en la tarea, les da práctica para razonar sobre el comportamiento del código.

Tomar con calma

Cada vez que escriba un comando, agregue una línea de código a un programa, o seleccione un elemento de un menú, diga lo que está haciendo en voz alta y luego señale lo que ha hecho y su salida en la pantalla y repáselo. segunda vez. Esto permite a los alumnos ponerse al día y comprobar que lo que acaban de hacer es correcto. Es particularmente importante cuando algunos de sus alumnos tienen dificultades para ver o escuchar o no dominan el idioma de instrucción.

Hagas lo que hagas, no copie y pegue código: hacer esto prácticamente garantiza que competirá por delante de sus alumnos. Y si utiliza la finalización de tabulación, dígalo en voz alta para que sus alumnos comprendan lo que está haciendo: “Usemos el punto de tortuga” r "" yo “y la tabulación para” hacer lo correcto "

Si la salida de su comando o código hace que lo que acaba de escribir desaparezca de la vista, desplácese hacia arriba para que los alumnos puedan verlo nuevamente. Si eso no es práctico, ejecute el mismo comando por segunda vez o copie y pegue los últimos comandos en las notas compartidas del taller.

Ser visto y escuchado

Cuando se sienta, es más probable que mire su pantalla en lugar de mirar a su audiencia y puede estar oculto de los alumnos en las últimas filas de su clase. Si eres físicamente capaz de pararte durante un par de horas, debes hacerlo mientras enseñas. Planifique esto y asegúrese de tener una mesa elevada, un escritorio de pie o un atril para su computadora portátil para que no tenga que inclinarse para escribir.

Independientemente de si está de pie o sentado, asegúrese de moverse lo más que pueda: vaya a la pantalla para señalar algo, dibuje algo en la pizarra o simplemente aléjese de su computadora por unos momentos y hable directamente con tu audiencia Hacer esto aleja la atención de sus alumnos de sus pantallas y les proporciona un momento natural para hacer preguntas.

Si va a enseñar durante más de un par de horas, vale la pena usar un micrófono incluso en una habitación pequeña. Tu garganta se cansa como cualquier otra parte de tu cuerpo; usar un micrófono no es diferente de usar zapatos cómodos (que también debes hacer). También puede marcar una gran diferencia para las personas con discapacidad auditiva.

Refleje el entorno de su alumno

Es posible que haya personalizado su entorno con un elegante indicador de shell de Unix, un esquema de color personalizado para su entorno de desarrollo o una gran cantidad de métodos abreviados de teclado. Sus alumnos no tendrán nada de esto, así que intente crear un entorno que refleje lo que tienen. Algunos maestros crean una cuenta básica separada en su computadora portátil o una cuenta de solo enseñanza por separado si usan un servicio en línea como Scratch o GitHub. Hacer esto también puede ayudar a evitar que los paquetes que instaló para trabajar ayer rompan la lección que se supone que debe enseñar esta mañana.

Usa la pantalla sabiamente

Por lo general, necesitará agrandar su fuente considerablemente para que las personas la lean desde el fondo de la sala, lo que significa que puede colocar mucho menos en la pantalla de lo que está acostumbrado. En muchos casos, se reducirá a 60–70 columnas y 20–30 filas, por lo que está utilizando una supercomputadora del siglo XXI como si fuera una terminal tonta de principios de la década de 1980.

Para gestionar esto, maximice la ventana que está utilizando para enseñar y luego pídales a todos que den su aprobación o rechace su legibilidad. Use una fuente negra sobre un fondo ligeramente teñido en lugar de una fuente clara sobre un fondo oscuro; el tono claro deslumbrará menos que el blanco puro.

Preste atención también a la iluminación de la habitación: no debe estar completamente oscura y no debe haber luces directamente sobre o encima de la pantalla de proyección. Permita unos minutos para que los alumnos vuelvan a colocar sus mesas para que puedan ver con claridad.

Cuando la parte inferior de la pantalla de proyección está a la misma altura que las cabezas de los alumnos, las personas en la parte posterior no podrán ver las partes inferiores. Puede elevar la parte inferior de su ventana para compensar, pero esto le dará aún menos espacio para escribir.

Si puede obtener un segundo proyector y pantalla, úselo: el espacio adicional le permitirá mostrar su código en un lado y su salida o comportamiento en el otro. Si la segunda pantalla requiere su propia computadora, pídale a un ayudante que la controle en lugar de saltar entre dos teclados.

Finalmente, si está enseñando algo como el shell de Unix en una ventana de consola, es importante decirle a la gente cuándo ejecuta un editor de texto en la consola y cuándo regresa al indicador de la consola. La mayoría de los principiantes nunca han visto una ventana asumir múltiples personalidades de esta manera, y pueden confundirse rápidamente cuando interactúa con el shell, cuando escribe en el editor y cuando se trata de un mensaje interactivo para Python o algunos otro idioma. Puede evitar este problema utilizando una ventana separada para editar; Si hace esto, siempre informe a los alumnos cuando cambien el enfoque de uno a otro.

Las ayudas de accesibilidad ayudan a todos

Las herramientas como Mouseposé (para Mac) y PointerFocus (para Windows) resaltan la posición del cursor del mouse en la pantalla, y las herramientas de grabación de pantalla como Camtasia y aplicaciones independientes como KeyCastr hacen eco de teclas invisibles como tab y Control-J mientras las escribe. Estos pueden ser un poco molestos cuando comienzas a usarlos, pero ayuda a tus alumnos a descubrir lo que estás haciendo.

Dispositivos dobles

Algunas personas ahora usan dos dispositivos cuando enseñan: una computadora portátil conectada al proyector para que los alumnos la vean y una tableta para que puedan ver sus propias notas y las notas que los alumnos están tomando (Sección 9.7). Esto es más confiable que pasar de un lado a otro entre escritorios virtuales, aunque una impresión de la lección sigue siendo la tecnología de respaldo más confiable.

Dibuja temprano, dibuja a menudo

Los diagramas son siempre una buena idea. A veces tengo una plataforma de diapositivas llena de las que he preparado de antemano, pero construir diagramas paso a paso ayuda con la retención (Sección 4.1) y le permite improvisar.

Evitar distracciones

Desactive las notificaciones que pueda usar en su computadora portátil, especialmente las de las redes sociales. Ver mensajes parpadeando en la pantalla lo distrae a usted y a sus alumnos, y puede ser incómodo cuando aparece un mensaje que prefiere que otros no vean. Nuevamente, es posible que desee crear una segunda cuenta en su computadora que no tenga correo electrónico u otras herramientas configuradas.

Improvisar: después de conocer el material

Apéguese bastante al plan de la lección que ha elaborado o prestado la primera vez que imparte una lección. Puede ser tentador desviarse del material porque le gustaría mostrar un buen truco o demostrar otra forma de hacer algo, pero existe la posibilidad de que encuentre algo inesperado que le costará más tiempo del que tiene.

Sin embargo, una vez que esté más familiarizado con el material, puede y debe comenzar a improvisar según los antecedentes de sus alumnos, sus preguntas en clase y lo que personalmente le parezca más interesante. Esto es como tocar una nueva canción: te quedas con la partitura las primeras veces, pero después de que te sientas cómodo con los cambios de melodía y acordes, puedes comenzar a poner tu propio sello.

Cuando quieras usar algo nuevo, revísalo de antemano usando la misma computadora en la que estarás enseñando: instalar varios cientos de megabytes de software a través de WiFi de la escuela secundaria frente a aburridos jóvenes de 16 años no es algo que alguna vez quieras tener que hacer

Instrucción directa

La Instrucción Directa (DI) es un método de enseñanza centrado en el diseño meticuloso del currículo entregado a través de un guión prescrito. Es más como un actor recitando líneas que como el enfoque de improvisación que recomendamos. [Stoc2018] encontró un efecto positivo estadísticamente significativo para DI a pesar de que a veces se golpea por ser mecánico. Prefiero la improvisación porque la DI requiere más preparación inicial de la que la mayoría de los grupos de aprendizaje de campo libre pueden permitirse.

Mira la pantalla: de vez en cuando

Está bien enfrentar la pantalla de proyección ocasionalmente cuando está caminando a través de una sección de código o dibujando un diagrama: no mirar una habitación llena de personas que lo están mirando a usted puede ayudarlo a reducir sus niveles de ansiedad y darle un momento para pensar qué para decir a continuación.

Sin embargo, no debes hacer esto por más de unos segundos a la vez. Una buena regla general es tratar la pantalla de proyección como uno de sus alumnos: si le resultara incómodo mirar a alguien durante el tiempo que pasa mirando la pantalla, es hora de darse la vuelta y mirar a su clase nuevamente.

Inconvenientes

La codificación en vivo tiene algunos inconvenientes, pero todos se pueden evitar o solucionar con un poco de práctica. Si descubres que estás cometiendo demasiados errores de escritura triviales, reserva cinco minutos todos los días para practicar la escritura: también te ayudará en tu trabajo diario. Si cree que está pasando demasiado tiempo refiriéndose a las notas de su lección, divídalas en partes más pequeñas para que solo tenga que pensar en un pequeño paso a la vez.

Y si siente que está pasando demasiado tiempo escribiendo declaraciones de importación de bibliotecas, encabezados de clase y otro código repetitivo, entregue a usted y a sus alumnos un código esqueleto como punto de partida (Sección 9.9). Hacer esto también reducirá su carga cognitiva, ya que centrará su atención donde lo desee.

Estudio de la lección

Desde políticos hasta investigadores y maestros, los reformadores educativos han diseñado sistemas para encontrar y promover personas que puedan enseñar bien y eliminar a quienes no pueden. Pero la suposición de que algunas personas nacen como docentes es errónea: en cambio, como cualquier otra representación artística, las claves para una mejor enseñanza son la práctica y la colaboración. Como explica [Gree2014], el enfoque japonés a esto se llama jugyokenkyu, que significa “estudio de lección”:

Para graduarse, las especializaciones en educación [japonesa] no solo tenían que ver el trabajo de su maestro asignado, sino que debían reemplazarlo efectivamente, instalándose primero en su aula como observadores y luego, a la tercera semana, como una aproximación vacilante … El maestro mismo. Funcionó como una especie de relevo de enseñanza. Cada alumno tomó una asignatura, planeando cinco días de lecciones … [y luego] cada uno tomó un día. Para pasar el testigo, tenía que enseñar una lección de un día en cada asignatura: la que planeaba y las cuatro que no … y tenía que hacerlo directamente bajo la nariz de su maestro. Después, todos, el maestro, los estudiantes universitarios y, a veces, incluso otro observador externo, se sentaban alrededor de una mesa formal para hablar sobre lo que vieron.

Poner el trabajo bajo un microscopio para mejorarlo es común en campos tan diversos como la fabricación y la música. Un músico profesional, por ejemplo, diseccionará media docena de grabaciones de “Body and Soul” o “Smells Like Teen Spirit” antes de interpretarlo. También esperarían recibir comentarios de otros músicos durante la práctica y después de las actuaciones.

Pero la retroalimentación continua no es parte de la cultura de enseñanza en la mayoría de los países de habla inglesa. Allí, lo que sucede en el aula se queda en el aula: los maestros no miran las lecciones de los demás de manera regular, por lo que no pueden tomar prestadas las buenas ideas de los demás. Los maestros pueden obtener planes de lecciones y tareas de colegas, la junta escolar o un editor de libros de texto, o revisar algunos MOOC en Internet, pero cada uno tiene que descubrir cómo impartir lecciones específicas en aulas específicas para alumnos específicos. Esto es particularmente cierto para los voluntarios y otros maestros de campo que participan en talleres y campamentos después de la escuela.

Escribir nuevas técnicas y dar lecciones de demostración (en las que una persona enseña a estudiantes reales mientras otros maestros observan) no son soluciones. Por ejemplo, [Finc2007, Finc2012] encontró que de las 99 historias de cambio analizadas, los maestros solo buscaron activamente nuevas prácticas o materiales en tres casos, y solo consultaron el material publicado en ocho. La mayoría de los cambios ocurrieron localmente, sin aportes de fuentes externas, o solo involucraron interacción personal con otros educadores. [Bark2015] encontró algo similar:

La adopción no es una “acción racional” … sino una serie iterativa de decisiones tomadas en un contexto social, que se basa en tradiciones normativas, indicaciones sociales y procesos emocionales o intuitivos … No es probable que los profesores utilicen los resultados de la investigación educativa como base para las decisiones de adopción … La retroalimentación positiva de los estudiantes se toma como una fuerte evidencia por parte del profesorado de que deben continuar una práctica.

Jugyokenkyu funciona porque maximiza la oportunidad de transferencia de conocimiento no planificada entre maestros: alguien se propone demostrar X, pero mientras los mira, su audiencia también aprende Y (o en su lugar). Por ejemplo, un maestro podría tener la intención de mostrar a los alumnos cómo buscar direcciones de correo electrónico en un archivo de texto, pero lo que su audiencia podría eliminar son algunos atajos de teclado nuevos.

Dando y recibiendo retroalimentación sobre la enseñanza

Observar a alguien te ayuda, y darle retroalimentación lo ayuda, pero puede ser difícil recibir retroalimentación, especialmente cuando es negativo (Figura [f: desempeño-retroalimentación-sentimientos]).

f: desempeño-retroalimentación-sentimientos

La retroalimentación es más fácil de dar y recibir cuando ambas partes comparten expectativas sobre lo que está y no está en el alcance y sobre cómo se deben redactar los comentarios. Si usted es la persona que solicita comentarios:

Iniciar comentarios. Es mejor pedir comentarios que recibirlos de mala gana.

Elige tus propias preguntas, es decir, pedir comentarios específicos. Es mucho más difícil para alguien responder: “¿Qué te parece?” que responder: “¿Estaba hablando demasiado rápido?” o “¿Qué es una cosa de esta lección que debería seguir haciendo?” Dirigir comentarios como este también es más útil para usted. Siempre es mejor tratar de arreglar una cosa a la vez que cambiar todo y esperar que sea para mejor. Dirigir comentarios sobre algo en lo que has elegido trabajar te ayuda a mantenerte enfocado, lo que a su vez aumenta las probabilidades de que veas progreso.

Use un traductor de comentarios. Haga que otra persona lea todos los comentarios y le dé un resumen. Puede ser más fácil escuchar: “Varias personas piensan que podría acelerar un poco”, que leer varias notas que dicen: “Esto es demasiado lento” o “Esto es aburrido”.

Ser amable con usted mismo. Muchos de nosotros somos muy críticos con nosotros mismos, por lo que siempre es útil anotar lo que pensamos de nosotros mismos antes de recibir comentarios de los demás. Eso nos permite comparar lo que pensamos de nuestro desempeño con lo que otros piensan, lo que a su vez nos permite escalar el primero con mayor precisión. Por ejemplo, es muy común que las personas piensen que están diciendo “um” y “err” con demasiada frecuencia cuando su audiencia no lo nota. Obtener esa retroalimentación una vez les permite a los maestros ajustar su evaluación de sí mismos la próxima vez que se sientan así. También puede dar retroalimentación a otros de manera más efectiva:

Interactuar. Mirar fijamente a alguien es una buena manera de hacer que se sienta incómodo, por lo que si desea dar su opinión sobre cómo alguien normalmente enseña, debe tranquilizarlo. Interactuar con ellos de la forma en que lo haría un alumno real es una buena manera de hacerlo, así que haga preguntas o (finja) escribir junto con su ejemplo. Si usted es parte de un grupo, haga que una o dos personas desempeñen el papel de aprendices mientras los demás toman notas.

Balance de retroalimentación positiva y negativa. El “sándwich de cumplido” compuesto por un comentario positivo, uno negativo y un segundo positivo se vuelve cansador con bastante rapidez, pero es importante decirle a las personas qué deben seguir haciendo y qué deben cambiar195.

Toma nota. No recordará todo lo que notó si la presentación dura más de unos segundos, y definitivamente no recordará con qué frecuencia los notó. Haga una nota la primera vez que algo sucede y luego agregue una marca de verificación cuando vuelva a ocurrir para que pueda ordenar sus comentarios por frecuencia.

Tomar notas es más eficiente cuando tienes algún tipo de rúbrica para que no te apresures a escribir tus observaciones mientras la persona que estás observando todavía está hablando. La rúbrica más simple para los comentarios de forma libre de un grupo es una cuadrícula de 2x2 cuyo eje vertical está etiquetado como “lo que salió bien” y “lo que se puede mejorar”, y cuyo eje horizontal está etiquetado como “contenido” (lo que se dijo) y “presentación”(Como se dijo). Los observadores escriben sus comentarios en notas adhesivas mientras miran la demostración, luego los publican en los cuadrantes de una cuadrícula dibujada en una pizarra (Figura [f: rúbrica de rendimiento]).

f: rúbrica de rendimiento

Rúbricas y presupuestos de preguntas

La Sección 21.1 contiene una rúbrica de muestra para evaluar de 5 a 10 minutos de instrucción de programación. Presenta elementos en más o menos el orden en que es probable que aparezcan, p. Las preguntas sobre la introducción vienen antes que las preguntas sobre la conclusión.

Las rúbricas como esta tienden a crecer con el tiempo a medida que las personas piensan en cosas que les gustaría agregar. Una buena manera de mantenerlos manejables es insistir en que la longitud total permanezca constante: si alguien desea agregar una pregunta, debe identificar una que sea menos importante y que pueda eliminarse.

Si está interesado en dar y recibir retroalimentación, [Gorm2014] tiene buenos consejos que puede usar para hacer que la retroalimentación entre pares sea una parte rutinaria de su enseñanza, mientras que [Gawa2011] analiza el valor de tener un entrenador.

Clases de estudio

Las escuelas de arquitectura a menudo incluyen clases de estudio en las que los estudiantes resuelven pequeños problemas de diseño y reciben comentarios de sus compañeros en ese mismo momento. Estas clases son más efectivas cuando el maestro critica las críticas de los compañeros para que los participantes aprendan no solo cómo construir edificios sino también cómo dar y recibir comentarios [Scho1984]. Las clases magistrales de música tienen un propósito similar, y he descubierto que dar retroalimentación sobre la retroalimentación ayuda a las personas a mejorar su enseñanza también.

Cómo practicar el rendimiento

La mejor manera de mejorar la entrega de lecciones en persona es observarse a sí mismo hacerlo:

  • Trabajar en grupos de tres.

  • Cada persona rota a través de los roles de maestro, audiencia y camarógrafo. El profesor tiene 2 minutos para explicar algo. La persona que pretende ser el público está allí para estar atento, mientras que el camarógrafo graba la sesión con un teléfono celular u otro dispositivo portátil.

  • Después de que todos hayan terminado de enseñar, todo el grupo mira los videos juntos. Todos dan su opinión sobre los tres videos, es decir, dan su opinión sobre sí mismos y sobre los demás.

  • Después de que los videos han sido discutidos, se eliminan. (Muchas personas se sienten incómodas por las imágenes que aparecen en línea).

  • Finalmente, toda la clase vuelve a reunirse y agrega todos los comentarios a una cuadrícula compartida de 2x2 del tipo descrito anteriormente sin decir de quién trata cada elemento de comentarios.

Para que este ejercicio funcione bien:

  • Grabe los tres videos y luego mire los tres. Si el ciclo es enseñar-revisar-enseñar-revisar, la última persona que enseña invariablemente se queda sin tiempo (a veces a propósito). Hacer todas las revisiones después de toda la enseñanza también ayuda a poner un poco de distancia entre los dos, lo que hace que el ejercicio sea un poco menos insoportable.

  • Deje que las personas sepan al comienzo de la clase que se les pedirá que enseñen algo para que tengan tiempo de elegir un tema. Decirles esto con demasiada anticipación puede ser contraproducente, ya que algunas personas se preocuparán por cuánto deben prepararse.

  • Los grupos deben estar físicamente separados para reducir las conversaciones de audio entre sus grabaciones. En la práctica, esto significa 2–3 grupos en un aula de tamaño normal, y el resto utiliza espacios de descanso cercanos, salones de café, oficinas o (en una ocasión) el armario de un conserje.

  • Las personas deben dar retroalimentación sobre sí mismas y entre sí para poder calibrar sus impresiones de su propia enseñanza contra las de otras personas. La mayoría de las personas son más duras de lo que deberían ser, y es importante que se den cuenta de esto.

El anuncio de este ejercicio a menudo es recibido con gemidos y aprensión, ya que pocas personas disfrutan de verse o escucharse a sí mismas. Sin embargo, esas mismas personas lo califican constantemente como una de las partes más valiosas de los talleres de enseñanza. También es una buena preparación para la co-enseñanza (Sección 9.3): a los maestros les resulta mucho más fácil intercambiarse comentarios informales si han tenido algo de práctica y tienen una rúbrica compartida para establecer expectativas.

Y hablando de rúbricas: una vez que la clase haya puesto todos sus comentarios en una cuadrícula compartida, elija un puñado de comentarios positivos y negativos, escríbalos como una lista de verificación y haga que hagan el ejercicio nuevamente. La mayoría de las personas se sienten más cómodas la segunda vez, y la evaluación de las cosas que ellos mismos han decidido que es importante aumenta su sentido de autodeterminación (Capítulo 10).

Dice

Todos tenemos hábitos nerviosos: hablamos más rápido y con una voz más aguda de lo normal cuando estamos en el escenario, jugamos con nuestro cabello o nos rompemos los nudillos. Los jugadores llaman a estos “avisos”, y las personas a menudo no se dan cuenta de que marcan, miran sus zapatos o hacen ruido en su bolsillo cuando en realidad no saben la respuesta a una pregunta.

No puedes deshacerte de los avisos por completo, e intentar hacerlo puede hacer que te obsesiones con ellos. Una mejor estrategia es tratar de desplazarlos, por ejemplo, entrenarse para apretar los dedos de los pies dentro de los zapatos cuando está nervioso en lugar de limpiar la oreja con el dedo meñique.

Ejercicios

Dar comentarios sobre la mala enseñanza (toda la clase / 20)

Como grupo, miren este video de malas enseñanzas y den su opinión sobre dos ejes: positivo versus negativo y contenido versus presentación. Haga que cada persona en la clase agregue un punto a una cuadrícula de 2x2 en una pizarra o en las notas compartidas sin duplicar ningún punto. ¿Qué vieron otras personas que te perdiste? ¿Con qué pensaron que estabas totalmente de acuerdo o en desacuerdo?

Practicar dar comentarios (grupos pequeños / 45)

Use el proceso descrito en la Sección 8.4 para practicar la enseñanza en grupos de tres y agrupar los comentarios.

Lo malo y lo bueno (toda la clase / 20)

Mire los videos de codificación en vivo mal realizados y la codificación en vivo bien hecha y resuma sus comentarios sobre las diferencias utilizando la cuadrícula 2x2 habitual. ¿Cómo es la segunda ronda de enseñanza mejor que la primera? ¿Hay algo mejor en el primero que en el segundo?

Mira, luego haz (pares / 30)

Enseñe 3–4 minutos de una lección usando codificación en vivo a un compañero de clase, luego intercambie y mire mientras esa persona codifica en vivo para usted. No se moleste en intentar grabar estas sesiones (es difícil capturar tanto a la persona como a la pantalla con un dispositivo portátil), pero envíe sus comentarios de la misma manera que lo hizo anteriormente. Explique de antemano a su compañero aprendiz qué va a enseñar y con qué se espera que estén familiarizados los alumnos con los que lo enseña.

  • ¿Qué se siente diferente acerca de la codificación en vivo en comparación con ponerse de pie y dar conferencias? ¿Qué fue más fácil o más difícil?

  • ¿Cometiste algún error? Si es así, ¿cómo los manejaste?

  • ¿Hablaste y escribiste al mismo tiempo, o alternativamente?

  • ¿Con qué frecuencia apuntaste a la pantalla? ¿Con qué frecuencia resaltaste con el mouse?

  • ¿Qué intentarás seguir haciendo la próxima vez? ¿Qué intentarás hacer de manera diferente?

Cuenta (grupos pequeños / 15)

  • Tome nota de lo que cree que son sus avisos, pero no los comparta con otras personas.

  • Enseñe una lección corta (de 2 a 3 minutos de duración).

  • Pregunta a tu audiencia cómo creen que traicionas el nerviosismo. ¿Su lista es la misma que la tuya?

Consejos de enseñanza (grupos pequeños / 15)

El sitio de CS Teaching Tips tiene una gran cantidad de consejos prácticos sobre la enseñanza de la informática, así como una colección de hojas de consejos descargables. Revise sus hojas de consejos en pequeños grupos y clasifique cada consejo de acuerdo a si lo usa todo el tiempo, lo usa ocasionalmente o nunca lo usa. ¿En qué difieren su práctica y la práctica de sus compañeros? ¿Hay algún consejo con el que no estés de acuerdo o creas que sería ineficaz?

Resumen

realimentacion


En el aula

El capítulo anterior describió cómo practicar la entrega de lecciones y describió un método, la codificación en vivo, que permite a los maestros adaptarse al ritmo e intereses de sus alumnos. Este capítulo describe otras prácticas que también son útiles en la programación de clases.

Antes de describirlos, vale la pena detenerse por un momento para establecer expectativas. El mejor método de enseñanza que conocemos es la tutoría individual: [Bloo1984] descubrió que los estudiantes que enseñaron uno a uno hicieron dos desviaciones estándar mejor que aquellos que aprendieron a través de una conferencia convencional, es decir, que los estudiantes con tutoría individual superaron al 98% de los estudiantes a los que se les dio una conferencia. Sin embargo, si bien la tutoría y el aprendizaje fueron las formas más comunes de transmitir el conocimiento a lo largo de la mayor parte de la historia, la industrialización de la educación formal la ha convertido en la excepción hoy en día. A pesar de la exageración en torno a la inteligencia artificial, no va a cuadrar este círculo en el corto plazo, por lo que cada método descrito a continuación es esencialmente un intento de abordar la efectividad de la tutoría individual a escala.

Hacer cumplir el Código de conducta

Lo más importante que aprendí sobre la enseñanza en los últimos 30 años es lo importante que es para todos tratar a los demás con respeto, tanto dentro como fuera de clase. Si utiliza este material de alguna manera, adopte un Código de conducta como el que figura en el Apéndice 17 y solicite a todos los que participen en sus clases que lo cumplan. No puede evitar que las personas sean ofensivas, al igual que las leyes contra el robo impiden que las personas roben, pero puede aclarar las expectativas y las consecuencias, y señalar que está tratando de hacer que su clase sea acogedora para todos.

Pero un Código de conducta solo es útil si se aplica. Si cree que alguien ha violado el suyo, puede advertirlo, pedirle disculpas y / o expulsarlo, dependiendo de la gravedad de la violación y de si cree o no que fue intencional. Hagas lo que hagas:

Hazlo delante de testigos. La mayoría de las personas atenuará su lenguaje y hostilidad frente a una audiencia, y tener a alguien más presente asegura que la discusión posterior no degenere en afirmaciones contradictorias sobre quién dijo qué.

Si expulsa a alguien, dígaselo al resto de la clase y explique por qué. Esto ayuda a evitar que se propaguen los rumores y muestra que su Código de Conducta realmente significa algo.

Envíe un correo electrónico al delincuente tan pronto como pueda para resumir lo que sucedió y los pasos que siguió, y copie el mensaje a los anfitriones de su taller o a uno de sus compañeros maestros para que haya un registro contemporáneo de la conversación. Si el delincuente responde, no participe en un largo debate: nunca es productivo.

Lo que sucede fuera de la clase importa al menos tanto como lo que sucede dentro de él [Parte2011], por lo que debe proporcionar una forma para que los alumnos informen los problemas que no están allí para verse. Un paso es pedirle a alguien que no sea parte de su grupo que sea el primer punto de contacto; de esa manera, si alguien quiere presentar una queja sobre usted o uno de sus compañeros maestros, tiene cierta seguridad de confidencialidad y acción independiente. [Auro2019] tiene muchos otros consejos y es breve y práctico.

Instrucción de pares

No importa cuán bueno sea un maestro, solo pueden decir una cosa a la vez. Entonces, ¿cómo pueden aclarar muchos conceptos erróneos diferentes en un tiempo razonable? La mejor solución desarrollada hasta ahora es una técnica llamada instrucción entre pares. Originalmente creado por Eric Mazur en Harvard [Mazu1996], se ha estudiado ampliamente en una amplia variedad de contextos, incluida la programación [Crou2001, Port2013], y [Port2016] descubrió que los alumnos valoran la instrucción de sus pares incluso en el primer contacto.

La instrucción entre pares intenta proporcionar instrucción individualizada de manera escalable al intercalar la evaluación formativa con la discusión del alumno:

  1. Dé una breve introducción al tema.

  2. Dé a los alumnos una pregunta de opción múltiple que analice sus conceptos erróneos (en lugar de probar el conocimiento factual simple).

  3. Haga que todos los alumnos voten sobre sus respuestas a la MCQ.

  • Si todos los alumnos tienen la respuesta correcta, continúe.
  • Si todos tienen la misma respuesta incorrecta, aborde ese error específico.
  • Si tienen una combinación de respuestas correctas e incorrectas, deles varios minutos para discutir entre ellos en grupos de 2 a 4, luego vote nuevamente.

Como muestra este video, la discusión grupal mejora significativamente la comprensión de los alumnos porque descubre vacíos en su razonamiento y los obliga a aclarar su pensamiento. Vuelva a sondear la clase y luego le indica al maestro si pueden seguir adelante o si se necesitan más explicaciones. Una ronda final de explicación adicional después de que se presenta la respuesta correcta ofrece a los alumnos una oportunidad más para solidificar su comprensión.

Pero, ¿podría ser esto un falso positivo? ¿Están mejorando los resultados debido a una mayor comprensión durante la discusión o simplemente por un efecto de seguir al líder (“vota como Jane, ella siempre tiene la razón”) [Smit2009] probó esto siguiendo la primera pregunta con una segunda que los alumnos respondieron individualmente. Encontraron que

Taking a Stand

It is important to have learners vote publicly so that they can’t change their minds afterward and rationalize it by making excuses to themselves like “I just misread the question.” Much of the value of peer instruction comes from the hypercorrection of getting the wrong answer and having to think through the reasons why (Section 5.1).

Enseñar juntos

La enseñanza conjunta describe cualquier situación en la que dos maestros trabajan juntos en el mismo salón de clases. [Frie2016] describe varias formas de hacerlo:

Docencia en equipo: Ambos maestros ofrecen una sola secuencia de contenido en tándem, turnándose como músicos que toman solos.

Enseñar y ayudar: El maestro A enseña mientras el maestro B se mueve por el aula para ayudar a los alumnos con dificultades.

Enseñanza alternativa: El maestro A proporciona a un pequeño grupo de alumnos instrucción más intensiva o especializada, mientras que el maestro B brinda una lección general al grupo principal.

Enseñar y observar: El maestro A enseña mientras el maestro B observa a los alumnos y recopila datos sobre su comprensión para ayudar a planificar lecciones futuras.

Enseñanza paralela: La clase se divide en dos y los maestros presentan el mismo material simultáneamente a cada uno.

Estación de enseñanza: Los alumnos se dividen en pequeños grupos que rotan de una estación o actividad a la siguiente mientras los maestros supervisan donde sea necesario.

Todos estos modelos crean más oportunidades para la transferencia involuntaria de conocimiento que la enseñanza sola. La enseñanza en equipo es particularmente beneficiosa en los talleres de un día de duración: brinda a la voz de cada maestro la oportunidad de descansar y reduce el riesgo de que estén tan cansados ​​al final del día que comenzarán a criticar a sus alumnos o a tocar el teclado.

Ayudar

Muchas personas que no se sienten cómodas enseñando están dispuestas y pueden proporcionar asistencia técnica en clase. Pueden ayudar a los alumnos con la configuración e instalación, responder preguntas técnicas durante los ejercicios, monitorear la sala para detectar personas que puedan necesitar ayuda o vigilar las notas compartidas (Sección 9.7) y responder preguntas o recordarle al maestro que lo haga. durante los descansos

Los ayudantes a veces son personas que se capacitan para convertirse en maestros (es decir, son maestros B en el modelo de enseñanza y asistencia), pero también pueden ser miembros del personal de soporte técnico de la institución anfitriona, ex alumnos de la clase o estudiantes avanzados que ya conocen el material. bien. Usar este último como ayudante es doblemente efectivo: no solo es más probable que comprendan los problemas que tienen sus compañeros, sino que también les impide aburrirse. Esto ayuda a toda la clase a mantenerse comprometida porque el aburrimiento es contagioso: si un puñado de personas comienza a salir, las personas a su alrededor harán lo mismo.

Si usted y un compañero están enseñando conjuntamente:

  • Tómese 2-3 minutos antes del comienzo de cada clase para confirmar quién está enseñando qué. Si tiene tiempo, intente dibujar o revisar un mapa conceptual juntos.

  • Use ese tiempo para resolver un par de señales manuales también. “Estás yendo demasiado rápido”, “habla”, “ese alumno necesita ayuda”, y “Es hora de un descanso en el baño” son útiles.

  • Cada persona debe enseñar durante al menos 10-15 minutos seguidos, ya que los alumnos se distraerán con cambios más frecuentes.

  • La persona que no está enseñando no debe interrumpir, ofrecer correcciones o elaboraciones, o hacer cualquier otra cosa para distraerse de lo que la persona que enseña está haciendo o diciendo. La única excepción es hacer preguntas principales si los alumnos parecen letárgicos o inseguros de sí mismos.

  • Cada persona debe tomar un par de minutos antes de comenzar a enseñar para ver lo que su compañero va a enseñar después de haber terminado, y luego no presentar nada de ese material.

  • La persona que no está enseñando debe mantenerse comprometida con la clase, no ponerse al día con su correo electrónico. Monitorear las notas compartidas (Sección 9.7), vigilar a los alumnos para ver quién tiene dificultades, anotar algunos comentarios para darle a su compañero de enseñanza en el próximo descanso: cualquier cosa que contribuya a la lección es mejor que cualquier cosa que no lo haga.

Lo que es más importante, tómese unos minutos cuando termine la clase para felicitarse o compadecerse: en la enseñanza como en la vida, la miseria compartida disminuye y aumenta la alegría compartida.

Evaluar conocimiento previo

Cuanto más sepa sobre sus alumnos antes de comenzar a enseñar, más podrá ayudarlos. Dentro de un sistema escolar formal, los requisitos previos para su curso le dirán algo sobre lo que probablemente ya sepan. Sin embargo, en un entorno de campo libre, sus alumnos pueden ser mucho más diversos, por lo que es posible que desee darles una breve encuesta o cuestionario antes de su clase para averiguar qué conocimientos y habilidades tienen.

Pedirle a las personas que se califiquen a sí mismas en una escala del 1 al 5 no tiene sentido porque mientras menos personas sepan sobre un tema, menos precisas podrán estimar sus conocimientos (Figura [f: clase-dunning-kruger], de https: // theness. com / neurologicablog / index.php / misunderstanding-dunning-kruger /), un fenómeno llamado efecto Dunning-Kruger [Krug1999]. Por el contrario, las personas que son miembros de grupos subrepresentados a menudo subestimarán sus habilidades.

Dunning-Kruger

En lugar de pedirles a las personas que se autoevalúen, puede preguntarles con qué facilidad podrían completar algunas tareas específicas. Sin embargo, hacer esto es arriesgado, porque la escuela capacita a las personas para tratar cualquier cosa que parezca un examen como algo que tienen que aprobar en lugar de una oportunidad para dar forma a la instrucción. Si alguien responde “No sé” incluso a un par de preguntas sobre su preevaluación, podría concluir que su clase es demasiado avanzada para ellos. Por lo tanto, podría asustar a muchas de las personas que más desea ayudar.

La Sección 21.5 presenta un breve cuestionario de preevaluación que la mayoría de los estudiantes potenciales es poco probable que encuentren intimidante. Si lo usa o algo similar, intente hacer un seguimiento con las personas que no responden para averiguar por qué no y comparar su evaluación de los alumnos con su autoevaluación para mejorar sus preguntas.

Plan para habilidades mixtas

Si sus alumnos tienen niveles muy diversos de conocimiento previo, puede terminar fácilmente en una situación en la que un tercio de su clase se pierde y un tercio se aburre. Eso no es satisfactorio para todos, pero hay algunas estrategias que puedes usar para manejar la situación:

  • Antes de ejecutar un taller, comunique su nivel claramente a todos mostrando algunos ejemplos de ejercicios que se les pedirá que completen. Esto ayuda a los posibles participantes a medir el nivel de la clase de manera mucho más efectiva que una lista de temas en forma de puntos.

  • Proporcione ejercicios extra a su propio ritmo para que los alumnos más avanzados no terminen temprano y se aburran.

  • Esté atento a los alumnos que se están quedando atrás e intervienen temprano para que no se sientan frustrados y se den por vencidos.

  • Solicite a los alumnos más avanzados que ayuden a las personas que están a su lado (consulte la Sección 9.6 a continuación).

Otra forma de acomodar habilidades mixtas es hacer que todos trabajen en el material por su cuenta a su propio ritmo como lo harían en un curso en línea, pero hacerlo simultáneamente y al mismo tiempo que los ayudantes deambulan por la sala para que la gente se despegue. Algunas personas irán tres o cuatro veces más lejos que otras cuando los talleres se realicen así, pero todos habrán tenido un día gratificante y desafiante.

Principiantes falsos Un principiante falso es alguien que ha estudiado un idioma antes pero lo está aprendiendo nuevamente. Pueden ser indistinguibles de los principiantes absolutos en las pruebas de preevaluación, pero pueden moverse mucho más rápidamente una vez que comienza la clase porque están volviendo a aprender en lugar de aprender por primera vez.

Ser un principiante falso a menudo es un signo de privilegio preparatorio [Marg2010], y los principiantes falsos son comunes en las clases de programación de rango libre. Por ejemplo, un niño cuya familia es lo suficientemente rica como para haberlos enviado a un campamento de verano de robótica puede tener un mal desempeño en una prueba previa de conocimiento de programación porque el material no está fresco en su mente, pero aún tiene una ventaja sobre un niño de Un fondo menos afortunado. Las estrategias descritas anteriormente pueden ayudar a nivelar el campo de juego en casos como este, pero una vez más, la solución real es usar su propio privilegio para abordar factores más grandes fuera de clase [Parte2011].

Lo más importante es aceptar que no puede ayudar a todos todo el tiempo. Si reduce la velocidad para acomodar a dos personas que están luchando, está fallando a los otros dieciocho. Del mismo modo, si pasas unos minutos hablando de un tema avanzado con un alumno aburrido, el resto de la clase se sentirá excluido.

Programación en pareja

La programación por pares es una práctica de desarrollo de software en la que dos programadores trabajan juntos en una computadora. Una persona (el conductor) escribe mientras que la otra (el navegador) ofrece comentarios y sugerencias, y los dos intercambian roles varias veces por hora.

La programación en pareja es una práctica efectiva en el trabajo profesional [Hann2009] y también es una buena forma de enseñar: los beneficios incluyen una mayor tasa de éxito en cursos introductorios, un mejor software y una mayor confianza del alumno en sus soluciones. También hay evidencia de que los estudiantes de grupos subrepresentados se benefician aún más que otros [McDo2006, Hank2011, Port2013, Cele2018]. Los socios pueden ayudarse mutuamente durante los ejercicios prácticos, aclarar los conceptos erróneos de cada uno cuando se presenta la solución y discutir intereses comunes durante los descansos. Lo he encontrado particularmente útil con las clases de habilidades mixtas, ya que los pares son más homogéneos que los individuos.

Cuando use el emparejamiento, ponga a todos en parejas, no solo a los estudiantes que tienen dificultades, para que nadie se sienta singular. También es útil hacer que las personas se sienten en nuevos lugares (y, por lo tanto, se emparejen con diferentes parejas) de forma regular, y que las personas cambien los roles dentro de cada pareja tres o cuatro veces por hora para que la personalidad más fuerte en cada pareja no domine La sesión.

Si sus alumnos son nuevos en la programación de parejas, tómese unos minutos para demostrar cómo se ve realmente para que entiendan que la persona que no tiene las manos en el teclado no debe sentarse y mirar. Finalmente, dígales que las personas que se centran en tratar de completar la tarea lo más rápido posible son menos justas en su intercambio [Lewi2015].

Cambio de socios Los maestros tienen opiniones encontradas sobre si se debe exigir a las personas que cambien de pareja a intervalos regulares. Por un lado, les da a todos la oportunidad de obtener nuevas ideas y hacer nuevos amigos. Por otro lado, mover computadoras y adaptadores de corriente a escritorios nuevos varias veces al día es perjudicial, y el emparejamiento puede ser incómodo para los introvertidos. Dicho esto, [Hann2010] encontró una correlación débil entre los rasgos de personalidad de los “Cinco Grandes” y el rendimiento en la programación de pares, aunque un estudio anterior [Wall2009] encontró que los pares cuyos miembros tenían diferentes niveles de rasgos de personalidad se comunicaban con más frecuencia.

Tomar notas … ¿Juntos?

Tomar notas es una forma de elaboración en tiempo real (Sección 5.1): te obliga a organizar y reflexionar sobre el material a medida que entra, lo que a su vez aumenta la probabilidad de que lo transfieras a la memoria a largo plazo. Muchos estudios han demostrado que tomar notas mientras se aprende mejora la retención [Aike1975, Boha2011]. Si bien aún no se ha estudiado ampliamente [Ornd2015, Yang2015], he descubierto que hacer que los alumnos tomen notas juntos en una página en línea compartida también es efectivo:

  • Permite a las personas comparar lo que creen que están escuchando con lo que otras personas están escuchando, lo que les ayuda a llenar vacíos y corregir conceptos erróneos de inmediato.

  • Ofrece a los alumnos más avanzados de la clase algo útil para hacer. En lugar de aburrirse y revisar Instagram durante la clase, pueden tomar la iniciativa de registrar lo que se dice, lo que los mantiene interesados y permite a los estudiantes menos avanzados centrar más su atención en el nuevo material.

  • Las notas que toman los alumnos suelen ser más útiles para ellos que las que el maestro prepararía de antemano, ya que es más probable que los alumnos escriban lo que realmente encontraron nuevo en lugar de lo que el maestro predijo que sería nuevo.

  • Echar un vistazo a las notas recientes mientras los alumnos trabajan en un ejercicio ayuda al maestro a descubrir que la clase perdió o no entendió algo.

¿Es la pluma más poderosa que el teclado?

[Muel2014] informó que tomar notas en una computadora generalmente es menos efectivo que tomar notas con lápiz y papel. Si bien su resultado fue ampliamente compartido, [More2019] no pudo replicarlo.

Si los alumnos toman notas juntos, también puede hacer que peguen fragmentos breves de código y respuestas en forma de puntos o frases para preguntas de evaluación formativa. Para evitar que todos intenten editar el mismo par de líneas al mismo tiempo, haga una lista del nombre de todos y péguelo en el documento cada vez que desee que cada persona responda una pregunta.

Los estudiantes a menudo encuentran que tomar notas juntos es una distracción la primera vez que lo intentan porque tienen que dividir su atención entre lo que dice el maestro y lo que escriben sus compañeros (Sección 4.1). Si solo está trabajando con un grupo en particular una vez, debe prestar atención a los consejos de la Sección 9.12 y hacer que tomen notas individualmente.

Points for Improvement

One way to demonstrate to learners that they are learning with you, not just from you, is to allow them to take notes by editing (a copy of) your lesson. Instead of posting PDFs for them to download, create editable copies of your slides, notes, and exercises in a wiki, a Google Doc, or anything else that allows you to review and comment on changes. Giving people credit for fixing mistakes, clarifying explanations, adding new examples, and writing new exercises doesn’t reduce your workload, but increases engagement and the lesson’s lifetime (Section 6.3).

Notas adhesivas

Las notas adhesivas son una de mis herramientas de enseñanza favoritas, y no estoy solo amando su versatilidad, portabilidad, adhesividad, capacidad de plegado y aroma sutil pero atractivo [Ward2015].

Como banderas de estado

Entregue a cada alumno dos notas adhesivas de diferentes colores, como el naranja y el verde. Estos se pueden retener para votar, pero su uso real es como indicadores de estado. Si alguien ha completado un ejercicio y quiere que lo revisen, ponen la nota adhesiva verde en su computadora portátil; si se encuentran con un problema y necesitan ayuda, colocan el naranja. Esto funciona mucho mejor que hacer que las personas levanten la mano: es más discreto (lo que significa que es más probable que lo hagan), pueden seguir trabajando mientras se levanta su bandera en lugar de tratar de escribir con una sola mano, y el maestro puede vea rápidamente desde el frente de la sala en qué estado se encuentra la clase. Las banderas de estado son particularmente útiles cuando las personas en clases de habilidades mixtas están trabajando en el material a su propia velocidad (Sección 9.5).

Una vez que sus alumnos se sientan cómodos con dos adhesivos, deles un tercero que puedan soportar cuando sus cerebros estén llenos o que necesiten un descanso en el baño220. Una vez más, es más probable que los adultos publiquen una nota adhesiva que levantar la mano, y una vez que sube una nota adhesiva azul, suele aparecer una ráfaga de otras.

Para distribuir la atención

Las notas adhesivas también se pueden usar para garantizar que la atención del maestro se distribuya de manera justa. Haga que cada alumno escriba su nombre en una nota adhesiva y lo ponga en su computadora portátil. Cada vez que el maestro los llama o contesta una de sus preguntas, toman nota adhesiva. Una vez que todas las notas adhesivas están caídas, todos vuelven a poner las suyas.

Esta técnica facilita que el maestro vea con quién no ha hablado recientemente, lo que a su vez lo ayuda a evitar prejuicios inconscientes e interactuar preferentemente con sus alumnos más extrovertidos. Sin un control como este, es demasiado fácil crear un ciclo de retroalimentación en el que los extrovertidos reciban más atención, lo que los lleva a mejorar, lo que a su vez los lleva a obtener más atención, mientras que los estudiantes más tranquilos, menos confiados o marginados quedan detrás [Alvi1999, Juss2005].

También muestra a los alumnos que la atención se está distribuyendo de manera justa, de modo que cuando se les llama, no sentirán que están siendo molestados. Cuando estoy trabajando con un nuevo grupo, permito que las personas tomen sus propias notas adhesivas durante las primeras horas o dos de clase si prefieren no ser llamados. Si continúan haciendo esto a medida que pasa el tiempo, trato de mantener una conversación tranquila con ellos para averiguar por qué y ver si hay algo que pueda hacer para que se sientan más cómodos.

Como tarjetas de minutos

También puede usar notas adhesivas como tarjetas de minutos. Antes de cada descanso, los alumnos se toman un minuto para escribir una cosa en la nota adhesiva verde que creen que será útil y una cosa en la nota naranja que encontraron demasiado rápida, lenta, confusa o irrelevante. Mientras disfrutan de su café o almuerzo, repase sus notas y busque patrones. Tarda menos de cinco minutos en ver qué disfrutan los alumnos de una clase de 40 personas, por qué están confundidos, qué problemas tienen y qué preguntas aún no han respondido.

Los alumnos no deben firmar sus tarjetas de actas: se consideran comentarios anónimos. La técnica de uno arriba / uno abajo descrita en la Sección 9.11 es una oportunidad de retroalimentación colectiva atribuible.

Nunca una página en blanco

Los talleres de programación y otros tipos de clases se pueden construir alrededor de un conjunto de ejercicios independientes, desarrollar un solo ejemplo extendido por etapas o usar una estrategia mixta. Las dos ventajas principales de los ejercicios independientes son que las personas que se quedan atrás pueden volver a sincronizar fácilmente y que los desarrolladores de la lección pueden agregar, eliminar y reorganizar el material a voluntad (Sección 6.3). Por otro lado, un solo ejemplo extendido mostrará a los alumnos cómo encajan las partes que están aprendiendo: en el lenguaje educativo, les brinda más oportunidades para integrar sus conocimientos.

Independientemente del enfoque que adopte, los principiantes nunca deben comenzar a hacer ejercicios con una página o pantalla en blanco, ya que a menudo les resulta intimidante o desconcertante. Si han estado siguiendo la codificación en vivo, pídales que agreguen algunas líneas más o que modifiquen el ejemplo que han creado. Alternativamente, si están tomando notas juntas, pegue algunas líneas de código de inicio en el documento para que se extiendan o modifiquen.

Modificar el código existente en lugar de escribir un código nuevo desde cero no solo da estructura a los alumnos: también está más cerca de lo que harán en la vida real. Sin embargo, tenga en cuenta que los alumnos pueden distraerse al tratar de comprender todo el código de inicio en lugar de hacer su propio trabajo. El vacío público estático de Java main () o un puñado de declaraciones de importación en la parte superior de un programa Python pueden tener sentido para usted, pero es una carga extraña para ellos (Capítulo 4).

Preparando a tus alumnos

Los estudiantes de campo libre a menudo quieren traer sus propias computadoras y salir de la clase con esas máquinas configuradas para hacer un trabajo real. Por lo tanto, los maestros de campo libre deben prepararse para enseñar tanto en Windows como en MacOS222, aunque sería más simple exigir a los alumnos que usen solo uno.

Denominadores Comunes

Si sus participantes están usando diferentes sistemas operativos, trate de evitar el uso de funciones que son específicas de uno solo y señale cualquiera que sí use. Por ejemplo, los controles y el comportamiento de “minimizar ventana” en Windows son diferentes de los de MacOS.

No importa con cuántas plataformas tenga que lidiar, ponga instrucciones detalladas de configuración en el sitio web de su curso y envíe un correo electrónico a los alumnos un par de días antes de que comience el taller para recordarles que hagan la configuración. Algunas personas seguirán apareciendo sin el software requerido porque tuvieron problemas, no pudieron encontrar el tiempo para completar todos los pasos o simplemente son el tipo de persona que nunca sigue las instrucciones por adelantado. Para detectar esto, haga que todos ejecuten un comando simple tan pronto como lleguen y muestre a los maestros el resultado, luego busque ayudantes y otros aprendices para ayudar a las personas que han tenido problemas.

Maquinas virtuales

Algunas personas usan herramientas como Docker para colocar máquinas virtuales en las computadoras de los alumnos para que todos trabajen exactamente con las mismas herramientas, pero esto presenta un nuevo conjunto de problemas. Las máquinas más antiguas o más pequeñas simplemente no son lo suficientemente rápidas para ejecutarlas, los alumnos luchan por alternar entre dos conjuntos diferentes de métodos abreviados de teclado para cosas como copiar y pegar, e incluso los profesionales competentes se confundirán acerca de qué está sucediendo exactamente dónde.

La configuración es tan complicada que muchos maestros prefieren que los alumnos usen herramientas basadas en el navegador. Sin embargo, esto hace que la clase dependa del WiFi institucional (que puede ser de calidad muy variable) y no satisface el deseo de los alumnos de irse con sus propias máquinas listas para su uso en el mundo real. Sin embargo, a medida que las herramientas basadas en la nube como Glitch y RStudio Cloud se vuelven más robustas, la última consideración se vuelve menos importante.

Una última forma de abordar los problemas de configuración es dividir la clase durante varios días y hacer que la gente instale lo que se requiere para cada día antes de abandonar la clase el día anterior. Dividir el trabajo en trozos hace que cada uno sea menos intimidante, es más probable que los alumnos lo hagan, y garantiza que pueda comenzar a tiempo para cada lección, excepto la primera.

Otras prácticas docentes

Ninguna de las prácticas más pequeñas que se describen a continuación son esenciales, pero todas mejorarán la entrega de lecciones. Al igual que con el ajedrez y el matrimonio, el éxito en la enseñanza es a menudo una cuestión de progreso lento y constante.

Comience con introducciones

Comience su clase presentándose. Si eres un experto, cuéntales un poco sobre cómo llegaste a donde estás; Si solo tienes dos pasos por delante, enfatiza lo que tú y ellos tienen en común. Digas lo que digas, tus objetivos son hacerte más accesible y alentarlos a creer que pueden tener éxito.

Los alumnos también deben presentarse entre ellos. En una clase de una docena, pueden hacer esto verbalmente; en una clase más grande o si son extraños entre sí, creo que es mejor que cada uno escriba una o dos líneas sobre ellos en las notas compartidas (Sección 9.7).

Configura tu propio entorno

Configurar su entorno es tan importante como configurar a sus alumnos, pero es más complicado. Además de tener acceso a la red y todo el software que va a utilizar, también debe tomar un vaso de agua o una taza de té o café. Esto ayuda a mantener su garganta lubricada, pero su verdadero propósito es darle una excusa para hacer una pausa y pensar durante un par de segundos cuando alguien hace una pregunta difícil o cuando pierde la noción de lo que iba a decir a continuación. Probablemente también desee algunos lápices de pizarra y algunas de las otras cosas descritas en la Sección 21.3.

Una forma de evitar que su trabajo diario se interponga en su enseñanza es crear una cuenta separada en su computadora para este último. Use los valores predeterminados del sistema para todo en esta segunda cuenta, junto con una fuente más grande y un fondo de pantalla en blanco, y apague las notificaciones para que su enseñanza no se vea interrumpida por ventanas emergentes.

Evite la tarea en formatos de todo el día

Los alumnos que hayan pasado un día entero programando estarán cansados. Si les das tarea para hacer después del horario laboral, comenzarán al día siguiente también cansados, así que no lo hagas.

No toque el teclado del alumno

A menudo es tentador arreglar las cosas para los alumnos, pero incluso si narras cada paso, es probable que los desmotive al enfatizar la brecha entre su conocimiento y el tuyo. En cambio, mantenga las manos alejadas del teclado y hable con sus alumnos sobre lo que necesiten hacer: tomará más tiempo, pero es más probable que se quede.

Repita la pregunta

Cada vez que alguien haga una pregunta en clase, repítala antes de responder para verificar que la haya entendido y darles a las personas que tal vez no la hayan escuchado la oportunidad de hacerlo. Esto es particularmente importante cuando se graban o transmiten presentaciones, ya que su micrófono generalmente no captará lo que otras personas están diciendo. Repetir las preguntas también le da la oportunidad de redirigir la pregunta a algo que le resulte más cómodo responder …

Uno arriba, uno abajo

Un complemento de las tarjetas de minutos es pedir comentarios resumidos al final de cada día. Alternativamente, los alumnos dan un punto positivo o uno negativo sobre el día sin repetir nada de lo que ya se ha dicho. La prohibición de las repeticiones obliga a las personas a decir cosas que de otra manera no podrían decir: una vez que se hayan dado todos los comentarios “seguros”, los participantes comenzarán a decir lo que realmente piensan.

Diferentes modos, diferentes respuestas

Las tarjetas de minutos (Sección 9.8) son anónimas; la retroalimentación alterna hacia arriba y hacia abajo no lo es. Debes usar los dos juntos porque el anonimato permite la honestidad y el trolling.

Haga que los alumnos hagan predicciones

La investigación ha demostrado que las personas aprenden más de las manifestaciones si se les pide que predigan lo que va a suceder [Mill2013]. Hacer esto encaja naturalmente en la codificación en vivo: después de agregar o cambiar algunas líneas de un programa, pregunte a la clase qué sucederá cuando se ejecute. Si el ejemplo es incluso moderadamente complejo, la predicción puede servir como una pregunta motivadora para una ronda de instrucción entre pares.

Configurando Tablas

Es posible que no tenga ningún control sobre el diseño de los escritorios o mesas en la sala en la que enseña, pero si lo hace, descubrimos que es mejor tener asientos planos (estilo cena) en lugar de asientos inclinados (estilo teatro). que puede llegar a los alumnos que necesitan ayuda más fácilmente y para que sea más fácil para los alumnos emparejarse entre sí (Sección 9.5). Las tomas de corriente en el piso para que no tenga que pasar cables de alimentación por el piso hacen la vida más fácil y segura, pero aún son poco comunes.

Independientemente del diseño que tenga, intente asegurarse de que cada asiento tenga una vista sin obstáculos de la pantalla. Un buen respaldo también es importante, ya que las personas estarán en ellos durante un período prolongado. Al igual que las tomas de corriente en el piso, desafortunadamente, los buenos asientos en el aula todavía son poco comunes.

Pastillas para la tos

Si habla todo el día con una habitación llena de personas, se le pone la garganta irritada porque irrita las células epiteliales de la laringe y la faringe. Esto no solo te vuelve ronco, sino que también te hace más vulnerable a la infección (que es parte de la razón por la que las personas a menudo sufren resfriados después de enseñar).

La mejor manera de protegerse contra esto es mantener su garganta alineada, y la mejor manera de hacerlo es usar pastillas para la tos temprano y con frecuencia. Los buenos también enmascararán el inicio del aliento de café, por lo que sus alumnos probablemente estarán agradecidos.

Piensa-Par-Comparte

Think-pair-share es una técnica liviana que ayuda a las personas a mejorar ideas a través de la discusión con sus compañeros. Cada persona comienza pensando individualmente sobre una pregunta o problema y anotando algunas notas. Luego explican sus ideas entre sí en parejas, fusionándolas o seleccionando las más prometedoras. Finalmente, algunas parejas presentan sus ideas a todo el grupo.

Think-pair-share funciona porque obliga a las personas a externalizar su cognición (Sección 3.1). También les da la oportunidad de detectar y resolver lagunas o contradicciones en sus ideas antes de exponerlos a un grupo más grande, lo que puede hacer que los estudiantes menos extrovertidos estén un poco menos nerviosos por parecer tontos.

Mañana, mediodía y noche

[Smar2018] descubrió que a los alumnos les va menos bien si sus clases y otros trabajos se programan en horarios que no se alinean con sus relojes corporales naturales, es decir, que si una persona de la mañana toma clases nocturnas o viceversa, sus calificaciones se ven afectadas. Por lo general, no es posible acomodar esto en grupos pequeños, pero los más grandes deberían tratar de escalonar las horas de inicio de las sesiones paralelas. Esto también puede ayudar a las personas a hacer malabarismos con las responsabilidades de cuidado infantil y otras limitaciones, y reducir la duración de las alineaciones en los descansos para tomar café y para los baños.

Humor

El humor debe usarse con moderación cuando se enseña: la mayoría de los chistes son menos divertidos cuando se escriben y se vuelven aún menos divertidos con cada relectura. Ser espontáneamente divertido mientras enseña suele funcionar mejor, pero puede salir mal fácilmente: lo que es una broma para tu círculo de amigos puede ser un problema político serio para tu audiencia. Si haces bromas cuando enseñas, no las hagas a expensas de ningún grupo o de ninguna persona, excepto posiblemente tú mismo.

Limite la innovación

Cada una de las técnicas presentadas en este capítulo mejorará sus clases, pero no debe tratar de adoptarlas todas a la vez. La razón es que cada nueva práctica aumenta su carga cognitiva y la de sus alumnos, ya que ahora todos están tratando de aprender una nueva forma de aprender, así como el tema de la lección. Si está trabajando con un grupo repetidamente, puede introducir una nueva técnica cada pocas lecciones; Si solo los tiene para un taller de un día, es mejor elegir un método que no hayan visto antes y que se sientan cómodos con eso.

Ejercicios

Crear un cuestionario (individual / 20)

Usando el cuestionario en la Sección 21.5 como plantilla, cree un cuestionario corto que pueda dar a los alumnos antes de enseñar una clase propia. ¿Qué es lo que más desea saber sobre sus antecedentes y cómo pueden ambas partes estar seguras de que están de acuerdo sobre el nivel de comprensión que está preguntando?

Uno de los tuyos (clase completa / 15)

Piense en una práctica de enseñanza que no se ha descrito hasta ahora. Presente su idea a un compañero, escuche la suya y seleccione una para presentarla al grupo como un todo. (Este ejercicio es un ejemplo de think-pair-share).

¿Puedo conducir? (pares / 10)

Intercambie computadoras con un compañero (preferiblemente uno que use un sistema operativo diferente al suyo) y realice un ejercicio de programación simple. ¿Qué tan frustrante es? ¿Cuánta información te da sobre lo que los novatos tienen que pasar todo el tiempo?

Emparejamiento (pares / 15)

Mire este video de programación en pareja y luego practique hacerlo con un compañero. Recuerde cambiar los roles entre controlador y navegador cada pocos minutos. ¿Cuánto tiempo te lleva caer en un ritmo de trabajo?

Comparar notas (grupos pequeños / 15)

Forme grupos de 3 a 4 personas y compare las notas que ha tomado en este capítulo. ¿Qué pensaste que era digno de mención que tus compañeros extrañaron y viceversa? ¿Qué entendiste de manera diferente?

Credibilidad (individual / 15)

[Fink2013] describe tres cosas que hacen que los maestros sean creíbles ante los ojos de sus alumnos:

Competencia: conocimiento del tema como lo demuestra la capacidad de explicar ideas complejas o hacer referencia al trabajo de otros.

Integridad: teniendo en cuenta los mejores intereses de los alumnos. Esto se puede mostrar dando retroalimentación individualizada, ofreciendo una explicación racional para las decisiones de calificación y tratando a todos los alumnos de la misma manera.

Dinamismo: entusiasmo por el tema (Capítulo 8).

Describa una cosa que hace cuando enseña que se ajusta a cada categoría, y luego describa una cosa que no hace pero que debería hacer.

Medición de efectividad (individual / 15)

[Kirk1994] define cuatro niveles para evaluar el entrenamiento:

Reacción: ¿Cómo se sintieron los alumnos sobre la capacitación?

Aprendizaje:¿cuánto aprendieron realmente?

Comportamiento: ¿Cuánto han cambiado su comportamiento como resultado?

Resultados: ¿Cómo han afectado esos cambios en el comportamiento a su producción o la producción de su grupo?

¿Qué haces en cada nivel para evaluar qué y cómo enseñas? ¿Qué podrías hacer que no estás haciendo?

Objeciones y contra objeciones (think-pair-share / 15)

Ha decidido no preguntar a sus alumnos si su clase fue útil porque sabe que no hay correlación entre sus respuestas y cuánto realmente aprenden (Sección 7.1). En cambio, ha presentado cuatro propuestas, cada una de las cuales sus colegas han rechazado:

Vea si recomiendan la clase a sus amigos. ¿Por qué sería esto más significativo que preguntarles cómo se sienten acerca de la clase?

Deles un examen al final. Pero cuánto saben los alumnos al final del día es un mal predictor de cuánto recordarán dos o tres meses después, y cualquier tipo de examen final hará que la clase sea mucho más estresante.

Déles un examen dos o tres meses después. Eso es prácticamente imposible con los estudiantes de campo libre, y las personas que no obtuvieron nada del taller probablemente sean menos propensas a participar en el seguimiento, por lo que los comentarios recopilados de esta manera serán sesgados.

Vea si siguen usando lo que aprendieron. La instalación de software espía en las computadoras de los alumnos está mal vista, entonces, ¿cómo se implementará?

Trabajando por su cuenta, encuentre respuestas a estas objeciones, luego comparta sus respuestas con un compañero y discuta los enfoques que ha planteado. Cuando haya terminado, comparta su enfoque favorito con la clase.


Motivación y Desmotivación

Los alumnos necesitan estímulo para salir a terrenos desconocidos, por lo que este capítulo analiza las formas en que los maestros pueden motivarlos. Más importante aún, habla sobre cómo los maestros pueden desmotivarlos y cómo evitar hacerlo.

Nuestro punto de partida es la diferencia entre la motivación extrínseca, que sentimos cuando hacemos algo para evitar el castigo o ganar una recompensa, y la motivación intrínseca, que es lo que sentimos cuando encontramos algo personalmente satisfactorio. Ambas afectan la mayoría de las situaciones (por ejemplo, las personas enseñan porque lo disfrutan y porque les pagan), pero aprendemos mejor cuando estamos intrínsecamente motivados [Wlod2017]. Según la teoría de la autodeterminación, los tres impulsores de la motivación intrínseca son:

Competencia: la sensación de que sabes lo que estás haciendo.

Autonomía: la sensación de estar en control de tu propio destino.

Parentesco: El sentimiento de estar conectado con los demás.

Una lección bien diseñada alienta a los tres. Por ejemplo, un ejercicio de programación puede permitir a los alumnos practicar las herramientas que necesitan para resolver un problema mayor (competencia), permitirles abordar las partes de ese problema en el orden que deseen (autonomía) y permitirles hablar con sus compañeros. (relación).

El problema de los grados

Nunca he tenido una audiencia en mi vida. Mi audiencia es una rúbrica. – citado por Matt Tierney

Los grados y la forma en que distorsionan el aprendizaje a menudo se usan como un ejemplo de motivación extrínseca, pero como observa [Mill2016a], no van a desaparecer en el corto plazo, por lo que no tiene sentido tratar de construir un sistema que los ignore. En cambio, [Lang2013] explora cómo los cursos que enfatizan las calificaciones pueden incentivar a los estudiantes a hacer trampa y ofrece algunos consejos sobre cómo disminuir este efecto, mientras que [Covi2017] analiza el problema más amplio de equilibrar la motivación intrínseca y extrínseca en la educación institucional, y la alineación constructiva El enfoque propuesto en [Bigg2011] busca alinear las actividades de aprendizaje y los resultados de aprendizaje entre sí.

[Ambr2010] contiene una lista de métodos basados en evidencia para motivar a los alumnos. Ninguno de ellos es sorprendente, es difícil imaginar que alguien diga que no debemos identificar y recompensar lo que valoramos, pero es útil revisar las lecciones para asegurarse de que están haciendo al menos algunas de estas cosas. Una estrategia que me gusta especialmente es que los alumnos que tuvieron dificultades pero que tuvieron éxito entren y cuenten sus historias al resto de la clase. Es mucho más probable que los alumnos crean historias de personas como ellos [Mill2016a], y las personas que han completado su curso siempre tendrán consejos en los que nunca habrían pensado.

No solo para estudiantes Las discusiones sobre motivación en educación a menudo pasan por alto la necesidad de motivar al maestro. Los alumnos responden al entusiasmo de un maestro, y los maestros (particularmente los voluntarios) deben preocuparse por un tema para seguir enseñándolo. Esta es otra razón poderosa para enseñar en conjunto (Sección 9.3): así como tener un compañero para correr hace que sea más probable que continúes corriendo, tener un compañero para enseñar te ayuda a levantarte y continuar esos días cuando tienes un resfriado y la bombilla del proyector se ha quemado y nadie sabe dónde encontrar un reemplazo y, en serio, ¿están haciendo la construcción nuevamente?

Los maestros también pueden hacer otras cosas positivas. [Bark2014] descubrió tres cosas que impulsaron la retención para todos los alumnos: tareas significativas, interacción del profesorado con los alumnos y colaboración de los alumnos en las tareas. El ritmo y la carga de trabajo en relación con las expectativas también fueron factores importantes, pero principalmente para los estudiantes varones. Las cosas que no impulsaron la retención fueron interacciones con asistentes de enseñanza e interacciones con compañeros en actividades extracurriculares. Estos resultados parecen obvios, pero lo contrario también parecería obvio: si el estudio hubiera encontrado que las actividades extracurriculares impulsan la retención, también pensaríamos que eso tiene sentido. Notablemente, dos de los cuatro impulsores de retención (interacción del profesorado y colaboración del alumno) requieren un esfuerzo adicional para replicarse en línea (Capítulo 11).

Tareas auténticas

Como señala Dylan Wiliam en [Hend2017], la motivación no siempre conduce al logro, pero el logro casi siempre conduce a la motivación: el éxito de los alumnos los motiva mucho más que a que les digan lo maravillosos que son. Podemos utilizar esta idea en la enseñanza creando una cuadrícula cuyos ejes son “tiempo medio para dominar” y “utilidad una vez dominada” (Figura [f: motivación-qué]).

Que enseñar

Las cosas que son rápidas de dominar e inmediatamente útiles deben enseñarse primero, incluso si no son consideradas fundamentales por personas que ya son profesionales competentes, porque unas pocas victorias tempranas construirán la confianza de los alumnos en sí mismos y en su maestro. Por el contrario, las cosas que son difíciles de aprender y que no son útiles para sus alumnos en su etapa actual de desarrollo deben omitirse por completo, mientras que los temas a lo largo de la diagonal deben sopesarse entre sí.

¿Útil para quién?

Si alguien quiere crear sitios web, los conceptos básicos de informática como la recursividad y la computabilidad pueden habitar en la esquina inferior derecha de esta cuadrícula. Eso no significa que no valga la pena aprender, pero si nuestro objetivo es motivar a las personas, pueden y deben diferirse. Por el contrario, una persona mayor que está tomando una clase de programación para estimular su mente puede preferir explorar estas grandes ideas a hacer algo práctico. Cuando esté creando su grilla, debe hacerlo teniendo en cuenta a sus alumnos (Sección 6.1). Si los temas terminan en lugares muy diferentes para diferentes personas, debe pensar en crear diferentes cursos.

Una instancia bien estudiada de priorizar lo que es útil sin sacrificar lo fundamental es el enfoque de cálculo de medios desarrollado en Georgia Tech [Guzd2013]. En lugar de imprimir “hola mundo” o sumar los primeros diez enteros, el primer programa de un alumno puede abrir una imagen, cambiar su tamaño para crear una miniatura y guardar el resultado. Esta es una tarea auténtica, es decir, algo que los alumnos creen que realmente harían en la vida real. También tiene un artefacto tangible: si la imagen sale del tamaño incorrecto, los alumnos tienen algo en la mano que puede guiar su depuración. [Lee2013] describe una adaptación de este enfoque de Python a MATLAB, mientras que otros están construyendo cursos similares sobre ciencia de datos , procesamiento de imágenes y biología [Dahl2018, Meys2018, Ritz2018].

Siempre habrá tensión entre darles a los alumnos problemas auténticos y ejercitar las habilidades individuales que necesitan para resolver esos problemas: después de todo, los programadores no responden preguntas de opción múltiple en el trabajo más de lo que los músicos tocan una y otra vez frente a una audiencia . Encontrar el equilibrio es difícil, pero un primer paso es sacar cualquier cosa arbitraria o sin sentido. Por ejemplo, los ejemplos de programación no deben usar variables llamadas foo y bar, y si va a hacer que los alumnos clasifiquen una lista, hágala una lista de canciones en lugar de cadenas como “aaa” y “bbb”.

Desmotivación

Las mujeres no abandonan la informática porque no saben cómo es; se van porque lo saben. – atribuido diversamente

Si está enseñando en un entorno de campo libre, sus alumnos probablemente sean voluntarios y probablemente quieran estar en su clase. Por lo tanto, motivarlos es menos preocupante que no desmotivarlos. Desafortunadamente, puede desmotivar fácilmente a las personas por accidente. Por ejemplo, [Cher2009] informó cuatro estudios que muestran que las pistas ambientales sutiles tienen una diferencia apreciable en el interés que tienen las personas de diferentes géneros en la informática: cambiar los objetos en un aula de informática de aquellos considerados estereotípicos de la informática (por ejemplo, carteles de Star Trek y videojuegos) a objetos que no se consideran estereotipados (p. ej., carteles de la naturaleza y guías telefónicas) aumentaron el interés de las estudiantes universitarias al nivel de sus compañeros varones. De manera similar, [Gauc2011] informa un trío de estudios que muestran que las palabras de género comúnmente empleadas en los materiales de reclutamiento laboral pueden mantener la desigualdad de género en ocupaciones tradicionalmente dominadas por hombres.

Hay tres desmotivadores principales para estudiantes adultos:

Imprevisibilidad Desmotiva a las personas porque si no hay una conexión confiable entre lo que hacen y el resultado que logran, no hay razón para que intenten hacer algo.

Indiferencia Se desmotiva porque los alumnos que creen que el maestro o el sistema educativo no se preocupan por ellos o que el material tampoco se preocupa por ellos.

Injusticia Desmotiva a las personas que están en desventaja por razones obvias. Lo sorprendente es que también desmotiva a las personas que se benefician de la injusticia: consciente o inconscientemente, les preocupa que algún día se encuentren en el grupo desfavorecido [Wilk2011].

En situaciones extremas, los alumnos pueden desarrollar la impotencia aprendida: cuando se les somete repetidamente a comentarios negativos en una situación que no pueden cambiar, pueden aprender a ni siquiera intentar cambiar las cosas que podrían.

Una de las formas más rápidas y seguras de desmotivar a los alumnos es utilizar un lenguaje que sugiera que algunas personas son programadores naturales y otras no. Guzdial ha llamado a esto el mayor mito sobre la enseñanza de la informática, y [Pati2016] respaldó esto al demostrar que las personas ven evidencia de un “gen geek” donde no existe ninguno. Analizaron las distribuciones de calificaciones de 778 cursos universitarios y descubrieron que solo el 5.8% mostraba signos de ser multimodal, es decir, solo una de cada veinte clases mostraba signos de tener dos poblaciones distintas de estudiantes. Luego mostraron a 53 profesores de ciencias de la computación histogramas de distribuciones ambiguas de calificaciones; aquellos que creían que algunas personas tienen una predisposición innata a ser mejores en Ciencias de la Computación eran más propensos a verlos como bimodales que aquellos que no.

Estas creencias importan porque los maestros actúan sobre ellas [Brop1983]. Si un maestro cree que es probable que a un alumno le vaya bien, naturalmente (a menudo inconscientemente) se enfoca en ese alumno, quien luego cumple con las expectativas del maestro debido a la mayor atención, que a su vez parece confirmar la creencia del maestro. Lamentablemente, hay pocas señales de que la mera evidencia del tipo presentado en [Pati2016] sea suficiente para romper este círculo vicioso …

Aquí hay algunas otras cosas específicas que desmotivarán a sus alumnos:

Una actitud más santa que tú o despectiva de un maestro o un compañero de aprendizaje.

Diciéndoles que sus habilidades existentes son basura. Los usuarios de Unix se burlan de Windows, los programadores de todo tipo hacen bromas sobre Excel, y no importa qué marco de aplicaciones web ya conozca, algún programador le dirá que está desactualizado. Los estudiantes a menudo han invertido mucho tiempo y esfuerzo en adquirir las habilidades que tienen; menospreciarlos es una buena manera de garantizar que no escuchen nada más que tengas que decir.

Sumérgete en discusiones técnicas complejas o detalladas con los alumnos más avanzados de la clase.

Fingiendo que sabes más que tú. Los estudiantes confiarán más en usted si es franco sobre las limitaciones de su conocimiento, y será más probable que haga preguntas y busque ayuda.

Usando la palabra J (“solo”) o fingiendo sorpresa. Como se discutió en el Capítulo 3, decir cosas como “No puedo creer que no sepas X” o “¿nunca has oído hablar de Y?” Señala al alumno que el maestro piensa que su problema es trivial y que debe ser estúpido por no poder resolverlo.

Dolores de cabeza de instalación de software. El primer contacto de las personas con la programación o con nuevas herramientas de programación a menudo es desmoralizante, y creer que algo es difícil de aprender es una profecía autocumplida. No es solo el tiempo que toma configurarlo o la sensación de que es injusto tener que depurar algo que depende precisamente del conocimiento que aún no tienen. El verdadero problema es que cada fracaso refuerza su creencia de que tendrían una mejor oportunidad de cumplir con la fecha límite del próximo jueves si siguieran haciendo las cosas como siempre lo han hecho.

Es aún más fácil desmotivar a las personas en línea que en persona, pero ahora existen estrategias basadas en la evidencia para hacer frente a esto. [Ford2016] descubrió que las mujeres que los hombres consideran que cinco barreras a la contribución al Desbordamiento de pila son significativamente más problemáticas: falta de conciencia de las características del sitio, sentirse descalificado para responder preguntas, intimidar el tamaño de la comunidad, incomodidad al interactuar o confiar en extraños, y la sensación de que buscar cosas en línea no era “trabajo real”. El miedo a los comentarios negativos no estaba en esta lista, pero habría sido el siguiente agregado si los autores no fueran tan estrictos con respecto a sus límites estadísticos. Todos estos factores pueden y deben abordarse tanto en entornos en persona como en línea utilizando métodos como los de la Sección 10.4, y hacerlo mejora los resultados para todos [Sved2016].

Fracaso productivo y privilegio

Algunos trabajos recientes han explorado el fracaso productivo, donde los alumnos reciben deliberadamente problemas que no pueden resolverse con el conocimiento que tienen y tienen que salir y adquirir nueva información para progresar [Kapu2016]. El fracaso productivo recuerda superficialmente al mantra de la tecnología “falla rápido, falla a menudo”, pero este último es más un signo de privilegio que de comprensión. Las personas solo pueden darse el lujo de celebrar el fracaso si están seguras de tener la oportunidad de volver a intentarlo; muchos de sus alumnos, y muchas personas de grupos marginados o desfavorecidos, no pueden estar seguros de eso, y asumir que el fracaso es una opción es una excelente manera de desmotivarlos.

Sindrome impostor

El síndrome de Impostor es la creencia de que sus logros son casualidades afortunadas y el temor de que alguien finalmente lo resuelva. Es común entre los estudiantes de alto rendimiento que emprenden un trabajo visible públicamente, pero afecta desproporcionadamente a los miembros de grupos subrepresentados: como se discutió en la Sección 7.1, [Wilc2018] descubrió que las alumnas con exposición previa a la computación superaron a sus pares masculinos en todas las áreas en los cursos de programación introductoria, pero estaban constantemente menos confiados en sus habilidades, en parte porque la sociedad sigue señalando en formas sutiles y no tan sutiles que realmente no pertenecen.

Las aulas tradicionales pueden alimentar el síndrome del impostor. Con frecuencia, el trabajo escolar se realiza solo o en pequeños grupos, pero los resultados se comparten y critican públicamente. Como resultado, rara vez vemos cómo otros luchan por terminar su trabajo, lo que puede alimentar la creencia de que todos los demás lo encuentran fácil. Los miembros de grupos subrepresentados que ya sienten una presión adicional para demostrar su valía pueden verse particularmente afectados.

La Iniciativa Ada ha creado algunas pautas para combatir su propio síndrome de impostor, que incluyen:

Hable sobre el problema con personas de su confianza. Cuando escuchas de otros que el síndrome del impostor es un problema común, se hace más difícil creer que tus sentimientos de fraude son reales.

Ir a una sesión de síndrome de impostor en persona. No hay nada como estar en una habitación llena de personas a las que respetas y descubrir que el 90% de ellas tienen síndrome de impostor.

Cuida tus palabras, porque influyen en cómo piensas. Decir cosas como “No soy un experto en esto, pero …” resta valor al conocimiento que realmente posees.

Enseñe a otros sobre su campo. Ganará confianza en su propio conocimiento y habilidad y ayudará a otros a evitar algunos cardúmenes de síndrome de impostor.

Hacer preguntas. Hacer preguntas puede ser intimidante si cree que debe saber la respuesta, pero obtener respuestas elimina la agonía prolongada de la incertidumbre y el miedo al fracaso.

Construir alianzas. Tranquiliza y construye a tus amigos, quienes te tranquilizarán y construirán a cambio. (Si no lo hacen, es posible que desee pensar en encontrar nuevos amigos …)

Sé dueño de tus logros. Sigue grabando y revisando activamente lo que has hecho, lo que has construido y los éxitos que has tenido.

Como profesor, puede ayudar a las personas con su síndrome de impostor compartiendo historias de errores que haya cometido o cosas que tuvo dificultades para aprender. Esto asegura a la clase que está bien encontrar temas difíciles. Ser abierto con el grupo también genera confianza y les da confianza para hacer preguntas. (La codificación en vivo es excelente para esto: como se señaló en la Sección 8.1, sus errores tipográficos le muestran a su clase que usted es humano). Las evaluaciones formativas frecuentes también ayudan, especialmente si los alumnos lo ven ajustando lo que enseña o la rapidez con la que se basa en su resultados.

Amenaza mental y estereotipo

Carol Dweck y otros han estudiado las diferencias de mentalidad fija y mentalidad de crecimiento en los resultados del aprendizaje. Si las personas creen que la competencia en alguna área es intrínseca (es decir, que “tienes el gen” o no la tienes), todos lo hacen peor, incluidos los supuestamente ventajosos. La razón es que si a alguien no le va bien al principio, asumen que carecen de esa aptitud, lo que sesga su rendimiento futuro. Por otro lado, si las personas creen que una habilidad se aprende y se puede mejorar, lo hacen mejor en promedio.

Existe la preocupación de que la mentalidad de crecimiento se haya sobrevendido, o que sea mucho más difícil traducir la investigación al respecto a la práctica de lo que sus defensores más entusiastas han implicado [Sisk2018]. Sin embargo, parece que los estudiantes con un bajo nivel socioeconómico o que están en riesgo académico podrían beneficiarse de las intervenciones de mentalidad.

Otro efecto ampliamente discutido es la amenaza de estereotipo [Stee2011]. Recordar a las personas los estereotipos negativos, incluso de manera sutil, puede hacerlos sentir ansiosos por el riesgo de confirmar esos estereotipos, lo que a su vez puede reducir su rendimiento. Una vez más, hay algunas preocupaciones sobre la replicabilidad de los estudios clave, y el problema se ve aún más nublado por el hecho de que el término se ha utilizado de muchas maneras [Shap2007], pero nadie diría que mencionar los estereotipos en clase ayudará a los alumnos.

Accesibilidad

Poner las lecciones y los ejercicios fuera del alcance de alguien es tan desmotivador como es posible, y es muy fácil hacerlo sin darse cuenta. Por ejemplo, las primeras lecciones de programación en línea que escribí tenían una transcripción de la narración junto a las diapositivas, pero no incluían el código fuente real: eso estaba en capturas de pantalla de las diapositivas de PowerPoint. Por lo tanto, alguien que usa un lector de pantalla podría escuchar lo que se dice sobre el programa, pero no sabría qué es realmente el programa. No siempre es factible satisfacer las necesidades de cada alumno, pero agregar leyendas descriptivas a las imágenes y hacer que los controles de navegación sean accesibles para las personas que no pueden usar un mouse puede marcar una gran diferencia.

Cortes de acera

Hacer que el material sea accesible ayuda a todos, no solo a las personas que enfrentan desafíos. Los cortes de acera, las pequeñas rampas inclinadas que unían una acera a la calle, se crearon originalmente para facilitar el desplazamiento de los discapacitados físicos, pero resultaron igualmente útiles para las personas con cochecitos y carritos de supermercado. Del mismo modo, el subtitulado de imágenes no solo ayuda a las personas con discapacidad visual: también hace que las imágenes sean más fáciles de encontrar e indexar para los motores de búsqueda.

El primer y más importante paso para hacer que las lecciones sean accesibles es involucrar a las personas con discapacidad en la toma de decisiones: el eslogan nihil de nobis, sine nobis (literalmente, “nada para nosotros sin nosotros”) es anterior a los derechos de accesibilidad, pero siempre es el lugar adecuado para comienzo. Algunas recomendaciones específicas son:

Descubre lo que necesitas hacer. Cada uno de estos carteles ofrece qué hacer y qué no hacer para personas en el espectro autista, usuarios de lectores de pantalla y personas con baja visión, discapacidades físicas o motoras, ejercicios de audición y dislexia.

No hagas todo a la vez. Las mejoras descritas en el punto anterior pueden parecer bastante desalentadoras, así que haga un cambio a la vez.

Haz las cosas fáciles primero. Tamaño de fuente, utilizando un micrófono con clip para que las personas puedan escucharlo más fácilmente, y comprobar sus opciones de color son buenos lugares para comenzar.

Sepa qué tan bien lo está haciendo. Sitios como WebAIM le permiten verificar qué tan accesibles son sus materiales en línea para los usuarios con discapacidad visual. [Coom2012, Burg2015] son buenas guías para el diseño visual de accesibilidad. Sus recomendaciones incluyen:

Formatear documentos con encabezados reales y otros puntos de referencia en lugar de simplemente cambiar los tamaños y estilos de fuente.

Evite usar solo el color para transmitir significado en texto o gráficos. En su lugar, use el color más diferentes patrones de sombreado cruzado (lo que también hace que el material sea comprensible cuando se imprime en blanco y negro).

Eliminar elementos innecesarios en lugar de simplemente hacerlos invisibles, porque los lectores de pantalla a menudo los dicen en voz alta.

Permitir el ritmo y la repetición para personas con problemas de lectura o audición.

Incluye narración de acción en pantalla en videos (y hable mientras escribe cuando codifique en vivo).

Cucharas

En 2003, Christine Miserandino comenzó a usar cucharas como una forma de explicar cómo es vivir con una enfermedad crónica. Las personas sanas comienzan cada día con un suministro ilimitado de cucharas, pero las personas con lupus u otras afecciones debilitantes solo tienen unas pocas, y todo lo que hacen les cuesta una. ¿Levantarse de la cama? Eso es una cuchara. Haciendo una comida? Esa es otra cuchara, y muy pronto, se te acaba.

No puedes simplemente ponerte la ropa cuando estás enfermo … Si me duelen las manos ese día, los botones están fuera de discusión. Si tengo moretones ese día, necesito usar mangas largas, y si tengo fiebre, necesito un suéter para mantener el calor, etc. Si mi cabello se está cayendo, necesito pasar más tiempo para parecer presentable, y luego debes tener en cuenta otros 5 minutos para sentirte mal de que te tomó 2 horas hacer todo esto.

Como ha argumentado Elizabeth Patitsas, las personas que tienen muchas cucharas pueden acumular más, pero las personas cuyo suministro es limitado pueden tener dificultades para salir adelante. Cuando diseñe clases y ejercicios, recuerde que algunos de sus alumnos pueden tener obstáculos físicos o mentales que no son obvios. En caso de duda, pregunte: es casi seguro que tienen más experiencia con lo que funciona y lo que no funciona que nadie.

Inclusividad

La inclusión es una política de inclusión de personas que de otro modo podrían ser excluidas o marginadas. En informática, significa hacer un esfuerzo positivo para ser más acogedor con las mujeres, los grupos raciales o étnicos subrepresentados, las personas con diversas orientaciones sexuales, las personas mayores, los que enfrentan desafíos físicos, los que anteriormente estaban encarcelados, los económicamente desfavorecidos y todos los demás que no No se ajusta al grupo demográfico masculino / asiático afluente de Silicon Valley. La figura [f: motivacion-mujeres-en-cs] (de NPR) ilustra gráficamente los efectos de la cultura excluyente de la informática en las mujeres.

Mujeres

[Lee2017] es una guía breve y práctica para hacer eso con referencias a la literatura de investigación. Las prácticas que describe ayudan a los alumnos que pertenecen a uno o más grupos marginados o excluidos, pero también ayudan a motivar a los demás. Están redactados en términos de cursos a largo plazo, pero muchos se pueden aplicar en talleres y otros entornos de campo libre:

Pida a los alumnos que le envíen un correo electrónico antes del taller para explicar cómo creen que la capacitación podría ayudarlos a alcanzar sus objetivos.

Revisa tus notas para asegurarse de que estén libres de pronombres de género, incluya nombres culturalmente diversos, etc.

Haga hincapié en que lo que importa es la velocidad a la que están aprendiendo, no las ventajas o desventajas que tenían cuando comenzaron.

Fomentar la programación de pares, pero demuéstralo primero para que los alumnos comprendan los roles de conductor y navegador.

Mitigar activamente el comportamiento que algunos alumnos pueden encontrar intimidante, p.ej. uso de jerga o “preguntas” que en realidad se les pide que muestren conocimiento.

Una forma de apoyar a los alumnos de grupos marginados es hacer que las personas se inscriban en talleres en grupos en lugar de hacerlo individualmente. De esa manera, todos en la sala saben de antemano que estarán con personas de confianza, lo que aumenta las posibilidades de que realmente vengan. También ayuda después del taller: si las personas vienen con sus amigos o colegas, pueden trabajar juntas para usar lo que han aprendido.

Más fundamentalmente, los autores de las lecciones deben tener en cuenta la situación de todos. Por ejemplo, [DiSa2014a] descubrió que el 65% de los participantes afroamericanos varones en un programa de prueba de juegos estudiaron informática, en parte porque el aspecto de juego del programa era algo que sus compañeros respetaban. [Lach2018] exploró dos estrategias generales para creando contenido inclusivo y los riesgos asociados con ellos:

Representación de la comunidad destaca las identidades sociales, las historias y las redes comunitarias de los alumnos que utilizan mentores después de la escuela o modelos a seguir de los vecindarios de los alumnos, o actividades que utilizan narrativas e historias de la comunidad como base para un proyecto informático. El mayor riesgo con este enfoque es la superficialidad, p. usando computadoras para crear presentaciones de diapositivas en lugar de hacer computación real.

Integración computacional incorpora ideas de la comunidad de alumnos, como la reproducción de diseños gráficos autóctonos en un entorno de programación visual. El mayor riesgo aquí es la apropiación cultural, p. usando prácticas sin reconocer los orígenes. Si tiene dudas, pregunte a sus alumnos y miembros de la comunidad qué creen que deberían hacer. Volveremos a esto en el Capítulo 13.

Conducta como accesibilidad

Dijimos en la Sección 9.1 que las clases deberían aplicar un Código de Conducta como el del Apéndice 17. Esta es una forma de accesibilidad: mientras que los subtítulos hacen que el video sea accesible para las personas con discapacidad auditiva, un Código de Conducta hace que las lecciones sean accesibles para las personas que de lo contrario quedará marginado.

Pasando el modelo de déficit

Dependiendo de en quién confíe, solo entre el 12 y el 18% de las personas que obtienen títulos en informática son mujeres, que es menos de la mitad del porcentaje visto a mediados de la década de 1980 (Figura [f: motivación-género], de [Robe2017]). Y los países occidentales son los más extraños por tener un porcentaje tan bajo de mujeres en informática: las mujeres todavía son a menudo del 30 al 40% de los estudiantes de informática en otros lugares [Galp2002, Varm2015].

Enrolment

Como es poco probable que las mujeres hayan cambiado drásticamente en los últimos 30 años, tenemos que buscar causas estructurales para entender qué salió mal y cómo solucionarlo. Una explicación es la forma en que las computadoras domésticas se comercializaron como “juguetes para niños” a partir de la década de 1980 [Marg2003]; otra es la forma en que los departamentos de informática respondieron al crecimiento explosivo de la matrícula en la década de 1980 y nuevamente en la década de 2000 cambiando los requisitos de admisión [Robe2017]. Ninguno de estos factores puede parecer dramático para las personas que no se ven afectadas por ellos, pero actúan como el goteo constante de agua sobre una piedra: con el tiempo, erosionan la motivación y, con ello, la participación.

El primer y más importante paso para solucionar esto es dejar de pensar en términos de una “tubería con fugas” [Mill2015]. En términos más generales, debemos superar un modelo de déficit, es decir, dejar de pensar que los miembros de los grupos subrepresentados carecen de algo y, por lo tanto, son responsables de no avanzar. Creer eso pone la carga sobre las personas que ya tienen que hacer un trabajo extra para superar las desigualdades estructurales y (no por casualidad) les da a quienes se benefician de los acuerdos actuales una excusa para no verse demasiado de cerca.

Reescribiendo la historia

[Abba2012] describe las carreras y logros de las mujeres que dieron forma a la historia temprana de la informática, pero que con demasiada frecuencia se han descartado de ella; [Ensm2003, Ensm2012] describe cómo la programación se convirtió de una profesión femenina a masculina en la década de 1960 , mientras que [Hick2018] analiza cómo Gran Bretaña perdió su dominio temprano en informática al discriminar sistemáticamente a sus trabajadores más calificados: las mujeres. (Ver [Milt2018] para una revisión de los tres libros). Discutir esta historia hace que algunos hombres en informática se sientan muy incómodos; en mi opinión, esa es una buena razón para hacerlo.

La misoginia en los videojuegos, el uso del “ajuste cultural” en la contratación para disculpar los prejuicios conscientes o inconscientes, una cultura de silencio en torno al acoso y la creciente desigualdad en la sociedad que produce privilegios preparatorios (Sección 9.5) no son culpa de ninguna persona, pero arreglarlos es responsabilidad de todos. Como profesor, tienes más poder que la mayoría; Este taller tiene excelentes consejos prácticos sobre cómo ser un buen aliado, y su consejo es probablemente más importante que cualquier cosa que este libro le enseñe sobre la enseñanza.

Ejercicios

Tareas auténticas (pares / 15)

  1. En parejas, enumere media docena de cosas que hizo esta semana que utilizan las habilidades que enseña.

  2. Coloque sus artículos en una cuadrícula de 2x2 de “tiempo para dominar” y “utilidad”. ¿Dónde estás de acuerdo y en desacuerdo?

Necesidades principales (toda la clase / 10)

Paloma Medina identifica seis necesidades básicas para las personas en el trabajo: pertenencia, mejora (es decir, progresar), elección, igualdad, previsibilidad e importancia. Después de leer su descripción de estos, ordénelos de mayor a menor importancia para usted personalmente, luego compare las clasificaciones con sus pares. ¿Cómo crees que se compara tu clasificación con la de tus alumnos?

Implementar una estrategia para la inclusión (individual / 5)

Elija una actividad o cambio en la práctica de [Lee2017] en el que le gustaría trabajar. Ponga un recordatorio en su calendario tres meses en el futuro para preguntarse si ha hecho algo al respecto.

Después del hecho (think-pair-share / 20)

  1. Piense en un curso que tomó en el pasado e identifique una cosa que el maestro hizo que lo desmotivó. Tome notas sobre lo que podría haberse hecho después para corregir la situación.

  2. Emparéjese con su vecino y compare historias, luego agregue sus comentarios a un conjunto de notas compartidas por toda la clase.

  3. Revise los comentarios en las notas compartidas como un grupo. Destaque y discuta algunas de las cosas que podrían haberse hecho de manera diferente.

  4. ¿Crees que hacer esto te ayudará a manejar situaciones como estas en el futuro?

Recorrer la ruta (toda la clase / 15)

Encuentre el punto de entrega de transporte público más cercano a su edificio y camine desde allí a su oficina y luego al baño más cercano, tomando notas sobre cosas que cree que serían difíciles para alguien con problemas de movilidad. Ahora pida prestada una silla de ruedas y repita el viaje. ¿Cuán completa fue su lista de ejercicios? ¿Y notaron que la primera oración en este ejercicio asumía que realmente podían caminar?

¿Quien decide? (toda la clase / 15)

En [Litt2004], Kenneth Wesson escribió: “Si los niños pobres del centro de la ciudad superaran sistemáticamente a los niños de los hogares suburbanos ricos en pruebas estandarizadas, ¿alguien es tan ingenuo como para creer que aún insistiríamos en usar estas pruebas como indicadores de éxito?” Lea este artículo de Cameron Cottrill y luego describa un ejemplo de su propia experiencia de evaluaciones “objetivas” que reforzó el status quo.

Estereotipos comunes (pares / 10)

Algunas personas todavía dicen: “Es tan simple que incluso tu abuela podría usarlo”. En parejas, enumere otras dos o tres frases que refuercen los estereotipos sobre computación.

No ser un imbécil (individual / 15)

Este breve artículo de Gary Bernhardt reescribe un mensaje innecesariamente hostil para ser menos grosero. Utilizándolo como modelo, encuentre algo desagradable en Stack Overflow o en algún otro foro de debate público y vuelva a escribirlo para que sea más inclusivo.

Cara de ahorro (individual / 10)

¿Se avergonzaría alguno de sus alumnos deseados de admitir que ya no saben algunas de las cosas que desea enseñar? Si es así, ¿cómo puede ayudarlos a salvar la cara?

Juguetes infantiles (toda la clase / 15)

[Cutt2017] encuestó a usuarios adultos de computadoras sobre sus actividades infantiles y descubrió que la correlación más fuerte entre la confianza y el uso de la computadora se basaba en la lectura por su cuenta y jugar con juguetes de construcción como Lego que no tienen partes móviles. Examine la clase y vea en qué otras actividades participaron las personas, luego busque estas actividades en línea. ¿Qué grado de género tienen las descripciones y la publicidad para ellos? ¿Qué efecto crees que tiene esto?

Accesibilidad a la lección (pares / 30)

En parejas, elija una lección cuyos materiales estén disponibles en línea y clasifíquelos independientemente de acuerdo con lo que se debe y no se debe hacer en estos carteles. ¿Dónde estuvieron de acuerdo usted y su pareja? ¿Dónde estabas en desacuerdo? ¿Qué tan bien fue la lección para cada una de las seis categorías de usuarios?

Rastreando el ciclo (grupos pequeños / 15)

[Coco2018] traza un patrón deprimentemente común en el que las buenas intenciones se ven socavadas por el liderazgo de una organización que no está dispuesto a cambiar realmente. Trabajando en grupos de 4 a 6, escriba breves textos o correos electrónicos que imagina que cada una de las partes involucradas se enviaría a la otra en cada etapa de este ciclo.

¿Qué es lo peor que podría pasar? (grupos pequeños / 5)

A lo largo de los años, un proyector se incendió, un estudiante se puso de parto y comenzó una pelea en clase. Me caí del escenario dos veces, me quedé dormido en una de mis propias conferencias y muchos chistes se me cayeron. En pequeños grupos, haga una lista de las peores cosas que le han sucedido mientras enseñaba, luego comparta con la clase. Mantenga la lista para recordarse más tarde que no importa cuán mala sea la clase, al menos nada de eso sucedió.

Resumen

motivation


Enseñando en línea

Si usas robots para enseñar, enseñas a las personas a ser robots. – atribuido diversamente

La tecnología ha cambiado la enseñanza y el aprendizaje muchas veces. Antes de que los pizarrones se introdujeran en las escuelas a principios de 1800, no había forma de que los maestros compartieran un ejemplo, diagrama o ejercicio improvisados con toda una clase a la vez. Las pizarras económicas, confiables, fáciles de usar y flexibles, permitieron a los maestros hacer las cosas rápidamente y a una escala que antes solo podían hacer lentamente y poco a poco. Del mismo modo, las videocámaras portátiles revolucionaron el entrenamiento deportivo, al igual que las grabadoras revolucionaron la instrucción musical una década antes.

Muchas de las personas que empujan Internet a las aulas no conocen esta historia y no se dan cuenta de que la suya es solo la última de una larga serie de intentos de usar máquinas para enseñar [Watt2014]. Desde la imprenta a través de la radio y la televisión hasta las computadoras de escritorio y los dispositivos móviles, cada nueva forma de compartir conocimiento ha producido una ola de optimistas agresivos que creen que la educación está rota y que la tecnología puede solucionarlo. Sin embargo, los defensores más fuertes de la tecnología de la educación a menudo han sabido menos acerca de “educación” que “tecnología”, y detrás de su retórica, muchos han sido impulsados más por la perspectiva de ganancias que por el deseo de empoderar a los estudiantes.

El debate de hoy a menudo se confunde al confundir “en línea” con “automatizado”. Corre bien, una docena de personas que trabajan a través de un problema en un chat de video se siente como cualquier otra discusión en grupos pequeños. Por el contrario, un escuadrón de auxiliares docentes que clasifiquen cientos de documentos contra una rúbrica inflexible también podría ser una colección de guiones de Perl. Por lo tanto, este capítulo comienza analizando la instrucción en línea totalmente automatizada utilizando videos grabados y ejercicios calificados automáticamente, luego explora algunos modelos híbridos alternativos.

MOOC

El esfuerzo de más alto perfil para reinventar la educación a través de Internet es el curso masivo abierto en línea, o MOOC. El término fue inventado por David Cormier en 2008 para describir un curso organizado por George Siemens y Stephen Downes. Ese curso se basó en una visión conectivista del aprendizaje, que sostiene que el conocimiento se distribuye y que el aprendizaje es el proceso de encontrar, crear y podar conexiones.

El término “MOOC” fue rápidamente cooptado por los creadores de cursos que se parecían más al modelo de un aula tradicional de un aula tradicional, con el maestro en el centro definiendo objetivos y los alumnos vistos como receptores o replicadores de conocimiento. Las clases que usan el modelo conectivista original ahora a veces se denominan “cMOOC”, mientras que las clases que centralizan el control se denominan “xMOOC”. (A este último también se le llama a veces “MESS”, para Sage masivamente mejorado en el escenario).

Hace cinco años, no se podía caminar por un campus universitario importante sin escuchar a alguien hablar sobre cómo los MOOC revolucionarían la educación, la destruirían o posiblemente ambas cosas. Los MOOC darían a los alumnos acceso a una gama más amplia de cursos y les permitirían trabajar cuando fuera conveniente para ellos en lugar de adaptar su aprendizaje al horario de otra persona.

Pero los MOOC no han sido tan efectivos como predijeron sus defensores más entusiastas [Ubel2017]. Una razón es que el contenido grabado es ineficaz para muchos novatos porque no puede aclarar sus conceptos erróneos individuales (Capítulo 2): si no comprenden una explicación la primera vez, generalmente no se ofrece una diferente. Otra es que la evaluación automatizada necesaria para poner lo “masivo” en MOOC solo funciona bien en los niveles más bajos de la Taxonomía de Bloom (Sección 6.2). Ahora también está claro que los estudiantes tienen que soportar mucho más la carga de mantenerse enfocados en un MOOC, que la impersonalidad de trabajar en línea puede alentar un comportamiento no civil y desmotivar a las personas, y que “disponible para todos” en realidad significa “disponible para todos lo suficientemente ricos tener internet de alta velocidad y mucho tiempo libre”.

[Marg2015] examinó 76 MOOCs sobre diversos temas y descubrió que si bien la organización y presentación del material era buena, la calidad del diseño de la lección era deficiente. Más cerca de casa, [Kim2017] estudió treinta tutoriales populares de codificación en línea, y descubrió que en gran medida enseñaban el mismo contenido de la misma manera: de abajo hacia arriba, comenzando con conceptos de programación de bajo nivel y construyendo objetivos de alto nivel. La mayoría de los alumnos exigieron que escribieran programas y proporcionaron alguna forma de retroalimentación inmediata, pero esta retroalimentación fue típicamente muy superficial. Pocos explicaron cuándo y por qué los conceptos son útiles (es decir, no mostraron cómo transferir conocimiento) o brindaron orientación para errores comunes, y aparte de la diferenciación rudimentaria basada en la edad, ninguna lección personalizada basada en la experiencia de codificación previa o los objetivos del alumno.

Aprendizaje personalizado

Pocos términos se han utilizado y abusado de tantas formas como el aprendizaje personalizado. Para la mayoría de los defensores de la tecnología ed, significa ajustar dinámicamente el ritmo de las lecciones en función del rendimiento del alumno, de modo que si alguien responde correctamente varias preguntas seguidas, la computadora omitirá algunas de las preguntas posteriores.

Hacer esto puede producir mejoras modestas, pero mejor es posible. Por ejemplo, si muchos alumnos encuentran difícil un tema en particular, el maestro puede preparar múltiples explicaciones alternativas de ese punto en lugar de acelerar un solo camino. De esa manera, si una explicación no resuena, hay otras disponibles. Sin embargo, esto requiere mucho más trabajo de diseño por parte del maestro, lo que puede ser la razón por la cual no ha resultado popular. E incluso si funciona, es probable que los efectos sean mucho menores de lo que creen algunos de sus defensores. Un buen maestro hace una diferencia de 0.1 a 0.15 desviaciones estándar en el desempeño de fin de año en la escuela primaria [Chet2014] (vea este artículo para un breve resumen). No es realista creer que cualquier tipo de automatización pueda superar esto en el corto plazo.

Entonces, ¿cómo debe usarse Internet para enseñar y aprender habilidades tecnológicas? Sus ventajas y desventajas son:

Los alumnos pueden acceder a más lecciones, más rápido, que nunca. Siempre que, por supuesto, un motor de búsqueda considere esas lecciones que valga la pena indexar, que su proveedor de servicios de Internet y el gobierno no lo bloqueen, y que la verdad no se ahogue en un mar de desinformación que debilita la atención.

Los alumnos pueden acceder a mejores lecciones que nunca antes, a menos que estén siendo dirigidos hacia material de segunda categoría para redistribuir la riqueza de los que no tienen a los que tienen [McMi2017]. También vale la pena recordar que la escasez aumenta el valor percibido, por lo que a medida que la educación en línea se vuelve más barata, se convertirá cada vez más en lo que todos quieren para los hijos de otra persona.

Los alumnos también pueden acceder a muchas más personas que nunca. Pero solo si esos alumnos realmente tienen acceso a la tecnología requerida, pueden permitirse el lujo de usarla y no son expulsados ​​del hostigamiento o marginados porque no se ajustan a las normas sociales de cualquier grupo que esté hablando más alto. En la práctica, la mayoría de los usuarios de MOOC provienen de entornos seguros y ricos [Hans2015].

Los profesores pueden obtener una visión mucho más detallada de cómo trabajan los alumnos. Mientras los alumnos estén haciendo cosas que sean susceptibles de análisis automatizados a gran escala y no se opongan a la vigilancia en el aula o no sean lo suficientemente potentes como para que sus objeciones tengan importancia. [Marg2015, Mill2016a, Nils2017] describen formas de acentuar los aspectos positivos en la lista anterior, evitando los negativos:

Hacer plazos frecuentes y bien publicitados, y hacerlos cumplir para que los alumnos entren en un ritmo de trabajo.

Mantenga las actividades sincrónicas de toda la clase como conferencias en vivo al mínimo para que las personas no se pierdan cosas debido a conflictos de programación.

Haga que los alumnos contribuyan al conocimiento colectivo, p.ej. tomen notas juntas (Sección 9.7), sirvan como escribas de clase o contribuyan con problemas a conjuntos de problemas compartidos (Sección 5.3).

Fomentar o exigir a los alumnos que realicen parte de su trabajo en grupos pequeños. que tienen actividades en línea sincrónicas como una discusión semanal en línea. Esto ayuda a los estudiantes a mantenerse comprometidos y motivados sin crear demasiados dolores de cabeza de programación. (Consulte el Apéndice 20 para obtener algunos consejos sobre cómo hacer que estas discusiones sean justas y productivas).

Crear, publicar y aplicar un código de conducta. para que todos puedan participar en debates en línea (Sección 9.1). Use muchos episodios de lecciones cortas en lugar de un puñado de fragmentos de conferencias para minimizar la carga cognitiva y brindar muchas oportunidades para la evaluación formativa. Esto también ayuda con el mantenimiento: si todos sus videos son cortos, simplemente puede volver a grabar cualquiera que necesite mantenimiento, que a menudo es más barato que tratar de parchear videos más largos.

Use el video para participar en lugar de instruir. Dejando a un lado las discapacidades (Sección 10.3), los alumnos pueden leer más rápido de lo que usted puede hablar. La excepción a esta regla es que el video es en realidad la mejor manera de enseñar verbos (acciones) a las personas: capturas de pantalla cortas que muestran a las personas cómo usar un editor, recorrer el código en un depurador, etc., son más efectivas que las capturas de pantalla con texto.

Identificar y aclarar conceptos erróneos temprano. Si los datos muestran que los alumnos tienen dificultades con algunas partes de una lección, cree explicaciones alternativas de esos puntos y ejercicios adicionales para que practiquen.

Todo esto debe implementarse de alguna manera, lo que significa que necesita algún tipo de plataforma de enseñanza. Puede usar un sistema de gestión de aprendizaje todo en uno como Moodle o Sakai, o armar algo usted mismo usando Slack o Zulip para chatear, Hangouts de Google o aparecer .in para conversaciones de video y WordPress, Google Docs o cualquier número de wiki sistemas de autoría colaborativa. Si recién está comenzando, elija lo que sea más fácil de configurar y administrar y que sea más familiar para sus alumnos. Si te enfrentas a una elección, la segunda consideración es más importante que la primera: esperas que las personas aprendan mucho en tu clase, por lo que es justo que aprendas a manejar las herramientas con las que se sienten más cómodos.

Crear una plataforma para el aprendizaje es necesario pero no suficiente: si quieres que tus alumnos prosperen, debes crear una comunidad. Cientos de libros y presentaciones hablan sobre cómo hacer esto, pero la mayoría se basan en las experiencias personales de sus autores. [Krau2016] es una excepción bienvenida: mientras precede al descenso acelerado de Twitter y Facebook en el abuso armado y la información errónea, la mayoría de sus los resultados aún son relevantes. [Foge2005] también está lleno de consejos útiles sobre las comunidades de práctica a las que los alumnos pueden unirse; Exploramos algunas de sus ideas en el Capítulo 13.

Libertad ay libertad de

El ensayo de Isaiah Berlin de 1958 “Dos conceptos de libertad” hizo una distinción entre la libertad positiva, que es la capacidad de hacer algo realmente, y la libertad negativa, que es la ausencia de reglas que digan que no se puede hacer. Las discusiones en línea generalmente ofrecen libertad negativa (nadie te impide decir lo que piensas) pero no libertad positiva (muchas personas no pueden ser escuchadas). Una forma de abordar esto es introducir algún tipo de limitación, como permitir que cada alumno contribuya con un mensaje por hilo de discusión por día. Al hacer esto, los que tienen algo que decir tienen la oportunidad de decirlo, al tiempo que dejan espacio para que otros también digan cosas.

Otra preocupación que la gente tiene sobre la enseñanza en línea es hacer trampa. La deshonestidad diaria no es más común en las clases en línea que en entornos presenciales [Beck2014], pero la tentación de que alguien más escriba el examen final, y la dificultad de verificar si esto sucedió, es una de las razones por las que las instituciones educativas se han mostrado reacias a ofrecer crédito por clases en línea puras. La supervisión remota del examen es posible, pero antes de invertir en esto, lea [Lang2013]: explora por qué y cómo los alumnos hacen trampa, y cómo se pueden estructurar los cursos para evitar darles una razón para hacerlo.

Video

A prominent feature of most MOOCs is their use of recorded video lectures. These can be effective: as mentioned in Chapter 8, a teaching technique called Direct Instruction based on precise delivery of a well-designed script has repeatedly been shown to be effective [Stoc2018]. However, scripts for direct instruction have to be designed, tested, and refined very carefully, which is an investment that many MOOCs have been unwilling or unable to make. Making a small change to a web page or a slide deck only takes a few minutes; making even a small change to a short video takes an hour or more, so the cost to the teacher of acting on feedback can be unsupportable. And even when they’re well made, videos have to be combined with activities to be beneficial:[Koed2015] estimated, “…the learning benefit from extra doing…to be more than six times that of extra watching or reading.”

If you are teaching programming, you may use screencasts instead of slides, since they offer some of the same advantages as live coding (Section 8.1).[Chen2009] offers useful tips for creating and critiquing screencasts and other videos; Figure [f:online-screencasting] (from[Chen2009]) reproduces the patterns that paper presents and the relationships between them. (It’s also a good example of a concept map (Section 3.1).)

screen cast

Entonces, ¿qué hace que un video instructivo sea efectivo? [Guo2014] midió el compromiso observando cuánto tiempo los estudiantes vieron videos MOOC y descubrieron que:

  • Los videos más cortos son mucho más atractivos: los videos no deben durar más de seis minutos.

  • Una cabeza parlante superpuesta en diapositivas es más atractiva que la voz en diapositivas sola.

  • Los videos que parecían personales podrían ser más atractivos que las grabaciones de estudio de alta calidad, por lo que filmar en entornos informales podría funcionar mejor que el trabajo de estudio profesional a un costo menor.

  • Dibujar en una tableta es más atractivo que las diapositivas de PowerPoint o las capturas de pantalla de código, aunque no está claro si esto se debe al movimiento y la informalidad o porque reduce la cantidad de texto en la pantalla.

  • Está bien que los maestros hablen bastante rápido siempre que estén entusiasmados.

Una cosa que [Guo2014] no abordó es el problema del huevo y la gallina: ¿los estudiantes encuentran que cierto tipo de video es atractivo porque están acostumbrados, por lo que producir más videos de ese tipo aumentará el compromiso simplemente por un comentario? ¿lazo? ¿O estas recomendaciones reflejan algunos procesos cognitivos más profundos? Otra cosa que este documento no analizó son los resultados de aprendizaje: sabemos que las evaluaciones de los alumnos de los cursos no se correlacionan con el aprendizaje [Star2014, Uttl2017], y si bien es posible que los alumnos no aprendan de cosas que no ven, queda por demostrar que aprenden de las cosas que ven.

Estoy un poco incomodo

La investigación de [Guo2014] fue aprobada por una junta de ética de investigación de la universidad, los alumnos cuyos hábitos de visualización fueron monitoreados casi con certeza hicieron clic en “aceptar” un acuerdo de términos de servicio en algún momento, y me alegra tener estos conocimientos. Por otro lado, la palabra “privacidad” no apareció en el título ni en el resumen de ninguna de las docenas de artículos o carteles en la conferencia donde se presentaron estos resultados. Teniendo una opción, prefiero no saber qué tan comprometidos están los alumnos que fomentar la vigilancia ubicua en el aula.

Hay muchas formas diferentes de grabar lecciones en video; Para descubrir cuáles son los más efectivos, [Mull2007a] asignó a 364 estudiantes de física de primer año a tratamientos multimedia en línea de las Leyes Primera y Segunda de Newton en uno de los cuatro estilos:

Exposición: presentación concisa de estilo conferencia.

Exposición extendida: como arriba con información interesante adicional.

Refutación: Exposición con conceptos erróneos comunes explícitamente declarados y refutados.

Diálogo: Discusión aprendiz-tutor del mismo material que en la Refutación.

Refutation and Dialog produjo las mayores ganancias de aprendizaje en comparación con Exposition; los alumnos con poco conocimiento previo se beneficiaron más, y aquellos con alto conocimiento previo no se vieron en desventaja. Nuevamente, esto resalta la importancia de abordar directamente los conceptos erróneos de los alumnos. No solo le digas a la gente qué es: diles qué no es y por qué no.

Modelos híbridos

La enseñanza totalmente automatizada es solo una forma de utilizar la web en la enseñanza. En la práctica, casi todo el aprendizaje en sociedades ricas tiene un componente en línea hoy, ya sea oficialmente o mediante canales de retroceso entre pares y búsquedas subrepticias de respuestas a preguntas de tarea. La combinación de instrucción en vivo y automatizada permite a los maestros usar las fortalezas de ambos. En un aula tradicional, el maestro puede responder preguntas de inmediato, pero a los alumnos les lleva días o semanas recibir comentarios sobre sus ejercicios de codificación. En línea, puede tomar más tiempo para que un alumno obtenga una respuesta, pero puede obtener retroalimentación inmediata sobre su codificación (al menos para ese tipo de ejercicios podemos auto-calificar).

Otra diferencia es que los ejercicios en línea deben ser más detallados porque tienen que anticipar las preguntas de los alumnos. Encuentro que las lecciones en persona comienzan con la intersección de lo que todos necesitan saber y se expande bajo demanda, mientras que las lecciones en línea deben incluir la unión de lo que todos necesitan saber porque el maestro no está allí para hacer la expansión.

En realidad, la distinción entre en línea y en persona ahora es menos importante para la mayoría de las personas que la distinción entre síncrono y asíncrono: ¿los profesores y los alumnos interactúan en tiempo real, o su comunicación se extiende e intercala con otras actividades? En persona casi siempre será sincrónico, pero en línea es cada vez más una mezcla de ambos:

Creo que nuestros nietos probablemente considerarán la distinción que hacemos entre lo que llamamos el mundo real y lo que piensan que es >simplemente el mundo como lo más extraño e incomprensible de nosotros. – William Gibson

La implementación más popular de este futuro combinado hoy en día es el aula invertida, en la que los alumnos ven las lecciones grabadas por su cuenta y el tiempo de clase se utiliza para debatir y resolver los problemas. Originalmente descrita en [King1993], la idea se popularizó como parte de la instrucción entre pares (Sección 9.2) y se ha estudiado intensamente durante la última década. Por ejemplo, [Camp2016] comparó a los estudiantes que tomaron una clase introductoria de ciencias de la computación en línea con aquellos que la tomaron en un aula invertida. La finalización de los ejercicios de práctica (sin marcar) se correlacionó con los puntajes de los exámenes para ambos, pero la tasa de finalización de los ejercicios de ensayo por parte de los alumnos en línea fue significativamente menor que las tasas de asistencia a la clase para los alumnos en persona.

Pero si hay grabaciones disponibles, ¿los alumnos seguirán apareciendo en clase para hacer ejercicios de práctica? [Nord2017] examinó el impacto de las grabaciones tanto en la asistencia a la conferencia como en el rendimiento de los alumnos en diferentes niveles. En la mayoría de los casos, el estudio no encontró consecuencias negativas de hacer disponibles las grabaciones; en particular, los alumnos no se saltaron las conferencias cuando hay grabaciones disponibles (al menos, no más de lo que suelen hacer). Los beneficios de proporcionar grabaciones fueron mayores para los estudiantes al principio de sus carreras, pero disminuyeron a medida que los estudiantes se hicieron más maduros.

Otro modelo híbrido trae la vida en línea al aula. Tomar notas juntas es un primer paso (Sección 9.7); agrupar respuestas a preguntas de opción múltiple en tiempo real utilizando herramientas como Pear Deck y Socrative es otra. Si la clase es pequeña, digamos, de una docena a quince personas, también puede hacer que todos los alumnos se unan a una videoconferencia para que puedan compartir la pantalla con el maestro. Esto les permite mostrar su trabajo (o sus problemas) a toda la clase sin tener que conectar su computadora portátil al proyector. Los alumnos también pueden usar el chat en la videollamada para publicar preguntas para el profesor; En mi experiencia, la mayoría de ellos serán respondidos por sus compañeros de aprendizaje, y el maestro puede manejar el resto cuando lleguen a un descanso natural. Este modelo ayuda a nivelar el campo de juego para los alumnos remotos: si alguien no puede asistir a clase por razones de salud o por compromisos familiares o laborales, aún puede participar de manera casi igual si todos están acostumbrados a colaborar en línea en tiempo real.

También he impartido clases utilizando la instrucción remota en tiempo real, en la que los alumnos se ubican en 2–6 sitios con ayudantes presentes mientras enseño a través de la transmisión de video (Sección 18.1). Esto escala bien, ahorra en costos de viaje y permite el uso de técnicas como la programación de pares (Sección 9.6). Lo que no funciona es tener un grupo en persona y uno o más grupos de forma remota: con la mejor voluntad del mundo, los participantes locales reciben mucha más atención.

Compromiso en línea

[Nuth2007] descubrió que hay tres mundos superpuestos en cada aula: el público (lo que dice y hace el maestro), lo social (interacciones entre alumnos) y lo privado (dentro de la cabeza de cada alumno). De estos, el más importante suele ser el social: los alumnos captan tanto a través de las señales de sus compañeros como lo hacen de la instrucción formal.

Por lo tanto, la clave para hacer efectiva cualquier forma de enseñanza en línea es facilitar las interacciones entre pares. Para ayudar a esto, los cursos casi siempre tienen algún tipo de foro de discusión. [Mill2016a] observó que los alumnos usan estos de maneras muy diferentes:

… Los postergadores son particularmente improbables de participar en foros de discusión en línea, y esta participación reducida, a su vez, se correlaciona con peores calificaciones. Una posible explicación para esta correlación es que los postergadores dudan especialmente en unirse una vez que se inicia la discusión, tal vez porque les preocupa ser percibidos como recién llegados en una conversación establecida. Esta aversión a saltar tarde hace que se pierdan los importantes beneficios de aprendizaje y motivación de la interacción entre pares.

[Vell2017] analiza los mensajes del foro de discusión de 395 estudiantes de CS2 en dos universidades dividiéndolos en cuatro categorías:

Activo: Solicitud de ayuda que no muestra el razonamiento y no muestra lo que el estudiante ya ha intentado o ya sabe.

Constructivo: reflejar el razonamiento o los intentos de los estudiantes de construir una solución al problema.

Logística: políticas del curso, horarios, envío de tareas, etc.

Aclaración de contenido: Solicitar información adicional que no revele el pensamiento del estudiante. Descubrieron que las preguntas constructivas y logísticas dominaban, y que las preguntas constructivas se correlacionaban con las calificaciones. También descubrieron que los estudiantes rara vez hacen más de una pregunta activa en un curso, y que no se correlacionan con las calificaciones. Si bien esto es decepcionante, saber que ayuda a establecer las expectativas de los maestros: si bien todos queremos que nuestros cursos tengan comunidades en línea animadas, tenemos que aceptar que la mayoría no lo hará, o que la mayoría de la discusión de alumno a alumno se llevará a cabo a través de canales que ya están usando y de los que no formamos parte.

Cooperacion [Gull2004] describe un concurso de codificación en línea que combina colaboración y competencia. El concurso comienza cuando se publica una descripción del problema junto con una solución correcta pero ineficiente. Cuando termina, el ganador es la persona que ha realizado la mayor contribución general para mejorar el rendimiento de la solución general. Todos los envíos son abiertos, para que los participantes puedan ver el trabajo de los demás y tomar ideas prestadas entre ellos. Como muestra el documento, la solución final es casi siempre una idea de préstamo híbrido de muchas personas.

[Batt2018] describió una variación a pequeña escala de esto en una clase de computación introductoria. En la etapa uno, cada alumno presentó un proyecto de programación individualmente. En la etapa dos, los alumnos se emparejaron para crear una solución mejorada para el mismo problema. La evaluación indica que los proyectos de dos etapas tienden a mejorar la comprensión de los alumnos y que disfrutaron el proceso. Proyectos como estos no solo mejoran el compromiso, sino que también brindan a los participantes más experiencia sobre la base del código de otra persona.

La discusión no es la única forma de lograr que los alumnos trabajen juntos en línea. [Pare2008] y [Kulk2013] informan experimentos en los que los alumnos califican el trabajo de los demás, y las calificaciones que asignan se comparan con las calificaciones otorgadas por los asistentes de enseñanza de posgrado u otros expertos. Ambos descubrieron que las calificaciones asignadas por el alumno coincidían con las calificaciones asignadas por expertos tan a menudo como las calificaciones de los expertos coincidían entre sí, y que unos pocos pasos simples (como filtrar respuestas obviamente no consideradas o estructurar rúbricas) disminuyeron aún más el desacuerdo. Y como se discutió en la Sección 5.3, la colusión y el sesgo no son factores significativos en la clasificación por pares.

Confía, pero educa

La forma más común de medir la validez de la retroalimentación es comparar las calificaciones de los alumnos con las calificaciones de los expertos, pero la revisión por pares calibrada (Sección 5.3) puede ser igualmente efectiva. Antes de pedirles a los alumnos que califiquen el trabajo de los demás, se les pide que califiquen muestras y comparen sus resultados con las calificaciones asignadas por el maestro. Una vez que los dos se alinean, el alumno puede comenzar a dar calificaciones a sus compañeros. Dado que la lectura crítica es una forma efectiva de aprender, este resultado puede apuntar a un futuro en el que los estudiantes usan la tecnología para emitir juicios, en lugar de ser juzgados por la tecnología.

Una técnica que definitivamente veremos más en los próximos años es la transmisión en línea de sesiones de codificación en vivo [Raj2018, Haar2017]. Esto tiene la mayoría de los beneficios discutidos en la Sección 8.1, y cuando se combina con la toma de notas en colaboración (Sección 9.7) puede ser una aproximación cercana a una experiencia en clase.

Mirando aún más adelante, [Ijss2000] identificó cuatro niveles de presencia en línea, desde el realismo (no podemos distinguir la diferencia) hasta la inmersión (olvidamos la diferencia) y la participación (estamos comprometidos pero conscientes de la diferencia) hasta la suspensión de incredulidad (estamos haciendo la mayor parte del trabajo). Crucialmente, distinguen la presencia física, que es la sensación de estar realmente en algún lugar, y la presencia social, que es la sensación de estar con los demás. Esto último es más importante en la mayoría de las situaciones de aprendizaje y, una vez más, podemos fomentarlo utilizando la tecnología cotidiana de los alumnos en el aula. Por ejemplo, [Deb2018] descubrió que la retroalimentación en tiempo real sobre los ejercicios en clase utilizando los dispositivos móviles de los propios alumnos mejoró la retención de conceptos y la participación de los alumnos al tiempo que redujo las tasas de fracaso.

La enseñanza en línea y asincrónica todavía están en pañales. Los MOOC centralizados pueden llegar a ser un callejón sin salida evolutivo, pero todavía hay muchos otros modelos prometedores para explorar. En particular, [Broo2016] describe cincuenta formas en que los grupos pueden discutir cosas de manera productiva, de las cuales solo unas pocas son ampliamente conocidas o implementadas en línea. Si vamos a donde nuestros alumnos están tecnológicamente en lugar de exigirles que vengan a nosotros, podemos terminar aprendiendo tanto como ellos.

Ejercicios

Video bidireccional (pares / 10)

Grabe un video de 2–3 minutos de usted mismo haciendo algo, luego intercambie máquinas con un compañero para que cada uno pueda ver el video del otro a una velocidad 4x. ¿Qué tan fácil es seguir lo que está pasando? ¿Y si te perdiste algo?

Puntos de vista (individual / 10)

Según [Irib2009], diferentes disciplinas se centran en diferentes factores que afectan el éxito o no de las comunidades en línea:

Negocio: fidelización de clientes, gestión de marca, motivación extrínseca.

Psicología: sentido de comunidad, motivación intrínseca.

Sociología: identidad grupal, comunidad física, capital social, acción colectiva.

Ciencias de la Computación: Implementación tecnológica.

¿Cuál de estas perspectivas se corresponde más con la suya? ¿Con cuál estás menos alineado?

Ayudando o Dañando (grupos pequeños / 30)

El artículo de Susan Dynarski en el New York Times explica cómo y por qué las escuelas están colocando a los estudiantes que reprobaron los cursos en persona en cursos en línea, y cómo esto los prepara para un fracaso aún mayor. Lea el artículo y luego:

  1. En grupos pequeños, piense en 2-3 cosas que las escuelas podrían hacer para compensar estos efectos negativos y crear estimaciones aproximadas de sus costos por alumno.

  2. Compare sus sugerencias y costos con los de otros grupos. ¿Cuántos puestos de enseñanza a tiempo completo cree que deberían eliminarse para liberar recursos para implementar las ideas más populares para un centenar de estudiantes?

  3. Como clase, ¿crees que sería un beneficio neto para los alumnos o no?

Los ejercicios de presupuestación como este son una buena manera de saber quién toma en serio el cambio educativo. Todos pueden pensar en cosas que les gustaría hacer; Muchos menos están dispuestos a hablar sobre las compensaciones necesarias para que el cambio suceda.


Tipos de ejercicio

Todo buen carpintero tiene un juego de destornilladores, y cada buen maestro tiene diferentes tipos de ejercicios para verificar lo que los alumnos realmente están aprendiendo, ayudarlos a practicar sus nuevas habilidades y mantenerlos comprometidos. Este capítulo comienza describiendo varios tipos de ejercicios que puede usar para verificar si su enseñanza ha sido efectiva. Luego analiza el estado del arte en la calificación automatizada y cierra explorando debates, proyectos y otros tipos importantes de trabajo que requieren más atención humana para evaluar. Nuestra discusión se basa en parte en el Banco de preguntas de Canterbury [Sand2013], que tiene entradas para varios idiomas y temas en informática introductoria.

Los clásicos

Como se discutió en la Sección 2.1, las preguntas de opción múltiple (MCQ) son más efectivas cuando las respuestas incorrectas analizan conceptos erróneos específicos. Por lo general, están diseñados para probar los niveles más bajos de la Taxonomía de Bloom (Sección 6.2), pero también pueden requerir que los alumnos ejerzan su juicio.

Una pregunta de opción múltiple

¿En qué orden ocurren las operaciones cuando la computadora evalúa la expresión precio = addTaxes (costo - descuento

1.- resta, llamada de función, asignación

2.- llamada a función, resta, asignación

3.- llamada a funciones, luego asignación y resta simultáneamente

4.- Ninguna de las anteriores

El segundo tipo clásico de ejercicio de programación es code and run (C&R), en el que el alumno escribe código que produce un resultado específico. Los ejercicios de C&R pueden ser tan simples o complejos como el maestro quiera, pero cuando se usan en clase, deben ser breves y tener solo una o dos respuestas correctas plausibles. A menudo es suficiente pedirles a los principiantes que calculen e impriman un solo valor o que llamen a una función específica: los maestros experimentados a menudo olvidan lo difícil que puede ser determinar qué parámetros van a dónde. Para los alumnos más avanzados, descubrir qué función llamar es más interesante y un mejor indicador de su comprensión.

Code & Run

La imagen variable contiene una imagen a todo color leída de un archivo. Usando una función, cree una versión en blanco y negro de la imagen y asígnela a una nueva variable llamada monocromo.

Los ejercicios de escritura y ejecución se pueden combinar con MCQ. Por ejemplo, este MCQ solo se puede responder ejecutando el comando Unix ls:

Combinando MCQ con Code & Run

Estás en el directorio / home. ¿Cuál de los siguientes archivos no está en ese directorio?

  1. autumn.csv

  2. fall.csv

  3. spring.csv

  4. winter.csv

Los C&R ayudan a las personas a practicar las habilidades que más desean aprender, pero pueden ser difíciles de evaluar: puede haber muchas formas inesperadas de obtener la respuesta correcta, y las personas se desmoralizarán si un sistema de calificación automático rechaza su código porque no lo hace. No coincide con la del profesor. Una forma de reducir la frecuencia con la que esto ocurre es evaluar solo su producción, pero eso no les da retroalimentación sobre cómo están programando. Otra es darles un pequeño conjunto de pruebas en el que puedan ejecutar su código antes de enviarlo (en ese momento se ejecuta en un conjunto más completo de pruebas). Hacer esto les ayuda a determinar si han entendido mal la intención del ejercicio antes de hacer algo que creen que podría costarles calificaciones.

En lugar de escribir código que satisfaga algunas especificaciones, se les puede pedir a los estudiantes que escriban pruebas para determinar si un fragmento de código se ajusta a una especificación. Esta es una habilidad útil por derecho propio, y hacerlo puede dar a los estudiantes un poco más de simpatía por lo duro que trabajan sus maestros.

Código de inversión y ejecución

La función monotonic_sum calcula la suma de cada sección de una lista de números en la que los valores están aumentando estrictamente. Por ejemplo, dada la entrada [1, 3, 3, 4, 5, 1], la salida es [4, 12, 1]. Escriba y ejecute pruebas unitarias para determinar cuál de los siguientes errores contiene la función:

  • Considera que cada número negativo es el comienzo de una nueva subsecuencia.

  • No incluye el primer valor de cada subsecuencia en la sub-suma.

  • No incluye el último valor de cada subsecuencia en la sub-suma.

  • Solo reinicia la suma cuando los valores disminuyen en lugar de no aumentar.

Completar los espacios en blanco es un refinamiento de C&R en el que el alumno recibe un código de inicio y debe completarlo. (En la práctica, la mayoría de los ejercicios de C&R en realidad se llenan los espacios en blanco porque el maestro proporciona comentarios para recordar a los alumnos los pasos que deben seguir). Las preguntas de este tipo son la base de ejemplos desvaídos; Como se discutió en el Capítulo 4, los principiantes a menudo los encuentran menos intimidantes que escribir todo el código desde cero, y dado que el maestro ha proporcionado la mayor parte de la estructura de la respuesta, las presentaciones son mucho más predecibles y, por lo tanto, más fáciles de verificar.

Rellenar los espacios en blanco

Complete los espacios en blanco para que el siguiente código imprima la cadena “sombrero”.

texto = ‘todo lo que es’ rebanada = texto [____: ____] imprimir (corte)

Los problemas de Parsons también evitan el problema de la “pantalla en blanco del terror” mientras permiten a los estudiantes concentrarse en el flujo de control por separado del vocabulario. [Pars2006, Eric2015, Morr2016, Eric2017] Existen herramientas para construir y hacer problemas de Parsons en línea [Ihan2011], pero pueden ser emulado (aunque algo torpemente) al pedirles a los alumnos que reorganicen las líneas de código en un editor.

Problema de Parsons

Reorganizar e sangrar estas líneas para sumar los valores positivos en una lista. (También deberá agregar dos puntos en los lugares apropiados).

total = 0 si v> 0 total + = v para v en valores

Tenga en cuenta que dar a los alumnos más líneas de las que necesitan, o pedirles que reorganicen algunas líneas y agreguen algunas más, hace que los problemas de Parsons sean mucho más difíciles [Harm2016].

Rastreo

El seguimiento de la ejecución es el inverso de un problema de Parsons: dadas unas pocas líneas de código, el alumno tiene que rastrear el orden en que se ejecutan esas líneas. Esta es una habilidad de depuración esencial y una buena manera de solidificar la comprensión de los alumnos sobre los bucles, condicionales y el orden de evaluación de las llamadas a funciones y métodos. La forma más fácil de implementarlo es hacer que los alumnos escriban una secuencia de pasos etiquetados. Hacer que elijan la secuencia correcta de un conjunto (es decir, presentar esto como un MCQ) agrega carga cognitiva sin agregar valor, ya que tienen que hacer todo el trabajo de averiguar la secuencia correcta, luego buscarla en la lista de opciones.

Orden de ejecución de rastreo ¿En qué orden se ejecutan las líneas etiquetadas en este bloque de código?

  1. vals = [-1, 0, 1]
  2. inverse_sum = 0 tratar: para v en vals:
  3. suma_inversa + = 1 / v excepto:
  4. pasar

Los valores de seguimiento son similares a la ejecución de seguimiento, pero en lugar de detallar el orden en que se ejecuta el código, el alumno enumera los valores que una o más variables toman a medida que se ejecuta el programa. Una forma de implementar esto es darle al alumno una tabla cuyas columnas están etiquetadas con nombres de variables y cuyas filas están etiquetadas con números de línea, y pedirles que completen los valores asumidos por las variables en esas líneas.

Valores de rastreo ¿Qué valores toman izquierda y derecha a medida que se ejecuta este programa?

  1. izquierda = 23
  2. derecha = 6
  3. mientras está bien:
  4. izquierda, derecha = derecha, izquierda% derecha
Line left right
.
.

También puede solicitar a los alumnos que rastreen el código hacia atrás para determinar cuál debe haber sido la entrada para que el código produzca un resultado particular [Armo2008]. Estos problemas de ejecución inversa requieren búsqueda y razonamiento deductivo, y cuando la salida es un mensaje de error, ayudan a los alumnos a desarrollar valiosas habilidades de depuración.

Ejecución inversa Complete el número que falta en los valores que causaron el bloqueo de esta función.

valores = [[1.0, -0.5], [3.0, 1.5], [2.5, ___]] runningTotal = 0.0 para (lectura, escala) en valores: runningTotal + = lectura / escalado

Los ejercicios de corrección mínima también ayudan a los alumnos a desarrollar habilidades de depuración. Dadas algunas líneas de código que > contienen un error, el alumno debe encontrarlo y hacer un pequeño cambio para solucionarlo. Se puede hacer el cambio usando C&R, mientras que > identificarlo se puede hacer como una pregunta de opción múltiple.

Minimal Fix Se supone que esta función prueba si un número se encuentra dentro de un rango. Haga un pequeño cambio para que realmente lo haga.

def inside (punto, más bajo, más alto): if (punto <= inferior): falso retorno elif (punto <= más alto): falso retorno más: volver verdadero

Los ejercicios de tema y variación son similares, pero se le pide al alumno que realice una pequeña alteración que cambie la salida de alguna manera específica en lugar de hacer un cambio para corregir un error. Los cambios permitidos pueden incluir cambiar el valor inicial de una variable, reemplazar una llamada de función con otra, intercambiar bucles internos y externos, o cambiar el orden de las pruebas en un condicional complejo. Nuevamente, este tipo de ejercicio brinda a los alumnos la oportunidad de practicar una habilidad útil en el mundo real: la forma más rápida de producir el código que necesitan es ajustar el código que ya hace algo cercano.

Tema y variaciones Cambie el bucle interno en la función a continuación para que llene el triángulo superior izquierdo de una imagen con un color específico.

La función fillTriangle (imagen, color) es para x: = 1 a picture.width do para y: = 1 a la imagen. imagen [x, y] = color final final final

Los ejercicios de refactorización son el complemento de los ejercicios de tema y variación: dado un código de trabajo, el alumno tiene que modificarlo de alguna manera sin cambiar su salida. Por ejemplo, el alumno podría reemplazar los bucles con expresiones vectorizadas o simplificar la condición en un bucle while. Esta también es una habilidad útil en el mundo real, pero a menudo hay tantas formas de refactorizar el código que la calificación requiere inspección humana.

Refactorización Escriba una única lista de comprensión que tenga el mismo efecto que este bucle.

resultado = [] para v en valores: si len (v)> umbral: resultado.append (v)

Diagramas

Hacer que los alumnos dibujen mapas conceptuales y otros diagramas da una idea de cómo están pensando (Sección 3.1), pero los diagramas de forma libre requieren tiempo y juicio humanos para evaluarlos. Etiquetar diagramas, por otro lado, es casi tan poderoso pedagógicamente pero mucho más fácil de escalar.

En lugar de que los alumnos creen diagramas desde cero, proporcióneles un diagrama y un conjunto de etiquetas y pídales que coloquen este último en los lugares correctos del primero. El diagrama puede ser una estructura de datos (“después de ejecutar este código, ¿qué variables apuntan a qué partes de esta estructura?”), Un gráfico (“hacer coincidir cada una de estas piezas de código con la parte del gráfico que generó”), o el código en sí (“hacer coincidir cada término con un ejemplo de ese elemento del programa”).

Etiquetar un diagrama La figura [f: etiquetado de ejercicios] muestra cómo se representa un pequeño fragmento de HTML en la memoria. Coloque las etiquetas 1–9 en los > elementos del árbol para mostrar el orden en que se alcanzan en un recorrido de profundidad primero.

etiquetas

Otra forma de usar diagramas es dar a los alumnos las piezas del diagrama y pedirles que las organicen correctamente. Este es un equivalente visual de un problema de Parsons, y puede proporcionar tanto o tan poco esqueleto para ayudar con la colocación como cree que están listos. Tengo buenos recuerdos de tratar de colocar resistencias y condensadores en un diagrama de circuito para obtener el voltaje correcto en cierto punto, y he visto a los maestros darles a los alumnos un conjunto fijo de bloques Scratch y pedirles que creen un dibujo particular usando solo esos bloques

Los problemas de correspondencia pueden considerarse como un caso especial de etiquetado en el que el “diagrama” es una columna de texto y las etiquetas se toman de la otra columna. La correspondencia uno a uno le da al alumno dos listas de igual longitud y le pide que empareje los elementos correspondientes, p. “Unir cada fragmento de código con la salida que produce”.

Pareo Haga coincidir cada operador de expresión regular en la Figura [f: combinación de ejercicios] con lo que hace.

pareo

Con coincidencias de muchos a muchos, las listas no tienen la misma longitud, por lo que algunos elementos pueden coincidir con otros y otros pueden no coincidir en absoluto. Muchos a muchos son más difíciles porque los alumnos no pueden hacer coincidencias fáciles primero para reducir su espacio de búsqueda. Los problemas de coincidencia se pueden implementar haciendo que los alumnos envíen listas de pares coincidentes (como “A3, B1, C2”), pero eso es torpe y propenso a errores. Hacer que reconozcan un conjunto de pares correctos en un MCQ es aún peor, ya que es dolorosamente fácil de leer mal. Dibujar o arrastrar funciona mucho mejor, pero puede requerir cierto trabajo para implementarlo.

La clasificación es un caso especial de correspondencia que es (ligeramente) más susceptible de responder a través de listas, ya que nuestras mentes son bastante buenas para detectar errores o anomalías en las secuencias. Los criterios de clasificación determinan el nivel de razonamiento requerido. Si tiene alumnos que ordenan algoritmos de clasificación de más rápido a más lento, probablemente esté ejerciendo el recuerdo (es decir, pidiéndoles que reconozcan los nombres de los algoritmos y conozcan sus propiedades), mientras les pide que clasifiquen las soluciones de razonamiento y juicio más robustos a más frágiles.

El resumen también requiere que los alumnos usen el pensamiento de orden superior y les da la oportunidad de practicar una habilidad que es muy útil al informar errores. Por ejemplo, puede preguntar a los alumnos: “¿Qué oración describe mejor cómo cambia la salida de f cuando x varía de 0 a 10?” y luego se le dan varias opciones como una pregunta de opción múltiple. También puede solicitar respuestas de forma libre muy cortas a preguntas en dominios restringidos, como “¿Cuál es la característica clave de un algoritmo de clasificación estable?” No podemos automatizar completamente las comprobaciones sin una cantidad frustrante de falsos positivos (aceptando respuestas incorrectas) y falsos negativos (rechazando las correctas), pero las preguntas de este tipo se prestan bien a la calificación de pares (Sección 5.3).

Calificación automática

Las herramientas automáticas de clasificación de programas han existido más tiempo de lo que he estado vivo: la primera mención publicada data de 1960 [Holl1960], y las encuestas publicadas en [Douc2005, Ihan2010] mencionan muchas herramientas específicas por nombre. Construir tales herramientas es mucho más complejo de lo que parece. ¿Cómo se representan las tareas? ¿Cómo se rastrean e informan los envíos? ¿Pueden los alumnos cooperar? ¿Cómo se pueden ejecutar los envíos de forma segura? [Edwa2014a] es un artículo completo dedicado a un esquema adaptativo para detectar y administrar bucles infinitos en los envíos de código, y ese es solo uno de los muchos problemas que surgen.

Al hablar sobre los autoevaluadores, es importante distinguir la satisfacción del alumno de los resultados del aprendizaje. Por ejemplo, [Magu2018] cambió los laboratorios de programación informal para un curso de CS de segundo año a un examen semanal evaluado por una máquina usando un auto-calificador. A los estudiantes no les gustó el sistema automatizado, pero la tasa general de reprobación del curso se redujo a la mitad y el número de estudiantes que obtuvieron honores de primera clase se triplicó. Por el contrario, [Rubi2014] también comenzó a usar un auto-clasificador diseñado para competiciones, pero no vio una disminución significativa en las tasas de deserción de sus alumnos; Una vez más, los alumnos hicieron algunos comentarios negativos sobre la herramienta, que los autores atribuyen a la calidad de sus mensajes de retroalimentación en lugar de aversión a la clasificación automática.

[Srid2016] tomó un enfoque diferente. Utilizaron pruebas fuzz (es decir, casos de prueba generados aleatoriamente) para verificar si el código del alumno hace lo mismo que una implementación de referencia proporcionada por el profesor. En el primer proyecto de un curso introductorio de 1400 estudiantes, las pruebas fuzz detectaron errores que fueron omitidos por un conjunto de casos de prueba escritos a mano para más del 48% de los estudiantes.

[Basu2015] proporcionó a los alumnos un conjunto de casos de prueba de solución, pero los participantes tuvieron que desbloquear cada uno respondiendo preguntas sobre su comportamiento esperado antes de que se les permitiera aplicarlo a su solución propuesta. Por ejemplo, suponga que los alumnos tienen que escribir una función para encontrar el par de números adyacentes más grande en una lista. Antes de poder usar las pruebas de la pregunta, tuvieron que elegir la respuesta correcta a, “¿Qué produce el mayor par (4, 3, -1, 5, 3, 3)?” En un curso universitario de 1300 personas, la gran mayoría de los estudiantes eligieron validar su comprensión de los casos de prueba de esta manera antes de intentar resolver problemas, y luego hicieron menos preguntas y expresaron menos confusión sobre las tareas.

Contra herramientas listas para usar Es tentador utilizar herramientas de verificación de estilo estándar para calificar el código de los alumnos. Sin embargo, [Nutb2016] inicialmente no encontró correlación entre las marcas proporcionadas por humanos y las violaciones de las reglas del verificador de estilo. Algunas veces esto se debió a que los alumnos violaron una regla muchas veces (perdiendo así más puntos de los que deberían), pero otras veces fue porque enviaron el código de inicio de la tarea con pocas alteraciones y obtuvieron más puntos de los que deberían.

Incluso las herramientas creadas específicamente para la enseñanza pueden estar a la altura de las necesidades de los maestros. [Keun2016a, Keun2016b] examinó los mensajes producidos por 69 herramientas de clasificación automática. Descubrieron que las herramientas a menudo no dan retroalimentación sobre cómo solucionar problemas y dan el siguiente paso. También descubrieron que la mayoría de los maestros no pueden adaptar fácilmente la mayoría de las herramientas a sus necesidades: como muchas herramientas de flujo de trabajo, tienden a hacer cumplir las suposiciones no reconocidas de sus creadores sobre cómo funcionan las instituciones. Su esquema de clasificación es una lista de compras útil cuando se miran herramientas de este tipo.

[Buff2015] presenta una reflexión bien informada sobre la idea de proporcionar comentarios automatizados. Su punto de partida es que “los sistemas automatizados de calificación ayudan a los alumnos a identificar errores en su código, [pero] pueden desanimar inadvertidamente a los alumnos a pensar críticamente y evaluar exhaustivamente, y en su lugar fomentan la dependencia de las pruebas del maestro”. Uno de los problemas clave que identificaron es que un alumno puede probar a fondo su código, pero la característica aún puede no implementarse de acuerdo con las especificaciones del maestro. En este caso, la “falla” no es causada por la falta de pruebas sino por un malentendido de los requisitos, y es poco probable que más pruebas expongan el problema. Si el sistema de clasificación automática no proporciona comentarios perspicaces y procesables, esta experiencia solo frustrará al alumno.

Para proporcionar esa retroalimentación, el sistema de [Buff2015] identifica qué métodos en el código del alumno se ejecutan mediante las pruebas fallidas para que el sistema pueda asociar las pruebas fallidas con características particulares dentro del envío del alumno. El sistema decide si se han “obtenido” sugerencias específicas al ver si el alumno ha probado la característica asociada lo suficiente, por lo que los alumnos no pueden confiar en las sugerencias en lugar de hacer pruebas.

[Srid2016] describe algunos otros enfoques para compartir comentarios con los alumnos cuando prueban automáticamente su código. El primero es proporcionar la salida esperada para las pruebas, pero luego la salida del código duro de los alumnos para esas entradas (porque cualquier cosa que se pueda jugar será). El segundo es informar los resultados aprobados / reprobados para el código de los alumnos, pero solo proporcionar las entradas y salidas reales de las pruebas después de la fecha de envío. Sin embargo, decirles a los alumnos que están equivocados pero no decirles por qué es frustrante.

Una tercera opción es usar una técnica llamada hashing para generar un valor que depende de la salida pero que no lo revela. Si el usuario produce exactamente el resultado correcto, entonces su hash desbloqueará la solución, pero es imposible trabajar hacia atrás desde el hash para descubrir cuál se supone que es la salida. Hashing requiere más trabajo y explicación para configurar, pero logra un buen equilibrio entre revelar respuestas prematuramente y no revelarlas cuando ayudaría.

Pensamiento de nivel superior

Muchos otros tipos de ejercicios de programación son difíciles de evaluar para los maestros en una clase con más de un puñado de estudiantes e igualmente difíciles de evaluar para las plataformas automatizadas. Los proyectos de programación más grandes son (con suerte) hacia qué clases se están construyendo, pero la única forma de dar retroalimentación es caso por caso.

La revisión del código también es difícil de calificar automáticamente en general, pero se puede abordar si se les da a los alumnos una lista de fallas que deben buscar y se les pide que hagan coincidir comentarios particulares con líneas de código particulares. Por ejemplo, se le puede decir al alumno que hay dos errores de sangría y un nombre de variable incorrecto y pedirle que los señale. Si están más avanzados, se les podría dar media docena de tipos de comentarios que podrían hacer sobre el código sin que se les diga cuántos de cada uno deberían encontrar.

[Steg2016b] es un buen punto de partida para una rúbrica de estilo de código, mientras que [Luxt2009] analiza la revisión por pares en las clases de programación de manera más general. Si va a hacer que los alumnos realicen revisiones, utilice una revisión por pares calibrada (Sección 5.3) para que tengan modelos de cómo deberían ser los buenos comentarios.

Revisión de código Marque los problemas en cada línea de código utilizando la rúbrica provista.

  1. def addem (f):
  2. x1 = abierto (f) .readlines ()
  3. x2 = [x para x en x1 si x.strip ()]
  4. cambios = 0
  5. para v en x2:
  6. imprimir (‘total’, total)
  7. tot = tot + int (v)
  8. imprimir (‘total’)
  1. nombre de variable pobre 2. uso de variable indefinida
  2. valor de retorno faltante 4. variable no utilizada

Ejercicios

###Código y ejecución (pares / 10) Cree un breve ejercicio de C&R, luego negocie con un socio y vea cuánto tiempo les lleva a cada uno comprender y hacer el ejercicio del otro. ¿Hubo alguna ambigüedad o malentendido en la descripción del ejercicio?

Código de inversión y ejecución (grupos pequeños / 15)

Forme grupos de 4 a 6 personas. Haga que cada miembro del grupo cree un ejercicio invertido de C&R que requiera que las personas descubran qué entrada produce una salida particular. Elija dos al azar y vea cuántas entradas diferentes puede encontrar el grupo que satisfagan los requisitos.

Valores de rastreo (pares / 10)

Escriba un programa corto (10–15 líneas), negocie con un socio y rastree cómo las variables en el programa cambian de valor con el tiempo. ¿Qué diferencias hay en cómo usted y su pareja escribieron sus huellas?

Refactorización (grupos pequeños / 15)

Forme grupos de 3 a 4 personas. Haga que cada persona seleccione un fragmento corto de código (de 10 a 30 líneas de largo) que haya escrito que no sea tan ordenado como podría ser, luego elija uno al azar y haga que todos en el grupo lo arreglen de forma independiente. ¿Cómo difieren sus versiones limpiadas? ¿Qué tan bien o qué tan mal sería capaz de acomodar todas estas variaciones si marca automáticamente o en una clase grande?

Etiquetar un diagrama (pares / 10)

Dibuje un diagrama que muestre algo que haya explicado recientemente: cómo los navegadores obtienen datos de los servidores, la relación entre objetos y clases, o cómo se indexan los marcos de datos en R. Coloque las etiquetas a un lado y pídale a su compañero que las coloque.

Rompecabezas de lápiz y papel (toda la clase / 15)

[Butl2017] describe un conjunto de rompecabezas de lápiz y papel que pueden convertirse en tareas de programación introductorias e informa que los alumnos disfrutan de estas tareas y fomentan la metacognición. Piense en un simple rompecabezas o juego de lápiz y papel que jugó de niño y describa cómo lo convertiría en un ejercicio de programación.

Fallas de conteo (pares / 15)

Cualquier estimación útil de cuánto tiempo necesita un ejercicio debe tener en cuenta la frecuencia de las fallas y cuánto tiempo se pierde para ellas. Por ejemplo, editar archivos de texto parece una tarea simple, pero ¿qué hay de encontrar esos archivos? La mayoría de los editores de GUI guardan cosas en el escritorio del usuario o en el directorio principal; Si los archivos utilizados en un curso se almacenan en otro lugar, una fracción sustancial no podrá navegar al directorio correcto sin ayuda. (Si esto le parece un pequeño problema, por favor revise la discusión del punto ciego experto en el Capítulo 3).

Al trabajar con un compañero, haga una lista de las cosas “simples” que ha visto salir mal en los ejercicios que ha usado o tomado. ¿Con qué frecuencia aparecen? ¿Cuánto tiempo tardan los alumnos en arreglarlos solos o con ayuda? ¿Cuánto tiempo tienes actualmente en clase para lidiar con ellos?

Hablando de tiempos (individual / 10)

¿Qué tan precisas han sido las estimaciones de tiempo sobre los ejercicios en este libro hasta ahora?


Construyendo una comunidad de práctica

No tiene que arreglar todos los males de la sociedad para enseñar programación, pero sí debe involucrarse en lo que sucede fuera de su clase si quiere que la gente aprenda. Esto se aplica tanto a los maestros como a los estudiantes: muchos maestros de campo libre comienzan como voluntarios o trabajadores a tiempo parcial y tienen que hacer malabarismos con muchos otros compromisos. Lo que sucede fuera del aula es tan importante para su éxito como lo es para sus alumnos, por lo que la mejor manera de ayudar a ambos es fomentar una comunidad docente.

Finlandia y por qué no

Las escuelas de Finlandia se encuentran entre las más exitosas del mundo, pero como Anu Partanen señaló, no han tenido éxito en forma aislada. Los intentos de otros países de adoptar métodos de enseñanza finlandeses están condenados al fracaso a menos que esos países también garanticen que los niños (y sus padres) estén seguros, bien alimentados y tratados de manera justa por los tribunales [Sahl2015, Wilk2011]. Esto no es sorprendente dado lo que sabemos sobre la importancia de la motivación para el aprendizaje (Capítulo 10): todos lo hacen peor si creen que el sistema es impredecible, injusto o indiferente.

Un marco para pensar en las comunidades de enseñanza es el aprendizaje situado, que se centra en cómo la participación periférica legítima lleva a las personas a convertirse en miembros de una comunidad de práctica [Weng2015]. Desempacando esos términos, una comunidad de práctica es un grupo de personas unidas por interés en alguna actividad, como tejer o física de partículas. La participación periférica legítima significa realizar tareas simples y de bajo riesgo que la comunidad reconoce como contribuciones válidas: hacer su primer pañuelo, llenar sobres durante una campaña electoral o revisar la documentación para el software de código abierto.

El aprendizaje situado se centra en la transición de ser un recién llegado a ser aceptado como un compañero por aquellos que ya son miembros de la comunidad. Esto normalmente significa comenzar con tareas y herramientas simples, luego realizar tareas similares con herramientas más complejas y finalmente abordar el mismo trabajo que los profesionales avanzados. Por ejemplo, los niños que aprenden música pueden comenzar tocando canciones infantiles en una grabadora o un ukelele, luego tocar otras canciones simples en una trompeta o saxofón en una banda, y finalmente comenzar a explorar sus propios gustos musicales. Las formas comunes de apoyar esta progresión incluyen:

Resolución de problemas: “Estoy atrapado, ¿podemos trabajar en el diseño de esta lección juntos?”

Solicitudes de información: “¿Cuál es la contraseña para el administrador de la lista de correo?”

Buscando experiencia: “¿Alguien ha tenido un alumno con una discapacidad de lectura?”

Compartir activos: “Creé un sitio web para una clase el año pasado que puedes usar como punto de partida”.

Coordinación: “¿Podemos combinar nuestros pedidos de camisetas para obtener un descuento?”

Construyendo un argumento: “Será más fácil convencer a mi jefe para que haga cambios si sé cómo otros bootcamps hacen esto”.

Documentación de proyectos: "Hemos tenido este problema cinco veces ahora. Vamos a escribirlo de una vez por todas.

Conocimiento de mapeo: “¿Qué otros grupos están haciendo cosas como esta en vecindarios o ciudades cercanas?”

Visitas: “¿Podemos venir a ver su programa después de la escuela? Necesitamos establecer uno en nuestra ciudad”. En términos generales, una comunidad de práctica puede ser:

Comunidad de acción: personas enfocadas en un objetivo compartido, como lograr que alguien sea elegido.

Comunidad de preocupación: los miembros se reúnen por un problema compartido, como tratar una enfermedad a largo plazo.

Comunidad de interés: enfocado en un amor compartido por algo como el backgammon o tejer.

Comunidad de lugar: personas que viven o trabajan juntas.

La mayoría de las comunidades son mezclas de estos, como las personas en Toronto a quienes les gusta enseñar tecnología. El enfoque de una comunidad también puede cambiar con el tiempo: por ejemplo, un grupo de apoyo para personas con depresión (comunidad de interés) puede decidir recaudar fondos para mantener una línea de ayuda (comunidad de acción). Ejecutar la línea de ayuda puede convertirse en el foco del grupo (comunidad de interés).

Sopa, luego Himnos

Es divertido escribir los manifiestos, pero la mayoría de las personas se unen a una comunidad de voluntarios para ayudar y ser ayudados en lugar de discutir sobre la redacción de una declaración de visión327. Por lo tanto, debe centrarse en lo que las personas pueden crear que otros miembros de la comunidad utilizarán de inmediato. Una vez que su organización demuestre que puede lograr cosas pequeñas, la gente estará más segura de que vale la pena ayudarlo con proyectos más grandes. Es el momento de preocuparse por definir los valores que guiarán a sus miembros.

Aprende, luego haz

El primer paso para construir una comunidad es decidir si debería hacerlo, o si sería más efectivo unirse a una organización existente. Miles de grupos ya están enseñando habilidades tecnológicas a las personas, desde el 4-H Club y los programas de alfabetización hasta organizaciones sin fines de lucro como Black Girls Code y Bridge. Unirse a un grupo existente le dará una ventaja inicial en la enseñanza, un grupo inmediato de colegas y la oportunidad de aprender más sobre cómo manejar las cosas; Con suerte, aprender esas habilidades mientras se hace una contribución inmediata será más importante que poder decir que eres el fundador o líder de algo nuevo.

Ya sea que se una a un grupo existente o establezca uno propio, será más efectivo si lee un poco sobre la organización de la comunidad. [Alin1989, Lake2018] es probablemente el trabajo más conocido en la organización de base, mientras que [Brow2007 , Midw2010, Lake2018] son ​​manuales prácticos arraigados en décadas de práctica. Si desea leer más profundamente, [Adam1975] es una historia de la Highlander Folk School, cuyo enfoque ha sido emulado por muchos grupos exitosos, mientras que [Spal2014] es una guía para enseñar a adultos escrita por alguien con profundas raíces personales en la organización y NonprofitReady.org ofrece capacitación gratuita de desarrollo profesional.

Cuatro pasos

Todos los que se involucran con su organización (incluido usted) pasan por cuatro fases: reclutamiento, incorporación, retención y jubilación. No necesita preocuparse por este ciclo cuando comienza, pero vale la pena pensarlo tan pronto como participen más de un puñado de no fundadores.

El primer paso es reclutar voluntarios. Su comercialización debería ayudarlo con esto haciendo que su organización sea localizable y dejando en claro su misión y valor para las personas que quieran involucrarse (Capítulo 14). Comparta historias que ejemplifiquen el tipo de ayuda que desea, así como historias sobre las personas a las que está ayudando, y deje en claro que hay muchas maneras de involucrarse. (Discutimos esto con más detalle en la siguiente sección).

Su mejor fuente de nuevos reclutas son sus propias clases: “ver uno, hacer uno, enseñar uno” ha funcionado bien para las organizaciones de voluntarios durante el tiempo que ha habido organizaciones de voluntarios. Asegúrese de que cada clase u otro encuentro termine diciéndoles a las personas cómo pueden ayudar y que su ayuda será bienvenida. Las personas que se acerquen a usted de esta manera sabrán lo que hace y tienen experiencia reciente de estar en el lado receptor de lo que ofrece, lo que ayuda a su organización a evitar el punto ciego experto colectivo (Capítulo 3).

Empieza pequeño

Ben Franklin observó que una persona que ha hecho un favor a alguien tiene más probabilidades de hacerle otro favor que alguien que recibió un favor de esa persona. Por lo tanto, pedirle a la gente que haga algo pequeño por ti es un buen paso para lograr que hagan algo más grande. Una forma natural de hacer esto cuando se enseña es pedirle a la gente que envíe soluciones para los materiales de su lección para errores tipográficos o redacción poco clara, o sugerir nuevos ejercicios o ejemplos. Si sus materiales están escritos de manera sostenible (Sección 6.3), esto les da la oportunidad de practicar algunas habilidades útiles y le da la oportunidad de comenzar una conversación que podría conducir a un nuevo recluta.

La mitad del ciclo de vida del voluntario es la incorporación y la retención, que cubriremos en las Secciones 13.3 y 13.4. El paso final es la jubilación: todos eventualmente se mueven y las organizaciones saludables planean esto. Algunas cosas simples pueden hacer que tanto la persona que se va como todos los que se quedan se sientan positivos sobre el cambio:

Pida a las personas que sean explícitas sobre su partida. para que todos sepan que realmente se han ido.

Asegúrese de que no se sientan avergonzados o avergonzados por irse o sobre cualquier otra cosa.

Dales la oportunidad de transmitir sus conocimientos. Por ejemplo, puede pedirles que sean mentores de alguien durante unas pocas semanas como su última contribución, o que alguien que se quede en la organización lo entreviste para recopilar cualquier historia que valga la pena contar.

Asegúrese de que entreguen las llaves. Es incómodo descubrir seis meses después de que alguien se ha ido que es la única persona que sabe cómo reservar un campo para el picnic anual.

Haga un seguimiento de 2 a 3 meses después de que se vayan para ver si tienen más ideas sobre lo que funcionó y lo que no funcionó mientras estaban con usted, o algún consejo para ofrecerles que no pensaron dar o se sintieron incómodos al salir por la puerta.

Agradeceles, tanto cuando se van como la próxima vez que su grupo se reúna.

Un manual perdido

Se han escrito miles de libros sobre cómo iniciar una empresa. Solo unos pocos describen cómo terminar uno o dejarlo con gracia, aunque haya un final para cada comienzo. Si alguna vez escribes uno, avísame.

Inducción

Después de decidir formar parte de un grupo, las personas necesitan ponerse al día, y [Shol2019] resume lo que sabemos sobre esto. La primera regla es tener y hacer cumplir un Código de Conducta (Sección 9.1), y encontrar una parte independiente que esté dispuesta a recibir y revisar informes de comportamiento inapropiado. Alguien fuera de la organización tendrá la objetividad que los miembros de la organización pueden carecer, y puede proteger a los periodistas que puedan dudar en plantear problemas relacionados con los líderes del proyecto por temor a represalias o daños a su reputación. Los líderes del proyecto también deben publicitar las decisiones de aplicación para que la comunidad reconozca que el código es significativo.

Lo siguiente más importante es ser acogedor. Como dijo Fogel [Foge2005], “si un proyecto no causa una buena primera impresión, los recién llegados pueden esperar mucho tiempo antes de darle una segunda oportunidad”. Otros autores han confirmado empíricamente la importancia de entornos sociales amables y educados en proyectos abiertos [Sing2012, Stei2013, Stei2018]:

Publica un mensaje de bienvenida en las páginas de redes sociales, canales de Slack, foros o listas de correo electrónico del proyecto. Los proyectos pueden considerar mantener un canal o lista de “Bienvenida” dedicada, donde un líder del proyecto o un gerente de la comunidad escribe una breve publicación pidiendo a los recién llegados que se presenten.

Ayudar a las personas a encontrar formas de hacer una contribución inicial, como etiquetar lecciones particulares o talleres que necesitan trabajar como “adecuados para los recién llegados” y pedir a los miembros establecidos que no los arreglen para asegurarse de que haya lugares adecuados para que los recién llegados comiencen a trabajar.

Dirija al recién llegado a miembros del proyecto como ellos para demostrar que pertenecen.

Dirija al recién llegado a los recursos esenciales del proyecto tales como las pautas de contribución.

Designar a uno o dos miembros para que sirvan como punto de contacto. para cada recién llegado Hacer esto puede hacer que el recién llegado sea menos reacio a hacer preguntas. Una tercera regla que ayuda a todos (no solo a los recién llegados) es hacer que el conocimiento se pueda encontrar y mantenerlo actualizado. Los recién llegados son como exploradores que deben orientarse dentro de un paisaje desconocido [Dage2010]. La información que se distribuye generalmente hace que los recién llegados se sientan perdidos y desorientados. Dadas las diferentes posibilidades de los lugares para mantener información (por ejemplo, wikis, archivos en control de versiones, documentos compartidos, tweets antiguos o mensajes de Slack y archivos de correo electrónico) es importante mantener la información sobre un tema específico consolidado en un solo lugar para que los recién llegados No es necesario navegar por múltiples fuentes de datos para encontrar lo que necesitan. Organizar la información hace que los recién llegados tengan más confianza y orientación [Stei2016].

Finalmente, reconozca las primeras contribuciones de los recién llegados y descubra dónde y cómo podrían ayudar a largo plazo. Una vez que hayan llevado su primera contribución a través de la línea, es probable que usted y ellos tengan una mejor idea de lo que tienen para ofrecer y de cómo el proyecto puede ayudarlos. Ayude a los recién llegados a encontrar el siguiente problema en el que podrían querer trabajar o señalarles lo siguiente que podrían disfrutar leyendo. En particular, alentarlos a ayudar a la próxima ola de recién llegados es una buena forma de reconocer lo que han aprendido y una forma efectiva de transmitirlo.

Retencion

Si tu gente no se divierte, hay algo muy mal. – Saul Alinsky

Los miembros de la comunidad no deberían esperar disfrutar cada momento de su trabajo con su organización, pero si no disfrutan de nada de eso, no se quedarán. El disfrute no significa necesariamente tener una fiesta anual: las personas pueden disfrutar de cocinar, entrenar o simplemente trabajar en silencio junto a los demás. Hay varias cosas que toda organización debe hacer para garantizar que las personas obtengan algo que valoren de su trabajo:

Pregunte a las personas qué quieren en lugar de adivinar. Al igual que no eres tu alumno (Sección 6.1), probablemente seas diferente de otros miembros de tu organización. Pregúnteles a las personas qué quieren hacer, qué se sienten cómodos haciendo (lo que puede no ser lo mismo) y qué limitaciones hay en su tiempo. Podrían decir: “Cualquier cosa”, pero incluso una conversación corta probablemente descubrirá el hecho de que les gusta interactuar con las personas, pero preferirían no administrar las finanzas del grupo o viceversa.

Proporcione muchas formas de contribuir. Cuantas más formas haya para que las personas ayuden, más personas podrán hacerlo. Alguien a quien no le guste estar frente a una audiencia puede mantener el sitio web de su organización, manejar sus cuentas o corregir las lecciones.

Reconocer contribuciones. A todos les gusta que los aprecien, por lo que las comunidades deben reconocer las contribuciones de sus miembros tanto en público como en privado al mencionarlas en presentaciones, ponerlas en el sitio web, etc. Cada hora que alguien le haya dado a su proyecto puede ser una hora quitada de su vida personal o de su empleo oficial; reconozca ese hecho y deje en claro que, si bien más horas serían bienvenidas, no espera que hagan sacrificios insostenibles.

Haz espacio. Cree que está siendo útil, pero intervenir en cada decisión priva a las personas de su autonomía, lo que a cambio reduce su motivación (Sección 10). En particular, si siempre eres el primero en responder a mensajes de correo electrónico o chat, las personas tienen menos oportunidades de crecer como miembros y crear colaboraciones horizontales. Como resultado, la comunidad continuará centrada en una o dos personas en lugar de convertirse en una red altamente conectada en la que otros se sientan cómodos participando. Otra forma de recompensar la participación es ofrecer capacitación. Las organizaciones necesitan presupuestos, propuestas de subvenciones y resolución de disputas. A la mayoría de las personas nunca se les enseña cómo hacer esto más de lo que se les enseña a enseñar, por lo que la oportunidad de adquirir habilidades transferibles es una razón poderosa para que las personas se involucren y se mantengan involucradas. Si va a hacer esto, no intente proporcionar la capacitación usted mismo a menos que sea en lo que se especialice. Muchos grupos cívicos y comunitarios tienen programas de este tipo, y probablemente pueda llegar a un acuerdo con uno de ellos.

Finalmente, aunque los voluntarios pueden hacer mucho, tareas como la administración del sistema y la contabilidad eventualmente necesitan personal remunerado. Cuando llegue a este punto, no pague nada a las personas o les pague un salario adecuado. Si no les paga nada, su verdadera recompensa es la satisfacción de hacer el bien; si les paga una cantidad simbólica, por otro lado, se los quita sin darles la satisfacción de ganarse la vida.

Gobernancia

Cada organización tiene una estructura de poder: la única pregunta es si es formal y responsable o informal y, por lo tanto, no rinde cuentas [Free1972]. Este último en realidad funciona bastante bien para grupos de hasta media docena de personas en las que todos se conocen. Más allá de eso, necesita reglas para explicar quién tiene la autoridad para tomar qué decisiones y cómo lograr el consenso (Sección 20.1).

El modelo de gobernanza que prefiero es un bien común, que es algo administrado conjuntamente por una comunidad de acuerdo con las reglas que ellos mismos han desarrollado y adoptado [Ostr2015]. Como subraya [Boll2014], las tres partes de esa definición son esenciales: un bien común no es solo un pasto compartido o un conjunto de bibliotecas de software, sino que también incluye a la comunidad que lo comparte y las reglas que usan para hacerlo.

Las corporaciones con fines de lucro y las organizaciones sin fines de lucro incorporadas son modelos más populares; la mecánica varía de una jurisdicción a otra, por lo que debe buscar asesoramiento antes de elegir 340. Ambos tipos de organización otorgan la máxima autoridad en su junta. En términos generales, se trata de una junta de servicio cuyos miembros también asumen otras funciones en la organización o una junta de gobierno cuya responsabilidad principal es contratar, supervisar y, si es necesario, despedir al director. Los miembros de la junta pueden ser elegidos por la comunidad o nombrados; En cualquier caso, es importante priorizar la competencia sobre la pasión (esta última es más importante para el rango y el archivo) y tratar de reclutar para habilidades particulares como la contabilidad, el marketing, etc.

Elige democracia

Cuando llegue el momento, haga de su organización una democracia: tarde o temprano (generalmente antes), cada junta designada se convierte en una sociedad de mutuo acuerdo. Otorgar poder a sus miembros es complicado, pero es la única forma inventada hasta ahora para garantizar que las organizaciones continúen satisfaciendo las necesidades reales de las personas.

Cuídate

El agotamiento es un riesgo crónico en cualquier actividad comunitaria [Pign2016], así que aprenda a decir no más seguido de lo que dice sí. Si no te cuidas, no podrás cuidar a tu comunidad.

Quedando sin “No”

La investigación en la década de 1990 parecía mostrar que nuestra capacidad de ejercer fuerza de voluntad es finita: si tenemos que resistirnos a comer la última dona en la caja cuando tenemos hambre, es menos probable que doblemos la ropa y viceversa. Este fenómeno se llama agotamiento del ego, y si bien los estudios recientes no han podido replicar esos primeros resultados [Hagg2016], decir “sí” cuando estamos demasiado cansados para decir “no” es una trampa en la que caen muchos organizadores.

Una forma de hacer que su “no” se quede es escribir una lista de cosas que no vale la pena hacer pero que no va a hacer. Al momento de escribir, el mío incluye cuatro libros, dos proyectos de software, el rediseño de mi sitio web personal y aprender a tocar el silbato.

Finalmente, recuérdese de vez en cuando que cada organización eventualmente necesita nuevas ideas y liderazgo. Cuando llegue ese momento, entrene a sus sucesores y avance con la mayor gracia posible. Sin duda, harán cosas que no harías, pero pocas cosas en la vida son tan satisfactorias como ver algo que ayudaste a construir cobrar vida propia. Celebre eso: no tendrá ningún problema para encontrar otra cosa que lo mantenga ocupado.

Ejercicios

Varios de estos ejercicios están tomados de [Brow2007].

¿Qué tipo de comunidad? (individual / 15)

Vuelva a leer la descripción de los cuatro tipos de comunidades y decida cuál es su grupo o aspira a ser.

Personas que puede conocer (grupos pequeños / 30)

Como organizador, parte de su trabajo es a veces ayudar a las personas a encontrar una manera de contribuir a pesar de sí mismos. En pequeños grupos, elija tres de las personas a continuación y analice cómo podría ayudarlas a convertirse en un mejor contribuyente para su organización.

Anna sabe más sobre cada tema que todos los demás juntos, al menos, ella cree que sí. No importa lo que digas, ella te corregirá; no importa lo que sepas, ella lo sabe mejor.

Catherine tiene tan poca confianza en su propia habilidad que no tomará ninguna decisión, por pequeña que sea, hasta que lo haya consultado con otra persona.

Franco disfruta saber cosas que otras personas no saben. Puede hacer milagros, pero cuando se le pregunta cómo lo hizo, sonreirá y dirá: “Oh, estoy seguro de que puedes resolverlo”.

Hediyeh es tranquilo. Ella nunca habla en las reuniones, incluso cuando sabe que otras personas están equivocadas. Ella podría contribuir a la lista de correo, pero es muy sensible a las críticas y siempre retrocede en lugar de defender su punto.

Ken aprovecha el hecho de que la mayoría de las personas prefieren asumir su parte del trabajo que quejarse de él. Lo frustrante es que es tan plausible cuando alguien finalmente lo confronta. “Ha habido errores por todos lados”, dice, o “Bueno, creo que estás metiendo la pata”.

Toronjil tiene buenas intenciones, pero de alguna manera siempre surge algo, y sus tareas nunca terminan hasta el último momento posible. Por supuesto, eso significa que todos los que dependen de ella no pueden hacer su trabajo hasta después del último momento posible …

Raj es rudo. “Así es como hablo”, dice. “Si no puedes hackearlo, ve a buscar otro equipo”. Su frase favorita es, “Eso es estúpido”, y usa una obscenidad en cada segunda oración.

Valores (grupos pequeños / 45)

Responda estas preguntas por su cuenta, luego compare sus respuestas con las de otros.

  1. ¿Cuáles son los valores que expresa su organización?

  2. ¿Son estos los valores que desea que la organización exprese?

  3. Si no, ¿qué valores le gustaría expresar?

  4. ¿Cuáles son los comportamientos específicos que demuestran esos valores?

  5. ¿Qué comportamientos demostrarían lo contrario de esos valores?

Procedimientos de reunión (grupos pequeños / 30)

Responda estas preguntas por su cuenta, luego compare sus respuestas con las de otros.

  1. ¿Cómo se llevan a cabo sus reuniones?

  2. ¿Es así como quieres que se realicen tus reuniones?

  3. ¿Las reglas para ejecutar reuniones son explícitas o simplemente se asumen?

  4. ¿Estas son las reglas que quieres?

  5. ¿Quién es elegible para votar o tomar decisiones?

  6. ¿Es a quien quieres que se le otorgue autoridad para tomar decisiones?

  7. ¿Utiliza la regla de la mayoría, toma decisiones por consenso u otra cosa?

  8. ¿Es así como quieres tomar decisiones?

  9. ¿Cómo saben las personas en una reunión cuándo se ha tomado una decisión?

  10. ¿Cómo saben las personas que no estuvieron en una reunión qué decisiones se tomaron?

  11. ¿Funciona esto para tu grupo?

Tamaño (grupos pequeños / 20)

Responda estas preguntas por su cuenta, luego compare sus respuestas con las de otros.

  1. ¿Qué tan grande es tu grupo?

  2. ¿Es este el tamaño que desea para su organización?

  3. Si no, ¿de qué tamaño te gustaría que fuera?

  4. ¿Tiene algún límite en cuanto al tamaño de la membresía?

  5. ¿Te beneficiarías de establecer ese límite?

Convertirse en miembro (grupos pequeños / 45)

Responda estas preguntas por su cuenta, luego compare sus respuestas con las de otros.

  1. ¿Cómo se une alguien a tu grupo?

  2. ¿Qué tan bien funciona este proceso?

  3. ¿Hay cuotas de membresía?

  4. ¿Se requiere que las personas estén de acuerdo con alguna regla de comportamiento al unirse?

  5. ¿Son estas las reglas de comportamiento que quieres?

  6. ¿Cómo descubre un recién llegado lo que hay que hacer?

  7. ¿Qué tan bien funciona este proceso?

Dotación de personal (grupos pequeños / 30)

Responda estas preguntas por su cuenta, luego compare sus respuestas con las de otros.

  1. ¿Tiene personal pagado en su organización o todos son voluntarios?

  2. ¿Deberías haber pagado personal?

  3. ¿Quieres / necesitas más o menos personal?

  4. ¿Qué hacen los miembros del personal?

  5. ¿Son estos los roles y funciones principales que necesita que el personal desempeñe?

  6. ¿Quién supervisa a tu personal?

  7. ¿Es este el proceso de supervisión que desea para su grupo?

  8. ¿Cuánto le pagan a su personal?

  9. ¿Es este el salario adecuado para realizar el trabajo necesario?

Dinero (grupos pequeños / 30)

Responda estas preguntas por su cuenta, luego compare sus respuestas con las de otros.

  1. ¿Quién paga por qué?

  2. ¿Es esto a quien quieres pagar?

  3. ¿De dónde sacas tu dinero?

  4. ¿Es así como quieres obtener tu dinero?

  5. Si no, ¿tienes algún plan para hacerlo de otra manera?

  6. Si es así, ¿Que son?

  7. ¿Quién está siguiendo para asegurarse de que eso suceda?

  8. ¿Cuánto dinero tiene usted?

  9. ¿Cuánto necesitas?

  10. ¿En qué gastas la mayor parte de tu dinero?

  11. ¿Es así como quieres gastar tu dinero?

Préstamo de ideas (toda la clase / 15)

Muchas de mis ideas sobre cómo construir una comunidad han sido moldeadas por mi experiencia en el desarrollo de software de código abierto. [Foge2005] (que está disponible en línea) es una buena guía de lo que ha funcionado y lo que no ha funcionado para esas comunidades, y Open El sitio de Source Guides también tiene una gran cantidad de información útil. Elija una sección de este último, como “Encontrar usuarios para su proyecto” o “Liderazgo y gobernanza”, y dé una presentación de dos minutos al grupo de una idea que le haya resultado útil o con la que no esté de acuerdo.

¿Quién eres tú? (grupos pequeños / 20)

La Administración Nacional Oceánica y Atmosférica (NOAA) tiene una guía breve, útil y divertida para lidiar con los comportamientos disruptivos. Clasifica esos comportamientos bajo etiquetas como “hablador”, “indeciso” y “tímido”, y describe las estrategias para manejar cada uno. En grupos de 3 a 6, lea la guía y decida cuál de estas descripciones le queda mejor. ¿Crees que las estrategias descritas para manejar personas como tú son efectivas? ¿Son otras estrategias igualmente o más efectivas?

Creando lecciones juntos (grupos pequeños / 30)

Una de las claves del éxito de las Carpinterías es su énfasis en construir y mantener lecciones en colaboración [Wils2016, Deve2018]. Trabajando en grupos de 3–4:

  1. Elija una breve lección que todos hayan usado.

  2. Haga una revisión cuidadosa para crear una lista unificada de sugerencias para mejoras.

  3. Ofrezca esas sugerencias al autor de la lección.

¿Eres crujiente? (individual / 10)

Johnathan Nightingale escribió:

Cuando trabajaba en Mozilla, utilizamos el término “crujiente” para referirnos al estado justo antes del agotamiento. Las personas que son crujientes no son divertidas. Son breves. Están ansiosos por una pelea que pueden ganar. Lloran sin mucha advertencia. … reconoceríamos la frescura de nuestros colegas y nos cuidaríamos los unos a los otros [pero] es una cosa fea que lo vimos tanto que teníamos todo un proceso cultural alrededor.

Responda “sí” o “no” a cada una de las siguientes preguntas. ¿Qué tan cerca estás de quemarte?

  • ¿Te has vuelto cínico o crítico en el trabajo?

  • ¿Tienes que arrastrarte al trabajo o tienes problemas para comenzar?

  • ¿Te has vuelto irritable o impaciente con tus compañeros de trabajo?

  • ¿Le resulta difícil concentrarse?

  • ¿No logras la satisfacción de tus logros?

  • ¿Estás usando comida, drogas o alcohol para sentirte mejor o simplemente no sentirte?


Superar a

Está de moda en los círculos tecnológicos menospreciar a las universidades e instituciones gubernamentales como dinosaurios que se mueven lentamente, pero en mi experiencia no son peores que las empresas de tamaño similar. La junta escolar local, la biblioteca y la oficina del concejal de su ciudad pueden ofrecerle espacio, fondos, publicidad, conexiones con otros grupos que aún no haya conocido y una gran cantidad de otras cosas útiles; conocerlos puede ayudarlo a resolver o evitar problemas a corto plazo y pagar dividendos en el futuro.

Márketing Las personas con antecedentes académicos o técnicos a menudo piensan que el marketing se trata de giro y dirección errónea. En realidad, se trata de ver las cosas desde la perspectiva de otras personas, comprender sus deseos y necesidades, y explicar cómo puede ayudarlos, en resumen, cómo enseñarles. Este capítulo analizará cómo usar las ideas de los capítulos anteriores para que la gente entienda y apoye lo que está haciendo.

El primer paso es descubrir qué le está ofreciendo a quién, es decir, qué aporta realmente a los voluntarios, la financiación y otro tipo de apoyo que necesita para continuar. La respuesta es a menudo contra-intuitiva. Por ejemplo, la mayoría de los científicos piensan que sus documentos son su producto, pero en realidad son sus propuestas de subvención, porque eso es lo que aporta el dinero de la subvención [Kuch2011]. Sus documentos son la publicidad que convence a las personas para que financien esas propuestas, así como los álbumes son ahora lo que convence a las personas a comprar boletos y camisetas para conciertos de músicos.

Suponga que su grupo ofrece talleres de programación de fin de semana a personas que están reingresando a la fuerza laboral después de estar fuera durante varios años. Si los participantes del taller pueden pagar lo suficiente para cubrir sus costos, entonces son sus clientes y los talleres son el producto. Si, por otro lado, los talleres son gratuitos o los alumnos solo pagan una cantidad simbólica para reducir la tasa de no presentación, entonces su producto real puede ser una combinación de:

Al igual que con el diseño de la lección (Capítulo 6), los primeros pasos en marketing son crear personas de personas que puedan estar interesadas en lo que está haciendo y determinar cuáles de sus necesidades puede satisfacer. Una forma de resumir esto último es escribir lanzamientos de elevadores dirigidos a diferentes personas. Una plantilla ampliamente utilizada para estos es:

Para público objetivo
quien no está satisfecho con lo que está disponible actualmente
nuestra categoria
proporcionar un beneficio clave
A diferencia de las alternativas
nuestra característica distintiva clave del programa.

Continuando con el ejemplo del taller de fin de semana, podríamos usar este campo para los participantes:

Para las personas que vuelven a ingresar a la fuerza laboral después de estar fuera durante varios años y que aún tienen responsabilidades familiares, nuestros talleres de programación introductoria brindan clases de fin de semana con cuidado infantil en el lugar. A diferencia de las clases en línea, nuestro programa brinda a las personas la oportunidad de conocer a otros en la misma etapa de la vida.

y este para tomadores de decisiones en empresas que podrían patrocinar los talleres:

Para las empresas que desean reclutar desarrolladores de software de nivel básico que luchan por encontrar candidatos maduros de diversos orígenes, nuestros talleres de programación introductoria ofrecen reclutas potenciales. A diferencia de las ferias de reclutamiento universitario, nuestro programa conecta a las empresas con una amplia variedad de candidatos.

Si no sabe por qué diferentes interesados potenciales podrían estar interesados en lo que está haciendo, pregúnteles. Si lo sabe, pregúnteles de todos modos: las respuestas pueden cambiar con el tiempo y puede descubrir cosas que previamente pasó por alto.

Una vez que tenga estos argumentos, deben conducir lo que usted ponga en su sitio web y en material publicitario para ayudar a las personas a descubrir lo más rápido posible si usted y ellos tienen algo de qué hablar. (Sin embargo, probablemente no debería copiarlos textualmente: muchas personas en tecnología han visto esta plantilla con tanta frecuencia que sus ojos se verán vidriosos si la vuelven a encontrar).

Mientras escribe estos lanzamientos, recuerde que hay muchas razones para aprender a programar (Sección 1.4). Un sentido de logro, control sobre sus propias vidas y ser parte de una comunidad puede motivar a las personas más que el dinero (Capítulo 10). Podrían ofrecerse como voluntarios para enseñarle porque sus amigos lo están haciendo; Del mismo modo, una empresa puede decir que está patrocinando clases para estudiantes de secundaria económicamente desfavorecidos porque quieren un grupo más grande de empleados potenciales más adelante, pero el CEO podría estar haciéndolo simplemente porque es lo correcto.

Marca y posicionamiento

Una marca es la primera reacción de alguien ante una mención de un producto; si la reacción es “¿qué es eso?”, todavía no tiene una marca. La marca es importante porque las personas no van a ayudar a algo que no conocen o no les importa.

La mayor parte de la discusión sobre la marca de hoy se centra en cómo crear conciencia en línea. Las listas de correo, los blogs y Twitter le brindan formas de llegar a las personas, pero a medida que aumenta el volumen de información errónea, las personas prestan menos atención a cada interrupción individual. Esto hace que el posicionamiento sea cada vez más importante. A veces llamada “diferenciación”, es lo que distingue su oferta de los demás, la sección “diferente” de las parcelas de su ascensor. Cuando se comunique con personas que ya están familiarizadas con su campo, debe enfatizar su posición, ya que es lo que llamará su atención.

Hay otras cosas que puede hacer para ayudar a construir su marca. Una es usar accesorios como un robot que uno de tus alumnos hizo con los restos que encontró en la casa [Schw2013] o el sitio web que otro alumno hizo para la casa de retiro de sus padres. Otra es hacer un video corto, de no más de unos minutos de duración, que muestre los antecedentes y logros de sus alumnos. El objetivo de ambos es contar una historia: aunque las personas siempre solicitan datos, creen y recuerdan historias.

Mitos Fundacionales

Una de las historias más convincentes que una persona o grupo puede contar es por qué y cómo comenzaron. ¿Estás enseñando lo que desearías que alguien te hubiera enseñado pero no lo hiciste? ¿Hubo una persona en particular a la que quisiste ayudar y que abrió las compuertas? Si no hay una sección en su sitio web que comience, “Érase una vez”, piense en agregar una.

Un paso crucial es hacer que su organización sea localizable en búsquedas en línea. [DiSa2014b] descubrió que los términos de búsqueda que los padres usaban para las clases de computación fuera de la escuela en realidad no encontraron esas clases, y muchos otros grupos enfrentan desafíos similares. Hay mucho folklore sobre cómo hacer que las cosas se puedan encontrar (también conocido como optimización de motores de búsqueda o SEO); Dado el poder casi monopólico de Google y la falta de transparencia, la mayor parte se reduce a tratar de estar un paso por delante de los algoritmos diseñados para evitar que las personas clasifiquen en los juegos.

A menos que esté muy bien financiado, lo mejor que puede hacer es buscarse a sí mismo y a su organización de manera regular y ver qué surge, luego leer estas pautas y hacer lo que pueda para mejorar su sitio. Tenga en cuenta esta caricatura de XKCD: las personas no quieren saber acerca de su organigrama u obtener un recorrido virtual de su sitio; quieren su dirección, información de estacionamiento y alguna idea de lo que enseña, cuándo lo enseña y cómo Va a cambiar sus vidas.

No todos viven en línea

Estos ejemplos suponen que las personas tienen acceso a Internet y que los grupos tienen dinero, materiales, tiempo libre y / o habilidades técnicas. Muchos no lo hacen, de hecho, aquellos que sirven a grupos económicamente desfavorecidos casi con certeza no lo hacen. (Como dice Rosario Robinson, “lo gratuito funciona para aquellos que pueden pagarlo gratis”). Las historias son más importantes que los esquemas del curso en esas situaciones porque son más fáciles de volver a contar. Del mismo modo, si las personas con las que desea comunicarse no están en línea tan a menudo como usted, entonces los tablones de anuncios en las escuelas, bibliotecas locales, centros de acogida y tiendas de abarrotes pueden ser la forma más efectiva de comunicarse con ellos.

El arte de la llamada fría

Construir un sitio web y esperar que la gente lo encuentre es fácil; llamar a las personas o llamar a su puerta sin ningún tipo de presentación previa es mucho más difícil. Sin embargo, al igual que pararse y enseñar, es un oficio que se puede aprender. Aquí hay diez reglas simples para convencer a las personas de las cosas:

1. no. Si tienes que convencer a alguien de algo, lo más probable es que realmente no quieran hacerlo. Respeta eso. casi siempre es mejor a largo plazo dejar algo sin hacer que usar la culpa o cualquier truco psicológico que solo genere resentimiento.

2. Sé amable. No sé si realmente hay un libro llamado Secret Tricks of the Ninja Sales Masters, pero si lo hay, probablemente les dice a los lectores que hacer algo por un cliente potencial crea una sensación de obligación, lo que a su vez aumenta las probabilidades de un rebaja. Eso puede funcionar, pero solo funciona una vez y es algo difícil de hacer. Por otro lado, si eres genuinamente amable y ayudas a otras personas porque es lo que hacen las personas buenas, podrías inspirarlas a ser buenas personas también.

3. Apelar al bien mayor. Si abres hablando de lo que hay para ellos, estás indicando que deberían pensar en su interacción contigo como un intercambio comercial de valor para negociar. En su lugar, comience explicando cómo lo que sea que quiera que ayuden va a hacer del mundo un lugar mejor, y lo dice en serio. Si lo que está proponiendo no va a hacer del mundo un lugar mejor, proponga algo mejor.

4. Comience con algo pequeño. Es comprensible que la mayoría de las personas se muestren reacias a sumergirse de lleno en las cosas, así que deles la oportunidad de probar las aguas y conocerte a ti y a todos los demás involucrados en lo que sea que necesites ayuda. No se sorprenda ni decepcione si ahí es donde terminan las cosas. todos están ocupados o cansados o tienen proyectos propios, o tal vez simplemente tienen un modelo mental diferente de cómo se supone que funciona la colaboración. Recuerde la regla 90-9-1. el 90% de las personas mirará, el 9% hablará y el 1% realmente hará las cosas, y establezca sus expectativas en consecuencia.

5. No construir un proyecto. construir una comunidad. Solía pertenecer a un equipo de béisbol que en realidad nunca jugó béisbol. nuestros “juegos” eran solo una excusa para pasar el rato y disfrutar de la compañía del otro. Probablemente no quieras llegar tan lejos, pero compartir una taza de té con alguien o celebrar el nacimiento de su primer nieto puede darte cosas que ninguna cantidad razonable de dinero puede.

6. Establecer un punto de conexión. “Estaba hablando con X” o “nos conocimos en Y” les da contexto, lo que a su vez los hace más cómodos. Esto debe ser específico. los spammers y las personas que llaman en frío nos han capacitado a todos para ignorar todo lo que comienza, “Hace poco encontré su sitio web …”

7. Sea específico sobre lo que está pidiendo. Las personas necesitan saber esto para poder determinar si el tiempo y las habilidades que tienen coinciden con lo que necesita. Ser realista desde el principio también es una señal de respeto. si le dices a la gente que necesitas una mano moviendo algunas cajas cuando estás empacando una casa entera, probablemente no te ayudarán por segunda vez.

8. Establece tu credibilidad. Mencione a sus patrocinadores, su tamaño, cuánto tiempo ha estado presente su grupo o algo que haya logrado en el pasado para que crean que vale la pena tomarlo en serio.

9. Crea un ligero sentido de urgencia. “Esperamos lanzar esto en la primavera” es más probable que obtenga una respuesta positiva que “eventualmente nos gustaría lanzar esto”. Sin embargo, la palabra “leve” es importante. si su solicitud es urgente, la mayoría de la gente asumirá que está desorganizado o que algo ha salido mal y que puede equivocarse por el lado de la prudencia.

10. Toma una pista. Si la primera persona a la que pide ayuda dice que no, pregúntele a otra persona. Si la quinta o la décima persona dice que no, pregúntese si lo que está tratando de hacer tiene sentido y vale la pena hacerlo.

La siguiente plantilla de correo electrónico sigue todas estas reglas. Funcionó bastante bien. descubrimos que aproximadamente la mitad de los correos electrónicos fueron respondidos, aproximadamente la mitad de los que querían hablar más, y aproximadamente la mitad de los que llevaron a talleres, lo que significa que el 10-15% de los correos electrónicos específicos se convirtieron en talleres. Eso puede ser bastante desmoralizador si no está acostumbrado, pero es mucho mejor que la tasa de respuesta del 2–3% que la mayoría de las organizaciones esperan con las llamadas frías.

Nombre Hola,

Espero que no le importe el correo de la nada, pero quería seguir nuestra conversación en VENUE para ver si estaría interesado en que organicemos > un taller de capacitación de maestros: estamos programando el próximo lote para el próximo par de semanas.

Este taller de un día enseñará a sus voluntarios un puñado de prácticas prácticas de enseñanza basadas en evidencia. Se ha ejecutado más de cien > veces en varias formas en seis continentes para organizaciones sin fines de lucro, bibliotecas y empresas, y todo el material está disponible > gratuitamente en línea en http://teachtogether.tech. Los temas incluirán:

personas aprendices

diferencias entre diferentes tipos de alumnos

utilizando la evaluación formativa para diagnosticar malentendidos

la enseñanza como arte de performance

qué motiva y desmotiva a los estudiantes adultos

La importancia de la inclusión y cómo ser un buen aliado

Si esto suena interesante, por favor dame un grito. Me gustaría tener la oportunidad de hablar de formas y medios.

Gracias,

NOMBRE

Referencias

Construir alianzas con otros grupos que están haciendo cosas relacionadas con su trabajo vale la pena de muchas maneras. Una de ellas son las referencias: si alguien que se acerca a usted para pedirle ayuda sería mejor atendido por otra organización, tómese un momento para hacer una presentación. Si ha hecho esto varias veces, agregue algo a su sitio web para ayudar a la siguiente persona a encontrar lo que necesita. Las organizaciones a las que está ayudando pronto comenzarán a ayudarlo a cambio.

Cambio académico

Todos tienen miedo de lo desconocido y de avergonzarse a sí mismos. Como resultado, la mayoría de las personas prefieren fallar que cambiar. Por ejemplo, Lauren Herckis analizó por qué los docentes universitarios no adoptan mejores métodos de enseñanza. Ella descubrió que la razón principal es el miedo a parecer estúpido frente a los alumnos; Las razones secundarias fueron la preocupación de que los inevitables golpes en el cambio de los métodos de enseñanza afectarían las evaluaciones de los cursos (que a su vez podrían afectar la promoción y la tenencia) y el deseo de las personas de seguir emulando a los maestros que los inspiraron. No tiene sentido discutir si estos problemas son “reales” o no: los profesores creen que sí, por lo que cualquier plan para trabajar con los profesores debe abordarlos349.

[Bark2015] realizó un estudio de dos partes sobre cómo los educadores informáticos adoptan nuevas prácticas de enseñanza como individuos, organizacionalmente y en la sociedad en general. Hicieron y respondieron tres preguntas clave:

¿Cómo se entera el profesorado sobre las nuevas prácticas docentes? Intencionalmente buscan nuevas prácticas porque están motivados para resolver un problema (particularmente la participación de los estudiantes), sus instituciones las toman en cuenta a través de iniciativas deliberadas, las recogen de sus colegas o las obtienen de interacciones esperadas e inesperadas en conferencias (enseñanza- relacionado o de otra manera).

¿Por qué los prueban? A veces, debido a los incentivos institucionales (por ejemplo, innovan para mejorar sus posibilidades de promoción), pero a menudo existe tensión en las instituciones de investigación donde la retórica sobre la importancia de la enseñanza no se cree. Otra razón importante es su propio análisis de costo / beneficio: ¿la innovación les ahorrará tiempo? Un tercero es que están inspirados en modelos a seguir, una vez más, esto afecta en gran medida las innovaciones destinadas a mejorar el compromiso y la motivación en lugar de los resultados de aprendizaje, y un cuarto son fuentes confiables, p. personas que se encuentran en conferencias que se encuentran en la misma situación que ellos y que informaron una adopción exitosa. Pero el profesorado tenía preocupaciones que a menudo no eran abordadas por personas que abogaban por cambios. La primera fue la Ley de Glass: cualquier herramienta o práctica nueva inicialmente te ralentiza, por lo que si bien las nuevas prácticas pueden hacer que la enseñanza sea más efectiva a largo plazo, no se pueden permitir a corto plazo. Otra es que el diseño físico de las aulas dificulta muchas prácticas nuevas: por ejemplo, los grupos de discusión no funcionan bien en asientos estilo teatro. Pero el resultado más revelador fue este: “A pesar de ser investigadores, el profesorado de CS con el que hablamos en su mayor parte no creía que los resultados de los estudios educativos fueran razones creíbles para probar las prácticas de enseñanza”. Esto es consistente con otros hallazgos: incluso las personas cuyas carreras completas se dedican a la investigación a menudo ignoran la investigación educativa.

¿Por qué siguen usándolos? Como dice [Bark2015], “La retroalimentación de los estudiantes es crítica” y, a menudo, es la razón más poderosa para continuar usando una práctica, aunque sabemos que los autoinformes de los alumnos no se correlacionan fuertemente con los resultados del aprendizaje [Star2014, Uttl2017] (aunque la asistencia a conferencias es un buen indicador de compromiso). Otra razón para retener una práctica son los requisitos institucionales, aunque si esta es la única motivación, las personas a menudo abandonarán la práctica cuando se elimine el incentivo o monitoreo explícito.

La buena noticia es que puede abordar estos problemas sistemáticamente. [Baue2015] analizó la adopción de nuevas técnicas médicas dentro de la Administración de Veteranos de los Estados Unidos. Descubrieron que las prácticas basadas en evidencia en medicina tardan un promedio de 17 años en incorporarse a la práctica general de rutina, y que solo aproximadamente la mitad de tales prácticas son ampliamente adoptadas. Este hallazgo deprimente y otros similares estimularon el crecimiento de la ciencia de la implementación, que es el estudio de cómo lograr que las personas adopten mejores prácticas.

Como dijo el Capítulo 13, el punto de partida es descubrir qué creen que necesitan las personas que estás tratando de ayudar. Por ejemplo, [Yada2016] resume los comentarios de los maestros de K-12 sobre la preparación y el apoyo que desean. Si bien puede no ser aplicable a todos los entornos, tomar una taza de té con algunas personas y escuchar antes de hablar hace una gran diferencia en su disposición a probar algo nuevo.

Una vez que sepa lo que la gente necesita, el siguiente paso es hacer cambios de forma incremental, dentro de los propios marcos de las instituciones. [Nara2018] describe un programa intensivo de licenciatura de tres años basado en cohortes muy unidas y apoyo administrativo que triplicó las tasas de graduación, mientras que [Hu2017 ] describe el impacto de la introducción de un programa de certificación de seis meses para los maestros de secundaria existentes que desean enseñar informática. El número de maestros de computación había sido estable entre 2007 y 2013, pero se cuadruplicó después de la introducción del nuevo programa de certificación sin diluir la calidad: los maestros nuevos en computación parecían ser tan efectivos como los maestros con más capacitación en computación en la enseñanza del curso introductorio.

En términos más generales, [Borr2014] clasifica las formas de lograr el cambio en la educación superior. Las categorías se definen según si el cambio es individual o sistémico y si se prescribe (de arriba abajo) o emergente (de abajo hacia arriba). La persona que intenta hacer los cambios (y hacer que se mantengan) tiene un papel diferente en cada situación, y debe seguir diferentes estrategias en consecuencia. El documento continúa explicando cada uno de los métodos en detalle, mientras que [Hend2015a, Hend2015b] presenta las mismas ideas en una forma más procesable.

Al comenzar, probablemente entrará en la categoría Individual / Emergente, ya que se acercará a los maestros uno por uno y tratará de hacer que el cambio ocurra de abajo hacia arriba. Si este es el caso, las estrategias que Borrego y Henderson recomiendan se centran en hacer que los maestros reflexionen sobre su enseñanza individualmente o en grupos. La codificación en vivo para mostrarles lo que haces o los ejemplos que usas, y luego tenerlos en vivo para mostrar cómo usarían esas ideas y técnicas en su entorno, les da a todos la oportunidad de elegir cosas que les serán útiles en su contexto

Enseñanza de campo libre

Las escuelas y las universidades no son los únicos lugares donde las personas van a aprender programación; En los últimos años, un número creciente ha recurrido a talleres de campo libre y programas intensivos de bootcamp. Estos últimos suelen durar entre uno y seis meses, están dirigidos por grupos de voluntarios o por compañías con fines de lucro, y se dirigen a las personas que se están volviendo a capacitar para ingresar a la tecnología. Algunos son de muy alta calidad, pero otros existen principalmente para separar a las personas de su dinero [McMi2017].

[Thay2017] entrevistó a 26 alumnos de tales bootcamps que brindan una segunda oportunidad para aquellos que perdieron las oportunidades de educación en computación antes (aunque expresarlo de esta manera hace algunas suposiciones bastante grandes cuando se trata de personas de grupos subrepresentados). Los participantes de bootcamp enfrentan grandes costos y riesgos personales: deben gastar mucho tiempo, dinero y esfuerzo antes, durante y después de los bootcamps, y cambiar de carrera puede llevar un año o más. Varios entrevistados consideraron que sus certificados eran despreciados por los empleadores; Como algunos dijeron, conseguir un trabajo significa pasar una entrevista, pero como los entrevistadores a menudo no comparten sus razones de rechazo, es difícil saber qué arreglar o qué más aprender. Muchos recurrieron a pasantías (remuneradas o no) y pasaron mucho tiempo construyendo sus carteras y redes. Las tres barreras informales que identificaron más claramente fueron la jerga, el síndrome del impostor y la sensación de no encajar.

[Burk2018] profundizó un poco más en esto al comparar las habilidades y credenciales que buscan los reclutadores de la industria tecnológica con las que brindan los títulos de cuatro años y los campamentos de entrenamiento. Basado en entrevistas con 15 gerentes de contratación de empresas de varios tamaños y algunos grupos focales, descubrieron que los reclutadores enfatizaban uniformemente las habilidades blandas (especialmente el trabajo en equipo, la comunicación y la capacidad de continuar aprendiendo). Muchas compañías requieren un título de cuatro años (aunque no necesariamente en ciencias de la computación), pero muchas también elogiaron a los graduados de bootcamp por ser mayores o más maduros y tener un conocimiento más actualizado.

Si se está acercando a un campamento de entrenamiento existente, su mejor estrategia podría ser enfatizar lo que sabe sobre la enseñanza en lugar de lo que sabe sobre tecnología, ya que muchos de sus fundadores y personal tienen experiencia en programación pero poca o ninguna capacitación en educación. Los primeros capítulos de este libro han jugado bien con esta audiencia en el pasado, y [Lang2016] describe prácticas de enseñanza basadas en evidencia que pueden implementarse con un mínimo esfuerzo y bajo costo. Es posible que estos no tengan el mayor impacto, pero obtener algunas victorias tempranas ayuda a generar apoyo para esfuerzos más grandes.

Pensamientos finales

Es imposible cambiar las grandes instituciones por su cuenta: necesita aliados, y para obtener aliados, necesita tácticas. La guía más útil que he encontrado es [Mann2015], que cataloga más de cuatro docenas de estos y los organiza de acuerdo a si se implementan mejor temprano, más tarde, durante todo el ciclo de cambio o cuando encuentra resistencia. Algunos de sus patrones incluyen:

En tu espacio Mantenga visible la nueva idea colocando recordatorios en toda la organización.

Simbólico: Para mantener viva una nueva idea en la memoria de una persona, entregue fichas que puedan identificarse con el tema que se presenta.

Escéptico campeón: Pida a líderes de opinión fuertes que sean escépticos acerca de su nueva idea que jueguen el papel de “escépticos oficiales”. Use sus comentarios para mejorar su esfuerzo, incluso si no cambia de opinión.

Compromiso futuro: Si puede anticipar algunas de sus necesidades, puede solicitar un compromiso futuro de personas ocupadas. Si se les da un plazo de entrega, pueden estar más dispuestos a ayudar. La estrategia más importante es estar dispuesto a cambiar sus objetivos en función de lo que aprenda de las personas a las que intenta ayudar. Los tutoriales que les muestran cómo usar una hoja de cálculo pueden ayudarlos de manera más rápida y confiable que una introducción a JavaScript. A menudo he cometido el error de confundir cosas que me apasionaban con cosas que otras personas deberían saber; Si realmente quieres ser un socio, recuerda siempre que el aprendizaje y el cambio tienen que ser en ambos sentidos.

La parte más difícil de construir relaciones es comenzar. Reserve una o dos horas cada mes para encontrar aliados y mantener sus relaciones con ellos. Una forma de hacer esto es pedirles consejo: ¿cómo creen que debería crear conciencia sobre lo que está haciendo? ¿Dónde han encontrado espacio para ejecutar clases? ¿Qué necesidades creen que no se están cumpliendo y sería capaz de satisfacer? Cualquier grupo que haya existido durante algunos años tendrá consejos útiles; también se sentirán halagados de que se les pregunte y sabrán quién es la próxima vez que llame.

Y como dice [Kuch2011], si no puede ser el primero en una categoría, intente crear una nueva categoría en la que pueda ser el primero. Si no puede hacerlo, únase a un grupo existente o piense en hacer algo completamente diferente. . Esto no es derrotista: si alguien más ya está haciendo lo que tienes en mente, deberías intervenir o abordar una de las otras cosas igualmente útiles que podrías estar haciendo en su lugar.

Ejercicios

###Lanzar a un concejal de la ciudad (individual / 10) Este capítulo describe una organización que ofrece talleres de programación de fin de semana para personas que vuelven a ingresar a la fuerza laboral. Escriba una presentación de ascensor para esa organización dirigida a un concejal de la ciudad cuyo apoyo necesita la organización.

Lanzando su organización (individual / 30)

Identifique dos grupos de personas de las que su organización necesita apoyo y escriba un discurso de ascensor dirigido a cada uno.

Temas de correo electrónico (pares / 10)

Escriba las líneas de asunto (y solo las líneas de asunto) para tres mensajes de correo electrónico: uno anunciando un nuevo curso, uno anunciando un nuevo patrocinador y otro anunciando un cambio en el liderazgo del proyecto. Compare sus líneas de asunto con las de un socio y vea si puede combinar las mejores características de cada una al tiempo que las acorta.

Manejo de resistencia pasiva (grupos pequeños / 30)

Las personas que no quieren un cambio a veces lo dicen en voz alta, pero a menudo también pueden usar varias formas de resistencia pasiva, como no hacerlo una y otra vez, o plantear un posible problema tras otro para hacer que el cambio parezca más riesgoso y más costoso de lo que es probable que sea. [Scot1987] Trabajando en grupos pequeños, enumere tres o cuatro razones por las cuales las personas podrían no querer que su iniciativa de enseñanza continúe, y explique qué puede hacer con el tiempo y los recursos que tiene para Contrarrestar cada uno.

¿Por qué aprender a programar? (individual / 15)

Vuelva a visitar “¿Por qué aprender a programar?” ejercicio en la Sección 1.4. ¿Dónde se alinean sus razones para enseñar y las razones de sus alumnos para aprender? ¿Dónde no lo hacen? ¿Cómo afecta eso a su comercialización?

Programadores conversacionales (think-pair-share / 15)

Un programador conversacional es alguien que necesita saber lo suficiente sobre informática para tener una conversación significativa con un programador, pero no se va a programar a sí mismo. [Wang2018] descubrió que la mayoría de los recursos de aprendizaje no abordan las necesidades de este grupo. Trabajando en parejas, escriba un discurso para un taller de medio día destinado a ayudar a las personas que se ajusten a esta descripción y luego comparta el discurso de su pareja con el resto de la clase.

Colaboraciones (grupos pequeños / 30)

Responda las siguientes preguntas por su cuenta, luego compare sus respuestas con las de otros miembros de su grupo.

  1. ¿Tiene algún acuerdo o relación con otros grupos?

  2. ¿Quieres tener relaciones con otros grupos?

  3. ¿De qué manera tener (o no tener) colaboraciones lo ayudaría a lograr sus objetivos?

  4. ¿Cuáles son sus relaciones colaborativas clave?

  5. ¿Son estos los colaboradores adecuados para alcanzar sus objetivos?

  6. ¿Con qué grupos o entidades le gustaría que su organización tuviera acuerdos o relaciones?

Educacion (clase entera / 10)

[Laba2008] explora por qué Estados Unidos y otros países siguen presionando la solución de problemas sociales en las instituciones educativas y por qué eso sigue sin funcionar. Como él señala, “[la educación] ha hecho muy poco para promover la igualdad de raza, clase y género; para mejorar la salud pública, la productividad económica y la buena ciudadanía; o para reducir el sexo adolescente, las muertes por tráfico, la obesidad y la destrucción del medio ambiente. De hecho, en muchos sentidos ha tenido un efecto negativo en estos problemas al drenar el dinero y la energía de las reformas sociales que podrían haber tenido un impacto más sustancial”. Él continúa escribiendo:

Entonces, ¿cómo debemos entender el éxito de esta institución a la luz de su incapacidad para hacer lo que le pedimos? Una forma de pensar sobre esto es que la educación puede no estar haciendo lo que le pedimos, pero está haciendo lo que queremos. Queremos una institución que persiga nuestros objetivos sociales de una manera que esté en línea con el individualismo en el corazón del ideal liberal, con el objetivo de resolver los problemas sociales buscando cambiar los corazones, las mentes y las capacidades de los estudiantes individuales. Otra forma de decir esto es que queremos una institución a través de la cual podamos expresar nuestros objetivos sociales sin violar el principio de elección individual que se encuentra en el centro de la estructura social, incluso si esto tiene el costo de no lograr estos objetivos. Por lo tanto, la educación puede servir como un punto de orgullo cívico, un lugar de exhibición para nuestros ideales y un medio para participar en disputas edificantes pero en última instancia sin consecuencias sobre visiones alternativas de la buena vida. Al mismo tiempo, también puede servir como un niño de azotes conveniente que podemos culpar por su fracaso para lograr nuestras aspiraciones más altas para nosotros mismos como sociedad.

¿Cómo encajan los esfuerzos para enseñar el pensamiento computacional y la ciudadanía digital en las escuelas en este marco? ¿Los bootcamps evitan estas trampas o simplemente las entregan con una nueva apariencia?

Adopción Institucional (clase entera / 15)

Vuelva a leer la lista de motivaciones para adoptar nuevas prácticas que figura en la Sección 14.4. ¿Cuál de estos se aplica a usted y sus colegas? ¿Cuáles son irrelevantes para su contexto? ¿Qué enfatiza si interactúa con personas que trabajan en instituciones educativas formales?

Si al principio no tienes éxito (grupos pequeños / 15)

BAÑO. Probablemente Fields nunca dijo: “Si al principio no tienes éxito, inténtalo, inténtalo de nuevo. Luego, déjalo, no sirve de nada ser un tonto”. Sigue siendo un buen consejo: si las personas con las que intenta comunicarse no responden, es posible que nunca las convenza. En grupos de 3 a 4, haga una breve lista de señales de que debe dejar de intentar hacer algo en lo que cree. ¿Cuántos de ellos ya son ciertos?

Hacer que falle (individual / 15)

[Farm2006] presenta algunas reglas irónicas para garantizar que no se adopten nuevas herramientas, todas las cuales se aplican a las nuevas prácticas de enseñanza:

  1. Hazlo opcional.

  2. Economizar en formación.

  3. No lo use en un proyecto real.

  4. Nunca lo integres.

  5. Úselo esporádicamente.

  6. Hazlo parte de una iniciativa de calidad.

  7. Marginar al campeón.

  8. Aproveche los primeros pasos en falso.

  9. Haz una pequeña inversión.

  10. Explotar el miedo, la incertidumbre, la duda, la pereza y la inercia.

¿Cuál de estos has visto hecho recientemente? ¿Qué has hecho tú mismo? ¿Qué forma tomaron?

Tutoría (toda la clase / 15)

El Instituto de Mentoría Afroamericana en Informática ha publicado pautas para la tutoría de estudiantes de doctorado. Léalos individualmente, luego repáselos como una clase y califique sus esfuerzos para su propio grupo como +1 (definitivamente haciendo), 0 (no estoy seguro o no es aplicable) o -1 (definitivamente no está haciendo).

¿Por qué enseño?

Cuando comencé a ser voluntario en la Universidad de Toronto, algunos de mis estudiantes me preguntaron por qué iba a enseñar de forma gratuita. Esta fue mi respuesta:

Cuando tenía tu edad, pensaba que las universidades existían para enseñar a la gente a aprender. Más tarde, en la escuela de posgrado, pensé que las universidades se dedicaban a investigar y crear nuevos conocimientos. Sin embargo, ahora que tengo más de cuarenta años, me he dado cuenta de que lo que realmente le estamos enseñando es cómo dominar el mundo, porque tendrá que decidir si quiere o no.

Mis padres tienen setenta años. Ya no corren el mundo; Son las personas de mi edad las que aprueban leyes y toman decisiones de vida o muerte en los hospitales. Tan aterrador como es, somos los adultos.

Dentro de veinte años, nos dirigiremos a la jubilación y usted estará a cargo. Puede parecer mucho tiempo cuando tienes diecinueve años, pero toma tres respiraciones y desaparecerá. Es por eso que le damos problemas cuyas respuestas no se pueden analizar a partir de las notas del año pasado. Es por eso que lo ponemos en situaciones en las que tiene que descubrir qué debe hacerse en este momento, qué puede dejar para más adelante y qué puede simplemente ignorar. Es porque si no aprende cómo hacer estas cosas ahora, no estará listo para hacerlo cuando sea necesario.

Todo era cierto, pero no era toda la historia. No quiero que la gente haga del mundo un lugar mejor para poder retirarme cómodamente. Quiero que lo hagan porque es la mayor aventura de nuestro tiempo. Hace ciento cincuenta años, la mayoría de las sociedades practicaban la esclavitud. Hace cien años, mi abuela no era legalmente una persona en Canadá. En el año en que nací, la mayoría de las personas del mundo sufrieron bajo un gobierno totalitario, y los jueces todavía ordenaban la terapia de electrochoque para “curar” a los homosexuales. Todavía hay mucho mal con el mundo, pero mira cuántas opciones más tenemos que nuestros abuelos. Mira cuántas cosas más podemos saber, ser y disfrutar, porque finalmente nos estamos tomando en serio la Regla de Oro.

Hoy soy menos optimista que antes. El cambio climático, la extinción masiva, la vigilancia del capitalismo, la desigualdad en una escala que no hemos visto en un siglo, el resurgimiento del nacionalismo racista: mi generación lo ha visto todo y se encogió de hombros. El proyecto de ley para nuestra cobardía, letargo y avaricia no se pagará hasta que mi hija crezca, pero llegará, y para el momento en que lo haga, no habrá soluciones fáciles para estos problemas (y posiblemente ninguna solución).

Por eso enseño hoy: estoy enojado. Estoy enojado porque tu sexo y tu color y la riqueza y las conexiones de tus padres no deberían contar más que cuán inteligente, honesto o trabajador eres. Estoy enojado porque convertimos Internet en un pozo negro. Estoy enojado porque los nazis están en marcha una vez más y los multimillonarios juegan con cohetes mientras el planeta se derrite. Estoy enojado, así que enseño, porque el mundo solo mejora cuando enseñamos a las personas cómo mejorarlo.

En su ensayo de 1947 “Por qué escribo”, George Orwell escribió:

En una época pacífica, podría haber escrito libros ornamentados o meramente descriptivos, y podría haber permanecido casi inconsciente de mis lealtades políticas. De hecho, me he visto obligado a convertirme en una especie de panfleto … Cada línea de trabajo serio que he escrito desde 1936 se ha escrito, directa o indirectamente, contra el totalitarismo … Me parece absurdo, en un período como el nuestro, piensa que uno puede evitar escribir sobre tales temas. Todos escriben de ellos de una manera u otra. Es simplemente una cuestión de qué lado se toma.

Reemplace “escritura” con “enseñanza” y tendrá la razón por la que hago lo que hago.

Gracias por leer. Espero que podamos enseñar juntos algún día. Hasta entonces:

Comience donde está. Usa lo que tienes. Ayuda a quien puedas.

LS0tCnRpdGxlOiAiRW5zZcOxYW5kbyB0ZWNub2xvZ8OtYSBqdW50b3MiCm91dHB1dDogaHRtbF9ub3RlYm9vawplZGl0b3Jfb3B0aW9uczogCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQotLS0KClNvdXJjZSBkb2N1bWVudCBodHRwOi8vdGVhY2h0b2dldGhlci50ZWNoLwoKKipDw7NtbyBjcmVhciB5IGVudHJlZ2FyIGxlY2Npb25lcyBxdWUgZnVuY2lvbmVuIHkgY29uc3RydWlyIHVuYSBjb211bmlkYWQgZG9jZW50ZSBhIHN1IGFscmVkZWRvcioqCgpHcmVnIFdpbHNvbgoKVGF5bG9yICYgRnJhbmNpcywgMjAxOSwgOTc4LTAtMzY3LTM1MzI4LTUKCgojIyBEZWRpY2F0b3JpYQoKUGFyYSBtaSBtYWRyZSwgRG9yaXMgV2lsc29uLApxdWllbiBlbnNlw7HDsyBhIGNpZW50b3MgZGUgbmnDsW9zIGEgbGVlciB5IGNyZWVyIGVuIHPDrSBtaXNtb3MuClkgcGFyYSBtaSBoZXJtYW5vIEplZmYsIHF1ZSBubyB2aXZpw7MgcGFyYSB2ZXJsbyB0ZXJtaW5hZG8uCiJSZWN1ZXJkYSwgdG9kYXbDrWEgdGllbmVzIG11Y2hvcyBidWVub3MgbW9tZW50b3MgZnJlbnRlIGEgdGkiLgpUb2RhcyBsYXMgcmVnYWzDrWFzIGRlIGxhIHZlbnRhIGRlIGVzdGUgbGlicm8gc2UgZG9uYW4gYQpsYXMgY2FycGludGVyw61hcywKdW5hIG9yZ2FuaXphY2nDs24gZGUgdm9sdW50YXJpb3MgcXVlIGVuc2XDsWEKaGFiaWxpZGFkZXMgYsOhc2ljYXMgZGUgY29kaWZpY2FjacOzbiB5IGNpZW5jaWEgZGUgZGF0b3MKYSBpbnZlc3RpZ2Fkb3JlcyBkZSB0b2RvIGVsIG11bmRvLgoKCiMgTGFzIHJlZ2xhcwoxLiBTw6kgYW1hYmxlOiB0b2RvIGxvIGRlbcOhcyBzb24gZGV0YWxsZXMuCjIuIFJlY3VlcmRhIHF1ZSBubyBlcmVzIHR1IGFsdW1ubyAuLi4KMy4gLi4uIHF1ZSBsYSBtYXlvcsOtYSBkZSBsYSBnZW50ZSBwcmVmaWVyZSBmYWxsYXIgcXVlIGNhbWJpYXIgLi4uCjQuIC4uLiB5IGVzZSBub3ZlbnRhIHBvciBjaWVudG8gZGUgbWFnaWEgY29uc2lzdGUgZW4gc2FiZXIgdW5hIGNvc2EgZXh0cmEuCjUuIE51bmNhIGVuc2XDsWVzIHNvbG8uCjYuIE51bmNhIGR1ZGVzIGVuIHNhY3JpZmljYXIgbGEgdmVyZGFkIHBvciBsYSBjbGFyaWRhZC4KNy4gSGF6IGRlIGNhZGEgZXJyb3IgdW5hIGxlY2Npw7NuLgo4LiBSZWN1ZXJkZSBxdWUgbmluZ3VuYSBsZWNjacOzbiBzb2JyZXZpdmUgYWwgcHJpbWVyIGNvbnRhY3RvIGNvbiBsb3MgYWx1bW5vcyAuLi4KOS4gLi4uIHF1ZSBjYWRhIGxlY2Npw7NuIGVzIGRlbWFzaWFkbyBjb3J0YSBwYXJhIGVsIHByb2Zlc29yIHkgZGVtYXNpYWRvIGxhcmdhIHBhcmEgZWwgYWx1bW5vIC4uLgoxMC4gLi4uIHkgcXVlIG5hZGllIGVzdGFyw6EgbcOhcyBlbnR1c2lhc21hZG8gY29uIGxhIGxlY2Npw7NuIHF1ZSB0w7ouCgotLS0tLS0KCiMgSW50cm9kdWNjacOzbgpMb3MgZ3J1cG9zIGRlIGJhc2UgaGFuIHN1cmdpZG8gZW4gdG9kbyBlbCBtdW5kbyBwYXJhIGVuc2XDsWFyIHByb2dyYW1hY2nDs24sIGRpc2XDsW8gd2ViLCByb2LDs3RpY2EgeSBvdHJhcyBoYWJpbGlkYWRlcyBhIGxvcyBlc3R1ZGlhbnRlcyBkZSBjYW1wbyBsaWJyZS4gRXN0b3MgZ3J1cG9zIGV4aXN0ZW4gcGFyYSBxdWUgbGFzIHBlcnNvbmFzIG5vIHRlbmdhbiBxdWUgYXByZW5kZXIgZXN0YXMgY29zYXMgcG9yIHN1IGN1ZW50YSwgcGVybyBpcsOzbmljYW1lbnRlLCBzdXMgZnVuZGFkb3JlcyB5IG1hZXN0cm9zIGEgbWVudWRvIHNlIGVuc2XDsWFuIGEgc8OtIG1pc21vcyBjw7NtbyBlbnNlw7Fhci4KCkhheSB1bmEgbWVqb3IgbWFuZXJhLiBBc8OtIGNvbW8gY29ub2NlciBhbGd1bm9zIGRhdG9zIGLDoXNpY29zIHNvYnJlIGfDqXJtZW5lcyB5IG51dHJpY2nDs24gcHVlZGUgYXl1ZGFybG8gYSBtYW50ZW5lcnNlIHNhbHVkYWJsZSwgY29ub2NlciBhbGd1bmFzIGNvc2FzIHNvYnJlIHBzaWNvbG9nw61hIGNvZ25pdGl2YSwgZGlzZcOxbyBkZSBpbnN0cnVjY2nDs24sIGluY2x1c2nDs24geSBvcmdhbml6YWNpw7NuIGNvbXVuaXRhcmlhIHB1ZWRlIGF5dWRhcmxvIGEgc2VyIHVuIG1hZXN0cm8gbcOhcyBlZmVjdGl2by4gRXN0ZSBsaWJybyBwcmVzZW50YSBpZGVhcyBjbGF2ZSBxdWUgcHVlZGUgdXNhciBlbiBlc3RlIG1vbWVudG8sIGV4cGxpY2EgcG9yIHF1w6kgY3JlZW1vcyBxdWUgc29uIHZlcmRhZGVyYXMgeSBsZSBzZcOxYWxhIG90cm9zIHJlY3Vyc29zIHF1ZSBsbyBheXVkYXLDoW4gYSBsbGVnYXIgbcOhcyBsZWpvcy4KCj4qKlJldXRpbGl6YXIqKgo+Cj5QYXJ0ZXMgZGUgZXN0ZSBsaWJybyBzZSBjcmVhcm9uIG9yaWdpbmFsbWVudGUgcGFyYSBlbCBwcm9ncmFtYSBkZSBjYXBhY2l0YWNpw7NuIGRlIGluc3RydWN0b3JlcyBkZSBDYXJwaW50ZXLDrWEgZGUgc29mdHdhcmUsIHkgdG9kbyBzZSBwdWVkZSBkaXN0cmlidWlyIHkgcmV1dGlsaXphciBsaWJyZW1lbnRlIGJham8gbGEgbGljZW5jaWEgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1Ob25Db21tZXJjaWFsIDQuMCAoQXDDqW5kaWNlIDE2KS4gUHVlZGUgdXNhciBsYSB2ZXJzacOzbiBlbiBsw61uZWEgZW4gaHR0cDovL3RlYWNodG9nZXRoZXIudGVjaC8gZW4gY3VhbHF1aWVyIGNsYXNlIChncmF0dWl0YSBvIGRlIHBhZ28pLCB5IHB1ZWRlIGNpdGFyIGV4dHJhY3RvcyBicmV2ZXMgZW4gdmlydHVkIGRlIGxhcyBkaXNwb3NpY2lvbmVzIGRlIHVzbyBqdXN0bywgcGVybyBubyBwdWVkZSB2b2x2ZXIgYSBwdWJsaWNhciBncmFuZGVzIHBpZXphcyBlbiBvYnJhcyBjb21lcmNpYWxlcyBzaW4gcGVybWlzbyBwcmV2aW8uCgpMYXMgY29udHJpYnVjaW9uZXMsIGNvcnJlY2Npb25lcyB5IHN1Z2VyZW5jaWFzIHNvbiBiaWVudmVuaWRhcywgeSB0b2RvcyBsb3MgY29udHJpYnV5ZW50ZXMgc2Vyw6FuIHJlY29ub2NpZG9zIGNhZGEgdmV6IHF1ZSBzZSBwdWJsaXF1ZSB1bmEgbnVldmEgdmVyc2nDs24uIENvbnN1bHRlIGVsIEFww6luZGljZSAxOCBwYXJhIG3DoXMgZGV0YWxsZXMgeSBlbCBBcMOpbmRpY2UgMTcgcGFyYSBudWVzdHJvIGPDs2RpZ28gZGUgY29uZHVjdGEuCgoKIyMgwr9RdWllbmVzIHNvbW9zPwoKTGEgU2VjY2nDs24gNi4xIGV4cGxpY2EgY8OzbW8gZGVzY3VicmlyIHF1acOpbmVzIHNvbiBzdXMgYWx1bW5vcy4gTG9zIGN1YXRybyBwYXJhIGxvcyBxdWUgc2lydmUgZXN0ZSBsaWJybyBzb24gdG9kb3MgbWFlc3Ryb3MgZGUgdXN1YXJpb3MgZmluYWxlczogbGEgZW5zZcOxYW56YSBubyBlcyBzdSBvY3VwYWNpw7NuIHByaW5jaXBhbCwgdGllbmVuIHBvY2EgbyBuaW5ndW5hIGV4cGVyaWVuY2lhIGVuIHBlZGFnb2fDrWEgeSBwdWVkZW4gdHJhYmFqYXIgZnVlcmEgZGUgbGFzIGF1bGFzIGluc3RpdHVjaW9uYWxlcy4KCiMjIyBFbWlseQpTZSBmb3Jtw7MgY29tbyBiaWJsaW90ZWNhcmlvIHkgYWhvcmEgdHJhYmFqYSBjb21vIGRpc2XDsWFkb3Igd2ViIHkgZ2VyZW50ZSBkZSBwcm95ZWN0b3MgZW4gdW5hIHBlcXVlw7FhIGVtcHJlc2EgZGUgY29uc3VsdG9yw61hLiBFbiBzdSB0aWVtcG8gbGlicmUsIGVsbGEgYXl1ZGEgYSBvcmdhbml6YXIgY2xhc2VzIGRlIGRpc2XDsW8gd2ViIHBhcmEgbXVqZXJlcyBxdWUgaW5ncmVzYW4gYSBsYSB0ZWNub2xvZ8OtYSBjb21vIHVuYSBzZWd1bmRhIGNhcnJlcmEuIEFob3JhIGVzdMOhIHJlY2x1dGFuZG8gY29sZWdhcyBwYXJhIGltcGFydGlyIG3DoXMgY2xhc2VzIGVuIHN1IMOhcmVhLCB5IHF1aWVyZSBzYWJlciBjw7NtbyBoYWNlciBsZWNjaW9uZXMgcXVlIG90cm9zIHB1ZWRhbiB1c2FyIHkgaGFjZXIgY3JlY2VyIHVuYSBvcmdhbml6YWNpw7NuIGRlIGVuc2XDsWFuemEgdm9sdW50YXJpYS4KCiMjIyBNb3NoZQpFcyB1biBwcm9ncmFtYWRvciBwcm9mZXNpb25hbCBjb24gZG9zIGhpam9zIGFkb2xlc2NlbnRlcyBjdXlhIGVzY3VlbGEgbm8gb2ZyZWNlIGNsYXNlcyBkZSBwcm9ncmFtYWNpw7NuLiBTZSBoYSBvZnJlY2lkbyBjb21vIHZvbHVudGFyaW8gcGFyYSBkaXJpZ2lyIHVuIGNsdWIgZGUgcHJvZ3JhbWFjacOzbiBtZW5zdWFsIGRlc3B1w6lzIGRlIGxhIGVzY3VlbGEsIHkgYXVucXVlIGZyZWN1ZW50ZW1lbnRlIGhhY2UgcHJlc2VudGFjaW9uZXMgYSBjb2xlZ2FzLCBubyB0aWVuZSBleHBlcmllbmNpYSBlbiBlbCBhdWxhLiBRdWllcmUgYXByZW5kZXIgYSBjb25zdHJ1aXIgbGVjY2lvbmVzIGVmZWN0aXZhcyBlbiB1biB0aWVtcG8gcmF6b25hYmxlIHkgbGUgZ3VzdGFyw61hIHNhYmVyIG3DoXMgc29icmUgbG9zIHByb3MgeSBsb3MgY29udHJhcyBkZSBsYXMgY2xhc2VzIGVuIGzDrW5lYSBhIHN1IHByb3BpbyByaXRtby4KCiMjIyBTYW1pcmEKRXMgdW4gZXN0dWRpYW50ZSB1bml2ZXJzaXRhcmlvIGVuIHJvYsOzdGljYSBxdWUgZXN0w6EgcGVuc2FuZG8gZW4gY29udmVydGlyc2UgZW4gbWFlc3RyYSBkZXNwdcOpcyBkZSBncmFkdWFyc2UuIEVsbGEgcXVpZXJlIGF5dWRhciBlbiBsb3MgdGFsbGVyZXMgZGUgcm9iw7N0aWNhIGRlIGZpbiBkZSBzZW1hbmEgcGFyYSBzdXMgY29tcGHDsWVyb3MsIHBlcm8gbnVuY2EgaGEgZW5zZcOxYWRvIHVuYSBjbGFzZSBhbnRlcyB5IHNpZW50ZSBtdWNobyBzw61uZHJvbWUgZGUgaW1wb3N0b3IuIFF1aWVyZSBhcHJlbmRlciBtw6FzIHNvYnJlIGVkdWNhY2nDs24gZW4gZ2VuZXJhbCBwYXJhIGRlY2lkaXIgc2kgZXMgcGFyYSBlbGxhLCB5IHRhbWJpw6luIGVzdMOhIGJ1c2NhbmRvIGNvbnNlam9zIGVzcGVjw61maWNvcyBwYXJhIGF5dWRhcmxhIGEgaW1wYXJ0aXIgbGVjY2lvbmVzIGRlIG1hbmVyYSBtw6FzIGVmZWN0aXZhLgoKIyMjIEdlbmUKRXMgcHJvZmVzb3IgZGUgaW5mb3Jtw6F0aWNhLiBIYW4gZXN0YWRvIGltcGFydGllbmRvIGN1cnNvcyBkZSBwcmVncmFkbyBzb2JyZSBzaXN0ZW1hcyBvcGVyYXRpdm9zIGR1cmFudGUgc2VpcyBhw7FvcywgeSBjYWRhIHZleiBtw6FzIGNyZWVuIHF1ZSB0aWVuZSBxdWUgaGFiZXIgdW5hIG1lam9yIG1hbmVyYS4gTGEgw7puaWNhIGNhcGFjaXRhY2nDs24gZGlzcG9uaWJsZSBhIHRyYXbDqXMgZGVsIGNlbnRybyBkZSBlbnNlw7FhbnphIHkgYXByZW5kaXphamUgZGUgc3UgdW5pdmVyc2lkYWQgY29uc2lzdGUgZW4gcHVibGljYXIgdGFyZWFzIHkgcHJlc2VudGFyIGNhbGlmaWNhY2lvbmVzIGVuIGVsIHNpc3RlbWEgZGUgZ2VzdGnDs24gZGUgYXByZW5kaXphamUgZW4gbMOtbmVhLCBwb3IgbG8gcXVlIHF1aWVyZW4gc2FiZXIgcXXDqSBtw6FzIGRlYmVyw61hbiBwZWRpci4KRXN0YXMgcGVyc29uYXMgdGllbmVuIHVuYSB2YXJpZWRhZCBkZSBhbnRlY2VkZW50ZXMgdMOpY25pY29zIHkgYWxndW5hIGV4cGVyaWVuY2lhIGRvY2VudGUgcHJldmlhLCBwZXJvIG5vIHRpZW5lbiBjYXBhY2l0YWNpw7NuIGZvcm1hbCBlbiBlbnNlw7FhbnphLCBkaXNlw7FvIGRlIGxlY2Npb25lcyB1IG9yZ2FuaXphY2nDs24gY29tdW5pdGFyaWEuIExhIG1heW9yw61hIHRyYWJhamEgY29uIGVzdHVkaWFudGVzIGRlIHJhbmdvIGxpYnJlIHkgc2UgZW5mb2NhIGVuIGFkb2xlc2NlbnRlcyB5IGFkdWx0b3MgZW4gbHVnYXIgZGUgbmnDsW9zOyBUb2RvcyB0aWVuZW4gdGllbXBvIHkgcmVjdXJzb3MgbGltaXRhZG9zLiBFc3BlcmFtb3MgcXVlIG51ZXN0cm8gY3VhcnRldG8gdXNlIGVzdGUgbWF0ZXJpYWwgZGUgbGEgc2lndWllbnRlIG1hbmVyYToKCioqRW1pbHkqKiBQYXJ0aWNpcGFyw6EgZW4gdW4gZ3J1cG8gc2VtYW5hbCBkZSBsZWN0dXJhIGVuIGzDrW5lYSBjb24gc3VzIHZvbHVudGFyaW9zLgoKKipNb3NoZSoqIEN1YnJpcsOhIHBhcnRlIGRlIGVzdGUgbGlicm8gZW4gdW4gdGFsbGVyIGRlIGZpbiBkZSBzZW1hbmEgZGUgdW4gZMOtYSB5IGVzdHVkaWFyw6EgZWwgcmVzdG8gcG9yIHN1IGN1ZW50YS4KCioqU2FtaXJhKiogVXRpbGl6YXLDoSBlc3RlIGxpYnJvIGVuIHVuIGN1cnNvIGRlIHByZWdyYWRvIGRlIHVuIHNlbWVzdHJlIGNvbiB0YXJlYXMsIHVuIHByb3llY3RvIHkgdW4gZXhhbWVuIGZpbmFsLgoKKipHZW5lKiogTGVlcsOhIGVsIGxpYnJvIHNvbG8gZW4gc3Ugb2ZpY2luYSBvIG1pZW50cmFzIHZpYWphLCBkZXNlYW5kbyB0b2RvIGVsIHRpZW1wbyBxdWUgbGFzIHVuaXZlcnNpZGFkZXMgaGFnYW4gbcOhcyBwYXJhIGFwb3lhciBsYSBlbnNlw7FhbnphIGRlIGFsdGEgY2FsaWRhZC4KCgojIyBRdcOpIGxlZXIgZW4gc3UgbHVnYXIKU2kgdGllbmUgcHJpc2EgbyBxdWllcmUgc2FiZXIgcXXDqSBjdWJyaXLDoSBlc3RlIGxpYnJvLCBbQnJvdzIwMThdIHByZXNlbnRhIGRpZXogY29uc2Vqb3MgYmFzYWRvcyALC2VuIGxhIGV2aWRlbmNpYSBwYXJhIGVuc2XDsWFyIGNvbXB1dGFjacOzbi4gVGFtYmnDqW4gcHVlZGVzIGRpc2ZydXRhciBkZToKCiogTGEgY2FwYWNpdGFjacOzbiBkZSBpbnN0cnVjdG9yZXMgZGUgY2FycGludGVyw61hLCBkZSBsYSBjdWFsIHNlIGRlcml2YSBlc3RlIGxpYnJvLgoKKiBbTGFuZzIwMTZdIHkgW0h1c3QyMDEyXSwgcXVlIHNvbiBicmV2ZXMgeSBhY2Nlc2libGVzLCB5IHF1ZSBjb25lY3RhbiBsYXMgY29zYXMgcXVlIHB1ZWRlIGhhY2VyIGFob3JhIG1pc21vIGNvbiBsYSBpbnZlc3RpZ2FjacOzbiBxdWUgbGFzIHJlc3BhbGRhLgoKKiBbQmVyZzIwMTIsIExlbW8yMDE0LCBNYWpvMjAxNSwgQnJvbzIwMTYsIFJpY2UyMDE4LCBXZWluMjAxOGJdIGVzdMOhbiBsbGVub3MgZGUgc3VnZXJlbmNpYXMgcHLDoWN0aWNhcyBzb2JyZSBsYXMgY29zYXMgcXVlIHB1ZWRlIGhhY2VyIGVuIHN1IGNsYXNlLCBwZXJvIHB1ZWRlbiB0ZW5lciBtw6FzIHNlbnRpZG8gdW5hIHZleiBxdWUgdGVuZ2EgdW4gbWFyY28gcGFyYSBjb21wcmVuZGVyIHBvciBxdcOpIGZ1bmNpb25hbiBzdXMgaWRlYXMuCgoqIFtEZUJyMjAxNV0sIHF1ZSBleHBsaWNhIGxvIHF1ZSBlcyB2ZXJkYWQgc29icmUgbGEgZWR1Y2FjacOzbiBhbCBleHBsaWNhciBsbyBxdWUgbm8gZXMsIHkgW0RpZGEyMDE2XSwgcXVlIGZ1bmRhbWVudGEgbGEgdGVvcsOtYSBkZWwgYXByZW5kaXphamUgZW4gcHNpY29sb2fDrWEgY29nbml0aXZhLgoKKiBbUGFwZTE5OTNdLCBxdWUgc2lndWUgc2llbmRvIHVuYSB2aXNpw7NuIGluc3BpcmFkb3JhIGRlIGPDs21vIGxhcyBjb21wdXRhZG9yYXMgcHVlZGVuIGNhbWJpYXIgbGEgZWR1Y2FjacOzbi4gTGEgZXhjZWxlbnRlIGRlc2NyaXBjacOzbiBkZSBBbXkgS28gaGFjZSB1biBtZWpvciB0cmFiYWpvIGFsIHJlc3VtaXIgbGFzIGlkZWFzIGRlIFBhcGVydCBkZSBsbyBxdWUgcG9zaWJsZW1lbnRlIHBvZHLDrWEsIHkgW0NyYXcyMDEwXSBlcyB1biBjb21wYcOxZXJvIGVzdGltdWxhbnRlIHBhcmEgYW1ib3MuCgoqIFtHcmVlMjAxNCwgTWNNaTIwMTcsIFdhdHQyMDE0XSBleHBsaWNhbiBwb3IgcXXDqSB0YW50b3MgaW50ZW50b3MgZGUgcmVmb3JtYSBlZHVjYXRpdmEgaGFuIGZyYWNhc2FkbyBlbiBsb3Mgw7psdGltb3MgY3VhcmVudGEgYcOxb3MsIGPDs21vIGxhcyB1bml2ZXJzaWRhZGVzIGNvbiBmaW5lcyBkZSBsdWNybyBlc3TDoW4gZXhwbG90YW5kbyB5IGV4YWNlcmJhbmRvIGxhIGNyZWNpZW50ZSBkZXNpZ3VhbGRhZCBlbiBudWVzdHJhIHNvY2llZGFkLCB5IGPDs21vIGxhIHRlY25vbG9nw61hIGhhIGZhbGxhZG8gcmVwZXRpZGFtZW50ZSBlbiByZXZvbHVjaW9uYXIgbGEgZWR1Y2FjacOzbi4KCiogW0Jyb3cyMDA3XSB5IFtNYW5uMjAxNV0sIHBvcnF1ZSBubyBwdWVkZXMgZW5zZcOxYXIgYmllbiBzaW4gY2FtYmlhciBlbCBzaXN0ZW1hIGVuIGVsIHF1ZSBlbnNlw7FhbW9zLCB5IG5vIHB1ZWRlcyBoYWNlcmxvIHNvbG8uCgpBcXVlbGxvcyBxdWUgcXVpZXJhbiBtw6FzIG1hdGVyaWFsIGFjYWTDqW1pY28gdGFtYmnDqW4gcHVlZGVuIGVuY29udHJhciBbR3V6ZDIwMTVhLCBIYXp6MjAxNCwgU2VudDIwMTgsIEZpbmMyMDE5LCBIcGwyMDE4XSBncmF0aWZpY2FudGUsIG1pZW50cmFzIHF1ZSBlbCBibG9nIGRlIE1hcmsgR3V6ZGlhbCBoYSBzaWRvIGNvbnNpc3RlbnRlbWVudGUgaW5mb3JtYXRpdm8geSBlc3RpbXVsYW50ZS4KCiMjIEFncmFkZWNpbWllbnRvcwpFc3RlIGxpYnJvIG5vIGV4aXN0aXLDrWEgc2luIGxhcyBjb250cmlidWNpb25lcyBkZSBMYXVyYSBBY2lvbiwgSm9yZ2UgQXJhbmRhLCBNYXJhIEF2ZXJpY2ssIEVyaW4gQmVja2VyLCBZYW5pbmEgQmVsbGluaSBTYWliZW5lLCBBemFsZWUgQm9zdHJvZW0sIEh1Z28gQm93bmUtQW5kZXJzb24sIE5laWwgQnJvd24sIEdlcmFyZCBDYXBlcywgRnJhbmNpcyBDYXN0cm8sIERhbmllbCBDaGVuLCBEYXYgQ2xhcmssIFdhcnJlbiBDb2RlICwgQmVuIENvdHRvbiwgUmljaGllIENvdHRvbiwgS2FyZW4gQ3JhbnN0b24sIEthdGllIEN1bm5pbmdoYW0sIE5hdGFzaGEgRGFuYXMsIE1hdHQgRGF2aXMsIE5lYWwgRGF2aXMsIE1hcmsgRGVnYW5pLCBUaW0gRGVubmlzLCBQYXVsIERlbm55LCBNaWNoYWVsIERldXRzY2gsIEJyaWFuIERpbGxpbmdoYW0sIEdyYWUgRHJha2UsIEthdGhpIEZpc2xlciwgRGVuYWUgRm9yZCwgQXVyaWVsIEZvdXJuaWVyLCBCb2IgRnJlZW1hbiwgTmF0aGFuIEdhcnJldHQsIE1hcmsgR3V6ZGlhbCwgUmF5bmEgSGFycmlzLCBBaG1lZCBIYXNhbiwgSWFuIEhhd2tlLCBGZWxpZW5uZSBIZXJtYW5zLCBLYXRlIEhlcnR3ZWNrLCBUb2J5IEhvZGdlcywgUm9lbCBIb2dlcnZvcnN0LCBNaWtlIEhveWUsIERhbiBLYXR6LCBDaHJpc3RpbmEgS29jaCwgU2hyaXJhbSBLcmlzaG5hbXVydGhpLCBLYXRyaW4gTGVpbndlYmVyLCBDb2xsZWVuIExld2lzLCBEYXZlIExveWFsbCwgUGF3ZcWCIE1hcmN6ZXdza2ksIExlbm55IE1hcmt1cywgU3VlIE1jQ2xhdGNoeSwgSmVzc2ljYSBNY0tlbGxhciwgSWFuIE1pbGxpZ2FuLCBKdWxpZSBNb3JvbnVraSwgTGV4IE5lZGVyYnJhZ3QsIEFsZWtzYW5kcmEgTmVuYWRpYywgSmVyYW1pYSBPcnksIEpvZWwgT3N0YmxvbSwgRWxpemFiZXRoIFBhdGl0c2FzLCBBbGVrc2FuZHJhIFBhd2xpaywgU29yYXdlZSBQb3JuY2hhcm9lbndhc2UsIEVtaWx5IFBvcnRhLCBBbGV4IFBvdW5kcywgVGhvbWFzIFByaWNlIElubiwgSWFuIFJhZ3NkYWxlLCBFcmluIFJvYmluc29uLCBSb3NhcmlvIFJvYmluc29uLCBBcmllbCBSb2tlbSwgUGF0IFNjaGxvc3MsIE1hbHZpa2EgU2hhcmFuLCBGbG9yaWFuIFNoa3VydGksIERhbiBTaG9sbGVyLCBKdWhhIFNvcnZhLCBJZ29yIFN0ZWlubWFjaGVyLCBUcmFjeSBUZWFsLCBUaWZmYW55IFRpbWJlcnMsIFJpY2hhcmQgVG9tc2V0dCwgUHJlc3RvbiBUdW5uZWxsIFdpbHNvbiwgTWF0dCBUdXJrLCBGaW9uYSBUd2VlZGllICwgTWFydGluIFVrcm9wLCBBbmVsZGEgdmFuIGRlciBXYWx0LCBTdMOpZmFuIHZhbiBkZXIgV2FsdCwgQWxsZWdyYSBWaWEsIFBldHIgVmlrdG9yaW4sIEJlbGluZGEgV2VhdmVyLCBIYWRsZXkgV2lja2hhbSwgSmFzb24gV2lsbGlhbXMsIFNpbW9uIFdpbGxpc29uLCBLYXJlbiBXb3JkLCBKb2huIFdyZW5uIHkgQW5kcm9tZWRhIFllbHRvbi4gVGFtYmnDqW4gZXN0b3kgYWdyYWRlY2lkbyBhIEx1a2FzIEJsYWtrIHBvciBlbCBsb2dvdGlwbywgYSBTaGFzaGkgS3VtYXIgcG9yIGxhIGF5dWRhIGRlIExhVGVYLCBhIE1hcmtrdSBSb250dSBwb3IgaGFjZXIgcXVlIGxvcyBkaWFncmFtYXMgc2UgdmVhbiBtZWpvciwgeSBhIHRvZG9zIGxvcyBxdWUgaGFuIHVzYWRvIGVzdGUgbWF0ZXJpYWwgYSBsbyBsYXJnbyBkZSBsb3MgYcOxb3MuIEN1YWxxdWllciBlcnJvciBxdWUgcXVlZGUgZXMgbcOtby4KCiMjIEVqZXJjaWNpb3MKQ2FkYSBjYXDDrXR1bG8gZmluYWxpemEgY29uIHVuYSB2YXJpZWRhZCBkZSBlamVyY2ljaW9zIHF1ZSBpbmNsdXllbiB1biBmb3JtYXRvIHN1Z2VyaWRvIHkgY3XDoW50byB0aWVtcG8gc3VlbGVuIGxsZXZhciBlbiBwZXJzb25hLiBMYSBtYXlvcsOtYSBzZSBwdWVkZSB1c2FyIGVuIG90cm9zIGZvcm1hdG9zLCBlbiBwYXJ0aWN1bGFyLCBzaSBlc3TDoSBsZXllbmRvIGVzdGUgbGlicm8gcG9yIHN1IGN1ZW50YSwgYcO6biBwdWVkZSBoYWNlciBtdWNob3MgZGUgbG9zIGVqZXJjaWNpb3MgZGVzdGluYWRvcyBhIGdydXBvcywgeSBzaWVtcHJlIHB1ZWRlIGRlZGljYXIgbcOhcyB0aWVtcG8gYSBsbyBxdWUgc2Ugc3VnaWVyZS4KClNpIGVzdMOhIHV0aWxpemFuZG8gZXN0ZSBtYXRlcmlhbCBlbiB1biB0YWxsZXIgZGUgY2FwYWNpdGFjacOzbiBkZSBtYWVzdHJvcywgcHVlZGUgZGFyIGxvcyBlamVyY2ljaW9zIGEgY29udGludWFjacOzbiBhIGxvcyBwYXJ0aWNpcGFudGVzIGNvbiB1bm8gbyBkb3MgZMOtYXMgZGUgYW50aWNpcGFjacOzbiBwYXJhIHRlbmVyIHVuYSBpZGVhIGRlIHF1acOpbmVzIHNvbiB5IGPDs21vIHB1ZWRlIGF5dWRhcmxvcyBtZWpvci4gTGVhIGxhcyBhZHZlcnRlbmNpYXMgZW4gbGEgU2VjY2nDs24gOS40IGFudGVzIGRlIGhhY2VyIGVzdG8uCgojIyMgQWx0YXMgeSBiYWphcyAodG9kYSBsYSBjbGFzZSAvIDUpCkVzY3JpYmEgcmVzcHVlc3RhcyBicmV2ZXMgYSBsYXMgc2lndWllbnRlcyBwcmVndW50YXMgeSBjb21ww6FydGFsYXMgY29uIHN1cyBjb21wYcOxZXJvcy4gKFNpIGVzdMOhIHRvbWFuZG8gbm90YXMganVudGFzIGVuIGzDrW5lYSBjb21vIHNlIGRlc2NyaWJlIGVuIGxhIFNlY2Npw7NuIDkuNywgcG9uZ2Egc3VzIHJlc3B1ZXN0YXMgYWxsw60pLgoKwr9DdcOhbCBlcyBsYSBtZWpvciBjbGFzZSBvIHRhbGxlciBxdWUgaGF5YXMgdG9tYWRvPyDCv1F1w6kgbG8gaGl6byB0YW4gYnVlbm8/CgrCv0N1w6FsIGZ1ZSBlbCBwZW9yPyDCv1F1w6kgbG8gaGl6byB0YW4gbWFsbz8KCgojIyMgQ29uw7NjZXRlIGEgdGkgbWlzbW8gKHRvZGEgbGEgY2xhc2UgLyAxMCkKQ29tcGFydGEgYnJldmVzIHJlc3B1ZXN0YXMgYSBsYXMgc2lndWllbnRlcyBwcmVndW50YXMgY29uIHN1cyBjb21wYcOxZXJvcy4gUmVnaXN0cmUgc3VzIHJlc3B1ZXN0YXMgcGFyYSBxdWUgcHVlZGEgY29uc3VsdGFybGFzIGEgbWVkaWRhIHF1ZSBhdmFuY2UgZW4gZWwgcmVzdG8gZGUgZXN0ZSBsaWJyby4KCsK/UXXDqSBlcyBsbyBxdWUgbcOhcyBxdWllcmVzIGVuc2XDsWFyPwoKwr9BIHF1acOpbiBtw6FzIHF1aWVyZXMgZW5zZcOxYXI/CgrCv1BvciBxdcOpIHF1aWVyZXMgZW5zZcOxYXI/CgrCv0PDs21vIHNhYnLDoXMgc2kgZXN0w6FzIGVuc2XDsWFuZG8gYmllbj8KCsK/UXXDqSBlcyBsbyBxdWUgbcOhcyBxdWllcmVzIGFwcmVuZGVyIHNvYnJlIGxhIGVuc2XDsWFuemEgeSBlbCBhcHJlbmRpemFqZT8KCsK/Q3XDoWwgZXMgdW5hIGNvc2EgZXNwZWPDrWZpY2EgcXVlIGNyZWVzIHF1ZSBlcyB2ZXJkYWQgYWNlcmNhIGRlIGxhIGVuc2XDsWFuemEgeSBlbCBhcHJlbmRpemFqZT8KCgojIyMgwr9Qb3IgcXXDqSBhcHJlbmRlciBhIHByb2dyYW1hcj8gKGluZGl2aWR1YWwgLyAyMCkKTG9zIHBvbMOtdGljb3MsIGxvcyBsw61kZXJlcyBlbXByZXNhcmlhbGVzIHkgbG9zIGVkdWNhZG9yZXMgYSBtZW51ZG8gZGljZW4gcXVlIGxhcyBwZXJzb25hcyBkZWJlcsOtYW4gYXByZW5kZXIgYSBwcm9ncmFtYXIgcG9ycXVlIGxvcyB0cmFiYWpvcyBkZWwgZnV0dXJvIGxvIHJlcXVlcmlyw6FuLiBTaW4gZW1iYXJnbywgY29tbyBzZcOxYWzDsyBCZW5qYW1pbiBEb3h0ZGF0b3IsIG11Y2hhcyBkZSBlc2FzIGFmaXJtYWNpb25lcyBzZSBiYXNhbiBlbiB1biB0ZXJyZW5vIGluZXN0YWJsZS4gSW5jbHVzbyBzaSBmdWVyYW4gY2llcnRhcywgbGEgZWR1Y2FjacOzbiBubyBkZWJlcsOtYSBwcmVwYXJhciBhIGxhcyBwZXJzb25hcyBwYXJhIGxvcyB0cmFiYWpvcyBkZWwgZnV0dXJvOiBkZWJlcsOtYSBkYXJsZXMgZWwgcG9kZXIgZGUgZGVjaWRpciBxdcOpIHRpcG8gZGUgdHJhYmFqb3MgaGF5IHkgZ2FyYW50aXphciBxdWUgZXNvcyB0cmFiYWpvcyB2YWxnYW4gbGEgcGVuYS4gWSBjb21vIHNlw7FhbGEgTWFyayBHdXpkaWFsLCBlbiByZWFsaWRhZCBoYXkgbXVjaGFzIHJhem9uZXMgcGFyYSBhcHJlbmRlciBhIHByb2dyYW1hcjoKCjEuIFBhcmEgZW50ZW5kZXIgbnVlc3RybyBtdW5kby4KCjIuIEVzdHVkaWFyIHkgY29tcHJlbmRlciBwcm9jZXNvcy4KCjMuIFBvZGVyIGhhY2VyIHByZWd1bnRhcyBzb2JyZSBsYXMgaW5mbHVlbmNpYXMgZW4gc3VzIHZpZGFzLgoKNC4gVXNhciB1bmEgbnVldmEgZm9ybWEgaW1wb3J0YW50ZSBkZSBhbGZhYmV0aXphY2nDs24uCgo1LiBUZW5lciB1bmEgbnVldmEgZm9ybWEgZGUgYXByZW5kZXIgYXJ0ZSwgbcO6c2ljYSwgY2llbmNpYXMgeSBtYXRlbcOhdGljYXMuCgo2LiBDb21vIHVuYSBoYWJpbGlkYWQgbGFib3JhbC4KCjcuIFBhcmEgdXNhciBtZWpvciBsYXMgY29tcHV0YWRvcmFzLgoKOC4gQ29tbyBtZWRpbyBwYXJhIGFwcmVuZGVyIGEgcmVzb2x2ZXIgcHJvYmxlbWFzLgoKRGlidWplIHVuYSBjdWFkcsOtY3VsYSBkZSAzIMOXIDMgY3V5b3MgZWplcyBlc3TDqW4gZXRpcXVldGFkb3MgY29tbyAiYmFqbyIsICJtZWRpbyIgeSAiYWx0byIgeSBjb2xvcXVlIGNhZGEgcmF6w7NuIGVuIHVuIHNlY3RvciBkZSBhY3VlcmRvIGNvbiBsbyBpbXBvcnRhbnRlIHF1ZSBlcyBwYXJhIHVzdGVkIChlbCBlamUgWCkgeSBwYXJhIGxhcyBwZXJzb25hcyBxdWUgcGxhbmVhIGVuc2XDsWFyLiAoZWwgZWplIFkpLgoKMS4gwr9RdcOpIHB1bnRvcyBlc3TDoW4gZXN0cmVjaGFtZW50ZSBhbGluZWFkb3MgZW4gaW1wb3J0YW5jaWEgKGVzIGRlY2lyLCBlbiBsYSBkaWFnb25hbCBlbiBzdSBjdWFkcsOtY3VsYSk/CgoyLiDCv1F1w6kgcHVudG9zIGVzdMOhbiBkZXNhbGluZWFkb3MgKGVzIGRlY2lyLCBlbiBsYXMgZXNxdWluYXMgZnVlcmEgZGUgbGEgZGlhZ29uYWwpPwoKMy4gwr9Dw7NtbyBkZWJlcsOtYSBhZmVjdGFyIGVzdG8gbG8gcXVlIGVuc2XDsWFzPwoKCiMgTW9kZWxvcyBtZW50YWxlcyB5IGV2YWx1YWNpw7NuIGZvcm1hdGl2YQpMYSBwcmltZXJhIHRhcmVhIGVuIGxhIGVuc2XDsWFuemEgZXMgZGVzY3VicmlyIHF1acOpbmVzIHNvbiBzdXMgYWx1bW5vcy4gTnVlc3RybyBlbmZvcXVlIHNlIGJhc2EgZW4gZWwgdHJhYmFqbyBkZSBpbnZlc3RpZ2Fkb3JlcyBjb21vIFBhdHJpY2lhIEJlbm5lciwgcXVpZW5lcyBlc3R1ZGlhcm9uIGPDs21vIGxhcyBlbmZlcm1lcmFzIHByb2dyZXNhbiBkZSBwcmluY2lwaWFudGVzIGEgZXhwZXJ0b3MgW0Jlbm4yMDAwXS4gQmVubmVyIGlkZW50aWZpY8OzIGNpbmNvIGV0YXBhcyBkZSBkZXNhcnJvbGxvIGNvZ25pdGl2byBxdWUgbGEgbWF5b3LDrWEgZGUgbGFzIHBlcnNvbmFzIGF0cmF2aWVzYW4gZGUgbWFuZXJhIGJhc3RhbnRlIGNvbnNpc3RlbnRlLiBQYXJhIG51ZXN0cm9zIHByb3DDs3NpdG9zLCBzaW1wbGlmaWNhcmVtb3MgZXN0YSBwcm9ncmVzacOzbiBhIHRyZXMgZXRhcGFzOgoKIyMjIE5vdmljaW9zCk5vIHNhYmVuIGxvIHF1ZSBubyBzYWJlbiwgZXMgZGVjaXIsIHRvZGF2w61hIG5vIHRpZW5lbiB1biBtb2RlbG8gbWVudGFsIHV0aWxpemFibGUgZGVsIGRvbWluaW8gZGVsIHByb2JsZW1hLgoKIyMjIFByYWN0aWNhbnRlcyBjb21wZXRlbnRlcwp0ZW5lciB1biBtb2RlbG8gbWVudGFsIHF1ZSBzZWEgYWRlY3VhZG8gcGFyYSBsb3MgcHJvcMOzc2l0b3MgY290aWRpYW5vcy4gUHVlZGVuIHJlYWxpemFyIHRhcmVhcyBub3JtYWxlcyBjb24gdW4gZXNmdWVyem8gbm9ybWFsIGVuIGNpcmN1bnN0YW5jaWFzIG5vcm1hbGVzIHkgY29tcHJlbmRlciBsb3MgbMOtbWl0ZXMgZGUgc3UgY29ub2NpbWllbnRvIChlcyBkZWNpciwgc2FiZW4gbG8gcXVlIG5vIHNhYmVuKS4KCiMjIyBFeHBlcnRvcwp0aWVuZW4gbW9kZWxvcyBtZW50YWxlcyBxdWUgaW5jbHV5ZW4gZXhjZXBjaW9uZXMgeSBjYXNvcyBlc3BlY2lhbGVzLCBsbyBxdWUgbGVzIHBlcm1pdGUgbWFuZWphciBzaXR1YWNpb25lcyBxdWUgZXN0w6FuIGZ1ZXJhIGRlIGxvIGNvbcO6bi4gRGlzY3V0aXJlbW9zIGxhIGV4cGVyaWVuY2lhIGNvbiBtw6FzIGRldGFsbGUgZW4gZWwgQ2Fww610dWxvIDMuCgpFbnRvbmNlcywgwr9xdcOpIGVzIHVuICoqbW9kZWxvIG1lbnRhbCoqPyBDb21vIHN1IG5vbWJyZSBpbmRpY2EsIGVzIHVuYSByZXByZXNlbnRhY2nDs24gc2ltcGxpZmljYWRhIGRlIGxhcyBwYXJ0ZXMgbcOhcyBpbXBvcnRhbnRlcyBkZSBhbGfDum4gZG9taW5pbyBkZSBwcm9ibGVtYXMgcXVlIGVzIGxvIHN1ZmljaWVudGVtZW50ZSBidWVuYSBjb21vIHBhcmEgcGVybWl0aXIgbGEgcmVzb2x1Y2nDs24gZGUgcHJvYmxlbWFzLiBVbiBlamVtcGxvIHNvbiBsb3MgbW9kZWxvcyBkZSBtb2zDqWN1bGFzIGRlIGJvbGEgeSByZXNvcnRlIHV0aWxpemFkb3MgZW4gbGEgcXXDrW1pY2EgZGUgbGEgZXNjdWVsYSBzZWN1bmRhcmlhLiBMb3Mgw6F0b21vcyBubyBzb24gZW4gcmVhbGlkYWQgYm9sYXMsIHkgc3VzIGVubGFjZXMgbm8gc29uIGVuIHJlYWxpZGFkIHJlc29ydGVzLCBwZXJvIGVsIG1vZGVsbyBwZXJtaXRlIGEgbGFzIHBlcnNvbmFzIHJhem9uYXIgc29icmUgbG9zIGNvbXB1ZXN0b3MgcXXDrW1pY29zIHkgc3VzIHJlYWNjaW9uZXMuIFVuIG1vZGVsbyBtw6FzIHNvZmlzdGljYWRvIGRlIHVuIMOhdG9tbyB0aWVuZSB1bmEgcGVxdWXDsWEgYm9sYSBjZW50cmFsIChlbCBuw7pjbGVvKSByb2RlYWRhIGRlIGVsZWN0cm9uZXMgZW4gw7NyYml0YS4gVGFtYmnDqW4gZXN0w6EgbWFsLCBwZXJvIGxhIGNvbXBsZWppZGFkIGFkaWNpb25hbCBwZXJtaXRlIGEgbGFzIHBlcnNvbmFzIGV4cGxpY2FyIG3DoXMgeSByZXNvbHZlciBtw6FzIHByb2JsZW1hcy4gKEFsIGlndWFsIHF1ZSBlbCBzb2Z0d2FyZSwgbG9zIG1vZGVsb3MgbWVudGFsZXMgbnVuY2Egc2UgdGVybWluYW46IHNvbG8gc2UgdXNhbikuCgpQcmVzZW50YXIgYSB1biBub3ZhdG8gY29uIHVuIG1vbnTDs24gZGUgaGVjaG9zIGVzIGNvbnRyYXByb2R1Y2VudGUgcG9ycXVlIHRvZGF2w61hIG5vIHRpZW5lbiB1biBtb2RlbG8gcGFyYSBlbmNhamFyIGVzb3MgaGVjaG9zLiBEZSBoZWNobywgcHJlc2VudGFyIGRlbWFzaWFkb3MgaGVjaG9zIGRlbWFzaWFkbyBwcm9udG8gcHVlZGUgcmVmb3J6YXIgZWwgbW9kZWxvIG1lbnRhbCBpbmNvcnJlY3RvIHF1ZSBoYW4gaW1wcm92aXNhZG8uIENvbW8gW011bGwyMDA3YV0gb2JzZXJ2w7MgZW4gdW4gZXN0dWRpbyBkZSBpbnN0cnVjY2nDs24gZW4gdmlkZW8gcGFyYSBlc3R1ZGlhbnRlcyBkZSBjaWVuY2lhczoKCgo+IExvcyBlc3R1ZGlhbnRlcyB0aWVuZW4gaWRlYXMgZXhpc3RlbnRlcyBzb2JyZSAuLi4gZmVuw7NtZW5vcyBhbnRlcyBkZSB2ZXIgdW4gdmlkZW8uIFNpIGVsIHZpZGVvIHByZXNlbnRhIC4uLiBjb25jZXB0b3MgZGUgdW5hIG1hbmVyYSBjbGFyYSB5IGJpZW4gaWx1c3RyYWRhLCBsb3MgZXN0dWRpYW50ZXMgY3JlZW4gcXVlIGVzdMOhbiBhcHJlbmRpZW5kbywgcGVybyBubyBzZSBpbnZvbHVjcmFuIGNvbiBsb3MgbWVkaW9zIGVuIHVuIG5pdmVsIGxvIAo+IHN1ZmljaWVudGVtZW50ZSBwcm9mdW5kbyBjb21vIHBhcmEgZGFyc2UgY3VlbnRhIGRlIHF1ZSBsbyBxdWUgc2UgcHJlc2VudGEgZGlmaWVyZSBkZSBzdSBjb25vY2ltaWVudG8gcHJldmlvIC4uLiBTaW4gZW1iYXJnbywgaGF5IGVzcGVyYW56YS4gUHJlc2VudGFyIGxvcyBjb25jZXB0b3MgZXJyw7NuZW9zIGNvbXVuZXMgZGUgbG9zIGVzdHVkaWFudGVzIGVuIHVuIHZpZGVvIGp1bnRvIGNvbiBsb3MgLi4uIGNvbmNlcHRvcyBoYSBkZW1vc3RyYWRvIAo+IHF1ZSBhdW1lbnRhIGVsIGFwcmVuZGl6YWplIGFsIGF1bWVudGFyIGxhIGNhbnRpZGFkIGRlIGVzZnVlcnpvIG1lbnRhbCBxdWUgbG9zIGVzdHVkaWFudGVzIGdhc3RhbiBtaWVudHJhcyBsbyB2ZW4uCgpQb3IgbG8gdGFudG8sIHN1IG9iamV0aXZvIGFsIGVuc2XDsWFyIGEgbG9zIG5vdmF0b3MgZGViZSBzZXIgYXl1ZGFybG9zIGEgY29uc3RydWlyIHVuIG1vZGVsbyBtZW50YWwgcGFyYSBxdWUgdGVuZ2FuIHVuIGx1Z2FyIGRvbmRlIHBvbmVyIGxvcyBoZWNob3MuIFBvciBlamVtcGxvLCBsYSBsZWNjacOzbiBkZSBTb2Z0d2FyZSBDYXJwZW50cnkgc29icmUgZWwgc2hlbGwgZGUgVW5peCBpbnRyb2R1Y2UgcXVpbmNlIGNvbWFuZG9zIGVuIHRyZXMgaG9yYXMuIEVzZSBlcyB1biBjb21hbmRvIGNhZGEgZG9jZSBtaW51dG9zLCBxdWUgcGFyZWNlIGdsYWNpYWxtZW50ZSBsZW50byBoYXN0YSBxdWUgdGUgZGFzIGN1ZW50YSBkZSBxdWUgZWwgdmVyZGFkZXJvIHByb3DDs3NpdG8gZGUgbGEgbGVjY2nDs24gbm8gZXMgZW5zZcOxYXIgZXNvcyBxdWluY2UgY29tYW5kb3M6IGVzIGVuc2XDsWFyIHJ1dGFzLCBoaXN0b3JpYSwgZmluYWxpemFjacOzbiBkZSB0YWJ1bGFjaW9uZXMsIGNvbW9kaW5lcywgdHViZXLDrWFzLCBhcmd1bWVudG9zIGRlIGzDrW5lYSBkZSBjb21hbmRvcyB5IHJlZGlyZWNjacOzbi4gTG9zIGNvbWFuZG9zIGVzcGVjw61maWNvcyBubyB0aWVuZW4gc2VudGlkbyBoYXN0YSBxdWUgbG9zIG5vdmF0b3MgZW50aWVuZGFuIGVzb3MgY29uY2VwdG9zOyBVbmEgdmV6IHF1ZSBsbyBoYWNlbiwgcHVlZGVuIGNvbWVuemFyIGEgbGVlciBsYXMgcMOhZ2luYXMgZGVsIG1hbnVhbCwgYnVzY2FyIGxhcyBwYWxhYnJhcyBjbGF2ZSBjb3JyZWN0YXMgZW4gbGEgd2ViIHkgc2FiZXIgc2kgbG9zIHJlc3VsdGFkb3MgZGUgc3VzIGLDunNxdWVkYXMgc29uIMO6dGlsZXMgbyBuby4KCkxhcyBkaWZlcmVuY2lhcyBjb2duaXRpdmFzIGVudHJlIGxvcyBwcmluY2lwaWFudGVzIHkgbG9zIHByb2Zlc2lvbmFsZXMgY29tcGV0ZW50ZXMgYXB1bnRhbGFuIGxhcyBkaWZlcmVuY2lhcyBlbnRyZSBkb3MgdGlwb3MgZGUgbWF0ZXJpYWxlcyBkaWTDoWN0aWNvcy4gVW4gdHV0b3JpYWwgYXl1ZGEgYSBsb3MgcmVjacOpbiBsbGVnYWRvcyBhIHVuIGNhbXBvIGEgY29uc3RydWlyIHVuIG1vZGVsbyBtZW50YWw7IHVuIG1hbnVhbCwgcG9yIG90cm8gbGFkbywgYXl1ZGEgYSBsb3MgcHJvZmVzaW9uYWxlcyBjb21wZXRlbnRlcyBhIGxsZW5hciBsb3MgdmFjw61vcyBlbiBzdSBjb25vY2ltaWVudG8uIExvcyB0dXRvcmlhbGVzIGZydXN0cmFuIGEgbG9zIHByb2Zlc2lvbmFsZXMgY29tcGV0ZW50ZXMgcG9ycXVlIHNlIG11ZXZlbiBtdXkgbGVudGFtZW50ZSB5IGRpY2VuIGNvc2FzIHF1ZSBzb24gb2J2aWFzIChhdW5xdWUgcGFyYSBsb3MgcHJpbmNpcGlhbnRlcyBubyBzb24gb2J2aWFzKSBJZ3VhbG1lbnRlLCBsb3MgbWFudWFsZXMgZnJ1c3RyYW4gYSBsb3MgcHJpbmNpcGlhbnRlcyBwb3JxdWUgdXNhbiBqZXJnYSB5IG5vIGV4cGxpY2FuIGxhcyBjb3Nhcy4gRXN0ZSBmZW7Ds21lbm8gc2UgbGxhbWEgZWZlY3RvIGRlIHJldmVyc2nDs24gZGUgZXhwZXJpZW5jaWEgW0thbHkyMDAzXSwgeSBlcyB1bmEgZGUgbGFzIHJhem9uZXMgcG9yIGxhcyBxdWUgdGllbmUgcXVlIGRlY2lkaXIgdGVtcHJhbm8gcGFyYSBxdWnDqW4gc29uIHN1cyBsZWNjaW9uZXMuCgoKPiAjIyMjIFVuIHB1w7FhZG8gZGUgZXhjZXBjaW9uZXMKPiBVbmEgZGUgbGFzIHJhem9uZXMgcG9yIGxhcyBxdWUgVW5peCB5IEMgc2UgaGljaWVyb24gcG9wdWxhcmVzIGVzIHF1ZSBbS2VybjE5NzgsIEtlcm4xOTgzLCBLZXJuMTk4OF0gZGUgYWxndW5hIG1hbmVyYSBzZSBsYXMgYXJyZWdsYXJvbiBwYXJhIHNlciAgYnVlbm9zIHR1dG9yaWFsZXMgeSBidWVub3MgbWFudWFsZXMgYWwgbWlzbW8gdGllbXBvLiBbRmVoaTIwMDhdIHkgW1JheTIwMTRdIHNlIGVuY3VlbnRyYW4gZW50cmUgbG9zIHBvY29zIGxpYnJvcyBkZSBjb21wdXRhY2nDs24gcXVlIGxvZ3JhbiBlc3RhOyAgaW5jbHVzbyBkZXNwdcOpcyBkZSByZWxlZXJsb3MgdmFyaWFzIHZlY2VzLCBubyBzw6kgY8OzbW8gbG8gbG9ncmFyb24uCgoKIyMgwr9Fc3TDoW4gYXByZW5kaWVuZG8gbGFzIHBlcnNvbmFzPwpNYXJrIFR3YWluIGVzY3JpYmnDsyB1bmEgdmV6OiAiTm8gZXMgbG8gcXVlIG5vIHNhYmVzIGxvIHF1ZSB0ZSBtZXRlIGVuIHByb2JsZW1hcy4gRXMgbG8gcXVlIHNhYmVzIGNvbiBjZXJ0ZXphIHF1ZSBubyBlcyBhc8OtICIuIFBvciBsbyB0YW50bywgdW5vIGRlIGxvcyBlamVyY2ljaW9zIHBhcmEgY29uc3RydWlyIHVuIG1vZGVsbyBtZW50YWwgZXMgZWxpbWluYXIgbGFzIGNvc2FzIHF1ZSBubyBwZXJ0ZW5lY2VuLiBFbiB0w6lybWlub3MgZ2VuZXJhbGVzLCBsb3MgY29uY2VwdG9zIGVycsOzbmVvcyBkZSBsb3Mgbm92YXRvcyBzZSBkaXZpZGVuIGVuIHRyZXMgY2F0ZWdvcsOtYXM6CgoqKkVycm9yZXMgZGUgaGVjaG8qKgpDb21vIGNyZWVyIHF1ZSBWYW5jb3V2ZXIgZXMgbGEgY2FwaXRhbCBkZSBsYSBDb2x1bWJpYSBCcml0w6FuaWNhIChlcyBWaWN0b3JpYSkuIEVzdG9zIHN1ZWxlbiBzZXIgZsOhY2lsZXMgZGUgY29ycmVnaXIuCgoqKk1vZGVsb3Mgcm90b3MqKgpDb21vIGNyZWVyIHF1ZSBlbCBtb3ZpbWllbnRvIHkgbGEgYWNlbGVyYWNpw7NuIGRlYmVuIGVzdGFyIGVuIGxhIG1pc21hIGRpcmVjY2nDs24uIFBvZGVtb3MgYWJvcmRhciBlc3RvIGhhY2llbmRvIHF1ZSBsb3Mgbm92YXRvcyByYXpvbmVuIGEgdHJhdsOpcyBkZSBlamVtcGxvcyBlbiBsb3MgcXVlIHN1cyBtb2RlbG9zIGRhbiBsYSByZXNwdWVzdGEgaW5jb3JyZWN0YS4KCioqQ3JlZW5jaWFzIGZ1bmRhbWVudGFsZXMqKgpDb21vICJlbCBtdW5kbyB0aWVuZSBzb2xvIHVub3MgcG9jb3MgbWlsZXMgZGUgYcOxb3MiIG8gImFsZ3Vub3MgdGlwb3MgZGUgcGVyc29uYXMgc29uIG5hdHVyYWxtZW50ZSBtZWpvcmVzIGVuIHByb2dyYW1hY2nDs24gcXVlIG90cm9zIiBbR3V6ZDIwMTViLCBQYXRpMjAxNl0uIEVzdG9zIGVycm9yZXMgYSBtZW51ZG8gZXN0w6FuIHByb2Z1bmRhbWVudGUgY29uZWN0YWRvcyBjb24gbGEgaWRlbnRpZGFkIHNvY2lhbCBkZWwgYWx1bW5vLCBwb3IgbG8gcXVlIHJlc2lzdGVuIGxhIGV2aWRlbmNpYSB5IHJhY2lvbmFsaXphbiBsYXMgY29udHJhZGljY2lvbmVzLgoKCkxhcyBwZXJzb25hcyBhcHJlbmRlbiBtw6FzIHLDoXBpZG8gY3VhbmRvIGxvcyBtYWVzdHJvcyBpZGVudGlmaWNhbiB5IGFjbGFyYW4gbGFzIGlkZWFzIGZhbHNhcyBkZSBsb3MgYWx1bW5vcyBhIG1lZGlkYSBxdWUgc2UgaW1wYXJ0ZSBsYSBsZWNjacOzbi4gRXN0byBzZSBsbGFtYSAqKmV2YWx1YWNpw7NuIGZvcm1hdGl2YSoqIHBvcnF1ZSBmb3JtYSAobyBtb2xkZWEpIGxhIGVuc2XDsWFuemEgbWllbnRyYXMgc2UgbGxldmEgYSBjYWJvLiBMb3MgYWx1bW5vcyBubyBhcHJ1ZWJhbiBuaSByZXByb2JhbiBsYSBldmFsdWFjacOzbiBmb3JtYXRpdmE7IGVuIHN1IGx1Z2FyLCBicmluZGEgcmV0cm9hbGltZW50YWNpw7NuIHRhbnRvIGFsIG1hZXN0cm8gY29tbyBhbCBhbHVtbm8gc29icmUgcXXDqSB0YW4gYmllbiBsbyBlc3TDoW4gaGFjaWVuZG8geSBlbiBxdcOpIGRlYmVuIGVuZm9jYXJzZSBhIGNvbnRpbnVhY2nDs24uIFBvciBlamVtcGxvLCB1biBwcm9mZXNvciBkZSBtw7pzaWNhIHBvZHLDrWEgcGVkaXJsZSBhIHVuIGFsdW1ubyBxdWUgdG9xdWUgdW5hIGVzY2FsYSBtdXkgbGVudGFtZW50ZSBwYXJhIGNvbnRyb2xhciBzdSByZXNwaXJhY2nDs24uIEVsIGFsdW1ubyBkZXNjdWJyZSBzaSBlc3TDoSByZXNwaXJhbmRvIGNvcnJlY3RhbWVudGUsIG1pZW50cmFzIHF1ZSBlbCBtYWVzdHJvIHJlY2liZSBjb21lbnRhcmlvcyBzb2JyZSBzaSBsYSBleHBsaWNhY2nDs24gcXVlIGFjYWJhIGRlIGRhciB0aWVuZSBzZW50aWRvLgoKCiMjIyDCv0VzdMOhbiBhcHJlbmRpZW5kbyBsYXMgcGVyc29uYXM/Ck1hcmsgVHdhaW4gZXNjcmliacOzIHVuYSB2ZXo6ICJObyBlcyBsbyBxdWUgbm8gc2FiZXMgbG8gcXVlIHRlIG1ldGUgZW4gcHJvYmxlbWFzLiBFcyBsbyBxdWUgc2FiZXMgY29uIGNlcnRlemEgcXVlIG5vIGVzIGFzw60gIi4gUG9yIGxvIHRhbnRvLCB1bm8gZGUgbG9zIGVqZXJjaWNpb3MgcGFyYSBjb25zdHJ1aXIgdW4gbW9kZWxvIG1lbnRhbCBlcyBlbGltaW5hciBsYXMgY29zYXMgcXVlIG5vIHBlcnRlbmVjZW4uIEVuIHTDqXJtaW5vcyBnZW5lcmFsZXMsIGxvcyBjb25jZXB0b3MgZXJyw7NuZW9zIGRlIGxvcyBub3ZhdG9zIHNlIGRpdmlkZW4gZW4gdHJlcyBjYXRlZ29yw61hczoKCj4gKipSZXN1bWllbmRvKioKPgo+RWwgY29udHJhcHVudG8gYSBsYSBldmFsdWFjacOzbiBmb3JtYXRpdmEgZXMgbGEgZXZhbHVhY2nDs24gc3VtYXRpdmEsIHF1ZSB0aWVuZSBsdWdhciBhbCBmaW5hbCBkZSBsYSBsZWNjacOzbi4gTGEgZXZhbHVhY2nDs24gc3VtYXRpdmEgZXMgY29tbyB1bmEgcHJ1ZWJhIGRlIG1hbmVqbzogbGUgZGljZSBhbCBhbHVtbm8gc2kgaGEgZG9taW5hZG8gZWwgdGVtYSB5IGFsIG1hZXN0cm8gc2kgc3UgbGVjY2nDs24gZnVlIGV4aXRvc2EuIFVuYSBmb3JtYSBkZSBwZW5zYXIgZW4gbGEgZGlmZXJlbmNpYSBlcyBxdWUgdW4gY2hlZiBxdWUgcHJ1ZWJhIGxhIGNvbWlkYSBtaWVudHJhcyBsYSBjb2NpbmEgZXMgZXZhbHVhY2lvbmVzIGZvcm1hdGl2YXMsIHBlcm8gbG9zIGludml0YWRvcyBxdWUgbGEgcHJ1ZWJhbiB1bmEgdmV6IHF1ZSBzZSBzaXJ2ZSBlcyBzdW1hdGl2YS4KPgo+RGVzYWZvcnR1bmFkYW1lbnRlLCBsYSBlc2N1ZWxhIGhhIGNhcGFjaXRhZG8gYSBsYSBtYXlvcsOtYSBkZSBsYXMgcGVyc29uYXMgcGFyYSBxdWUgY3JlYW4gcXVlIHRvZGEgZXZhbHVhY2nDs24gZXMgc3VtYXRpdmEsIGVzIGRlY2lyLCBxdWUgc2kgYWxnbyBzZSBzaWVudGUgY29tbyB1bmEgcHJ1ZWJhLCB1biBtYWwgZGVzZW1wZcOxbyBjb250YXLDoSBlbiBzdSBjb250cmEuIEhhY2VyIHF1ZSBsYXMgZXZhbHVhY2lvbmVzIGZvcm1hdGl2YXMgc2Ugc2llbnRhbiBpbmZvcm1hbGVzIGF5dWRhIGEgcmVkdWNpciBlc3RhIGFuc2llZGFkOyBFbiBtaSBleHBlcmllbmNpYSwgZWwgdXNvIGRlIGN1ZXN0aW9uYXJpb3MgZW4gbMOtbmVhLCBjbGljcyBvIGN1YWxxdWllciBvdHJhIGNvc2EgcGFyZWNlIGF1bWVudGFybG8sIHlhIHF1ZSBsYSBtYXlvcsOtYSBkZSBsYXMgcGVyc29uYXMgY3JlZW4gcXVlIHRvZG8gbG8gcXVlIGhhY2VuIGVuIGxhIHdlYiBzZSBlc3TDoSB2aWVuZG8geSBncmFiYW5kby4KCgpQYXJhIHNlciDDunRpbCBkdXJhbnRlIGxhIGVuc2XDsWFuemEsIHVuYSBldmFsdWFjacOzbiBmb3JtYXRpdmEgZGViZSBzZXIgcsOhcGlkYSBkZSBhZG1pbmlzdHJhciAocGFyYSBxdWUgbm8gaW50ZXJydW1wYSBlbCBmbHVqbyBkZSBsYSBsZWNjacOzbikgeSB0ZW5lciB1bmEgcmVzcHVlc3RhIGNvcnJlY3RhIGluZXF1w612b2NhIChwYXJhIHF1ZSBwdWVkYSB1c2Fyc2UgY29uIGdydXBvcykuIEVsIHRpcG8gZGUgZXZhbHVhY2nDs24gZm9ybWF0aXZhIG3DoXMgdXRpbGl6YWRvIGVzIHByb2JhYmxlbWVudGUgbGEgcHJlZ3VudGEgZGUgb3BjacOzbiBtw7psdGlwbGUgKE1DUSkuIE11Y2hvcyBtYWVzdHJvcyB0aWVuZW4gdW5hIGJhamEgb3BpbmnDs24gZGUgZWxsb3MsIHBlcm8gY3VhbmRvIGVzdMOhbiBiaWVuIGRpc2XDsWFkb3MsIHB1ZWRlbiByZXZlbGFyIG11Y2hvIG3DoXMgcXVlIHNvbG8gc2kgYWxndWllbiBjb25vY2UgaGVjaG9zIGVzcGVjw61maWNvcy4gUG9yIGVqZW1wbG8sIHN1cG9uZ2EgcXVlIGVzdMOhIGVuc2XDsWFuZG8gYSBsb3MgbmnDsW9zIGPDs21vIGhhY2VyIHVuYSBzdW1hIGRlIHZhcmlvcyBkw61naXRvcyBbT2pvczIwMTVdIHkgbGVzIGRhIGVzdGEgTUNROgoKCj4gKipXaGF0IGlzIDM3ICsgMTU/KioKPgo+YSkgNTIKPmIpIDQyCj5jKSA0MTIKPmQpIDQzCgoKTGEgcmVzcHVlc3RhIGNvcnJlY3RhIGVzIDUyLCBwZXJvIGxhcyBvdHJhcyByZXNwdWVzdGFzIHByb3BvcmNpb25hbiBpbmZvcm1hY2nDs24gdmFsaW9zYToKCiogU2kgZWwgbmnDsW8gZWxpZ2UgNDIsIG5vIGVudGllbmRlIGxvIHF1ZSBzaWduaWZpY2EgImNhcmdhciIuIChFbGxhIGJpZW4gcG9kcsOtYSBlc2NyaWJpciAxMiBjb21vIGxhcyByZXNwdWVzdGFzIGEgNyArIDUsIGx1ZWdvIHNvYnJlc2NyaWJpciBlbCAxIGNvbiBlbCA0IHF1ZSBvYnRpZW5lIGRlIDMgKyAxKS4KCiogU2kgZWxpZ2UgNDEyLCBlc3TDoSB0cmF0YW5kbyBjYWRhIGNvbHVtbmEgZGUgbsO6bWVyb3MgY29tbyB1biBwcm9ibGVtYSBzZXBhcmFkby4gRXN0byB0b2RhdsOtYSBlc3TDoSBtYWwsIHBlcm8gZXN0w6EgbWFsIHBvciB1bmEgcmF6w7NuIGRpZmVyZW50ZS4KCiogU2kgZWxpZ2UgNDMsIGVudG9uY2VzIHNhYmUgcXVlIHRpZW5lIHF1ZSBjYXJnYXIgZWwgMSwgcGVybyBsbyBlc3TDoSBsbGV2YW5kbyBkZSB2dWVsdGEgYSBsYSBjb2x1bW5hIGRlIGxhIHF1ZSBwcm92aWVuZS4gTnVldmFtZW50ZSwgZXN0ZSBlcyB1biBlcnJvciBkaWZlcmVudGUgeSByZXF1aWVyZSB1bmEgZXhwbGljYWNpw7NuIGNsYXJpZmljYWRvcmEgZGlmZXJlbnRlIGRlbCBtYWVzdHJvLgoKQ2FkYSB1bmEgZGUgZXN0YXMgcmVzcHVlc3RhcyBpbmNvcnJlY3RhcyBlcyB1biBkaXN0cmFjdG9yIHBsYXVzaWJsZSBjb24gcG9kZXIgZGUgZGlhZ27Ds3N0aWNvLiBVbiBkaXN0cmFjdG9yIGVzIHVuYSByZXNwdWVzdGEgaW5jb3JyZWN0YSBvIG1lbm9zIHF1ZSBtZWpvcjsgIlBsYXVzaWJsZSIgc2lnbmlmaWNhIHF1ZSBwYXJlY2UgcXVlIHBvZHLDrWEgc2VyIGNvcnJlY3RvLCBtaWVudHJhcyBxdWUgInBvZGVyIGRlIGRpYWduw7NzdGljbyIgc2lnbmlmaWNhIHF1ZSBjYWRhIHVubyBkZSBsb3MgZGlzdHJhY3RvcmVzIGF5dWRhIGFsIG1hZXN0cm8gYSBkZXNjdWJyaXIgcXXDqSBleHBsaWNhciBqdW50byBhIGVzZSBhbHVtbm8gZW4gcGFydGljdWxhci4KCkxhIGRpZnVzacOzbiBkZSBsYXMgcmVzcHVlc3RhcyBhIHVuYSBldmFsdWFjacOzbiBmb3JtYXRpdmEgZ3XDrWEgbG8gcXVlIGhhY2VzIGEgY29udGludWFjacOzbi4gU2kgc3VmaWNpZW50ZSBkZSBsYSBjbGFzZSB0aWVuZSBsYSByZXNwdWVzdGEgY29ycmVjdGEsIHNpZ3VlIGFkZWxhbnRlLiBTaSBsYSBtYXlvcsOtYSBkZSBsYSBjbGFzZSBlbGlnZSBsYSBtaXNtYSByZXNwdWVzdGEgaW5jb3JyZWN0YSwgZGViZSByZWdyZXNhciB5IHRyYWJhamFyIHBhcmEgY29ycmVnaXIgZWwgZXJyb3IgcXVlIHNlw7FhbGEgZWwgZGlzdHJhY3Rvci4gU2kgc3VzIHJlc3B1ZXN0YXMgc2UgZGl2aWRlbiBlcXVpdGF0aXZhbWVudGUgZW50cmUgdmFyaWFzIG9wY2lvbmVzLCBwcm9iYWJsZW1lbnRlIHNvbG8gZXN0w6luIGFkaXZpbmFuZG8sIHBvciBsbyBxdWUgZGViZSByZXNwYWxkYXIgeSB2b2x2ZXIgYSBleHBsaWNhciBsYSBpZGVhIGRlIHVuYSBtYW5lcmEgZGlmZXJlbnRlLiAoUmVwZXRpciBleGFjdGFtZW50ZSBsYSBtaXNtYSBleHBsaWNhY2nDs24gcHJvYmFibGVtZW50ZSBubyBzZWEgw7p0aWwsIGxvIGN1YWwgZXMgdW5hIGRlIGxhcyBjb3NhcyBxdWUgaGFjZSBxdWUgbXVjaG9zIGN1cnNvcyBkZSB2aWRlbyBzZWFuIHBlZGFnw7NnaWNhbWVudGUgaW5lZmljYWNlcykuCgrCv1F1w6kgcGFzYSBzaSBsYSBtYXlvcsOtYSBkZSBsYSBjbGFzZSB2b3RhIHBvciBsYSByZXNwdWVzdGEgY29ycmVjdGEgcGVybyBhbGd1bm9zIHZvdGFuIHBvciBsYSBpbmNvcnJlY3RhPyBFbiBlc2UgY2FzbywgZGViZSBkZWNpZGlyIHNpIGRlYmUgcGFzYXIgdGllbXBvIGF0cmFwYW5kbyBhIGxhIG1pbm9yw61hIG8gc2kgZXMgbcOhcyBpbXBvcnRhbnRlIG1hbnRlbmVyIGEgbGEgbWF5b3LDrWEgY29tcHJvbWV0aWRhLiBObyBpbXBvcnRhIGN1w6FuIGR1cm8gdHJhYmFqZSBvIHF1w6kgcHLDoWN0aWNhcyBkZSBlbnNlw7FhbnphIHVzZSwgbm8gc2llbXByZSBwb2Ryw6EgYnJpbmRhciBhIHRvZG9zIGxvIHF1ZSBuZWNlc2l0YW47IGVzIHN1IHJlc3BvbnNhYmlsaWRhZCBjb21vIG1hZXN0cm8gaGFjZXIgbGEgbGxhbWFkYS4KCgoKCj4qKsK/RGUgZMOzbmRlIHZpZW5lbiBsYXMgcmVzcHVlc3RhcyBpbmNvcnJlY3Rhcz8qKgo+Cj5QYXJhIGVuY29udHJhciBkaXN0cmFjdG9yZXMgcGxhdXNpYmxlcywgcGllbnNlIGVuIGxhcyBwcmVndW50YXMgcXVlIGhpY2llcm9uIHN1cyBhbHVtbm9zIG8gZW4gbG9zIHByb2JsZW1hcyBxdWUgdHV2aWVyb24gbGEgw7psdGltYSB2ZXogcXVlIGVuc2XDscOzIGVzdGEgbWF0ZXJpYS4gU2kgbm8gbG8gaGEgZW5zZcOxYWRvIGFudGVzLCBwaWVuc2UgZW4gc3VzIHByb3Bpb3MgY29uY2VwdG9zIGVycsOzbmVvcywgcHJlZ3VudGUgYSBzdXMgY29sZWdhcyBzb2JyZSBzdXMgZXhwZXJpZW5jaWFzIG8gbWlyZSBsYSBoaXN0b3JpYSBkZSBzdSBjYW1wbzogc2kgdG9kb3MgZW50ZW5kaWVyb24gbWFsIHN1IHRlbWEgZGUgYWxndW5hIG1hbmVyYSBoYWNlIGNpbmN1ZW50YSBhw7FvcywgbG8gbcOhcyBwcm9iYWJsZSBlcyBxdWUgbXVjaG9zIGRlIHN1cyBsb3MgZXN0dWRpYW50ZXMgdG9kYXbDrWEgbG8gZW50ZW5kZXLDoW4gbWFsIGRlIGVzYSBtYW5lcmEgaG95LiBUYW1iacOpbiBwdWVkZSBoYWNlciBwcmVndW50YXMgYWJpZXJ0YXMgZW4gY2xhc2UgcGFyYSByZWNvcGlsYXIgaWRlYXMgZXJyw7NuZWFzIHNvYnJlIGVsIG1hdGVyaWFsIHF1ZSBzZSBjdWJyaXLDoSBlbiB1bmEgY2xhc2UgcG9zdGVyaW9yLCBvIGNvbnN1bHRhciBzaXRpb3MgZGUgcHJlZ3VudGFzIHkgcmVzcHVlc3RhcyBjb21vIFF1b3JhIG8gU3RhY2sgT3ZlcmZsb3cgcGFyYSB2ZXIgY29uIHF1w6kgc2UgY29uZnVuZGVuIGxhcyBwZXJzb25hcyBxdWUgYXByZW5kZW4gZWwgdGVtYSBlbiBvdHJhIHBhcnRlLgoKCkVsIGRlc2Fycm9sbG8gZGUgZXZhbHVhY2lvbmVzIGZvcm1hdGl2YXMgbWVqb3JhIHN1cyBsZWNjaW9uZXMgcG9ycXVlIGxvIG9ibGlnYSBhIHBlbnNhciBlbiBsb3MgbW9kZWxvcyBtZW50YWxlcyBkZSBzdXMgYWx1bW5vcy4gRW4gbWkgZXhwZXJpZW5jaWEsIHVuYSB2ZXogcXVlIGhhZ28gZXN0bywgZXNjcmlibyBhdXRvbcOhdGljYW1lbnRlIGxhIGxlY2Npw7NuIHBhcmEgY3VicmlyIGxvcyB2YWPDrW9zIHkgZXJyb3JlcyBtw6FzIHByb2JhYmxlcy4gUG9yIGxvIHRhbnRvLCBsYXMgZXZhbHVhY2lvbmVzIGZvcm1hdGl2YXMgZGFuIHN1cyBmcnV0b3MgaW5jbHVzbyBzaSBubyBzZSB1dGlsaXphbiAoYXVucXVlIGxhIGVuc2XDsWFuemEgZXMgbcOhcyBlZmVjdGl2YSBzaSBsbyBzb24pLgoKTGFzIE1DUSBubyBzb24gZWwgw7puaWNvIHRpcG8gZGUgZXZhbHVhY2nDs24gZm9ybWF0aXZhOiBlbCBDYXDDrXR1bG8gMTIgZGVzY3JpYmUgb3Ryb3MgdGlwb3MgZGUgZWplcmNpY2lvcyBxdWUgc29uIHLDoXBpZG9zIGUgaW5lcXXDrXZvY29zLiBMbyBxdWUgZWxpamEsIGRlYmUgaGFjZXIgYWxnbyBxdWUgdG9tZSB1bm8gbyBkb3MgbWludXRvcyBjYWRhIDEw4oCTMTUgbWludXRvcyBwYXJhIGFzZWd1cmFyc2UgZGUgcXVlIHN1cyBhbHVtbm9zIHJlYWxtZW50ZSBlc3TDqW4gYXByZW5kaWVuZG8uIEVzdGUgcml0bW8gbm8gc2UgYmFzYSBlbiB1biBsw61taXRlIGRlIGF0ZW5jacOzbiBpbnRyw61uc2VjbzogW1dpbHMyMDA3XSBlbmNvbnRyw7MgcG9jbyBhcG95byBwYXJhIGxhIGFmaXJtYWNpw7NuIHJlcGV0aWRhIGEgbWVudWRvIGRlIHF1ZSBsb3MgYWx1bW5vcyBzb2xvIHB1ZWRlbiBwcmVzdGFyIGF0ZW5jacOzbiBkdXJhbnRlIDEwLTE1IG1pbnV0b3MuIEVuIGNhbWJpbywgbGEgZGlyZWN0cml6IGFzZWd1cmEgcXVlIHNpIHVuIG7Dum1lcm8gc2lnbmlmaWNhdGl2byBkZSBwZXJzb25hcyBzZSBoYSBxdWVkYWRvIGF0csOhcywgc29sbyB0aWVuZSBxdWUgcmVwZXRpciB1bmEgcGVxdWXDsWEgcGFydGUgZGUgbGEgbGVjY2nDs24uIExhcyBldmFsdWFjaW9uZXMgZm9ybWF0aXZhcyBmcmVjdWVudGVzIHRhbWJpw6luIG1hbnRpZW5lbiBhIGxvcyBhbHVtbm9zIGludGVyZXNhZG9zLCBlc3BlY2lhbG1lbnRlIHNpIGludm9sdWNyYXJvbiBkaXNjdXNpb25lcyBlbiBncnVwb3MgcGVxdWXDsW9zIChTZWNjacOzbiA5LjIpLgoKTGFzIGV2YWx1YWNpb25lcyBmb3JtYXRpdmFzIHRhbWJpw6luIHNlIHB1ZWRlbiB1c2FyIGFudGVzIGRlIGxhcyBsZWNjaW9uZXMuIFNpIGNvbWllbnphIHVuYSBjbGFzZSBjb24gdW4gTUNRIHkgdG9kb3MgcmVzcG9uZGVuIGNvcnJlY3RhbWVudGUsIHB1ZWRlIGV2aXRhciBleHBsaWNhciBhbGdvIHF1ZSBzdXMgYWx1bW5vcyB5YSBzYWJlbi4gRXN0ZSB0aXBvIGRlIGVuc2XDsWFuemEgYWN0aXZhIHRlIGRhIG3DoXMgdGllbXBvIHBhcmEgY29uY2VudHJhcnRlIGVuIGNvc2FzIHF1ZSBubyBzYWJlbi4gVGFtYmnDqW4gbXVlc3RyYSBhIGxvcyBhbHVtbm9zIHF1ZSByZXNwZXRhcyBzdSB0aWVtcG8gbG8gc3VmaWNpZW50ZSBjb21vIHBhcmEgbm8gZGVzcGVyZGljaWFybG8sIGxvIHF1ZSBheXVkYSBjb24gbGEgbW90aXZhY2nDs24gKENhcMOtdHVsbyAxMCkuCgoKPioqSW52ZW50YXJpb3MgY29uY2VwdHVhbGVzKioKPgo+Q29uIHN1ZmljaWVudGVzIGRhdG9zLCBsYXMgTUNRIHB1ZWRlbiBoYWNlcnNlIHNvcnByZW5kZW50ZW1lbnRlIHByZWNpc2FzLiBFbCBlamVtcGxvIG3DoXMgY29ub2NpZG8gZXMgZWwgRm9yY2UgQ29uY2VwdCBJbnZlbnRvcnkgW0hlc3QxOTkyXSwgcXVlIGV2YWzDumEgbGEgY29tcHJlbnNpw7NuIGRlIGxhIG1lY8OhbmljYSBuZXd0b25pYW5hIGLDoXNpY2EuIEFsIGVudHJldmlzdGFyIGEgdW4gZ3JhbiBuw7ptZXJvIGRlIGVuY3Vlc3RhZG9zLCBjb3JyZWxhY2lvbmFyIHN1cyBjb25jZXB0b3MgZXJyw7NuZW9zIGNvbiBwYXRyb25lcyBkZSByZXNwdWVzdGFzIGNvcnJlY3RhcyBlIGluY29ycmVjdGFzLCB5IGx1ZWdvIG1lam9yYXIgbGFzIHByZWd1bnRhcywgc3VzIGNyZWFkb3JlcyBjb25zdHJ1eWVyb24gdW5hIGhlcnJhbWllbnRhIGRlIGRpYWduw7NzdGljbyBxdWUgcHVlZGUgaWRlbnRpZmljYXIgY29uY2VwdG9zIGVycsOzbmVvcyBlc3BlY8OtZmljb3MuIExvcyBpbnZlc3RpZ2Fkb3JlcyBwdWVkZW4gdXNhciBlc2EgaGVycmFtaWVudGEgcGFyYSBtZWRpciBlbCBlZmVjdG8gZGUgbG9zIGNhbWJpb3MgZW4gbG9zIG3DqXRvZG9zIGRlIGVuc2XDsWFuemEgW0hha2UxOTk4XS4KPgo+VGV3IHkgb3Ryb3MgZGVzYXJyb2xsYXJvbiB5IHZhbGlkYXJvbiB1bmEgZXZhbHVhY2nDs24gaW5kZXBlbmRpZW50ZSBkZWwgbGVuZ3VhamUgcGFyYSBsYSBwcm9ncmFtYWNpw7NuIGludHJvZHVjdG9yaWEgW1RldzIwMTFdLCBbUGFyazIwMTZdIGxhIHJlcGxpY8OzIHkgW0hhbW8yMDE3XSBlc3TDoSBkZXNhcnJvbGxhbmRvIHVuIGludmVudGFyaW8gY29uY2VwdHVhbCBwYXJhIGxhIHJlY3Vyc2l2aWRhZC4gU2luIGVtYmFyZ28sIGVzIG11eSBjb3N0b3NvIGNyZWFyIGhlcnJhbWllbnRhcyBjb21vIGVzdGEsIHkgbGEgY2FwYWNpZGFkIGRlIGxvcyBhbHVtbm9zIHBhcmEgYnVzY2FyIHJlc3B1ZXN0YXMgZW4gbMOtbmVhIGVzIHVuYSBhbWVuYXphIGNhZGEgdmV6IG1heW9yIHBhcmEgc3UgdmFsaWRlei4KClRyYWJhamFyIGV2YWx1YWNpb25lcyBmb3JtYXRpdmFzIGVuIGNsYXNlIHNvbG8gcmVxdWllcmUgdW4gcG9jbyBkZSBwcmVwYXJhY2nDs24geSBwcsOhY3RpY2EuIERhciBhIGxvcyBhbHVtbm9zIHRhcmpldGFzIGNvbG9yZWFkYXMgbyBudW1lcmFkYXMgcGFyYSBxdWUgdG9kb3MgcHVlZGFuIHJlc3BvbmRlciBhIHVuIE1DUSBhIGxhIHZleiAoZW4gbHVnYXIgZGUgbGV2YW50YXIgbGFzIG1hbm9zIHBvciB0dXJub3MpLCB0ZW5lciB1bmEgZGUgbGFzIG9wY2lvbmVzOiAiTm8gdGVuZ28gaWRlYSIgeSBhbmltYXJsb3MgYSBoYWJsYXIgY29uIHN1cyB2ZWNpbm9zIHBhcmEgVW5vcyBzZWd1bmRvcyBhbnRlcyBkZSByZXNwb25kZXIgYXl1ZGFyw6EgYSBhc2VndXJhciBxdWUgc3UgZmx1am8gZGUgZW5zZcOxYW56YSBubyBzZSB2ZWEgaW50ZXJydW1waWRvLiBMYSBTZWNjacOzbiA5LjIgZGVzY3JpYmUgdW4gcG9kZXJvc28gbcOpdG9kbyBkZSBlbnNlw7FhbnphIGJhc2FkbyBlbiBldmlkZW5jaWEgcXVlIHNlIGJhc2EgZW4gZXN0YXMgaWRlYXMgc2ltcGxlcy4KCj4qKkh1bW9yKioKPgo+TG9zIG1hZXN0cm9zIGEgdmVjZXMgcG9uZW4gcmVzcHVlc3RhcyBzdXB1ZXN0YW1lbnRlIHRvbnRhcyBjb21vICLCoW1pIG5hcml6ISIgZW4gTUNRLCBwYXJ0aWN1bGFybWVudGUgYXF1ZWxsYXMgZGVzdGluYWRhcyBhIGVzdHVkaWFudGVzIG3DoXMgasOzdmVuZXMuIFNpbiBlbWJhcmdvLCBlc3RvcyBubyBwcm9wb3JjaW9uYW4gbmluZ3VuYSBpZGVhIGRlIGxvcyBjb25jZXB0b3MgZXJyw7NuZW9zIGRlIGxvcyBhbHVtbm9zLCB5IGxhIG1heW9yw61hIGRlIGxhcyBwZXJzb25hcyBubyBsb3MgZW5jdWVudHJhbiBkaXZlcnRpZG9zLiBDb21vIHJlZ2xhIGdlbmVyYWwsIHNvbG8gZGViZSBpbmNsdWlyIHVuIGNoaXN0ZSBlbiB1bmEgbGVjY2nDs24gc2kgbGUgcmVzdWx0YSBncmFjaW9zbyBsYSB0ZXJjZXJhIHZleiBxdWUgbG8gdnVlbHZlIGEgbGVlci4KCgpMYXMgZXZhbHVhY2lvbmVzIGZvcm1hdGl2YXMgZGUgdW5hIGxlY2Npw7NuIGRlYmVyw61hbiBwcmVwYXJhciBhIGxvcyBhbHVtbm9zIHBhcmEgc3UgZXZhbHVhY2nDs24gc3VtYXRpdmE6IG5hZGllIGRlYmVyw61hIGVuY29udHJhciB1bmEgcHJlZ3VudGEgZW4gdW4gZXhhbWVuIHBhcmEgZWwgcXVlIGxhIGVuc2XDsWFuemEgbm8gbG9zIHByZXBhcsOzLiBFc3RvIG5vIHNpZ25pZmljYSBxdWUgbnVuY2EgZGViYXMgcG9uZXIgbnVldm9zIHRpcG9zIGRlIHByb2JsZW1hcyBlbiB1biBleGFtZW4sIHBlcm8gc2kgbG8gaGFjZXMsIGRlYmVyw61hcyBoYWJlciBkYWRvIGEgbG9zIGFsdW1ub3MgcHLDoWN0aWNhIHBhcmEgYWJvcmRhciBwcm9ibGVtYXMgbnVldm9zIGRlIGFudGVtYW5vLiBFbCBDYXDDrXR1bG8gNiBleHBsb3JhIGVzdG8gZW4gcHJvZnVuZGlkYWQuCgoKIyMgTcOhcXVpbmFzIG5vY2lvbmFsZXMgKMK/bW9kZWxvcyBtZW50YWxlcz8pCgpFbCB0w6lybWlubyBwZW5zYW1pZW50byBjb21wdXRhY2lvbmFsIGVzdMOhIG11eSBleHRlbmRpZG8sIGVuIHBhcnRlIHBvcnF1ZSBsYSBnZW50ZSBwdWVkZSBlc3RhciBkZSBhY3VlcmRvIGVuIHF1ZSBlcyBpbXBvcnRhbnRlIHkgcXVlIHNpZ25pZmljYSBjb3NhcyBtdXkgZGlmZXJlbnRlcy4gRW4gbHVnYXIgZGUgZGlzY3V0aXIgc29icmUgbG8gcXVlIGluY2x1eWUgeSBsbyBxdWUgbm8gaW5jbHV5ZSwgZXMgbcOhcyDDunRpbCBwZW5zYXIgZW4gbGEgbcOhcXVpbmEgbm9jaW9uYWwgcXVlIGRlc2VhIHF1ZSBsb3MgYWx1bW5vcyBjb21wcmVuZGFuIFtEdUJvMTk4Nl0uIFNlZ8O6biBbU29ydjIwMTNdLCB1bmEgbcOhcXVpbmEgbm9jaW9uYWw6CgoqIEVzIHVuYSBhYnN0cmFjY2nDs24gaWRlYWxpemFkYSBkZWwgaGFyZHdhcmUgZGUgbGEgY29tcHV0YWRvcmEgeSBvdHJvcyBhc3BlY3RvcyBkZSBsb3MgZW50b3Jub3MgZGUgdGllbXBvIGRlIGVqZWN1Y2nDs24gZGUgbG9zIHByb2dyYW1hczsKCiogUGVybWl0ZSBkZXNjcmliaXIgbGEgc2Vtw6FudGljYSBkZSBsb3MgcHJvZ3JhbWFzOyB5CgoqIFJlZmxlamEgY29ycmVjdGFtZW50ZSBsbyBxdWUgaGFjZW4gbG9zIHByb2dyYW1hcyBjdWFuZG8gc2UgZWplY3V0YW4uCgoKKipQb3IgZWplbXBsbywgbWkgbcOhcXVpbmEgbm9jaW9uYWwgcGFyYSBQeXRob24gZXM6KioKCjEuIExvcyBwcm9ncmFtYXMgZW4gZWplY3VjacOzbiB2aXZlbiBlbiBsYSBtZW1vcmlhLCBxdWUgc2UgZGl2aWRlIGVudHJlIHVuYSBwaWxhIGRlIGxsYW1hZGFzIHkgdW4gbW9udMOzbi4KCjIuIExhIG1lbW9yaWEgcGFyYSBkYXRvcyBzaWVtcHJlIHNlIGFzaWduYSBkZXNkZSBlbCBtb250w7NuLgoKMy4gQ2FkYSBwaWV6YSBkZSBkYXRvcyBzZSBhbG1hY2VuYSBlbiB1bmEgZXN0cnVjdHVyYSBkZSBkb3MgcGFydGVzLiBMYSBwcmltZXJhIHBhcnRlIGRpY2UgZGUgcXXDqSB0aXBvIHNvbiBsb3MgZGF0b3MsIHkgbGEgc2VndW5kYSBwYXJ0ZSBlcyBlbCB2YWxvciByZWFsLgoKNC4gTG9zIGJvb2xlYW5vcywgbG9zIG7Dum1lcm9zIHkgbGFzIGNhZGVuYXMgZGUgY2FyYWN0ZXJlcyBudW5jYSBzZSBtb2RpZmljYW4gZGVzcHXDqXMgZGUgY3JlYXJsb3MuCgo1LiBMYXMgbGlzdGFzLCBjb25qdW50b3MgeSBvdHJhcyBjb2xlY2Npb25lcyBhbG1hY2VuYW4gcmVmZXJlbmNpYXMgYSBvdHJvcyBkYXRvcyBlbiBsdWdhciBkZSBhbG1hY2VuYXIgZXNvcyB2YWxvcmVzIGRpcmVjdGFtZW50ZS4gU2UgcHVlZGVuIG1vZGlmaWNhciBkZXNwdcOpcyBkZSBzdSBjcmVhY2nDs24sIGVzIGRlY2lyLCBzZSBwdWVkZSBhbXBsaWFyIHVuYSBsaXN0YSBvIHNlIHB1ZWRlbiBhZ3JlZ2FyIG51ZXZvcyB2YWxvcmVzIGEgdW4gY29uanVudG8uCgo2LiBDdWFuZG8gZWwgY8OzZGlnbyBzZSBjYXJnYSBlbiBsYSBtZW1vcmlhLCBQeXRob24gbG8gY29udmllcnRlIGVuIHVuYSBzZWN1ZW5jaWEgZGUgaW5zdHJ1Y2Npb25lcyBxdWUgc2UgYWxtYWNlbmFuIGNvbW8gY3VhbHF1aWVyIG90cm8gZGF0by4gRXMgcG9yIGVzbyBxdWUgZXMgcG9zaWJsZSBhc2lnbmFyIGZ1bmNpb25lcyBhIHZhcmlhYmxlcyB5IHBhc2FybGFzIGNvbW8gcGFyw6FtZXRyb3MuCgo3LiBDdWFuZG8gc2UgZWplY3V0YSBlbCBjw7NkaWdvLCBQeXRob24gc2lndWUgbGFzIGluc3RydWNjaW9uZXMsIGhhY2llbmRvIGxvIHF1ZSBjYWRhIHVubyBsZSBkaWNlIGEgc3UgdmV6LgoKOC4gQWxndW5hcyBpbnN0cnVjY2lvbmVzIGhhY2VuIHF1ZSBQeXRob24gbGVhIGRhdG9zLCBoYWdhIGPDoWxjdWxvcyB5IGNyZWUgbnVldm9zIGRhdG9zLiBPdHJhcyBpbnN0cnVjY2lvbmVzIGNvbnRyb2xhbiBxdcOpIGluc3RydWNjaW9uZXMgZWplY3V0YSBQeXRob24sIHF1ZSBlcyBjw7NtbyBmdW5jaW9uYW4gbG9zIGJ1Y2xlcyB5IGNvbmRpY2lvbmFsZXMuIE90cmEgaW5zdHJ1Y2Npw7NuIG3DoXMgbGUgZGljZSBhIFB5dGhvbiBxdWUgbGxhbWUgYSB1bmEgZnVuY2nDs24uCgo5LiBDdWFuZG8gc2UgbGxhbWEgYSB1bmEgZnVuY2nDs24sIFB5dGhvbiBlbXB1amEgdW4gbnVldm8gbWFyY28gZGUgcGlsYSBlbiBsYSBwaWxhIGRlIGxsYW1hZGFzLgoKMTAuIENhZGEgbWFyY28gZGUgcGlsYSBhbG1hY2VuYSBub21icmVzIGRlIHZhcmlhYmxlcyB5IHJlZmVyZW5jaWFzIGEgZGF0b3MuIExvcyBwYXLDoW1ldHJvcyBkZSBmdW5jacOzbiBzb24gc29sbyBvdHJvIHRpcG8gZGUgdmFyaWFibGUuCgoxMS4gQ3VhbmRvIHNlIHVzYSB1bmEgdmFyaWFibGUsIFB5dGhvbiBsYSBidXNjYSBlbiBlbCBtYXJjbyBkZSBsYSBwaWxhIHN1cGVyaW9yLiBTaSBubyBlc3TDoSBhbGzDrSwgc2UgdmUgZW4gZWwgbWFyY28gaW5mZXJpb3IgKGdsb2JhbCkuCgoxMi4gQ3VhbmRvIGZpbmFsaXphIGxhIGZ1bmNpw7NuLCBQeXRob24gYm9ycmEgc3UgbWFyY28gZGUgcGlsYSB5IHZ1ZWx2ZSBhIGxhcyBpbnN0cnVjY2lvbmVzIHF1ZSBlc3RhYmEgZWplY3V0YW5kbyBhbnRlcyBkZSBsYSBsbGFtYWRhIGEgbGEgZnVuY2nDs24uIFNpIG5vIGhheSB1biAiYW50ZXMiLCBlbCBwcm9ncmFtYSBoYSBmaW5hbGl6YWRvLgoKVXNvIGVzdGEgdmVyc2nDs24gZGUgZGlidWpvcyBhbmltYWRvcyBkZSBsYSByZWFsaWRhZCBjYWRhIHZleiBxdWUgZW5zZcOxbyBQeXRob24uIERlc3B1w6lzIGRlIGFwcm94aW1hZGFtZW50ZSAyNSBob3JhcyBkZSBpbnN0cnVjY2nDs24geSAxMDAgaG9yYXMgZGUgdHJhYmFqbyBlbiBzdSBwcm9waW8gdGllbXBvLCBlc3Blcm8gcXVlIGxhIG1heW9yw61hIGRlIGxvcyBhbHVtbm9zIHRlbmdhbiB1biBtb2RlbG8gbWVudGFsIHF1ZSBpbmNsdXlhIGxhIG1heW9yw61hIG8gdG9kYXMgZXN0YXMgY2FyYWN0ZXLDrXN0aWNhcy4KCgoKIyMgRWplcmNpY2lvcwoKIyMjIFN1cyBtb2RlbG9zIG1lbnRhbGVzICh0aGluay1wYWlyLXNoYXJlIC8gMTUpCsK/Q3XDoWwgZXMgdW4gbW9kZWxvIG1lbnRhbCBxdWUgdXRpbGl6YSBwYXJhIGNvbXByZW5kZXIgc3UgdHJhYmFqbz8gRXNjcmliZSB1bmFzIHBvY2FzIG9yYWNpb25lcyBxdWUgbG8gZGVzY3JpYmFuIHkgZGEgdHUgb3BpbmnDs24gc29icmUgbGEgZGUgdW4gY29tcGHDsWVyby4gVW5hIHZleiBxdWUgaGF5YSBoZWNobyBlc28sIGhhZ2EgcXVlIGFsZ3VuYXMgcGVyc29uYXMgY29tcGFydGFuIHN1cyBtb2RlbG9zIGNvbiB0b2RvIGVsIGdydXBvLiDCv0VzdMOhbiB0b2RvcyBkZSBhY3VlcmRvIGVuIHF1w6kgZXMgdW4gbW9kZWxvIG1lbnRhbD8gwr9FcyBwb3NpYmxlIGRhciB1bmEgZGVmaW5pY2nDs24gcHJlY2lzYSBvIGVsIGNvbmNlcHRvIGVzIMO6dGlsIHByZWNpc2FtZW50ZSBwb3JxdWUgZXMgZGlmdXNvPwoKIyMjIFPDrW50b21hcyBkZSBzZXIgdW4gbm92YXRvICh0b2RhIGxhIGNsYXNlIC8gNSkKRGVjaXIgcXVlIGxvcyBub3ZhdG9zIG5vIHRpZW5lbiB1biBtb2RlbG8gbWVudGFsIGRlIHVuIGRvbWluaW8gcGFydGljdWxhciBubyBlcyBsbyBtaXNtbyBxdWUgZGVjaXIgcXVlIG5vIHRpZW5lbiB1biBtb2RlbG8gbWVudGFsIGVuIGFic29sdXRvLiBMb3MgcHJpbmNpcGlhbnRlcyB0aWVuZGVuIGEgcmF6b25hciBwb3IgYW5hbG9nw61hIHkgY29uamV0dXJhcywgdG9tYW5kbyBwcmVzdGFkb3MgZnJhZ21lbnRvcyBkZSBtb2RlbG9zIG1lbnRhbGVzIGRlIG90cm9zIGRvbWluaW9zIHF1ZSBwYXJlY2VuIHN1cGVyZmljaWFsbWVudGUgc2ltaWxhcmVzLgoKTGFzIHBlcnNvbmFzIHF1ZSBoYWNlbiBlc3RvIGEgbWVudWRvIGRpY2VuIGNvc2FzIHF1ZSBuaSBzaXF1aWVyYSBlc3TDoW4gbWFsLiBDb21vIGNsYXNlLCBkaXNjdXRhIGN1w6FsZXMgc29uIGFsZ3Vub3Mgb3Ryb3Mgc8OtbnRvbWFzIGRlIHNlciB1biBub3ZhdG8uIMK/UXXDqSBoYWNlIG8gZGljZSBhbGd1aWVuIHF1ZSBsbyBsbGV2YSBhIGNsYXNpZmljYXJsbyBjb21vIG5vdmF0byBlbiBhbGfDum4gZG9taW5pbz8KCgojIyMgTW9kZWxhZG8gZGUgbW9kZWxvcyBtZW50YWxlcyBwYXJhIHByaW5jaXBpYW50ZXMgKHBhcmVzIC8gMjApCkNyZWUgdW5hIHByZWd1bnRhIGRlIG9wY2nDs24gbcO6bHRpcGxlIHJlbGFjaW9uYWRhIGNvbiB1biB0ZW1hIHF1ZSBoYXlhIGVuc2XDsWFkbyBvIGludGVudGUgZW5zZcOxYXIgeSBleHBsaXF1ZSBlbCBwb2RlciBkZSBkaWFnbsOzc3RpY28gZGUgY2FkYSB1bm8gZGUgc3VzIGRpc3RyYWN0b3JlcyAoZXMgZGVjaXIsIHF1w6kgY29uY2VwdG8gZXJyw7NuZW8gZGViZSBpZGVudGlmaWNhciBjYWRhIGRpc3RyYWN0b3IpLgoKQ3VhbmRvIGhheWEgdGVybWluYWRvLCBpbnRlcmNhbWJpZSBNQ1EgY29uIHVuIHNvY2lvLiDCv0VzIHN1IHByZWd1bnRhIGFtYmlndWE/IMK/U29uIHBsYXVzaWJsZXMgbG9zIGNvbmNlcHRvcyBlcnLDs25lb3M/IMK/TG9zIGRpc3RyYWN0b3JlcyByZWFsbWVudGUgbG9zIHBydWViYW4/IMK/SGF5IGFsZ3VuYSBpZGVhIGVycsOzbmVhIHByb2JhYmxlIHF1ZSBubyBzZSBoYXlhIHByb2JhZG8/CgojIyMgUGVuc2FuZG8gZW4gbGFzIGNvc2FzICh0b2RhIGxhIGNsYXNlIC8gMTUpClVuYSBidWVuYSBldmFsdWFjacOzbiBmb3JtYXRpdmEgcmVxdWllcmUgcXVlIGxhcyBwZXJzb25hcyBwaWVuc2VuIGVuIHVuIHByb2JsZW1hLiBQb3IgZWplbXBsbywgaW1hZ2luZSBxdWUgaGEgY29sb2NhZG8gdW4gYmxvcXVlIGRlIGhpZWxvIGVuIHVuYSBiYcOxZXJhIHkgbHVlZ28gaGEgbGxlbmFkbyBsYSBiYcOxZXJhIGhhc3RhIGVsIGJvcmRlIGNvbiBhZ3VhLiBDdWFuZG8gZWwgaGllbG8gc2UgZGVycml0ZSwgwr9zdWJlIGVsIG5pdmVsIGRlbCBhZ3VhIChwYXJhIHF1ZSBsYSBiYcOxZXJhIHNlIGRlc2JvcmRlKSwgYmFqYSBvIHBlcm1hbmVjZSBpZ3VhbCAoRmlndXJhIFtmOiBtb2RlbG9zLWJhw7FlcmFdKT8KCgohW0Jhw7FlcmEgeSBoaWVsb10oLi9pbWdfdHJhbmluZy9iYXRodHViLnN2ZykKCkxhIHJlc3B1ZXN0YSBjb3JyZWN0YSBlcyBxdWUgZWwgbml2ZWwgc2UgbWFudGllbmUgaWd1YWw6IGVsIGhpZWxvIGRlc3BsYXphIHN1IHByb3BpbyBwZXNvIGVuIGVsIGFndWEsIHBvciBsbyBxdWUgbGxlbmEgZXhhY3RhbWVudGUgZWwgImFndWplcm8iIHF1ZSBoYSBoZWNobyBjdWFuZG8gc2UgZGVycml0ZS4gQXZlcmlndWFyIHBvciBxdcOpIGF5dWRhIGEgbGFzIHBlcnNvbmFzIGEgY29uc3RydWlyIHVuIG1vZGVsbyBkZSBsYSByZWxhY2nDs24gZW50cmUgcGVzbywgdm9sdW1lbiB5IGRlbnNpZGFkIFtFcHN0MjAwMl0uCgpEZXNjcmliYSBvdHJhIGV2YWx1YWNpw7NuIGZvcm1hdGl2YSBxdWUgaGF5YSB2aXN0byBvIHV0aWxpemFkbyBxdWUgcmVxdWllcmEgcXVlIGxhcyBwZXJzb25hcyBwaWVuc2VuIGRldGVuaWRhbWVudGUgZSBpZGVudGlmaXF1ZW4gZGVmZWN0b3MgZW4gc3UgcmF6b25hbWllbnRvLiBDdWFuZG8gaGF5YSB0ZXJtaW5hZG8sIGV4cGxpcXVlIHN1IGVqZW1wbG8gYSB1biBjb21wYcOxZXJvIHkgZGVsZSBjb21lbnRhcmlvcyBzb2JyZSBlbCBzdXlvLgoKCiMjIyBVbmEgcHJvZ3Jlc2nDs24gZGlmZXJlbnRlIChpbmRpdmlkdWFsIC8gMTUpCkVsIG1vZGVsbyBub3ZhdG8tY29tcGV0ZW50ZS1leHBlcnRvIGRlIGRlc2Fycm9sbG8gZGUgaGFiaWxpZGFkZXMgYSB2ZWNlcyBzZSBsbGFtYSBtb2RlbG8gRHJleWZ1cy4gT3RyYSBwcm9ncmVzacOzbiBjb23Dum5tZW50ZSB1dGlsaXphZGEgc29uIGxhcyBjdWF0cm8gZXRhcGFzIGRlIGNvbXBldGVuY2lhOgoKKipJbmNvbXBldGVuY2lhIGluY29uc2NpZW50ZToqKgpsYSBwZXJzb25hIG5vIHNhYmUgbG8gcXVlIG5vIHNhYmUuCgoqKkluY29tcGV0ZW5jaWEgY29uc2NpZW50ZToqKgpsYSBwZXJzb25hIHNlIGRhIGN1ZW50YSBkZSBxdWUgbm8gc2FiZSBhbGdvLgoKKipDb21wZXRlbmNpYSBjb25zY2llbnRlOioqCmxhIHBlcnNvbmEgaGEgYXByZW5kaWRvIGPDs21vIGhhY2VyIGFsZ28sIHBlcm8gc29sbyBwdWVkZSBoYWNlcmxvIG1pZW50cmFzIHNlIGNvbmNlbnRyYSB5IGHDum4gcHVlZGUgbmVjZXNpdGFyIGRpdmlkaXIgbGFzIGNvc2FzIGVuIHBhc29zLgoKKipDb21wZXRlbmNpYSBpbmNvbnNjaWVudGU6KioKbGEgaGFiaWxpZGFkIHNlIGhhIGNvbnZlcnRpZG8gZW4gdW5hIHNlZ3VuZGEgbmF0dXJhbGV6YSB5IGxhIHBlcnNvbmEgcHVlZGUgaGFjZXJsbyByZWZsZXhpdmFtZW50ZS4KCklkZW50aWZpcXVlIHVuIHRlbWEgZG9uZGUgc2UgZW5jdWVudHJhIGVuIGNhZGEgbml2ZWwuIMK/RW4gcXXDqSBuaXZlbCBzZSBlbmN1ZW50cmFuIGxhIG1heW9yw61hIGRlIHN1cyBhbHVtbm9zIGVuIGxhIG1hdGVyaWEgcXVlIGVuc2XDsWEgY29uIG3DoXMgZnJlY3VlbmNpYT8gwr9BIHF1w6kgbml2ZWwgZXN0w6FzIHRyYXRhbmRvIGRlIGxsZWdhcj8gwr9Dw7NtbyBzZSByZWxhY2lvbmFuIGVzdGFzIGN1YXRybyBldGFwYXMgY29uIGxhIGNsYXNpZmljYWNpw7NuIG5vdmF0by1jb21wZXRlbnRlLWV4cGVydG8/CgojIyMgwr9RdcOpIHRpcG8gZGUgY29tcHV0YWNpw7NuPyAoaW5kaXZpZHVhbCAvIDEwKQpbVGVkcjIwMDhdIHJlc3VtZSB0cmVzIHRyYWRpY2lvbmVzIGVuIGluZm9ybcOhdGljYToKCioqTWF0ZW3DoXRpY286KioKTG9zIHByb2dyYW1hcyBzb24gbGEgZW5jYXJuYWNpw7NuIGRlIGFsZ29yaXRtb3MuIFNvbiBjb3JyZWN0b3MgbyBpbmNvcnJlY3RvcywgYXPDrSBjb21vIG3DoXMgbyBtZW5vcyBlZmljaWVudGVzLgoKKipDaWVudMOtZmljbzoqKgpMb3MgcHJvZ3JhbWFzIHNvbiBtb2RlbG9zIG3DoXMgbyBtZW5vcyBwcmVjaXNvcyBkZSBwcm9jZXNvcyBkZSBpbmZvcm1hY2nDs24gcXVlIHB1ZWRlbiBlc3R1ZGlhcnNlIHV0aWxpemFuZG8gZWwgbcOpdG9kbyBjaWVudMOtZmljby4KCioqSW5nZW5pZXJpYToqKgpMb3MgcHJvZ3JhbWFzIHNvbiBvYmpldG9zIGNvbnN0cnVpZG9zIGNvbW8gcmVwcmVzYXMgeSBhdmlvbmVzLCB5IHNvbiBtw6FzIG8gbWVub3MgZWZlY3Rpdm9zIHkgY29uZmlhYmxlcy4KCsK/Q3XDoWwgZGUgZXN0b3MgY29pbmNpZGUgbWVqb3IgY29uIHN1IG1vZGVsbyBtZW50YWwgZGUgY29tcHV0YWNpw7NuPyBTaSBuaW5ndW5vIGRlIGVsbG9zIGxvIGhhY2UsIMK/cXXDqSBtb2RlbG8gdGllbmVzPwoKIyMjIEV4cGxpY2FuZG8gcG9yIHF1w6kgbm8gKHBhcmVzIC8gNSkKVW5vIGRlIHN1cyBhbHVtbm9zIHBpZW5zYSBxdWUgaGF5IGFsZ8O6biB0aXBvIGRlIGRpZmVyZW5jaWEgZW50cmUgZWwgdGV4dG8gcXVlIGVzY3JpYmVuIGNhcsOhY3RlciBwb3IgY2Fyw6FjdGVyIHkgZWwgdGV4dG8gaWTDqW50aWNvIHF1ZSBjb3BpYW4geSBwZWdhbi4gUGllbnNhIGVuIHVuYSByYXrDs24gcG9yIGxhIHF1ZSBwb2Ryw61hbiBjcmVlciBlc3RvIG8gYWxnbyBxdWUgcG9kcsOtYSBoYWJlcmxlcyBzdWNlZGlkbyBwYXJhIGRhcmxlcyBlc3RhIGltcHJlc2nDs24sIGx1ZWdvIGZpbmdlIHNlciBlc2UgYXByZW5kaXogbWllbnRyYXMgdHUgcGFyZWphIGV4cGxpY2EgcG9yIHF1w6kgZXN0ZSBubyBlcyBlbCBjYXNvLiBJbnRlcmNhbWJpZSByb2xlcyBlIGludGVudGUgbnVldmFtZW50ZS4KCiMjIyBTdSBtb2RlbG8gYWhvcmEgKHRvZGEgbGEgY2xhc2UgLyA1KQpDb21vIGNsYXNlLCBjcmVlIHVuYSBsaXN0YSBkZSBsb3MgZWxlbWVudG9zIGNsYXZlIGRlIHN1IG1vZGVsbyBtZW50YWwgZGUgYXByZW5kaXphamUuIMK/Q3XDoWxlcyBzb24gbGEgbWVkaWEgZG9jZW5hIGRlIGNvbmNlcHRvcyBtw6FzIGltcG9ydGFudGVzIHkgY8OzbW8gc2UgcmVsYWNpb25hbj8KCiMjIyBTdXMgbcOhcXVpbmFzIG5vY2lvbmFsZXMgKGdydXBvcyBwZXF1ZcOxb3MgLyAyMCkKVHJhYmFqYW5kbyBlbiBncnVwb3MgcGVxdWXDsW9zLCBlc2NyaWJhIHVuYSBkZXNjcmlwY2nDs24gZGUgbGEgbcOhcXVpbmEgbm9jaW9uYWwgcXVlIGRlc2VhIHF1ZSBsb3MgYWx1bW5vcyB1c2VuIHBhcmEgY29tcHJlbmRlciBjw7NtbyBmdW5jaW9uYW4gc3VzIHByb2dyYW1hcy4gwr9FbiBxdcOpIHNlIGRpZmVyZW5jaWEgdW5hIG3DoXF1aW5hIG5vY2lvbmFsIHBhcmEgdW4gbGVuZ3VhamUgYmFzYWRvIGVuIGJsb3F1ZXMgY29tbyBTY3JhdGNoIGRlIGxhIGRlIFB5dGhvbj8gwr9RdcOpIHBhc2EgY29uIHVuYSBtw6FxdWluYSBub2Npb25hbCBwYXJhIGhvamFzIGRlIGPDoWxjdWxvIG8gcGFyYSB1biBuYXZlZ2Fkb3IgcXVlIGludGVycHJldGEgSFRNTCB5IENTUyBhbCByZXByZXNlbnRhciB1bmEgcMOhZ2luYSB3ZWI/CgojIyMgRGlzZnJ1dGFuZG8gc2luIGFwcmVuZGVyIChpbmRpdmlkdWFsIC8gNSkKTcO6bHRpcGxlcyBlc3R1ZGlvcyBoYW4gZGVtb3N0cmFkbyBxdWUgbGFzIGV2YWx1YWNpb25lcyBkZSBlbnNlw7FhbnphIG5vIHNlIGNvcnJlbGFjaW9uYW4gY29uIGxvcyByZXN1bHRhZG9zIGRlbCBhcHJlbmRpemFqZSBbU3RhcjIwMTQsIFV0dGwyMDE3XSwgZXMgZGVjaXIsIHF1w6kgdGFuIGJpZW4gbG9zIGVzdHVkaWFudGVzIGNhbGlmaWNhbiB1biBjdXJzbyBubyBwcmVkaWNlIGN1w6FudG8gcmVjdWVyZGFuLiDCv0FsZ3VuYSB2ZXogaGFzIGRpc2ZydXRhZG8gZGUgdW5hIGNsYXNlIGRlIGxhIHF1ZSByZWFsbWVudGUgbm8gYXByZW5kaXN0ZSBuYWRhPyBTaSBlcyBhc8OtLCDCv3F1w6kgbG8gaGl6byBhZ3JhZGFibGU/CgojIyBSZXN1bWVuCgohW01vZGVsbyBtZW50YWxdKC4vaW1nX3RyYW5pbmcvY29uY2VwdG1hcC1tZW50YWwtbW9kZWxzLnN2ZykKCgohW0VmYWx1YWNpw7NuIGZvcm1hdGl2YV0oLi9pbWdfdHJhbmluZy9jb25jZXB0bWFwLWFzc2Vzc21lbnQuc3ZnKQoKIyBFeHBlcmllbmNpYSB5IG1lbW9yaWEKCj5MYSBtZW1vcmlhIGVzIGVsIHJlc2lkdW8gZGVsIHBlbnNhbWllbnRvLgo+Cj4gRGFuaWVsIFdpbGxpbmdoYW0sIMK/UG9yIHF1w6kgYSBsb3MgZXN0dWRpYW50ZXMgbm8gbGVzIGd1c3RhIGxhIGVzY3VlbGE/CgpFbCBjYXDDrXR1bG8gYW50ZXJpb3IgZXhwbGljYWJhIGxhcyBkaWZlcmVuY2lhcyBlbnRyZSBsb3MgcHJpbmNpcGlhbnRlcyB5IGxvcyBwcm9mZXNpb25hbGVzIGNvbXBldGVudGVzLiBFc3RlIGFuYWxpemEgbGEgZXhwZXJpZW5jaWE6IHF1w6kgZXMsIGPDs21vIGxhIGFkcXVpZXJlIGxhIGdlbnRlIHkgY8OzbW8gcHVlZGUgc2VyIHBlcmp1ZGljaWFsIHkgw7p0aWwuIEx1ZWdvIHByZXNlbnRhbW9zIHVubyBkZSBsb3MgbMOtbWl0ZXMgbcOhcyBpbXBvcnRhbnRlcyBwYXJhIGVsIGFwcmVuZGl6YWplIHkgb2JzZXJ2YW1vcyBjw7NtbyBoYWNlciBkaWJ1am9zIGRlIG1vZGVsb3MgbWVudGFsZXMgcHVlZGUgYXl1ZGFybm9zIGEgY29udmVydGlyIGVsIGNvbm9jaW1pZW50byBlbiBsZWNjaW9uZXMuCgpQYXJhIGVtcGV6YXIsIMK/cXXDqSBxdWVyZW1vcyBkZWNpciBjdWFuZG8gZGVjaW1vcyBxdWUgYWxndWllbiBlcyB1biBleHBlcnRvPyBMYSByZXNwdWVzdGEgaGFiaXR1YWwgZXMgcXVlIHB1ZWRlbiByZXNvbHZlciBwcm9ibGVtYXMgbXVjaG8gbcOhcyByw6FwaWRvIHF1ZSBsYXMgcGVyc29uYXMgcXVlIHNvbiAic2ltcGxlbWVudGUgY29tcGV0ZW50ZXMiLCBvIHF1ZSBwdWVkZW4gcmVjb25vY2VyIHkgdHJhdGFyIGNhc29zIGVuIGxvcyBxdWUgbm8gc2UgYXBsaWNhbiBsYXMgcmVnbGFzIG5vcm1hbGVzLiBUYW1iacOpbiBoYWNlbiBxdWUgZXN0byBwYXJlemNhIHNpbiBlc2Z1ZXJ6bzogZW4gbXVjaG9zIGNhc29zLCBwYXJlY2VuIHNhYmVyIGxhIHJlc3B1ZXN0YSBjb3JyZWN0YSBkZSB1biB2aXN0YXpvIFtQYXJuMjAxN10uCgpMYSBleHBlcmllbmNpYSBlcyBtw6FzIHF1ZSBzb2xvIGNvbm9jZXIgbcOhcyBoZWNob3M6IGxvcyBwcm9mZXNpb25hbGVzIGNvbXBldGVudGVzIHB1ZWRlbiBtZW1vcml6YXIgbXVjaGFzIGN1cmlvc2lkYWRlcyBzaW4gbWVqb3JhciBub3RhYmxlbWVudGUgc3UgcmVuZGltaWVudG8uIEVuIGNhbWJpbywgaW1hZ2luZSBwb3IgdW4gbW9tZW50byBxdWUgYWxtYWNlbmFtb3MgZWwgY29ub2NpbWllbnRvIGNvbW8gdW5hIHJlZCBvIGdyw6FmaWNvIGVuIGVsIHF1ZSBsb3MgaGVjaG9zIHNvbiBub2RvcyB5IGxhcyByZWxhY2lvbmVzIHNvbiBhcmNvcy4gTGEgZGlmZXJlbmNpYSBjbGF2ZSBlbnRyZSBleHBlcnRvcyB5IHByb2Zlc2lvbmFsZXMgY29tcGV0ZW50ZXMgZXMgcXVlIGxvcyBtb2RlbG9zIG1lbnRhbGVzIGRlIGxvcyBleHBlcnRvcyBlc3TDoW4gbXVjaG8gbcOhcyBkZW5zYW1lbnRlIGNvbmVjdGFkb3MsIGVzIGRlY2lyLCBlcyBtw6FzIHByb2JhYmxlIHF1ZSBjb25vemNhbiB1bmEgY29uZXhpw7NuIGVudHJlIGRvcyBoZWNob3MuCgpMYSBtZXTDoWZvcmEgZGVsIGdyw6FmaWNvIGV4cGxpY2EgcG9yIHF1w6kgYXl1ZGFyIGEgbG9zIGFsdW1ub3MgYSBoYWNlciBjb25leGlvbmVzIGVzIHRhbiBpbXBvcnRhbnRlIGNvbW8gcHJlc2VudGFybGVzIGxvcyBoZWNob3M6IHNpbiBlc2FzIGNvbmV4aW9uZXMsIGxhcyBwZXJzb25hcyBubyBwdWVkZW4gcmVjb3JkYXIgeSB1c2FyIGxvIHF1ZSBzYWJlbi4gVGFtYmnDqW4gZXhwbGljYSBtdWNob3MgYXNwZWN0b3Mgb2JzZXJ2YWRvcyBkZWwgY29tcG9ydGFtaWVudG8gZXhwZXJ0bzoKCiogTG9zIGV4cGVydG9zIGEgbWVudWRvIHB1ZWRlbiBzYWx0YXIgZGlyZWN0YW1lbnRlIGRlIHVuIHByb2JsZW1hIGEgdW5hIHNvbHVjacOzbiBwb3JxdWUgZW4gcmVhbGlkYWQgaGF5IHVuIHbDrW5jdWxvIGRpcmVjdG8gZW50cmUgbG9zIGRvcyBlbiBzdSBtZW50ZS4gQ3VhbmRvIHVuIHByb2Zlc2lvbmFsIGNvbXBldGVudGUgdGVuZHLDrWEgcXVlIHJhem9uYXIgQSDihpIgQiDihpIgQyDihpIgRCDihpIgRSwgdW4gZXhwZXJ0byBwdWVkZSBpciBkZSBBIGEgRSBlbiB1biBzb2xvIHBhc28uIExsYW1hbW9zIGEgZXN0byBpbnR1aWNpw7NuOiBlbiBsdWdhciBkZSByYXpvbmFyIHN1IGNhbWlubyBoYWNpYSB1bmEgc29sdWNpw7NuLCBlbCBleHBlcnRvIHJlY29ub2NlIHVuYSBzb2x1Y2nDs24gZGUgbGEgbWlzbWEgbWFuZXJhIHF1ZSByZWNvbm9jZXLDrWEgdW5hIGNhcmEgZmFtaWxpYXIuCgoqIExvcyBncsOhZmljb3MgZGVuc2FtZW50ZSBjb25lY3RhZG9zIHRhbWJpw6luIHNvbiBsYSBiYXNlIHBhcmEgbGFzIHJlcHJlc2VudGFjaW9uZXMgZmx1aWRhcyBkZSBsb3MgZXhwZXJ0b3MsIGVzIGRlY2lyLCBzdSBjYXBhY2lkYWQgcGFyYSBhbHRlcm5hciBlbnRyZSBkaWZlcmVudGVzIHB1bnRvcyBkZSB2aXN0YSBkZSB1biBwcm9ibGVtYSBbUGV0cjIwMTZdLiBQb3IgZWplbXBsbywgY3VhbmRvIHNlIHRyYXRhIGRlIHJlc29sdmVyIHVuIHByb2JsZW1hIG1hdGVtw6F0aWNvLCB1biBleHBlcnRvIHB1ZWRlIGNhbWJpYXIgZW50cmUgYWJvcmRhcmxvIGdlb23DqXRyaWNhbWVudGUgeSByZXByZXNlbnRhcmxvIGNvbW8gdW4gY29uanVudG8gZGUgZWN1YWNpb25lcy4KCiogRXN0YSBtZXTDoWZvcmEgdGFtYmnDqW4gZXhwbGljYSBwb3IgcXXDqSBsb3MgZXhwZXJ0b3Mgc29uIG1lam9yZXMgZW4gZWwgZGlhZ27Ds3N0aWNvIHF1ZSBsb3MgcHJvZmVzaW9uYWxlcyBjb21wZXRlbnRlczogbcOhcyB2w61uY3Vsb3MgZW50cmUgbG9zIGhlY2hvcyBoYWNlIHF1ZSBzZWEgbcOhcyBmw6FjaWwgcmF6b25hciBoYWNpYSBhdHLDoXMgZGUgbG9zIHPDrW50b21hcyBhIGxhcyBjYXVzYXMuIChFc3RvIGEgc3UgdmV6IGVzIGxhIHJhesOzbiBwb3IgbGEgY3VhbCBwZWRpcmxlcyBhIGxvcyBwcm9ncmFtYWRvcmVzIHF1ZSBkZXB1cmVuIGR1cmFudGUgbGFzIGVudHJldmlzdGFzIGRlIHRyYWJham8gZGEgdW5hIGltcHJlc2nDs24gbcOhcyBwcmVjaXNhIGRlIHN1IGhhYmlsaWRhZCBxdWUgcGVkaXJsZXMgcXVlIHByb2dyYW1lbikuCgoqIEZpbmFsbWVudGUsIGxvcyBleHBlcnRvcyBhIG1lbnVkbyBlc3TDoW4gdGFuIGZhbWlsaWFyaXphZG9zIGNvbiBzdSB0ZW1hIHF1ZSB5YSBubyBwdWVkZW4gaW1hZ2luYXIgbG8gcXVlIGVzIG5vIHZlciBlbCBtdW5kbyBkZSBlc2EgbWFuZXJhLiBFc3RvIHNpZ25pZmljYSBxdWUgYSBtZW51ZG8gc29uIG1lbm9zIGNhcGFjZXMgZGUgZW5zZcOxYXIgZWwgdGVtYSBxdWUgbGFzIHBlcnNvbmFzIGNvbiBtZW5vcyBleHBlcmllbmNpYSBxdWUgYcO6biByZWN1ZXJkYW4gaGFiZXJsbyBhcHJlbmRpZG8gZWxsb3MgbWlzbW9zLgoKRWwgw7psdGltbyBkZSBlc3RvcyBwdW50b3Mgc2UgbGxhbWEgcHVudG8gY2llZ28gZXhwZXJ0by4gQ29tbyBzZSBkZWZpbmnDsyBvcmlnaW5hbG1lbnRlIGVuIFtOYXRoMjAwM10sIGVzIGxhIHRlbmRlbmNpYSBkZSBsb3MgZXhwZXJ0b3MgYSBvcmdhbml6YXIgbGEgZXhwbGljYWNpw7NuIGRlIGFjdWVyZG8gY29uIGxvcyBwcmluY2lwaW9zIHByb2Z1bmRvcyBkZWwgdGVtYSBlbiBsdWdhciBkZSBndWlhcnNlIHBvciBsbyBxdWUgc3VzIGFsdW1ub3MgeWEgc2FiZW4uIFNlIHB1ZWRlIHN1cGVyYXIgY29uIGVsIGVudHJlbmFtaWVudG8sIHBlcm8gZXMgcGFydGUgZGUgbGEgcmF6w7NuIHBvciBsYSBxdWUgbm8gZXhpc3RlIHVuYSBjb3JyZWxhY2nDs24gZW50cmUgbG8gYnVlbm8gcXVlIGFsZ3VpZW4gZXMgcGFyYSBpbnZlc3RpZ2FyIGVuIHVuIMOhcmVhIHkgbG8gYnVlbm8gcXVlIGVzIHBhcmEgZW5zZcOxYXJsbyBbTWFyczIwMDJdLgoKCj4qKkxhIHBhbGFicmEgInNvbG8iKioKPgo+TG9zIGV4cGVydG9zIGEgbWVudWRvIHRyYWljaW9uYW4gc3UgcHVudG8gY2llZ28gdXNhbmRvIGxhIHBhbGFicmEgInNvbG8iLCBjb21vIGVuICJPaCwgZXMgZsOhY2lsLCBzaW1wbGVtZW50ZSBlbmNpZW5kZXMgdW5hIG51ZXZhIG3DoXF1aW5hIHZpcnR1YWwgeSBsdWVnbyBzb2xvIGluc3RhbGFzIGVzdG9zIGN1YXRybyBwYXJjaGVzIGVuIFVidW50dSB5IGx1ZWdvIHJlZXNjcmliZXMgdG9kbyBwcm9ncmFtYSBlbiB1biBsZW5ndWFqZSBmdW5jaW9uYWwgcHVybyAiLiBDb21vIGRpc2N1dGltb3MgZW4gZWwgQ2Fww610dWxvIDEwLCBoYWNlciBlc3RvIGluZGljYSBxdWUgZWwgb3JhZG9yIHBpZW5zYSBxdWUgZWwgcHJvYmxlbWEgZXMgdHJpdmlhbCB5IHF1ZSBsYSBwZXJzb25hIHF1ZSBsdWNoYSBjb24gw6lsIGRlYmUgc2VyIGVzdMO6cGlkYSwgYXPDrSBxdWUgbm8gaGFnYXMgZXN0by4KCiMjIE1hcGFzIGNvbmNlcHR1YWxlcwoKTnVlc3RyYSBoZXJyYW1pZW50YSBkZSBlbGVjY2nDs24gcGFyYSByZXByZXNlbnRhciBlbCBtb2RlbG8gbWVudGFsIGRlIGFsZ3VpZW4gZXMgdW4gbWFwYSBjb25jZXB0dWFsLCBlbiBlbCBxdWUgbG9zIGhlY2hvcyBzb24gYnVyYnVqYXMgeSBsYXMgY29uZXhpb25lcyBlc3TDoW4gZXRpcXVldGFkYXMgY29tbyBjb25leGlvbmVzLiBDb21vIGVqZW1wbG9zLCBsYSBGaWd1cmEgW2Y6IG1lbW9yaWEtZXN0YWNpb25lc10gbXVlc3RyYSBwb3IgcXXDqSBsYSBUaWVycmEgdGllbmUgZXN0YWNpb25lcyAoZGUgSUhNQyksIHkgZWwgQXDDqW5kaWNlIDIyIHByZXNlbnRhIG1hcGFzIGNvbmNlcHR1YWxlcyBwYXJhIGJpYmxpb3RlY2FzIGRlc2RlIHRyZXMgcHVudG9zIGRlIHZpc3RhLgoKCiFbRXN0YWNpb25lc10oLi9pbWdfdHJhbmluZy9zZWFzb25zLnN2ZykKCgpQYXJhIG1vc3RyYXIgY8OzbW8gc2UgcHVlZGVuIHVzYXIgbG9zIG1hcGFzIGNvbmNlcHR1YWxlcyBlbiBsYSBlbnNlw7FhbnphIGRlIHByb2dyYW1hY2nDs24sIGNvbnNpZGVyZSBlc3RvIHBhcmEgZWwgYnVjbGUgZW4gUHl0aG9uOgoKICAgIGZvciBsZXR0ZXIgaW4gImFiYyI6CiAgICAgICAgcHJpbnQobGV0dGVyKQogICAgd2hvc2Ugb3V0cHV0IGlzOgogICAgCiAgICBhCiAgICBiCiAgICBjCgoKTGFzIHRyZXMgImNvc2FzIiBjbGF2ZSBlbiBlc3RlIGNpY2xvIHNlIG11ZXN0cmFuIGVuIGxhIHBhcnRlIHN1cGVyaW9yIGRlIGxhIEZpZ3VyYSBbZjogbG9vcCBkZSBtZW1vcmlhXSwgcGVybyBzb24gc29sbyBsYSBtaXRhZCBkZSBsYSBoaXN0b3JpYS4gTGEgdmVyc2nDs24gYW1wbGlhZGEgZW4gbGEgcGFydGUgaW5mZXJpb3IgbXVlc3RyYSBsYXMgcmVsYWNpb25lcyBlbnRyZSBlc2FzIGNvc2FzLCBxdWUgc29uIHRhbiBpbXBvcnRhbnRlcyBwYXJhIGxhIGNvbXByZW5zacOzbiBjb21vIGxvcyBjb25jZXB0b3MgbWlzbW9zLgoKIVtmb3IgbG9vcF0oLi9pbWdfdHJhbmluZy9mb3ItbG9vcC5zdmcpCgpMb3MgbWFwYXMgY29uY2VwdHVhbGVzIHNlIHB1ZWRlbiB1c2FyIGRlIG11Y2hhcyBtYW5lcmFzOgoKKipBeXVkYXIgYSBsb3MgbWFlc3Ryb3MgYSBkZXNjdWJyaXIgcXXDqSBlc3TDoW4gdHJhdGFuZG8gZGUgZW5zZcOxYXIuKiogClVuIG1hcGEgY29uY2VwdHVhbCBzZXBhcmEgZWwgY29udGVuaWRvIGRlbCBvcmRlbjogZW4gbnVlc3RyYSBleHBlcmllbmNpYSwgbGFzIHBlcnNvbmFzIHJhcmEgdmV6IHRlcm1pbmFuIGVuc2XDsWFuZG8gY29zYXMgZW4gZWwgb3JkZW4gZW4gcXVlIGxhcyBkaWJ1amFyb24gcG9yIHByaW1lcmEgdmV6LgoKKipBeXVkYSBhIGxhIGNvbXVuaWNhY2nDs24gZW50cmUgZGlzZcOxYWRvcmVzIGRlIGxlY2Npb25lcy4qKgpFcyBwcm9iYWJsZSBxdWUgbG9zIG1hZXN0cm9zIGNvbiBpZGVhcyBtdXkgZGlmZXJlbnRlcyBkZSBsbyBxdWUgZXN0w6FuIHRyYXRhbmRvIGRlIGVuc2XDsWFyIGRpcmlqYW4gYSBzdXMgYWx1bW5vcyBlbiBkaWZlcmVudGVzIGRpcmVjY2lvbmVzLiBEaWJ1amFyIHkgY29tcGFydGlyIG1hcGFzIGNvbmNlcHR1YWxlcyBwdWVkZSBheXVkYXIgYSBwcmV2ZW5pciBlc3RvLiBZIHPDrSwgZGlmZXJlbnRlcyBwZXJzb25hcyBwdWVkZW4gdGVuZXIgZGlmZXJlbnRlcyBtYXBhcyBjb25jZXB0dWFsZXMgcGFyYSBlbCBtaXNtbyB0ZW1hLCBwZXJvIGVsIG1hcGVvIGNvbmNlcHR1YWwgaGFjZSBleHBsw61jaXRhcyBlc2FzIGRpZmVyZW5jaWFzLgoKKipBeXVkYSBhIGxhIGNvbXVuaWNhY2nDs24gY29uIGxvcyBhbHVtbm9zLioqClNpIGJpZW4gZXMgcG9zaWJsZSBkYXIgYSBsb3MgYWx1bW5vcyB1biBtYXBhIHByZXZpYW1lbnRlIGRpYnVqYWRvIGFsIGNvbWllbnpvIGRlIHVuYSBsZWNjacOzbiBwYXJhIHF1ZSBsbyBhbm90ZW4sIGVzIG1lam9yIGRpYnVqYXJsbyBwaWV6YSBwb3IgcGllemEgbWllbnRyYXMgc2UgZW5zZcOxYSBhIHJlZm9yemFyIGxvcyBsYXpvcyBlbnRyZSBsbyBxdWUgZXN0w6EgZW4gZWwgbWFwYSB5IGxvIHF1ZSBkaWpvIGVsIG1hZXN0cm8uIFZvbHZlcmVtb3MgYSBlc3RhIGlkZWEgZW4gbGEgU2VjY2nDs24gNC4xLgoKKipQYXJhIGV2YWx1YWNpw7NuKioKSGFjZXIgcXVlIGxvcyBhbHVtbm9zIGRpYnVqZW4gbG8gcXVlIGNyZWVuIHF1ZSBhY2FiYW4gZGUgYXByZW5kZXIgbGUgbXVlc3RyYSBhbCBtYWVzdHJvIGxvIHF1ZSBzZSBwZXJkacOzIHkgbG8gcXVlIHNlIGNvbXVuaWPDsyBtYWwuIExhIHJldmlzacOzbiBkZSBsb3MgbWFwYXMgY29uY2VwdHVhbGVzIGRlIGxvcyBhbHVtbm9zIGxsZXZhIGRlbWFzaWFkbyB0aWVtcG8gY29tbyB1bmEgZXZhbHVhY2nDs24gZm9ybWF0aXZhIGR1cmFudGUgbGEgY2xhc2UsIHBlcm8gZXMgbXV5IMO6dGlsIGVuIGNsYXNlcyBzZW1hbmFsZXMgdW5hIHZleiBxdWUgbG9zIGFsdW1ub3MgZXN0w6FuIGZhbWlsaWFyaXphZG9zIGNvbiBsYSB0w6ljbmljYS4gTGEgY2FsaWZpY2FjacOzbiBlcyBuZWNlc2FyaWEgcG9ycXVlIGN1YWxxdWllciBudWV2YSBmb3JtYSBkZSBoYWNlciBsYXMgY29zYXMgaW5pY2lhbG1lbnRlIHJhbGVudGl6YSBhIGxhcyBwZXJzb25hczsgc2kgdW4gYWx1bW5vIGVzdMOhIHRyYXRhbmRvIGRlIGVudGVuZGVyIGxhIHByb2dyYW1hY2nDs24gYsOhc2ljYSwgcGVkaXJsZXMgcXVlIGRlc2N1YnJhbiBjw7NtbyBkaWJ1amFyIHN1cyBwZW5zYW1pZW50b3MgYWwgbWlzbW8gdGllbXBvIGVzIHVuYSBjYXJnYSBpbmp1c3RhLgoKCkFsZ3Vub3MgbWFlc3Ryb3MgdGFtYmnDqW4gc29uIGVzY8OpcHRpY29zIHNvYnJlIHNpIGxvcyBub3ZhdG9zIHB1ZWRlbiBtYXBlYXIgZWZlY3RpdmFtZW50ZSBzdSBjb21wcmVuc2nDs24sIHlhIHF1ZSBsYSBpbnRyb3NwZWNjacOzbiB5IGxhIGV4cGxpY2FjacOzbiBkZSBsYSBjb21wcmVuc2nDs24gc29uIGdlbmVyYWxtZW50ZSBoYWJpbGlkYWRlcyBtw6FzIGF2YW56YWRhcyBxdWUgbGEgY29tcHJlbnNpw7NuIG1pc21hLiBQb3IgZWplbXBsbywgW0tlcHAyMDA4XSBhbmFsaXrDsyBlbCB1c28gZGVsIG1hcGVvIGNvbmNlcHR1YWwgZW4gbGEgZWR1Y2FjacOzbiBpbmZvcm3DoXRpY2EuIFVubyBkZSBzdXMgaGFsbGF6Z29zIGZ1ZSBxdWUsICIuLi4gZWwgbWFwZW8gY29uY2VwdHVhbCBlcyBwcm9ibGVtw6F0aWNvIHBhcmEgbXVjaG9zIGVzdHVkaWFudGVzIHBvcnF1ZSBwb25lIGEgcHJ1ZWJhIGxhIGNvbXByZW5zacOzbiBwZXJzb25hbCBlbiBsdWdhciBkZWwgY29ub2NpbWllbnRvIHF1ZSBzZSBhcHJlbmRpw7Mgc2ltcGxlbWVudGUgZGUgbWVtb3JpYSIuIENvbW8gYWxndWllbiBxdWUgdmFsb3JhIGxhIGNvbXByZW5zacOzbiBzb2JyZSBlbCBjb25vY2ltaWVudG8gZGUgbWVtb3JpYSwgY29uc2lkZXJvIHF1ZSBlcyB1biBiZW5lZmljaW8uCgoKPioqQ29taWVuY2UgZW4gY3VhbHF1aWVyIGx1Z2FyKioKPgo+Q3VhbmRvIHNlIGxlcyBwaWRlIHBvciBwcmltZXJhIHZleiBxdWUgZGlidWplbiB1biBtYXBhIGNvbmNlcHR1YWwsIG11Y2hhcyBwZXJzb25hcyBubyBzYWJyw6FuIHBvciBkw7NuZGUgY29tZW56YXIuIEN1YW5kbyBlc3RvIHN1Y2VkYSwgZXNjcmliYSBkb3MgcGFsYWJyYXMgYXNvY2lhZGFzIGNvbiBlbCB0ZW1hIHF1ZSBlc3TDoSB0cmF0YW5kbyBkZSBtYXBlYXIsIGx1ZWdvIGRpYnVqZSB1bmEgbMOtbmVhIGVudHJlIGVsbGFzIHkgYWdyZWd1ZSB1bmEgZXRpcXVldGEgcXVlIGV4cGxpcXVlIGPDs21vIHNlIHJlbGFjaW9uYW4gZXNhcyBkb3MgaWRlYXMuIEx1ZWdvIHB1ZWRlIHByZWd1bnRhciBxdcOpIG90cmFzIGNvc2FzIGVzdMOhbiByZWxhY2lvbmFkYXMgZGUgbGEgbWlzbWEgbWFuZXJhLCBxdcOpIHBhcnRlcyB0aWVuZW4gZXNhcyBjb3NhcyBvIHF1w6kgc3VjZWRlIGFudGVzIG8gZGVzcHXDqXMgZGUgbG9zIGNvbmNlcHRvcyBxdWUgeWEgZXN0w6FuIGVuIGxhIHDDoWdpbmEgcGFyYSBkZXNjdWJyaXIgbcOhcyBub2RvcyB5IGFyY29zLiBEZXNwdcOpcyBkZSBlc28sIGxhIHBhcnRlIGRpZsOtY2lsIGEgbWVudWRvIHNlIGRldGllbmUuCgoKTG9zIG1hcGFzIGNvbmNlcHR1YWxlcyBzb24gc29sbyB1bmEgZm9ybWEgZGUgcmVwcmVzZW50YXIgbnVlc3RyYSBjb21wcmVuc2nDs24gZGUgdW4gdGVtYSBbRXBwbDIwMDZdOyBvdHJvcyBpbmNsdXllbiBkaWFncmFtYXMgZGUgVmVubiwgZGlhZ3JhbWFzIGRlIGZsdWpvIHkgw6FyYm9sZXMgZGUgZGVjaXNpw7NuIFtBYmVsMjAwOV0uIFRvZG8gZXN0byBleHRlcm5hbGl6YSBsYSBjb2duaWNpw7NuLCBlcyBkZWNpciwgaGFjZSBxdWUgbG9zIG1vZGVsb3MgbWVudGFsZXMgc2VhbiB2aXNpYmxlcyBwYXJhIHF1ZSBwdWVkYW4gY29tcGFyYXJzZSB5IGNvbWJpbmFyc2UuCgoKPiAqKlRyYWJham8gcnVkbyB5IGhvbmVzdGlkYWQqKgo+Cj5NdWNob3MgZGlzZcOxYWRvcmVzIGRlIGludGVyZmFjZXMgZGUgdXN1YXJpbyBjcmVlbiBxdWUgZXMgbWVqb3IgbW9zdHJhciBhIGxhIGdlbnRlIGJvY2V0b3MgZGUgc3VzIGlkZWFzIGVuIGx1Z2FyIGRlIG1hcXVldGFzIHB1bGlkYXMgcG9ycXVlIGVzIG3DoXMgcHJvYmFibGUgcXVlIGxhcyBwZXJzb25hcyBkZW4gY29tZW50YXJpb3MgaG9uZXN0b3Mgc29icmUgYWxnbyBxdWUgY3JlZW4gcXVlIHNvbG8gdG9tw7MgdW5vcyBtaW51dG9zIHBhcmEgY3JlYXI6IHNpIHBhcmVjZSBxdWUgRXN0w6FuIGNyaXRpY2FuZG8gcXVlIHRvbWFyb24gaG9yYXMgY3JlYXIsIGxhIG1heW9yw61hIHNhY2Fyw6Egc3VzIGdvbHBlcy4gQWwgZGlidWphciBtYXBhcyBjb25jZXB0dWFsZXMgcGFyYSBtb3RpdmFyIGxhIGRpc2N1c2nDs24sIHBvciBsbyB0YW50bywgZGViZSB1c2FyIGzDoXBpY2VzIHkgcGFwZWwgZGUgZGVzZWNobyAobyBib2zDrWdyYWZvcyB5IHVuYSBwaXphcnJhKSBlbiBsdWdhciBkZSBoZXJyYW1pZW50YXMgZGUgZGlidWpvIGRlIGNvbXB1dGFkb3JhIHNvZmlzdGljYWRhcy4KCiMjIFNpZXRlIG3DoXMgbyBtZW5vcyBkb3MKClNpIGJpZW4gZWwgbW9kZWxvIGdyw6FmaWNvIGRlbCBjb25vY2ltaWVudG8gZXMgaW5jb3JyZWN0byBwZXJvIMO6dGlsLCBvdHJvIG1vZGVsbyBzaW1wbGUgdGllbmUgdW5hIGJhc2UgZmlzaW9sw7NnaWNhIG3DoXMgc8OzbGlkYS4gQ29tbyB1bmEgYXByb3hpbWFjacOzbiBhcHJveGltYWRhLCBsYSBtZW1vcmlhIGh1bWFuYSBzZSBwdWVkZSBkaXZpZGlyIGVuIGRvcyBjYXBhcyBkaXN0aW50YXMuIEVsIHByaW1lcm8sIGxsYW1hZG8gbWVtb3JpYSBhIGxhcmdvIHBsYXpvIG8gcGVyc2lzdGVudGUsIGVzIGRvbmRlIGFsbWFjZW5hbW9zIGNvc2FzIGNvbW8gbG9zIG5vbWJyZXMgZGUgbnVlc3Ryb3MgYW1pZ29zLCBsYSBkaXJlY2Npw7NuIGRlIG51ZXN0cmEgY2FzYSB5IGxvIHF1ZSBoaXpvIGVsIHBheWFzbyBlbiBudWVzdHJhIGZpZXN0YSBkZSBvY3Rhdm8gY3VtcGxlYcOxb3MgcXVlIHRhbnRvIG5vcyBhc3VzdMOzLiBTdSBjYXBhY2lkYWQgZXMgZXNlbmNpYWxtZW50ZSBpbGltaXRhZGEsIHBlcm8gc3UgYWNjZXNvIGVzIGxlbnRvLCBkZW1hc2lhZG8gbGVudG8gcGFyYSBheXVkYXJub3MgYSBsaWRpYXIgY29uIGxlb25lcyBoYW1icmllbnRvcyB5IGZhbWlsaWFyZXMgZGVzY29udGVudG9zLgoKUG9yIGxvIHRhbnRvLCBsYSBldm9sdWNpw7NuIG5vcyBoYSBkYWRvIHVuIHNlZ3VuZG8gc2lzdGVtYSBsbGFtYWRvIG1lbW9yaWEgZGUgdHJhYmFqbyBvIGRlIGNvcnRvIHBsYXpvLiBFcyBtdWNobyBtw6FzIHLDoXBpZG8sIHBlcm8gdGFtYmnDqW4gbXVjaG8gbcOhcyBwZXF1ZcOxbzogW01pbGwxOTU2XSBlc3RpbcOzIHF1ZSBsYSBtZW1vcmlhIGRlIHRyYWJham8gZGVsIGFkdWx0byBwcm9tZWRpbyBzb2xvIHBvZMOtYSBjb250ZW5lciA3IMKxIDIgZWxlbWVudG9zIGEgbGEgdmV6LiBFc3RhIGVzIGxhIHJhesOzbiBwb3IgbGEgY3VhbCBsb3MgbsO6bWVyb3MgZGUgdGVsw6lmb25vIHRpZW5lbiA3IHUgOCBkw61naXRvcyBkZSBsYXJnbzogY3VhbmRvIGxvcyB0ZWzDqWZvbm9zIHRlbsOtYW4gbWFyY2FjaW9uZXMgZW4gbHVnYXIgZGUgdGVjbGFkb3MsIGVzYSBlcmEgbGEgY2FkZW5hIGRlIG7Dum1lcm9zIG3DoXMgbGFyZ2EgcXVlIGxhIG1heW9yw61hIGRlIGxvcyBhZHVsdG9zIHBvZMOtYSByZWNvcmRhciBjb24gcHJlY2lzacOzbiBwb3IgZWwgdGllbXBvIHF1ZSB0YXJkw7MgZW4gbWFyY2FyIHZhcmlhcyB2ZWNlcy4KCgo+KipQYXJ0aWNpcGFjacOzbioqCj4KPkVsIHRhbWHDsW8gZGUgbGEgbWVtb3JpYSBkZSB0cmFiYWpvIGEgdmVjZXMgc2UgdXNhIHBhcmEgZXhwbGljYXIgcG9yIHF1w6kgbG9zIGVxdWlwb3MgZGVwb3J0aXZvcyB0aWVuZGVuIGEgdGVuZXIgYXByb3hpbWFkYW1lbnRlIG1lZGlhIGRvY2VuYSBkZSBtaWVtYnJvcyBvIHNlIGRpdmlkZW4gZW4gc3ViZ3J1cG9zIGNvbW8gbG9zIGRlbGFudGVyb3MgeSBsb3MgZGUgYXRyw6FzIGVuIGVsIHJ1Z2J5LiBUYW1iacOpbiBzZSB1c2EgcGFyYSBleHBsaWNhciBwb3IgcXXDqSBsYXMgcmV1bmlvbmVzIHNvbG8gc29uIHByb2R1Y3RpdmFzIGhhc3RhIHVuIGNpZXJ0byBuw7ptZXJvIGRlIHBhcnRpY2lwYW50ZXM6IHNpIHZlaW50ZSBwZXJzb25hcyBpbnRlbnRhbiBkaXNjdXRpciBhbGdvLCBzZSBlc3TDoW4gY2VsZWJyYW5kbyB0cmVzIHJldW5pb25lcyBhIGxhIHZleiBvIG1lZGlhIGRvY2VuYSBkZSBwZXJzb25hcyBlc3TDoW4gaGFibGFuZG8gbWllbnRyYXMgdG9kb3MgZXNjdWNoYW4uIEVsIGFyZ3VtZW50byBlcyBxdWUgbGEgY2FwYWNpZGFkIGRlIGxhcyBwZXJzb25hcyBwYXJhIHJlYWxpemFyIHVuIHNlZ3VpbWllbnRvIGRlIHN1cyBwYXJlcyBlc3TDoSBsaW1pdGFkYSBwb3IgZWwgdGFtYcOxbyBkZSBsYSBtZW1vcmlhIGRlIHRyYWJham8sIHBlcm8gcXVlIHlvIHNlcGEsIGVsIHbDrW5jdWxvIG51bmNhIGhhIHNpZG8gcHJvYmFkby4KCgo3IMKxIDIgZXMgZWwgbsO6bWVybyBtw6FzIGltcG9ydGFudGUgZW4gbGEgZW5zZcOxYW56YS4gVW4gbWFlc3RybyBubyBwdWVkZSBjb2xvY2FyIGluZm9ybWFjacOzbiBkaXJlY3RhbWVudGUgZW4gbGEgbWVtb3JpYSBhIGxhcmdvIHBsYXpvIGRlIHVuIGFsdW1uby4gRW4gY2FtYmlvLCBsbyBxdWUgcHJlc2VudGVuIHByaW1lcm8gc2UgYWxtYWNlbmEgZW4gbGEgbWVtb3JpYSBhIGNvcnRvIHBsYXpvIGRlbCBhbHVtbm8sIHkgc29sbyBzZSB0cmFuc2ZpZXJlIGEgbGEgbWVtb3JpYSBhIGxhcmdvIHBsYXpvIGRlc3B1w6lzIGRlIHF1ZSBzZSBoYXlhIG1hbnRlbmlkbyBhbGzDrSB5IGVuc2F5YWRvIChTZWNjacOzbiA1LjEpLiBTaSBlbCBtYWVzdHJvIHByZXNlbnRhIGRlbWFzaWFkYSBpbmZvcm1hY2nDs24gZGVtYXNpYWRvIHLDoXBpZG8sIGxhIG51ZXZhIGluZm9ybWFjacOzbiBkZXNwbGF6YSBhIGxhIGFudGVyaW9yIGFudGVzIGRlIHF1ZSBzZSB0cmFuc2ZpZXJhIGxhIMO6bHRpbWEuCgpFc3RhIGVzIHVuYSBkZSBsYXMgZm9ybWFzIGRlIHV0aWxpemFyIHVuIG1hcGEgY29uY2VwdHVhbCBhbCBkaXNlw7FhciB1bmEgbGVjY2nDs246IGF5dWRhIGEgZ2FyYW50aXphciBxdWUgbG9zIHJlY3VlcmRvcyBhIGNvcnRvIHBsYXpvIGRlIGxvcyBhbHVtbm9zIG5vIHNlIHNvYnJlY2FyZ3Vlbi4gVW5hIHZleiBxdWUgc2UgZGlidWphIGVsIG1hcGEsIGVsIG1hZXN0cm8gZWxpZ2UgdW5hIHN1YnNlY2Npw7NuIHF1ZSBzZSBhanVzdGFyw6EgYSBsYSBtZW1vcmlhIGEgY29ydG8gcGxhem8geSBjb25kdWNpcsOhIGEgdW5hIGV2YWx1YWNpw7NuIGZvcm1hdGl2YSAoRmlndXJhIFtmOiBtZW1vcmlhLWZvdG9zw61udGVzaXNdKSwgbHVlZ28gYWdyZWdhIG90cmEgc3Vic2VjY2nDs24gcGFyYSBlbCBwcsOzeGltbyBlcGlzb2RpbyBkZSBsYSBsZWNjacOzbiB5IGFzw60gc3VjZXNpdmFtZW50ZS4KCiFbRm90b3NpbnRlc2lzXSguL2ltZ190cmFuaW5nL3Bob3Rvc3ludGhlc2lzLnN2ZykKCj4qKkNvbnN0cnV5ZW5kbyBNYXBhcyBDb25jZXB0dWFsZXMgSnVudG9zKioKPgo+TGEgcHLDs3hpbWEgdmV6IHF1ZSB0ZW5nYSB1bmEgcmV1bmnDs24gZGUgZXF1aXBvLCBlbnRyZWd1ZSBhIHRvZG9zIHVuYSBob2phIGRlIHBhcGVsIHkgcMOtZGFsZXMgcXVlIHBhc2VuIHVub3MgbWludXRvcyBkaWJ1amFuZG8gc3UgcHJvcGlvIG1hcGEgY29uY2VwdHVhbCBkZWwgcHJveWVjdG8gZW4gZWwgcXVlIGVzdMOhbiB0cmFiYWphbmRvLiBBIGxhIGN1ZW50YSBkZSB0cmVzLCBoYWdhIHF1ZSB0b2RvcyByZXZlbGVuIHN1cyBtYXBhcyBjb25jZXB0dWFsZXMgYSBzdSBncnVwby4gTGEgZGlzY3VzacOzbiBxdWUgc2lndWUgcHVlZGUgYXl1ZGFyIGEgbGFzIHBlcnNvbmFzIGEgZW50ZW5kZXIgcG9yIHF1w6kgc2UgaGFuIGVzdGFkbyB0cm9wZXphbmRvLgoKClRlbmdhIGVuIGN1ZW50YSBxdWUgZWwgbW9kZWxvIHNpbXBsZSBkZSBtZW1vcmlhIHByZXNlbnRhZG8gYXF1w60gaGEgc2lkbyByZWVtcGxhemFkbyBlbiBncmFuIG1lZGlkYSBwb3IgdW5vIG3DoXMgc29maXN0aWNhZG8gZW4gZWwgcXVlIGxhIG1lbW9yaWEgYSBjb3J0byBwbGF6byBzZSBkaXZpZGUgZW4gdmFyaWFzIHRpZW5kYXMgbW9kYWxlcyAocG9yIGVqZW1wbG8sIHBhcmEgbWVtb3JpYSB2aXN1YWwgZnJlbnRlIGEgbWVtb3JpYSBsaW5nw7zDrXN0aWNhKSwgY2FkYSB1bmEgZGUgbGFzIGN1YWxlcyByZWFsaXphIHVuIHByZXByb2Nlc2FtaWVudG8gaW52b2x1bnRhcmlvIFtNaWxsMjAxNmEgXSBQb3IgbG8gdGFudG8sIG51ZXN0cmEgcHJlc2VudGFjacOzbiBlcyB1biBlamVtcGxvIGRlIHVuIG1vZGVsbyBtZW50YWwgcXVlIGF5dWRhIGFsIGFwcmVuZGl6YWplIHkgYWwgdHJhYmFqbyBkaWFyaW8uCgoKIyMjIFJlY29ub2NpbWllbnRvIGRlIHBhdHJvbmVzCgpJbnZlc3RpZ2FjaW9uZXMgcmVjaWVudGVzIHN1Z2llcmVuIHF1ZSBlbCB0YW1hw7FvIHJlYWwgZGUgbGEgbWVtb3JpYSBhIGNvcnRvIHBsYXpvIHBvZHLDrWEgc2VyIHRhbiBiYWpvIGNvbW8gNCDCsSAxIMOtdGVtcyBbRGlkYTIwMTZdLiBQYXJhIG1hbmVqYXIgY29uanVudG9zIGRlIGluZm9ybWFjacOzbiBtw6FzIGdyYW5kZXMsIG51ZXN0cmFzIG1lbnRlcyBjcmVhbiBmcmFnbWVudG9zLiBQb3IgZWplbXBsbywgbGEgbWF5b3LDrWEgZGUgbm9zb3Ryb3MgcmVjdWVyZGEgbGFzIHBhbGFicmFzIGNvbW8gZWxlbWVudG9zIGluZGl2aWR1YWxlcyBlbiBsdWdhciBkZSBzZWN1ZW5jaWFzIGRlIGxldHJhcy4gRGVsIG1pc21vIG1vZG8sIGVsIHBhdHLDs24gZm9ybWFkbyBwb3IgY2luY28gcHVudG9zIGVuIGNhcnRhcyBvIGRhZG9zIHNlIHJlY3VlcmRhIGNvbW8gdW4gdG9kbyBlbiBsdWdhciBkZSBjb21vIGNpbmNvIHBpZXphcyBkZSBpbmZvcm1hY2nDs24gc2VwYXJhZGFzLgoKTG9zIGV4cGVydG9zIHRpZW5lbiBtw6FzIHkgbcOhcyBmcmFnbWVudG9zIHF1ZSBsb3Mgbm8gZXhwZXJ0b3MsIGVzIGRlY2lyLCBsb3MgZXhwZXJ0b3MgInZlbiIgcGF0cm9uZXMgbcOhcyBncmFuZGVzIHkgdGllbmVuIG3DoXMgcGF0cm9uZXMgcGFyYSBjb21wYXJhciBjb3Nhcy4gRXN0byBsZXMgcGVybWl0ZSByYXpvbmFyIGEgdW4gbml2ZWwgc3VwZXJpb3IgeSBidXNjYXIgaW5mb3JtYWNpw7NuIGRlIG1hbmVyYSBtw6FzIHLDoXBpZGEgeSBwcmVjaXNhLiBTaW4gZW1iYXJnbywgbGEgZnJhZ21lbnRhY2nDs24gdGFtYmnDqW4gcHVlZGUgaW5kdWNpcm5vcyBhIGVycm9yIHNpIGlkZW50aWZpY2Ftb3MgZXJyw7NuZWFtZW50ZSBsYXMgY29zYXM6IGxvcyByZWNpw6luIGxsZWdhZG9zIGEgdmVjZXMgcmVhbG1lbnRlIHB1ZWRlbiB2ZXIgY29zYXMgcXVlIGxvcyBleHBlcnRvcyBoYW4gdmlzdG8geSBwZXJkaWRvLgoKRGFkYSBsYSBpbXBvcnRhbmNpYSBkZSBsYSBmcmFnbWVudGFjacOzbiBwYXJhIHBlbnNhciwgZXMgdGVudGFkb3IgaWRlbnRpZmljYXIgcGF0cm9uZXMgZGUgZGlzZcOxbyB5IGVuc2XDsWFybG9zIGRpcmVjdGFtZW50ZS4gRXN0b3MgcGF0cm9uZXMgYXl1ZGFuIGEgbG9zIHByb2Zlc2lvbmFsZXMgY29tcGV0ZW50ZXMgYSBwZW5zYXIgeSBoYWJsYXIgZW50cmUgZWxsb3MgZW4gbXVjaG9zIGRvbWluaW9zIChpbmNsdWlkYSBsYSBlbnNlw7FhbnphIFtCZXJnMjAxMl0pLCBwZXJvIGxvcyBjYXTDoWxvZ29zIGRlIHBhdHJvbmVzIHNvbiBkZW1hc2lhZG8gc2Vjb3MgeSBkZW1hc2lhZG8gYWJzdHJhY3RvcyBwYXJhIHF1ZSBsb3Mgbm92YXRvcyB0ZW5nYW4gc2VudGlkbyBwb3Igc8OtIG1pc21vcy4gRGljaG8gZXN0bywgZGFyIG5vbWJyZXMgYSB1biBwZXF1ZcOxbyBuw7ptZXJvIGRlIHBhdHJvbmVzIHBhcmVjZSBheXVkYXIgY29uIGxhIGVuc2XDsWFuemEsIHByaW5jaXBhbG1lbnRlIGFsIGRhciBhIGxvcyBhbHVtbm9zIHVuIHZvY2FidWxhcmlvIG3DoXMgcmljbyBwYXJhIHBlbnNhciB5IGNvbXVuaWNhcnNlLiBbS3VpdDIwMDQsIEJ5Y2syMDA1LCBTYWphMjAwNl0gVm9sdmVyZW1vcyBhIGVzdG8gZW4gbGEgU2VjY2nDs24gNy41LgoKIyMgQ29udmVydGlyc2UgZW4gdW4gZXhwZXJ0bwoKRW50b25jZXMsIMK/Y8OzbW8gc2UgY29udmllcnRlIGFsZ3VpZW4gZW4gdW4gZXhwZXJ0bz8gTGEgaWRlYSBkZSBxdWUgZGlleiBtaWwgaG9yYXMgZGUgcHLDoWN0aWNhIGxvIGhhcsOhbiBlcyBhbXBsaWFtZW50ZSBjaXRhZGEsIHBlcm8gcHJvYmFibGVtZW50ZSBubyBzZWEgY2llcnRvOiBoYWNlciBsbyBtaXNtbyB1bmEgeSBvdHJhIHZleiBlcyBtdWNobyBtw6FzIHByb2JhYmxlIHF1ZSBzb2xpZGlmaXF1ZSBsb3MgbWFsb3MgaMOhYml0b3MgcXVlIG1lam9yZSBlbCByZW5kaW1pZW50by4gTG8gcXVlIHJlYWxtZW50ZSBmdW5jaW9uYSBlcyBoYWNlciBjb3NhcyBzaW1pbGFyZXMgcGVybyBzdXRpbG1lbnRlIGRpZmVyZW50ZXMsIHByZXN0YXIgYXRlbmNpw7NuIGEgbG8gcXVlIGZ1bmNpb25hIHkgbG8gcXVlIG5vIGZ1bmNpb25hLCB5IGx1ZWdvIGNhbWJpYXIgZWwgY29tcG9ydGFtaWVudG8gZW4gcmVzcHVlc3RhIGEgZXNhIHJldHJvYWxpbWVudGFjacOzbiBwYXJhIG1lam9yYXIgYWN1bXVsYXRpdmFtZW50ZS4gRXN0byBzZSBsbGFtYSAqKnByw6FjdGljYSBkZWxpYmVyYWRhIG8gcmVmbGV4aXZhKiosIHkgdW5hIHByb2dyZXNpw7NuIGNvbcO6biBlcyBxdWUgbGFzIHBlcnNvbmFzIHBhc2VuIHBvciB0cmVzIGV0YXBhczoKCioqQWN0dWFyIHNvYnJlIGxhIHJldHJvYWxpbWVudGFjacOzbiBkZSBvdHJvcy4qKgoKVW4gYWx1bW5vIHBvZHLDrWEgZXNjcmliaXIgdW4gZW5zYXlvIHNvYnJlIGxvIHF1ZSBoaWNpZXJvbiBlbiBzdXMgdmFjYWNpb25lcyBkZSB2ZXJhbm8geSByZWNpYmlyIGNvbWVudGFyaW9zIGRlIHVuIG1hZXN0cm8gcXVlIGxlcyBkaWdhIGPDs21vIG1lam9yYXJsby4KCioqRGFyIGNvbWVudGFyaW9zIHNvYnJlIGVsIHRyYWJham8gZGUgb3Ryb3MuKioKCkVsIGFsdW1ubyBwdWVkZSBjcml0aWNhciBlbCBkZXNhcnJvbGxvIGRlbCBwZXJzb25hamUgZW4gdW5hIG5vdmVsYSBkZSBIYXJyeSBQb3R0ZXIgeSBvYnRlbmVyIGNvbWVudGFyaW9zIGRlbCBtYWVzdHJvIHNvYnJlIHN1IGNyw610aWNhLgoKKipEYXIgcmV0cm9hbGltZW50YWNpw7NuIGEgZWxsb3MgbWlzbW9zLioqCgpFbiBhbGfDum4gbW9tZW50bywgZWwgYWx1bW5vIGNvbWllbnphIGEgY3JpdGljYXIgc3UgcHJvcGlvIHRyYWJham8gYSBtZWRpZGEgcXVlIGxvIGhhY2UgdXRpbGl6YW5kbyBsYXMgaGFiaWxpZGFkZXMgcXVlIGFob3JhIGhhIGRlc2Fycm9sbGFkby4gSGFjZXIgZXN0byBlcyBtdWNobyBtw6FzIHLDoXBpZG8gcXVlIGVzcGVyYXIgbG9zIGNvbWVudGFyaW9zIGRlIG90cm9zIHF1ZSBsYSBjb21wZXRlbmNpYSBkZSByZXBlbnRlIGNvbWllbnphIGEgZGVzcGVnYXIuCgoKPioqwr9RdcOpIGN1ZW50YSBjb21vIHByw6FjdGljYSBkZWxpYmVyYWRhPyoqCj4KPltNYWNuMjAxNF0gZGVzY3VicmnDsyBxdWUsICIuLi4gbGEgcHLDoWN0aWNhIGRlbGliZXJhZGEgZXhwbGljw7MgZWwgMjYlIGRlIGxhIHZhcmlhY2nDs24gZW4gZWwgcmVuZGltaWVudG8gZGUgbG9zIGp1ZWdvcywgZWwgMjElIGRlIGxhIG3DunNpY2EsIGVsIDE4JSBkZSBsb3MgZGVwb3J0ZXMsIGVsIDQlIGRlIGxhIGVkdWNhY2nDs24geSBtZW5vcyBkZWwgMSUgZGUgbGFzIHByb2Zlc2lvbmVzIi4gU2luIGVtYmFyZ28sIFtFcmljMjAxNl0gY3JpdGljw7MgZXN0ZSBoYWxsYXpnbyBkaWNpZW5kbzog4oCcUmVzdW1pciBjYWRhIGhvcmEgZGUgY3VhbHF1aWVyIHRpcG8gZGUgcHLDoWN0aWNhIGR1cmFudGUgbGEgY2FycmVyYSBkZSB1biBpbmRpdmlkdW8gaW1wbGljYSBxdWUgZWwgaW1wYWN0byBkZSB0b2RvcyBsb3MgdGlwb3MgZGUgYWN0aXZpZGFkIHByw6FjdGljYSBlbiBlbCByZW5kaW1pZW50byBlcyBpZ3VhbCwgdW5hIHN1cG9zaWNpw7NuIGRlIHF1ZSAuLi4gZXMgaW5jb25zaXN0ZW50ZSBjb24gbGEgZXZpZGVuY2lhLiAiIFBhcmEgc2VyIGVmZWN0aXZhLCBsYSBwcsOhY3RpY2EgZGVsaWJlcmFkYSByZXF1aWVyZSB1biBvYmpldGl2byBkZSByZW5kaW1pZW50byBjbGFybyB5IHVuYSByZXRyb2FsaW1lbnRhY2nDs24gaW5mb3JtYXRpdmEgaW5tZWRpYXRhLCBxdWUgc29uIGNvc2FzIHBvciBsYXMgcXVlIGxvcyBtYWVzdHJvcyBkZWJlbiBlc2ZvcnphcnNlIGRlIHRvZG9zIG1vZG9zLgoKCiMjIEVqZXJjaWNpb3MKCiMjIyBNYXBlbyBkZSBjb25jZXB0b3MgKHBhcmVzIC8gMzApKgoKRGlidWphIHVuIG1hcGEgY29uY2VwdHVhbCBkZSBhbGdvIHF1ZSBlbnNlw7FhcsOtYXMgZW4gY2luY28gbWludXRvcy4gTmVnb2NpZSBjb24gdW4gc29jaW8geSBjcml0aXF1ZSBsb3MgbWFwYXMgZGUgbG9zIGRlbcOhcy4gwr9QcmVzZW50YW4gY29uY2VwdG9zIG8gZGV0YWxsZXMgZGUgc3VwZXJmaWNpZT8gwr9DdcOhbCBkZSBsYXMgcmVsYWNpb25lcyBlbiBlbCBtYXBhIGRlIHN1IGNvbXBhw7Flcm8gY29uc2lkZXJhIGNvbmNlcHRvcyB5IHZpY2V2ZXJzYT8KCiMjIyBNYXBlbyBkZSBjb25jZXB0b3MgKG51ZXZhbWVudGUpIChncnVwb3MgcGVxdWXDsW9zIC8gMjApClRyYWJhamFuZG8gZW4gZ3J1cG9zIGRlIDMgYSA0LCBoYWdhIHF1ZSBjYWRhIHBlcnNvbmEgZGlidWplIGRlIGZvcm1hIGluZGVwZW5kaWVudGUgdW4gbWFwYSBjb25jZXB0dWFsIHF1ZSBtdWVzdHJlIHN1IG1vZGVsbyBtZW50YWwgZGUgbG8gcXVlIHN1Y2VkZSBlbiBlbCBhdWxhLiBDdWFuZG8gdG9kb3MgaGF5YW4gdGVybWluYWRvLCBjb21wYXJlIGxvcyBtYXBhcyBjb25jZXB0dWFsZXMuIMK/RMOzbmRlIGVzdMOhbiBkZSBhY3VlcmRvIHkgZW4gZGVzYWN1ZXJkbyBzdXMgbW9kZWxvcyBtZW50YWxlcz8KCiMjIyBNZWpvcmEgZGUgbGEgbWVtb3JpYSBhIGNvcnRvIHBsYXpvIChpbmRpdmlkdWFsIC8gNSBtaW51dG9zKQpbQ2hlcjIwMDddIHN1Z2llcmUgcXVlIGxhIHJhesOzbiBwcmluY2lwYWwgcG9yIGxhIHF1ZSBsYXMgcGVyc29uYXMgZGlidWphbiBkaWFncmFtYXMgY3VhbmRvIGVzdMOhbiBkaXNjdXRpZW5kbyBjb3NhcyBlcyBwYXJhIGFtcGxpYXIgc3UgbWVtb3JpYSBhIGNvcnRvIHBsYXpvOiBzZcOxYWxhciB1bmEgYnVyYnVqYSBvbmR1bGFudGUgZGlidWphZGEgaGFjZSB1bm9zIG1pbnV0b3MgcHJvdm9jYSBlbCByZWN1ZXJkbyBkZSB2YXJpb3MgbWludXRvcyBkZSBkZWJhdGUuIEN1YW5kbyBpbnRlcmNhbWJpYXN0ZSBtYXBhcyBjb25jZXB0dWFsZXMgZW4gZWwgZWplcmNpY2lvIGFudGVyaW9yLCDCv3F1w6kgdGFuIGbDoWNpbCBmdWUgcGFyYSBvdHJhcyBwZXJzb25hcyBlbnRlbmRlciBsbyBxdWUgc2lnbmlmaWNhYmEgdHUgbWFwYT8gwr9RdcOpIHRhbiBmw6FjaWwgc2Vyw61hIHBhcmEgdGkgc2kgbG8gZGVqYXMgZGUgbGFkbyBwb3IgdW4gZMOtYSBvIGRvcyB5IGx1ZWdvIGxvIG1pcmFzIGRlIG51ZXZvPwoKIyMjIEVzbyBlcyB1biBwb2NvIGF1dG9ycmVmZXJlbmNpYWwsIMK/bm8/IChjbGFzZSBjb21wbGV0YSAvIDMwKQpUcmFiYWphbmRvIGluZGVwZW5kaWVudGVtZW50ZSwgZGlidWplIHVuIG1hcGEgY29uY2VwdHVhbCBwYXJhIG1hcGFzIGNvbmNlcHR1YWxlcy4gQ29tcGFyZSBzdSBtYXBhIGNvbmNlcHR1YWwgY29uIGxvcyBkaWJ1amFkb3MgcG9yIG90cmFzIHBlcnNvbmFzLiDCv1F1w6kgaW5jbHV5w7MgbGEgbWF5b3LDrWEgZGUgbGEgZ2VudGU/IMK/Q3XDoWxlcyBmdWVyb24gbGFzIGRpZmVyZW5jaWFzIHNpZ25pZmljYXRpdmFzPwoKIyMjIERhcnNlIGN1ZW50YSBkZSBzdSBwdW50byBjaWVnbyAoZ3J1cG9zIHBlcXVlw7FvcyAvIDEwKQpFbGl6YWJldGggV2lja2VzIGVudW1lcsOzIHRvZGFzIGxhcyBjb3NhcyBxdWUgbmVjZXNpdGEgY29tcHJlbmRlciBwYXJhIGxlZXIgZXN0YSBsw61uZWEgZGUgUHl0aG9uOgoKKiByZXNwdWVzdGFzID0gWyd0dWF0YXJhJywgJ3R1YXRhcmFzJywgJ2J1cycsICJsYW1lciJdCkxvcyBjb3JjaGV0ZXMgcXVlIHJvZGVhbiBlbCBjb250ZW5pZG8gc2lnbmlmaWNhbiBxdWUgZXN0YW1vcyB0cmFiYWphbmRvIGNvbiB1bmEgbGlzdGEgKGEgZGlmZXJlbmNpYSBkZSBsb3MgY29yY2hldGVzIGlubWVkaWF0YW1lbnRlIGEgbGEgZGVyZWNoYSBkZSBhbGdvLCBxdWUgZXMgdW5hIG5vdGFjacOzbiBkZSBleHRyYWNjacOzbiBkZSBkYXRvcykuCgoqIExvcyBlbGVtZW50b3MgZXN0w6FuIHNlcGFyYWRvcyBwb3IgY29tYXMgZnVlcmEgeSBlbnRyZSBjb21pbGxhcyAoZW4gbHVnYXIgZGUgZGVudHJvLCBjb21vIGxvIHNlcsOtYW4gcGFyYSBlbCBkaXNjdXJzbyBjaXRhZG8pLgoKKiBDYWRhIGVsZW1lbnRvIGVzIHVuYSBjYWRlbmEgZGUgY2FyYWN0ZXJlcywgeSBsbyBzYWJlbW9zIHBvciBsYXMgY29taWxsYXMuIFBvZHLDrWFtb3MgdGVuZXIgbsO6bWVyb3MgdSBvdHJvcyB0aXBvcyBkZSBkYXRvcyBhcXXDrSBzaSBxdWlzacOpcmFtb3M7IG5lY2VzaXRhbW9zIGNpdGFzIHBvcnF1ZSBlc3RhbW9zIHRyYWJhamFuZG8gY29uIGNhZGVuYXMuCgoqIEVzdGFtb3MgbWV6Y2xhbmRvIG51ZXN0cm8gdXNvIGRlIGNvbWlsbGFzIHNpbXBsZXMgeSBkb2JsZXM7IEEgUHl0aG9uIG5vIGxlIGltcG9ydGEgbWllbnRyYXMgc2UgZXF1aWxpYnJlbiBhbHJlZGVkb3IgZGUgbGFzIGNhZGVuYXMgaW5kaXZpZHVhbGVzLgoKKiBDYWRhIGNvbWEgdmEgc2VndWlkYSBkZSB1biBlc3BhY2lvLCBxdWUgUHl0aG9uIG5vIHJlcXVpZXJlLCBwZXJvIHF1ZSBwcmVmZXJpbW9zIHBhcmEgbGEgbGVnaWJpbGlkYWQuCgpDYWRhIHVubyBkZSBlc3RvcyBkZXRhbGxlcyBwdWVkZSBzZXIgcGFzYWRvIHBvciBhbHRvIHBvciB1biBleHBlcnRvLiBUcmFiYWphbmRvIGVuIGdydXBvcyBkZSAzIGEgNCwgc2VsZWNjaW9uZSBhbGdvIGlndWFsbWVudGUgY29ydG8gZGUgdW5hIGxlY2Npw7NuIHF1ZSBoYXlhIGVuc2XDsWFkbyBvIGFwcmVuZGlkbyByZWNpZW50ZW1lbnRlIHkgZGl2w61kYWxvIGVuIGVzdGUgbml2ZWwgZGUgZGV0YWxsZS4KCiMjIyBRdcOpIGVuc2XDsWFyIGEgY29udGludWFjacOzbiAoaW5kaXZpZHVhbCAvIDUpCkNvbnN1bHRlIGVsIG1hcGEgY29uY2VwdHVhbCBwYXJhIGxhIGZvdG9zw61udGVzaXMgZW4gbGEgRmlndXJhIFtmOiBtZW1vcmlhLWZvdG9zw61udGVzaXNdLiDCv0N1w6FudG9zIGNvbmNlcHRvcyB5IGVubGFjZXMgaGF5IGVuIGxvcyBmcmFnbWVudG9zIHNlbGVjY2lvbmFkb3M/IMK/UXXDqSBpbmNsdWlyw61hcyBlbiBsYSBwcsOzeGltYSBwYXJ0ZSBkZSBsYSBsZWNjacOzbiB5IHBvciBxdcOpPwoKIyMjIEVsIHBvZGVyIGRlIGZyYWdtZW50YXIgKGluZGl2aWR1YWwgLyA1KQpNaXJlIGxhIEZpZ3VyYSBbZjogc2luIG1lbW9yaWFdIGR1cmFudGUgMTAgc2VndW5kb3MsIGx1ZWdvIG1pcmUgaGFjaWEgb3RybyBsYWRvIGUgaW50ZW50ZSBlc2NyaWJpciBzdSBuw7ptZXJvIGRlIHRlbMOpZm9ubyBjb24gZXN0b3Mgc8OtbWJvbG9zLiAoVXNlIHVuIGVzcGFjaW8gcGFyYSAnMCcpLiBDdWFuZG8gaGF5YSB0ZXJtaW5hZG8sIG1pcmUgbGEgcmVwcmVzZW50YWNpw7NuIGFsdGVybmF0aXZhIGVuIGVsIEFww6luZGljZSAyMy4gwr9RdcOpIHRhbiBmw6FjaWxlcyBzb24gbG9zIHPDrW1ib2xvcyBwYXJhIHJlY29yZGFyIGN1YW5kbyBlbCBwYXRyw7NuIHNlIGhhY2UgZXhwbMOtY2l0bz8KCiFbRnJhZ21lbnRvc10oLi9pbWdfdHJhbmluZy9jaHVua2luZy11bmNodW5rZWQuc3ZnKQoKIyBBcnF1aXRlY3R1cmEgY29nbml0aXZhCgpIZW1vcyBlc3RhZG8gaGFibGFuZG8gZGUgbW9kZWxvcyBtZW50YWxlcyBjb21vIHNpIGZ1ZXJhbiBjb3NhcyByZWFsZXMsIHBlcm8gwr9xdcOpIHN1Y2VkZSByZWFsbWVudGUgZW4gZWwgY2VyZWJybyBkZSB1biBhbHVtbm8gY3VhbmRvIGVzdMOhIGFwcmVuZGllbmRvPyBMYSByZXNwdWVzdGEgY29ydGEgZXMgcXVlIG5vIGxvIHNhYmVtb3M7IGxhIHJlc3B1ZXN0YSBtw6FzIGxhcmdhIGVzIHF1ZSBzYWJlbW9zIG11Y2hvIG3DoXMgZGUgbG8gcXVlIHNvbMOtYW1vcyBzYWJlci4gRXN0ZSBjYXDDrXR1bG8gcHJvZnVuZGl6YXLDoSB1biBwb2NvIG3DoXMgZW4gbG8gcXVlIGhhY2VuIGxvcyBjZXJlYnJvcyBtaWVudHJhcyBhcHJlbmRlbiB5IGPDs21vIHBvZGVtb3MgYXByb3ZlY2hhciBlc28gcGFyYSBkaXNlw7FhciB5IGJyaW5kYXIgbGVjY2lvbmVzIGRlIG1hbmVyYSBtw6FzIGVmZWN0aXZhLgoKIyMgwr9RdcOpIGVzdMOhIHBhc2FuZG8gYWxsw60/CgohW2Y6IGFyY2gtbW9kZWxdKC4vaW1nX3RyYW5pbmcvY29nbml0aXZlLWFyY2hpdGVjdHVyZS5zdmcpCgoKCkxhIGZpZ3VyYSBbZjogYXJjaC1tb2RlbF0gZXMgdW4gbW9kZWxvIHNpbXBsaWZpY2FkbyBkZSBhcnF1aXRlY3R1cmEgY29nbml0aXZhIGh1bWFuYS4gRWwgbsO6Y2xlbyBkZSBlc3RlIG1vZGVsbyBlcyBsYSBzZXBhcmFjacOzbiBlbnRyZSBsYSBtZW1vcmlhIGEgY29ydG8geSBsYXJnbyBwbGF6byBkaXNjdXRpZGEgZW4gbGEgU2VjY2nDs24gMy4yLiBMYSBtZW1vcmlhIGEgbGFyZ28gcGxhem8gZXMgY29tbyBzdSBzw7N0YW5vOiBhbG1hY2VuYSBjb3NhcyBkZSBtYW5lcmEgbcOhcyBvIG1lbm9zIHBlcm1hbmVudGUsIHBlcm8gbm8gcHVlZGUgYWNjZWRlciBhIHN1IGNvbnRlbmlkbyBkaXJlY3RhbWVudGUuIEVuIGNhbWJpbywgY29uZsOtYSBlbiBzdSBtZW1vcmlhIGEgY29ydG8gcGxhem8sIHF1ZSBlcyBsYSBtZXNhIGRlIGxhIGNvY2luYSBkZXNvcmRlbmFkYSBkZSBzdSBtZW50ZS4KCkN1YW5kbyBuZWNlc2l0YSBhbGdvLCBzdSBjZXJlYnJvIGxvIHJlY3VwZXJhIGRlIGxhIG1lbW9yaWEgYSBsYXJnbyBwbGF6byB5IGxvIGd1YXJkYSBlbiBsYSBtZW1vcmlhIGEgY29ydG8gcGxhem8uIFBvciBlbCBjb250cmFyaW8sIGxhIG51ZXZhIGluZm9ybWFjacOzbiBxdWUgbGxlZ2EgYSBsYSBtZW1vcmlhIGEgY29ydG8gcGxhem8gZGViZSBjb2RpZmljYXJzZSBwYXJhIGFsbWFjZW5hcnNlIGVuIGxhIG1lbW9yaWEgYSBsYXJnbyBwbGF6by4gU2kgZXNhIGluZm9ybWFjacOzbiBubyBlc3TDoSBjb2RpZmljYWRhIHkgYWxtYWNlbmFkYSwgbm8gc2UgcmVjdWVyZGEgeSBlbCBhcHJlbmRpemFqZSBubyBoYSB0ZW5pZG8gbHVnYXIuCgpMYSBpbmZvcm1hY2nDs24gaW5ncmVzYSBhIGxhIG1lbW9yaWEgYSBjb3J0byBwbGF6byBwcmluY2lwYWxtZW50ZSBhIHRyYXbDqXMgZGUgc3UgY2FuYWwgdmVyYmFsIChwYXJhIGVsIGhhYmxhKSB5IGVsIGNhbmFsIHZpc3VhbCAocGFyYSBsYXMgaW3DoWdlbmVzKSA1MC4gTGEgbWF5b3LDrWEgZGUgbGFzIHBlcnNvbmFzIGNvbmbDrWFuIHByaW5jaXBhbG1lbnRlIGVuIHN1IGNhbmFsIHZpc3VhbCwgcGVybyBjdWFuZG8gbGFzIGltw6FnZW5lcyB5IGxhcyBwYWxhYnJhcyBzZSBjb21wbGVtZW50YW4gZW50cmUgc8OtLCBlbCBjZXJlYnJvIGhhY2UgdW4gbWVqb3IgdHJhYmFqbyBhbCByZWNvcmRhcmxhcyBhIGFtYmFzOiBlc3TDoW4gY29kaWZpY2FkYXMganVudGFzLCBwb3IgbG8gcXVlIHJlY29yZGFyIHVuYSBtw6FzIGFkZWxhbnRlIGF5dWRhIGEgYWN0aXZhciBsYSByZWN1cGVyYWNpw7NuIGRlIGxhIG90cmEuCgpMYXMgZW50cmFkYXMgbGluZ8O8w61zdGljYXMgeSB2aXN1YWxlcyBzb24gcHJvY2VzYWRhcyBwb3IgZGlmZXJlbnRlcyBwYXJ0ZXMgZGVsIGNlcmVicm8gaHVtYW5vLCB5IGxhcyBtZW1vcmlhcyBsaW5nw7zDrXN0aWNhcyB5IHZpc3VhbGVzIHRhbWJpw6luIHNlIGFsbWFjZW5hbiBwb3Igc2VwYXJhZG8uIEVzdG8gc2lnbmlmaWNhIHF1ZSBsYSBjb3JyZWxhY2nDs24gZGUgbG9zIGZsdWpvcyBsaW5nw7zDrXN0aWNvcyB5IHZpc3VhbGVzIGRlIGluZm9ybWFjacOzbiByZXF1aWVyZSB1biBlc2Z1ZXJ6byBjb2duaXRpdm86IGN1YW5kbyBhbGd1aWVuIGxlZSBhbGdvIG1pZW50cmFzIGxvIGVzY3VjaGEgZW4gdm96IGFsdGEsIHN1IGNlcmVicm8gbm8gcHVlZGUgZXZpdGFyIGNvbXByb2JhciBxdWUgZXN0w6Egb2J0ZW5pZW5kbyBsYSBtaXNtYSBpbmZvcm1hY2nDs24gZW4gYW1ib3MgY2FuYWxlcy4KClBvciBsbyB0YW50bywgZWwgYXByZW5kaXphamUgYXVtZW50YSBjdWFuZG8gbGEgaW5mb3JtYWNpw7NuIHNlIHByZXNlbnRhIHNpbXVsdMOhbmVhbWVudGUgZW4gZG9zIGNhbmFsZXMgZGlmZXJlbnRlcywgcGVybyBzZSByZWR1Y2UgY3VhbmRvIGVzYSBpbmZvcm1hY2nDs24gZXMgcmVkdW5kYW50ZSBlbiBsdWdhciBkZSBjb21wbGVtZW50YXJpYSwgdW4gZmVuw7NtZW5vIGxsYW1hZG8gKiplZmVjdG8gZGUgYXRlbmNpw7NuIGRpdmlkaWRhKiogW01heWUyMDAzXS4gUG9yIGVqZW1wbG8sIGEgbGFzIHBlcnNvbmFzIGdlbmVyYWxtZW50ZSBsZXMgcmVzdWx0YSBtw6FzIGRpZsOtY2lsIGFwcmVuZGVyIGRlIHVuIHZpZGVvIHF1ZSB0aWVuZSBuYXJyYWNpw7NuIHkgc3VidMOtdHVsb3MgZW4gcGFudGFsbGEgcXVlIGRlIHVubyBxdWUgdGllbmUgbGEgbmFycmFjacOzbiBvIGxvcyBzdWJ0w610dWxvcywgcGVybyBubyBhbWJvcywgcG9ycXVlIHBhcnRlIGRlIHN1IGF0ZW5jacOzbiBkZWJlIGRlZGljYXJzZSBhIHZlcmlmaWNhciBxdWUgTGEgbmFycmFjacOzbiB5IGxvcyBzdWJ0w610dWxvcyBjb25jdWVyZGFuIGVudHJlIHPDrS4gRG9zIGV4Y2VwY2lvbmVzIG5vdGFibGVzIGEgZXN0byBzb24gbGFzIHBlcnNvbmFzIHF1ZSBhw7puIG5vIGhhYmxhbiBiaWVuIGVsIGlkaW9tYSB5IGxhcyBwZXJzb25hcyBjb24gcHJvYmxlbWFzIGRlIGF1ZGljacOzbiB1IG90cmFzIG5lY2VzaWRhZGVzIGVzcGVjaWFsZXMsIHF1aWVuZXMgcHVlZGVuIGVuY29udHJhciBxdWUgZWwgdmFsb3IgZGUgbGEgaW5mb3JtYWNpw7NuIHJlZHVuZGFudGUgc3VwZXJhIGVsIGVzZnVlcnpvIGRlIHByb2Nlc2FtaWVudG8gYWRpY2lvbmFsLgoKCj4qKlBpZXphIHBvciBwaWV6YSoqCj4KPkVsIGVmZWN0byBkZSBhdGVuY2nDs24gZGl2aWRpZGEgZXhwbGljYSBwb3IgcXXDqSBlcyBtw6FzIGVmZWN0aXZvIGRpYnVqYXIgdW4gZGlhZ3JhbWEgcGllemEgcG9yIHBpZXphIG1pZW50cmFzIHNlIGVuc2XDsWEgcXVlIHByZXNlbnRhciB0b2RvIGRlIHVuYSB2ZXouIFNpIHBhcnRlcyBkZWwgZGlhZ3JhbWEgYXBhcmVjZW4gYWwgbWlzbW8gdGllbXBvIHF1ZSBzZSBkaWNlbiBsYXMgY29zYXMsIGxhcyBkb3Mgc2UgY29ycmVsYWNpb25hcsOhbiBlbiBsYSBtZW1vcmlhIGRlbCBhbHVtbm8uIFNlw7FhbGFyIHVuYSBwYXJ0ZSBkZWwgZGlhZ3JhbWEgbcOhcyBhZGVsYW50ZSBlcyBtw6FzIHByb2JhYmxlIHF1ZSBhY3RpdmUgZWwgcmVjdWVyZG8gZGUgbG8gcXVlIHNlIGRpam8gY3VhbmRvIHNlIGRpYnVqw7MgZXNhIHBhcnRlLgoKRWwgZWZlY3RvIGRlIGF0ZW5jacOzbiBkaXZpZGlkYSBubyBzaWduaWZpY2EgcXVlIGxvcyBhbHVtbm9zIG5vIGRlYmVyw61hbiB0cmF0YXIgZGUgY29uY2lsaWFyIG3Dumx0aXBsZXMgZmx1am9zIGRlIGluZm9ybWFjacOzbiBlbnRyYW50ZXM7IGRlc3B1w6lzIGRlIHRvZG8sIGVzdG8gZXMgbG8gcXVlIHRpZW5lbiBxdWUgaGFjZXIgZW4gZWwgbXVuZG8gcmVhbCBbQXRraTIwMDBdLiBFbiBjYW1iaW8sIHNpZ25pZmljYSBxdWUgbGEgaW5zdHJ1Y2Npw7NuIG5vIGRlYmVyw61hIHJlcXVlcmlyIHF1ZSBsYXMgcGVyc29uYXMgbG8gaGFnYW4gbWllbnRyYXMgZG9taW5hbiBwb3IgcHJpbWVyYSB2ZXogbGFzIGhhYmlsaWRhZGVzIGRlIGxhIHVuaWRhZDsgZW4gY2FtYmlvLCBlbCB1c28gZGUgbcO6bHRpcGxlcyBmdWVudGVzIGRlIGluZm9ybWFjacOzbiBzaW11bHTDoW5lYW1lbnRlIGRlYmUgdHJhdGFyc2UgY29tbyB1bmEgdGFyZWEgZGUgYXByZW5kaXphamUgc2VwYXJhZGEuCgo+KipObyB0b2RvcyBsb3MgZ3LDoWZpY29zIHNvbiBpZ3VhbGVzKioKPgo+W1N1bmcyMDEyXSBwcmVzZW50YSB1biBlc3R1ZGlvIGVsZWdhbnRlIHF1ZSBkaXN0aW5ndWUgZ3LDoWZpY29zIHNlZHVjdG9yZXMgKHF1ZSBzb24gbXV5IGludGVyZXNhbnRlcyBwZXJvIG5vIGRpcmVjdGFtZW50ZSByZWxldmFudGVzIHBhcmEgZWwgb2JqZXRpdm8gZGUgaW5zdHJ1Y2Npw7NuKSwgZ3LDoWZpY29zIGRlY29yYXRpdm9zIChxdWUgc29uIG5ldXRyYWxlcyBwZXJvIG5vIGRpcmVjdGFtZW50ZSByZWxldmFudGVzIHBhcmEgZWwgb2JqZXRpdm8gZGUgaW5zdHJ1Y2Npw7NuKSB5IGdyw6FmaWNvcyBpbnN0cnVjdGl2b3MgKHF1ZSBzb24gZGlyZWN0YW1lbnRlIHJlbGV2YW50ZXMgYSBsYSBtZXRhIGRlIGluc3RydWNjacOzbikuIExvcyBlc3R1ZGlhbnRlcyBxdWUgcmVjaWJpZXJvbiBjdWFscXVpZXIgdGlwbyBkZSBncsOhZmljbyBkaWVyb24gYWwgbWF0ZXJpYWwgY2FsaWZpY2FjaW9uZXMgZGUgc2F0aXNmYWNjacOzbiBtw6FzIGFsdGFzIHF1ZSBhcXVlbGxvcyBxdWUgbm8gb2J0dXZpZXJvbiBncsOhZmljb3MsIHBlcm8gc29sbyBsb3MgZXN0dWRpYW50ZXMgcXVlIG9idHV2aWVyb24gZ3LDoWZpY29zIGluc3RydWN0aXZvcyBlbiByZWFsaWRhZCBvYnR1dmllcm9uIG1lam9yZXMgcmVzdWx0YWRvcy4KPgo+RGVsIG1pc21vIG1vZG8sIFtTdGFtMjAxMywgU3RhbTIwMTRdIGRlc2N1YnJpw7MgcXVlIHRlbmVyIG3DoXMgaW5mb3JtYWNpw7NuIGVuIHJlYWxpZGFkIHB1ZWRlIHJlZHVjaXIgZWwgcmVuZGltaWVudG8uIE1vc3RyYXJvbiBhIGxvcyBuacOxb3MgZm90b3MsIGRpYnVqb3MgeSBuw7ptZXJvcywgbyBzaW1wbGVtZW50ZSBuw7ptZXJvcyBwYXJhIGRvcyB0YXJlYXMuIFBhcmEgYWxndW5vcywgdGVuZXIgaW3DoWdlbmVzIG8gaW3DoWdlbmVzIHkgbsO6bWVyb3Mgc3VwZXLDsyBhIHRlbmVyIG7Dum1lcm9zIHNvbGFtZW50ZSwgcGVybyBwYXJhIG90cm9zLCB0ZW5lciBpbcOhZ2VuZXMgc3VwZXLDsyBhIGltw6FnZW5lcyB5IG7Dum1lcm9zLCBxdWUgc3VwZXJhcm9uIHNpbXBsZW1lbnRlIHRlbmVyIG7Dum1lcm9zLgoKCiMjIENhcmdhIGNvZ25pdGl2YQoKRW4gW0tpcnMyMDA2XSwgS2lyc2NobmVyLCBTd2VsbGVyIHkgQ2xhcmsgZXNjcmliaWVyb246Cgo+QXVucXVlIGxvcyBlbmZvcXVlcyBkZSBpbnN0cnVjY2nDs24gbm8gZ3VpYWRvcyBvIG3DrW5pbWFtZW50ZSBndWlhZG9zIHNvbiBtdXkgcG9wdWxhcmVzIGUgaW50dWl0aXZhbWVudGUgYXRyYWN0aXZvcyAuLi4gZXN0b3MgZW5mb3F1ZXMgaWdub3JhbiB0YW50byBsYXMgZXN0cnVjdHVyYXMgcXVlIGNvbnN0aXR1eWVuIGxhIGFycXVpdGVjdHVyYSBjb2duaXRpdmEgaHVtYW5hIGNvbW8gbGEgZXZpZGVuY2lhIGRlIGxvcyBlc3R1ZGlvcyBlbXDDrXJpY29zIGR1cmFudGUgZWwgw7psdGltbyBtZWRpbyBzaWdsbyBxdWUgY29uc3RhbnRlbWVudGUgaW5kaWNhbiBxdWUgbGEgaW5zdHJ1Y2Npw7NuIG3DrW5pbWFtZW50ZSBndWlhZGEgZXMgbWVub3MgZWZlY3RpdmEgeSBtZW5vcyBlZmljaWVudGUgcXVlIGVuZm9xdWVzIGRlIGluc3RydWNjacOzbiBxdWUgcG9uZW4gdW4gZnVlcnRlIMOpbmZhc2lzIGVuIGxhIG9yaWVudGFjacOzbiBkZWwgcHJvY2VzbyBkZSBhcHJlbmRpemFqZSBkZWwgYWx1bW5vLiBMYSB2ZW50YWphIGRlIGxhIG9yaWVudGFjacOzbiBjb21pZW56YSBhIHJldHJvY2VkZXIgc29sbyBjdWFuZG8gbG9zIGFsdW1ub3MgdGllbmVuIHVuIGNvbm9jaW1pZW50byBwcmV2aW8gc3VmaWNpZW50ZW1lbnRlIGFsdG8gcGFyYSBwcm9wb3JjaW9uYXIgb3JpZW50YWNpw7NuICJpbnRlcm5hIi4KCgpEZWJham8gZGUgbGEgamVyZ2EsIGxvcyBhdXRvcmVzIGFmaXJtYWJhbiBxdWUgaGFjZXIgcXVlIGxvcyBhbHVtbm9zIGhhZ2FuIHN1cyBwcm9waWFzIHByZWd1bnRhcywgZXN0YWJsZXpjYW4gc3VzIHByb3Bpb3Mgb2JqZXRpdm9zIHkgZW5jdWVudHJlbiBzdSBwcm9waW8gY2FtaW5vIGEgdHJhdsOpcyBkZSB1biB0ZW1hIGVzIG1lbm9zIGVmZWN0aXZvIHF1ZSBtb3N0cmFybGVzIGPDs21vIGhhY2VyIGxhcyBjb3NhcyBwYXNvIGEgcGFzby4gRWwgZW5mb3F1ZSBkZSDigJxlbGlnZSB0dSBwcm9waWEgYXZlbnR1cmHigJ0gc2UgY29ub2NlIGNvbW8gYXByZW5kaXphamUgYmFzYWRvIGVuIGxhIGluZGFnYWNpw7NuLCB5IGVzIGludHVpdGl2YW1lbnRlIGF0cmFjdGl2bzogZGVzcHXDqXMgZGUgdG9kbywgwr9xdWnDqW4gYXJndW1lbnRhcsOtYSBlbiBjb250cmEgZGUgcXVlIGxvcyBlc3R1ZGlhbnRlcyB1c2VuIHN1IHByb3BpYSBpbmljaWF0aXZhIHBhcmEgcmVzb2x2ZXIgcHJvYmxlbWFzIGRlbCBtdW5kbyByZWFsIGRlIG1hbmVyYSByZWFsaXN0YT8gU2luIGVtYmFyZ28sIHBlZGlybGVzIGEgbG9zIGFsdW1ub3MgcXVlIGhhZ2FuIGVzdG8gZW4gdW4gbnVldm8gZG9taW5pbyBsb3Mgc29icmVjYXJnYSBhbCBleGlnaXJsZXMgcXVlIGRvbWluZW4gZWwgY29udGVuaWRvIHJlYWwgZGUgdW4gZG9taW5pbyB5IHN1cyBlc3RyYXRlZ2lhcyBkZSByZXNvbHVjacOzbiBkZSBwcm9ibGVtYXMgYWwgbWlzbW8gdGllbXBvLgoKTcOhcyBlc3BlY8OtZmljYW1lbnRlLCBsYSAqKnRlb3LDrWEgZGUgbGEgY2FyZ2EgY29nbml0aXZhKiogcHJvcHVzbyBxdWUgbGFzIHBlcnNvbmFzIHRpZW5lbiBxdWUgbGlkaWFyIGNvbiB0cmVzIGNvc2FzIGN1YW5kbyBlc3TDoW4gYXByZW5kaWVuZG86CgoqKkNhcmdhIGludHLDrW5zZWNhKioKRXMgbG8gcXVlIGxhIGdlbnRlIGRlYmUgdGVuZXIgZW4gY3VlbnRhIHBhcmEgYWJzb3JiZXIgbWF0ZXJpYWwgbnVldm8uCgoqKkNhcmdhIHBlcnRpbmVudGUqKgpFcyBlbCBlc2Z1ZXJ6byBtZW50YWwgKGRlc2VhYmxlKSByZXF1ZXJpZG8gcGFyYSB2aW5jdWxhciBpbmZvcm1hY2nDs24gbnVldmEgYSBpbmZvcm1hY2nDs24gYW50aWd1YSwgcXVlIGVzIHVuYSBkZSBsYXMgY29zYXMgcXVlIGRpc3Rpbmd1ZSBlbCBhcHJlbmRpemFqZSBkZSBsYSBtZW1vcml6YWNpw7NuLgoKKipDYXJnYSBleHRyYcOxYSoqCkVzIGN1YWxxdWllciBjb3NhIHF1ZSBkaXN0cmFpZ2EgZGVsIGFwcmVuZGl6YWplLgoKTGEgdGVvcsOtYSBkZSBsYSBjYXJnYSBjb2duaXRpdmEgc29zdGllbmUgcXVlIGxhcyBwZXJzb25hcyB0aWVuZW4gcXVlIGRpdmlkaXIgdW5hIGNhbnRpZGFkIGZpamEgZGUgbWVtb3JpYSBkZSB0cmFiYWpvIGVudHJlIGVzdGFzIHRyZXMgY29zYXMuIE51ZXN0cm8gb2JqZXRpdm8gY29tbyBtYWVzdHJvcyBlcyBtYXhpbWl6YXIgbGEgbWVtb3JpYSBkaXNwb25pYmxlIHBhcmEgbWFuZWphciBsYSBjYXJnYSBpbnRyw61uc2VjYSwgbG8gcXVlIHNpZ25pZmljYSByZWR1Y2lyIGxhIGNhcmdhIHBlcnRpbmVudGUgZW4gY2FkYSBwYXNvIHkgZWxpbWluYXIgbGEgY2FyZ2EgZXh0cmHDsWEuCgojIyBQcm9ibGVtYXMgZGUgUGFyc29ucwoKVW4gdGlwbyBkZSBlamVyY2ljaW8gcXVlIHB1ZWRlIGV4cGxpY2Fyc2UgZW4gdMOpcm1pbm9zIGRlIGNhcmdhIGNvZ25pdGl2YSBhIG1lbnVkbyBzZSB1c2EgYWwgZW5zZcOxYXIgaWRpb21hcy4gU3Vwb25nYW1vcyBxdWUgbGUgcGlkZSBhIGFsZ3VpZW4gcXVlIHRyYWR1emNhIGxhIG9yYWNpw7NuLCAiwr9Dw7NtbyBlc3TDoSBzdSByb2RpbGxhIGhveT8iIGVuIGZyaXPDs24uIFBhcmEgcmVzb2x2ZXIgZWwgcHJvYmxlbWEsIG5lY2VzaXRhbiByZWNvcmRhciB0YW50byBlbCB2b2NhYnVsYXJpbyBjb21vIGxhIGdyYW3DoXRpY2EsIHF1ZSBlcyB1bmEgZG9ibGUgY2FyZ2EgY29nbml0aXZhLiBTaSBsZXMgcGlkZSBxdWUgcG9uZ2FuIOKAnGF6YWRh4oCdLCDigJxoYXLigJ0sIOKAnGVz4oCdLCDigJxoam9lZOKAnSB5IOKAnGtuaWXigJ0gZW4gZWwgb3JkZW4gY29ycmVjdG8sIHBvciBvdHJvIGxhZG8sIGxlcyBlc3TDoSBwZXJtaXRpZW5kbyBjZW50cmFyc2Ugw7puaWNhbWVudGUgZW4gYXByZW5kZXIgZ3JhbcOhdGljYS4gU2luIGVtYmFyZ28sIHNpIGVzY3JpYmUgZXN0YXMgcGFsYWJyYXMgZW4gY2luY28gZnVlbnRlcyBvIGNvbG9yZXMgZGlmZXJlbnRlcywgaGFicsOhIGF1bWVudGFkbyBsYSBjYXJnYSBjb2duaXRpdmEgZXh0cmHDsWEsIHBvcnF1ZSBpbnZvbHVudGFyaWFtZW50ZSAoeSBwb3NpYmxlbWVudGUgaW5jb25zY2llbnRlbWVudGUpIGdhc3RhcsOhbiBhbGfDum4gZXNmdWVyem8gdHJhdGFuZG8gZGUgZGVzY3VicmlyIHNpIGxhcyBkaWZlcmVuY2lhcyBzb24gc2lnbmlmaWNhdGl2YXMgKEZpZ3VyYSBbZjogYXJxdWl0ZWN0dXJhLSBmcmlzaW9dKS4KCiFbZjphcmNoaXRlY3R1cmUtZnJpc2lhbl0oLi9pbWdfdHJhbmluZy9mcmlzaWFuLnBuZykKCkVsIGVxdWl2YWxlbnRlIGRlIGNvZGlmaWNhY2nDs24gZGUgZXN0byBzZSBsbGFtYSBQYXJzb25zIFByb2JsZW01NiBbUGFyczIwMDZdLiBBbCBlbnNlw7FhciBhIGxhcyBwZXJzb25hcyBhIHByb2dyYW1hciwgcHVlZGUgZGFybGVzIGxhcyBsw61uZWFzIGRlIGPDs2RpZ28gcXVlIG5lY2VzaXRhbiBwYXJhIHJlc29sdmVyIHVuIHByb2JsZW1hIHkgcGVkaXJsZXMgcXVlIGxhcyBwb25nYW4gZW4gZWwgb3JkZW4gY29ycmVjdG8uIEVzdG8gbGVzIHBlcm1pdGUgY29uY2VudHJhcnNlIGVuIGVsIGZsdWpvIGRlIGNvbnRyb2wgeSBsYXMgZGVwZW5kZW5jaWFzIGRlIGRhdG9zIHNpbiBkaXN0cmFlcnNlIGNvbiBub21icmVzIHZhcmlhYmxlcyBvIHRyYXRhciBkZSByZWNvcmRhciBxdcOpIGZ1bmNpb25lcyBsbGFtYXIuIE3Dumx0aXBsZXMgZXN0dWRpb3MgaGFuIGRlbW9zdHJhZG8gcXVlIGxvcyBwcm9ibGVtYXMgZGUgUGFyc29ucyB0b21hbiBtZW5vcyB0aWVtcG8gcGFyYSBxdWUgbG9zIGFsdW1ub3MgbG8gaGFnYW4sIHBlcm8gcHJvZHVjZW4gcmVzdWx0YWRvcyBlZHVjYXRpdm9zIGVxdWl2YWxlbnRlcyBbRXJpYzIwMTddLgoKIyMgRWplbXBsb3MgZGVzY29sb3JpZG9zCgpPdHJvIHRpcG8gZGUgZWplcmNpY2lvIHF1ZSBzZSBwdWVkZSBleHBsaWNhciBlbiB0w6lybWlub3MgZGUgY2FyZ2EgY29nbml0aXZhIGVzIGRhciBhIGxvcyBhbHVtbm9zIHVuYSBzZXJpZSBkZSBlamVtcGxvcyBkZXN2YcOtZG9zLiBFbCBwcmltZXIgZWplbXBsbyBkZSB1bmEgc2VyaWUgcHJlc2VudGEgdW4gdXNvIGNvbXBsZXRvIGRlIHVuYSBlc3RyYXRlZ2lhIHBhcnRpY3VsYXIgZGUgcmVzb2x1Y2nDs24gZGUgcHJvYmxlbWFzLiBFbCBzaWd1aWVudGUgcHJvYmxlbWEgZXMgZGVsIG1pc21vIHRpcG8sIHBlcm8gdGllbmUgYWxndW5hcyBsYWd1bmFzIHBhcmEgcXVlIGVsIGFsdW1ubyBsYXMgY29tcGxldGUuIENhZGEgcHJvYmxlbWEgc3VjZXNpdm8gbGUgZGEgYWwgYW5kYW1pYWplIG1lbm9zIGFuZGFtaW9zLCBoYXN0YSBxdWUgc2UgbGVzIHBpZGUgcXVlIHJlc3VlbHZhbiB1biBwcm9ibGVtYSBjb21wbGV0byBkZXNkZSBjZXJvLiBDdWFuZG8gZW5zZcOxYW1vcyDDoWxnZWJyYSBlbiBsYSBlc2N1ZWxhIHNlY3VuZGFyaWEsIHBvciBlamVtcGxvLCBwb2Ryw61hbW9zIGNvbWVuemFyIGNvbiBlc3RvOgoKICAgICAgKDR4ICsgOCkvMgk9CTUKICAgICAgNHggKyA4CT0JMiAqIDUKICAgICAgNHggKyA4CT0JMTAKICAgICAgNHgJPQkxMCAtIDgKICAgICAgNHgJPQkyCiAgICAgIHgJPQkyIC8gNAogICAgICB4CT0JMSAvIDIKICAgICAgClkgbHVlZ28gcGlkYSBhIGxvcyBhbHVtbm9zIHF1ZSByZXN1ZWx2YW4gZXN0bzoKCiAgICAgICgzeCAtIDEpKjMJPQkxMgogICAgICAzeCAtIDEJPQlfIC8gXwogICAgICAzeCAtIDEJPQk0CiAgICAgIDN4CT0JXwogICAgICB4CT0JXyAvIDMKICAgICAgeAk9CV8KICAgICAgCnkgZXN0bzoKCiAgICAgICg1eCArIDEpKjMJPQk0CiAgICAgIDV4ICsgMQk9CV8KICAgICAgNXgJPQlfCiAgICAgIHgJPQlfCiAgICAgIAp5IGZpbmFsbWVudGUgZXN0bzoKCiAgICAgICgyeCArIDgpLzQJPQkxCiAgICAgIHgJPQlfCgoKClVuIGVqZXJjaWNpbyBzaW1pbGFyIHBhcmEgZW5zZcOxYXIgUHl0aG9uIHBvZHLDrWEgY29tZW56YXIgbW9zdHJhbmRvIGEgbG9zIGFsdW1ub3MgY8OzbW8gZW5jb250cmFyIGxhIGxvbmdpdHVkIHRvdGFsIGRlIHVuYSBsaXN0YSBkZSBwYWxhYnJhczoKCiAgICAjIHRvdGFsX2xlbmd0aChbInJlZCIsICJncmVlbiIsICJibHVlIl0pID0+IDEyCiAgICBkZWZpbmUgdG90YWxfbGVuZ3RoKGxpc3Rfb2Zfd29yZHMpOgogICAgICAgIHRvdGFsID0gMAogICAgICAgIGZvciB3b3JkIGluIGxpc3Rfb2Zfd29yZHM6CiAgICAgICAgICAgIHRvdGFsID0gdG90YWwgKyBsZW5ndGgod29yZCkKICAgICAgICByZXR1cm4gdG90YWwKICAgICAgICAKeSBsdWVnbyBww61kYWxlcyBxdWUgbGxlbmVuIGxvcyBlc3BhY2lvcyBlbiBibGFuY28gZW4gZXN0byAocXVlIGVuZm9jYSBzdSBhdGVuY2nDs24gZW4gbGFzIGVzdHJ1Y3R1cmFzIGRlIGNvbnRyb2wpOgoKICAgICMgd29yZF9sZW5ndGhzKFsicmVkIiwgImdyZWVuIiwgImJsdWUiXSkgPT4gWzMsIDUsIDRdCiAgICBkZWZpbmUgd29yZF9sZW5ndGhzKGxpc3Rfb2Zfd29yZHMpOgogICAgICAgIGxpc3Rfb2ZfbGVuZ3RocyA9IFtdCiAgICAgICAgZm9yIF9fX18gaW4gX19fXzoKICAgICAgICAgICAgYXBwZW5kKGxpc3Rfb2ZfbGVuZ3RocywgX19fXykKICAgICAgICByZXR1cm4gbGlzdF9vZl9sZW5ndGhzCiAgICAgICAgCkVsIHNpZ3VpZW50ZSBwcm9ibGVtYSBwb2Ryw61hIHNlciBlc3RlIChxdWUgY2VudHJhIHN1IGF0ZW5jacOzbiBlbiBhY3R1YWxpemFyIGVsIHJlc3VsdGFkbyBmaW5hbCk6CgogICAgIyBqb2luX2FsbChbInJlZCIsICJncmVlbiIsICJibHVlIl0pID0+ICJyZWRncmVlbmJsdWUiCiAgICBkZWZpbmUgam9pbl9hbGwobGlzdF9vZl93b3Jkcyk6CiAgICAgICAgam9pbmVkX3dvcmRzID0gX19fXwogICAgICAgIGZvciBfX19fIGluIF9fX186CiAgICAgICAgICAgIF9fX18KICAgICAgICByZXR1cm4gam9pbmVkX3dvcmRzCiAgICAgICAgCkZpbmFsbWVudGUsIHNlIGxlcyBwZWRpcsOhIGEgbG9zIGFsdW1ub3MgcXVlIGVzY3JpYmFuIHVuYSBmdW5jacOzbiBjb21wbGV0YSBwb3Igc3UgY3VlbnRhOgoKICAgICMgbWFrZV9hY3JvbnltKFsicmVkIiwgImdyZWVuIiwgImJsdWUiXSkgPT4gIlJHQiIKICAgIGRlZmluZSBtYWtlX2Fjcm9ueW0obGlzdF9vZl93b3Jkcyk6CiAgICAKIC0tLS0KIApMb3MgZWplbXBsb3MgZGVzY29sb3JpZG9zIGZ1bmNpb25hbiBwb3JxdWUgaW50cm9kdWNlbiBsYSBlc3RyYXRlZ2lhIGRlIHJlc29sdWNpw7NuIGRlIHByb2JsZW1hcyBwaWV6YSBwb3IgcGllemE6IGVuIGNhZGEgcGFzbywgbG9zIGFsdW1ub3MgdGllbmVuIHVuIG51ZXZvIHByb2JsZW1hIHF1ZSBhYm9yZGFyLCBxdWUgZXMgbWVub3MgaW50aW1pZGFudGUgcXVlIHVuYSBwYW50YWxsYSBlbiBibGFuY28gbyB1bmEgaG9qYSBkZSBwYXBlbCBlbiBibGFuY28gKFNlY2Npw7NuIDkuMTEpLiBUYW1iacOpbiBhbGllbnRhIGEgbG9zIGFsdW1ub3MgYSBwZW5zYXIgZW4gbGFzIHNpbWlsaXR1ZGVzIHkgZGlmZXJlbmNpYXMgZW50cmUgdmFyaW9zIGVuZm9xdWVzLCBsbyBxdWUgYXl1ZGEgYSBjcmVhciBsb3MgdsOtbmN1bG9zIGVuIHN1cyBtb2RlbG9zIG1lbnRhbGVzIHF1ZSBheXVkYW4gYSBsYSByZWN1cGVyYWNpw7NuLgoKTGEgY2xhdmUgcGFyYSBjb25zdHJ1aXIgdW4gYnVlbiBlamVtcGxvIGRlc3ZhbmVjaWRvIGVzIHBlbnNhciBlbiBsYSBlc3RyYXRlZ2lhIGRlIHJlc29sdWNpw7NuIGRlIHByb2JsZW1hcyBxdWUgZGViZSBlbnNlw7Fhci4gUG9yIGVqZW1wbG8sIGxvcyBwcm9ibGVtYXMgZGUgcHJvZ3JhbWFjacOzbiBzb2JyZSB0b2RvIHVzYW4gZWwgcGF0csOzbiBkZSBkaXNlw7FvIGRlbCBhY3VtdWxhZG9yLCBlbiBlbCBxdWUgbG9zIHJlc3VsdGFkb3MgZGVsIHByb2Nlc2FtaWVudG8gZGUgZWxlbWVudG9zIGRlIHVuYSBjb2xlY2Npw7NuIHNlIGFncmVnYW4gcmVwZXRpZGFtZW50ZSBhIHVuYSBzb2xhIHZhcmlhYmxlIGRlIGFsZ3VuYSBtYW5lcmEgcGFyYSBjcmVhciBlbCByZXN1bHRhZG8gZmluYWwuCgoKPioqQXByZW5kaXphamUgQ29nbml0aXZvKioKPgo+VW4gbW9kZWxvIGFsdGVybmF0aXZvIGRlIGFwcmVuZGl6YWplIGUgaW5zdHJ1Y2Npw7NuIHF1ZSB0YW1iacOpbiB1c2EgYW5kYW1pYWplIHkgZGVzdmFuZWNpbWllbnRvIGVzIGVsIGFwcmVuZGl6YWplIGNvZ25pdGl2bywgcXVlIGVuZmF0aXphIGxhIGZvcm1hIGVuIHF1ZSB1biBtYWVzdHJvIHRyYW5zbWl0ZSBoYWJpbGlkYWRlcyB5IGNvbm9jaW1pZW50b3MgYSB1biBhcHJlbmRpei4gRWwgbWFlc3RybyBwcm9wb3JjaW9uYSBtb2RlbG9zIGRlIGRlc2VtcGXDsW8geSByZXN1bHRhZG9zLCBsdWVnbyBlbnRyZW5hIGEgbG9zIG5vdmF0b3MgZXhwbGljYW5kbyBsbyBxdWUgZXN0w6FuIGhhY2llbmRvIHkgcG9yIHF1w6kgW0NvbGwxOTkxLCBDYXNwMjAwN10uIEVsIGFwcmVuZGl6IHJlZmxleGlvbmEgc29icmUgc3UgcHJvcGlhIHJlc29sdWNpw7NuIGRlIHByb2JsZW1hcywgcC4gcGVuc2FuZG8gZW4gdm96IGFsdGEgbyBjcml0aWNhbmRvIHN1IHByb3BpbyB0cmFiYWpvLCB5IGV2ZW50dWFsbWVudGUgZXhwbG9yYSBwcm9ibGVtYXMgZGUgc3UgcHJvcGlhIGVsZWNjacOzbi4KPgo+RXN0ZSBtb2RlbG8gbm9zIGRpY2UgcXVlIGxvcyBtYWVzdHJvcyBkZWJlbiBwcmVzZW50YXIgdmFyaW9zIGVqZW1wbG9zIGFsIHByZXNlbnRhciB1bmEgbnVldmEgaWRlYSBwYXJhIHF1ZSBsb3MgYWx1bW5vcyBwdWVkYW4gdmVyIHF1w6kgZ2VuZXJhbGl6YXIsIHkgcXVlIGRlYmVtb3MgdmFyaWFyIGxhIGZvcm1hIGRlbCBwcm9ibGVtYSBwYXJhIGRlamFyIGVuIGNsYXJvIGN1w6FsZXMgc29uIHkgY3XDoWxlcyBubyBzb24gY2FyYWN0ZXLDrXN0aWNhcyBzdXBlcmZpY2lhbGVzNjAuIExvcyBwcm9ibGVtYXMgZGViZW4gcHJlc2VudGFyc2UgZW4gY29udGV4dG9zIGRlbCBtdW5kbyByZWFsLCB5IGRlYmVtb3MgYWxlbnRhciBsYSBhdXRvZXhwbGljYWNpw7NuIHBhcmEgYXl1ZGFyIGEgbG9zIGFsdW1ub3MgYSBvcmdhbml6YXJzZSB5IGRhciBzZW50aWRvIGEgbG8gcXVlIHNlIGxlcyBhY2FiYSBkZSBlbnNlw7FhciAoU2VjY2nDs24gNS4xKS4KCiMjIFN1Ym1ldGFzIG1hcmNhZGFzCgpFdGlxdWV0YXIgc3VibWV0YXMgc2lnbmlmaWNhIGRhciBub21icmVzIGEgbG9zIHBhc29zIGVuIHVuYSBkZXNjcmlwY2nDs24gcGFzbyBhIHBhc28gZGUgdW4gcHJvY2VzbyBkZSByZXNvbHVjacOzbiBkZSBwcm9ibGVtYXMuIFtNYXJnMjAxNiwgTW9ycjIwMTZdIGRlc2N1YnJpZXJvbiBxdWUgbG9zIGFsdW1ub3MgY29uIHN1Ym1ldGFzIG1hcmNhZGFzIHJlc29sdmllcm9uIGxvcyBwcm9ibGVtYXMgZGUgUGFyc29ucyBtZWpvciBxdWUgbG9zIGFsdW1ub3Mgc2luIGVsbG9zLCB5IGVsIG1pc21vIGJlbmVmaWNpbyBzZSB2ZSBlbiBvdHJvcyBkb21pbmlvcyBbTWFyZzIwMTJdLiBWb2x2aWVuZG8gYWwgZWplbXBsbyBkZSBQeXRob24gdXRpbGl6YWRvIGFudGVyaW9ybWVudGUsIGxvcyBvYmpldGl2b3Mgc2VjdW5kYXJpb3MgcGFyYSBlbmNvbnRyYXIgbGEgbG9uZ2l0dWQgdG90YWwgZGUgdW5hIGxpc3RhIGRlIHBhbGFicmFzIG8gY29uc3RydWlyIHVuIGFjcsOzbmltbyBzb246CgoxLiBDcmVlIHVuIHZhbG9yIHZhY8OtbyBkZWwgdGlwbyBxdWUgc2UgZGV2b2x2ZXLDoS4KCjIuIE9idGVuZ2EgZWwgdmFsb3IgcXVlIHNlIGFncmVnYXLDoSBhbCByZXN1bHRhZG8gZGUgbGEgdmFyaWFibGUgZGUgYnVjbGUuCgozLiBBY3R1YWxpY2UgZWwgcmVzdWx0YWRvIGNvbiBlc2UgdmFsb3IuCgpFbCBldGlxdWV0YWRvIGRlIHN1Ym1ldGFzIGZ1bmNpb25hIHBvcnF1ZSBhZ3J1cGFyIGxvcyBwYXNvcyByZWxhY2lvbmFkb3MgZW4gZnJhZ21lbnRvcyBjb24gbm9tYnJlIChTZWNjacOzbiAzLjIpIGF5dWRhIGEgbG9zIGFsdW1ub3MgYSBkaXN0aW5ndWlyIHF1w6kgZXMgZ2Vuw6lyaWNvIGRlIGxvIHF1ZSBlcyBlc3BlY8OtZmljbyBwYXJhIGVsIHByb2JsZW1hIGVuIGN1ZXN0acOzbi4gVGFtYmnDqW4gbGVzIGF5dWRhIGEgY29uc3RydWlyIHVuIG1vZGVsbyBtZW50YWwgZGUgZXNlIHRpcG8gZGUgcHJvYmxlbWEgcGFyYSBxdWUgcHVlZGFuIHJlc29sdmVyIG90cm9zIHByb2JsZW1hcyBkZSBlc2UgdGlwbywgeSBsZXMgYnJpbmRhIHVuYSBvcG9ydHVuaWRhZCBuYXR1cmFsIHBhcmEgZXhwbGljYXJzZSBwb3Igc8OtIG1pc21vcyAoU2VjY2nDs24gNS4xKS4KCgojIyBNYW51YWxlcyBNaW5pbW9zCgpMYSBhcGxpY2FjacOzbiBtw6FzIHB1cmEgZGUgbGEgdGVvcsOtYSBkZSBsYSBjYXJnYSBjb2duaXRpdmEgcHVlZGUgc2VyIGVsIG1hbnVhbCBtw61uaW1vIGRlIEpvaG4gQ2Fycm9sbCBbQ2FycjE5ODcsIENhcnIyMDE0XS4gU3UgcHVudG8gZGUgcGFydGlkYSBlcyB1bmEgY2l0YSBkZSB1biB1c3VhcmlvOiAiUXVpZXJvIGhhY2VyIGFsZ28sIG5vIGFwcmVuZGVyIGEgaGFjZXIgdG9kbyIuIENhcnJvbGwgeSBzdXMgY29sZWdhcyByZWRpc2XDsWFyb24gbGEgY2FwYWNpdGFjacOzbiBwYXJhIHByZXNlbnRhciBjYWRhIGlkZWEgY29tbyB1bmEgdGFyZWEgYXV0w7Nub21hIGRlIHVuYSBzb2xhIHDDoWdpbmE6IHVuIHTDrXR1bG8gcXVlIGRlc2NyaWJlIGRlIHF1w6kgc2UgdHJhdGFiYSBsYSBww6FnaW5hLCBpbnN0cnVjY2lvbmVzIHBhc28gYSBwYXNvIGRlIGPDs21vIGhhY2VyIHVuYSBzb2xhIGNvc2EgKHBvciBlamVtcGxvLCBjw7NtbyBlbGltaW5hciB1bmEgbMOtbmVhIGVuIGJsYW5jbyBlbiB1biBlZGl0b3IgZGUgdGV4dG8pLCB5IGx1ZWdvIHZhcmlhcyBub3RhcyBzb2JyZSBjw7NtbyByZWNvbm9jZXIgeSBkZXB1cmFyIHByb2JsZW1hcyBjb211bmVzLiBEZXNjdWJyaWVyb24gcXVlIHJlZXNjcmliaXIgbG9zIG1hdGVyaWFsZXMgZGUgY2FwYWNpdGFjacOzbiBkZSBlc3RhIG1hbmVyYSBsb3MgYWNvcnRhYmEgZW4gZ2VuZXJhbCB5IHF1ZSBsYXMgcGVyc29uYXMgcXVlIGxvcyB1c2FiYW4gYXByZW5kw61hbiBtw6FzIHLDoXBpZG8uIEVzdHVkaW9zIHBvc3RlcmlvcmVzIGNvbmZpcm1hcm9uIHF1ZSBlc3RlIGVuZm9xdWUgc3VwZXLDsyBhbCBlbmZvcXVlIHRyYWRpY2lvbmFsIGluZGVwZW5kaWVudGVtZW50ZSBkZSBsYSBleHBlcmllbmNpYSBwcmV2aWEgY29uIGxhcyBjb21wdXRhZG9yYXMgW0xhem8xOTkzXS4gW0NhcnIyMDE0XSByZXN1bWnDsyBlc3RlIHRyYWJham8gZGljaWVuZG86Cgo+TnVlc3Ryb3MgZGlzZcOxb3MgIm1pbmltYWxpc3RhcyIgYnVzY2FiYW4gYXByb3ZlY2hhciBsYSBpbmljaWF0aXZhIGRlbCB1c3VhcmlvIHkgZWwgY29ub2NpbWllbnRvIHByZXZpbywgZW4gbHVnYXIgZGUgY29udHJvbGFybG8gYSB0cmF2w6lzIGRlIGFkdmVydGVuY2lhcyB5IHBhc29zIG9yZGVuYWRvcy4gSGl6byBoaW5jYXBpw6kgZW4gcXVlIGxvcyB1c3VhcmlvcyBzdWVsZW4gYXBvcnRhciBtdWNoYSBleHBlcmllbmNpYSB5IGNvbm9jaW1pZW50b3MgYSBlc3RlIGFwcmVuZGl6YWplLCBwb3IgZWplbXBsbywgY29ub2NpbWllbnRvIHNvYnJlIGVsIGRvbWluaW8gZGUgbGEgdGFyZWEsIHkgcXVlIGRpY2hvIGNvbm9jaW1pZW50byBwb2Ryw61hIHNlciB1biByZWN1cnNvIHBhcmEgbG9zIGRpc2XDsWFkb3JlcyBkZSBpbnN0cnVjY2nDs24uIEVsIG1pbmltYWxpc21vIGFwcm92ZWNow7MgbG9zIGVwaXNvZGlvcyBkZSByZWNvbm9jaW1pZW50byBkZSBlcnJvcmVzLCBkaWFnbsOzc3RpY28geSByZWN1cGVyYWNpw7NuLCBlbiBsdWdhciBkZSBpbnRlbnRhciBzaW1wbGVtZW50ZSBldml0YXIgZWwgZXJyb3IuIEVubWFyY8OzIGxhIHJlc29sdWNpw7NuIGRlIHByb2JsZW1hcyB5IGxhIHJlY3VwZXJhY2nDs24gY29tbyBvcG9ydHVuaWRhZGVzIGRlIGFwcmVuZGl6YWplIGVuIGx1Z2FyIGRlIGNvbW8gYWJlcnJhY2lvbmVzLgoKIyMgT3Ryb3MgbW9kZWxvcyBkZSBhcHJlbmRpemFqZQpMb3MgY3LDrXRpY29zIGRlIGxhIHRlb3LDrWEgZGUgbGEgY2FyZ2EgY29nbml0aXZhIGEgdmVjZXMgaGFuIGFyZ3VtZW50YWRvIHF1ZSBjdWFscXVpZXIgcmVzdWx0YWRvIHB1ZWRlIGp1c3RpZmljYXJzZSBkZXNwdcOpcyBkZWwgaGVjaG8gYWwgZXRpcXVldGFyIGxhcyBjb3NhcyBxdWUgcGVyanVkaWNhbiBlbCByZW5kaW1pZW50byBjb21vIGNhcmdhcyBleHRyYcOxYXMgeSBsYXMgcXVlIG5vIHNvbiBpbnRyw61uc2VjYXMgbyByZWxldmFudGVzLiBTaW4gZW1iYXJnbywgbGEgaW5zdHJ1Y2Npw7NuIGJhc2FkYSBlbiBsYSB0ZW9yw61hIGRlIGxhIGNhcmdhIGNvZ25pdGl2YSBlcyBpbmR1ZGFibGVtZW50ZSBlZmVjdGl2YS4gUG9yIGVqZW1wbG8sIFtNYXNvMjAxNl0gcmVkaXNlw7HDsyB1biBjdXJzbyBkZSBiYXNlIGRlIGRhdG9zIHBhcmEgZWxpbWluYXIgbGEgYXRlbmNpw7NuIGRpdmlkaWRhIHkgbG9zIGVmZWN0b3MgZGUgcmVkdW5kYW5jaWEgeSBwcm9wb3JjaW9uYXIgZWplbXBsb3MgeSBvYmpldGl2b3Mgc2VjdW5kYXJpb3MgdHJhYmFqYWRvcy4gRWwgbnVldm8gY3Vyc28gcmVkdWpvIGxhIHRhc2EgZGUgZnJhY2FzbyBkZWwgZXhhbWVuIGVuIHVuIDM0JSB5IGF1bWVudMOzIGxhIHNhdGlzZmFjY2nDs24gZGVsIGFsdW1uby4KClVuYSBkw6ljYWRhIGRlc3B1w6lzIGRlIGxhIHB1YmxpY2FjacOzbiBkZSBbS2lyczIwMDZdLCB1biBuw7ptZXJvIGNyZWNpZW50ZSBkZSBwZXJzb25hcyBjcmVlIHF1ZSBsYSB0ZW9yw61hIGRlIGxhIGNhcmdhIGNvZ25pdGl2YSB5IGxvcyBlbmZvcXVlcyBiYXNhZG9zICAgZW4gbGEgaW5kYWdhY2nDs24gc29uIGNvbXBhdGlibGVzIHNpIHNlIHZlbiBkZSBsYSBtYW5lcmEgY29ycmVjdGEuIFtLYWx5MjAxNV0gYXJndW1lbnRhIHF1ZSBsYSB0ZW9yw61hIGRlIGxhIGNhcmdhIGNvZ25pdGl2YSBlcyBiw6FzaWNhbWVudGUgdW5hIG1pY3JvZ2VzdGnDs24gZGVsIGFwcmVuZGl6YWplIGRlbnRybyBkZSB1biBjb250ZXh0byBtw6FzIGFtcGxpbyBxdWUgY29uc2lkZXJhIGNvc2FzIGNvbW8gbGEgbW90aXZhY2nDs24sIG1pZW50cmFzIHF1ZSBbS2lyczIwMThdIGV4dGllbmRlIGxhIHRlb3LDrWEgZGUgbGEgY2FyZ2EgY29nbml0aXZhIHBhcmEgaW5jbHVpciBhc3BlY3RvcyBjb2xhYm9yYXRpdm9zIGRlbCBhcHJlbmRpemFqZS4gQWwgaWd1YWwgcXVlIGNvbiBbTWFyazIwMThdIChkaXNjdXRpZG8gZW4gbGEgU2VjY2nDs24gNS4xKSwgbGFzIHBlcnNwZWN0aXZhcyBkZSBsb3MgaW52ZXN0aWdhZG9yZXMgcHVlZGVuIGRpZmVyaXIsIHBlcm8gbGEgaW1wbGVtZW50YWNpw7NuIHByw6FjdGljYSBkZSBzdXMgdGVvcsOtYXMgYSBtZW51ZG8gdGVybWluYSBzaWVuZG8gbGEgbWlzbWEuCgpVbm8gZGUgbG9zIGRlc2Fmw61vcyBlbiBsYSBpbnZlc3RpZ2FjacOzbiBlZHVjYXRpdmEgZXMgcXVlIGxvIHF1ZSBlbnRlbmRlbW9zIHBvciAiYXByZW5kaXphamUiIHJlc3VsdGEgY29tcGxpY2FkbyB1bmEgdmV6IHF1ZSBzZSBtaXJhIG3DoXMgYWxsw6EgZGVsIGF1bGEgb2NjaWRlbnRhbCBlc3RhbmRhcml6YWRhLiBEb3MgcGVyc3BlY3RpdmFzIGVzcGVjw61maWNhcyBkZSBsYSBwc2ljb2xvZ8OtYSBlZHVjYXRpdmEgaGFuIGluZmx1aWRvIGVuIGVzdGUgbGlicm8uIEVsIHF1ZSBoZW1vcyB1c2FkbyBoYXN0YSBhaG9yYSBlcyBlbCBjb2duaXRpdmlzbW8sIHF1ZSBzZSBlbmZvY2EgZW4gY29zYXMgY29tbyBlbCByZWNvbm9jaW1pZW50byBkZSBwYXRyb25lcywgbGEgZm9ybWFjacOzbiBkZSBsYSBtZW1vcmlhIHkgZWwgcmVjdWVyZG8uIEVzIGJ1ZW5vIHBhcmEgcmVzcG9uZGVyIHByZWd1bnRhcyBkZSBiYWpvIG5pdmVsLCBwZXJvIGdlbmVyYWxtZW50ZSBpZ25vcmEgY3Vlc3Rpb25lcyBtw6FzIGdyYW5kZXMgY29tbywgIsK/UXXDqSBxdWVyZW1vcyBkZWNpciBjb24iIGFwcmVuZGl6YWplICI/IiB5LCAiwr9RdWnDqW4gcHVlZGUgZGVjaWRpcj8iIEVsIG90cm8gZXMgZWwgYXByZW5kaXphamUgc2l0dWFkbywgcXVlIHNlIGVuZm9jYSBlbiBhdHJhZXIgYSBsYXMgcGVyc29uYXMgYSB1bmEgY29tdW5pZGFkIHkgcmVjb25vY2UgcXVlIGxhIGVuc2XDsWFuemEgeSBlbCBhcHJlbmRpemFqZSBzaWVtcHJlIGVzdMOhbiBlbnJhaXphZG9zIGVuIHF1acOpbmVzIHNvbW9zIHkgYSBxdWnDqW4gYXNwaXJhbW9zIHNlci4gTG8gZGlzY3V0aXJlbW9zIGNvbiBtw6FzIGRldGFsbGUgZW4gZWwgQ2Fww610dWxvIDEzLgoKRWwgc2l0aW8gd2ViIGRlIExlYXJuaW5nIFRoZW9yaWVzIHkgW1dpYnUyMDE2XSB0aWVuZW4gYnVlbm9zIHJlc8O6bWVuZXMgZGUgZXN0YXMgeSBvdHJhcyBwZXJzcGVjdGl2YXMuIEFkZW3DoXMgZGVsIGNvZ25pdGl2aXNtbywgbG9zIHF1ZSBzZSBlbmN1ZW50cmFuIGNvbiBtYXlvciBmcmVjdWVuY2lhIGluY2x1eWVuIGVsIGNvbmR1Y3Rpc21vIChxdWUgdHJhdGEgbGEgZWR1Y2FjacOzbiBjb21vIHVuIGNvbmRpY2lvbmFtaWVudG8gZGUgZXN0w61tdWxvIC8gcmVzcHVlc3RhKSwgZWwgY29uc3RydWN0aXZpc21vIChxdWUgY29uc2lkZXJhIGVsIGFwcmVuZGl6YWplIGNvbW8gdW4gcHJvY2VzbyBhY3Rpdm8gZHVyYW50ZSBlbCBjdWFsIGxvcyBhbHVtbm9zIGNvbnN0cnV5ZW4gY29ub2NpbWllbnRvIHBvciBzw60gbWlzbW9zKSB5IGVsIGNvbmVjdGl2aXNtbyAocXVlIHNvc3RpZW5lIHF1ZSBlbCBjb25vY2ltaWVudG8gc2UgZGlzdHJpYnV5ZSwgcXVlIGVsIGFwcmVuZGl6YWplIGVzIGVsIHByb2Nlc28gZGUgbmF2ZWdhY2nDs24sIGNyZWNpbWllbnRvIHkgcG9kYSBkZSBjb25leGlvbmVzLCB5IHF1ZSBlbmZhdGl6YSBsb3MgYXNwZWN0b3Mgc29jaWFsZXMgZGVsIGFwcmVuZGl6YWplIGhlY2hvcyBwb3NpYmxlcyBwb3IgaW50ZXJuZXQpLiBFc3RhcyBwZXJzcGVjdGl2YXMgcHVlZGVuIGF5dWRhcm5vcyBhIG9yZ2FuaXphciBudWVzdHJvcyBwZW5zYW1pZW50b3MsIHBlcm8gZW4gbGEgcHLDoWN0aWNhLCBzaWVtcHJlIHRlbmVtb3MgcXVlIHByb2JhciBudWV2b3MgbcOpdG9kb3MgZW4gbGEgY2xhc2UsIGNvbiBlc3R1ZGlhbnRlcyByZWFsZXMsIHBhcmEgZGVzY3VicmlyIHF1w6kgdGFuIGJpZW4gZXF1aWxpYnJhbiBsYXMgbXVjaGFzIGZ1ZXJ6YXMgZW4ganVlZ28uCgojIyBFamVyY2ljaW9zCgojIyMgQ3JlYXIgdW4gZWplbXBsbyBkZXN2YW5lY2lkbyAocGFyZXMgLyAzMCkKCkVzIG11eSBjb23Dum4gcXVlIGxvcyBwcm9ncmFtYXMgY3VlbnRlbiBjdcOhbnRhcyBjb3NhcyBzZSBkaXZpZGVuIGVuIGRpZmVyZW50ZXMgY2F0ZWdvcsOtYXM6IHBvciBlamVtcGxvLCBjdcOhbnRhcyB2ZWNlcyBhcGFyZWNlbiBkaWZlcmVudGVzIGNvbG9yZXMgZW4gdW5hIGltYWdlbiwgbyBjdcOhbnRhcyB2ZWNlcyBhcGFyZWNlbiBkaWZlcmVudGVzIHBhbGFicmFzIGVuIHVuIHDDoXJyYWZvIGRlIHRleHRvLgoKMS4gQ3JlZSB1biBicmV2ZSBlamVtcGxvIChubyBtw6FzIGRlIDEwIGzDrW5lYXMgZGUgY8OzZGlnbykgcXVlIG11ZXN0cmUgYSBsYXMgcGVyc29uYXMgY8OzbW8gaGFjZXIgZXN0bywgeSBsdWVnbyBjcmVlIHVuIHNlZ3VuZG8gZWplbXBsbyBxdWUgcmVzdWVsdmEgdW4gcHJvYmxlbWEgc2ltaWxhciBkZSB1bmEgbWFuZXJhIHNpbWlsYXIgcGVybyBxdWUgdGVuZ2EgdW4gcGFyIGRlIGVzcGFjaW9zIGVuIGJsYW5jbyBwYXJhIHF1ZSBsb3MgYWx1bW5vcyBjb21wbGV0ZW4uIHVzdGVkIGRlY2lkZSBxdcOpIGRlc3ZhbmVjZXJzZT8gwr9DdcOhbCBzZXLDrWEgZWwgc2lndWllbnRlIGVqZW1wbG8gZGUgbGEgc2VyaWU/CgoyLiBEZWZpbmEgbGEgYXVkaWVuY2lhIHBhcmEgc3VzIGVqZW1wbG9zLiBQb3IgZWplbXBsbywgwr9zb24gZXN0b3MgcHJpbmNpcGlhbnRlcyBxdWUgc29sbyBjb25vY2VuIGFsZ3Vub3MgY29uY2VwdG9zIGLDoXNpY29zIGRlIHByb2dyYW1hY2nDs24/IMK/TyBzb24gZXN0b3MgYWx1bW5vcyBjb24gYWxndW5hIGV4cGVyaWVuY2lhIGVuIHByb2dyYW1hY2nDs24/CgozLiBNdWVzdHJlIHN1IGVqZW1wbG8gYSB1biBjb21wYcOxZXJvLCBwZXJvIG5vIGxlIGRpZ2EgcGFyYSBxdcOpIG5pdmVsIGNyZWUgcXVlIGVzLiBVbmEgdmV6IHF1ZSBoYXlhbiBjb21wbGV0YWRvIGxvcyBlc3BhY2lvcyBlbiBibGFuY28sIHDDrWRhbGVzIHF1ZSBhZGl2aW5lbiBlbCBuaXZlbCBkZXNlYWRvLgoKU2kgaGF5IHBlcnNvbmFzIGVudHJlIGxvcyBhcHJlbmRpY2VzIHF1ZSBubyBwcm9ncmFtYW4gbmFkYSwgaW50ZW50ZSB1YmljYXJsb3MgZW4gZGlmZXJlbnRlcyBncnVwb3MgeSBoYWdhIHF1ZSBqdWVndWVuIGVsIHBhcGVsIGRlIGFwcmVuZGljZXMgcGFyYSBlc29zIGdydXBvcy4gQWx0ZXJuYXRpdmFtZW50ZSwgZWxpamEgdW4gZG9taW5pbyBkZSBwcm9ibGVtYSBkaWZlcmVudGUgeSBkZXNhcnJvbGxlIHVuIGVqZW1wbG8gZGVzdmFuZWNpZG8gcGFyYSDDqWwuCgojIyMgQ2FyZ2EgZGUgY2xhc2lmaWNhY2nDs24gKGdydXBvcyBwZXF1ZcOxb3MgLyAxNSkKCjEuIEVsaWphIHVuYSBicmV2ZSBsZWNjacOzbiBxdWUgdW4gbWllbWJybyBkZSBzdSBncnVwbyBoYXlhIGVuc2XDsWFkbyBvIHRvbWFkbyByZWNpZW50ZW1lbnRlLgoKMi4gSGFnYSB1bmEgbGlzdGEgZW4gZm9ybWEgZGUgcHVudG9zIGRlIGxhcyBpZGVhcywgaW5zdHJ1Y2Npb25lcyB5IGV4cGxpY2FjaW9uZXMgcXVlIGNvbnRpZW5lLgoKMy4gQ2xhc2lmaXF1ZSBjYWRhIHVubyBjb21vIGludHLDrW5zZWNvLCBwZXJ0aW5lbnRlIG8gZXh0cmHDsW8uIMK/RW4gcXXDqSBlc3RhYmFuIHRvZG9zIGRlIGFjdWVyZG8/IMK/RMOzbmRlIGVzdGFiYXMgZW4gZGVzYWN1ZXJkbyB5IHBvciBxdcOpPwoKKEVsIGVqZXJjaWNpbyAiQ8OzbW8gbm90YXIgc3UgcHVudG8gY2llZ28iIGVuIGxhIFNlY2Npw7NuIDMuNCBsZSBkYXLDoSB1bmEgaWRlYSBkZSBjdcOhbiBkZXRhbGxhZGEgZGViZSBzZXIgc3UgbGlzdGEgZGUgcHVudG9zKS4KCiMjIyBDcmVhciB1biBwcm9ibGVtYSBkZSBQYXJzb25zIChwYXJlcyAvIDIwKQoKRXNjcmliYSBjaW5jbyBvIHNlaXMgbMOtbmVhcyBkZSBjw7NkaWdvIHF1ZSBoYWdhbiBhbGdvIMO6dGlsLCBtw6l6Y2xlbGFzIHkgcMOtZGFsZSBhIHN1IGNvbXBhw7Flcm8gcXVlIGxhcyBvcmRlbmUuIFNpIGVzdMOhIHV0aWxpemFuZG8gdW4gbGVuZ3VhamUgYmFzYWRvIGVuIHNhbmdyw61hIGNvbW8gUHl0aG9uLCBubyBzYW5ncmEgbmluZ3VuYSBkZSBsYXMgbMOtbmVhczsgU2kgZXN0w6EgdXRpbGl6YW5kbyB1biBsZW5ndWFqZSBkZSBsbGF2ZXMgY29tbyBKYXZhLCBubyBpbmNsdXlhIG5pbmd1bmEgZGUgbGFzIGxsYXZlcy4gKFNpIHN1IGdydXBvIGluY2x1eWUgcGVyc29uYXMgcXVlIG5vIHNvbiBwcm9ncmFtYWRvcmVzLCB1c2UgdW4gZG9taW5pbyBwcm9ibGVtw6F0aWNvIGRpZmVyZW50ZSwgY29tbyBoYWNlciBwYW4gZGUgcGzDoXRhbm8pLgoKIyMjIE1hbnVhbGVzIG3DrW5pbW9zIChpbmRpdmlkdWFsIC8gMjApCkVzY3JpYmEgdW5hIGd1w61hIGRlIHVuYSBww6FnaW5hIHBhcmEgaGFjZXIgYWxnbyBxdWUgc3VzIGFsdW1ub3MgcHVlZGFuIGVuY29udHJhciBlbiB1bmEgZGUgc3VzIGNsYXNlcywgY29tbyBjZW50cmFyIGVsIHRleHRvIGhvcml6b250YWxtZW50ZSBvIGltcHJpbWlyIHVuIG7Dum1lcm8gY29uIHVuIGNpZXJ0byBuw7ptZXJvIGRlIGTDrWdpdG9zIGRlc3B1w6lzIGRlbCBwdW50byBkZWNpbWFsLiBJbnRlbnRlIGVudW1lcmFyIGFsIG1lbm9zIHRyZXMgbyBjdWF0cm8gY29tcG9ydGFtaWVudG9zIG8gcmVzdWx0YWRvcyBpbmNvcnJlY3RvcyBxdWUgZWwgYWx1bW5vIHB1ZWRhIHZlciBlIGluY2x1eWEgdW5hIGV4cGxpY2FjacOzbiBkZSB1bmEgbyBkb3MgbMOtbmVhcyBkZSBwb3IgcXXDqSBzdWNlZGUgY2FkYSB1bm8geSBjw7NtbyBjb3JyZWdpcmxvLgoKIyMjIEFwcmVuZGl6YWplIGNvZ25pdGl2byAocGFyZXMgLyAxNSkKCkVsaWphIHVuIHByb2JsZW1hIGRlIGNvZGlmaWNhY2nDs24gcXVlIHB1ZWRhIHJlc29sdmVyIGVuIGRvcyBvIHRyZXMgbWludXRvcyB5IHBpZW5zZSBlbiB2b3ogYWx0YSBtaWVudHJhcyBsbyByZXN1ZWx2ZSBtaWVudHJhcyBzdSBjb21wYcOxZXJvIGxlIGhhY2UgcHJlZ3VudGFzIHNvYnJlIGxvIHF1ZSBlc3TDoSBoYWNpZW5kbyB5IHBvciBxdcOpLiBObyBzb2xvIGV4cGxpcXVlIGxvIHF1ZSBlc3TDoSBoYWNpZW5kbywgc2lubyB0YW1iacOpbiBwb3IgcXXDqSBsbyBlc3TDoSBoYWNpZW5kbywgY8OzbW8gc2FiZSBxdWUgZXMgbG8gY29ycmVjdG8geSBxdcOpIGFsdGVybmF0aXZhcyBoYSBjb25zaWRlcmFkbyBwZXJvIGRlc2NhcnRhZG8uIEN1YW5kbyB0ZXJtaW5lcywgaW50ZXJjYW1iaWEgcm9sZXMgY29uIHR1IHBhcmVqYSB5IHJlcGl0ZSBlbCBlamVyY2ljaW8uCgojIyMgRWplbXBsb3MgcmVzdWVsdG9zIChwYXJlcyAvIDE1KQoKVmVyIGVqZW1wbG9zIHByw6FjdGljb3MgYXl1ZGEgYSBsYXMgcGVyc29uYXMgYSBhcHJlbmRlciBhIHByb2dyYW1hciBtw6FzIHLDoXBpZG8gcXVlIHNpbXBsZW1lbnRlIGVzY3JpYmlyIG11Y2hvIGPDs2RpZ28gW1NrdWQyMDE0XSwgeSBkZWNvbnN0cnVpciBlbCBjw7NkaWdvIGFsIHJhc3RyZWFybG8gbyBkZXB1cmFybG8gdGFtYmnDqW4gYXVtZW50YSBlbCBhcHJlbmRpemFqZSBbR3JpZjIwMTZdLiBUcmFiYWphbmRvIGVuIHBhcmVqYXMsIHJldmlzZSB1biBjw7NkaWdvIGRlIDEwIGEgMTUgbMOtbmVhcyB5IGV4cGxpcXVlIHF1w6kgaGFjZSBjYWRhIGRlY2xhcmFjacOzbiB5IHBvciBxdcOpIGVzIG5lY2VzYXJpYS4gwr9DdcOhbnRvIHRpZW1wbyBzZSB0YXJkYT8gwr9DdcOhbnRhcyBjb3NhcyBjcmVlIHF1ZSBuZWNlc2l0YSBleHBsaWNhciBwb3IgbMOtbmVhIGRlIGPDs2RpZ28/CgojIyMgR3LDoWZpY29zIGNyw610aWNvcyAoaW5kaXZpZHVhbCAvIDMwKQpbTWF5ZTIwMDksIE1pbGwyMDE2YV0gcHJlc2VudGEgc2VpcyBwcmluY2lwaW9zIHBhcmEgYnVlbm9zIGdyw6FmaWNvcyBkZSBlbnNlw7FhbnphOgoKKipTZcOxYWxpemFjacOzbjoqKiByZXNhbHRlIHZpc3VhbG1lbnRlIGxvcyBwdW50b3MgbcOhcyBpbXBvcnRhbnRlcyBwYXJhIHF1ZSBzZSBkZXN0YXF1ZW4gZGVsIG1hdGVyaWFsIG1lbm9zIGNyw610aWNvLgoKKipDb250aWfDvGlkYWQgZXNwYWNpYWw6KiogY29sb3F1ZSBzdWJ0w610dWxvcyB0YW4gY2VyY2EgZGUgbG9zIGdyw6FmaWNvcyBjb21vIHNlYSBwcsOhY3RpY28gcGFyYSBjb21wZW5zYXIgZWwgY29zdG8gZGUgY2FtYmlhciBlbnRyZSBsb3MgZG9zLgoKKipDb250aWfDvGlkYWQgdGVtcG9yYWw6KiogUHJlc2VudGFyIG5hcnJhY2nDs24gaGFibGFkYSB5IGdyw6FmaWNvcyB0YW4gY2VyY2Fub3MgZW4gZWwgdGllbXBvIGNvbW8gc2VhIHByw6FjdGljby4gKFByZXNlbnRhciBhbWJvcyBhIGxhIHZleiBlcyBtZWpvciBxdWUgcHJlc2VudGFybG9zIHVubyB0cmFzIG90cm8pLgoKKipTZWdtZW50YWNpw7NuOioqIEN1YW5kbyBwcmVzZW50ZSB1bmEgc2VjdWVuY2lhIGxhcmdhIGRlIG1hdGVyaWFsIG8gY3VhbmRvIGxvcyBhbHVtbm9zIG5vIHRlbmdhbiBleHBlcmllbmNpYSBjb24gZWwgdGVtYSwgZGl2aWRhIGxhIHByZXNlbnRhY2nDs24gZW4gc2VnbWVudG9zIGNvcnRvcyB5IHBlcm1pdGEgcXVlIGxvcyBhbHVtbm9zIGNvbnRyb2xlbiBsYSByYXBpZGV6IGNvbiBsYSBxdWUgYXZhbnphbiBhbCBzaWd1aWVudGUuCgoqKlByZS1lbnRyZW5hbWllbnRvOioqIFNpIGxvcyBhbHVtbm9zIG5vIGNvbm9jZW4gbG9zIGNvbmNlcHRvcyB5IGxhIHRlcm1pbm9sb2fDrWEgcHJpbmNpcGFsZXMgdXRpbGl6YWRvcyBlbiBzdSBwcmVzZW50YWNpw7NuLCBlbnNlw7FlIHNvbG8gZXNvcyBjb25jZXB0b3MgeSB0w6lybWlub3MgZGUgYW50ZW1hbm8uCgoqKk1vZGFsaWRhZDoqKiBsYXMgcGVyc29uYXMgYXByZW5kZW4gbWVqb3IgZGUgbGFzIGltw6FnZW5lcyBtw6FzIGxhIG5hcnJhY2nDs24gcXVlIGRlIGxhcyBpbcOhZ2VuZXMgbcOhcyBlbCB0ZXh0bywgYSBtZW5vcyBxdWUgc2VhbiBoYWJsYW50ZXMgbm8gbmF0aXZvcyBvIHF1ZSB0ZW5nYW4gcGFsYWJyYXMgbyBzw61tYm9sb3MgdMOpY25pY29zLgoKRWxpamEgdW4gdmlkZW8gZGUgdW5hIGxlY2Npw7NuIG8gaGFibGUgZW4gbMOtbmVhIHF1ZSB1c2UgZGlhcG9zaXRpdmFzIHUgb3RyYXMgcHJlc2VudGFjaW9uZXMgZXN0w6F0aWNhcyB5IGNhbGlmaXF1ZSBzdXMgZ3LDoWZpY29zIGNvbW8gInBvYnJlIiwgInByb21lZGlvIiBvICJidWVubyIgZGUgYWN1ZXJkbyBjb24gZXN0b3Mgc2VpcyBjcml0ZXJpb3MuCgojIyBSZXN1bWVuCgohW2Y6Y29nbml0aXZlLWxvYWRdKC4vaW1nX3RyYW5pbmcvY29uY2VwdG1hcC1jb2duaXRpdmUtbG9hZC5zdmcpCi0tLS0tCgojIEFwcmVuZGl6YWplIGluZGl2aWR1YWwKCkxvcyBjYXDDrXR1bG9zIGFudGVyaW9yZXMgaGFuIGV4cGxvcmFkbyBsbyBxdWUgbG9zIG1hZXN0cm9zIHB1ZWRlbiBoYWNlciBwYXJhIGF5dWRhciBhIGxvcyBhbHVtbm9zLiBFc3RlIGNhcMOtdHVsbyBhbmFsaXphIGxvIHF1ZSBsb3MgYWx1bW5vcyBwdWVkZW4gaGFjZXIgcG9yIHPDrSBtaXNtb3MgYWwgY2FtYmlhciBzdXMgZXN0cmF0ZWdpYXMgZGUgZXN0dWRpbyB5IGRlc2NhbnNhciBsbyBzdWZpY2llbnRlLgoKTGEgZXN0cmF0ZWdpYSBtw6FzIGVmZWN0aXZhIGVzIGNhbWJpYXIgZGVsIGFwcmVuZGl6YWplIHBhc2l2byBhbCBhcHJlbmRpemFqZSBhY3Rpdm8gW0hwbDIwMThdLCBsbyBxdWUgbWVqb3JhIHNpZ25pZmljYXRpdmFtZW50ZSBlbCByZW5kaW1pZW50byB5IHJlZHVjZSBsYXMgdGFzYXMgZGUgZnJhY2FzbyBbRnJlZTIwMTRdOgoKICAgIFBhc3NpdmUgICAgICAgICAgICAgICAgICAgQWN0aXZlCiAgICBSZWFkIGFib3V0IHNvbWV0aGluZyAgICAgIERvIGV4ZXJjaXNlcwogICAgV2F0Y2ggYSB2aWRlbyAgICAgICAgICAgICBEaXNjdXNzIGEgdG9waWMKICAgIEF0dGVuZCBhIGxlY3R1cmUgICAgICAgICAgVHJ5IHRvIGV4cGxhaW4gaXQKICAgIAogICAgClJlZmlyacOpbmRvc2UgYSBudWVzdHJvIG1vZGVsbyBzaW1wbGlmaWNhZG8gZGUgYXJxdWl0ZWN0dXJhIGNvZ25pdGl2YSAoRmlndXJhIFtmOiBtb2RlbG8gZGUgYXJjb10pLCBlbCBhcHJlbmRpemFqZSBhY3Rpdm8gZXMgbcOhcyBlZmVjdGl2byBwb3JxdWUgbWFudGllbmUgbGEgaW5mb3JtYWNpw7NuIG51ZXZhIGVuIGxhIG1lbW9yaWEgYSBjb3J0byBwbGF6byBwb3IgbcOhcyB0aWVtcG8sIGxvIHF1ZSBhdW1lbnRhIGxhcyBwcm9iYWJpbGlkYWRlcyBkZSBxdWUgc2UgY29kaWZpcXVlIGNvbiDDqXhpdG8geSBzZSBhbG1hY2VuZSBlbiBtZW1vcmlhIGEgbGFyZ28gcGxhem8uIFkgYWwgdXNhciBudWV2YSBpbmZvcm1hY2nDs24gYSBtZWRpZGEgcXVlIGxsZWdhLCBsb3MgYWx1bW5vcyBkZXNhcnJvbGxhbiBvIGZvcnRhbGVjZW4gbG9zIGxhem9zIGVudHJlIGVzYSBpbmZvcm1hY2nDs24geSBsbyBxdWUgeWEgc2FiZW4sIGxvIHF1ZSBhIHN1IHZleiBhdW1lbnRhIGxhcyBwb3NpYmlsaWRhZGVzIGRlIHF1ZSBwdWVkYW4gcmVjdXBlcmFybGEgbcOhcyB0YXJkZS4KCkxhIG90cmEgY2xhdmUgcGFyYSBzYWNhciBtw6FzIHByb3ZlY2hvIGRlbCBhcHJlbmRpemFqZSBlcyBsYSAqKm1ldGFjb2duaWNpw7NuKiosIG8gcGVuc2FyIGVuIGVsIHByb3BpbyBwZW5zYW1pZW50by4gQXPDrSBjb21vIGxvcyBidWVub3MgbcO6c2ljb3MgZXNjdWNoYW4gc3UgcHJvcGlhIGludGVycHJldGFjacOzbiB5IGxvcyBidWVub3MgbWFlc3Ryb3MgcmVmbGV4aW9uYW4gc29icmUgc3UgZW5zZcOxYW56YSAoQ2Fww610dWxvIDgpLCBsb3MgYWx1bW5vcyBhcHJlbmRlcsOhbiBtZWpvciB5IG3DoXMgcsOhcGlkbyBzaSBoYWNlbiBwbGFuZXMsIGVzdGFibGVjZW4gbWV0YXMgeSBtb25pdG9yZWFuIHN1IHByb2dyZXNvLiBFcyBkaWbDrWNpbCBwYXJhIGxvcyBlc3R1ZGlhbnRlcyBkb21pbmFyIGVzdGFzIGhhYmlsaWRhZGVzIGVuIGFic3RyYWN0bywgc29sbyBkZWNpcmxlcyBxdWUgaGFnYW4gcGxhbmVzIG5vIHRpZW5lIG5pbmfDum4gZWZlY3RvLCBwZXJvIGxhcyBsZWNjaW9uZXMgcHVlZGVuIGRpc2XDsWFyc2UgcGFyYSBmb21lbnRhciBidWVuYXMgcHLDoWN0aWNhcyBkZSBlc3R1ZGlvLCB5IGxsYW1hciBsYSBhdGVuY2nDs24gc29icmUgZXN0YXMgcHLDoWN0aWNhcyBlbiBjbGFzZSBheXVkYSBhIGxvcyBlc3R1ZGlhbnRlcyBhIGRhcnNlIGN1ZW50YSBkZSBxdWUgYXByZW5kZXIgZXMgdW5hIGhhYmlsaWRhZCBxdWUgcHVlZGVuIG1lam9yYXIgY29tbyBjdWFscXVpZXIgb3RyYSBbTWNHdTIwMTUsIE1peWEyMDE4XS4KCkVsIGdyYW4gcHJlbWlvIGVzIGxhICoqdHJhbnNmZXJlbmNpYSBkZSBhcHJlbmRpemFqZSoqLCBxdWUgb2N1cnJlIGN1YW5kbyB1bmEgY29zYSBxdWUgaGVtb3MgYXByZW5kaWRvIG5vcyBheXVkYSBhIGFwcmVuZGVyIG90cmFzIGNvc2FzIG3DoXMgcsOhcGlkYW1lbnRlLiBMb3MgaW52ZXN0aWdhZG9yZXMgZGlzdGluZ3VlbiBlbnRyZSAqKnRyYW5zZmVyZW5jaWEgY2VyY2FuYSoqLCBxdWUgb2N1cnJlIGVudHJlIMOhcmVhcyBzaW1pbGFyZXMgbyByZWxhY2lvbmFkYXMsIGNvbW8gZnJhY2Npb25lcyB5IGRlY2ltYWxlcyBlbiBtYXRlbcOhdGljYXMsIHkgdHJhbnNmZXJlbmNpYSByZW1vdGEsIHF1ZSBvY3VycmUgZW50cmUgZG9taW5pb3MgZGlmZXJlbnRlcywgcG9yIGVqZW1wbG8sIGxhIGlkZWEgZGUgcXVlIGFwcmVuZGVyIGEganVnYXIgYWwgYWplZHJleiBheXVkYXLDoSBhbCByYXpvbmFtaWVudG8gbWF0ZW3DoXRpY28gbyB2aWNldmVyc2EuCgpTaW4gbHVnYXIgYSBkdWRhcywgc2UgcHJvZHVjZSB1bmEgdHJhbnNmZXJlbmNpYSBjZXJjYW5hLCBzaSBubyBmdWVyYSBhc8OtLCBwb2Ryw61hIG9jdXJyaXIgdW4gdGlwbyBkZSBhcHJlbmRpemFqZSBtw6FzIGFsbMOhIGRlIGxhIHNpbXBsZSBtZW1vcml6YWNpw7NuLCB5IGxvcyBtYWVzdHJvcyBsbyBhcHJvdmVjaGFuIHRvZG8gZWwgdGllbXBvIGRhbmRvIGEgbG9zIGFsdW1ub3MgZWplcmNpY2lvcyBxdWUgc29uIHNpbWlsYXJlcyBhbCBtYXRlcmlhbCBxdWUgc2UgYWNhYmEgZGUgcHJlc2VudGFyIGVuIHVuYSBsZWNjacOzbi4gU2luIGVtYmFyZ28sIFtTYWxhMjAxN10gYW5hbGl6w7MgbXVjaG9zIGVzdHVkaW9zIGRlIHRyYW5zZmVyZW5jaWEgbGVqYW5hIHkgY29uY2x1ecOzIHF1ZToKCgo+Li4uIGxvcyByZXN1bHRhZG9zIG11ZXN0cmFuIGVmZWN0b3MgcGVxdWXDsW9zIGEgbW9kZXJhZG9zLiBTaW4gZW1iYXJnbywgbG9zIHRhbWHDsW9zIGRlbCBlZmVjdG8gZXN0w6FuIGludmVyc2FtZW50ZSByZWxhY2lvbmFkb3MgY29uIGxhIGNhbGlkYWQgZGVsIGRpc2XDsW8gZXhwZXJpbWVudGFsIC4uLiBMbGVnYW1vcyBhIGxhIGNvbmNsdXNpw7NuIGRlIHF1ZSByYXJhIHZleiBzZSBwcm9kdWNlIHVuYSB0cmFuc2ZlcmVuY2lhIGxlamFuYSBkZWwgYXByZW5kaXphamUuCgpDdWFuZG8gc2UgcHJvZHVjZSB1bmEgdHJhbnNmZXJlbmNpYSBsZWphbmEsIHBhcmVjZSBzdWNlZGVyIHNvbG8gdW5hIHZleiBxdWUgdW4gc3VqZXRvIGhhIHNpZG8gZG9taW5hZG8gW0dpY2sxOTg3XS4gRW4gbGEgcHLDoWN0aWNhLCBlc3RvIHNpZ25pZmljYSBxdWUgYXByZW5kZXIgYSBwcm9ncmFtYXIgbm8gdGUgYXl1ZGFyw6EgYSBqdWdhciBhamVkcmV6IHkgdmljZXZlcnNhLgoKIyMgU2VpcyBlc3RyYXRlZ2lhcwoKTG9zIHBzaWPDs2xvZ29zIGVzdHVkaWFuIGVsIGFwcmVuZGl6YWplIGRlIHVuYSBncmFuIHZhcmllZGFkIGRlIGZvcm1hcywgcGVybyBoYW4gbGxlZ2FkbyBhIGNvbmNsdXNpb25lcyBzaW1pbGFyZXMgc29icmUgbG8gcXVlIHJlYWxtZW50ZSBmdW5jaW9uYSBbTWFyazIwMThdLiBMb3MgY2llbnTDrWZpY29zIGRlbCBhcHJlbmRpemFqZSBoYW4gY2F0YWxvZ2FkbyBzZWlzIGRlIGVzdGFzIGVzdHJhdGVnaWFzIHkgbGFzIHJlc3VtaWVyb24gZW4gdW4gY29uanVudG8gZGUgY2FydGVsZXMgZGVzY2FyZ2FibGVzLiBFbnNlw7FhciBlc3RhcyBlc3RyYXRlZ2lhcyBhIGxvcyBhbHVtbm9zLCB5IG1lbmNpb25hcmxhcyBwb3Igc3Ugbm9tYnJlIGN1YW5kbyBsYXMgdXNlIGVuIGNsYXNlLCBwdWVkZSBheXVkYXJsb3MgYSBhcHJlbmRlciBjw7NtbyBhcHJlbmRlciBtw6FzIHLDoXBpZG8geSBtZWpvciBbV2VpbjIwMThhLCBXZWluMjAxOGJdLgoKIyMgUHLDoWN0aWNhIGVzcGFjaWFkYQoKRGlleiBob3JhcyBkZSBlc3R1ZGlvIHJlcGFydGlkYXMgZW4gY2luY28gZMOtYXMgZXMgbcOhcyBlZmVjdGl2byBxdWUgZG9zIGTDrWFzIGRlIGNpbmNvIGhvcmFzLCB5IG11Y2hvIG1lam9yIHF1ZSB1biBkw61hIGRlIGRpZXogaG9yYXMuIFBvciBsbyB0YW50bywgZGViZSBjcmVhciB1biBjcm9ub2dyYW1hIGRlIGVzdHVkaW8gcXVlIGRpZnVuZGEgbGFzIGFjdGl2aWRhZGVzIGRlIGVzdHVkaW8gYSBsbyBsYXJnbyBkZWwgdGllbXBvOiBibG9xdWVlIGFsIG1lbm9zIG1lZGlhIGhvcmEgcGFyYSBlc3R1ZGlhciBjYWRhIHRlbWEgY2FkYSBkw61hIGVuIGx1Z2FyIGRlIHRyYXRhciBkZSBtZXRlciB0b2RvIGVuIGxhIG5vY2hlIGFudGVyaW9yIGEgdW4gZXhhbWVuIFtLYW5nMjAxNl0uCgpUYW1iacOpbiBkZWJlIHJldmlzYXIgZWwgbWF0ZXJpYWwgZGVzcHXDqXMgZGUgY2FkYSBjbGFzZSwgcGVybyBubyBpbm1lZGlhdGFtZW50ZSBkZXNwdcOpczogdG9tZSBhbCBtZW5vcyB1biBkZXNjYW5zbyBkZSBtZWRpYSBob3JhLiBDdWFuZG8gcmV2aXNlLCBhc2Vnw7pyZXNlIGRlIGluY2x1aXIgYWwgbWVub3MgdW4gcG9jbyBkZSBtYXRlcmlhbCBhbnRpZ3VvOiBwb3IgZWplbXBsbywgcGFzZSB2ZWludGUgbWludXRvcyByZXZpc2FuZG8gbGFzIG5vdGFzIGRlIGxhIGNsYXNlIGRlIGVzZSBkw61hIHkgbHVlZ28gY2luY28gbWludXRvcyByZXZpc2FuZG8gZWwgbWF0ZXJpYWwgZGVsIGTDrWEgYW50ZXJpb3IgeSBkZSB1bmEgc2VtYW5hIGFudGVzLiBIYWNlciBlc3RvIHRhbWJpw6luIGxvIGF5dWRhIGEgZGV0ZWN0YXIgdmFjw61vcyBvIGVycm9yZXMgZW4gbG9zIGNvbmp1bnRvcyBkZSBub3RhcyBhbnRlcmlvcmVzIG1pZW50cmFzIHRvZGF2w61hIGhheSB0aWVtcG8gcGFyYSBjb3JyZWdpcmxvcyBvIGhhY2VyIHByZWd1bnRhczogZXMgZG9sb3Jvc28gZGFyc2UgY3VlbnRhIGxhIG5vY2hlIGFudGVyaW9yIGFsIGV4YW1lbiBkZSBxdWUgbm8gdGllbmUgaWRlYSBkZSBwb3IgcXXDqSBzdWJyYXnDsyAiwqFEZW1vZHVsYXIhIiB0cmVzIHZlY2VzLgoKQWwgcmV2aXNhciwgdG9tZSBub3RhcyBzb2JyZSBjb3NhcyBxdWUgaGFiw61hIG9sdmlkYWRvOiBwb3IgZWplbXBsbywgaGFnYSB1bmEgdGFyamV0YSBkZSBtZW1vcmlhIHBhcmEgY2FkYSBoZWNobyBxdWUgbm8gcHVkbyByZWNvcmRhciBvIHF1ZSByZWNvcmRhYmEgaW5jb3JyZWN0YW1lbnRlIFtNYXR0MjAxOV0uIEVzdG8gbG8gYXl1ZGFyw6EgYSBlbmZvY2FyIGxhIHByw7N4aW1hIHJvbmRhIGRlIGVzdHVkaW8gZW4gbGFzIGNvc2FzIHF1ZSBtw6FzIG5lY2VzaXRhbiBhdGVuY2nDs24uCgoKPioqRWwgdmFsb3IgZGUgbGFzIGNvbmZlcmVuY2lhcyoqCj4KPlNlZ8O6biBbTWlsbDIwMTZhXSwg4oCcbGFzIGNvbmZlcmVuY2lhcyBxdWUgcHJlZG9taW5hbiBlbiBsb3MgY3Vyc29zIHByZXNlbmNpYWxlcyBzb24gZm9ybWFzIHJlbGF0aXZhbWVudGUgaW5lZmljYWNlcyBkZSBlbnNlw7FhciwgcGVybyBwcm9iYWJsZW1lbnRlIGNvbnRyaWJ1eWVuIGEgZXNwYWNpYXIgZWwgbWF0ZXJpYWwgY29uIGVsIHRpZW1wbywgcG9ycXVlIHNlIGRlc2Fycm9sbGFuIGVuIHVuIGhvcmFyaW8gZXN0YWJsZWNpZG8gYSBsbyBsYXJnbyBkZWwgdGllbXBvLiBQb3IgZWwgY29udHJhcmlvLCBkZXBlbmRpZW5kbyBkZSBjw7NtbyBlc3TDqW4gY29uZmlndXJhZG9zIGxvcyBjdXJzb3MsIGxvcyBlc3R1ZGlhbnRlcyBlbiBsw61uZWEgYSB2ZWNlcyBwdWVkZW4gZXZpdGFyIGxhIGV4cG9zaWNpw7NuIGFsIG1hdGVyaWFsIHBvciBjb21wbGV0byBoYXN0YSBxdWUgdW5hIHRhcmVhIGVzdMOpIGNlcmNhIOKAnS4KCiMjIFByw6FjdGljYSBkZSByZWN1cGVyYWNpw7NuCgpFbCBmYWN0b3IgbGltaXRhbnRlIHBhcmEgbGEgbWVtb3JpYSBhIGxhcmdvIHBsYXpvIG5vIGVzIGxhIHJldGVuY2nDs24gKGxvIHF1ZSBlc3TDoSBhbG1hY2VuYWRvKSBzaW5vIGxhIHJlY3VwZXJhY2nDs24gKGEgbG8gcXVlIHNlIHB1ZWRlIGFjY2VkZXIpLiBMYSByZWN1cGVyYWNpw7NuIGRlIGluZm9ybWFjacOzbiBlc3BlY8OtZmljYSBtZWpvcmEgY29uIGxhIHByw6FjdGljYSwgcG9yIGxvIHF1ZSBsb3MgcmVzdWx0YWRvcyBlbiBzaXR1YWNpb25lcyByZWFsZXMgcHVlZGVuIG1lam9yYXJzZSB0b21hbmRvIGV4w6FtZW5lcyBkZSBwcsOhY3RpY2EgbyByZXN1bWllbmRvIGxvcyBkZXRhbGxlcyBkZSB1biB0ZW1hIGRlIG1lbW9yaWEgeSBsdWVnbyB2ZXJpZmljYW5kbyBsbyBxdWUgZnVlIHkgbm8gZnVlIHJlY29yZGFkby4gUG9yIGVqZW1wbG8sIFtLYXJwMjAwOF0gZGVzY3VicmnDsyBxdWUgbGFzIHBydWViYXMgcmVwZXRpZGFzIG1lam9yYXJvbiBlbCByZWN1ZXJkbyBkZSBsYXMgbGlzdGFzIGRlIHBhbGFicmFzIGRlbCAzNSUgYWwgODAlLgoKTGEgcmVjdXBlcmFjacOzbiBlcyBtZWpvciBjdWFuZG8gbGEgcHLDoWN0aWNhIHV0aWxpemEgYWN0aXZpZGFkZXMgc2ltaWxhcmVzIGEgbGFzIHV0aWxpemFkYXMgZW4gbGFzIHBydWViYXMuIFBvciBlamVtcGxvLCBlc2NyaWJpciBlbnRyYWRhcyBkZSBkaWFyaW8gcGVyc29uYWxlcyBheXVkYSBjb24gY3Vlc3Rpb25hcmlvcyBkZSBvcGNpw7NuIG3Dumx0aXBsZSwgcGVybyBtZW5vcyBxdWUgaGFjZXIgY3Vlc3Rpb25hcmlvcyBkZSBwcsOhY3RpY2EgW01pbGwyMDE2YV0uIEVzdGUgZmVuw7NtZW5vIHNlIGxsYW1hICoqcHJvY2VzYW1pZW50byBhcHJvcGlhZG8gcGFyYSBsYSB0cmFuc2ZlcmVuY2lhKiouCgpVbmEgZm9ybWEgZGUgZWplcmNpdGFyIGxhcyBoYWJpbGlkYWRlcyBkZSByZWN1cGVyYWNpw7NuIGVzIHJlc29sdmVyIHByb2JsZW1hcyBkb3MgdmVjZXMuIExhIHByaW1lcmEgdmV6LCBow6FnYWxvIGNvbXBsZXRhbWVudGUgZGUgbWVtb3JpYSBzaW4gbm90YXMgbyBkaXNjdXNpw7NuIGNvbiBzdXMgY29tcGHDsWVyb3MuIERlc3B1w6lzIGRlIGNhbGlmaWNhciBzdSBwcm9waW8gdHJhYmFqbyBjb24gdW5hIHLDumJyaWNhIHByb3Zpc3RhIHBvciBlbCBtYWVzdHJvLCByZXN1ZWx2YSBlbCBwcm9ibGVtYSBudWV2YW1lbnRlIHV0aWxpemFuZG8gbG9zIHJlY3Vyc29zIHF1ZSBkZXNlZS4gTGEgZGlmZXJlbmNpYSBlbnRyZSBsb3MgZG9zIGxlIG11ZXN0cmEgcXXDqSB0YW4gYmllbiBwdWRvIHJlY3VwZXJhciB5IGFwbGljYXIgZWwgY29ub2NpbWllbnRvLgoKT3RybyBtw6l0b2RvIChtZW5jaW9uYWRvIGFudGVyaW9ybWVudGUpIGVzIGNyZWFyIHRhcmpldGFzIGZsYXNoLiBMYXMgdGFyamV0YXMgZsOtc2ljYXMgdGllbmVuIHVuYSBwcmVndW50YSB1IG90cm8gbWVuc2FqZSBlbiB1biBsYWRvIHkgbGEgcmVzcHVlc3RhIGVuIGVsIG90cm8sIHkgbXVjaGFzIGFwbGljYWNpb25lcyBkZSB0YXJqZXRhcyBmbGFzaCBlc3TDoW4gZGlzcG9uaWJsZXMgcGFyYSB0ZWzDqWZvbm9zLiBTaSBlc3TDoSBlc3R1ZGlhbmRvIGNvbW8gcGFydGUgZGUgdW4gZ3J1cG8sIGludGVyY2FtYmlhciB0YXJqZXRhcyBjb24gdW4gY29tcGHDsWVybyBsbyBheXVkYSBhIGRlc2N1YnJpciBpZGVhcyBpbXBvcnRhbnRlcyBxdWUgcHVlZGUgaGFiZXIgcGVyZGlkbyBvIG1hbGludGVycHJldGFkby4KCioqTGVlci1jdWJyaXItcmVjdXBlcmFyKiogZXMgdW5hIGFsdGVybmF0aXZhIHLDoXBpZGEgYSBsYXMgdGFyamV0YXMgZmxhc2guIE1pZW50cmFzIGxlZSBhbGdvLCBjdWJyYSBsb3MgdMOpcm1pbm9zIG8gc2VjY2lvbmVzIGNsYXZlIGNvbiBwZXF1ZcOxYXMgbm90YXMgYWRoZXNpdmFzLiBDdWFuZG8gaGF5YSB0ZXJtaW5hZG8sIHJlcMOhc2VsbyBwb3Igc2VndW5kYSB2ZXogeSB2ZWEgcXXDqSB0YW4gYmllbiBwdWVkZSBhZGl2aW5hciBxdcOpIGhheSBkZWJham8gZGUgY2FkYSB1bmEgZGUgZXNhcyBub3RhcyBhZGhlc2l2YXMuIEluZGVwZW5kaWVudGVtZW50ZSBkZWwgbcOpdG9kbyBxdWUgdXRpbGljZSwgbm8gc29sbyBwcmFjdGlxdWUgcmVjb3JkYXIgaGVjaG9zIHkgZGVmaW5pY2lvbmVzOiBhc2Vnw7pyZXNlIGRlIHZlcmlmaWNhciB0YW1iacOpbiBzdSBjb21wcmVuc2nDs24gZGUgbGFzIGdyYW5kZXMgaWRlYXMgeSBsYXMgY29uZXhpb25lcyBlbnRyZSBlbGxhcy4gRGlidWphciB1biBtYXBhIGNvbmNlcHR1YWwgeSBsdWVnbyBjb21wYXJhcmxvIGNvbiBzdXMgbm90YXMgbyBjb24gdW4gbWFwYSBjb25jZXB0dWFsIGRpYnVqYWRvIHByZXZpYW1lbnRlIGVzIHVuYSBmb3JtYSByw6FwaWRhIGRlIGhhY2VybG8uCgo+KipIaXBlcmNvcnJlY2Npw7NuKioKPgo+VW4gaGFsbGF6Z28gcG9kZXJvc28gZW4gbGEgaW52ZXN0aWdhY2nDs24gZGVsIGFwcmVuZGl6YWplIGVzIGVsIGVmZWN0byBkZSBoaXBlcmNvcnJlY2Npw7NuIFtNZXRjMjAxNl0uIEEgbGEgbWF5b3LDrWEgZGUgbGFzIHBlcnNvbmFzIG5vIGxlcyBndXN0YSBxdWUgbGVzIGRpZ2FuIHF1ZSBlc3TDoW4gZXF1aXZvY2FkYXMsIHBvciBsbyBxdWUgc2Vyw61hIHJhem9uYWJsZSBzdXBvbmVyIHF1ZSBjdWFudG8gbcOhcyBjb25maWFkYSBlc3TDqSBhbGd1aWVuIGVuIGxhIHJlc3B1ZXN0YSBxdWUgaGFuIGRhZG8gZW4gdW5hIHBydWViYSwgbcOhcyBkaWbDrWNpbCBzZXLDoSBjYW1iaWFyIGRlIG9waW5pw7NuIHNpIHJlYWxtZW50ZSBpbmNvcnJlY3RvLiBSZXN1bHRhIHF1ZSBsbyBjb250cmFyaW8gZXMgY2llcnRvOiBjdWFudG8gbcOhcyBzZWd1cm8gZXN0w6kgYWxndWllbiBkZSBxdWUgdGVuw61hIHJhesOzbiwgZXMgbcOhcyBwcm9iYWJsZSBxdWUgbm8gcmVwaXRhIGVsIGVycm9yIHNpIHNlIGNvcnJpZ2UuCgojIyBJbnRlcmNhbGFyClVuYSBmb3JtYSBlbiBxdWUgcHVlZGUgZXNwYWNpYXIgc3UgcHLDoWN0aWNhIGVzIGludGVyY2FsYXIgZWwgZXN0dWRpbyBkZSBkaWZlcmVudGVzIHRlbWFzOiBlbiBsdWdhciBkZSBkb21pbmFyIHVuIHRlbWEsIGx1ZWdvIHVuYSBzZWd1bmRhIHkgdGVyY2VyYSBzZXNpw7NuIGRlIGVzdHVkaW8gYWxlYXRvcmlvLiBBw7puIG1lam9yLCBjYW1iaWUgZWwgb3JkZW46IEEtQi1DLUItQS1DIGVzIG1lam9yIHF1ZSBBLUItQy1BLUItQywgcXVlIGEgc3UgdmV6IGVzIG1lam9yIHF1ZSBBLUEtQi1CLUMtQyBbUm9ocjIwMTVdLiBFc3RvIGZ1bmNpb25hIHBvcnF1ZSBlbCBpbnRlcmNhbGFkbyBmb21lbnRhIGxhIGNyZWFjacOzbiBkZSBtw6FzIHbDrW5jdWxvcyBlbnRyZSBkaWZlcmVudGVzIHRlbWFzLCBsbyBxdWUgYSBzdSB2ZXogbWVqb3JhIGVsIHJlY3VlcmRvLgoKRWwgdGllbXBvIHF1ZSBkZWJlIGRlZGljYXIgYSBjYWRhIGFydMOtY3VsbyBkZXBlbmRlIGRlbCB0ZW1hIHkgcXXDqSB0YW4gYmllbiBsbyBjb25vemNhLiBFbiBhbGfDum4gbHVnYXIgZW50cmUgMTAgeSAzMCBtaW51dG9zIGVzIGxvIHN1ZmljaWVudGVtZW50ZSBsYXJnbyBwYXJhIHF1ZSBwdWVkYSBlbnRyYXIgZW4gdW4gZXN0YWRvIGRlIGZsdWpvIChTZWNjacOzbiA1LjIpIHBlcm8gbm8gcGFyYSBxdWUgc3UgbWVudGUgZGl2YWd1ZS4gRWwgZXN0dWRpbyBkZSBlbnRyZWxhemFkbyBpbmljaWFsbWVudGUgc2Ugc2VudGlyw6EgbcOhcyBkaWbDrWNpbCBxdWUgY2VudHJhcnNlIGVuIHVuIHRlbWEgYSBsYSB2ZXosIHBlcm8gZXNvIGVzIHVuYSBzZcOxYWwgZGUgcXVlIGVzdMOhIGZ1bmNpb25hbmRvLiBTaSBlc3TDoSB1c2FuZG8gdGFyamV0YXMgZGUgbWVtb3JpYSBmbGFzaCBvIHBydWViYXMgZGUgcHLDoWN0aWNhIHBhcmEgbWVkaXIgc3UgcHJvZ3Jlc28sIGRlYmVyw61hIHZlciB1bmEgbWVqb3JhIGRlc3B1w6lzIGRlIHNvbG8gdW4gcGFyIGRlIGTDrWFzLgoKIyMgRWxhYm9yYWNpw7NuCgpFeHBsaWNhcnRlIGxhcyBjb3NhcyBhIG1lZGlkYSBxdWUgbGFzIHBhc2FzIHRlIGF5dWRhIGEgY29tcHJlbmRlcmxhcyB5IHJlY29yZGFybGFzLiBVbmEgZm9ybWEgZGUgaGFjZXJsbyBlcyBoYWNlciB1biBzZWd1aW1pZW50byBkZSBjYWRhIHJlc3B1ZXN0YSBlbiB1biBjdWVzdGlvbmFyaW8gZGUgcHLDoWN0aWNhIGNvbiB1bmEgZXhwbGljYWNpw7NuIGRlIHBvciBxdcOpIGVzYSByZXNwdWVzdGEgZXMgY29ycmVjdGEgbywgcG9yIGVsIGNvbnRyYXJpbywgY29uIHVuYSBleHBsaWNhY2nDs24gZGUgcG9yIHF1w6kgb3RyYSByZXNwdWVzdGEgcGxhdXNpYmxlIG5vIGxvIGVzLiBPdHJhIGVzIGRlY2lydGUgY8OzbW8gdW5hIG51ZXZhIGlkZWEgZXMgc2ltaWxhciBvIGRpZmVyZW50ZSBkZSBsYSBxdWUgaGFzIHZpc3RvIGFudGVyaW9ybWVudGUuCgpIYWJsYXIgY29udGlnbyBtaXNtbyBwdWVkZSBwYXJlY2VyIHVuYSBmb3JtYSBleHRyYcOxYSBkZSBlc3R1ZGlhciwgcGVybyBbQmllbDE5OTVdIGRlc2N1YnJpw7MgcXVlIGxhcyBwZXJzb25hcyBjYXBhY2l0YWRhcyBlbiBhdXRvZXhwbGljYWNpw7NuIHN1cGVyYXJvbiBhIGxhcyBxdWUgbm8gaGFiw61hbiBzaWRvIGNhcGFjaXRhZGFzLiBEZWwgbWlzbW8gbW9kbywgW0NoaTE5ODldIGRlc2N1YnJpw7MgcXVlIGFsZ3Vub3MgZXN0dWRpYW50ZXMgc2ltcGxlbWVudGUgc2UgZGV0aWVuZW4gY3VhbmRvIGFsY2FuemFuIHVuIHBhc28gcXVlIG5vIGVudGllbmRlbiBjdWFuZG8gaW50ZW50YW4gcmVzb2x2ZXIgcHJvYmxlbWFzLiBPdHJvcyBoYWNlbiB1bmEgcGF1c2EgeSBnZW5lcmFuIHVuYSBleHBsaWNhY2nDs24gZGUgbG8gcXVlIGVzdMOhIHN1Y2VkaWVuZG8sIHkgZWwgw7psdGltbyBncnVwbyBhcHJlbmRlIG3DoXMgcsOhcGlkby4gVW4gZWplcmNpY2lvIHBhcmEgZGVzYXJyb2xsYXIgZXN0YSBoYWJpbGlkYWQgZXMgcGFzYXIgcG9yIHVuIHByb2dyYW1hIGRlIGVqZW1wbG8gbMOtbmVhIHBvciBsw61uZWEgY29uIHVuYSBjbGFzZSwgaGFjaWVuZG8gcXVlIHVuYSBwZXJzb25hIGRpZmVyZW50ZSBleHBsaXF1ZSBjYWRhIGzDrW5lYSB5IGRpZ2EgcG9yIHF1w6kgZXN0w6EgYWxsw60geSBxdcOpIGxvZ3JhLgoKIyMgRWplbXBsb3MgY29uY3JldG9zCgpVbmEgZm9ybWEgcGFydGljdWxhcm1lbnRlIMO6dGlsIGRlIGVsYWJvcmFjacOzbiBlcyBlbCB1c28gZGUgZWplbXBsb3MgY29uY3JldG9zLiBTaWVtcHJlIHF1ZSB0ZW5nYSB1bmEgZGVjbGFyYWNpw7NuIGRlIHVuIHByaW5jaXBpbyBnZW5lcmFsLCBpbnRlbnRlIHByb3BvcmNpb25hciB1bm8gbyBtw6FzIGVqZW1wbG9zIGRlIHN1IHVzbyBvLCBwb3IgZWwgY29udHJhcmlvLCB0b21lIGNhZGEgcHJvYmxlbWEgZW4gcGFydGljdWxhciB5IGVudW1lcmUgbG9zIHByaW5jaXBpb3MgZ2VuZXJhbGVzIHF1ZSBlbmNhcm5hLiBbUmF3czIwMTRdIGRlc2N1YnJpw7MgcXVlIGxvcyBlamVtcGxvcyB5IGRlZmluaWNpb25lcyBlbnRyZWxhemFkb3MgbG8gaGFjZW4gbcOhcyBwcm9iYWJsZSBxdWUgbG9zIGFsdW1ub3MgcmVjb3JkYXLDrWFuIGVzdG8gw7psdGltbyBjb3JyZWN0YW1lbnRlLgoKVW5hIGZvcm1hIGVzdHJ1Y3R1cmFkYSBkZSBoYWNlciBlc3RvIGVzIGVsIG3DqXRvZG8gQURFUFQ6IGRhciB1bmEgYW5hbG9nw61hLCBkaWJ1amFyIHVuIGRpYWdyYW1hLCBwcmVzZW50YXIgdW4gZWplbXBsbywgZGVzY3JpYmlyIGxhIGlkZWEgZW4gbGVuZ3VhamUgc2VuY2lsbG8geSBsdWVnbyBkYXIgbG9zIGRldGFsbGVzIHTDqWNuaWNvcy4gTnVldmFtZW50ZSwgc2kgZXN0w6EgZXN0dWRpYW5kbyBjb24gdW4gY29tcGHDsWVybyBvIGVuIHVuIGdydXBvLCBwdWVkZSBpbnRlcmNhbWJpYXIgeSB2ZXJpZmljYXIgZWwgdHJhYmFqbzogdmVhIHNpIGVzdMOhIGRlIGFjdWVyZG8gZW4gcXVlIGxvcyBlamVtcGxvcyBkZSBvdHJhcyBwZXJzb25hcyByZWFsbWVudGUgaW5jb3Jwb3JhbiBlbCBwcmluY2lwaW8gcXVlIHNlIGVzdMOhIGRpc2N1dGllbmRvIG8gcXXDqSBwcmluY2lwaW9zIHNlIHVzYW4gZW4gdW4gZWplbXBsbyBxdWUgbm8gc2UgaGFuIGVudW1lcmFkby4KCk90cmEgdMOpY25pY2Egw7p0aWwgZXMgZW5zZcOxYXIgcG9yIGVsIGNvbnRyYXJpbywgZXMgZGVjaXIsIG1vc3RyYXIgYSBsb3MgYWx1bW5vcyBxdcOpIHNvbHVjacOzbiBubyBlcyBvIHF1w6kgdGlwbyBkZSBwcm9ibGVtYSBubyByZXNvbHZlcsOhIHVuYSB0w6ljbmljYS4gUG9yIGVqZW1wbG8sIGN1YW5kbyBzZSBsZXMgbXVlc3RyYSBhIGxvcyBuacOxb3MgY8OzbW8gc2ltcGxpZmljYXIgZnJhY2Npb25lcywgZXMgaW1wb3J0YW50ZSBkYXJsZXMgdW5vcyA1LzcgcXVlIG5vIHNlIHB1ZWRlbiBzaW1wbGlmaWNhciBwYXJhIHF1ZSBubyBzZSBzaWVudGFuIGZydXN0cmFkb3MgYnVzY2FuZG8gcmVzcHVlc3RhcyBxdWUgbm8gZXhpc3Rlbi4KCgojIyBDb2RpZmljYWNpw7NuIGR1YWwKCkxhIMO6bHRpbWEgZGUgbGFzIHNlaXMgZXN0cmF0ZWdpYXMgcHJpbmNpcGFsZXMgcXVlIGRlc2NyaWJlbiBsb3MgY2llbnTDrWZpY29zIGRlbCBhcHJlbmRpemFqZSBlcyBwcmVzZW50YXIgcGFsYWJyYXMgZSBpbcOhZ2VuZXMganVudGFzLiBDb21vIHNlIGRpc2N1dGnDsyBlbiBsYSBTZWNjacOzbiA0LjEsIGRpZmVyZW50ZXMgc3Vic2lzdGVtYXMgZW4gbnVlc3Ryb3MgY2VyZWJyb3MgbWFuZWphbiB5IGFsbWFjZW5hbiBpbmZvcm1hY2nDs24gbGluZ8O8w61zdGljYSB5IHZpc3VhbCwgcG9yIGxvIHF1ZSBzaSBzZSBwcmVzZW50YSBpbmZvcm1hY2nDs24gY29tcGxlbWVudGFyaWEgYSB0cmF2w6lzIGRlIGFtYm9zIGNhbmFsZXMsIHB1ZWRlbiByZWZvcnphcnNlIG11dHVhbWVudGUuIFNpbiBlbWJhcmdvLCBlbCBhcHJlbmRpemFqZSBlcyBtZW5vcyBlZmVjdGl2byBjdWFuZG8gbGEgbWlzbWEgaW5mb3JtYWNpw7NuIHNlIHByZXNlbnRhIHNpbXVsdMOhbmVhbWVudGUgZW4gZG9zIGNhbmFsZXMgZGlmZXJlbnRlcywgcG9ycXVlIGVudG9uY2VzIGVsIGNlcmVicm8gdGllbmUgcXVlIGhhY2VyIHVuIGVzZnVlcnpvIHBhcmEgdmVyaWZpY2FyIGxvcyBjYW5hbGVzIGVudHJlIHPDrSBbTWF5ZTIwMDNdLgoKVW5hIGZvcm1hIGRlIGFwcm92ZWNoYXIgbGEgY29kaWZpY2FjacOzbiBkdWFsIGVzIGRpYnVqYXIgbyBldGlxdWV0YXIgbMOtbmVhcyBkZSB0aWVtcG8sIG1hcGFzLCDDoXJib2xlcyBnZW5lYWzDs2dpY29zIG8gY3VhbHF1aWVyIG90cmEgY29zYSBxdWUgcGFyZXpjYSBhcHJvcGlhZGEgcGFyYSBlbCBtYXRlcmlhbC4gKFBlcnNvbmFsbWVudGUgbWUgZ3VzdGFuIGxhcyBpbcOhZ2VuZXMgcXVlIG11ZXN0cmFuIHF1w6kgZnVuY2lvbmVzIGxsYW1hbiBhIHF1w6kgb3Ryb3MgZW4gdW4gcHJvZ3JhbWEpLiBEaWJ1amFyIHVuIGRpYWdyYW1hIHNpbiBldGlxdWV0YXMgeSBsdWVnbyB2b2x2ZXIgYSBldGlxdWV0YXJsbyBlcyB1bmEgZXhjZWxlbnRlIHByw6FjdGljYSBkZSByZWN1cGVyYWNpw7NuLgoKCiMjIEdlc3Rpw7NuIGRlbCB0aWVtcG8KClNvbMOtYSBhbGFyZGVhciBkZSBsYXMgaG9yYXMgcXVlIGVzdGFiYSB0cmFiYWphbmRvLiBObyBlbiBtdWNoYXMgcGFsYWJyYXMsIHBvciBzdXB1ZXN0bywgdGVuw61hIGFsZ3VuYXMgaGFiaWxpZGFkZXMgc29jaWFsZXMsIHBlcm8gbWUgcHJlc2VudGFiYSBhIGNsYXNlIGFscmVkZWRvciBkZWwgbWVkaW9kw61hLCBzaW4gYWZlaXRhciB5IGJvc3RlemFuZG8sIHkgbWVuY2lvbmFiYSBjYXN1YWxtZW50ZSBhIHF1aWVuIGVzY3VjaGFyYSBxdWUgaGFiw61hIGVzdGFkbyB0cmFiYWphbmRvIGhhc3RhIGxhcyA2OjAwIGEubS4KCk1pcmFuZG8gaGFjaWEgYXRyw6FzLCBubyBwdWVkbyByZWNvcmRhciBhIHF1acOpbiBlc3RhYmEgdHJhdGFuZG8gZGUgaW1wcmVzaW9uYXIuIExvIHF1ZSByZWN1ZXJkbyBlbiBjYW1iaW8gZXMgY3XDoW50byB0cmFiYWpvIGhpY2UgZW4gZXNhcyBub2NoZXMgZGUgZGVzY2Fuc28gcXVlIHRpcsOpIHVuYSB2ZXogcXVlIGRvcm3DrSB1biBwb2NvLCB5IGN1w6FudG8gZGHDsW8gY2F1c2Fyb24gYSBtaXMgbm90YXMgbGFzIGNvc2FzIHF1ZSBubyB0aXLDqS4KCk1pIGVycm9yIGZ1ZSBjb25mdW5kaXIgInRyYWJhamFyIiBjb24gInNlciBwcm9kdWN0aXZvIi4gTm8gcHVlZGUgcHJvZHVjaXIgc29mdHdhcmUgKG8gY3VhbHF1aWVyIG90cmEgY29zYSkgc2luIGhhY2VyIGFsZ28gZGUgdHJhYmFqbywgcGVybyBwdWVkZSBoYWNlciBtdWNobyB0cmFiYWpvIGbDoWNpbG1lbnRlIHNpbiBwcm9kdWNpciBuYWRhIGRlIHZhbG9yLiBDb252ZW5jZXIgYSBsYXMgcGVyc29uYXMgZGUgZXN0byBwdWVkZSBzZXIgZGlmw61jaWwsIGVzcGVjaWFsbWVudGUgY3VhbmRvIGVzdMOhbiBlbiBsYSBhZG9sZXNjZW5jaWEgbyBlbiBsYSB2ZWludGVuYSwgcGVybyBwYWdhIGVub3JtZXMgZGl2aWRlbmRvcy4KCkVsIGVzdHVkaW8gY2llbnTDrWZpY28gZGVsIGV4Y2VzbyBkZSB0cmFiYWpvIHkgbGEgcHJpdmFjacOzbiBkZWwgc3Vlw7FvIHNlIHJlbW9udGEgYWwgbWVub3MgYSBsYSBkw6ljYWRhIGRlIDE4OTA7IGNvbnN1bHRlIFtSb2JpMjAwNV0gcGFyYSBvYnRlbmVyIHVuIHJlc3VtZW4gYnJldmUgeSBsZWdpYmxlLiBMb3MgcmVzdWx0YWRvcyBtw6FzIGltcG9ydGFudGVzIHBhcmEgbG9zIGFsdW1ub3Mgc29uOgoKMS4gVHJhYmFqYXIgbcOhcyBkZSA4IGhvcmFzIGFsIGTDrWEgZHVyYW50ZSB1biBwZXLDrW9kbyBwcm9sb25nYWRvIHJlZHVjZSBzdSBwcm9kdWN0aXZpZGFkIHRvdGFsLCBubyBzb2xvIHN1IHByb2R1Y3RpdmlkYWQgcG9yIGhvcmEsIGVzIGRlY2lyLiBFbiB0b3RhbCwgcmVhbGl6YSBtZW5vcyB0YXJlYXMgKG5vIHNvbG8gcG9yIGhvcmEpIGN1YW5kbyBlc3TDoSBlbiBtb2RvIGNydWppZW50ZS4KCjIuIFRyYWJhamFyIG3DoXMgZGUgMjEgaG9yYXMgc2VndWlkYXMgYXVtZW50YSBsYXMgcG9zaWJpbGlkYWRlcyBkZSBxdWUgY29tZXRhIHVuIGVycm9yIGNhdGFzdHLDs2ZpY28gdGFudG8gY29tbyBlc3RhciBsZWdhbG1lbnRlIGJvcnJhY2hvLgoKMy4gTGEgcHJvZHVjdGl2aWRhZCB2YXLDrWEgYSBsbyBsYXJnbyBkZSBsYSBqb3JuYWRhIGxhYm9yYWwsIHkgbGEgbWF5b3IgcHJvZHVjdGl2aWRhZCBzZSBwcm9kdWNlIGVuIGxhcyBwcmltZXJhcyA0IGEgNiBob3Jhcy4gRGVzcHXDqXMgZGUgc3VmaWNpZW50ZXMgaG9yYXMsIGxhIHByb2R1Y3RpdmlkYWQgc2UgYWNlcmNhIGEgY2VybzsgZXZlbnR1YWxtZW50ZSBzZSB2dWVsdmUgbmVnYXRpdm8uCgpFc3RvcyBoZWNob3MgaGFuIHNpZG8gcmVwcm9kdWNpZG9zIHkgdmVyaWZpY2Fkb3MgZHVyYW50ZSBtw6FzIGRlIHVuIHNpZ2xvLCB5IGxvcyBkYXRvcyBkZXRyw6FzIGRlIGVsbG9zIHNvbiB0YW4gc8OzbGlkb3MgY29tbyBsb3MgZGF0b3MgcXVlIHZpbmN1bGFuIGVsIHRhYmFxdWlzbW8gY29uIGVsIGPDoW5jZXIgZGUgcHVsbcOzbi4gRWwgcHJvYmxlbWEgZXMgcXVlIGxhcyBwZXJzb25hcyBnZW5lcmFsbWVudGUgbm8gbm90YW4gcXVlIHN1cyBoYWJpbGlkYWRlcyBkaXNtaW51eWVuLiBBbCBpZ3VhbCBxdWUgbG9zIGJvcnJhY2hvcyBxdWUgcGllbnNhbiBxdWUgdG9kYXbDrWEgcHVlZGVuIGNvbmR1Y2lyLCBsYXMgcGVyc29uYXMgcHJpdmFkYXMgZGUgc3Vlw7FvIG5vIHNlIGRhbiBjdWVudGEgZGUgcXVlIG5vIGVzdMOhbiB0ZXJtaW5hbmRvIHN1cyBvcmFjaW9uZXMgKG8gcGVuc2FtaWVudG9zKS4gU2UgaGEgZGVtb3N0cmFkbyBxdWUgY2luY28gZMOtYXMgZGUgOCBob3JhcyBwb3Igc2VtYW5hIG1heGltaXphbiBsYSBwcm9kdWNjacOzbiB0b3RhbCBhIGxhcmdvIHBsYXpvIGVuIHRvZGFzIGxhcyBpbmR1c3RyaWFzIHF1ZSBzZSBoYXlhbiBlc3R1ZGlhZG87IGVzdHVkaWFyIG8gcHJvZ3JhbWFyIG5vIHNvbiBkaWZlcmVudGVzLgoKUGVybywgwr9xdcOpIHBhc2EgY29uIGxhcyByw6FmYWdhcyBjb3J0YXMgZGUgdmV6IGVuIGN1YW5kbywgY29tbyB0aXJhciB1bmEgbm9jaGUgZW50ZXJhIHBhcmEgY3VtcGxpciBjb24gdW5hIGZlY2hhIGzDrW1pdGU/IEVzbyB0YW1iacOpbiBzZSBoYSBlc3R1ZGlhZG8geSBsb3MgcmVzdWx0YWRvcyBubyBzb24gYWdyYWRhYmxlcy4gVHUgY2FwYWNpZGFkIGRlIHBlbnNhciBjYWUgdW4gMjUlIHBvciBjYWRhIDI0IGhvcmFzIHF1ZSBlc3TDqXMgZGVzcGllcnRvLiBEaWNobyBkZSBvdHJhIG1hbmVyYSwgZWwgY29lZmljaWVudGUgaW50ZWxlY3R1YWwgZGUgdW5hIHBlcnNvbmEgcHJvbWVkaW8gZXMgZGUgc29sbyA3NSBkZXNwdcOpcyBkZSB1bmEgbm9jaGUgZW50ZXJhLCBsbyBxdWUgbG8gdWJpY2EgZW4gZWwgNSUgaW5mZXJpb3IgZGUgbGEgcG9ibGFjacOzbi4gU2kgaGFjZXMgZG9zIG5vY2hlcyBzZWd1aWRhcywgdHUgY29lZmljaWVudGUgaW50ZWxlY3R1YWwgZWZlY3Rpdm8gZXMgNTAsIHF1ZSBlcyBlbCBuaXZlbCBlbiBlbCBxdWUgbGFzIHBlcnNvbmFzIGdlbmVyYWxtZW50ZSBzZSBjb25zaWRlcmFuIGluY2FwYWNlcyBkZSB2aXZpciBkZSBmb3JtYSBpbmRlcGVuZGllbnRlLgoKIsKhUGVybywgcGVybyB0ZW5nbyBtdWNoYXMgdGFyZWFzIHF1ZSBoYWNlciEiIHR1IGRpY2VzLiAiwqFZIHRvZG9zIHZlbmNlbiBhIGxhIHZleiEgwqFUZW5nbyBxdWUgdHJhYmFqYXIgaG9yYXMgZXh0cmEgcGFyYSBoYWNlcmxvcyB0b2RvcyEgTm86IGxhcyBwZXJzb25hcyBkZWJlbiBwcmlvcml6YXIgeSBlbmZvY2Fyc2UgcGFyYSBzZXIgcHJvZHVjdGl2b3MsIHkgcGFyYSBoYWNlcmxvLCBzZSBsZXMgZGViZSBlbnNlw7FhciBjw7Ntby4gVW5hIHTDqWNuaWNhIG11eSB1dGlsaXphZGEgZXMgaGFjZXIgdW5hIGxpc3RhIGRlIGxhcyBjb3NhcyBxdWUgZGViZW4gaGFjZXJzZSwgb3JkZW5hcmxhcyBwb3IgcHJpb3JpZGFkIHkgbHVlZ28gYXBhZ2FyIGVsIGNvcnJlbyBlbGVjdHLDs25pY28geSBvdHJhcyBpbnRlcnJ1cGNpb25lcyBkdXJhbnRlIDMwIGEgNjAgbWludXRvcyB5IGNvbXBsZXRhciB1bmEgZGUgZXNhcyB0YXJlYXMuIFNpIGN1YWxxdWllciB0YXJlYSBlbiB1bmEgbGlzdGEgZGUgdGFyZWFzIHBlbmRpZW50ZXMgZHVyYSBtw6FzIGRlIHVuYSBob3JhLCBkaXbDrWRhbGEgZW4gcGFydGVzIG3DoXMgcGVxdWXDsWFzIHkgcHJpb3LDrWNlbGFzIHBvciBzZXBhcmFkby4KCkxhIHBhcnRlIG3DoXMgaW1wb3J0YW50ZSBkZSBlc3RvIGVzIGFwYWdhciBsYXMgaW50ZXJydXBjaW9uZXMuIEEgcGVzYXIgZGUgbG8gcXVlIG11Y2hhcyBwZXJzb25hcyBxdWllcmVuIGNyZWVyLCBsb3Mgc2VyZXMgaHVtYW5vcyBubyBzb24gYnVlbm9zIGVuIGxhIG11bHRpdGFyZWEuIEVuIGxvIHF1ZSBwb2RlbW9zIGxsZWdhciBhIHNlciBidWVub3MgZXMgZW4gbGEgKiphdXRvbWF0aWNpZGFkKiosIHF1ZSBlcyBsYSBjYXBhY2lkYWQgZGUgaGFjZXIgYWxnbyBydXRpbmFyaW8gZW4gc2VndW5kbyBwbGFubyBtaWVudHJhcyBoYWNlbW9zIG90cmEgY29zYSBbTWlsbDIwMTZhXS4gTGEgbWF5b3LDrWEgZGUgbm9zb3Ryb3MgcG9kZW1vcyBoYWJsYXIgbWllbnRyYXMgcGljYW1vcyBjZWJvbGxhcywgbyB0b21hciBjYWbDqSBtaWVudHJhcyBsZWVtb3M7IGNvbiBsYSBwcsOhY3RpY2EsIHRhbWJpw6luIHBvZGVtb3MgdG9tYXIgbm90YXMgbWllbnRyYXMgZXNjdWNoYW1vcywgcGVybyBubyBwb2RlbW9zIGVzdHVkaWFyIGRlIG1hbmVyYSBlZmVjdGl2YSwgcHJvZ3JhbWFyIG8gcmVhbGl6YXIgb3RyYXMgdGFyZWFzIG1lbnRhbG1lbnRlIGRlc2FmaWFudGVzIG1pZW50cmFzIHByZXN0YW1vcyBhdGVuY2nDs24gYSBvdHJhIGNvc2EsIHNvbG8gY3JlZW1vcyBxdWUgcG9kZW1vcyBoYWNlcmxvLgoKRWwgb2JqZXRpdm8gZGUgb3JnYW5pemFyc2UgeSBwcmVwYXJhcnNlIGVzIGVudHJhciBlbiBlbCBlc3RhZG8gbWVudGFsIG3DoXMgcHJvZHVjdGl2byBwb3NpYmxlLiBMb3MgcHNpY8OzbG9nb3MgbG8gbGxhbWFuIGZsdWpvIFtDc2lrMjAwOF07IGxvcyBhdGxldGFzIGxvIGxsYW1hbiAiZXN0YXIgZW4gbGEgem9uYSIsIHkgbG9zIG3DunNpY29zIGhhYmxhbiBkZSBwZXJkZXJzZSBlbiBsbyBxdWUgdG9jYW4uIEN1YWxxdWllcmEgc2VhIGVsIG5vbWJyZSBxdWUgdXNlLCBsYXMgcGVyc29uYXMgcHJvZHVjZW4gbXVjaG8gbcOhcyBwb3IgdW5pZGFkIGRlIHRpZW1wbyBlbiBlc3RlIGVzdGFkbyBkZSBsbyBub3JtYWwuIExhIG1hbGEgbm90aWNpYSBlcyBxdWUgdG9tYSBhcHJveGltYWRhbWVudGUgMTAgbWludXRvcyB2b2x2ZXIgYSB1biBlc3RhZG8gZGUgZmx1am8gZGVzcHXDqXMgZGUgdW5hIGludGVycnVwY2nDs24sIHNpbiBpbXBvcnRhciBjdcOhbiBjb3J0YSBzZWEgbGEgaW50ZXJydXBjacOzbi4gRXN0byBzaWduaWZpY2EgcXVlIHNpIHNlIGxlIGludGVycnVtcGUgbWVkaWEgZG9jZW5hIGRlIHZlY2VzIHBvciBob3JhLCBudW5jYSBzZSBlbmN1ZW50cmEgZW4gc3UgcGljbyBwcm9kdWN0aXZvLgoKPioqwr9Dw7NtbyBsbyBzdXBvPyoqCj4KPkVuIHN1IGN1ZW50byBkZSAxOTYxICJIYXJyaXNvbiBCZXJnZXJvbiIsIEt1cnQgVm9ubmVndXQgZGVzY3JpYmnDsyB1biBmdXR1cm8gZW4gZWwgcXVlIHRvZG9zIHNlIHZlbiBvYmxpZ2Fkb3MgYSBzZXIgaWd1YWxlcy4gTGFzIHBlcnNvbmFzIGF0cmFjdGl2YXMgdGllbmVuIHF1ZSB1c2FyIG3DoXNjYXJhcywgbGFzIHBlcnNvbmFzIGF0bMOpdGljYXMgdGllbmVuIHF1ZSB1c2FyIHBlc2FzIHkgbGFzIHBlcnNvbmFzIGludGVsaWdlbnRlcyBzZSB2ZW4gb2JsaWdhZGFzIGEgbGxldmFyIHJhZGlvcyBxdWUgaW50ZXJydW1wZW4gc3VzIHBlbnNhbWllbnRvcyBhIGludGVydmFsb3MgYWxlYXRvcmlvcy4gQSB2ZWNlcyBtZSBwcmVndW50byBzaSwgb2gsIGVzcGVyYSwgbWkgdGVsw6lmb25vIHNvbG8sIGxvIHNpZW50bywgwr9kZSBxdcOpIGVzdMOhYmFtb3MgaGFibGFuZG8/CgoKIyMgRXZhbHVhY2nDs24gcG9yIHBhcmVzCgpQZWRpcmxlIGEgbGEgZ2VudGUgZGUgdW4gZXF1aXBvIHF1ZSBjYWxpZmlxdWUgYSBzdXMgcGFyZXMgZXMgdW5hIHByw6FjdGljYSBjb23Dum4gZW4gbGEgaW5kdXN0cmlhLiBbU29uZDIwMTJdIGVuY3Vlc3TDsyBsYSBsaXRlcmF0dXJhIHNvYnJlIGV2YWx1YWNpw7NuIGRlIHBhcmVzLCBkaXN0aW5ndWllbmRvIGVudHJlIGNhbGlmaWNhY2nDs24geSByZXZpc2nDs24uIERlc2N1YnJpZXJvbiBxdWUgbGEgZXZhbHVhY2nDs24gcG9yIHBhcmVzIGF1bWVudMOzIGxhIGNhbnRpZGFkLCBsYSBkaXZlcnNpZGFkIHkgbGEgcHVudHVhbGlkYWQgZGUgbGEgcmV0cm9hbGltZW50YWNpw7NuLCBheXVkw7MgYSBsb3MgZXN0dWRpYW50ZXMgYSBlamVyY2l0YXIgZWwgcGVuc2FtaWVudG8gZGUgYWx0byBuaXZlbCwgYWxlbnTDsyBsYSBwcsOhY3RpY2EgcmVmbGV4aXZhIHkgYXBvecOzIGVsIGRlc2Fycm9sbG8gZGUgaGFiaWxpZGFkZXMgc29jaWFsZXMuIExhcyBwcmVvY3VwYWNpb25lcyBlcmFuIHByZWRlY2libGVzOiB2YWxpZGV6IHkgZmlhYmlsaWRhZCwgbW90aXZhY2nDs24geSBwcm9jcmFzdGluYWNpw7NuLCB0cm9sbHMsIGNvbHVzacOzbiB5IHBsYWdpby4KClNpbiBlbWJhcmdvLCBsYSBldmlkZW5jaWEgbXVlc3RyYSBxdWUgZXN0YXMgcHJlb2N1cGFjaW9uZXMgbm8gc29uIHNpZ25pZmljYXRpdmFzIGVuIGxhIG1heW9yw61hIGRlIGxhcyBjbGFzZXMuIFBvciBlamVtcGxvLCBbS2F1ZjIwMDBdIGNvbXBhcsOzIGxhcyBjYWxpZmljYWNpb25lcyB5IGNhbGlmaWNhY2lvbmVzIGNvbmZpZGVuY2lhbGVzIGRlIHN1cyBwYXJlcyBlbiB2YXJpb3MgZWplcyBwYXJhIGRvcyBjdXJzb3MgZGUgaW5nZW5pZXLDrWEgZGUgcHJlZ3JhZG8geSBkZXNjdWJyacOzIHF1ZSBsYSBhdXRvZXZhbHVhY2nDs24geSBsYXMgY2FsaWZpY2FjaW9uZXMgZGUgbG9zIHBhcmVzIGVzdGFiYW4gZXN0YWTDrXN0aWNhbWVudGUgZGUgYWN1ZXJkbywgcXVlIGxhIGNvbHVzacOzbiBubyBlcmEgc2lnbmlmaWNhdGl2YSAoZXMgZGVjaXIsIGxhcyBwZXJzb25hcyBubyBzb2xvIGRhYmFuIHVuIGFsdG8gcHVudGFqZSBhIHRvZG9zIHN1cyBwYXJlcykgZ3JhZG9zKSwgcXVlIGxvcyBhbHVtbm9zIG5vIGluZmxhbiBzdXMgYXV0b2V2YWx1YWNpb25lcyB5LCBsbyBxdWUgZXMgbcOhcyBpbXBvcnRhbnRlLCBxdWUgbGFzIGNhbGlmaWNhY2lvbmVzIG5vIGVzdMOhbiBzZXNnYWRhcyBwb3IgZ8OpbmVybyBvIHJhemEuCgpVbmEgZm9ybWEgZGUgaW1wbGVtZW50YXIgbGEgZXZhbHVhY2nDs24gcG9yIHBhcmVzIGVzICoqY29udHJpYnVpciBjb24gbGEgcGVkYWdvZ8OtYSBkZWwgYWx1bW5vKiosIGVuIGxhIGN1YWwgbG9zIGFsdW1ub3MgcHJvZHVjZW4gYXJ0ZWZhY3RvcyBwYXJhIGNvbnRyaWJ1aXIgYWwgYXByZW5kaXphamUgZGUgbG9zIGRlbcOhcy4gRXN0byBwdWVkZSBzZXIgZGVzYXJyb2xsYXIgdW5hIGJyZXZlIGxlY2Npw7NuIHkgY29tcGFydGlybGEgY29uIGxhIGNsYXNlLCBhZ3JlZ2FybGEgYSB1biBiYW5jbyBkZSBwcmVndW50YXMgbyBlc2NyaWJpciBub3RhcyBkZSB1bmEgY2xhc2UgcGFydGljdWxhciBwYXJhIHN1IHB1YmxpY2FjacOzbiBlbiBjbGFzZS4gUG9yIGVqZW1wbG8sIFtGcmFuMjAxOF0gZGVzY3VicmnDsyBxdWUgbG9zIGVzdHVkaWFudGVzIHF1ZSBoaWNpZXJvbiB2aWRlb3MgY29ydG9zIHBhcmEgZW5zZcOxYXIgY29uY2VwdG9zIGEgc3VzIGNvbXBhw7Flcm9zIHR1dmllcm9uIHVuIGF1bWVudG8gc2lnbmlmaWNhdGl2byBlbiBzdSBwcm9waW8gYXByZW5kaXphamUgZW4gY29tcGFyYWNpw7NuIGNvbiBhcXVlbGxvcyBxdWUgc29sbyBlc3R1ZGlhcm9uIGVsIG1hdGVyaWFsIG8gdmllcm9uIGxvcyB2aWRlb3MuIERlc2N1YnLDrSBxdWUgcGVkaXJsZXMgYSBsb3MgYWx1bW5vcyBxdWUgY29tcGFydGFuIHVuIGVycm9yIHkgc3Ugc29sdWNpw7NuIGNvbiBsYSBjbGFzZSB0b2RvcyBsb3MgZMOtYXMgYXl1ZGEgYSBzdXMgaGFiaWxpZGFkZXMgYW5hbMOtdGljYXMgeSByZWR1Y2UgZWwgc8OtbmRyb21lIGRlbCBpbXBvc3Rvci4KCk90cm8gZW5mb3F1ZSBlcyBsYSAqKnJldmlzacOzbiBwb3IgcGFyZXMgY2FsaWJyYWRhKiosIGVuIGxhIGN1YWwgdW4gYWx1bW5vIHJldmlzYSB1bm8gbyBtw6FzIGVqZW1wbG9zIHVzYW5kbyB1bmEgcsO6YnJpY2EgeSBjb21wYXJhIHN1IGV2YWx1YWNpw7NuIGNvbiBsYSByZXZpc2nDs24gZGVsIG1hZXN0cm8gZGVsIG1pc21vIHRyYWJham8gW0t1bGsyMDEzXS4gVW5hIHZleiBxdWUgbGFzIGV2YWx1YWNpb25lcyBkZSBsb3MgYWx1bW5vcyBlc3TDoW4gbG8gc3VmaWNpZW50ZW1lbnRlIGNlcmNhIGRlIGxhcyBkZWwgbWFlc3RybywgY29taWVuemFuIGEgZXZhbHVhciBlbCB0cmFiYWpvIHJlYWwgZGUgc3VzIGNvbXBhw7Flcm9zLiBTaSBzZSBjb21iaW5hbiBsYXMgZXZhbHVhY2lvbmVzIGRlIHZhcmlvcyBwYXJlcywgZXN0byBwdWVkZSBzZXIgdGFuIHByZWNpc28gY29tbyBsYSBldmFsdWFjacOzbiBkZSBsb3MgbWFlc3Ryb3MgW1BhcmUyMDA4XS4KCkNvbW8gdG9kbyBsbyBkZW3DoXMsIGxhIGV2YWx1YWNpw7NuIGVzIGF5dWRhZGEgcG9yIHLDumJyaWNhcy4gRWwgZm9ybXVsYXJpbyBkZSBldmFsdWFjacOzbiBlbiBsYSBTZWNjacOzbiAyMS4yIG11ZXN0cmEgdW5hIG11ZXN0cmEgcGFyYSBjb21lbnphci4gUGFyYSB1c2FybG8sIGNsYXNpZsOtY2F0ZSBhIHRpIG1pc21vIHkgYSBjYWRhIHVubyBkZSB0dXMgY29tcGHDsWVyb3MgZGUgZXF1aXBvLCBsdWVnbyBjYWxjdWxhIHkgY29tcGFyYSBsb3MgcHVudGFqZXMuIExhcyBncmFuZGVzIGRpc3BhcmlkYWRlcyBnZW5lcmFsbWVudGUgaW5kaWNhbiBsYSBuZWNlc2lkYWQgZGUgdW5hIGNvbnZlcnNhY2nDs24gbcOhcyBsYXJnYS4KCgojIyBFamVyY2ljaW9zCgojIyMgRXN0cmF0ZWdpYXMgZGUgYXByZW5kaXphamUgKGluZGl2aWR1YWwgLyAyMCkKCjEuIMK/Q3XDoWwgZGUgbGFzIHNlaXMgZXN0cmF0ZWdpYXMgZGUgYXByZW5kaXphamUgdXNhIHJlZ3VsYXJtZW50ZT8gwr9DdcOhbGVzIG5vPwoKMi4gRXNjcmliYSB0cmVzIGNvbmNlcHRvcyBnZW5lcmFsZXMgcXVlIGRlc2VhIHF1ZSBzdXMgYWx1bW5vcyBkb21pbmVuIHkgZMOpIGRvcyBlamVtcGxvcyBlc3BlY8OtZmljb3MgZGUgY2FkYSB1bm8gKHByw6FjdGljYSBkZSBlamVtcGxvcyBjb25jcmV0b3MpLiBQYXJhIGNhZGEgdW5vIGRlIGVzb3MgY29uY2VwdG9zLCB0cmFiYWplIGhhY2lhIGF0csOhcyBkZXNkZSB1bm8gZGUgc3VzIGVqZW1wbG9zIHBhcmEgZXhwbGljYXIgY8OzbW8gbG8gZXhwbGljYSBlbCBjb25jZXB0byAoZWxhYm9yYWNpw7NuKS4KCiMjIyBJZGVhcyBkZSBjb25leGnDs24gKHBhcmVzIC8gNSkKRXN0ZSBlamVyY2ljaW8gZXMgdW4gZWplbXBsbyBkZWwgdXNvIGRlIGxhIGVsYWJvcmFjacOzbiBwYXJhIG1lam9yYXIgbGEgcmV0ZW5jacOzbi4gRWxpamEgdW4gY29tcGHDsWVybywgaGFnYSBxdWUgY2FkYSBwZXJzb25hIGVsaWphIGluZGVwZW5kaWVudGVtZW50ZSB1bmEgaWRlYSwgbHVlZ28gYW51bmNpZSBzdXMgaWRlYXMgZSBpbnRlbnRlIGVuY29udHJhciB1bmEgY2FkZW5hIGRlIGN1YXRybyBlc2xhYm9uZXMgcXVlIGNvbmR1emNhIGRlIHVuYSBhIGxhIG90cmEuIFBvciBlamVtcGxvLCBzaSBsYXMgZG9zIGlkZWFzIHNvbiAiU2Fza2F0Y2hld2FuIiB5ICJlc3RhZMOtc3RpY2FzIiwgbG9zIGVubGFjZXMgcG9kcsOtYW4gc2VyOgoKKiBTYXNrYXRjaGV3YW4gZXMgdW5hIHByb3ZpbmNpYSBkZSBDYW5hZMOhOwoKKiBDYW5hZMOhIGVzIHVuIHBhw61zOwoKKiBsb3MgcGHDrXNlcyB0aWVuZW4gZ29iaWVybm9zOwoKKiBMb3MgZ29iaWVybm9zIHV0aWxpemFuIGVzdGFkw61zdGljYXMgcGFyYSBhbmFsaXphciBsYSBvcGluacOzbiBww7pibGljYS4KCiMjIyBFdm9sdWNpw7NuIGNvbnZlcmdlbnRlIChwYXJlcyAvIDE1KQoKVW5hIHByw6FjdGljYSBxdWUgbm8gc2UgY3VicmnDsyBhbnRlcmlvcm1lbnRlIHNvbiBsYXMgKipub3RhcyBndWlhZGFzKiosIHF1ZSBzb24gbm90YXMgcHJlcGFyYWRhcyBwb3IgZWwgbWFlc3RybyBxdWUgaW5kaWNhbiBhIGxvcyBhbHVtbm9zIHF1ZSByZXNwb25kYW4gYSBsYSBpbmZvcm1hY2nDs24gY2xhdmUgZW4gdW5hIGNvbmZlcmVuY2lhIG8gZGlzY3VzacOzbi4gTGFzIHNlw7FhbGVzIHB1ZWRlbiBzZXIgZXNwYWNpb3MgZW4gYmxhbmNvIGRvbmRlIGxvcyBhbHVtbm9zIGFncmVnYW4gaW5mb3JtYWNpw7NuLCBhc3RlcmlzY29zIGp1bnRvIGEgbG9zIHTDqXJtaW5vcyBxdWUgbG9zIGFsdW1ub3MgZGViZW4gZGVmaW5pciwgeSBhc8OtIHN1Y2VzaXZhbWVudGUuCgpDcmVlIGRlIGRvcyBhIGN1YXRybyB0YXJqZXRhcyBkZSBub3RhcyBndWlhZGFzIHBhcmEgdW5hIGxlY2Npw7NuIHF1ZSBoYXlhIGVuc2XDsWFkbyByZWNpZW50ZW1lbnRlIG8gcXVlIHZheWEgYSBlbnNlw7Fhci4gSW50ZXJjYW1iaWUgdGFyamV0YXMgY29uIHN1IHBhcmVqYTogwr9xdcOpIHRhbiBmw6FjaWwgZXMgZW50ZW5kZXIgbG8gcXVlIHNlIHNvbGljaXRhPyDCv0N1w6FudG8gdGllbXBvIHRvbWFyw61hIGNvbXBsZXRhciBsb3MgbWVuc2FqZXM/IMK/UXXDqSB0YW4gYmllbiBmdW5jaW9uYSBlc3RvIHBhcmEgZWplbXBsb3MgZGUgcHJvZ3JhbWFjacOzbj8KCiMjIyBNZW50ZXMgY2FtYmlhbnRlcyAocGFyZXMgLyAxMCkKCltLaXJzMjAxM10gYXJndW1lbnRhIHF1ZSBsb3MgbWl0b3Mgc29icmUgbG9zIG5hdGl2b3MgZGlnaXRhbGVzLCBsb3MgZXN0aWxvcyBkZSBhcHJlbmRpemFqZSB5IGxvcyBhdXRvZGlkYWN0YXMgc29uIHJlZmxlam9zIGRlIGxhIGNyZWVuY2lhIGVycsOzbmVhIGRlIHF1ZSBsb3MgYWx1bW5vcyBzYWJlbiBsbyBxdWUgZXMgbWVqb3IgcGFyYSBlbGxvcywgeSBhZHZpZXJ0ZSBxdWUgcG9kZW1vcyBlc3RhciBlbiB1bmEgZXNwaXJhbCBkZXNjZW5kZW50ZSBlbiBsYSBxdWUgY2FkYSBpbnRlbnRvIGRlIGxvcyBpbnZlc3RpZ2Fkb3JlcyBlbiBlZHVjYWNpw7NuIHJlZnV0YXIgZXN0b3MgbWl0b3MgY29uZmlybWEgbGEgY3JlZW5jaWEgZGUgc3VzIG9wb25lbnRlcyBkZSBxdWUgYXByZW5kZXIgY2llbmNpYSBlcyB1bmEgcHNldWRvY2llbmNpYS4gRWxpamEgdW5hIGNvc2EgcXVlIGhheWEgYXByZW5kaWRvIHNvYnJlIGVsIGFwcmVuZGl6YWplIGhhc3RhIGFob3JhIGVuIGVzdGUgbGlicm8gcXVlIGxvIHNvcnByZW5kacOzIG8gY29udHJhZGlqbyBhbGdvIHF1ZSBjcmXDrWEgYW50ZXJpb3JtZW50ZSB5IHByYWN0aXF1ZSBleHBsaWPDoXJzZWxvIGEgdW4gY29tcGHDsWVybyBlbiAx4oCTMiBtaW51dG9zLiDCv1F1w6kgdGFuIGNvbnZpbmNlbnRlIGVyZXM/CgojIyMgVGFyamV0YXMgRmxhc2ggKGluZGl2aWR1YWxlcyAvIDE1KQpVc2Ugbm90YXMgYWRoZXNpdmFzIG8gY3VhbHF1aWVyIG90cmEgY29zYSBxdWUgdGVuZ2EgYSBtYW5vIHBhcmEgaGFjZXIgbWVkaWEgZG9jZW5hIGRlIHRhcmpldGFzIHBhcmEgdW4gdGVtYSBxdWUgaGF5YSBlbnNlw7FhZG8gbyBhcHJlbmRpZG8gcmVjaWVudGVtZW50ZS4gT3BlcmUgY29uIHVuIHNvY2lvIHkgdmVhIGN1w6FudG8gdGllbXBvIGxlIGxsZXZhIGEgY2FkYSB1bm8gZGUgdXN0ZWRlcyBsb2dyYXIgdW4gcmVjdWVyZG8gMTAwJSBwZXJmZWN0by4gRGVqZSBsYXMgdGFyamV0YXMgYSB1biBsYWRvIGN1YW5kbyBoYXlhIHRlcm1pbmFkbywgbHVlZ28gcmVncmVzZSBkZXNwdcOpcyBkZSBtZWRpYSBob3JhIHkgdmVhIGN1w6FsIGVzIHN1IHRhc2EgZGUgcmVjdXBlcmFjacOzbi4KCiMjIyBVc2FuZG8gQURFUFQgKHRvZGEgbGEgY2xhc2UgLyAxNSkKRWxpamEgYWxnbyBxdWUgaGF5YSBlbnNlw7FhZG8gcmVjaWVudGVtZW50ZSBvIHF1ZSBsZSBoYXlhbiBlbnNlw7FhZG8geSBkZXNjcmliYSB1bmEgYnJldmUgbGVjY2nDs24gcXVlIHV0aWxpY2UgZWwgbcOpdG9kbyBBREVQVCBkZSBjaW5jbyBwYXNvcyBwYXJhIHByZXNlbnRhcmxvLgoKIyMjIEVsIGNvc3RvIGRlIGxhIG11bHRpdGFyZWEgKHBhcmVzIC8gMTApCkVsIGJsb2cgZGUgTGVhcm5pbmcgU2NpZW50aXN0cyBkZXNjcmliZSB1biBleHBlcmltZW50byBzaW1wbGUgcXVlIHB1ZWRlIGhhY2VyIGNvbiBzb2xvIHVuIGNyb27Ds21ldHJvIHBhcmEgZGVtb3N0cmFyIGVsIGNvc3RvIG1lbnRhbCBkZSBsYSBtdWx0aXRhcmVhLiBUcmFiYWphbmRvIGVuIHBhcmVqYXMsIG1pZGEgY3XDoW50byB0aWVtcG8gbGUgdG9tYSBhIGNhZGEgcGVyc29uYSByZWFsaXphciBjYWRhIHVuYSBkZSBlc3RhcyB0cmVzIHRhcmVhczoKCiogQ3VlbnRlIGRlbCAxIGFsIDI2IGRvcyB2ZWNlcy4KCiogUmVjaXRhIGVsIGFsZmFiZXRvIGRlIGxhIEEgYSBsYSBaIGRvcyB2ZWNlcy4KCiogSW50ZXJjYWxhciBsb3MgbsO6bWVyb3MgeSBsZXRyYXMsIGVzIGRlY2lyLCAiMSwgQSwgMiwgQiwgLi4uIiB5IGFzw60gc3VjZXNpdmFtZW50ZS4KCkhhZ2EgcXVlIGNhZGEgcGFyIGluZm9ybWUgc3VzIG7Dum1lcm9zLiBTaW4gdW5hIHByw6FjdGljYSBlc3BlY8OtZmljYSwgbGEgdGVyY2VyYSB0YXJlYSBzaWVtcHJlIGxsZXZhIG11Y2hvIG3DoXMgdGllbXBvIHF1ZSBjdWFscXVpZXJhIGRlIGxhcyB0YXJlYXMgY29tcG9uZW50ZXMuCgojIyMgTWl0b3MgZW4gbGEgZWR1Y2FjacOzbiBpbmZvcm3DoXRpY2EgKHRvZGEgbGEgY2xhc2UgLyAyMCkKCltHdXpkMjAxNWJdIHByZXNlbnRhIHVuYSBsaXN0YSBkZSBsYXMgZGlleiBjcmVlbmNpYXMgZXJyw7NuZWFzIHByaW5jaXBhbGVzIHNvYnJlIGxhIGVkdWNhY2nDs24gaW5mb3Jtw6F0aWNhLCBxdWUgaW5jbHV5ZToKCjEuIExhIGZhbHRhIGRlIG11amVyZXMgZW4gQ2llbmNpYXMgZGUgbGEgQ29tcHV0YWNpw7NuIGVzIGNvbW8gdG9kb3MgbG9zIGRlbcOhcyBjYW1wb3MgU1RFTS4KCjIuIFBhcmEgb2J0ZW5lciBtw6FzIG11amVyZXMgZW4gQ1MsIG5lY2VzaXRhbW9zIG3DoXMgcHJvZmVzb3JlcyBmZW1lbmlub3MgZGUgQ1MuCgozLiBMYXMgZXZhbHVhY2lvbmVzIGRlIGxvcyBlc3R1ZGlhbnRlcyBzb24gbGEgbWVqb3IgbWFuZXJhIGRlIGV2YWx1YXIgbGEgZW5zZcOxYW56YS4KCjQuIExvcyBidWVub3MgbWFlc3Ryb3MgcGVyc29uYWxpemFuIGxhIGVkdWNhY2nDs24gcGFyYSBsb3MgZXN0aWxvcyBkZSBhcHJlbmRpemFqZSBkZSBsb3MgZXN0dWRpYW50ZXMuCgo1LiBVbiBidWVuIG1hZXN0cm8gZGUgQ1MgZGViZSBtb2RlbGFyIGJ1ZW5hcyBwcsOhY3RpY2FzIGRlIGRlc2Fycm9sbG8gZGUgc29mdHdhcmUgcG9ycXVlIHN1IHRyYWJham8gZXMgcHJvZHVjaXIgZXhjZWxlbnRlcyBpbmdlbmllcm9zIGRlIHNvZnR3YXJlLgoKNi4gQWxndW5hcyBwZXJzb25hcyBzb24gbmF0dXJhbG1lbnRlIG1lam9yZXMgcHJvZ3JhbWFkb3JlcyBxdWUgb3RyYXMuCgpIYWdhIHF1ZSB0b2RvcyB2b3RlbiArMSAoZGUgYWN1ZXJkbyksIC0xIChlbiBkZXNhY3VlcmRvKSBvIDAgKG5vIGVzdG95IHNlZ3VybykgcG9yIGNhZGEgcHVudG8sIGx1ZWdvIGxlYSBsYXMgZXhwbGljYWNpb25lcyBjb21wbGV0YXMgZW4gZWwgYXJ0w61jdWxvIG9yaWdpbmFsIHkgdm90ZSBudWV2YW1lbnRlLiDCv0VuIGN1w6FsZXMgY2FtYmlhcm9uIGRlIG9waW5pw7NuIGxhcyBwZXJzb25hcz8gwr9DdcOhbGVzIGNyZWVuIHF1ZSB0b2RhdsOtYSBzb24gdmVyZGFkIHkgcG9yIHF1w6k/CgojIyMgUmV2aXNpw7NuIHBvciBwYXJlcyBjYWxpYnJhZGEgKHBhcmVzIC8gMjApCgoxLiBDcmVlIHVuYSByw7picmljYSBkZSA14oCTMTAgcHVudG9zIGNvbiBlbnRyYWRhcyBjb21vIOKAnG5vbWJyZXMgZGUgdmFyaWFibGVzIGJ1ZW5vc+KAnSwg4oCcc2luIGPDs2RpZ28gcmVkdW5kYW50ZeKAnSB5IOKAnGZsdWpvIGRlIGNvbnRyb2wgYW5pZGFkbyBhZGVjdWFkYW1lbnRl4oCdIHBhcmEgY2FsaWZpY2FyIGVsIHRpcG8gZGUgcHJvZ3JhbWFzIHF1ZSBsZSBndXN0YXLDrWEgcXVlIGVzY3JpYmllcmFuIHN1cyBhbHVtbm9zLgoKMi4gRWxpamEgbyBjcmVlIHVuIHBlcXVlw7FvIHByb2dyYW1hIHF1ZSBjb250ZW5nYSAz4oCTNCB2aW9sYWNpb25lcyBkZSBlc3RhcyBlbnRyYWRhcy4KCjMuIENhbGlmaXF1ZSBlbCBwcm9ncmFtYSBkZSBhY3VlcmRvIGNvbiBzdSByw7picmljYS4KCjQuIEhhZ2EgcXVlIHVuIGNvbXBhw7Flcm8gY2FsaWZpcXVlIGVsIG1pc21vIHByb2dyYW1hIGNvbiBsYSBtaXNtYSByw7picmljYS4gwr9RdcOpIGFjZXB0YW4gcXVlIG5vIGxvIGhpY2lzdGU/IMK/UXXDqSBjcml0aWNhbiBxdWUgbm8gaGljaXN0ZT8KCiMjIFJlc3VtZW4KCiFbQ29uY2VwdHM6IEFjdGl2ZSBsZWFybmluZ10oLi9pbWdfdHJhbmluZy9jb25jZXB0bWFwLWFjdGl2ZS1sZWFybmluZy5zdmcpCgojIFVuIHByb2Nlc28gZGUgZGlzZcOxbyBkZSBsZWNjaW9uZXMKCkxhIG1heW9yw61hIGRlIGxhIGdlbnRlIGRpc2XDsWEgbGVjY2lvbmVzIGNvbW8gZXN0YToKCjEuIEFsZ3VpZW4gdGUgcGlkZSBxdWUgZW5zZcOxZXMgYWxnbyBxdWUgYXBlbmFzIHNhYmVzIG8gZW4gbG8gcXVlIG5vIGhhcyBwZW5zYWRvIGVuIGHDsW9zLgoKMi4gRW1waWV6YXMgYSBlc2NyaWJpciBkaWFwb3NpdGl2YXMgcGFyYSBleHBsaWNhciBsbyBxdWUgc2FiZXMgc29icmUgZWwgdGVtYS4KCjMuIERlc3B1w6lzIGRlIDIgbyAzIHNlbWFuYXMsIGhhY2VzIHVuYSB0YXJlYSBiYXNhZGEgZW4gbG8gcXVlIGhhcyBlbnNlw7FhZG8gaGFzdGEgYWhvcmEuCgo0LiBSZXBpdGUgZWwgcGFzbyAzIHZhcmlhcyB2ZWNlcy4KCjUuIFRlIG1hbnRpZW5lcyBkZXNwaWVydG8gaGFzdGEgYWx0YXMgaG9yYXMgZGUgbGEgbWFkcnVnYWRhIHBhcmEgY3JlYXIgdW4gZXhhbWVuIGZpbmFsIHkgcHJvbWV0ZXJ0ZSBxdWUgZXN0YXLDoXMgbcOhcyBvcmdhbml6YWRvIGxhIHByw7N4aW1hIHZlei4KClVuIG3DqXRvZG8gbcOhcyBlZmVjdGl2byBlcyBzaW1pbGFyIGVuIGVzcMOtcml0dSBhIHVuYSBwcsOhY3RpY2EgZGUgcHJvZ3JhbWFjacOzbiBsbGFtYWRhICoqZGVzYXJyb2xsbyBiYXNhZG8gZW4gcHJ1ZWJhcyoqIChUREQpLiBMb3MgcHJvZ3JhbWFkb3JlcyBxdWUgdXNhbiBUREQgbm8gZXNjcmliZW4gc29mdHdhcmUgeSBsdWVnbyBwcnVlYmFuIHF1ZSBmdW5jaW9uYSBjb3JyZWN0YW1lbnRlLiBFbiBjYW1iaW8sIGVzY3JpYmVuIGxhcyBwcnVlYmFzIHByaW1lcm8sIGx1ZWdvIGVzY3JpYmVuIHN1ZmljaWVudGUgc29mdHdhcmUgbnVldm8gcGFyYSBxdWUgZXNhcyBwcnVlYmFzIHBhc2VuLgoKVEREIGZ1bmNpb25hIHBvcnF1ZSBlc2NyaWJpciBwcnVlYmFzIG9ibGlnYSBhIGxvcyBwcm9ncmFtYWRvcmVzIGEgc2VyIHByZWNpc29zIHNvYnJlIGxvIHF1ZSBpbnRlbnRhbiBsb2dyYXIgeSBjw7NtbyBzZSB2ZSAiaGVjaG8iLiBUREQgdGFtYmnDqW4gZXZpdGEgZWwgcHVsaWRvIHNpbiBmaW46IGN1YW5kbyBwYXNhbiBsYXMgcHJ1ZWJhcywgZGVqYSBkZSBjb2RpZmljYXIuIEZpbmFsbWVudGUsIHJlZHVjZSBlbCByaWVzZ28gZGUgc2VzZ28gZGUgY29uZmlybWFjacOzbjogYWxndWllbiBxdWUgYcO6biBubyBoYSBlc2NyaXRvIHVuYSBwaWV6YSBkZSBzb2Z0d2FyZSBzZXLDoSBtw6FzIG9iamV0aXZvIHF1ZSBhbGd1aWVuIHF1ZSBhY2FiYSBkZSBkZWRpY2FyIHZhcmlhcyBob3JhcyBkZSBhcmR1byB0cmFiYWpvIHkgcmVhbG1lbnRlIHF1aWVyZSB0ZXJtaW5hci4KClVuIG3DqXRvZG8gc2ltaWxhciBsbGFtYWRvICoqZGlzZcOxbyBoYWNpYSBhdHLDoXMqKiBmdW5jaW9uYSBtdXkgYmllbiBwYXJhIGVsIGRpc2XDsW8gZGUgbGVjY2lvbmVzLiBFc3RlIG3DqXRvZG8gc2UgZGVzYXJyb2xsw7MgZGUgZm9ybWEgaW5kZXBlbmRpZW50ZSBlbiBbV2lnZzIwMDUsIEJpZ2cyMDExLCBGaW5rMjAxM10geSBzZSByZXN1bWUgZW4gW01jVGkyMDEzXS4gRW4gZm9ybWEgc2ltcGxpZmljYWRhLCBzdXMgcGFzb3Mgc29uOgoKMS4gQ3JlZSBvIHJlY2ljbGUgcGVyc29uYXMgYXByZW5kaWNlcyAoZGlzY3V0aWRhcyBlbiBsYSBzaWd1aWVudGUgc2VjY2nDs24pIHBhcmEgZGVzY3VicmlyIGEgcXVpw6luIGVzdMOhIHRyYXRhbmRvIGRlIGF5dWRhciB5IHF1w6kgbGVzIHJlc3VsdGFyw6EgYXRyYWN0aXZvLgoKMi4gSGFnYSB1bmEgbGx1dmlhIGRlIGlkZWFzIHBhcmEgdGVuZXIgdW5hIGlkZWEgYXByb3hpbWFkYSBkZSBsbyBxdWUgcXVpZXJlIGN1YnJpciwgY8OzbW8gbG8gdmEgYSBoYWNlciwgcXXDqSBwcm9ibGVtYXMgbyBpZGVhcyBlcnLDs25lYXMgZXNwZXJhIGVuY29udHJhciwgcXXDqSBubyBzZSB2YSBhIGluY2x1aXIsIGV0Yy4gRGlidWphciBtYXBhcyBjb25jZXB0dWFsZXMgcHVlZGUgYXl1ZGFyIG11Y2hvIGVuIGVzdGEgZXRhcGEgKFNlY2Npw7NuIDMuMSkuCgozLiBDcmVlIHVuYSBldmFsdWFjacOzbiBzdW1hdGl2YSAoU2VjY2nDs24gMi4xKSBwYXJhIGRlZmluaXIgc3Ugb2JqZXRpdm8gZ2VuZXJhbC4gRXN0ZSBwdWVkZSBzZXIgZWwgZXhhbWVuIGZpbmFsIGRlIHVuIGN1cnNvIG8gZWwgcHJveWVjdG8gZmluYWwgcGFyYSB1biB0YWxsZXIgZGUgdW4gZMOtYTsgaW5kZXBlbmRpZW50ZW1lbnRlIGRlIHN1IGZvcm1hIG8gdGFtYcOxbywgbXVlc3RyYSBoYXN0YSBxdcOpIHB1bnRvIGVzcGVyYSBsbGVnYXIgbcOhcyBjbGFyYW1lbnRlIHF1ZSB1bmEgbGlzdGEgZGUgb2JqZXRpdm9zIGVuIGZvcm1hIGRlIHB1bnRvcy4KCjQuIENyZWUgZXZhbHVhY2lvbmVzIGZvcm1hdGl2YXMgcXVlIGJyaW5kZW4gYSBsYXMgcGVyc29uYXMgbGEgb3BvcnR1bmlkYWQgZGUgcHJhY3RpY2FyIGxhcyBjb3NhcyBxdWUgZXN0w6FuIGFwcmVuZGllbmRvLiBFc3RvcyB0YW1iacOpbiBsZSBkaXLDoW4gKHkgYSBlbGxvcykgc2kgZXN0w6FuIHByb2dyZXNhbmRvIHkgZMOzbmRlIGRlYmVuIGNlbnRyYXIgc3UgYXRlbmNpw7NuLiBMYSBtZWpvciBtYW5lcmEgZGUgaGFjZXIgZXN0byBlcyBkZXRhbGxhciBsb3MgY29ub2NpbWllbnRvcyB5IGhhYmlsaWRhZGVzIHV0aWxpemFkb3MgZW4gbGEgZXZhbHVhY2nDs24gc3VtYXRpdmEgcXVlIGRlc2Fycm9sbMOzIGVuIGVsIHBhc28gYW50ZXJpb3IgeSBsdWVnbyBjcmVhciBhbCBtZW5vcyB1bmEgZXZhbHVhY2nDs24gZm9ybWF0aXZhIHBhcmEgY2FkYSB1bm8uCgo1LiBPcmRlbmUgbGFzIGV2YWx1YWNpb25lcyBmb3JtYXRpdmFzIHBhcmEgY3JlYXIgdW4gZXNxdWVtYSBkZWwgY3Vyc28gYmFzYWRvIGVuIHN1IGNvbXBsZWppZGFkLCBzdXMgZGVwZW5kZW5jaWFzIHkgcXXDqSB0YW4gYmllbiBsb3MgdGVtYXMgbW90aXZhcsOhbiBhIHN1cyBhbHVtbm9zIChTZWNjacOzbiAxMC4xKS4KCjYuIEVzY3JpYmEgbWF0ZXJpYWwgcGFyYSBxdWUgbG9zIGFsdW1ub3MgcGFzZW4gZGUgdW5hIGV2YWx1YWNpw7NuIGZvcm1hdGl2YSBhIGxhIHNpZ3VpZW50ZS4gQ2FkYSBob3JhIGRlIGluc3RydWNjacOzbiBkZWJlIGNvbnN0YXIgZGUgdHJlcyBhIGNpbmNvIGVwaXNvZGlvcyBkZSBlc3RlIHRpcG8uCgo3LiBFc2NyaWJhIHVuYSBkZXNjcmlwY2nDs24gcmVzdW1pZGEgZGVsIGN1cnNvIHBhcmEgYXl1ZGFyIGEgc3UgcMO6YmxpY28gb2JqZXRpdm8gYSBlbmNvbnRyYXJsbyB5IGRldGVybWluYXIgc2kgZXMgYWRlY3VhZG8gcGFyYSBlbGxvcy4KCkVzdGUgbcOpdG9kbyBheXVkYSBhIG1hbnRlbmVyIGxhIGVuc2XDsWFuemEgZW5mb2NhZGEgZW4gc3VzIG9iamV0aXZvcy4gVGFtYmnDqW4gZ2FyYW50aXphIHF1ZSBsb3MgYWx1bW5vcyBubyBlbmZyZW50ZW4gbmFkYSBhbCBmaW5hbCBkZWwgY3Vyc28gcGFyYSBlbCBxdWUgbm8gZXN0w6luIHByZXBhcmFkb3MuCgoKPioqSW5jZW50aXZvcyBwZXJ2ZXJzb3MqKgo+Cj5FbCBkaXNlw7FvIGhhY2lhIGF0csOhcyBubyBlcyBsbyBtaXNtbyBxdWUgZW5zZcOxYXIgYSBsYSBwcnVlYmEuIEFsIHVzYXIgZWwgZGlzZcOxbyBoYWNpYSBhdHLDoXMsIGxvcyBtYWVzdHJvcyBlc3RhYmxlY2VuIG1ldGFzIHBhcmEgYXl1ZGFyIGVuIGVsIGRpc2XDsW8gZGUgbGEgbGVjY2nDs247IEVzIHBvc2libGUgcXVlIG51bmNhIGRlbiBlbCBleGFtZW4gZmluYWwgcXVlIGVzY3JpYmllcm9uLiBFbiBtdWNob3Mgc2lzdGVtYXMgZXNjb2xhcmVzLCBwb3Igb3RybyBsYWRvLCB1bmEgYXV0b3JpZGFkIGV4dGVybmEgZGVmaW5lIGxvcyBjcml0ZXJpb3MgZGUgZXZhbHVhY2nDs24gcGFyYSB0b2RvcyBsb3MgYWx1bW5vcywgaW5kZXBlbmRpZW50ZW1lbnRlIGRlIHN1cyBzaXR1YWNpb25lcyBpbmRpdmlkdWFsZXMuIExvcyByZXN1bHRhZG9zIGRlIGVzYXMgZXZhbHVhY2lvbmVzIHN1bWF0aXZhcyBhZmVjdGFuIGRpcmVjdGFtZW50ZSBlbCBzYWxhcmlvIHkgbGEgcHJvbW9jacOzbiBkZSBsb3MgZG9jZW50ZXMsIGxvIHF1ZSBzaWduaWZpY2EgcXVlIGxvcyBkb2NlbnRlcyB0aWVuZW4gdW4gaW5jZW50aXZvIHBhcmEgY2VudHJhcnNlIGVuIHF1ZSBsb3MgYWx1bW5vcyBhcHJ1ZWJlbiBsYXMgcHJ1ZWJhcyBlbiBsdWdhciBkZSBheXVkYXJsb3MgYSBhcHJlbmRlci4KPgo+W0dyZWUyMDE0XSBhcmd1bWVudGEgcXVlIGNlbnRyYXJzZSBlbiBsYXMgcHJ1ZWJhcyB5IGxhIG1lZGljacOzbiBhdHJhZSBhIHF1aWVuZXMgdGllbmVuIGVsIHBvZGVyIGRlIGVzdGFibGVjZXIgbGFzIHBydWViYXMsIHBlcm8gZXMgcG9jbyBwcm9iYWJsZSBxdWUgbWVqb3JlIGxvcyByZXN1bHRhZG9zIGEgbWVub3MgcXVlIHNlIGNvbWJpbmUgY29uIGVsIGFwb3lvIHBhcmEgcXVlIGxvcyBtYWVzdHJvcyByZWFsaWNlbiBtZWpvcmFzIGJhc2FkYXMgZW4gbG9zIHJlc3VsdGFkb3MgZGUgbGFzIHBydWViYXMuIEEgbWVudWRvIGZhbHRhIGxvIMO6bHRpbW8gcG9ycXVlIGxhcyBncmFuZGVzIG9yZ2FuaXphY2lvbmVzIGdlbmVyYWxtZW50ZSB2YWxvcmFuIGxhIHVuaWZvcm1pZGFkIHNvYnJlIGxhIHByb2R1Y3RpdmlkYWQgW1Njb3QxOTk4XS4KCkVsIGRpc2XDsW8gaW52ZXJzbyBzZSBkZXNjcmliZSBjb21vIHVuYSBzZWN1ZW5jaWEsIHBlcm8gY2FzaSBudW5jYSBzZSBoYWNlIGRlIGVzYSBtYW5lcmEuIFBvZGVtb3MsIHBvciBlamVtcGxvLCBjYW1iaWFyIGRlIG9waW5pw7NuIHNvYnJlIGxvIHF1ZSBxdWVyZW1vcyBlbnNlw7FhciBlbiBiYXNlIGEgYWxnbyBxdWUgc2Ugbm9zIG9jdXJyZSBtaWVudHJhcyBlc2NyaWJpbW9zIHVuIE1DUSwgbyByZWV2YWx1YXIgYSBxdWnDqW4gZXN0YW1vcyB0cmF0YW5kbyBkZSBheXVkYXIgdW5hIHZleiBxdWUgdGVuZ2Ftb3MgdW4gcmVzdW1lbiBkZSBsYSBsZWNjacOzbi4gU2luIGVtYmFyZ28sIGxhcyBub3RhcyBxdWUgZGVqYW1vcyBhdHLDoXMgZGViZW4gcHJlc2VudGFyIGxhcyBjb3NhcyBlbiBlbCBvcmRlbiBkZXNjcml0byBhbnRlcmlvcm1lbnRlIHBhcmEgcXVlIHF1aWVuIHRlbmdhIHF1ZSB1c2FyIG8gbWFudGVuZXIgbGEgbGVjY2nDs24gZGVzcHXDqXMgZGUgbm9zb3Ryb3MgcHVlZGEgdm9sdmVyIHNvYnJlIG51ZXN0cm8gcGVuc2FtaWVudG8uIFtQYXJuMTk4Nl0KCgojIyBQZXJzb25hcyBhcHJlbmRpY2VzCgpFbCBwcmltZXIgcGFzbyBlbiBlbCBwcm9jZXNvIGRlIGRpc2XDsW8gaW52ZXJzbyBlcyBkZXNjdWJyaXIgcXVpw6luIGVzIHN1IGF1ZGllbmNpYS4gVW5hIGZvcm1hIGRlIGhhY2VybG8gZXMgZXNjcmliaXIgZG9zIG8gdHJlcyBwZXJzb25hcyBhcHJlbmRpY2VzIGNvbW8gbGFzIGRlIGxhIFNlY2Npw7NuIDEuMS4gRXN0YSB0w6ljbmljYSBzZSB0b21hIHByZXN0YWRhIGRlIGxvcyBkaXNlw7FhZG9yZXMgZGUgZXhwZXJpZW5jaWEgZGUgdXN1YXJpbywgcXVlIGNyZWFuIHBlcmZpbGVzIGNvcnRvcyBkZSB1c3VhcmlvcyB0w61waWNvcyBwYXJhIGF5dWRhcmxvcyBhIHBlbnNhciBlbiBzdSBhdWRpZW5jaWEuCgpVbmEgcGVyc29uYSBkZSBhcHJlbmRpemFqZSBjb25zaXN0ZSBlbjoKCjEuIGxvcyBhbnRlY2VkZW50ZXMgZ2VuZXJhbGVzIGRlIGxhIHBlcnNvbmE7CgoyLiBsbyBxdWUgeWEgc2FiZW47CgozLiBsbyBxdWUgcXVpZXJlbiBoYWNlcjsgeQoKNC4gY3VhbHF1aWVyIG5lY2VzaWRhZCBlc3BlY2lhbCBxdWUgdGVuZ2FuLgoKTGFzIHBlcnNvbmFzIGVuIGxhIFNlY2Npw7NuIDEuMSB0aWVuZW4gbG9zIGN1YXRybyBwdW50b3MgZW51bWVyYWRvcyBhbnRlcmlvcm1lbnRlLCBqdW50byBjb24gdW4gYnJldmUgcmVzdW1lbiBkZSBjw7NtbyBlc3RlIGxpYnJvIGxvcyBheXVkYXLDoS4gVW5hIHBlcnNvbmEgcXVlIGFwcmVuZGUgcGFyYSB1biBncnVwbyBkZSB2b2x1bnRhcmlvcyBxdWUgb3JnYW5pemEgdGFsbGVyZXMgZGUgUHl0aG9uIGxvcyBmaW5lcyBkZSBzZW1hbmEgcG9kcsOtYSBzZXI6CgoxLiBKb3JnZSBhY2FiYSBkZSBtdWRhcnNlIGRlIENvc3RhIFJpY2EgYSBDYW5hZMOhIHBhcmEgZXN0dWRpYXIgaW5nZW5pZXLDrWEgYWdyw61jb2xhLiBTZSBoYSB1bmlkbyBhbCBlcXVpcG8gZGUgZsO6dGJvbCBkZSBsYSB1bml2ZXJzaWRhZCB5IGVzcGVyYSBhcHJlbmRlciBhIGp1Z2FyIGhvY2tleSBzb2JyZSBoaWVsby4KCjIuIEFkZW3DoXMgZGUgdXNhciBFeGNlbCwgV29yZCBlIEludGVybmV0LCBsYSBleHBlcmllbmNpYSBwcmV2aWEgbcOhcyBpbXBvcnRhbnRlIGRlIEpvcmdlIGNvbiBsYXMgY29tcHV0YWRvcmFzIGVzIGF5dWRhciBhIHN1IGhlcm1hbmEgYSBjb25zdHJ1aXIgdW4gc2l0aW8gZGUgV29yZFByZXNzIHBhcmEgZWwgbmVnb2NpbyBmYW1pbGlhciBlbiBjYXNhLgoKMy4gSm9yZ2UgcXVpZXJlIG1lZGlyIGxhcyBwcm9waWVkYWRlcyBkZWwgc3VlbG8gZGUgZ3JhbmphcyBjZXJjYW5hcyB1dGlsaXphbmRvIHVuIGRpc3Bvc2l0aXZvIHBvcnTDoXRpbCBxdWUgZW52w61hIGRhdG9zIGEgc3UgY29tcHV0YWRvcmEuIEVuIGVzdGUgbW9tZW50byB0aWVuZSBxdWUgYWJyaXIgY2FkYSBhcmNoaXZvIGRlIGRhdG9zIGVuIEV4Y2VsLCBlbGltaW5hciBsYSBwcmltZXJhIHkgbGEgw7psdGltYSBjb2x1bW5hLCB5IGNhbGN1bGFyIGFsZ3VuYXMgZXN0YWTDrXN0aWNhcyBzb2JyZSBsbyBxdWUgcXVlZGEuIFRpZW5lIHF1ZSByZWNvbGVjdGFyIGFsIG1lbm9zIDYwMCBtZWRpY2lvbmVzIGVuIGxvcyBwcsOzeGltb3MgbWVzZXMsIHkgcmVhbG1lbnRlIG5vIHF1aWVyZSB0ZW5lciBxdWUgaGFjZXIgZXN0b3MgcGFzb3MgYSBtYW5vIHBhcmEgY2FkYSB1bm8uCgo0LiBKb3JnZSBzYWJlIGxlZXIgYmllbiBlbCBpbmdsw6lzLCBwZXJvIGEgdmVjZXMgbGUgY3Vlc3RhIG1hbnRlbmVyc2UgYWwgZMOtYSBjb24gbGEgY29udmVyc2FjacOzbiBoYWJsYWRhIHF1ZSBpbnZvbHVjcmEgbXVjaGEgamVyZ2EuCgpFbiBsdWdhciBkZSBlc2NyaWJpciBudWV2YXMgcGVyc29uYXMgcGFyYSBjYWRhIGxlY2Npw7NuIG8gY3Vyc28sIGxvcyBtYWVzdHJvcyBnZW5lcmFsbWVudGUgY3JlYW4geSBjb21wYXJ0ZW4gbWVkaWEgZG9jZW5hIHF1ZSBjdWJyZW4gYSB0b2RvcyBsb3MgcXVlIHByb2JhYmxlbWVudGUgZW5zZcOxYXLDoW4sIGx1ZWdvIGVsaWdlbiBhbGd1bm9zIGRlIGVzZSBjb25qdW50byBwYXJhIGRlc2NyaWJpciBhIGxhIGF1ZGllbmNpYSBwYXJhIHVuIG1hdGVyaWFsIGVuIHBhcnRpY3VsYXIuIExhcyBwZXJzb25hcyBxdWUgc2UgdXRpbGl6YW4gZGUgZXN0YSBtYW5lcmEgc2UgY29udmllcnRlbiBlbiB1bmEgZm9ybWEgYWJyZXZpYWRhIGNvbnZlbmllbnRlIHBhcmEgbG9zIHByb2JsZW1hcyBkZSBkaXNlw7FvOiBhbCBoYWJsYXIgZW50cmUgZWxsb3MsIGxvcyBtYWVzdHJvcyBwdWVkZW4gZGVjaXI6ICLCv0VudGVuZGVyw61hIEpvcmdlIHBvciBxdcOpIGVzdGFtb3MgaGFjaWVuZG8gZXN0bz8iIG8gIsK/UXXDqSBwcm9ibGVtYXMgZGUgaW5zdGFsYWNpw7NuIGVuZnJlbnRhcsOtYSBKb3JnZT8iCgoKCj4qKlN1cyBvYmpldGl2b3MsIG5vIGxvcyB0dXlvcyoqCj4KPkxhcyBwZXJzb25hcyBzaWVtcHJlIGRlYmVuIGRlc2NyaWJpciBsbyBxdWUgZWwgYWx1bW5vIHF1aWVyZSBoYWNlciBlbiBsdWdhciBkZSBsbyBxdWUgY3JlZXMgcXVlIHJlYWxtZW50ZSBuZWNlc2l0YW4uIFByZWfDum50ZXNlIHF1w6kgZXN0w6FuIGJ1c2NhbmRvIGVuIGzDrW5lYTsgcHJvYmFibGVtZW50ZSBubyBpbmNsdWlyw6EgamVyZ2EgcXVlIGHDum4gbm8gY29ub2NlbiwgcG9yIGxvIHF1ZSBwYXJ0ZSBkZSBsbyBxdWUgdGllbmUgcXVlIGhhY2VyIGNvbW8gZGlzZcOxYWRvciBkZSBpbnN0cnVjY2nDs24gZXMgZGVzY3VicmlyIGPDs21vIGhhY2VyIHF1ZSBzdSBsZWNjacOzbiBzZWEgZsOhY2lsIGRlIGVuY29udHJhci4KCgojIyBPYmpldGl2b3MgZGUgYXByZW5kaXphamUKCkxhcyBldmFsdWFjaW9uZXMgZm9ybWF0aXZhcyB5IHN1bWF0aXZhcyBheXVkYW4gYSBsb3MgbWFlc3Ryb3MgYSBkZXNjdWJyaXIgbG8gcXVlIHZhbiBhIGVuc2XDsWFyLCBwZXJvIHBhcmEgY29tdW5pY2FybG8gYSBsb3MgYWx1bW5vcyB5IG90cm9zIG1hZXN0cm9zLCBsYSBkZXNjcmlwY2nDs24gZGVsIGN1cnNvIHRhbWJpw6luIGRlYmUgdGVuZXIgKipvYmpldGl2b3MgZGUgYXByZW5kaXphamUqKi4gRXN0b3MgYXl1ZGFuIGEgYXNlZ3VyYXIgcXVlIHRvZG9zIHRlbmdhbiBsYSBtaXNtYSBjb21wcmVuc2nDs24gZGUgbG8gcXVlIHNlIHN1cG9uZSBxdWUgZGViZSBsb2dyYXIgdW5hIGxlY2Npw7NuLiBQb3IgZWplbXBsbywgdW5hIGRlY2xhcmFjacOzbiBjb21vICJlbnRlbmRlciBHaXQiIHBvZHLDrWEgc2lnbmlmaWNhciBjdWFscXVpZXJhIGRlIGxvcyBzaWd1aWVudGVzOgoKKiBMb3MgZXN0dWRpYW50ZXMgcHVlZGVuIGRlc2NyaWJpciB0cmVzIGZvcm1hcyBlbiBxdWUgbG9zIHNpc3RlbWFzIGRlIGNvbnRyb2wgZGUgdmVyc2lvbmVzIGNvbW8gR2l0IHNvbiBtZWpvcmVzIHF1ZSBsYXMgaGVycmFtaWVudGFzIHBhcmEgY29tcGFydGlyIGFyY2hpdm9zIGNvbW8gRHJvcGJveCB5IGRvcyBmb3JtYXMgZW4gcXVlIHNvbiBwZW9yZXMuCgoqIExvcyBhbHVtbm9zIHB1ZWRlbiBlbnZpYXIgdW4gYXJjaGl2byBtb2RpZmljYWRvIGEgdW4gcmVwb3NpdG9yaW8gZGUgR2l0IHV0aWxpemFuZG8gdW5hIGhlcnJhbWllbnRhIEdVSSBkZSBlc2NyaXRvcmlvLgoKKiBMb3MgYWx1bW5vcyBwdWVkZW4gZXhwbGljYXIgcXXDqSBlcyB1biBIRUFEIHNlcGFyYWRvIHkgcmVjdXBlcmFyc2UgZGUgw6lsIG1lZGlhbnRlIG9wZXJhY2lvbmVzIGRlIGzDrW5lYSBkZSBjb21hbmRvcy4KCj4qKk9iamV0aXZvcyB2cy4gUmVzdWx0YWRvcyoqCj4KPlVuIG9iamV0aXZvIGRlIGFwcmVuZGl6YWplIGVzIGxvIHF1ZSB1bmEgbGVjY2nDs24gc2UgZXNmdWVyemEgcG9yIGxvZ3Jhci4gVW4gcmVzdWx0YWRvIGRlIGFwcmVuZGl6YWplIGVzIGxvIHF1ZSByZWFsbWVudGUgbG9ncmEsIGVzIGRlY2lyLCBsbyBxdWUgbG9zIGFsdW1ub3MgcmVhbG1lbnRlIHF1aXRhbi4gRWwgcGFwZWwgZGUgbGEgZXZhbHVhY2nDs24gc3VtYXRpdmEgZXMsIHBvciBsbyB0YW50bywgY29tcGFyYXIgbG9zIHJlc3VsdGFkb3MgZGUgYXByZW5kaXphamUgY29uIGxvcyBvYmpldGl2b3MgZGUgYXByZW5kaXphamUuCgoKCgpVbiBvYmpldGl2byBkZSBhcHJlbmRpemFqZSBkZXNjcmliZSBjw7NtbyBlbCBhbHVtbm8gZGVtb3N0cmFyw6EgbG8gcXVlIGhhIGFwcmVuZGlkbyB1bmEgdmV6IHF1ZSBoYXlhIGNvbXBsZXRhZG8gY29uIMOpeGl0byB1bmEgbGVjY2nDs24uIE3DoXMgZXNwZWPDrWZpY2FtZW50ZSwgdGllbmUgdW4gdmVyYm8gbWVkaWJsZSBvIHZlcmlmaWNhYmxlIHF1ZSBlc3RhYmxlY2UgbG8gcXVlIGhhcsOhIGVsIGFsdW1ubyB5IGVzcGVjaWZpY2EgbG9zIGNyaXRlcmlvcyBwYXJhIHVuIHJlbmRpbWllbnRvIGFjZXB0YWJsZS4gSW5pY2lhbG1lbnRlLCBlc2NyaWJpciBlc3RvIHB1ZWRlIHBhcmVjZXIgcmVzdHJpY3Rpdm8sIHBlcm8gYSBsYXJnbyBwbGF6byBsb3MgaGFyw6EgZmVsaWNlcyBhIHVzdGVkLCBhIHN1cyBjb21wYcOxZXJvcyBtYWVzdHJvcyB5IGEgc3VzIGFsdW1ub3M6IHRlcm1pbmFyw6EgY29uIHBhdXRhcyBjbGFyYXMgdGFudG8gcGFyYSBzdSBlbnNlw7FhbnphIGNvbW8gcGFyYSBzdSBldmFsdWFjacOzbiwgeSBzdXMgYWx1bW5vcyBhcHJlY2lhcsOhbiB0ZW5lciBleHBlY3RhdGl2YXMgY2xhcmFzLgoKVW5hIGZvcm1hIGRlIGVudGVuZGVyIGxvIHF1ZSBoYWNlIHF1ZSB1biBidWVuIG9iamV0aXZvIGRlIGFwcmVuZGl6YWplIHNlYSB2ZXIgY8OzbW8gc2UgcHVlZGUgbWVqb3JhciB1bm8gcG9icmU6CgoqIEVsIGFsdW1ubyB0ZW5kcsOhIGxhIG9wb3J0dW5pZGFkIGRlIGFwcmVuZGVyIGJ1ZW5hcyBwcsOhY3RpY2FzIGRlIHByb2dyYW1hY2nDs24uCkVzdG8gZGVzY3JpYmUgZWwgY29udGVuaWRvIGRlIGxhIGxlY2Npw7NuLCBubyBsb3MgYXRyaWJ1dG9zIGRlIGxvcyBhbHVtbm9zIGV4aXRvc29zLgoKKiBFbCBhbHVtbm8gYXByZWNpYXLDoSBtZWpvciBsYXMgYnVlbmFzIHByw6FjdGljYXMgZGUgcHJvZ3JhbWFjacOzbi4KRXN0byBubyBjb21pZW56YSBjb24gdW4gdmVyYm8gYWN0aXZvIG5pIGRlZmluZSBlbCBuaXZlbCBkZSBhcHJlbmRpemFqZSwgeSBlbCB0ZW1hIGRlbCBhcHJlbmRpemFqZSBubyB0aWVuZSBjb250ZXh0byB5IG5vIGVzIGVzcGVjw61maWNvLgoKKiBFbCBhbHVtbm8gY29tcHJlbmRlcsOhIGPDs21vIHByb2dyYW1hciBlbiBSLgpTaSBiaWVuIGVzdG8gY29taWVuemEgY29uIHVuIHZlcmJvIGFjdGl2bywgbm8gZGVmaW5lIGVsIG5pdmVsIGRlIGFwcmVuZGl6YWplIHkgZWwgdGVtYSBkZWwgYXByZW5kaXphamUgc2lndWUgc2llbmRvIGRlbWFzaWFkbyB2YWdvIHBhcmEgbGEgZXZhbHVhY2nDs24uCiogRWwgYWx1bW5vIGVzY3JpYmlyw6Egc2NyaXB0cyBkZSBhbsOhbGlzaXMgZGUgZGF0b3MgZGUgdW5hIHDDoWdpbmEgcGFyYSBsZWVyLCBmaWx0cmFyIHkgcmVzdW1pciBkYXRvcyB0YWJ1bGFyZXMgdXNhbmRvIFIuCkVzdG8gY29taWVuemEgY29uIHVuIHZlcmJvIGFjdGl2bywgZGVmaW5lIGVsIG5pdmVsIGRlIGFwcmVuZGl6YWplIHkgcHJvcG9yY2lvbmEgY29udGV4dG8gcGFyYSBnYXJhbnRpemFyIHF1ZSBsb3MgcmVzdWx0YWRvcyBwdWVkYW4gZXZhbHVhcnNlLgoKQ3VhbmRvIHNlIHRyYXRhIGRlIGVsZWdpciB2ZXJib3MsIG11Y2hvcyBtYWVzdHJvcyB1c2FuIGxhICoqVGF4b25vbcOtYSBkZSBCbG9vbSoqLiBQdWJsaWNhZG8gcG9yIHByaW1lcmEgdmV6IGVuIDE5NTYgeSBhY3R1YWxpemFkbyBhIHByaW5jaXBpb3MgZGUgc2lnbG8gW0FuZGUyMDAxXSwgZXMgdW4gbWFyY28gYW1wbGlhbWVudGUgdXRpbGl6YWRvIHBhcmEgZGlzY3V0aXIgbG9zIG5pdmVsZXMgZGUgY29tcHJlbnNpw7NuLiBTdSBmb3JtYSBtw6FzIHJlY2llbnRlIHRpZW5lIHNlaXMgY2F0ZWdvcsOtYXM7IExhIGxpc3RhIGEgY29udGludWFjacOzbiBwcm9wb3JjaW9uYSBhbGd1bm9zIGRlIGxvcyB2ZXJib3MgcXVlIHNlIHVzYW4gdMOtcGljYW1lbnRlIGVuIGxvcyBvYmpldGl2b3MgZGUgYXByZW5kaXphamUgZXNjcml0b3MgcGFyYSBjYWRhIHVubzoKCioqUmVjb3JkYW5kbzoqKgpFeGhpYmEgbGEgbWVtb3JpYSBkZWwgbWF0ZXJpYWwgcHJldmlhbWVudGUgYXByZW5kaWRvIGFsIHJlY29yZGFyIGhlY2hvcywgdMOpcm1pbm9zLCBjb25jZXB0b3MgYsOhc2ljb3MgeSByZXNwdWVzdGFzLiAocmVjb25vY2VyLCBlbnVtZXJhciwgZGVzY3JpYmlyLCBub21icmFyLCBidXNjYXIpCgoqKkNvbXByZW5zacOzbjoqKgpEZW11ZXN0cmUgY29tcHJlbnNpw7NuIGRlIGhlY2hvcyBlIGlkZWFzIG9yZ2FuaXphbmRvLCBjb21wYXJhbmRvLCB0cmFkdWNpZW5kbywgaW50ZXJwcmV0YW5kbywgZGFuZG8gZGVzY3JpcGNpb25lcyB5IGVzdGFibGVjaWVuZG8gaWRlYXMgcHJpbmNpcGFsZXMuIChpbnRlcnByZXRhciwgcmVzdW1pciwgcGFyYWZyYXNlYXIsIGNsYXNpZmljYXIsIGV4cGxpY2FyKQoKKipBcGxpY2FuZG86KioKUmVzdWVsdmEgbnVldm9zIHByb2JsZW1hcyBhcGxpY2FuZG8gbG9zIGNvbm9jaW1pZW50b3MgYWRxdWlyaWRvcywgbG9zIGhlY2hvcywgbGFzIHTDqWNuaWNhcyB5IGxhcyByZWdsYXMgZGUgdW5hIG1hbmVyYSBkaWZlcmVudGUuIChjb25zdHJ1aXIsIGlkZW50aWZpY2FyLCB1c2FyLCBwbGFuaWZpY2FyLCBzZWxlY2Npb25hcikKCioqQW5hbGl6YW5kbzoqKgpFeGFtaW5hciB5IGRpdmlkaXIgbGEgaW5mb3JtYWNpw7NuIGVuIHBhcnRlcyBpZGVudGlmaWNhbmRvIG1vdGl2b3MgbyBjYXVzYXM7IGhhY2VyIGluZmVyZW5jaWFzIHkgZW5jb250cmFyIGV2aWRlbmNpYSBwYXJhIGFwb3lhciBsYXMgZ2VuZXJhbGl6YWNpb25lcy4gKGNvbXBhcmFyLCBjb250cmFzdGFyLCBzaW1wbGlmaWNhcikKCioqRXZhbHVhbmRvOioqClByZXNlbnRlIHkgZGVmaWVuZGEgb3BpbmlvbmVzIGVtaXRpZW5kbyBqdWljaW9zIHNvYnJlIGxhIGluZm9ybWFjacOzbiwgbGEgdmFsaWRleiBkZSBsYXMgaWRlYXMgbyBsYSBjYWxpZGFkIGRlbCB0cmFiYWpvIGVuIGZ1bmNpw7NuIGRlIHVuIGNvbmp1bnRvIGRlIGNyaXRlcmlvcy4gKHZlcmlmaWNhciwgZWxlZ2lyLCBjcml0aWNhciwgcHJvYmFyLCBjYWxpZmljYXIpCgoqKkNyZWFuZG86KioKUmVjb3BpbGUgaW5mb3JtYWNpw7NuIGRlIHVuYSBtYW5lcmEgZGlmZXJlbnRlIGNvbWJpbmFuZG8gZWxlbWVudG9zIGVuIHVuIG51ZXZvIHBhdHLDs24gbyBwcm9wb25pZW5kbyBzb2x1Y2lvbmVzIGFsdGVybmF0aXZhcy4gKGRpc2XDsWFyLCBjb25zdHJ1aXIsIG1lam9yYXIsIGFkYXB0YXIsIG1heGltaXphciwgcmVzb2x2ZXIpCgoKTGEgVGF4b25vbcOtYSBkZSBCbG9vbSBhcGFyZWNlIGVuIGNhc2kgdG9kb3MgbG9zIGxpYnJvcyBkZSB0ZXh0byBzb2JyZSBlZHVjYWNpw7NuLCBwZXJvIFtNYXNhMjAxOF0gZGVzY3VicmnDsyBxdWUgaW5jbHVzbyBsb3MgZWR1Y2Fkb3JlcyBleHBlcmltZW50YWRvcyB0aWVuZW4gcHJvYmxlbWFzIHBhcmEgYWNvcmRhciBjw7NtbyBjbGFzaWZpY2FyIGNvc2FzIGVzcGVjw61maWNhcy4gU2luIGVtYmFyZ28sIGxvcyB2ZXJib3Mgc2lndWVuIHNpZW5kbyDDunRpbGVzLCBjb21vIGxvIGVzIGxhIG5vY2nDs24gZGUgY29uc3RydWlyIGVudGVuZGltaWVudG8gZW4gcGFzb3M6IGNvbW8gaGEgZGljaG8gRGFuaWVsIFdpbGxpbmdoYW0sIGxhIGdlbnRlIG5vIHB1ZWRlIHBlbnNhciBzaW4gYWxnbyBlbiBsbyBxdWUgcGVuc2FyIFtXaWxsMjAxMF0sIHkgZXN0YSB0YXhvbm9tw61hIHB1ZWRlIGF5dWRhciBhIGxvcyBtYWVzdHJvcyBhIGFzZWd1cmFyIHF1ZSBsb3MgYWx1bW5vcyB0ZW5nYW4gZXNhcyBjb3NhcyBjdWFuZG8gbG9zIG5lY2VzaXRhbgoKT3RyYSBmb3JtYSBkZSBwZW5zYXIgc29icmUgbG9zIG9iamV0aXZvcyBkZSBhcHJlbmRpemFqZSBwcm92aWVuZSBkZSBbRmluazIwMTNdLCBxdWUgZGVmaW5lIGVsIGFwcmVuZGl6YWplIGVuIHTDqXJtaW5vcyBkZWwgY2FtYmlvIHF1ZSBkZWJlIHByb2R1Y2lyIGVuIGVsIGFsdW1uby4gTGEgKip0YXhvbm9tw61hIGRlIEZpbmsqKiB0YW1iacOpbiB0aWVuZSBzZWlzIGNhdGVnb3LDrWFzLCBwZXJvIGEgZGlmZXJlbmNpYSBkZSBCbG9vbSwgc29uIGNvbXBsZW1lbnRhcmlhcyBlbiBsdWdhciBkZSBqZXLDoXJxdWljYXM6CgoqKkNvbm9jaW1pZW50byBmdW5kYW1lbnRhbDoqKgpDb21wcmVuZGVyIHkgcmVjb3JkYXIgaW5mb3JtYWNpw7NuIGUgaWRlYXMuIChyZWN1ZXJkYSwgY29tcHJlbmRlLCBpZGVudGlmaWNhKQoKKipTb2xpY2l0dWQ6KioKaGFiaWxpZGFkZXMsIHBlbnNhbWllbnRvIGNyw610aWNvLCBnZXN0acOzbiBkZSBwcm95ZWN0b3MuICh1c2FyLCByZXNvbHZlciwgY2FsY3VsYXIsIGNyZWFyKQoKKipJbnRlZ3JhY2nDs246KioKY29uZWN0YW5kbyBpZGVhcywgZXhwZXJpZW5jaWFzIGRlIGFwcmVuZGl6YWplIHkgbGEgdmlkYSByZWFsLiAoY29uZWN0YXIsIHJlbGFjaW9uYXIsIGNvbXBhcmFyKQoKKipEaW1lbnNpw7NuIGh1bWFuYToqKgphcHJlbmRlciBzb2JyZSB1bm8gbWlzbW8geSBsb3MgZGVtw6FzLiAobGxlZ2FyIGEgdmVyc2UgYSBzw60gbWlzbW9zIGNvbW8sIGNvbXByZW5kZXIgYSBsb3MgZGVtw6FzIGVuIHTDqXJtaW5vcyBkZSwgZGVjaWRpciBjb252ZXJ0aXJzZSkKCioqQ3VpZGFuZG86KioKZGVzYXJyb2xsYW5kbyBudWV2b3Mgc2VudGltaWVudG9zLCBpbnRlcmVzZXMgeSB2YWxvcmVzLiAoRW1vY2nDs25hdGUsIHByZXDDoXJhdGUgcGFyYSB2YWxvcmFyKQoKKipBcHJlbmRpZW5kbyBhIGFwcmVuZGVyOioqCmNvbnZlcnRpcnNlIGVuIHVuIG1lam9yIGFsdW1uby4gKGlkZW50aWZpcXVlIGxhIGZ1ZW50ZSBkZSBpbmZvcm1hY2nDs24gcGFyYSwgcGxhbnRlZSBwcmVndW50YXMgw7p0aWxlcyBzb2JyZSkKClVuIGNvbmp1bnRvIGRlIG9iamV0aXZvcyBkZSBhcHJlbmRpemFqZSBiYXNhZG9zIGVuIGVzdGEgdGF4b25vbcOtYSBwYXJhIHVuIGN1cnNvIGludHJvZHVjdG9yaW8gc29icmUgSFRNTCB5IENTUyBwb2Ryw61hIHNlcjoKCiogRXhwbGljYXIgcXXDqSBzb24gbGFzIHByb3BpZWRhZGVzIENTUyB5IGPDs21vIGZ1bmNpb25hbiBsb3Mgc2VsZWN0b3JlcyBDU1MuCgoqIERpc2XDsWUgdW5hIHDDoWdpbmEgd2ViIHVzYW5kbyBldGlxdWV0YXMgY29tdW5lcyB5IHByb3BpZWRhZGVzIENTUy4KCiogQ29tcGFyZSB5IGNvbnRyYXN0ZSBsYSBlc2NyaXR1cmEgZGUgSFRNTCB5IENTUyBjb24gbGEgZXNjcml0dXJhIGNvbiBoZXJyYW1pZW50YXMgZGUgcHVibGljYWNpw7NuIGRlIGVzY3JpdG9yaW8uCgoqIElkZW50aWZpcXVlIHkgY29ycmlqYSBwcm9ibGVtYXMgZW4gcMOhZ2luYXMgd2ViIGRlIG11ZXN0cmEgcXVlIGRpZmljdWx0ZW4gbGEgaW50ZXJhY2Npw7NuIGRlIGxhcyBwZXJzb25hcyBjb24gZGlzY2FwYWNpZGFkIHZpc3VhbC4KCiogRGVzY3JpYmEgbGFzIGNhcmFjdGVyw61zdGljYXMgZGUgbG9zIHNpdGlvcyB3ZWIgZmF2b3JpdG9zIGN1eW8gZGlzZcOxbyBsZSBhdHJhaWdhIHBhcnRpY3VsYXJtZW50ZSB5IGV4cGxpcXVlIHBvciBxdcOpLgoKKiBEZXNjcmliYSBzdXMgZG9zIGZ1ZW50ZXMgZGUgaW5mb3JtYWNpw7NuIGVuIGzDrW5lYSBmYXZvcml0YXMgc29icmUgQ1NTIHkgZXhwbGlxdWUgcXXDqSBsZSBndXN0YSBkZSBlbGxhcy4KCgoKIyMgTWFudGVuaWJpbGlkYWQKClVuYSB2ZXogcXVlIHNlIGhhIGNyZWFkbyB1bmEgbGVjY2nDs24sIGFsZ3VpZW4gbmVjZXNpdGEgbWFudGVuZXJsYSwgeSBoYWNlcmxvIGVzIG11Y2hvIG3DoXMgZsOhY2lsIHNpIHNlIGhhIGRlc2Fycm9sbGFkbyBkZSBtYW5lcmEgc29zdGVuaWJsZS4gUGVybywgwr9xdcOpIHNpZ25pZmljYSBleGFjdGFtZW50ZSAibWFudGVuaWJsZSI/IExhIHJlc3B1ZXN0YSBicmV2ZSBlcyBxdWUgc2UgcHVlZGUgbWFudGVuZXIgdW5hIGxlY2Npw7NuIHNpIGVzIG3DoXMgYmFyYXRvIGFjdHVhbGl6YXJsYSBxdWUgcmVlbXBsYXphcmxhLiBFc3RhIGVjdWFjacOzbiBkZXBlbmRlIGRlIGN1YXRybyBmYWN0b3JlczoKCioqQ3XDoW4gYmllbiBkb2N1bWVudGFkbyBlc3TDoSBlbCBkaXNlw7FvIGRlbCBjdXJzby4qKgpTaSBsYSBwZXJzb25hIHF1ZSByZWFsaXphIGVsIG1hbnRlbmltaWVudG8gbm8gc2FiZSAobyBubyByZWN1ZXJkYSkgcXXDqSBzZSBzdXBvbmUgcXVlIGRlYmUgbG9ncmFyIGxhIGxlY2Npw7NuIG8gcG9yIHF1w6kgc2UgaW50cm9kdWNlbiBsb3MgdGVtYXMgZW4gdW4gb3JkZW4gcGFydGljdWxhciwgbGVzIGxsZXZhcsOhIG3DoXMgdGllbXBvIGFjdHVhbGl6YXJsYS4gVW5hIHJhesOzbiBwYXJhIHVzYXIgZWwgZGlzZcOxbyBpbnZlcnNvIGVzIGNhcHR1cmFyIGRlY2lzaW9uZXMgc29icmUgcG9yIHF1w6kgY2FkYSBjdXJzbyBlcyBjb21vIGVzLgoKKipRdcOpIGbDoWNpbCBlcyBwYXJhIGxvcyBjb2xhYm9yYWRvcmVzIGNvbGFib3JhciB0w6ljbmljYW1lbnRlLioqCkxvcyBtYWVzdHJvcyBnZW5lcmFsbWVudGUgY29tcGFydGVuIG1hdGVyaWFsIGVudmnDoW5kb3NlIGFyY2hpdm9zIGRlIFBvd2VyUG9pbnQgZW50cmUgZWxsb3MgbyBjb2xvY8OhbmRvbG9zIGVuIHVuYSB1bmlkYWQgY29tcGFydGlkYS4gTGFzIGhlcnJhbWllbnRhcyBkZSBlc2NyaXR1cmEgY29sYWJvcmF0aXZhIGNvbW8gR29vZ2xlIERvY3MgeSB3aWtpcyBzb24gdW5hIGdyYW4gbWVqb3JhLCB5YSBxdWUgcGVybWl0ZW4gYSBtdWNoYXMgcGVyc29uYXMgYWN0dWFsaXphciBlbCBtaXNtbyBkb2N1bWVudG8geSBjb21lbnRhciBsYXMgYWN0dWFsaXphY2lvbmVzIGRlIG90cmFzIHBlcnNvbmFzLiBMb3Mgc2lzdGVtYXMgZGUgY29udHJvbCBkZSB2ZXJzaW9uZXMgdXRpbGl6YWRvcyBwb3IgbG9zIHByb2dyYW1hZG9yZXMsIGNvbW8gR2l0SHViLCBzb24gb3RybyBlbmZvcXVlLiBQZXJtaXRlbiBxdWUgY3VhbHF1aWVyIGNhbnRpZGFkIGRlIHBlcnNvbmFzIHRyYWJhamVuIGRlIGZvcm1hIGluZGVwZW5kaWVudGUgeSBsdWVnbyBmdXNpb25hbiBzdXMgY2FtYmlvcyBkZSBmb3JtYSBjb250cm9sYWRhIHkgcmV2aXNhYmxlLiBEZXNhZm9ydHVuYWRhbWVudGUsIGxvcyBzaXN0ZW1hcyBkZSBjb250cm9sIGRlIHZlcnNpb25lcyB0aWVuZW4gdW5hIGN1cnZhIGRlIGFwcmVuZGl6YWplIGVtcGluYWRhIHkgbm8gbWFuZWphbiBmb3JtYXRvcyBjb211bmVzIGRlIGRvY3VtZW50b3MgZGUgb2ZpY2luYS4KCioqQ3XDoW4gZGlzcHVlc3RhcyBlc3TDoW4gbGFzIHBlcnNvbmFzIGEgY29sYWJvcmFyLioqCkxhcyBoZXJyYW1pZW50YXMgbmVjZXNhcmlhcyBwYXJhIGNvbnN0cnVpciB1bmEgV2lraXBlZGlhIHBhcmEgbGFzIGxlY2Npb25lcyBoYW4gZXhpc3RpZG8gZHVyYW50ZSB2ZWludGUgYcOxb3MsIHBlcm8gbGEgbWF5b3LDrWEgZGUgbG9zIG1hZXN0cm9zIGHDum4gbm8gZXNjcmliZW4geSBjb21wYXJ0ZW4gbGVjY2lvbmVzIGRlIGxhIG1hbmVyYSBlbiBxdWUgZXNjcmliZW4geSBjb21wYXJ0ZW4gZW50cmFkYXMgZGUgZW5jaWNsb3BlZGlhLgoKKipDdcOhbiDDunRpbCBlcyByZWFsbWVudGUgY29tcGFydGlyLioqCkxhICoqcGFyYWRvamEgZGUgbGEgcmV1dGlsaXphY2nDs24qKiBhZmlybWEgcXVlIGN1YW50byBtw6FzIHJldXRpbGl6YWJsZSBlcyB1biBvYmpldG8gZGUgYXByZW5kaXphamUsIG1lbm9zIHBlZGFnw7NnaWNhbWVudGUgZWZlY3Rpdm8gZXMgW1dpbGUyMDAyXS4gTGEgcmF6w7NuIGVzIHF1ZSB1bmEgYnVlbmEgbGVjY2nDs24gc2UgcGFyZWNlIG3DoXMgYSB1bmEgbm92ZWxhIHF1ZSBhIHVuIHByb2dyYW1hOiBzdXMgcGFydGVzIGVzdMOhbiBlc3RyZWNoYW1lbnRlIGFjb3BsYWRhcyBlbiBsdWdhciBkZSBjYWphcyBuZWdyYXMgaW5kZXBlbmRpZW50ZXMuIFBvciBsbyB0YW50bywgbGEgcmV1dGlsaXphY2nDs24gZGlyZWN0YSBwdWVkZSBzZXIgZWwgb2JqZXRpdm8gZXF1aXZvY2FkbyBwYXJhIGxhcyBsZWNjaW9uZXM7IHBvZHLDrWFtb3MgbGxlZ2FyIG3DoXMgbGVqb3MgYWwgaW50ZW50YXIgaGFjZXJsb3MgbcOhcyBmw6FjaWxlcyBkZSBtZXpjbGFyLgoKU2kgbGEgcGFyYWRvamEgZGUgbGEgcmV1dGlsaXphY2nDs24gZXMgY2llcnRhLCBsYSBjb2xhYm9yYWNpw7NuIHNlcsOhIG3DoXMgcHJvYmFibGUgc2kgbGFzIGNvc2FzIGVuIGxhcyBxdWUgc2UgY29sYWJvcmEgc29uIHBlcXVlw7Fhcy4gRXN0byBlbmNhamEgYmllbiBjb24gbGEgdGVvcsOtYSBkZSBsYXMgKipleHBsaWNhY2lvbmVzIGNvcmFsZXMqKiBkZSBNaWtlIENhdWxmaWVsZCwgcXVlIGFyZ3VtZW50YSBxdWUgbG9zIHNpdGlvcyBjb21vIFN0YWNrIE92ZXJmbG93IHRpZW5lbiDDqXhpdG8gcG9ycXVlIHByb3BvcmNpb25hbiB1biBjb3JvIGRlIHJlc3B1ZXN0YXMgcGFyYSBjYWRhIHByZWd1bnRhLCBjYWRhIHVuYSBkZSBsYXMgY3VhbGVzIGVzIG3DoXMgYWRlY3VhZGEgcGFyYSB1biBpbnRlcnJvZ2Fkb3IgbGlnZXJhbWVudGUgZGlmZXJlbnRlLiBTaSBlc3RvIGVzIGNvcnJlY3RvLCBsYXMgbGVjY2lvbmVzIGRlbCBtYcOxYW5hIHB1ZWRlbiBzZXIgdmlzaXRhcyBndWlhZGFzIGEgcmVwb3NpdG9yaW9zIGRlIHByZWd1bnRhcyB5IHJlc3B1ZXN0YXMgY3VyYWRvcyBwb3IgbGEgY29tdW5pZGFkIGRpc2XDsWFkb3MgcGFyYSBlc3R1ZGlhbnRlcyBlbiBuaXZlbGVzIG11eSBkaWZlcmVudGVzLgoKCiMjIEVqZXJjaWNpb3MKIyMjIENyZWFyIHBlcnNvbmFzIGFwcmVuZGljZXMgKGdydXBvcyBwZXF1ZcOxb3MgLyAzMCkKVHJhYmFqYW5kbyBlbiBncnVwb3MgcGVxdWXDsW9zLCBjcmVlIHVuYSBwZXJzb25hIGRlIDQgcHVudG9zIHF1ZSBkZXNjcmliYSBhIHVubyBkZSBzdXMgYWx1bW5vcyB0w61waWNvcy4KCiMjIyBDbGFzaWZpY2FyIGxvcyBvYmpldGl2b3MgZGUgYXByZW5kaXphamUgKHBhcmVzIC8gMTApCgpNaXJlIGxvcyBlamVtcGxvcyBkZSBvYmpldGl2b3MgZGUgYXByZW5kaXphamUgcGFyYSB1biBjdXJzbyBpbnRyb2R1Y3RvcmlvIHNvYnJlIEhUTUwgeSBDU1MgZW4gbGEgU2VjY2nDs24gNi4yIHkgY2xhc2lmaXF1ZSBjYWRhIHVubyBzZWfDum4gbGEgVGF4b25vbcOtYSBkZSBCbG9vbS4gQ29tcGFyYSB0dXMgcmVzcHVlc3RhcyBjb24gbGFzIGRlIHR1IHBhcmVqYS4gwr9Ew7NuZGUgZXN0dXZvIGRlIGFjdWVyZG8geSBlbiBkZXNhY3VlcmRvPwoKIyMjIEVzY3JpYmlyIG9iamV0aXZvcyBkZSBhcHJlbmRpemFqZSAocGFyZXMgLyAyMCkKCkVzY3JpYmUgdW5vIG8gbcOhcyBvYmpldGl2b3MgZGUgYXByZW5kaXphamUgcGFyYSBhbGdvIHF1ZSBlbnNlw7FhcyBhY3R1YWxtZW50ZSBvIHBsYW5lYXMgZW5zZcOxYXIgdXNhbmRvIGxhIFRheG9ub23DrWEgZGUgQmxvb20uIFRyYWJhamFuZG8gY29uIHVuIGNvbXBhw7Flcm8sIGNyaXRpY2EgeSBtZWpvcmEgbG9zIG9iamV0aXZvcy4gwr9UaWVuZSBjYWRhIHVubyB1biB2ZXJibyB2ZXJpZmljYWJsZSB5IGNyaXRlcmlvcyBjbGFyb3MgcGFyYSB1biBkZXNlbXBlw7FvIGFjZXB0YWJsZT8KCiMjIyBFc2NyaWJpciBtw6FzIG9iamV0aXZvcyBkZSBhcHJlbmRpemFqZSAocGFyZXMgLyAyMCkKRXNjcmliZSB1bm8gbyBtw6FzIG9iamV0aXZvcyBkZSBhcHJlbmRpemFqZSBwYXJhIGFsZ28gcXVlIGVuc2XDsWFzIGFjdHVhbG1lbnRlIG8gcGxhbmVhcyBlbnNlw7FhciB1c2FuZG8gbGEgdGF4b25vbcOtYSBkZSBGaW5rLiBUcmFiYWphbmRvIGNvbiB1biBjb21wYcOxZXJvLCBjcml0aWNhIHkgbWVqb3JhIGxvcyBvYmpldGl2b3MuCgojIyMgQXnDumRhbWUgYSBoYWNlcmxvIHNvbG8gKGdydXBvcyBwZXF1ZcOxb3MgLyAxNSkKRWwgdGXDs3JpY28gZWR1Y2F0aXZvIExldiBWeWdvdHNreSBpbnRyb2R1am8gbGEgbm9jacOzbiBkZSB1bmEgWm9uYSBkZSBEZXNhcnJvbGxvIFByb3hpbWFsIChaUEQpLCBxdWUgaW5jbHV5ZSBsb3MgcHJvYmxlbWFzIHF1ZSBsYXMgcGVyc29uYXMgYcO6biBubyBwdWVkZW4gcmVzb2x2ZXIgcG9yIHPDrSBtaXNtYXMgcGVybyBxdWUgcHVlZGVuIHJlc29sdmVyIGNvbiBsYSBheXVkYSBkZSB1biBtZW50b3IuIEVzdG9zIHNvbiBsb3MgcHJvYmxlbWFzIHF1ZSBzb24gbcOhcyBmcnVjdMOtZmVyb3MgcGFyYSBhYm9yZGFyIGEgY29udGludWFjacOzbiwgeWEgcXVlIGVzdMOhbiBmdWVyYSBkZWwgYWxjYW5jZSBwZXJvIHNvbiBhbGNhbnphYmxlcy4KClRyYWJhamFuZG8gZW4gZ3J1cG9zIHBlcXVlw7FvcywgZWxpamEgdW5hIHBlcnNvbmEgZGUgYWx1bW5vIHF1ZSBoYXlhIGRlc2Fycm9sbGFkbyB5IGRlc2NyaWJhIGRvcyBvIHRyZXMgcHJvYmxlbWFzIHF1ZSBzZSBlbmN1ZW50cmFuIGVuIGxhIFpQRCBkZSBlc2UgYWx1bW5vLgoKIyMjIERlc2Fycm9sbGFyIGxlY2Npb25lcyByZXN0YW5kbyBjb21wbGVqaWRhZCAoaW5kaXZpZHVhbCAvIDIwKQpVbmEgZm9ybWEgZGUgY29uc3RydWlyIHVuYSBsZWNjacOzbiBkZSBwcm9ncmFtYWNpw7NuIGVzIGVzY3JpYmlyIGVsIHByb2dyYW1hIGNvbiBlbCBxdWUgZGVzZWEgcXVlIGxvcyBhbHVtbm9zIHRlcm1pbmVuLCBsdWVnbyBlbGltaW5hciBsYSBwYXJ0ZSBtw6FzIGNvbXBsZWphIHF1ZSBkZXNlYSBxdWUgZXNjcmliYW4geSBjb252ZXJ0aXJsbyBlbiBlbCDDumx0aW1vIGVqZXJjaWNpby4gTHVlZ28gcHVlZGUgZWxpbWluYXIgbGEgc2lndWllbnRlIHBhcnRlIG3DoXMgY29tcGxlamEgcXVlIGRlc2VhIHF1ZSBlc2NyaWJhbiB5IGNvbnZlcnRpcmxhIGVuIGVsIHBlbsO6bHRpbW8gZWplcmNpY2lvLCB5IGFzw60gc3VjZXNpdmFtZW50ZS4gQ3VhbHF1aWVyIGNvc2EgcXVlIHF1ZWRlIGRlc3B1w6lzIGRlIHF1ZSBoYXlhcyByZXRpcmFkbyBsb3MgZWplcmNpY2lvcywgY29tbyBjYXJnYXIgYmlibGlvdGVjYXMgbyBsZWVyIGRhdG9zLCBzZSBjb252aWVydGUgZW4gZWwgY8OzZGlnbyBkZSBpbmljaW8gcXVlIGxlcyBkYXMuCgpUb21lIHVuIHByb2dyYW1hIG8gcMOhZ2luYSB3ZWIgcXVlIGRlc2VlIHF1ZSBzdXMgYWx1bW5vcyBwdWVkYW4gY3JlYXIgeSB0cmFiYWplIGhhY2lhIGF0csOhcyBwYXJhIGRpdmlkaXJsbyBlbiBwYXJ0ZXMgZGlnZXJpYmxlcy4gwr9DdcOhbnRvcyBoYXk/IMK/UXXDqSBpZGVhIGNsYXZlIHByZXNlbnRhIGNhZGEgdW5vPwoKCgojIyMgUmFyZXphIG5vIGVzZW5jaWFsIChpbmRpdmlkdWFsIC8gMTUpCkJldHN5IExlb25kYXItV3JpZ2h0IGFjdcOxw7MgbGEgZnJhc2UgInJhcmV6YSBpbmVzZW5jaWFsIiBwYXJhIGRlc2NyaWJpciBjb3NhcyBxdWUgbG9zIGdydXBvcyBoYWNlbiBxdWUgbm8gc29uIHJlYWxtZW50ZSBuZWNlc2FyaWFzLCBwZXJvIHF1ZSBhbGllbmFuIGEgbGFzIHBlcnNvbmFzIHF1ZSBhw7puIG5vIHNvbiBtaWVtYnJvcyBkZSBlc2UgZ3J1cG8uIFN1bWFuYSBIYXJpaGFyZXN3YXJhIGx1ZWdvIHV0aWxpesOzIGVzdGEgbm9jacOzbiBjb21vIGJhc2UgcGFyYSB1bmEgY2hhcmxhIHNvYnJlIHJhcmV6YXMgbm8gZXNlbmNpYWxlcyBlbiBzb2Z0d2FyZSBkZSBjw7NkaWdvIGFiaWVydG8sIHF1ZSBpbmNsdXllIGNvc2FzIGNvbW8gZWwgdXNvIGRlIGhlcnJhbWllbnRhcyBkZSBsw61uZWEgZGUgY29tYW5kb3MgY29uIG5vbWJyZXMgY3LDrXB0aWNvcy4gVMOzbWVzZSB1bm9zIG1pbnV0b3MgcGFyYSBsZWVyIGVzdG9zIGFydMOtY3Vsb3MsIGx1ZWdvIGhhZ2EgdW5hIGxpc3RhIGRlIGxhcyByYXJlemFzIG5vIGVzZW5jaWFsZXMgcXVlIGNyZWUgcXVlIHN1cyBhbHVtbm9zIHBvZHLDrWFuIGVuY29udHJhciBjdWFuZG8gbGVzIGVuc2XDsWUgcG9yIHByaW1lcmEgdmV6LiDCv0N1w6FudG9zIGRlIGVzdG9zIHB1ZWRlcyBldml0YXI/CgojIyMgUEVURSAoaW5kaXZpZHVhbCAvIDE1KQpVbiBwYXRyw7NuIHF1ZSBmdW5jaW9uYSBiaWVuIHBhcmEgcHJvZ3JhbWFyIGxlY2Npb25lcyBlcyBQRVRFOiBwcmVzZW50YXIgZWwgcHJvYmxlbWEsIHRyYWJhamFyIGEgdHJhdsOpcyBkZSB1biBlamVtcGxvLCBleHBsaWNhciBsYSB0ZW9yw61hIHkgbHVlZ28gZWxhYm9yYXIgdW4gc2VndW5kbyBlamVtcGxvIHBhcmEgcXVlIGxvcyBhbHVtbm9zIHB1ZWRhbiB2ZXIgcXXDqSBlcyBlc3BlY8OtZmljbyBkZSBjYWRhIGNhc28geSBxdcOpIHNlIGFwbGljYSBhIHRvZG9zIGxvcyBjYXNvcy4gRWxpamEgYWxnbyBxdWUgaGF5YSBlbnNlw7FhZG8gcmVjaWVudGVtZW50ZSBvIHF1ZSBsZSBoYXlhbiBlbnNlw7FhZG8geSBkZXNjcmliYSB1bmEgYnJldmUgbGVjY2nDs24gcXVlIHNpZ2EgZXN0b3MgY2luY28gcGFzb3MuCgojIyMgUFJJTU0gKGluZGl2aWR1YWwgLyAxNSkKT3RybyBwYXRyw7NuIGRlIGxlY2Npw7NuIGVzIFBSSU1NIFtTZW50MjAxOV06IHByZWRpY2UgZWwgY29tcG9ydGFtaWVudG8gbyBsYSBzYWxpZGEgZGUgdW4gcHJvZ3JhbWEsIGVqZWPDunRlbG8gcGFyYSB2ZXIgbG8gcXVlIHJlYWxtZW50ZSBoYWNlLCBpbnZlc3RpZ3VlIHBvciBxdcOpIGxvIGhhY2UgYWwgYXRyYXZlc2FybG8gZW4gdW4gZGVwdXJhZG9yIG8gZGlidWphciBlbCBmbHVqbyBkZSBjb250cm9sLCBtb2RpZmljYXJsbyAobyBzdXMgZW50cmFkYXMgKSwgeSBsdWVnbyBoYWNlciBhbGdvIHNpbWlsYXIgZGVzZGUgY2Vyby4gRWxpamEgYWxnbyBxdWUgaGF5YSBlbnNlw7FhZG8gcmVjaWVudGVtZW50ZSBvIHF1ZSBsZSBoYXlhbiBlbnNlw7FhZG8geSBkZXNjcmliYSB1bmEgYnJldmUgbGVjY2nDs24gcXVlIHNpZ2EgZXN0b3MgY2luY28gcGFzb3MuCgojIyMgQ29uY3JldG8tUmVwcmVzZW50YWNpb25hbC1BYnN0cmFjdG8gKHBhcmVzIC8gMTUpCkNvbmNyZXRlLVJlcHJlc2VudGF0aW9uYWwtQWJzdHJhY3QgKENSQSkgZXMgdW4gZW5mb3F1ZSBwYXJhIGludHJvZHVjaXIgbnVldmFzIGlkZWFzIHF1ZSBzZSB1c2EgcHJpbmNpcGFsbWVudGUgY29uIGxvcyBhbHVtbm9zIG3DoXMgasOzdmVuZXM6IG1hbmlwdWxhciBmw61zaWNhbWVudGUgdW4gb2JqZXRvIGNvbmNyZXRvLCByZXByZXNlbnRhciBlbCBvYmpldG8gY29uIHVuYSBpbWFnZW4sIGx1ZWdvIHJlYWxpemFyIGxhcyBtaXNtYXMgb3BlcmFjaW9uZXMgdXNhbmRvIG7Dum1lcm9zLCBzw61tYm9sb3MgbyBhbGd1bmEgb3RyYSBhYnN0cmFjY2nDs24gLgoKMS4gRXNjcmliYSBjYWRhIHVubyBkZSBsb3MgbsO6bWVyb3MgMiwgNywgNSwgMTAsIDYgZW4gdW5hIG5vdGEgYWRoZXNpdmEuCgoyLiBTaW11bGUgdW4gYnVjbGUgcXVlIGVuY3VlbnRyZSBlbCB2YWxvciBtw6FzIGdyYW5kZSBhbCBtaXJhciBjYWRhIHVubyBhIHN1IHZleiAoY29uY3JldG8pLgoKMy4gRGlidWplIHVuIGRpYWdyYW1hIGRlbCBwcm9jZXNvIHF1ZSB1dGlsaXrDsywgZXRpcXVldGFuZG8gY2FkYSBwYXNvIChyZXByZXNlbnRhY2lvbmFsKS4KCjQuIEVzY3JpYmEgbGFzIGluc3RydWNjaW9uZXMgcXVlIGFsZ3VpZW4gbcOhcyBwb2Ryw61hIHNlZ3VpciBwYXJhIHNlZ3VpciBsb3MgbWlzbW9zIHBhc29zIChyZXN1bWVuKS4KCkNvbXBhcmUgc3VzIG1hdGVyaWFsZXMgcmVwcmVzZW50YXRpdm9zIHkgYWJzdHJhY3RvcyBjb24gbG9zIGRlIHN1IGNvbXBhw7Flcm8uCgojIyMgRXZhbHVhY2nDs24gZGUgdW4gcmVwb3NpdG9yaW8gZGUgbGVjY2lvbmVzIChncnVwb3MgcGVxdWXDsW9zIC8gMTApCltMZWFrMjAxN10gZXhwbG9yYSBwb3IgcXXDqSBsb3MgcHJvZmVzb3JlcyBkZSBpbmZvcm3DoXRpY2Egbm8gdXNhbiBzaXRpb3MgcGFyYSBjb21wYXJ0aXIgbGVjY2lvbmVzIHkgcmVjb21pZW5kYSBmb3JtYXMgZGUgaGFjZXJsb3MgbcOhcyBhdHJhY3Rpdm9zOgoKMS4gTGEgcMOhZ2luYSBkZSBkZXN0aW5vIGRlYmUgcGVybWl0aXIgYSBsb3MgdmlzaXRhbnRlcyBkZWwgc2l0aW8gaWRlbnRpZmljYXIgc3VzIGFudGVjZWRlbnRlcyB5IHN1cyBpbnRlcmVzZXMgZW4gdmlzaXRhciBlbCBzaXRpby4gTG9zIHNpdGlvcyBkZWJlbiBoYWNlciBkb3MgcHJlZ3VudGFzOiAiwr9DdcOhbCBlcyBzdSByb2wgYWN0dWFsPyIgeSAiwr9FbiBxdcOpIGN1cnNvIHkgbml2ZWwgZGUgZ3JhZG8gZXN0w6EgaW50ZXJlc2Fkbz8iCgoyLiBMb3Mgc2l0aW9zIGRlYmVuIG1vc3RyYXIgdG9kb3MgbG9zIHJlY3Vyc29zIGRlIGFwcmVuZGl6YWplIGVuIGVsIGNvbnRleHRvIGRlbCBjdXJzbyBjb21wbGV0byBwYXJhIHF1ZSBsb3MgdXN1YXJpb3MgcG90ZW5jaWFsZXMgcHVlZGFuIGNvbXByZW5kZXIgc3UgY29udGV4dG8gZGUgdXNvIHByZXZpc3RvLgoKMy4gTXVjaG9zIG1hZXN0cm9zIHRpZW5lbiBpbnF1aWV0dWRlcyBhY2VyY2EgZGUgcXVlIHN1cyBwYXJlcyAoZmFsdGEgZGUpIGNvbm9jaW1pZW50byBzZWFuIGp1emdhZG9zIHBvciBzdXMgY29tcGHDsWVyb3Mgc2kgcHVibGljYW4gZW4gbG9zIGZvcm9zIGRlIGRpc2N1c2nDs24gZGUgbG9zIHNpdGlvcy4gUG9yIGxvIHRhbnRvLCBlc3RvcyBmb3JvcyBkZWJlcsOtYW4gcGVybWl0aXIgbGEgcHVibGljYWNpw7NuIGFuw7NuaW1hLgoKRW4gcGVxdWXDsW9zIGdydXBvcywgZGlzY3V0YSBzaSBlc3RhcyB0cmVzIGNhcmFjdGVyw61zdGljYXMgc2Vyw61hbiBzdWZpY2llbnRlcyBwYXJhIGNvbnZlbmNlcmxvIGRlIHF1ZSB1c2UgdW4gc2l0aW8gcGFyYSBjb21wYXJ0aXIgbGVjY2lvbmVzLCB5IHNpIG5vLCBxdcOpIHNlcsOtYS4KCiMjIFJlc3VtZW4KCiFbcGVzcnNvbmFzXSguL2ltZ190cmFuaW5nL2NvbmNlcHRtYXAtcGVyc29uYXMuc3ZnKQoKCgojIENvbm9jaW1pZW50byBwZWRhZ8OzZ2ljbyBkZWwgY29udGVuaWRvCgpDYWRhIG1hZXN0cm8gbmVjZXNpdGEgdHJlcyBjb3NhczoKCioqRWwgY29ub2NpbWllbnRvIGRlbCBjb250ZW5pZG8qKiBjb21vIGPDs21vIHByb2dyYW1hcjsKCioqQ29ub2NpbWllbnRvIHBlZGFnw7NnaWNvIGdlbmVyYWwqKiBjb21vIGxhIGNvbXByZW5zacOzbiBkZSBsYSBwc2ljb2xvZ8OtYSBkZWwgYXByZW5kaXphamU7IHkKCioqQ29ub2NpbWllbnRvIGRlIGNvbnRlbmlkbyBwZWRhZ8OzZ2ljbyoqIChQQ0spLCBxdWUgZXMgZWwgY29ub2NpbWllbnRvIGVzcGVjw61maWNvIGRlbCBkb21pbmlvIGRlIGPDs21vIGVuc2XDsWFyIHVuIGNvbmNlcHRvIHBhcnRpY3VsYXIgYSB1bmEgYXVkaWVuY2lhIHBhcnRpY3VsYXIuIEVuIGluZm9ybcOhdGljYSwgUENLIGluY2x1eWUgY29zYXMgY29tbyBxdcOpIGVqZW1wbG9zIHVzYXIgY3VhbmRvIHNlIGVuc2XDsWEgY8OzbW8gc2UgcGFzYW4gbG9zIHBhcsOhbWV0cm9zIGEgdW5hIGZ1bmNpw7NuIG8gcXXDqSBjb25jZXB0b3MgZXJyw7NuZW9zIHNvYnJlIGVsIGFuaWRhbWllbnRvIGRlIGV0aXF1ZXRhcyBIVE1MIHNvbiBtw6FzIGNvbXVuZXMuCgpQb2RlbW9zIGFncmVnYXIgY29ub2NpbWllbnRvIHTDqWNuaWNvIGEgZXN0YSBtZXpjbGEgW0tvZWgyMDEzXSwgcGVybyBlc28gbm8gY2FtYmlhIGVsIHB1bnRvIGNsYXZlOiBubyBlcyBzdWZpY2llbnRlIGNvbm9jZXIgbGEgbWF0ZXJpYSB5IGPDs21vIGVuc2XDsWFyOyBoYXkgcXVlIHNhYmVyIGPDs21vIGVuc2XDsWFyIGVzYSBtYXRlcmlhIGVuIHBhcnRpY3VsYXIgW01heWUyMDA0XS4gUG9yIGxvIHRhbnRvLCBlc3RlIGNhcMOtdHVsbyByZXN1bWUgYWxndW5vcyByZXN1bHRhZG9zIGRlIGxhIGludmVzdGlnYWNpw7NuIGVuIGVkdWNhY2nDs24gaW5mb3Jtw6F0aWNhIHF1ZSBzZSBhZ3JlZ2Fyw6FuIGEgc3UgdGllbmRhIGRlIFBDSy4KCkNvbW8gY29uIHRvZGEgaW52ZXN0aWdhY2nDs24sIHNlIHJlcXVpZXJlIGNpZXJ0YSBwcmVjYXVjacOzbiBhbCBpbnRlcnByZXRhciBsb3MgcmVzdWx0YWRvczoKCioqTGFzIHRlb3LDrWFzIGNhbWJpYW4gYSBtZWRpZGEgcXVlIGhheSBtw6FzIGRhdG9zIGRpc3BvbmlibGVzLioqCkxhIGludmVzdGlnYWNpw7NuIGVuIGVkdWNhY2nDs24gaW5mb3Jtw6F0aWNhIChDRVIpIGVzIHVuYSBkaXNjaXBsaW5hIGpvdmVuOiBsYSBTb2NpZWRhZCBFc3RhZG91bmlkZW5zZSBwYXJhIGxhIEVkdWNhY2nDs24gZW4gSW5nZW5pZXLDrWEgc2UgZnVuZMOzIGVuIDE4OTMgeSBlbCBDb25zZWpvIE5hY2lvbmFsIGRlIE1hZXN0cm9zIGRlIE1hdGVtw6F0aWNhcyBlbiAxOTIwLCBwZXJvIGxhIEFzb2NpYWNpw7NuIGRlIE1hZXN0cm9zIGRlIENpZW5jaWFzIGRlIGxhIENvbXB1dGFjacOzbiBubyBleGlzdGnDsyBoYXN0YSAyMDA1LiBTaSBiaWVuIHVuIGZsdWpvIGNvbnN0YW50ZSBkZSBTZSBpbmZvcm1hbiBudWV2b3MgY29ub2NpbWllbnRvcyBlbiBjb25mZXJlbmNpYXMgY29tbyBTSUdDU0UsIElUaUNTRSBlIElDRVIsIHNpbXBsZW1lbnRlIG5vIHNhYmVtb3MgdGFudG8gc29icmUgYXByZW5kZXIgYSBwcm9ncmFtYXIgY29tbyBzb2JyZSBhcHJlbmRlciBhIGxlZXIsIHByYWN0aWNhciB1biBkZXBvcnRlIG8gaGFjZXIgYXJpdG3DqXRpY2EgYsOhc2ljYS4KCioqTGEgbWF5b3LDrWEgZGUgbG9zIHRlbWFzIGRlIGVzdG9zIGVzdHVkaW9zIHNvbiBleHRyYcOxb3M6KioKc29uIGRlIHNvY2llZGFkZXMgb2NjaWRlbnRhbGVzLCBlZHVjYXRpdmFzLCBpbmR1c3RyaWFsaXphZGFzLCByaWNhcyB5IGRlbW9jcsOhdGljYXMgW0hlbnIyMDEwXS4gTG8gcXVlIGVzIG3DoXMsIHRhbWJpw6luIHNvbiBlbiBzdSBtYXlvcsOtYSBqw7N2ZW5lcyB5IGVuIGF1bGFzIGluc3RpdHVjaW9uYWxlcywgeWEgcXVlIGVzYSBlcyBsYSBwb2JsYWNpw7NuIGEgbGEgcXVlIGxhIG1heW9yw61hIGRlIGxvcyBpbnZlc3RpZ2Fkb3JlcyB0aWVuZW4gYWNjZXNvIG3DoXMgZsOhY2lsLiBTYWJlbW9zIG11Y2hvIG1lbm9zIHNvYnJlIGFkdWx0b3MsIG1pZW1icm9zIGRlIGdydXBvcyBtYXJnaW5hZG9zLCBlc3R1ZGlhbnRlcyBlbiBlbnRvcm5vcyBkZSBjYW1wbyBsaWJyZSBvIHByb2dyYW1hZG9yZXMgZGUgdXN1YXJpb3MgZmluYWxlcywgYSBwZXNhciBkZSBxdWUgaGF5IG11Y2hvcyBtw6FzLgoKU2kgc2UgdHJhdGFyYSBkZSB1biB0cmF0YWRvIGFjYWTDqW1pY28sIHBvciBsbyB0YW50bywgc2Vyw61hIGVsIHByZWZhY2lvIGRlIGxhIG1heW9yw61hIGRlIGxhcyBhZmlybWFjaW9uZXMgY29uIGNhbGlmaWNhZG9yZXMgY29tbyAiQWxndW5hcyBpbnZlc3RpZ2FjaW9uZXMgcGFyZWNlbiBpbmRpY2FyIHF1ZSAuLi4iIFBlcm8gZGFkbyBxdWUgbG9zIG1hZXN0cm9zIHJlYWxlcyBlbiBsYXMgYXVsYXMgcmVhbGVzIHRpZW5lbiBxdWUgdG9tYXIgZGVjaXNpb25lcyBpbmRlcGVuZGllbnRlbWVudGUgZGUgc2kgbGEgaW52ZXN0aWdhY2nDs24gdGllbmUgcmVzcHVlc3RhcyBjbGFyYXMgbyBubywgZXN0byBFbCBjYXDDrXR1bG8gcHJlc2VudGEgbWVqb3JlcyBjb25qZXR1cmFzIGFjY2lvbmFibGVzIGVuIGx1Z2FyIGRlIHF1aXrDoXMgbWF0aWNlcy4KCgo+KipKZXJnYSoqCj4KPkNvbW8gY3VhbHF1aWVyIGVzcGVjaWFsaWRhZCwgQ0VSIHRpZW5lIGplcmdhLiBDUzEgc2UgcmVmaWVyZSBhIHVuIGN1cnNvIGludHJvZHVjdG9yaW8gZGUgdW4gc2VtZXN0cmUgZW4gZWwgcXVlIGxvcyBhbHVtbm9zIGN1bXBsZW4gY29uIHZhcmlhYmxlcywgYnVjbGVzIHkgZnVuY2lvbmVzIHBvciBwcmltZXJhIHZleiwgbWllbnRyYXMgcXVlIENTMiBzZSByZWZpZXJlIGEgdW4gc2VndW5kbyBjdXJzbyBxdWUgY3VicmUgZXN0cnVjdHVyYXMgZGUgZGF0b3MgYsOhc2ljYXMgY29tbyBwaWxhcyB5IGNvbGFzLCB5IENTMCBzZSByZWZpZXJlIGEgdW4gY3Vyc28gaW50cm9kdWN0b3JpbyBwYXJhIHBlcnNvbmFzIHNpbiBuaW5ndW5hIGV4cGVyaWVuY2lhIHByZXZpYSBxdWUgbm8gdGVuZ2FuIGxhIGludGVuY2nDs24gZGUgY29udGludWFyIGNvbiBsYSBpbmZvcm3DoXRpY2EgZGUgaW5tZWRpYXRvLiBMYXMgZGVmaW5pY2lvbmVzIGNvbXBsZXRhcyBkZSBlc3RvcyB0w6lybWlub3Mgc2UgcHVlZGVuIGVuY29udHJhciBlbiBsYXMgUGF1dGFzIGRlbCBwbGFuIGRlIGVzdHVkaW9zIGRlIEFDTS4KCgojIyDCv1F1w6kgbGVzIGVzdGFtb3MgZW5zZcOxYW5kbyBhaG9yYT8KClNlIHNhYmUgbXV5IHBvY28gc29icmUgbG8gcXVlIGVuc2XDsWFuIGxvcyBib290Y2FtcHMgZGUgY29kaWZpY2FjacOzbiB5IG90cmFzIGluaWNpYXRpdmFzIGRlIGNhbXBvIGxpYnJlLCBlbiBwYXJ0ZSBwb3JxdWUgbXVjaG9zIHNvbiByZWFjaW9zIGEgY29tcGFydGlyIHN1IHBsYW4gZGUgZXN0dWRpb3MuIFNhYmVtb3MgbcOhcyBzb2JyZSBsbyBxdWUgZW5zZcOxYW4gbGFzIGluc3RpdHVjaW9uZXMgW0x1eHQyMDE3XToKCgp8VG9waWMJfCV8CVRvcGljIHwJJXwKfC0tLS0tLXwtLS18LS0tLS0tLXwtLXwKfFByb2dyYW1taW5nIFByb2Nlc3MJfDg3JQl8RGF0YSBUeXBlcwl8MjMlfAp8QWJzdHJhY3QgUHJvZ3JhbW1pbmcgVGhpbmtpbmcgfCA2MyUgfCBJbnB1dC9PdXRwdXQgfCAxNyUgfAp8RGF0YSBTdHJ1Y3R1cmVzIHwgNDAlIHwgTGlicmFyaWVzIHwgMTUlIHwKfE9iamVjdC1PcmllbnRlZCBDb25jZXB0cyB8IDM2JSB8IFZhcmlhYmxlcyAmIEFzc2lnbm1lbnQgfCAxNCUgfAp8Q29udHJvbCBTdHJ1Y3R1cmVzIHwgMzMlIHwgUmVjdXJzaW9uIHwgMTAlIHwKfE9wZXJhdGlvbnMgJiBGdW5jdGlvbnN8MjYlfFBvaW50ZXJzICYgTWVtb3J5IE1hbmFnZW1lbnR8NSV8CgoKTGFzIGV0aXF1ZXRhcyBkZSB0ZW1hcyBkZSBhbHRvIG5pdmVsIGNvbW8gZXN0YXMgcHVlZGVuIG9jdWx0YXIgdW5hIG11bHRpdHVkIGRlIHBlY2Fkb3MuIFVuIHJlc3VsdGFkbyBtw6FzIHRhbmdpYmxlIHByb3ZpZW5lIGRlIFtSaWNoMjAxN10gcXVlIHJldmlzw7MgdW4gY2VudGVuYXIgZGUgYXJ0w61jdWxvcyBwYXJhIGVuY29udHJhciB0cmF5ZWN0b3JpYXMgZGUgYXByZW5kaXphamUgcGFyYSBsYXMgY2xhc2VzIGRlIGNvbXB1dGFjacOzbiBlbiBsYXMgZXNjdWVsYXMgcHJpbWFyaWFzIHkgc2VjdW5kYXJpYXMuIFN1cyByZXN1bHRhZG9zIHBhcmEgc2VjdWVuY2lhY2nDs24sIHJlcGV0aWNpw7NuIHkgY29uZGljaW9uYWxlcyBzb24gbWFwYXMgY29uY2VwdHVhbGVzIGVzZW5jaWFsbWVudGUgY29sZWN0aXZvcyBxdWUgY29tYmluYW4geSByYWNpb25hbGl6YW4gZWwgcGVuc2FtaWVudG8gaW1wbMOtY2l0byB5IGV4cGzDrWNpdG8gZGUgbXVjaG9zIGVkdWNhZG9yZXMgZGlmZXJlbnRlcyAoRmlndXJhIFtmOiBwY2stdHJheWVjdG9yaWFdKS4KCiFbQ29uZGljaW9uYWxlc10oLi9pbWdfdHJhbmluZy9jb25kaXRpb25hbHMuc3ZnKQoKCiMjIMK/Q3XDoW50byBlc3TDoW4gYXByZW5kaWVuZG8/CgpQdWVkZSBoYWJlciB1biBtdW5kbyBkZSBkaWZlcmVuY2lhIGVudHJlIGxvIHF1ZSBsb3MgbWFlc3Ryb3MgZW5zZcOxYW4geSBjdcOhbnRvIGFwcmVuZGVuIGxvcyBhbHVtbm9zLiBQYXJhIGV4cGxvcmFyIGVzdG8gw7psdGltbywgZGViZW1vcyB1c2FyIG90cmFzIG1lZGlkYXMgbyBoYWNlciBlc3R1ZGlvcyBkaXJlY3Rvcy4gVG9tYW5kbyBlbCBlbmZvcXVlIGFudGVyaW9yLCBhcHJveGltYWRhbWVudGUgZG9zIHRlcmNpb3MgZGUgbG9zIGVzdHVkaWFudGVzIHBvc3RzZWN1bmRhcmlvcyBwYXNhbiBzdSBwcmltZXIgY3Vyc28gZGUgY29tcHV0YWNpw7NuLCBjb24gYWxndW5hcyB2YXJpYWNpb25lcyBkZXBlbmRpZW5kbyBkZWwgdGFtYcOxbyBkZSBsYSBjbGFzZSwgZXRjLiwgcGVybyBzaW4gZGlmZXJlbmNpYXMgc2lnbmlmaWNhdGl2YXMgZW4gZWwgdGllbXBvIG8gYmFzYWRhcyBlbiBlbCBpZGlvbWEgW0Jlbm4yMDA3YSwgV2F0czIwMTRdLgoKwr9Dw7NtbyBhZmVjdGEgbGEgZXhwZXJpZW5jaWEgcHJldmlhIGEgZXN0b3MgcmVzdWx0YWRvcz8gUGFyYSBhdmVyaWd1YXJsbywgW1dpbGMyMDE4XSBjb21wYXLDsyBlbCByZW5kaW1pZW50byB5IGxhIGNvbmZpYW56YSBkZSBsb3Mgbm92YXRvcyBjb24geSBzaW4gZXhwZXJpZW5jaWEgcHJldmlhIGVuIHByb2dyYW1hY2nDs24gZW4gQ1MxIHkgQ1MyICh2ZXIgbcOhcyBhYmFqbykuIERlc2N1YnJpZXJvbiBxdWUgbG9zIG5vdmF0b3MgY29uIGV4cGVyaWVuY2lhIHByZXZpYSBzdXBlcmFyb24gYSBsb3Mgbm92YXRvcyBzaW4gdW4gMTAlIGVuIENTMSwgcGVybyBlc2FzIGRpZmVyZW5jaWFzIGRlc2FwYXJlY2llcm9uIGFsIGZpbmFsIGRlIENTMi4gVGFtYmnDqW4gZGVzY3Vicmllcm9uIHF1ZSBsYXMgbXVqZXJlcyBjb24gZXhwb3NpY2nDs24gcHJldmlhIHN1cGVyYXJvbiBhIHN1cyBwYXJlcyBtYXNjdWxpbm9zIGVuIHRvZGFzIGxhcyDDoXJlYXMsIHBlcm8gc2llbXByZSB0ZW7DrWFuIG1lbm9zIGNvbmZpYW56YSBlbiBzdXMgaGFiaWxpZGFkZXMgKFNlY2Npw7NuIDEwLjQpLgoKRW4gY3VhbnRvIGEgbG9zIGVzdHVkaW9zIGRpcmVjdG9zIGRlIGN1w6FudG8gYXByZW5kZW4gbG9zIHByaW5jaXBpYW50ZXMsIFtNY0NyMjAwMV0gcHJlc2VudMOzIHVuIGVzdHVkaW8gaW50ZXJuYWNpb25hbCBkZSBtw7psdGlwbGVzIHNpdGlvcyBxdWUgbHVlZ28gZnVlIHJlcGxpY2FkbyBwb3IgW1V0dGkyMDEzXS4gU2Vnw7puIGVsIHByaW1lciBlc3R1ZGlvLCAiLi4uIGxvcyByZXN1bHRhZG9zIGRlY2VwY2lvbmFudGVzIHN1Z2llcmVuIHF1ZSBtdWNob3MgZXN0dWRpYW50ZXMgbm8gc2FiZW4gcHJvZ3JhbWFyIGFsIGZpbmFsaXphciBzdXMgY3Vyc29zIGludHJvZHVjdG9yaW9zIi4gTcOhcyBlc3BlY8OtZmljYW1lbnRlLCAiUGFyYSB1bmEgbXVlc3RyYSBjb21iaW5hZGEgZGUgMjE2IGVzdHVkaWFudGVzIGRlIGN1YXRybyB1bml2ZXJzaWRhZGVzLCBlbCBwdW50YWplIHByb21lZGlvIGZ1ZSBkZSAyMi44OSBkZSAxMTAgcHVudG9zIGVuIGxvcyBjcml0ZXJpb3MgZ2VuZXJhbGVzIGRlIGV2YWx1YWNpw7NuIGRlc2Fycm9sbGFkb3MgcGFyYSBlc3RlIGVzdHVkaW8iLiBFc3RlIHJlc3VsdGFkbyBwdWVkZSBkZWNpciB0YW50byBzb2JyZSBsYXMgZXhwZWN0YXRpdmFzIGRlIGxvcyBtYWVzdHJvcyBjb21vIHNvYnJlIGxhIGNhcGFjaWRhZCBkZSBsb3MgZXN0dWRpYW50ZXMsIHBlcm8gZGUgY3VhbHF1aWVyIG1hbmVyYSwgbnVlc3RyYSBwcmltZXJhIHJlY29tZW5kYWNpw7NuIGVzIG1lZGlyIHkgcmFzdHJlYXIgbG9zIHJlc3VsdGFkb3MgZGUgbWFuZXJhIHF1ZSBzZSBwdWVkYW4gY29tcGFyYXIgY29uIGVsIHRpZW1wbyBwYXJhIHF1ZSBwdWVkYSBzYWJlciBzaSBzdXMgbGVjY2lvbmVzIHNlIGVzdMOhbiB2b2x2aWVuZG8gbcOhcyBvIG1lbm9zLiBtZW5vcyBlZmVjdGl2by4KCgojIyDCv1F1w6kgaWRlYXMgZXJyw7NuZWFzIHRpZW5lbiBsb3Mgbm92YXRvcz8KRWwgQ2Fww610dWxvIDIgZXhwbGljYSBwb3IgcXXDqSBhY2xhcmFyIGxvcyBjb25jZXB0b3MgZXJyw7NuZW9zIGRlIGxvcyBwcmluY2lwaWFudGVzIGVzIHRhbiBpbXBvcnRhbnRlIGNvbW8gZW5zZcOxYXJsZXMgZXN0cmF0ZWdpYXMgcGFyYSByZXNvbHZlciBwcm9ibGVtYXMuIEVsIGVycm9yIG3DoXMgZ3JhbmRlIHF1ZSBsb3Mgbm92YXRvcyB0aWVuZW4sIGEgdmVjZXMgbGxhbWFkbyBsYSAic3VwZXJiYWN0ZXJpYSIgZW4gbGEgY29kaWZpY2FjacOzbiwgZXMgbGEgY3JlZW5jaWEgZGUgcXVlIGxhcyBjb21wdXRhZG9yYXMgZW50aWVuZGVuIGxvIHF1ZSBsYXMgcGVyc29uYXMgcXVpZXJlbiBkZWNpciBkZSBsYSBtaXNtYSBtYW5lcmEgcXVlIG90cm8gc2VyIGh1bWFubyBbUGVhMTk4Nl0uIFBvciBsbyB0YW50bywgbnVlc3RyYSBzZWd1bmRhIHJlY29tZW5kYWNpw7NuIGVzIGVuc2XDsWFyIGEgbG9zIG5vdmF0b3MgcXVlIGxhcyBjb21wdXRhZG9yYXMgbm8gZW50aWVuZGVuIGxvcyBwcm9ncmFtYXMsIGVzIGRlY2lyLCBxdWUgbGxhbWFyIGEgdW4gImNvc3RvIiB2YXJpYWJsZSBubyBnYXJhbnRpemEgcXVlIHN1IHZhbG9yIHNlYSByZWFsbWVudGUgdW4gY29zdG8uCgpbU29ydjIwMThdIHByZXNlbnRhIG3DoXMgZGUgY3VhcmVudGEgY29uY2VwdG9zIGVycsOzbmVvcyBxdWUgbG9zIG1hZXN0cm9zIHRhbWJpw6luIHB1ZWRlbiB0cmF0YXIgZGUgYWNsYXJhciwgbXVjaG9zIGRlIGxvcyBjdWFsZXMgdGFtYmnDqW4gc2UgZGlzY3V0ZW4gZW4gbGEgZW5jdWVzdGEgZGUgW1FpYW4yMDE3XS4gVW5hIGVzIGxhIGNyZWVuY2lhIGRlIHF1ZSBsYXMgdmFyaWFibGVzIGVuIGxvcyBwcm9ncmFtYXMgZnVuY2lvbmFuIGRlIGxhIG1pc21hIG1hbmVyYSBxdWUgZW4gbGFzIGhvamFzIGRlIGPDoWxjdWxvLCBlcyBkZWNpciwgZGVzcHXDqXMgZGUgZWplY3V0YXI6CgpncmFkbyA9IDY1CnRvdGFsID0gZ3JhZG8gKyAxMApncmFkbyA9IDgwCmltcHJpbWlyICh0b3RhbCkKZWwgdmFsb3IgZGVsIHRvdGFsIHNlcsOhIDkwIGVuIGx1Z2FyIGRlIDc1IFtLb2huMjAxN10uIEVzdGUgZXMgdW4gZWplbXBsbyBkZSBsYSBmb3JtYSBlbiBxdWUgbG9zIG5vdmF0b3MgY29uc3RydXllbiB1biBtb2RlbG8gbWVudGFsIHBsYXVzaWJsZSBwZXJvIGVxdWl2b2NhZG8gaGFjaWVuZG8gYW5hbG9nw61hczsgT3Ryb3MgY29uY2VwdG9zIGVycsOzbmVvcyBpbmNsdXllbjoKClVuYSB2YXJpYWJsZSBjb250aWVuZSBlbCBoaXN0b3JpYWwgZGUgbG9zIHZhbG9yZXMgcXVlIGxlIGhhbiBzaWRvIGFzaWduYWRvcywgZXMgZGVjaXIsIHJlY3VlcmRhIGN1w6FsIGVyYSBzdSB2YWxvci4KClNlIGdhcmFudGl6YSBxdWUgZG9zIG9iamV0b3MgY29uIGVsIG1pc21vIHZhbG9yIHBhcmEgdW4gYXRyaWJ1dG8gZGUgbm9tYnJlIG8gaWQgc2Vyw6FuIGVsIG1pc21vIG9iamV0by4KCkxhcyBmdW5jaW9uZXMgc2UgZWplY3V0YW4gY29tbyBzZSBkZWZpbmVuIG8gc2UgZWplY3V0YW4gZW4gZWwgb3JkZW4gZW4gcXVlIHNlIGRlZmluZW4uCgoKIyMgwr9RdcOpIGVycm9yZXMgY29tZXRlbiBsb3Mgbm92YXRvcz8KCkxvcyBlcnJvcmVzIHF1ZSBjb21ldGVuIGxvcyBwcmluY2lwaWFudGVzIHB1ZWRlbiBkZWNpcm5vcyBxdcOpIHByaW9yaXphciBlbiBudWVzdHJhIGVuc2XDsWFuemEsIHBlcm8gcmVzdWx0YSBxdWUgbGEgbWF5b3LDrWEgZGUgbG9zIG1hZXN0cm9zIG5vIHNhYmVuIGN1w6FuIGNvbXVuZXMgc29uIHJlYWxtZW50ZSBsb3MgZGlmZXJlbnRlcyB0aXBvcyBkZSBlcnJvcmVzLiBFbCBlc3R1ZGlvIG3DoXMgZ3JhbmRlIGRlIGVzdG8gZXMsIFtCcm93MjAxN10sIHF1ZSBlbmNvbnRyw7MgcXVlIGxhcyBjb21pbGxhcyB5IHBhcsOpbnRlc2lzIG5vIGNvaW5jaWRlbnRlcyBzb24gZWwgdGlwbyBtw6FzIGNvbcO6biBkZSBlcnJvcmVzIGVuIGxvcyBwcm9ncmFtYXMgSmF2YSBub3ZhdG9zLCBwZXJvIHRhbWJpw6luIHNvbiBsb3MgbcOhcyBmw6FjaWxlcyBkZSBjb3JyZWdpciwgbWllbnRyYXMgcXVlIGFsZ3Vub3MgZXJyb3JlcyAoY29tbyBwb25lciBsYSBjb25kaWNpw7NuIGRlIHVuIGlmIGVuIHt9IGVuIGx1Z2FyIGRlICgpKSBjb24gbWF5b3IgZnJlY3VlbmNpYSBzZSBoYWNlbiBzb2xvIHVuYSB2ZXouIENvbW8gZXJhIGRlIGVzcGVyYXIsIGxvcyBlcnJvcmVzIHF1ZSBwcm9kdWNlbiBlcnJvcmVzIGRlIGNvbXBpbGFjacOzbiBzZSBjb3JyaWdlbiBtdWNobyBtw6FzIHLDoXBpZG8gcXVlIGxvcyBxdWUgbm8uIFNpbiBlbWJhcmdvLCBhbGd1bm9zIGVycm9yZXMgc2UgY29tZXRlbiBtdWNoYXMgdmVjZXMsIGNvbW8gaW52b2NhciBtw6l0b2RvcyBjb24gYXJndW1lbnRvcyBpbmNvcnJlY3RvcyAocG9yIGVqZW1wbG8sIHBhc2FyIHVuYSBjYWRlbmEgZW4gbHVnYXIgZGUgdW4gZW50ZXJvKS4KCj4qKk5vIGVzIGNvcnJlY3RvIG8gbm8gZXN0w6EgaGVjaG8qKgo+Cj5VbmEgZGlmaWN1bHRhZCBlbiB1bmEgaW52ZXN0aWdhY2nDs24gY29tbyBlc3RhIGVzIGRpc3Rpbmd1aXIgbG9zIGVycm9yZXMgZGVsIHRyYWJham8gZW4gcHJvZ3Jlc28uIFBvciBlamVtcGxvLCB1bmEgaW5zdHJ1Y2Npw7NuIGlmIHZhY8OtYSBvIHVuIG3DqXRvZG8gcXVlIHNlIGRlZmluZSBwZXJvIGHDum4gbm8gc2UgdXNhIHB1ZWRlIHNlciB1biBzaWdubyBkZSBjw7NkaWdvIGluY29tcGxldG8gZW4gbHVnYXIgZGUgdW4gZXJyb3IuCgpbQnJvdzIwMTddIHRhbWJpw6luIGNvbXBhcsOzIGxvcyBlcnJvcmVzIHF1ZSBsb3MgcHJpbmNpcGlhbnRlcyByZWFsbWVudGUgY29tZXRlbiBjb24gbG8gcXVlIHN1cyBtYWVzdHJvcyBwZW5zYXJvbiBxdWUgY29tZXRpZXJvbi4gRGVzY3Vicmllcm9uIHF1ZSwgIi4uLiBsb3MgZWR1Y2Fkb3JlcyBzb2xvIGZvcm1hcm9uIHVuIGNvbnNlbnNvIGTDqWJpbCBzb2JyZSBxdcOpIGVycm9yZXMgc29uIG3DoXMgZnJlY3VlbnRlcywgcXVlIHN1cyBjbGFzaWZpY2FjaW9uZXMgc29sbyB0ZW7DrWFuIHVuYSBjb3JyZXNwb25kZW5jaWEgbW9kZXJhZGEgY29uIGxvcyBlc3R1ZGlhbnRlcyBlbiBsb3MgLi4uIGRhdG9zLCB5IHF1ZSBsYSBleHBlcmllbmNpYSBkZSBsb3MgZWR1Y2Fkb3JlcyBubyB0dXZvIG5pbmfDum4gZWZlY3RvIGVuIGVzdGUgbml2ZWwgZGUgYWN1ZXJkbyIuIFBvciBlamVtcGxvLCBjb25mdW5kaXIgPSAoYXNpZ25hY2nDs24pIHkgPT0gKGlndWFsZGFkKSBubyBlcmEgdGFuIGNvbcO6biBjb21vIGxhIG1heW9yw61hIGRlIGxvcyBtYWVzdHJvcyBjcmXDrWFuLgoKPioqTm8gc29sbyBwb3IgY8OzZGlnbyoqCj4KPltQYXJrMjAxNV0gcmVjb3BpbMOzIGRhdG9zIGRlIHVuIGVkaXRvciBIVE1MIGVuIGzDrW5lYSBkdXJhbnRlIHVuIGN1cnNvIGludHJvZHVjdG9yaW8gZGUgZGVzYXJyb2xsbyB3ZWIgeSBkZXNjdWJyacOzIHF1ZSBjYXNpIHRvZG9zIGxvcyBhbHVtbm9zIGNvbWV0aWVyb24gZXJyb3JlcyBkZSBzaW50YXhpcyBxdWUgcGVybWFuZWNpZXJvbiBzaW4gcmVzb2x2ZXIgc2VtYW5hcyBkZXNwdcOpcyBkZWwgY3Vyc28uIEVsIDIwJSBkZSBlc3RvcyBlcnJvcmVzIHNlIHJlbGFjaW9uYW4gY29uIGxhcyByZWdsYXMgcmVsYXRpdmFtZW50ZSBjb21wbGVqYXMgcXVlIGRpY3RhbiBjdcOhbmRvIGVzIHbDoWxpZG8gcXVlIGxvcyBlbGVtZW50b3MgSFRNTCBzZSBhbmlkZW4gZW50cmUgc8OtLCBwZXJvIGVsIDM1JSBzZSByZWxhY2lvbmEgY29uIGxhIHNpbnRheGlzIGRlIGV0aXF1ZXRhIG3DoXMgc2ltcGxlIHF1ZSBkZXRlcm1pbmEgY8OzbW8gc2UgYW5pZGFuIGxvcyBlbGVtZW50b3MgSFRNTC4gTGEgdGVuZGVuY2lhIGRlIG11Y2hvcyBtYWVzdHJvcyBhIGRlY2lyOiAiUGVybyBsYXMgcmVnbGFzIHNvbiBzaW1wbGVzIiwgZXMgdW4gYnVlbiBlamVtcGxvIGRlIHB1bnRvIGNpZWdvIGV4cGVydG8gcXVlIHNlIGFuYWxpemEgZW4gZWwgQ2Fww610dWxvIDMgLi4uCgojIyDCv0PDs21vIHNlIHByb2dyYW1hIGRlIG5vdmljaW9zPwpbU29sbzE5ODQsIFNvbG8xOTg2XSBmdWUgcGlvbmVybyBlbiBsYSBleHBsb3JhY2nDs24gZGUgZXN0cmF0ZWdpYXMgZGUgcHJvZ3JhbWFjacOzbiBwYXJhIHByaW5jaXBpYW50ZXMgeSBleHBlcnRvcy4gRWwgaGFsbGF6Z28gY2xhdmUgZXMgcXVlIGxvcyBleHBlcnRvcyBzYWJlbiB0YW50byAicXXDqSIgY29tbyAiY8OzbW8iLCBlcyBkZWNpciwgZW50aWVuZGVuIHF1w6kgcG9uZXIgZW4gbG9zIHByb2dyYW1hcyB5IHRpZW5lbiB1biBjb25qdW50byBkZSBwYXRyb25lcyBvIHBsYW5lcyBkZSBwcm9ncmFtYXMgcGFyYSBndWlhciBzdSBjb25zdHJ1Y2Npw7NuLiBMb3MgcHJpbmNpcGlhbnRlcyBjYXJlY2VuIGRlIGFtYm9zLCBwZXJvIGxhIG1heW9yw61hIGRlIGxvcyBtYWVzdHJvcyBzZSBjZW50cmFuIMO6bmljYW1lbnRlIGVuIGVsIHByaW1lcm8sIGEgcGVzYXIgZGUgcXVlIGxvcyBlcnJvcmVzIGEgbWVudWRvIHNvbiBjYXVzYWRvcyBwb3Igbm8gdGVuZXIgdW5hIGVzdHJhdGVnaWEgcGFyYSByZXNvbHZlciBlbCBwcm9ibGVtYSBlbiBsdWdhciBkZSBsYSBmYWx0YSBkZSBjb25vY2ltaWVudG8gc29icmUgZWwgaWRpb21hLiBVbiB0cmFiYWpvIHJlY2llbnRlIGhhIGRlbW9zdHJhZG8gbGEgZWZlY3RpdmlkYWQgZGUgZW5zZcOxYXIgY3VhdHJvIGhhYmlsaWRhZGVzIGRpc3RpbnRhcyBlbiB1biBvcmRlbiBlc3BlY8OtZmljbyBbWGllMjAxOV06CgpMYSBjb25kaWNpw7NuIGRlIHVuIGNpY2xvIHdoaWxlIHNlIGV2YWzDumEgY29uc3RhbnRlbWVudGUgeSBlbCBjaWNsbyBzZSBkZXRpZW5lIHRhbiBwcm9udG8gY29tbyBzZSB2dWVsdmUgZmFsc28uIFBvciBlbCBjb250cmFyaW8sIGxhcyBjb25kaWNpb25lcyBlbiBzaSBsYXMgZGVjbGFyYWNpb25lcyB0YW1iacOpbiBzZSBldmFsw7phbiBjb25zdGFudGVtZW50ZSwgeSBzdXMgZGVjbGFyYWNpb25lcyBzZSBlamVjdXRhbiB0YW4gcHJvbnRvIGNvbW8gbGEgY29uZGljacOzbiBzZSB2dWVsdmUgdmVyZGFkZXJhLCBpbmRlcGVuZGllbnRlbWVudGUgZGUgZMOzbmRlIGVzdMOpIGVsIGZsdWpvIGRlIGNvbnRyb2wgZW4gZXNlIG1vbWVudG8uCgpMYSBhc2lnbmFjacOzbiBtdWV2ZSB2YWxvcmVzLCBlcyBkZWNpciwgZGVzcHXDqXMgZGUgYSA9IGIsIGxhIHZhcmlhYmxlIGIgZXN0w6EgdmFjw61hLgoKCnwJIHxzZW1hbnRpY3Mgb2YgY29kZQl8IHRlbXBsYXRlcyByZWxhdGVkIHRvIGdvYWxzIHwKfC0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tfAp8cmVhZGluZwl8MS4gcmVhZCBjb2RlIGFuZCBwcmVkaWN0IGJlaGF2aW9yCXwzLiByZWNvZ25pemUgdGVtcGxhdGVzIGFuZCB0aGVpciB1c2VzfAp8d3JpdGluZwl8Mi4gd3JpdGUgY29ycmVjdCBzeW50YXgJfDQuIHVzZSB0ZW1wbGF0ZXMgdG8gbWVldCBnb2Fsc3wKCgpQb3IgbG8gdGFudG8sIG51ZXN0cmFzIHByw7N4aW1hcyByZWNvbWVuZGFjaW9uZXMgc29uIHF1ZSBsb3MgYWx1bW5vcyBsZWFuIGVsIGPDs2RpZ28sIGx1ZWdvIGxvIG1vZGlmaXF1ZW4sIGx1ZWdvIGxvIGVzY3JpYmFuIGUgaW50cm9kdXpjYW4gcGF0cm9uZXMgY29tdW5lcyBleHBsw61jaXRhbWVudGUgeSBxdWUgbG9zIGFsdW1ub3MgcHJhY3RpcXVlbiBzdSB1c28uIFtNdWxsMjAwN2JdIGVzIHNvbG8gdW5vIGRlIGxvcyBtdWNob3MgZXN0dWRpb3MgcXVlIGRlbXVlc3RyYW4gbG9zIGJlbmVmaWNpb3MgZGUgZW5zZcOxYXIgcGF0cm9uZXMgY29tdW5lcyBleHBsw61jaXRhbWVudGUsIHkgZGVzY29tcG9uZXIgbG9zIHByb2JsZW1hcyBlbiBwYXRyb25lcyBjcmVhIG9wb3J0dW5pZGFkZXMgbmF0dXJhbGVzIHBhcmEgY3JlYXIgeSBldGlxdWV0YXIgc3VibWV0YXMgW01hcmcyMDEyLCBNYXJnMjAxNl0uCgojIyDCv0PDs21vIHNlIGRlcHVyYW4gbG9zIG5vdmF0b3M/CgpIYWNlIHVuYSBkw6ljYWRhLCBbTWNDYTIwMDhdIGVzY3JpYmnDszogIkVzIHNvcnByZW5kZW50ZSBsbyBwb2NvIHF1ZSBzZSBkZWRpY2EgZWwgZXNwYWNpbyBkZSBww6FnaW5hIGEgZXJyb3JlcyB5IGRlcHVyYWNpw7NuIGVuIGxhIG1heW9yw61hIGRlIGxvcyBsaWJyb3MgZGUgdGV4dG8gaW50cm9kdWN0b3Jpb3MgZGUgcHJvZ3JhbWFjacOzbiIuIFBvY28gaGEgY2FtYmlhZG8gZGVzZGUgZW50b25jZXM6IGhheSBjaWVudG9zIGRlIGxpYnJvcyBzb2JyZSBjb21waWxhZG9yZXMgeSBzaXN0ZW1hcyBvcGVyYXRpdm9zLCBwZXJvIHNvbG8gdW5vcyBwb2NvcyBzb2JyZSBkZXB1cmFjacOzbiwgeSBudW5jYSBoZSB2aXN0byB1biBjdXJzbyBkZSBwcmVncmFkbyBkZWRpY2FkbyBhbCB0ZW1hLgoKW0xpc3QyMDA0LCBMaXN0MjAwOV0gZGVzY3VicmnDsyBxdWUgbXVjaG9zIG5vdmF0b3MgbHVjaGFiYW4gcG9yIHByZWRlY2lyIGxhIHNhbGlkYSBkZSBwaWV6YXMgY29ydGFzIGRlIGPDs2RpZ28geSBzZWxlY2Npb25hciBsYSBmaW5hbGl6YWNpw7NuIGNvcnJlY3RhIGRlbCBjw7NkaWdvIGRlIHVuIGNvbmp1bnRvIGRlIHBvc2liaWxpZGFkZXMgY3VhbmRvIHNlIGxlcyBkZWPDrWEgbG8gcXVlIHNlIHN1cG9uw61hIHF1ZSBkZWLDrWEgaGFjZXIuIE3DoXMgcmVjaWVudGVtZW50ZSwgW0hhcnIyMDE4XSBkZXNjdWJyacOzIHF1ZSBsYSBicmVjaGEgZW50cmUgcG9kZXIgcmFzdHJlYXIgZWwgY8OzZGlnbyB5IHBvZGVyIGVzY3JpYmlybG8gc2UgaGEgY2VycmFkbyBlbiBncmFuIG1lZGlkYSBwb3IgQ1MyLCBwZXJvIHF1ZSBsb3MgcHJpbmNpcGlhbnRlcyBxdWUgdG9kYXbDrWEgdGllbmVuIHVuYSBicmVjaGEgKGVuIGN1YWxxdWllciBkaXJlY2Npw7NuKSBwcm9iYWJsZW1lbnRlIGxvIGhhZ2FuIG1hbC4KClBvciBsbyB0YW50bywgbnVlc3RyYSBxdWludGEgcmVjb21lbmRhY2nDs24gZXMgZW5zZcOxYXIgZXhwbMOtY2l0YW1lbnRlIGEgbG9zIG5vdmF0b3MgYSBkZXB1cmFyLiBbRml0ejIwMDgsIE11cnAyMDA4XSBkZXNjdWJyacOzIHF1ZSBsb3MgYnVlbm9zIGRlcHVyYWRvcmVzIGVyYW4gYnVlbm9zIHByb2dyYW1hZG9yZXMsIHBlcm8gbm8gdG9kb3MgbG9zIGJ1ZW5vcyBwcm9ncmFtYWRvcmVzIGVyYW4gYnVlbm9zIHBhcmEgbGEgZGVwdXJhY2nDs24uIEFxdWVsbG9zIHF1ZSB1c2Fyb24gdW4gZGVwdXJhZG9yIHNpbWLDs2xpY28gcGFyYSByZWNvcnJlciBzdXMgcHJvZ3JhbWFzLCByYXN0cmVhcm9uIGxhIGVqZWN1Y2nDs24gYSBtYW5vLCBlc2NyaWJpZXJvbiBwcnVlYmFzIHkgcmVsZXllcm9uIGxhcyBlc3BlY2lmaWNhY2lvbmVzIGNvbiBmcmVjdWVuY2lhLCBxdWUgc29uIHRvZG9zIGjDoWJpdG9zIGRlIGVuc2XDsWFuemEuIFNpbiBlbWJhcmdvLCBlbCBzZWd1aW1pZW50byBkZSBsYSBlamVjdWNpw7NuIHBhc28gYSBwYXNvIGEgdmVjZXMgc2UgdXNhYmEgZGUgbWFuZXJhIGluZWZpY2F6OiBwb3IgZWplbXBsbywgdW4gbm92YXRvIHBvZHLDrWEgcG9uZXIgbGEgbWlzbWEgZGVjbGFyYWNpw7NuIGRlIGltcHJlc2nDs24gZW4gYW1iYXMgcGFydGVzIGRlIHVuIGlmLWVsc2UuIExvcyBub3ZhdG9zIHRhbWJpw6luIGNvbWVudGFyw61hbiBsYXMgbMOtbmVhcyBxdWUgZW4gcmVhbGlkYWQgZXJhbiBjb3JyZWN0YXMgYWwgdHJhdGFyIGRlIGFpc2xhciB1biBwcm9ibGVtYTsgbG9zIG1hZXN0cm9zIHB1ZWRlbiBjb21ldGVyIGVzdG9zIGRvcyBlcnJvcmVzIGRlbGliZXJhZGFtZW50ZSwgc2XDsWFsYXJsb3MgeSBjb3JyZWdpcmxvcyBwYXJhIGF5dWRhciBhIGxvcyBub3ZhdG9zIGEgc3VwZXJhcmxvcy4KCkVuc2XDsWFyIGEgbG9zIHByaW5jaXBpYW50ZXMgYSBkZXB1cmFyIHRhbWJpw6luIHB1ZWRlIGF5dWRhciBhIHF1ZSBsYXMgY2xhc2VzIHNlYW4gbcOhcyBmw6FjaWxlcyBkZSBtYW5lamFyLiBbQWxxYTIwMTddIGRlc2N1YnJpw7MgcXVlIGxvcyBhbHVtbm9zIGNvbiBtw6FzIGV4cGVyaWVuY2lhIHJlc29sdmllcm9uIGxvcyBwcm9ibGVtYXMgZGUgZGVwdXJhY2nDs24gc2lnbmlmaWNhdGl2YW1lbnRlIG3DoXMgcsOhcGlkbywgcGVybyBsb3MgdGllbXBvcyB2YXJpYXJvbiBhbXBsaWFtZW50ZTogNC0xMCBtaW51dG9zIGVyYSB1biByYW5nbyB0w61waWNvIHBhcmEgZWplcmNpY2lvcyBpbmRpdmlkdWFsZXMsIGxvIHF1ZSBzaWduaWZpY2EgcXVlIGFsZ3Vub3MgTG9zIGFsdW1ub3MgbmVjZXNpdGFuIDLigJMzIHZlY2VzIG3DoXMgcXVlIG90cm9zIHBhcmEgcmVhbGl6YXIgbG9zIG1pc21vcyBlamVyY2ljaW9zLiBFbnNlw7FhciBhIGxvcyBhbHVtbm9zIG3DoXMgbGVudG9zIGxvIHF1ZSBoYWNlbiBsb3MgbcOhcyByw6FwaWRvcyBheXVkYXLDoSBhIHF1ZSBlbCBwcm9ncmVzbyBnZW5lcmFsIGRlbCBncnVwbyBzZWEgbcOhcyB1bmlmb3JtZS4KCkxhIGRlcHVyYWNpw7NuIGRlcGVuZGUgZGUgcG9kZXIgbGVlciBlbCBjw7NkaWdvLCBxdWUgbcO6bHRpcGxlcyBlc3R1ZGlvcyBoYW4gZGVtb3N0cmFkbyBxdWUgZXMgbGEgZm9ybWEgbcOhcyBlZmVjdGl2YSBkZSBlbmNvbnRyYXIgZXJyb3JlcyBbQmFzaTE5ODcsIEtlbWUyMDA5LCBCYWNjMjAxM10uIExhIHLDumJyaWNhIGRlIGNhbGlkYWQgZGUgY8OzZGlnbyBkZXNhcnJvbGxhZGEgZW4gW1N0ZWcyMDE0LCBTdGVnMjAxNmFdIGVzIHVuYSBidWVuYSBsaXN0YSBkZSB2ZXJpZmljYWNpw7NuIGRlIGxhcyBjb3NhcyBxdWUgZGViZSBidXNjYXIsIGF1bnF1ZSBzZSBwcmVzZW50YSBtZWpvciBlbiBmcmFnbWVudG9zIGVuIGx1Z2FyIGRlIHRvZG9zIGEgbGEgdmV6LgoKSGFjZXIgcXVlIGxvcyBhbHVtbm9zIGxlYW4gZWwgY8OzZGlnbyB5IHJlc3VtYW4gc3UgY29tcG9ydGFtaWVudG8gZXMgdW4gYnVlbiBlamVyY2ljaW8gKFNlY2Npw7NuIDUuMSksIHBlcm8gYSBtZW51ZG8gdG9tYSBkZW1hc2lhZG8gdGllbXBvIHBhcmEgc2VyIHByw6FjdGljbyBlbiBjbGFzZS4gSGFjZXIgcXVlIHByb25vc3RpcXVlbiBsYSBzYWxpZGEgZGUgdW4gcHJvZ3JhbWEganVzdG8gYW50ZXMgZGUgcXVlIHNlIGVqZWN1dGUsIHBvciBvdHJvIGxhZG8sIGF5dWRhIGEgcmVmb3J6YXIgZWwgYXByZW5kaXphamUgKFNlY2Npw7NuIDkuMTEpIHkgdGFtYmnDqW4gbGVzIGRhIHVuIG1vbWVudG8gbmF0dXJhbCBwYXJhIGhhY2VyIHByZWd1bnRhcyBkZSAicXXDqSBwYXNhcsOtYSBzaSIuIExvcyBtYWVzdHJvcyBvIGxvcyBhbHVtbm9zIHRhbWJpw6luIHB1ZWRlbiByYXN0cmVhciBsb3MgY2FtYmlvcyBlbiBsYXMgdmFyaWFibGVzIGEgbWVkaWRhIHF1ZSBhdmFuemFuLCBsbyBxdWUgW0N1bm4yMDE3XSBlbmNvbnRyw7MgZWZlY3Rpdm8gKFNlY2Npw7NuIDEyLjIpLgoKCiMjIMK/UXXDqSBwYXNhIGNvbiBsYXMgcHJ1ZWJhcz8KCkxvcyBwcm9ncmFtYWRvcmVzIG5vdmF0b3MgcGFyZWNlbiB0YW4gcmVhY2lvcyBhIHByb2JhciBzb2Z0d2FyZSBjb21vIGxvcyBwcm9mZXNpb25hbGVzLiBObyBoYXkgZHVkYSBkZSBxdWUgaGFjZXJsbyBlcyB2YWxpb3NvOiBbQ2FydDIwMTddIGRlc2N1YnJpw7MgcXVlIGxvcyBwcmluY2lwaWFudGVzIGRlIGFsdG8gcmVuZGltaWVudG8gcGFzYWJhbiBtdWNobyB0aWVtcG8gcHJvYmFuZG8sIG1pZW50cmFzIHF1ZSBsb3MgZGUgYmFqbyByZW5kaW1pZW50byBwYXNhYmFuIG11Y2hvIG3DoXMgdGllbXBvIHRyYWJhamFuZG8gZW4gY8OzZGlnbyBjb24gZXJyb3JlcywgeSBtdWNob3MgbWFlc3Ryb3MgcmVxdWllcmVuIHF1ZSBsb3MgYWx1bW5vcyBlc2NyaWJhbiBwcnVlYmFzIHBhcmEgbGFzIHRhcmVhcy4gwr9QZXJvIHF1w6kgdGFuIGJpZW4gaGFjZW4gZXN0bz8gVW5hIHJlc3B1ZXN0YSBwcm92aWVuZSBkZSBbQnJpYTIwMTVdLCBxdWUgY2FsaWZpY8OzIGxvcyBwcm9ncmFtYXMgZGUgbG9zIGFsdW1ub3Mgc2Vnw7puIGxhIGNhbnRpZGFkIGRlIGNhc29zIGRlIHBydWViYSBwcm9wb3JjaW9uYWRvcyBwb3IgZWwgbWFlc3RybyBxdWUgcGFzYXJvbiBlc29zIHByb2dyYW1hcyB5LCBhIGxhIGludmVyc2EsIGNhbGlmaWNhIGxvcyBjYXNvcyBkZSBwcnVlYmEgZXNjcml0b3MgcG9yIGxvcyBhbHVtbm9zIGRlIGFjdWVyZG8gY29uIGxhIGNhbnRpZGFkIGRlIGVycm9yZXMgc2VtYnJhZG9zIGRlbGliZXJhZGFtZW50ZS4gRGVzY3Vicmllcm9uIHF1ZSBsYXMgcHJ1ZWJhcyBkZSBsb3MgcHJpbmNpcGlhbnRlcyBhIG1lbnVkbyB0aWVuZW4gdW5hIGNvYmVydHVyYSBiYWphIChlcyBkZWNpciwgbm8gcHJ1ZWJhbiBsYSBtYXlvciBwYXJ0ZSBkZWwgY8OzZGlnbykgeSBxdWUgYSBtZW51ZG8gcHJ1ZWJhbiBtdWNoYXMgY29zYXMgYSBsYSB2ZXosIGxvIHF1ZSBkaWZpY3VsdGEgZGV0ZXJtaW5hciBsYXMgY2F1c2FzIGRlIGxvcyBlcnJvcmVzLgoKT3RyYSByZXNwdWVzdGEgcHJvdmllbmUgZGUgW0Vkd2EyMDE0Yl0sIHF1ZSBleGFtaW7DsyB0b2RvcyBsb3MgZXJyb3JlcyBlbiB0b2RvcyBsb3MgZW52w61vcyBkZSBjw7NkaWdvIGRlIGxvcyBub3ZhdG9zIGNvbWJpbmFkb3MgZSBpZGVudGlmaWPDsyBsb3MgZGV0ZWN0YWRvcyBwb3IgZWwgY29uanVudG8gZGUgcHJ1ZWJhcyBkZSBsb3Mgbm92YXRvcy4gRGVzY3Vicmllcm9uIHF1ZSBsYXMgcHJ1ZWJhcyBkZSBsb3MgcHJpbmNpcGlhbnRlcyBzb2xvIGRldGVjdGFiYW4gdW4gcHJvbWVkaW8gZGVsIDEzLDYlIGRlIGxhcyBmYWxsYXMgcHJlc2VudGVzIGVuIHRvZGEgbGEgcG9ibGFjacOzbiBkZWwgcHJvZ3JhbWEuIEFkZW3DoXMsIGVsIDkwJSBkZSBsYXMgcHJ1ZWJhcyBkZSBsb3MgcHJpbmNpcGlhbnRlcyBmdWVyb24gbXV5IHNpbWlsYXJlcywgbG8gcXVlIGluZGljYSBxdWUgbG9zIHByaW5jaXBpYW50ZXMgZXNjcmliZW4gcHJpbmNpcGFsbWVudGUgcHJ1ZWJhcyBwYXJhIGNvbmZpcm1hciBxdWUgZWwgY8OzZGlnbyBlc3TDoSBoYWNpZW5kbyBsbyBxdWUgc2Ugc3Vwb25lIHF1ZSBkZWJlIGhhY2VyIGVuIGx1Z2FyIGRlIGVuY29udHJhciBjYXNvcyBlbiBsb3MgcXVlIG5vLgoKVW4gZW5mb3F1ZSBwYXJhIGVuc2XDsWFyIG1lam9yZXMgcHLDoWN0aWNhcyBkZSBwcnVlYmEgZXMgZGVmaW5pciB1biBwcm9ibGVtYSBkZSBwcm9ncmFtYWNpw7NuIGFsIHByb3BvcmNpb25hciB1biBjb25qdW50byBkZSBwcnVlYmFzIHF1ZSBzZSBhcHJvYmFyw6FuIGVuIGx1Z2FyIGRlIGEgdHJhdsOpcyBkZSB1bmEgZGVzY3JpcGNpw7NuIGVzY3JpdGEgKFNlY2Npw7NuIDEyLjEpLiBTaW4gZW1iYXJnbywgYW50ZXMgZGUgaGFjZXIgZXN0bywgdMOzbWVzZSB1biBtb21lbnRvIHBhcmEgdmVyIGN1w6FudGFzIHBydWViYXMgaGEgZXNjcml0byByZWNpZW50ZW1lbnRlIHBhcmEgc3UgcHJvcGlvIGPDs2RpZ28sIHkgbHVlZ28gZGVjaWRhIHNpIGVzdMOhIGVuc2XDsWFuZG8gcXXDqSBjcmVlIHF1ZSBkZWJlcsOtYW4gaGFjZXIgbGFzIHBlcnNvbmFzIG8gcXXDqSBoYWNlbiAoeSB1c3RlZCkgcmVhbG1lbnRlLgoKIyMgwr9JbXBvcnRhbiBsb3MgaWRpb21hcz8KTGEgcmVzcHVlc3RhIGNvcnRhIGVzICJzw60iOiBsb3Mgbm92YXRvcyBhcHJlbmRlbiBhIHByb2dyYW1hciBtw6FzIHLDoXBpZG8geSBhcHJlbmRlbiBtw6FzIHV0aWxpemFuZG8gaGVycmFtaWVudGFzIGJhc2FkYXMgZW4gYmxvcXVlcyBjb21vIFNjcmF0Y2ggKEZpZ3VyYSBbZjogcGNrLXNjcmF0Y2hdKSBbV2VpbjIwMTddLiBVbmEgcmF6w7NuIGVzIHF1ZSBsb3Mgc2lzdGVtYXMgYmFzYWRvcyBlbiBibG9xdWVzIHJlZHVjZW4gbGEgY2FyZ2EgY29nbml0aXZhIGFsIGVsaW1pbmFyIGxhIHBvc2liaWxpZGFkIGRlIGVycm9yZXMgZGUgc2ludGF4aXMuIE90cmEgZXMgcXVlIGxhcyBpbnRlcmZhY2VzIGRlIGJsb3F1ZSBmb21lbnRhbiBsYSBleHBsb3JhY2nDs24gZGUgdW5hIG1hbmVyYSBxdWUgZWwgdGV4dG8gbm86IGNvbW8gdG9kYXMgbGFzIGJ1ZW5hcyBoZXJyYW1pZW50YXMsIFNjcmF0Y2ggc2UgcHVlZGUgYXByZW5kZXIgYWNjaWRlbnRhbG1lbnRlIFtNYWxvMjAxMF0uCgpQZXJvLCDCv3F1w6kgc3VjZWRlIGRlc3B1w6lzIGRlIGxvcyBibG9xdWVzPyBbQ2hlbjIwMThdIGRlc2N1YnJpw7MgcXVlIGxvcyBhbHVtbm9zIGN1eW8gcHJpbWVyIGxlbmd1YWplIGRlIHByb2dyYW1hY2nDs24gZXJhIGdyw6FmaWNvIHRlbsOtYW4gY2FsaWZpY2FjaW9uZXMgbcOhcyBhbHRhcyBlbiBsb3MgY3Vyc29zIGRlIHByb2dyYW1hY2nDs24gaW50cm9kdWN0b3JpYSBxdWUgYXF1ZWxsb3MgY3V5byBwcmltZXIgaWRpb21hIGVyYSB0ZXh0dWFsIGN1YW5kbyBsb3MgaWRpb21hcyBzZSBpbnRyb2R1amVyb24gZW4gbyBhbnRlcyBkZSBsb3MgcHJpbWVyb3MgYcOxb3MgZGUgbGEgYWRvbGVzY2VuY2lhLiBQb3IgbG8gdGFudG8sIG51ZXN0cmEgc2V4dGEgcmVjb21lbmRhY2nDs24gZXMgY29tZW56YXIgYSBuacOxb3MgeSBhZG9sZXNjZW50ZXMgY29uIGludGVyZmFjZXMgYmFzYWRhcyBlbiBibG9xdWVzIGFudGVzIGRlIHBhc2FyIGEgc2lzdGVtYXMgYmFzYWRvcyBlbiB0ZXh0by4gTGEgY2FsaWZpY2FjacOzbiBkZSBlZGFkIGVzdMOhIGFow60gcG9ycXVlIFNjcmF0Y2ggZGVsaWJlcmFkYW1lbnRlIHBhcmVjZSBxdWUgZXN0w6EgZGVzdGluYWRvIGEgdXN1YXJpb3MgbcOhcyBqw7N2ZW5lcywgeSBhw7puIHB1ZWRlIHNlciBkaWbDrWNpbCBjb252ZW5jZXIgYSBsb3MgYWR1bHRvcyBkZSBxdWUgbG8gdG9tZW4gZW4gc2VyaW8uCgohW1NjcmF0Y2hdKC4vaW1nX3RyYW5pbmcvc2NyYXRjaC1wcm9ncmFtLnBuZykKCgpTY3JhdGNoIHByb2JhYmxlbWVudGUgaGEgc2lkbyBlc3R1ZGlhZG8gbcOhcyBxdWUgY3VhbHF1aWVyIG90cmEgaGVycmFtaWVudGEgZGUgcHJvZ3JhbWFjacOzbi4gVW4gZWplbXBsbyBlcyBbQWl2YTIwMTZdLCBxdWUgYW5hbGl6w7MgbcOhcyBkZSAyNTAsMDAwIHByb3llY3RvcyBkZSBTY3JhdGNoIHkgZGVzY3VicmnDsyAoZW50cmUgb3RyYXMgY29zYXMpIHF1ZSBhcHJveGltYWRhbWVudGUgZWwgMjglIGRlIGxvcyBwcm95ZWN0b3MgdGllbmVuIGFsZ3Vub3MgYmxvcXVlcyBxdWUgbnVuY2Egc2UgbGxhbWFuIG8gYWN0aXZhbi4gQ29tbyBlbiBlbCBhcGFydGFkbyBhbnRlcmlvciBzb2JyZSBsb3MgcHJvZ3JhbWFzIEphdmEgaW5jb21wbGV0b3MgdmVyc3VzIGluY29ycmVjdG9zLCBsb3MgYXV0b3JlcyBwbGFudGVhbiBsYSBoaXDDs3Rlc2lzIGRlIHF1ZSBsb3MgdXN1YXJpb3MgcHVlZGVuIGVzdGFyIHV0aWxpemFuZG8gZXN0b3MgYmxvcXVlcyBjb21vIHVuIGJsb2MgZGUgbm90YXMgcGFyYSByZWFsaXphciB1biBzZWd1aW1pZW50byBkZSBsb3MgYml0cyBkZSBjw7NkaWdvIHF1ZSAodG9kYXbDrWEpIG5vIHF1aWVyZW4gdGlyYXIuIE90cm8gZWplbXBsbyBlcyBbR3JvdjIwMTcsIE1sYWQyMDE3XSwgcXVlIGVzdHVkacOzIGEgbG9zIHByaW5jaXBpYW50ZXMgYXByZW5kaWVuZG8gc29icmUgYnVjbGVzIGVuIFNjcmF0Y2gsIExvZ28geSBQeXRob24uIERlc2N1YnJpZXJvbiBxdWUgbGFzIGlkZWFzIGVycsOzbmVhcyBzb2JyZSBsb3MgYnVjbGVzIHNlIG1pbmltaXphbiBjdWFuZG8gc2UgdXNhIHVuIGxlbmd1YWplIGJhc2FkbyBlbiBibG9xdWVzIGVuIGx1Z2FyIGRlIHVuIGxlbmd1YWplIGJhc2FkbyBlbiB0ZXh0by4gQWRlbcOhcywgYSBtZWRpZGEgcXVlIGxhcyB0YXJlYXMgc2UgdnVlbHZlbiBtw6FzIGNvbXBsZWphcyAoY29tbyBlbCB1c28gZGUgYnVjbGVzIGFuaWRhZG9zKSBsYXMgZGlmZXJlbmNpYXMgc2UgaGFjZW4gbcOhcyBncmFuZGVzLgoKPioqTcOhcyBkdXJvIGRlIGxvIG5lY2VzYXJpbyoqCj4KPkxvcyBjcmVhZG9yZXMgZGUgbGVuZ3VhamVzIGRlIHByb2dyYW1hY2nDs24gaGFjZW4gcXVlIGVzb3MgbGVuZ3VhamVzIHNlYW4gbcOhcyBkaWbDrWNpbGVzIGRlIGFwcmVuZGVyIGFsIG5vIHJlYWxpemFyIHBydWViYXMgYsOhc2ljYXMgZGUgdXNhYmlsaWRhZC4gUG9yIGVqZW1wbG8sIFtTdGVmMjAxM10gZGVzY3VicmnDsyBxdWUsICIuLi4gbGFzIHRyZXMgcGFsYWJyYXMgbcOhcyBjb211bmVzIHBhcmEgYnVjbGVzIGVuIGNpZW5jaWFzIGRlIGxhIGNvbXB1dGFjacOzbiwgcGFyYSwgd2hpbGUgeSBmb3JlYWNoLCBmdWVyb24gY2FsaWZpY2FkYXMgY29tbyBsYXMgdHJlcyBvcGNpb25lcyBtZW5vcyBpbnR1aXRpdmFzIHBvciBsb3Mgbm8gcHJvZ3JhbWFkb3JlcyIuIFN1IHRyYWJham8gbXVlc3RyYSBxdWUgbGEgc2ludGF4aXMgZGUgZXN0aWxvIEMgKGNvbW8gc2UgdXNhIGVuIEphdmEgeSBQZXJsKSBlcyB0YW4gZGlmw61jaWwgZGUgYXByZW5kZXIgcGFyYSBsb3MgcHJpbmNpcGlhbnRlcyBjb21vIHVuYSBzaW50YXhpcyBkaXNlw7FhZGEgYWwgYXphciwgcGVybyBxdWUgbGEgc2ludGF4aXMgZGUgbGVuZ3VhamVzIGNvbW8gUHl0aG9uIHkgUnVieSBlcyBzaWduaWZpY2F0aXZhbWVudGUgbcOhcyBmw6FjaWwgZGUgYXByZW5kZXIsIHkgbGEgc2ludGF4aXMgZGUgdW4gbGVuZ3VhamUgY3V5YXMgY2FyYWN0ZXLDrXN0aWNhcyBzZSBwcnVlYmFuIGFudGVzIGRlIGFncmVnYXJzZSBhbCBsZW5ndWFqZSBlcyBhw7puIG3DoXMgZsOhY2lsLiBbU3RlZjIwMTddIGVzIHVuIGJyZXZlIHJlc3VtZW4gw7p0aWwgZGUgbG8gcXVlIHJlYWxtZW50ZSBzYWJlbW9zIHNvYnJlIGVsIGRpc2XDsW8gZGUgbGVuZ3VhamVzIGRlIHByb2dyYW1hY2nDs24geSBwb3IgcXXDqSBjcmVlbW9zIHF1ZSBlcyBjaWVydG8sIG1pZW50cmFzIHF1ZSBbR3V6ZDIwMTZdIGV4cG9uZSBjaW5jbyBwcmluY2lwaW9zIHF1ZSBsb3MgbGVuZ3VhamVzIGRlIHByb2dyYW1hY2nDs24gcGFyYSBsb3MgYWx1bW5vcyBkZWJlbiBzZWd1aXIuCgojIyBQcm9ncmFtYWNpw7NuIG9yaWVudGFkYSBhIG9iamV0b3MKTG9zIG9iamV0b3MgeSBsYXMgY2xhc2VzIHNvbiBoZXJyYW1pZW50YXMgcG9kZXJvc2FzIHBhcmEgcHJvZ3JhbWFkb3JlcyBleHBlcmltZW50YWRvcywgeSBtdWNob3MgZWR1Y2Fkb3JlcyBhYm9nYW4gcG9yIHVuIHByaW1lciBlbmZvcXVlIGRlIG9iamV0b3MgcGFyYSBsYSBwcm9ncmFtYWNpw7NuIGRlIGxhIGVuc2XDsWFuemEgKGF1bnF1ZSBhIHZlY2VzIG5vIGVzdMOhbiBkZSBhY3VlcmRvIGV4YWN0YW1lbnRlIHNvYnJlIGxvIHF1ZSBlc28gc2lnbmlmaWNhIFtCZW5uMjAwN2JdKS4gW1NvcnYyMDE0XSBkZXNjcmliZSB5IG1vdGl2YSBlc3RlIGVuZm9xdWUsIHkgW0tvbGwyMDE1XSBkZXNjcmliZSBUcmVzIGdlbmVyYWNpb25lcyBkZSBoZXJyYW1pZW50YXMgZGlzZcOxYWRhcyBwYXJhIHNvcG9ydGFyIGxhIHByb2dyYW1hY2nDs24gZGUgcHJpbmNpcGlhbnRlcyBlbiBlbnRvcm5vcyBvcmllbnRhZG9zIGEgb2JqZXRvcy4KCkludHJvZHVjaXIgb2JqZXRvcyB0ZW1wcmFubyB0aWVuZSBhbGd1bm9zIGRlc2Fmw61vcy4gW01pbGwyMDE2Yl0gZGVzY3VicmnDsyBxdWUgbGEgbWF5b3LDrWEgZGUgbG9zIHByaW5jaXBpYW50ZXMgcXVlIHVzYW4gUHl0aG9uIGx1Y2hhYmFuIHBvciBjb21wcmVuZGVyc2UgYSBzw60gbWlzbW9zIChsbyBxdWUgc2UgcmVmaWVyZSBhbCBvYmpldG8gYWN0dWFsKTogbG8gb21pdGllcm9uIGVuIGxhcyBkZWZpbmljaW9uZXMgZGUgbcOpdG9kb3MsIG5vIGxvIHVzYXJvbiBhbCBoYWNlciByZWZlcmVuY2lhIGEgbG9zIGF0cmlidXRvcyBkZSBsb3Mgb2JqZXRvcywgbyBhbWJvcyBbIFJhZ28yMDE3XSBlbmNvbnRyw7MgYWxnbyBzaW1pbGFyIGVuIGxvcyBlc3R1ZGlhbnRlcyBkZSBzZWN1bmRhcmlhLCB5IHRhbWJpw6luIGRlc2N1YnJpw7MgcXVlIGxvcyBtYWVzdHJvcyBkZSBzZWN1bmRhcmlhIGEgbWVudWRvIHRhbXBvY28gdGVuw61hbiBjbGFybyBlbCBjb25jZXB0by4gQSBmaW4gZGUgY3VlbnRhcywgcmVjb21lbmRhbW9zIHF1ZSBsb3MgbWFlc3Ryb3MgY29taWVuY2VuIGNvbiBmdW5jaW9uZXMgZW4gbHVnYXIgZGUgb2JqZXRvcywgZXMgZGVjaXIsIHF1ZSBhIGxvcyBhbHVtbm9zIG5vIHNlIGxlcyBlbnNlw7FlIGPDs21vIGRlZmluaXIgY2xhc2VzIGhhc3RhIHF1ZSBjb21wcmVuZGFuIGxhcyBlc3RydWN0dXJhcyBkZSBjb250cm9sIGLDoXNpY2FzIHkgbG9zIHRpcG9zIGRlIGRhdG9zLgoKCiMjIERlY2xhcmFjaW9uZXMgZGUgdGlwbwpMb3MgcHJvZ3JhbWFkb3JlcyBoYW4gZGlzY3V0aWRvIGR1cmFudGUgZMOpY2FkYXMgYWNlcmNhIGRlIHNpIGxvcyB0aXBvcyBkZSBkYXRvcyBkZSBsYXMgdmFyaWFibGVzIGRlYmVyw61hbiBzZXIgZGVjbGFyYWRvcyBvIG5vLCBnZW5lcmFsbWVudGUgZW4gZnVuY2nDs24gZGUgc3UgZXhwZXJpZW5jaWEgcGVyc29uYWwgY29tbyBwcm9mZXNpb25hbGVzIGVuIGx1Z2FyIGRlIGN1YWxxdWllciB0aXBvIGRlIGRhdG9zLiBsb3MgcHJvZ3JhbWFzIHRpZW5lbiBjaWVydGEgY29tcGxlamlkYWQsIHBlcm8gdmFsZSBsYSBwZW5hIGNvbiBiYXN0YW50ZSByYXBpZGV6IGFsIGFjdHVhciBjb21vIGRvY3VtZW50YWNpw7NuIHBhcmEgZWwgdXNvIGRlIHVuIG3DqXRvZG8sIGVuIHBhcnRpY3VsYXIgYWwgZXZpdGFyIHByZWd1bnRhcyBzb2JyZSBsbyBxdWUgZXN0w6EgZGlzcG9uaWJsZSB5IGPDs21vIHVzYXJsby4KCiMjIE5vbWVuY2xhdHVyYSB2YXJpYWJsZQpbS2VybjE5OTldIGVzY3JpYmnDszog4oCcQSBtZW51ZG8gc2UgYWxpZW50YSBhIGxvcyBwcm9ncmFtYWRvcmVzIGEgdXNhciBub21icmVzIGRlIHZhcmlhYmxlcyBsYXJnb3MgaW5kZXBlbmRpZW50ZW1lbnRlIGRlbCBjb250ZXh0by4gRXN0byBlcyB1biBlcnJvcjogbGEgY2xhcmlkYWQgYSBtZW51ZG8gc2UgbG9ncmEgYSB0cmF2w6lzIGRlIGxhIGJyZXZlZGFkICIuIE11Y2hvcyBwcm9ncmFtYWRvcmVzIGNyZWVuIGVzdG8sIHBlcm8gW0hvZm0yMDE3XSBkZXNjdWJyacOzIHF1ZSBlbCB1c28gZGUgcGFsYWJyYXMgY29tcGxldGFzIGVuIG5vbWJyZXMgZGUgdmFyaWFibGVzIGNvbmR1am8gYSB1biBwcm9tZWRpbyBkZSBjb21wcmVuc2nDs24gdW4gMTklIG3DoXMgcsOhcGlkbyBlbiBjb21wYXJhY2nDs24gY29uIGxldHJhcyB5IGFicmV2aWF0dXJhcy4gRW4gY29udHJhc3RlLCBbQmVuaTIwMTddIGRlc2N1YnJpw7MgcXVlIGVsIHVzbyBkZSBub21icmVzIGRlIHZhcmlhYmxlcyBkZSB1bmEgbGV0cmEgbm8gYWZlY3RhYmEgbGEgY2FwYWNpZGFkIGRlIGxvcyBwcmluY2lwaWFudGVzIHBhcmEgbW9kaWZpY2FyIGVsIGPDs2RpZ28uIEVzdG8gcHVlZGUgZGViZXJzZSBhIHF1ZSBzdXMgcHJvZ3JhbWFzIHNvbiBtw6FzIGNvcnRvcyBxdWUgbG9zIHByb2Zlc2lvbmFsZXMgbyBwb3JxdWUgYWxndW5vcyBub21icmVzIGRlIHZhcmlhYmxlcyBkZSB1bmEgc29sYSBsZXRyYSB0aWVuZW4gdGlwb3MgeSBzaWduaWZpY2Fkb3MgaW1wbMOtY2l0b3MuIFBvciBlamVtcGxvLCBsYSBtYXlvcsOtYSBkZSBsb3MgcHJvZ3JhbWFkb3JlcyBzdXBvbmVuIHF1ZSBpLCBqIHkgbiBzb24gZW50ZXJvcyB5IHF1ZSBzIGVzIHVuYSBjYWRlbmEsIG1pZW50cmFzIHF1ZSB4LCB5IHkgeiBzb24gbsO6bWVyb3MgZGUgcHVudG8gZmxvdGFudGUgbyBlbnRlcm9zIG3DoXMgbyBtZW5vcyBlcXVpdGF0aXZhbWVudGUuCgrCv1F1w6kgdGFuIGltcG9ydGFudGUgZXMgZXN0bz8gW0JpbmsyMDEyXSBpbmZvcm3DsyBxdWUgbGVlciB5IGNvbXByZW5kZXIgZWwgY8OzZGlnbyBlcyBmdW5kYW1lbnRhbG1lbnRlIGRpZmVyZW50ZSBkZSBsZWVyIGxhIHByb3NhOiDigJzigKYgbGEgZXN0cnVjdHVyYSBtw6FzIGZvcm1hbCB5IGxhIHNpbnRheGlzIGRlbCBjw7NkaWdvIGZ1ZW50ZSBwZXJtaXRlIGEgbG9zIHByb2dyYW1hZG9yZXMgYXNpbWlsYXIgeSBjb21wcmVuZGVyIHBhcnRlcyBkZWwgY8OzZGlnbyBjb24gYmFzdGFudGUgcmFwaWRleiBpbmRlcGVuZGllbnRlbWVudGUgZGVsIGVzdGlsby4gRW4gcGFydGljdWxhciAuLi4gbGFzIGJhbGl6YXMgeSBsb3MgcGxhbmVzIGRlIHByb2dyYW1hIGp1ZWdhbiB1biBwYXBlbCBpbXBvcnRhbnRlIGVuIGxhIGNvbXByZW5zacOzbiAiLiBUYW1iacOpbiBkZXNjdWJyacOzIHF1ZSBsb3MgZGVzYXJyb2xsYWRvcmVzIGV4cGVyaW1lbnRhZG9zIG5vIHNlIHZlbiBhZmVjdGFkb3MgcG9yIGVsIGVzdGlsbyBkZWwgaWRlbnRpZmljYWRvciwgcG9yIGxvIHF1ZSBudWVzdHJhIHJlY29tZW5kYWNpw7NuIGVzIHV0aWxpemFyIHVuIGVzdGlsbyBjb2hlcmVudGUgZW4gdG9kb3MgbG9zIGVqZW1wbG9zLiBEYWRvIHF1ZSBsYSBtYXlvcsOtYSBkZSBsb3MgaWRpb21hcyB0aWVuZW4gZ3XDrWFzIGRlIGVzdGlsbyAocG9yIGVqZW1wbG8sIFBFUCA4IHBhcmEgUHl0aG9uKSB5IGhlcnJhbWllbnRhcyBwYXJhIHZlcmlmaWNhciBxdWUgZWwgY8OzZGlnbyBzaWdhIGVzdGFzIHBhdXRhcywgbnVlc3RyYSByZWNvbWVuZGFjacOzbiBjb21wbGV0YSBlcyB1c2FyIGhlcnJhbWllbnRhcyBwYXJhIGdhcmFudGl6YXIgcXVlIHRvZG9zIGxvcyBlamVtcGxvcyBkZSBjw7NkaWdvIHNlIGFkaGllcmFuIGEgdW4gZXN0aWxvIGNvbnNpc3RlbnRlLgoKIyMgwr9BeXVkYW4gbG9zIG1lam9yZXMgbWVuc2FqZXMgZGUgZXJyb3I/CkxvcyBtZW5zYWplcyBkZSBlcnJvciBpbmNvbXByZW5zaWJsZXMgc29uIHVuYSBmdWVudGUgaW1wb3J0YW50ZSBkZSBmcnVzdHJhY2nDs24gcGFyYSBsb3MgcHJpbmNpcGlhbnRlcyAoeSB0YW1iacOpbiBwYXJhIHByb2dyYW1hZG9yZXMgZXhwZXJpbWVudGFkb3MpLiBQb3IgbG8gdGFudG8sIHZhcmlvcyBpbnZlc3RpZ2Fkb3JlcyBoYW4gZXhwbG9yYWRvIHNpIG1lam9yZXMgbWVuc2FqZXMgZGUgZXJyb3IgYXl1ZGFyw61hbiBhIGFsaXZpYXIgZXN0by4gUG9yIGVqZW1wbG8sIFtCZWNrMjAxNl0gcmVlc2NyaWJpw7MgYWxndW5vcyBkZSBsb3MgbWVuc2FqZXMgZGVsIGNvbXBpbGFkb3IgZGUgSmF2YSBwYXJhIHF1ZSBlbiBsdWdhciBkZToKCiAgICBDOlxzdGpcSGVsbG8uamF2YToyOiBlcnJvcjogY2Fubm90IGZpbmQgc3ltYm9sCiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKHN0cmluZ1sgXSBhcmdzKQogICAgXgogICAgMSBlcnJvcgogICAgUHJvY2VzcyB0ZXJtaW5hdGVkIC4uLiB0aGVyZSB3ZXJlIHByb2JsZW1zLgogICAgbGVhcm5lcnMgd291bGQgc2VlOgogICAgCiAgICBMb29rcyBsaWtlIGEgcHJvYmxlbSBvbiBsaW5lIG51bWJlciAyLgogICAgSWYgInN0cmluZyIgcmVmZXJzIHRvIGEgZGF0YXR5cGUsIGNhcGl0YWxpemUgdGhlICdzJyEKICAgIApFZmVjdGl2YW1lbnRlLCBsb3Mgbm92YXRvcyBxdWUgcmVjaWJpZXJvbiBlc3RvcyBtZW5zYWplcyBjb21ldGllcm9uIG1lbm9zIGVycm9yZXMgcmVwZXRpZG9zIHkgbWVub3MgZXJyb3JlcyBlbiBnZW5lcmFsLgoKW0JhcmkyMDE3XSBmdWUgbcOhcyBhbGzDoSB5IHV0aWxpesOzIGVsIHNlZ3VpbWllbnRvIG9jdWxhciBwYXJhIG1vc3RyYXIgcXVlIGEgcGVzYXIgZGUgbGFzIHF1ZWphcyBkZSBsb3MgZXNjcml0b3JlcyBkZSBjb21waWxhZG9yZXMsIGxhcyBwZXJzb25hcyByZWFsbWVudGUgbGVlbiBsb3MgbWVuc2FqZXMgZGUgZXJyb3I7IGRlIGhlY2hvLCBwYXNhbiBkZWwgMTMgYWwgMjUlIGRlIHN1IHRpZW1wbyBoYWNpZW5kbyBlc3RvLiBTaW4gZW1iYXJnbywgbGVlciBtZW5zYWplcyBkZSBlcnJvciByZXN1bHRhIHNlciB0YW4gZGlmw61jaWwgY29tbyBsZWVyIGVsIGPDs2RpZ28gZnVlbnRlLCB5IGxvIGRpZsOtY2lsIHF1ZSBlcyBsZWVyIGxvcyBtZW5zYWplcyBkZSBlcnJvciBwcmVkaWNlIGZ1ZXJ0ZW1lbnRlIGVsIHJlbmRpbWllbnRvIGRlIGxhIHRhcmVhLiBQb3IgbG8gdGFudG8sIGxvcyBtYWVzdHJvcyBkZWJlbiBtb3N0cmFyIGEgbG9zIGFsdW1ub3MgY8OzbW8gbGVlciBlIGludGVycHJldGFyIGxvcyBtZW5zYWplcyBkZSBlcnJvci4gW01hcmMyMDExXSB0aWVuZSB1bmEgcsO6YnJpY2EgcGFyYSBsYXMgcmVzcHVlc3RhcyBhIGxvcyBtZW5zYWplcyBkZSBlcnJvciBxdWUgcHVlZGVuIHNlciDDunRpbGVzIHBhcmEgY2FsaWZpY2FyIHRhbGVzIGVqZXJjaWNpb3MuCgoKIyMgwr9BeXVkYSBsYSB2aXN1YWxpemFjacOzbj8KVmlzdWFsaXphciBsYSBlamVjdWNpw7NuIGRlbCBwcm9ncmFtYSBlcyB1bmEgaWRlYSBjYWRhIHZleiBtw6FzIHBvcHVsYXIsIHkgbGFzIGhlcnJhbWllbnRhcyBjb21vIGVsIFR1dG9yIGRlIFB5dGhvbiBlbiBsw61uZWEgW0d1bzIwMTNdIHkgTG91cGUgKHF1ZSBtdWVzdHJhIGPDs21vIGZ1bmNpb25hIGVsIGJ1Y2xlIGRlIGV2ZW50b3MgZGUgSmF2YVNjcmlwdCkgc29uIMO6dGlsZXMgcGFyYSBsYSBlbnNlw7FhbnphLiBTaW4gZW1iYXJnbywgbGFzIHBlcnNvbmFzIGFwcmVuZGVuIG3DoXMgZGUgbGEgY29uc3RydWNjacOzbiBkZSB2aXN1YWxpemFjaW9uZXMgcXVlIGRlIGxhIHZpc3VhbGl6YWNpw7NuIGRlIHZpc3VhbGl6YWNpb25lcyBjb25zdHJ1aWRhcyBwb3Igb3Ryb3MsIFtTdGFzMTk5OCwgQ2V0aTIwMTZdIGVudG9uY2VzLCDCv2xhIHZpc3VhbGl6YWNpw7NuIHJlYWxtZW50ZSBheXVkYSBhbCBhcHJlbmRpemFqZT8KClBhcmEgcmVzcG9uZGVyIGEgZXN0bywgW0N1bm4yMDE3XSByZXBsaWPDsyB1biBlc3R1ZGlvIGFudGVyaW9yIGRlIGxvcyB0aXBvcyBkZSBib2NldG9zIHF1ZSBsb3MgYWx1bW5vcyBoYWNlbiBhbCByYXN0cmVhciBsYSBlamVjdWNpw7NuIGRlbCBjw7NkaWdvLiBEZXNjdWJyaWVyb24gcXVlIG5vIGRpYnVqYXIgZW4gYWJzb2x1dG8gc2UgY29ycmVsYWNpb25hIGNvbiB1biBtZW5vciDDqXhpdG8sIG1pZW50cmFzIHF1ZSBlbCBzZWd1aW1pZW50byBkZSBsb3MgY2FtYmlvcyBlbiBsb3MgdmFsb3JlcyBkZSBsYXMgdmFyaWFibGVzIGVzY3JpYmllbmRvIG51ZXZvcyB2YWxvcmVzIGNlcmNhIGRlIHN1cyBub21icmVzIGEgbWVkaWRhIHF1ZSBjYW1iaWFuIGVyYSBsYSBlc3RyYXRlZ2lhIG3DoXMgZWZlY3RpdmEuCgpVbiBwb3NpYmxlIGVmZWN0byBkZSBjb25mdXNpw7NuIHF1ZSB2ZXJpZmljYXJvbiBmdWUgZWwgdGllbXBvOiBkYWRvIHF1ZSBsb3MgZGlidWphbnRlcyB0YXJkYW4gc2lnbmlmaWNhdGl2YW1lbnRlIG3DoXMgdGllbXBvIGVuIHJlc29sdmVyIHByb2JsZW1hcywgwr9sbyBoYWNlbiBtZWpvciBzb2xvIHBvcnF1ZSBwaWVuc2FuIHBvciBtw6FzIHRpZW1wbz8gTGEgcmVzcHVlc3RhIGVzIG5vOiBubyBodWJvIGNvcnJlbGFjacOzbiBlbnRyZSBlbCB0aWVtcG8gbmVjZXNhcmlvIHkgZWwgcHVudGFqZSBhbGNhbnphZG8uIFBvciBsbyB0YW50bywgbnVlc3RyYSByZWNvbWVuZGFjacOzbiBlcyBlbnNlw7FhciBhIGxvcyBhbHVtbm9zIGEgcmFzdHJlYXIgbG9zIHZhbG9yZXMgZGUgbGFzIHZhcmlhYmxlcyBhbCBkZXB1cmFyLgoKPioqRGlhZ3JhbWFzIGRlIGZsdWpvKioKPgo+VW4gaGFsbGF6Z28gcXVlIGEgbWVudWRvIHNlIHBhc2EgcG9yIGFsdG8gc29icmUgbGEgdmlzdWFsaXphY2nDs24gZXMgcXVlIGxhcyBwZXJzb25hcyBlbnRpZW5kZW4gbG9zIGRpYWdyYW1hcyBkZSBmbHVqbyBtZWpvciBxdWUgZWwgcHNldWRvY8OzZGlnbyBzaSBhbWJvcyBlc3TDoW4gaWd1YWxtZW50ZSBiaWVuIGVzdHJ1Y3R1cmFkb3MgW1NjYW4xOTg5XS4gVHJhYmFqb3MgYW50ZXJpb3JlcyBxdWUgbXVlc3RyYW4gcXVlIGxvcyBkaWFncmFtYXMgZGUgZmx1am8gc3VwZXJhZG9zIGVuIGVsIHBzZXVkb2PDs2RpZ28gdXRpbGl6YXJvbiBwc2V1ZG9jw7NkaWdvIGVzdHJ1Y3R1cmFkbyB5IGRpYWdyYW1hcyBkZSBmbHVqbyBlbnJlZGFkb3M7IEN1YW5kbyBzZSBuaXZlbGFiYSBlbCBjYW1wbyBkZSBqdWVnbywgYSBsb3Mgbm92YXRvcyBsZXMgaWJhIG1lam9yIGNvbiBsYSByZXByZXNlbnRhY2nDs24gZ3LDoWZpY2EuCgojIyDCv1F1w6kgbcOhcyBwb2RlbW9zIGhhY2VyIHBhcmEgYXl1ZGFyPwpbVmloYTIwMTRdIGV4YW1pbsOzIGxhIG1lam9yYSBwcm9tZWRpbyBlbiBsYXMgdGFzYXMgZGUgYXByb2JhY2nDs24gZGUgdmFyaW9zIHRpcG9zIGRlIGludGVydmVuY2nDs24gZW4gbGFzIGNsYXNlcyBkZSBwcm9ncmFtYWNpw7NuLiBTZcOxYWxhbiBxdWUgaGF5IG11Y2hhcyByYXpvbmVzIHBhcmEgdG9tYXIgc3VzIGNvbmNsdXNpb25lcyBjb24gdW4gZ3Jhbm8gZGUgc2FsOiBsYXMgcHLDoWN0aWNhcyBkZSBlbnNlw7FhbnphIHByZXZpYXMgYWwgY2FtYmlvIHJhcmEgdmV6IHNlIGVzdGFibGVjZW4gY2xhcmFtZW50ZSwgbGEgY2FsaWRhZCBkZWwgY2FtYmlvIG5vIHNlIGp1emdhLCB5IHNvbG8gZWwgOC4zJSBkZSBsb3MgZXN0dWRpb3MgaW5mb3JtYXJvbiByZXN1bHRhZG9zIG5lZ2F0aXZvcywgcG9yIGxvIHF1ZSBlcyBwb3NpdGl2byBlbCBzZXNnbyBkZSBpbmZvcm1lcyBvIGxhIGZvcm1hIGVuIHF1ZSBlbnNlw7FhbW9zIGVuIGVzdGUgbW9tZW50byBlcyBsbyBwZW9yIHBvc2libGUgeSBjdWFscXVpZXIgY29zYSBzZXLDrWEgdW5hIG1lam9yYS4gWSBjb21vIG11Y2hvcyBvdHJvcyBlc3R1ZGlvcyBkaXNjdXRpZG9zIGVuIGVzdGUgY2Fww610dWxvLCBzb2xvIGVzdGFiYW4gdmllbmRvIGNsYXNlcyB1bml2ZXJzaXRhcmlhcywgcG9yIGxvIHF1ZSBzdXMgaGFsbGF6Z29zIHB1ZWRlbiBubyBnZW5lcmFsaXphcnNlIGEgb3Ryb3MgZ3J1cG9zLgoKQ29uIGVzYXMgYWR2ZXJ0ZW5jaWFzIGVuIG1lbnRlLCBlbmNvbnRyYXJvbiBkaWV6IGNvc2FzIHF1ZSBsb3MgbWFlc3Ryb3MgcHVlZGVuIGhhY2VyIHBhcmEgbWVqb3JhciBsb3MgcmVzdWx0YWRvcyAoRmlndXJhIFtmOiBwY2staW50ZXJ2ZW5jaW9uZXNdKToKCioqQ29sYWJvcmFjacOzbjoqKiBBY3RpdmlkYWRlcyBxdWUgZm9tZW50YW4gbGEgY29sYWJvcmFjacOzbiBkZSBsb3MgYWx1bW5vcywgeWEgc2VhIGVuIGF1bGFzIG8gbGFib3JhdG9yaW9zLgoKKipDYW1iaW8gZGUgY29udGVuaWRvOioqIFNlIG1vZGlmaWNhcm9uIG8gYWN0dWFsaXphcm9uIHBhcnRlcyBkZWwgbWF0ZXJpYWwgZGlkw6FjdGljby4KCioqQ29udGV4dHVhbGl6YWNpw7NuOioqIEVsIGNvbnRlbmlkbyB5IGxhcyBhY3RpdmlkYWRlcyBkZWwgY3Vyc28gc2UgYWxpbmVhcm9uIGNvbiB1biBjb250ZXh0byBlc3BlY8OtZmljbywgY29tbyBqdWVnb3MgbyBtZWRpb3MuCgoqKkNTMDoqKiBDcmVhY2nDs24gZGUgdW4gY3Vyc28gcHJlbGltaW5hciBhIHRvbWFyIGFudGVzIGRlbCBjdXJzbyBpbnRyb2R1Y3RvcmlvIGRlIHByb2dyYW1hY2nDs247IHBvZHLDrWEgb3JnYW5pemFyc2Ugc29sbyBwYXJhIGFsZ3Vub3MgKHBvciBlamVtcGxvLCBlc3R1ZGlhbnRlcyBlbiByaWVzZ28pLgoKKipUZW1hIGRlbCBqdWVnbzoqKiBTZSBpbnRyb2R1am8gdW4gY29tcG9uZW50ZSB0ZW3DoXRpY28gZGVsIGp1ZWdvIGVuIGVsIGN1cnNvLgoKKipTaXN0ZW1hIGRlIGNsYXNpZmljYWNpw7NuOioqIFVuIGNhbWJpbyBlbiBlbCBlc3F1ZW1hIGRlIGNhbGlmaWNhY2nDs24sIGNvbW8gYXVtZW50YXIgZWwgcGVzbyBkZSBsYXMgYWN0aXZpZGFkZXMgZGUgcHJvZ3JhbWFjacOzbiB5IHJlZHVjaXIgZWwgcGVzbyBkZWwgZXhhbWVuLgoKKipUcmFiYWpvIGVuIGVxdWlwbzoqKiBBY3RpdmlkYWRlcyBjb24gdW4gbWF5b3IgY29tcHJvbWlzbyBkZSB0cmFiYWpvIGVuIGdydXBvLCBjb21vIGVsIGFwcmVuZGl6YWplIGVuIGVxdWlwbyB5IGVsIGFwcmVuZGl6YWplIGNvb3BlcmF0aXZvLgoKKipDb21wdXRhY2nDs24gZGUgbWVkaW9zOioqIEFjdGl2aWRhZGVzIHF1ZSBkZWNsYXJhbiBleHBsw61jaXRhbWVudGUgZWwgdXNvIGRlIGxhIGNvbXB1dGFjacOzbiBkZSBtZWRpb3MgKENhcMOtdHVsbyAxMCkuCgoqKkFwb3lvIGRlIGxvcyBjb21wYcOxZXJvczoqKiBBcG95byBkZSBwYXJlcyBlbiBmb3JtYSBkZSBwYXJlcywgZ3J1cG9zLCB0dXRvcmVzIG8gdHV0b3JlcyBwYXJlcyBjb250cmF0YWRvcy4KCioqT3RybyBhcG95bzoqKiBVbiB0w6lybWlubyBnZW5lcmFsIHBhcmEgdG9kYXMgbGFzIGFjdGl2aWRhZGVzIGRlIGFwb3lvLCBwLiBhdW1lbnRvIGRlIGhvcmFzIGRvY2VudGVzLCBjYW5hbGVzIGRlIHNvcG9ydGUgYWRpY2lvbmFsZXMsIGV0Yy4KCiFbw65udGVydmVudGlvbl0oLi9pbWdfdHJhbmluZy9pbnRlcnZlbnRpb25zLXNjYWxlZC5wbmcpCgoKRXN0YSBsaXN0YSBkZXN0YWNhIGxhIGltcG9ydGFuY2lhIGRlbCBhcHJlbmRpemFqZSBjb29wZXJhdGl2by4gW0JlY2syMDEzXSBhbmFsaXrDsyBlc3RvIGVzcGVjw61maWNhbWVudGUgZHVyYW50ZSB0cmVzIGHDsW9zIGFjYWTDqW1pY29zIGVuIGN1cnNvcyBpbXBhcnRpZG9zIHBvciBkb3MgbWFlc3Ryb3MgZGlmZXJlbnRlcyB5IGVuY29udHLDsyBiZW5lZmljaW9zIHNpZ25pZmljYXRpdm9zIGVuIGdlbmVyYWwgeSBwYXJhIG11Y2hvcyBzdWJncnVwb3MuIExvcyBjb29wZXJhZG9yZXMgb2J0dXZpZXJvbiBjYWxpZmljYWNpb25lcyBtw6FzIGFsdGFzIHkgZGVqYXJvbiBtZW5vcyBwcmVndW50YXMgZW4gYmxhbmNvIGVuIGVsIGV4YW1lbiBmaW5hbCwgbG8gcXVlIGluZGljYSB1bmEgbWF5b3IgYXV0b2VmaWNhY2lhIHkgZGlzcG9zaWNpw7NuIHBhcmEgdHJhdGFyIGRlIGRlcHVyYXIgbGFzIGNvc2FzLgoKPioqQ29tcHV0YWNpw7NuIHNpbiBjb2RpZmljYWNpw7NuKioKPgo+RXNjcmliaXIgY8OzZGlnbyBubyBlcyBsYSDDum5pY2EgZm9ybWEgZGUgZW5zZcOxYXIgYSBsYXMgcGVyc29uYXMgY8OzbW8gcHJvZ3JhbWFyOiBoYWNlciBxdWUgbG9zIG5vdmF0b3MgdHJhYmFqZW4gZW4gZWplcmNpY2lvcyBkZSBjcmVhdGl2aWRhZCBjb21wdXRhY2lvbmFsIG1lam9yYSBsYXMgY2FsaWZpY2FjaW9uZXMgZW4gdmFyaW9zIG5pdmVsZXMgW1NoZWwyMDE3XS4gVW4gZWplcmNpY2lvIHTDrXBpY28gZXMgZGVzY3JpYmlyIHVuIG9iamV0byBjb3RpZGlhbm8gKGNvbW8gdW4gY2xpcCBvIHVuIGNlcGlsbG8gZGUgZGllbnRlcykgZW4gdMOpcm1pbm9zIGRlIHN1cyBlbnRyYWRhcywgc2FsaWRhcyB5IGZ1bmNpb25lcy4gRXN0ZSB0aXBvIGRlIGVuc2XDsWFuemEgYSB2ZWNlcyBzZSBsbGFtYSBkZXNjb25lY3RhZG87IEVsIHNpdGlvIENTIFVucGx1Z2dlZCB0aWVuZSBsZWNjaW9uZXMgeSBlamVyY2ljaW9zIHBhcmEgaGFjZXJsby4KCiMjIMK/RMOzbmRlIHNpZ3VlPwpQYXJhIGFxdWVsbG9zIHF1ZSBxdWllcmVuIHByb2Z1bmRpemFyLCBbRmluYzIwMTldIGVzIHVuIHJlc3VtZW4gY29tcGxldG8gZGUgQ0VSLCBbSWhhbjIwMTZdIHJlc3VtZSBsb3MgbcOpdG9kb3MgcXVlIGxvcyBlc3R1ZGlvcyB1c2FuIGNvbiBtw6FzIGZyZWN1ZW5jaWEuIEVzcGVybyBxdWUgYWxnw7puIGTDrWEgdGVuZ2Ftb3MgY2F0w6Fsb2dvcyBjb21vIFtPam9zMjAxNV0geSBtw6FzIG1hdGVyaWFsZXMgZGUgY2FwYWNpdGFjacOzbiBwYXJhIG1hZXN0cm9zIGNvbW8gW0hhenoyMDE0LCBHdXpkMjAxNWEsIFNlbnQyMDE4XSBwYXJhIGF5dWRhcm5vcyBhIHRvZG9zIGEgaGFjZXJsbyBtZWpvci4KCkxhIG1heW9yIHBhcnRlIGRlIGxhIGludmVzdGlnYWNpw7NuIHJlcG9ydGFkYSBlbiBlc3RlIGNhcMOtdHVsbyBmdWUgZmluYW5jaWFkYSBww7pibGljYW1lbnRlIHBlcm8gZXN0w6EgZW5jZXJyYWRhIGRldHLDoXMgZGUgbG9zIG11cm9zIGRlIHBhZ286IHN1cHVzZSBxdWUgdmlvbMOpIGxhIGxleSAyNTAgdmVjZXMgcGFyYSBkZXNjYXJnYXIgZG9jdW1lbnRvcyBkZSBzaXRpb3MgY29tbyBTY2ktSHViIG1pZW50cmFzIGVzY3JpYsOtYSBlc3RlIGxpYnJvLiBFc3Blcm8gcXVlIGxsZWd1ZSBlbCBkw61hIGVuIHF1ZSBuYWRpZSB0ZW5nYSBxdWUgaGFjZXIgZXNvOyBTaSBlcmVzIHVuIGludmVzdGlnYWRvciwgYWNlbGVyYSBlc2UgZMOtYSBwdWJsaWNhbmRvIHR1IHRyYWJham8gZW4gbHVnYXJlcyBkZSBhY2Nlc28gYWJpZXJ0by4KCiMjIEVqZXJjaWNpb3MKCiMjIyBNYWxlbnRlbmRpZG9zIGRlIHN1cyBhbHVtbm9zIChncnVwb3MgcGVxdWXDsW9zIC8gMTUpClRyYWJhamFuZG8gZW4gZ3J1cG9zIHBlcXVlw7FvcywgdnVlbHZhIGEgbGVlciBsYSBTZWNjacOzbiA3LjMgeSBoYWdhIHVuYSBsaXN0YSBkZSBjb25jZXB0b3MgZXJyw7NuZW9zIHF1ZSBjcmVlIHF1ZSB0aWVuZW4gc3VzIGFsdW1ub3MuIMK/UXXDqSB0YW4gZXNwZWPDrWZpY29zIHNvbj8gwr9Dw7NtbyB2ZXJpZmljYXLDrWEgcXXDqSB0YW4gcHJlY2lzYSBlcyBzdSBsaXN0YT8KCiMjIyBDb21wcm9iYWNpw7NuIGRlIGVycm9yZXMgY29tdW5lcyAoaW5kaXZpZHVhbCAvIDIwKQpFc3RvcyBlcnJvcmVzIGNvbXVuZXMgc2UgdG9tYW4gZGUgdW5hIGxpc3RhIG3DoXMgbGFyZ2EgZW4gW1NpcmsyMDEyXToKCioqQXNpZ25hY2nDs24gaW52ZXJ0aWRhOioqIEVsIGFsdW1ubyBhc2lnbmEgZWwgdmFsb3IgZGUgbGEgdmFyaWFibGUgZGUgbGEgaXpxdWllcmRhIGEgbGEgdmFyaWFibGUgZGUgbGEgZGVyZWNoYSBlbiBsdWdhciBkZSBhbCByZXbDqXMuCgoqKlJhbWEgZXF1aXZvY2FkYToqKiBFbCBhbHVtbm8gcGllbnNhIHF1ZSBlbCBjw7NkaWdvIGVuIGVsIGN1ZXJwbyBkZSB1biBpZiBzZSBlamVjdXRhIGluY2x1c28gc2kgbGEgY29uZGljacOzbiBlcyBmYWxzYS4KCioqRnVuY2nDs24gZGUgZWplY3VjacOzbiBlbiBsdWdhciBkZSBkZWZpbmlybGE6KiogRWwgYWx1bW5vIGNyZWUgcXVlIHVuYSBmdW5jacOzbiBzZSBlamVjdXRhIGNvbW8gc2UgZGVmaW5lLgoKRXNjcmliYSB1biBlamVyY2ljaW8gcGFyYSBjYWRhIHVubyBwYXJhIHZlcmlmaWNhciBxdWUgbG9zIGFsdW1ub3Mgbm8gZXN0w6luIGNvbWV0aWVuZG8gZXNlIGVycm9yLgoKIyMjIEPDs2RpZ28gZGVzdHJvemFkbyAocGFyZXMgLyAxNSkKCltDaGVuMjAxN10gZGVzY3JpYmUgZWplcmNpY2lvcyBlbiBsb3MgcXVlIGxvcyBhbHVtbm9zIHJlY29uc3RydXllbiBlbCBjw7NkaWdvIHF1ZSBoYSBzaWRvIGRlc3Ryb3phZG8gYWwgZWxpbWluYXIgY29tZW50YXJpb3MsIGVsaW1pbmFyIG8gcmVlbXBsYXphciBsw61uZWFzIGRlIGPDs2RpZ28sIGzDrW5lYXMgbcOzdmlsZXMsIGV0Yy4gRWwgcmVuZGltaWVudG8gZW4gZXN0b3Mgc2UgY29ycmVsYWNpb25hIGZ1ZXJ0ZW1lbnRlIGNvbiBlbCByZW5kaW1pZW50byBlbiBsYXMgZXZhbHVhY2lvbmVzIGVuIGxhcyBxdWUgbG9zIGFsdW1ub3MgZXNjcmliZW4gY8OzZGlnbywgcGVybyBlc3RhcyBwcmVndW50YXMgcmVxdWllcmVuIG1lbm9zIHRyYWJham8gcGFyYSBtYXJjYXIuIExsZXZlIGxhIHNvbHVjacOzbiBhIHVuIGVqZXJjaWNpbyBkZSBwcm9ncmFtYWNpw7NuIHF1ZSBoYXlhIGNyZWFkbyBlbiBlbCBwYXNhZG8sIG1hbmlww7psZWxvIGRlIGRvcyBtYW5lcmFzIGRpZmVyZW50ZXMsIGludGVyY2FtYmllIGNvbiB1biBjb21wYcOxZXJvIHkgdmVhIGN1w6FudG8gdGllbXBvIGxlIGxsZXZhIGEgY2FkYSB1bm8gcmVzcG9uZGVyIGNvcnJlY3RhbWVudGUgYSBsYSBwcmVndW50YSBkZWwgb3Ryby4KCiMjIyBFbCBwcm9ibGVtYSBkZSBsYSBsbHV2aWEgKHBhcmVzIC8gMTApCltTb2xvMTk4Nl0gaW50cm9kdWpvIGVsIHByb2JsZW1hIGRlIGxhIGxsdXZpYSwgcXVlIHNlIGhhIHV0aWxpemFkbyBlbiBtdWNob3MgZXN0dWRpb3MgcG9zdGVyaW9yZXMgZGUgcHJvZ3JhbWFjacOzbiBbRmlzbDIwMTQsIFNpbW8yMDEzLCBTZXBwMjAxNV0uIEVzY3JpYmEgdW4gcHJvZ3JhbWEgcXVlIGxlYSByZXBldGlkYW1lbnRlIGVuIGVudGVyb3MgcG9zaXRpdm9zIGhhc3RhIHF1ZSBsZWEgZWwgbsO6bWVybyBlbnRlcm8gOTk5OTkuIERlc3B1w6lzIGRlIHZlciA5OTk5OSwgZWwgcHJvZ3JhbWEgaW1wcmltZSBlbCBwcm9tZWRpbyBkZSBsb3MgbsO6bWVyb3MgdmlzdG9zLgoKMS4gUmVzdWVsdmUgZWwgcHJvYmxlbWEgZGUgbGEgbGx1dmlhIGVuIGVsIGxlbmd1YWplIGRlIHByb2dyYW1hY2nDs24gcXVlIGVsaWphcy4KCjIuIENvbXBhcmUgc3Ugc29sdWNpw7NuIGNvbiBsYSBkZSBzdSBjb21wYcOxZXJvLiDCv1F1w6kgaGFjZSBlbCB0dXlvIHF1ZSBlbCBzdXlvIG5vIHkgdmljZXZlcnNhPwoKIyMjIFJvbGVzIGRlIHZhcmlhYmxlcyAocGFyZXMgLyAxNSkKW0t1aXQyMDA0LCBCeWNrMjAwNSwgU2FqYTIwMDZdIHByZXNlbnTDsyB1biBjb25qdW50byBkZSBwYXRyb25lcyBkZSB1bmEgc29sYSB2YXJpYWJsZSBxdWUgaGUgZW5jb250cmFkbyBtdXkgw7p0aWwgZW4gbGEgZW5zZcOxYW56YSBkZSBwcmluY2lwaWFudGVzOgoKKipWYWxvciBmaWpvOioqIFVuIGVsZW1lbnRvIGRlIGRhdG9zIHF1ZSBubyBvYnRpZW5lIHVuIG51ZXZvIHZhbG9yIGFkZWN1YWRvIGRlc3B1w6lzIGRlIHN1IGluaWNpYWxpemFjacOzbi4KCioqUGFzbyBhIHBhc286KiogIFVuIGVsZW1lbnRvIGRlIGRhdG9zIHF1ZSBwYXNhIHBvciB1bmEgc3VjZXNpw7NuIGRlIHZhbG9yZXMgc2lzdGVtw6F0aWNhIHkgcHJlZGVjaWJsZS4KCioqQ2FtaW5hbnRlOioqIFVuIGVsZW1lbnRvIGRlIGRhdG9zIHF1ZSBhdHJhdmllc2EgdW5hIGVzdHJ1Y3R1cmEgZGUgZGF0b3MuCgoqKlRpdHVsYXIgbcOhcyByZWNpZW50ZToqKiBVbiBlbGVtZW50byBkZSBkYXRvcyBxdWUgY29udGllbmUgZWwgw7psdGltbyB2YWxvciBlbmNvbnRyYWRvIGFsIHBhc2FyIHBvciB1bmEgc3VjZXNpw7NuIGRlIHZhbG9yZXMuCgoqKlRpdHVsYXIgbcOhcyBidXNjYWRvOioqIFVuIGVsZW1lbnRvIGRlIGRhdG9zIHF1ZSBjb250aWVuZSBlbCBtZWpvciBvIG3DoXMgYXByb3BpYWRvIHZhbG9yIGVuY29udHJhZG8gaGFzdGEgYWhvcmEuCgoqKlJlY29sZWN0b3I6KiogVW4gZWxlbWVudG8gZGUgZGF0b3MgcXVlIGFjdW11bGEgZWwgZWZlY3RvIGRlIHZhbG9yZXMgaW5kaXZpZHVhbGVzLgoKKipTZWd1aWRvcjoqKiBVbiBlbGVtZW50byBkZSBkYXRvcyBxdWUgc2llbXByZSBvYnRpZW5lIHN1IG51ZXZvIHZhbG9yIGRlbCB2YWxvciBhbnRlcmlvciBkZSBhbGfDum4gb3RybyBlbGVtZW50byBkZSBkYXRvcy4KCioqQmFuZGVyYSB1bmlkaXJlY2Npb25hbDoqKiBVbiBlbGVtZW50byBkZSBkYXRvcyBkZSBkb3MgdmFsb3JlcyBxdWUgbm8gcHVlZGUgb2J0ZW5lciBzdSB2YWxvciBpbmljaWFsIHVuYSB2ZXogcXVlIHNlIGhhIGNhbWJpYWRvIGVsIHZhbG9yLgoKKipUZW1wb3JhbDoqKiBVbiBlbGVtZW50byBkZSBkYXRvcyBxdWUgdGllbmUgYWxnw7puIHZhbG9yIHNvbG8gcG9yIHVuIHRpZW1wbyBtdXkgY29ydG8uCgoqKk9yZ2FuaXphZG9yOioqIFVuYSBlc3RydWN0dXJhIGRlIGRhdG9zIHF1ZSBhbG1hY2VuYSBlbGVtZW50b3MgcXVlIHNlIHB1ZWRlbiByZW9yZ2FuaXphci4KCioqRW52YXNlOioqIFVuYSBlc3RydWN0dXJhIGRlIGRhdG9zIHF1ZSBhbG1hY2VuYSBlbGVtZW50b3MgcXVlIHNlIHB1ZWRlbiBhZ3JlZ2FyIHkgZWxpbWluYXIuCgpFbGlqYSB1biBwcm9ncmFtYSBkZSA14oCTMTUgbMOtbmVhcyB5IGNsYXNpZmlxdWUgc3VzIHZhcmlhYmxlcyB1c2FuZG8gZXN0YXMgY2F0ZWdvcsOtYXMuIENvbXBhcmEgdHVzIGNsYXNpZmljYWNpb25lcyBjb24gbGFzIGRlIHVuIGNvbXBhw7Flcm8uIEN1YW5kbyBubyBlc3R1dmllcm9uIGRlIGFjdWVyZG8sIMK/ZW50ZW5kaWVyb24gbGEgb3BpbmnDs24gZGVsIG90cm8/CgoKCiMjIyDCv1F1w6kgZXN0w6FzIGVuc2XDsWFuZG8/IChpbmRpdmlkdWFsIC8gMTApCkNvbXBhcmUgbG9zIHRlbWFzIHF1ZSBlbnNlw7FhIGNvbiBsYSBsaXN0YSBkZXNhcnJvbGxhZGEgZW4gW0x1eHQyMDE3XSAoU2VjY2nDs24gNy4xKS4gwr9RdcOpIHRlbWFzIGN1YnJlbj8gwr9DdcOhbCBubyBjdWJyZXM/IMK/UXXDqSB0ZW1hcyBhZGljaW9uYWxlcyBjdWJyZSBxdWUgbm8gZXN0w6FuIGVuIHN1IGxpc3RhPwoKIyMjIEFjdGl2aWRhZGVzIGJlbmVmaWNpb3NhcyAoaW5kaXZpZHVhbCAvIDEwKQpNaXJlIGxhIGxpc3RhIGRlIGludGVydmVuY2lvbmVzIGRlc2Fycm9sbGFkYXMgcG9yIFtWaWhhMjAxNF0gKFNlY2Npw7NuIDcuMTApLiDCv0N1w6FsIGRlIGVzdGFzIGNvc2FzIHlhIGhhY2VzIGVuIHR1cyBjbGFzZXM/IMK/Q3XDoWxlcyBwb2Ryw61hcyBhZ3JlZ2FyIGbDoWNpbG1lbnRlPyDCv0N1w6FsZXMgc29uIGlycmVsZXZhbnRlcz8KCiMjIyBDb25jZXB0b3MgZXJyw7NuZW9zIHkgZGVzYWbDrW9zIChncnVwb3MgcGVxdWXDsW9zIC8gMTUpCkVsIHNpdGlvIGRlIERlc2Fycm9sbG8gUHJvZmVzaW9uYWwgcGFyYSBsYSBFbnNlw7FhbnphIGRlIFByaW5jaXBpb3MgZGUgQ1MgaW5jbHV5ZSB1bmEgbGlzdGEgZGV0YWxsYWRhIGRlIGxhcyBpZGVhcyB5IGVqZXJjaWNpb3MgZXJyw7NuZW9zIGRlIGxvcyBhbHVtbm9zLiBUcmFiYWphbmRvIGVuIGdydXBvcyBwZXF1ZcOxb3MsIGVsaWphIHVuYSBzZWNjacOzbiAoY29tbyBlc3RydWN0dXJhcyBkZSBkYXRvcyBvIGZ1bmNpb25lcykgeSByZXZpc2Ugc3UgbGlzdGEuIMK/Q3XDoWwgZGUgZXN0b3MgY29uY2VwdG9zIGVycsOzbmVvcyByZWN1ZXJkYSBoYWJlciB0ZW5pZG8gY3VhbmRvIGVyYSB1biBhbHVtbm8/IMK/Q3XDoWwgdGllbmVzIHRvZGF2w61hPyDCv1F1w6kgaGFzIHZpc3RvIGVuIHR1cyBhbHVtbm9zPwoKIyMjIMK/UXXDqSBlcyBsbyBxdWUgbcOhcyB0ZSBpbXBvcnRhPyAodG9kYSBsYSBjbGFzZSAvIDE1KQpbRGVubjIwMTldIHBpZGnDsyBhIGxhcyBwZXJzb25hcyBxdWUgcHJvcG9uZ2FuIHkgY2FsaWZpcXVlbiB2YXJpYXMgcHJlZ3VudGFzIGRlIENFUiwgeSBkZXNjdWJyaWVyb24gcXVlIG5vIGhhYsOtYSBzdXBlcnBvc2ljacOzbiBlbnRyZSBsYXMgcXVlIG3DoXMgbGVzIGltcG9ydGFiYW4gYSBsb3MgaW52ZXN0aWdhZG9yZXMgeSBsYXMgcXVlIGEgbG9zIG5vIGludmVzdGlnYWRvcmVzIGxlcyBpbXBvcnRhYmFuIG3DoXMuIExvcyBmYXZvcml0b3MgZGUgbG9zIGludmVzdGlnYWRvcmVzIGZ1ZXJvbjoKCjEuIMK/UXXDqSBjb25jZXB0b3MgZnVuZGFtZW50YWxlcyBkZSBwcm9ncmFtYWNpw7NuIHNvbiBsb3MgbcOhcyBkZXNhZmlhbnRlcyBwYXJhIGxvcyBlc3R1ZGlhbnRlcz8KCjIuIMK/UXXDqSBlc3RyYXRlZ2lhcyBkZSBlbnNlw7FhbnphIHNvbiBtw6FzIGVmZWN0aXZhcyBjdWFuZG8gc2UgdHJhdGEgZGUgdW5hIGFtcGxpYSBnYW1hIGRlIGV4cGVyaWVuY2lhIHByZXZpYSBlbiBjbGFzZXMgZGUgcHJvZ3JhbWFjacOzbiBpbnRyb2R1Y3RvcmlhPwoKMy4gwr9RdcOpIGFmZWN0YSBsYSBjYXBhY2lkYWQgZGUgbG9zIGVzdHVkaWFudGVzIHBhcmEgZ2VuZXJhbGl6YXIgYSBwYXJ0aXIgZGUgZWplbXBsb3MgZGUgcHJvZ3JhbWFjacOzbiBzaW1wbGVzPwoKNC4gwr9RdcOpIHByw6FjdGljYXMgZGUgZW5zZcOxYW56YSBzb24gbcOhcyBlZmVjdGl2YXMgcGFyYSBlbnNlw7FhciBjb21wdXRhY2nDs24gYSBsb3MgbmnDsW9zPwoKNS4gwr9RdcOpIHRpcG8gZGUgcHJvYmxlbWFzIGVuY3VlbnRyYW4gbG9zIGVzdHVkaWFudGVzIGVuIGxhcyBjbGFzZXMgZGUgcHJvZ3JhbWFjacOzbiBtw6FzIGludGVyZXNhbnRlcz8KCjYuIMK/Q3XDoWxlcyBzb24gbGFzIGZvcm1hcyBtw6FzIGVmZWN0aXZhcyBkZSBlbnNlw7FhciBwcm9ncmFtYWNpw7NuIGEgdmFyaW9zIGdydXBvcz8KCjcuIMK/Q3XDoWxlcyBzb24gbGFzIGZvcm1hcyBtw6FzIGVmZWN0aXZhcyBkZSBlc2NhbGFyIGxhIGVkdWNhY2nDs24gaW5mb3Jtw6F0aWNhIHBhcmEgbGxlZ2FyIGEgbGEgcG9ibGFjacOzbiBnZW5lcmFsIGRlIGVzdHVkaWFudGVzPwoKTWllbnRyYXMgcXVlIGxhcyBwcmVndW50YXMgbcOhcyBpbXBvcnRhbnRlcyBwYXJhIGxvcyBubyBpbnZlc3RpZ2Fkb3JlcyBmdWVyb246CgoxLiDCv0PDs21vIHkgY3XDoW5kbyBlcyBtZWpvciBkYXIgYSBsb3MgZXN0dWRpYW50ZXMgY29tZW50YXJpb3Mgc29icmUgc3UgY8OzZGlnbyBwYXJhIG1lam9yYXIgZWwgYXByZW5kaXphamU/CgoyLiDCv1F1w6kgdGlwbyBkZSBlamVyY2ljaW9zIGRlIHByb2dyYW1hY2nDs24gc29uIG3DoXMgZWZlY3Rpdm9zIGFsIGVuc2XDsWFyIGEgbG9zIGVzdHVkaWFudGVzIGRlIGluZm9ybcOhdGljYT8KCjMuIMK/Q3XDoWxlcyBzb24gbG9zIG3DqXJpdG9zIHJlbGF0aXZvcyBkZWwgYXByZW5kaXphamUgYmFzYWRvIGVuIHByb3llY3RvcywgbGFzIGNvbmZlcmVuY2lhcyB5IGVsIGFwcmVuZGl6YWplIGFjdGl2byBwYXJhIGxvcyBlc3R1ZGlhbnRlcyBxdWUgYXByZW5kZW4gY29tcHV0YWNpw7NuPwoKNC4gwr9DdcOhbCBlcyBsYSBmb3JtYSBtw6FzIGVmZWN0aXZhIGRlIHByb3BvcmNpb25hciBjb21lbnRhcmlvcyBhIGxvcyBlc3R1ZGlhbnRlcyBlbiBsYXMgY2xhc2VzIGRlIHByb2dyYW1hY2nDs24/Cgo1LiDCv1F1w6kgbGVzIHJlc3VsdGEgbcOhcyBkaWbDrWNpbCBhIGxhcyBwZXJzb25hcyBjdWFuZG8gZGl2aWRlbiBsb3MgcHJvYmxlbWFzIGVuIHRhcmVhcyBtw6FzIHBlcXVlw7FhcyBtaWVudHJhcyBwcm9ncmFtYW4/Cgo2LiDCv0N1w6FsZXMgc29uIGxvcyBjb25jZXB0b3MgY2xhdmUgcXVlIGxvcyBlc3R1ZGlhbnRlcyBkZWJlbiBlbnRlbmRlciBlbiBsYXMgY2xhc2VzIGludHJvZHVjdG9yaWFzIGRlIGNvbXB1dGFjacOzbj8KCjcuIMK/Q3XDoWxlcyBzb24gbGFzIGZvcm1hcyBtw6FzIGVmZWN0aXZhcyBkZSBkZXNhcnJvbGxhciBjb21wZXRlbmNpYSBpbmZvcm3DoXRpY2EgZW50cmUgbG9zIGVzdHVkaWFudGVzIGVuIGRpc2NpcGxpbmFzIG5vIGluZm9ybcOhdGljYXM/Cgo4LiDCv0N1w6FsIGVzIGVsIG1lam9yIG9yZGVuIHBhcmEgZW5zZcOxYXIgY29uY2VwdG9zIHkgaGFiaWxpZGFkZXMgaW5mb3Jtw6F0aWNhcyBiw6FzaWNhcz8KCkhhZ2EgcXVlIGNhZGEgcGVyc29uYSBlbiBsYSBjbGFzZSwgaW5kZXBlbmRpZW50ZW1lbnRlLCBvdG9yZ3VlIHVuIHB1bnRvIGEgY2FkYSB1bmEgZGUgbGFzIG9jaG8gcHJlZ3VudGFzIGRlIGxhcyBsaXN0YXMgY29tYmluYWRhcyBxdWUgbcOhcyBsZXMgaW50ZXJlc2FuLCBsdWVnbyBjYWxjdWxlIHVuIHB1bnRhamUgcHJvbWVkaW8gcGFyYSBjYWRhIHByZWd1bnRhLiDCv0N1w6FsZXMgc29uIGxvcyBtw6FzIHBvcHVsYXJlcyBlbiB0dSBjbGFzZT8gwr9FbiBxdcOpIGdydXBvIGVzdMOhbiBsYXMgcHJlZ3VudGFzIG3DoXMgcG9wdWxhcmVzPwoKCi0tLS0tLS0KCgojIExhIGVuc2XDsWFuemEgY29tbyBhcnRlIGRlIHBlcmZvcm1hbmNlCgpFbiBEYXJ3aW4gQW1vbmcgdGhlIE1hY2hpbmVzLCBHZW9yZ2UgRHlzb24gZXNjcmliacOzOiDigJxFbiBlbCBqdWVnbyBkZSBsYSB2aWRhIHkgbGEgZXZvbHVjacOzbiBoYXkgdHJlcyBqdWdhZG9yZXMgZW4gbGEgbWVzYTogbG9zIHNlcmVzIGh1bWFub3MsIGxhIG5hdHVyYWxlemEgeSBsYXMgbcOhcXVpbmFzLiBFc3RveSBmaXJtZW1lbnRlIGRlbCBsYWRvIGRlIGxhIG5hdHVyYWxlemEuIFBlcm8gc29zcGVjaG8gcXVlIGxhIG5hdHVyYWxlemEgZXN0w6EgZGVsIGxhZG8gZGUgbGFzIG3DoXF1aW5hcyAuLi4g4oCdRGUgbWFuZXJhIHNpbWlsYXIsIGFob3JhIGhheSB0cmVzIGp1Z2Fkb3JlcyBlbiBlbCBqdWVnbyBkZSBsYSBlZHVjYWNpw7NuOiBsaWJyb3MgZGUgdGV4dG8geSBvdHJvcyBtYXRlcmlhbGVzIGRlIHNvbG8gbGVjdHVyYSwgY29uZmVyZW5jaWFzIGVuIHZpdm8geSBsZWNjaW9uZXMgYXV0b21hdGl6YWRhcyBlbiBsw61uZWEuIFB1ZWRlIGRhciBhIHN1cyBhbHVtbm9zIGxlY2Npb25lcyBlc2NyaXRhcyB5IHVuYSBjb21iaW5hY2nDs24gZGUgdmlkZW9zIGdyYWJhZG9zIHkgZWplcmNpY2lvcyBhIHN1IHByb3BpbyByaXRtbywgcGVybyBzaSB2YSBhIGVuc2XDsWFyIGVuIHBlcnNvbmEsIGRlYmUgb2ZyZWNlciBhbGdvIGRpZmVyZW50ZSAoeSBjb24gc3VlcnRlIG1lam9yIHF1ZSkgYSBjdWFscXVpZXJhIGRlIGVsbG9zLiBQb3IgbG8gdGFudG8sIGVzdGUgY2Fww610dWxvIHNlIGNlbnRyYSBlbiBjw7NtbyBlbnNlw7FhciBwcm9ncmFtYWNpw7NuIGFsIGhhY2VybG8gcmVhbG1lbnRlLgoKCiMjIENvZGlmaWNhY2nDs24gZW4gdml2bwoKPkxhIGVuc2XDsWFuemEgZXMgdGVhdHJvLCBubyBjaW5lLgo+Cj4tLSBOZWFsIERhdmlzCgpMYSBmb3JtYSBtw6FzIGVmZWN0aXZhIGRlIGVuc2XDsWFyIHByb2dyYW1hY2nDs24gZXMgbGEgY29kaWZpY2FjacOzbiBlbiB2aXZvIFtSdWJpMjAxMywgSGFhcjIwMTcsIFJhajIwMThdLiBFbiBsdWdhciBkZSBwcmVzZW50YXIgbWF0ZXJpYWwgZXNjcml0byBwcmV2aWFtZW50ZSwgZWwgbWFlc3RybyBlc2NyaWJlIGVsIGPDs2RpZ28gZW4gZnJlbnRlIGRlIGxhIGNsYXNlIG1pZW50cmFzIGxvcyBhbHVtbm9zIHNpZ3VlbiwgZXNjcmliacOpbmRvbG8geSBlamVjdXTDoW5kb2xvIGEgbWVkaWRhIHF1ZSBhdmFuemFuLiBMYSBjb2RpZmljYWNpw7NuIGVuIHZpdm8gZnVuY2lvbmEgbWVqb3IgcXVlIGxhcyBkaWFwb3NpdGl2YXMgcG9yIHZhcmlhcyByYXpvbmVzOgoKKiBQZXJtaXRlIGxhICoqZW5zZcOxYW56YSBhY3RpdmEqKiBhbCBwZXJtaXRpciBxdWUgbG9zIG1hZXN0cm9zIHNpZ2FuIGxvcyBpbnRlcmVzZXMgeSBsYXMgcHJlZ3VudGFzIGRlIHN1cyBhbHVtbm9zIGVuIGVsIG1vbWVudG8uIFVuYSBwbGF0YWZvcm1hIGRlc2xpemFudGUgZXMgY29tbyB1bmEgdsOtYSBkZSBmZXJyb2NhcnJpbDogcHVlZGUgc2VyIHVuIHZpYWplIHN1YXZlLCBwZXJvIGRlYmUgZGVjaWRpciBkZSBhbnRlbWFubyBhIGTDs25kZSBpcsOhLiBMYSBjb2RpZmljYWNpw7NuIGVuIHZpdm8gZXMgbcOhcyBjb21vIGNvbmR1Y2lyIHVuIHZlaMOtY3VsbyB0b2RvdGVycmVubzogcHVlZGUgc2VyIG3DoXMgYWNjaWRlbnRhZG8sIHBlcm8gZXMgbXVjaG8gbcOhcyBmw6FjaWwgY2FtYmlhciBkZSBkaXJlY2Npw7NuIGUgaXIgYSBkb25kZSBsYSBnZW50ZSBxdWllcmUuCgoqIFZlciBjw7NtbyBzZSBlc2NyaWJlIHVuIHByb2dyYW1hIGVzIG3DoXMgbW90aXZhZG9yIHF1ZSBtaXJhciBhIGFsZ3VpZW4gcGFzYXIgbGFzIGRpYXBvc2l0aXZhcy4KCiogRmFjaWxpdGEgbGEgdHJhbnNmZXJlbmNpYSBpbnZvbHVudGFyaWEgZGUgY29ub2NpbWllbnRvOiBsYXMgcGVyc29uYXMgYXByZW5kZW4gbcOhcyBkZSBsbyBxdWUgZW5zZcOxYW1vcyBjb25zY2llbnRlbWVudGUgYWwgb2JzZXJ2YXIgY8OzbW8gaGFjZW1vcyBsYXMgY29zYXMuCgoqIERpc21pbnV5ZSBsYSB2ZWxvY2lkYWQgZGVsIG1hZXN0cm86IHNpIHRpZW5lbiBxdWUgZXNjcmliaXIgZWwgcHJvZ3JhbWEgYSBtZWRpZGEgcXVlIGF2YW56YW4sIGVudG9uY2VzIHNvbG8gcHVlZGVuIGlyIGRvcyB2ZWNlcyBtw6FzIHLDoXBpZG8gcXVlIHN1cyBhbHVtbm9zIGVuIGx1Z2FyIGRlIGRpZXogdmVjZXMgbcOhcyByw6FwaWRvIHF1ZSBjb24gbGFzIGRpYXBvc2l0aXZhcy4KCiogQXl1ZGEgYSByZWR1Y2lyIGxhIGNhcmdhIGVuIGxhIG1lbW9yaWEgYSBjb3J0byBwbGF6byBwb3JxdWUgaGFjZSBxdWUgZWwgbWFlc3RybyBzZWEgbcOhcyBjb25zY2llbnRlIGRlIGN1w6FudG8gZXN0w6FuIHRpcmFuZG8gYSBzdXMgYWx1bW5vcy4KCiogTG9zIGFsdW1ub3MgcHVlZGVuIHZlciBjw7NtbyBkaWFnbm9zdGljYXIgeSBjb3JyZWdpciBlcnJvcmVzLiBQYXNhcsOhbiBtdWNobyB0aWVtcG8gaGFjaWVuZG8gZXN0bzsgYSBtZW5vcyBxdWUgc2VhIHVuIG1lY2Fuw7NncmFmbyBwZXJmZWN0bywgbGEgY29kaWZpY2FjacOzbiBlbiB2aXZvIGdhcmFudGl6YSBxdWUgcHVlZGFuIHZlciBjw7NtbyBoYWNlcmxvLgoKKiBWZXIgYSBsb3MgbWFlc3Ryb3MgY29tZXRlciBlcnJvcmVzIG11ZXN0cmEgYSBsb3MgYWx1bW5vcyBxdWUgZXN0w6EgYmllbiBjb21ldGVyIGVycm9yZXMgcG9yIHN1IGN1ZW50YS4gU2kgZWwgbWFlc3RybyBubyBzZSBhdmVyZ8O8ZW56YSBkZSBjb21ldGVyIGVycm9yZXMgeSBoYWJsYXIgc29icmUgZWxsb3MsIGxvcyBhbHVtbm9zIHRhbWJpw6luIHNlIHNlbnRpcsOhbiBtw6FzIGPDs21vZG9zIGhhY2nDqW5kb2xvLgoKT3RybyBiZW5lZmljaW8gZGUgbGEgY29kaWZpY2FjacOzbiBlbiB2aXZvIGVzIHF1ZSBkZW11ZXN0cmEgZWwgb3JkZW4gZW4gcXVlIHNlIGRlYmVuIGVzY3JpYmlyIGxvcyBwcm9ncmFtYXMuIEFsIG9ic2VydmFyIGPDs21vIGxhcyBwZXJzb25hcyByZXNvbHZpZXJvbiBsb3MgcHJvYmxlbWFzIGRlIFBhcnNvbnMsIFtJaGFuMjAxMV0gZGVzY3VicmnDsyBxdWUgbG9zIHByb2dyYW1hZG9yZXMgZXhwZXJpbWVudGFkb3MgYSBtZW51ZG8gYXJyYXN0cmFiYW4gbGEgZmlybWEgZGVsIG3DqXRvZG8gYWwgcHJpbmNpcGlvLCBsdWVnbyBhZ3JlZ2FiYW4gbGEgbWF5b3LDrWEgZGVsIGZsdWpvIGRlIGNvbnRyb2wgKGVzIGRlY2lyLCBidWNsZXMgeSBjb25kaWNpb25hbGVzKSwgeSBzb2xvIGx1ZWdvIGFncmVnYWJhbiBkZXRhbGxlcyBjb21vIGxhIGluaWNpYWxpemFjacOzbiB5IGVsIG1hbmVqbyBkZSB2YXJpYWJsZXMgZGUgdml0cmluYXMuIEVzdGEgYXV0b3LDrWEgZnVlcmEgZGUgb3JkZW4gZXMgYWplbmEgYSBsb3Mgbm92YXRvcywgcXVlIGxlZW4geSBlc2NyaWJlbiBlbCBjw7NkaWdvIGVuIGVsIG9yZGVuIGVuIHF1ZSBzZSBwcmVzZW50YSBlbiBsYSBww6FnaW5hOyB2ZXJsbyBsZXMgYXl1ZGEgYSBhcHJlbmRlciBhIGRlc2NvbXBvbmVyIGxvcyBwcm9ibGVtYXMgZW4gc3VibWV0YXMgcXVlIHB1ZWRlbiBhYm9yZGFyc2UgdW5hIHBvciB1bmEuIExhIGNvZGlmaWNhY2nDs24gZW4gdml2byB0YW1iacOpbiBicmluZGEgYSBsb3MgbWFlc3Ryb3MgbGEgb3BvcnR1bmlkYWQgZGUgZW5mYXRpemFyIGxhIGltcG9ydGFuY2lhIGRlIHBlcXVlw7FvcyBwYXNvcyBjb24gY29tZW50YXJpb3MgZnJlY3VlbnRlcyBbQmxpazIwMTRdIHkgbGEgaW1wb3J0YW5jaWEgZGUgZWxlZ2lyIHVuIHBsYW4gZW4gbHVnYXIgZGUgaGFjZXIgY2FtYmlvcyBtw6FzIG8gbWVub3MgYWxlYXRvcmlvcyB5IGVzcGVyYXIgcXVlIGxhcyBjb3NhcyBtZWpvcmVuIFtTcG9oMTk4NV0uCgpTZSBuZWNlc2l0YSB1biBwb2NvIGRlIHByw6FjdGljYSBwYXJhIHNlbnRpcnNlIGPDs21vZG8gaGFibGFuZG8gbWllbnRyYXMgY29kaWZpY2EgZnJlbnRlIGEgdW5hIGF1ZGllbmNpYSwgcGVybyBsYSBtYXlvcsOtYSBkZSBsYXMgcGVyc29uYXMgaW5mb3JtYW4gcXVlIHLDoXBpZGFtZW50ZSBubyBzZSB2dWVsdmUgbcOhcyBkaWbDrWNpbCBxdWUgaGFibGFyIGFscmVkZWRvciBkZSB1bmEgY3ViaWVydGEgZGUgZGlhcG9zaXRpdmFzLiBMYXMgc2VjY2lvbmVzIGEgY29udGludWFjacOzbiBvZnJlY2VuIGNvbnNlam9zIHNvYnJlIGPDs21vIG1lam9yYXIgc3UgY29kaWZpY2FjacOzbiBlbiB2aXZvLgoKCiMjIEFicmF6YSB0dXMgZXJyb3Jlcwo+TG9zIGVycm9yZXMgdGlwb2dyw6FmaWNvcyBzb24gbGEgcGVkYWdvZ8OtYS4KPgo+IC0tIEVtaWx5IEphbmUgTWNUYXZpc2gKCkxhIHJlZ2xhIG3DoXMgaW1wb3J0YW50ZSBkZSBsYSBjb2RpZmljYWNpw7NuIGVuIHZpdm8gZXMgYWNlcHRhciBzdXMgZXJyb3Jlcy4gTm8gaW1wb3J0YSBxdcOpIHRhbiBiaWVuIHRlIHByZXBhcmVzLCBoYXLDoXMgYWxndW5vczsgY3VhbmRvIGxvIGhhZ2EsIHBpZW5zZSBlbiBlbGxvcyBjb24gc3UgYXVkaWVuY2lhLiBTaSBiaWVuIGVzIGRpZsOtY2lsIG9idGVuZXIgZGF0b3MsIGxvcyBwcm9ncmFtYWRvcmVzIHByb2Zlc2lvbmFsZXMgZGVkaWNhbiBkZWwgMjUlIGFsIOKAi+KAizYwJSBkZSBzdSB0aWVtcG8gYSBsYSBkZXB1cmFjacOzbjsgbG9zIG5vdmF0b3MgZ2FzdGFuIG11Y2hvIG3DoXMgKFNlY2Npw7NuIDcuNiksIHBlcm8gbGEgbWF5b3LDrWEgZGUgbG9zIGxpYnJvcyBkZSB0ZXh0byB5IHR1dG9yaWFsZXMgZGVkaWNhbiBwb2NvIHRpZW1wbyBhIGRpYWdub3N0aWNhciB5IGNvcnJlZ2lyIHByb2JsZW1hcy4gU2kgaGFibGFzIGVuIHZveiBhbHRhIG1pZW50cmFzIGRlc2N1YnJlcyBxdcOpIGVzY3JpYmlzdGUgbWFsIG8gZMOzbmRlIHRvbWFzdGUgZWwgY2FtaW5vIGVxdWl2b2NhZG8sIHkgZXhwbGljYXMgY8OzbW8gdGUgaGFzIGNvcnJlZ2lkbywgbGVzIGRhcsOhcyBhIHR1cyBhbHVtbm9zIHVuYSBjYWphIGRlIGhlcnJhbWllbnRhcyBxdWUgcHVlZGVuIHVzYXIgY3VhbmRvIGNvbWV0ZW4gc3VzIHByb3Bpb3MgZXJyb3Jlcy4KCj4qKlRvcnRhcyBkZWxpYmVyYWRhcyoqIAo+Cj5VbmEgdmV6IHF1ZSBoYXlhIGRhZG8gdW5hIGxlY2Npw7NuIHZhcmlhcyB2ZWNlcywgZXMgcG9jbyBwcm9iYWJsZSBxdWUgY29tZXRhIGFsZ28gbcOhcyBxdWUgZXJyb3JlcyBiw6FzaWNvcyBkZSBlc2NyaXR1cmEgKHF1ZSBhw7puIHB1ZWRlbiBzZXIgaW5mb3JtYXRpdm9zKS4gUHVlZGUgaW50ZW50YXIgcmVjb3JkYXIgZXJyb3JlcyBwYXNhZG9zIHkgaGFjZXJsb3MgZGVsaWJlcmFkYW1lbnRlLCBwZXJvIGVzbyBhIG1lbnVkbyBzZSBzaWVudGUgZm9yemFkby4gVW4gZW5mb3F1ZSBhbHRlcm5hdGl2byBlcyBsYSBjb2RpZmljYWNpw7NuIGRlIGNvbnRyYWNjaW9uZXM6IHNvbGljaXRlIGEgbG9zIGFsdW1ub3MgdW5vIHBvciB1bm8gcXVlIGxlIGRpZ2FuIHF1w6kgZXNjcmliaXIgYSBjb250aW51YWNpw7NuLiBFc3RvIGVzdMOhIHByw6FjdGljYW1lbnRlIGdhcmFudGl6YWRvIHBhcmEgbWV0ZXJ0ZSBlbiBhbGfDum4gdGlwbyBkZSBwcm9ibGVtYS4KCgojIyBQZWRpciBwcmVkaWNjaW9uZXMKClVuYSBmb3JtYSBkZSBtYW50ZW5lciBhIGxvcyBhbHVtbm9zIGludGVyZXNhZG9zIG1pZW50cmFzIGVzdMOhIGNvZGlmaWNhbmRvIGVuIHZpdm8gZXMgcGVkaXJsZXMgcXVlIGhhZ2FuIHByZWRpY2Npb25lcyBzb2JyZSBsbyBxdWUgaGFyw6EgZWwgY8OzZGlnbyBlbiBsYSBwYW50YWxsYS4gTHVlZ28sIHB1ZWRlIGVzY3JpYmlyIGxhcyBwcmltZXJhcyBzdWdlcmVuY2lhcyBxdWUgaGFjZW4sIGhhY2VyIHF1ZSB0b2RhIGxhIGNsYXNlIHZvdGUgc29icmUgbG8gcXVlIGVsbG9zIHBpZW5zYW4gcXVlIGVzIG3DoXMgcHJvYmFibGUgeSBsdWVnbyBlamVjdXRhciBlbCBjw7NkaWdvLiBFc3RhIGVzIHVuYSBmb3JtYSBsaWdlcmEgZGUgaW5zdHJ1Y2Npw7NuIGVudHJlIHBhcmVzLCBxdWUgZGlzY3V0aXJlbW9zIGVuIGxhIFNlY2Npw7NuIDkuMjsgYWRlbcOhcyBkZSBtYW50ZW5lciBzdSBhdGVuY2nDs24gZW4gbGEgdGFyZWEsIGxlcyBkYSBwcsOhY3RpY2EgcGFyYSByYXpvbmFyIHNvYnJlIGVsIGNvbXBvcnRhbWllbnRvIGRlbCBjw7NkaWdvLgoKIyMgVG9tYXIgY29uIGNhbG1hCgpDYWRhIHZleiBxdWUgZXNjcmliYSB1biBjb21hbmRvLCBhZ3JlZ3VlIHVuYSBsw61uZWEgZGUgY8OzZGlnbyBhIHVuIHByb2dyYW1hLCBvIHNlbGVjY2lvbmUgdW4gZWxlbWVudG8gZGUgdW4gbWVuw7osIGRpZ2EgbG8gcXVlIGVzdMOhIGhhY2llbmRvIGVuIHZveiBhbHRhIHkgbHVlZ28gc2XDsWFsZSBsbyBxdWUgaGEgaGVjaG8geSBzdSBzYWxpZGEgZW4gbGEgcGFudGFsbGEgeSByZXDDoXNlbG8uIHNlZ3VuZGEgdmV6LiBFc3RvIHBlcm1pdGUgYSBsb3MgYWx1bW5vcyBwb25lcnNlIGFsIGTDrWEgeSBjb21wcm9iYXIgcXVlIGxvIHF1ZSBhY2FiYW4gZGUgaGFjZXIgZXMgY29ycmVjdG8uIEVzIHBhcnRpY3VsYXJtZW50ZSBpbXBvcnRhbnRlIGN1YW5kbyBhbGd1bm9zIGRlIHN1cyBhbHVtbm9zIHRpZW5lbiBkaWZpY3VsdGFkZXMgcGFyYSB2ZXIgbyBlc2N1Y2hhciBvIG5vIGRvbWluYW4gZWwgaWRpb21hIGRlIGluc3RydWNjacOzbi4KCkhhZ2FzIGxvIHF1ZSBoYWdhcywgbm8gY29waWUgeSBwZWd1ZSBjw7NkaWdvOiBoYWNlciBlc3RvIHByw6FjdGljYW1lbnRlIGdhcmFudGl6YSBxdWUgY29tcGV0aXLDoSBwb3IgZGVsYW50ZSBkZSBzdXMgYWx1bW5vcy4gWSBzaSB1dGlsaXphIGxhIGZpbmFsaXphY2nDs24gZGUgdGFidWxhY2nDs24sIGTDrWdhbG8gZW4gdm96IGFsdGEgcGFyYSBxdWUgc3VzIGFsdW1ub3MgY29tcHJlbmRhbiBsbyBxdWUgZXN0w6EgaGFjaWVuZG86ICJVc2Vtb3MgZWwgcHVudG8gZGUgdG9ydHVnYSIgciAiIiB5byAieSBsYSB0YWJ1bGFjacOzbiBwYXJhIiBoYWNlciBsbyBjb3JyZWN0byAiCgpTaSBsYSBzYWxpZGEgZGUgc3UgY29tYW5kbyBvIGPDs2RpZ28gaGFjZSBxdWUgbG8gcXVlIGFjYWJhIGRlIGVzY3JpYmlyIGRlc2FwYXJlemNhIGRlIGxhIHZpc3RhLCBkZXNwbMOhY2VzZSBoYWNpYSBhcnJpYmEgcGFyYSBxdWUgbG9zIGFsdW1ub3MgcHVlZGFuIHZlcmxvIG51ZXZhbWVudGUuIFNpIGVzbyBubyBlcyBwcsOhY3RpY28sIGVqZWN1dGUgZWwgbWlzbW8gY29tYW5kbyBwb3Igc2VndW5kYSB2ZXogbyBjb3BpZSB5IHBlZ3VlIGxvcyDDumx0aW1vcyBjb21hbmRvcyBlbiBsYXMgbm90YXMgY29tcGFydGlkYXMgZGVsIHRhbGxlci4KCiMjIFNlciB2aXN0byB5IGVzY3VjaGFkbwpDdWFuZG8gc2Ugc2llbnRhLCBlcyBtw6FzIHByb2JhYmxlIHF1ZSBtaXJlIHN1IHBhbnRhbGxhIGVuIGx1Z2FyIGRlIG1pcmFyIGEgc3UgYXVkaWVuY2lhIHkgcHVlZGUgZXN0YXIgb2N1bHRvIGRlIGxvcyBhbHVtbm9zIGVuIGxhcyDDumx0aW1hcyBmaWxhcyBkZSBzdSBjbGFzZS4gU2kgZXJlcyBmw61zaWNhbWVudGUgY2FwYXogZGUgcGFyYXJ0ZSBkdXJhbnRlIHVuIHBhciBkZSBob3JhcywgZGViZXMgaGFjZXJsbyBtaWVudHJhcyBlbnNlw7Fhcy4gUGxhbmlmaXF1ZSBlc3RvIHkgYXNlZ8O6cmVzZSBkZSB0ZW5lciB1bmEgbWVzYSBlbGV2YWRhLCB1biBlc2NyaXRvcmlvIGRlIHBpZSBvIHVuIGF0cmlsIHBhcmEgc3UgY29tcHV0YWRvcmEgcG9ydMOhdGlsIHBhcmEgcXVlIG5vIHRlbmdhIHF1ZSBpbmNsaW5hcnNlIHBhcmEgZXNjcmliaXIuCgpJbmRlcGVuZGllbnRlbWVudGUgZGUgc2kgZXN0w6EgZGUgcGllIG8gc2VudGFkbywgYXNlZ8O6cmVzZSBkZSBtb3ZlcnNlIGxvIG3DoXMgcXVlIHB1ZWRhOiB2YXlhIGEgbGEgcGFudGFsbGEgcGFyYSBzZcOxYWxhciBhbGdvLCBkaWJ1amUgYWxnbyBlbiBsYSBwaXphcnJhIG8gc2ltcGxlbWVudGUgYWzDqWplc2UgZGUgc3UgY29tcHV0YWRvcmEgcG9yIHVub3MgbW9tZW50b3MgeSBoYWJsZSBkaXJlY3RhbWVudGUgY29uIHR1IGF1ZGllbmNpYSBIYWNlciBlc3RvIGFsZWphIGxhIGF0ZW5jacOzbiBkZSBzdXMgYWx1bW5vcyBkZSBzdXMgcGFudGFsbGFzIHkgbGVzIHByb3BvcmNpb25hIHVuIG1vbWVudG8gbmF0dXJhbCBwYXJhIGhhY2VyIHByZWd1bnRhcy4KClNpIHZhIGEgZW5zZcOxYXIgZHVyYW50ZSBtw6FzIGRlIHVuIHBhciBkZSBob3JhcywgdmFsZSBsYSBwZW5hIHVzYXIgdW4gbWljcsOzZm9ubyBpbmNsdXNvIGVuIHVuYSBoYWJpdGFjacOzbiBwZXF1ZcOxYS4gVHUgZ2FyZ2FudGEgc2UgY2Fuc2EgY29tbyBjdWFscXVpZXIgb3RyYSBwYXJ0ZSBkZSB0dSBjdWVycG87IHVzYXIgdW4gbWljcsOzZm9ubyBubyBlcyBkaWZlcmVudGUgZGUgdXNhciB6YXBhdG9zIGPDs21vZG9zIChxdWUgdGFtYmnDqW4gZGViZXMgaGFjZXIpLiBUYW1iacOpbiBwdWVkZSBtYXJjYXIgdW5hIGdyYW4gZGlmZXJlbmNpYSBwYXJhIGxhcyBwZXJzb25hcyBjb24gZGlzY2FwYWNpZGFkIGF1ZGl0aXZhLgoKCiMjIFJlZmxlamUgZWwgZW50b3JubyBkZSBzdSBhbHVtbm8KRXMgcG9zaWJsZSBxdWUgaGF5YSBwZXJzb25hbGl6YWRvIHN1IGVudG9ybm8gY29uIHVuIGVsZWdhbnRlIGluZGljYWRvciBkZSBzaGVsbCBkZSBVbml4LCB1biBlc3F1ZW1hIGRlIGNvbG9yIHBlcnNvbmFsaXphZG8gcGFyYSBzdSBlbnRvcm5vIGRlIGRlc2Fycm9sbG8gbyB1bmEgZ3JhbiBjYW50aWRhZCBkZSBtw6l0b2RvcyBhYnJldmlhZG9zIGRlIHRlY2xhZG8uIFN1cyBhbHVtbm9zIG5vIHRlbmRyw6FuIG5hZGEgZGUgZXN0bywgYXPDrSBxdWUgaW50ZW50ZSBjcmVhciB1biBlbnRvcm5vIHF1ZSByZWZsZWplIGxvIHF1ZSB0aWVuZW4uIEFsZ3Vub3MgbWFlc3Ryb3MgY3JlYW4gdW5hIGN1ZW50YSBiw6FzaWNhIHNlcGFyYWRhIGVuIHN1IGNvbXB1dGFkb3JhIHBvcnTDoXRpbCBvIHVuYSBjdWVudGEgZGUgc29sbyBlbnNlw7FhbnphIHBvciBzZXBhcmFkbyBzaSB1c2FuIHVuIHNlcnZpY2lvIGVuIGzDrW5lYSBjb21vIFNjcmF0Y2ggbyBHaXRIdWIuIEhhY2VyIGVzdG8gdGFtYmnDqW4gcHVlZGUgYXl1ZGFyIGEgZXZpdGFyIHF1ZSBsb3MgcGFxdWV0ZXMgcXVlIGluc3RhbMOzIHBhcmEgdHJhYmFqYXIgYXllciByb21wYW4gbGEgbGVjY2nDs24gcXVlIHNlIHN1cG9uZSBxdWUgZGViZSBlbnNlw7FhciBlc3RhIG1hw7FhbmEuCgojIyBVc2EgbGEgcGFudGFsbGEgc2FiaWFtZW50ZQpQb3IgbG8gZ2VuZXJhbCwgbmVjZXNpdGFyw6EgYWdyYW5kYXIgc3UgZnVlbnRlIGNvbnNpZGVyYWJsZW1lbnRlIHBhcmEgcXVlIGxhcyBwZXJzb25hcyBsYSBsZWFuIGRlc2RlIGVsIGZvbmRvIGRlIGxhIHNhbGEsIGxvIHF1ZSBzaWduaWZpY2EgcXVlIHB1ZWRlIGNvbG9jYXIgbXVjaG8gbWVub3MgZW4gbGEgcGFudGFsbGEgZGUgbG8gcXVlIGVzdMOhIGFjb3N0dW1icmFkby4gRW4gbXVjaG9zIGNhc29zLCBzZSByZWR1Y2lyw6EgYSA2MOKAkzcwIGNvbHVtbmFzIHkgMjDigJMzMCBmaWxhcywgcG9yIGxvIHF1ZSBlc3TDoSB1dGlsaXphbmRvIHVuYSBzdXBlcmNvbXB1dGFkb3JhIGRlbCBzaWdsbyBYWEkgY29tbyBzaSBmdWVyYSB1bmEgdGVybWluYWwgdG9udGEgZGUgcHJpbmNpcGlvcyBkZSBsYSBkw6ljYWRhIGRlIDE5ODAuCgpQYXJhIGdlc3Rpb25hciBlc3RvLCBtYXhpbWljZSBsYSB2ZW50YW5hIHF1ZSBlc3TDoSB1dGlsaXphbmRvIHBhcmEgZW5zZcOxYXIgeSBsdWVnbyBww61kYWxlcyBhIHRvZG9zIHF1ZSBkZW4gc3UgYXByb2JhY2nDs24gbyByZWNoYWNlIHN1IGxlZ2liaWxpZGFkLiBVc2UgdW5hIGZ1ZW50ZSBuZWdyYSBzb2JyZSB1biBmb25kbyBsaWdlcmFtZW50ZSB0ZcOxaWRvIGVuIGx1Z2FyIGRlIHVuYSBmdWVudGUgY2xhcmEgc29icmUgdW4gZm9uZG8gb3NjdXJvOyBlbCB0b25vIGNsYXJvIGRlc2x1bWJyYXLDoSBtZW5vcyBxdWUgZWwgYmxhbmNvIHB1cm8uCgpQcmVzdGUgYXRlbmNpw7NuIHRhbWJpw6luIGEgbGEgaWx1bWluYWNpw7NuIGRlIGxhIGhhYml0YWNpw7NuOiBubyBkZWJlIGVzdGFyIGNvbXBsZXRhbWVudGUgb3NjdXJhIHkgbm8gZGViZSBoYWJlciBsdWNlcyBkaXJlY3RhbWVudGUgc29icmUgbyBlbmNpbWEgZGUgbGEgcGFudGFsbGEgZGUgcHJveWVjY2nDs24uIFBlcm1pdGEgdW5vcyBtaW51dG9zIHBhcmEgcXVlIGxvcyBhbHVtbm9zIHZ1ZWx2YW4gYSBjb2xvY2FyIHN1cyBtZXNhcyBwYXJhIHF1ZSBwdWVkYW4gdmVyIGNvbiBjbGFyaWRhZC4KCkN1YW5kbyBsYSBwYXJ0ZSBpbmZlcmlvciBkZSBsYSBwYW50YWxsYSBkZSBwcm95ZWNjacOzbiBlc3TDoSBhIGxhIG1pc21hIGFsdHVyYSBxdWUgbGFzIGNhYmV6YXMgZGUgbG9zIGFsdW1ub3MsIGxhcyBwZXJzb25hcyBlbiBsYSBwYXJ0ZSBwb3N0ZXJpb3Igbm8gcG9kcsOhbiB2ZXIgbGFzIHBhcnRlcyBpbmZlcmlvcmVzLiBQdWVkZSBlbGV2YXIgbGEgcGFydGUgaW5mZXJpb3IgZGUgc3UgdmVudGFuYSBwYXJhIGNvbXBlbnNhciwgcGVybyBlc3RvIGxlIGRhcsOhIGHDum4gbWVub3MgZXNwYWNpbyBwYXJhIGVzY3JpYmlyLgoKU2kgcHVlZGUgb2J0ZW5lciB1biBzZWd1bmRvIHByb3llY3RvciB5IHBhbnRhbGxhLCDDunNlbG86IGVsIGVzcGFjaW8gYWRpY2lvbmFsIGxlIHBlcm1pdGlyw6EgbW9zdHJhciBzdSBjw7NkaWdvIGVuIHVuIGxhZG8geSBzdSBzYWxpZGEgbyBjb21wb3J0YW1pZW50byBlbiBlbCBvdHJvLiBTaSBsYSBzZWd1bmRhIHBhbnRhbGxhIHJlcXVpZXJlIHN1IHByb3BpYSBjb21wdXRhZG9yYSwgcMOtZGFsZSBhIHVuIGF5dWRhbnRlIHF1ZSBsYSBjb250cm9sZSBlbiBsdWdhciBkZSBzYWx0YXIgZW50cmUgZG9zIHRlY2xhZG9zLgoKRmluYWxtZW50ZSwgc2kgZXN0w6EgZW5zZcOxYW5kbyBhbGdvIGNvbW8gZWwgc2hlbGwgZGUgVW5peCBlbiB1bmEgdmVudGFuYSBkZSBjb25zb2xhLCBlcyBpbXBvcnRhbnRlIGRlY2lybGUgYSBsYSBnZW50ZSBjdcOhbmRvIGVqZWN1dGEgdW4gZWRpdG9yIGRlIHRleHRvIGVuIGxhIGNvbnNvbGEgeSBjdcOhbmRvIHJlZ3Jlc2EgYWwgaW5kaWNhZG9yIGRlIGxhIGNvbnNvbGEuIExhIG1heW9yw61hIGRlIGxvcyBwcmluY2lwaWFudGVzIG51bmNhIGhhbiB2aXN0byB1bmEgdmVudGFuYSBhc3VtaXIgbcO6bHRpcGxlcyBwZXJzb25hbGlkYWRlcyBkZSBlc3RhIG1hbmVyYSwgeSBwdWVkZW4gY29uZnVuZGlyc2UgcsOhcGlkYW1lbnRlIGN1YW5kbyBpbnRlcmFjdMO6YSBjb24gZWwgc2hlbGwsIGN1YW5kbyBlc2NyaWJlIGVuIGVsIGVkaXRvciB5IGN1YW5kbyBzZSB0cmF0YSBkZSB1biBtZW5zYWplIGludGVyYWN0aXZvIHBhcmEgUHl0aG9uIG8gYWxndW5vcyBvdHJvIGlkaW9tYS4gUHVlZGUgZXZpdGFyIGVzdGUgcHJvYmxlbWEgdXRpbGl6YW5kbyB1bmEgdmVudGFuYSBzZXBhcmFkYSBwYXJhIGVkaXRhcjsgU2kgaGFjZSBlc3RvLCBzaWVtcHJlIGluZm9ybWUgYSBsb3MgYWx1bW5vcyBjdWFuZG8gY2FtYmllbiBlbCBlbmZvcXVlIGRlIHVubyBhIG90cm8uCgo+KipMYXMgYXl1ZGFzIGRlIGFjY2VzaWJpbGlkYWQgYXl1ZGFuIGEgdG9kb3MqKgo+Cj5MYXMgaGVycmFtaWVudGFzIGNvbW8gTW91c2Vwb3PDqSAocGFyYSBNYWMpIHkgUG9pbnRlckZvY3VzIChwYXJhIFdpbmRvd3MpIHJlc2FsdGFuIGxhIHBvc2ljacOzbiBkZWwgY3Vyc29yIGRlbCBtb3VzZSBlbiBsYSBwYW50YWxsYSwgeSBsYXMgaGVycmFtaWVudGFzIGRlIGdyYWJhY2nDs24gZGUgcGFudGFsbGEgY29tbyBDYW10YXNpYSB5IGFwbGljYWNpb25lcyBpbmRlcGVuZGllbnRlcyBjb21vIEtleUNhc3RyIGhhY2VuIGVjbyBkZSB0ZWNsYXMgaW52aXNpYmxlcyBjb21vIHRhYiB5IENvbnRyb2wtSiBtaWVudHJhcyBsYXMgZXNjcmliZS4gRXN0b3MgcHVlZGVuIHNlciB1biBwb2NvIG1vbGVzdG9zIGN1YW5kbyBjb21pZW56YXMgYSB1c2FybG9zLCBwZXJvIGF5dWRhIGEgdHVzIGFsdW1ub3MgYSBkZXNjdWJyaXIgbG8gcXVlIGVzdMOhcyBoYWNpZW5kby4KCgojIyBEaXNwb3NpdGl2b3MgZG9ibGVzCkFsZ3VuYXMgcGVyc29uYXMgYWhvcmEgdXNhbiBkb3MgZGlzcG9zaXRpdm9zIGN1YW5kbyBlbnNlw7FhbjogdW5hIGNvbXB1dGFkb3JhIHBvcnTDoXRpbCBjb25lY3RhZGEgYWwgcHJveWVjdG9yIHBhcmEgcXVlIGxvcyBhbHVtbm9zIGxhIHZlYW4geSB1bmEgdGFibGV0YSBwYXJhIHF1ZSBwdWVkYW4gdmVyIHN1cyBwcm9waWFzIG5vdGFzIHkgbGFzIG5vdGFzIHF1ZSBsb3MgYWx1bW5vcyBlc3TDoW4gdG9tYW5kbyAoU2VjY2nDs24gOS43KS4gRXN0byBlcyBtw6FzIGNvbmZpYWJsZSBxdWUgcGFzYXIgZGUgdW4gbGFkbyBhIG90cm8gZW50cmUgZXNjcml0b3Jpb3MgdmlydHVhbGVzLCBhdW5xdWUgdW5hIGltcHJlc2nDs24gZGUgbGEgbGVjY2nDs24gc2lndWUgc2llbmRvIGxhIHRlY25vbG9nw61hIGRlIHJlc3BhbGRvIG3DoXMgY29uZmlhYmxlLgoKIyMgRGlidWphIHRlbXByYW5vLCBkaWJ1amEgYSBtZW51ZG8KTG9zIGRpYWdyYW1hcyBzb24gc2llbXByZSB1bmEgYnVlbmEgaWRlYS4gQSB2ZWNlcyB0ZW5nbyB1bmEgcGxhdGFmb3JtYSBkZSBkaWFwb3NpdGl2YXMgbGxlbmEgZGUgbGFzIHF1ZSBoZSBwcmVwYXJhZG8gZGUgYW50ZW1hbm8sIHBlcm8gY29uc3RydWlyIGRpYWdyYW1hcyBwYXNvIGEgcGFzbyBheXVkYSBjb24gbGEgcmV0ZW5jacOzbiAoU2VjY2nDs24gNC4xKSB5IGxlIHBlcm1pdGUgaW1wcm92aXNhci4KCiMjIEV2aXRhciBkaXN0cmFjY2lvbmVzCkRlc2FjdGl2ZSBsYXMgbm90aWZpY2FjaW9uZXMgcXVlIHB1ZWRhIHVzYXIgZW4gc3UgY29tcHV0YWRvcmEgcG9ydMOhdGlsLCBlc3BlY2lhbG1lbnRlIGxhcyBkZSBsYXMgcmVkZXMgc29jaWFsZXMuIFZlciBtZW5zYWplcyBwYXJwYWRlYW5kbyBlbiBsYSBwYW50YWxsYSBsbyBkaXN0cmFlIGEgdXN0ZWQgeSBhIHN1cyBhbHVtbm9zLCB5IHB1ZWRlIHNlciBpbmPDs21vZG8gY3VhbmRvIGFwYXJlY2UgdW4gbWVuc2FqZSBxdWUgcHJlZmllcmUgcXVlIG90cm9zIG5vIHZlYW4uIE51ZXZhbWVudGUsIGVzIHBvc2libGUgcXVlIGRlc2VlIGNyZWFyIHVuYSBzZWd1bmRhIGN1ZW50YSBlbiBzdSBjb21wdXRhZG9yYSBxdWUgbm8gdGVuZ2EgY29ycmVvIGVsZWN0csOzbmljbyB1IG90cmFzIGhlcnJhbWllbnRhcyBjb25maWd1cmFkYXMuCgojIyBJbXByb3Zpc2FyOiBkZXNwdcOpcyBkZSBjb25vY2VyIGVsIG1hdGVyaWFsCkFww6lndWVzZSBiYXN0YW50ZSBhbCBwbGFuIGRlIGxhIGxlY2Npw7NuIHF1ZSBoYSBlbGFib3JhZG8gbyBwcmVzdGFkbyBsYSBwcmltZXJhIHZleiBxdWUgaW1wYXJ0ZSB1bmEgbGVjY2nDs24uIFB1ZWRlIHNlciB0ZW50YWRvciBkZXN2aWFyc2UgZGVsIG1hdGVyaWFsIHBvcnF1ZSBsZSBndXN0YXLDrWEgbW9zdHJhciB1biBidWVuIHRydWNvIG8gZGVtb3N0cmFyIG90cmEgZm9ybWEgZGUgaGFjZXIgYWxnbywgcGVybyBleGlzdGUgbGEgcG9zaWJpbGlkYWQgZGUgcXVlIGVuY3VlbnRyZSBhbGdvIGluZXNwZXJhZG8gcXVlIGxlIGNvc3RhcsOhIG3DoXMgdGllbXBvIGRlbCBxdWUgdGllbmUuCgpTaW4gZW1iYXJnbywgdW5hIHZleiBxdWUgZXN0w6kgbcOhcyBmYW1pbGlhcml6YWRvIGNvbiBlbCBtYXRlcmlhbCwgcHVlZGUgeSBkZWJlIGNvbWVuemFyIGEgaW1wcm92aXNhciBzZWfDum4gbG9zIGFudGVjZWRlbnRlcyBkZSBzdXMgYWx1bW5vcywgc3VzIHByZWd1bnRhcyBlbiBjbGFzZSB5IGxvIHF1ZSBwZXJzb25hbG1lbnRlIGxlIHBhcmV6Y2EgbcOhcyBpbnRlcmVzYW50ZS4gRXN0byBlcyBjb21vIHRvY2FyIHVuYSBudWV2YSBjYW5jacOzbjogdGUgcXVlZGFzIGNvbiBsYSBwYXJ0aXR1cmEgbGFzIHByaW1lcmFzIHZlY2VzLCBwZXJvIGRlc3B1w6lzIGRlIHF1ZSB0ZSBzaWVudGFzIGPDs21vZG8gY29uIGxvcyBjYW1iaW9zIGRlIG1lbG9kw61hIHkgYWNvcmRlcywgcHVlZGVzIGNvbWVuemFyIGEgcG9uZXIgdHUgcHJvcGlvIHNlbGxvLgoKQ3VhbmRvIHF1aWVyYXMgdXNhciBhbGdvIG51ZXZvLCByZXbDrXNhbG8gZGUgYW50ZW1hbm8gdXNhbmRvIGxhIG1pc21hIGNvbXB1dGFkb3JhIGVuIGxhIHF1ZSBlc3RhcsOhcyBlbnNlw7FhbmRvOiBpbnN0YWxhciB2YXJpb3MgY2llbnRvcyBkZSBtZWdhYnl0ZXMgZGUgc29mdHdhcmUgYSB0cmF2w6lzIGRlIFdpRmkgZGUgbGEgZXNjdWVsYSBzZWN1bmRhcmlhIGZyZW50ZSBhIGFidXJyaWRvcyBqw7N2ZW5lcyBkZSAxNiBhw7FvcyBubyBlcyBhbGdvIHF1ZSBhbGd1bmEgdmV6IHF1aWVyYXMgdGVuZXIgcXVlIGhhY2VyCgo+KipJbnN0cnVjY2nDs24gZGlyZWN0YSoqCj4KPkxhIEluc3RydWNjacOzbiBEaXJlY3RhIChESSkgZXMgdW4gbcOpdG9kbyBkZSBlbnNlw7FhbnphIGNlbnRyYWRvIGVuIGVsIGRpc2XDsW8gbWV0aWN1bG9zbyBkZWwgY3VycsOtY3VsbyBlbnRyZWdhZG8gYSB0cmF2w6lzIGRlIHVuIGd1acOzbiBwcmVzY3JpdG8uIEVzIG3DoXMgY29tbyB1biBhY3RvciByZWNpdGFuZG8gbMOtbmVhcyBxdWUgY29tbyBlbCBlbmZvcXVlIGRlIGltcHJvdmlzYWNpw7NuIHF1ZSByZWNvbWVuZGFtb3MuIFtTdG9jMjAxOF0gZW5jb250csOzIHVuIGVmZWN0byBwb3NpdGl2byBlc3RhZMOtc3RpY2FtZW50ZSBzaWduaWZpY2F0aXZvIHBhcmEgREkgYSBwZXNhciBkZSBxdWUgYSB2ZWNlcyBzZSBnb2xwZWEgcG9yIHNlciBtZWPDoW5pY28uIFByZWZpZXJvIGxhIGltcHJvdmlzYWNpw7NuIHBvcnF1ZSBsYSBESSByZXF1aWVyZSBtw6FzIHByZXBhcmFjacOzbiBpbmljaWFsIGRlIGxhIHF1ZSBsYSBtYXlvcsOtYSBkZSBsb3MgZ3J1cG9zIGRlIGFwcmVuZGl6YWplIGRlIGNhbXBvIGxpYnJlIHB1ZWRlbiBwZXJtaXRpcnNlLgoKCiMjIyBNaXJhIGxhIHBhbnRhbGxhOiBkZSB2ZXogZW4gY3VhbmRvCkVzdMOhIGJpZW4gZW5mcmVudGFyIGxhIHBhbnRhbGxhIGRlIHByb3llY2Npw7NuIG9jYXNpb25hbG1lbnRlIGN1YW5kbyBlc3TDoSBjYW1pbmFuZG8gYSB0cmF2w6lzIGRlIHVuYSBzZWNjacOzbiBkZSBjw7NkaWdvIG8gZGlidWphbmRvIHVuIGRpYWdyYW1hOiBubyBtaXJhciB1bmEgaGFiaXRhY2nDs24gbGxlbmEgZGUgcGVyc29uYXMgcXVlIGxvIGVzdMOhbiBtaXJhbmRvIGEgdXN0ZWQgcHVlZGUgYXl1ZGFybG8gYSByZWR1Y2lyIHN1cyBuaXZlbGVzIGRlIGFuc2llZGFkIHkgZGFybGUgdW4gbW9tZW50byBwYXJhIHBlbnNhciBxdcOpIHBhcmEgZGVjaXIgYSBjb250aW51YWNpw7NuLgoKU2luIGVtYmFyZ28sIG5vIGRlYmVzIGhhY2VyIGVzdG8gcG9yIG3DoXMgZGUgdW5vcyBzZWd1bmRvcyBhIGxhIHZlei4gVW5hIGJ1ZW5hIHJlZ2xhIGdlbmVyYWwgZXMgdHJhdGFyIGxhIHBhbnRhbGxhIGRlIHByb3llY2Npw7NuIGNvbW8gdW5vIGRlIHN1cyBhbHVtbm9zOiBzaSBsZSByZXN1bHRhcmEgaW5jw7Ntb2RvIG1pcmFyIGEgYWxndWllbiBkdXJhbnRlIGVsIHRpZW1wbyBxdWUgcGFzYSBtaXJhbmRvIGxhIHBhbnRhbGxhLCBlcyBob3JhIGRlIGRhcnNlIGxhIHZ1ZWx0YSB5IG1pcmFyIGEgc3UgY2xhc2UgbnVldmFtZW50ZS4KCiMjIyBJbmNvbnZlbmllbnRlcwpMYSBjb2RpZmljYWNpw7NuIGVuIHZpdm8gdGllbmUgYWxndW5vcyBpbmNvbnZlbmllbnRlcywgcGVybyB0b2RvcyBzZSBwdWVkZW4gZXZpdGFyIG8gc29sdWNpb25hciBjb24gdW4gcG9jbyBkZSBwcsOhY3RpY2EuIFNpIGRlc2N1YnJlcyBxdWUgZXN0w6FzIGNvbWV0aWVuZG8gZGVtYXNpYWRvcyBlcnJvcmVzIGRlIGVzY3JpdHVyYSB0cml2aWFsZXMsIHJlc2VydmEgY2luY28gbWludXRvcyB0b2RvcyBsb3MgZMOtYXMgcGFyYSBwcmFjdGljYXIgbGEgZXNjcml0dXJhOiB0YW1iacOpbiB0ZSBheXVkYXLDoSBlbiB0dSB0cmFiYWpvIGRpYXJpby4gU2kgY3JlZSBxdWUgZXN0w6EgcGFzYW5kbyBkZW1hc2lhZG8gdGllbXBvIHJlZmlyacOpbmRvc2UgYSBsYXMgbm90YXMgZGUgc3UgbGVjY2nDs24sIGRpdsOtZGFsYXMgZW4gcGFydGVzIG3DoXMgcGVxdWXDsWFzIHBhcmEgcXVlIHNvbG8gdGVuZ2EgcXVlIHBlbnNhciBlbiB1biBwZXF1ZcOxbyBwYXNvIGEgbGEgdmV6LgoKWSBzaSBzaWVudGUgcXVlIGVzdMOhIHBhc2FuZG8gZGVtYXNpYWRvIHRpZW1wbyBlc2NyaWJpZW5kbyBkZWNsYXJhY2lvbmVzIGRlIGltcG9ydGFjacOzbiBkZSBiaWJsaW90ZWNhcywgZW5jYWJlemFkb3MgZGUgY2xhc2UgeSBvdHJvIGPDs2RpZ28gcmVwZXRpdGl2bywgZW50cmVndWUgYSB1c3RlZCB5IGEgc3VzIGFsdW1ub3MgdW4gY8OzZGlnbyBlc3F1ZWxldG8gY29tbyBwdW50byBkZSBwYXJ0aWRhIChTZWNjacOzbiA5LjkpLiBIYWNlciBlc3RvIHRhbWJpw6luIHJlZHVjaXLDoSBzdSBjYXJnYSBjb2duaXRpdmEsIHlhIHF1ZSBjZW50cmFyw6Egc3UgYXRlbmNpw7NuIGRvbmRlIGxvIGRlc2VlLgoKIyMjIEVzdHVkaW8gZGUgbGEgbGVjY2nDs24KRGVzZGUgcG9sw610aWNvcyBoYXN0YSBpbnZlc3RpZ2Fkb3JlcyB5IG1hZXN0cm9zLCBsb3MgcmVmb3JtYWRvcmVzIGVkdWNhdGl2b3MgaGFuIGRpc2XDsWFkbyBzaXN0ZW1hcyBwYXJhIGVuY29udHJhciB5IHByb21vdmVyIHBlcnNvbmFzIHF1ZSBwdWVkYW4gZW5zZcOxYXIgYmllbiB5IGVsaW1pbmFyIGEgcXVpZW5lcyBubyBwdWVkZW4uIFBlcm8gbGEgc3Vwb3NpY2nDs24gZGUgcXVlIGFsZ3VuYXMgcGVyc29uYXMgbmFjZW4gY29tbyBkb2NlbnRlcyBlcyBlcnLDs25lYTogZW4gY2FtYmlvLCBjb21vIGN1YWxxdWllciBvdHJhIHJlcHJlc2VudGFjacOzbiBhcnTDrXN0aWNhLCBsYXMgY2xhdmVzIHBhcmEgdW5hIG1lam9yIGVuc2XDsWFuemEgc29uIGxhIHByw6FjdGljYSB5IGxhIGNvbGFib3JhY2nDs24uIENvbW8gZXhwbGljYSBbR3JlZTIwMTRdLCBlbCBlbmZvcXVlIGphcG9uw6lzIGEgZXN0byBzZSBsbGFtYSBqdWd5b2tlbmt5dSwgcXVlIHNpZ25pZmljYSAiZXN0dWRpbyBkZSBsZWNjacOzbiI6Cgo+UGFyYSBncmFkdWFyc2UsIGxhcyBlc3BlY2lhbGl6YWNpb25lcyBlbiBlZHVjYWNpw7NuIFtqYXBvbmVzYV0gbm8gc29sbyB0ZW7DrWFuIHF1ZSB2ZXIgZWwgdHJhYmFqbyBkZSBzdSBtYWVzdHJvIGFzaWduYWRvLCBzaW5vIHF1ZSBkZWLDrWFuIHJlZW1wbGF6YXJsbyBlZmVjdGl2YW1lbnRlLCBpbnN0YWzDoW5kb3NlIHByaW1lcm8gZW4gc3UgYXVsYSBjb21vIG9ic2VydmFkb3JlcyB5IGx1ZWdvLCBhIGxhIHRlcmNlcmEgc2VtYW5hLCBjb21vIHVuYSBhcHJveGltYWNpw7NuIHZhY2lsYW50ZSAuLi4gRWwgbWFlc3RybyBtaXNtby4gRnVuY2lvbsOzIGNvbW8gdW5hIGVzcGVjaWUgZGUgcmVsZXZvIGRlIGVuc2XDsWFuemEuIENhZGEgYWx1bW5vIHRvbcOzIHVuYSBhc2lnbmF0dXJhLCBwbGFuZWFuZG8gY2luY28gZMOtYXMgZGUgbGVjY2lvbmVzIC4uLiBbeSBsdWVnb10gY2FkYSB1bm8gdG9tw7MgdW4gZMOtYS4gUGFyYSBwYXNhciBlbCB0ZXN0aWdvLCB0ZW7DrWEgcXVlIGVuc2XDsWFyIHVuYSBsZWNjacOzbiBkZSB1biBkw61hIGVuIGNhZGEgYXNpZ25hdHVyYTogbGEgcXVlIHBsYW5lYWJhIHkgbGFzIGN1YXRybyBxdWUgbm8gLi4uIHkgdGVuw61hIHF1ZSBoYWNlcmxvIGRpcmVjdGFtZW50ZSBiYWpvIGxhIG5hcml6IGRlIHN1IG1hZXN0cm8uIERlc3B1w6lzLCB0b2RvcywgZWwgbWFlc3RybywgbG9zIGVzdHVkaWFudGVzIHVuaXZlcnNpdGFyaW9zIHksIGEgdmVjZXMsIGluY2x1c28gb3RybyBvYnNlcnZhZG9yIGV4dGVybm8sIHNlIHNlbnRhYmFuIGFscmVkZWRvciBkZSB1bmEgbWVzYSBmb3JtYWwgcGFyYSBoYWJsYXIgc29icmUgbG8gcXVlIHZpZXJvbi4KCgpQb25lciBlbCB0cmFiYWpvIGJham8gdW4gbWljcm9zY29waW8gcGFyYSBtZWpvcmFybG8gZXMgY29tw7puIGVuIGNhbXBvcyB0YW4gZGl2ZXJzb3MgY29tbyBsYSBmYWJyaWNhY2nDs24geSBsYSBtw7pzaWNhLiBVbiBtw7pzaWNvIHByb2Zlc2lvbmFsLCBwb3IgZWplbXBsbywgZGlzZWNjaW9uYXLDoSBtZWRpYSBkb2NlbmEgZGUgZ3JhYmFjaW9uZXMgZGUgIkJvZHkgYW5kIFNvdWwiIG8gIlNtZWxscyBMaWtlIFRlZW4gU3Bpcml0IiBhbnRlcyBkZSBpbnRlcnByZXRhcmxvLiBUYW1iacOpbiBlc3BlcmFyw61hbiByZWNpYmlyIGNvbWVudGFyaW9zIGRlIG90cm9zIG3DunNpY29zIGR1cmFudGUgbGEgcHLDoWN0aWNhIHkgZGVzcHXDqXMgZGUgbGFzIGFjdHVhY2lvbmVzLgoKUGVybyBsYSByZXRyb2FsaW1lbnRhY2nDs24gY29udGludWEgbm8gZXMgcGFydGUgZGUgbGEgY3VsdHVyYSBkZSBlbnNlw7FhbnphIGVuIGxhIG1heW9yw61hIGRlIGxvcyBwYcOtc2VzIGRlIGhhYmxhIGluZ2xlc2EuIEFsbMOtLCBsbyBxdWUgc3VjZWRlIGVuIGVsIGF1bGEgc2UgcXVlZGEgZW4gZWwgYXVsYTogbG9zIG1hZXN0cm9zIG5vIG1pcmFuIGxhcyBsZWNjaW9uZXMgZGUgbG9zIGRlbcOhcyBkZSBtYW5lcmEgcmVndWxhciwgcG9yIGxvIHF1ZSBubyBwdWVkZW4gdG9tYXIgcHJlc3RhZGFzIGxhcyBidWVuYXMgaWRlYXMgZGUgbG9zIGRlbcOhcy4gTG9zIG1hZXN0cm9zIHB1ZWRlbiBvYnRlbmVyIHBsYW5lcyBkZSBsZWNjaW9uZXMgeSB0YXJlYXMgZGUgY29sZWdhcywgbGEganVudGEgZXNjb2xhciBvIHVuIGVkaXRvciBkZSBsaWJyb3MgZGUgdGV4dG8sIG8gcmV2aXNhciBhbGd1bm9zIE1PT0MgZW4gSW50ZXJuZXQsIHBlcm8gY2FkYSB1bm8gdGllbmUgcXVlIGRlc2N1YnJpciBjw7NtbyBpbXBhcnRpciBsZWNjaW9uZXMgZXNwZWPDrWZpY2FzIGVuIGF1bGFzIGVzcGVjw61maWNhcyBwYXJhIGFsdW1ub3MgZXNwZWPDrWZpY29zLiBFc3RvIGVzIHBhcnRpY3VsYXJtZW50ZSBjaWVydG8gcGFyYSBsb3Mgdm9sdW50YXJpb3MgeSBvdHJvcyBtYWVzdHJvcyBkZSBjYW1wbyBxdWUgcGFydGljaXBhbiBlbiB0YWxsZXJlcyB5IGNhbXBhbWVudG9zIGRlc3B1w6lzIGRlIGxhIGVzY3VlbGEuCgpFc2NyaWJpciBudWV2YXMgdMOpY25pY2FzIHkgZGFyICoqbGVjY2lvbmVzIGRlIGRlbW9zdHJhY2nDs24qKiAoZW4gbGFzIHF1ZSB1bmEgcGVyc29uYSBlbnNlw7FhIGEgZXN0dWRpYW50ZXMgcmVhbGVzIG1pZW50cmFzIG90cm9zIG1hZXN0cm9zIG9ic2VydmFuKSBubyBzb24gc29sdWNpb25lcy4gUG9yIGVqZW1wbG8sIFtGaW5jMjAwNywgRmluYzIwMTJdIGVuY29udHLDsyBxdWUgZGUgbGFzIDk5IGhpc3RvcmlhcyBkZSBjYW1iaW8gYW5hbGl6YWRhcywgbG9zIG1hZXN0cm9zIHNvbG8gYnVzY2Fyb24gYWN0aXZhbWVudGUgbnVldmFzIHByw6FjdGljYXMgbyBtYXRlcmlhbGVzIGVuIHRyZXMgY2Fzb3MsIHkgc29sbyBjb25zdWx0YXJvbiBlbCBtYXRlcmlhbCBwdWJsaWNhZG8gZW4gb2Noby4gTGEgbWF5b3LDrWEgZGUgbG9zIGNhbWJpb3Mgb2N1cnJpZXJvbiBsb2NhbG1lbnRlLCBzaW4gYXBvcnRlcyBkZSBmdWVudGVzIGV4dGVybmFzLCBvIHNvbG8gaW52b2x1Y3Jhcm9uIGludGVyYWNjacOzbiBwZXJzb25hbCBjb24gb3Ryb3MgZWR1Y2Fkb3Jlcy4gW0JhcmsyMDE1XSBlbmNvbnRyw7MgYWxnbyBzaW1pbGFyOgoKPkxhIGFkb3BjacOzbiBubyBlcyB1bmEgImFjY2nDs24gcmFjaW9uYWwiIC4uLiBzaW5vIHVuYSBzZXJpZSBpdGVyYXRpdmEgZGUgZGVjaXNpb25lcyB0b21hZGFzIGVuIHVuIGNvbnRleHRvIHNvY2lhbCwgcXVlIHNlIGJhc2EgZW4gdHJhZGljaW9uZXMgbm9ybWF0aXZhcywgaW5kaWNhY2lvbmVzIHNvY2lhbGVzIHkgcHJvY2Vzb3MgZW1vY2lvbmFsZXMgbyBpbnR1aXRpdm9zIC4uLiBObyBlcyBwcm9iYWJsZSBxdWUgbG9zIHByb2Zlc29yZXMgdXRpbGljZW4gbG9zIHJlc3VsdGFkb3MgZGUgbGEgaW52ZXN0aWdhY2nDs24gZWR1Y2F0aXZhIGNvbW8gYmFzZSBwYXJhIGxhcyBkZWNpc2lvbmVzIGRlIGFkb3BjacOzbiAuLi4gTGEgcmV0cm9hbGltZW50YWNpw7NuIHBvc2l0aXZhIGRlIGxvcyBlc3R1ZGlhbnRlcyBzZSB0b21hIGNvbW8gdW5hIGZ1ZXJ0ZSBldmlkZW5jaWEgcG9yIHBhcnRlIGRlbCBwcm9mZXNvcmFkbyBkZSBxdWUgZGViZW4gY29udGludWFyIHVuYSBwcsOhY3RpY2EuCgpKdWd5b2tlbmt5dSBmdW5jaW9uYSBwb3JxdWUgbWF4aW1pemEgbGEgb3BvcnR1bmlkYWQgZGUgdHJhbnNmZXJlbmNpYSBkZSBjb25vY2ltaWVudG8gbm8gcGxhbmlmaWNhZGEgZW50cmUgbWFlc3Ryb3M6IGFsZ3VpZW4gc2UgcHJvcG9uZSBkZW1vc3RyYXIgWCwgcGVybyBtaWVudHJhcyBsb3MgbWlyYSwgc3UgYXVkaWVuY2lhIHRhbWJpw6luIGFwcmVuZGUgWSAobyBlbiBzdSBsdWdhcikuIFBvciBlamVtcGxvLCB1biBtYWVzdHJvIHBvZHLDrWEgdGVuZXIgbGEgaW50ZW5jacOzbiBkZSBtb3N0cmFyIGEgbG9zIGFsdW1ub3MgY8OzbW8gYnVzY2FyIGRpcmVjY2lvbmVzIGRlIGNvcnJlbyBlbGVjdHLDs25pY28gZW4gdW4gYXJjaGl2byBkZSB0ZXh0bywgcGVybyBsbyBxdWUgc3UgYXVkaWVuY2lhIHBvZHLDrWEgZWxpbWluYXIgc29uIGFsZ3Vub3MgYXRham9zIGRlIHRlY2xhZG8gbnVldm9zLgoKIyMgRGFuZG8geSByZWNpYmllbmRvIHJldHJvYWxpbWVudGFjacOzbiBzb2JyZSBsYSBlbnNlw7FhbnphCk9ic2VydmFyIGEgYWxndWllbiB0ZSBheXVkYSwgeSBkYXJsZSByZXRyb2FsaW1lbnRhY2nDs24gbG8gYXl1ZGEsIHBlcm8gcHVlZGUgc2VyIGRpZsOtY2lsIHJlY2liaXIgcmV0cm9hbGltZW50YWNpw7NuLCBlc3BlY2lhbG1lbnRlIGN1YW5kbyBlcyBuZWdhdGl2byAoRmlndXJhIFtmOiBkZXNlbXBlw7FvLXJldHJvYWxpbWVudGFjacOzbi1zZW50aW1pZW50b3NdKS4KCiFbZjogZGVzZW1wZcOxby1yZXRyb2FsaW1lbnRhY2nDs24tc2VudGltaWVudG9zXSguL2ltZ190cmFuaW5nL2RlYXRoYnVsZ2UtamVyay5qcGcpCgpMYSByZXRyb2FsaW1lbnRhY2nDs24gZXMgbcOhcyBmw6FjaWwgZGUgZGFyIHkgcmVjaWJpciBjdWFuZG8gYW1iYXMgcGFydGVzIGNvbXBhcnRlbiBleHBlY3RhdGl2YXMgc29icmUgbG8gcXVlIGVzdMOhIHkgbm8gZXN0w6EgZW4gZWwgYWxjYW5jZSB5IHNvYnJlIGPDs21vIHNlIGRlYmVuIHJlZGFjdGFyIGxvcyBjb21lbnRhcmlvcy4gU2kgdXN0ZWQgZXMgbGEgcGVyc29uYSBxdWUgc29saWNpdGEgY29tZW50YXJpb3M6CgoqKkluaWNpYXIgY29tZW50YXJpb3MuKiogRXMgbWVqb3IgcGVkaXIgY29tZW50YXJpb3MgcXVlIHJlY2liaXJsb3MgZGUgbWFsYSBnYW5hLgoKKipFbGlnZSB0dXMgcHJvcGlhcyBwcmVndW50YXMsKiogZXMgZGVjaXIsIHBlZGlyIGNvbWVudGFyaW9zIGVzcGVjw61maWNvcy4gRXMgbXVjaG8gbcOhcyBkaWbDrWNpbCBwYXJhIGFsZ3VpZW4gcmVzcG9uZGVyOiAiwr9RdcOpIHRlIHBhcmVjZT8iIHF1ZSByZXNwb25kZXI6ICLCv0VzdGFiYSBoYWJsYW5kbyBkZW1hc2lhZG8gcsOhcGlkbz8iIG8gIsK/UXXDqSBlcyB1bmEgY29zYSBkZSBlc3RhIGxlY2Npw7NuIHF1ZSBkZWJlcsOtYSBzZWd1aXIgaGFjaWVuZG8/IiBEaXJpZ2lyIGNvbWVudGFyaW9zIGNvbW8gZXN0ZSB0YW1iacOpbiBlcyBtw6FzIMO6dGlsIHBhcmEgdXN0ZWQuIFNpZW1wcmUgZXMgbWVqb3IgdHJhdGFyIGRlIGFycmVnbGFyIHVuYSBjb3NhIGEgbGEgdmV6IHF1ZSBjYW1iaWFyIHRvZG8geSBlc3BlcmFyIHF1ZSBzZWEgcGFyYSBtZWpvci4gRGlyaWdpciBjb21lbnRhcmlvcyBzb2JyZSBhbGdvIGVuIGxvIHF1ZSBoYXMgZWxlZ2lkbyB0cmFiYWphciB0ZSBheXVkYSBhIG1hbnRlbmVydGUgZW5mb2NhZG8sIGxvIHF1ZSBhIHN1IHZleiBhdW1lbnRhIGxhcyBwcm9iYWJpbGlkYWRlcyBkZSBxdWUgdmVhcyBwcm9ncmVzby4KCioqVXNlIHVuIHRyYWR1Y3RvciBkZSBjb21lbnRhcmlvcy4qKiBIYWdhIHF1ZSBvdHJhIHBlcnNvbmEgbGVhIHRvZG9zIGxvcyBjb21lbnRhcmlvcyB5IGxlIGTDqSB1biByZXN1bWVuLiBQdWVkZSBzZXIgbcOhcyBmw6FjaWwgZXNjdWNoYXI6ICJWYXJpYXMgcGVyc29uYXMgcGllbnNhbiBxdWUgcG9kcsOtYSBhY2VsZXJhciB1biBwb2NvIiwgcXVlIGxlZXIgdmFyaWFzIG5vdGFzIHF1ZSBkaWNlbjogIkVzdG8gZXMgZGVtYXNpYWRvIGxlbnRvIiBvICJFc3RvIGVzIGFidXJyaWRvIi4KCioqU2VyIGFtYWJsZSBjb24gdXN0ZWQgbWlzbW8uKiogTXVjaG9zIGRlIG5vc290cm9zIHNvbW9zIG11eSBjcsOtdGljb3MgY29uIG5vc290cm9zIG1pc21vcywgcG9yIGxvIHF1ZSBzaWVtcHJlIGVzIMO6dGlsIGFub3RhciBsbyBxdWUgcGVuc2Ftb3MgZGUgbm9zb3Ryb3MgbWlzbW9zIGFudGVzIGRlIHJlY2liaXIgY29tZW50YXJpb3MgZGUgbG9zIGRlbcOhcy4gRXNvIG5vcyBwZXJtaXRlIGNvbXBhcmFyIGxvIHF1ZSBwZW5zYW1vcyBkZSBudWVzdHJvIGRlc2VtcGXDsW8gY29uIGxvIHF1ZSBvdHJvcyBwaWVuc2FuLCBsbyBxdWUgYSBzdSB2ZXogbm9zIHBlcm1pdGUgZXNjYWxhciBlbCBwcmltZXJvIGNvbiBtYXlvciBwcmVjaXNpw7NuLiBQb3IgZWplbXBsbywgZXMgbXV5IGNvbcO6biBxdWUgbGFzIHBlcnNvbmFzIHBpZW5zZW4gcXVlIGVzdMOhbiBkaWNpZW5kbyAidW0iIHkgImVyciIgY29uIGRlbWFzaWFkYSBmcmVjdWVuY2lhIGN1YW5kbyBzdSBhdWRpZW5jaWEgbm8gbG8gbm90YS4gT2J0ZW5lciBlc2EgcmV0cm9hbGltZW50YWNpw7NuIHVuYSB2ZXogbGVzIHBlcm1pdGUgYSBsb3MgbWFlc3Ryb3MgYWp1c3RhciBzdSBldmFsdWFjacOzbiBkZSBzw60gbWlzbW9zIGxhIHByw7N4aW1hIHZleiBxdWUgc2Ugc2llbnRhbiBhc8OtLgpUYW1iacOpbiBwdWVkZSBkYXIgcmV0cm9hbGltZW50YWNpw7NuIGEgb3Ryb3MgZGUgbWFuZXJhIG3DoXMgZWZlY3RpdmE6CgoqKkludGVyYWN0dWFyLioqIApNaXJhciBmaWphbWVudGUgYSBhbGd1aWVuIGVzIHVuYSBidWVuYSBtYW5lcmEgZGUgaGFjZXIgcXVlIHNlIHNpZW50YSBpbmPDs21vZG8sIHBvciBsbyBxdWUgc2kgZGVzZWEgZGFyIHN1IG9waW5pw7NuIHNvYnJlIGPDs21vIGFsZ3VpZW4gbm9ybWFsbWVudGUgZW5zZcOxYSwgZGViZSB0cmFucXVpbGl6YXJsby4gSW50ZXJhY3R1YXIgY29uIGVsbG9zIGRlIGxhIGZvcm1hIGVuIHF1ZSBsbyBoYXLDrWEgdW4gYWx1bW5vIHJlYWwgZXMgdW5hIGJ1ZW5hIG1hbmVyYSBkZSBoYWNlcmxvLCBhc8OtIHF1ZSBoYWdhIHByZWd1bnRhcyBvIChmaW5qYSkgZXNjcmliaXIganVudG8gY29uIHN1IGVqZW1wbG8uIFNpIHVzdGVkIGVzIHBhcnRlIGRlIHVuIGdydXBvLCBoYWdhIHF1ZSB1bmEgbyBkb3MgcGVyc29uYXMgZGVzZW1wZcOxZW4gZWwgcGFwZWwgZGUgYXByZW5kaWNlcyBtaWVudHJhcyBsb3MgZGVtw6FzIHRvbWFuIG5vdGFzLgoKKipCYWxhbmNlIGRlIHJldHJvYWxpbWVudGFjacOzbiBwb3NpdGl2YSB5IG5lZ2F0aXZhLioqIEVsICJzw6FuZHdpY2ggZGUgY3VtcGxpZG8iIGNvbXB1ZXN0byBwb3IgdW4gY29tZW50YXJpbyBwb3NpdGl2bywgdW5vIG5lZ2F0aXZvIHkgdW4gc2VndW5kbyBwb3NpdGl2byBzZSB2dWVsdmUgY2Fuc2Fkb3IgY29uIGJhc3RhbnRlIHJhcGlkZXosIHBlcm8gZXMgaW1wb3J0YW50ZSBkZWNpcmxlIGEgbGFzIHBlcnNvbmFzIHF1w6kgZGViZW4gc2VndWlyIGhhY2llbmRvIHkgcXXDqSBkZWJlbiBjYW1iaWFyMTk1LgoKKipUb21hIG5vdGEuKioKTm8gcmVjb3JkYXLDoSB0b2RvIGxvIHF1ZSBub3TDsyBzaSBsYSBwcmVzZW50YWNpw7NuIGR1cmEgbcOhcyBkZSB1bm9zIHNlZ3VuZG9zLCB5IGRlZmluaXRpdmFtZW50ZSBubyByZWNvcmRhcsOhIGNvbiBxdcOpIGZyZWN1ZW5jaWEgbG9zIG5vdMOzLiBIYWdhIHVuYSBub3RhIGxhIHByaW1lcmEgdmV6IHF1ZSBhbGdvIHN1Y2VkZSB5IGx1ZWdvIGFncmVndWUgdW5hIG1hcmNhIGRlIHZlcmlmaWNhY2nDs24gY3VhbmRvIHZ1ZWx2YSBhIG9jdXJyaXIgcGFyYSBxdWUgcHVlZGEgb3JkZW5hciBzdXMgY29tZW50YXJpb3MgcG9yIGZyZWN1ZW5jaWEuCgpUb21hciBub3RhcyBlcyBtw6FzIGVmaWNpZW50ZSBjdWFuZG8gdGllbmVzIGFsZ8O6biB0aXBvIGRlIHLDumJyaWNhIHBhcmEgcXVlIG5vIHRlIGFwcmVzdXJlcyBhIGVzY3JpYmlyIHR1cyBvYnNlcnZhY2lvbmVzIG1pZW50cmFzIGxhIHBlcnNvbmEgcXVlIGVzdMOhcyBvYnNlcnZhbmRvIHRvZGF2w61hIGVzdMOhIGhhYmxhbmRvLiBMYSByw7picmljYSBtw6FzIHNpbXBsZSBwYXJhIGxvcyBjb21lbnRhcmlvcyBkZSBmb3JtYSBsaWJyZSBkZSB1biBncnVwbyBlcyB1bmEgY3VhZHLDrWN1bGEgZGUgMngyIGN1eW8gZWplIHZlcnRpY2FsIGVzdMOhIGV0aXF1ZXRhZG8gY29tbyAibG8gcXVlIHNhbGnDsyBiaWVuIiB5ICJsbyBxdWUgc2UgcHVlZGUgbWVqb3JhciIsIHkgY3V5byBlamUgaG9yaXpvbnRhbCBlc3TDoSBldGlxdWV0YWRvIGNvbW8gImNvbnRlbmlkbyIgKGxvIHF1ZSBzZSBkaWpvKSB5ICJwcmVzZW50YWNpw7NuIOKAnShDb21vIHNlIGRpam8pLiBMb3Mgb2JzZXJ2YWRvcmVzIGVzY3JpYmVuIHN1cyBjb21lbnRhcmlvcyBlbiBub3RhcyBhZGhlc2l2YXMgbWllbnRyYXMgbWlyYW4gbGEgZGVtb3N0cmFjacOzbiwgbHVlZ28gbG9zIHB1YmxpY2FuIGVuIGxvcyBjdWFkcmFudGVzIGRlIHVuYSBjdWFkcsOtY3VsYSBkaWJ1amFkYSBlbiB1bmEgcGl6YXJyYSAoRmlndXJhIFtmOiByw7picmljYSBkZSByZW5kaW1pZW50b10pLgoKIVtmOiByw7picmljYSBkZSByZW5kaW1pZW50b10oLi9pbWdfdHJhbmluZy8yeDItcnVicmljLnN2ZykKCj4qKlLDumJyaWNhcyB5IHByZXN1cHVlc3RvcyBkZSBwcmVndW50YXMqKgo+Cj5MYSBTZWNjacOzbiAyMS4xIGNvbnRpZW5lIHVuYSByw7picmljYSBkZSBtdWVzdHJhIHBhcmEgZXZhbHVhciBkZSA1IGEgMTAgbWludXRvcyBkZSBpbnN0cnVjY2nDs24gZGUgcHJvZ3JhbWFjacOzbi4gUHJlc2VudGEgZWxlbWVudG9zIGVuIG3DoXMgbyBtZW5vcyBlbCBvcmRlbiBlbiBxdWUgZXMgcHJvYmFibGUgcXVlIGFwYXJlemNhbiwgcC4gTGFzIHByZWd1bnRhcyBzb2JyZSBsYSBpbnRyb2R1Y2Npw7NuIHZpZW5lbiBhbnRlcyBxdWUgbGFzIHByZWd1bnRhcyBzb2JyZSBsYSBjb25jbHVzacOzbi4KPgo+TGFzIHLDumJyaWNhcyBjb21vIGVzdGEgdGllbmRlbiBhIGNyZWNlciBjb24gZWwgdGllbXBvIGEgbWVkaWRhIHF1ZSBsYXMgcGVyc29uYXMgcGllbnNhbiBlbiBjb3NhcyBxdWUgbGVzIGd1c3RhcsOtYSBhZ3JlZ2FyLiBVbmEgYnVlbmEgbWFuZXJhIGRlIG1hbnRlbmVybG9zIG1hbmVqYWJsZXMgZXMgaW5zaXN0aXIgZW4gcXVlIGxhIGxvbmdpdHVkIHRvdGFsIHBlcm1hbmV6Y2EgY29uc3RhbnRlOiBzaSBhbGd1aWVuIGRlc2VhIGFncmVnYXIgdW5hIHByZWd1bnRhLCBkZWJlIGlkZW50aWZpY2FyIHVuYSBxdWUgc2VhIG1lbm9zIGltcG9ydGFudGUgeSBxdWUgcHVlZGEgZWxpbWluYXJzZS4KClNpIGVzdMOhIGludGVyZXNhZG8gZW4gZGFyIHkgcmVjaWJpciByZXRyb2FsaW1lbnRhY2nDs24sIFtHb3JtMjAxNF0gdGllbmUgYnVlbm9zIGNvbnNlam9zIHF1ZSBwdWVkZSB1c2FyIHBhcmEgaGFjZXIgcXVlIGxhIHJldHJvYWxpbWVudGFjacOzbiBlbnRyZSBwYXJlcyBzZWEgdW5hIHBhcnRlIHJ1dGluYXJpYSBkZSBzdSBlbnNlw7FhbnphLCBtaWVudHJhcyBxdWUgW0dhd2EyMDExXSBhbmFsaXphIGVsIHZhbG9yIGRlIHRlbmVyIHVuIGVudHJlbmFkb3IuCgo+KipDbGFzZXMgZGUgZXN0dWRpbyoqCj4KPkxhcyBlc2N1ZWxhcyBkZSBhcnF1aXRlY3R1cmEgYSBtZW51ZG8gaW5jbHV5ZW4gY2xhc2VzIGRlIGVzdHVkaW8gZW4gbGFzIHF1ZSBsb3MgZXN0dWRpYW50ZXMgcmVzdWVsdmVuIHBlcXVlw7FvcyBwcm9ibGVtYXMgZGUgZGlzZcOxbyB5IHJlY2liZW4gY29tZW50YXJpb3MgZGUgc3VzIGNvbXBhw7Flcm9zIGVuIGVzZSBtaXNtbyBtb21lbnRvLiBFc3RhcyBjbGFzZXMgc29uIG3DoXMgZWZlY3RpdmFzIGN1YW5kbyBlbCBtYWVzdHJvIGNyaXRpY2EgbGFzIGNyw610aWNhcyBkZSBsb3MgY29tcGHDsWVyb3MgcGFyYSBxdWUgbG9zIHBhcnRpY2lwYW50ZXMgYXByZW5kYW4gbm8gc29sbyBjw7NtbyBjb25zdHJ1aXIgZWRpZmljaW9zIHNpbm8gdGFtYmnDqW4gY8OzbW8gZGFyIHkgcmVjaWJpciBjb21lbnRhcmlvcyBbU2NobzE5ODRdLiBMYXMgY2xhc2VzIG1hZ2lzdHJhbGVzIGRlIG3DunNpY2EgdGllbmVuIHVuIHByb3DDs3NpdG8gc2ltaWxhciwgeSBoZSBkZXNjdWJpZXJ0byBxdWUgZGFyIHJldHJvYWxpbWVudGFjacOzbiBzb2JyZSBsYSByZXRyb2FsaW1lbnRhY2nDs24gYXl1ZGEgYSBsYXMgcGVyc29uYXMgYSBtZWpvcmFyIHN1IGVuc2XDsWFuemEgdGFtYmnDqW4uCgojIyBDw7NtbyBwcmFjdGljYXIgZWwgcmVuZGltaWVudG8KTGEgbWVqb3IgbWFuZXJhIGRlIG1lam9yYXIgbGEgZW50cmVnYSBkZSBsZWNjaW9uZXMgZW4gcGVyc29uYSBlcyBvYnNlcnZhcnNlIGEgc8OtIG1pc21vIGhhY2VybG86CgoqIFRyYWJhamFyIGVuIGdydXBvcyBkZSB0cmVzLgoKKiBDYWRhIHBlcnNvbmEgcm90YSBhIHRyYXbDqXMgZGUgbG9zIHJvbGVzIGRlIG1hZXN0cm8sIGF1ZGllbmNpYSB5IGNhbWFyw7NncmFmby4gRWwgcHJvZmVzb3IgdGllbmUgMiBtaW51dG9zIHBhcmEgZXhwbGljYXIgYWxnby4gTGEgcGVyc29uYSBxdWUgcHJldGVuZGUgc2VyIGVsIHDDumJsaWNvIGVzdMOhIGFsbMOtIHBhcmEgZXN0YXIgYXRlbnRvLCBtaWVudHJhcyBxdWUgZWwgY2FtYXLDs2dyYWZvIGdyYWJhIGxhIHNlc2nDs24gY29uIHVuIHRlbMOpZm9ubyBjZWx1bGFyIHUgb3RybyBkaXNwb3NpdGl2byBwb3J0w6F0aWwuCgoqIERlc3B1w6lzIGRlIHF1ZSB0b2RvcyBoYXlhbiB0ZXJtaW5hZG8gZGUgZW5zZcOxYXIsIHRvZG8gZWwgZ3J1cG8gbWlyYSBsb3MgdmlkZW9zIGp1bnRvcy4gVG9kb3MgZGFuIHN1IG9waW5pw7NuIHNvYnJlIGxvcyB0cmVzIHZpZGVvcywgZXMgZGVjaXIsIGRhbiBzdSBvcGluacOzbiBzb2JyZSBzw60gbWlzbW9zIHkgc29icmUgbG9zIGRlbcOhcy4KCiogRGVzcHXDqXMgZGUgcXVlIGxvcyB2aWRlb3MgaGFuIHNpZG8gZGlzY3V0aWRvcywgc2UgZWxpbWluYW4uIChNdWNoYXMgcGVyc29uYXMgc2Ugc2llbnRlbiBpbmPDs21vZGFzIHBvciBsYXMgaW3DoWdlbmVzIHF1ZSBhcGFyZWNlbiBlbiBsw61uZWEpLgoKKiBGaW5hbG1lbnRlLCB0b2RhIGxhIGNsYXNlIHZ1ZWx2ZSBhIHJldW5pcnNlIHkgYWdyZWdhIHRvZG9zIGxvcyBjb21lbnRhcmlvcyBhIHVuYSBjdWFkcsOtY3VsYSBjb21wYXJ0aWRhIGRlIDJ4MiBkZWwgdGlwbyBkZXNjcml0byBhbnRlcmlvcm1lbnRlIHNpbiBkZWNpciBkZSBxdWnDqW4gdHJhdGEgY2FkYSBlbGVtZW50byBkZSBjb21lbnRhcmlvcy4KClBhcmEgcXVlIGVzdGUgZWplcmNpY2lvIGZ1bmNpb25lIGJpZW46CgoqIEdyYWJlIGxvcyB0cmVzIHZpZGVvcyB5IGx1ZWdvIG1pcmUgbG9zIHRyZXMuIFNpIGVsIGNpY2xvIGVzIGVuc2XDsWFyLXJldmlzYXItZW5zZcOxYXItcmV2aXNhciwgbGEgw7psdGltYSBwZXJzb25hIHF1ZSBlbnNlw7FhIGludmFyaWFibGVtZW50ZSBzZSBxdWVkYSBzaW4gdGllbXBvIChhIHZlY2VzIGEgcHJvcMOzc2l0bykuIEhhY2VyIHRvZGFzIGxhcyByZXZpc2lvbmVzIGRlc3B1w6lzIGRlIHRvZGEgbGEgZW5zZcOxYW56YSB0YW1iacOpbiBheXVkYSBhIHBvbmVyIHVuIHBvY28gZGUgZGlzdGFuY2lhIGVudHJlIGxvcyBkb3MsIGxvIHF1ZSBoYWNlIHF1ZSBlbCBlamVyY2ljaW8gc2VhIHVuIHBvY28gbWVub3MgaW5zb3BvcnRhYmxlLgoKKiBEZWplIHF1ZSBsYXMgcGVyc29uYXMgc2VwYW4gYWwgY29taWVuem8gZGUgbGEgY2xhc2UgcXVlIHNlIGxlcyBwZWRpcsOhIHF1ZSBlbnNlw7FlbiBhbGdvIHBhcmEgcXVlIHRlbmdhbiB0aWVtcG8gZGUgZWxlZ2lyIHVuIHRlbWEuIERlY2lybGVzIGVzdG8gY29uIGRlbWFzaWFkYSBhbnRpY2lwYWNpw7NuIHB1ZWRlIHNlciBjb250cmFwcm9kdWNlbnRlLCB5YSBxdWUgYWxndW5hcyBwZXJzb25hcyBzZSBwcmVvY3VwYXLDoW4gcG9yIGN1w6FudG8gZGViZW4gcHJlcGFyYXJzZS4KCiogTG9zIGdydXBvcyBkZWJlbiBlc3RhciBmw61zaWNhbWVudGUgc2VwYXJhZG9zIHBhcmEgcmVkdWNpciBsYXMgY29udmVyc2FjaW9uZXMgZGUgYXVkaW8gZW50cmUgc3VzIGdyYWJhY2lvbmVzLiBFbiBsYSBwcsOhY3RpY2EsIGVzdG8gc2lnbmlmaWNhIDLigJMzIGdydXBvcyBlbiB1biBhdWxhIGRlIHRhbWHDsW8gbm9ybWFsLCB5IGVsIHJlc3RvIHV0aWxpemEgZXNwYWNpb3MgZGUgZGVzY2Fuc28gY2VyY2Fub3MsIHNhbG9uZXMgZGUgY2Fmw6ksIG9maWNpbmFzIG8gKGVuIHVuYSBvY2FzacOzbikgZWwgYXJtYXJpbyBkZSB1biBjb25zZXJqZS4KCiogTGFzIHBlcnNvbmFzIGRlYmVuIGRhciByZXRyb2FsaW1lbnRhY2nDs24gc29icmUgc8OtIG1pc21hcyB5IGVudHJlIHPDrSBwYXJhIHBvZGVyIGNhbGlicmFyIHN1cyBpbXByZXNpb25lcyBkZSBzdSBwcm9waWEgZW5zZcOxYW56YSBjb250cmEgbGFzIGRlIG90cmFzIHBlcnNvbmFzLiBMYSBtYXlvcsOtYSBkZSBsYXMgcGVyc29uYXMgc29uIG3DoXMgZHVyYXMgZGUgbG8gcXVlIGRlYmVyw61hbiBzZXIsIHkgZXMgaW1wb3J0YW50ZSBxdWUgc2UgZGVuIGN1ZW50YSBkZSBlc3RvLgoKRWwgYW51bmNpbyBkZSBlc3RlIGVqZXJjaWNpbyBhIG1lbnVkbyBlcyByZWNpYmlkbyBjb24gZ2VtaWRvcyB5IGFwcmVuc2nDs24sIHlhIHF1ZSBwb2NhcyBwZXJzb25hcyBkaXNmcnV0YW4gZGUgdmVyc2UgbyBlc2N1Y2hhcnNlIGEgc8OtIG1pc21hcy4gU2luIGVtYmFyZ28sIGVzYXMgbWlzbWFzIHBlcnNvbmFzIGxvIGNhbGlmaWNhbiBjb25zdGFudGVtZW50ZSBjb21vIHVuYSBkZSBsYXMgcGFydGVzIG3DoXMgdmFsaW9zYXMgZGUgbG9zIHRhbGxlcmVzIGRlIGVuc2XDsWFuemEuIFRhbWJpw6luIGVzIHVuYSBidWVuYSBwcmVwYXJhY2nDs24gcGFyYSBsYSBjby1lbnNlw7FhbnphIChTZWNjacOzbiA5LjMpOiBhIGxvcyBtYWVzdHJvcyBsZXMgcmVzdWx0YSBtdWNobyBtw6FzIGbDoWNpbCBpbnRlcmNhbWJpYXJzZSBjb21lbnRhcmlvcyBpbmZvcm1hbGVzIHNpIGhhbiB0ZW5pZG8gYWxnbyBkZSBwcsOhY3RpY2EgeSB0aWVuZW4gdW5hIHLDumJyaWNhIGNvbXBhcnRpZGEgcGFyYSBlc3RhYmxlY2VyIGV4cGVjdGF0aXZhcy4KClkgaGFibGFuZG8gZGUgcsO6YnJpY2FzOiB1bmEgdmV6IHF1ZSBsYSBjbGFzZSBoYXlhIHB1ZXN0byB0b2RvcyBzdXMgY29tZW50YXJpb3MgZW4gdW5hIGN1YWRyw61jdWxhIGNvbXBhcnRpZGEsIGVsaWphIHVuIHB1w7FhZG8gZGUgY29tZW50YXJpb3MgcG9zaXRpdm9zIHkgbmVnYXRpdm9zLCBlc2Nyw61iYWxvcyBjb21vIHVuYSBsaXN0YSBkZSB2ZXJpZmljYWNpw7NuIHkgaGFnYSBxdWUgaGFnYW4gZWwgZWplcmNpY2lvIG51ZXZhbWVudGUuIExhIG1heW9yw61hIGRlIGxhcyBwZXJzb25hcyBzZSBzaWVudGVuIG3DoXMgY8OzbW9kYXMgbGEgc2VndW5kYSB2ZXosIHkgbGEgZXZhbHVhY2nDs24gZGUgbGFzIGNvc2FzIHF1ZSBlbGxvcyBtaXNtb3MgaGFuIGRlY2lkaWRvIHF1ZSBlcyBpbXBvcnRhbnRlIGF1bWVudGEgc3Ugc2VudGlkbyBkZSBhdXRvZGV0ZXJtaW5hY2nDs24gKENhcMOtdHVsbyAxMCkuCgo+KipEaWNlKioKPgo+VG9kb3MgdGVuZW1vcyBow6FiaXRvcyBuZXJ2aW9zb3M6IGhhYmxhbW9zIG3DoXMgcsOhcGlkbyB5IGNvbiB1bmEgdm96IG3DoXMgYWd1ZGEgZGUgbG8gbm9ybWFsIGN1YW5kbyBlc3RhbW9zIGVuIGVsIGVzY2VuYXJpbywganVnYW1vcyBjb24gbnVlc3RybyBjYWJlbGxvIG8gbm9zIHJvbXBlbW9zIGxvcyBudWRpbGxvcy4gTG9zIGp1Z2Fkb3JlcyBsbGFtYW4gYSBlc3RvcyAiYXZpc29zIiwgeSBsYXMgcGVyc29uYXMgYSBtZW51ZG8gbm8gc2UgZGFuIGN1ZW50YSBkZSBxdWUgbWFyY2FuLCBtaXJhbiBzdXMgemFwYXRvcyBvIGhhY2VuIHJ1aWRvIGVuIHN1IGJvbHNpbGxvIGN1YW5kbyBlbiByZWFsaWRhZCBubyBzYWJlbiBsYSByZXNwdWVzdGEgYSB1bmEgcHJlZ3VudGEuCj4KPk5vIHB1ZWRlcyBkZXNoYWNlcnRlIGRlIGxvcyBhdmlzb3MgcG9yIGNvbXBsZXRvLCBlIGludGVudGFyIGhhY2VybG8gcHVlZGUgaGFjZXIgcXVlIHRlIG9ic2VzaW9uZXMgY29uIGVsbG9zLiBVbmEgbWVqb3IgZXN0cmF0ZWdpYSBlcyB0cmF0YXIgZGUgZGVzcGxhemFybG9zLCBwb3IgZWplbXBsbywgZW50cmVuYXJzZSBwYXJhIGFwcmV0YXIgbG9zIGRlZG9zIGRlIGxvcyBwaWVzIGRlbnRybyBkZSBsb3MgemFwYXRvcyBjdWFuZG8gZXN0w6EgbmVydmlvc28gZW4gbHVnYXIgZGUgbGltcGlhciBsYSBvcmVqYSBjb24gZWwgZGVkbyBtZcOxaXF1ZS4KCgojIyBFamVyY2ljaW9zCgojIyMgRGFyIGNvbWVudGFyaW9zIHNvYnJlIGxhIG1hbGEgZW5zZcOxYW56YSAodG9kYSBsYSBjbGFzZSAvIDIwKQoKQ29tbyBncnVwbywgbWlyZW4gZXN0ZSB2aWRlbyBkZSBtYWxhcyBlbnNlw7FhbnphcyB5IGRlbiBzdSBvcGluacOzbiBzb2JyZSBkb3MgZWplczogcG9zaXRpdm8gdmVyc3VzIG5lZ2F0aXZvIHkgY29udGVuaWRvIHZlcnN1cyBwcmVzZW50YWNpw7NuLiBIYWdhIHF1ZSBjYWRhIHBlcnNvbmEgZW4gbGEgY2xhc2UgYWdyZWd1ZSB1biBwdW50byBhIHVuYSBjdWFkcsOtY3VsYSBkZSAyeDIgZW4gdW5hIHBpemFycmEgbyBlbiBsYXMgbm90YXMgY29tcGFydGlkYXMgc2luIGR1cGxpY2FyIG5pbmfDum4gcHVudG8uIMK/UXXDqSB2aWVyb24gb3RyYXMgcGVyc29uYXMgcXVlIHRlIHBlcmRpc3RlPyDCv0NvbiBxdcOpIHBlbnNhcm9uIHF1ZSBlc3RhYmFzIHRvdGFsbWVudGUgZGUgYWN1ZXJkbyBvIGVuIGRlc2FjdWVyZG8/CgojIyMgUHJhY3RpY2FyIGRhciBjb21lbnRhcmlvcyAoZ3J1cG9zIHBlcXVlw7FvcyAvIDQ1KQpVc2UgZWwgcHJvY2VzbyBkZXNjcml0byBlbiBsYSBTZWNjacOzbiA4LjQgcGFyYSBwcmFjdGljYXIgbGEgZW5zZcOxYW56YSBlbiBncnVwb3MgZGUgdHJlcyB5IGFncnVwYXIgbG9zIGNvbWVudGFyaW9zLgoKIyMjIExvIG1hbG8geSBsbyBidWVubyAodG9kYSBsYSBjbGFzZSAvIDIwKQpNaXJlIGxvcyB2aWRlb3MgZGUgY29kaWZpY2FjacOzbiBlbiB2aXZvIG1hbCByZWFsaXphZG9zIHkgbGEgY29kaWZpY2FjacOzbiBlbiB2aXZvIGJpZW4gaGVjaGEgeSByZXN1bWEgc3VzIGNvbWVudGFyaW9zIHNvYnJlIGxhcyBkaWZlcmVuY2lhcyB1dGlsaXphbmRvIGxhIGN1YWRyw61jdWxhIDJ4MiBoYWJpdHVhbC4gwr9Dw7NtbyBlcyBsYSBzZWd1bmRhIHJvbmRhIGRlIGVuc2XDsWFuemEgbWVqb3IgcXVlIGxhIHByaW1lcmE/IMK/SGF5IGFsZ28gbWVqb3IgZW4gZWwgcHJpbWVybyBxdWUgZW4gZWwgc2VndW5kbz8KCiMjIyBNaXJhLCBsdWVnbyBoYXogKHBhcmVzIC8gMzApCkVuc2XDsWUgM+KAkzQgbWludXRvcyBkZSB1bmEgbGVjY2nDs24gdXNhbmRvIGNvZGlmaWNhY2nDs24gZW4gdml2byBhIHVuIGNvbXBhw7Flcm8gZGUgY2xhc2UsIGx1ZWdvIGludGVyY2FtYmllIHkgbWlyZSBtaWVudHJhcyBlc2EgcGVyc29uYSBjb2RpZmljYSBlbiB2aXZvIHBhcmEgdXN0ZWQuIE5vIHNlIG1vbGVzdGUgZW4gaW50ZW50YXIgZ3JhYmFyIGVzdGFzIHNlc2lvbmVzIChlcyBkaWbDrWNpbCBjYXB0dXJhciB0YW50byBhIGxhIHBlcnNvbmEgY29tbyBhIGxhIHBhbnRhbGxhIGNvbiB1biBkaXNwb3NpdGl2byBwb3J0w6F0aWwpLCBwZXJvIGVudsOtZSBzdXMgY29tZW50YXJpb3MgZGUgbGEgbWlzbWEgbWFuZXJhIHF1ZSBsbyBoaXpvIGFudGVyaW9ybWVudGUuIEV4cGxpcXVlIGRlIGFudGVtYW5vIGEgc3UgY29tcGHDsWVybyBhcHJlbmRpeiBxdcOpIHZhIGEgZW5zZcOxYXIgeSBjb24gcXXDqSBzZSBlc3BlcmEgcXVlIGVzdMOpbiBmYW1pbGlhcml6YWRvcyBsb3MgYWx1bW5vcyBjb24gbG9zIHF1ZSBsbyBlbnNlw7FhLgoKKiDCv1F1w6kgc2Ugc2llbnRlIGRpZmVyZW50ZSBhY2VyY2EgZGUgbGEgY29kaWZpY2FjacOzbiBlbiB2aXZvIGVuIGNvbXBhcmFjacOzbiBjb24gcG9uZXJzZSBkZSBwaWUgeSBkYXIgY29uZmVyZW5jaWFzPyDCv1F1w6kgZnVlIG3DoXMgZsOhY2lsIG8gbcOhcyBkaWbDrWNpbD8KCiogwr9Db21ldGlzdGUgYWxnw7puIGVycm9yPyBTaSBlcyBhc8OtLCDCv2PDs21vIGxvcyBtYW5lamFzdGU/CgoqIMK/SGFibGFzdGUgeSBlc2NyaWJpc3RlIGFsIG1pc21vIHRpZW1wbywgbyBhbHRlcm5hdGl2YW1lbnRlPwoKKiDCv0NvbiBxdcOpIGZyZWN1ZW5jaWEgYXB1bnRhc3RlIGEgbGEgcGFudGFsbGE/IMK/Q29uIHF1w6kgZnJlY3VlbmNpYSByZXNhbHRhc3RlIGNvbiBlbCBtb3VzZT8KCiogwr9RdcOpIGludGVudGFyw6FzIHNlZ3VpciBoYWNpZW5kbyBsYSBwcsOzeGltYSB2ZXo/IMK/UXXDqSBpbnRlbnRhcsOhcyBoYWNlciBkZSBtYW5lcmEgZGlmZXJlbnRlPwoKIyMjIEN1ZW50YSAoZ3J1cG9zIHBlcXVlw7FvcyAvIDE1KQoKKiBUb21lIG5vdGEgZGUgbG8gcXVlIGNyZWUgcXVlIHNvbiBzdXMgYXZpc29zLCBwZXJvIG5vIGxvcyBjb21wYXJ0YSBjb24gb3RyYXMgcGVyc29uYXMuCgoqIEVuc2XDsWUgdW5hIGxlY2Npw7NuIGNvcnRhIChkZSAyIGEgMyBtaW51dG9zIGRlIGR1cmFjacOzbikuCgoqIFByZWd1bnRhIGEgdHUgYXVkaWVuY2lhIGPDs21vIGNyZWVuIHF1ZSB0cmFpY2lvbmFzIGVsIG5lcnZpb3Npc21vLiDCv1N1IGxpc3RhIGVzIGxhIG1pc21hIHF1ZSBsYSB0dXlhPwoKIyMjIENvbnNlam9zIGRlIGVuc2XDsWFuemEgKGdydXBvcyBwZXF1ZcOxb3MgLyAxNSkKRWwgc2l0aW8gZGUgQ1MgVGVhY2hpbmcgVGlwcyB0aWVuZSB1bmEgZ3JhbiBjYW50aWRhZCBkZSBjb25zZWpvcyBwcsOhY3RpY29zIHNvYnJlIGxhIGVuc2XDsWFuemEgZGUgbGEgaW5mb3Jtw6F0aWNhLCBhc8OtIGNvbW8gdW5hIGNvbGVjY2nDs24gZGUgaG9qYXMgZGUgY29uc2Vqb3MgZGVzY2FyZ2FibGVzLiBSZXZpc2Ugc3VzIGhvamFzIGRlIGNvbnNlam9zIGVuIHBlcXVlw7FvcyBncnVwb3MgeSBjbGFzaWZpcXVlIGNhZGEgY29uc2VqbyBkZSBhY3VlcmRvIGEgc2kgbG8gdXNhIHRvZG8gZWwgdGllbXBvLCBsbyB1c2Egb2Nhc2lvbmFsbWVudGUgbyBudW5jYSBsbyB1c2EuIMK/RW4gcXXDqSBkaWZpZXJlbiBzdSBwcsOhY3RpY2EgeSBsYSBwcsOhY3RpY2EgZGUgc3VzIGNvbXBhw7Flcm9zPyDCv0hheSBhbGfDum4gY29uc2VqbyBjb24gZWwgcXVlIG5vIGVzdMOpcyBkZSBhY3VlcmRvIG8gY3JlYXMgcXVlIHNlcsOtYSBpbmVmaWNhej8KCiMjIFJlc3VtZW4KCiFbcmVhbGltZW50YWNpb25dKC4vaW1nX3RyYW5pbmcvY29uY2VwdG1hcC1mZWVkYmFjay5zdmcpCgotLS0tLQoKCiMgRW4gZWwgYXVsYQoKRWwgY2Fww610dWxvIGFudGVyaW9yIGRlc2NyaWJpw7MgY8OzbW8gcHJhY3RpY2FyIGxhIGVudHJlZ2EgZGUgbGVjY2lvbmVzIHkgZGVzY3JpYmnDsyB1biBtw6l0b2RvLCBsYSBjb2RpZmljYWNpw7NuIGVuIHZpdm8sIHF1ZSBwZXJtaXRlIGEgbG9zIG1hZXN0cm9zIGFkYXB0YXJzZSBhbCByaXRtbyBlIGludGVyZXNlcyBkZSBzdXMgYWx1bW5vcy4gRXN0ZSBjYXDDrXR1bG8gZGVzY3JpYmUgb3RyYXMgcHLDoWN0aWNhcyBxdWUgdGFtYmnDqW4gc29uIMO6dGlsZXMgZW4gbGEgcHJvZ3JhbWFjacOzbiBkZSBjbGFzZXMuCgpBbnRlcyBkZSBkZXNjcmliaXJsb3MsIHZhbGUgbGEgcGVuYSBkZXRlbmVyc2UgcG9yIHVuIG1vbWVudG8gcGFyYSBlc3RhYmxlY2VyIGV4cGVjdGF0aXZhcy4gRWwgbWVqb3IgbcOpdG9kbyBkZSBlbnNlw7FhbnphIHF1ZSBjb25vY2Vtb3MgZXMgbGEgdHV0b3LDrWEgaW5kaXZpZHVhbDogW0Jsb28xOTg0XSBkZXNjdWJyacOzIHF1ZSBsb3MgZXN0dWRpYW50ZXMgcXVlIGVuc2XDsWFyb24gdW5vIGEgdW5vIGhpY2llcm9uIGRvcyBkZXN2aWFjaW9uZXMgZXN0w6FuZGFyIG1lam9yIHF1ZSBhcXVlbGxvcyBxdWUgYXByZW5kaWVyb24gYSB0cmF2w6lzIGRlIHVuYSBjb25mZXJlbmNpYSBjb252ZW5jaW9uYWwsIGVzIGRlY2lyLCBxdWUgbG9zIGVzdHVkaWFudGVzIGNvbiB0dXRvcsOtYSBpbmRpdmlkdWFsIHN1cGVyYXJvbiBhbCA5OCUgZGUgbG9zIGVzdHVkaWFudGVzIGEgbG9zIHF1ZSBzZSBsZXMgZGlvIHVuYSBjb25mZXJlbmNpYS4gU2luIGVtYmFyZ28sIHNpIGJpZW4gbGEgdHV0b3LDrWEgeSBlbCBhcHJlbmRpemFqZSBmdWVyb24gbGFzIGZvcm1hcyBtw6FzIGNvbXVuZXMgZGUgdHJhbnNtaXRpciBlbCBjb25vY2ltaWVudG8gYSBsbyBsYXJnbyBkZSBsYSBtYXlvciBwYXJ0ZSBkZSBsYSBoaXN0b3JpYSwgbGEgaW5kdXN0cmlhbGl6YWNpw7NuIGRlIGxhIGVkdWNhY2nDs24gZm9ybWFsIGxhIGhhIGNvbnZlcnRpZG8gZW4gbGEgZXhjZXBjacOzbiBob3kgZW4gZMOtYS4gQSBwZXNhciBkZSBsYSBleGFnZXJhY2nDs24gZW4gdG9ybm8gYSBsYSBpbnRlbGlnZW5jaWEgYXJ0aWZpY2lhbCwgbm8gdmEgYSBjdWFkcmFyIGVzdGUgY8OtcmN1bG8gZW4gZWwgY29ydG8gcGxhem8sIHBvciBsbyBxdWUgY2FkYSBtw6l0b2RvIGRlc2NyaXRvIGEgY29udGludWFjacOzbiBlcyBlc2VuY2lhbG1lbnRlIHVuIGludGVudG8gZGUgYWJvcmRhciBsYSBlZmVjdGl2aWRhZCBkZSBsYSB0dXRvcsOtYSBpbmRpdmlkdWFsIGEgZXNjYWxhLgoKIyBIYWNlciBjdW1wbGlyIGVsIEPDs2RpZ28gZGUgY29uZHVjdGEKTG8gbcOhcyBpbXBvcnRhbnRlIHF1ZSBhcHJlbmTDrSBzb2JyZSBsYSBlbnNlw7FhbnphIGVuIGxvcyDDumx0aW1vcyAzMCBhw7FvcyBlcyBsbyBpbXBvcnRhbnRlIHF1ZSBlcyBwYXJhIHRvZG9zIHRyYXRhciBhIGxvcyBkZW3DoXMgY29uIHJlc3BldG8sIHRhbnRvIGRlbnRybyBjb21vIGZ1ZXJhIGRlIGNsYXNlLiBTaSB1dGlsaXphIGVzdGUgbWF0ZXJpYWwgZGUgYWxndW5hIG1hbmVyYSwgYWRvcHRlIHVuIEPDs2RpZ28gZGUgY29uZHVjdGEgY29tbyBlbCBxdWUgZmlndXJhIGVuIGVsIEFww6luZGljZSAxNyB5IHNvbGljaXRlIGEgdG9kb3MgbG9zIHF1ZSBwYXJ0aWNpcGVuIGVuIHN1cyBjbGFzZXMgcXVlIGxvIGN1bXBsYW4uIE5vIHB1ZWRlIGV2aXRhciBxdWUgbGFzIHBlcnNvbmFzIHNlYW4gb2ZlbnNpdmFzLCBhbCBpZ3VhbCBxdWUgbGFzIGxleWVzIGNvbnRyYSBlbCByb2JvIGltcGlkZW4gcXVlIGxhcyBwZXJzb25hcyByb2JlbiwgcGVybyBwdWVkZSBhY2xhcmFyIGxhcyBleHBlY3RhdGl2YXMgeSBsYXMgY29uc2VjdWVuY2lhcywgeSBzZcOxYWxhciBxdWUgZXN0w6EgdHJhdGFuZG8gZGUgaGFjZXIgcXVlIHN1IGNsYXNlIHNlYSBhY29nZWRvcmEgcGFyYSB0b2Rvcy4KClBlcm8gdW4gQ8OzZGlnbyBkZSBjb25kdWN0YSBzb2xvIGVzIMO6dGlsIHNpIHNlIGFwbGljYS4gU2kgY3JlZSBxdWUgYWxndWllbiBoYSB2aW9sYWRvIGVsIHN1eW8sIHB1ZWRlIGFkdmVydGlybG8sIHBlZGlybGUgZGlzY3VscGFzIHkgLyBvIGV4cHVsc2FybG8sIGRlcGVuZGllbmRvIGRlIGxhIGdyYXZlZGFkIGRlIGxhIHZpb2xhY2nDs24geSBkZSBzaSBjcmVlIG8gbm8gcXVlIGZ1ZSBpbnRlbmNpb25hbC4gSGFnYXMgbG8gcXVlIGhhZ2FzOgoKKipIYXpsbyBkZWxhbnRlIGRlIHRlc3RpZ29zLioqIExhIG1heW9yw61hIGRlIGxhcyBwZXJzb25hcyBhdGVudWFyw6Egc3UgbGVuZ3VhamUgeSBob3N0aWxpZGFkIGZyZW50ZSBhIHVuYSBhdWRpZW5jaWEsIHkgdGVuZXIgYSBhbGd1aWVuIG3DoXMgcHJlc2VudGUgYXNlZ3VyYSBxdWUgbGEgZGlzY3VzacOzbiBwb3N0ZXJpb3Igbm8gZGVnZW5lcmUgZW4gYWZpcm1hY2lvbmVzIGNvbnRyYWRpY3RvcmlhcyBzb2JyZSBxdWnDqW4gZGlqbyBxdcOpLgoKKipTaSBleHB1bHNhIGEgYWxndWllbiwgZMOtZ2FzZWxvIGFsIHJlc3RvIGRlIGxhIGNsYXNlIHkgZXhwbGlxdWUgcG9yIHF1w6kuKiogRXN0byBheXVkYSBhIGV2aXRhciBxdWUgc2UgcHJvcGFndWVuIGxvcyBydW1vcmVzIHkgbXVlc3RyYSBxdWUgc3UgQ8OzZGlnbyBkZSBDb25kdWN0YSByZWFsbWVudGUgc2lnbmlmaWNhIGFsZ28uCgoqKkVudsOtZSB1biBjb3JyZW8gZWxlY3Ryw7NuaWNvIGFsIGRlbGluY3VlbnRlIHRhbiBwcm9udG8gY29tbyBwdWVkYSoqIHBhcmEgcmVzdW1pciBsbyBxdWUgc3VjZWRpw7MgeSBsb3MgcGFzb3MgcXVlIHNpZ3Vpw7MsIHkgY29waWUgZWwgbWVuc2FqZSBhIGxvcyBhbmZpdHJpb25lcyBkZSBzdSB0YWxsZXIgbyBhIHVubyBkZSBzdXMgY29tcGHDsWVyb3MgbWFlc3Ryb3MgcGFyYSBxdWUgaGF5YSB1biByZWdpc3RybyBjb250ZW1wb3LDoW5lbyBkZSBsYSBjb252ZXJzYWNpw7NuLiBTaSBlbCBkZWxpbmN1ZW50ZSByZXNwb25kZSwgbm8gcGFydGljaXBlIGVuIHVuIGxhcmdvIGRlYmF0ZTogbnVuY2EgZXMgcHJvZHVjdGl2by4KCkxvIHF1ZSBzdWNlZGUgZnVlcmEgZGUgbGEgY2xhc2UgaW1wb3J0YSBhbCBtZW5vcyB0YW50byBjb21vIGxvIHF1ZSBzdWNlZGUgZGVudHJvIGRlIMOpbCBbUGFydGUyMDExXSwgcG9yIGxvIHF1ZSBkZWJlIHByb3BvcmNpb25hciB1bmEgZm9ybWEgcGFyYSBxdWUgbG9zIGFsdW1ub3MgaW5mb3JtZW4gbG9zIHByb2JsZW1hcyBxdWUgbm8gZXN0w6FuIGFsbMOtIHBhcmEgdmVyc2UuIFVuIHBhc28gZXMgcGVkaXJsZSBhIGFsZ3VpZW4gcXVlIG5vIHNlYSBwYXJ0ZSBkZSBzdSBncnVwbyBxdWUgc2VhIGVsIHByaW1lciBwdW50byBkZSBjb250YWN0bzsgZGUgZXNhIG1hbmVyYSwgc2kgYWxndWllbiBxdWllcmUgcHJlc2VudGFyIHVuYSBxdWVqYSBzb2JyZSB1c3RlZCBvIHVubyBkZSBzdXMgY29tcGHDsWVyb3MgbWFlc3Ryb3MsIHRpZW5lIGNpZXJ0YSBzZWd1cmlkYWQgZGUgY29uZmlkZW5jaWFsaWRhZCB5IGFjY2nDs24gaW5kZXBlbmRpZW50ZS4gW0F1cm8yMDE5XSB0aWVuZSBtdWNob3Mgb3Ryb3MgY29uc2Vqb3MgeSBlcyBicmV2ZSB5IHByw6FjdGljby4KCiMjIEluc3RydWNjacOzbiBkZSBwYXJlcwpObyBpbXBvcnRhIGN1w6FuIGJ1ZW5vIHNlYSB1biBtYWVzdHJvLCBzb2xvIHB1ZWRlbiBkZWNpciB1bmEgY29zYSBhIGxhIHZlei4gRW50b25jZXMsIMK/Y8OzbW8gcHVlZGVuIGFjbGFyYXIgbXVjaG9zIGNvbmNlcHRvcyBlcnLDs25lb3MgZGlmZXJlbnRlcyBlbiB1biB0aWVtcG8gcmF6b25hYmxlPyBMYSBtZWpvciBzb2x1Y2nDs24gZGVzYXJyb2xsYWRhIGhhc3RhIGFob3JhIGVzIHVuYSB0w6ljbmljYSBsbGFtYWRhIGluc3RydWNjacOzbiBlbnRyZSBwYXJlcy4gT3JpZ2luYWxtZW50ZSBjcmVhZG8gcG9yIEVyaWMgTWF6dXIgZW4gSGFydmFyZCBbTWF6dTE5OTZdLCBzZSBoYSBlc3R1ZGlhZG8gYW1wbGlhbWVudGUgZW4gdW5hIGFtcGxpYSB2YXJpZWRhZCBkZSBjb250ZXh0b3MsIGluY2x1aWRhIGxhIHByb2dyYW1hY2nDs24gW0Nyb3UyMDAxLCBQb3J0MjAxM10sIHkgW1BvcnQyMDE2XSBkZXNjdWJyacOzIHF1ZSBsb3MgYWx1bW5vcyB2YWxvcmFuIGxhIGluc3RydWNjacOzbiBkZSBzdXMgcGFyZXMgaW5jbHVzbyBlbiBlbCBwcmltZXIgY29udGFjdG8uCgpMYSBpbnN0cnVjY2nDs24gZW50cmUgcGFyZXMgaW50ZW50YSBwcm9wb3JjaW9uYXIgaW5zdHJ1Y2Npw7NuIGluZGl2aWR1YWxpemFkYSBkZSBtYW5lcmEgZXNjYWxhYmxlIGFsIGludGVyY2FsYXIgbGEgZXZhbHVhY2nDs24gZm9ybWF0aXZhIGNvbiBsYSBkaXNjdXNpw7NuIGRlbCBhbHVtbm86CgoxLiBEw6kgdW5hIGJyZXZlIGludHJvZHVjY2nDs24gYWwgdGVtYS4KCjIuIETDqSBhIGxvcyBhbHVtbm9zIHVuYSBwcmVndW50YSBkZSBvcGNpw7NuIG3Dumx0aXBsZSBxdWUgYW5hbGljZSBzdXMgY29uY2VwdG9zIGVycsOzbmVvcyAoZW4gbHVnYXIgZGUgcHJvYmFyIGVsIGNvbm9jaW1pZW50byBmYWN0dWFsIHNpbXBsZSkuCgozLiBIYWdhIHF1ZSB0b2RvcyBsb3MgYWx1bW5vcyB2b3RlbiBzb2JyZSBzdXMgcmVzcHVlc3RhcyBhIGxhIE1DUS4KKiBTaSB0b2RvcyBsb3MgYWx1bW5vcyB0aWVuZW4gbGEgcmVzcHVlc3RhIGNvcnJlY3RhLCBjb250aW7DumUuCiogU2kgdG9kb3MgdGllbmVuIGxhIG1pc21hIHJlc3B1ZXN0YSBpbmNvcnJlY3RhLCBhYm9yZGUgZXNlIGVycm9yIGVzcGVjw61maWNvLgoqIFNpIHRpZW5lbiB1bmEgY29tYmluYWNpw7NuIGRlIHJlc3B1ZXN0YXMgY29ycmVjdGFzIGUgaW5jb3JyZWN0YXMsIGRlbGVzIHZhcmlvcyBtaW51dG9zIHBhcmEgZGlzY3V0aXIgZW50cmUgZWxsb3MgZW4gZ3J1cG9zIGRlIDIgYSA0LCBsdWVnbyB2b3RlIG51ZXZhbWVudGUuCgpDb21vIG11ZXN0cmEgZXN0ZSB2aWRlbywgbGEgZGlzY3VzacOzbiBncnVwYWwgbWVqb3JhIHNpZ25pZmljYXRpdmFtZW50ZSBsYSBjb21wcmVuc2nDs24gZGUgbG9zIGFsdW1ub3MgcG9ycXVlIGRlc2N1YnJlIHZhY8Otb3MgZW4gc3UgcmF6b25hbWllbnRvIHkgbG9zIG9ibGlnYSBhIGFjbGFyYXIgc3UgcGVuc2FtaWVudG8uIFZ1ZWx2YSBhIHNvbmRlYXIgbGEgY2xhc2UgeSBsdWVnbyBsZSBpbmRpY2EgYWwgbWFlc3RybyBzaSBwdWVkZW4gc2VndWlyIGFkZWxhbnRlIG8gc2kgc2UgbmVjZXNpdGFuIG3DoXMgZXhwbGljYWNpb25lcy4gVW5hIHJvbmRhIGZpbmFsIGRlIGV4cGxpY2FjacOzbiBhZGljaW9uYWwgZGVzcHXDqXMgZGUgcXVlIHNlIHByZXNlbnRhIGxhIHJlc3B1ZXN0YSBjb3JyZWN0YSBvZnJlY2UgYSBsb3MgYWx1bW5vcyB1bmEgb3BvcnR1bmlkYWQgbcOhcyBwYXJhIHNvbGlkaWZpY2FyIHN1IGNvbXByZW5zacOzbi4KClBlcm8sIMK/cG9kcsOtYSBzZXIgZXN0byB1biBmYWxzbyBwb3NpdGl2bz8gwr9Fc3TDoW4gbWVqb3JhbmRvIGxvcyByZXN1bHRhZG9zIGRlYmlkbyBhIHVuYSBtYXlvciBjb21wcmVuc2nDs24gZHVyYW50ZSBsYSBkaXNjdXNpw7NuIG8gc2ltcGxlbWVudGUgcG9yIHVuIGVmZWN0byBkZSBzZWd1aXIgYWwgbMOtZGVyICgidm90YSBjb21vIEphbmUsIGVsbGEgc2llbXByZSB0aWVuZSBsYSByYXrDs24iKSBbU21pdDIwMDldIHByb2LDsyBlc3RvIHNpZ3VpZW5kbyBsYSBwcmltZXJhIHByZWd1bnRhIGNvbiB1bmEgc2VndW5kYSBxdWUgbG9zIGFsdW1ub3MgcmVzcG9uZGllcm9uIGluZGl2aWR1YWxtZW50ZS4gRW5jb250cmFyb24gcXVlCgoKPioqVGFraW5nIGEgU3RhbmQqKgo+Cj5JdCBpcyBpbXBvcnRhbnQgdG8gaGF2ZSBsZWFybmVycyB2b3RlIHB1YmxpY2x5IHNvIHRoYXQgdGhleSBjYW7igJl0IGNoYW5nZSB0aGVpciBtaW5kcyBhZnRlcndhcmQgYW5kIHJhdGlvbmFsaXplIGl0IGJ5IG1ha2luZyBleGN1c2VzIHRvIHRoZW1zZWx2ZXMgbGlrZSDigJxJIGp1c3QgbWlzcmVhZCB0aGUgcXVlc3Rpb24u4oCdIE11Y2ggb2YgdGhlIHZhbHVlIG9mIHBlZXIgaW5zdHJ1Y3Rpb24gY29tZXMgZnJvbSB0aGUgaHlwZXJjb3JyZWN0aW9uIG9mIGdldHRpbmcgdGhlIHdyb25nIGFuc3dlciBhbmQgaGF2aW5nIHRvIHRoaW5rIHRocm91Z2ggdGhlIHJlYXNvbnMgd2h5IChTZWN0aW9uIDUuMSkuCgoKIyMgRW5zZcOxYXIganVudG9zCgoqKkxhIGVuc2XDsWFuemEgY29uanVudGEqKiBkZXNjcmliZSBjdWFscXVpZXIgc2l0dWFjacOzbiBlbiBsYSBxdWUgZG9zIG1hZXN0cm9zIHRyYWJhamFuIGp1bnRvcyBlbiBlbCBtaXNtbyBzYWzDs24gZGUgY2xhc2VzLiBbRnJpZTIwMTZdIGRlc2NyaWJlIHZhcmlhcyBmb3JtYXMgZGUgaGFjZXJsbzoKCioqRG9jZW5jaWEgZW4gZXF1aXBvOioqIEFtYm9zIG1hZXN0cm9zIG9mcmVjZW4gdW5hIHNvbGEgc2VjdWVuY2lhIGRlIGNvbnRlbmlkbyBlbiB0w6FuZGVtLCB0dXJuw6FuZG9zZSBjb21vIG3DunNpY29zIHF1ZSB0b21hbiBzb2xvcy4KCioqRW5zZcOxYXIgeSBheXVkYXI6KiogRWwgbWFlc3RybyBBIGVuc2XDsWEgbWllbnRyYXMgZWwgbWFlc3RybyBCIHNlIG11ZXZlIHBvciBlbCBhdWxhIHBhcmEgYXl1ZGFyIGEgbG9zIGFsdW1ub3MgY29uIGRpZmljdWx0YWRlcy4KCioqRW5zZcOxYW56YSBhbHRlcm5hdGl2YToqKgpFbCBtYWVzdHJvIEEgcHJvcG9yY2lvbmEgYSB1biBwZXF1ZcOxbyBncnVwbyBkZSBhbHVtbm9zIGluc3RydWNjacOzbiBtw6FzIGludGVuc2l2YSBvIGVzcGVjaWFsaXphZGEsIG1pZW50cmFzIHF1ZSBlbCBtYWVzdHJvIEIgYnJpbmRhIHVuYSBsZWNjacOzbiBnZW5lcmFsIGFsIGdydXBvIHByaW5jaXBhbC4KCioqRW5zZcOxYXIgeSBvYnNlcnZhcjoqKgpFbCBtYWVzdHJvIEEgZW5zZcOxYSBtaWVudHJhcyBlbCBtYWVzdHJvIEIgb2JzZXJ2YSBhIGxvcyBhbHVtbm9zIHkgcmVjb3BpbGEgZGF0b3Mgc29icmUgc3UgY29tcHJlbnNpw7NuIHBhcmEgYXl1ZGFyIGEgcGxhbmlmaWNhciBsZWNjaW9uZXMgZnV0dXJhcy4KCioqRW5zZcOxYW56YSBwYXJhbGVsYToqKgpMYSBjbGFzZSBzZSBkaXZpZGUgZW4gZG9zIHkgbG9zIG1hZXN0cm9zIHByZXNlbnRhbiBlbCBtaXNtbyBtYXRlcmlhbCBzaW11bHTDoW5lYW1lbnRlIGEgY2FkYSB1bm8uCgoqKkVzdGFjacOzbiBkZSBlbnNlw7FhbnphOioqCkxvcyBhbHVtbm9zIHNlIGRpdmlkZW4gZW4gcGVxdWXDsW9zIGdydXBvcyBxdWUgcm90YW4gZGUgdW5hIGVzdGFjacOzbiBvIGFjdGl2aWRhZCBhIGxhIHNpZ3VpZW50ZSBtaWVudHJhcyBsb3MgbWFlc3Ryb3Mgc3VwZXJ2aXNhbiBkb25kZSBzZWEgbmVjZXNhcmlvLgoKVG9kb3MgZXN0b3MgbW9kZWxvcyBjcmVhbiBtw6FzIG9wb3J0dW5pZGFkZXMgcGFyYSBsYSB0cmFuc2ZlcmVuY2lhIGludm9sdW50YXJpYSBkZSBjb25vY2ltaWVudG8gcXVlIGxhIGVuc2XDsWFuemEgc29sYS4gTGEgZW5zZcOxYW56YSBlbiBlcXVpcG8gZXMgcGFydGljdWxhcm1lbnRlIGJlbmVmaWNpb3NhIGVuIGxvcyB0YWxsZXJlcyBkZSB1biBkw61hIGRlIGR1cmFjacOzbjogYnJpbmRhIGEgbGEgdm96IGRlIGNhZGEgbWFlc3RybyBsYSBvcG9ydHVuaWRhZCBkZSBkZXNjYW5zYXIgeSByZWR1Y2UgZWwgcmllc2dvIGRlIHF1ZSBlc3TDqW4gdGFuIGNhbnNhZG9zIOKAi+KAi2FsIGZpbmFsIGRlbCBkw61hIHF1ZSBjb21lbnphcsOhbiBhIGNyaXRpY2FyIGEgc3VzIGFsdW1ub3MgbyBhIHRvY2FyIGVsIHRlY2xhZG8uCgo+KipBeXVkYXIqKgo+Cj5NdWNoYXMgcGVyc29uYXMgcXVlIG5vIHNlIHNpZW50ZW4gY8OzbW9kYXMgZW5zZcOxYW5kbyBlc3TDoW4gZGlzcHVlc3RhcyB5IHB1ZWRlbiBwcm9wb3JjaW9uYXIgYXNpc3RlbmNpYSB0w6ljbmljYSBlbiBjbGFzZS4gUHVlZGVuIGF5dWRhciBhIGxvcyBhbHVtbm9zIGNvbiBsYSBjb25maWd1cmFjacOzbiBlIGluc3RhbGFjacOzbiwgcmVzcG9uZGVyIHByZWd1bnRhcyB0w6ljbmljYXMgZHVyYW50ZSBsb3MgZWplcmNpY2lvcywgbW9uaXRvcmVhciBsYSBzYWxhIHBhcmEgZGV0ZWN0YXIgcGVyc29uYXMgcXVlIHB1ZWRhbiBuZWNlc2l0YXIgYXl1ZGEgbyB2aWdpbGFyIGxhcyBub3RhcyBjb21wYXJ0aWRhcyAoU2VjY2nDs24gOS43KSB5IHJlc3BvbmRlciBwcmVndW50YXMgbyByZWNvcmRhcmxlIGFsIG1hZXN0cm8gcXVlIGxvIGhhZ2EuIGR1cmFudGUgbG9zIGRlc2NhbnNvcwo+Cj5Mb3MgYXl1ZGFudGVzIGEgdmVjZXMgc29uIHBlcnNvbmFzIHF1ZSBzZSBjYXBhY2l0YW4gcGFyYSBjb252ZXJ0aXJzZSBlbiBtYWVzdHJvcyAoZXMgZGVjaXIsIHNvbiBtYWVzdHJvcyBCIGVuIGVsIG1vZGVsbyBkZSBlbnNlw7FhbnphIHkgYXNpc3RlbmNpYSksIHBlcm8gdGFtYmnDqW4gcHVlZGVuIHNlciBtaWVtYnJvcyBkZWwgcGVyc29uYWwgZGUgc29wb3J0ZSB0w6ljbmljbyBkZSBsYSBpbnN0aXR1Y2nDs24gYW5maXRyaW9uYSwgZXggYWx1bW5vcyBkZSBsYSBjbGFzZSBvIGVzdHVkaWFudGVzIGF2YW56YWRvcyBxdWUgeWEgY29ub2NlbiBlbCBtYXRlcmlhbC4gYmllbi4gVXNhciBlc3RlIMO6bHRpbW8gY29tbyBheXVkYW50ZSBlcyBkb2JsZW1lbnRlIGVmZWN0aXZvOiBubyBzb2xvIGVzIG3DoXMgcHJvYmFibGUgcXVlIGNvbXByZW5kYW4gbG9zIHByb2JsZW1hcyBxdWUgdGllbmVuIHN1cyBjb21wYcOxZXJvcywgc2lubyBxdWUgdGFtYmnDqW4gbGVzIGltcGlkZSBhYnVycmlyc2UuIEVzdG8gYXl1ZGEgYSB0b2RhIGxhIGNsYXNlIGEgbWFudGVuZXJzZSBjb21wcm9tZXRpZGEgcG9ycXVlIGVsIGFidXJyaW1pZW50byBlcyBjb250YWdpb3NvOiBzaSB1biBwdcOxYWRvIGRlIHBlcnNvbmFzIGNvbWllbnphIGEgc2FsaXIsIGxhcyBwZXJzb25hcyBhIHN1IGFscmVkZWRvciBoYXLDoW4gbG8gbWlzbW8uCgpTaSB1c3RlZCB5IHVuIGNvbXBhw7Flcm8gZXN0w6FuIGVuc2XDsWFuZG8gY29uanVudGFtZW50ZToKCiogVMOzbWVzZSAyLTMgbWludXRvcyBhbnRlcyBkZWwgY29taWVuem8gZGUgY2FkYSBjbGFzZSBwYXJhIGNvbmZpcm1hciBxdWnDqW4gZXN0w6EgZW5zZcOxYW5kbyBxdcOpLiBTaSB0aWVuZSB0aWVtcG8sIGludGVudGUgZGlidWphciBvIHJldmlzYXIgdW4gbWFwYSBjb25jZXB0dWFsIGp1bnRvcy4KCiogVXNlIGVzZSB0aWVtcG8gcGFyYSByZXNvbHZlciB1biBwYXIgZGUgc2XDsWFsZXMgbWFudWFsZXMgdGFtYmnDqW4uICJFc3TDoXMgeWVuZG8gZGVtYXNpYWRvIHLDoXBpZG8iLCAiaGFibGEiLCAiZXNlIGFsdW1ubyBuZWNlc2l0YSBheXVkYSIsIHkgIkVzIGhvcmEgZGUgdW4gZGVzY2Fuc28gZW4gZWwgYmHDsW8iIHNvbiDDunRpbGVzLgoKKiBDYWRhIHBlcnNvbmEgZGViZSBlbnNlw7FhciBkdXJhbnRlIGFsIG1lbm9zIDEwLTE1IG1pbnV0b3Mgc2VndWlkb3MsIHlhIHF1ZSBsb3MgYWx1bW5vcyBzZSBkaXN0cmFlcsOhbiBjb24gY2FtYmlvcyBtw6FzIGZyZWN1ZW50ZXMuCgoqIExhIHBlcnNvbmEgcXVlIG5vIGVzdMOhIGVuc2XDsWFuZG8gbm8gZGViZSBpbnRlcnJ1bXBpciwgb2ZyZWNlciBjb3JyZWNjaW9uZXMgbyBlbGFib3JhY2lvbmVzLCBvIGhhY2VyIGN1YWxxdWllciBvdHJhIGNvc2EgcGFyYSBkaXN0cmFlcnNlIGRlIGxvIHF1ZSBsYSBwZXJzb25hIHF1ZSBlbnNlw7FhIGVzdMOhIGhhY2llbmRvIG8gZGljaWVuZG8uIExhIMO6bmljYSBleGNlcGNpw7NuIGVzIGhhY2VyIHByZWd1bnRhcyBwcmluY2lwYWxlcyBzaSBsb3MgYWx1bW5vcyBwYXJlY2VuIGxldMOhcmdpY29zIG8gaW5zZWd1cm9zIGRlIHPDrSBtaXNtb3MuCgoqIENhZGEgcGVyc29uYSBkZWJlIHRvbWFyIHVuIHBhciBkZSBtaW51dG9zIGFudGVzIGRlIGNvbWVuemFyIGEgZW5zZcOxYXIgcGFyYSB2ZXIgbG8gcXVlIHN1IGNvbXBhw7Flcm8gdmEgYSBlbnNlw7FhciBkZXNwdcOpcyBkZSBoYWJlciB0ZXJtaW5hZG8sIHkgbHVlZ28gbm8gcHJlc2VudGFyIG5hZGEgZGUgZXNlIG1hdGVyaWFsLgoKKiBMYSBwZXJzb25hIHF1ZSBubyBlc3TDoSBlbnNlw7FhbmRvIGRlYmUgbWFudGVuZXJzZSBjb21wcm9tZXRpZGEgY29uIGxhIGNsYXNlLCBubyBwb25lcnNlIGFsIGTDrWEgY29uIHN1IGNvcnJlbyBlbGVjdHLDs25pY28uIE1vbml0b3JlYXIgbGFzIG5vdGFzIGNvbXBhcnRpZGFzIChTZWNjacOzbiA5LjcpLCB2aWdpbGFyIGEgbG9zIGFsdW1ub3MgcGFyYSB2ZXIgcXVpw6luIHRpZW5lIGRpZmljdWx0YWRlcywgYW5vdGFyIGFsZ3Vub3MgY29tZW50YXJpb3MgcGFyYSBkYXJsZSBhIHN1IGNvbXBhw7Flcm8gZGUgZW5zZcOxYW56YSBlbiBlbCBwcsOzeGltbyBkZXNjYW5zbzogY3VhbHF1aWVyIGNvc2EgcXVlIGNvbnRyaWJ1eWEgYSBsYSBsZWNjacOzbiBlcyBtZWpvciBxdWUgY3VhbHF1aWVyIGNvc2EgcXVlIG5vIGxvIGhhZ2EuCgpMbyBxdWUgZXMgbcOhcyBpbXBvcnRhbnRlLCB0w7NtZXNlIHVub3MgbWludXRvcyBjdWFuZG8gdGVybWluZSBsYSBjbGFzZSBwYXJhIGZlbGljaXRhcnNlIG8gY29tcGFkZWNlcnNlOiBlbiBsYSBlbnNlw7FhbnphIGNvbW8gZW4gbGEgdmlkYSwgbGEgbWlzZXJpYSBjb21wYXJ0aWRhIGRpc21pbnV5ZSB5IGF1bWVudGEgbGEgYWxlZ3LDrWEgY29tcGFydGlkYS4KCiMjIEV2YWx1YXIgY29ub2NpbWllbnRvIHByZXZpbwpDdWFudG8gbcOhcyBzZXBhIHNvYnJlIHN1cyBhbHVtbm9zIGFudGVzIGRlIGNvbWVuemFyIGEgZW5zZcOxYXIsIG3DoXMgcG9kcsOhIGF5dWRhcmxvcy4gRGVudHJvIGRlIHVuIHNpc3RlbWEgZXNjb2xhciBmb3JtYWwsIGxvcyByZXF1aXNpdG9zIHByZXZpb3MgcGFyYSBzdSBjdXJzbyBsZSBkaXLDoW4gYWxnbyBzb2JyZSBsbyBxdWUgcHJvYmFibGVtZW50ZSB5YSBzZXBhbi4gU2luIGVtYmFyZ28sIGVuIHVuIGVudG9ybm8gZGUgY2FtcG8gbGlicmUsIHN1cyBhbHVtbm9zIHB1ZWRlbiBzZXIgbXVjaG8gbcOhcyBkaXZlcnNvcywgcG9yIGxvIHF1ZSBlcyBwb3NpYmxlIHF1ZSBkZXNlZSBkYXJsZXMgdW5hIGJyZXZlIGVuY3Vlc3RhIG8gY3Vlc3Rpb25hcmlvIGFudGVzIGRlIHN1IGNsYXNlIHBhcmEgYXZlcmlndWFyIHF1w6kgY29ub2NpbWllbnRvcyB5IGhhYmlsaWRhZGVzIHRpZW5lbi4KClBlZGlybGUgYSBsYXMgcGVyc29uYXMgcXVlIHNlIGNhbGlmaXF1ZW4gYSBzw60gbWlzbWFzIGVuIHVuYSBlc2NhbGEgZGVsIDEgYWwgNSBubyB0aWVuZSBzZW50aWRvIHBvcnF1ZSBtaWVudHJhcyBtZW5vcyBwZXJzb25hcyBzZXBhbiBzb2JyZSB1biB0ZW1hLCBtZW5vcyBwcmVjaXNhcyBwb2Ryw6FuIGVzdGltYXIgc3VzIGNvbm9jaW1pZW50b3MgKEZpZ3VyYSBbZjogY2xhc2UtZHVubmluZy1rcnVnZXJdLCBkZSBodHRwczogLy8gdGhlbmVzcy4gY29tIC8gbmV1cm9sb2dpY2FibG9nIC8gaW5kZXgucGhwIC8gbWlzdW5kZXJzdGFuZGluZy1kdW5uaW5nLWtydWdlciAvKSwgdW4gZmVuw7NtZW5vIGxsYW1hZG8gKiplZmVjdG8gRHVubmluZy1LcnVnZXIqKiBbS3J1ZzE5OTldLiBQb3IgZWwgY29udHJhcmlvLCBsYXMgcGVyc29uYXMgcXVlIHNvbiBtaWVtYnJvcyBkZSBncnVwb3Mgc3VicmVwcmVzZW50YWRvcyBhIG1lbnVkbyBzdWJlc3RpbWFyw6FuIHN1cyBoYWJpbGlkYWRlcy4KCgohW0R1bm5pbmctS3J1Z2VyXSguL2ltZ190cmFuaW5nL2R1bm5pbmcta3J1Z2VyLnBuZykKCkVuIGx1Z2FyIGRlIHBlZGlybGVzIGEgbGFzIHBlcnNvbmFzIHF1ZSBzZSBhdXRvZXZhbMO6ZW4sIHB1ZWRlIHByZWd1bnRhcmxlcyBjb24gcXXDqSBmYWNpbGlkYWQgcG9kcsOtYW4gY29tcGxldGFyIGFsZ3VuYXMgdGFyZWFzIGVzcGVjw61maWNhcy4gU2luIGVtYmFyZ28sIGhhY2VyIGVzdG8gZXMgYXJyaWVzZ2FkbywgcG9ycXVlIGxhIGVzY3VlbGEgY2FwYWNpdGEgYSBsYXMgcGVyc29uYXMgcGFyYSB0cmF0YXIgY3VhbHF1aWVyIGNvc2EgcXVlIHBhcmV6Y2EgdW4gZXhhbWVuIGNvbW8gYWxnbyBxdWUgdGllbmVuIHF1ZSBhcHJvYmFyIGVuIGx1Z2FyIGRlIHVuYSBvcG9ydHVuaWRhZCBwYXJhIGRhciBmb3JtYSBhIGxhIGluc3RydWNjacOzbi4gU2kgYWxndWllbiByZXNwb25kZSAiTm8gc8OpIiBpbmNsdXNvIGEgdW4gcGFyIGRlIHByZWd1bnRhcyBzb2JyZSBzdSBwcmVldmFsdWFjacOzbiwgcG9kcsOtYSBjb25jbHVpciBxdWUgc3UgY2xhc2UgZXMgZGVtYXNpYWRvIGF2YW56YWRhIHBhcmEgZWxsb3MuIFBvciBsbyB0YW50bywgcG9kcsOtYSBhc3VzdGFyIGEgbXVjaGFzIGRlIGxhcyBwZXJzb25hcyBxdWUgbcOhcyBkZXNlYSBheXVkYXIuCgpMYSBTZWNjacOzbiAyMS41IHByZXNlbnRhIHVuIGJyZXZlIGN1ZXN0aW9uYXJpbyBkZSBwcmVldmFsdWFjacOzbiBxdWUgbGEgbWF5b3LDrWEgZGUgbG9zIGVzdHVkaWFudGVzIHBvdGVuY2lhbGVzIGVzIHBvY28gcHJvYmFibGUgcXVlIGVuY3VlbnRyZW4gaW50aW1pZGFudGUuIFNpIGxvIHVzYSBvIGFsZ28gc2ltaWxhciwgaW50ZW50ZSBoYWNlciB1biBzZWd1aW1pZW50byBjb24gbGFzIHBlcnNvbmFzIHF1ZSBubyByZXNwb25kZW4gcGFyYSBhdmVyaWd1YXIgcG9yIHF1w6kgbm8geSBjb21wYXJhciBzdSBldmFsdWFjacOzbiBkZSBsb3MgYWx1bW5vcyBjb24gc3UgYXV0b2V2YWx1YWNpw7NuIHBhcmEgbWVqb3JhciBzdXMgcHJlZ3VudGFzLgoKIyMgUGxhbiBwYXJhIGhhYmlsaWRhZGVzIG1peHRhcwpTaSBzdXMgYWx1bW5vcyB0aWVuZW4gbml2ZWxlcyBtdXkgZGl2ZXJzb3MgZGUgY29ub2NpbWllbnRvIHByZXZpbywgcHVlZGUgdGVybWluYXIgZsOhY2lsbWVudGUgZW4gdW5hIHNpdHVhY2nDs24gZW4gbGEgcXVlIHVuIHRlcmNpbyBkZSBzdSBjbGFzZSBzZSBwaWVyZGUgeSB1biB0ZXJjaW8gc2UgYWJ1cnJlLiBFc28gbm8gZXMgc2F0aXNmYWN0b3JpbyBwYXJhIHRvZG9zLCBwZXJvIGhheSBhbGd1bmFzIGVzdHJhdGVnaWFzIHF1ZSBwdWVkZXMgdXNhciBwYXJhIG1hbmVqYXIgbGEgc2l0dWFjacOzbjoKCiogQW50ZXMgZGUgZWplY3V0YXIgdW4gdGFsbGVyLCBjb211bmlxdWUgc3Ugbml2ZWwgY2xhcmFtZW50ZSBhIHRvZG9zIG1vc3RyYW5kbyBhbGd1bm9zIGVqZW1wbG9zIGRlIGVqZXJjaWNpb3MgcXVlIHNlIGxlcyBwZWRpcsOhIHF1ZSBjb21wbGV0ZW4uIEVzdG8gYXl1ZGEgYSBsb3MgcG9zaWJsZXMgcGFydGljaXBhbnRlcyBhIG1lZGlyIGVsIG5pdmVsIGRlIGxhIGNsYXNlIGRlIG1hbmVyYSBtdWNobyBtw6FzIGVmZWN0aXZhIHF1ZSB1bmEgbGlzdGEgZGUgdGVtYXMgZW4gZm9ybWEgZGUgcHVudG9zLgoKKiBQcm9wb3JjaW9uZSBlamVyY2ljaW9zIGV4dHJhIGEgc3UgcHJvcGlvIHJpdG1vIHBhcmEgcXVlIGxvcyBhbHVtbm9zIG3DoXMgYXZhbnphZG9zIG5vIHRlcm1pbmVuIHRlbXByYW5vIHkgc2UgYWJ1cnJhbi4KCiogRXN0w6kgYXRlbnRvIGEgbG9zIGFsdW1ub3MgcXVlIHNlIGVzdMOhbiBxdWVkYW5kbyBhdHLDoXMgZSBpbnRlcnZpZW5lbiB0ZW1wcmFubyBwYXJhIHF1ZSBubyBzZSBzaWVudGFuIGZydXN0cmFkb3MgeSBzZSBkZW4gcG9yIHZlbmNpZG9zLgoKKiBTb2xpY2l0ZSBhIGxvcyBhbHVtbm9zIG3DoXMgYXZhbnphZG9zIHF1ZSBheXVkZW4gYSBsYXMgcGVyc29uYXMgcXVlIGVzdMOhbiBhIHN1IGxhZG8gKGNvbnN1bHRlIGxhIFNlY2Npw7NuIDkuNiBhIGNvbnRpbnVhY2nDs24pLgoKT3RyYSBmb3JtYSBkZSBhY29tb2RhciBoYWJpbGlkYWRlcyBtaXh0YXMgZXMgaGFjZXIgcXVlIHRvZG9zIHRyYWJhamVuIGVuIGVsIG1hdGVyaWFsIHBvciBzdSBjdWVudGEgYSBzdSBwcm9waW8gcml0bW8gY29tbyBsbyBoYXLDrWFuIGVuIHVuIGN1cnNvIGVuIGzDrW5lYSwgcGVybyBoYWNlcmxvIHNpbXVsdMOhbmVhbWVudGUgeSBhbCBtaXNtbyB0aWVtcG8gcXVlIGxvcyBheXVkYW50ZXMgZGVhbWJ1bGFuIHBvciBsYSBzYWxhIHBhcmEgcXVlIGxhIGdlbnRlIHNlIGRlc3BlZ3VlLiBBbGd1bmFzIHBlcnNvbmFzIGlyw6FuIHRyZXMgbyBjdWF0cm8gdmVjZXMgbcOhcyBsZWpvcyBxdWUgb3RyYXMgY3VhbmRvIGxvcyB0YWxsZXJlcyBzZSByZWFsaWNlbiBhc8OtLCBwZXJvIHRvZG9zIGhhYnLDoW4gdGVuaWRvIHVuIGTDrWEgZ3JhdGlmaWNhbnRlIHkgZGVzYWZpYW50ZS4KCj4qKlByaW5jaXBpYW50ZXMgZmFsc29zKioKPlVuIHByaW5jaXBpYW50ZSBmYWxzbyBlcyBhbGd1aWVuIHF1ZSBoYSBlc3R1ZGlhZG8gdW4gaWRpb21hIGFudGVzIHBlcm8gbG8gZXN0w6EgYXByZW5kaWVuZG8gbnVldmFtZW50ZS4gUHVlZGVuIHNlciBpbmRpc3Rpbmd1aWJsZXMgZGUgbG9zIHByaW5jaXBpYW50ZXMgYWJzb2x1dG9zIGVuIGxhcyBwcnVlYmFzIGRlIHByZWV2YWx1YWNpw7NuLCBwZXJvIHB1ZWRlbiBtb3ZlcnNlIG11Y2hvIG3DoXMgcsOhcGlkYW1lbnRlIHVuYSB2ZXogcXVlIGNvbWllbnphIGxhIGNsYXNlIHBvcnF1ZSBlc3TDoW4gdm9sdmllbmRvIGEgYXByZW5kZXIgZW4gbHVnYXIgZGUgYXByZW5kZXIgcG9yIHByaW1lcmEgdmV6Lgo+Cj5TZXIgdW4gcHJpbmNpcGlhbnRlIGZhbHNvIGEgbWVudWRvIGVzIHVuIHNpZ25vIGRlIHByaXZpbGVnaW8gcHJlcGFyYXRvcmlvIFtNYXJnMjAxMF0sIHkgbG9zIHByaW5jaXBpYW50ZXMgZmFsc29zIHNvbiBjb211bmVzIGVuIGxhcyBjbGFzZXMgZGUgcHJvZ3JhbWFjacOzbiBkZSByYW5nbyBsaWJyZS4gUG9yIGVqZW1wbG8sIHVuIG5pw7FvIGN1eWEgZmFtaWxpYSBlcyBsbyBzdWZpY2llbnRlbWVudGUgcmljYSBjb21vIHBhcmEgaGFiZXJsb3MgZW52aWFkbyBhIHVuIGNhbXBhbWVudG8gZGUgdmVyYW5vIGRlIHJvYsOzdGljYSBwdWVkZSB0ZW5lciB1biBtYWwgZGVzZW1wZcOxbyBlbiB1bmEgcHJ1ZWJhIHByZXZpYSBkZSBjb25vY2ltaWVudG8gZGUgcHJvZ3JhbWFjacOzbiBwb3JxdWUgZWwgbWF0ZXJpYWwgbm8gZXN0w6EgZnJlc2NvIGVuIHN1IG1lbnRlLCBwZXJvIGHDum4gdGllbmUgdW5hIHZlbnRhamEgc29icmUgdW4gbmnDsW8gZGUgVW4gZm9uZG8gbWVub3MgYWZvcnR1bmFkby4gTGFzIGVzdHJhdGVnaWFzIGRlc2NyaXRhcyBhbnRlcmlvcm1lbnRlIHB1ZWRlbiBheXVkYXIgYSBuaXZlbGFyIGVsIGNhbXBvIGRlIGp1ZWdvIGVuIGNhc29zIGNvbW8gZXN0ZSwgcGVybyB1bmEgdmV6IG3DoXMsIGxhIHNvbHVjacOzbiByZWFsIGVzIHVzYXIgc3UgcHJvcGlvIHByaXZpbGVnaW8gcGFyYSBhYm9yZGFyIGZhY3RvcmVzIG3DoXMgZ3JhbmRlcyBmdWVyYSBkZSBjbGFzZSBbUGFydGUyMDExXS4KCkxvIG3DoXMgaW1wb3J0YW50ZSBlcyBhY2VwdGFyIHF1ZSBubyBwdWVkZSBheXVkYXIgYSB0b2RvcyB0b2RvIGVsIHRpZW1wby4gU2kgcmVkdWNlIGxhIHZlbG9jaWRhZCBwYXJhIGFjb21vZGFyIGEgZG9zIHBlcnNvbmFzIHF1ZSBlc3TDoW4gbHVjaGFuZG8sIGVzdMOhIGZhbGxhbmRvIGEgbG9zIG90cm9zIGRpZWNpb2Noby4gRGVsIG1pc21vIG1vZG8sIHNpIHBhc2FzIHVub3MgbWludXRvcyBoYWJsYW5kbyBkZSB1biB0ZW1hIGF2YW56YWRvIGNvbiB1biBhbHVtbm8gYWJ1cnJpZG8sIGVsIHJlc3RvIGRlIGxhIGNsYXNlIHNlIHNlbnRpcsOhIGV4Y2x1aWRvLgoKCiMjIFByb2dyYW1hY2nDs24gZW4gcGFyZWphCgoqKkxhIHByb2dyYW1hY2nDs24gcG9yIHBhcmVzKiogZXMgdW5hIHByw6FjdGljYSBkZSBkZXNhcnJvbGxvIGRlIHNvZnR3YXJlIGVuIGxhIHF1ZSBkb3MgcHJvZ3JhbWFkb3JlcyB0cmFiYWphbiBqdW50b3MgZW4gdW5hIGNvbXB1dGFkb3JhLiBVbmEgcGVyc29uYSAoZWwgY29uZHVjdG9yKSBlc2NyaWJlIG1pZW50cmFzIHF1ZSBsYSBvdHJhIChlbCBuYXZlZ2Fkb3IpIG9mcmVjZSBjb21lbnRhcmlvcyB5IHN1Z2VyZW5jaWFzLCB5IGxvcyBkb3MgaW50ZXJjYW1iaWFuIHJvbGVzIHZhcmlhcyB2ZWNlcyBwb3IgaG9yYS4KCkxhIHByb2dyYW1hY2nDs24gZW4gcGFyZWphIGVzIHVuYSBwcsOhY3RpY2EgZWZlY3RpdmEgZW4gZWwgdHJhYmFqbyBwcm9mZXNpb25hbCBbSGFubjIwMDldIHkgdGFtYmnDqW4gZXMgdW5hIGJ1ZW5hIGZvcm1hIGRlIGVuc2XDsWFyOiBsb3MgYmVuZWZpY2lvcyBpbmNsdXllbiB1bmEgbWF5b3IgdGFzYSBkZSDDqXhpdG8gZW4gY3Vyc29zIGludHJvZHVjdG9yaW9zLCB1biBtZWpvciBzb2Z0d2FyZSB5IHVuYSBtYXlvciBjb25maWFuemEgZGVsIGFsdW1ubyBlbiBzdXMgc29sdWNpb25lcy4gVGFtYmnDqW4gaGF5IGV2aWRlbmNpYSBkZSBxdWUgbG9zIGVzdHVkaWFudGVzIGRlIGdydXBvcyBzdWJyZXByZXNlbnRhZG9zIHNlIGJlbmVmaWNpYW4gYcO6biBtw6FzIHF1ZSBvdHJvcyBbTWNEbzIwMDYsIEhhbmsyMDExLCBQb3J0MjAxMywgQ2VsZTIwMThdLiBMb3Mgc29jaW9zIHB1ZWRlbiBheXVkYXJzZSBtdXR1YW1lbnRlIGR1cmFudGUgbG9zIGVqZXJjaWNpb3MgcHLDoWN0aWNvcywgYWNsYXJhciBsb3MgY29uY2VwdG9zIGVycsOzbmVvcyBkZSBjYWRhIHVubyBjdWFuZG8gc2UgcHJlc2VudGEgbGEgc29sdWNpw7NuIHkgZGlzY3V0aXIgaW50ZXJlc2VzIGNvbXVuZXMgZHVyYW50ZSBsb3MgZGVzY2Fuc29zLiBMbyBoZSBlbmNvbnRyYWRvIHBhcnRpY3VsYXJtZW50ZSDDunRpbCBjb24gbGFzIGNsYXNlcyBkZSBoYWJpbGlkYWRlcyBtaXh0YXMsIHlhIHF1ZSBsb3MgcGFyZXMgc29uIG3DoXMgaG9tb2fDqW5lb3MgcXVlIGxvcyBpbmRpdmlkdW9zLgoKQ3VhbmRvIHVzZSBlbCBlbXBhcmVqYW1pZW50bywgcG9uZ2EgYSB0b2RvcyBlbiBwYXJlamFzLCBubyBzb2xvIGEgbG9zIGVzdHVkaWFudGVzIHF1ZSB0aWVuZW4gZGlmaWN1bHRhZGVzLCBwYXJhIHF1ZSBuYWRpZSBzZSBzaWVudGEgc2luZ3VsYXIuIFRhbWJpw6luIGVzIMO6dGlsIGhhY2VyIHF1ZSBsYXMgcGVyc29uYXMgc2Ugc2llbnRlbiBlbiBudWV2b3MgbHVnYXJlcyAoeSwgcG9yIGxvIHRhbnRvLCBzZSBlbXBhcmVqZW4gY29uIGRpZmVyZW50ZXMgcGFyZWphcykgZGUgZm9ybWEgcmVndWxhciwgeSBxdWUgbGFzIHBlcnNvbmFzIGNhbWJpZW4gbG9zIHJvbGVzIGRlbnRybyBkZSBjYWRhIHBhcmVqYSB0cmVzIG8gY3VhdHJvIHZlY2VzIHBvciBob3JhIHBhcmEgcXVlIGxhIHBlcnNvbmFsaWRhZCBtw6FzIGZ1ZXJ0ZSBlbiBjYWRhIHBhcmVqYSBubyBkb21pbmUgTGEgc2VzacOzbi4KClNpIHN1cyBhbHVtbm9zIHNvbiBudWV2b3MgZW4gbGEgcHJvZ3JhbWFjacOzbiBkZSBwYXJlamFzLCB0w7NtZXNlIHVub3MgbWludXRvcyBwYXJhIGRlbW9zdHJhciBjw7NtbyBzZSB2ZSByZWFsbWVudGUgcGFyYSBxdWUgZW50aWVuZGFuIHF1ZSBsYSBwZXJzb25hIHF1ZSBubyB0aWVuZSBsYXMgbWFub3MgZW4gZWwgdGVjbGFkbyBubyBkZWJlIHNlbnRhcnNlIHkgbWlyYXIuIEZpbmFsbWVudGUsIGTDrWdhbGVzIHF1ZSBsYXMgcGVyc29uYXMgcXVlIHNlIGNlbnRyYW4gZW4gdHJhdGFyIGRlIGNvbXBsZXRhciBsYSB0YXJlYSBsbyBtw6FzIHLDoXBpZG8gcG9zaWJsZSBzb24gbWVub3MganVzdGFzIGVuIHN1IGludGVyY2FtYmlvIFtMZXdpMjAxNV0uCgo+KipDYW1iaW8gZGUgc29jaW9zKioKPiBMb3MgbWFlc3Ryb3MgdGllbmVuIG9waW5pb25lcyBlbmNvbnRyYWRhcyBzb2JyZSBzaSBzZSBkZWJlIGV4aWdpciBhIGxhcyBwZXJzb25hcyBxdWUgY2FtYmllbiBkZSBwYXJlamEgYSBpbnRlcnZhbG9zIHJlZ3VsYXJlcy4gUG9yIHVuIGxhZG8sIGxlcyBkYSBhIHRvZG9zIGxhIG9wb3J0dW5pZGFkIGRlIG9idGVuZXIgbnVldmFzIGlkZWFzIHkgaGFjZXIgbnVldm9zIGFtaWdvcy4gUG9yIG90cm8gbGFkbywgbW92ZXIgY29tcHV0YWRvcmFzIHkgYWRhcHRhZG9yZXMgZGUgY29ycmllbnRlIGEgZXNjcml0b3Jpb3MgbnVldm9zIHZhcmlhcyB2ZWNlcyBhbCBkw61hIGVzIHBlcmp1ZGljaWFsLCB5IGVsIGVtcGFyZWphbWllbnRvIHB1ZWRlIHNlciBpbmPDs21vZG8gcGFyYSBsb3MgaW50cm92ZXJ0aWRvcy4gRGljaG8gZXN0bywgW0hhbm4yMDEwXSBlbmNvbnRyw7MgdW5hIGNvcnJlbGFjacOzbiBkw6liaWwgZW50cmUgbG9zIHJhc2dvcyBkZSBwZXJzb25hbGlkYWQgZGUgbG9zICJDaW5jbyBHcmFuZGVzIiB5IGVsIHJlbmRpbWllbnRvIGVuIGxhIHByb2dyYW1hY2nDs24gZGUgcGFyZXMsIGF1bnF1ZSB1biBlc3R1ZGlvIGFudGVyaW9yIFtXYWxsMjAwOV0gZW5jb250csOzIHF1ZSBsb3MgcGFyZXMgY3V5b3MgbWllbWJyb3MgdGVuw61hbiBkaWZlcmVudGVzIG5pdmVsZXMgZGUgcmFzZ29zIGRlIHBlcnNvbmFsaWRhZCBzZSBjb211bmljYWJhbiBjb24gbcOhcyBmcmVjdWVuY2lhLgoKCiMjIFRvbWFyIG5vdGFzIC4uLiDCv0p1bnRvcz8KClRvbWFyIG5vdGFzIGVzIHVuYSBmb3JtYSBkZSBlbGFib3JhY2nDs24gZW4gdGllbXBvIHJlYWwgKFNlY2Npw7NuIDUuMSk6IHRlIG9ibGlnYSBhIG9yZ2FuaXphciB5IHJlZmxleGlvbmFyIHNvYnJlIGVsIG1hdGVyaWFsIGEgbWVkaWRhIHF1ZSBlbnRyYSwgbG8gcXVlIGEgc3UgdmV6IGF1bWVudGEgbGEgcHJvYmFiaWxpZGFkIGRlIHF1ZSBsbyB0cmFuc2ZpZXJhcyBhIGxhIG1lbW9yaWEgYSBsYXJnbyBwbGF6by4gTXVjaG9zIGVzdHVkaW9zIGhhbiBkZW1vc3RyYWRvIHF1ZSB0b21hciBub3RhcyBtaWVudHJhcyBzZSBhcHJlbmRlIG1lam9yYSBsYSByZXRlbmNpw7NuIFtBaWtlMTk3NSwgQm9oYTIwMTFdLiBTaSBiaWVuIGHDum4gbm8gc2UgaGEgZXN0dWRpYWRvIGFtcGxpYW1lbnRlIFtPcm5kMjAxNSwgWWFuZzIwMTVdLCBoZSBkZXNjdWJpZXJ0byBxdWUgaGFjZXIgcXVlIGxvcyBhbHVtbm9zIHRvbWVuIG5vdGFzIGp1bnRvcyBlbiB1bmEgcMOhZ2luYSBlbiBsw61uZWEgY29tcGFydGlkYSB0YW1iacOpbiBlcyBlZmVjdGl2bzoKCiogUGVybWl0ZSBhIGxhcyBwZXJzb25hcyBjb21wYXJhciBsbyBxdWUgY3JlZW4gcXVlIGVzdMOhbiBlc2N1Y2hhbmRvIGNvbiBsbyBxdWUgb3RyYXMgcGVyc29uYXMgZXN0w6FuIGVzY3VjaGFuZG8sIGxvIHF1ZSBsZXMgYXl1ZGEgYSBsbGVuYXIgdmFjw61vcyB5IGNvcnJlZ2lyIGNvbmNlcHRvcyBlcnLDs25lb3MgZGUgaW5tZWRpYXRvLgoKKiBPZnJlY2UgYSBsb3MgYWx1bW5vcyBtw6FzIGF2YW56YWRvcyBkZSBsYSBjbGFzZSBhbGdvIMO6dGlsIHBhcmEgaGFjZXIuIEVuIGx1Z2FyIGRlIGFidXJyaXJzZSB5IHJldmlzYXIgSW5zdGFncmFtIGR1cmFudGUgbGEgY2xhc2UsIHB1ZWRlbiB0b21hciBsYSBpbmljaWF0aXZhIGRlIHJlZ2lzdHJhciBsbyBxdWUgc2UgZGljZSwgbG8gcXVlIGxvcyBtYW50aWVuZSBpbnRlcmVzYWRvcyB5IHBlcm1pdGUgYSBsb3MgZXN0dWRpYW50ZXMgbWVub3MgYXZhbnphZG9zIGNlbnRyYXIgbcOhcyBzdSBhdGVuY2nDs24gZW4gZWwgbnVldm8gbWF0ZXJpYWwuCgoqIExhcyBub3RhcyBxdWUgdG9tYW4gbG9zIGFsdW1ub3Mgc3VlbGVuIHNlciBtw6FzIMO6dGlsZXMgcGFyYSBlbGxvcyBxdWUgbGFzIHF1ZSBlbCBtYWVzdHJvIHByZXBhcmFyw61hIGRlIGFudGVtYW5vLCB5YSBxdWUgZXMgbcOhcyBwcm9iYWJsZSBxdWUgbG9zIGFsdW1ub3MgZXNjcmliYW4gbG8gcXVlIHJlYWxtZW50ZSBlbmNvbnRyYXJvbiBudWV2byBlbiBsdWdhciBkZSBsbyBxdWUgZWwgbWFlc3RybyBwcmVkaWpvIHF1ZSBzZXLDrWEgbnVldm8uCgoqIEVjaGFyIHVuIHZpc3Rhem8gYSBsYXMgbm90YXMgcmVjaWVudGVzIG1pZW50cmFzIGxvcyBhbHVtbm9zIHRyYWJhamFuIGVuIHVuIGVqZXJjaWNpbyBheXVkYSBhbCBtYWVzdHJvIGEgZGVzY3VicmlyIHF1ZSBsYSBjbGFzZSBwZXJkacOzIG8gbm8gZW50ZW5kacOzIGFsZ28uCgo+KirCv0VzIGxhIHBsdW1hIG3DoXMgcG9kZXJvc2EgcXVlIGVsIHRlY2xhZG8/KioKPgo+W011ZWwyMDE0XSBpbmZvcm3DsyBxdWUgdG9tYXIgbm90YXMgZW4gdW5hIGNvbXB1dGFkb3JhIGdlbmVyYWxtZW50ZSBlcyBtZW5vcyBlZmVjdGl2byBxdWUgdG9tYXIgbm90YXMgY29uIGzDoXBpeiB5IHBhcGVsLiBTaSBiaWVuIHN1IHJlc3VsdGFkbyBmdWUgYW1wbGlhbWVudGUgY29tcGFydGlkbywgW01vcmUyMDE5XSBubyBwdWRvIHJlcGxpY2FybG8uCgpTaSBsb3MgYWx1bW5vcyB0b21hbiBub3RhcyBqdW50b3MsIHRhbWJpw6luIHB1ZWRlIGhhY2VyIHF1ZSBwZWd1ZW4gZnJhZ21lbnRvcyBicmV2ZXMgZGUgY8OzZGlnbyB5IHJlc3B1ZXN0YXMgZW4gZm9ybWEgZGUgcHVudG9zIG8gZnJhc2VzIHBhcmEgcHJlZ3VudGFzIGRlIGV2YWx1YWNpw7NuIGZvcm1hdGl2YS4gUGFyYSBldml0YXIgcXVlIHRvZG9zIGludGVudGVuIGVkaXRhciBlbCBtaXNtbyBwYXIgZGUgbMOtbmVhcyBhbCBtaXNtbyB0aWVtcG8sIGhhZ2EgdW5hIGxpc3RhIGRlbCBub21icmUgZGUgdG9kb3MgeSBww6lndWVsbyBlbiBlbCBkb2N1bWVudG8gY2FkYSB2ZXogcXVlIGRlc2VlIHF1ZSBjYWRhIHBlcnNvbmEgcmVzcG9uZGEgdW5hIHByZWd1bnRhLgoKTG9zIGVzdHVkaWFudGVzIGEgbWVudWRvIGVuY3VlbnRyYW4gcXVlIHRvbWFyIG5vdGFzIGp1bnRvcyBlcyB1bmEgZGlzdHJhY2Npw7NuIGxhIHByaW1lcmEgdmV6IHF1ZSBsbyBpbnRlbnRhbiBwb3JxdWUgdGllbmVuIHF1ZSBkaXZpZGlyIHN1IGF0ZW5jacOzbiBlbnRyZSBsbyBxdWUgZGljZSBlbCBtYWVzdHJvIHkgbG8gcXVlIGVzY3JpYmVuIHN1cyBjb21wYcOxZXJvcyAoU2VjY2nDs24gNC4xKS4gU2kgc29sbyBlc3TDoSB0cmFiYWphbmRvIGNvbiB1biBncnVwbyBlbiBwYXJ0aWN1bGFyIHVuYSB2ZXosIGRlYmUgcHJlc3RhciBhdGVuY2nDs24gYSBsb3MgY29uc2Vqb3MgZGUgbGEgU2VjY2nDs24gOS4xMiB5IGhhY2VyIHF1ZSB0b21lbiBub3RhcyBpbmRpdmlkdWFsbWVudGUuCgoKIyMgUG9pbnRzIGZvciBJbXByb3ZlbWVudAoKT25lIHdheSB0byBkZW1vbnN0cmF0ZSB0byBsZWFybmVycyB0aGF0IHRoZXkgYXJlIGxlYXJuaW5nIHdpdGggeW91LCBub3QganVzdCBmcm9tIHlvdSwgaXMgdG8gYWxsb3cgdGhlbSB0byB0YWtlIG5vdGVzIGJ5IGVkaXRpbmcgKGEgY29weSBvZikgeW91ciBsZXNzb24uIEluc3RlYWQgb2YgcG9zdGluZyBQREZzIGZvciB0aGVtIHRvIGRvd25sb2FkLCBjcmVhdGUgZWRpdGFibGUgY29waWVzIG9mIHlvdXIgc2xpZGVzLCBub3RlcywgYW5kIGV4ZXJjaXNlcyBpbiBhIHdpa2ksIGEgR29vZ2xlIERvYywgb3IgYW55dGhpbmcgZWxzZSB0aGF0IGFsbG93cyB5b3UgdG8gcmV2aWV3IGFuZCBjb21tZW50IG9uIGNoYW5nZXMuIEdpdmluZyBwZW9wbGUgY3JlZGl0IGZvciBmaXhpbmcgbWlzdGFrZXMsIGNsYXJpZnlpbmcgZXhwbGFuYXRpb25zLCBhZGRpbmcgbmV3IGV4YW1wbGVzLCBhbmQgd3JpdGluZyBuZXcgZXhlcmNpc2VzIGRvZXNu4oCZdCByZWR1Y2UgeW91ciB3b3JrbG9hZCwgYnV0IGluY3JlYXNlcyBlbmdhZ2VtZW50IGFuZCB0aGUgbGVzc29u4oCZcyBsaWZldGltZSAoU2VjdGlvbiA2LjMpLgoKCiMjIE5vdGFzIGFkaGVzaXZhcwpMYXMgbm90YXMgYWRoZXNpdmFzIHNvbiB1bmEgZGUgbWlzIGhlcnJhbWllbnRhcyBkZSBlbnNlw7FhbnphIGZhdm9yaXRhcywgeSBubyBlc3RveSBzb2xvIGFtYW5kbyBzdSB2ZXJzYXRpbGlkYWQsIHBvcnRhYmlsaWRhZCwgYWRoZXNpdmlkYWQsIGNhcGFjaWRhZCBkZSBwbGVnYWRvIHkgYXJvbWEgc3V0aWwgcGVybyBhdHJhY3Rpdm8gW1dhcmQyMDE1XS4KCiMjIENvbW8gYmFuZGVyYXMgZGUgZXN0YWRvCkVudHJlZ3VlIGEgY2FkYSBhbHVtbm8gZG9zIG5vdGFzIGFkaGVzaXZhcyBkZSBkaWZlcmVudGVzIGNvbG9yZXMsIGNvbW8gZWwgbmFyYW5qYSB5IGVsIHZlcmRlLiBFc3RvcyBzZSBwdWVkZW4gcmV0ZW5lciBwYXJhIHZvdGFyLCBwZXJvIHN1IHVzbyByZWFsIGVzIGNvbW8gaW5kaWNhZG9yZXMgZGUgZXN0YWRvLiBTaSBhbGd1aWVuIGhhIGNvbXBsZXRhZG8gdW4gZWplcmNpY2lvIHkgcXVpZXJlIHF1ZSBsbyByZXZpc2VuLCBwb25lbiBsYSBub3RhIGFkaGVzaXZhIHZlcmRlIGVuIHN1IGNvbXB1dGFkb3JhIHBvcnTDoXRpbDsgc2kgc2UgZW5jdWVudHJhbiBjb24gdW4gcHJvYmxlbWEgeSBuZWNlc2l0YW4gYXl1ZGEsIGNvbG9jYW4gZWwgbmFyYW5qYS4gRXN0byBmdW5jaW9uYSBtdWNobyBtZWpvciBxdWUgaGFjZXIgcXVlIGxhcyBwZXJzb25hcyBsZXZhbnRlbiBsYSBtYW5vOiBlcyBtw6FzIGRpc2NyZXRvIChsbyBxdWUgc2lnbmlmaWNhIHF1ZSBlcyBtw6FzIHByb2JhYmxlIHF1ZSBsbyBoYWdhbiksIHB1ZWRlbiBzZWd1aXIgdHJhYmFqYW5kbyBtaWVudHJhcyBzZSBsZXZhbnRhIHN1IGJhbmRlcmEgZW4gbHVnYXIgZGUgdHJhdGFyIGRlIGVzY3JpYmlyIGNvbiB1bmEgc29sYSBtYW5vLCB5IGVsIG1hZXN0cm8gcHVlZGUgdmVhIHLDoXBpZGFtZW50ZSBkZXNkZSBlbCBmcmVudGUgZGUgbGEgc2FsYSBlbiBxdcOpIGVzdGFkbyBzZSBlbmN1ZW50cmEgbGEgY2xhc2UuIExhcyBiYW5kZXJhcyBkZSBlc3RhZG8gc29uIHBhcnRpY3VsYXJtZW50ZSDDunRpbGVzIGN1YW5kbyBsYXMgcGVyc29uYXMgZW4gY2xhc2VzIGRlIGhhYmlsaWRhZGVzIG1peHRhcyBlc3TDoW4gdHJhYmFqYW5kbyBlbiBlbCBtYXRlcmlhbCBhIHN1IHByb3BpYSB2ZWxvY2lkYWQgKFNlY2Npw7NuIDkuNSkuCgpVbmEgdmV6IHF1ZSBzdXMgYWx1bW5vcyBzZSBzaWVudGFuIGPDs21vZG9zIGNvbiBkb3MgYWRoZXNpdm9zLCBkZWxlcyB1biB0ZXJjZXJvIHF1ZSBwdWVkYW4gc29wb3J0YXIgY3VhbmRvIHN1cyBjZXJlYnJvcyBlc3TDqW4gbGxlbm9zIG8gcXVlIG5lY2VzaXRlbiB1biBkZXNjYW5zbyBlbiBlbCBiYcOxbzIyMC4gVW5hIHZleiBtw6FzLCBlcyBtw6FzIHByb2JhYmxlIHF1ZSBsb3MgYWR1bHRvcyBwdWJsaXF1ZW4gdW5hIG5vdGEgYWRoZXNpdmEgcXVlIGxldmFudGFyIGxhIG1hbm8sIHkgdW5hIHZleiBxdWUgc3ViZSB1bmEgbm90YSBhZGhlc2l2YSBhenVsLCBzdWVsZSBhcGFyZWNlciB1bmEgcsOhZmFnYSBkZSBvdHJhcy4KCiMjIFBhcmEgZGlzdHJpYnVpciBsYSBhdGVuY2nDs24KTGFzIG5vdGFzIGFkaGVzaXZhcyB0YW1iacOpbiBzZSBwdWVkZW4gdXNhciBwYXJhIGdhcmFudGl6YXIgcXVlIGxhIGF0ZW5jacOzbiBkZWwgbWFlc3RybyBzZSBkaXN0cmlidXlhIGRlIG1hbmVyYSBqdXN0YS4gSGFnYSBxdWUgY2FkYSBhbHVtbm8gZXNjcmliYSBzdSBub21icmUgZW4gdW5hIG5vdGEgYWRoZXNpdmEgeSBsbyBwb25nYSBlbiBzdSBjb21wdXRhZG9yYSBwb3J0w6F0aWwuIENhZGEgdmV6IHF1ZSBlbCBtYWVzdHJvIGxvcyBsbGFtYSBvIGNvbnRlc3RhIHVuYSBkZSBzdXMgcHJlZ3VudGFzLCB0b21hbiBub3RhIGFkaGVzaXZhLiBVbmEgdmV6IHF1ZSB0b2RhcyBsYXMgbm90YXMgYWRoZXNpdmFzIGVzdMOhbiBjYcOtZGFzLCB0b2RvcyB2dWVsdmVuIGEgcG9uZXIgbGFzIHN1eWFzLgoKRXN0YSB0w6ljbmljYSBmYWNpbGl0YSBxdWUgZWwgbWFlc3RybyB2ZWEgY29uIHF1acOpbiBubyBoYSBoYWJsYWRvIHJlY2llbnRlbWVudGUsIGxvIHF1ZSBhIHN1IHZleiBsbyBheXVkYSBhIGV2aXRhciBwcmVqdWljaW9zIGluY29uc2NpZW50ZXMgZSBpbnRlcmFjdHVhciBwcmVmZXJlbnRlbWVudGUgY29uIHN1cyBhbHVtbm9zIG3DoXMgZXh0cm92ZXJ0aWRvcy4gU2luIHVuIGNvbnRyb2wgY29tbyBlc3RlLCBlcyBkZW1hc2lhZG8gZsOhY2lsIGNyZWFyIHVuIGNpY2xvIGRlIHJldHJvYWxpbWVudGFjacOzbiBlbiBlbCBxdWUgbG9zIGV4dHJvdmVydGlkb3MgcmVjaWJhbiBtw6FzIGF0ZW5jacOzbiwgbG8gcXVlIGxvcyBsbGV2YSBhIG1lam9yYXIsIGxvIHF1ZSBhIHN1IHZleiBsb3MgbGxldmEgYSBvYnRlbmVyIG3DoXMgYXRlbmNpw7NuLCBtaWVudHJhcyBxdWUgbG9zIGVzdHVkaWFudGVzIG3DoXMgdHJhbnF1aWxvcywgbWVub3MgY29uZmlhZG9zIG8gbWFyZ2luYWRvcyBxdWVkYW4gZGV0csOhcyBbQWx2aTE5OTksIEp1c3MyMDA1XS4KClRhbWJpw6luIG11ZXN0cmEgYSBsb3MgYWx1bW5vcyBxdWUgbGEgYXRlbmNpw7NuIHNlIGVzdMOhIGRpc3RyaWJ1eWVuZG8gZGUgbWFuZXJhIGp1c3RhLCBkZSBtb2RvIHF1ZSBjdWFuZG8gc2UgbGVzIGxsYW1hLCBubyBzZW50aXLDoW4gcXVlIGVzdMOhbiBzaWVuZG8gbW9sZXN0YWRvcy4gQ3VhbmRvIGVzdG95IHRyYWJhamFuZG8gY29uIHVuIG51ZXZvIGdydXBvLCBwZXJtaXRvIHF1ZSBsYXMgcGVyc29uYXMgdG9tZW4gc3VzIHByb3BpYXMgbm90YXMgYWRoZXNpdmFzIGR1cmFudGUgbGFzIHByaW1lcmFzIGhvcmFzIG8gZG9zIGRlIGNsYXNlIHNpIHByZWZpZXJlbiBubyBzZXIgbGxhbWFkb3MuIFNpIGNvbnRpbsO6YW4gaGFjaWVuZG8gZXN0byBhIG1lZGlkYSBxdWUgcGFzYSBlbCB0aWVtcG8sIHRyYXRvIGRlIG1hbnRlbmVyIHVuYSBjb252ZXJzYWNpw7NuIHRyYW5xdWlsYSBjb24gZWxsb3MgcGFyYSBhdmVyaWd1YXIgcG9yIHF1w6kgeSB2ZXIgc2kgaGF5IGFsZ28gcXVlIHB1ZWRhIGhhY2VyIHBhcmEgcXVlIHNlIHNpZW50YW4gbcOhcyBjw7Ntb2Rvcy4KCiMjIENvbW8gdGFyamV0YXMgZGUgbWludXRvcwpUYW1iacOpbiBwdWVkZSB1c2FyIG5vdGFzIGFkaGVzaXZhcyBjb21vIHRhcmpldGFzIGRlIG1pbnV0b3MuIEFudGVzIGRlIGNhZGEgZGVzY2Fuc28sIGxvcyBhbHVtbm9zIHNlIHRvbWFuIHVuIG1pbnV0byBwYXJhIGVzY3JpYmlyIHVuYSBjb3NhIGVuIGxhIG5vdGEgYWRoZXNpdmEgdmVyZGUgcXVlIGNyZWVuIHF1ZSBzZXLDoSDDunRpbCB5IHVuYSBjb3NhIGVuIGxhIG5vdGEgbmFyYW5qYSBxdWUgZW5jb250cmFyb24gZGVtYXNpYWRvIHLDoXBpZGEsIGxlbnRhLCBjb25mdXNhIG8gaXJyZWxldmFudGUuIE1pZW50cmFzIGRpc2ZydXRhbiBkZSBzdSBjYWbDqSBvIGFsbXVlcnpvLCByZXBhc2Ugc3VzIG5vdGFzIHkgYnVzcXVlIHBhdHJvbmVzLiBUYXJkYSBtZW5vcyBkZSBjaW5jbyBtaW51dG9zIGVuIHZlciBxdcOpIGRpc2ZydXRhbiBsb3MgYWx1bW5vcyBkZSB1bmEgY2xhc2UgZGUgNDAgcGVyc29uYXMsIHBvciBxdcOpIGVzdMOhbiBjb25mdW5kaWRvcywgcXXDqSBwcm9ibGVtYXMgdGllbmVuIHkgcXXDqSBwcmVndW50YXMgYcO6biBubyBoYW4gcmVzcG9uZGlkby4KCkxvcyBhbHVtbm9zIG5vIGRlYmVuIGZpcm1hciBzdXMgdGFyamV0YXMgZGUgYWN0YXM6IHNlIGNvbnNpZGVyYW4gY29tZW50YXJpb3MgYW7Ds25pbW9zLiBMYSB0w6ljbmljYSBkZSB1bm8gYXJyaWJhIC8gdW5vIGFiYWpvIGRlc2NyaXRhIGVuIGxhIFNlY2Npw7NuIDkuMTEgZXMgdW5hIG9wb3J0dW5pZGFkIGRlIHJldHJvYWxpbWVudGFjacOzbiBjb2xlY3RpdmEgYXRyaWJ1aWJsZS4KCgoKIyMgTnVuY2EgdW5hIHDDoWdpbmEgZW4gYmxhbmNvCkxvcyB0YWxsZXJlcyBkZSBwcm9ncmFtYWNpw7NuIHkgb3Ryb3MgdGlwb3MgZGUgY2xhc2VzIHNlIHB1ZWRlbiBjb25zdHJ1aXIgYWxyZWRlZG9yIGRlIHVuIGNvbmp1bnRvIGRlIGVqZXJjaWNpb3MgaW5kZXBlbmRpZW50ZXMsIGRlc2Fycm9sbGFyIHVuIHNvbG8gZWplbXBsbyBleHRlbmRpZG8gcG9yIGV0YXBhcyBvIHVzYXIgdW5hIGVzdHJhdGVnaWEgbWl4dGEuIExhcyBkb3MgdmVudGFqYXMgcHJpbmNpcGFsZXMgZGUgbG9zIGVqZXJjaWNpb3MgaW5kZXBlbmRpZW50ZXMgc29uIHF1ZSBsYXMgcGVyc29uYXMgcXVlIHNlIHF1ZWRhbiBhdHLDoXMgcHVlZGVuIHZvbHZlciBhIHNpbmNyb25pemFyIGbDoWNpbG1lbnRlIHkgcXVlIGxvcyBkZXNhcnJvbGxhZG9yZXMgZGUgbGEgbGVjY2nDs24gcHVlZGVuIGFncmVnYXIsIGVsaW1pbmFyIHkgcmVvcmdhbml6YXIgZWwgbWF0ZXJpYWwgYSB2b2x1bnRhZCAoU2VjY2nDs24gNi4zKS4gUG9yIG90cm8gbGFkbywgdW4gc29sbyBlamVtcGxvIGV4dGVuZGlkbyBtb3N0cmFyw6EgYSBsb3MgYWx1bW5vcyBjw7NtbyBlbmNhamFuIGxhcyBwYXJ0ZXMgcXVlIGVzdMOhbiBhcHJlbmRpZW5kbzogZW4gZWwgbGVuZ3VhamUgZWR1Y2F0aXZvLCBsZXMgYnJpbmRhIG3DoXMgb3BvcnR1bmlkYWRlcyBwYXJhIGludGVncmFyIHN1cyBjb25vY2ltaWVudG9zLgoKSW5kZXBlbmRpZW50ZW1lbnRlIGRlbCBlbmZvcXVlIHF1ZSBhZG9wdGUsIGxvcyBwcmluY2lwaWFudGVzIG51bmNhIGRlYmVuIGNvbWVuemFyIGEgaGFjZXIgZWplcmNpY2lvcyBjb24gdW5hIHDDoWdpbmEgbyBwYW50YWxsYSBlbiBibGFuY28sIHlhIHF1ZSBhIG1lbnVkbyBsZXMgcmVzdWx0YSBpbnRpbWlkYW50ZSBvIGRlc2NvbmNlcnRhbnRlLiBTaSBoYW4gZXN0YWRvIHNpZ3VpZW5kbyBsYSBjb2RpZmljYWNpw7NuIGVuIHZpdm8sIHDDrWRhbGVzIHF1ZSBhZ3JlZ3VlbiBhbGd1bmFzIGzDrW5lYXMgbcOhcyBvIHF1ZSBtb2RpZmlxdWVuIGVsIGVqZW1wbG8gcXVlIGhhbiBjcmVhZG8uIEFsdGVybmF0aXZhbWVudGUsIHNpIGVzdMOhbiB0b21hbmRvIG5vdGFzIGp1bnRhcywgcGVndWUgYWxndW5hcyBsw61uZWFzIGRlIGPDs2RpZ28gZGUgaW5pY2lvIGVuIGVsIGRvY3VtZW50byBwYXJhIHF1ZSBzZSBleHRpZW5kYW4gbyBtb2RpZmlxdWVuLgoKTW9kaWZpY2FyIGVsIGPDs2RpZ28gZXhpc3RlbnRlIGVuIGx1Z2FyIGRlIGVzY3JpYmlyIHVuIGPDs2RpZ28gbnVldm8gZGVzZGUgY2VybyBubyBzb2xvIGRhIGVzdHJ1Y3R1cmEgYSBsb3MgYWx1bW5vczogdGFtYmnDqW4gZXN0w6EgbcOhcyBjZXJjYSBkZSBsbyBxdWUgaGFyw6FuIGVuIGxhIHZpZGEgcmVhbC4gU2luIGVtYmFyZ28sIHRlbmdhIGVuIGN1ZW50YSBxdWUgbG9zIGFsdW1ub3MgcHVlZGVuIGRpc3RyYWVyc2UgYWwgdHJhdGFyIGRlIGNvbXByZW5kZXIgdG9kbyBlbCBjw7NkaWdvIGRlIGluaWNpbyBlbiBsdWdhciBkZSBoYWNlciBzdSBwcm9waW8gdHJhYmFqby4gRWwgdmFjw61vIHDDumJsaWNvIGVzdMOhdGljbyBkZSBKYXZhIG1haW4gKCkgbyB1biBwdcOxYWRvIGRlIGRlY2xhcmFjaW9uZXMgZGUgaW1wb3J0YWNpw7NuIGVuIGxhIHBhcnRlIHN1cGVyaW9yIGRlIHVuIHByb2dyYW1hIFB5dGhvbiBwdWVkZW4gdGVuZXIgc2VudGlkbyBwYXJhIHVzdGVkLCBwZXJvIGVzIHVuYSBjYXJnYSBleHRyYcOxYSBwYXJhIGVsbG9zIChDYXDDrXR1bG8gNCkuCgojIyBQcmVwYXJhbmRvIGEgdHVzIGFsdW1ub3MKTG9zIGVzdHVkaWFudGVzIGRlIGNhbXBvIGxpYnJlIGEgbWVudWRvIHF1aWVyZW4gdHJhZXIgc3VzIHByb3BpYXMgY29tcHV0YWRvcmFzIHkgc2FsaXIgZGUgbGEgY2xhc2UgY29uIGVzYXMgbcOhcXVpbmFzIGNvbmZpZ3VyYWRhcyBwYXJhIGhhY2VyIHVuIHRyYWJham8gcmVhbC4gUG9yIGxvIHRhbnRvLCBsb3MgbWFlc3Ryb3MgZGUgY2FtcG8gbGlicmUgZGViZW4gcHJlcGFyYXJzZSBwYXJhIGVuc2XDsWFyIHRhbnRvIGVuIFdpbmRvd3MgY29tbyBlbiBNYWNPUzIyMiwgYXVucXVlIHNlcsOtYSBtw6FzIHNpbXBsZSBleGlnaXIgYSBsb3MgYWx1bW5vcyBxdWUgdXNlbiBzb2xvIHVuby4KCj4qKkRlbm9taW5hZG9yZXMgQ29tdW5lcyoqCj4KPlNpIHN1cyBwYXJ0aWNpcGFudGVzIGVzdMOhbiB1c2FuZG8gZGlmZXJlbnRlcyBzaXN0ZW1hcyBvcGVyYXRpdm9zLCB0cmF0ZSBkZSBldml0YXIgZWwgdXNvIGRlIGZ1bmNpb25lcyBxdWUgc29uIGVzcGVjw61maWNhcyBkZSB1bm8gc29sbyB5IHNlw7FhbGUgY3VhbHF1aWVyYSBxdWUgc8OtIHVzZS4gUG9yIGVqZW1wbG8sIGxvcyBjb250cm9sZXMgeSBlbCBjb21wb3J0YW1pZW50byBkZSAibWluaW1pemFyIHZlbnRhbmEiIGVuIFdpbmRvd3Mgc29uIGRpZmVyZW50ZXMgZGUgbG9zIGRlIE1hY09TLgoKTm8gaW1wb3J0YSBjb24gY3XDoW50YXMgcGxhdGFmb3JtYXMgdGVuZ2EgcXVlIGxpZGlhciwgcG9uZ2EgaW5zdHJ1Y2Npb25lcyBkZXRhbGxhZGFzIGRlIGNvbmZpZ3VyYWNpw7NuIGVuIGVsIHNpdGlvIHdlYiBkZSBzdSBjdXJzbyB5IGVudsOtZSB1biBjb3JyZW8gZWxlY3Ryw7NuaWNvIGEgbG9zIGFsdW1ub3MgdW4gcGFyIGRlIGTDrWFzIGFudGVzIGRlIHF1ZSBjb21pZW5jZSBlbCB0YWxsZXIgcGFyYSByZWNvcmRhcmxlcyBxdWUgaGFnYW4gbGEgY29uZmlndXJhY2nDs24uIEFsZ3VuYXMgcGVyc29uYXMgc2VndWlyw6FuIGFwYXJlY2llbmRvIHNpbiBlbCBzb2Z0d2FyZSByZXF1ZXJpZG8gcG9ycXVlIHR1dmllcm9uIHByb2JsZW1hcywgbm8gcHVkaWVyb24gZW5jb250cmFyIGVsIHRpZW1wbyBwYXJhIGNvbXBsZXRhciB0b2RvcyBsb3MgcGFzb3MgbyBzaW1wbGVtZW50ZSBzb24gZWwgdGlwbyBkZSBwZXJzb25hIHF1ZSBudW5jYSBzaWd1ZSBsYXMgaW5zdHJ1Y2Npb25lcyBwb3IgYWRlbGFudGFkby4gUGFyYSBkZXRlY3RhciBlc3RvLCBoYWdhIHF1ZSB0b2RvcyBlamVjdXRlbiB1biBjb21hbmRvIHNpbXBsZSB0YW4gcHJvbnRvIGNvbW8gbGxlZ3VlbiB5IG11ZXN0cmUgYSBsb3MgbWFlc3Ryb3MgZWwgcmVzdWx0YWRvLCBsdWVnbyBidXNxdWUgYXl1ZGFudGVzIHkgb3Ryb3MgYXByZW5kaWNlcyBwYXJhIGF5dWRhciBhIGxhcyBwZXJzb25hcyBxdWUgaGFuIHRlbmlkbyBwcm9ibGVtYXMuCgo+KipNYXF1aW5hcyB2aXJ0dWFsZXMqKgo+Cj5BbGd1bmFzIHBlcnNvbmFzIHVzYW4gaGVycmFtaWVudGFzIGNvbW8gRG9ja2VyIHBhcmEgY29sb2NhciBtw6FxdWluYXMgdmlydHVhbGVzIGVuIGxhcyBjb21wdXRhZG9yYXMgZGUgbG9zIGFsdW1ub3MgcGFyYSBxdWUgdG9kb3MgdHJhYmFqZW4gZXhhY3RhbWVudGUgY29uIGxhcyBtaXNtYXMgaGVycmFtaWVudGFzLCBwZXJvIGVzdG8gcHJlc2VudGEgdW4gbnVldm8gY29uanVudG8gZGUgcHJvYmxlbWFzLiBMYXMgbcOhcXVpbmFzIG3DoXMgYW50aWd1YXMgbyBtw6FzIHBlcXVlw7FhcyBzaW1wbGVtZW50ZSBubyBzb24gbG8gc3VmaWNpZW50ZW1lbnRlIHLDoXBpZGFzIHBhcmEgZWplY3V0YXJsYXMsIGxvcyBhbHVtbm9zIGx1Y2hhbiBwb3IgYWx0ZXJuYXIgZW50cmUgZG9zIGNvbmp1bnRvcyBkaWZlcmVudGVzIGRlIG3DqXRvZG9zIGFicmV2aWFkb3MgZGUgdGVjbGFkbyBwYXJhIGNvc2FzIGNvbW8gY29waWFyIHkgcGVnYXIsIGUgaW5jbHVzbyBsb3MgcHJvZmVzaW9uYWxlcyBjb21wZXRlbnRlcyBzZSBjb25mdW5kaXLDoW4gYWNlcmNhIGRlIHF1w6kgZXN0w6Egc3VjZWRpZW5kbyBleGFjdGFtZW50ZSBkw7NuZGUuCgpMYSBjb25maWd1cmFjacOzbiBlcyB0YW4gY29tcGxpY2FkYSBxdWUgbXVjaG9zIG1hZXN0cm9zIHByZWZpZXJlbiBxdWUgbG9zIGFsdW1ub3MgdXNlbiBoZXJyYW1pZW50YXMgYmFzYWRhcyBlbiBlbCBuYXZlZ2Fkb3IuIFNpbiBlbWJhcmdvLCBlc3RvIGhhY2UgcXVlIGxhIGNsYXNlIGRlcGVuZGEgZGVsIFdpRmkgaW5zdGl0dWNpb25hbCAocXVlIHB1ZWRlIHNlciBkZSBjYWxpZGFkIG11eSB2YXJpYWJsZSkgeSBubyBzYXRpc2ZhY2UgZWwgZGVzZW8gZGUgbG9zIGFsdW1ub3MgZGUgaXJzZSBjb24gc3VzIHByb3BpYXMgbcOhcXVpbmFzIGxpc3RhcyBwYXJhIHN1IHVzbyBlbiBlbCBtdW5kbyByZWFsLiBTaW4gZW1iYXJnbywgYSBtZWRpZGEgcXVlIGxhcyBoZXJyYW1pZW50YXMgYmFzYWRhcyBlbiBsYSBudWJlIGNvbW8gR2xpdGNoIHkgUlN0dWRpbyBDbG91ZCBzZSB2dWVsdmVuIG3DoXMgcm9idXN0YXMsIGxhIMO6bHRpbWEgY29uc2lkZXJhY2nDs24gc2UgdnVlbHZlIG1lbm9zIGltcG9ydGFudGUuCgpVbmEgw7psdGltYSBmb3JtYSBkZSBhYm9yZGFyIGxvcyBwcm9ibGVtYXMgZGUgY29uZmlndXJhY2nDs24gZXMgZGl2aWRpciBsYSBjbGFzZSBkdXJhbnRlIHZhcmlvcyBkw61hcyB5IGhhY2VyIHF1ZSBsYSBnZW50ZSBpbnN0YWxlIGxvIHF1ZSBzZSByZXF1aWVyZSBwYXJhIGNhZGEgZMOtYSBhbnRlcyBkZSBhYmFuZG9uYXIgbGEgY2xhc2UgZWwgZMOtYSBhbnRlcmlvci4gRGl2aWRpciBlbCB0cmFiYWpvIGVuIHRyb3pvcyBoYWNlIHF1ZSBjYWRhIHVubyBzZWEgbWVub3MgaW50aW1pZGFudGUsIGVzIG3DoXMgcHJvYmFibGUgcXVlIGxvcyBhbHVtbm9zIGxvIGhhZ2FuLCB5IGdhcmFudGl6YSBxdWUgcHVlZGEgY29tZW56YXIgYSB0aWVtcG8gcGFyYSBjYWRhIGxlY2Npw7NuLCBleGNlcHRvIGxhIHByaW1lcmEuCgojIyBPdHJhcyBwcsOhY3RpY2FzIGRvY2VudGVzCk5pbmd1bmEgZGUgbGFzIHByw6FjdGljYXMgbcOhcyBwZXF1ZcOxYXMgcXVlIHNlIGRlc2NyaWJlbiBhIGNvbnRpbnVhY2nDs24gc29uIGVzZW5jaWFsZXMsIHBlcm8gdG9kYXMgbWVqb3JhcsOhbiBsYSBlbnRyZWdhIGRlIGxlY2Npb25lcy4gQWwgaWd1YWwgcXVlIGNvbiBlbCBhamVkcmV6IHkgZWwgbWF0cmltb25pbywgZWwgw6l4aXRvIGVuIGxhIGVuc2XDsWFuemEgZXMgYSBtZW51ZG8gdW5hIGN1ZXN0acOzbiBkZSBwcm9ncmVzbyBsZW50byB5IGNvbnN0YW50ZS4KCiMjIENvbWllbmNlIGNvbiBpbnRyb2R1Y2Npb25lcwpDb21pZW5jZSBzdSBjbGFzZSBwcmVzZW50w6FuZG9zZS4gU2kgZXJlcyB1biBleHBlcnRvLCBjdcOpbnRhbGVzIHVuIHBvY28gc29icmUgY8OzbW8gbGxlZ2FzdGUgYSBkb25kZSBlc3TDoXM7IFNpIHNvbG8gdGllbmVzIGRvcyBwYXNvcyBwb3IgZGVsYW50ZSwgZW5mYXRpemEgbG8gcXVlIHTDuiB5IGVsbG9zIHRpZW5lbiBlbiBjb23Dum4uIERpZ2FzIGxvIHF1ZSBkaWdhcywgdHVzIG9iamV0aXZvcyBzb24gaGFjZXJ0ZSBtw6FzIGFjY2VzaWJsZSB5IGFsZW50YXJsb3MgYSBjcmVlciBxdWUgcHVlZGVuIHRlbmVyIMOpeGl0by4KCkxvcyBhbHVtbm9zIHRhbWJpw6luIGRlYmVuIHByZXNlbnRhcnNlIGVudHJlIGVsbG9zLiBFbiB1bmEgY2xhc2UgZGUgdW5hIGRvY2VuYSwgcHVlZGVuIGhhY2VyIGVzdG8gdmVyYmFsbWVudGU7IGVuIHVuYSBjbGFzZSBtw6FzIGdyYW5kZSBvIHNpIHNvbiBleHRyYcOxb3MgZW50cmUgc8OtLCBjcmVvIHF1ZSBlcyBtZWpvciBxdWUgY2FkYSB1bm8gZXNjcmliYSB1bmEgbyBkb3MgbMOtbmVhcyBzb2JyZSBlbGxvcyBlbiBsYXMgbm90YXMgY29tcGFydGlkYXMgKFNlY2Npw7NuIDkuNykuCgojIyBDb25maWd1cmEgdHUgcHJvcGlvIGVudG9ybm8KQ29uZmlndXJhciBzdSBlbnRvcm5vIGVzIHRhbiBpbXBvcnRhbnRlIGNvbW8gY29uZmlndXJhciBhIHN1cyBhbHVtbm9zLCBwZXJvIGVzIG3DoXMgY29tcGxpY2Fkby4gQWRlbcOhcyBkZSB0ZW5lciBhY2Nlc28gYSBsYSByZWQgeSB0b2RvIGVsIHNvZnR3YXJlIHF1ZSB2YSBhIHV0aWxpemFyLCB0YW1iacOpbiBkZWJlIHRvbWFyIHVuIHZhc28gZGUgYWd1YSBvIHVuYSB0YXphIGRlIHTDqSBvIGNhZsOpLiBFc3RvIGF5dWRhIGEgbWFudGVuZXIgc3UgZ2FyZ2FudGEgbHVicmljYWRhLCBwZXJvIHN1IHZlcmRhZGVybyBwcm9ww7NzaXRvIGVzIGRhcmxlIHVuYSBleGN1c2EgcGFyYSBoYWNlciB1bmEgcGF1c2EgeSBwZW5zYXIgZHVyYW50ZSB1biBwYXIgZGUgc2VndW5kb3MgY3VhbmRvIGFsZ3VpZW4gaGFjZSB1bmEgcHJlZ3VudGEgZGlmw61jaWwgbyBjdWFuZG8gcGllcmRlIGxhIG5vY2nDs24gZGUgbG8gcXVlIGliYSBhIGRlY2lyIGEgY29udGludWFjacOzbi4gUHJvYmFibGVtZW50ZSB0YW1iacOpbiBkZXNlZSBhbGd1bm9zIGzDoXBpY2VzIGRlIHBpemFycmEgeSBhbGd1bmFzIGRlIGxhcyBvdHJhcyBjb3NhcyBkZXNjcml0YXMgZW4gbGEgU2VjY2nDs24gMjEuMy4KClVuYSBmb3JtYSBkZSBldml0YXIgcXVlIHN1IHRyYWJham8gZGlhcmlvIHNlIGludGVycG9uZ2EgZW4gc3UgZW5zZcOxYW56YSBlcyBjcmVhciB1bmEgY3VlbnRhIHNlcGFyYWRhIGVuIHN1IGNvbXB1dGFkb3JhIHBhcmEgZXN0ZSDDumx0aW1vLiBVc2UgbG9zIHZhbG9yZXMgcHJlZGV0ZXJtaW5hZG9zIGRlbCBzaXN0ZW1hIHBhcmEgdG9kbyBlbiBlc3RhIHNlZ3VuZGEgY3VlbnRhLCBqdW50byBjb24gdW5hIGZ1ZW50ZSBtw6FzIGdyYW5kZSB5IHVuIGZvbmRvIGRlIHBhbnRhbGxhIGVuIGJsYW5jbywgeSBhcGFndWUgbGFzIG5vdGlmaWNhY2lvbmVzIHBhcmEgcXVlIHN1IGVuc2XDsWFuemEgbm8gc2UgdmVhIGludGVycnVtcGlkYSBwb3IgdmVudGFuYXMgZW1lcmdlbnRlcy4KCiMjIEV2aXRlIGxhIHRhcmVhIGVuIGZvcm1hdG9zIGRlIHRvZG8gZWwgZMOtYQpMb3MgYWx1bW5vcyBxdWUgaGF5YW4gcGFzYWRvIHVuIGTDrWEgZW50ZXJvIHByb2dyYW1hbmRvIGVzdGFyw6FuIGNhbnNhZG9zLiBTaSBsZXMgZGFzIHRhcmVhIHBhcmEgaGFjZXIgZGVzcHXDqXMgZGVsIGhvcmFyaW8gbGFib3JhbCwgY29tZW56YXLDoW4gYWwgZMOtYSBzaWd1aWVudGUgdGFtYmnDqW4gY2Fuc2Fkb3MsIGFzw60gcXVlIG5vIGxvIGhhZ2FzLgoKIyMgTm8gdG9xdWUgZWwgdGVjbGFkbyBkZWwgYWx1bW5vCkEgbWVudWRvIGVzIHRlbnRhZG9yIGFycmVnbGFyIGxhcyBjb3NhcyBwYXJhIGxvcyBhbHVtbm9zLCBwZXJvIGluY2x1c28gc2kgbmFycmFzIGNhZGEgcGFzbywgZXMgcHJvYmFibGUgcXVlIGxvcyBkZXNtb3RpdmUgYWwgZW5mYXRpemFyIGxhIGJyZWNoYSBlbnRyZSBzdSBjb25vY2ltaWVudG8geSBlbCB0dXlvLiBFbiBjYW1iaW8sIG1hbnRlbmdhIGxhcyBtYW5vcyBhbGVqYWRhcyBkZWwgdGVjbGFkbyB5IGhhYmxlIGNvbiBzdXMgYWx1bW5vcyBzb2JyZSBsbyBxdWUgbmVjZXNpdGVuIGhhY2VyOiB0b21hcsOhIG3DoXMgdGllbXBvLCBwZXJvIGVzIG3DoXMgcHJvYmFibGUgcXVlIHNlIHF1ZWRlLgoKIyMgUmVwaXRhIGxhIHByZWd1bnRhCkNhZGEgdmV6IHF1ZSBhbGd1aWVuIGhhZ2EgdW5hIHByZWd1bnRhIGVuIGNsYXNlLCByZXDDrXRhbGEgYW50ZXMgZGUgcmVzcG9uZGVyIHBhcmEgdmVyaWZpY2FyIHF1ZSBsYSBoYXlhIGVudGVuZGlkbyB5IGRhcmxlcyBhIGxhcyBwZXJzb25hcyBxdWUgdGFsIHZleiBubyBsYSBoYXlhbiBlc2N1Y2hhZG8gbGEgb3BvcnR1bmlkYWQgZGUgaGFjZXJsby4gRXN0byBlcyBwYXJ0aWN1bGFybWVudGUgaW1wb3J0YW50ZSBjdWFuZG8gc2UgZ3JhYmFuIG8gdHJhbnNtaXRlbiBwcmVzZW50YWNpb25lcywgeWEgcXVlIHN1IG1pY3LDs2Zvbm8gZ2VuZXJhbG1lbnRlIG5vIGNhcHRhcsOhIGxvIHF1ZSBvdHJhcyBwZXJzb25hcyBlc3TDoW4gZGljaWVuZG8uIFJlcGV0aXIgbGFzIHByZWd1bnRhcyB0YW1iacOpbiBsZSBkYSBsYSBvcG9ydHVuaWRhZCBkZSByZWRpcmlnaXIgbGEgcHJlZ3VudGEgYSBhbGdvIHF1ZSBsZSByZXN1bHRlIG3DoXMgY8OzbW9kbyByZXNwb25kZXIgLi4uCgojIyBVbm8gYXJyaWJhLCB1bm8gYWJham8KVW4gY29tcGxlbWVudG8gZGUgbGFzIHRhcmpldGFzIGRlIG1pbnV0b3MgZXMgcGVkaXIgY29tZW50YXJpb3MgcmVzdW1pZG9zIGFsIGZpbmFsIGRlIGNhZGEgZMOtYS4gQWx0ZXJuYXRpdmFtZW50ZSwgbG9zIGFsdW1ub3MgZGFuIHVuIHB1bnRvIHBvc2l0aXZvIG8gdW5vIG5lZ2F0aXZvIHNvYnJlIGVsIGTDrWEgc2luIHJlcGV0aXIgbmFkYSBkZSBsbyBxdWUgeWEgc2UgaGEgZGljaG8uIExhIHByb2hpYmljacOzbiBkZSBsYXMgcmVwZXRpY2lvbmVzIG9ibGlnYSBhIGxhcyBwZXJzb25hcyBhIGRlY2lyIGNvc2FzIHF1ZSBkZSBvdHJhIG1hbmVyYSBubyBwb2Ryw61hbiBkZWNpcjogdW5hIHZleiBxdWUgc2UgaGF5YW4gZGFkbyB0b2RvcyBsb3MgY29tZW50YXJpb3MgInNlZ3Vyb3MiLCBsb3MgcGFydGljaXBhbnRlcyBjb21lbnphcsOhbiBhIGRlY2lyIGxvIHF1ZSByZWFsbWVudGUgcGllbnNhbi4KCj4qKkRpZmVyZW50ZXMgbW9kb3MsIGRpZmVyZW50ZXMgcmVzcHVlc3RhcyoqCj4KPkxhcyB0YXJqZXRhcyBkZSBtaW51dG9zIChTZWNjacOzbiA5LjgpIHNvbiBhbsOzbmltYXM7IGxhIHJldHJvYWxpbWVudGFjacOzbiBhbHRlcm5hIGhhY2lhIGFycmliYSB5IGhhY2lhIGFiYWpvIG5vIGxvIGVzLiBEZWJlcyB1c2FyIGxvcyBkb3MganVudG9zIHBvcnF1ZSBlbCBhbm9uaW1hdG8gcGVybWl0ZSBsYSBob25lc3RpZGFkIHkgZWwgdHJvbGxpbmcuCgoKIyMgSGFnYSBxdWUgbG9zIGFsdW1ub3MgaGFnYW4gcHJlZGljY2lvbmVzCkxhIGludmVzdGlnYWNpw7NuIGhhIGRlbW9zdHJhZG8gcXVlIGxhcyBwZXJzb25hcyBhcHJlbmRlbiBtw6FzIGRlIGxhcyBtYW5pZmVzdGFjaW9uZXMgc2kgc2UgbGVzIHBpZGUgcXVlIHByZWRpZ2FuIGxvIHF1ZSB2YSBhIHN1Y2VkZXIgW01pbGwyMDEzXS4gSGFjZXIgZXN0byBlbmNhamEgbmF0dXJhbG1lbnRlIGVuIGxhIGNvZGlmaWNhY2nDs24gZW4gdml2bzogZGVzcHXDqXMgZGUgYWdyZWdhciBvIGNhbWJpYXIgYWxndW5hcyBsw61uZWFzIGRlIHVuIHByb2dyYW1hLCBwcmVndW50ZSBhIGxhIGNsYXNlIHF1w6kgc3VjZWRlcsOhIGN1YW5kbyBzZSBlamVjdXRlLiBTaSBlbCBlamVtcGxvIGVzIGluY2x1c28gbW9kZXJhZGFtZW50ZSBjb21wbGVqbywgbGEgcHJlZGljY2nDs24gcHVlZGUgc2VydmlyIGNvbW8gdW5hIHByZWd1bnRhIG1vdGl2YWRvcmEgcGFyYSB1bmEgcm9uZGEgZGUgaW5zdHJ1Y2Npw7NuIGVudHJlIHBhcmVzLgoKIyMgQ29uZmlndXJhbmRvIFRhYmxhcwpFcyBwb3NpYmxlIHF1ZSBubyB0ZW5nYSBuaW5nw7puIGNvbnRyb2wgc29icmUgZWwgZGlzZcOxbyBkZSBsb3MgZXNjcml0b3Jpb3MgbyBtZXNhcyBlbiBsYSBzYWxhIGVuIGxhIHF1ZSBlbnNlw7FhLCBwZXJvIHNpIGxvIGhhY2UsIGRlc2N1YnJpbW9zIHF1ZSBlcyBtZWpvciB0ZW5lciBhc2llbnRvcyBwbGFub3MgKGVzdGlsbyBjZW5hKSBlbiBsdWdhciBkZSBhc2llbnRvcyBpbmNsaW5hZG9zIChlc3RpbG8gdGVhdHJvKS4gcXVlIHB1ZWRlIGxsZWdhciBhIGxvcyBhbHVtbm9zIHF1ZSBuZWNlc2l0YW4gYXl1ZGEgbcOhcyBmw6FjaWxtZW50ZSB5IHBhcmEgcXVlIHNlYSBtw6FzIGbDoWNpbCBwYXJhIGxvcyBhbHVtbm9zIGVtcGFyZWphcnNlIGVudHJlIHPDrSAoU2VjY2nDs24gOS41KS4gTGFzIHRvbWFzIGRlIGNvcnJpZW50ZSBlbiBlbCBwaXNvIHBhcmEgcXVlIG5vIHRlbmdhIHF1ZSBwYXNhciBjYWJsZXMgZGUgYWxpbWVudGFjacOzbiBwb3IgZWwgcGlzbyBoYWNlbiBsYSB2aWRhIG3DoXMgZsOhY2lsIHkgc2VndXJhLCBwZXJvIGHDum4gc29uIHBvY28gY29tdW5lcy4KCkluZGVwZW5kaWVudGVtZW50ZSBkZWwgZGlzZcOxbyBxdWUgdGVuZ2EsIGludGVudGUgYXNlZ3VyYXJzZSBkZSBxdWUgY2FkYSBhc2llbnRvIHRlbmdhIHVuYSB2aXN0YSBzaW4gb2JzdMOhY3Vsb3MgZGUgbGEgcGFudGFsbGEuIFVuIGJ1ZW4gcmVzcGFsZG8gdGFtYmnDqW4gZXMgaW1wb3J0YW50ZSwgeWEgcXVlIGxhcyBwZXJzb25hcyBlc3RhcsOhbiBlbiBlbGxvcyBkdXJhbnRlIHVuIHBlcsOtb2RvIHByb2xvbmdhZG8uIEFsIGlndWFsIHF1ZSBsYXMgdG9tYXMgZGUgY29ycmllbnRlIGVuIGVsIHBpc28sIGRlc2Fmb3J0dW5hZGFtZW50ZSwgbG9zIGJ1ZW5vcyBhc2llbnRvcyBlbiBlbCBhdWxhIHRvZGF2w61hIHNvbiBwb2NvIGNvbXVuZXMuCgojIyBQYXN0aWxsYXMgcGFyYSBsYSB0b3MKU2kgaGFibGEgdG9kbyBlbCBkw61hIGNvbiB1bmEgaGFiaXRhY2nDs24gbGxlbmEgZGUgcGVyc29uYXMsIHNlIGxlIHBvbmUgbGEgZ2FyZ2FudGEgaXJyaXRhZGEgcG9ycXVlIGlycml0YSBsYXMgY8OpbHVsYXMgZXBpdGVsaWFsZXMgZGUgbGEgbGFyaW5nZSB5IGxhIGZhcmluZ2UuIEVzdG8gbm8gc29sbyB0ZSB2dWVsdmUgcm9uY28sIHNpbm8gcXVlIHRhbWJpw6luIHRlIGhhY2UgbcOhcyB2dWxuZXJhYmxlIGEgbGEgaW5mZWNjacOzbiAocXVlIGVzIHBhcnRlIGRlIGxhIHJhesOzbiBwb3IgbGEgcXVlIGxhcyBwZXJzb25hcyBhIG1lbnVkbyBzdWZyZW4gcmVzZnJpYWRvcyBkZXNwdcOpcyBkZSBlbnNlw7FhcikuCgpMYSBtZWpvciBtYW5lcmEgZGUgcHJvdGVnZXJzZSBjb250cmEgZXN0byBlcyBtYW50ZW5lciBzdSBnYXJnYW50YSBhbGluZWFkYSwgeSBsYSBtZWpvciBtYW5lcmEgZGUgaGFjZXJsbyBlcyB1c2FyIHBhc3RpbGxhcyBwYXJhIGxhIHRvcyB0ZW1wcmFubyB5IGNvbiBmcmVjdWVuY2lhLiBMb3MgYnVlbm9zIHRhbWJpw6luIGVubWFzY2FyYXLDoW4gZWwgaW5pY2lvIGRlbCBhbGllbnRvIGRlIGNhZsOpLCBwb3IgbG8gcXVlIHN1cyBhbHVtbm9zIHByb2JhYmxlbWVudGUgZXN0YXLDoW4gYWdyYWRlY2lkb3MuCgojIyBQaWVuc2EtUGFyLUNvbXBhcnRlClRoaW5rLXBhaXItc2hhcmUgZXMgdW5hIHTDqWNuaWNhIGxpdmlhbmEgcXVlIGF5dWRhIGEgbGFzIHBlcnNvbmFzIGEgbWVqb3JhciBpZGVhcyBhIHRyYXbDqXMgZGUgbGEgZGlzY3VzacOzbiBjb24gc3VzIGNvbXBhw7Flcm9zLiBDYWRhIHBlcnNvbmEgY29taWVuemEgcGVuc2FuZG8gaW5kaXZpZHVhbG1lbnRlIHNvYnJlIHVuYSBwcmVndW50YSBvIHByb2JsZW1hIHkgYW5vdGFuZG8gYWxndW5hcyBub3Rhcy4gTHVlZ28gZXhwbGljYW4gc3VzIGlkZWFzIGVudHJlIHPDrSBlbiBwYXJlamFzLCBmdXNpb27DoW5kb2xhcyBvIHNlbGVjY2lvbmFuZG8gbGFzIG3DoXMgcHJvbWV0ZWRvcmFzLiBGaW5hbG1lbnRlLCBhbGd1bmFzIHBhcmVqYXMgcHJlc2VudGFuIHN1cyBpZGVhcyBhIHRvZG8gZWwgZ3J1cG8uCgpUaGluay1wYWlyLXNoYXJlIGZ1bmNpb25hIHBvcnF1ZSBvYmxpZ2EgYSBsYXMgcGVyc29uYXMgYSBleHRlcm5hbGl6YXIgc3UgY29nbmljacOzbiAoU2VjY2nDs24gMy4xKS4gVGFtYmnDqW4gbGVzIGRhIGxhIG9wb3J0dW5pZGFkIGRlIGRldGVjdGFyIHkgcmVzb2x2ZXIgbGFndW5hcyBvIGNvbnRyYWRpY2Npb25lcyBlbiBzdXMgaWRlYXMgYW50ZXMgZGUgZXhwb25lcmxvcyBhIHVuIGdydXBvIG3DoXMgZ3JhbmRlLCBsbyBxdWUgcHVlZGUgaGFjZXIgcXVlIGxvcyBlc3R1ZGlhbnRlcyBtZW5vcyBleHRyb3ZlcnRpZG9zIGVzdMOpbiB1biBwb2NvIG1lbm9zIG5lcnZpb3NvcyBwb3IgcGFyZWNlciB0b250b3MuCgojIyBNYcOxYW5hLCBtZWRpb2TDrWEgeSBub2NoZQpbU21hcjIwMThdIGRlc2N1YnJpw7MgcXVlIGEgbG9zIGFsdW1ub3MgbGVzIHZhIG1lbm9zIGJpZW4gc2kgc3VzIGNsYXNlcyB5IG90cm9zIHRyYWJham9zIHNlIHByb2dyYW1hbiBlbiBob3JhcmlvcyBxdWUgbm8gc2UgYWxpbmVhbiBjb24gc3VzIHJlbG9qZXMgY29ycG9yYWxlcyBuYXR1cmFsZXMsIGVzIGRlY2lyLCBxdWUgc2kgdW5hIHBlcnNvbmEgZGUgbGEgbWHDsWFuYSB0b21hIGNsYXNlcyBub2N0dXJuYXMgbyB2aWNldmVyc2EsIHN1cyBjYWxpZmljYWNpb25lcyBzZSB2ZW4gYWZlY3RhZGFzLiBQb3IgbG8gZ2VuZXJhbCwgbm8gZXMgcG9zaWJsZSBhY29tb2RhciBlc3RvIGVuIGdydXBvcyBwZXF1ZcOxb3MsIHBlcm8gbG9zIG3DoXMgZ3JhbmRlcyBkZWJlcsOtYW4gdHJhdGFyIGRlIGVzY2Fsb25hciBsYXMgaG9yYXMgZGUgaW5pY2lvIGRlIGxhcyBzZXNpb25lcyBwYXJhbGVsYXMuIEVzdG8gdGFtYmnDqW4gcHVlZGUgYXl1ZGFyIGEgbGFzIHBlcnNvbmFzIGEgaGFjZXIgbWFsYWJhcmlzbW9zIGNvbiBsYXMgcmVzcG9uc2FiaWxpZGFkZXMgZGUgY3VpZGFkbyBpbmZhbnRpbCB5IG90cmFzIGxpbWl0YWNpb25lcywgeSByZWR1Y2lyIGxhIGR1cmFjacOzbiBkZSBsYXMgYWxpbmVhY2lvbmVzIGVuIGxvcyBkZXNjYW5zb3MgcGFyYSB0b21hciBjYWbDqSB5IHBhcmEgbG9zIGJhw7Fvcy4KCiMjIEh1bW9yCkVsIGh1bW9yIGRlYmUgdXNhcnNlIGNvbiBtb2RlcmFjacOzbiBjdWFuZG8gc2UgZW5zZcOxYTogbGEgbWF5b3LDrWEgZGUgbG9zIGNoaXN0ZXMgc29uIG1lbm9zIGRpdmVydGlkb3MgY3VhbmRvIHNlIGVzY3JpYmVuIHkgc2UgdnVlbHZlbiBhw7puIG1lbm9zIGRpdmVydGlkb3MgY29uIGNhZGEgcmVsZWN0dXJhLiBTZXIgZXNwb250w6FuZWFtZW50ZSBkaXZlcnRpZG8gbWllbnRyYXMgZW5zZcOxYSBzdWVsZSBmdW5jaW9uYXIgbWVqb3IsIHBlcm8gcHVlZGUgc2FsaXIgbWFsIGbDoWNpbG1lbnRlOiBsbyBxdWUgZXMgdW5hIGJyb21hIHBhcmEgdHUgY8OtcmN1bG8gZGUgYW1pZ29zIHB1ZWRlIHNlciB1biBwcm9ibGVtYSBwb2zDrXRpY28gc2VyaW8gcGFyYSB0dSBhdWRpZW5jaWEuIFNpIGhhY2VzIGJyb21hcyBjdWFuZG8gZW5zZcOxYXMsIG5vIGxhcyBoYWdhcyBhIGV4cGVuc2FzIGRlIG5pbmfDum4gZ3J1cG8gbyBkZSBuaW5ndW5hIHBlcnNvbmEsIGV4Y2VwdG8gcG9zaWJsZW1lbnRlIHTDuiBtaXNtby4KCiMjIExpbWl0ZSBsYSBpbm5vdmFjacOzbgpDYWRhIHVuYSBkZSBsYXMgdMOpY25pY2FzIHByZXNlbnRhZGFzIGVuIGVzdGUgY2Fww610dWxvIG1lam9yYXLDoSBzdXMgY2xhc2VzLCBwZXJvIG5vIGRlYmUgdHJhdGFyIGRlIGFkb3B0YXJsYXMgdG9kYXMgYSBsYSB2ZXouIExhIHJhesOzbiBlcyBxdWUgY2FkYSBudWV2YSBwcsOhY3RpY2EgYXVtZW50YSBzdSBjYXJnYSBjb2duaXRpdmEgeSBsYSBkZSBzdXMgYWx1bW5vcywgeWEgcXVlIGFob3JhIHRvZG9zIGVzdMOhbiB0cmF0YW5kbyBkZSBhcHJlbmRlciB1bmEgbnVldmEgZm9ybWEgZGUgYXByZW5kZXIsIGFzw60gY29tbyBlbCB0ZW1hIGRlIGxhIGxlY2Npw7NuLiBTaSBlc3TDoSB0cmFiYWphbmRvIGNvbiB1biBncnVwbyByZXBldGlkYW1lbnRlLCBwdWVkZSBpbnRyb2R1Y2lyIHVuYSBudWV2YSB0w6ljbmljYSBjYWRhIHBvY2FzIGxlY2Npb25lczsgU2kgc29sbyBsb3MgdGllbmUgcGFyYSB1biB0YWxsZXIgZGUgdW4gZMOtYSwgZXMgbWVqb3IgZWxlZ2lyIHVuIG3DqXRvZG8gcXVlIG5vIGhheWFuIHZpc3RvIGFudGVzIHkgcXVlIHNlIHNpZW50YW4gY8OzbW9kb3MgY29uIGVzby4KCgojIyBFamVyY2ljaW9zCgojIyMgQ3JlYXIgdW4gY3Vlc3Rpb25hcmlvIChpbmRpdmlkdWFsIC8gMjApClVzYW5kbyBlbCBjdWVzdGlvbmFyaW8gZW4gbGEgU2VjY2nDs24gMjEuNSBjb21vIHBsYW50aWxsYSwgY3JlZSB1biBjdWVzdGlvbmFyaW8gY29ydG8gcXVlIHB1ZWRhIGRhciBhIGxvcyBhbHVtbm9zIGFudGVzIGRlIGVuc2XDsWFyIHVuYSBjbGFzZSBwcm9waWEuIMK/UXXDqSBlcyBsbyBxdWUgbcOhcyBkZXNlYSBzYWJlciBzb2JyZSBzdXMgYW50ZWNlZGVudGVzIHkgY8OzbW8gcHVlZGVuIGFtYmFzIHBhcnRlcyBlc3RhciBzZWd1cmFzIGRlIHF1ZSBlc3TDoW4gZGUgYWN1ZXJkbyBzb2JyZSBlbCBuaXZlbCBkZSBjb21wcmVuc2nDs24gcXVlIGVzdMOhIHByZWd1bnRhbmRvPwoKIyMjIFVubyBkZSBsb3MgdHV5b3MgKGNsYXNlIGNvbXBsZXRhIC8gMTUpClBpZW5zZSBlbiB1bmEgcHLDoWN0aWNhIGRlIGVuc2XDsWFuemEgcXVlIG5vIHNlIGhhIGRlc2NyaXRvIGhhc3RhIGFob3JhLiBQcmVzZW50ZSBzdSBpZGVhIGEgdW4gY29tcGHDsWVybywgZXNjdWNoZSBsYSBzdXlhIHkgc2VsZWNjaW9uZSB1bmEgcGFyYSBwcmVzZW50YXJsYSBhbCBncnVwbyBjb21vIHVuIHRvZG8uIChFc3RlIGVqZXJjaWNpbyBlcyB1biBlamVtcGxvIGRlIHRoaW5rLXBhaXItc2hhcmUpLgoKIyMjIMK/UHVlZG8gY29uZHVjaXI/IChwYXJlcyAvIDEwKQpJbnRlcmNhbWJpZSBjb21wdXRhZG9yYXMgY29uIHVuIGNvbXBhw7Flcm8gKHByZWZlcmlibGVtZW50ZSB1bm8gcXVlIHVzZSB1biBzaXN0ZW1hIG9wZXJhdGl2byBkaWZlcmVudGUgYWwgc3V5bykgeSByZWFsaWNlIHVuIGVqZXJjaWNpbyBkZSBwcm9ncmFtYWNpw7NuIHNpbXBsZS4gwr9RdcOpIHRhbiBmcnVzdHJhbnRlIGVzPyDCv0N1w6FudGEgaW5mb3JtYWNpw7NuIHRlIGRhIHNvYnJlIGxvIHF1ZSBsb3Mgbm92YXRvcyB0aWVuZW4gcXVlIHBhc2FyIHRvZG8gZWwgdGllbXBvPwoKIyMjIEVtcGFyZWphbWllbnRvIChwYXJlcyAvIDE1KQpNaXJlIGVzdGUgdmlkZW8gZGUgcHJvZ3JhbWFjacOzbiBlbiBwYXJlamEgeSBsdWVnbyBwcmFjdGlxdWUgaGFjZXJsbyBjb24gdW4gY29tcGHDsWVyby4gUmVjdWVyZGUgY2FtYmlhciBsb3Mgcm9sZXMgZW50cmUgY29udHJvbGFkb3IgeSBuYXZlZ2Fkb3IgY2FkYSBwb2NvcyBtaW51dG9zLiDCv0N1w6FudG8gdGllbXBvIHRlIGxsZXZhIGNhZXIgZW4gdW4gcml0bW8gZGUgdHJhYmFqbz8KCiMjIyBDb21wYXJhciBub3RhcyAoZ3J1cG9zIHBlcXVlw7FvcyAvIDE1KQpGb3JtZSBncnVwb3MgZGUgMyBhIDQgcGVyc29uYXMgeSBjb21wYXJlIGxhcyBub3RhcyBxdWUgaGEgdG9tYWRvIGVuIGVzdGUgY2Fww610dWxvLiDCv1F1w6kgcGVuc2FzdGUgcXVlIGVyYSBkaWdubyBkZSBtZW5jacOzbiBxdWUgdHVzIGNvbXBhw7Flcm9zIGV4dHJhw7Fhcm9uIHkgdmljZXZlcnNhPyDCv1F1w6kgZW50ZW5kaXN0ZSBkZSBtYW5lcmEgZGlmZXJlbnRlPwoKIyMjIENyZWRpYmlsaWRhZCAoaW5kaXZpZHVhbCAvIDE1KQpbRmluazIwMTNdIGRlc2NyaWJlIHRyZXMgY29zYXMgcXVlIGhhY2VuIHF1ZSBsb3MgbWFlc3Ryb3Mgc2VhbiBjcmXDrWJsZXMgYW50ZSBsb3Mgb2pvcyBkZSBzdXMgYWx1bW5vczoKCioqQ29tcGV0ZW5jaWE6KiogY29ub2NpbWllbnRvIGRlbCB0ZW1hIGNvbW8gbG8gZGVtdWVzdHJhIGxhIGNhcGFjaWRhZCBkZSBleHBsaWNhciBpZGVhcyBjb21wbGVqYXMgbyBoYWNlciByZWZlcmVuY2lhIGFsIHRyYWJham8gZGUgb3Ryb3MuCgoqKkludGVncmlkYWQ6KiogdGVuaWVuZG8gZW4gY3VlbnRhIGxvcyBtZWpvcmVzIGludGVyZXNlcyBkZSBsb3MgYWx1bW5vcy4gRXN0byBzZSBwdWVkZSBtb3N0cmFyIGRhbmRvIHJldHJvYWxpbWVudGFjacOzbiBpbmRpdmlkdWFsaXphZGEsIG9mcmVjaWVuZG8gdW5hIGV4cGxpY2FjacOzbiByYWNpb25hbCBwYXJhIGxhcyBkZWNpc2lvbmVzIGRlIGNhbGlmaWNhY2nDs24geSB0cmF0YW5kbyBhIHRvZG9zIGxvcyBhbHVtbm9zIGRlIGxhIG1pc21hIG1hbmVyYS4KCioqRGluYW1pc21vOioqIGVudHVzaWFzbW8gcG9yIGVsIHRlbWEgKENhcMOtdHVsbyA4KS4KCkRlc2NyaWJhIHVuYSBjb3NhIHF1ZSBoYWNlIGN1YW5kbyBlbnNlw7FhIHF1ZSBzZSBhanVzdGEgYSBjYWRhIGNhdGVnb3LDrWEsIHkgbHVlZ28gZGVzY3JpYmEgdW5hIGNvc2EgcXVlIG5vIGhhY2UgcGVybyBxdWUgZGViZXLDrWEgaGFjZXIuCgojIyBNZWRpY2nDs24gZGUgZWZlY3RpdmlkYWQgKGluZGl2aWR1YWwgLyAxNSkKW0tpcmsxOTk0XSBkZWZpbmUgY3VhdHJvIG5pdmVsZXMgcGFyYSBldmFsdWFyIGVsIGVudHJlbmFtaWVudG86CgoqKlJlYWNjacOzbjoqKiDCv0PDs21vIHNlIHNpbnRpZXJvbiBsb3MgYWx1bW5vcyBzb2JyZSBsYSBjYXBhY2l0YWNpw7NuPwoKKipBcHJlbmRpemFqZToqKsK/Y3XDoW50byBhcHJlbmRpZXJvbiByZWFsbWVudGU/CgoqKkNvbXBvcnRhbWllbnRvOioqIMK/Q3XDoW50byBoYW4gY2FtYmlhZG8gc3UgY29tcG9ydGFtaWVudG8gY29tbyByZXN1bHRhZG8/CgoqKlJlc3VsdGFkb3M6Kiogwr9Dw7NtbyBoYW4gYWZlY3RhZG8gZXNvcyBjYW1iaW9zIGVuIGVsIGNvbXBvcnRhbWllbnRvIGEgc3UgcHJvZHVjY2nDs24gbyBsYSBwcm9kdWNjacOzbiBkZSBzdSBncnVwbz8KCsK/UXXDqSBoYWNlcyBlbiBjYWRhIG5pdmVsIHBhcmEgZXZhbHVhciBxdcOpIHkgY8OzbW8gZW5zZcOxYXM/IMK/UXXDqSBwb2Ryw61hcyBoYWNlciBxdWUgbm8gZXN0w6FzIGhhY2llbmRvPwoKIyMjIE9iamVjaW9uZXMgeSBjb250cmEgb2JqZWNpb25lcyAodGhpbmstcGFpci1zaGFyZSAvIDE1KQpIYSBkZWNpZGlkbyBubyBwcmVndW50YXIgYSBzdXMgYWx1bW5vcyBzaSBzdSBjbGFzZSBmdWUgw7p0aWwgcG9ycXVlIHNhYmUgcXVlIG5vIGhheSBjb3JyZWxhY2nDs24gZW50cmUgc3VzIHJlc3B1ZXN0YXMgeSBjdcOhbnRvIHJlYWxtZW50ZSBhcHJlbmRlbiAoU2VjY2nDs24gNy4xKS4gRW4gY2FtYmlvLCBoYSBwcmVzZW50YWRvIGN1YXRybyBwcm9wdWVzdGFzLCBjYWRhIHVuYSBkZSBsYXMgY3VhbGVzIHN1cyBjb2xlZ2FzIGhhbiByZWNoYXphZG86CgoqKlZlYSBzaSByZWNvbWllbmRhbiBsYSBjbGFzZSBhIHN1cyBhbWlnb3MuKiogwr9Qb3IgcXXDqSBzZXLDrWEgZXN0byBtw6FzIHNpZ25pZmljYXRpdm8gcXVlIHByZWd1bnRhcmxlcyBjw7NtbyBzZSBzaWVudGVuIGFjZXJjYSBkZSBsYSBjbGFzZT8KCioqRGVsZXMgdW4gZXhhbWVuIGFsIGZpbmFsLioqIFBlcm8gY3XDoW50byBzYWJlbiBsb3MgYWx1bW5vcyBhbCBmaW5hbCBkZWwgZMOtYSBlcyB1biBtYWwgcHJlZGljdG9yIGRlIGN1w6FudG8gcmVjb3JkYXLDoW4gZG9zIG8gdHJlcyBtZXNlcyBkZXNwdcOpcywgeSBjdWFscXVpZXIgdGlwbyBkZSBleGFtZW4gZmluYWwgaGFyw6EgcXVlIGxhIGNsYXNlIHNlYSBtdWNobyBtw6FzIGVzdHJlc2FudGUuCgoqKkTDqWxlcyB1biBleGFtZW4gZG9zIG8gdHJlcyBtZXNlcyBkZXNwdcOpcy4qKiBFc28gZXMgcHLDoWN0aWNhbWVudGUgaW1wb3NpYmxlIGNvbiBsb3MgZXN0dWRpYW50ZXMgZGUgY2FtcG8gbGlicmUsIHkgbGFzIHBlcnNvbmFzIHF1ZSBubyBvYnR1dmllcm9uIG5hZGEgZGVsIHRhbGxlciBwcm9iYWJsZW1lbnRlIHNlYW4gbWVub3MgcHJvcGVuc2FzIGEgcGFydGljaXBhciBlbiBlbCBzZWd1aW1pZW50bywgcG9yIGxvIHF1ZSBsb3MgY29tZW50YXJpb3MgcmVjb3BpbGFkb3MgZGUgZXN0YSBtYW5lcmEgc2Vyw6FuIHNlc2dhZG9zLgoKKipWZWEgc2kgc2lndWVuIHVzYW5kbyBsbyBxdWUgYXByZW5kaWVyb24uKiogTGEgaW5zdGFsYWNpw7NuIGRlIHNvZnR3YXJlIGVzcMOtYSBlbiBsYXMgY29tcHV0YWRvcmFzIGRlIGxvcyBhbHVtbm9zIGVzdMOhIG1hbCB2aXN0YSwgZW50b25jZXMsIMK/Y8OzbW8gc2UgaW1wbGVtZW50YXLDoT8KClRyYWJhamFuZG8gcG9yIHN1IGN1ZW50YSwgZW5jdWVudHJlIHJlc3B1ZXN0YXMgYSBlc3RhcyBvYmplY2lvbmVzLCBsdWVnbyBjb21wYXJ0YSBzdXMgcmVzcHVlc3RhcyBjb24gdW4gY29tcGHDsWVybyB5IGRpc2N1dGEgbG9zIGVuZm9xdWVzIHF1ZSBoYSBwbGFudGVhZG8uIEN1YW5kbyBoYXlhIHRlcm1pbmFkbywgY29tcGFydGEgc3UgZW5mb3F1ZSBmYXZvcml0byBjb24gbGEgY2xhc2UuCgoKLS0tLS0tCgoKIyBNb3RpdmFjacOzbiB5IERlc21vdGl2YWNpw7NuCgpMb3MgYWx1bW5vcyBuZWNlc2l0YW4gZXN0w61tdWxvIHBhcmEgc2FsaXIgYSB0ZXJyZW5vcyBkZXNjb25vY2lkb3MsIHBvciBsbyBxdWUgZXN0ZSBjYXDDrXR1bG8gYW5hbGl6YSBsYXMgZm9ybWFzIGVuIHF1ZSBsb3MgbWFlc3Ryb3MgcHVlZGVuIG1vdGl2YXJsb3MuIE3DoXMgaW1wb3J0YW50ZSBhw7puLCBoYWJsYSBzb2JyZSBjw7NtbyBsb3MgbWFlc3Ryb3MgcHVlZGVuIGRlc21vdGl2YXJsb3MgeSBjw7NtbyBldml0YXIgaGFjZXJsby4KCk51ZXN0cm8gcHVudG8gZGUgcGFydGlkYSBlcyBsYSBkaWZlcmVuY2lhIGVudHJlIGxhIG1vdGl2YWNpw7NuIGV4dHLDrW5zZWNhLCBxdWUgc2VudGltb3MgY3VhbmRvIGhhY2Vtb3MgYWxnbyBwYXJhIGV2aXRhciBlbCBjYXN0aWdvIG8gZ2FuYXIgdW5hIHJlY29tcGVuc2EsIHkgbGEgbW90aXZhY2nDs24gaW50csOtbnNlY2EsIHF1ZSBlcyBsbyBxdWUgc2VudGltb3MgY3VhbmRvIGVuY29udHJhbW9zIGFsZ28gcGVyc29uYWxtZW50ZSBzYXRpc2ZhY3RvcmlvLiBBbWJhcyBhZmVjdGFuIGxhIG1heW9yw61hIGRlIGxhcyBzaXR1YWNpb25lcyAocG9yIGVqZW1wbG8sIGxhcyBwZXJzb25hcyBlbnNlw7FhbiBwb3JxdWUgbG8gZGlzZnJ1dGFuIHkgcG9ycXVlIGxlcyBwYWdhbiksIHBlcm8gYXByZW5kZW1vcyBtZWpvciBjdWFuZG8gZXN0YW1vcyBpbnRyw61uc2VjYW1lbnRlIG1vdGl2YWRvcyBbV2xvZDIwMTddLiBTZWfDum4gbGEgdGVvcsOtYSBkZSBsYSBhdXRvZGV0ZXJtaW5hY2nDs24sIGxvcyB0cmVzIGltcHVsc29yZXMgZGUgbGEgbW90aXZhY2nDs24gaW50csOtbnNlY2Egc29uOgoKKipDb21wZXRlbmNpYToqKiBsYSBzZW5zYWNpw7NuIGRlIHF1ZSBzYWJlcyBsbyBxdWUgZXN0w6FzIGhhY2llbmRvLgoKKipBdXRvbm9tw61hOioqIGxhIHNlbnNhY2nDs24gZGUgZXN0YXIgZW4gY29udHJvbCBkZSB0dSBwcm9waW8gZGVzdGluby4KCioqUGFyZW50ZXNjbzoqKiBFbCBzZW50aW1pZW50byBkZSBlc3RhciBjb25lY3RhZG8gY29uIGxvcyBkZW3DoXMuCgpVbmEgbGVjY2nDs24gYmllbiBkaXNlw7FhZGEgYWxpZW50YSBhIGxvcyB0cmVzLiBQb3IgZWplbXBsbywgdW4gZWplcmNpY2lvIGRlIHByb2dyYW1hY2nDs24gcHVlZGUgcGVybWl0aXIgYSBsb3MgYWx1bW5vcyBwcmFjdGljYXIgbGFzIGhlcnJhbWllbnRhcyBxdWUgbmVjZXNpdGFuIHBhcmEgcmVzb2x2ZXIgdW4gcHJvYmxlbWEgbWF5b3IgKGNvbXBldGVuY2lhKSwgcGVybWl0aXJsZXMgYWJvcmRhciBsYXMgcGFydGVzIGRlIGVzZSBwcm9ibGVtYSBlbiBlbCBvcmRlbiBxdWUgZGVzZWVuIChhdXRvbm9tw61hKSB5IHBlcm1pdGlybGVzIGhhYmxhciBjb24gc3VzIGNvbXBhw7Flcm9zLiAocmVsYWNpw7NuKS4KCj4qKkVsIHByb2JsZW1hIGRlIGxvcyBncmFkb3MqKgo+Cj5OdW5jYSBoZSB0ZW5pZG8gdW5hIGF1ZGllbmNpYSBlbiBtaSB2aWRhLiBNaSBhdWRpZW5jaWEgZXMgdW5hIHLDumJyaWNhLgo+IC0tIGNpdGFkbyBwb3IgTWF0dCBUaWVybmV5Cj4KTG9zIGdyYWRvcyB5IGxhIGZvcm1hIGVuIHF1ZSBkaXN0b3JzaW9uYW4gZWwgYXByZW5kaXphamUgYSBtZW51ZG8gc2UgdXNhbiBjb21vIHVuIGVqZW1wbG8gZGUgbW90aXZhY2nDs24gZXh0csOtbnNlY2EsIHBlcm8gY29tbyBvYnNlcnZhIFtNaWxsMjAxNmFdLCBubyB2YW4gYSBkZXNhcGFyZWNlciBlbiBlbCBjb3J0byBwbGF6bywgcG9yIGxvIHF1ZSBubyB0aWVuZSBzZW50aWRvIHRyYXRhciBkZSBjb25zdHJ1aXIgdW4gc2lzdGVtYSBxdWUgbG9zIGlnbm9yZS4gRW4gY2FtYmlvLCBbTGFuZzIwMTNdIGV4cGxvcmEgY8OzbW8gbG9zIGN1cnNvcyBxdWUgZW5mYXRpemFuIGxhcyBjYWxpZmljYWNpb25lcyBwdWVkZW4gaW5jZW50aXZhciBhIGxvcyBlc3R1ZGlhbnRlcyBhIGhhY2VyIHRyYW1wYSB5IG9mcmVjZSBhbGd1bm9zIGNvbnNlam9zIHNvYnJlIGPDs21vIGRpc21pbnVpciBlc3RlIGVmZWN0bywgbWllbnRyYXMgcXVlIFtDb3ZpMjAxN10gYW5hbGl6YSBlbCBwcm9ibGVtYSBtw6FzIGFtcGxpbyBkZSBlcXVpbGlicmFyIGxhIG1vdGl2YWNpw7NuIGludHLDrW5zZWNhIHkgZXh0csOtbnNlY2EgZW4gbGEgZWR1Y2FjacOzbiBpbnN0aXR1Y2lvbmFsLCB5IGxhIGFsaW5lYWNpw7NuIGNvbnN0cnVjdGl2YSBFbCBlbmZvcXVlIHByb3B1ZXN0byBlbiBbQmlnZzIwMTFdIGJ1c2NhIGFsaW5lYXIgbGFzIGFjdGl2aWRhZGVzIGRlIGFwcmVuZGl6YWplIHkgbG9zIHJlc3VsdGFkb3MgZGUgYXByZW5kaXphamUgZW50cmUgc8OtLgoKW0FtYnIyMDEwXSBjb250aWVuZSB1bmEgbGlzdGEgZGUgbcOpdG9kb3MgYmFzYWRvcyBlbiBldmlkZW5jaWEgcGFyYSBtb3RpdmFyIGEgbG9zIGFsdW1ub3MuIE5pbmd1bm8gZGUgZWxsb3MgZXMgc29ycHJlbmRlbnRlLCBlcyBkaWbDrWNpbCBpbWFnaW5hciBxdWUgYWxndWllbiBkaWdhIHF1ZSBubyBkZWJlbW9zIGlkZW50aWZpY2FyIHkgcmVjb21wZW5zYXIgbG8gcXVlIHZhbG9yYW1vcywgcGVybyBlcyDDunRpbCByZXZpc2FyIGxhcyBsZWNjaW9uZXMgcGFyYSBhc2VndXJhcnNlIGRlIHF1ZSBlc3TDoW4gaGFjaWVuZG8gYWwgbWVub3MgYWxndW5hcyBkZSBlc3RhcyBjb3Nhcy4gVW5hIGVzdHJhdGVnaWEgcXVlIG1lIGd1c3RhIGVzcGVjaWFsbWVudGUgZXMgcXVlIGxvcyBhbHVtbm9zIHF1ZSB0dXZpZXJvbiBkaWZpY3VsdGFkZXMgcGVybyBxdWUgdHV2aWVyb24gw6l4aXRvIGVudHJlbiB5IGN1ZW50ZW4gc3VzIGhpc3RvcmlhcyBhbCByZXN0byBkZSBsYSBjbGFzZS4gRXMgbXVjaG8gbcOhcyBwcm9iYWJsZSBxdWUgbG9zIGFsdW1ub3MgY3JlYW4gaGlzdG9yaWFzIGRlIHBlcnNvbmFzIGNvbW8gZWxsb3MgW01pbGwyMDE2YV0sIHkgbGFzIHBlcnNvbmFzIHF1ZSBoYW4gY29tcGxldGFkbyBzdSBjdXJzbyBzaWVtcHJlIHRlbmRyw6FuIGNvbnNlam9zIGVuIGxvcyBxdWUgbnVuY2EgaGFicsOtYW4gcGVuc2Fkby4KCgo+KipObyBzb2xvIHBhcmEgZXN0dWRpYW50ZXMqKgo+TGFzIGRpc2N1c2lvbmVzIHNvYnJlIG1vdGl2YWNpw7NuIGVuIGVkdWNhY2nDs24gYSBtZW51ZG8gcGFzYW4gcG9yIGFsdG8gbGEgbmVjZXNpZGFkIGRlIG1vdGl2YXIgYWwgbWFlc3Ryby4gTG9zIGFsdW1ub3MgcmVzcG9uZGVuIGFsIGVudHVzaWFzbW8gZGUgdW4gbWFlc3RybywgeSBsb3MgbWFlc3Ryb3MgKHBhcnRpY3VsYXJtZW50ZSBsb3Mgdm9sdW50YXJpb3MpIGRlYmVuIHByZW9jdXBhcnNlIHBvciB1biB0ZW1hIHBhcmEgc2VndWlyIGVuc2XDscOhbmRvbG8uIEVzdGEgZXMgb3RyYSByYXrDs24gcG9kZXJvc2EgcGFyYSBlbnNlw7FhciBlbiBjb25qdW50byAoU2VjY2nDs24gOS4zKTogYXPDrSBjb21vIHRlbmVyIHVuIGNvbXBhw7Flcm8gcGFyYSBjb3JyZXIgaGFjZSBxdWUgc2VhIG3DoXMgcHJvYmFibGUgcXVlIGNvbnRpbsO6ZXMgY29ycmllbmRvLCB0ZW5lciB1biBjb21wYcOxZXJvIHBhcmEgZW5zZcOxYXIgdGUgYXl1ZGEgYSBsZXZhbnRhcnRlIHkgY29udGludWFyIGVzb3MgZMOtYXMgY3VhbmRvIHRpZW5lcyB1biByZXNmcmlhZG8geSBsYSBib21iaWxsYSBkZWwgcHJveWVjdG9yIHNlIGhhIHF1ZW1hZG8geSBuYWRpZSBzYWJlIGTDs25kZSBlbmNvbnRyYXIgdW4gcmVlbXBsYXpvIHksIGVuIHNlcmlvLCDCv2VzdMOhbiBoYWNpZW5kbyBsYSBjb25zdHJ1Y2Npw7NuIG51ZXZhbWVudGU/CgpMb3MgbWFlc3Ryb3MgdGFtYmnDqW4gcHVlZGVuIGhhY2VyIG90cmFzIGNvc2FzIHBvc2l0aXZhcy4gW0JhcmsyMDE0XSBkZXNjdWJyacOzIHRyZXMgY29zYXMgcXVlIGltcHVsc2Fyb24gbGEgcmV0ZW5jacOzbiBwYXJhIHRvZG9zIGxvcyBhbHVtbm9zOiB0YXJlYXMgc2lnbmlmaWNhdGl2YXMsIGludGVyYWNjacOzbiBkZWwgcHJvZmVzb3JhZG8gY29uIGxvcyBhbHVtbm9zIHkgY29sYWJvcmFjacOzbiBkZSBsb3MgYWx1bW5vcyBlbiBsYXMgdGFyZWFzLiBFbCByaXRtbyB5IGxhIGNhcmdhIGRlIHRyYWJham8gZW4gcmVsYWNpw7NuIGNvbiBsYXMgZXhwZWN0YXRpdmFzIHRhbWJpw6luIGZ1ZXJvbiBmYWN0b3JlcyBpbXBvcnRhbnRlcywgcGVybyBwcmluY2lwYWxtZW50ZSBwYXJhIGxvcyBlc3R1ZGlhbnRlcyB2YXJvbmVzLiBMYXMgY29zYXMgcXVlIG5vIGltcHVsc2Fyb24gbGEgcmV0ZW5jacOzbiBmdWVyb24gaW50ZXJhY2Npb25lcyBjb24gYXNpc3RlbnRlcyBkZSBlbnNlw7FhbnphIGUgaW50ZXJhY2Npb25lcyBjb24gY29tcGHDsWVyb3MgZW4gYWN0aXZpZGFkZXMgZXh0cmFjdXJyaWN1bGFyZXMuIEVzdG9zIHJlc3VsdGFkb3MgcGFyZWNlbiBvYnZpb3MsIHBlcm8gbG8gY29udHJhcmlvIHRhbWJpw6luIHBhcmVjZXLDrWEgb2J2aW86IHNpIGVsIGVzdHVkaW8gaHViaWVyYSBlbmNvbnRyYWRvIHF1ZSBsYXMgYWN0aXZpZGFkZXMgZXh0cmFjdXJyaWN1bGFyZXMgaW1wdWxzYW4gbGEgcmV0ZW5jacOzbiwgdGFtYmnDqW4gcGVuc2Fyw61hbW9zIHF1ZSBlc28gdGllbmUgc2VudGlkby4gTm90YWJsZW1lbnRlLCBkb3MgZGUgbG9zIGN1YXRybyBpbXB1bHNvcmVzIGRlIHJldGVuY2nDs24gKGludGVyYWNjacOzbiBkZWwgcHJvZmVzb3JhZG8geSBjb2xhYm9yYWNpw7NuIGRlbCBhbHVtbm8pIHJlcXVpZXJlbiB1biBlc2Z1ZXJ6byBhZGljaW9uYWwgcGFyYSByZXBsaWNhcnNlIGVuIGzDrW5lYSAoQ2Fww610dWxvIDExKS4KCiMjIFRhcmVhcyBhdXTDqW50aWNhcwpDb21vIHNlw7FhbGEgRHlsYW4gV2lsaWFtIGVuIFtIZW5kMjAxN10sIGxhIG1vdGl2YWNpw7NuIG5vIHNpZW1wcmUgY29uZHVjZSBhbCBsb2dybywgcGVybyBlbCBsb2dybyBjYXNpIHNpZW1wcmUgY29uZHVjZSBhIGxhIG1vdGl2YWNpw7NuOiBlbCDDqXhpdG8gZGUgbG9zIGFsdW1ub3MgbG9zIG1vdGl2YSBtdWNobyBtw6FzIHF1ZSBhIHF1ZSBsZXMgZGlnYW4gbG8gbWFyYXZpbGxvc29zIHF1ZSBzb24uIFBvZGVtb3MgdXRpbGl6YXIgZXN0YSBpZGVhIGVuIGxhIGVuc2XDsWFuemEgY3JlYW5kbyB1bmEgY3VhZHLDrWN1bGEgY3V5b3MgZWplcyBzb24gInRpZW1wbyBtZWRpbyBwYXJhIGRvbWluYXIiIHkgInV0aWxpZGFkIHVuYSB2ZXogZG9taW5hZGEiIChGaWd1cmEgW2Y6IG1vdGl2YWNpw7NuLXF1w6ldKS4KCiFbUXVlIGVuc2XDsWFyXSguL2ltZ190cmFuaW5nL3doYXQtdG8tdGVhY2guc3ZnKQoKTGFzIGNvc2FzIHF1ZSBzb24gcsOhcGlkYXMgZGUgZG9taW5hciBlIGlubWVkaWF0YW1lbnRlIMO6dGlsZXMgZGViZW4gZW5zZcOxYXJzZSBwcmltZXJvLCBpbmNsdXNvIHNpIG5vIHNvbiBjb25zaWRlcmFkYXMgZnVuZGFtZW50YWxlcyBwb3IgcGVyc29uYXMgcXVlIHlhIHNvbiBwcm9mZXNpb25hbGVzIGNvbXBldGVudGVzLCBwb3JxdWUgdW5hcyBwb2NhcyB2aWN0b3JpYXMgdGVtcHJhbmFzIGNvbnN0cnVpcsOhbiBsYSBjb25maWFuemEgZGUgbG9zIGFsdW1ub3MgZW4gc8OtIG1pc21vcyB5IGVuIHN1IG1hZXN0cm8uIFBvciBlbCBjb250cmFyaW8sIGxhcyBjb3NhcyBxdWUgc29uIGRpZsOtY2lsZXMgZGUgYXByZW5kZXIgeSBxdWUgbm8gc29uIMO6dGlsZXMgcGFyYSBzdXMgYWx1bW5vcyBlbiBzdSBldGFwYSBhY3R1YWwgZGUgZGVzYXJyb2xsbyBkZWJlbiBvbWl0aXJzZSBwb3IgY29tcGxldG8sIG1pZW50cmFzIHF1ZSBsb3MgdGVtYXMgYSBsbyBsYXJnbyBkZSBsYSBkaWFnb25hbCBkZWJlbiBzb3Blc2Fyc2UgZW50cmUgc8OtLgoKPioqwr/DmnRpbCBwYXJhIHF1acOpbj8qKgo+Cj5TaSBhbGd1aWVuIHF1aWVyZSBjcmVhciBzaXRpb3Mgd2ViLCBsb3MgY29uY2VwdG9zIGLDoXNpY29zIGRlIGluZm9ybcOhdGljYSBjb21vIGxhIHJlY3Vyc2l2aWRhZCB5IGxhIGNvbXB1dGFiaWxpZGFkIHB1ZWRlbiBoYWJpdGFyIGVuIGxhIGVzcXVpbmEgaW5mZXJpb3IgZGVyZWNoYSBkZSBlc3RhIGN1YWRyw61jdWxhLiBFc28gbm8gc2lnbmlmaWNhIHF1ZSBubyB2YWxnYSBsYSBwZW5hIGFwcmVuZGVyLCBwZXJvIHNpIG51ZXN0cm8gb2JqZXRpdm8gZXMgbW90aXZhciBhIGxhcyBwZXJzb25hcywgcHVlZGVuIHkgZGViZW4gZGlmZXJpcnNlLiBQb3IgZWwgY29udHJhcmlvLCB1bmEgcGVyc29uYSBtYXlvciBxdWUgZXN0w6EgdG9tYW5kbyB1bmEgY2xhc2UgZGUgcHJvZ3JhbWFjacOzbiBwYXJhIGVzdGltdWxhciBzdSBtZW50ZSBwdWVkZSBwcmVmZXJpciBleHBsb3JhciBlc3RhcyBncmFuZGVzIGlkZWFzIGEgaGFjZXIgYWxnbyBwcsOhY3RpY28uIEN1YW5kbyBlc3TDqSBjcmVhbmRvIHN1IGdyaWxsYSwgZGViZSBoYWNlcmxvIHRlbmllbmRvIGVuIGN1ZW50YSBhIHN1cyBhbHVtbm9zIChTZWNjacOzbiA2LjEpLiBTaSBsb3MgdGVtYXMgdGVybWluYW4gZW4gbHVnYXJlcyBtdXkgZGlmZXJlbnRlcyBwYXJhIGRpZmVyZW50ZXMgcGVyc29uYXMsIGRlYmUgcGVuc2FyIGVuIGNyZWFyIGRpZmVyZW50ZXMgY3Vyc29zLgoKVW5hIGluc3RhbmNpYSBiaWVuIGVzdHVkaWFkYSBkZSBwcmlvcml6YXIgbG8gcXVlIGVzIMO6dGlsIHNpbiBzYWNyaWZpY2FyIGxvIGZ1bmRhbWVudGFsIGVzIGVsIGVuZm9xdWUgZGUgY8OhbGN1bG8gZGUgbWVkaW9zIGRlc2Fycm9sbGFkbyBlbiBHZW9yZ2lhIFRlY2ggW0d1emQyMDEzXS4gRW4gbHVnYXIgZGUgaW1wcmltaXIgImhvbGEgbXVuZG8iIG8gc3VtYXIgbG9zIHByaW1lcm9zIGRpZXogZW50ZXJvcywgZWwgcHJpbWVyIHByb2dyYW1hIGRlIHVuIGFsdW1ubyBwdWVkZSBhYnJpciB1bmEgaW1hZ2VuLCBjYW1iaWFyIHN1IHRhbWHDsW8gcGFyYSBjcmVhciB1bmEgbWluaWF0dXJhIHkgZ3VhcmRhciBlbCByZXN1bHRhZG8uIEVzdGEgZXMgdW5hICoqdGFyZWEgYXV0w6ludGljYSoqLCBlcyBkZWNpciwgYWxnbyBxdWUgbG9zIGFsdW1ub3MgY3JlZW4gcXVlIHJlYWxtZW50ZSBoYXLDrWFuIGVuIGxhIHZpZGEgcmVhbC4gVGFtYmnDqW4gdGllbmUgdW4gKiphcnRlZmFjdG8gdGFuZ2libGUqKjogc2kgbGEgaW1hZ2VuIHNhbGUgZGVsIHRhbWHDsW8gaW5jb3JyZWN0bywgbG9zIGFsdW1ub3MgdGllbmVuIGFsZ28gZW4gbGEgbWFubyBxdWUgcHVlZGUgZ3VpYXIgc3UgZGVwdXJhY2nDs24uIFtMZWUyMDEzXSBkZXNjcmliZSB1bmEgYWRhcHRhY2nDs24gZGUgZXN0ZSBlbmZvcXVlIGRlIFB5dGhvbiBhIE1BVExBQiwgbWllbnRyYXMgcXVlIG90cm9zIGVzdMOhbiBjb25zdHJ1eWVuZG8gY3Vyc29zIHNpbWlsYXJlcyBzb2JyZSBjaWVuY2lhIGRlIGRhdG9zICwgcHJvY2VzYW1pZW50byBkZSBpbcOhZ2VuZXMgeSBiaW9sb2fDrWEgW0RhaGwyMDE4LCBNZXlzMjAxOCwgUml0ejIwMThdLgoKU2llbXByZSBoYWJyw6EgdGVuc2nDs24gZW50cmUgZGFybGVzIGEgbG9zIGFsdW1ub3MgcHJvYmxlbWFzIGF1dMOpbnRpY29zIHkgZWplcmNpdGFyIGxhcyBoYWJpbGlkYWRlcyBpbmRpdmlkdWFsZXMgcXVlIG5lY2VzaXRhbiBwYXJhIHJlc29sdmVyIGVzb3MgcHJvYmxlbWFzOiBkZXNwdcOpcyBkZSB0b2RvLCBsb3MgcHJvZ3JhbWFkb3JlcyBubyByZXNwb25kZW4gcHJlZ3VudGFzIGRlIG9wY2nDs24gbcO6bHRpcGxlIGVuIGVsIHRyYWJham8gbcOhcyBkZSBsbyBxdWUgbG9zIG3DunNpY29zIHRvY2FuIHVuYSB5IG90cmEgdmV6IGZyZW50ZSBhIHVuYSBhdWRpZW5jaWEgLiBFbmNvbnRyYXIgZWwgZXF1aWxpYnJpbyBlcyBkaWbDrWNpbCwgcGVybyB1biBwcmltZXIgcGFzbyBlcyBzYWNhciBjdWFscXVpZXIgY29zYSBhcmJpdHJhcmlhIG8gc2luIHNlbnRpZG8uIFBvciBlamVtcGxvLCBsb3MgZWplbXBsb3MgZGUgcHJvZ3JhbWFjacOzbiBubyBkZWJlbiB1c2FyIHZhcmlhYmxlcyBsbGFtYWRhcyBmb28geSBiYXIsIHkgc2kgdmEgYSBoYWNlciBxdWUgbG9zIGFsdW1ub3MgY2xhc2lmaXF1ZW4gdW5hIGxpc3RhLCBow6FnYWxhIHVuYSBsaXN0YSBkZSBjYW5jaW9uZXMgZW4gbHVnYXIgZGUgY2FkZW5hcyBjb21vICJhYWEiIHkgImJiYiIuCgojIyBEZXNtb3RpdmFjacOzbgoKPkxhcyBtdWplcmVzIG5vIGFiYW5kb25hbiBsYSBpbmZvcm3DoXRpY2EgcG9ycXVlIG5vIHNhYmVuIGPDs21vIGVzOyBzZSB2YW4gcG9ycXVlIGxvIHNhYmVuLgo+IC0tIGF0cmlidWlkbyBkaXZlcnNhbWVudGUKClNpIGVzdMOhIGVuc2XDsWFuZG8gZW4gdW4gZW50b3JubyBkZSBjYW1wbyBsaWJyZSwgc3VzIGFsdW1ub3MgcHJvYmFibGVtZW50ZSBzZWFuIHZvbHVudGFyaW9zIHkgcHJvYmFibGVtZW50ZSBxdWllcmFuIGVzdGFyIGVuIHN1IGNsYXNlLiBQb3IgbG8gdGFudG8sIG1vdGl2YXJsb3MgZXMgbWVub3MgcHJlb2N1cGFudGUgcXVlIG5vIGRlc21vdGl2YXJsb3MuIERlc2Fmb3J0dW5hZGFtZW50ZSwgcHVlZGUgZGVzbW90aXZhciBmw6FjaWxtZW50ZSBhIGxhcyBwZXJzb25hcyBwb3IgYWNjaWRlbnRlLiBQb3IgZWplbXBsbywgW0NoZXIyMDA5XSBpbmZvcm3DsyBjdWF0cm8gZXN0dWRpb3MgcXVlIG11ZXN0cmFuIHF1ZSBsYXMgcGlzdGFzIGFtYmllbnRhbGVzIHN1dGlsZXMgdGllbmVuIHVuYSBkaWZlcmVuY2lhIGFwcmVjaWFibGUgZW4gZWwgaW50ZXLDqXMgcXVlIHRpZW5lbiBsYXMgcGVyc29uYXMgZGUgZGlmZXJlbnRlcyBnw6luZXJvcyBlbiBsYSBpbmZvcm3DoXRpY2E6IGNhbWJpYXIgbG9zIG9iamV0b3MgZW4gdW4gYXVsYSBkZSBpbmZvcm3DoXRpY2EgZGUgYXF1ZWxsb3MgY29uc2lkZXJhZG9zIGVzdGVyZW90w61waWNvcyBkZSBsYSBpbmZvcm3DoXRpY2EgKHBvciBlamVtcGxvLCBjYXJ0ZWxlcyBkZSBTdGFyIFRyZWsgeSB2aWRlb2p1ZWdvcykgYSBvYmpldG9zIHF1ZSBubyBzZSBjb25zaWRlcmFuIGVzdGVyZW90aXBhZG9zIChwLiBlai4sIGNhcnRlbGVzIGRlIGxhIG5hdHVyYWxlemEgeSBndcOtYXMgdGVsZWbDs25pY2FzKSBhdW1lbnRhcm9uIGVsIGludGVyw6lzIGRlIGxhcyBlc3R1ZGlhbnRlcyB1bml2ZXJzaXRhcmlhcyBhbCBuaXZlbCBkZSBzdXMgY29tcGHDsWVyb3MgdmFyb25lcy4gRGUgbWFuZXJhIHNpbWlsYXIsIFtHYXVjMjAxMV0gaW5mb3JtYSB1biB0csOtbyBkZSBlc3R1ZGlvcyBxdWUgbXVlc3RyYW4gcXVlIGxhcyBwYWxhYnJhcyBkZSBnw6luZXJvIGNvbcO6bm1lbnRlIGVtcGxlYWRhcyBlbiBsb3MgbWF0ZXJpYWxlcyBkZSByZWNsdXRhbWllbnRvIGxhYm9yYWwgcHVlZGVuIG1hbnRlbmVyIGxhIGRlc2lndWFsZGFkIGRlIGfDqW5lcm8gZW4gb2N1cGFjaW9uZXMgdHJhZGljaW9uYWxtZW50ZSBkb21pbmFkYXMgcG9yIGhvbWJyZXMuCgpIYXkgdHJlcyBkZXNtb3RpdmFkb3JlcyBwcmluY2lwYWxlcyBwYXJhIGVzdHVkaWFudGVzIGFkdWx0b3M6CgoqKkltcHJldmlzaWJpbGlkYWQqKiBEZXNtb3RpdmEgYSBsYXMgcGVyc29uYXMgcG9ycXVlIHNpIG5vIGhheSB1bmEgY29uZXhpw7NuIGNvbmZpYWJsZSBlbnRyZSBsbyBxdWUgaGFjZW4geSBlbCByZXN1bHRhZG8gcXVlIGxvZ3Jhbiwgbm8gaGF5IHJhesOzbiBwYXJhIHF1ZSBpbnRlbnRlbiBoYWNlciBhbGdvLgoKKipJbmRpZmVyZW5jaWEqKiBTZSBkZXNtb3RpdmEgcG9ycXVlIGxvcyBhbHVtbm9zIHF1ZSBjcmVlbiBxdWUgZWwgbWFlc3RybyBvIGVsIHNpc3RlbWEgZWR1Y2F0aXZvIG5vIHNlIHByZW9jdXBhbiBwb3IgZWxsb3MgbyBxdWUgZWwgbWF0ZXJpYWwgdGFtcG9jbyBzZSBwcmVvY3VwYSBwb3IgZWxsb3MuCgoqKkluanVzdGljaWEqKiBEZXNtb3RpdmEgYSBsYXMgcGVyc29uYXMgcXVlIGVzdMOhbiBlbiBkZXN2ZW50YWphIHBvciByYXpvbmVzIG9idmlhcy4gTG8gc29ycHJlbmRlbnRlIGVzIHF1ZSB0YW1iacOpbiBkZXNtb3RpdmEgYSBsYXMgcGVyc29uYXMgcXVlIHNlIGJlbmVmaWNpYW4gZGUgbGEgaW5qdXN0aWNpYTogY29uc2NpZW50ZSBvIGluY29uc2NpZW50ZW1lbnRlLCBsZXMgcHJlb2N1cGEgcXVlIGFsZ8O6biBkw61hIHNlIGVuY3VlbnRyZW4gZW4gZWwgZ3J1cG8gZGVzZmF2b3JlY2lkbyBbV2lsazIwMTFdLgoKRW4gc2l0dWFjaW9uZXMgZXh0cmVtYXMsIGxvcyBhbHVtbm9zIHB1ZWRlbiBkZXNhcnJvbGxhciBsYSBpbXBvdGVuY2lhIGFwcmVuZGlkYTogY3VhbmRvIHNlIGxlcyBzb21ldGUgcmVwZXRpZGFtZW50ZSBhIGNvbWVudGFyaW9zIG5lZ2F0aXZvcyBlbiB1bmEgc2l0dWFjacOzbiBxdWUgbm8gcHVlZGVuIGNhbWJpYXIsIHB1ZWRlbiBhcHJlbmRlciBhIG5pIHNpcXVpZXJhIGludGVudGFyIGNhbWJpYXIgbGFzIGNvc2FzIHF1ZSBwb2Ryw61hbi4KClVuYSBkZSBsYXMgZm9ybWFzIG3DoXMgcsOhcGlkYXMgeSBzZWd1cmFzIGRlIGRlc21vdGl2YXIgYSBsb3MgYWx1bW5vcyBlcyB1dGlsaXphciB1biBsZW5ndWFqZSBxdWUgc3VnaWVyYSBxdWUgYWxndW5hcyBwZXJzb25hcyBzb24gcHJvZ3JhbWFkb3JlcyBuYXR1cmFsZXMgeSBvdHJhcyBuby4gR3V6ZGlhbCBoYSBsbGFtYWRvIGEgZXN0byBlbCBtYXlvciBtaXRvIHNvYnJlIGxhIGVuc2XDsWFuemEgZGUgbGEgaW5mb3Jtw6F0aWNhLCB5IFtQYXRpMjAxNl0gcmVzcGFsZMOzIGVzdG8gYWwgZGVtb3N0cmFyIHF1ZSBsYXMgcGVyc29uYXMgdmVuIGV2aWRlbmNpYSBkZSB1biAiZ2VuIGdlZWsiIGRvbmRlIG5vIGV4aXN0ZSBuaW5ndW5vLiBBbmFsaXphcm9uIGxhcyBkaXN0cmlidWNpb25lcyBkZSBjYWxpZmljYWNpb25lcyBkZSA3NzggY3Vyc29zIHVuaXZlcnNpdGFyaW9zIHkgZGVzY3Vicmllcm9uIHF1ZSBzb2xvIGVsIDUuOCUgbW9zdHJhYmEgc2lnbm9zIGRlIHNlciBtdWx0aW1vZGFsLCBlcyBkZWNpciwgc29sbyB1bmEgZGUgY2FkYSB2ZWludGUgY2xhc2VzIG1vc3RyYWJhIHNpZ25vcyBkZSB0ZW5lciBkb3MgcG9ibGFjaW9uZXMgZGlzdGludGFzIGRlIGVzdHVkaWFudGVzLiBMdWVnbyBtb3N0cmFyb24gYSA1MyBwcm9mZXNvcmVzIGRlIGNpZW5jaWFzIGRlIGxhIGNvbXB1dGFjacOzbiBoaXN0b2dyYW1hcyBkZSBkaXN0cmlidWNpb25lcyBhbWJpZ3VhcyBkZSBjYWxpZmljYWNpb25lczsgYXF1ZWxsb3MgcXVlIGNyZcOtYW4gcXVlIGFsZ3VuYXMgcGVyc29uYXMgdGllbmVuIHVuYSBwcmVkaXNwb3NpY2nDs24gaW5uYXRhIGEgc2VyIG1lam9yZXMgZW4gQ2llbmNpYXMgZGUgbGEgQ29tcHV0YWNpw7NuIGVyYW4gbcOhcyBwcm9wZW5zb3MgYSB2ZXJsb3MgY29tbyBiaW1vZGFsZXMgcXVlIGFxdWVsbG9zIHF1ZSBuby4KCkVzdGFzIGNyZWVuY2lhcyBpbXBvcnRhbiBwb3JxdWUgbG9zIG1hZXN0cm9zIGFjdMO6YW4gc29icmUgZWxsYXMgW0Jyb3AxOTgzXS4gU2kgdW4gbWFlc3RybyBjcmVlIHF1ZSBlcyBwcm9iYWJsZSBxdWUgYSB1biBhbHVtbm8gbGUgdmF5YSBiaWVuLCBuYXR1cmFsbWVudGUgKGEgbWVudWRvIGluY29uc2NpZW50ZW1lbnRlKSBzZSBlbmZvY2EgZW4gZXNlIGFsdW1ubywgcXVpZW4gbHVlZ28gY3VtcGxlIGNvbiBsYXMgZXhwZWN0YXRpdmFzIGRlbCBtYWVzdHJvIGRlYmlkbyBhIGxhIG1heW9yIGF0ZW5jacOzbiwgcXVlIGEgc3UgdmV6IHBhcmVjZSBjb25maXJtYXIgbGEgY3JlZW5jaWEgZGVsIG1hZXN0cm8uIExhbWVudGFibGVtZW50ZSwgaGF5IHBvY2FzIHNlw7FhbGVzIGRlIHF1ZSBsYSBtZXJhIGV2aWRlbmNpYSBkZWwgdGlwbyBwcmVzZW50YWRvIGVuIFtQYXRpMjAxNl0gc2VhIHN1ZmljaWVudGUgcGFyYSByb21wZXIgZXN0ZSBjw61yY3VsbyB2aWNpb3NvIC4uLgoKQXF1w60gaGF5IGFsZ3VuYXMgb3RyYXMgY29zYXMgZXNwZWPDrWZpY2FzIHF1ZSBkZXNtb3RpdmFyw6FuIGEgc3VzIGFsdW1ub3M6CgoqKlVuYSBhY3RpdHVkIG3DoXMgc2FudGEgcXVlIHTDuiBvIGRlc3BlY3RpdmEqKiBkZSB1biBtYWVzdHJvIG8gdW4gY29tcGHDsWVybyBkZSBhcHJlbmRpemFqZS4KCioqRGljacOpbmRvbGVzIHF1ZSBzdXMgaGFiaWxpZGFkZXMgZXhpc3RlbnRlcyBzb24gYmFzdXJhLioqIExvcyB1c3VhcmlvcyBkZSBVbml4IHNlIGJ1cmxhbiBkZSBXaW5kb3dzLCBsb3MgcHJvZ3JhbWFkb3JlcyBkZSB0b2RvIHRpcG8gaGFjZW4gYnJvbWFzIHNvYnJlIEV4Y2VsLCB5IG5vIGltcG9ydGEgcXXDqSBtYXJjbyBkZSBhcGxpY2FjaW9uZXMgd2ViIHlhIGNvbm96Y2EsIGFsZ8O6biBwcm9ncmFtYWRvciBsZSBkaXLDoSBxdWUgZXN0w6EgZGVzYWN0dWFsaXphZG8uIExvcyBlc3R1ZGlhbnRlcyBhIG1lbnVkbyBoYW4gaW52ZXJ0aWRvIG11Y2hvIHRpZW1wbyB5IGVzZnVlcnpvIGVuIGFkcXVpcmlyIGxhcyBoYWJpbGlkYWRlcyBxdWUgdGllbmVuOyBtZW5vc3ByZWNpYXJsb3MgZXMgdW5hIGJ1ZW5hIG1hbmVyYSBkZSBnYXJhbnRpemFyIHF1ZSBubyBlc2N1Y2hlbiBuYWRhIG3DoXMgcXVlIHRlbmdhcyBxdWUgZGVjaXIuCgoqKlN1bcOpcmdldGUgZW4gZGlzY3VzaW9uZXMgdMOpY25pY2FzIGNvbXBsZWphcyBvIGRldGFsbGFkYXMqKiBjb24gbG9zIGFsdW1ub3MgbcOhcyBhdmFuemFkb3MgZGUgbGEgY2xhc2UuCgoqKkZpbmdpZW5kbyBxdWUgc2FiZXMgbcOhcyBxdWUgdMO6LioqIExvcyBlc3R1ZGlhbnRlcyBjb25maWFyw6FuIG3DoXMgZW4gdXN0ZWQgc2kgZXMgZnJhbmNvIHNvYnJlIGxhcyBsaW1pdGFjaW9uZXMgZGUgc3UgY29ub2NpbWllbnRvLCB5IHNlcsOhIG3DoXMgcHJvYmFibGUgcXVlIGhhZ2EgcHJlZ3VudGFzIHkgYnVzcXVlIGF5dWRhLgoKKipVc2FuZG8gbGEgcGFsYWJyYSBKICgic29sbyIpIG8gZmluZ2llbmRvIHNvcnByZXNhLioqIENvbW8gc2UgZGlzY3V0acOzIGVuIGVsIENhcMOtdHVsbyAzLCBkZWNpciBjb3NhcyBjb21vICJObyBwdWVkbyBjcmVlciBxdWUgbm8gc2VwYXMgWCIgbyAiwr9udW5jYSBoYXMgb8OtZG8gaGFibGFyIGRlIFk/IiBTZcOxYWxhIGFsIGFsdW1ubyBxdWUgZWwgbWFlc3RybyBwaWVuc2EgcXVlIHN1IHByb2JsZW1hIGVzIHRyaXZpYWwgeSBxdWUgZGViZSBzZXIgZXN0w7pwaWRvIHBvciBubyBwb2RlciByZXNvbHZlcmxvLgoKKipEb2xvcmVzIGRlIGNhYmV6YSBkZSBpbnN0YWxhY2nDs24gZGUgc29mdHdhcmUuKioKRWwgcHJpbWVyIGNvbnRhY3RvIGRlIGxhcyBwZXJzb25hcyBjb24gbGEgcHJvZ3JhbWFjacOzbiBvIGNvbiBudWV2YXMgaGVycmFtaWVudGFzIGRlIHByb2dyYW1hY2nDs24gYSBtZW51ZG8gZXMgZGVzbW9yYWxpemFudGUsIHkgY3JlZXIgcXVlIGFsZ28gZXMgZGlmw61jaWwgZGUgYXByZW5kZXIgZXMgdW5hIHByb2ZlY8OtYSBhdXRvY3VtcGxpZGEuIE5vIGVzIHNvbG8gZWwgdGllbXBvIHF1ZSB0b21hIGNvbmZpZ3VyYXJsbyBvIGxhIHNlbnNhY2nDs24gZGUgcXVlIGVzIGluanVzdG8gdGVuZXIgcXVlIGRlcHVyYXIgYWxnbyBxdWUgZGVwZW5kZSBwcmVjaXNhbWVudGUgZGVsIGNvbm9jaW1pZW50byBxdWUgYcO6biBubyB0aWVuZW4uIEVsIHZlcmRhZGVybyBwcm9ibGVtYSBlcyBxdWUgY2FkYSBmcmFjYXNvIHJlZnVlcnphIHN1IGNyZWVuY2lhIGRlIHF1ZSB0ZW5kcsOtYW4gdW5hIG1lam9yIG9wb3J0dW5pZGFkIGRlIGN1bXBsaXIgY29uIGxhIGZlY2hhIGzDrW1pdGUgZGVsIHByw7N4aW1vIGp1ZXZlcyBzaSBzaWd1aWVyYW4gaGFjaWVuZG8gbGFzIGNvc2FzIGNvbW8gc2llbXByZSBsbyBoYW4gaGVjaG8uCgoKRXMgYcO6biBtw6FzIGbDoWNpbCBkZXNtb3RpdmFyIGEgbGFzIHBlcnNvbmFzIGVuIGzDrW5lYSBxdWUgZW4gcGVyc29uYSwgcGVybyBhaG9yYSBleGlzdGVuIGVzdHJhdGVnaWFzIGJhc2FkYXMgZW4gbGEgZXZpZGVuY2lhIHBhcmEgaGFjZXIgZnJlbnRlIGEgZXN0by4gW0ZvcmQyMDE2XSBkZXNjdWJyacOzIHF1ZSBsYXMgbXVqZXJlcyBxdWUgbG9zIGhvbWJyZXMgY29uc2lkZXJhbiBxdWUgY2luY28gYmFycmVyYXMgYSBsYSBjb250cmlidWNpw7NuIGFsIERlc2JvcmRhbWllbnRvIGRlIHBpbGEgc29uIHNpZ25pZmljYXRpdmFtZW50ZSBtw6FzIHByb2JsZW3DoXRpY2FzOiBmYWx0YSBkZSBjb25jaWVuY2lhIGRlIGxhcyBjYXJhY3RlcsOtc3RpY2FzIGRlbCBzaXRpbywgc2VudGlyc2UgZGVzY2FsaWZpY2FkbyBwYXJhIHJlc3BvbmRlciBwcmVndW50YXMsIGludGltaWRhciBlbCB0YW1hw7FvIGRlIGxhIGNvbXVuaWRhZCwgaW5jb21vZGlkYWQgYWwgaW50ZXJhY3R1YXIgbyBjb25maWFyIGVuIGV4dHJhw7FvcywgeSBsYSBzZW5zYWNpw7NuIGRlIHF1ZSBidXNjYXIgY29zYXMgZW4gbMOtbmVhIG5vIGVyYSAidHJhYmFqbyByZWFsIi4gRWwgbWllZG8gYSBsb3MgY29tZW50YXJpb3MgbmVnYXRpdm9zIG5vIGVzdGFiYSBlbiBlc3RhIGxpc3RhLCBwZXJvIGhhYnLDrWEgc2lkbyBlbCBzaWd1aWVudGUgYWdyZWdhZG8gc2kgbG9zIGF1dG9yZXMgbm8gZnVlcmFuIHRhbiBlc3RyaWN0b3MgY29uIHJlc3BlY3RvIGEgc3VzIGzDrW1pdGVzIGVzdGFkw61zdGljb3MuIFRvZG9zIGVzdG9zIGZhY3RvcmVzIHB1ZWRlbiB5IGRlYmVuIGFib3JkYXJzZSB0YW50byBlbiBlbnRvcm5vcyBlbiBwZXJzb25hIGNvbW8gZW4gbMOtbmVhIHV0aWxpemFuZG8gbcOpdG9kb3MgY29tbyBsb3MgZGUgbGEgU2VjY2nDs24gMTAuNCwgeSBoYWNlcmxvIG1lam9yYSBsb3MgcmVzdWx0YWRvcyBwYXJhIHRvZG9zIFtTdmVkMjAxNl0uCgo+KipGcmFjYXNvIHByb2R1Y3Rpdm8geSBwcml2aWxlZ2lvKioKPgo+QWxndW5vcyB0cmFiYWpvcyByZWNpZW50ZXMgaGFuIGV4cGxvcmFkbyBlbCBmcmFjYXNvIHByb2R1Y3Rpdm8sIGRvbmRlIGxvcyBhbHVtbm9zIHJlY2liZW4gZGVsaWJlcmFkYW1lbnRlIHByb2JsZW1hcyBxdWUgbm8gcHVlZGVuIHJlc29sdmVyc2UgY29uIGVsIGNvbm9jaW1pZW50byBxdWUgdGllbmVuIHkgdGllbmVuIHF1ZSBzYWxpciB5IGFkcXVpcmlyIG51ZXZhIGluZm9ybWFjacOzbiBwYXJhIHByb2dyZXNhciBbS2FwdTIwMTZdLiBFbCBmcmFjYXNvIHByb2R1Y3Rpdm8gcmVjdWVyZGEgc3VwZXJmaWNpYWxtZW50ZSBhbCBtYW50cmEgZGUgbGEgdGVjbm9sb2fDrWEgImZhbGxhIHLDoXBpZG8sIGZhbGxhIGEgbWVudWRvIiwgcGVybyBlc3RlIMO6bHRpbW8gZXMgbcOhcyB1biBzaWdubyBkZSBwcml2aWxlZ2lvIHF1ZSBkZSBjb21wcmVuc2nDs24uIExhcyBwZXJzb25hcyBzb2xvIHB1ZWRlbiBkYXJzZSBlbCBsdWpvIGRlIGNlbGVicmFyIGVsIGZyYWNhc28gc2kgZXN0w6FuIHNlZ3VyYXMgZGUgdGVuZXIgbGEgb3BvcnR1bmlkYWQgZGUgdm9sdmVyIGEgaW50ZW50YXJsbzsgbXVjaG9zIGRlIHN1cyBhbHVtbm9zLCB5IG11Y2hhcyBwZXJzb25hcyBkZSBncnVwb3MgbWFyZ2luYWRvcyBvIGRlc2Zhdm9yZWNpZG9zLCBubyBwdWVkZW4gZXN0YXIgc2VndXJvcyBkZSBlc28sIHkgYXN1bWlyIHF1ZSBlbCBmcmFjYXNvIGVzIHVuYSBvcGNpw7NuIGVzIHVuYSBleGNlbGVudGUgbWFuZXJhIGRlIGRlc21vdGl2YXJsb3MuCgoKIyMjIFNpbmRyb21lIGltcG9zdG9yCgoqKkVsIHPDrW5kcm9tZSBkZSBJbXBvc3RvcioqIGVzIGxhIGNyZWVuY2lhIGRlIHF1ZSBzdXMgbG9ncm9zIHNvbiBjYXN1YWxpZGFkZXMgYWZvcnR1bmFkYXMgeSBlbCB0ZW1vciBkZSBxdWUgYWxndWllbiBmaW5hbG1lbnRlIGxvIHJlc3VlbHZhLiBFcyBjb23Dum4gZW50cmUgbG9zIGVzdHVkaWFudGVzIGRlIGFsdG8gcmVuZGltaWVudG8gcXVlIGVtcHJlbmRlbiB1biB0cmFiYWpvIHZpc2libGUgcMO6YmxpY2FtZW50ZSwgcGVybyBhZmVjdGEgZGVzcHJvcG9yY2lvbmFkYW1lbnRlIGEgbG9zIG1pZW1icm9zIGRlIGdydXBvcyBzdWJyZXByZXNlbnRhZG9zOiBjb21vIHNlIGRpc2N1dGnDsyBlbiBsYSBTZWNjacOzbiA3LjEsIFtXaWxjMjAxOF0gZGVzY3VicmnDsyBxdWUgbGFzIGFsdW1uYXMgY29uIGV4cG9zaWNpw7NuIHByZXZpYSBhIGxhIGNvbXB1dGFjacOzbiBzdXBlcmFyb24gYSBzdXMgcGFyZXMgbWFzY3VsaW5vcyBlbiB0b2RhcyBsYXMgw6FyZWFzIGVuIGxvcyBjdXJzb3MgZGUgcHJvZ3JhbWFjacOzbiBpbnRyb2R1Y3RvcmlhLCBwZXJvIGVzdGFiYW4gY29uc3RhbnRlbWVudGUgbWVub3MgY29uZmlhZG9zIGVuIHN1cyBoYWJpbGlkYWRlcywgZW4gcGFydGUgcG9ycXVlIGxhIHNvY2llZGFkIHNpZ3VlIHNlw7FhbGFuZG8gZW4gZm9ybWFzIHN1dGlsZXMgeSBubyB0YW4gc3V0aWxlcyBxdWUgcmVhbG1lbnRlIG5vIHBlcnRlbmVjZW4uCgpMYXMgYXVsYXMgdHJhZGljaW9uYWxlcyBwdWVkZW4gYWxpbWVudGFyIGVsIHPDrW5kcm9tZSBkZWwgaW1wb3N0b3IuIENvbiBmcmVjdWVuY2lhLCBlbCB0cmFiYWpvIGVzY29sYXIgc2UgcmVhbGl6YSBzb2xvIG8gZW4gcGVxdWXDsW9zIGdydXBvcywgcGVybyBsb3MgcmVzdWx0YWRvcyBzZSBjb21wYXJ0ZW4geSBjcml0aWNhbiBww7pibGljYW1lbnRlLiBDb21vIHJlc3VsdGFkbywgcmFyYSB2ZXogdmVtb3MgY8OzbW8gb3Ryb3MgbHVjaGFuIHBvciB0ZXJtaW5hciBzdSB0cmFiYWpvLCBsbyBxdWUgcHVlZGUgYWxpbWVudGFyIGxhIGNyZWVuY2lhIGRlIHF1ZSB0b2RvcyBsb3MgZGVtw6FzIGxvIGVuY3VlbnRyYW4gZsOhY2lsLiBMb3MgbWllbWJyb3MgZGUgZ3J1cG9zIHN1YnJlcHJlc2VudGFkb3MgcXVlIHlhIHNpZW50ZW4gdW5hIHByZXNpw7NuIGFkaWNpb25hbCBwYXJhIGRlbW9zdHJhciBzdSB2YWzDrWEgcHVlZGVuIHZlcnNlIHBhcnRpY3VsYXJtZW50ZSBhZmVjdGFkb3MuCgpMYSBJbmljaWF0aXZhIEFkYSBoYSBjcmVhZG8gYWxndW5hcyBwYXV0YXMgcGFyYSBjb21iYXRpciBzdSBwcm9waW8gc8OtbmRyb21lIGRlIGltcG9zdG9yLCBxdWUgaW5jbHV5ZW46CgoqKkhhYmxlIHNvYnJlIGVsIHByb2JsZW1hIGNvbiBwZXJzb25hcyBkZSBzdSBjb25maWFuemEuKiogQ3VhbmRvIGVzY3VjaGFzIGRlIG90cm9zIHF1ZSBlbCBzw61uZHJvbWUgZGVsIGltcG9zdG9yIGVzIHVuIHByb2JsZW1hIGNvbcO6biwgc2UgaGFjZSBtw6FzIGRpZsOtY2lsIGNyZWVyIHF1ZSB0dXMgc2VudGltaWVudG9zIGRlIGZyYXVkZSBzb24gcmVhbGVzLgoKKipJciBhIHVuYSBzZXNpw7NuIGRlIHPDrW5kcm9tZSBkZSBpbXBvc3RvciBlbiBwZXJzb25hLioqIE5vIGhheSBuYWRhIGNvbW8gZXN0YXIgZW4gdW5hIGhhYml0YWNpw7NuIGxsZW5hIGRlIHBlcnNvbmFzIGEgbGFzIHF1ZSByZXNwZXRhcyB5IGRlc2N1YnJpciBxdWUgZWwgOTAlIGRlIGVsbGFzIHRpZW5lbiBzw61uZHJvbWUgZGUgaW1wb3N0b3IuCgoqKkN1aWRhIHR1cyBwYWxhYnJhcywgcG9ycXVlIGluZmx1eWVuIGVuIGPDs21vIHBpZW5zYXMuKiogRGVjaXIgY29zYXMgY29tbyAiTm8gc295IHVuIGV4cGVydG8gZW4gZXN0bywgcGVybyAuLi4iIHJlc3RhIHZhbG9yIGFsIGNvbm9jaW1pZW50byBxdWUgcmVhbG1lbnRlIHBvc2Vlcy4KCioqRW5zZcOxZSBhIG90cm9zIHNvYnJlIHN1IGNhbXBvLioqIEdhbmFyw6EgY29uZmlhbnphIGVuIHN1IHByb3BpbyBjb25vY2ltaWVudG8geSBoYWJpbGlkYWQgeSBheXVkYXLDoSBhIG90cm9zIGEgZXZpdGFyIGFsZ3Vub3MgY2FyZMO6bWVuZXMgZGUgc8OtbmRyb21lIGRlIGltcG9zdG9yLgoKKipIYWNlciBwcmVndW50YXMuKiogSGFjZXIgcHJlZ3VudGFzIHB1ZWRlIHNlciBpbnRpbWlkYW50ZSBzaSBjcmVlIHF1ZSBkZWJlIHNhYmVyIGxhIHJlc3B1ZXN0YSwgcGVybyBvYnRlbmVyIHJlc3B1ZXN0YXMgZWxpbWluYSBsYSBhZ29uw61hIHByb2xvbmdhZGEgZGUgbGEgaW5jZXJ0aWR1bWJyZSB5IGVsIG1pZWRvIGFsIGZyYWNhc28uCgoqKkNvbnN0cnVpciBhbGlhbnphcy4qKiBUcmFucXVpbGl6YSB5IGNvbnN0cnV5ZSBhIHR1cyBhbWlnb3MsIHF1aWVuZXMgdGUgdHJhbnF1aWxpemFyw6FuIHkgY29uc3RydWlyw6FuIGEgY2FtYmlvLiAoU2kgbm8gbG8gaGFjZW4sIGVzIHBvc2libGUgcXVlIGRlc2VlIHBlbnNhciBlbiBlbmNvbnRyYXIgbnVldm9zIGFtaWdvcyAuLi4pCgoqKlPDqSBkdWXDsW8gZGUgdHVzIGxvZ3Jvcy4qKiBTaWd1ZSBncmFiYW5kbyB5IHJldmlzYW5kbyBhY3RpdmFtZW50ZSBsbyBxdWUgaGFzIGhlY2hvLCBsbyBxdWUgaGFzIGNvbnN0cnVpZG8geSBsb3Mgw6l4aXRvcyBxdWUgaGFzIHRlbmlkby4KCkNvbW8gcHJvZmVzb3IsIHB1ZWRlIGF5dWRhciBhIGxhcyBwZXJzb25hcyBjb24gc3Ugc8OtbmRyb21lIGRlIGltcG9zdG9yIGNvbXBhcnRpZW5kbyBoaXN0b3JpYXMgZGUgZXJyb3JlcyBxdWUgaGF5YSBjb21ldGlkbyBvIGNvc2FzIHF1ZSB0dXZvIGRpZmljdWx0YWRlcyBwYXJhIGFwcmVuZGVyLiBFc3RvIGFzZWd1cmEgYSBsYSBjbGFzZSBxdWUgZXN0w6EgYmllbiBlbmNvbnRyYXIgdGVtYXMgZGlmw61jaWxlcy4gU2VyIGFiaWVydG8gY29uIGVsIGdydXBvIHRhbWJpw6luIGdlbmVyYSBjb25maWFuemEgeSBsZXMgZGEgY29uZmlhbnphIHBhcmEgaGFjZXIgcHJlZ3VudGFzLiAoTGEgY29kaWZpY2FjacOzbiBlbiB2aXZvIGVzIGV4Y2VsZW50ZSBwYXJhIGVzdG86IGNvbW8gc2Ugc2XDsWFsw7MgZW4gbGEgU2VjY2nDs24gOC4xLCBzdXMgZXJyb3JlcyB0aXBvZ3LDoWZpY29zIGxlIG11ZXN0cmFuIGEgc3UgY2xhc2UgcXVlIHVzdGVkIGVzIGh1bWFubykuIExhcyBldmFsdWFjaW9uZXMgZm9ybWF0aXZhcyBmcmVjdWVudGVzIHRhbWJpw6luIGF5dWRhbiwgZXNwZWNpYWxtZW50ZSBzaSBsb3MgYWx1bW5vcyBsbyB2ZW4gYWp1c3RhbmRvIGxvIHF1ZSBlbnNlw7FhIG8gbGEgcmFwaWRleiBjb24gbGEgcXVlIHNlIGJhc2EgZW4gc3UgcmVzdWx0YWRvcy4KCiMjIEFtZW5hemEgbWVudGFsIHkgZXN0ZXJlb3RpcG8KCkNhcm9sIER3ZWNrIHkgb3Ryb3MgaGFuIGVzdHVkaWFkbyBsYXMgZGlmZXJlbmNpYXMgZGUgKiptZW50YWxpZGFkIGZpamEqKiB5ICoqbWVudGFsaWRhZCBkZSBjcmVjaW1pZW50byoqIGVuIGxvcyByZXN1bHRhZG9zIGRlbCBhcHJlbmRpemFqZS4gU2kgbGFzIHBlcnNvbmFzIGNyZWVuIHF1ZSBsYSBjb21wZXRlbmNpYSBlbiBhbGd1bmEgw6FyZWEgZXMgaW50csOtbnNlY2EgKGVzIGRlY2lyLCBxdWUgInRpZW5lcyBlbCBnZW4iIG8gbm8gbGEgdGllbmVzKSwgdG9kb3MgbG8gaGFjZW4gcGVvciwgaW5jbHVpZG9zIGxvcyBzdXB1ZXN0YW1lbnRlIHZlbnRham9zb3MuIExhIHJhesOzbiBlcyBxdWUgc2kgYSBhbGd1aWVuIG5vIGxlIHZhIGJpZW4gYWwgcHJpbmNpcGlvLCBhc3VtZW4gcXVlIGNhcmVjZW4gZGUgZXNhIGFwdGl0dWQsIGxvIHF1ZSBzZXNnYSBzdSByZW5kaW1pZW50byBmdXR1cm8uIFBvciBvdHJvIGxhZG8sIHNpIGxhcyBwZXJzb25hcyBjcmVlbiBxdWUgdW5hIGhhYmlsaWRhZCBzZSBhcHJlbmRlIHkgc2UgcHVlZGUgbWVqb3JhciwgbG8gaGFjZW4gbWVqb3IgZW4gcHJvbWVkaW8uCgpFeGlzdGUgbGEgcHJlb2N1cGFjacOzbiBkZSBxdWUgbGEgbWVudGFsaWRhZCBkZSBjcmVjaW1pZW50byBzZSBoYXlhIHNvYnJldmVuZGlkbywgbyBxdWUgc2VhIG11Y2hvIG3DoXMgZGlmw61jaWwgdHJhZHVjaXIgbGEgaW52ZXN0aWdhY2nDs24gYWwgcmVzcGVjdG8gYSBsYSBwcsOhY3RpY2EgZGUgbG8gcXVlIHN1cyBkZWZlbnNvcmVzIG3DoXMgZW50dXNpYXN0YXMgaGFuIGltcGxpY2FkbyBbU2lzazIwMThdLiBTaW4gZW1iYXJnbywgcGFyZWNlIHF1ZSBsb3MgZXN0dWRpYW50ZXMgY29uIHVuIGJham8gbml2ZWwgc29jaW9lY29uw7NtaWNvIG8gcXVlIGVzdMOhbiBlbiByaWVzZ28gYWNhZMOpbWljbyBwb2Ryw61hbiBiZW5lZmljaWFyc2UgZGUgbGFzIGludGVydmVuY2lvbmVzIGRlIG1lbnRhbGlkYWQuCgpPdHJvIGVmZWN0byBhbXBsaWFtZW50ZSBkaXNjdXRpZG8gZXMgbGEgKiphbWVuYXphIGRlIGVzdGVyZW90aXBvKiogW1N0ZWUyMDExXS4gUmVjb3JkYXIgYSBsYXMgcGVyc29uYXMgbG9zIGVzdGVyZW90aXBvcyBuZWdhdGl2b3MsIGluY2x1c28gZGUgbWFuZXJhIHN1dGlsLCBwdWVkZSBoYWNlcmxvcyBzZW50aXIgYW5zaW9zb3MgcG9yIGVsIHJpZXNnbyBkZSBjb25maXJtYXIgZXNvcyBlc3RlcmVvdGlwb3MsIGxvIHF1ZSBhIHN1IHZleiBwdWVkZSByZWR1Y2lyIHN1IHJlbmRpbWllbnRvLiBVbmEgdmV6IG3DoXMsIGhheSBhbGd1bmFzIHByZW9jdXBhY2lvbmVzIHNvYnJlIGxhIHJlcGxpY2FiaWxpZGFkIGRlIGxvcyBlc3R1ZGlvcyBjbGF2ZSwgeSBlbCBwcm9ibGVtYSBzZSB2ZSBhw7puIG3DoXMgbnVibGFkbyBwb3IgZWwgaGVjaG8gZGUgcXVlIGVsIHTDqXJtaW5vIHNlIGhhIHV0aWxpemFkbyBkZSBtdWNoYXMgbWFuZXJhcyBbU2hhcDIwMDddLCBwZXJvIG5hZGllIGRpcsOtYSBxdWUgbWVuY2lvbmFyIGxvcyBlc3RlcmVvdGlwb3MgZW4gY2xhc2UgYXl1ZGFyw6EgYSBsb3MgYWx1bW5vcy4KCiMjIEFjY2VzaWJpbGlkYWQKUG9uZXIgbGFzIGxlY2Npb25lcyB5IGxvcyBlamVyY2ljaW9zIGZ1ZXJhIGRlbCBhbGNhbmNlIGRlIGFsZ3VpZW4gZXMgdGFuIGRlc21vdGl2YWRvciBjb21vIGVzIHBvc2libGUsIHkgZXMgbXV5IGbDoWNpbCBoYWNlcmxvIHNpbiBkYXJzZSBjdWVudGEuIFBvciBlamVtcGxvLCBsYXMgcHJpbWVyYXMgbGVjY2lvbmVzIGRlIHByb2dyYW1hY2nDs24gZW4gbMOtbmVhIHF1ZSBlc2NyaWLDrSB0ZW7DrWFuIHVuYSB0cmFuc2NyaXBjacOzbiBkZSBsYSBuYXJyYWNpw7NuIGp1bnRvIGEgbGFzIGRpYXBvc2l0aXZhcywgcGVybyBubyBpbmNsdcOtYW4gZWwgY8OzZGlnbyBmdWVudGUgcmVhbDogZXNvIGVzdGFiYSBlbiBjYXB0dXJhcyBkZSBwYW50YWxsYSBkZSBsYXMgZGlhcG9zaXRpdmFzIGRlIFBvd2VyUG9pbnQuIFBvciBsbyB0YW50bywgYWxndWllbiBxdWUgdXNhIHVuIGxlY3RvciBkZSBwYW50YWxsYSBwb2Ryw61hIGVzY3VjaGFyIGxvIHF1ZSBzZSBkaWNlIHNvYnJlIGVsIHByb2dyYW1hLCBwZXJvIG5vIHNhYnLDrWEgcXXDqSBlcyByZWFsbWVudGUgZWwgcHJvZ3JhbWEuIE5vIHNpZW1wcmUgZXMgZmFjdGlibGUgc2F0aXNmYWNlciBsYXMgbmVjZXNpZGFkZXMgZGUgY2FkYSBhbHVtbm8sIHBlcm8gYWdyZWdhciBsZXllbmRhcyBkZXNjcmlwdGl2YXMgYSBsYXMgaW3DoWdlbmVzIHkgaGFjZXIgcXVlIGxvcyBjb250cm9sZXMgZGUgbmF2ZWdhY2nDs24gc2VhbiBhY2Nlc2libGVzIHBhcmEgbGFzIHBlcnNvbmFzIHF1ZSBubyBwdWVkZW4gdXNhciB1biBtb3VzZSBwdWVkZSBtYXJjYXIgdW5hIGdyYW4gZGlmZXJlbmNpYS4KCj4qKkNvcnRlcyBkZSBhY2VyYSoqCj4KPkhhY2VyIHF1ZSBlbCBtYXRlcmlhbCBzZWEgYWNjZXNpYmxlIGF5dWRhIGEgdG9kb3MsIG5vIHNvbG8gYSBsYXMgcGVyc29uYXMgcXVlIGVuZnJlbnRhbiBkZXNhZsOtb3MuIExvcyBjb3J0ZXMgZGUgYWNlcmEsIGxhcyBwZXF1ZcOxYXMgcmFtcGFzIGluY2xpbmFkYXMgcXVlIHVuw61hbiB1bmEgYWNlcmEgYSBsYSBjYWxsZSwgc2UgY3JlYXJvbiBvcmlnaW5hbG1lbnRlIHBhcmEgZmFjaWxpdGFyIGVsIGRlc3BsYXphbWllbnRvIGRlIGxvcyBkaXNjYXBhY2l0YWRvcyBmw61zaWNvcywgcGVybyByZXN1bHRhcm9uIGlndWFsbWVudGUgw7p0aWxlcyBwYXJhIGxhcyBwZXJzb25hcyBjb24gY29jaGVjaXRvcyB5IGNhcnJpdG9zIGRlIHN1cGVybWVyY2Fkby4gRGVsIG1pc21vIG1vZG8sIGVsIHN1YnRpdHVsYWRvIGRlIGltw6FnZW5lcyBubyBzb2xvIGF5dWRhIGEgbGFzIHBlcnNvbmFzIGNvbiBkaXNjYXBhY2lkYWQgdmlzdWFsOiB0YW1iacOpbiBoYWNlIHF1ZSBsYXMgaW3DoWdlbmVzIHNlYW4gbcOhcyBmw6FjaWxlcyBkZSBlbmNvbnRyYXIgZSBpbmRleGFyIHBhcmEgbG9zIG1vdG9yZXMgZGUgYsO6c3F1ZWRhLgoKRWwgcHJpbWVyIHkgbcOhcyBpbXBvcnRhbnRlIHBhc28gcGFyYSBoYWNlciBxdWUgbGFzIGxlY2Npb25lcyBzZWFuIGFjY2VzaWJsZXMgZXMgaW52b2x1Y3JhciBhIGxhcyBwZXJzb25hcyBjb24gZGlzY2FwYWNpZGFkIGVuIGxhIHRvbWEgZGUgZGVjaXNpb25lczogZWwgZXNsb2dhbiBuaWhpbCBkZSBub2Jpcywgc2luZSBub2JpcyAobGl0ZXJhbG1lbnRlLCAibmFkYSBwYXJhIG5vc290cm9zIHNpbiBub3NvdHJvcyIpIGVzIGFudGVyaW9yIGEgbG9zIGRlcmVjaG9zIGRlIGFjY2VzaWJpbGlkYWQsIHBlcm8gc2llbXByZSBlcyBlbCBsdWdhciBhZGVjdWFkbyBwYXJhIGNvbWllbnpvLiBBbGd1bmFzIHJlY29tZW5kYWNpb25lcyBlc3BlY8OtZmljYXMgc29uOgoKKipEZXNjdWJyZSBsbyBxdWUgbmVjZXNpdGFzIGhhY2VyLioqIENhZGEgdW5vIGRlIGVzdG9zIGNhcnRlbGVzIG9mcmVjZSBxdcOpIGhhY2VyIHkgcXXDqSBubyBoYWNlciBwYXJhIHBlcnNvbmFzIGVuIGVsIGVzcGVjdHJvIGF1dGlzdGEsIHVzdWFyaW9zIGRlIGxlY3RvcmVzIGRlIHBhbnRhbGxhIHkgcGVyc29uYXMgY29uIGJhamEgdmlzacOzbiwgZGlzY2FwYWNpZGFkZXMgZsOtc2ljYXMgbyBtb3RvcmFzLCBlamVyY2ljaW9zIGRlIGF1ZGljacOzbiB5IGRpc2xleGlhLgoKKipObyBoYWdhcyB0b2RvIGEgbGEgdmV6LioqIExhcyBtZWpvcmFzIGRlc2NyaXRhcyBlbiBlbCBwdW50byBhbnRlcmlvciBwdWVkZW4gcGFyZWNlciBiYXN0YW50ZSBkZXNhbGVudGFkb3JhcywgYXPDrSBxdWUgaGFnYSB1biBjYW1iaW8gYSBsYSB2ZXouCgoqKkhheiBsYXMgY29zYXMgZsOhY2lsZXMgcHJpbWVyby4qKiBUYW1hw7FvIGRlIGZ1ZW50ZSwgdXRpbGl6YW5kbyB1biBtaWNyw7Nmb25vIGNvbiBjbGlwIHBhcmEgcXVlIGxhcyBwZXJzb25hcyBwdWVkYW4gZXNjdWNoYXJsbyBtw6FzIGbDoWNpbG1lbnRlLCB5IGNvbXByb2JhciBzdXMgb3BjaW9uZXMgZGUgY29sb3Igc29uIGJ1ZW5vcyBsdWdhcmVzIHBhcmEgY29tZW56YXIuCgoKKipTZXBhIHF1w6kgdGFuIGJpZW4gbG8gZXN0w6EgaGFjaWVuZG8uKiogU2l0aW9zIGNvbW8gV2ViQUlNIGxlIHBlcm1pdGVuIHZlcmlmaWNhciBxdcOpIHRhbiBhY2Nlc2libGVzIHNvbiBzdXMgbWF0ZXJpYWxlcyBlbiBsw61uZWEgcGFyYSBsb3MgdXN1YXJpb3MgY29uIGRpc2NhcGFjaWRhZCB2aXN1YWwuCltDb29tMjAxMiwgQnVyZzIwMTVdIHNvbiBidWVuYXMgZ3XDrWFzIHBhcmEgZWwgZGlzZcOxbyB2aXN1YWwgZGUgYWNjZXNpYmlsaWRhZC4gU3VzIHJlY29tZW5kYWNpb25lcyBpbmNsdXllbjoKCioqRm9ybWF0ZWFyIGRvY3VtZW50b3MgY29uIGVuY2FiZXphZG9zIHJlYWxlcyB5IG90cm9zIHB1bnRvcyBkZSByZWZlcmVuY2lhKiogZW4gbHVnYXIgZGUgc2ltcGxlbWVudGUgY2FtYmlhciBsb3MgdGFtYcOxb3MgeSBlc3RpbG9zIGRlIGZ1ZW50ZS4KCioqRXZpdGUgdXNhciBzb2xvIGVsIGNvbG9yIHBhcmEgdHJhbnNtaXRpciBzaWduaWZpY2FkbyBlbiB0ZXh0byBvIGdyw6FmaWNvcy4qKiAKRW4gc3UgbHVnYXIsIHVzZSBlbCBjb2xvciBtw6FzIGRpZmVyZW50ZXMgcGF0cm9uZXMgZGUgc29tYnJlYWRvIGNydXphZG8gKGxvIHF1ZSB0YW1iacOpbiBoYWNlIHF1ZSBlbCBtYXRlcmlhbCBzZWEgY29tcHJlbnNpYmxlIGN1YW5kbyBzZSBpbXByaW1lIGVuIGJsYW5jbyB5IG5lZ3JvKS4KCioqRWxpbWluYXIgZWxlbWVudG9zIGlubmVjZXNhcmlvcyoqICBlbiBsdWdhciBkZSBzaW1wbGVtZW50ZSBoYWNlcmxvcyBpbnZpc2libGVzLCBwb3JxdWUgbG9zIGxlY3RvcmVzIGRlIHBhbnRhbGxhIGEgbWVudWRvIGxvcyBkaWNlbiBlbiB2b3ogYWx0YS4KCioqUGVybWl0aXIgZWwgcml0bW8geSBsYSByZXBldGljacOzbioqIHBhcmEgcGVyc29uYXMgY29uIHByb2JsZW1hcyBkZSBsZWN0dXJhIG8gYXVkaWNpw7NuLgoKKipJbmNsdXllIG5hcnJhY2nDs24gZGUgYWNjacOzbiBlbiBwYW50YWxsYSBlbiB2aWRlb3MqKiAoeSBoYWJsZSBtaWVudHJhcyBlc2NyaWJlIGN1YW5kbyBjb2RpZmlxdWUgZW4gdml2bykuCgojIyBDdWNoYXJhcwoKRW4gMjAwMywgQ2hyaXN0aW5lIE1pc2VyYW5kaW5vIGNvbWVuesOzIGEgdXNhciBjdWNoYXJhcyBjb21vIHVuYSBmb3JtYSBkZSBleHBsaWNhciBjw7NtbyBlcyB2aXZpciBjb24gdW5hIGVuZmVybWVkYWQgY3LDs25pY2EuIExhcyBwZXJzb25hcyBzYW5hcyBjb21pZW56YW4gY2FkYSBkw61hIGNvbiB1biBzdW1pbmlzdHJvIGlsaW1pdGFkbyBkZSBjdWNoYXJhcywgcGVybyBsYXMgcGVyc29uYXMgY29uIGx1cHVzIHUgb3RyYXMgYWZlY2Npb25lcyBkZWJpbGl0YW50ZXMgc29sbyB0aWVuZW4gdW5hcyBwb2NhcywgeSB0b2RvIGxvIHF1ZSBoYWNlbiBsZXMgY3Vlc3RhIHVuYS4gwr9MZXZhbnRhcnNlIGRlIGxhIGNhbWE/IEVzbyBlcyB1bmEgY3VjaGFyYS4gSGFjaWVuZG8gdW5hIGNvbWlkYT8gRXNhIGVzIG90cmEgY3VjaGFyYSwgeSBtdXkgcHJvbnRvLCBzZSB0ZSBhY2FiYS4KCj5ObyBwdWVkZXMgc2ltcGxlbWVudGUgcG9uZXJ0ZSBsYSByb3BhIGN1YW5kbyBlc3TDoXMgZW5mZXJtbyAuLi4gU2kgbWUgZHVlbGVuIGxhcyBtYW5vcyBlc2UgZMOtYSwgbG9zIGJvdG9uZXMgZXN0w6FuIGZ1ZXJhIGRlIGRpc2N1c2nDs24uIFNpIHRlbmdvIG1vcmV0b25lcyBlc2UgZMOtYSwgbmVjZXNpdG8gdXNhciBtYW5nYXMgbGFyZ2FzLCB5IHNpIHRlbmdvIGZpZWJyZSwgbmVjZXNpdG8gdW4gc3XDqXRlciBwYXJhIG1hbnRlbmVyIGVsIGNhbG9yLCBldGMuIFNpIG1pIGNhYmVsbG8gc2UgZXN0w6EgY2F5ZW5kbywgbmVjZXNpdG8gcGFzYXIgbcOhcyB0aWVtcG8gcGFyYSBwYXJlY2VyIHByZXNlbnRhYmxlLCB5IGx1ZWdvIGRlYmVzIHRlbmVyIGVuIGN1ZW50YSBvdHJvcyA1IG1pbnV0b3MgcGFyYSBzZW50aXJ0ZSBtYWwgZGUgcXVlIHRlIHRvbcOzIDIgaG9yYXMgaGFjZXIgdG9kbyBlc3RvLgoKQ29tbyBoYSBhcmd1bWVudGFkbyBFbGl6YWJldGggUGF0aXRzYXMsIGxhcyBwZXJzb25hcyBxdWUgdGllbmVuIG11Y2hhcyBjdWNoYXJhcyBwdWVkZW4gYWN1bXVsYXIgbcOhcywgcGVybyBsYXMgcGVyc29uYXMgY3V5byBzdW1pbmlzdHJvIGVzIGxpbWl0YWRvIHB1ZWRlbiB0ZW5lciBkaWZpY3VsdGFkZXMgcGFyYSBzYWxpciBhZGVsYW50ZS4gQ3VhbmRvIGRpc2XDsWUgY2xhc2VzIHkgZWplcmNpY2lvcywgcmVjdWVyZGUgcXVlIGFsZ3Vub3MgZGUgc3VzIGFsdW1ub3MgcHVlZGVuIHRlbmVyIG9ic3TDoWN1bG9zIGbDrXNpY29zIG8gbWVudGFsZXMgcXVlIG5vIHNvbiBvYnZpb3MuIEVuIGNhc28gZGUgZHVkYSwgcHJlZ3VudGU6IGVzIGNhc2kgc2VndXJvIHF1ZSB0aWVuZW4gbcOhcyBleHBlcmllbmNpYSBjb24gbG8gcXVlIGZ1bmNpb25hIHkgbG8gcXVlIG5vIGZ1bmNpb25hIHF1ZSBuYWRpZS4KCiMjIEluY2x1c2l2aWRhZApMYSBpbmNsdXNpw7NuIGVzIHVuYSBwb2zDrXRpY2EgZGUgaW5jbHVzacOzbiBkZSBwZXJzb25hcyBxdWUgZGUgb3RybyBtb2RvIHBvZHLDrWFuIHNlciBleGNsdWlkYXMgbyBtYXJnaW5hZGFzLiBFbiBpbmZvcm3DoXRpY2EsIHNpZ25pZmljYSBoYWNlciB1biBlc2Z1ZXJ6byBwb3NpdGl2byBwYXJhIHNlciBtw6FzIGFjb2dlZG9yIGNvbiBsYXMgbXVqZXJlcywgbG9zIGdydXBvcyByYWNpYWxlcyBvIMOpdG5pY29zIHN1YnJlcHJlc2VudGFkb3MsIGxhcyBwZXJzb25hcyBjb24gZGl2ZXJzYXMgb3JpZW50YWNpb25lcyBzZXh1YWxlcywgbGFzIHBlcnNvbmFzIG1heW9yZXMsIGxvcyBxdWUgZW5mcmVudGFuIGRlc2Fmw61vcyBmw61zaWNvcywgbG9zIHF1ZSBhbnRlcmlvcm1lbnRlIGVzdGFiYW4gZW5jYXJjZWxhZG9zLCBsb3MgZWNvbsOzbWljYW1lbnRlIGRlc2Zhdm9yZWNpZG9zIHkgdG9kb3MgbG9zIGRlbcOhcyBxdWUgbm8gTm8gc2UgYWp1c3RhIGFsIGdydXBvIGRlbW9ncsOhZmljbyBtYXNjdWxpbm8gLyBhc2nDoXRpY28gYWZsdWVudGUgZGUgU2lsaWNvbiBWYWxsZXkuIExhIGZpZ3VyYSBbZjogbW90aXZhY2lvbi1tdWplcmVzLWVuLWNzXSAoZGUgTlBSKSBpbHVzdHJhIGdyw6FmaWNhbWVudGUgbG9zIGVmZWN0b3MgZGUgbGEgY3VsdHVyYSBleGNsdXllbnRlIGRlIGxhIGluZm9ybcOhdGljYSBlbiBsYXMgbXVqZXJlcy4KCiFbTXVqZXJlc10oLi9pbWdfdHJhbmluZy93b21lbi1jb2RpbmcucG5nKQoKCltMZWUyMDE3XSBlcyB1bmEgZ3XDrWEgYnJldmUgeSBwcsOhY3RpY2EgcGFyYSBoYWNlciBlc28gY29uIHJlZmVyZW5jaWFzIGEgbGEgbGl0ZXJhdHVyYSBkZSBpbnZlc3RpZ2FjacOzbi4gTGFzIHByw6FjdGljYXMgcXVlIGRlc2NyaWJlIGF5dWRhbiBhIGxvcyBhbHVtbm9zIHF1ZSBwZXJ0ZW5lY2VuIGEgdW5vIG8gbcOhcyBncnVwb3MgbWFyZ2luYWRvcyBvIGV4Y2x1aWRvcywgcGVybyB0YW1iacOpbiBheXVkYW4gYSBtb3RpdmFyIGEgbG9zIGRlbcOhcy4gRXN0w6FuIHJlZGFjdGFkb3MgZW4gdMOpcm1pbm9zIGRlIGN1cnNvcyBhIGxhcmdvIHBsYXpvLCBwZXJvIG11Y2hvcyBzZSBwdWVkZW4gYXBsaWNhciBlbiB0YWxsZXJlcyB5IG90cm9zIGVudG9ybm9zIGRlIGNhbXBvIGxpYnJlOgoKKipQaWRhIGEgbG9zIGFsdW1ub3MgcXVlIGxlIGVudsOtZW4gdW4gY29ycmVvIGVsZWN0csOzbmljbyBhbnRlcyBkZWwgdGFsbGVyKiogcGFyYSBleHBsaWNhciBjw7NtbyBjcmVlbiBxdWUgbGEgY2FwYWNpdGFjacOzbiBwb2Ryw61hIGF5dWRhcmxvcyBhIGFsY2FuemFyIHN1cyBvYmpldGl2b3MuCgoqKlJldmlzYSB0dXMgbm90YXMqKiBwYXJhIGFzZWd1cmFyc2UgZGUgcXVlIGVzdMOpbiBsaWJyZXMgZGUgcHJvbm9tYnJlcyBkZSBnw6luZXJvLCBpbmNsdXlhIG5vbWJyZXMgY3VsdHVyYWxtZW50ZSBkaXZlcnNvcywgZXRjLgoKKipIYWdhIGhpbmNhcGnDqSBlbiBxdWUgbG8gcXVlIGltcG9ydGEgZXMgbGEgdmVsb2NpZGFkIGEgbGEgcXVlIGVzdMOhbiBhcHJlbmRpZW5kbywqKiBubyBsYXMgdmVudGFqYXMgbyBkZXN2ZW50YWphcyBxdWUgdGVuw61hbiBjdWFuZG8gY29tZW56YXJvbi4KCioqRm9tZW50YXIgbGEgcHJvZ3JhbWFjacOzbiBkZSBwYXJlcywqKiBwZXJvIGRlbXXDqXN0cmFsbyBwcmltZXJvIHBhcmEgcXVlIGxvcyBhbHVtbm9zIGNvbXByZW5kYW4gbG9zIHJvbGVzIGRlIGNvbmR1Y3RvciB5IG5hdmVnYWRvci4KCioqTWl0aWdhciBhY3RpdmFtZW50ZSBlbCBjb21wb3J0YW1pZW50byBxdWUgYWxndW5vcyBhbHVtbm9zIHB1ZWRlbiBlbmNvbnRyYXIgaW50aW1pZGFudGUsKiogcC5lai4gdXNvIGRlIGplcmdhIG8gInByZWd1bnRhcyIgcXVlIGVuIHJlYWxpZGFkIHNlIGxlcyBwaWRlIHF1ZSBtdWVzdHJlbiBjb25vY2ltaWVudG8uCgpVbmEgZm9ybWEgZGUgYXBveWFyIGEgbG9zIGFsdW1ub3MgZGUgZ3J1cG9zIG1hcmdpbmFkb3MgZXMgaGFjZXIgcXVlIGxhcyBwZXJzb25hcyBzZSBpbnNjcmliYW4gZW4gdGFsbGVyZXMgZW4gZ3J1cG9zIGVuIGx1Z2FyIGRlIGhhY2VybG8gaW5kaXZpZHVhbG1lbnRlLiBEZSBlc2EgbWFuZXJhLCB0b2RvcyBlbiBsYSBzYWxhIHNhYmVuIGRlIGFudGVtYW5vIHF1ZSBlc3RhcsOhbiBjb24gcGVyc29uYXMgZGUgY29uZmlhbnphLCBsbyBxdWUgYXVtZW50YSBsYXMgcG9zaWJpbGlkYWRlcyBkZSBxdWUgcmVhbG1lbnRlIHZlbmdhbi4gVGFtYmnDqW4gYXl1ZGEgZGVzcHXDqXMgZGVsIHRhbGxlcjogc2kgbGFzIHBlcnNvbmFzIHZpZW5lbiBjb24gc3VzIGFtaWdvcyBvIGNvbGVnYXMsIHB1ZWRlbiB0cmFiYWphciBqdW50YXMgcGFyYSB1c2FyIGxvIHF1ZSBoYW4gYXByZW5kaWRvLgoKTcOhcyBmdW5kYW1lbnRhbG1lbnRlLCBsb3MgYXV0b3JlcyBkZSBsYXMgbGVjY2lvbmVzIGRlYmVuIHRlbmVyIGVuIGN1ZW50YSBsYSBzaXR1YWNpw7NuIGRlIHRvZG9zLiBQb3IgZWplbXBsbywgW0RpU2EyMDE0YV0gZGVzY3VicmnDsyBxdWUgZWwgNjUlIGRlIGxvcyBwYXJ0aWNpcGFudGVzIGFmcm9hbWVyaWNhbm9zIHZhcm9uZXMgZW4gdW4gcHJvZ3JhbWEgZGUgcHJ1ZWJhIGRlIGp1ZWdvcyBlc3R1ZGlhcm9uIGluZm9ybcOhdGljYSwgZW4gcGFydGUgcG9ycXVlIGVsIGFzcGVjdG8gZGUganVlZ28gZGVsIHByb2dyYW1hIGVyYSBhbGdvIHF1ZSBzdXMgY29tcGHDsWVyb3MgcmVzcGV0YWJhbi4gW0xhY2gyMDE4XSBleHBsb3LDsyBkb3MgZXN0cmF0ZWdpYXMgZ2VuZXJhbGVzIHBhcmEgY3JlYW5kbyBjb250ZW5pZG8gaW5jbHVzaXZvIHkgbG9zIHJpZXNnb3MgYXNvY2lhZG9zIGNvbiBlbGxvczoKCioqUmVwcmVzZW50YWNpw7NuIGRlIGxhIGNvbXVuaWRhZCoqIApkZXN0YWNhIGxhcyBpZGVudGlkYWRlcyBzb2NpYWxlcywgbGFzIGhpc3RvcmlhcyB5IGxhcyByZWRlcyBjb211bml0YXJpYXMgZGUgbG9zIGFsdW1ub3MgcXVlIHV0aWxpemFuIG1lbnRvcmVzIGRlc3B1w6lzIGRlIGxhIGVzY3VlbGEgbyBtb2RlbG9zIGEgc2VndWlyIGRlIGxvcyB2ZWNpbmRhcmlvcyBkZSBsb3MgYWx1bW5vcywgbyBhY3RpdmlkYWRlcyBxdWUgdXRpbGl6YW4gbmFycmF0aXZhcyBlIGhpc3RvcmlhcyBkZSBsYSBjb211bmlkYWQgY29tbyBiYXNlIHBhcmEgdW4gcHJveWVjdG8gaW5mb3Jtw6F0aWNvLiBFbCBtYXlvciByaWVzZ28gY29uIGVzdGUgZW5mb3F1ZSBlcyBsYSBzdXBlcmZpY2lhbGlkYWQsIHAuIHVzYW5kbyBjb21wdXRhZG9yYXMgcGFyYSBjcmVhciBwcmVzZW50YWNpb25lcyBkZSBkaWFwb3NpdGl2YXMgZW4gbHVnYXIgZGUgaGFjZXIgY29tcHV0YWNpw7NuIHJlYWwuCgoqKkludGVncmFjacOzbiBjb21wdXRhY2lvbmFsKiogCmluY29ycG9yYSBpZGVhcyBkZSBsYSBjb211bmlkYWQgZGUgYWx1bW5vcywgY29tbyBsYSByZXByb2R1Y2Npw7NuIGRlIGRpc2XDsW9zIGdyw6FmaWNvcyBhdXTDs2N0b25vcyBlbiB1biBlbnRvcm5vIGRlIHByb2dyYW1hY2nDs24gdmlzdWFsLiBFbCBtYXlvciByaWVzZ28gYXF1w60gZXMgbGEgYXByb3BpYWNpw7NuIGN1bHR1cmFsLCBwLiB1c2FuZG8gcHLDoWN0aWNhcyBzaW4gcmVjb25vY2VyIGxvcyBvcsOtZ2VuZXMuClNpIHRpZW5lIGR1ZGFzLCBwcmVndW50ZSBhIHN1cyBhbHVtbm9zIHkgbWllbWJyb3MgZGUgbGEgY29tdW5pZGFkIHF1w6kgY3JlZW4gcXVlIGRlYmVyw61hbiBoYWNlci4gVm9sdmVyZW1vcyBhIGVzdG8gZW4gZWwgQ2Fww610dWxvIDEzLgoKPioqQ29uZHVjdGEgY29tbyBhY2Nlc2liaWxpZGFkKioKPgo+RGlqaW1vcyBlbiBsYSBTZWNjacOzbiA5LjEgcXVlIGxhcyBjbGFzZXMgZGViZXLDrWFuIGFwbGljYXIgdW4gQ8OzZGlnbyBkZSBDb25kdWN0YSBjb21vIGVsIGRlbCBBcMOpbmRpY2UgMTcuIEVzdGEgZXMgdW5hIGZvcm1hIGRlIGFjY2VzaWJpbGlkYWQ6IG1pZW50cmFzIHF1ZSBsb3Mgc3VidMOtdHVsb3MgaGFjZW4gcXVlIGVsIHZpZGVvIHNlYSBhY2Nlc2libGUgcGFyYSBsYXMgcGVyc29uYXMgY29uIGRpc2NhcGFjaWRhZCBhdWRpdGl2YSwgdW4gQ8OzZGlnbyBkZSBDb25kdWN0YSBoYWNlIHF1ZSBsYXMgbGVjY2lvbmVzIHNlYW4gYWNjZXNpYmxlcyBwYXJhIGxhcyBwZXJzb25hcyBxdWUgZGUgbG8gY29udHJhcmlvIHF1ZWRhcsOhIG1hcmdpbmFkby4KCiMjIFBhc2FuZG8gZWwgbW9kZWxvIGRlIGTDqWZpY2l0CkRlcGVuZGllbmRvIGRlIGVuIHF1acOpbiBjb25mw61lLCBzb2xvIGVudHJlIGVsIDEyIHkgZWwgMTglIGRlIGxhcyBwZXJzb25hcyBxdWUgb2J0aWVuZW4gdMOtdHVsb3MgZW4gaW5mb3Jtw6F0aWNhIHNvbiBtdWplcmVzLCBxdWUgZXMgbWVub3MgZGUgbGEgbWl0YWQgZGVsIHBvcmNlbnRhamUgdmlzdG8gYSBtZWRpYWRvcyBkZSBsYSBkw6ljYWRhIGRlIDE5ODAgKEZpZ3VyYSBbZjogbW90aXZhY2nDs24tZ8OpbmVyb10sIGRlIFtSb2JlMjAxN10pLiBZIGxvcyBwYcOtc2VzIG9jY2lkZW50YWxlcyBzb24gbG9zIG3DoXMgZXh0cmHDsW9zIHBvciB0ZW5lciB1biBwb3JjZW50YWplIHRhbiBiYWpvIGRlIG11amVyZXMgZW4gaW5mb3Jtw6F0aWNhOiBsYXMgbXVqZXJlcyB0b2RhdsOtYSBzb24gYSBtZW51ZG8gZGVsIDMwIGFsIDQwJSBkZSBsb3MgZXN0dWRpYW50ZXMgZGUgaW5mb3Jtw6F0aWNhIGVuIG90cm9zIGx1Z2FyZXMgW0dhbHAyMDAyLCBWYXJtMjAxNV0uCgohW0Vucm9sbWVudF0oLi9pbWdfdHJhbmluZy9lbnJvbGxtZW50LnBuZykKCkNvbW8gZXMgcG9jbyBwcm9iYWJsZSBxdWUgbGFzIG11amVyZXMgaGF5YW4gY2FtYmlhZG8gZHLDoXN0aWNhbWVudGUgZW4gbG9zIMO6bHRpbW9zIDMwIGHDsW9zLCB0ZW5lbW9zIHF1ZSBidXNjYXIgY2F1c2FzIGVzdHJ1Y3R1cmFsZXMgcGFyYSBlbnRlbmRlciBxdcOpIHNhbGnDsyBtYWwgeSBjw7NtbyBzb2x1Y2lvbmFybG8uIFVuYSBleHBsaWNhY2nDs24gZXMgbGEgZm9ybWEgZW4gcXVlIGxhcyBjb21wdXRhZG9yYXMgZG9tw6lzdGljYXMgc2UgY29tZXJjaWFsaXphcm9uIGNvbW8gImp1Z3VldGVzIHBhcmEgbmnDsW9zIiBhIHBhcnRpciBkZSBsYSBkw6ljYWRhIGRlIDE5ODAgW01hcmcyMDAzXTsgb3RyYSBlcyBsYSBmb3JtYSBlbiBxdWUgbG9zIGRlcGFydGFtZW50b3MgZGUgaW5mb3Jtw6F0aWNhIHJlc3BvbmRpZXJvbiBhbCBjcmVjaW1pZW50byBleHBsb3Npdm8gZGUgbGEgbWF0csOtY3VsYSBlbiBsYSBkw6ljYWRhIGRlIDE5ODAgeSBudWV2YW1lbnRlIGVuIGxhIGTDqWNhZGEgZGUgMjAwMCBjYW1iaWFuZG8gbG9zIHJlcXVpc2l0b3MgZGUgYWRtaXNpw7NuIFtSb2JlMjAxN10uIE5pbmd1bm8gZGUgZXN0b3MgZmFjdG9yZXMgcHVlZGUgcGFyZWNlciBkcmFtw6F0aWNvIHBhcmEgbGFzIHBlcnNvbmFzIHF1ZSBubyBzZSB2ZW4gYWZlY3RhZGFzIHBvciBlbGxvcywgcGVybyBhY3TDumFuIGNvbW8gZWwgZ290ZW8gY29uc3RhbnRlIGRlIGFndWEgc29icmUgdW5hIHBpZWRyYTogY29uIGVsIHRpZW1wbywgZXJvc2lvbmFuIGxhIG1vdGl2YWNpw7NuIHksIGNvbiBlbGxvLCBsYSBwYXJ0aWNpcGFjacOzbi4KCkVsIHByaW1lciB5IG3DoXMgaW1wb3J0YW50ZSBwYXNvIHBhcmEgc29sdWNpb25hciBlc3RvIGVzIGRlamFyIGRlIHBlbnNhciBlbiB0w6lybWlub3MgZGUgdW5hICJ0dWJlcsOtYSBjb24gZnVnYXMiIFtNaWxsMjAxNV0uIEVuIHTDqXJtaW5vcyBtw6FzIGdlbmVyYWxlcywgZGViZW1vcyBzdXBlcmFyIHVuICoqbW9kZWxvIGRlIGTDqWZpY2l0KiosIGVzIGRlY2lyLCBkZWphciBkZSBwZW5zYXIgcXVlIGxvcyBtaWVtYnJvcyBkZSBsb3MgZ3J1cG9zIHN1YnJlcHJlc2VudGFkb3MgY2FyZWNlbiBkZSBhbGdvIHksIHBvciBsbyB0YW50bywgc29uIHJlc3BvbnNhYmxlcyBkZSBubyBhdmFuemFyLiBDcmVlciBlc28gcG9uZSBsYSBjYXJnYSBzb2JyZSBsYXMgcGVyc29uYXMgcXVlIHlhIHRpZW5lbiBxdWUgaGFjZXIgdW4gdHJhYmFqbyBleHRyYSBwYXJhIHN1cGVyYXIgbGFzIGRlc2lndWFsZGFkZXMgZXN0cnVjdHVyYWxlcyB5IChubyBwb3IgY2FzdWFsaWRhZCkgbGVzIGRhIGEgcXVpZW5lcyBzZSBiZW5lZmljaWFuIGRlIGxvcyBhY3VlcmRvcyBhY3R1YWxlcyB1bmEgZXhjdXNhIHBhcmEgbm8gdmVyc2UgZGVtYXNpYWRvIGRlIGNlcmNhLgoKPioqUmVlc2NyaWJpZW5kbyBsYSBoaXN0b3JpYSoqCj4KPltBYmJhMjAxMl0gZGVzY3JpYmUgbGFzIGNhcnJlcmFzIHkgbG9ncm9zIGRlIGxhcyBtdWplcmVzIHF1ZSBkaWVyb24gZm9ybWEgYSBsYSBoaXN0b3JpYSB0ZW1wcmFuYSBkZSBsYSBpbmZvcm3DoXRpY2EsIHBlcm8gcXVlIGNvbiBkZW1hc2lhZGEgZnJlY3VlbmNpYSBzZSBoYW4gZGVzY2FydGFkbyBkZSBlbGxhOyBbRW5zbTIwMDMsIEVuc20yMDEyXSBkZXNjcmliZSBjw7NtbyBsYSBwcm9ncmFtYWNpw7NuIHNlIGNvbnZpcnRpw7MgZGUgdW5hIHByb2Zlc2nDs24gZmVtZW5pbmEgYSBtYXNjdWxpbmEgZW4gbGEgZMOpY2FkYSBkZSAxOTYwICwgbWllbnRyYXMgcXVlIFtIaWNrMjAxOF0gYW5hbGl6YSBjw7NtbyBHcmFuIEJyZXRhw7FhIHBlcmRpw7Mgc3UgZG9taW5pbyB0ZW1wcmFubyBlbiBpbmZvcm3DoXRpY2EgYWwgZGlzY3JpbWluYXIgc2lzdGVtw6F0aWNhbWVudGUgYSBzdXMgdHJhYmFqYWRvcmVzIG3DoXMgY2FsaWZpY2Fkb3M6IGxhcyBtdWplcmVzLiAoVmVyIFtNaWx0MjAxOF0gcGFyYSB1bmEgcmV2aXNpw7NuIGRlIGxvcyB0cmVzIGxpYnJvcykuIERpc2N1dGlyIGVzdGEgaGlzdG9yaWEgaGFjZSBxdWUgYWxndW5vcyBob21icmVzIGVuIGluZm9ybcOhdGljYSBzZSBzaWVudGFuIG11eSBpbmPDs21vZG9zOyBlbiBtaSBvcGluacOzbiwgZXNhIGVzIHVuYSBidWVuYSByYXrDs24gcGFyYSBoYWNlcmxvLgoKTGEgbWlzb2dpbmlhIGVuIGxvcyB2aWRlb2p1ZWdvcywgZWwgdXNvIGRlbCAiYWp1c3RlIGN1bHR1cmFsIiBlbiBsYSBjb250cmF0YWNpw7NuIHBhcmEgZGlzY3VscGFyIGxvcyBwcmVqdWljaW9zIGNvbnNjaWVudGVzIG8gaW5jb25zY2llbnRlcywgdW5hIGN1bHR1cmEgZGUgc2lsZW5jaW8gZW4gdG9ybm8gYWwgYWNvc28geSBsYSBjcmVjaWVudGUgZGVzaWd1YWxkYWQgZW4gbGEgc29jaWVkYWQgcXVlIHByb2R1Y2UgcHJpdmlsZWdpb3MgcHJlcGFyYXRvcmlvcyAoU2VjY2nDs24gOS41KSBubyBzb24gY3VscGEgZGUgbmluZ3VuYSBwZXJzb25hLCBwZXJvIGFycmVnbGFybG9zIGVzIHJlc3BvbnNhYmlsaWRhZCBkZSB0b2Rvcy4gQ29tbyBwcm9mZXNvciwgdGllbmVzIG3DoXMgcG9kZXIgcXVlIGxhIG1heW9yw61hOyBFc3RlIHRhbGxlciB0aWVuZSBleGNlbGVudGVzIGNvbnNlam9zIHByw6FjdGljb3Mgc29icmUgY8OzbW8gc2VyIHVuIGJ1ZW4gYWxpYWRvLCB5IHN1IGNvbnNlam8gZXMgcHJvYmFibGVtZW50ZSBtw6FzIGltcG9ydGFudGUgcXVlIGN1YWxxdWllciBjb3NhIHF1ZSBlc3RlIGxpYnJvIGxlIGVuc2XDsWUgc29icmUgbGEgZW5zZcOxYW56YS4KCgojIyBFamVyY2ljaW9zCiMjIyBUYXJlYXMgYXV0w6ludGljYXMgKHBhcmVzIC8gMTUpCjEuIEVuIHBhcmVqYXMsIGVudW1lcmUgbWVkaWEgZG9jZW5hIGRlIGNvc2FzIHF1ZSBoaXpvIGVzdGEgc2VtYW5hIHF1ZSB1dGlsaXphbiBsYXMgaGFiaWxpZGFkZXMgcXVlIGVuc2XDsWEuCgoyLiBDb2xvcXVlIHN1cyBhcnTDrWN1bG9zIGVuIHVuYSBjdWFkcsOtY3VsYSBkZSAyeDIgZGUgInRpZW1wbyBwYXJhIGRvbWluYXIiIHkgInV0aWxpZGFkIi4gwr9Ew7NuZGUgZXN0w6FzIGRlIGFjdWVyZG8geSBlbiBkZXNhY3VlcmRvPwoKIyMjIE5lY2VzaWRhZGVzIHByaW5jaXBhbGVzICh0b2RhIGxhIGNsYXNlIC8gMTApClBhbG9tYSBNZWRpbmEgaWRlbnRpZmljYSBzZWlzIG5lY2VzaWRhZGVzIGLDoXNpY2FzIHBhcmEgbGFzIHBlcnNvbmFzIGVuIGVsIHRyYWJham86IHBlcnRlbmVuY2lhLCBtZWpvcmEgKGVzIGRlY2lyLCBwcm9ncmVzYXIpLCBlbGVjY2nDs24sIGlndWFsZGFkLCBwcmV2aXNpYmlsaWRhZCBlIGltcG9ydGFuY2lhLiBEZXNwdcOpcyBkZSBsZWVyIHN1IGRlc2NyaXBjacOzbiBkZSBlc3Rvcywgb3Jkw6luZWxvcyBkZSBtYXlvciBhIG1lbm9yIGltcG9ydGFuY2lhIHBhcmEgdXN0ZWQgcGVyc29uYWxtZW50ZSwgbHVlZ28gY29tcGFyZSBsYXMgY2xhc2lmaWNhY2lvbmVzIGNvbiBzdXMgcGFyZXMuIMK/Q8OzbW8gY3JlZXMgcXVlIHNlIGNvbXBhcmEgdHUgY2xhc2lmaWNhY2nDs24gY29uIGxhIGRlIHR1cyBhbHVtbm9zPwoKIyMjIEltcGxlbWVudGFyIHVuYSBlc3RyYXRlZ2lhIHBhcmEgbGEgaW5jbHVzacOzbiAoaW5kaXZpZHVhbCAvIDUpCkVsaWphIHVuYSBhY3RpdmlkYWQgbyBjYW1iaW8gZW4gbGEgcHLDoWN0aWNhIGRlIFtMZWUyMDE3XSBlbiBlbCBxdWUgbGUgZ3VzdGFyw61hIHRyYWJhamFyLiBQb25nYSB1biByZWNvcmRhdG9yaW8gZW4gc3UgY2FsZW5kYXJpbyB0cmVzIG1lc2VzIGVuIGVsIGZ1dHVybyBwYXJhIHByZWd1bnRhcnNlIHNpIGhhIGhlY2hvIGFsZ28gYWwgcmVzcGVjdG8uCgojIyMgRGVzcHXDqXMgZGVsIGhlY2hvICh0aGluay1wYWlyLXNoYXJlIC8gMjApCjEuIFBpZW5zZSBlbiB1biBjdXJzbyBxdWUgdG9tw7MgZW4gZWwgcGFzYWRvIGUgaWRlbnRpZmlxdWUgdW5hIGNvc2EgcXVlIGVsIG1hZXN0cm8gaGl6byBxdWUgbG8gZGVzbW90aXbDsy4gVG9tZSBub3RhcyBzb2JyZSBsbyBxdWUgcG9kcsOtYSBoYWJlcnNlIGhlY2hvIGRlc3B1w6lzIHBhcmEgY29ycmVnaXIgbGEgc2l0dWFjacOzbi4KCjIuIEVtcGFyw6lqZXNlIGNvbiBzdSB2ZWNpbm8geSBjb21wYXJlIGhpc3RvcmlhcywgbHVlZ28gYWdyZWd1ZSBzdXMgY29tZW50YXJpb3MgYSB1biBjb25qdW50byBkZSBub3RhcyBjb21wYXJ0aWRhcyBwb3IgdG9kYSBsYSBjbGFzZS4KCjMuIFJldmlzZSBsb3MgY29tZW50YXJpb3MgZW4gbGFzIG5vdGFzIGNvbXBhcnRpZGFzIGNvbW8gdW4gZ3J1cG8uIERlc3RhcXVlIHkgZGlzY3V0YSBhbGd1bmFzIGRlIGxhcyBjb3NhcyBxdWUgcG9kcsOtYW4gaGFiZXJzZSBoZWNobyBkZSBtYW5lcmEgZGlmZXJlbnRlLgoKNC4gwr9DcmVlcyBxdWUgaGFjZXIgZXN0byB0ZSBheXVkYXLDoSBhIG1hbmVqYXIgc2l0dWFjaW9uZXMgY29tbyBlc3RhcyBlbiBlbCBmdXR1cm8/CgojIyMgUmVjb3JyZXIgbGEgcnV0YSAodG9kYSBsYSBjbGFzZSAvIDE1KQpFbmN1ZW50cmUgZWwgcHVudG8gZGUgZW50cmVnYSBkZSB0cmFuc3BvcnRlIHDDumJsaWNvIG3DoXMgY2VyY2FubyBhIHN1IGVkaWZpY2lvIHkgY2FtaW5lIGRlc2RlIGFsbMOtIGEgc3Ugb2ZpY2luYSB5IGx1ZWdvIGFsIGJhw7FvIG3DoXMgY2VyY2FubywgdG9tYW5kbyBub3RhcyBzb2JyZSBjb3NhcyBxdWUgY3JlZSBxdWUgc2Vyw61hbiBkaWbDrWNpbGVzIHBhcmEgYWxndWllbiBjb24gcHJvYmxlbWFzIGRlIG1vdmlsaWRhZC4gQWhvcmEgcGlkYSBwcmVzdGFkYSB1bmEgc2lsbGEgZGUgcnVlZGFzIHkgcmVwaXRhIGVsIHZpYWplLiDCv0N1w6FuIGNvbXBsZXRhIGZ1ZSBzdSBsaXN0YSBkZSBlamVyY2ljaW9zPyDCv1kgbm90YXJvbiBxdWUgbGEgcHJpbWVyYSBvcmFjacOzbiBlbiBlc3RlIGVqZXJjaWNpbyBhc3Vtw61hIHF1ZSByZWFsbWVudGUgcG9kw61hbiBjYW1pbmFyPwoKIyMjIMK/UXVpZW4gZGVjaWRlPyAodG9kYSBsYSBjbGFzZSAvIDE1KQpFbiBbTGl0dDIwMDRdLCBLZW5uZXRoIFdlc3NvbiBlc2NyaWJpw7M6ICJTaSBsb3MgbmnDsW9zIHBvYnJlcyBkZWwgY2VudHJvIGRlIGxhIGNpdWRhZCBzdXBlcmFyYW4gc2lzdGVtw6F0aWNhbWVudGUgYSBsb3MgbmnDsW9zIGRlIGxvcyBob2dhcmVzIHN1YnVyYmFub3Mgcmljb3MgZW4gcHJ1ZWJhcyBlc3RhbmRhcml6YWRhcywgwr9hbGd1aWVuIGVzIHRhbiBpbmdlbnVvIGNvbW8gcGFyYSBjcmVlciBxdWUgYcO6biBpbnNpc3RpcsOtYW1vcyBlbiB1c2FyIGVzdGFzIHBydWViYXMgY29tbyBpbmRpY2Fkb3JlcyBkZSDDqXhpdG8/IiBMZWEgZXN0ZSBhcnTDrWN1bG8gZGUgQ2FtZXJvbiBDb3R0cmlsbCB5IGx1ZWdvIGRlc2NyaWJhIHVuIGVqZW1wbG8gZGUgc3UgcHJvcGlhIGV4cGVyaWVuY2lhIGRlIGV2YWx1YWNpb25lcyAib2JqZXRpdmFzIiBxdWUgcmVmb3J6w7MgZWwgc3RhdHVzIHF1by4KCiMjIyBFc3RlcmVvdGlwb3MgY29tdW5lcyAocGFyZXMgLyAxMCkKQWxndW5hcyBwZXJzb25hcyB0b2RhdsOtYSBkaWNlbjogIkVzIHRhbiBzaW1wbGUgcXVlIGluY2x1c28gdHUgYWJ1ZWxhIHBvZHLDrWEgdXNhcmxvIi4gRW4gcGFyZWphcywgZW51bWVyZSBvdHJhcyBkb3MgbyB0cmVzIGZyYXNlcyBxdWUgcmVmdWVyY2VuIGxvcyBlc3RlcmVvdGlwb3Mgc29icmUgY29tcHV0YWNpw7NuLgoKIyMjIE5vIHNlciB1biBpbWLDqWNpbCAoaW5kaXZpZHVhbCAvIDE1KQpFc3RlIGJyZXZlIGFydMOtY3VsbyBkZSBHYXJ5IEJlcm5oYXJkdCByZWVzY3JpYmUgdW4gbWVuc2FqZSBpbm5lY2VzYXJpYW1lbnRlIGhvc3RpbCBwYXJhIHNlciBtZW5vcyBncm9zZXJvLiBVdGlsaXrDoW5kb2xvIGNvbW8gbW9kZWxvLCBlbmN1ZW50cmUgYWxnbyBkZXNhZ3JhZGFibGUgZW4gU3RhY2sgT3ZlcmZsb3cgbyBlbiBhbGfDum4gb3RybyBmb3JvIGRlIGRlYmF0ZSBww7pibGljbyB5IHZ1ZWx2YSBhIGVzY3JpYmlybG8gcGFyYSBxdWUgc2VhIG3DoXMgaW5jbHVzaXZvLgoKIyMjIENhcmEgZGUgYWhvcnJvIChpbmRpdmlkdWFsIC8gMTApCsK/U2UgYXZlcmdvbnphcsOtYSBhbGd1bm8gZGUgc3VzIGFsdW1ub3MgZGVzZWFkb3MgZGUgYWRtaXRpciBxdWUgeWEgbm8gc2FiZW4gYWxndW5hcyBkZSBsYXMgY29zYXMgcXVlIGRlc2VhIGVuc2XDsWFyPyBTaSBlcyBhc8OtLCDCv2PDs21vIHB1ZWRlIGF5dWRhcmxvcyBhIHNhbHZhciBsYSBjYXJhPwoKIyMjIEp1Z3VldGVzIGluZmFudGlsZXMgKHRvZGEgbGEgY2xhc2UgLyAxNSkKW0N1dHQyMDE3XSBlbmN1ZXN0w7MgYSB1c3VhcmlvcyBhZHVsdG9zIGRlIGNvbXB1dGFkb3JhcyBzb2JyZSBzdXMgYWN0aXZpZGFkZXMgaW5mYW50aWxlcyB5IGRlc2N1YnJpw7MgcXVlIGxhIGNvcnJlbGFjacOzbiBtw6FzIGZ1ZXJ0ZSBlbnRyZSBsYSBjb25maWFuemEgeSBlbCB1c28gZGUgbGEgY29tcHV0YWRvcmEgc2UgYmFzYWJhIGVuIGxhIGxlY3R1cmEgcG9yIHN1IGN1ZW50YSB5IGp1Z2FyIGNvbiBqdWd1ZXRlcyBkZSBjb25zdHJ1Y2Npw7NuIGNvbW8gTGVnbyBxdWUgbm8gdGllbmVuIHBhcnRlcyBtw7N2aWxlcy4gRXhhbWluZSBsYSBjbGFzZSB5IHZlYSBlbiBxdcOpIG90cmFzIGFjdGl2aWRhZGVzIHBhcnRpY2lwYXJvbiBsYXMgcGVyc29uYXMsIGx1ZWdvIGJ1c3F1ZSBlc3RhcyBhY3RpdmlkYWRlcyBlbiBsw61uZWEuIMK/UXXDqSBncmFkbyBkZSBnw6luZXJvIHRpZW5lbiBsYXMgZGVzY3JpcGNpb25lcyB5IGxhIHB1YmxpY2lkYWQgcGFyYSBlbGxvcz8gwr9RdcOpIGVmZWN0byBjcmVlcyBxdWUgdGllbmUgZXN0bz8KCiMjIyBBY2Nlc2liaWxpZGFkIGEgbGEgbGVjY2nDs24gKHBhcmVzIC8gMzApCkVuIHBhcmVqYXMsIGVsaWphIHVuYSBsZWNjacOzbiBjdXlvcyBtYXRlcmlhbGVzIGVzdMOpbiBkaXNwb25pYmxlcyBlbiBsw61uZWEgeSBjbGFzaWbDrXF1ZWxvcyBpbmRlcGVuZGllbnRlbWVudGUgZGUgYWN1ZXJkbyBjb24gbG8gcXVlIHNlIGRlYmUgeSBubyBzZSBkZWJlIGhhY2VyIGVuIGVzdG9zIGNhcnRlbGVzLiDCv0TDs25kZSBlc3R1dmllcm9uIGRlIGFjdWVyZG8gdXN0ZWQgeSBzdSBwYXJlamE/IMK/RMOzbmRlIGVzdGFiYXMgZW4gZGVzYWN1ZXJkbz8gwr9RdcOpIHRhbiBiaWVuIGZ1ZSBsYSBsZWNjacOzbiBwYXJhIGNhZGEgdW5hIGRlIGxhcyBzZWlzIGNhdGVnb3LDrWFzIGRlIHVzdWFyaW9zPwoKIyMjIFJhc3RyZWFuZG8gZWwgY2ljbG8gKGdydXBvcyBwZXF1ZcOxb3MgLyAxNSkKW0NvY28yMDE4XSB0cmF6YSB1biBwYXRyw7NuIGRlcHJpbWVudGVtZW50ZSBjb23Dum4gZW4gZWwgcXVlIGxhcyBidWVuYXMgaW50ZW5jaW9uZXMgc2UgdmVuIHNvY2F2YWRhcyBwb3IgZWwgbGlkZXJhemdvIGRlIHVuYSBvcmdhbml6YWNpw7NuIHF1ZSBubyBlc3TDoSBkaXNwdWVzdG8gYSBjYW1iaWFyIHJlYWxtZW50ZS4gVHJhYmFqYW5kbyBlbiBncnVwb3MgZGUgNCBhIDYsIGVzY3JpYmEgYnJldmVzIHRleHRvcyBvIGNvcnJlb3MgZWxlY3Ryw7NuaWNvcyBxdWUgaW1hZ2luYSBxdWUgY2FkYSB1bmEgZGUgbGFzIHBhcnRlcyBpbnZvbHVjcmFkYXMgc2UgZW52aWFyw61hIGEgbGEgb3RyYSBlbiBjYWRhIGV0YXBhIGRlIGVzdGUgY2ljbG8uCgojIyMgwr9RdcOpIGVzIGxvIHBlb3IgcXVlIHBvZHLDrWEgcGFzYXI/IChncnVwb3MgcGVxdWXDsW9zIC8gNSkKQSBsbyBsYXJnbyBkZSBsb3MgYcOxb3MsIHVuIHByb3llY3RvciBzZSBpbmNlbmRpw7MsIHVuIGVzdHVkaWFudGUgc2UgcHVzbyBkZSBwYXJ0byB5IGNvbWVuesOzIHVuYSBwZWxlYSBlbiBjbGFzZS4gTWUgY2HDrSBkZWwgZXNjZW5hcmlvIGRvcyB2ZWNlcywgbWUgcXVlZMOpIGRvcm1pZG8gZW4gdW5hIGRlIG1pcyBwcm9waWFzIGNvbmZlcmVuY2lhcyB5IG11Y2hvcyBjaGlzdGVzIHNlIG1lIGNheWVyb24uIEVuIHBlcXVlw7FvcyBncnVwb3MsIGhhZ2EgdW5hIGxpc3RhIGRlIGxhcyBwZW9yZXMgY29zYXMgcXVlIGxlIGhhbiBzdWNlZGlkbyBtaWVudHJhcyBlbnNlw7FhYmEsIGx1ZWdvIGNvbXBhcnRhIGNvbiBsYSBjbGFzZS4gTWFudGVuZ2EgbGEgbGlzdGEgcGFyYSByZWNvcmRhcnNlIG3DoXMgdGFyZGUgcXVlIG5vIGltcG9ydGEgY3XDoW4gbWFsYSBzZWEgbGEgY2xhc2UsIGFsIG1lbm9zIG5hZGEgZGUgZXNvIHN1Y2VkacOzLgoKIyMgUmVzdW1lbgohW21vdGl2YXRpb25dKC4vaW1nX3RyYW5pbmcvY29uY2VwdG1hcC1tb3RpdmF0aW9uLnN2ZykKCi0tLS0tLS0tLQoKIyBFbnNlw7FhbmRvIGVuIGzDrW5lYQo+IFNpIHVzYXMgcm9ib3RzIHBhcmEgZW5zZcOxYXIsIGVuc2XDsWFzIGEgbGFzIHBlcnNvbmFzIGEgc2VyIHJvYm90cy4KPiAtLSBhdHJpYnVpZG8gZGl2ZXJzYW1lbnRlCgpMYSB0ZWNub2xvZ8OtYSBoYSBjYW1iaWFkbyBsYSBlbnNlw7FhbnphIHkgZWwgYXByZW5kaXphamUgbXVjaGFzIHZlY2VzLiBBbnRlcyBkZSBxdWUgbG9zIHBpemFycm9uZXMgc2UgaW50cm9kdWplcmFuIGVuIGxhcyBlc2N1ZWxhcyBhIHByaW5jaXBpb3MgZGUgMTgwMCwgbm8gaGFiw61hIGZvcm1hIGRlIHF1ZSBsb3MgbWFlc3Ryb3MgY29tcGFydGllcmFuIHVuIGVqZW1wbG8sIGRpYWdyYW1hIG8gZWplcmNpY2lvIGltcHJvdmlzYWRvcyBjb24gdG9kYSB1bmEgY2xhc2UgYSBsYSB2ZXouIExhcyBwaXphcnJhcyBlY29uw7NtaWNhcywgY29uZmlhYmxlcywgZsOhY2lsZXMgZGUgdXNhciB5IGZsZXhpYmxlcywgcGVybWl0aWVyb24gYSBsb3MgbWFlc3Ryb3MgaGFjZXIgbGFzIGNvc2FzIHLDoXBpZGFtZW50ZSB5IGEgdW5hIGVzY2FsYSBxdWUgYW50ZXMgc29sbyBwb2TDrWFuIGhhY2VyIGxlbnRhbWVudGUgeSBwb2NvIGEgcG9jby4gRGVsIG1pc21vIG1vZG8sIGxhcyB2aWRlb2PDoW1hcmFzIHBvcnTDoXRpbGVzIHJldm9sdWNpb25hcm9uIGVsIGVudHJlbmFtaWVudG8gZGVwb3J0aXZvLCBhbCBpZ3VhbCBxdWUgbGFzIGdyYWJhZG9yYXMgcmV2b2x1Y2lvbmFyb24gbGEgaW5zdHJ1Y2Npw7NuIG11c2ljYWwgdW5hIGTDqWNhZGEgYW50ZXMuCgpNdWNoYXMgZGUgbGFzIHBlcnNvbmFzIHF1ZSBlbXB1amFuIEludGVybmV0IGEgbGFzIGF1bGFzIG5vIGNvbm9jZW4gZXN0YSBoaXN0b3JpYSB5IG5vIHNlIGRhbiBjdWVudGEgZGUgcXVlIGxhIHN1eWEgZXMgc29sbyBsYSDDumx0aW1hIGRlIHVuYSBsYXJnYSBzZXJpZSBkZSBpbnRlbnRvcyBkZSB1c2FyIG3DoXF1aW5hcyBwYXJhIGVuc2XDsWFyIFtXYXR0MjAxNF0uIERlc2RlIGxhIGltcHJlbnRhIGEgdHJhdsOpcyBkZSBsYSByYWRpbyB5IGxhIHRlbGV2aXNpw7NuIGhhc3RhIGxhcyBjb21wdXRhZG9yYXMgZGUgZXNjcml0b3JpbyB5IGxvcyBkaXNwb3NpdGl2b3MgbcOzdmlsZXMsIGNhZGEgbnVldmEgZm9ybWEgZGUgY29tcGFydGlyIGNvbm9jaW1pZW50byBoYSBwcm9kdWNpZG8gdW5hIG9sYSBkZSBvcHRpbWlzdGFzIGFncmVzaXZvcyBxdWUgY3JlZW4gcXVlIGxhIGVkdWNhY2nDs24gZXN0w6Egcm90YSB5IHF1ZSBsYSB0ZWNub2xvZ8OtYSBwdWVkZSBzb2x1Y2lvbmFybG8uIFNpbiBlbWJhcmdvLCBsb3MgZGVmZW5zb3JlcyBtw6FzIGZ1ZXJ0ZXMgZGUgbGEgdGVjbm9sb2fDrWEgZGUgbGEgZWR1Y2FjacOzbiBhIG1lbnVkbyBoYW4gc2FiaWRvIG1lbm9zIGFjZXJjYSBkZSAiZWR1Y2FjacOzbiIgcXVlICJ0ZWNub2xvZ8OtYSIsIHkgZGV0csOhcyBkZSBzdSByZXTDs3JpY2EsIG11Y2hvcyBoYW4gc2lkbyBpbXB1bHNhZG9zIG3DoXMgcG9yIGxhIHBlcnNwZWN0aXZhIGRlIGdhbmFuY2lhcyBxdWUgcG9yIGVsIGRlc2VvIGRlIGVtcG9kZXJhciBhIGxvcyBlc3R1ZGlhbnRlcy4KCkVsIGRlYmF0ZSBkZSBob3kgYSBtZW51ZG8gc2UgY29uZnVuZGUgYWwgY29uZnVuZGlyICJlbiBsw61uZWEiIGNvbiAiYXV0b21hdGl6YWRvIi4gQ29ycmUgYmllbiwgdW5hIGRvY2VuYSBkZSBwZXJzb25hcyBxdWUgdHJhYmFqYW4gYSB0cmF2w6lzIGRlIHVuIHByb2JsZW1hIGVuIHVuIGNoYXQgZGUgdmlkZW8gc2Ugc2llbnRlIGNvbW8gY3VhbHF1aWVyIG90cmEgZGlzY3VzacOzbiBlbiBncnVwb3MgcGVxdWXDsW9zLiBQb3IgZWwgY29udHJhcmlvLCB1biBlc2N1YWRyw7NuIGRlIGF1eGlsaWFyZXMgZG9jZW50ZXMgcXVlIGNsYXNpZmlxdWVuIGNpZW50b3MgZGUgZG9jdW1lbnRvcyBjb250cmEgdW5hIHLDumJyaWNhIGluZmxleGlibGUgdGFtYmnDqW4gcG9kcsOtYSBzZXIgdW5hIGNvbGVjY2nDs24gZGUgZ3Vpb25lcyBkZSBQZXJsLiBQb3IgbG8gdGFudG8sIGVzdGUgY2Fww610dWxvIGNvbWllbnphIGFuYWxpemFuZG8gbGEgaW5zdHJ1Y2Npw7NuIGVuIGzDrW5lYSB0b3RhbG1lbnRlIGF1dG9tYXRpemFkYSB1dGlsaXphbmRvIHZpZGVvcyBncmFiYWRvcyB5IGVqZXJjaWNpb3MgY2FsaWZpY2Fkb3MgYXV0b23DoXRpY2FtZW50ZSwgbHVlZ28gZXhwbG9yYSBhbGd1bm9zIG1vZGVsb3MgaMOtYnJpZG9zIGFsdGVybmF0aXZvcy4KCiMjIE1PT0MKRWwgZXNmdWVyem8gZGUgbcOhcyBhbHRvIHBlcmZpbCBwYXJhIHJlaW52ZW50YXIgbGEgZWR1Y2FjacOzbiBhIHRyYXbDqXMgZGUgSW50ZXJuZXQgZXMgZWwgY3Vyc28gbWFzaXZvIGFiaWVydG8gZW4gbMOtbmVhLCBvIE1PT0MuIEVsIHTDqXJtaW5vIGZ1ZSBpbnZlbnRhZG8gcG9yIERhdmlkIENvcm1pZXIgZW4gMjAwOCBwYXJhIGRlc2NyaWJpciB1biBjdXJzbyBvcmdhbml6YWRvIHBvciBHZW9yZ2UgU2llbWVucyB5IFN0ZXBoZW4gRG93bmVzLiBFc2UgY3Vyc28gc2UgYmFzw7MgZW4gdW5hIHZpc2nDs24gY29uZWN0aXZpc3RhIGRlbCBhcHJlbmRpemFqZSwgcXVlIHNvc3RpZW5lIHF1ZSBlbCBjb25vY2ltaWVudG8gc2UgZGlzdHJpYnV5ZSB5IHF1ZSBlbCBhcHJlbmRpemFqZSBlcyBlbCBwcm9jZXNvIGRlIGVuY29udHJhciwgY3JlYXIgeSBwb2RhciBjb25leGlvbmVzLgoKRWwgdMOpcm1pbm8gIk1PT0MiIGZ1ZSByw6FwaWRhbWVudGUgY29vcHRhZG8gcG9yIGxvcyBjcmVhZG9yZXMgZGUgY3Vyc29zIHF1ZSBzZSBwYXJlY8OtYW4gbcOhcyBhbCBtb2RlbG8gZGUgdW4gYXVsYSB0cmFkaWNpb25hbCBkZSB1biBhdWxhIHRyYWRpY2lvbmFsLCBjb24gZWwgbWFlc3RybyBlbiBlbCBjZW50cm8gZGVmaW5pZW5kbyBvYmpldGl2b3MgeSBsb3MgYWx1bW5vcyB2aXN0b3MgY29tbyByZWNlcHRvcmVzIG8gcmVwbGljYWRvcmVzIGRlIGNvbm9jaW1pZW50by4gTGFzIGNsYXNlcyBxdWUgdXNhbiBlbCBtb2RlbG8gY29uZWN0aXZpc3RhIG9yaWdpbmFsIGFob3JhIGEgdmVjZXMgc2UgZGVub21pbmFuICJjTU9PQyIsIG1pZW50cmFzIHF1ZSBsYXMgY2xhc2VzIHF1ZSBjZW50cmFsaXphbiBlbCBjb250cm9sIHNlIGRlbm9taW5hbiAieE1PT0MiLiAoQSBlc3RlIMO6bHRpbW8gdGFtYmnDqW4gc2UgbGUgbGxhbWEgYSB2ZWNlcyAiTUVTUyIsIHBhcmEgU2FnZSBtYXNpdmFtZW50ZSBtZWpvcmFkbyBlbiBlbCBlc2NlbmFyaW8pLgoKSGFjZSBjaW5jbyBhw7Fvcywgbm8gc2UgcG9kw61hIGNhbWluYXIgcG9yIHVuIGNhbXB1cyB1bml2ZXJzaXRhcmlvIGltcG9ydGFudGUgc2luIGVzY3VjaGFyIGEgYWxndWllbiBoYWJsYXIgc29icmUgY8OzbW8gbG9zIE1PT0MgcmV2b2x1Y2lvbmFyw61hbiBsYSBlZHVjYWNpw7NuLCBsYSBkZXN0cnVpcsOtYW4gbyBwb3NpYmxlbWVudGUgYW1iYXMgY29zYXMuIExvcyBNT09DIGRhcsOtYW4gYSBsb3MgYWx1bW5vcyBhY2Nlc28gYSB1bmEgZ2FtYSBtw6FzIGFtcGxpYSBkZSBjdXJzb3MgeSBsZXMgcGVybWl0aXLDrWFuIHRyYWJhamFyIGN1YW5kbyBmdWVyYSBjb252ZW5pZW50ZSBwYXJhIGVsbG9zIGVuIGx1Z2FyIGRlIGFkYXB0YXIgc3UgYXByZW5kaXphamUgYWwgaG9yYXJpbyBkZSBvdHJhIHBlcnNvbmEuCgpQZXJvIGxvcyBNT09DIG5vIGhhbiBzaWRvIHRhbiBlZmVjdGl2b3MgY29tbyBwcmVkaWplcm9uIHN1cyBkZWZlbnNvcmVzIG3DoXMgZW50dXNpYXN0YXMgW1ViZWwyMDE3XS4gVW5hIHJhesOzbiBlcyBxdWUgZWwgY29udGVuaWRvIGdyYWJhZG8gZXMgaW5lZmljYXogcGFyYSBtdWNob3Mgbm92YXRvcyBwb3JxdWUgbm8gcHVlZGUgYWNsYXJhciBzdXMgY29uY2VwdG9zIGVycsOzbmVvcyBpbmRpdmlkdWFsZXMgKENhcMOtdHVsbyAyKTogc2kgbm8gY29tcHJlbmRlbiB1bmEgZXhwbGljYWNpw7NuIGxhIHByaW1lcmEgdmV6LCBnZW5lcmFsbWVudGUgbm8gc2Ugb2ZyZWNlIHVuYSBkaWZlcmVudGUuIE90cmEgZXMgcXVlIGxhIGV2YWx1YWNpw7NuIGF1dG9tYXRpemFkYSBuZWNlc2FyaWEgcGFyYSBwb25lciBsbyAibWFzaXZvIiBlbiBNT09DIHNvbG8gZnVuY2lvbmEgYmllbiBlbiBsb3Mgbml2ZWxlcyBtw6FzIGJham9zIGRlIGxhIFRheG9ub23DrWEgZGUgQmxvb20gKFNlY2Npw7NuIDYuMikuIEFob3JhIHRhbWJpw6luIGVzdMOhIGNsYXJvIHF1ZSBsb3MgZXN0dWRpYW50ZXMgdGllbmVuIHF1ZSBzb3BvcnRhciBtdWNobyBtw6FzIGxhIGNhcmdhIGRlIG1hbnRlbmVyc2UgZW5mb2NhZG9zIGVuIHVuIE1PT0MsIHF1ZSBsYSBpbXBlcnNvbmFsaWRhZCBkZSB0cmFiYWphciBlbiBsw61uZWEgcHVlZGUgYWxlbnRhciB1biBjb21wb3J0YW1pZW50byBubyBjaXZpbCB5IGRlc21vdGl2YXIgYSBsYXMgcGVyc29uYXMsIHkgcXVlICJkaXNwb25pYmxlIHBhcmEgdG9kb3MiIGVuIHJlYWxpZGFkIHNpZ25pZmljYSAiZGlzcG9uaWJsZSBwYXJhIHRvZG9zIGxvIHN1ZmljaWVudGVtZW50ZSByaWNvcyB0ZW5lciBpbnRlcm5ldCBkZSBhbHRhIHZlbG9jaWRhZCB5IG11Y2hvIHRpZW1wbyBsaWJyZSAiLgoKW01hcmcyMDE1XSBleGFtaW7DsyA3NiBNT09DcyBzb2JyZSBkaXZlcnNvcyB0ZW1hcyB5IGRlc2N1YnJpw7MgcXVlIHNpIGJpZW4gbGEgb3JnYW5pemFjacOzbiB5IHByZXNlbnRhY2nDs24gZGVsIG1hdGVyaWFsIGVyYSBidWVuYSwgbGEgY2FsaWRhZCBkZWwgZGlzZcOxbyBkZSBsYSBsZWNjacOzbiBlcmEgZGVmaWNpZW50ZS4gTcOhcyBjZXJjYSBkZSBjYXNhLCBbS2ltMjAxN10gZXN0dWRpw7MgdHJlaW50YSB0dXRvcmlhbGVzIHBvcHVsYXJlcyBkZSBjb2RpZmljYWNpw7NuIGVuIGzDrW5lYSwgeSBkZXNjdWJyacOzIHF1ZSBlbiBncmFuIG1lZGlkYSBlbnNlw7FhYmFuIGVsIG1pc21vIGNvbnRlbmlkbyBkZSBsYSBtaXNtYSBtYW5lcmE6IGRlIGFiYWpvIGhhY2lhIGFycmliYSwgY29tZW56YW5kbyBjb24gY29uY2VwdG9zIGRlIHByb2dyYW1hY2nDs24gZGUgYmFqbyBuaXZlbCB5IGNvbnN0cnV5ZW5kbyBvYmpldGl2b3MgZGUgYWx0byBuaXZlbC4gTGEgbWF5b3LDrWEgZGUgbG9zIGFsdW1ub3MgZXhpZ2llcm9uIHF1ZSBlc2NyaWJpZXJhbiBwcm9ncmFtYXMgeSBwcm9wb3JjaW9uYXJvbiBhbGd1bmEgZm9ybWEgZGUgcmV0cm9hbGltZW50YWNpw7NuIGlubWVkaWF0YSwgcGVybyBlc3RhIHJldHJvYWxpbWVudGFjacOzbiBmdWUgdMOtcGljYW1lbnRlIG11eSBzdXBlcmZpY2lhbC4gUG9jb3MgZXhwbGljYXJvbiBjdcOhbmRvIHkgcG9yIHF1w6kgbG9zIGNvbmNlcHRvcyBzb24gw7p0aWxlcyAoZXMgZGVjaXIsIG5vIG1vc3RyYXJvbiBjw7NtbyB0cmFuc2ZlcmlyIGNvbm9jaW1pZW50bykgbyBicmluZGFyb24gb3JpZW50YWNpw7NuIHBhcmEgZXJyb3JlcyBjb211bmVzLCB5IGFwYXJ0ZSBkZSBsYSBkaWZlcmVuY2lhY2nDs24gcnVkaW1lbnRhcmlhIGJhc2FkYSBlbiBsYSBlZGFkLCBuaW5ndW5hIGxlY2Npw7NuIHBlcnNvbmFsaXphZGEgYmFzYWRhIGVuIGxhIGV4cGVyaWVuY2lhIGRlIGNvZGlmaWNhY2nDs24gcHJldmlhIG8gbG9zIG9iamV0aXZvcyBkZWwgYWx1bW5vLgoKPioqQXByZW5kaXphamUgcGVyc29uYWxpemFkbyoqCj4KPlBvY29zIHTDqXJtaW5vcyBzZSBoYW4gdXRpbGl6YWRvIHkgYWJ1c2FkbyBkZSB0YW50YXMgZm9ybWFzIGNvbW8gZWwgYXByZW5kaXphamUgcGVyc29uYWxpemFkby4gUGFyYSBsYSBtYXlvcsOtYSBkZSBsb3MgZGVmZW5zb3JlcyBkZSBsYSB0ZWNub2xvZ8OtYSBlZCwgc2lnbmlmaWNhIGFqdXN0YXIgZGluw6FtaWNhbWVudGUgZWwgcml0bW8gZGUgbGFzIGxlY2Npb25lcyBlbiBmdW5jacOzbiBkZWwgcmVuZGltaWVudG8gZGVsIGFsdW1ubywgZGUgbW9kbyBxdWUgc2kgYWxndWllbiByZXNwb25kZSBjb3JyZWN0YW1lbnRlIHZhcmlhcyBwcmVndW50YXMgc2VndWlkYXMsIGxhIGNvbXB1dGFkb3JhIG9taXRpcsOhIGFsZ3VuYXMgZGUgbGFzIHByZWd1bnRhcyBwb3N0ZXJpb3Jlcy4KPgpIYWNlciBlc3RvIHB1ZWRlIHByb2R1Y2lyIG1lam9yYXMgbW9kZXN0YXMsIHBlcm8gbWVqb3IgZXMgcG9zaWJsZS4gUG9yIGVqZW1wbG8sIHNpIG11Y2hvcyBhbHVtbm9zIGVuY3VlbnRyYW4gZGlmw61jaWwgdW4gdGVtYSBlbiBwYXJ0aWN1bGFyLCBlbCBtYWVzdHJvIHB1ZWRlIHByZXBhcmFyIG3Dumx0aXBsZXMgZXhwbGljYWNpb25lcyBhbHRlcm5hdGl2YXMgZGUgZXNlIHB1bnRvIGVuIGx1Z2FyIGRlIGFjZWxlcmFyIHVuIHNvbG8gY2FtaW5vLiBEZSBlc2EgbWFuZXJhLCBzaSB1bmEgZXhwbGljYWNpw7NuIG5vIHJlc3VlbmEsIGhheSBvdHJhcyBkaXNwb25pYmxlcy4gU2luIGVtYmFyZ28sIGVzdG8gcmVxdWllcmUgbXVjaG8gbcOhcyB0cmFiYWpvIGRlIGRpc2XDsW8gcG9yIHBhcnRlIGRlbCBtYWVzdHJvLCBsbyBxdWUgcHVlZGUgc2VyIGxhIHJhesOzbiBwb3IgbGEgY3VhbCBubyBoYSByZXN1bHRhZG8gcG9wdWxhci4gRSBpbmNsdXNvIHNpIGZ1bmNpb25hLCBlcyBwcm9iYWJsZSBxdWUgbG9zIGVmZWN0b3Mgc2VhbiBtdWNobyBtZW5vcmVzIGRlIGxvIHF1ZSBjcmVlbiBhbGd1bm9zIGRlIHN1cyBkZWZlbnNvcmVzLiBVbiBidWVuIG1hZXN0cm8gaGFjZSB1bmEgZGlmZXJlbmNpYSBkZSAwLjEgYSAwLjE1IGRlc3ZpYWNpb25lcyBlc3TDoW5kYXIgZW4gZWwgZGVzZW1wZcOxbyBkZSBmaW4gZGUgYcOxbyBlbiBsYSBlc2N1ZWxhIHByaW1hcmlhIFtDaGV0MjAxNF0gKHZlYSBlc3RlIGFydMOtY3VsbyBwYXJhIHVuIGJyZXZlIHJlc3VtZW4pLiBObyBlcyByZWFsaXN0YSBjcmVlciBxdWUgY3VhbHF1aWVyIHRpcG8gZGUgYXV0b21hdGl6YWNpw7NuIHB1ZWRhIHN1cGVyYXIgZXN0byBlbiBlbCBjb3J0byBwbGF6by4KCgpFbnRvbmNlcywgwr9jw7NtbyBkZWJlIHVzYXJzZSBJbnRlcm5ldCBwYXJhIGVuc2XDsWFyIHkgYXByZW5kZXIgaGFiaWxpZGFkZXMgdGVjbm9sw7NnaWNhcz8gU3VzIHZlbnRhamFzIHkgZGVzdmVudGFqYXMgc29uOgoKKipMb3MgYWx1bW5vcyBwdWVkZW4gYWNjZWRlciBhIG3DoXMgbGVjY2lvbmVzLCBtw6FzIHLDoXBpZG8sIHF1ZSBudW5jYS4qKgpTaWVtcHJlIHF1ZSwgcG9yIHN1cHVlc3RvLCB1biBtb3RvciBkZSBiw7pzcXVlZGEgY29uc2lkZXJlIGVzYXMgbGVjY2lvbmVzIHF1ZSB2YWxnYSBsYSBwZW5hIGluZGV4YXIsIHF1ZSBzdSBwcm92ZWVkb3IgZGUgc2VydmljaW9zIGRlIEludGVybmV0IHkgZWwgZ29iaWVybm8gbm8gbG8gYmxvcXVlZW4sIHkgcXVlIGxhIHZlcmRhZCBubyBzZSBhaG9ndWUgZW4gdW4gbWFyIGRlIGRlc2luZm9ybWFjacOzbiBxdWUgZGViaWxpdGEgbGEgYXRlbmNpw7NuLgoKKipMb3MgYWx1bW5vcyBwdWVkZW4gYWNjZWRlciBhIG1lam9yZXMgbGVjY2lvbmVzIHF1ZSBudW5jYSBhbnRlcywqKgphIG1lbm9zIHF1ZSBlc3TDqW4gc2llbmRvIGRpcmlnaWRvcyBoYWNpYSBtYXRlcmlhbCBkZSBzZWd1bmRhIGNhdGVnb3LDrWEgcGFyYSByZWRpc3RyaWJ1aXIgbGEgcmlxdWV6YSBkZSBsb3MgcXVlIG5vIHRpZW5lbiBhIGxvcyBxdWUgdGllbmVuIFtNY01pMjAxN10uIFRhbWJpw6luIHZhbGUgbGEgcGVuYSByZWNvcmRhciBxdWUgbGEgZXNjYXNleiBhdW1lbnRhIGVsIHZhbG9yIHBlcmNpYmlkbywgcG9yIGxvIHF1ZSBhIG1lZGlkYSBxdWUgbGEgZWR1Y2FjacOzbiBlbiBsw61uZWEgc2UgdnVlbHZlIG3DoXMgYmFyYXRhLCBzZSBjb252ZXJ0aXLDoSBjYWRhIHZleiBtw6FzIGVuIGxvIHF1ZSB0b2RvcyBxdWllcmVuIHBhcmEgbG9zIGhpam9zIGRlIG90cmEgcGVyc29uYS4KCioqTG9zIGFsdW1ub3MgdGFtYmnDqW4gcHVlZGVuIGFjY2VkZXIgYSBtdWNoYXMgbcOhcyBwZXJzb25hcyBxdWUgbnVuY2EuKioKUGVybyBzb2xvIHNpIGVzb3MgYWx1bW5vcyByZWFsbWVudGUgdGllbmVuIGFjY2VzbyBhIGxhIHRlY25vbG9nw61hIHJlcXVlcmlkYSwgcHVlZGVuIHBlcm1pdGlyc2UgZWwgbHVqbyBkZSB1c2FybGEgeSBubyBzb24gZXhwdWxzYWRvcyDigIvigItkZWwgaG9zdGlnYW1pZW50byBvIG1hcmdpbmFkb3MgcG9ycXVlIG5vIHNlIGFqdXN0YW4gYSBsYXMgbm9ybWFzIHNvY2lhbGVzIGRlIGN1YWxxdWllciBncnVwbyBxdWUgZXN0w6kgaGFibGFuZG8gbcOhcyBhbHRvLiBFbiBsYSBwcsOhY3RpY2EsIGxhIG1heW9yw61hIGRlIGxvcyB1c3VhcmlvcyBkZSBNT09DIHByb3ZpZW5lbiBkZSBlbnRvcm5vcyBzZWd1cm9zIHkgcmljb3MgW0hhbnMyMDE1XS4KCioqTG9zIHByb2Zlc29yZXMgcHVlZGVuIG9idGVuZXIgdW5hIHZpc2nDs24gbXVjaG8gbcOhcyBkZXRhbGxhZGEgZGUgY8OzbW8gdHJhYmFqYW4gbG9zIGFsdW1ub3MuKioKTWllbnRyYXMgbG9zIGFsdW1ub3MgZXN0w6luIGhhY2llbmRvIGNvc2FzIHF1ZSBzZWFuIHN1c2NlcHRpYmxlcyBkZSBhbsOhbGlzaXMgYXV0b21hdGl6YWRvcyBhIGdyYW4gZXNjYWxhIHkgbm8gc2Ugb3BvbmdhbiBhIGxhIHZpZ2lsYW5jaWEgZW4gZWwgYXVsYSBvIG5vIHNlYW4gbG8gc3VmaWNpZW50ZW1lbnRlIHBvdGVudGVzIGNvbW8gcGFyYSBxdWUgc3VzIG9iamVjaW9uZXMgdGVuZ2FuIGltcG9ydGFuY2lhLgpbTWFyZzIwMTUsIE1pbGwyMDE2YSwgTmlsczIwMTddIGRlc2NyaWJlbiBmb3JtYXMgZGUgYWNlbnR1YXIgbG9zIGFzcGVjdG9zIHBvc2l0aXZvcyBlbiBsYSBsaXN0YSBhbnRlcmlvciwgZXZpdGFuZG8gbG9zIG5lZ2F0aXZvczoKCioqSGFjZXIgcGxhem9zIGZyZWN1ZW50ZXMgeSBiaWVuIHB1YmxpY2l0YWRvcywqKgp5IGhhY2VybG9zIGN1bXBsaXIgcGFyYSBxdWUgbG9zIGFsdW1ub3MgZW50cmVuIGVuIHVuIHJpdG1vIGRlIHRyYWJham8uCgoqKk1hbnRlbmdhIGxhcyBhY3RpdmlkYWRlcyBzaW5jcsOzbmljYXMgZGUgdG9kYSBsYSBjbGFzZSBjb21vIGNvbmZlcmVuY2lhcyBlbiB2aXZvIGFsIG3DrW5pbW8qKgpwYXJhIHF1ZSBsYXMgcGVyc29uYXMgbm8gc2UgcGllcmRhbiBjb3NhcyBkZWJpZG8gYSBjb25mbGljdG9zIGRlIHByb2dyYW1hY2nDs24uCgoqKkhhZ2EgcXVlIGxvcyBhbHVtbm9zIGNvbnRyaWJ1eWFuIGFsIGNvbm9jaW1pZW50byBjb2xlY3Rpdm8sKioKcC5lai4gdG9tZW4gbm90YXMganVudGFzIChTZWNjacOzbiA5LjcpLCBzaXJ2YW4gY29tbyBlc2NyaWJhcyBkZSBjbGFzZSBvIGNvbnRyaWJ1eWFuIGNvbiBwcm9ibGVtYXMgYSBjb25qdW50b3MgZGUgcHJvYmxlbWFzIGNvbXBhcnRpZG9zIChTZWNjacOzbiA1LjMpLgoKKipGb21lbnRhciBvIGV4aWdpciBhIGxvcyBhbHVtbm9zIHF1ZSByZWFsaWNlbiBwYXJ0ZSBkZSBzdSB0cmFiYWpvIGVuIGdydXBvcyBwZXF1ZcOxb3MuKioKcXVlIHRpZW5lbiBhY3RpdmlkYWRlcyBlbiBsw61uZWEgc2luY3LDs25pY2FzIGNvbW8gdW5hIGRpc2N1c2nDs24gc2VtYW5hbCBlbiBsw61uZWEuIEVzdG8gYXl1ZGEgYSBsb3MgZXN0dWRpYW50ZXMgYSBtYW50ZW5lcnNlIGNvbXByb21ldGlkb3MgeSBtb3RpdmFkb3Mgc2luIGNyZWFyIGRlbWFzaWFkb3MgZG9sb3JlcyBkZSBjYWJlemEgZGUgcHJvZ3JhbWFjacOzbi4gKENvbnN1bHRlIGVsIEFww6luZGljZSAyMCBwYXJhIG9idGVuZXIgYWxndW5vcyBjb25zZWpvcyBzb2JyZSBjw7NtbyBoYWNlciBxdWUgZXN0YXMgZGlzY3VzaW9uZXMgc2VhbiBqdXN0YXMgeSBwcm9kdWN0aXZhcykuCgoqKkNyZWFyLCBwdWJsaWNhciB5IGFwbGljYXIgdW4gY8OzZGlnbyBkZSBjb25kdWN0YS4qKgpwYXJhIHF1ZSB0b2RvcyBwdWVkYW4gcGFydGljaXBhciBlbiBkZWJhdGVzIGVuIGzDrW5lYSAoU2VjY2nDs24gOS4xKS4KVXNlIG11Y2hvcyBlcGlzb2Rpb3MgZGUgbGVjY2lvbmVzIGNvcnRhcyBlbiBsdWdhciBkZSB1biBwdcOxYWRvIGRlIGZyYWdtZW50b3MgZGUgY29uZmVyZW5jaWFzCnBhcmEgbWluaW1pemFyIGxhIGNhcmdhIGNvZ25pdGl2YSB5IGJyaW5kYXIgbXVjaGFzIG9wb3J0dW5pZGFkZXMgcGFyYSBsYSBldmFsdWFjacOzbiBmb3JtYXRpdmEuIEVzdG8gdGFtYmnDqW4gYXl1ZGEgY29uIGVsIG1hbnRlbmltaWVudG86IHNpIHRvZG9zIHN1cyB2aWRlb3Mgc29uIGNvcnRvcywgc2ltcGxlbWVudGUgcHVlZGUgdm9sdmVyIGEgZ3JhYmFyIGN1YWxxdWllcmEgcXVlIG5lY2VzaXRlIG1hbnRlbmltaWVudG8sIHF1ZSBhIG1lbnVkbyBlcyBtw6FzIGJhcmF0byBxdWUgdHJhdGFyIGRlIHBhcmNoZWFyIHZpZGVvcyBtw6FzIGxhcmdvcy4KCioqVXNlIGVsIHZpZGVvIHBhcmEgcGFydGljaXBhciBlbiBsdWdhciBkZSBpbnN0cnVpci4qKgpEZWphbmRvIGEgdW4gbGFkbyBsYXMgZGlzY2FwYWNpZGFkZXMgKFNlY2Npw7NuIDEwLjMpLCBsb3MgYWx1bW5vcyBwdWVkZW4gbGVlciBtw6FzIHLDoXBpZG8gZGUgbG8gcXVlIHVzdGVkIHB1ZWRlIGhhYmxhci4gTGEgZXhjZXBjacOzbiBhIGVzdGEgcmVnbGEgZXMgcXVlIGVsIHZpZGVvIGVzIGVuIHJlYWxpZGFkIGxhIG1lam9yIG1hbmVyYSBkZSBlbnNlw7FhciB2ZXJib3MgKGFjY2lvbmVzKSBhIGxhcyBwZXJzb25hczogY2FwdHVyYXMgZGUgcGFudGFsbGEgY29ydGFzIHF1ZSBtdWVzdHJhbiBhIGxhcyBwZXJzb25hcyBjw7NtbyB1c2FyIHVuIGVkaXRvciwgcmVjb3JyZXIgZWwgY8OzZGlnbyBlbiB1biBkZXB1cmFkb3IsIGV0Yy4sIHNvbiBtw6FzIGVmZWN0aXZhcyBxdWUgbGFzIGNhcHR1cmFzIGRlIHBhbnRhbGxhIGNvbiB0ZXh0by4KCioqSWRlbnRpZmljYXIgeSBhY2xhcmFyIGNvbmNlcHRvcyBlcnLDs25lb3MgdGVtcHJhbm8uKioKU2kgbG9zIGRhdG9zIG11ZXN0cmFuIHF1ZSBsb3MgYWx1bW5vcyB0aWVuZW4gZGlmaWN1bHRhZGVzIGNvbiBhbGd1bmFzIHBhcnRlcyBkZSB1bmEgbGVjY2nDs24sIGNyZWUgZXhwbGljYWNpb25lcyBhbHRlcm5hdGl2YXMgZGUgZXNvcyBwdW50b3MgeSBlamVyY2ljaW9zIGFkaWNpb25hbGVzIHBhcmEgcXVlIHByYWN0aXF1ZW4uCgpUb2RvIGVzdG8gZGViZSBpbXBsZW1lbnRhcnNlIGRlIGFsZ3VuYSBtYW5lcmEsIGxvIHF1ZSBzaWduaWZpY2EgcXVlIG5lY2VzaXRhIGFsZ8O6biB0aXBvIGRlIHBsYXRhZm9ybWEgZGUgZW5zZcOxYW56YS4gUHVlZGUgdXNhciB1biAqKnNpc3RlbWEgZGUgZ2VzdGnDs24gZGUgYXByZW5kaXphamUqKiB0b2RvIGVuIHVubyBjb21vIE1vb2RsZSBvIFNha2FpLCBvIGFybWFyIGFsZ28gdXN0ZWQgbWlzbW8gdXNhbmRvIFNsYWNrIG8gWnVsaXAgcGFyYSBjaGF0ZWFyLCBIYW5nb3V0cyBkZSBHb29nbGUgbyBhcGFyZWNlciAuaW4gcGFyYSBjb252ZXJzYWNpb25lcyBkZSB2aWRlbyB5IFdvcmRQcmVzcywgR29vZ2xlIERvY3MgbyBjdWFscXVpZXIgbsO6bWVybyBkZSB3aWtpIHNpc3RlbWFzIGRlIGF1dG9yw61hIGNvbGFib3JhdGl2YS4gU2kgcmVjacOpbiBlc3TDoSBjb21lbnphbmRvLCBlbGlqYSBsbyBxdWUgc2VhIG3DoXMgZsOhY2lsIGRlIGNvbmZpZ3VyYXIgeSBhZG1pbmlzdHJhciB5IHF1ZSBzZWEgbcOhcyBmYW1pbGlhciBwYXJhIHN1cyBhbHVtbm9zLiBTaSB0ZSBlbmZyZW50YXMgYSB1bmEgZWxlY2Npw7NuLCBsYSBzZWd1bmRhIGNvbnNpZGVyYWNpw7NuIGVzIG3DoXMgaW1wb3J0YW50ZSBxdWUgbGEgcHJpbWVyYTogZXNwZXJhcyBxdWUgbGFzIHBlcnNvbmFzIGFwcmVuZGFuIG11Y2hvIGVuIHR1IGNsYXNlLCBwb3IgbG8gcXVlIGVzIGp1c3RvIHF1ZSBhcHJlbmRhcyBhIG1hbmVqYXIgbGFzIGhlcnJhbWllbnRhcyBjb24gbGFzIHF1ZSBzZSBzaWVudGVuIG3DoXMgY8OzbW9kb3MuCgpDcmVhciB1bmEgcGxhdGFmb3JtYSBwYXJhIGVsIGFwcmVuZGl6YWplIGVzIG5lY2VzYXJpbyBwZXJvIG5vIHN1ZmljaWVudGU6IHNpIHF1aWVyZXMgcXVlIHR1cyBhbHVtbm9zIHByb3NwZXJlbiwgZGViZXMgY3JlYXIgdW5hIGNvbXVuaWRhZC4gQ2llbnRvcyBkZSBsaWJyb3MgeSBwcmVzZW50YWNpb25lcyBoYWJsYW4gc29icmUgY8OzbW8gaGFjZXIgZXN0bywgcGVybyBsYSBtYXlvcsOtYSBzZSBiYXNhbiBlbiBsYXMgZXhwZXJpZW5jaWFzIHBlcnNvbmFsZXMgZGUgc3VzIGF1dG9yZXMuIFtLcmF1MjAxNl0gZXMgdW5hIGV4Y2VwY2nDs24gYmllbnZlbmlkYTogbWllbnRyYXMgcHJlY2VkZSBhbCBkZXNjZW5zbyBhY2VsZXJhZG8gZGUgVHdpdHRlciB5IEZhY2Vib29rIGVuIGVsIGFidXNvIGFybWFkbyB5IGxhIGluZm9ybWFjacOzbiBlcnLDs25lYSwgbGEgbWF5b3LDrWEgZGUgc3VzIGxvcyByZXN1bHRhZG9zIGHDum4gc29uIHJlbGV2YW50ZXMuIFtGb2dlMjAwNV0gdGFtYmnDqW4gZXN0w6EgbGxlbm8gZGUgY29uc2Vqb3Mgw7p0aWxlcyBzb2JyZSBsYXMgY29tdW5pZGFkZXMgZGUgcHLDoWN0aWNhIGEgbGFzIHF1ZSBsb3MgYWx1bW5vcyBwdWVkZW4gdW5pcnNlOyBFeHBsb3JhbW9zIGFsZ3VuYXMgZGUgc3VzIGlkZWFzIGVuIGVsIENhcMOtdHVsbyAxMy4KCj4qKkxpYmVydGFkIGF5IGxpYmVydGFkIGRlKioKPgo+RWwgZW5zYXlvIGRlIElzYWlhaCBCZXJsaW4gZGUgMTk1OCAiRG9zIGNvbmNlcHRvcyBkZSBsaWJlcnRhZCIgaGl6byB1bmEgZGlzdGluY2nDs24gZW50cmUgbGEgbGliZXJ0YWQgcG9zaXRpdmEsIHF1ZSBlcyBsYSBjYXBhY2lkYWQgZGUgaGFjZXIgYWxnbyByZWFsbWVudGUsIHkgbGEgbGliZXJ0YWQgbmVnYXRpdmEsIHF1ZSBlcyBsYSBhdXNlbmNpYSBkZSByZWdsYXMgcXVlIGRpZ2FuIHF1ZSBubyBzZSBwdWVkZSBoYWNlci4gTGFzIGRpc2N1c2lvbmVzIGVuIGzDrW5lYSBnZW5lcmFsbWVudGUgb2ZyZWNlbiBsaWJlcnRhZCBuZWdhdGl2YSAobmFkaWUgdGUgaW1waWRlIGRlY2lyIGxvIHF1ZSBwaWVuc2FzKSBwZXJvIG5vIGxpYmVydGFkIHBvc2l0aXZhIChtdWNoYXMgcGVyc29uYXMgbm8gcHVlZGVuIHNlciBlc2N1Y2hhZGFzKS4gVW5hIGZvcm1hIGRlIGFib3JkYXIgZXN0byBlcyBpbnRyb2R1Y2lyIGFsZ8O6biB0aXBvIGRlIGxpbWl0YWNpw7NuLCBjb21vIHBlcm1pdGlyIHF1ZSBjYWRhIGFsdW1ubyBjb250cmlidXlhIGNvbiB1biBtZW5zYWplIHBvciBoaWxvIGRlIGRpc2N1c2nDs24gcG9yIGTDrWEuIEFsIGhhY2VyIGVzdG8sIGxvcyBxdWUgdGllbmVuIGFsZ28gcXVlIGRlY2lyIHRpZW5lbiBsYSBvcG9ydHVuaWRhZCBkZSBkZWNpcmxvLCBhbCB0aWVtcG8gcXVlIGRlamFuIGVzcGFjaW8gcGFyYSBxdWUgb3Ryb3MgdGFtYmnDqW4gZGlnYW4gY29zYXMuCgpPdHJhIHByZW9jdXBhY2nDs24gcXVlIGxhIGdlbnRlIHRpZW5lIHNvYnJlIGxhIGVuc2XDsWFuemEgZW4gbMOtbmVhIGVzIGhhY2VyIHRyYW1wYS4gTGEgZGVzaG9uZXN0aWRhZCBkaWFyaWEgbm8gZXMgbcOhcyBjb23Dum4gZW4gbGFzIGNsYXNlcyBlbiBsw61uZWEgcXVlIGVuIGVudG9ybm9zIHByZXNlbmNpYWxlcyBbQmVjazIwMTRdLCBwZXJvIGxhIHRlbnRhY2nDs24gZGUgcXVlIGFsZ3VpZW4gbcOhcyBlc2NyaWJhIGVsIGV4YW1lbiBmaW5hbCwgeSBsYSBkaWZpY3VsdGFkIGRlIHZlcmlmaWNhciBzaSBlc3RvIHN1Y2VkacOzLCBlcyB1bmEgZGUgbGFzIHJhem9uZXMgcG9yIGxhcyBxdWUgbGFzIGluc3RpdHVjaW9uZXMgZWR1Y2F0aXZhcyBzZSBoYW4gbW9zdHJhZG8gcmVhY2lhcyBhIG9mcmVjZXIgY3LDqWRpdG8gcG9yIGNsYXNlcyBlbiBsw61uZWEgcHVyYXMuIExhIHN1cGVydmlzacOzbiByZW1vdGEgZGVsIGV4YW1lbiBlcyBwb3NpYmxlLCBwZXJvIGFudGVzIGRlIGludmVydGlyIGVuIGVzdG8sIGxlYSBbTGFuZzIwMTNdOiBleHBsb3JhIHBvciBxdcOpIHkgY8OzbW8gbG9zIGFsdW1ub3MgaGFjZW4gdHJhbXBhLCB5IGPDs21vIHNlIHB1ZWRlbiBlc3RydWN0dXJhciBsb3MgY3Vyc29zIHBhcmEgZXZpdGFyIGRhcmxlcyB1bmEgcmF6w7NuIHBhcmEgaGFjZXJsby4KCgojIyBWaWRlbwpBIHByb21pbmVudCBmZWF0dXJlIG9mIG1vc3QgTU9PQ3MgaXMgdGhlaXIgdXNlIG9mIHJlY29yZGVkIHZpZGVvIGxlY3R1cmVzLiBUaGVzZSBjYW4gYmUgZWZmZWN0aXZlOiBhcyBtZW50aW9uZWQgaW4gQ2hhcHRlciA4LCBhIHRlYWNoaW5nIHRlY2huaXF1ZSBjYWxsZWQgRGlyZWN0IEluc3RydWN0aW9uIGJhc2VkIG9uIHByZWNpc2UgZGVsaXZlcnkgb2YgYSB3ZWxsLWRlc2lnbmVkIHNjcmlwdCBoYXMgcmVwZWF0ZWRseSBiZWVuIHNob3duIHRvIGJlIGVmZmVjdGl2ZSBbU3RvYzIwMThdLiBIb3dldmVyLCBzY3JpcHRzIGZvciBkaXJlY3QgaW5zdHJ1Y3Rpb24gaGF2ZSB0byBiZSBkZXNpZ25lZCwgdGVzdGVkLCBhbmQgcmVmaW5lZCB2ZXJ5IGNhcmVmdWxseSwgd2hpY2ggaXMgYW4gaW52ZXN0bWVudCB0aGF0IG1hbnkgTU9PQ3MgaGF2ZSBiZWVuIHVud2lsbGluZyBvciB1bmFibGUgdG8gbWFrZS4gTWFraW5nIGEgc21hbGwgY2hhbmdlIHRvIGEgd2ViIHBhZ2Ugb3IgYSBzbGlkZSBkZWNrIG9ubHkgdGFrZXMgYSBmZXcgbWludXRlczsgbWFraW5nIGV2ZW4gYSBzbWFsbCBjaGFuZ2UgdG8gYSBzaG9ydCB2aWRlbyB0YWtlcyBhbiBob3VyIG9yIG1vcmUsIHNvIHRoZSBjb3N0IHRvIHRoZSB0ZWFjaGVyIG9mIGFjdGluZyBvbiBmZWVkYmFjayBjYW4gYmUgdW5zdXBwb3J0YWJsZS4gQW5kIGV2ZW4gd2hlbiB0aGV54oCZcmUgd2VsbCBtYWRlLCB2aWRlb3MgaGF2ZSB0byBiZSBjb21iaW5lZCB3aXRoIGFjdGl2aXRpZXMgdG8gYmUgYmVuZWZpY2lhbDpbS29lZDIwMTVdIGVzdGltYXRlZCwg4oCc4oCmdGhlIGxlYXJuaW5nIGJlbmVmaXQgZnJvbSBleHRyYSBkb2luZ+KApnRvIGJlIG1vcmUgdGhhbiBzaXggdGltZXMgdGhhdCBvZiBleHRyYSB3YXRjaGluZyBvciByZWFkaW5nLuKAnQoKSWYgeW91IGFyZSB0ZWFjaGluZyBwcm9ncmFtbWluZywgeW91IG1heSB1c2Ugc2NyZWVuY2FzdHMgaW5zdGVhZCBvZiBzbGlkZXMsIHNpbmNlIHRoZXkgb2ZmZXIgc29tZSBvZiB0aGUgc2FtZSBhZHZhbnRhZ2VzIGFzIGxpdmUgY29kaW5nIChTZWN0aW9uIDguMSkuW0NoZW4yMDA5XSBvZmZlcnMgdXNlZnVsIHRpcHMgZm9yIGNyZWF0aW5nIGFuZCBjcml0aXF1aW5nIHNjcmVlbmNhc3RzIGFuZCBvdGhlciB2aWRlb3M7IEZpZ3VyZSBbZjpvbmxpbmUtc2NyZWVuY2FzdGluZ10gKGZyb21bQ2hlbjIwMDldKSByZXByb2R1Y2VzIHRoZSBwYXR0ZXJucyB0aGF0IHBhcGVyIHByZXNlbnRzIGFuZCB0aGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHRoZW0uIChJdOKAmXMgYWxzbyBhIGdvb2QgZXhhbXBsZSBvZiBhIGNvbmNlcHQgbWFwIChTZWN0aW9uIDMuMSkuKQoKIVtzY3JlZW4gY2FzdF0oLi9pbWdfdHJhbmluZy9zY3JlZW5jYXN0LnN2ZykKCkVudG9uY2VzLCDCv3F1w6kgaGFjZSBxdWUgdW4gdmlkZW8gaW5zdHJ1Y3Rpdm8gc2VhIGVmZWN0aXZvPyBbR3VvMjAxNF0gbWlkacOzIGVsIGNvbXByb21pc28gb2JzZXJ2YW5kbyBjdcOhbnRvIHRpZW1wbyBsb3MgZXN0dWRpYW50ZXMgdmllcm9uIHZpZGVvcyBNT09DIHkgZGVzY3Vicmllcm9uIHF1ZToKCiogTG9zIHZpZGVvcyBtw6FzIGNvcnRvcyBzb24gbXVjaG8gbcOhcyBhdHJhY3Rpdm9zOiBsb3MgdmlkZW9zIG5vIGRlYmVuIGR1cmFyIG3DoXMgZGUgc2VpcyBtaW51dG9zLgoKKiBVbmEgY2FiZXphIHBhcmxhbnRlIHN1cGVycHVlc3RhIGVuIGRpYXBvc2l0aXZhcyBlcyBtw6FzIGF0cmFjdGl2YSBxdWUgbGEgdm96IGVuIGRpYXBvc2l0aXZhcyBzb2xhLgoKKiBMb3MgdmlkZW9zIHF1ZSBwYXJlY8OtYW4gcGVyc29uYWxlcyBwb2Ryw61hbiBzZXIgbcOhcyBhdHJhY3Rpdm9zIHF1ZSBsYXMgZ3JhYmFjaW9uZXMgZGUgZXN0dWRpbyBkZSBhbHRhIGNhbGlkYWQsIHBvciBsbyBxdWUgZmlsbWFyIGVuIGVudG9ybm9zIGluZm9ybWFsZXMgcG9kcsOtYSBmdW5jaW9uYXIgbWVqb3IgcXVlIGVsIHRyYWJham8gZGUgZXN0dWRpbyBwcm9mZXNpb25hbCBhIHVuIGNvc3RvIG1lbm9yLgoKKiBEaWJ1amFyIGVuIHVuYSB0YWJsZXRhIGVzIG3DoXMgYXRyYWN0aXZvIHF1ZSBsYXMgZGlhcG9zaXRpdmFzIGRlIFBvd2VyUG9pbnQgbyBsYXMgY2FwdHVyYXMgZGUgcGFudGFsbGEgZGUgY8OzZGlnbywgYXVucXVlIG5vIGVzdMOhIGNsYXJvIHNpIGVzdG8gc2UgZGViZSBhbCBtb3ZpbWllbnRvIHkgbGEgaW5mb3JtYWxpZGFkIG8gcG9ycXVlIHJlZHVjZSBsYSBjYW50aWRhZCBkZSB0ZXh0byBlbiBsYSBwYW50YWxsYS4KCiogRXN0w6EgYmllbiBxdWUgbG9zIG1hZXN0cm9zIGhhYmxlbiBiYXN0YW50ZSByw6FwaWRvIHNpZW1wcmUgcXVlIGVzdMOpbiBlbnR1c2lhc21hZG9zLgoKVW5hIGNvc2EgcXVlIFtHdW8yMDE0XSBubyBhYm9yZMOzIGVzIGVsIHByb2JsZW1hIGRlbCBodWV2byB5IGxhIGdhbGxpbmE6IMK/bG9zIGVzdHVkaWFudGVzIGVuY3VlbnRyYW4gcXVlIGNpZXJ0byB0aXBvIGRlIHZpZGVvIGVzIGF0cmFjdGl2byBwb3JxdWUgZXN0w6FuIGFjb3N0dW1icmFkb3MsIHBvciBsbyBxdWUgcHJvZHVjaXIgbcOhcyB2aWRlb3MgZGUgZXNlIHRpcG8gYXVtZW50YXLDoSBlbCBjb21wcm9taXNvIHNpbXBsZW1lbnRlIHBvciB1biBjb21lbnRhcmlvPyDCv2xhem8/IMK/TyBlc3RhcyByZWNvbWVuZGFjaW9uZXMgcmVmbGVqYW4gYWxndW5vcyBwcm9jZXNvcyBjb2duaXRpdm9zIG3DoXMgcHJvZnVuZG9zPyBPdHJhIGNvc2EgcXVlIGVzdGUgZG9jdW1lbnRvIG5vIGFuYWxpesOzIHNvbiBsb3MgcmVzdWx0YWRvcyBkZSBhcHJlbmRpemFqZTogc2FiZW1vcyBxdWUgbGFzIGV2YWx1YWNpb25lcyBkZSBsb3MgYWx1bW5vcyBkZSBsb3MgY3Vyc29zIG5vIHNlIGNvcnJlbGFjaW9uYW4gY29uIGVsIGFwcmVuZGl6YWplIFtTdGFyMjAxNCwgVXR0bDIwMTddLCB5IHNpIGJpZW4gZXMgcG9zaWJsZSBxdWUgbG9zIGFsdW1ub3Mgbm8gYXByZW5kYW4gZGUgY29zYXMgcXVlIG5vIHZlbiwgcXVlZGEgcG9yIGRlbW9zdHJhciBxdWUgYXByZW5kZW4gZGUgbGFzIGNvc2FzIHF1ZSB2ZW4uCgo+KipFc3RveSB1biBwb2NvIGluY29tb2RvKioKPgo+TGEgaW52ZXN0aWdhY2nDs24gZGUgW0d1bzIwMTRdIGZ1ZSBhcHJvYmFkYSBwb3IgdW5hIGp1bnRhIGRlIMOpdGljYSBkZSBpbnZlc3RpZ2FjacOzbiBkZSBsYSB1bml2ZXJzaWRhZCwgbG9zIGFsdW1ub3MgY3V5b3MgaMOhYml0b3MgZGUgdmlzdWFsaXphY2nDs24gZnVlcm9uIG1vbml0b3JlYWRvcyBjYXNpIGNvbiBjZXJ0ZXphIGhpY2llcm9uIGNsaWMgZW4gImFjZXB0YXIiIHVuIGFjdWVyZG8gZGUgdMOpcm1pbm9zIGRlIHNlcnZpY2lvIGVuIGFsZ8O6biBtb21lbnRvLCB5IG1lIGFsZWdyYSB0ZW5lciBlc3RvcyBjb25vY2ltaWVudG9zLiBQb3Igb3RybyBsYWRvLCBsYSBwYWxhYnJhICJwcml2YWNpZGFkIiBubyBhcGFyZWNpw7MgZW4gZWwgdMOtdHVsbyBuaSBlbiBlbCByZXN1bWVuIGRlIG5pbmd1bmEgZGUgbGFzIGRvY2VuYXMgZGUgYXJ0w61jdWxvcyBvIGNhcnRlbGVzIGVuIGxhIGNvbmZlcmVuY2lhIGRvbmRlIHNlIHByZXNlbnRhcm9uIGVzdG9zIHJlc3VsdGFkb3MuIFRlbmllbmRvIHVuYSBvcGNpw7NuLCBwcmVmaWVybyBubyBzYWJlciBxdcOpIHRhbiBjb21wcm9tZXRpZG9zIGVzdMOhbiBsb3MgYWx1bW5vcyBxdWUgZm9tZW50YXIgbGEgdmlnaWxhbmNpYSB1YmljdWEgZW4gZWwgYXVsYS4KCkhheSBtdWNoYXMgZm9ybWFzIGRpZmVyZW50ZXMgZGUgZ3JhYmFyIGxlY2Npb25lcyBlbiB2aWRlbzsgUGFyYSBkZXNjdWJyaXIgY3XDoWxlcyBzb24gbG9zIG3DoXMgZWZlY3Rpdm9zLCBbTXVsbDIwMDdhXSBhc2lnbsOzIGEgMzY0IGVzdHVkaWFudGVzIGRlIGbDrXNpY2EgZGUgcHJpbWVyIGHDsW8gYSB0cmF0YW1pZW50b3MgbXVsdGltZWRpYSBlbiBsw61uZWEgZGUgbGFzIExleWVzIFByaW1lcmEgeSBTZWd1bmRhIGRlIE5ld3RvbiBlbiB1bm8gZGUgbG9zIGN1YXRybyBlc3RpbG9zOgoKKipFeHBvc2ljacOzbjoqKgpwcmVzZW50YWNpw7NuIGNvbmNpc2EgZGUgZXN0aWxvIGNvbmZlcmVuY2lhLgoKKipFeHBvc2ljacOzbiBleHRlbmRpZGE6KioKY29tbyBhcnJpYmEgY29uIGluZm9ybWFjacOzbiBpbnRlcmVzYW50ZSBhZGljaW9uYWwuCgoqKlJlZnV0YWNpw7NuOioqCkV4cG9zaWNpw7NuIGNvbiBjb25jZXB0b3MgZXJyw7NuZW9zIGNvbXVuZXMgZXhwbMOtY2l0YW1lbnRlIGRlY2xhcmFkb3MgeSByZWZ1dGFkb3MuCgoqKkRpw6Fsb2dvOioqCkRpc2N1c2nDs24gYXByZW5kaXotdHV0b3IgZGVsIG1pc21vIG1hdGVyaWFsIHF1ZSBlbiBsYSBSZWZ1dGFjacOzbi4KClJlZnV0YXRpb24gYW5kIERpYWxvZyBwcm9kdWpvIGxhcyBtYXlvcmVzIGdhbmFuY2lhcyBkZSBhcHJlbmRpemFqZSBlbiBjb21wYXJhY2nDs24gY29uIEV4cG9zaXRpb247IGxvcyBhbHVtbm9zIGNvbiBwb2NvIGNvbm9jaW1pZW50byBwcmV2aW8gc2UgYmVuZWZpY2lhcm9uIG3DoXMsIHkgYXF1ZWxsb3MgY29uIGFsdG8gY29ub2NpbWllbnRvIHByZXZpbyBubyBzZSB2aWVyb24gZW4gZGVzdmVudGFqYS4gTnVldmFtZW50ZSwgZXN0byByZXNhbHRhIGxhIGltcG9ydGFuY2lhIGRlIGFib3JkYXIgZGlyZWN0YW1lbnRlIGxvcyBjb25jZXB0b3MgZXJyw7NuZW9zIGRlIGxvcyBhbHVtbm9zLiBObyBzb2xvIGxlIGRpZ2FzIGEgbGEgZ2VudGUgcXXDqSBlczogZGlsZXMgcXXDqSBubyBlcyB5IHBvciBxdcOpIG5vLgoKCiMjIE1vZGVsb3MgaMOtYnJpZG9zCkxhIGVuc2XDsWFuemEgdG90YWxtZW50ZSBhdXRvbWF0aXphZGEgZXMgc29sbyB1bmEgZm9ybWEgZGUgdXRpbGl6YXIgbGEgd2ViIGVuIGxhIGVuc2XDsWFuemEuIEVuIGxhIHByw6FjdGljYSwgY2FzaSB0b2RvIGVsIGFwcmVuZGl6YWplIGVuIHNvY2llZGFkZXMgcmljYXMgdGllbmUgdW4gY29tcG9uZW50ZSBlbiBsw61uZWEgaG95LCB5YSBzZWEgb2ZpY2lhbG1lbnRlIG8gbWVkaWFudGUgY2FuYWxlcyBkZSByZXRyb2Nlc28gZW50cmUgcGFyZXMgeSBiw7pzcXVlZGFzIHN1YnJlcHRpY2lhcyBkZSByZXNwdWVzdGFzIGEgcHJlZ3VudGFzIGRlIHRhcmVhLiBMYSBjb21iaW5hY2nDs24gZGUgaW5zdHJ1Y2Npw7NuIGVuIHZpdm8geSBhdXRvbWF0aXphZGEgcGVybWl0ZSBhIGxvcyBtYWVzdHJvcyB1c2FyIGxhcyBmb3J0YWxlemFzIGRlIGFtYm9zLiBFbiB1biBhdWxhIHRyYWRpY2lvbmFsLCBlbCBtYWVzdHJvIHB1ZWRlIHJlc3BvbmRlciBwcmVndW50YXMgZGUgaW5tZWRpYXRvLCBwZXJvIGEgbG9zIGFsdW1ub3MgbGVzIGxsZXZhIGTDrWFzIG8gc2VtYW5hcyByZWNpYmlyIGNvbWVudGFyaW9zIHNvYnJlIHN1cyBlamVyY2ljaW9zIGRlIGNvZGlmaWNhY2nDs24uIEVuIGzDrW5lYSwgcHVlZGUgdG9tYXIgbcOhcyB0aWVtcG8gcGFyYSBxdWUgdW4gYWx1bW5vIG9idGVuZ2EgdW5hIHJlc3B1ZXN0YSwgcGVybyBwdWVkZSBvYnRlbmVyIHJldHJvYWxpbWVudGFjacOzbiBpbm1lZGlhdGEgc29icmUgc3UgY29kaWZpY2FjacOzbiAoYWwgbWVub3MgcGFyYSBlc2UgdGlwbyBkZSBlamVyY2ljaW9zIHBvZGVtb3MgYXV0by1jYWxpZmljYXIpLgoKT3RyYSBkaWZlcmVuY2lhIGVzIHF1ZSBsb3MgZWplcmNpY2lvcyBlbiBsw61uZWEgZGViZW4gc2VyIG3DoXMgZGV0YWxsYWRvcyBwb3JxdWUgdGllbmVuIHF1ZSBhbnRpY2lwYXIgbGFzIHByZWd1bnRhcyBkZSBsb3MgYWx1bW5vcy4gRW5jdWVudHJvIHF1ZSBsYXMgbGVjY2lvbmVzIGVuIHBlcnNvbmEgY29taWVuemFuIGNvbiBsYSBpbnRlcnNlY2Npw7NuIGRlIGxvIHF1ZSB0b2RvcyBuZWNlc2l0YW4gc2FiZXIgeSBzZSBleHBhbmRlIGJham8gZGVtYW5kYSwgbWllbnRyYXMgcXVlIGxhcyBsZWNjaW9uZXMgZW4gbMOtbmVhIGRlYmVuIGluY2x1aXIgbGEgdW5pw7NuIGRlIGxvIHF1ZSB0b2RvcyBuZWNlc2l0YW4gc2FiZXIgcG9ycXVlIGVsIG1hZXN0cm8gbm8gZXN0w6EgYWxsw60gcGFyYSBoYWNlciBsYSBleHBhbnNpw7NuLgoKRW4gcmVhbGlkYWQsIGxhIGRpc3RpbmNpw7NuIGVudHJlIGVuIGzDrW5lYSB5IGVuIHBlcnNvbmEgYWhvcmEgZXMgbWVub3MgaW1wb3J0YW50ZSBwYXJhIGxhIG1heW9yw61hIGRlIGxhcyBwZXJzb25hcyBxdWUgbGEgZGlzdGluY2nDs24gZW50cmUgc8OtbmNyb25vIHkgYXPDrW5jcm9ubzogwr9sb3MgcHJvZmVzb3JlcyB5IGxvcyBhbHVtbm9zIGludGVyYWN0w7phbiBlbiB0aWVtcG8gcmVhbCwgbyBzdSBjb211bmljYWNpw7NuIHNlIGV4dGllbmRlIGUgaW50ZXJjYWxhIGNvbiBvdHJhcyBhY3RpdmlkYWRlcz8gRW4gcGVyc29uYSBjYXNpIHNpZW1wcmUgc2Vyw6Egc2luY3LDs25pY28sIHBlcm8gZW4gbMOtbmVhIGVzIGNhZGEgdmV6IG3DoXMgdW5hIG1lemNsYSBkZSBhbWJvczoKCj5DcmVvIHF1ZSBudWVzdHJvcyBuaWV0b3MgcHJvYmFibGVtZW50ZSBjb25zaWRlcmFyw6FuIGxhIGRpc3RpbmNpw7NuIHF1ZSBoYWNlbW9zIGVudHJlIGxvIHF1ZSBsbGFtYW1vcyBlbCBtdW5kbyByZWFsIHkgbG8gcXVlIHBpZW5zYW4gcXVlIGVzID5zaW1wbGVtZW50ZSBlbCBtdW5kbyBjb21vIGxvIG3DoXMgZXh0cmHDsW8gZSBpbmNvbXByZW5zaWJsZSBkZSBub3NvdHJvcy4KPiAtLSBXaWxsaWFtIEdpYnNvbgoKCkxhIGltcGxlbWVudGFjacOzbiBtw6FzIHBvcHVsYXIgZGUgZXN0ZSBmdXR1cm8gY29tYmluYWRvIGhveSBlbiBkw61hIGVzIGVsICoqYXVsYSBpbnZlcnRpZGEqKiwgZW4gbGEgcXVlIGxvcyBhbHVtbm9zIHZlbiBsYXMgbGVjY2lvbmVzIGdyYWJhZGFzIHBvciBzdSBjdWVudGEgeSBlbCB0aWVtcG8gZGUgY2xhc2Ugc2UgdXRpbGl6YSBwYXJhIGRlYmF0aXIgeSByZXNvbHZlciBsb3MgcHJvYmxlbWFzLiBPcmlnaW5hbG1lbnRlIGRlc2NyaXRhIGVuIFtLaW5nMTk5M10sIGxhIGlkZWEgc2UgcG9wdWxhcml6w7MgY29tbyBwYXJ0ZSBkZSBsYSBpbnN0cnVjY2nDs24gZW50cmUgcGFyZXMgKFNlY2Npw7NuIDkuMikgeSBzZSBoYSBlc3R1ZGlhZG8gaW50ZW5zYW1lbnRlIGR1cmFudGUgbGEgw7psdGltYSBkw6ljYWRhLiBQb3IgZWplbXBsbywgW0NhbXAyMDE2XSBjb21wYXLDsyBhIGxvcyBlc3R1ZGlhbnRlcyBxdWUgdG9tYXJvbiB1bmEgY2xhc2UgaW50cm9kdWN0b3JpYSBkZSBjaWVuY2lhcyBkZSBsYSBjb21wdXRhY2nDs24gZW4gbMOtbmVhIGNvbiBhcXVlbGxvcyBxdWUgbGEgdG9tYXJvbiBlbiB1biBhdWxhIGludmVydGlkYS4gTGEgZmluYWxpemFjacOzbiBkZSBsb3MgZWplcmNpY2lvcyBkZSBwcsOhY3RpY2EgKHNpbiBtYXJjYXIpIHNlIGNvcnJlbGFjaW9uw7MgY29uIGxvcyBwdW50YWplcyBkZSBsb3MgZXjDoW1lbmVzIHBhcmEgYW1ib3MsIHBlcm8gbGEgdGFzYSBkZSBmaW5hbGl6YWNpw7NuIGRlIGxvcyBlamVyY2ljaW9zIGRlIGVuc2F5byBwb3IgcGFydGUgZGUgbG9zIGFsdW1ub3MgZW4gbMOtbmVhIGZ1ZSBzaWduaWZpY2F0aXZhbWVudGUgbWVub3IgcXVlIGxhcyB0YXNhcyBkZSBhc2lzdGVuY2lhIGEgbGEgY2xhc2UgcGFyYSBsb3MgYWx1bW5vcyBlbiBwZXJzb25hLgoKUGVybyBzaSBoYXkgZ3JhYmFjaW9uZXMgZGlzcG9uaWJsZXMsIMK/bG9zIGFsdW1ub3Mgc2VndWlyw6FuIGFwYXJlY2llbmRvIGVuIGNsYXNlIHBhcmEgaGFjZXIgZWplcmNpY2lvcyBkZSBwcsOhY3RpY2E/IFtOb3JkMjAxN10gZXhhbWluw7MgZWwgaW1wYWN0byBkZSBsYXMgZ3JhYmFjaW9uZXMgdGFudG8gZW4gbGEgYXNpc3RlbmNpYSBhIGxhIGNvbmZlcmVuY2lhIGNvbW8gZW4gZWwgcmVuZGltaWVudG8gZGUgbG9zIGFsdW1ub3MgZW4gZGlmZXJlbnRlcyBuaXZlbGVzLiBFbiBsYSBtYXlvcsOtYSBkZSBsb3MgY2Fzb3MsIGVsIGVzdHVkaW8gbm8gZW5jb250csOzIGNvbnNlY3VlbmNpYXMgbmVnYXRpdmFzIGRlIGhhY2VyIGRpc3BvbmlibGVzIGxhcyBncmFiYWNpb25lczsgZW4gcGFydGljdWxhciwgbG9zIGFsdW1ub3Mgbm8gc2Ugc2FsdGFyb24gbGFzIGNvbmZlcmVuY2lhcyBjdWFuZG8gaGF5IGdyYWJhY2lvbmVzIGRpc3BvbmlibGVzIChhbCBtZW5vcywgbm8gbcOhcyBkZSBsbyBxdWUgc3VlbGVuIGhhY2VyKS4gTG9zIGJlbmVmaWNpb3MgZGUgcHJvcG9yY2lvbmFyIGdyYWJhY2lvbmVzIGZ1ZXJvbiBtYXlvcmVzIHBhcmEgbG9zIGVzdHVkaWFudGVzIGFsIHByaW5jaXBpbyBkZSBzdXMgY2FycmVyYXMsIHBlcm8gZGlzbWludXllcm9uIGEgbWVkaWRhIHF1ZSBsb3MgZXN0dWRpYW50ZXMgc2UgaGljaWVyb24gbcOhcyBtYWR1cm9zLgoKT3RybyBtb2RlbG8gaMOtYnJpZG8gdHJhZSBsYSB2aWRhIGVuIGzDrW5lYSBhbCBhdWxhLiBUb21hciBub3RhcyBqdW50YXMgZXMgdW4gcHJpbWVyIHBhc28gKFNlY2Npw7NuIDkuNyk7IGFncnVwYXIgcmVzcHVlc3RhcyBhIHByZWd1bnRhcyBkZSBvcGNpw7NuIG3Dumx0aXBsZSBlbiB0aWVtcG8gcmVhbCB1dGlsaXphbmRvIGhlcnJhbWllbnRhcyBjb21vIFBlYXIgRGVjayB5IFNvY3JhdGl2ZSBlcyBvdHJhLiBTaSBsYSBjbGFzZSBlcyBwZXF1ZcOxYSwgZGlnYW1vcywgZGUgdW5hIGRvY2VuYSBhIHF1aW5jZSBwZXJzb25hcywgdGFtYmnDqW4gcHVlZGUgaGFjZXIgcXVlIHRvZG9zIGxvcyBhbHVtbm9zIHNlIHVuYW4gYSB1bmEgdmlkZW9jb25mZXJlbmNpYSBwYXJhIHF1ZSBwdWVkYW4gY29tcGFydGlyIGxhIHBhbnRhbGxhIGNvbiBlbCBtYWVzdHJvLiBFc3RvIGxlcyBwZXJtaXRlIG1vc3RyYXIgc3UgdHJhYmFqbyAobyBzdXMgcHJvYmxlbWFzKSBhIHRvZGEgbGEgY2xhc2Ugc2luIHRlbmVyIHF1ZSBjb25lY3RhciBzdSBjb21wdXRhZG9yYSBwb3J0w6F0aWwgYWwgcHJveWVjdG9yLiBMb3MgYWx1bW5vcyB0YW1iacOpbiBwdWVkZW4gdXNhciBlbCBjaGF0IGVuIGxhIHZpZGVvbGxhbWFkYSBwYXJhIHB1YmxpY2FyIHByZWd1bnRhcyBwYXJhIGVsIHByb2Zlc29yOyBFbiBtaSBleHBlcmllbmNpYSwgbGEgbWF5b3LDrWEgZGUgZWxsb3Mgc2Vyw6FuIHJlc3BvbmRpZG9zIHBvciBzdXMgY29tcGHDsWVyb3MgZGUgYXByZW5kaXphamUsIHkgZWwgbWFlc3RybyBwdWVkZSBtYW5lamFyIGVsIHJlc3RvIGN1YW5kbyBsbGVndWVuIGEgdW4gZGVzY2Fuc28gbmF0dXJhbC4gRXN0ZSBtb2RlbG8gYXl1ZGEgYSBuaXZlbGFyIGVsIGNhbXBvIGRlIGp1ZWdvIHBhcmEgbG9zIGFsdW1ub3MgcmVtb3Rvczogc2kgYWxndWllbiBubyBwdWVkZSBhc2lzdGlyIGEgY2xhc2UgcG9yIHJhem9uZXMgZGUgc2FsdWQgbyBwb3IgY29tcHJvbWlzb3MgZmFtaWxpYXJlcyBvIGxhYm9yYWxlcywgYcO6biBwdWVkZSBwYXJ0aWNpcGFyIGRlIG1hbmVyYSBjYXNpIGlndWFsIHNpIHRvZG9zIGVzdMOhbiBhY29zdHVtYnJhZG9zIGEgY29sYWJvcmFyIGVuIGzDrW5lYSBlbiB0aWVtcG8gcmVhbC4KClRhbWJpw6luIGhlIGltcGFydGlkbyBjbGFzZXMgdXRpbGl6YW5kbyBsYSBpbnN0cnVjY2nDs24gcmVtb3RhIGVuIHRpZW1wbyByZWFsLCBlbiBsYSBxdWUgbG9zIGFsdW1ub3Mgc2UgdWJpY2FuIGVuIDLigJM2IHNpdGlvcyBjb24gYXl1ZGFudGVzIHByZXNlbnRlcyBtaWVudHJhcyBlbnNlw7FvIGEgdHJhdsOpcyBkZSBsYSB0cmFuc21pc2nDs24gZGUgdmlkZW8gKFNlY2Npw7NuIDE4LjEpLiBFc3RvIGVzY2FsYSBiaWVuLCBhaG9ycmEgZW4gY29zdG9zIGRlIHZpYWplIHkgcGVybWl0ZSBlbCB1c28gZGUgdMOpY25pY2FzIGNvbW8gbGEgcHJvZ3JhbWFjacOzbiBkZSBwYXJlcyAoU2VjY2nDs24gOS42KS4gTG8gcXVlIG5vIGZ1bmNpb25hIGVzIHRlbmVyIHVuIGdydXBvIGVuIHBlcnNvbmEgeSB1bm8gbyBtw6FzIGdydXBvcyBkZSBmb3JtYSByZW1vdGE6IGNvbiBsYSBtZWpvciB2b2x1bnRhZCBkZWwgbXVuZG8sIGxvcyBwYXJ0aWNpcGFudGVzIGxvY2FsZXMgcmVjaWJlbiBtdWNoYSBtw6FzIGF0ZW5jacOzbi4KCgojIyBDb21wcm9taXNvIGVuIGzDrW5lYQpbTnV0aDIwMDddIGRlc2N1YnJpw7MgcXVlIGhheSB0cmVzIG11bmRvcyBzdXBlcnB1ZXN0b3MgZW4gY2FkYSBhdWxhOiBlbCBww7pibGljbyAobG8gcXVlIGRpY2UgeSBoYWNlIGVsIG1hZXN0cm8pLCBsbyBzb2NpYWwgKGludGVyYWNjaW9uZXMgZW50cmUgYWx1bW5vcykgeSBsbyBwcml2YWRvIChkZW50cm8gZGUgbGEgY2FiZXphIGRlIGNhZGEgYWx1bW5vKS4gRGUgZXN0b3MsIGVsIG3DoXMgaW1wb3J0YW50ZSBzdWVsZSBzZXIgZWwgc29jaWFsOiBsb3MgYWx1bW5vcyBjYXB0YW4gdGFudG8gYSB0cmF2w6lzIGRlIGxhcyBzZcOxYWxlcyBkZSBzdXMgY29tcGHDsWVyb3MgY29tbyBsbyBoYWNlbiBkZSBsYSBpbnN0cnVjY2nDs24gZm9ybWFsLgoKUG9yIGxvIHRhbnRvLCBsYSBjbGF2ZSBwYXJhIGhhY2VyIGVmZWN0aXZhIGN1YWxxdWllciBmb3JtYSBkZSBlbnNlw7FhbnphIGVuIGzDrW5lYSBlcyBmYWNpbGl0YXIgbGFzIGludGVyYWNjaW9uZXMgZW50cmUgcGFyZXMuIFBhcmEgYXl1ZGFyIGEgZXN0bywgbG9zIGN1cnNvcyBjYXNpIHNpZW1wcmUgdGllbmVuIGFsZ8O6biB0aXBvIGRlIGZvcm8gZGUgZGlzY3VzacOzbi4gW01pbGwyMDE2YV0gb2JzZXJ2w7MgcXVlIGxvcyBhbHVtbm9zIHVzYW4gZXN0b3MgZGUgbWFuZXJhcyBtdXkgZGlmZXJlbnRlczoKCj7igKYgTG9zIHBvc3RlcmdhZG9yZXMgc29uIHBhcnRpY3VsYXJtZW50ZSBpbXByb2JhYmxlcyBkZSBwYXJ0aWNpcGFyIGVuIGZvcm9zIGRlIGRpc2N1c2nDs24gZW4gbMOtbmVhLCB5IGVzdGEgcGFydGljaXBhY2nDs24gcmVkdWNpZGEsIGEgc3UgdmV6LCBzZSBjb3JyZWxhY2lvbmEgY29uIHBlb3JlcyBjYWxpZmljYWNpb25lcy4gVW5hIHBvc2libGUgZXhwbGljYWNpw7NuIHBhcmEgZXN0YSBjb3JyZWxhY2nDs24gZXMgcXVlIGxvcyBwb3N0ZXJnYWRvcmVzIGR1ZGFuIGVzcGVjaWFsbWVudGUgZW4gdW5pcnNlIHVuYSB2ZXogcXVlIHNlIGluaWNpYSBsYSBkaXNjdXNpw7NuLCB0YWwgdmV6IHBvcnF1ZSBsZXMgcHJlb2N1cGEgc2VyIHBlcmNpYmlkb3MgY29tbyByZWNpw6luIGxsZWdhZG9zIGVuIHVuYSBjb252ZXJzYWNpw7NuIGVzdGFibGVjaWRhLiBFc3RhIGF2ZXJzacOzbiBhIHNhbHRhciB0YXJkZSBoYWNlIHF1ZSBzZSBwaWVyZGFuIGxvcyBpbXBvcnRhbnRlcyBiZW5lZmljaW9zIGRlIGFwcmVuZGl6YWplIHkgbW90aXZhY2nDs24gZGUgbGEgaW50ZXJhY2Npw7NuIGVudHJlIHBhcmVzLgoKW1ZlbGwyMDE3XSBhbmFsaXphIGxvcyBtZW5zYWplcyBkZWwgZm9ybyBkZSBkaXNjdXNpw7NuIGRlIDM5NSBlc3R1ZGlhbnRlcyBkZSBDUzIgZW4gZG9zIHVuaXZlcnNpZGFkZXMgZGl2aWRpw6luZG9sb3MgZW4gY3VhdHJvIGNhdGVnb3LDrWFzOgoKKipBY3Rpdm86KioKU29saWNpdHVkIGRlIGF5dWRhIHF1ZSBubyBtdWVzdHJhIGVsIHJhem9uYW1pZW50byB5IG5vIG11ZXN0cmEgbG8gcXVlIGVsIGVzdHVkaWFudGUgeWEgaGEgaW50ZW50YWRvIG8geWEgc2FiZS4KCioqQ29uc3RydWN0aXZvOioqCnJlZmxlamFyIGVsIHJhem9uYW1pZW50byBvIGxvcyBpbnRlbnRvcyBkZSBsb3MgZXN0dWRpYW50ZXMgZGUgY29uc3RydWlyIHVuYSBzb2x1Y2nDs24gYWwgcHJvYmxlbWEuCgoqKkxvZ8Otc3RpY2E6KioKcG9sw610aWNhcyBkZWwgY3Vyc28sIGhvcmFyaW9zLCBlbnbDrW8gZGUgdGFyZWFzLCBldGMuCgoqKkFjbGFyYWNpw7NuIGRlIGNvbnRlbmlkbzoqKgpTb2xpY2l0YXIgaW5mb3JtYWNpw7NuIGFkaWNpb25hbCBxdWUgbm8gcmV2ZWxlIGVsIHBlbnNhbWllbnRvIGRlbCBlc3R1ZGlhbnRlLgpEZXNjdWJyaWVyb24gcXVlIGxhcyBwcmVndW50YXMgY29uc3RydWN0aXZhcyB5IGxvZ8Otc3RpY2FzIGRvbWluYWJhbiwgeSBxdWUgbGFzIHByZWd1bnRhcyBjb25zdHJ1Y3RpdmFzIHNlIGNvcnJlbGFjaW9uYWJhbiBjb24gbGFzIGNhbGlmaWNhY2lvbmVzLiBUYW1iacOpbiBkZXNjdWJyaWVyb24gcXVlIGxvcyBlc3R1ZGlhbnRlcyByYXJhIHZleiBoYWNlbiBtw6FzIGRlIHVuYSBwcmVndW50YSBhY3RpdmEgZW4gdW4gY3Vyc28sIHkgcXVlIG5vIHNlIGNvcnJlbGFjaW9uYW4gY29uIGxhcyBjYWxpZmljYWNpb25lcy4gU2kgYmllbiBlc3RvIGVzIGRlY2VwY2lvbmFudGUsIHNhYmVyIHF1ZSBheXVkYSBhIGVzdGFibGVjZXIgbGFzIGV4cGVjdGF0aXZhcyBkZSBsb3MgbWFlc3Ryb3M6IHNpIGJpZW4gdG9kb3MgcXVlcmVtb3MgcXVlIG51ZXN0cm9zIGN1cnNvcyB0ZW5nYW4gY29tdW5pZGFkZXMgZW4gbMOtbmVhIGFuaW1hZGFzLCB0ZW5lbW9zIHF1ZSBhY2VwdGFyIHF1ZSBsYSBtYXlvcsOtYSBubyBsbyBoYXLDoSwgbyBxdWUgbGEgbWF5b3LDrWEgZGUgbGEgZGlzY3VzacOzbiBkZSBhbHVtbm8gYSBhbHVtbm8gc2UgbGxldmFyw6EgYSBjYWJvIGEgdHJhdsOpcyBkZSBjYW5hbGVzIHF1ZSB5YSBlc3TDoW4gdXNhbmRvIHkgZGUgbG9zIHF1ZSBubyBmb3JtYW1vcyBwYXJ0ZS4KCj4qKkNvb3BlcmFjaW9uKioKPltHdWxsMjAwNF0gZGVzY3JpYmUgdW4gY29uY3Vyc28gZGUgY29kaWZpY2FjacOzbiBlbiBsw61uZWEgcXVlIGNvbWJpbmEgY29sYWJvcmFjacOzbiB5IGNvbXBldGVuY2lhLiBFbCBjb25jdXJzbyBjb21pZW56YSBjdWFuZG8gc2UgcHVibGljYSB1bmEgZGVzY3JpcGNpw7NuIGRlbCBwcm9ibGVtYSBqdW50byBjb24gdW5hIHNvbHVjacOzbiBjb3JyZWN0YSBwZXJvIGluZWZpY2llbnRlLiBDdWFuZG8gdGVybWluYSwgZWwgZ2FuYWRvciBlcyBsYSBwZXJzb25hIHF1ZSBoYSByZWFsaXphZG8gbGEgbWF5b3IgY29udHJpYnVjacOzbiBnZW5lcmFsIHBhcmEgbWVqb3JhciBlbCByZW5kaW1pZW50byBkZSBsYSBzb2x1Y2nDs24gZ2VuZXJhbC4gVG9kb3MgbG9zIGVudsOtb3Mgc29uIGFiaWVydG9zLCBwYXJhIHF1ZSBsb3MgcGFydGljaXBhbnRlcyBwdWVkYW4gdmVyIGVsIHRyYWJham8gZGUgbG9zIGRlbcOhcyB5IHRvbWFyIGlkZWFzIHByZXN0YWRhcyBlbnRyZSBlbGxvcy4gQ29tbyBtdWVzdHJhIGVsIGRvY3VtZW50bywgbGEgc29sdWNpw7NuIGZpbmFsIGVzIGNhc2kgc2llbXByZSB1bmEgaWRlYSBkZSBwcsOpc3RhbW8gaMOtYnJpZG8gZGUgbXVjaGFzIHBlcnNvbmFzLgo+Cj5bQmF0dDIwMThdIGRlc2NyaWJpw7MgdW5hIHZhcmlhY2nDs24gYSBwZXF1ZcOxYSBlc2NhbGEgZGUgZXN0byBlbiB1bmEgY2xhc2UgZGUgY29tcHV0YWNpw7NuIGludHJvZHVjdG9yaWEuIEVuIGxhIGV0YXBhIHVubywgY2FkYSBhbHVtbm8gcHJlc2VudMOzIHVuIHByb3llY3RvIGRlIHByb2dyYW1hY2nDs24gaW5kaXZpZHVhbG1lbnRlLiBFbiBsYSBldGFwYSBkb3MsIGxvcyBhbHVtbm9zIHNlIGVtcGFyZWphcm9uIHBhcmEgY3JlYXIgdW5hIHNvbHVjacOzbiBtZWpvcmFkYSBwYXJhIGVsIG1pc21vIHByb2JsZW1hLiBMYSBldmFsdWFjacOzbiBpbmRpY2EgcXVlIGxvcyBwcm95ZWN0b3MgZGUgZG9zIGV0YXBhcyB0aWVuZGVuIGEgbWVqb3JhciBsYSBjb21wcmVuc2nDs24gZGUgbG9zIGFsdW1ub3MgeSBxdWUgZGlzZnJ1dGFyb24gZWwgcHJvY2Vzby4gUHJveWVjdG9zIGNvbW8gZXN0b3Mgbm8gc29sbyBtZWpvcmFuIGVsIGNvbXByb21pc28sIHNpbm8gcXVlIHRhbWJpw6luIGJyaW5kYW4gYSBsb3MgcGFydGljaXBhbnRlcyBtw6FzIGV4cGVyaWVuY2lhIHNvYnJlIGxhIGJhc2UgZGVsIGPDs2RpZ28gZGUgb3RyYSBwZXJzb25hLgoKTGEgZGlzY3VzacOzbiBubyBlcyBsYSDDum5pY2EgZm9ybWEgZGUgbG9ncmFyIHF1ZSBsb3MgYWx1bW5vcyB0cmFiYWplbiBqdW50b3MgZW4gbMOtbmVhLiBbUGFyZTIwMDhdIHkgW0t1bGsyMDEzXSBpbmZvcm1hbiBleHBlcmltZW50b3MgZW4gbG9zIHF1ZSBsb3MgYWx1bW5vcyBjYWxpZmljYW4gZWwgdHJhYmFqbyBkZSBsb3MgZGVtw6FzLCB5IGxhcyBjYWxpZmljYWNpb25lcyBxdWUgYXNpZ25hbiBzZSBjb21wYXJhbiBjb24gbGFzIGNhbGlmaWNhY2lvbmVzIG90b3JnYWRhcyBwb3IgbG9zIGFzaXN0ZW50ZXMgZGUgZW5zZcOxYW56YSBkZSBwb3NncmFkbyB1IG90cm9zIGV4cGVydG9zLiBBbWJvcyBkZXNjdWJyaWVyb24gcXVlIGxhcyBjYWxpZmljYWNpb25lcyBhc2lnbmFkYXMgcG9yIGVsIGFsdW1ubyBjb2luY2lkw61hbiBjb24gbGFzIGNhbGlmaWNhY2lvbmVzIGFzaWduYWRhcyBwb3IgZXhwZXJ0b3MgdGFuIGEgbWVudWRvIGNvbW8gbGFzIGNhbGlmaWNhY2lvbmVzIGRlIGxvcyBleHBlcnRvcyBjb2luY2lkw61hbiBlbnRyZSBzw60sIHkgcXVlIHVub3MgcG9jb3MgcGFzb3Mgc2ltcGxlcyAoY29tbyBmaWx0cmFyIHJlc3B1ZXN0YXMgb2J2aWFtZW50ZSBubyBjb25zaWRlcmFkYXMgbyBlc3RydWN0dXJhciByw7picmljYXMpIGRpc21pbnV5ZXJvbiBhw7puIG3DoXMgZWwgZGVzYWN1ZXJkby4gWSBjb21vIHNlIGRpc2N1dGnDsyBlbiBsYSBTZWNjacOzbiA1LjMsIGxhIGNvbHVzacOzbiB5IGVsIHNlc2dvIG5vIHNvbiBmYWN0b3JlcyBzaWduaWZpY2F0aXZvcyBlbiBsYSBjbGFzaWZpY2FjacOzbiBwb3IgcGFyZXMuCgo+KipDb25mw61hLCBwZXJvIGVkdWNhKioKPgo+TGEgZm9ybWEgbcOhcyBjb23Dum4gZGUgbWVkaXIgbGEgdmFsaWRleiBkZSBsYSByZXRyb2FsaW1lbnRhY2nDs24gZXMgY29tcGFyYXIgbGFzIGNhbGlmaWNhY2lvbmVzIGRlIGxvcyBhbHVtbm9zIGNvbiBsYXMgY2FsaWZpY2FjaW9uZXMgZGUgbG9zIGV4cGVydG9zLCBwZXJvIGxhIHJldmlzacOzbiBwb3IgcGFyZXMgY2FsaWJyYWRhIChTZWNjacOzbiA1LjMpIHB1ZWRlIHNlciBpZ3VhbG1lbnRlIGVmZWN0aXZhLiBBbnRlcyBkZSBwZWRpcmxlcyBhIGxvcyBhbHVtbm9zIHF1ZSBjYWxpZmlxdWVuIGVsIHRyYWJham8gZGUgbG9zIGRlbcOhcywgc2UgbGVzIHBpZGUgcXVlIGNhbGlmaXF1ZW4gbXVlc3RyYXMgeSBjb21wYXJlbiBzdXMgcmVzdWx0YWRvcyBjb24gbGFzIGNhbGlmaWNhY2lvbmVzIGFzaWduYWRhcyBwb3IgZWwgbWFlc3Ryby4gVW5hIHZleiBxdWUgbG9zIGRvcyBzZSBhbGluZWFuLCBlbCBhbHVtbm8gcHVlZGUgY29tZW56YXIgYSBkYXIgY2FsaWZpY2FjaW9uZXMgYSBzdXMgY29tcGHDsWVyb3MuIERhZG8gcXVlIGxhIGxlY3R1cmEgY3LDrXRpY2EgZXMgdW5hIGZvcm1hIGVmZWN0aXZhIGRlIGFwcmVuZGVyLCBlc3RlIHJlc3VsdGFkbyBwdWVkZSBhcHVudGFyIGEgdW4gZnV0dXJvIGVuIGVsIHF1ZSBsb3MgZXN0dWRpYW50ZXMgdXNhbiBsYSB0ZWNub2xvZ8OtYSBwYXJhIGVtaXRpciBqdWljaW9zLCBlbiBsdWdhciBkZSBzZXIganV6Z2Fkb3MgcG9yIGxhIHRlY25vbG9nw61hLgoKVW5hIHTDqWNuaWNhIHF1ZSBkZWZpbml0aXZhbWVudGUgdmVyZW1vcyBtw6FzIGVuIGxvcyBwcsOzeGltb3MgYcOxb3MgZXMgbGEgdHJhbnNtaXNpw7NuIGVuIGzDrW5lYSBkZSBzZXNpb25lcyBkZSBjb2RpZmljYWNpw7NuIGVuIHZpdm8gW1JhajIwMTgsIEhhYXIyMDE3XS4gRXN0byB0aWVuZSBsYSBtYXlvcsOtYSBkZSBsb3MgYmVuZWZpY2lvcyBkaXNjdXRpZG9zIGVuIGxhIFNlY2Npw7NuIDguMSwgeSBjdWFuZG8gc2UgY29tYmluYSBjb24gbGEgdG9tYSBkZSBub3RhcyBlbiBjb2xhYm9yYWNpw7NuIChTZWNjacOzbiA5LjcpIHB1ZWRlIHNlciB1bmEgYXByb3hpbWFjacOzbiBjZXJjYW5hIGEgdW5hIGV4cGVyaWVuY2lhIGVuIGNsYXNlLgoKTWlyYW5kbyBhw7puIG3DoXMgYWRlbGFudGUsIFtJanNzMjAwMF0gaWRlbnRpZmljw7MgY3VhdHJvIG5pdmVsZXMgZGUgcHJlc2VuY2lhIGVuIGzDrW5lYSwgZGVzZGUgZWwgcmVhbGlzbW8gKG5vIHBvZGVtb3MgZGlzdGluZ3VpciBsYSBkaWZlcmVuY2lhKSBoYXN0YSBsYSBpbm1lcnNpw7NuIChvbHZpZGFtb3MgbGEgZGlmZXJlbmNpYSkgeSBsYSBwYXJ0aWNpcGFjacOzbiAoZXN0YW1vcyBjb21wcm9tZXRpZG9zIHBlcm8gY29uc2NpZW50ZXMgZGUgbGEgZGlmZXJlbmNpYSkgaGFzdGEgbGEgc3VzcGVuc2nDs24gZGUgaW5jcmVkdWxpZGFkIChlc3RhbW9zIGhhY2llbmRvIGxhIG1heW9yIHBhcnRlIGRlbCB0cmFiYWpvKS4gQ3J1Y2lhbG1lbnRlLCBkaXN0aW5ndWVuIGxhIHByZXNlbmNpYSBmw61zaWNhLCBxdWUgZXMgbGEgc2Vuc2FjacOzbiBkZSBlc3RhciByZWFsbWVudGUgZW4gYWxnw7puIGx1Z2FyLCB5IGxhIHByZXNlbmNpYSBzb2NpYWwsIHF1ZSBlcyBsYSBzZW5zYWNpw7NuIGRlIGVzdGFyIGNvbiBsb3MgZGVtw6FzLiBFc3RvIMO6bHRpbW8gZXMgbcOhcyBpbXBvcnRhbnRlIGVuIGxhIG1heW9yw61hIGRlIGxhcyBzaXR1YWNpb25lcyBkZSBhcHJlbmRpemFqZSB5LCB1bmEgdmV6IG3DoXMsIHBvZGVtb3MgZm9tZW50YXJsbyB1dGlsaXphbmRvIGxhIHRlY25vbG9nw61hIGNvdGlkaWFuYSBkZSBsb3MgYWx1bW5vcyBlbiBlbCBhdWxhLiBQb3IgZWplbXBsbywgW0RlYjIwMThdIGRlc2N1YnJpw7MgcXVlIGxhIHJldHJvYWxpbWVudGFjacOzbiBlbiB0aWVtcG8gcmVhbCBzb2JyZSBsb3MgZWplcmNpY2lvcyBlbiBjbGFzZSB1dGlsaXphbmRvIGxvcyBkaXNwb3NpdGl2b3MgbcOzdmlsZXMgZGUgbG9zIHByb3Bpb3MgYWx1bW5vcyBtZWpvcsOzIGxhIHJldGVuY2nDs24gZGUgY29uY2VwdG9zIHkgbGEgcGFydGljaXBhY2nDs24gZGUgbG9zIGFsdW1ub3MgYWwgdGllbXBvIHF1ZSByZWR1am8gbGFzIHRhc2FzIGRlIGZyYWNhc28uCgpMYSBlbnNlw7FhbnphIGVuIGzDrW5lYSB5IGFzaW5jcsOzbmljYSB0b2RhdsOtYSBlc3TDoW4gZW4gcGHDsWFsZXMuIExvcyBNT09DIGNlbnRyYWxpemFkb3MgcHVlZGVuIGxsZWdhciBhIHNlciB1biBjYWxsZWrDs24gc2luIHNhbGlkYSBldm9sdXRpdm8sIHBlcm8gdG9kYXbDrWEgaGF5IG11Y2hvcyBvdHJvcyBtb2RlbG9zIHByb21ldGVkb3JlcyBwYXJhIGV4cGxvcmFyLiBFbiBwYXJ0aWN1bGFyLCBbQnJvbzIwMTZdIGRlc2NyaWJlIGNpbmN1ZW50YSBmb3JtYXMgZW4gcXVlIGxvcyBncnVwb3MgcHVlZGVuIGRpc2N1dGlyIGNvc2FzIGRlIG1hbmVyYSBwcm9kdWN0aXZhLCBkZSBsYXMgY3VhbGVzIHNvbG8gdW5hcyBwb2NhcyBzb24gYW1wbGlhbWVudGUgY29ub2NpZGFzIG8gaW1wbGVtZW50YWRhcyBlbiBsw61uZWEuIFNpIHZhbW9zIGEgZG9uZGUgbnVlc3Ryb3MgYWx1bW5vcyBlc3TDoW4gdGVjbm9sw7NnaWNhbWVudGUgZW4gbHVnYXIgZGUgZXhpZ2lybGVzIHF1ZSB2ZW5nYW4gYSBub3NvdHJvcywgcG9kZW1vcyB0ZXJtaW5hciBhcHJlbmRpZW5kbyB0YW50byBjb21vIGVsbG9zLgoKCiMjIEVqZXJjaWNpb3MKCiMjIyBWaWRlbyBiaWRpcmVjY2lvbmFsIChwYXJlcyAvIDEwKQpHcmFiZSB1biB2aWRlbyBkZSAy4oCTMyBtaW51dG9zIGRlIHVzdGVkIG1pc21vIGhhY2llbmRvIGFsZ28sIGx1ZWdvIGludGVyY2FtYmllIG3DoXF1aW5hcyBjb24gdW4gY29tcGHDsWVybyBwYXJhIHF1ZSBjYWRhIHVubyBwdWVkYSB2ZXIgZWwgdmlkZW8gZGVsIG90cm8gYSB1bmEgdmVsb2NpZGFkIDR4LiDCv1F1w6kgdGFuIGbDoWNpbCBlcyBzZWd1aXIgbG8gcXVlIGVzdMOhIHBhc2FuZG8/IMK/WSBzaSB0ZSBwZXJkaXN0ZSBhbGdvPwoKIyMjIFB1bnRvcyBkZSB2aXN0YSAoaW5kaXZpZHVhbCAvIDEwKQpTZWfDum4gW0lyaWIyMDA5XSwgZGlmZXJlbnRlcyBkaXNjaXBsaW5hcyBzZSBjZW50cmFuIGVuIGRpZmVyZW50ZXMgZmFjdG9yZXMgcXVlIGFmZWN0YW4gZWwgw6l4aXRvIG8gbm8gZGUgbGFzIGNvbXVuaWRhZGVzIGVuIGzDrW5lYToKCioqTmVnb2NpbzoqKgpmaWRlbGl6YWNpw7NuIGRlIGNsaWVudGVzLCBnZXN0acOzbiBkZSBtYXJjYSwgbW90aXZhY2nDs24gZXh0csOtbnNlY2EuCgoqKlBzaWNvbG9nw61hOioqCnNlbnRpZG8gZGUgY29tdW5pZGFkLCBtb3RpdmFjacOzbiBpbnRyw61uc2VjYS4KCioqU29jaW9sb2fDrWE6KioKaWRlbnRpZGFkIGdydXBhbCwgY29tdW5pZGFkIGbDrXNpY2EsIGNhcGl0YWwgc29jaWFsLCBhY2Npw7NuIGNvbGVjdGl2YS4KCioqQ2llbmNpYXMgZGUgbGEgQ29tcHV0YWNpw7NuOioqCkltcGxlbWVudGFjacOzbiB0ZWNub2zDs2dpY2EuCgrCv0N1w6FsIGRlIGVzdGFzIHBlcnNwZWN0aXZhcyBzZSBjb3JyZXNwb25kZSBtw6FzIGNvbiBsYSBzdXlhPyDCv0NvbiBjdcOhbCBlc3TDoXMgbWVub3MgYWxpbmVhZG8/CgojIyMgQXl1ZGFuZG8gbyBEYcOxYW5kbyAoZ3J1cG9zIHBlcXVlw7FvcyAvIDMwKQpFbCBhcnTDrWN1bG8gZGUgU3VzYW4gRHluYXJza2kgZW4gZWwgTmV3IFlvcmsgVGltZXMgZXhwbGljYSBjw7NtbyB5IHBvciBxdcOpIGxhcyBlc2N1ZWxhcyBlc3TDoW4gY29sb2NhbmRvIGEgbG9zIGVzdHVkaWFudGVzIHF1ZSByZXByb2Jhcm9uIGxvcyBjdXJzb3MgZW4gcGVyc29uYSBlbiBjdXJzb3MgZW4gbMOtbmVhLCB5IGPDs21vIGVzdG8gbG9zIHByZXBhcmEgcGFyYSB1biBmcmFjYXNvIGHDum4gbWF5b3IuIExlYSBlbCBhcnTDrWN1bG8geSBsdWVnbzoKCjEuIEVuIGdydXBvcyBwZXF1ZcOxb3MsIHBpZW5zZSBlbiAyLTMgY29zYXMgcXVlIGxhcyBlc2N1ZWxhcyBwb2Ryw61hbiBoYWNlciBwYXJhIGNvbXBlbnNhciBlc3RvcyBlZmVjdG9zIG5lZ2F0aXZvcyB5IGNyZWFyIGVzdGltYWNpb25lcyBhcHJveGltYWRhcyBkZSBzdXMgY29zdG9zIHBvciBhbHVtbm8uCgoyLiBDb21wYXJlIHN1cyBzdWdlcmVuY2lhcyB5IGNvc3RvcyBjb24gbG9zIGRlIG90cm9zIGdydXBvcy4gwr9DdcOhbnRvcyBwdWVzdG9zIGRlIGVuc2XDsWFuemEgYSB0aWVtcG8gY29tcGxldG8gY3JlZSBxdWUgZGViZXLDrWFuIGVsaW1pbmFyc2UgcGFyYSBsaWJlcmFyIHJlY3Vyc29zIHBhcmEgaW1wbGVtZW50YXIgbGFzIGlkZWFzIG3DoXMgcG9wdWxhcmVzIHBhcmEgdW4gY2VudGVuYXIgZGUgZXN0dWRpYW50ZXM/CgozLiBDb21vIGNsYXNlLCDCv2NyZWVzIHF1ZSBzZXLDrWEgdW4gYmVuZWZpY2lvIG5ldG8gcGFyYSBsb3MgYWx1bW5vcyBvIG5vPwoKTG9zIGVqZXJjaWNpb3MgZGUgcHJlc3VwdWVzdGFjacOzbiBjb21vIGVzdGUgc29uIHVuYSBidWVuYSBtYW5lcmEgZGUgc2FiZXIgcXVpw6luIHRvbWEgZW4gc2VyaW8gZWwgY2FtYmlvIGVkdWNhdGl2by4gVG9kb3MgcHVlZGVuIHBlbnNhciBlbiBjb3NhcyBxdWUgbGVzIGd1c3RhcsOtYSBoYWNlcjsgTXVjaG9zIG1lbm9zIGVzdMOhbiBkaXNwdWVzdG9zIGEgaGFibGFyIHNvYnJlIGxhcyBjb21wZW5zYWNpb25lcyBuZWNlc2FyaWFzIHBhcmEgcXVlIGVsIGNhbWJpbyBzdWNlZGEuCgotLS0tLS0tLQoKIyBUaXBvcyBkZSBlamVyY2ljaW8KClRvZG8gYnVlbiBjYXJwaW50ZXJvIHRpZW5lIHVuIGp1ZWdvIGRlIGRlc3Rvcm5pbGxhZG9yZXMsIHkgY2FkYSBidWVuIG1hZXN0cm8gdGllbmUgZGlmZXJlbnRlcyB0aXBvcyBkZSBlamVyY2ljaW9zIHBhcmEgdmVyaWZpY2FyIGxvIHF1ZSBsb3MgYWx1bW5vcyByZWFsbWVudGUgZXN0w6FuIGFwcmVuZGllbmRvLCBheXVkYXJsb3MgYSBwcmFjdGljYXIgc3VzIG51ZXZhcyBoYWJpbGlkYWRlcyB5IG1hbnRlbmVybG9zIGNvbXByb21ldGlkb3MuIEVzdGUgY2Fww610dWxvIGNvbWllbnphIGRlc2NyaWJpZW5kbyB2YXJpb3MgdGlwb3MgZGUgZWplcmNpY2lvcyBxdWUgcHVlZGUgdXNhciBwYXJhIHZlcmlmaWNhciBzaSBzdSBlbnNlw7FhbnphIGhhIHNpZG8gZWZlY3RpdmEuIEx1ZWdvIGFuYWxpemEgZWwgZXN0YWRvIGRlbCBhcnRlIGVuIGxhIGNhbGlmaWNhY2nDs24gYXV0b21hdGl6YWRhIHkgY2llcnJhIGV4cGxvcmFuZG8gZGViYXRlcywgcHJveWVjdG9zIHkgb3Ryb3MgdGlwb3MgaW1wb3J0YW50ZXMgZGUgdHJhYmFqbyBxdWUgcmVxdWllcmVuIG3DoXMgYXRlbmNpw7NuIGh1bWFuYSBwYXJhIGV2YWx1YXIuIE51ZXN0cmEgZGlzY3VzacOzbiBzZSBiYXNhIGVuIHBhcnRlIGVuIGVsIEJhbmNvIGRlIHByZWd1bnRhcyBkZSBDYW50ZXJidXJ5IFtTYW5kMjAxM10sIHF1ZSB0aWVuZSBlbnRyYWRhcyBwYXJhIHZhcmlvcyBpZGlvbWFzIHkgdGVtYXMgZW4gaW5mb3Jtw6F0aWNhIGludHJvZHVjdG9yaWEuCgojIyBMb3MgY2zDoXNpY29zCkNvbW8gc2UgZGlzY3V0acOzIGVuIGxhIFNlY2Npw7NuIDIuMSwgbGFzIHByZWd1bnRhcyBkZSBvcGNpw7NuIG3Dumx0aXBsZSAoTUNRKSBzb24gbcOhcyBlZmVjdGl2YXMgY3VhbmRvIGxhcyByZXNwdWVzdGFzIGluY29ycmVjdGFzIGFuYWxpemFuIGNvbmNlcHRvcyBlcnLDs25lb3MgZXNwZWPDrWZpY29zLiBQb3IgbG8gZ2VuZXJhbCwgZXN0w6FuIGRpc2XDsWFkb3MgcGFyYSBwcm9iYXIgbG9zIG5pdmVsZXMgbcOhcyBiYWpvcyBkZSBsYSBUYXhvbm9tw61hIGRlIEJsb29tIChTZWNjacOzbiA2LjIpLCBwZXJvIHRhbWJpw6luIHB1ZWRlbiByZXF1ZXJpciBxdWUgbG9zIGFsdW1ub3MgZWplcnphbiBzdSBqdWljaW8uCgo+KipVbmEgcHJlZ3VudGEgZGUgb3BjacOzbiBtw7psdGlwbGUqKgo+Cj7Cv0VuIHF1w6kgb3JkZW4gb2N1cnJlbiBsYXMgb3BlcmFjaW9uZXMgY3VhbmRvIGxhIGNvbXB1dGFkb3JhIGV2YWzDumEgbGEgZXhwcmVzacOzbiBwcmVjaW8gPSBhZGRUYXhlcyAoY29zdG8gLSBkZXNjdWVudG8KPgo+IDEuLSByZXN0YSwgbGxhbWFkYSBkZSBmdW5jacOzbiwgYXNpZ25hY2nDs24KPgo+IDIuLSBsbGFtYWRhIGEgZnVuY2nDs24sIHJlc3RhLCBhc2lnbmFjacOzbgo+Cj4gMy4tIGxsYW1hZGEgYSBmdW5jaW9uZXMsIGx1ZWdvIGFzaWduYWNpw7NuIHkgcmVzdGEgc2ltdWx0w6FuZWFtZW50ZQo+Cj4gNC4tIE5pbmd1bmEgZGUgbGFzIGFudGVyaW9yZXMKCkVsIHNlZ3VuZG8gdGlwbyBjbMOhc2ljbyBkZSBlamVyY2ljaW8gZGUgcHJvZ3JhbWFjacOzbiBlcyBjb2RlIGFuZCBydW4gKEMmUiksIGVuIGVsIHF1ZSBlbCBhbHVtbm8gZXNjcmliZSBjw7NkaWdvIHF1ZSBwcm9kdWNlIHVuIHJlc3VsdGFkbyBlc3BlY8OtZmljby4gTG9zIGVqZXJjaWNpb3MgZGUgQyZSIHB1ZWRlbiBzZXIgdGFuIHNpbXBsZXMgbyBjb21wbGVqb3MgY29tbyBlbCBtYWVzdHJvIHF1aWVyYSwgcGVybyBjdWFuZG8gc2UgdXNhbiBlbiBjbGFzZSwgZGViZW4gc2VyIGJyZXZlcyB5IHRlbmVyIHNvbG8gdW5hIG8gZG9zIHJlc3B1ZXN0YXMgY29ycmVjdGFzIHBsYXVzaWJsZXMuIEEgbWVudWRvIGVzIHN1ZmljaWVudGUgcGVkaXJsZXMgYSBsb3MgcHJpbmNpcGlhbnRlcyBxdWUgY2FsY3VsZW4gZSBpbXByaW1hbiB1biBzb2xvIHZhbG9yIG8gcXVlIGxsYW1lbiBhIHVuYSBmdW5jacOzbiBlc3BlY8OtZmljYTogbG9zIG1hZXN0cm9zIGV4cGVyaW1lbnRhZG9zIGEgbWVudWRvIG9sdmlkYW4gbG8gZGlmw61jaWwgcXVlIHB1ZWRlIHNlciBkZXRlcm1pbmFyIHF1w6kgcGFyw6FtZXRyb3MgdmFuIGEgZMOzbmRlLiBQYXJhIGxvcyBhbHVtbm9zIG3DoXMgYXZhbnphZG9zLCBkZXNjdWJyaXIgcXXDqSBmdW5jacOzbiBsbGFtYXIgZXMgbcOhcyBpbnRlcmVzYW50ZSB5IHVuIG1lam9yIGluZGljYWRvciBkZSBzdSBjb21wcmVuc2nDs24uCgo+KipDb2RlICYgUnVuKioKPgo+TGEgaW1hZ2VuIHZhcmlhYmxlIGNvbnRpZW5lIHVuYSBpbWFnZW4gYSB0b2RvIGNvbG9yIGxlw61kYSBkZSB1biBhcmNoaXZvLiBVc2FuZG8gdW5hIGZ1bmNpw7NuLCBjcmVlIHVuYSB2ZXJzacOzbiBlbiBibGFuY28geSBuZWdybyBkZSBsYSBpbWFnZW4geSBhc8OtZ25lbGEgYSB1bmEgbnVldmEgdmFyaWFibGUgbGxhbWFkYSBtb25vY3JvbW8uCgpMb3MgZWplcmNpY2lvcyBkZSBlc2NyaXR1cmEgeSBlamVjdWNpw7NuIHNlIHB1ZWRlbiBjb21iaW5hciBjb24gTUNRLiBQb3IgZWplbXBsbywgZXN0ZSBNQ1Egc29sbyBzZSBwdWVkZSByZXNwb25kZXIgZWplY3V0YW5kbyBlbCBjb21hbmRvIFVuaXggbHM6Cgo+KipDb21iaW5hbmRvIE1DUSBjb24gQ29kZSAmIFJ1bioqCj4KPkVzdMOhcyBlbiBlbCBkaXJlY3RvcmlvIC8gaG9tZS4gwr9DdcOhbCBkZSBsb3Mgc2lndWllbnRlcyBhcmNoaXZvcyBubyBlc3TDoSBlbiBlc2UgZGlyZWN0b3Jpbz8KPgo+IDEuIGF1dHVtbi5jc3YKPgo+IDIuIGZhbGwuY3N2Cj4KPiAzLiBzcHJpbmcuY3N2Cj4gCj4gNC4gd2ludGVyLmNzdgoKTG9zIEMmUiBheXVkYW4gYSBsYXMgcGVyc29uYXMgYSBwcmFjdGljYXIgbGFzIGhhYmlsaWRhZGVzIHF1ZSBtw6FzIGRlc2VhbiBhcHJlbmRlciwgcGVybyBwdWVkZW4gc2VyIGRpZsOtY2lsZXMgZGUgZXZhbHVhcjogcHVlZGUgaGFiZXIgbXVjaGFzIGZvcm1hcyBpbmVzcGVyYWRhcyBkZSBvYnRlbmVyIGxhIHJlc3B1ZXN0YSBjb3JyZWN0YSwgeSBsYXMgcGVyc29uYXMgc2UgZGVzbW9yYWxpemFyw6FuIHNpIHVuIHNpc3RlbWEgZGUgY2FsaWZpY2FjacOzbiBhdXRvbcOhdGljbyByZWNoYXphIHN1IGPDs2RpZ28gcG9ycXVlIG5vIGxvIGhhY2UuIE5vIGNvaW5jaWRlIGNvbiBsYSBkZWwgcHJvZmVzb3IuIFVuYSBmb3JtYSBkZSByZWR1Y2lyIGxhIGZyZWN1ZW5jaWEgY29uIGxhIHF1ZSBlc3RvIG9jdXJyZSBlcyBldmFsdWFyIHNvbG8gc3UgcHJvZHVjY2nDs24sIHBlcm8gZXNvIG5vIGxlcyBkYSByZXRyb2FsaW1lbnRhY2nDs24gc29icmUgY8OzbW8gZXN0w6FuIHByb2dyYW1hbmRvLiBPdHJhIGVzIGRhcmxlcyB1biBwZXF1ZcOxbyBjb25qdW50byBkZSBwcnVlYmFzIGVuIGVsIHF1ZSBwdWVkYW4gZWplY3V0YXIgc3UgY8OzZGlnbyBhbnRlcyBkZSBlbnZpYXJsbyAoZW4gZXNlIG1vbWVudG8gc2UgZWplY3V0YSBlbiB1biBjb25qdW50byBtw6FzIGNvbXBsZXRvIGRlIHBydWViYXMpLiBIYWNlciBlc3RvIGxlcyBheXVkYSBhIGRldGVybWluYXIgc2kgaGFuIGVudGVuZGlkbyBtYWwgbGEgaW50ZW5jacOzbiBkZWwgZWplcmNpY2lvIGFudGVzIGRlIGhhY2VyIGFsZ28gcXVlIGNyZWVuIHF1ZSBwb2Ryw61hIGNvc3RhcmxlcyBjYWxpZmljYWNpb25lcy4KCkVuIGx1Z2FyIGRlIGVzY3JpYmlyIGPDs2RpZ28gcXVlIHNhdGlzZmFnYSBhbGd1bmFzIGVzcGVjaWZpY2FjaW9uZXMsIHNlIGxlcyBwdWVkZSBwZWRpciBhIGxvcyBlc3R1ZGlhbnRlcyBxdWUgZXNjcmliYW4gcHJ1ZWJhcyBwYXJhIGRldGVybWluYXIgc2kgdW4gZnJhZ21lbnRvIGRlIGPDs2RpZ28gc2UgYWp1c3RhIGEgdW5hIGVzcGVjaWZpY2FjacOzbi4gRXN0YSBlcyB1bmEgaGFiaWxpZGFkIMO6dGlsIHBvciBkZXJlY2hvIHByb3BpbywgeSBoYWNlcmxvIHB1ZWRlIGRhciBhIGxvcyBlc3R1ZGlhbnRlcyB1biBwb2NvIG3DoXMgZGUgc2ltcGF0w61hIHBvciBsbyBkdXJvIHF1ZSB0cmFiYWphbiBzdXMgbWFlc3Ryb3MuCgoKPioqQ8OzZGlnbyBkZSBpbnZlcnNpw7NuIHkgZWplY3VjacOzbioqCj4KPkxhIGZ1bmNpw7NuIG1vbm90b25pY19zdW0gY2FsY3VsYSBsYSBzdW1hIGRlIGNhZGEgc2VjY2nDs24gZGUgdW5hIGxpc3RhIGRlIG7Dum1lcm9zIGVuIGxhIHF1ZSBsb3MgdmFsb3JlcyBlc3TDoW4gYXVtZW50YW5kbyBlc3RyaWN0YW1lbnRlLiBQb3IgZWplbXBsbywgZGFkYSBsYSBlbnRyYWRhIFsxLCAzLCAzLCA0LCA1LCAxXSwgbGEgc2FsaWRhIGVzIFs0LCAxMiwgMV0uIEVzY3JpYmEgeSBlamVjdXRlIHBydWViYXMgdW5pdGFyaWFzIHBhcmEgZGV0ZXJtaW5hciBjdcOhbCBkZSBsb3Mgc2lndWllbnRlcyBlcnJvcmVzIGNvbnRpZW5lIGxhIGZ1bmNpw7NuOgo+Cj4gKiBDb25zaWRlcmEgcXVlIGNhZGEgbsO6bWVybyBuZWdhdGl2byBlcyBlbCBjb21pZW56byBkZSB1bmEgbnVldmEgc3Vic2VjdWVuY2lhLgo+Cj4gKiBObyBpbmNsdXllIGVsIHByaW1lciB2YWxvciBkZSBjYWRhIHN1YnNlY3VlbmNpYSBlbiBsYSBzdWItc3VtYS4KPgo+ICogTm8gaW5jbHV5ZSBlbCDDumx0aW1vIHZhbG9yIGRlIGNhZGEgc3Vic2VjdWVuY2lhIGVuIGxhIHN1Yi1zdW1hLgo+Cj4gKiBTb2xvIHJlaW5pY2lhIGxhIHN1bWEgY3VhbmRvIGxvcyB2YWxvcmVzIGRpc21pbnV5ZW4gZW4gbHVnYXIgZGUgbm8gYXVtZW50YXIuCgoKQ29tcGxldGFyIGxvcyBlc3BhY2lvcyBlbiBibGFuY28gZXMgdW4gcmVmaW5hbWllbnRvIGRlIEMmUiBlbiBlbCBxdWUgZWwgYWx1bW5vIHJlY2liZSB1biBjw7NkaWdvIGRlIGluaWNpbyB5IGRlYmUgY29tcGxldGFybG8uIChFbiBsYSBwcsOhY3RpY2EsIGxhIG1heW9yw61hIGRlIGxvcyBlamVyY2ljaW9zIGRlIEMmUiBlbiByZWFsaWRhZCBzZSBsbGVuYW4gbG9zIGVzcGFjaW9zIGVuIGJsYW5jbyBwb3JxdWUgZWwgbWFlc3RybyBwcm9wb3JjaW9uYSBjb21lbnRhcmlvcyBwYXJhIHJlY29yZGFyIGEgbG9zIGFsdW1ub3MgbG9zIHBhc29zIHF1ZSBkZWJlbiBzZWd1aXIpLiBMYXMgcHJlZ3VudGFzIGRlIGVzdGUgdGlwbyBzb24gbGEgYmFzZSBkZSBlamVtcGxvcyBkZXN2YcOtZG9zOyBDb21vIHNlIGRpc2N1dGnDsyBlbiBlbCBDYXDDrXR1bG8gNCwgbG9zIHByaW5jaXBpYW50ZXMgYSBtZW51ZG8gbG9zIGVuY3VlbnRyYW4gbWVub3MgaW50aW1pZGFudGVzIHF1ZSBlc2NyaWJpciB0b2RvIGVsIGPDs2RpZ28gZGVzZGUgY2VybywgeSBkYWRvIHF1ZSBlbCBtYWVzdHJvIGhhIHByb3BvcmNpb25hZG8gbGEgbWF5b3IgcGFydGUgZGUgbGEgZXN0cnVjdHVyYSBkZSBsYSByZXNwdWVzdGEsIGxhcyBwcmVzZW50YWNpb25lcyBzb24gbXVjaG8gbcOhcyBwcmVkZWNpYmxlcyB5LCBwb3IgbG8gdGFudG8sIG3DoXMgZsOhY2lsZXMgZGUgdmVyaWZpY2FyLgoKPioqUmVsbGVuYXIgbG9zIGVzcGFjaW9zIGVuIGJsYW5jbyoqCj4KPkNvbXBsZXRlIGxvcyBlc3BhY2lvcyBlbiBibGFuY28gcGFyYSBxdWUgZWwgc2lndWllbnRlIGPDs2RpZ28gaW1wcmltYSBsYSBjYWRlbmEgInNvbWJyZXJvIi4KPgo+IHRleHRvID0gJ3RvZG8gbG8gcXVlIGVzJwo+IHJlYmFuYWRhID0gdGV4dG8gW19fX186IF9fX19dCj4gaW1wcmltaXIgKGNvcnRlKSAgCgpMb3MgcHJvYmxlbWFzIGRlIFBhcnNvbnMgdGFtYmnDqW4gZXZpdGFuIGVsIHByb2JsZW1hIGRlIGxhICJwYW50YWxsYSBlbiBibGFuY28gZGVsIHRlcnJvciIgbWllbnRyYXMgcGVybWl0ZW4gYSBsb3MgZXN0dWRpYW50ZXMgY29uY2VudHJhcnNlIGVuIGVsIGZsdWpvIGRlIGNvbnRyb2wgcG9yIHNlcGFyYWRvIGRlbCB2b2NhYnVsYXJpby4gW1BhcnMyMDA2LCBFcmljMjAxNSwgTW9ycjIwMTYsIEVyaWMyMDE3XSBFeGlzdGVuIGhlcnJhbWllbnRhcyBwYXJhIGNvbnN0cnVpciB5IGhhY2VyIHByb2JsZW1hcyBkZSBQYXJzb25zIGVuIGzDrW5lYSBbSWhhbjIwMTFdLCBwZXJvIHB1ZWRlbiBzZXIgZW11bGFkbyAoYXVucXVlIGFsZ28gdG9ycGVtZW50ZSkgYWwgcGVkaXJsZXMgYSBsb3MgYWx1bW5vcyBxdWUgcmVvcmdhbmljZW4gbGFzIGzDrW5lYXMgZGUgY8OzZGlnbyBlbiB1biBlZGl0b3IuCgo+KipQcm9ibGVtYSBkZSBQYXJzb25zKioKPgo+IFJlb3JnYW5pemFyIGUgc2FuZ3JhciBlc3RhcyBsw61uZWFzIHBhcmEgc3VtYXIgbG9zIHZhbG9yZXMgcG9zaXRpdm9zIGVuIHVuYSBsaXN0YS4gKFRhbWJpw6luIGRlYmVyw6EgYWdyZWdhciBkb3MgcHVudG9zIGVuIGxvcyBsdWdhcmVzIGFwcm9waWFkb3MpLgo+IAo+IHRvdGFsID0gMAo+IHNpIHY+IDAKPiB0b3RhbCArID0gdgo+IHBhcmEgdiBlbiB2YWxvcmVzCgpUZW5nYSBlbiBjdWVudGEgcXVlIGRhciBhIGxvcyBhbHVtbm9zIG3DoXMgbMOtbmVhcyBkZSBsYXMgcXVlIG5lY2VzaXRhbiwgbyBwZWRpcmxlcyBxdWUgcmVvcmdhbmljZW4gYWxndW5hcyBsw61uZWFzIHkgYWdyZWd1ZW4gYWxndW5hcyBtw6FzLCBoYWNlIHF1ZSBsb3MgcHJvYmxlbWFzIGRlIFBhcnNvbnMgc2VhbiBtdWNobyBtw6FzIGRpZsOtY2lsZXMgW0hhcm0yMDE2XS4KCiMjIFJhc3RyZW8KRWwgc2VndWltaWVudG8gZGUgbGEgZWplY3VjacOzbiBlcyBlbCBpbnZlcnNvIGRlIHVuIHByb2JsZW1hIGRlIFBhcnNvbnM6IGRhZGFzIHVuYXMgcG9jYXMgbMOtbmVhcyBkZSBjw7NkaWdvLCBlbCBhbHVtbm8gdGllbmUgcXVlIHJhc3RyZWFyIGVsIG9yZGVuIGVuIHF1ZSBzZSBlamVjdXRhbiBlc2FzIGzDrW5lYXMuIEVzdGEgZXMgdW5hIGhhYmlsaWRhZCBkZSBkZXB1cmFjacOzbiBlc2VuY2lhbCB5IHVuYSBidWVuYSBtYW5lcmEgZGUgc29saWRpZmljYXIgbGEgY29tcHJlbnNpw7NuIGRlIGxvcyBhbHVtbm9zIHNvYnJlIGxvcyBidWNsZXMsIGNvbmRpY2lvbmFsZXMgeSBlbCBvcmRlbiBkZSBldmFsdWFjacOzbiBkZSBsYXMgbGxhbWFkYXMgYSBmdW5jaW9uZXMgeSBtw6l0b2Rvcy4gTGEgZm9ybWEgbcOhcyBmw6FjaWwgZGUgaW1wbGVtZW50YXJsbyBlcyBoYWNlciBxdWUgbG9zIGFsdW1ub3MgZXNjcmliYW4gdW5hIHNlY3VlbmNpYSBkZSBwYXNvcyBldGlxdWV0YWRvcy4gSGFjZXIgcXVlIGVsaWphbiBsYSBzZWN1ZW5jaWEgY29ycmVjdGEgZGUgdW4gY29uanVudG8gKGVzIGRlY2lyLCBwcmVzZW50YXIgZXN0byBjb21vIHVuIE1DUSkgYWdyZWdhIGNhcmdhIGNvZ25pdGl2YSBzaW4gYWdyZWdhciB2YWxvciwgeWEgcXVlIHRpZW5lbiBxdWUgaGFjZXIgdG9kbyBlbCB0cmFiYWpvIGRlIGF2ZXJpZ3VhciBsYSBzZWN1ZW5jaWEgY29ycmVjdGEsIGx1ZWdvIGJ1c2NhcmxhIGVuIGxhIGxpc3RhIGRlIG9wY2lvbmVzLgoKPiAqKk9yZGVuIGRlIGVqZWN1Y2nDs24gZGUgcmFzdHJlbyoqCj7Cv0VuIHF1w6kgb3JkZW4gc2UgZWplY3V0YW4gbGFzIGzDrW5lYXMgZXRpcXVldGFkYXMgZW4gZXN0ZSBibG9xdWUgZGUgY8OzZGlnbz8KPgo+QSkgdmFscyA9IFstMSwgMCwgMV0KPkIpIGludmVyc2Vfc3VtID0gMAo+ICAgICAgICB0cmF0YXI6Cj4gICAgICAgICAgICAgcGFyYSB2IGVuIHZhbHM6Cj5DKSBzdW1hX2ludmVyc2EgKyA9IDEgLyB2Cj4gICAgICAgZXhjZXB0bzoKPiBEKSBwYXNhcgoKTG9zIHZhbG9yZXMgZGUgc2VndWltaWVudG8gc29uIHNpbWlsYXJlcyBhIGxhIGVqZWN1Y2nDs24gZGUgc2VndWltaWVudG8sIHBlcm8gZW4gbHVnYXIgZGUgZGV0YWxsYXIgZWwgb3JkZW4gZW4gcXVlIHNlIGVqZWN1dGEgZWwgY8OzZGlnbywgZWwgYWx1bW5vIGVudW1lcmEgbG9zIHZhbG9yZXMgcXVlIHVuYSBvIG3DoXMgdmFyaWFibGVzIHRvbWFuIGEgbWVkaWRhIHF1ZSBzZSBlamVjdXRhIGVsIHByb2dyYW1hLiBVbmEgZm9ybWEgZGUgaW1wbGVtZW50YXIgZXN0byBlcyBkYXJsZSBhbCBhbHVtbm8gdW5hIHRhYmxhIGN1eWFzIGNvbHVtbmFzIGVzdMOhbiBldGlxdWV0YWRhcyBjb24gbm9tYnJlcyBkZSB2YXJpYWJsZXMgeSBjdXlhcyBmaWxhcyBlc3TDoW4gZXRpcXVldGFkYXMgY29uIG7Dum1lcm9zIGRlIGzDrW5lYSwgeSBwZWRpcmxlcyBxdWUgY29tcGxldGVuIGxvcyB2YWxvcmVzIGFzdW1pZG9zIHBvciBsYXMgdmFyaWFibGVzIGVuIGVzYXMgbMOtbmVhcy4KCj4qKlZhbG9yZXMgZGUgcmFzdHJlbyoqCj7Cv1F1w6kgdmFsb3JlcyB0b21hbiBpenF1aWVyZGEgeSBkZXJlY2hhIGEgbWVkaWRhIHF1ZSBzZSBlamVjdXRhIGVzdGUgcHJvZ3JhbWE/Cj4KPiBBKSBpenF1aWVyZGEgPSAyMwo+IEIpIGRlcmVjaGEgPSA2Cj4gQykgbWllbnRyYXMgZXN0w6EgYmllbjoKPiBEKSBpenF1aWVyZGEsIGRlcmVjaGEgPSBkZXJlY2hhLCBpenF1aWVyZGElIGRlcmVjaGEKCnxMaW5lfAlsZWZ0fAlyaWdodHwKfC0tLXwtLS0tfC0tLXwKfCB8ICB8ICAufAp8IHwgIHwgIC58CgoKVGFtYmnDqW4gcHVlZGUgc29saWNpdGFyIGEgbG9zIGFsdW1ub3MgcXVlIHJhc3RyZWVuIGVsIGPDs2RpZ28gaGFjaWEgYXRyw6FzIHBhcmEgZGV0ZXJtaW5hciBjdcOhbCBkZWJlIGhhYmVyIHNpZG8gbGEgZW50cmFkYSBwYXJhIHF1ZSBlbCBjw7NkaWdvIHByb2R1emNhIHVuIHJlc3VsdGFkbyBwYXJ0aWN1bGFyIFtBcm1vMjAwOF0uIEVzdG9zIHByb2JsZW1hcyBkZSBlamVjdWNpw7NuIGludmVyc2EgcmVxdWllcmVuIGLDunNxdWVkYSB5IHJhem9uYW1pZW50byBkZWR1Y3Rpdm8sIHkgY3VhbmRvIGxhIHNhbGlkYSBlcyB1biBtZW5zYWplIGRlIGVycm9yLCBheXVkYW4gYSBsb3MgYWx1bW5vcyBhIGRlc2Fycm9sbGFyIHZhbGlvc2FzIGhhYmlsaWRhZGVzIGRlIGRlcHVyYWNpw7NuLgoKPioqRWplY3VjacOzbiBpbnZlcnNhKioKPkNvbXBsZXRlIGVsIG7Dum1lcm8gcXVlIGZhbHRhIGVuIGxvcyB2YWxvcmVzIHF1ZSBjYXVzYXJvbiBlbCBibG9xdWVvIGRlIGVzdGEgZnVuY2nDs24uCj4KPiB2YWxvcmVzID0gW1sxLjAsIC0wLjVdLCBbMy4wLCAxLjVdLCBbMi41LCBfX19dXQo+IHJ1bm5pbmdUb3RhbCA9IDAuMAo+IHBhcmEgKGxlY3R1cmEsIGVzY2FsYSkgZW4gdmFsb3JlczoKPiAgICAgcnVubmluZ1RvdGFsICsgPSBsZWN0dXJhIC8gZXNjYWxhZG8KCkxvcyBlamVyY2ljaW9zIGRlIGNvcnJlY2Npw7NuIG3DrW5pbWEgdGFtYmnDqW4gYXl1ZGFuIGEgbG9zIGFsdW1ub3MgYSBkZXNhcnJvbGxhciBoYWJpbGlkYWRlcyBkZSBkZXB1cmFjacOzbi4gRGFkYXMgYWxndW5hcyBsw61uZWFzIGRlIGPDs2RpZ28gcXVlID4gY29udGllbmVuIHVuIGVycm9yLCBlbCBhbHVtbm8gZGViZSBlbmNvbnRyYXJsbyB5IGhhY2VyIHVuIHBlcXVlw7FvIGNhbWJpbyBwYXJhIHNvbHVjaW9uYXJsby4gU2UgcHVlZGUgaGFjZXIgZWwgY2FtYmlvIHVzYW5kbyBDJlIsIG1pZW50cmFzIHF1ZSA+IGlkZW50aWZpY2FybG8gc2UgcHVlZGUgaGFjZXIgY29tbyB1bmEgcHJlZ3VudGEgZGUgb3BjacOzbiBtw7psdGlwbGUuCgo+ICoqTWluaW1hbCBGaXgqKgo+IFNlIHN1cG9uZSBxdWUgZXN0YSBmdW5jacOzbiBwcnVlYmEgc2kgdW4gbsO6bWVybyBzZSBlbmN1ZW50cmEgZGVudHJvIGRlIHVuIHJhbmdvLiBIYWdhIHVuIHBlcXVlw7FvIGNhbWJpbyBwYXJhIHF1ZSByZWFsbWVudGUgbG8gaGFnYS4KPiAKPiBkZWYgaW5zaWRlIChwdW50bywgbcOhcyBiYWpvLCBtw6FzIGFsdG8pOgo+ICAgICBpZiAocHVudG8gPD0gaW5mZXJpb3IpOgo+ICAgICAgICAgZmFsc28gcmV0b3Jubwo+ICAgICBlbGlmIChwdW50byA8PSBtw6FzIGFsdG8pOgo+ICAgICAgICAgZmFsc28gcmV0b3Jubwo+ICAgICBtw6FzOgo+ICAgICAgICAgdm9sdmVyIHZlcmRhZGVybwoKCkxvcyBlamVyY2ljaW9zIGRlIHRlbWEgeSB2YXJpYWNpw7NuIHNvbiBzaW1pbGFyZXMsIHBlcm8gc2UgbGUgcGlkZSBhbCBhbHVtbm8gcXVlIHJlYWxpY2UgdW5hIHBlcXVlw7FhIGFsdGVyYWNpw7NuIHF1ZSBjYW1iaWUgbGEgc2FsaWRhIGRlIGFsZ3VuYSBtYW5lcmEgZXNwZWPDrWZpY2EgZW4gbHVnYXIgZGUgaGFjZXIgdW4gY2FtYmlvIHBhcmEgY29ycmVnaXIgdW4gZXJyb3IuIExvcyBjYW1iaW9zIHBlcm1pdGlkb3MgcHVlZGVuIGluY2x1aXIgY2FtYmlhciBlbCB2YWxvciBpbmljaWFsIGRlIHVuYSB2YXJpYWJsZSwgcmVlbXBsYXphciB1bmEgbGxhbWFkYSBkZSBmdW5jacOzbiBjb24gb3RyYSwgaW50ZXJjYW1iaWFyIGJ1Y2xlcyBpbnRlcm5vcyB5IGV4dGVybm9zLCBvIGNhbWJpYXIgZWwgb3JkZW4gZGUgbGFzIHBydWViYXMgZW4gdW4gY29uZGljaW9uYWwgY29tcGxlam8uIE51ZXZhbWVudGUsIGVzdGUgdGlwbyBkZSBlamVyY2ljaW8gYnJpbmRhIGEgbG9zIGFsdW1ub3MgbGEgb3BvcnR1bmlkYWQgZGUgcHJhY3RpY2FyIHVuYSBoYWJpbGlkYWQgw7p0aWwgZW4gZWwgbXVuZG8gcmVhbDogbGEgZm9ybWEgbcOhcyByw6FwaWRhIGRlIHByb2R1Y2lyIGVsIGPDs2RpZ28gcXVlIG5lY2VzaXRhbiBlcyBhanVzdGFyIGVsIGPDs2RpZ28gcXVlIHlhIGhhY2UgYWxnbyBjZXJjYW5vLgoKPiAqKlRlbWEgeSB2YXJpYWNpb25lcyoqCj4gQ2FtYmllIGVsIGJ1Y2xlIGludGVybm8gZW4gbGEgZnVuY2nDs24gYSBjb250aW51YWNpw7NuIHBhcmEgcXVlIGxsZW5lIGVsIHRyacOhbmd1bG8gc3VwZXJpb3IgaXpxdWllcmRvIGRlIHVuYSBpbWFnZW4gY29uIHVuIGNvbG9yIGVzcGVjw61maWNvLgo+IAo+IExhIGZ1bmNpw7NuIGZpbGxUcmlhbmdsZSAoaW1hZ2VuLCBjb2xvcikgZXMKPiAgICAgcGFyYSB4OiA9IDEgYSBwaWN0dXJlLndpZHRoIGRvCj4gICAgICAgICBwYXJhIHk6ID0gMSBhIGxhIGltYWdlbi4KPiAgICAgICAgICAgICBpbWFnZW4gW3gsIHldID0gY29sb3IKPiAgICAgICAgIGZpbmFsCj4gICAgIGZpbmFsCj4gZmluYWwKCkxvcyBlamVyY2ljaW9zIGRlIHJlZmFjdG9yaXphY2nDs24gc29uIGVsIGNvbXBsZW1lbnRvIGRlIGxvcyBlamVyY2ljaW9zIGRlIHRlbWEgeSB2YXJpYWNpw7NuOiBkYWRvIHVuIGPDs2RpZ28gZGUgdHJhYmFqbywgZWwgYWx1bW5vIHRpZW5lIHF1ZSBtb2RpZmljYXJsbyBkZSBhbGd1bmEgbWFuZXJhIHNpbiBjYW1iaWFyIHN1IHNhbGlkYS4gUG9yIGVqZW1wbG8sIGVsIGFsdW1ubyBwb2Ryw61hIHJlZW1wbGF6YXIgbG9zIGJ1Y2xlcyBjb24gZXhwcmVzaW9uZXMgdmVjdG9yaXphZGFzIG8gc2ltcGxpZmljYXIgbGEgY29uZGljacOzbiBlbiB1biBidWNsZSB3aGlsZS4gRXN0YSB0YW1iacOpbiBlcyB1bmEgaGFiaWxpZGFkIMO6dGlsIGVuIGVsIG11bmRvIHJlYWwsIHBlcm8gYSBtZW51ZG8gaGF5IHRhbnRhcyBmb3JtYXMgZGUgcmVmYWN0b3JpemFyIGVsIGPDs2RpZ28gcXVlIGxhIGNhbGlmaWNhY2nDs24gcmVxdWllcmUgaW5zcGVjY2nDs24gaHVtYW5hLgoKPiAqKlJlZmFjdG9yaXphY2nDs24qKgo+IEVzY3JpYmEgdW5hIMO6bmljYSBsaXN0YSBkZSBjb21wcmVuc2nDs24gcXVlIHRlbmdhIGVsIG1pc21vIGVmZWN0byBxdWUgZXN0ZSBidWNsZS4KPiAKPiByZXN1bHRhZG8gPSBbXQo+IHBhcmEgdiBlbiB2YWxvcmVzOgo+ICAgICBzaSBsZW4gKHYpPiB1bWJyYWw6Cj4gICAgICAgICByZXN1bHRhZG8uYXBwZW5kICh2KQoKIyMgRGlhZ3JhbWFzCkhhY2VyIHF1ZSBsb3MgYWx1bW5vcyBkaWJ1amVuIG1hcGFzIGNvbmNlcHR1YWxlcyB5IG90cm9zIGRpYWdyYW1hcyBkYSB1bmEgaWRlYSBkZSBjw7NtbyBlc3TDoW4gcGVuc2FuZG8gKFNlY2Npw7NuIDMuMSksIHBlcm8gbG9zIGRpYWdyYW1hcyBkZSBmb3JtYSBsaWJyZSByZXF1aWVyZW4gdGllbXBvIHkganVpY2lvIGh1bWFub3MgcGFyYSBldmFsdWFybG9zLiBFdGlxdWV0YXIgZGlhZ3JhbWFzLCBwb3Igb3RybyBsYWRvLCBlcyBjYXNpIHRhbiBwb2Rlcm9zbyBwZWRhZ8OzZ2ljYW1lbnRlIHBlcm8gbXVjaG8gbcOhcyBmw6FjaWwgZGUgZXNjYWxhci4KCkVuIGx1Z2FyIGRlIHF1ZSBsb3MgYWx1bW5vcyBjcmVlbiBkaWFncmFtYXMgZGVzZGUgY2VybywgcHJvcG9yY2nDs25lbGVzIHVuIGRpYWdyYW1hIHkgdW4gY29uanVudG8gZGUgZXRpcXVldGFzIHkgcMOtZGFsZXMgcXVlIGNvbG9xdWVuIGVzdGUgw7psdGltbyBlbiBsb3MgbHVnYXJlcyBjb3JyZWN0b3MgZGVsIHByaW1lcm8uIEVsIGRpYWdyYW1hIHB1ZWRlIHNlciB1bmEgZXN0cnVjdHVyYSBkZSBkYXRvcyAoImRlc3B1w6lzIGRlIGVqZWN1dGFyIGVzdGUgY8OzZGlnbywgwr9xdcOpIHZhcmlhYmxlcyBhcHVudGFuIGEgcXXDqSBwYXJ0ZXMgZGUgZXN0YSBlc3RydWN0dXJhPyIpLCBVbiBncsOhZmljbyAoImhhY2VyIGNvaW5jaWRpciBjYWRhIHVuYSBkZSBlc3RhcyBwaWV6YXMgZGUgY8OzZGlnbyBjb24gbGEgcGFydGUgZGVsIGdyw6FmaWNvIHF1ZSBnZW5lcsOzIiksIG8gZWwgY8OzZGlnbyBlbiBzw60gKCJoYWNlciBjb2luY2lkaXIgY2FkYSB0w6lybWlubyBjb24gdW4gZWplbXBsbyBkZSBlc2UgZWxlbWVudG8gZGVsIHByb2dyYW1hIikuCgo+ICoqRXRpcXVldGFyIHVuIGRpYWdyYW1hKioKPiBMYSBmaWd1cmEgW2Y6IGV0aXF1ZXRhZG8gZGUgZWplcmNpY2lvc10gbXVlc3RyYSBjw7NtbyBzZSByZXByZXNlbnRhIHVuIHBlcXVlw7FvIGZyYWdtZW50byBkZSBIVE1MIGVuIGxhIG1lbW9yaWEuIENvbG9xdWUgbGFzIGV0aXF1ZXRhcyAx4oCTOSBlbiBsb3MgPiBlbGVtZW50b3MgZGVsIMOhcmJvbCBwYXJhIG1vc3RyYXIgZWwgb3JkZW4gZW4gcXVlIHNlIGFsY2FuemFuIGVuIHVuIHJlY29ycmlkbyBkZSBwcm9mdW5kaWRhZCBwcmltZXJvLgoKIVtldGlxdWV0YXNdKC4vaW1nX3RyYW5pbmcvbGFiZWxpbmcuc3ZnKQoKCk90cmEgZm9ybWEgZGUgdXNhciBkaWFncmFtYXMgZXMgZGFyIGEgbG9zIGFsdW1ub3MgbGFzIHBpZXphcyBkZWwgZGlhZ3JhbWEgeSBwZWRpcmxlcyBxdWUgbGFzIG9yZ2FuaWNlbiBjb3JyZWN0YW1lbnRlLiBFc3RlIGVzIHVuIGVxdWl2YWxlbnRlIHZpc3VhbCBkZSB1biBwcm9ibGVtYSBkZSBQYXJzb25zLCB5IHB1ZWRlIHByb3BvcmNpb25hciB0YW50byBvIHRhbiBwb2NvIGVzcXVlbGV0byBwYXJhIGF5dWRhciBjb24gbGEgY29sb2NhY2nDs24gY29tbyBjcmVlIHF1ZSBlc3TDoW4gbGlzdG9zLiBUZW5nbyBidWVub3MgcmVjdWVyZG9zIGRlIHRyYXRhciBkZSBjb2xvY2FyIHJlc2lzdGVuY2lhcyB5IGNvbmRlbnNhZG9yZXMgZW4gdW4gZGlhZ3JhbWEgZGUgY2lyY3VpdG8gcGFyYSBvYnRlbmVyIGVsIHZvbHRhamUgY29ycmVjdG8gZW4gY2llcnRvIHB1bnRvLCB5IGhlIHZpc3RvIGEgbG9zIG1hZXN0cm9zIGRhcmxlcyBhIGxvcyBhbHVtbm9zIHVuIGNvbmp1bnRvIGZpam8gZGUgYmxvcXVlcyBTY3JhdGNoIHkgcGVkaXJsZXMgcXVlIGNyZWVuIHVuIGRpYnVqbyBwYXJ0aWN1bGFyIHVzYW5kbyBzb2xvIGVzb3MgYmxvcXVlcwoKTG9zIHByb2JsZW1hcyBkZSBjb3JyZXNwb25kZW5jaWEgcHVlZGVuIGNvbnNpZGVyYXJzZSBjb21vIHVuIGNhc28gZXNwZWNpYWwgZGUgZXRpcXVldGFkbyBlbiBlbCBxdWUgZWwgImRpYWdyYW1hIiBlcyB1bmEgY29sdW1uYSBkZSB0ZXh0byB5IGxhcyBldGlxdWV0YXMgc2UgdG9tYW4gZGUgbGEgb3RyYSBjb2x1bW5hLiBMYSBjb3JyZXNwb25kZW5jaWEgdW5vIGEgdW5vIGxlIGRhIGFsIGFsdW1ubyBkb3MgbGlzdGFzIGRlIGlndWFsIGxvbmdpdHVkIHkgbGUgcGlkZSBxdWUgZW1wYXJlamUgbG9zIGVsZW1lbnRvcyBjb3JyZXNwb25kaWVudGVzLCBwLiAiVW5pciBjYWRhIGZyYWdtZW50byBkZSBjw7NkaWdvIGNvbiBsYSBzYWxpZGEgcXVlIHByb2R1Y2UiLgoKPioqUGFyZW8qKgo+IEhhZ2EgY29pbmNpZGlyIGNhZGEgb3BlcmFkb3IgZGUgZXhwcmVzacOzbiByZWd1bGFyIGVuIGxhIEZpZ3VyYSBbZjogY29tYmluYWNpw7NuIGRlIGVqZXJjaWNpb3NdIGNvbiBsbyBxdWUgaGFjZS4KCiFbcGFyZW9dKC4vaW1nX3RyYW5pbmcvbWF0Y2hpbmcuc3ZnKQoKQ29uIGNvaW5jaWRlbmNpYXMgZGUgbXVjaG9zIGEgbXVjaG9zLCBsYXMgbGlzdGFzIG5vIHRpZW5lbiBsYSBtaXNtYSBsb25naXR1ZCwgcG9yIGxvIHF1ZSBhbGd1bm9zIGVsZW1lbnRvcyBwdWVkZW4gY29pbmNpZGlyIGNvbiBvdHJvcyB5IG90cm9zIHB1ZWRlbiBubyBjb2luY2lkaXIgZW4gYWJzb2x1dG8uIE11Y2hvcyBhIG11Y2hvcyBzb24gbcOhcyBkaWbDrWNpbGVzIHBvcnF1ZSBsb3MgYWx1bW5vcyBubyBwdWVkZW4gaGFjZXIgY29pbmNpZGVuY2lhcyBmw6FjaWxlcyBwcmltZXJvIHBhcmEgcmVkdWNpciBzdSBlc3BhY2lvIGRlIGLDunNxdWVkYS4gTG9zIHByb2JsZW1hcyBkZSBjb2luY2lkZW5jaWEgc2UgcHVlZGVuIGltcGxlbWVudGFyIGhhY2llbmRvIHF1ZSBsb3MgYWx1bW5vcyBlbnbDrWVuIGxpc3RhcyBkZSBwYXJlcyBjb2luY2lkZW50ZXMgKGNvbW8gIkEzLCBCMSwgQzIiKSwgcGVybyBlc28gZXMgdG9ycGUgeSBwcm9wZW5zbyBhIGVycm9yZXMuIEhhY2VyIHF1ZSByZWNvbm96Y2FuIHVuIGNvbmp1bnRvIGRlIHBhcmVzIGNvcnJlY3RvcyBlbiB1biBNQ1EgZXMgYcO6biBwZW9yLCB5YSBxdWUgZXMgZG9sb3Jvc2FtZW50ZSBmw6FjaWwgZGUgbGVlciBtYWwuIERpYnVqYXIgbyBhcnJhc3RyYXIgZnVuY2lvbmEgbXVjaG8gbWVqb3IsIHBlcm8gcHVlZGUgcmVxdWVyaXIgY2llcnRvIHRyYWJham8gcGFyYSBpbXBsZW1lbnRhcmxvLgoKTGEgY2xhc2lmaWNhY2nDs24gZXMgdW4gY2FzbyBlc3BlY2lhbCBkZSBjb3JyZXNwb25kZW5jaWEgcXVlIGVzIChsaWdlcmFtZW50ZSkgbcOhcyBzdXNjZXB0aWJsZSBkZSByZXNwb25kZXIgYSB0cmF2w6lzIGRlIGxpc3RhcywgeWEgcXVlIG51ZXN0cmFzIG1lbnRlcyBzb24gYmFzdGFudGUgYnVlbmFzIHBhcmEgZGV0ZWN0YXIgZXJyb3JlcyBvIGFub21hbMOtYXMgZW4gbGFzIHNlY3VlbmNpYXMuIExvcyBjcml0ZXJpb3MgZGUgY2xhc2lmaWNhY2nDs24gZGV0ZXJtaW5hbiBlbCBuaXZlbCBkZSByYXpvbmFtaWVudG8gcmVxdWVyaWRvLiBTaSB0aWVuZSBhbHVtbm9zIHF1ZSBvcmRlbmFuIGFsZ29yaXRtb3MgZGUgY2xhc2lmaWNhY2nDs24gZGUgbcOhcyByw6FwaWRvIGEgbcOhcyBsZW50bywgcHJvYmFibGVtZW50ZSBlc3TDqSBlamVyY2llbmRvIGVsIHJlY3VlcmRvIChlcyBkZWNpciwgcGlkacOpbmRvbGVzIHF1ZSByZWNvbm96Y2FuIGxvcyBub21icmVzIGRlIGxvcyBhbGdvcml0bW9zIHkgY29ub3pjYW4gc3VzIHByb3BpZWRhZGVzKSwgbWllbnRyYXMgbGVzIHBpZGUgcXVlIGNsYXNpZmlxdWVuIGxhcyBzb2x1Y2lvbmVzIGRlIHJhem9uYW1pZW50byB5IGp1aWNpbyBtw6FzIHJvYnVzdG9zIGEgbcOhcyBmcsOhZ2lsZXMuCgpFbCByZXN1bWVuIHRhbWJpw6luIHJlcXVpZXJlIHF1ZSBsb3MgYWx1bW5vcyB1c2VuIGVsIHBlbnNhbWllbnRvIGRlIG9yZGVuIHN1cGVyaW9yIHkgbGVzIGRhIGxhIG9wb3J0dW5pZGFkIGRlIHByYWN0aWNhciB1bmEgaGFiaWxpZGFkIHF1ZSBlcyBtdXkgw7p0aWwgYWwgaW5mb3JtYXIgZXJyb3Jlcy4gUG9yIGVqZW1wbG8sIHB1ZWRlIHByZWd1bnRhciBhIGxvcyBhbHVtbm9zOiAiwr9RdcOpIG9yYWNpw7NuIGRlc2NyaWJlIG1lam9yIGPDs21vIGNhbWJpYSBsYSBzYWxpZGEgZGUgZiBjdWFuZG8geCB2YXLDrWEgZGUgMCBhIDEwPyIgeSBsdWVnbyBzZSBsZSBkYW4gdmFyaWFzIG9wY2lvbmVzIGNvbW8gdW5hIHByZWd1bnRhIGRlIG9wY2nDs24gbcO6bHRpcGxlLiBUYW1iacOpbiBwdWVkZSBzb2xpY2l0YXIgcmVzcHVlc3RhcyBkZSBmb3JtYSBsaWJyZSBtdXkgY29ydGFzIGEgcHJlZ3VudGFzIGVuIGRvbWluaW9zIHJlc3RyaW5naWRvcywgY29tbyAiwr9DdcOhbCBlcyBsYSBjYXJhY3RlcsOtc3RpY2EgY2xhdmUgZGUgdW4gYWxnb3JpdG1vIGRlIGNsYXNpZmljYWNpw7NuIGVzdGFibGU/IiBObyBwb2RlbW9zIGF1dG9tYXRpemFyIGNvbXBsZXRhbWVudGUgbGFzIGNvbXByb2JhY2lvbmVzIHNpbiB1bmEgY2FudGlkYWQgZnJ1c3RyYW50ZSBkZSBmYWxzb3MgcG9zaXRpdm9zIChhY2VwdGFuZG8gcmVzcHVlc3RhcyBpbmNvcnJlY3RhcykgeSBmYWxzb3MgbmVnYXRpdm9zIChyZWNoYXphbmRvIGxhcyBjb3JyZWN0YXMpLCBwZXJvIGxhcyBwcmVndW50YXMgZGUgZXN0ZSB0aXBvIHNlIHByZXN0YW4gYmllbiBhIGxhIGNhbGlmaWNhY2nDs24gZGUgcGFyZXMgKFNlY2Npw7NuIDUuMykuCgojIyBDYWxpZmljYWNpw7NuIGF1dG9tw6F0aWNhCkxhcyBoZXJyYW1pZW50YXMgYXV0b23DoXRpY2FzIGRlIGNsYXNpZmljYWNpw7NuIGRlIHByb2dyYW1hcyBoYW4gZXhpc3RpZG8gbcOhcyB0aWVtcG8gZGUgbG8gcXVlIGhlIGVzdGFkbyB2aXZvOiBsYSBwcmltZXJhIG1lbmNpw7NuIHB1YmxpY2FkYSBkYXRhIGRlIDE5NjAgW0hvbGwxOTYwXSwgeSBsYXMgZW5jdWVzdGFzIHB1YmxpY2FkYXMgZW4gW0RvdWMyMDA1LCBJaGFuMjAxMF0gbWVuY2lvbmFuIG11Y2hhcyBoZXJyYW1pZW50YXMgZXNwZWPDrWZpY2FzIHBvciBub21icmUuIENvbnN0cnVpciB0YWxlcyBoZXJyYW1pZW50YXMgZXMgbXVjaG8gbcOhcyBjb21wbGVqbyBkZSBsbyBxdWUgcGFyZWNlLiDCv0PDs21vIHNlIHJlcHJlc2VudGFuIGxhcyB0YXJlYXM/IMK/Q8OzbW8gc2UgcmFzdHJlYW4gZSBpbmZvcm1hbiBsb3MgZW52w61vcz8gwr9QdWVkZW4gbG9zIGFsdW1ub3MgY29vcGVyYXI/IMK/Q8OzbW8gc2UgcHVlZGVuIGVqZWN1dGFyIGxvcyBlbnbDrW9zIGRlIGZvcm1hIHNlZ3VyYT8gW0Vkd2EyMDE0YV0gZXMgdW4gYXJ0w61jdWxvIGNvbXBsZXRvIGRlZGljYWRvIGEgdW4gZXNxdWVtYSBhZGFwdGF0aXZvIHBhcmEgZGV0ZWN0YXIgeSBhZG1pbmlzdHJhciBidWNsZXMgaW5maW5pdG9zIGVuIGxvcyBlbnbDrW9zIGRlIGPDs2RpZ28sIHkgZXNlIGVzIHNvbG8gdW5vIGRlIGxvcyBtdWNob3MgcHJvYmxlbWFzIHF1ZSBzdXJnZW4uCgpBbCBoYWJsYXIgc29icmUgbG9zIGF1dG9ldmFsdWFkb3JlcywgZXMgaW1wb3J0YW50ZSBkaXN0aW5ndWlyIGxhIHNhdGlzZmFjY2nDs24gZGVsIGFsdW1ubyBkZSBsb3MgcmVzdWx0YWRvcyBkZWwgYXByZW5kaXphamUuIFBvciBlamVtcGxvLCBbTWFndTIwMThdIGNhbWJpw7MgbG9zIGxhYm9yYXRvcmlvcyBkZSBwcm9ncmFtYWNpw7NuIGluZm9ybWFsIHBhcmEgdW4gY3Vyc28gZGUgQ1MgZGUgc2VndW5kbyBhw7FvIGEgdW4gZXhhbWVuIHNlbWFuYWwgZXZhbHVhZG8gcG9yIHVuYSBtw6FxdWluYSB1c2FuZG8gdW4gYXV0by1jYWxpZmljYWRvci4gQSBsb3MgZXN0dWRpYW50ZXMgbm8gbGVzIGd1c3TDsyBlbCBzaXN0ZW1hIGF1dG9tYXRpemFkbywgcGVybyBsYSB0YXNhIGdlbmVyYWwgZGUgcmVwcm9iYWNpw7NuIGRlbCBjdXJzbyBzZSByZWR1am8gYSBsYSBtaXRhZCB5IGVsIG7Dum1lcm8gZGUgZXN0dWRpYW50ZXMgcXVlIG9idHV2aWVyb24gaG9ub3JlcyBkZSBwcmltZXJhIGNsYXNlIHNlIHRyaXBsaWPDsy4gUG9yIGVsIGNvbnRyYXJpbywgW1J1YmkyMDE0XSB0YW1iacOpbiBjb21lbnrDsyBhIHVzYXIgdW4gYXV0by1jbGFzaWZpY2Fkb3IgZGlzZcOxYWRvIHBhcmEgY29tcGV0aWNpb25lcywgcGVybyBubyB2aW8gdW5hIGRpc21pbnVjacOzbiBzaWduaWZpY2F0aXZhIGVuIGxhcyB0YXNhcyBkZSBkZXNlcmNpw7NuIGRlIHN1cyBhbHVtbm9zOyBVbmEgdmV6IG3DoXMsIGxvcyBhbHVtbm9zIGhpY2llcm9uIGFsZ3Vub3MgY29tZW50YXJpb3MgbmVnYXRpdm9zIHNvYnJlIGxhIGhlcnJhbWllbnRhLCBxdWUgbG9zIGF1dG9yZXMgYXRyaWJ1eWVuIGEgbGEgY2FsaWRhZCBkZSBzdXMgbWVuc2FqZXMgZGUgcmV0cm9hbGltZW50YWNpw7NuIGVuIGx1Z2FyIGRlIGF2ZXJzacOzbiBhIGxhIGNsYXNpZmljYWNpw7NuIGF1dG9tw6F0aWNhLgoKW1NyaWQyMDE2XSB0b23DsyB1biBlbmZvcXVlIGRpZmVyZW50ZS4gVXRpbGl6YXJvbiBwcnVlYmFzIGZ1enogKGVzIGRlY2lyLCBjYXNvcyBkZSBwcnVlYmEgZ2VuZXJhZG9zIGFsZWF0b3JpYW1lbnRlKSBwYXJhIHZlcmlmaWNhciBzaSBlbCBjw7NkaWdvIGRlbCBhbHVtbm8gaGFjZSBsbyBtaXNtbyBxdWUgdW5hIGltcGxlbWVudGFjacOzbiBkZSByZWZlcmVuY2lhIHByb3BvcmNpb25hZGEgcG9yIGVsIHByb2Zlc29yLiBFbiBlbCBwcmltZXIgcHJveWVjdG8gZGUgdW4gY3Vyc28gaW50cm9kdWN0b3JpbyBkZSAxNDAwIGVzdHVkaWFudGVzLCBsYXMgcHJ1ZWJhcyBmdXp6IGRldGVjdGFyb24gZXJyb3JlcyBxdWUgZnVlcm9uIG9taXRpZG9zIHBvciB1biBjb25qdW50byBkZSBjYXNvcyBkZSBwcnVlYmEgZXNjcml0b3MgYSBtYW5vIHBhcmEgbcOhcyBkZWwgNDglIGRlIGxvcyBlc3R1ZGlhbnRlcy4KCltCYXN1MjAxNV0gcHJvcG9yY2lvbsOzIGEgbG9zIGFsdW1ub3MgdW4gY29uanVudG8gZGUgY2Fzb3MgZGUgcHJ1ZWJhIGRlIHNvbHVjacOzbiwgcGVybyBsb3MgcGFydGljaXBhbnRlcyB0dXZpZXJvbiBxdWUgZGVzYmxvcXVlYXIgY2FkYSB1bm8gcmVzcG9uZGllbmRvIHByZWd1bnRhcyBzb2JyZSBzdSBjb21wb3J0YW1pZW50byBlc3BlcmFkbyBhbnRlcyBkZSBxdWUgc2UgbGVzIHBlcm1pdGllcmEgYXBsaWNhcmxvIGEgc3Ugc29sdWNpw7NuIHByb3B1ZXN0YS4gUG9yIGVqZW1wbG8sIHN1cG9uZ2EgcXVlIGxvcyBhbHVtbm9zIHRpZW5lbiBxdWUgZXNjcmliaXIgdW5hIGZ1bmNpw7NuIHBhcmEgZW5jb250cmFyIGVsIHBhciBkZSBuw7ptZXJvcyBhZHlhY2VudGVzIG3DoXMgZ3JhbmRlIGVuIHVuYSBsaXN0YS4gQW50ZXMgZGUgcG9kZXIgdXNhciBsYXMgcHJ1ZWJhcyBkZSBsYSBwcmVndW50YSwgdHV2aWVyb24gcXVlIGVsZWdpciBsYSByZXNwdWVzdGEgY29ycmVjdGEgYSwgIsK/UXXDqSBwcm9kdWNlIGVsIG1heW9yIHBhciAoNCwgMywgLTEsIDUsIDMsIDMpPyIgRW4gdW4gY3Vyc28gdW5pdmVyc2l0YXJpbyBkZSAxMzAwIHBlcnNvbmFzLCBsYSBncmFuIG1heW9yw61hIGRlIGxvcyBlc3R1ZGlhbnRlcyBlbGlnaWVyb24gdmFsaWRhciBzdSBjb21wcmVuc2nDs24gZGUgbG9zIGNhc29zIGRlIHBydWViYSBkZSBlc3RhIG1hbmVyYSBhbnRlcyBkZSBpbnRlbnRhciByZXNvbHZlciBwcm9ibGVtYXMsIHkgbHVlZ28gaGljaWVyb24gbWVub3MgcHJlZ3VudGFzIHkgZXhwcmVzYXJvbiBtZW5vcyBjb25mdXNpw7NuIHNvYnJlIGxhcyB0YXJlYXMuCgo+ICoqQ29udHJhIGhlcnJhbWllbnRhcyBsaXN0YXMgcGFyYSB1c2FyKioKPiBFcyB0ZW50YWRvciB1dGlsaXphciBoZXJyYW1pZW50YXMgZGUgdmVyaWZpY2FjacOzbiBkZSBlc3RpbG8gZXN0w6FuZGFyIHBhcmEgY2FsaWZpY2FyIGVsIGPDs2RpZ28gZGUgbG9zIGFsdW1ub3MuIFNpbiBlbWJhcmdvLCBbTnV0YjIwMTZdIGluaWNpYWxtZW50ZSAgbm8gZW5jb250csOzIGNvcnJlbGFjacOzbiBlbnRyZSBsYXMgbWFyY2FzIHByb3BvcmNpb25hZGFzIHBvciBodW1hbm9zIHkgbGFzIHZpb2xhY2lvbmVzIGRlIGxhcyByZWdsYXMgZGVsIHZlcmlmaWNhZG9yIGRlIGVzdGlsby4gQWxndW5hcyB2ZWNlcyBlc3RvICBzZSBkZWJpw7MgYSBxdWUgbG9zIGFsdW1ub3MgdmlvbGFyb24gdW5hIHJlZ2xhIG11Y2hhcyB2ZWNlcyAocGVyZGllbmRvIGFzw60gbcOhcyBwdW50b3MgZGUgbG9zIHF1ZSBkZWJlcsOtYW4pLCBwZXJvIG90cmFzIHZlY2VzIGZ1ZSBwb3JxdWUgZW52aWFyb24gZWwgIGPDs2RpZ28gZGUgaW5pY2lvIGRlIGxhIHRhcmVhIGNvbiBwb2NhcyBhbHRlcmFjaW9uZXMgeSBvYnR1dmllcm9uIG3DoXMgcHVudG9zIGRlIGxvcyBxdWUgZGViZXLDrWFuLgo+IAo+IEluY2x1c28gbGFzIGhlcnJhbWllbnRhcyBjcmVhZGFzIGVzcGVjw61maWNhbWVudGUgcGFyYSBsYSBlbnNlw7FhbnphIHB1ZWRlbiBlc3RhciBhIGxhIGFsdHVyYSBkZSBsYXMgbmVjZXNpZGFkZXMgZGUgbG9zIG1hZXN0cm9zLiBbS2V1bjIwMTZhLCAgS2V1bjIwMTZiXSBleGFtaW7DsyBsb3MgbWVuc2FqZXMgcHJvZHVjaWRvcyBwb3IgNjkgaGVycmFtaWVudGFzIGRlIGNsYXNpZmljYWNpw7NuIGF1dG9tw6F0aWNhLiBEZXNjdWJyaWVyb24gcXVlIGxhcyBoZXJyYW1pZW50YXMgYSBtZW51ZG8gbm8gZGFuICByZXRyb2FsaW1lbnRhY2nDs24gc29icmUgY8OzbW8gc29sdWNpb25hciBwcm9ibGVtYXMgeSBkYW4gZWwgc2lndWllbnRlIHBhc28uIFRhbWJpw6luIGRlc2N1YnJpZXJvbiBxdWUgbGEgbWF5b3LDrWEgZGUgbG9zIG1hZXN0cm9zIG5vIHB1ZWRlbiBhZGFwdGFyICBmw6FjaWxtZW50ZSBsYSBtYXlvcsOtYSBkZSBsYXMgaGVycmFtaWVudGFzIGEgc3VzIG5lY2VzaWRhZGVzOiBjb21vIG11Y2hhcyBoZXJyYW1pZW50YXMgZGUgZmx1am8gZGUgdHJhYmFqbywgdGllbmRlbiBhIGhhY2VyIGN1bXBsaXIgbGFzIHN1cG9zaWNpb25lcyBubyByZWNvbm9jaWRhcyBkZSBzdXMgY3JlYWRvcmVzIHNvYnJlIGPDs21vIGZ1bmNpb25hbiBsYXMgaW5zdGl0dWNpb25lcy4gU3UgZXNxdWVtYSBkZSBjbGFzaWZpY2FjacOzbiBlcyB1bmEgbGlzdGEgZGUgY29tcHJhcyDDunRpbCBjdWFuZG8gc2UgbWlyYW4gIGhlcnJhbWllbnRhcyBkZSBlc3RlIHRpcG8uCgoKW0J1ZmYyMDE1XSBwcmVzZW50YSB1bmEgcmVmbGV4acOzbiBiaWVuIGluZm9ybWFkYSBzb2JyZSBsYSBpZGVhIGRlIHByb3BvcmNpb25hciBjb21lbnRhcmlvcyBhdXRvbWF0aXphZG9zLiBTdSBwdW50byBkZSBwYXJ0aWRhIGVzIHF1ZSAibG9zIHNpc3RlbWFzIGF1dG9tYXRpemFkb3MgZGUgY2FsaWZpY2FjacOzbiBheXVkYW4gYSBsb3MgYWx1bW5vcyBhIGlkZW50aWZpY2FyIGVycm9yZXMgZW4gc3UgY8OzZGlnbywgW3Blcm9dIHB1ZWRlbiBkZXNhbmltYXIgaW5hZHZlcnRpZGFtZW50ZSBhIGxvcyBhbHVtbm9zIGEgcGVuc2FyIGNyw610aWNhbWVudGUgeSBldmFsdWFyIGV4aGF1c3RpdmFtZW50ZSwgeSBlbiBzdSBsdWdhciBmb21lbnRhbiBsYSBkZXBlbmRlbmNpYSBkZSBsYXMgcHJ1ZWJhcyBkZWwgbWFlc3RybyIuIFVubyBkZSBsb3MgcHJvYmxlbWFzIGNsYXZlIHF1ZSBpZGVudGlmaWNhcm9uIGVzIHF1ZSB1biBhbHVtbm8gcHVlZGUgcHJvYmFyIGEgZm9uZG8gc3UgY8OzZGlnbywgcGVybyBsYSBjYXJhY3RlcsOtc3RpY2EgYcO6biBwdWVkZSBubyBpbXBsZW1lbnRhcnNlIGRlIGFjdWVyZG8gY29uIGxhcyBlc3BlY2lmaWNhY2lvbmVzIGRlbCBtYWVzdHJvLiBFbiBlc3RlIGNhc28sIGxhICJmYWxsYSIgbm8gZXMgY2F1c2FkYSBwb3IgbGEgZmFsdGEgZGUgcHJ1ZWJhcyBzaW5vIHBvciB1biBtYWxlbnRlbmRpZG8gZGUgbG9zIHJlcXVpc2l0b3MsIHkgZXMgcG9jbyBwcm9iYWJsZSBxdWUgbcOhcyBwcnVlYmFzIGV4cG9uZ2FuIGVsIHByb2JsZW1hLiBTaSBlbCBzaXN0ZW1hIGRlIGNsYXNpZmljYWNpw7NuIGF1dG9tw6F0aWNhIG5vIHByb3BvcmNpb25hIGNvbWVudGFyaW9zIHBlcnNwaWNhY2VzIHkgcHJvY2VzYWJsZXMsIGVzdGEgZXhwZXJpZW5jaWEgc29sbyBmcnVzdHJhcsOhIGFsIGFsdW1uby4KClBhcmEgcHJvcG9yY2lvbmFyIGVzYSByZXRyb2FsaW1lbnRhY2nDs24sIGVsIHNpc3RlbWEgZGUgW0J1ZmYyMDE1XSBpZGVudGlmaWNhIHF1w6kgbcOpdG9kb3MgZW4gZWwgY8OzZGlnbyBkZWwgYWx1bW5vIHNlIGVqZWN1dGFuIG1lZGlhbnRlIGxhcyBwcnVlYmFzIGZhbGxpZGFzIHBhcmEgcXVlIGVsIHNpc3RlbWEgcHVlZGEgYXNvY2lhciBsYXMgcHJ1ZWJhcyBmYWxsaWRhcyBjb24gY2FyYWN0ZXLDrXN0aWNhcyBwYXJ0aWN1bGFyZXMgZGVudHJvIGRlbCBlbnbDrW8gZGVsIGFsdW1uby4gRWwgc2lzdGVtYSBkZWNpZGUgc2kgc2UgaGFuICJvYnRlbmlkbyIgc3VnZXJlbmNpYXMgZXNwZWPDrWZpY2FzIGFsIHZlciBzaSBlbCBhbHVtbm8gaGEgcHJvYmFkbyBsYSBjYXJhY3RlcsOtc3RpY2EgYXNvY2lhZGEgbG8gc3VmaWNpZW50ZSwgcG9yIGxvIHF1ZSBsb3MgYWx1bW5vcyBubyBwdWVkZW4gY29uZmlhciBlbiBsYXMgc3VnZXJlbmNpYXMgZW4gbHVnYXIgZGUgaGFjZXIgcHJ1ZWJhcy4KCltTcmlkMjAxNl0gZGVzY3JpYmUgYWxndW5vcyBvdHJvcyBlbmZvcXVlcyBwYXJhIGNvbXBhcnRpciBjb21lbnRhcmlvcyBjb24gbG9zIGFsdW1ub3MgY3VhbmRvIHBydWViYW4gYXV0b23DoXRpY2FtZW50ZSBzdSBjw7NkaWdvLiBFbCBwcmltZXJvIGVzIHByb3BvcmNpb25hciBsYSBzYWxpZGEgZXNwZXJhZGEgcGFyYSBsYXMgcHJ1ZWJhcywgcGVybyBsdWVnbyBsYSBzYWxpZGEgZGVsIGPDs2RpZ28gZHVybyBkZSBsb3MgYWx1bW5vcyBwYXJhIGVzYXMgZW50cmFkYXMgKHBvcnF1ZSBjdWFscXVpZXIgY29zYSBxdWUgc2UgcHVlZGEganVnYXIgc2Vyw6EpLiBFbCBzZWd1bmRvIGVzIGluZm9ybWFyIGxvcyByZXN1bHRhZG9zIGFwcm9iYWRvcyAvIHJlcHJvYmFkb3MgcGFyYSBlbCBjw7NkaWdvIGRlIGxvcyBhbHVtbm9zLCBwZXJvIHNvbG8gcHJvcG9yY2lvbmFyIGxhcyBlbnRyYWRhcyB5IHNhbGlkYXMgcmVhbGVzIGRlIGxhcyBwcnVlYmFzIGRlc3B1w6lzIGRlIGxhIGZlY2hhIGRlIGVudsOtby4gU2luIGVtYmFyZ28sIGRlY2lybGVzIGEgbG9zIGFsdW1ub3MgcXVlIGVzdMOhbiBlcXVpdm9jYWRvcyBwZXJvIG5vIGRlY2lybGVzIHBvciBxdcOpIGVzIGZydXN0cmFudGUuCgpVbmEgdGVyY2VyYSBvcGNpw7NuIGVzIHVzYXIgdW5hIHTDqWNuaWNhIGxsYW1hZGEgaGFzaGluZyBwYXJhIGdlbmVyYXIgdW4gdmFsb3IgcXVlIGRlcGVuZGUgZGUgbGEgc2FsaWRhIHBlcm8gcXVlIG5vIGxvIHJldmVsYS4gU2kgZWwgdXN1YXJpbyBwcm9kdWNlIGV4YWN0YW1lbnRlIGVsIHJlc3VsdGFkbyBjb3JyZWN0bywgZW50b25jZXMgc3UgaGFzaCBkZXNibG9xdWVhcsOhIGxhIHNvbHVjacOzbiwgcGVybyBlcyBpbXBvc2libGUgdHJhYmFqYXIgaGFjaWEgYXRyw6FzIGRlc2RlIGVsIGhhc2ggcGFyYSBkZXNjdWJyaXIgY3XDoWwgc2Ugc3Vwb25lIHF1ZSBlcyBsYSBzYWxpZGEuIEhhc2hpbmcgcmVxdWllcmUgbcOhcyB0cmFiYWpvIHkgZXhwbGljYWNpw7NuIHBhcmEgY29uZmlndXJhciwgcGVybyBsb2dyYSB1biBidWVuIGVxdWlsaWJyaW8gZW50cmUgcmV2ZWxhciByZXNwdWVzdGFzIHByZW1hdHVyYW1lbnRlIHkgbm8gcmV2ZWxhcmxhcyBjdWFuZG8gYXl1ZGFyw61hLgoKCiMjIFBlbnNhbWllbnRvIGRlIG5pdmVsIHN1cGVyaW9yCgpNdWNob3Mgb3Ryb3MgdGlwb3MgZGUgZWplcmNpY2lvcyBkZSBwcm9ncmFtYWNpw7NuIHNvbiBkaWbDrWNpbGVzIGRlIGV2YWx1YXIgcGFyYSBsb3MgbWFlc3Ryb3MgZW4gdW5hIGNsYXNlIGNvbiBtw6FzIGRlIHVuIHB1w7FhZG8gZGUgZXN0dWRpYW50ZXMgZSBpZ3VhbG1lbnRlIGRpZsOtY2lsZXMgZGUgZXZhbHVhciBwYXJhIGxhcyBwbGF0YWZvcm1hcyBhdXRvbWF0aXphZGFzLiBMb3MgcHJveWVjdG9zIGRlIHByb2dyYW1hY2nDs24gbcOhcyBncmFuZGVzIHNvbiAoY29uIHN1ZXJ0ZSkgaGFjaWEgcXXDqSBjbGFzZXMgc2UgZXN0w6FuIGNvbnN0cnV5ZW5kbywgcGVybyBsYSDDum5pY2EgZm9ybWEgZGUgZGFyIHJldHJvYWxpbWVudGFjacOzbiBlcyBjYXNvIHBvciBjYXNvLgoKTGEgcmV2aXNpw7NuIGRlbCBjw7NkaWdvIHRhbWJpw6luIGVzIGRpZsOtY2lsIGRlIGNhbGlmaWNhciBhdXRvbcOhdGljYW1lbnRlIGVuIGdlbmVyYWwsIHBlcm8gc2UgcHVlZGUgYWJvcmRhciBzaSBzZSBsZXMgZGEgYSBsb3MgYWx1bW5vcyB1bmEgbGlzdGEgZGUgZmFsbGFzIHF1ZSBkZWJlbiBidXNjYXIgeSBzZSBsZXMgcGlkZSBxdWUgaGFnYW4gY29pbmNpZGlyIGNvbWVudGFyaW9zIHBhcnRpY3VsYXJlcyBjb24gbMOtbmVhcyBkZSBjw7NkaWdvIHBhcnRpY3VsYXJlcy4gUG9yIGVqZW1wbG8sIHNlIGxlIHB1ZWRlIGRlY2lyIGFsIGFsdW1ubyBxdWUgaGF5IGRvcyBlcnJvcmVzIGRlIHNhbmdyw61hIHkgdW4gbm9tYnJlIGRlIHZhcmlhYmxlIGluY29ycmVjdG8geSBwZWRpcmxlIHF1ZSBsb3Mgc2XDsWFsZS4gU2kgZXN0w6FuIG3DoXMgYXZhbnphZG9zLCBzZSBsZXMgcG9kcsOtYSBkYXIgbWVkaWEgZG9jZW5hIGRlIHRpcG9zIGRlIGNvbWVudGFyaW9zIHF1ZSBwb2Ryw61hbiBoYWNlciBzb2JyZSBlbCBjw7NkaWdvIHNpbiBxdWUgc2UgbGVzIGRpZ2EgY3XDoW50b3MgZGUgY2FkYSB1bm8gZGViZXLDrWFuIGVuY29udHJhci4KCltTdGVnMjAxNmJdIGVzIHVuIGJ1ZW4gcHVudG8gZGUgcGFydGlkYSBwYXJhIHVuYSByw7picmljYSBkZSBlc3RpbG8gZGUgY8OzZGlnbywgbWllbnRyYXMgcXVlIFtMdXh0MjAwOV0gYW5hbGl6YSBsYSByZXZpc2nDs24gcG9yIHBhcmVzIGVuIGxhcyBjbGFzZXMgZGUgcHJvZ3JhbWFjacOzbiBkZSBtYW5lcmEgbcOhcyBnZW5lcmFsLiBTaSB2YSBhIGhhY2VyIHF1ZSBsb3MgYWx1bW5vcyByZWFsaWNlbiByZXZpc2lvbmVzLCB1dGlsaWNlIHVuYSByZXZpc2nDs24gcG9yIHBhcmVzIGNhbGlicmFkYSAoU2VjY2nDs24gNS4zKSBwYXJhIHF1ZSB0ZW5nYW4gbW9kZWxvcyBkZSBjw7NtbyBkZWJlcsOtYW4gc2VyIGxvcyBidWVub3MgY29tZW50YXJpb3MuCgo+ICoqUmV2aXNpw7NuIGRlIGPDs2RpZ28qKgo+IE1hcnF1ZSBsb3MgcHJvYmxlbWFzIGVuIGNhZGEgbMOtbmVhIGRlIGPDs2RpZ28gdXRpbGl6YW5kbyBsYSByw7picmljYSBwcm92aXN0YS4KPiAKPiAwMSkgZGVmIGFkZGVtIChmKToKPiAwMikgeDEgPSBhYmllcnRvIChmKSAucmVhZGxpbmVzICgpCj4gMDMpIHgyID0gW3ggcGFyYSB4IGVuIHgxIHNpIHguc3RyaXAgKCldCj4gMDQpIGNhbWJpb3MgPSAwCj4gMDUpIHBhcmEgdiBlbiB4MjoKPiAwNikgaW1wcmltaXIgKCd0b3RhbCcsIHRvdGFsKQo+IDA3KSB0b3QgPSB0b3QgKyBpbnQgKHYpCj4gMDgpIGltcHJpbWlyICgndG90YWwnKQo+IDEuIG5vbWJyZSBkZSB2YXJpYWJsZSBwb2JyZSAyLiB1c28gZGUgdmFyaWFibGUgaW5kZWZpbmlkYQo+IDMuIHZhbG9yIGRlIHJldG9ybm8gZmFsdGFudGUgNC4gdmFyaWFibGUgbm8gdXRpbGl6YWRhCgojIyBFamVyY2ljaW9zCiMjI0PDs2RpZ28geSBlamVjdWNpw7NuIChwYXJlcyAvIDEwKQpDcmVlIHVuIGJyZXZlIGVqZXJjaWNpbyBkZSBDJlIsIGx1ZWdvIG5lZ29jaWUgY29uIHVuIHNvY2lvIHkgdmVhIGN1w6FudG8gdGllbXBvIGxlcyBsbGV2YSBhIGNhZGEgdW5vIGNvbXByZW5kZXIgeSBoYWNlciBlbCBlamVyY2ljaW8gZGVsIG90cm8uIMK/SHVibyBhbGd1bmEgYW1iaWfDvGVkYWQgbyBtYWxlbnRlbmRpZG8gZW4gbGEgZGVzY3JpcGNpw7NuIGRlbCBlamVyY2ljaW8/CgojIyMgQ8OzZGlnbyBkZSBpbnZlcnNpw7NuIHkgZWplY3VjacOzbiAoZ3J1cG9zIHBlcXVlw7FvcyAvIDE1KQpGb3JtZSBncnVwb3MgZGUgNCBhIDYgcGVyc29uYXMuIEhhZ2EgcXVlIGNhZGEgbWllbWJybyBkZWwgZ3J1cG8gY3JlZSB1biBlamVyY2ljaW8gaW52ZXJ0aWRvIGRlIEMmUiBxdWUgcmVxdWllcmEgcXVlIGxhcyBwZXJzb25hcyBkZXNjdWJyYW4gcXXDqSBlbnRyYWRhIHByb2R1Y2UgdW5hIHNhbGlkYSBwYXJ0aWN1bGFyLiBFbGlqYSBkb3MgYWwgYXphciB5IHZlYSBjdcOhbnRhcyBlbnRyYWRhcyBkaWZlcmVudGVzIHB1ZWRlIGVuY29udHJhciBlbCBncnVwbyBxdWUgc2F0aXNmYWdhbiBsb3MgcmVxdWlzaXRvcy4KCiMjIyBWYWxvcmVzIGRlIHJhc3RyZW8gKHBhcmVzIC8gMTApCkVzY3JpYmEgdW4gcHJvZ3JhbWEgY29ydG8gKDEw4oCTMTUgbMOtbmVhcyksIG5lZ29jaWUgY29uIHVuIHNvY2lvIHkgcmFzdHJlZSBjw7NtbyBsYXMgdmFyaWFibGVzIGVuIGVsIHByb2dyYW1hIGNhbWJpYW4gZGUgdmFsb3IgY29uIGVsIHRpZW1wby4gwr9RdcOpIGRpZmVyZW5jaWFzIGhheSBlbiBjw7NtbyB1c3RlZCB5IHN1IHBhcmVqYSBlc2NyaWJpZXJvbiBzdXMgaHVlbGxhcz8KCiMjIyBSZWZhY3Rvcml6YWNpw7NuIChncnVwb3MgcGVxdWXDsW9zIC8gMTUpCkZvcm1lIGdydXBvcyBkZSAzIGEgNCBwZXJzb25hcy4gSGFnYSBxdWUgY2FkYSBwZXJzb25hIHNlbGVjY2lvbmUgdW4gZnJhZ21lbnRvIGNvcnRvIGRlIGPDs2RpZ28gKGRlIDEwIGEgMzAgbMOtbmVhcyBkZSBsYXJnbykgcXVlIGhheWEgZXNjcml0byBxdWUgbm8gc2VhIHRhbiBvcmRlbmFkbyBjb21vIHBvZHLDrWEgc2VyLCBsdWVnbyBlbGlqYSB1bm8gYWwgYXphciB5IGhhZ2EgcXVlIHRvZG9zIGVuIGVsIGdydXBvIGxvIGFycmVnbGVuIGRlIGZvcm1hIGluZGVwZW5kaWVudGUuIMK/Q8OzbW8gZGlmaWVyZW4gc3VzIHZlcnNpb25lcyBsaW1waWFkYXM/IMK/UXXDqSB0YW4gYmllbiBvIHF1w6kgdGFuIG1hbCBzZXLDrWEgY2FwYXogZGUgYWNvbW9kYXIgdG9kYXMgZXN0YXMgdmFyaWFjaW9uZXMgc2kgbWFyY2EgYXV0b23DoXRpY2FtZW50ZSBvIGVuIHVuYSBjbGFzZSBncmFuZGU/CgojIyMgRXRpcXVldGFyIHVuIGRpYWdyYW1hIChwYXJlcyAvIDEwKQpEaWJ1amUgdW4gZGlhZ3JhbWEgcXVlIG11ZXN0cmUgYWxnbyBxdWUgaGF5YSBleHBsaWNhZG8gcmVjaWVudGVtZW50ZTogY8OzbW8gbG9zIG5hdmVnYWRvcmVzIG9idGllbmVuIGRhdG9zIGRlIGxvcyBzZXJ2aWRvcmVzLCBsYSByZWxhY2nDs24gZW50cmUgb2JqZXRvcyB5IGNsYXNlcywgbyBjw7NtbyBzZSBpbmRleGFuIGxvcyBtYXJjb3MgZGUgZGF0b3MgZW4gUi4gQ29sb3F1ZSBsYXMgZXRpcXVldGFzIGEgdW4gbGFkbyB5IHDDrWRhbGUgYSBzdSBjb21wYcOxZXJvIHF1ZSBsYXMgY29sb3F1ZS4KCiMjIyBSb21wZWNhYmV6YXMgZGUgbMOhcGl6IHkgcGFwZWwgKHRvZGEgbGEgY2xhc2UgLyAxNSkKW0J1dGwyMDE3XSBkZXNjcmliZSB1biBjb25qdW50byBkZSByb21wZWNhYmV6YXMgZGUgbMOhcGl6IHkgcGFwZWwgcXVlIHB1ZWRlbiBjb252ZXJ0aXJzZSBlbiB0YXJlYXMgZGUgcHJvZ3JhbWFjacOzbiBpbnRyb2R1Y3RvcmlhcyBlIGluZm9ybWEgcXVlIGxvcyBhbHVtbm9zIGRpc2ZydXRhbiBkZSBlc3RhcyB0YXJlYXMgeSBmb21lbnRhbiBsYSBtZXRhY29nbmljacOzbi4gUGllbnNlIGVuIHVuIHNpbXBsZSByb21wZWNhYmV6YXMgbyBqdWVnbyBkZSBsw6FwaXogeSBwYXBlbCBxdWUganVnw7MgZGUgbmnDsW8geSBkZXNjcmliYSBjw7NtbyBsbyBjb252ZXJ0aXLDrWEgZW4gdW4gZWplcmNpY2lvIGRlIHByb2dyYW1hY2nDs24uCgojIyMgRmFsbGFzIGRlIGNvbnRlbyAocGFyZXMgLyAxNSkKQ3VhbHF1aWVyIGVzdGltYWNpw7NuIMO6dGlsIGRlIGN1w6FudG8gdGllbXBvIG5lY2VzaXRhIHVuIGVqZXJjaWNpbyBkZWJlIHRlbmVyIGVuIGN1ZW50YSBsYSBmcmVjdWVuY2lhIGRlIGxhcyBmYWxsYXMgeSBjdcOhbnRvIHRpZW1wbyBzZSBwaWVyZGUgcGFyYSBlbGxhcy4gUG9yIGVqZW1wbG8sIGVkaXRhciBhcmNoaXZvcyBkZSB0ZXh0byBwYXJlY2UgdW5hIHRhcmVhIHNpbXBsZSwgcGVybyDCv3F1w6kgaGF5IGRlIGVuY29udHJhciBlc29zIGFyY2hpdm9zPyBMYSBtYXlvcsOtYSBkZSBsb3MgZWRpdG9yZXMgZGUgR1VJIGd1YXJkYW4gY29zYXMgZW4gZWwgZXNjcml0b3JpbyBkZWwgdXN1YXJpbyBvIGVuIGVsIGRpcmVjdG9yaW8gcHJpbmNpcGFsOyBTaSBsb3MgYXJjaGl2b3MgdXRpbGl6YWRvcyBlbiB1biBjdXJzbyBzZSBhbG1hY2VuYW4gZW4gb3RybyBsdWdhciwgdW5hIGZyYWNjacOzbiBzdXN0YW5jaWFsIG5vIHBvZHLDoSBuYXZlZ2FyIGFsIGRpcmVjdG9yaW8gY29ycmVjdG8gc2luIGF5dWRhLiAoU2kgZXN0byBsZSBwYXJlY2UgdW4gcGVxdWXDsW8gcHJvYmxlbWEsIHBvciBmYXZvciByZXZpc2UgbGEgZGlzY3VzacOzbiBkZWwgcHVudG8gY2llZ28gZXhwZXJ0byBlbiBlbCBDYXDDrXR1bG8gMykuCgpBbCB0cmFiYWphciBjb24gdW4gY29tcGHDsWVybywgaGFnYSB1bmEgbGlzdGEgZGUgbGFzIGNvc2FzICJzaW1wbGVzIiBxdWUgaGEgdmlzdG8gc2FsaXIgbWFsIGVuIGxvcyBlamVyY2ljaW9zIHF1ZSBoYSB1c2FkbyBvIHRvbWFkby4gwr9Db24gcXXDqSBmcmVjdWVuY2lhIGFwYXJlY2VuPyDCv0N1w6FudG8gdGllbXBvIHRhcmRhbiBsb3MgYWx1bW5vcyBlbiBhcnJlZ2xhcmxvcyBzb2xvcyBvIGNvbiBheXVkYT8gwr9DdcOhbnRvIHRpZW1wbyB0aWVuZXMgYWN0dWFsbWVudGUgZW4gY2xhc2UgcGFyYSBsaWRpYXIgY29uIGVsbG9zPwoKIyMjIEhhYmxhbmRvIGRlIHRpZW1wb3MgKGluZGl2aWR1YWwgLyAxMCkKwr9RdcOpIHRhbiBwcmVjaXNhcyBoYW4gc2lkbyBsYXMgZXN0aW1hY2lvbmVzIGRlIHRpZW1wbyBzb2JyZSBsb3MgZWplcmNpY2lvcyBlbiBlc3RlIGxpYnJvIGhhc3RhIGFob3JhPwoKLS0tLS0tLQoKCiMgQ29uc3RydXllbmRvIHVuYSBjb211bmlkYWQgZGUgcHLDoWN0aWNhCgpObyB0aWVuZSBxdWUgYXJyZWdsYXIgdG9kb3MgbG9zIG1hbGVzIGRlIGxhIHNvY2llZGFkIHBhcmEgZW5zZcOxYXIgcHJvZ3JhbWFjacOzbiwgcGVybyBzw60gZGViZSBpbnZvbHVjcmFyc2UgZW4gbG8gcXVlIHN1Y2VkZSBmdWVyYSBkZSBzdSBjbGFzZSBzaSBxdWllcmUgcXVlIGxhIGdlbnRlIGFwcmVuZGEuIEVzdG8gc2UgYXBsaWNhIHRhbnRvIGEgbG9zIG1hZXN0cm9zIGNvbW8gYSBsb3MgZXN0dWRpYW50ZXM6IG11Y2hvcyBtYWVzdHJvcyBkZSBjYW1wbyBsaWJyZSBjb21pZW56YW4gY29tbyB2b2x1bnRhcmlvcyBvIHRyYWJhamFkb3JlcyBhIHRpZW1wbyBwYXJjaWFsIHkgdGllbmVuIHF1ZSBoYWNlciBtYWxhYmFyaXNtb3MgY29uIG11Y2hvcyBvdHJvcyBjb21wcm9taXNvcy4gTG8gcXVlIHN1Y2VkZSBmdWVyYSBkZWwgYXVsYSBlcyB0YW4gaW1wb3J0YW50ZSBwYXJhIHN1IMOpeGl0byBjb21vIGxvIGVzIHBhcmEgc3VzIGFsdW1ub3MsIHBvciBsbyBxdWUgbGEgbWVqb3IgbWFuZXJhIGRlIGF5dWRhciBhIGFtYm9zIGVzIGZvbWVudGFyIHVuYSBjb211bmlkYWQgZG9jZW50ZS4KCj4qKkZpbmxhbmRpYSB5IHBvciBxdcOpIG5vKioKPgo+TGFzIGVzY3VlbGFzIGRlIEZpbmxhbmRpYSBzZSBlbmN1ZW50cmFuIGVudHJlIGxhcyBtw6FzIGV4aXRvc2FzIGRlbCBtdW5kbywgcGVybyBjb21vIEFudSBQYXJ0YW5lbiBzZcOxYWzDsywgbm8gaGFuIHRlbmlkbyDDqXhpdG8gZW4gZm9ybWEgYWlzbGFkYS4gTG9zIGludGVudG9zIGRlIG90cm9zIHBhw61zZXMgZGUgYWRvcHRhciBtw6l0b2RvcyBkZSBlbnNlw7FhbnphIGZpbmxhbmRlc2VzIGVzdMOhbiBjb25kZW5hZG9zIGFsIGZyYWNhc28gYSBtZW5vcyBxdWUgZXNvcyBwYcOtc2VzIHRhbWJpw6luIGdhcmFudGljZW4gcXVlIGxvcyBuacOxb3MgKHkgc3VzIHBhZHJlcykgZXN0w6luIHNlZ3Vyb3MsIGJpZW4gYWxpbWVudGFkb3MgeSB0cmF0YWRvcyBkZSBtYW5lcmEganVzdGEgcG9yIGxvcyB0cmlidW5hbGVzIFtTYWhsMjAxNSwgV2lsazIwMTFdLiBFc3RvIG5vIGVzIHNvcnByZW5kZW50ZSBkYWRvIGxvIHF1ZSBzYWJlbW9zIHNvYnJlIGxhIGltcG9ydGFuY2lhIGRlIGxhIG1vdGl2YWNpw7NuIHBhcmEgZWwgYXByZW5kaXphamUgKENhcMOtdHVsbyAxMCk6IHRvZG9zIGxvIGhhY2VuIHBlb3Igc2kgY3JlZW4gcXVlIGVsIHNpc3RlbWEgZXMgaW1wcmVkZWNpYmxlLCBpbmp1c3RvIG8gaW5kaWZlcmVudGUuCgpVbiBtYXJjbyBwYXJhIHBlbnNhciBlbiBsYXMgY29tdW5pZGFkZXMgZGUgZW5zZcOxYW56YSBlcyBlbCBhcHJlbmRpemFqZSBzaXR1YWRvLCBxdWUgc2UgY2VudHJhIGVuIGPDs21vIGxhIHBhcnRpY2lwYWNpw7NuIHBlcmlmw6lyaWNhIGxlZ8OtdGltYSBsbGV2YSBhIGxhcyBwZXJzb25hcyBhIGNvbnZlcnRpcnNlIGVuIG1pZW1icm9zIGRlIHVuYSBjb211bmlkYWQgZGUgcHLDoWN0aWNhIFtXZW5nMjAxNV0uIERlc2VtcGFjYW5kbyBlc29zIHTDqXJtaW5vcywgdW5hIGNvbXVuaWRhZCBkZSBwcsOhY3RpY2EgZXMgdW4gZ3J1cG8gZGUgcGVyc29uYXMgdW5pZGFzIHBvciBpbnRlcsOpcyBlbiBhbGd1bmEgYWN0aXZpZGFkLCBjb21vIHRlamVyIG8gZsOtc2ljYSBkZSBwYXJ0w61jdWxhcy4gTGEgcGFydGljaXBhY2nDs24gcGVyaWbDqXJpY2EgbGVnw610aW1hIHNpZ25pZmljYSByZWFsaXphciB0YXJlYXMgc2ltcGxlcyB5IGRlIGJham8gcmllc2dvIHF1ZSBsYSBjb211bmlkYWQgcmVjb25vY2UgY29tbyBjb250cmlidWNpb25lcyB2w6FsaWRhczogaGFjZXIgc3UgcHJpbWVyIHBhw7F1ZWxvLCBsbGVuYXIgc29icmVzIGR1cmFudGUgdW5hIGNhbXBhw7FhIGVsZWN0b3JhbCBvIHJldmlzYXIgbGEgZG9jdW1lbnRhY2nDs24gcGFyYSBlbCBzb2Z0d2FyZSBkZSBjw7NkaWdvIGFiaWVydG8uCgpFbCBhcHJlbmRpemFqZSBzaXR1YWRvIHNlIGNlbnRyYSBlbiBsYSB0cmFuc2ljacOzbiBkZSBzZXIgdW4gcmVjacOpbiBsbGVnYWRvIGEgc2VyIGFjZXB0YWRvIGNvbW8gdW4gY29tcGHDsWVybyBwb3IgYXF1ZWxsb3MgcXVlIHlhIHNvbiBtaWVtYnJvcyBkZSBsYSBjb211bmlkYWQuIEVzdG8gbm9ybWFsbWVudGUgc2lnbmlmaWNhIGNvbWVuemFyIGNvbiB0YXJlYXMgeSBoZXJyYW1pZW50YXMgc2ltcGxlcywgbHVlZ28gcmVhbGl6YXIgdGFyZWFzIHNpbWlsYXJlcyBjb24gaGVycmFtaWVudGFzIG3DoXMgY29tcGxlamFzIHkgZmluYWxtZW50ZSBhYm9yZGFyIGVsIG1pc21vIHRyYWJham8gcXVlIGxvcyBwcm9mZXNpb25hbGVzIGF2YW56YWRvcy4gUG9yIGVqZW1wbG8sIGxvcyBuacOxb3MgcXVlIGFwcmVuZGVuIG3DunNpY2EgcHVlZGVuIGNvbWVuemFyIHRvY2FuZG8gY2FuY2lvbmVzIGluZmFudGlsZXMgZW4gdW5hIGdyYWJhZG9yYSBvIHVuIHVrZWxlbGUsIGx1ZWdvIHRvY2FyIG90cmFzIGNhbmNpb25lcyBzaW1wbGVzIGVuIHVuYSB0cm9tcGV0YSBvIHNheG9mw7NuIGVuIHVuYSBiYW5kYSwgeSBmaW5hbG1lbnRlIGNvbWVuemFyIGEgZXhwbG9yYXIgc3VzIHByb3Bpb3MgZ3VzdG9zIG11c2ljYWxlcy4gTGFzIGZvcm1hcyBjb211bmVzIGRlIGFwb3lhciBlc3RhIHByb2dyZXNpw7NuIGluY2x1eWVuOgoKKipSZXNvbHVjacOzbiBkZSBwcm9ibGVtYXM6KioKIkVzdG95IGF0cmFwYWRvLCDCv3BvZGVtb3MgdHJhYmFqYXIgZW4gZWwgZGlzZcOxbyBkZSBlc3RhIGxlY2Npw7NuIGp1bnRvcz8iCgoqKlNvbGljaXR1ZGVzIGRlIGluZm9ybWFjacOzbjoqKgoiwr9DdcOhbCBlcyBsYSBjb250cmFzZcOxYSBwYXJhIGVsIGFkbWluaXN0cmFkb3IgZGUgbGEgbGlzdGEgZGUgY29ycmVvPyIKCioqQnVzY2FuZG8gZXhwZXJpZW5jaWE6KioKIsK/QWxndWllbiBoYSB0ZW5pZG8gdW4gYWx1bW5vIGNvbiB1bmEgZGlzY2FwYWNpZGFkIGRlIGxlY3R1cmE/IgoKKipDb21wYXJ0aXIgYWN0aXZvczoqKgoiQ3Jlw6kgdW4gc2l0aW8gd2ViIHBhcmEgdW5hIGNsYXNlIGVsIGHDsW8gcGFzYWRvIHF1ZSBwdWVkZXMgdXNhciBjb21vIHB1bnRvIGRlIHBhcnRpZGEiLgoKKipDb29yZGluYWNpw7NuOioqCiLCv1BvZGVtb3MgY29tYmluYXIgbnVlc3Ryb3MgcGVkaWRvcyBkZSBjYW1pc2V0YXMgcGFyYSBvYnRlbmVyIHVuIGRlc2N1ZW50bz8iCgoqKkNvbnN0cnV5ZW5kbyB1biBhcmd1bWVudG86KioKIlNlcsOhIG3DoXMgZsOhY2lsIGNvbnZlbmNlciBhIG1pIGplZmUgcGFyYSBxdWUgaGFnYSBjYW1iaW9zIHNpIHPDqSBjw7NtbyBvdHJvcyBib290Y2FtcHMgaGFjZW4gZXN0byIuCgoqKkRvY3VtZW50YWNpw7NuIGRlIHByb3llY3RvczoqKgoiSGVtb3MgdGVuaWRvIGVzdGUgcHJvYmxlbWEgY2luY28gdmVjZXMgYWhvcmEuIFZhbW9zIGEgZXNjcmliaXJsbyBkZSB1bmEgdmV6IHBvciB0b2Rhcy4KCioqQ29ub2NpbWllbnRvIGRlIG1hcGVvOioqCiLCv1F1w6kgb3Ryb3MgZ3J1cG9zIGVzdMOhbiBoYWNpZW5kbyBjb3NhcyBjb21vIGVzdGEgZW4gdmVjaW5kYXJpb3MgbyBjaXVkYWRlcyBjZXJjYW5hcz8iCgoqKlZpc2l0YXM6KioK4oCcwr9Qb2RlbW9zIHZlbmlyIGEgdmVyIHN1IHByb2dyYW1hIGRlc3B1w6lzIGRlIGxhIGVzY3VlbGE/IE5lY2VzaXRhbW9zIGVzdGFibGVjZXIgdW5vIGVuIG51ZXN0cmEgY2l1ZGFkICIuCkVuIHTDqXJtaW5vcyBnZW5lcmFsZXMsIHVuYSBjb211bmlkYWQgZGUgcHLDoWN0aWNhIHB1ZWRlIHNlcjoKCioqQ29tdW5pZGFkIGRlIGFjY2nDs246KioKcGVyc29uYXMgZW5mb2NhZGFzIGVuIHVuIG9iamV0aXZvIGNvbXBhcnRpZG8sIGNvbW8gbG9ncmFyIHF1ZSBhbGd1aWVuIHNlYSBlbGVnaWRvLgoKKipDb211bmlkYWQgZGUgcHJlb2N1cGFjacOzbjoqKgpsb3MgbWllbWJyb3Mgc2UgcmXDum5lbiBwb3IgdW4gcHJvYmxlbWEgY29tcGFydGlkbywgY29tbyB0cmF0YXIgdW5hIGVuZmVybWVkYWQgYSBsYXJnbyBwbGF6by4KCioqQ29tdW5pZGFkIGRlIGludGVyw6lzOioqCmVuZm9jYWRvIGVuIHVuIGFtb3IgY29tcGFydGlkbyBwb3IgYWxnbyBjb21vIGVsIGJhY2tnYW1tb24gbyB0ZWplci4KCioqQ29tdW5pZGFkIGRlIGx1Z2FyOioqCnBlcnNvbmFzIHF1ZSB2aXZlbiBvIHRyYWJhamFuIGp1bnRhcy4KCkxhIG1heW9yw61hIGRlIGxhcyBjb211bmlkYWRlcyBzb24gbWV6Y2xhcyBkZSBlc3RvcywgY29tbyBsYXMgcGVyc29uYXMgZW4gVG9yb250byBhIHF1aWVuZXMgbGVzIGd1c3RhIGVuc2XDsWFyIHRlY25vbG9nw61hLiBFbCBlbmZvcXVlIGRlIHVuYSBjb211bmlkYWQgdGFtYmnDqW4gcHVlZGUgY2FtYmlhciBjb24gZWwgdGllbXBvOiBwb3IgZWplbXBsbywgdW4gZ3J1cG8gZGUgYXBveW8gcGFyYSBwZXJzb25hcyBjb24gZGVwcmVzacOzbiAoY29tdW5pZGFkIGRlIGludGVyw6lzKSBwdWVkZSBkZWNpZGlyIHJlY2F1ZGFyIGZvbmRvcyBwYXJhIG1hbnRlbmVyIHVuYSBsw61uZWEgZGUgYXl1ZGEgKGNvbXVuaWRhZCBkZSBhY2Npw7NuKS4gRWplY3V0YXIgbGEgbMOtbmVhIGRlIGF5dWRhIHB1ZWRlIGNvbnZlcnRpcnNlIGVuIGVsIGZvY28gZGVsIGdydXBvIChjb211bmlkYWQgZGUgaW50ZXLDqXMpLgoKPioqU29wYSwgbHVlZ28gSGltbm9zKioKPgo+RXMgZGl2ZXJ0aWRvIGVzY3JpYmlyIGxvcyBtYW5pZmllc3RvcywgcGVybyBsYSBtYXlvcsOtYSBkZSBsYXMgcGVyc29uYXMgc2UgdW5lbiBhIHVuYSBjb211bmlkYWQgZGUgdm9sdW50YXJpb3MgcGFyYSBheXVkYXIgeSBzZXIgYXl1ZGFkb3MgZW4gbHVnYXIgZGUgZGlzY3V0aXIgc29icmUgbGEgcmVkYWNjacOzbiBkZSB1bmEgZGVjbGFyYWNpw7NuIGRlIHZpc2nDs24zMjcuIFBvciBsbyB0YW50bywgZGViZSBjZW50cmFyc2UgZW4gbG8gcXVlIGxhcyBwZXJzb25hcyBwdWVkZW4gY3JlYXIgcXVlIG90cm9zIG1pZW1icm9zIGRlIGxhIGNvbXVuaWRhZCB1dGlsaXphcsOhbiBkZSBpbm1lZGlhdG8uIFVuYSB2ZXogcXVlIHN1IG9yZ2FuaXphY2nDs24gZGVtdWVzdHJlIHF1ZSBwdWVkZSBsb2dyYXIgY29zYXMgcGVxdWXDsWFzLCBsYSBnZW50ZSBlc3RhcsOhIG3DoXMgc2VndXJhIGRlIHF1ZSB2YWxlIGxhIHBlbmEgYXl1ZGFybG8gY29uIHByb3llY3RvcyBtw6FzIGdyYW5kZXMuIEVzIGVsIG1vbWVudG8gZGUgcHJlb2N1cGFyc2UgcG9yIGRlZmluaXIgbG9zIHZhbG9yZXMgcXVlIGd1aWFyw6FuIGEgc3VzIG1pZW1icm9zLgoKIyMgQXByZW5kZSwgbHVlZ28gaGF6CgpFbCBwcmltZXIgcGFzbyBwYXJhIGNvbnN0cnVpciB1bmEgY29tdW5pZGFkIGVzIGRlY2lkaXIgc2kgZGViZXLDrWEgaGFjZXJsbywgbyBzaSBzZXLDrWEgbcOhcyBlZmVjdGl2byB1bmlyc2UgYSB1bmEgb3JnYW5pemFjacOzbiBleGlzdGVudGUuIE1pbGVzIGRlIGdydXBvcyB5YSBlc3TDoW4gZW5zZcOxYW5kbyBoYWJpbGlkYWRlcyB0ZWNub2zDs2dpY2FzIGEgbGFzIHBlcnNvbmFzLCBkZXNkZSBlbCA0LUggQ2x1YiB5IGxvcyBwcm9ncmFtYXMgZGUgYWxmYWJldGl6YWNpw7NuIGhhc3RhIG9yZ2FuaXphY2lvbmVzIHNpbiBmaW5lcyBkZSBsdWNybyBjb21vIEJsYWNrIEdpcmxzIENvZGUgeSBCcmlkZ2UuIFVuaXJzZSBhIHVuIGdydXBvIGV4aXN0ZW50ZSBsZSBkYXLDoSB1bmEgdmVudGFqYSBpbmljaWFsIGVuIGxhIGVuc2XDsWFuemEsIHVuIGdydXBvIGlubWVkaWF0byBkZSBjb2xlZ2FzIHkgbGEgb3BvcnR1bmlkYWQgZGUgYXByZW5kZXIgbcOhcyBzb2JyZSBjw7NtbyBtYW5lamFyIGxhcyBjb3NhczsgQ29uIHN1ZXJ0ZSwgYXByZW5kZXIgZXNhcyBoYWJpbGlkYWRlcyBtaWVudHJhcyBzZSBoYWNlIHVuYSBjb250cmlidWNpw7NuIGlubWVkaWF0YSBzZXLDoSBtw6FzIGltcG9ydGFudGUgcXVlIHBvZGVyIGRlY2lyIHF1ZSBlcmVzIGVsIGZ1bmRhZG9yIG8gbMOtZGVyIGRlIGFsZ28gbnVldm8uCgpZYSBzZWEgcXVlIHNlIHVuYSBhIHVuIGdydXBvIGV4aXN0ZW50ZSBvIGVzdGFibGV6Y2EgdW5vIHByb3Bpbywgc2Vyw6EgbcOhcyBlZmVjdGl2byBzaSBsZWUgdW4gcG9jbyBzb2JyZSBsYSBvcmdhbml6YWNpw7NuIGRlIGxhIGNvbXVuaWRhZC4gW0FsaW4xOTg5LCBMYWtlMjAxOF0gZXMgcHJvYmFibGVtZW50ZSBlbCB0cmFiYWpvIG3DoXMgY29ub2NpZG8gZW4gbGEgb3JnYW5pemFjacOzbiBkZSBiYXNlLCBtaWVudHJhcyBxdWUgW0Jyb3cyMDA3ICwgTWlkdzIwMTAsIExha2UyMDE4XSBzb24g4oCL4oCLbWFudWFsZXMgcHLDoWN0aWNvcyBhcnJhaWdhZG9zIGVuIGTDqWNhZGFzIGRlIHByw6FjdGljYS4gU2kgZGVzZWEgbGVlciBtw6FzIHByb2Z1bmRhbWVudGUsIFtBZGFtMTk3NV0gZXMgdW5hIGhpc3RvcmlhIGRlIGxhIEhpZ2hsYW5kZXIgRm9sayBTY2hvb2wsIGN1eW8gZW5mb3F1ZSBoYSBzaWRvIGVtdWxhZG8gcG9yIG11Y2hvcyBncnVwb3MgZXhpdG9zb3MsIG1pZW50cmFzIHF1ZSBbU3BhbDIwMTRdIGVzIHVuYSBndcOtYSBwYXJhIGVuc2XDsWFyIGEgYWR1bHRvcyBlc2NyaXRhIHBvciBhbGd1aWVuIGNvbiBwcm9mdW5kYXMgcmHDrWNlcyBwZXJzb25hbGVzIGVuIGxhIG9yZ2FuaXphY2nDs24geSBOb25wcm9maXRSZWFkeS5vcmcgb2ZyZWNlIGNhcGFjaXRhY2nDs24gZ3JhdHVpdGEgZGUgZGVzYXJyb2xsbyBwcm9mZXNpb25hbC4KCiMjIEN1YXRybyBwYXNvcwpUb2RvcyBsb3MgcXVlIHNlIGludm9sdWNyYW4gY29uIHN1IG9yZ2FuaXphY2nDs24gKGluY2x1aWRvIHVzdGVkKSBwYXNhbiBwb3IgY3VhdHJvIGZhc2VzOiByZWNsdXRhbWllbnRvLCBpbmNvcnBvcmFjacOzbiwgcmV0ZW5jacOzbiB5IGp1YmlsYWNpw7NuLiBObyBuZWNlc2l0YSBwcmVvY3VwYXJzZSBwb3IgZXN0ZSBjaWNsbyBjdWFuZG8gY29taWVuemEsIHBlcm8gdmFsZSBsYSBwZW5hIHBlbnNhcmxvIHRhbiBwcm9udG8gY29tbyBwYXJ0aWNpcGVuIG3DoXMgZGUgdW4gcHXDsWFkbyBkZSBubyBmdW5kYWRvcmVzLgoKRWwgcHJpbWVyIHBhc28gZXMgcmVjbHV0YXIgdm9sdW50YXJpb3MuIFN1IGNvbWVyY2lhbGl6YWNpw7NuIGRlYmVyw61hIGF5dWRhcmxvIGNvbiBlc3RvIGhhY2llbmRvIHF1ZSBzdSBvcmdhbml6YWNpw7NuIHNlYSBsb2NhbGl6YWJsZSB5IGRlamFuZG8gZW4gY2xhcm8gc3UgbWlzacOzbiB5IHZhbG9yIHBhcmEgbGFzIHBlcnNvbmFzIHF1ZSBxdWllcmFuIGludm9sdWNyYXJzZSAoQ2Fww610dWxvIDE0KS4gQ29tcGFydGEgaGlzdG9yaWFzIHF1ZSBlamVtcGxpZmlxdWVuIGVsIHRpcG8gZGUgYXl1ZGEgcXVlIGRlc2VhLCBhc8OtIGNvbW8gaGlzdG9yaWFzIHNvYnJlIGxhcyBwZXJzb25hcyBhIGxhcyBxdWUgZXN0w6EgYXl1ZGFuZG8sIHkgZGVqZSBlbiBjbGFybyBxdWUgaGF5IG11Y2hhcyBtYW5lcmFzIGRlIGludm9sdWNyYXJzZS4gKERpc2N1dGltb3MgZXN0byBjb24gbcOhcyBkZXRhbGxlIGVuIGxhIHNpZ3VpZW50ZSBzZWNjacOzbikuCgpTdSBtZWpvciBmdWVudGUgZGUgbnVldm9zIHJlY2x1dGFzIHNvbiBzdXMgcHJvcGlhcyBjbGFzZXM6ICJ2ZXIgdW5vLCBoYWNlciB1bm8sIGVuc2XDsWFyIHVubyIgaGEgZnVuY2lvbmFkbyBiaWVuIHBhcmEgbGFzIG9yZ2FuaXphY2lvbmVzIGRlIHZvbHVudGFyaW9zIGR1cmFudGUgZWwgdGllbXBvIHF1ZSBoYSBoYWJpZG8gb3JnYW5pemFjaW9uZXMgZGUgdm9sdW50YXJpb3MuIEFzZWfDunJlc2UgZGUgcXVlIGNhZGEgY2xhc2UgdSBvdHJvIGVuY3VlbnRybyB0ZXJtaW5lIGRpY2nDqW5kb2xlcyBhIGxhcyBwZXJzb25hcyBjw7NtbyBwdWVkZW4gYXl1ZGFyIHkgcXVlIHN1IGF5dWRhIHNlcsOhIGJpZW52ZW5pZGEuIExhcyBwZXJzb25hcyBxdWUgc2UgYWNlcnF1ZW4gYSB1c3RlZCBkZSBlc3RhIG1hbmVyYSBzYWJyw6FuIGxvIHF1ZSBoYWNlIHkgdGllbmVuIGV4cGVyaWVuY2lhIHJlY2llbnRlIGRlIGVzdGFyIGVuIGVsIGxhZG8gcmVjZXB0b3IgZGUgbG8gcXVlIG9mcmVjZSwgbG8gcXVlIGF5dWRhIGEgc3Ugb3JnYW5pemFjacOzbiBhIGV2aXRhciBlbCBwdW50byBjaWVnbyBleHBlcnRvIGNvbGVjdGl2byAoQ2Fww610dWxvIDMpLgoKPioqRW1waWV6YSBwZXF1ZcOxbyoqCj4KPkJlbiBGcmFua2xpbiBvYnNlcnbDsyBxdWUgdW5hIHBlcnNvbmEgcXVlIGhhIGhlY2hvIHVuIGZhdm9yIGEgYWxndWllbiB0aWVuZSBtw6FzIHByb2JhYmlsaWRhZGVzIGRlIGhhY2VybGUgb3RybyBmYXZvciBxdWUgYWxndWllbiBxdWUgcmVjaWJpw7MgdW4gZmF2b3IgZGUgZXNhIHBlcnNvbmEuIFBvciBsbyB0YW50bywgcGVkaXJsZSBhIGxhIGdlbnRlIHF1ZSBoYWdhIGFsZ28gcGVxdWXDsW8gcG9yIHRpIGVzIHVuIGJ1ZW4gcGFzbyBwYXJhIGxvZ3JhciBxdWUgaGFnYW4gYWxnbyBtw6FzIGdyYW5kZS4gVW5hIGZvcm1hIG5hdHVyYWwgZGUgaGFjZXIgZXN0byBjdWFuZG8gc2UgZW5zZcOxYSBlcyBwZWRpcmxlIGEgbGEgZ2VudGUgcXVlIGVudsOtZSBzb2x1Y2lvbmVzIHBhcmEgbG9zIG1hdGVyaWFsZXMgZGUgc3UgbGVjY2nDs24gcGFyYSBlcnJvcmVzIHRpcG9ncsOhZmljb3MgbyByZWRhY2Npw7NuIHBvY28gY2xhcmEsIG8gc3VnZXJpciBudWV2b3MgZWplcmNpY2lvcyBvIGVqZW1wbG9zLiBTaSBzdXMgbWF0ZXJpYWxlcyBlc3TDoW4gZXNjcml0b3MgZGUgbWFuZXJhIHNvc3RlbmlibGUgKFNlY2Npw7NuIDYuMyksIGVzdG8gbGVzIGRhIGxhIG9wb3J0dW5pZGFkIGRlIHByYWN0aWNhciBhbGd1bmFzIGhhYmlsaWRhZGVzIMO6dGlsZXMgeSBsZSBkYSBsYSBvcG9ydHVuaWRhZCBkZSBjb21lbnphciB1bmEgY29udmVyc2FjacOzbiBxdWUgcG9kcsOtYSBjb25kdWNpciBhIHVuIG51ZXZvIHJlY2x1dGEuCgpMYSBtaXRhZCBkZWwgY2ljbG8gZGUgdmlkYSBkZWwgdm9sdW50YXJpbyBlcyBsYSBpbmNvcnBvcmFjacOzbiB5IGxhIHJldGVuY2nDs24sIHF1ZSBjdWJyaXJlbW9zIGVuIGxhcyBTZWNjaW9uZXMgMTMuMyB5IDEzLjQuIEVsIHBhc28gZmluYWwgZXMgbGEganViaWxhY2nDs246IHRvZG9zIGV2ZW50dWFsbWVudGUgc2UgbXVldmVuIHkgbGFzIG9yZ2FuaXphY2lvbmVzIHNhbHVkYWJsZXMgcGxhbmVhbiBlc3RvLiBBbGd1bmFzIGNvc2FzIHNpbXBsZXMgcHVlZGVuIGhhY2VyIHF1ZSB0YW50byBsYSBwZXJzb25hIHF1ZSBzZSB2YSBjb21vIHRvZG9zIGxvcyBxdWUgc2UgcXVlZGFuIHNlIHNpZW50YW4gcG9zaXRpdm9zIHNvYnJlIGVsIGNhbWJpbzoKCioqUGlkYSBhIGxhcyBwZXJzb25hcyBxdWUgc2VhbiBleHBsw61jaXRhcyBzb2JyZSBzdSBwYXJ0aWRhLioqCnBhcmEgcXVlIHRvZG9zIHNlcGFuIHF1ZSByZWFsbWVudGUgc2UgaGFuIGlkby4KCioqQXNlZ8O6cmVzZSBkZSBxdWUgbm8gc2Ugc2llbnRhbiBhdmVyZ29uemFkb3MgbyBhdmVyZ29uemFkb3MgcG9yIGlyc2UqKgpvIHNvYnJlIGN1YWxxdWllciBvdHJhIGNvc2EuCgoqKkRhbGVzIGxhIG9wb3J0dW5pZGFkIGRlIHRyYW5zbWl0aXIgc3VzIGNvbm9jaW1pZW50b3MuKioKUG9yIGVqZW1wbG8sIHB1ZWRlIHBlZGlybGVzIHF1ZSBzZWFuIG1lbnRvcmVzIGRlIGFsZ3VpZW4gZHVyYW50ZSB1bmFzIHBvY2FzIHNlbWFuYXMgY29tbyBzdSDDumx0aW1hIGNvbnRyaWJ1Y2nDs24sIG8gcXVlIGFsZ3VpZW4gcXVlIHNlIHF1ZWRlIGVuIGxhIG9yZ2FuaXphY2nDs24gbG8gZW50cmV2aXN0ZSBwYXJhIHJlY29waWxhciBjdWFscXVpZXIgaGlzdG9yaWEgcXVlIHZhbGdhIGxhIHBlbmEgY29udGFyLgoKKipBc2Vnw7pyZXNlIGRlIHF1ZSBlbnRyZWd1ZW4gbGFzIGxsYXZlcy4qKgpFcyBpbmPDs21vZG8gZGVzY3VicmlyIHNlaXMgbWVzZXMgZGVzcHXDqXMgZGUgcXVlIGFsZ3VpZW4gc2UgaGEgaWRvIHF1ZSBlcyBsYSDDum5pY2EgcGVyc29uYSBxdWUgc2FiZSBjw7NtbyByZXNlcnZhciB1biBjYW1wbyBwYXJhIGVsIHBpY25pYyBhbnVhbC4KCioqSGFnYSB1biBzZWd1aW1pZW50byBkZSAyIGEgMyBtZXNlcyBkZXNwdcOpcyBkZSBxdWUgc2UgdmF5YW4qKgpwYXJhIHZlciBzaSB0aWVuZW4gbcOhcyBpZGVhcyBzb2JyZSBsbyBxdWUgZnVuY2lvbsOzIHkgbG8gcXVlIG5vIGZ1bmNpb27DsyBtaWVudHJhcyBlc3RhYmFuIGNvbiB1c3RlZCwgbyBhbGfDum4gY29uc2VqbyBwYXJhIG9mcmVjZXJsZXMgcXVlIG5vIHBlbnNhcm9uIGRhciBvIHNlIHNpbnRpZXJvbiBpbmPDs21vZG9zIGFsIHNhbGlyIHBvciBsYSBwdWVydGEuCgoqKkFncmFkZWNlbGVzLCoqCnRhbnRvIGN1YW5kbyBzZSB2YW4gY29tbyBsYSBwcsOzeGltYSB2ZXogcXVlIHN1IGdydXBvIHNlIHJlw7puYS4KCj4qKlVuIG1hbnVhbCBwZXJkaWRvKioKPgo+U2UgaGFuIGVzY3JpdG8gbWlsZXMgZGUgbGlicm9zIHNvYnJlIGPDs21vIGluaWNpYXIgdW5hIGVtcHJlc2EuIFNvbG8gdW5vcyBwb2NvcyBkZXNjcmliZW4gY8OzbW8gdGVybWluYXIgdW5vIG8gZGVqYXJsbyBjb24gZ3JhY2lhLCBhdW5xdWUgaGF5YSB1biBmaW5hbCBwYXJhIGNhZGEgY29taWVuem8uIFNpIGFsZ3VuYSB2ZXogZXNjcmliZXMgdW5vLCBhdsOtc2FtZS4KCgojIyBJbmR1Y2Npw7NuCkRlc3B1w6lzIGRlIGRlY2lkaXIgZm9ybWFyIHBhcnRlIGRlIHVuIGdydXBvLCBsYXMgcGVyc29uYXMgbmVjZXNpdGFuIHBvbmVyc2UgYWwgZMOtYSwgeSBbU2hvbDIwMTldIHJlc3VtZSBsbyBxdWUgc2FiZW1vcyBzb2JyZSBlc3RvLiBMYSBwcmltZXJhIHJlZ2xhIGVzIHRlbmVyIHkgaGFjZXIgY3VtcGxpciB1biBDw7NkaWdvIGRlIENvbmR1Y3RhIChTZWNjacOzbiA5LjEpLCB5IGVuY29udHJhciB1bmEgcGFydGUgaW5kZXBlbmRpZW50ZSBxdWUgZXN0w6kgZGlzcHVlc3RhIGEgcmVjaWJpciB5IHJldmlzYXIgaW5mb3JtZXMgZGUgY29tcG9ydGFtaWVudG8gaW5hcHJvcGlhZG8uIEFsZ3VpZW4gZnVlcmEgZGUgbGEgb3JnYW5pemFjacOzbiB0ZW5kcsOhIGxhIG9iamV0aXZpZGFkIHF1ZSBsb3MgbWllbWJyb3MgZGUgbGEgb3JnYW5pemFjacOzbiBwdWVkZW4gY2FyZWNlciwgeSBwdWVkZSBwcm90ZWdlciBhIGxvcyBwZXJpb2Rpc3RhcyBxdWUgcHVlZGFuIGR1ZGFyIGVuIHBsYW50ZWFyIHByb2JsZW1hcyByZWxhY2lvbmFkb3MgY29uIGxvcyBsw61kZXJlcyBkZWwgcHJveWVjdG8gcG9yIHRlbW9yIGEgcmVwcmVzYWxpYXMgbyBkYcOxb3MgYSBzdSByZXB1dGFjacOzbi4gTG9zIGzDrWRlcmVzIGRlbCBwcm95ZWN0byB0YW1iacOpbiBkZWJlbiBwdWJsaWNpdGFyIGxhcyBkZWNpc2lvbmVzIGRlIGFwbGljYWNpw7NuIHBhcmEgcXVlIGxhIGNvbXVuaWRhZCByZWNvbm96Y2EgcXVlIGVsIGPDs2RpZ28gZXMgc2lnbmlmaWNhdGl2by4KCkxvIHNpZ3VpZW50ZSBtw6FzIGltcG9ydGFudGUgZXMgc2VyIGFjb2dlZG9yLiBDb21vIGRpam8gRm9nZWwgW0ZvZ2UyMDA1XSwgInNpIHVuIHByb3llY3RvIG5vIGNhdXNhIHVuYSBidWVuYSBwcmltZXJhIGltcHJlc2nDs24sIGxvcyByZWNpw6luIGxsZWdhZG9zIHB1ZWRlbiBlc3BlcmFyIG11Y2hvIHRpZW1wbyBhbnRlcyBkZSBkYXJsZSB1bmEgc2VndW5kYSBvcG9ydHVuaWRhZCIuIE90cm9zIGF1dG9yZXMgaGFuIGNvbmZpcm1hZG8gZW1ww61yaWNhbWVudGUgbGEgaW1wb3J0YW5jaWEgZGUgZW50b3Jub3Mgc29jaWFsZXMgYW1hYmxlcyB5IGVkdWNhZG9zIGVuIHByb3llY3RvcyBhYmllcnRvcyBbU2luZzIwMTIsIFN0ZWkyMDEzLCBTdGVpMjAxOF06CgoqKlB1YmxpY2EgdW4gbWVuc2FqZSBkZSBiaWVudmVuaWRhKioKZW4gbGFzIHDDoWdpbmFzIGRlIHJlZGVzIHNvY2lhbGVzLCBjYW5hbGVzIGRlIFNsYWNrLCBmb3JvcyBvIGxpc3RhcyBkZSBjb3JyZW8gZWxlY3Ryw7NuaWNvIGRlbCBwcm95ZWN0by4gTG9zIHByb3llY3RvcyBwdWVkZW4gY29uc2lkZXJhciBtYW50ZW5lciB1biBjYW5hbCBvIGxpc3RhIGRlICJCaWVudmVuaWRhIiBkZWRpY2FkYSwgZG9uZGUgdW4gbMOtZGVyIGRlbCBwcm95ZWN0byBvIHVuIGdlcmVudGUgZGUgbGEgY29tdW5pZGFkIGVzY3JpYmUgdW5hIGJyZXZlIHB1YmxpY2FjacOzbiBwaWRpZW5kbyBhIGxvcyByZWNpw6luIGxsZWdhZG9zIHF1ZSBzZSBwcmVzZW50ZW4uCgoqKkF5dWRhciBhIGxhcyBwZXJzb25hcyBhIGVuY29udHJhciBmb3JtYXMgZGUgaGFjZXIgdW5hIGNvbnRyaWJ1Y2nDs24gaW5pY2lhbCwqKgpjb21vIGV0aXF1ZXRhciBsZWNjaW9uZXMgcGFydGljdWxhcmVzIG8gdGFsbGVyZXMgcXVlIG5lY2VzaXRhbiB0cmFiYWphciBjb21vICJhZGVjdWFkb3MgcGFyYSBsb3MgcmVjacOpbiBsbGVnYWRvcyIgeSBwZWRpciBhIGxvcyBtaWVtYnJvcyBlc3RhYmxlY2lkb3MgcXVlIG5vIGxvcyBhcnJlZ2xlbiBwYXJhIGFzZWd1cmFyc2UgZGUgcXVlIGhheWEgbHVnYXJlcyBhZGVjdWFkb3MgcGFyYSBxdWUgbG9zIHJlY2nDqW4gbGxlZ2Fkb3MgY29taWVuY2VuIGEgdHJhYmFqYXIuCgoqKkRpcmlqYSBhbCByZWNpw6luIGxsZWdhZG8gYSBtaWVtYnJvcyBkZWwgcHJveWVjdG8gY29tbyBlbGxvcyoqCnBhcmEgZGVtb3N0cmFyIHF1ZSBwZXJ0ZW5lY2VuLgoKKipEaXJpamEgYWwgcmVjacOpbiBsbGVnYWRvIGEgbG9zIHJlY3Vyc29zIGVzZW5jaWFsZXMgZGVsIHByb3llY3RvKioKdGFsZXMgY29tbyBsYXMgcGF1dGFzIGRlIGNvbnRyaWJ1Y2nDs24uCgoqKkRlc2lnbmFyIGEgdW5vIG8gZG9zIG1pZW1icm9zIHBhcmEgcXVlIHNpcnZhbiBjb21vIHB1bnRvIGRlIGNvbnRhY3RvLioqCnBhcmEgY2FkYSByZWNpw6luIGxsZWdhZG8gSGFjZXIgZXN0byBwdWVkZSBoYWNlciBxdWUgZWwgcmVjacOpbiBsbGVnYWRvIHNlYSBtZW5vcyByZWFjaW8gYSBoYWNlciBwcmVndW50YXMuClVuYSB0ZXJjZXJhIHJlZ2xhIHF1ZSBheXVkYSBhIHRvZG9zIChubyBzb2xvIGEgbG9zIHJlY2nDqW4gbGxlZ2Fkb3MpIGVzIGhhY2VyIHF1ZSBlbCBjb25vY2ltaWVudG8gc2UgcHVlZGEgZW5jb250cmFyIHkgbWFudGVuZXJsbyBhY3R1YWxpemFkby4gTG9zIHJlY2nDqW4gbGxlZ2Fkb3Mgc29uIGNvbW8gZXhwbG9yYWRvcmVzIHF1ZSBkZWJlbiBvcmllbnRhcnNlIGRlbnRybyBkZSB1biBwYWlzYWplIGRlc2Nvbm9jaWRvIFtEYWdlMjAxMF0uIExhIGluZm9ybWFjacOzbiBxdWUgc2UgZGlzdHJpYnV5ZSBnZW5lcmFsbWVudGUgaGFjZSBxdWUgbG9zIHJlY2nDqW4gbGxlZ2Fkb3Mgc2Ugc2llbnRhbiBwZXJkaWRvcyB5IGRlc29yaWVudGFkb3MuIERhZGFzIGxhcyBkaWZlcmVudGVzIHBvc2liaWxpZGFkZXMgZGUgbG9zIGx1Z2FyZXMgcGFyYSBtYW50ZW5lciBpbmZvcm1hY2nDs24gKHBvciBlamVtcGxvLCB3aWtpcywgYXJjaGl2b3MgZW4gY29udHJvbCBkZSB2ZXJzaW9uZXMsIGRvY3VtZW50b3MgY29tcGFydGlkb3MsIHR3ZWV0cyBhbnRpZ3VvcyBvIG1lbnNhamVzIGRlIFNsYWNrIHkgYXJjaGl2b3MgZGUgY29ycmVvIGVsZWN0csOzbmljbykgZXMgaW1wb3J0YW50ZSBtYW50ZW5lciBsYSBpbmZvcm1hY2nDs24gc29icmUgdW4gdGVtYSBlc3BlY8OtZmljbyBjb25zb2xpZGFkbyBlbiB1biBzb2xvIGx1Z2FyIHBhcmEgcXVlIGxvcyByZWNpw6luIGxsZWdhZG9zIE5vIGVzIG5lY2VzYXJpbyBuYXZlZ2FyIHBvciBtw7psdGlwbGVzIGZ1ZW50ZXMgZGUgZGF0b3MgcGFyYSBlbmNvbnRyYXIgbG8gcXVlIG5lY2VzaXRhbi4gT3JnYW5pemFyIGxhIGluZm9ybWFjacOzbiBoYWNlIHF1ZSBsb3MgcmVjacOpbiBsbGVnYWRvcyB0ZW5nYW4gbcOhcyBjb25maWFuemEgeSBvcmllbnRhY2nDs24gW1N0ZWkyMDE2XS4KCkZpbmFsbWVudGUsIHJlY29ub3pjYSBsYXMgcHJpbWVyYXMgY29udHJpYnVjaW9uZXMgZGUgbG9zIHJlY2nDqW4gbGxlZ2Fkb3MgeSBkZXNjdWJyYSBkw7NuZGUgeSBjw7NtbyBwb2Ryw61hbiBheXVkYXIgYSBsYXJnbyBwbGF6by4gVW5hIHZleiBxdWUgaGF5YW4gbGxldmFkbyBzdSBwcmltZXJhIGNvbnRyaWJ1Y2nDs24gYSB0cmF2w6lzIGRlIGxhIGzDrW5lYSwgZXMgcHJvYmFibGUgcXVlIHVzdGVkIHkgZWxsb3MgdGVuZ2FuIHVuYSBtZWpvciBpZGVhIGRlIGxvIHF1ZSB0aWVuZW4gcGFyYSBvZnJlY2VyIHkgZGUgY8OzbW8gZWwgcHJveWVjdG8gcHVlZGUgYXl1ZGFybG9zLiBBeXVkZSBhIGxvcyByZWNpw6luIGxsZWdhZG9zIGEgZW5jb250cmFyIGVsIHNpZ3VpZW50ZSBwcm9ibGVtYSBlbiBlbCBxdWUgcG9kcsOtYW4gcXVlcmVyIHRyYWJhamFyIG8gc2XDsWFsYXJsZXMgbG8gc2lndWllbnRlIHF1ZSBwb2Ryw61hbiBkaXNmcnV0YXIgbGV5ZW5kby4gRW4gcGFydGljdWxhciwgYWxlbnRhcmxvcyBhIGF5dWRhciBhIGxhIHByw7N4aW1hIG9sYSBkZSByZWNpw6luIGxsZWdhZG9zIGVzIHVuYSBidWVuYSBmb3JtYSBkZSByZWNvbm9jZXIgbG8gcXVlIGhhbiBhcHJlbmRpZG8geSB1bmEgZm9ybWEgZWZlY3RpdmEgZGUgdHJhbnNtaXRpcmxvLgoKCiMjIFJldGVuY2lvbgoKPiBTaSB0dSBnZW50ZSBubyBzZSBkaXZpZXJ0ZSwgaGF5IGFsZ28gbXV5IG1hbC4KPiAgLS0gU2F1bCBBbGluc2t5CgpMb3MgbWllbWJyb3MgZGUgbGEgY29tdW5pZGFkIG5vIGRlYmVyw61hbiBlc3BlcmFyIGRpc2ZydXRhciBjYWRhIG1vbWVudG8gZGUgc3UgdHJhYmFqbyBjb24gc3Ugb3JnYW5pemFjacOzbiwgcGVybyBzaSBubyBkaXNmcnV0YW4gZGUgbmFkYSBkZSBlc28sIG5vIHNlIHF1ZWRhcsOhbi4gRWwgZGlzZnJ1dGUgbm8gc2lnbmlmaWNhIG5lY2VzYXJpYW1lbnRlIHRlbmVyIHVuYSBmaWVzdGEgYW51YWw6IGxhcyBwZXJzb25hcyBwdWVkZW4gZGlzZnJ1dGFyIGRlIGNvY2luYXIsIGVudHJlbmFyIG8gc2ltcGxlbWVudGUgdHJhYmFqYXIgZW4gc2lsZW5jaW8ganVudG8gYSBsb3MgZGVtw6FzLiBIYXkgdmFyaWFzIGNvc2FzIHF1ZSB0b2RhIG9yZ2FuaXphY2nDs24gZGViZSBoYWNlciBwYXJhIGdhcmFudGl6YXIgcXVlIGxhcyBwZXJzb25hcyBvYnRlbmdhbiBhbGdvIHF1ZSB2YWxvcmVuIGRlIHN1IHRyYWJham86CgoqKlByZWd1bnRlIGEgbGFzIHBlcnNvbmFzIHF1w6kgcXVpZXJlbiBlbiBsdWdhciBkZSBhZGl2aW5hci4qKgpBbCBpZ3VhbCBxdWUgbm8gZXJlcyB0dSBhbHVtbm8gKFNlY2Npw7NuIDYuMSksIHByb2JhYmxlbWVudGUgc2VhcyBkaWZlcmVudGUgZGUgb3Ryb3MgbWllbWJyb3MgZGUgdHUgb3JnYW5pemFjacOzbi4gUHJlZ8O6bnRlbGVzIGEgbGFzIHBlcnNvbmFzIHF1w6kgcXVpZXJlbiBoYWNlciwgcXXDqSBzZSBzaWVudGVuIGPDs21vZG9zIGhhY2llbmRvIChsbyBxdWUgcHVlZGUgbm8gc2VyIGxvIG1pc21vKSB5IHF1w6kgbGltaXRhY2lvbmVzIGhheSBlbiBzdSB0aWVtcG8uIFBvZHLDrWFuIGRlY2lyOiAiQ3VhbHF1aWVyIGNvc2EiLCBwZXJvIGluY2x1c28gdW5hIGNvbnZlcnNhY2nDs24gY29ydGEgcHJvYmFibGVtZW50ZSBkZXNjdWJyaXLDoSBlbCBoZWNobyBkZSBxdWUgbGVzIGd1c3RhIGludGVyYWN0dWFyIGNvbiBsYXMgcGVyc29uYXMsIHBlcm8gcHJlZmVyaXLDrWFuIG5vIGFkbWluaXN0cmFyIGxhcyBmaW5hbnphcyBkZWwgZ3J1cG8gbyB2aWNldmVyc2EuCgoqKlByb3BvcmNpb25lIG11Y2hhcyBmb3JtYXMgZGUgY29udHJpYnVpci4qKgpDdWFudGFzIG3DoXMgZm9ybWFzIGhheWEgcGFyYSBxdWUgbGFzIHBlcnNvbmFzIGF5dWRlbiwgbcOhcyBwZXJzb25hcyBwb2Ryw6FuIGhhY2VybG8uIEFsZ3VpZW4gYSBxdWllbiBubyBsZSBndXN0ZSBlc3RhciBmcmVudGUgYSB1bmEgYXVkaWVuY2lhIHB1ZWRlIG1hbnRlbmVyIGVsIHNpdGlvIHdlYiBkZSBzdSBvcmdhbml6YWNpw7NuLCBtYW5lamFyIHN1cyBjdWVudGFzIG8gY29ycmVnaXIgbGFzIGxlY2Npb25lcy4KCioqUmVjb25vY2VyIGNvbnRyaWJ1Y2lvbmVzLioqCkEgdG9kb3MgbGVzIGd1c3RhIHF1ZSBsb3MgYXByZWNpZW4sIHBvciBsbyBxdWUgbGFzIGNvbXVuaWRhZGVzIGRlYmVuIHJlY29ub2NlciBsYXMgY29udHJpYnVjaW9uZXMgZGUgc3VzIG1pZW1icm9zIHRhbnRvIGVuIHDDumJsaWNvIGNvbW8gZW4gcHJpdmFkbyBhbCBtZW5jaW9uYXJsYXMgZW4gcHJlc2VudGFjaW9uZXMsIHBvbmVybGFzIGVuIGVsIHNpdGlvIHdlYiwgZXRjLiBDYWRhIGhvcmEgcXVlIGFsZ3VpZW4gbGUgaGF5YSBkYWRvIGEgc3UgcHJveWVjdG8gcHVlZGUgc2VyIHVuYSBob3JhIHF1aXRhZGEgZGUgc3UgdmlkYSBwZXJzb25hbCBvIGRlIHN1IGVtcGxlbyBvZmljaWFsOyByZWNvbm96Y2EgZXNlIGhlY2hvIHkgZGVqZSBlbiBjbGFybyBxdWUsIHNpIGJpZW4gbcOhcyBob3JhcyBzZXLDrWFuIGJpZW52ZW5pZGFzLCBubyBlc3BlcmEgcXVlIGhhZ2FuIHNhY3JpZmljaW9zIGluc29zdGVuaWJsZXMuCgoqKkhheiBlc3BhY2lvLioqCkNyZWUgcXVlIGVzdMOhIHNpZW5kbyDDunRpbCwgcGVybyBpbnRlcnZlbmlyIGVuIGNhZGEgZGVjaXNpw7NuIHByaXZhIGEgbGFzIHBlcnNvbmFzIGRlIHN1IGF1dG9ub23DrWEsIGxvIHF1ZSBhIGNhbWJpbyByZWR1Y2Ugc3UgbW90aXZhY2nDs24gKFNlY2Npw7NuIDEwKS4gRW4gcGFydGljdWxhciwgc2kgc2llbXByZSBlcmVzIGVsIHByaW1lcm8gZW4gcmVzcG9uZGVyIGEgbWVuc2FqZXMgZGUgY29ycmVvIGVsZWN0csOzbmljbyBvIGNoYXQsIGxhcyBwZXJzb25hcyB0aWVuZW4gbWVub3Mgb3BvcnR1bmlkYWRlcyBkZSBjcmVjZXIgY29tbyBtaWVtYnJvcyB5IGNyZWFyIGNvbGFib3JhY2lvbmVzIGhvcml6b250YWxlcy4gQ29tbyByZXN1bHRhZG8sIGxhIGNvbXVuaWRhZCBjb250aW51YXLDoSBjZW50cmFkYSBlbiB1bmEgbyBkb3MgcGVyc29uYXMgZW4gbHVnYXIgZGUgY29udmVydGlyc2UgZW4gdW5hIHJlZCBhbHRhbWVudGUgY29uZWN0YWRhIGVuIGxhIHF1ZSBvdHJvcyBzZSBzaWVudGFuIGPDs21vZG9zIHBhcnRpY2lwYW5kby4KT3RyYSBmb3JtYSBkZSByZWNvbXBlbnNhciBsYSBwYXJ0aWNpcGFjacOzbiBlcyBvZnJlY2VyIGNhcGFjaXRhY2nDs24uIExhcyBvcmdhbml6YWNpb25lcyBuZWNlc2l0YW4gcHJlc3VwdWVzdG9zLCBwcm9wdWVzdGFzIGRlIHN1YnZlbmNpb25lcyB5IHJlc29sdWNpw7NuIGRlIGRpc3B1dGFzLiBBIGxhIG1heW9yw61hIGRlIGxhcyBwZXJzb25hcyBudW5jYSBzZSBsZXMgZW5zZcOxYSBjw7NtbyBoYWNlciBlc3RvIG3DoXMgZGUgbG8gcXVlIHNlIGxlcyBlbnNlw7FhIGEgZW5zZcOxYXIsIHBvciBsbyBxdWUgbGEgb3BvcnR1bmlkYWQgZGUgYWRxdWlyaXIgaGFiaWxpZGFkZXMgdHJhbnNmZXJpYmxlcyBlcyB1bmEgcmF6w7NuIHBvZGVyb3NhIHBhcmEgcXVlIGxhcyBwZXJzb25hcyBzZSBpbnZvbHVjcmVuIHkgc2UgbWFudGVuZ2FuIGludm9sdWNyYWRhcy4gU2kgdmEgYSBoYWNlciBlc3RvLCBubyBpbnRlbnRlIHByb3BvcmNpb25hciBsYSBjYXBhY2l0YWNpw7NuIHVzdGVkIG1pc21vIGEgbWVub3MgcXVlIHNlYSBlbiBsbyBxdWUgc2UgZXNwZWNpYWxpY2UuIE11Y2hvcyBncnVwb3MgY8Otdmljb3MgeSBjb211bml0YXJpb3MgdGllbmVuIHByb2dyYW1hcyBkZSBlc3RlIHRpcG8sIHkgcHJvYmFibGVtZW50ZSBwdWVkYSBsbGVnYXIgYSB1biBhY3VlcmRvIGNvbiB1bm8gZGUgZWxsb3MuCgpGaW5hbG1lbnRlLCBhdW5xdWUgbG9zIHZvbHVudGFyaW9zIHB1ZWRlbiBoYWNlciBtdWNobywgdGFyZWFzIGNvbW8gbGEgYWRtaW5pc3RyYWNpw7NuIGRlbCBzaXN0ZW1hIHkgbGEgY29udGFiaWxpZGFkIGV2ZW50dWFsbWVudGUgbmVjZXNpdGFuIHBlcnNvbmFsIHJlbXVuZXJhZG8uIEN1YW5kbyBsbGVndWUgYSBlc3RlIHB1bnRvLCBubyBwYWd1ZSBuYWRhIGEgbGFzIHBlcnNvbmFzIG8gbGVzIHBhZ3VlIHVuIHNhbGFyaW8gYWRlY3VhZG8uIFNpIG5vIGxlcyBwYWdhIG5hZGEsIHN1IHZlcmRhZGVyYSByZWNvbXBlbnNhIGVzIGxhIHNhdGlzZmFjY2nDs24gZGUgaGFjZXIgZWwgYmllbjsgc2kgbGVzIHBhZ2EgdW5hIGNhbnRpZGFkIHNpbWLDs2xpY2EsIHBvciBvdHJvIGxhZG8sIHNlIGxvcyBxdWl0YSBzaW4gZGFybGVzIGxhIHNhdGlzZmFjY2nDs24gZGUgZ2FuYXJzZSBsYSB2aWRhLgoKCiMjIEdvYmVybmFuY2lhCkNhZGEgb3JnYW5pemFjacOzbiB0aWVuZSB1bmEgZXN0cnVjdHVyYSBkZSBwb2RlcjogbGEgw7puaWNhIHByZWd1bnRhIGVzIHNpIGVzIGZvcm1hbCB5IHJlc3BvbnNhYmxlIG8gaW5mb3JtYWwgeSwgcG9yIGxvIHRhbnRvLCBubyByaW5kZSBjdWVudGFzIFtGcmVlMTk3Ml0uIEVzdGUgw7psdGltbyBlbiByZWFsaWRhZCBmdW5jaW9uYSBiYXN0YW50ZSBiaWVuIHBhcmEgZ3J1cG9zIGRlIGhhc3RhIG1lZGlhIGRvY2VuYSBkZSBwZXJzb25hcyBlbiBsYXMgcXVlIHRvZG9zIHNlIGNvbm9jZW4uIE3DoXMgYWxsw6EgZGUgZXNvLCBuZWNlc2l0YSByZWdsYXMgcGFyYSBleHBsaWNhciBxdWnDqW4gdGllbmUgbGEgYXV0b3JpZGFkIHBhcmEgdG9tYXIgcXXDqSBkZWNpc2lvbmVzIHkgY8OzbW8gbG9ncmFyIGVsIGNvbnNlbnNvIChTZWNjacOzbiAyMC4xKS4KCkVsIG1vZGVsbyBkZSBnb2Jlcm5hbnphIHF1ZSBwcmVmaWVybyBlcyB1biBiaWVuIGNvbcO6biwgcXVlIGVzIGFsZ28gYWRtaW5pc3RyYWRvIGNvbmp1bnRhbWVudGUgcG9yIHVuYSBjb211bmlkYWQgZGUgYWN1ZXJkbyBjb24gbGFzIHJlZ2xhcyBxdWUgZWxsb3MgbWlzbW9zIGhhbiBkZXNhcnJvbGxhZG8geSBhZG9wdGFkbyBbT3N0cjIwMTVdLiBDb21vIHN1YnJheWEgW0JvbGwyMDE0XSwgbGFzIHRyZXMgcGFydGVzIGRlIGVzYSBkZWZpbmljacOzbiBzb24gZXNlbmNpYWxlczogdW4gYmllbiBjb23Dum4gbm8gZXMgc29sbyB1biBwYXN0byBjb21wYXJ0aWRvIG8gdW4gY29uanVudG8gZGUgYmlibGlvdGVjYXMgZGUgc29mdHdhcmUsIHNpbm8gcXVlIHRhbWJpw6luIGluY2x1eWUgYSBsYSBjb211bmlkYWQgcXVlIGxvIGNvbXBhcnRlIHkgbGFzIHJlZ2xhcyBxdWUgdXNhbiBwYXJhIGhhY2VybG8uCgpMYXMgY29ycG9yYWNpb25lcyBjb24gZmluZXMgZGUgbHVjcm8geSBsYXMgb3JnYW5pemFjaW9uZXMgc2luIGZpbmVzIGRlIGx1Y3JvIGluY29ycG9yYWRhcyBzb24gbW9kZWxvcyBtw6FzIHBvcHVsYXJlczsgbGEgbWVjw6FuaWNhIHZhcsOtYSBkZSB1bmEganVyaXNkaWNjacOzbiBhIG90cmEsIHBvciBsbyBxdWUgZGViZSBidXNjYXIgYXNlc29yYW1pZW50byBhbnRlcyBkZSBlbGVnaXIgMzQwLiBBbWJvcyB0aXBvcyBkZSBvcmdhbml6YWNpw7NuIG90b3JnYW4gbGEgbcOheGltYSBhdXRvcmlkYWQgZW4gc3UganVudGEuIEVuIHTDqXJtaW5vcyBnZW5lcmFsZXMsIHNlIHRyYXRhIGRlIHVuYSBqdW50YSBkZSBzZXJ2aWNpbyBjdXlvcyBtaWVtYnJvcyB0YW1iacOpbiBhc3VtZW4gb3RyYXMgZnVuY2lvbmVzIGVuIGxhIG9yZ2FuaXphY2nDs24gbyB1bmEganVudGEgZGUgZ29iaWVybm8gY3V5YSByZXNwb25zYWJpbGlkYWQgcHJpbmNpcGFsIGVzIGNvbnRyYXRhciwgc3VwZXJ2aXNhciB5LCBzaSBlcyBuZWNlc2FyaW8sIGRlc3BlZGlyIGFsIGRpcmVjdG9yLiBMb3MgbWllbWJyb3MgZGUgbGEganVudGEgcHVlZGVuIHNlciBlbGVnaWRvcyBwb3IgbGEgY29tdW5pZGFkIG8gbm9tYnJhZG9zOyBFbiBjdWFscXVpZXIgY2FzbywgZXMgaW1wb3J0YW50ZSBwcmlvcml6YXIgbGEgY29tcGV0ZW5jaWEgc29icmUgbGEgcGFzacOzbiAoZXN0YSDDumx0aW1hIGVzIG3DoXMgaW1wb3J0YW50ZSBwYXJhIGVsIHJhbmdvIHkgZWwgYXJjaGl2bykgeSB0cmF0YXIgZGUgcmVjbHV0YXIgcGFyYSBoYWJpbGlkYWRlcyBwYXJ0aWN1bGFyZXMgY29tbyBsYSBjb250YWJpbGlkYWQsIGVsIG1hcmtldGluZywgZXRjLgoKPioqRWxpZ2UgZGVtb2NyYWNpYSoqCj4KPkN1YW5kbyBsbGVndWUgZWwgbW9tZW50bywgaGFnYSBkZSBzdSBvcmdhbml6YWNpw7NuIHVuYSBkZW1vY3JhY2lhOiB0YXJkZSBvIHRlbXByYW5vIChnZW5lcmFsbWVudGUgYW50ZXMpLCBjYWRhIGp1bnRhIGRlc2lnbmFkYSBzZSBjb252aWVydGUgZW4gdW5hIHNvY2llZGFkIGRlIG11dHVvIGFjdWVyZG8uIE90b3JnYXIgcG9kZXIgYSBzdXMgbWllbWJyb3MgZXMgY29tcGxpY2FkbywgcGVybyBlcyBsYSDDum5pY2EgZm9ybWEgaW52ZW50YWRhIGhhc3RhIGFob3JhIHBhcmEgZ2FyYW50aXphciBxdWUgbGFzIG9yZ2FuaXphY2lvbmVzIGNvbnRpbsO6ZW4gc2F0aXNmYWNpZW5kbyBsYXMgbmVjZXNpZGFkZXMgcmVhbGVzIGRlIGxhcyBwZXJzb25hcy4KCgojIyBDdcOtZGF0ZQpFbCBhZ290YW1pZW50byBlcyB1biByaWVzZ28gY3LDs25pY28gZW4gY3VhbHF1aWVyIGFjdGl2aWRhZCBjb211bml0YXJpYSBbUGlnbjIwMTZdLCBhc8OtIHF1ZSBhcHJlbmRhIGEgZGVjaXIgbm8gbcOhcyBzZWd1aWRvIGRlIGxvIHF1ZSBkaWNlIHPDrS4gU2kgbm8gdGUgY3VpZGFzLCBubyBwb2Ryw6FzIGN1aWRhciBhIHR1IGNvbXVuaWRhZC4KCj4qKlF1ZWRhbmRvIHNpbiAiTm8iKioKPgo+TGEgaW52ZXN0aWdhY2nDs24gZW4gbGEgZMOpY2FkYSBkZSAxOTkwIHBhcmVjw61hIG1vc3RyYXIgcXVlIG51ZXN0cmEgY2FwYWNpZGFkIGRlIGVqZXJjZXIgZnVlcnphIGRlIHZvbHVudGFkIGVzIGZpbml0YTogc2kgdGVuZW1vcyBxdWUgcmVzaXN0aXJub3MgYSBjb21lciBsYSDDumx0aW1hIGRvbmEgZW4gbGEgY2FqYSBjdWFuZG8gdGVuZW1vcyBoYW1icmUsIGVzIG1lbm9zIHByb2JhYmxlIHF1ZSBkb2JsZW1vcyBsYSByb3BhIHkgdmljZXZlcnNhLiBFc3RlIGZlbsOzbWVubyBzZSBsbGFtYSBhZ290YW1pZW50byBkZWwgZWdvLCB5IHNpIGJpZW4gbG9zIGVzdHVkaW9zIHJlY2llbnRlcyBubyBoYW4gcG9kaWRvIHJlcGxpY2FyIGVzb3MgcHJpbWVyb3MgcmVzdWx0YWRvcyBbSGFnZzIwMTZdLCBkZWNpciAic8OtIiBjdWFuZG8gZXN0YW1vcyBkZW1hc2lhZG8gY2Fuc2Fkb3MgICBwYXJhIGRlY2lyICJubyIgZXMgdW5hIHRyYW1wYSBlbiBsYSBxdWUgY2FlbiBtdWNob3Mgb3JnYW5pemFkb3Jlcy4KClVuYSBmb3JtYSBkZSBoYWNlciBxdWUgc3UgIm5vIiBzZSBxdWVkZSBlcyBlc2NyaWJpciB1bmEgbGlzdGEgZGUgY29zYXMgcXVlIG5vIHZhbGUgbGEgcGVuYSBoYWNlciBwZXJvIHF1ZSBubyB2YSBhIGhhY2VyLiBBbCBtb21lbnRvIGRlIGVzY3JpYmlyLCBlbCBtw61vIGluY2x1eWUgY3VhdHJvIGxpYnJvcywgZG9zIHByb3llY3RvcyBkZSBzb2Z0d2FyZSwgZWwgcmVkaXNlw7FvIGRlIG1pIHNpdGlvIHdlYiBwZXJzb25hbCB5IGFwcmVuZGVyIGEgdG9jYXIgZWwgc2lsYmF0by4KCkZpbmFsbWVudGUsIHJlY3XDqXJkZXNlIGRlIHZleiBlbiBjdWFuZG8gcXVlIGNhZGEgb3JnYW5pemFjacOzbiBldmVudHVhbG1lbnRlIG5lY2VzaXRhIG51ZXZhcyBpZGVhcyB5IGxpZGVyYXpnby4gQ3VhbmRvIGxsZWd1ZSBlc2UgbW9tZW50bywgZW50cmVuZSBhIHN1cyBzdWNlc29yZXMgeSBhdmFuY2UgY29uIGxhIG1heW9yIGdyYWNpYSBwb3NpYmxlLiBTaW4gZHVkYSwgaGFyw6FuIGNvc2FzIHF1ZSBubyBoYXLDrWFzLCBwZXJvIHBvY2FzIGNvc2FzIGVuIGxhIHZpZGEgc29uIHRhbiBzYXRpc2ZhY3RvcmlhcyBjb21vIHZlciBhbGdvIHF1ZSBheXVkYXN0ZSBhIGNvbnN0cnVpciBjb2JyYXIgdmlkYSBwcm9waWEuIENlbGVicmUgZXNvOiBubyB0ZW5kcsOhIG5pbmfDum4gcHJvYmxlbWEgcGFyYSBlbmNvbnRyYXIgb3RyYSBjb3NhIHF1ZSBsbyBtYW50ZW5nYSBvY3VwYWRvLgoKCiMjIEVqZXJjaWNpb3MKVmFyaW9zIGRlIGVzdG9zIGVqZXJjaWNpb3MgZXN0w6FuIHRvbWFkb3MgZGUgW0Jyb3cyMDA3XS4KCiMjIyDCv1F1w6kgdGlwbyBkZSBjb211bmlkYWQ/IChpbmRpdmlkdWFsIC8gMTUpClZ1ZWx2YSBhIGxlZXIgbGEgZGVzY3JpcGNpw7NuIGRlIGxvcyBjdWF0cm8gdGlwb3MgZGUgY29tdW5pZGFkZXMgeSBkZWNpZGEgY3XDoWwgZXMgc3UgZ3J1cG8gbyBhc3BpcmEgYSBzZXIuCgojIyMgUGVyc29uYXMgcXVlIHB1ZWRlIGNvbm9jZXIgKGdydXBvcyBwZXF1ZcOxb3MgLyAzMCkKQ29tbyBvcmdhbml6YWRvciwgcGFydGUgZGUgc3UgdHJhYmFqbyBlcyBhIHZlY2VzIGF5dWRhciBhIGxhcyBwZXJzb25hcyBhIGVuY29udHJhciB1bmEgbWFuZXJhIGRlIGNvbnRyaWJ1aXIgYSBwZXNhciBkZSBzw60gbWlzbW9zLiBFbiBwZXF1ZcOxb3MgZ3J1cG9zLCBlbGlqYSB0cmVzIGRlIGxhcyBwZXJzb25hcyBhIGNvbnRpbnVhY2nDs24geSBhbmFsaWNlIGPDs21vIHBvZHLDrWEgYXl1ZGFybGFzIGEgY29udmVydGlyc2UgZW4gdW4gbWVqb3IgY29udHJpYnV5ZW50ZSBwYXJhIHN1IG9yZ2FuaXphY2nDs24uCgoqKkFubmEqKgpzYWJlIG3DoXMgc29icmUgY2FkYSB0ZW1hIHF1ZSB0b2RvcyBsb3MgZGVtw6FzIGp1bnRvcywgYWwgbWVub3MsIGVsbGEgY3JlZSBxdWUgc8OtLiBObyBpbXBvcnRhIGxvIHF1ZSBkaWdhcywgZWxsYSB0ZSBjb3JyZWdpcsOhOyBubyBpbXBvcnRhIGxvIHF1ZSBzZXBhcywgZWxsYSBsbyBzYWJlIG1lam9yLgoKKipDYXRoZXJpbmUqKgp0aWVuZSB0YW4gcG9jYSBjb25maWFuemEgZW4gc3UgcHJvcGlhIGhhYmlsaWRhZCBxdWUgbm8gdG9tYXLDoSBuaW5ndW5hIGRlY2lzacOzbiwgcG9yIHBlcXVlw7FhIHF1ZSBzZWEsIGhhc3RhIHF1ZSBsbyBoYXlhIGNvbnN1bHRhZG8gY29uIG90cmEgcGVyc29uYS4KCioqRnJhbmNvKioKZGlzZnJ1dGEgc2FiZXIgY29zYXMgcXVlIG90cmFzIHBlcnNvbmFzIG5vIHNhYmVuLiBQdWVkZSBoYWNlciBtaWxhZ3JvcywgcGVybyBjdWFuZG8gc2UgbGUgcHJlZ3VudGEgY8OzbW8gbG8gaGl6bywgc29ucmVpcsOhIHkgZGlyw6E6ICJPaCwgZXN0b3kgc2VndXJvIGRlIHF1ZSBwdWVkZXMgcmVzb2x2ZXJsbyIuCgoqKkhlZGl5ZWgqKgplcyB0cmFucXVpbG8uIEVsbGEgbnVuY2EgaGFibGEgZW4gbGFzIHJldW5pb25lcywgaW5jbHVzbyBjdWFuZG8gc2FiZSBxdWUgb3RyYXMgcGVyc29uYXMgZXN0w6FuIGVxdWl2b2NhZGFzLiBFbGxhIHBvZHLDrWEgY29udHJpYnVpciBhIGxhIGxpc3RhIGRlIGNvcnJlbywgcGVybyBlcyBtdXkgc2Vuc2libGUgYSBsYXMgY3LDrXRpY2FzIHkgc2llbXByZSByZXRyb2NlZGUgZW4gbHVnYXIgZGUgZGVmZW5kZXIgc3UgcHVudG8uCgoqKktlbioqCmFwcm92ZWNoYSBlbCBoZWNobyBkZSBxdWUgbGEgbWF5b3LDrWEgZGUgbGFzIHBlcnNvbmFzIHByZWZpZXJlbiBhc3VtaXIgc3UgcGFydGUgZGVsIHRyYWJham8gcXVlIHF1ZWphcnNlIGRlIMOpbC4gTG8gZnJ1c3RyYW50ZSBlcyBxdWUgZXMgdGFuIHBsYXVzaWJsZSBjdWFuZG8gYWxndWllbiBmaW5hbG1lbnRlIGxvIGNvbmZyb250YS4gIkhhIGhhYmlkbyBlcnJvcmVzIHBvciB0b2RvcyBsYWRvcyIsIGRpY2UsIG8gIkJ1ZW5vLCBjcmVvIHF1ZSBlc3TDoXMgbWV0aWVuZG8gbGEgcGF0YSIuCgoqKlRvcm9uamlsKioKdGllbmUgYnVlbmFzIGludGVuY2lvbmVzLCBwZXJvIGRlIGFsZ3VuYSBtYW5lcmEgc2llbXByZSBzdXJnZSBhbGdvLCB5IHN1cyB0YXJlYXMgbnVuY2EgdGVybWluYW4gaGFzdGEgZWwgw7psdGltbyBtb21lbnRvIHBvc2libGUuIFBvciBzdXB1ZXN0bywgZXNvIHNpZ25pZmljYSBxdWUgdG9kb3MgbG9zIHF1ZSBkZXBlbmRlbiBkZSBlbGxhIG5vIHB1ZWRlbiBoYWNlciBzdSB0cmFiYWpvIGhhc3RhIGRlc3B1w6lzIGRlbCDDumx0aW1vIG1vbWVudG8gcG9zaWJsZSAuLi4KCioqUmFqKioKZXMgcnVkby4gIkFzw60gZXMgY29tbyBoYWJsbyIsIGRpY2UuICJTaSBubyBwdWVkZXMgaGFja2VhcmxvLCB2ZSBhIGJ1c2NhciBvdHJvIGVxdWlwbyIuIFN1IGZyYXNlIGZhdm9yaXRhIGVzLCAiRXNvIGVzIGVzdMO6cGlkbyIsIHkgdXNhIHVuYSBvYnNjZW5pZGFkIGVuIGNhZGEgc2VndW5kYSBvcmFjacOzbi4KCiMjIyBWYWxvcmVzIChncnVwb3MgcGVxdWXDsW9zIC8gNDUpClJlc3BvbmRhIGVzdGFzIHByZWd1bnRhcyBwb3Igc3UgY3VlbnRhLCBsdWVnbyBjb21wYXJlIHN1cyByZXNwdWVzdGFzIGNvbiBsYXMgZGUgb3Ryb3MuCgoxLiDCv0N1w6FsZXMgc29uIGxvcyB2YWxvcmVzIHF1ZSBleHByZXNhIHN1IG9yZ2FuaXphY2nDs24/CgoyLiDCv1NvbiBlc3RvcyBsb3MgdmFsb3JlcyBxdWUgZGVzZWEgcXVlIGxhIG9yZ2FuaXphY2nDs24gZXhwcmVzZT8KCjMuIFNpIG5vLCDCv3F1w6kgdmFsb3JlcyBsZSBndXN0YXLDrWEgZXhwcmVzYXI/Cgo0LiDCv0N1w6FsZXMgc29uIGxvcyBjb21wb3J0YW1pZW50b3MgZXNwZWPDrWZpY29zIHF1ZSBkZW11ZXN0cmFuIGVzb3MgdmFsb3Jlcz8KCjUuIMK/UXXDqSBjb21wb3J0YW1pZW50b3MgZGVtb3N0cmFyw61hbiBsbyBjb250cmFyaW8gZGUgZXNvcyB2YWxvcmVzPwoKIyMjIFByb2NlZGltaWVudG9zIGRlIHJldW5pw7NuIChncnVwb3MgcGVxdWXDsW9zIC8gMzApCgpSZXNwb25kYSBlc3RhcyBwcmVndW50YXMgcG9yIHN1IGN1ZW50YSwgbHVlZ28gY29tcGFyZSBzdXMgcmVzcHVlc3RhcyBjb24gbGFzIGRlIG90cm9zLgoKMS4gwr9Dw7NtbyBzZSBsbGV2YW4gYSBjYWJvIHN1cyByZXVuaW9uZXM/CgoyLiDCv0VzIGFzw60gY29tbyBxdWllcmVzIHF1ZSBzZSByZWFsaWNlbiB0dXMgcmV1bmlvbmVzPwoKMy4gwr9MYXMgcmVnbGFzIHBhcmEgZWplY3V0YXIgcmV1bmlvbmVzIHNvbiBleHBsw61jaXRhcyBvIHNpbXBsZW1lbnRlIHNlIGFzdW1lbj8KCjQuIMK/RXN0YXMgc29uIGxhcyByZWdsYXMgcXVlIHF1aWVyZXM/Cgo1LiDCv1F1acOpbiBlcyBlbGVnaWJsZSBwYXJhIHZvdGFyIG8gdG9tYXIgZGVjaXNpb25lcz8KCjYuIMK/RXMgYSBxdWllbiBxdWllcmVzIHF1ZSBzZSBsZSBvdG9yZ3VlIGF1dG9yaWRhZCBwYXJhIHRvbWFyIGRlY2lzaW9uZXM/Cgo3LiDCv1V0aWxpemEgbGEgcmVnbGEgZGUgbGEgbWF5b3LDrWEsIHRvbWEgZGVjaXNpb25lcyBwb3IgY29uc2Vuc28gdSBvdHJhIGNvc2E/Cgo4LiDCv0VzIGFzw60gY29tbyBxdWllcmVzIHRvbWFyIGRlY2lzaW9uZXM/Cgo5LiDCv0PDs21vIHNhYmVuIGxhcyBwZXJzb25hcyBlbiB1bmEgcmV1bmnDs24gY3XDoW5kbyBzZSBoYSB0b21hZG8gdW5hIGRlY2lzacOzbj8KCjEwLiDCv0PDs21vIHNhYmVuIGxhcyBwZXJzb25hcyBxdWUgbm8gZXN0dXZpZXJvbiBlbiB1bmEgcmV1bmnDs24gcXXDqSBkZWNpc2lvbmVzIHNlIHRvbWFyb24/CgoxMS4gwr9GdW5jaW9uYSBlc3RvIHBhcmEgdHUgZ3J1cG8/CgojIyMgVGFtYcOxbyAoZ3J1cG9zIHBlcXVlw7FvcyAvIDIwKQpSZXNwb25kYSBlc3RhcyBwcmVndW50YXMgcG9yIHN1IGN1ZW50YSwgbHVlZ28gY29tcGFyZSBzdXMgcmVzcHVlc3RhcyBjb24gbGFzIGRlIG90cm9zLgoKMS4gwr9RdcOpIHRhbiBncmFuZGUgZXMgdHUgZ3J1cG8/CgoyLiDCv0VzIGVzdGUgZWwgdGFtYcOxbyBxdWUgZGVzZWEgcGFyYSBzdSBvcmdhbml6YWNpw7NuPwoKMy4gU2kgbm8sIMK/ZGUgcXXDqSB0YW1hw7FvIHRlIGd1c3RhcsOtYSBxdWUgZnVlcmE/Cgo0LiDCv1RpZW5lIGFsZ8O6biBsw61taXRlIGVuIGN1YW50byBhbCB0YW1hw7FvIGRlIGxhIG1lbWJyZXPDrWE/Cgo1LiDCv1RlIGJlbmVmaWNpYXLDrWFzIGRlIGVzdGFibGVjZXIgZXNlIGzDrW1pdGU/CgoKIyMjIENvbnZlcnRpcnNlIGVuIG1pZW1icm8gKGdydXBvcyBwZXF1ZcOxb3MgLyA0NSkKUmVzcG9uZGEgZXN0YXMgcHJlZ3VudGFzIHBvciBzdSBjdWVudGEsIGx1ZWdvIGNvbXBhcmUgc3VzIHJlc3B1ZXN0YXMgY29uIGxhcyBkZSBvdHJvcy4KCjEuIMK/Q8OzbW8gc2UgdW5lIGFsZ3VpZW4gYSB0dSBncnVwbz8KCjIuIMK/UXXDqSB0YW4gYmllbiBmdW5jaW9uYSBlc3RlIHByb2Nlc28/CgozLiDCv0hheSBjdW90YXMgZGUgbWVtYnJlc8OtYT8KCjQuIMK/U2UgcmVxdWllcmUgcXVlIGxhcyBwZXJzb25hcyBlc3TDqW4gZGUgYWN1ZXJkbyBjb24gYWxndW5hIHJlZ2xhIGRlIGNvbXBvcnRhbWllbnRvIGFsIHVuaXJzZT8KCjUuIMK/U29uIGVzdGFzIGxhcyByZWdsYXMgZGUgY29tcG9ydGFtaWVudG8gcXVlIHF1aWVyZXM/Cgo2LiDCv0PDs21vIGRlc2N1YnJlIHVuIHJlY2nDqW4gbGxlZ2FkbyBsbyBxdWUgaGF5IHF1ZSBoYWNlcj8KCjcuIMK/UXXDqSB0YW4gYmllbiBmdW5jaW9uYSBlc3RlIHByb2Nlc28/CgojIyMgRG90YWNpw7NuIGRlIHBlcnNvbmFsIChncnVwb3MgcGVxdWXDsW9zIC8gMzApClJlc3BvbmRhIGVzdGFzIHByZWd1bnRhcyBwb3Igc3UgY3VlbnRhLCBsdWVnbyBjb21wYXJlIHN1cyByZXNwdWVzdGFzIGNvbiBsYXMgZGUgb3Ryb3MuCgoxLiDCv1RpZW5lIHBlcnNvbmFsIHBhZ2FkbyBlbiBzdSBvcmdhbml6YWNpw7NuIG8gdG9kb3Mgc29uIHZvbHVudGFyaW9zPwoKMi4gwr9EZWJlcsOtYXMgaGFiZXIgcGFnYWRvIHBlcnNvbmFsPwoKMy4gwr9RdWllcmVzIC8gbmVjZXNpdGFzIG3DoXMgbyBtZW5vcyBwZXJzb25hbD8KCjQuIMK/UXXDqSBoYWNlbiBsb3MgbWllbWJyb3MgZGVsIHBlcnNvbmFsPwoKNS4gwr9Tb24gZXN0b3MgbG9zIHJvbGVzIHkgZnVuY2lvbmVzIHByaW5jaXBhbGVzIHF1ZSBuZWNlc2l0YSBxdWUgZWwgcGVyc29uYWwgZGVzZW1wZcOxZT8KCjYuIMK/UXVpw6luIHN1cGVydmlzYSBhIHR1IHBlcnNvbmFsPwoKNy4gwr9FcyBlc3RlIGVsIHByb2Nlc28gZGUgc3VwZXJ2aXNpw7NuIHF1ZSBkZXNlYSBwYXJhIHN1IGdydXBvPwoKOC4gwr9DdcOhbnRvIGxlIHBhZ2FuIGEgc3UgcGVyc29uYWw/Cgo5LiDCv0VzIGVzdGUgZWwgc2FsYXJpbyBhZGVjdWFkbyBwYXJhIHJlYWxpemFyIGVsIHRyYWJham8gbmVjZXNhcmlvPwoKIyMjIERpbmVybyAoZ3J1cG9zIHBlcXVlw7FvcyAvIDMwKQpSZXNwb25kYSBlc3RhcyBwcmVndW50YXMgcG9yIHN1IGN1ZW50YSwgbHVlZ28gY29tcGFyZSBzdXMgcmVzcHVlc3RhcyBjb24gbGFzIGRlIG90cm9zLgoKMS4gwr9RdWnDqW4gcGFnYSBwb3IgcXXDqT8KCjIuIMK/RXMgZXN0byBhIHF1aWVuIHF1aWVyZXMgcGFnYXI/CgozLiDCv0RlIGTDs25kZSBzYWNhcyB0dSBkaW5lcm8/Cgo0LiDCv0VzIGFzw60gY29tbyBxdWllcmVzIG9idGVuZXIgdHUgZGluZXJvPwoKNS4gU2kgbm8sIMK/dGllbmVzIGFsZ8O6biBwbGFuIHBhcmEgaGFjZXJsbyBkZSBvdHJhIG1hbmVyYT8KCjYuIFNpIGVzIGFzw60sIMK/UXVlIHNvbj8KCjcuIMK/UXVpw6luIGVzdMOhIHNpZ3VpZW5kbyBwYXJhIGFzZWd1cmFyc2UgZGUgcXVlIGVzbyBzdWNlZGE/Cgo4LiDCv0N1w6FudG8gZGluZXJvIHRpZW5lIHVzdGVkPwoKOS4gwr9DdcOhbnRvIG5lY2VzaXRhcz8KCjEwLiDCv0VuIHF1w6kgZ2FzdGFzIGxhIG1heW9yIHBhcnRlIGRlIHR1IGRpbmVybz8KCjExLiDCv0VzIGFzw60gY29tbyBxdWllcmVzIGdhc3RhciB0dSBkaW5lcm8/CgojIyMgUHLDqXN0YW1vIGRlIGlkZWFzICh0b2RhIGxhIGNsYXNlIC8gMTUpCk11Y2hhcyBkZSBtaXMgaWRlYXMgc29icmUgY8OzbW8gY29uc3RydWlyIHVuYSBjb211bmlkYWQgaGFuIHNpZG8gbW9sZGVhZGFzIHBvciBtaSBleHBlcmllbmNpYSBlbiBlbCBkZXNhcnJvbGxvIGRlIHNvZnR3YXJlIGRlIGPDs2RpZ28gYWJpZXJ0by4gW0ZvZ2UyMDA1XSAocXVlIGVzdMOhIGRpc3BvbmlibGUgZW4gbMOtbmVhKSBlcyB1bmEgYnVlbmEgZ3XDrWEgZGUgbG8gcXVlIGhhIGZ1bmNpb25hZG8geSBsbyBxdWUgbm8gaGEgZnVuY2lvbmFkbyBwYXJhIGVzYXMgY29tdW5pZGFkZXMsIHkgT3BlbiBFbCBzaXRpbyBkZSBTb3VyY2UgR3VpZGVzIHRhbWJpw6luIHRpZW5lIHVuYSBncmFuIGNhbnRpZGFkIGRlIGluZm9ybWFjacOzbiDDunRpbC4gRWxpamEgdW5hIHNlY2Npw7NuIGRlIGVzdGUgw7psdGltbywgY29tbyAiRW5jb250cmFyIHVzdWFyaW9zIHBhcmEgc3UgcHJveWVjdG8iIG8gIkxpZGVyYXpnbyB5IGdvYmVybmFuemEiLCB5IGTDqSB1bmEgcHJlc2VudGFjacOzbiBkZSBkb3MgbWludXRvcyBhbCBncnVwbyBkZSB1bmEgaWRlYSBxdWUgbGUgaGF5YSByZXN1bHRhZG8gw7p0aWwgbyBjb24gbGEgcXVlIG5vIGVzdMOpIGRlIGFjdWVyZG8uCgojIyMgwr9RdWnDqW4gZXJlcyB0w7o/IChncnVwb3MgcGVxdWXDsW9zIC8gMjApCkxhIEFkbWluaXN0cmFjacOzbiBOYWNpb25hbCBPY2XDoW5pY2EgeSBBdG1vc2bDqXJpY2EgKE5PQUEpIHRpZW5lIHVuYSBndcOtYSBicmV2ZSwgw7p0aWwgeSBkaXZlcnRpZGEgcGFyYSBsaWRpYXIgY29uIGxvcyBjb21wb3J0YW1pZW50b3MgZGlzcnVwdGl2b3MuIENsYXNpZmljYSBlc29zIGNvbXBvcnRhbWllbnRvcyBiYWpvIGV0aXF1ZXRhcyBjb21vICJoYWJsYWRvciIsICJpbmRlY2lzbyIgeSAidMOtbWlkbyIsIHkgZGVzY3JpYmUgbGFzIGVzdHJhdGVnaWFzIHBhcmEgbWFuZWphciBjYWRhIHVuby4gRW4gZ3J1cG9zIGRlIDMgYSA2LCBsZWEgbGEgZ3XDrWEgeSBkZWNpZGEgY3XDoWwgZGUgZXN0YXMgZGVzY3JpcGNpb25lcyBsZSBxdWVkYSBtZWpvci4gwr9DcmVlcyBxdWUgbGFzIGVzdHJhdGVnaWFzIGRlc2NyaXRhcyBwYXJhIG1hbmVqYXIgcGVyc29uYXMgY29tbyB0w7ogc29uIGVmZWN0aXZhcz8gwr9Tb24gb3RyYXMgZXN0cmF0ZWdpYXMgaWd1YWxtZW50ZSBvIG3DoXMgZWZlY3RpdmFzPwoKIyMjIENyZWFuZG8gbGVjY2lvbmVzIGp1bnRvcyAoZ3J1cG9zIHBlcXVlw7FvcyAvIDMwKQpVbmEgZGUgbGFzIGNsYXZlcyBkZWwgw6l4aXRvIGRlIGxhcyBDYXJwaW50ZXLDrWFzIGVzIHN1IMOpbmZhc2lzIGVuIGNvbnN0cnVpciB5IG1hbnRlbmVyIGxlY2Npb25lcyBlbiBjb2xhYm9yYWNpw7NuIFtXaWxzMjAxNiwgRGV2ZTIwMThdLiBUcmFiYWphbmRvIGVuIGdydXBvcyBkZSAz4oCTNDoKCjEuIEVsaWphIHVuYSBicmV2ZSBsZWNjacOzbiBxdWUgdG9kb3MgaGF5YW4gdXNhZG8uCgoyLiBIYWdhIHVuYSByZXZpc2nDs24gY3VpZGFkb3NhIHBhcmEgY3JlYXIgdW5hIGxpc3RhIHVuaWZpY2FkYSBkZSBzdWdlcmVuY2lhcyBwYXJhIG1lam9yYXMuCgozLiBPZnJlemNhIGVzYXMgc3VnZXJlbmNpYXMgYWwgYXV0b3IgZGUgbGEgbGVjY2nDs24uCgojIyMgwr9FcmVzIGNydWppZW50ZT8gKGluZGl2aWR1YWwgLyAxMCkKSm9obmF0aGFuIE5pZ2h0aW5nYWxlIGVzY3JpYmnDszoKCj5DdWFuZG8gdHJhYmFqYWJhIGVuIE1vemlsbGEsIHV0aWxpemFtb3MgZWwgdMOpcm1pbm8gImNydWppZW50ZSIgcGFyYSByZWZlcmlybm9zIGFsIGVzdGFkbyBqdXN0byBhbnRlcyBkZWwgYWdvdGFtaWVudG8uIExhcyBwZXJzb25hcyBxdWUgc29uIGNydWppZW50ZXMgbm8gc29uIGRpdmVydGlkYXMuIFNvbiBicmV2ZXMuIEVzdMOhbiBhbnNpb3NvcyBwb3IgdW5hIHBlbGVhIHF1ZSBwdWVkZW4gZ2FuYXIuIExsb3JhbiBzaW4gbXVjaGEgYWR2ZXJ0ZW5jaWEuIC4uLiByZWNvbm9jZXLDrWFtb3MgbGEgZnJlc2N1cmEgZGUgbnVlc3Ryb3MgY29sZWdhcyB5IG5vcyBjdWlkYXLDrWFtb3MgbG9zIHVub3MgYSBsb3Mgb3Ryb3MgW3Blcm9dIGVzIHVuYSBjb3NhIGZlYSBxdWUgbG8gdmltb3MgdGFudG8gcXVlIHRlbsOtYW1vcyB0b2RvIHVuIHByb2Nlc28gY3VsdHVyYWwgYWxyZWRlZG9yLgoKClJlc3BvbmRhICJzw60iIG8gIm5vIiBhIGNhZGEgdW5hIGRlIGxhcyBzaWd1aWVudGVzIHByZWd1bnRhcy4gwr9RdcOpIHRhbiBjZXJjYSBlc3TDoXMgZGUgcXVlbWFydGU/CgoqIMK/VGUgaGFzIHZ1ZWx0byBjw61uaWNvIG8gY3LDrXRpY28gZW4gZWwgdHJhYmFqbz8KCiogwr9UaWVuZXMgcXVlIGFycmFzdHJhcnRlIGFsIHRyYWJham8gbyB0aWVuZXMgcHJvYmxlbWFzIHBhcmEgY29tZW56YXI/CgoqIMK/VGUgaGFzIHZ1ZWx0byBpcnJpdGFibGUgbyBpbXBhY2llbnRlIGNvbiB0dXMgY29tcGHDsWVyb3MgZGUgdHJhYmFqbz8KCiogwr9MZSByZXN1bHRhIGRpZsOtY2lsIGNvbmNlbnRyYXJzZT8KCiogwr9ObyBsb2dyYXMgbGEgc2F0aXNmYWNjacOzbiBkZSB0dXMgbG9ncm9zPwoKKiDCv0VzdMOhcyB1c2FuZG8gY29taWRhLCBkcm9nYXMgbyBhbGNvaG9sIHBhcmEgc2VudGlydGUgbWVqb3IgbyBzaW1wbGVtZW50ZSBubyBzZW50aXJ0ZT8KCi0tLS0tLS0tCgojIFN1cGVyYXIgYQpFc3TDoSBkZSBtb2RhIGVuIGxvcyBjw61yY3Vsb3MgdGVjbm9sw7NnaWNvcyBtZW5vc3ByZWNpYXIgYSBsYXMgdW5pdmVyc2lkYWRlcyBlIGluc3RpdHVjaW9uZXMgZ3ViZXJuYW1lbnRhbGVzIGNvbW8gZGlub3NhdXJpb3MgcXVlIHNlIG11ZXZlbiBsZW50YW1lbnRlLCBwZXJvIGVuIG1pIGV4cGVyaWVuY2lhIG5vIHNvbiBwZW9yZXMgcXVlIGxhcyBlbXByZXNhcyBkZSB0YW1hw7FvIHNpbWlsYXIuIExhIGp1bnRhIGVzY29sYXIgbG9jYWwsIGxhIGJpYmxpb3RlY2EgeSBsYSBvZmljaW5hIGRlbCBjb25jZWphbCBkZSBzdSBjaXVkYWQgcHVlZGVuIG9mcmVjZXJsZSBlc3BhY2lvLCBmb25kb3MsIHB1YmxpY2lkYWQsIGNvbmV4aW9uZXMgY29uIG90cm9zIGdydXBvcyBxdWUgYcO6biBubyBoYXlhIGNvbm9jaWRvIHkgdW5hIGdyYW4gY2FudGlkYWQgZGUgb3RyYXMgY29zYXMgw7p0aWxlczsgY29ub2NlcmxvcyBwdWVkZSBheXVkYXJsbyBhIHJlc29sdmVyIG8gZXZpdGFyIHByb2JsZW1hcyBhIGNvcnRvIHBsYXpvIHkgcGFnYXIgZGl2aWRlbmRvcyBlbiBlbCBmdXR1cm8uCgpNw6Fya2V0aW5nCkxhcyBwZXJzb25hcyBjb24gYW50ZWNlZGVudGVzIGFjYWTDqW1pY29zIG8gdMOpY25pY29zIGEgbWVudWRvIHBpZW5zYW4gcXVlIGVsIG1hcmtldGluZyBzZSB0cmF0YSBkZSBnaXJvIHkgZGlyZWNjacOzbiBlcnLDs25lYS4gRW4gcmVhbGlkYWQsIHNlIHRyYXRhIGRlIHZlciBsYXMgY29zYXMgZGVzZGUgbGEgcGVyc3BlY3RpdmEgZGUgb3RyYXMgcGVyc29uYXMsIGNvbXByZW5kZXIgc3VzIGRlc2VvcyB5IG5lY2VzaWRhZGVzLCB5IGV4cGxpY2FyIGPDs21vIHB1ZWRlIGF5dWRhcmxvcywgZW4gcmVzdW1lbiwgY8OzbW8gZW5zZcOxYXJsZXMuIEVzdGUgY2Fww610dWxvIGFuYWxpemFyw6EgY8OzbW8gdXNhciBsYXMgaWRlYXMgZGUgbG9zIGNhcMOtdHVsb3MgYW50ZXJpb3JlcyBwYXJhIHF1ZSBsYSBnZW50ZSBlbnRpZW5kYSB5IGFwb3llIGxvIHF1ZSBlc3TDoSBoYWNpZW5kby4KCkVsIHByaW1lciBwYXNvIGVzIGRlc2N1YnJpciBxdcOpIGxlIGVzdMOhIG9mcmVjaWVuZG8gYSBxdWnDqW4sIGVzIGRlY2lyLCBxdcOpIGFwb3J0YSByZWFsbWVudGUgYSBsb3Mgdm9sdW50YXJpb3MsIGxhIGZpbmFuY2lhY2nDs24geSBvdHJvIHRpcG8gZGUgYXBveW8gcXVlIG5lY2VzaXRhIHBhcmEgY29udGludWFyLiBMYSByZXNwdWVzdGEgZXMgYSBtZW51ZG8gY29udHJhLWludHVpdGl2YS4gUG9yIGVqZW1wbG8sIGxhIG1heW9yw61hIGRlIGxvcyBjaWVudMOtZmljb3MgcGllbnNhbiBxdWUgc3VzIGRvY3VtZW50b3Mgc29uIHN1IHByb2R1Y3RvLCBwZXJvIGVuIHJlYWxpZGFkIHNvbiBzdXMgcHJvcHVlc3RhcyBkZSBzdWJ2ZW5jacOzbiwgcG9ycXVlIGVzbyBlcyBsbyBxdWUgYXBvcnRhIGVsIGRpbmVybyBkZSBsYSBzdWJ2ZW5jacOzbiBbS3VjaDIwMTFdLiBTdXMgZG9jdW1lbnRvcyBzb24gbGEgcHVibGljaWRhZCBxdWUgY29udmVuY2UgYSBsYXMgcGVyc29uYXMgcGFyYSBxdWUgZmluYW5jaWVuIGVzYXMgcHJvcHVlc3RhcywgYXPDrSBjb21vIGxvcyDDoWxidW1lcyBzb24gYWhvcmEgbG8gcXVlIGNvbnZlbmNlIGEgbGFzIHBlcnNvbmFzIGEgY29tcHJhciBib2xldG9zIHkgY2FtaXNldGFzIHBhcmEgY29uY2llcnRvcyBkZSBtw7pzaWNvcy4KClN1cG9uZ2EgcXVlIHN1IGdydXBvIG9mcmVjZSB0YWxsZXJlcyBkZSBwcm9ncmFtYWNpw7NuIGRlIGZpbiBkZSBzZW1hbmEgYSBwZXJzb25hcyBxdWUgZXN0w6FuIHJlaW5ncmVzYW5kbyBhIGxhIGZ1ZXJ6YSBsYWJvcmFsIGRlc3B1w6lzIGRlIGVzdGFyIGZ1ZXJhIGR1cmFudGUgdmFyaW9zIGHDsW9zLiBTaSBsb3MgcGFydGljaXBhbnRlcyBkZWwgdGFsbGVyIHB1ZWRlbiBwYWdhciBsbyBzdWZpY2llbnRlIHBhcmEgY3VicmlyIHN1cyBjb3N0b3MsIGVudG9uY2VzIHNvbiBzdXMgY2xpZW50ZXMgeSBsb3MgdGFsbGVyZXMgc29uIGVsIHByb2R1Y3RvLiBTaSwgcG9yIG90cm8gbGFkbywgbG9zIHRhbGxlcmVzIHNvbiBncmF0dWl0b3MgbyBsb3MgYWx1bW5vcyBzb2xvIHBhZ2FuIHVuYSBjYW50aWRhZCBzaW1iw7NsaWNhIHBhcmEgcmVkdWNpciBsYSB0YXNhIGRlIG5vIHByZXNlbnRhY2nDs24sIGVudG9uY2VzIHN1IHByb2R1Y3RvIHJlYWwgcHVlZGUgc2VyIHVuYSBjb21iaW5hY2nDs24gZGU6CgoqIHN1cyBwcm9wdWVzdGFzIGRlIHN1YnZlbmNpw7NuOwoKKiBsb3MgYWx1bW5vcyBkZSBzdXMgdGFsbGVyZXMgcXVlIGxhcyBlbXByZXNhcyBwYXRyb2NpbmFkb3JhcyBsZSBndXN0YXLDrWEgY29udHJhdGFyOwoKKiBlbCByZXN1bWVuIGRlIG1lZGlhIHDDoWdpbmEgZGUgc3VzIHRhbGxlcmVzIGVuIGVsIGluZm9ybWUgYW51YWwgZGVsIGFsY2FsZGUgYWwgYXl1bnRhbWllbnRvIHF1ZSBtdWVzdHJhIGPDs21vIGVzdMOhIGFwb3lhbmRvIGFsIHNlY3RvciB0ZWNub2zDs2dpY28gbG9jYWw7IG8KCiogTGEgc2F0aXNmYWNjacOzbiBwZXJzb25hbCBxdWUgbG9zIHZvbHVudGFyaW9zIG9idGllbmVuIGRlIGxhIGVuc2XDsWFuemEuCgpBbCBpZ3VhbCBxdWUgY29uIGVsIGRpc2XDsW8gZGUgbGEgbGVjY2nDs24gKENhcMOtdHVsbyA2KSwgbG9zIHByaW1lcm9zIHBhc29zIGVuIG1hcmtldGluZyBzb24gY3JlYXIgcGVyc29uYXMgZGUgcGVyc29uYXMgcXVlIHB1ZWRhbiBlc3RhciBpbnRlcmVzYWRhcyBlbiBsbyBxdWUgZXN0w6EgaGFjaWVuZG8geSBkZXRlcm1pbmFyIGN1w6FsZXMgZGUgc3VzIG5lY2VzaWRhZGVzIHB1ZWRlIHNhdGlzZmFjZXIuIFVuYSBmb3JtYSBkZSByZXN1bWlyIGVzdG8gw7psdGltbyBlcyBlc2NyaWJpciBsYW56YW1pZW50b3MgZGUgZWxldmFkb3JlcyBkaXJpZ2lkb3MgYSBkaWZlcmVudGVzIHBlcnNvbmFzLiBVbmEgcGxhbnRpbGxhIGFtcGxpYW1lbnRlIHV0aWxpemFkYSBwYXJhIGVzdG9zIGVzOgoKfCAgfCAgfAp8LS18LS18CnxQYXJhfCBww7pibGljbyBvYmpldGl2b3wKfHF1aWVuIHxubyBlc3TDoSBzYXRpc2ZlY2hvIGNvbiBsbyBxdWUgZXN0w6EgZGlzcG9uaWJsZSBhY3R1YWxtZW50ZXwKfG51ZXN0cmEgfGNhdGVnb3JpYXwKfHByb3BvcmNpb25hcnwgdW4gYmVuZWZpY2lvIGNsYXZlfAp8QSBkaWZlcmVuY2lhfCBkZSBsYXMgYWx0ZXJuYXRpdmFzfAp8bnVlc3RyYSBjYXJhY3RlcsOtc3RpY2F8IGRpc3RpbnRpdmEgY2xhdmUgZGVsIHByb2dyYW1hLnwKCgpDb250aW51YW5kbyBjb24gZWwgZWplbXBsbyBkZWwgdGFsbGVyIGRlIGZpbiBkZSBzZW1hbmEsIHBvZHLDrWFtb3MgdXNhciBlc3RlIGNhbXBvIHBhcmEgbG9zIHBhcnRpY2lwYW50ZXM6Cgo+UGFyYSBsYXMgcGVyc29uYXMgcXVlIHZ1ZWx2ZW4gYSBpbmdyZXNhciBhIGxhIGZ1ZXJ6YSBsYWJvcmFsIGRlc3B1w6lzIGRlIGVzdGFyIGZ1ZXJhIGR1cmFudGUgdmFyaW9zIGHDsW9zIHkgcXVlIGHDum4gdGllbmVuIHJlc3BvbnNhYmlsaWRhZGVzIGZhbWlsaWFyZXMsIG51ZXN0cm9zIHRhbGxlcmVzIGRlIHByb2dyYW1hY2nDs24gaW50cm9kdWN0b3JpYSBicmluZGFuIGNsYXNlcyBkZSBmaW4gZGUgc2VtYW5hIGNvbiBjdWlkYWRvIGluZmFudGlsIGVuIGVsIGx1Z2FyLiBBIGRpZmVyZW5jaWEgZGUgbGFzIGNsYXNlcyBlbiBsw61uZWEsIG51ZXN0cm8gcHJvZ3JhbWEgYnJpbmRhIGEgbGFzIHBlcnNvbmFzIGxhIG9wb3J0dW5pZGFkIGRlIGNvbm9jZXIgYSBvdHJvcyBlbiBsYSBtaXNtYSBldGFwYSBkZSBsYSB2aWRhLgoKeSBlc3RlIHBhcmEgdG9tYWRvcmVzIGRlIGRlY2lzaW9uZXMgZW4gZW1wcmVzYXMgcXVlIHBvZHLDrWFuIHBhdHJvY2luYXIgbG9zIHRhbGxlcmVzOgoKPlBhcmEgbGFzIGVtcHJlc2FzIHF1ZSBkZXNlYW4gcmVjbHV0YXIgZGVzYXJyb2xsYWRvcmVzIGRlIHNvZnR3YXJlIGRlIG5pdmVsIGLDoXNpY28gcXVlIGx1Y2hhbiBwb3IgZW5jb250cmFyIGNhbmRpZGF0b3MgbWFkdXJvcyBkZSBkaXZlcnNvcyBvcsOtZ2VuZXMsIG51ZXN0cm9zIHRhbGxlcmVzIGRlIHByb2dyYW1hY2nDs24gaW50cm9kdWN0b3JpYSBvZnJlY2VuIHJlY2x1dGFzIHBvdGVuY2lhbGVzLiBBIGRpZmVyZW5jaWEgZGUgbGFzIGZlcmlhcyBkZSByZWNsdXRhbWllbnRvIHVuaXZlcnNpdGFyaW8sIG51ZXN0cm8gcHJvZ3JhbWEgY29uZWN0YSBhIGxhcyBlbXByZXNhcyBjb24gdW5hIGFtcGxpYSB2YXJpZWRhZCBkZSBjYW5kaWRhdG9zLgoKU2kgbm8gc2FiZSBwb3IgcXXDqSBkaWZlcmVudGVzIGludGVyZXNhZG9zIHBvdGVuY2lhbGVzIHBvZHLDrWFuIGVzdGFyIGludGVyZXNhZG9zIGVuIGxvIHF1ZSBlc3TDoSBoYWNpZW5kbywgcHJlZ8O6bnRlbGVzLiBTaSBsbyBzYWJlLCBwcmVnw7pudGVsZXMgZGUgdG9kb3MgbW9kb3M6IGxhcyByZXNwdWVzdGFzIHB1ZWRlbiBjYW1iaWFyIGNvbiBlbCB0aWVtcG8geSBwdWVkZSBkZXNjdWJyaXIgY29zYXMgcXVlIHByZXZpYW1lbnRlIHBhc8OzIHBvciBhbHRvLgoKVW5hIHZleiBxdWUgdGVuZ2EgZXN0b3MgYXJndW1lbnRvcywgZGViZW4gY29uZHVjaXIgbG8gcXVlIHVzdGVkIHBvbmdhIGVuIHN1IHNpdGlvIHdlYiB5IGVuIG1hdGVyaWFsIHB1YmxpY2l0YXJpbyBwYXJhIGF5dWRhciBhIGxhcyBwZXJzb25hcyBhIGRlc2N1YnJpciBsbyBtw6FzIHLDoXBpZG8gcG9zaWJsZSBzaSB1c3RlZCB5IGVsbG9zIHRpZW5lbiBhbGdvIGRlIHF1w6kgaGFibGFyLiAoU2luIGVtYmFyZ28sIHByb2JhYmxlbWVudGUgbm8gZGViZXLDrWEgY29waWFybG9zIHRleHR1YWxtZW50ZTogbXVjaGFzIHBlcnNvbmFzIGVuIHRlY25vbG9nw61hIGhhbiB2aXN0byBlc3RhIHBsYW50aWxsYSBjb24gdGFudGEgZnJlY3VlbmNpYSBxdWUgc3VzIG9qb3Mgc2UgdmVyw6FuIHZpZHJpb3NvcyBzaSBsYSB2dWVsdmVuIGEgZW5jb250cmFyKS4KCk1pZW50cmFzIGVzY3JpYmUgZXN0b3MgbGFuemFtaWVudG9zLCByZWN1ZXJkZSBxdWUgaGF5IG11Y2hhcyByYXpvbmVzIHBhcmEgYXByZW5kZXIgYSBwcm9ncmFtYXIgKFNlY2Npw7NuIDEuNCkuIFVuIHNlbnRpZG8gZGUgbG9ncm8sIGNvbnRyb2wgc29icmUgc3VzIHByb3BpYXMgdmlkYXMgeSBzZXIgcGFydGUgZGUgdW5hIGNvbXVuaWRhZCBwdWVkZSBtb3RpdmFyIGEgbGFzIHBlcnNvbmFzIG3DoXMgcXVlIGVsIGRpbmVybyAoQ2Fww610dWxvIDEwKS4gUG9kcsOtYW4gb2ZyZWNlcnNlIGNvbW8gdm9sdW50YXJpb3MgcGFyYSBlbnNlw7FhcmxlIHBvcnF1ZSBzdXMgYW1pZ29zIGxvIGVzdMOhbiBoYWNpZW5kbzsgRGVsIG1pc21vIG1vZG8sIHVuYSBlbXByZXNhIHB1ZWRlIGRlY2lyIHF1ZSBlc3TDoSBwYXRyb2NpbmFuZG8gY2xhc2VzIHBhcmEgZXN0dWRpYW50ZXMgZGUgc2VjdW5kYXJpYSBlY29uw7NtaWNhbWVudGUgZGVzZmF2b3JlY2lkb3MgcG9ycXVlIHF1aWVyZW4gdW4gZ3J1cG8gbcOhcyBncmFuZGUgZGUgZW1wbGVhZG9zIHBvdGVuY2lhbGVzIG3DoXMgYWRlbGFudGUsIHBlcm8gZWwgQ0VPIHBvZHLDrWEgZXN0YXIgaGFjacOpbmRvbG8gc2ltcGxlbWVudGUgcG9ycXVlIGVzIGxvIGNvcnJlY3RvLgoKIyMgTWFyY2EgeSBwb3NpY2lvbmFtaWVudG8KClVuYSBtYXJjYSBlcyBsYSBwcmltZXJhIHJlYWNjacOzbiBkZSBhbGd1aWVuIGFudGUgdW5hIG1lbmNpw7NuIGRlIHVuIHByb2R1Y3RvOyBzaSBsYSByZWFjY2nDs24gZXMgIsK/cXXDqSBlcyBlc28/IiwgdG9kYXbDrWEgbm8gdGllbmUgdW5hIG1hcmNhLiBMYSBtYXJjYSBlcyBpbXBvcnRhbnRlIHBvcnF1ZSBsYXMgcGVyc29uYXMgbm8gdmFuIGEgYXl1ZGFyIGEgYWxnbyBxdWUgbm8gY29ub2NlbiBvIG5vIGxlcyBpbXBvcnRhLgoKTGEgbWF5b3IgcGFydGUgZGUgbGEgZGlzY3VzacOzbiBzb2JyZSBsYSBtYXJjYSBkZSBob3kgc2UgY2VudHJhIGVuIGPDs21vIGNyZWFyIGNvbmNpZW5jaWEgZW4gbMOtbmVhLiBMYXMgbGlzdGFzIGRlIGNvcnJlbywgbG9zIGJsb2dzIHkgVHdpdHRlciBsZSBicmluZGFuIGZvcm1hcyBkZSBsbGVnYXIgYSBsYXMgcGVyc29uYXMsIHBlcm8gYSBtZWRpZGEgcXVlIGF1bWVudGEgZWwgdm9sdW1lbiBkZSBpbmZvcm1hY2nDs24gZXJyw7NuZWEsIGxhcyBwZXJzb25hcyBwcmVzdGFuIG1lbm9zIGF0ZW5jacOzbiBhIGNhZGEgaW50ZXJydXBjacOzbiBpbmRpdmlkdWFsLiBFc3RvIGhhY2UgcXVlIGVsIHBvc2ljaW9uYW1pZW50byBzZWEgY2FkYSB2ZXogbcOhcyBpbXBvcnRhbnRlLiBBIHZlY2VzIGxsYW1hZGEgImRpZmVyZW5jaWFjacOzbiIsIGVzIGxvIHF1ZSBkaXN0aW5ndWUgc3Ugb2ZlcnRhIGRlIGxvcyBkZW3DoXMsIGxhIHNlY2Npw7NuICJkaWZlcmVudGUiIGRlIGxhcyBwYXJjZWxhcyBkZSBzdSBhc2NlbnNvci4gQ3VhbmRvIHNlIGNvbXVuaXF1ZSBjb24gcGVyc29uYXMgcXVlIHlhIGVzdMOhbiBmYW1pbGlhcml6YWRhcyBjb24gc3UgY2FtcG8sIGRlYmUgZW5mYXRpemFyIHN1IHBvc2ljacOzbiwgeWEgcXVlIGVzIGxvIHF1ZSBsbGFtYXLDoSBzdSBhdGVuY2nDs24uCgpIYXkgb3RyYXMgY29zYXMgcXVlIHB1ZWRlIGhhY2VyIHBhcmEgYXl1ZGFyIGEgY29uc3RydWlyIHN1IG1hcmNhLiBVbmEgZXMgdXNhciBhY2Nlc29yaW9zIGNvbW8gdW4gcm9ib3QgcXVlIHVubyBkZSB0dXMgYWx1bW5vcyBoaXpvIGNvbiBsb3MgcmVzdG9zIHF1ZSBlbmNvbnRyw7MgZW4gbGEgY2FzYSBbU2NodzIwMTNdIG8gZWwgc2l0aW8gd2ViIHF1ZSBvdHJvIGFsdW1ubyBoaXpvIHBhcmEgbGEgY2FzYSBkZSByZXRpcm8gZGUgc3VzIHBhZHJlcy4gT3RyYSBlcyBoYWNlciB1biB2aWRlbyBjb3J0bywgZGUgbm8gbcOhcyBkZSB1bm9zIG1pbnV0b3MgZGUgZHVyYWNpw7NuLCBxdWUgbXVlc3RyZSBsb3MgYW50ZWNlZGVudGVzIHkgbG9ncm9zIGRlIHN1cyBhbHVtbm9zLiBFbCBvYmpldGl2byBkZSBhbWJvcyBlcyBjb250YXIgdW5hIGhpc3RvcmlhOiBhdW5xdWUgbGFzIHBlcnNvbmFzIHNpZW1wcmUgc29saWNpdGFuIGRhdG9zLCBjcmVlbiB5IHJlY3VlcmRhbiBoaXN0b3JpYXMuCgo+KipNaXRvcyBGdW5kYWNpb25hbGVzKioKPgo+VW5hIGRlIGxhcyBoaXN0b3JpYXMgbcOhcyBjb252aW5jZW50ZXMgcXVlIHVuYSBwZXJzb25hIG8gZ3J1cG8gcHVlZGUgY29udGFyIGVzIHBvciBxdcOpIHkgY8OzbW8gY29tZW56YXJvbi4gwr9Fc3TDoXMgZW5zZcOxYW5kbyBsbyBxdWUgZGVzZWFyw61hcyBxdWUgYWxndWllbiB0ZSBodWJpZXJhIGVuc2XDsWFkbyBwZXJvIG5vIGxvIGhpY2lzdGU/IMK/SHVibyB1bmEgcGVyc29uYSBlbiBwYXJ0aWN1bGFyIGEgbGEgcXVlIHF1aXNpc3RlIGF5dWRhciB5IHF1ZSBhYnJpw7MgbGFzIGNvbXB1ZXJ0YXM/IFNpIG5vIGhheSB1bmEgc2VjY2nDs24gZW4gc3Ugc2l0aW8gd2ViIHF1ZSBjb21pZW5jZSwgIsOJcmFzZSB1bmEgdmV6IiwgcGllbnNlIGVuIGFncmVnYXIgdW5hLgoKClVuIHBhc28gY3J1Y2lhbCBlcyBoYWNlciBxdWUgc3Ugb3JnYW5pemFjacOzbiBzZWEgbG9jYWxpemFibGUgZW4gYsO6c3F1ZWRhcyBlbiBsw61uZWEuIFtEaVNhMjAxNGJdIGRlc2N1YnJpw7MgcXVlIGxvcyB0w6lybWlub3MgZGUgYsO6c3F1ZWRhIHF1ZSBsb3MgcGFkcmVzIHVzYWJhbiBwYXJhIGxhcyBjbGFzZXMgZGUgY29tcHV0YWNpw7NuIGZ1ZXJhIGRlIGxhIGVzY3VlbGEgZW4gcmVhbGlkYWQgbm8gZW5jb250cmFyb24gZXNhcyBjbGFzZXMsIHkgbXVjaG9zIG90cm9zIGdydXBvcyBlbmZyZW50YW4gZGVzYWbDrW9zIHNpbWlsYXJlcy4gSGF5IG11Y2hvIGZvbGtsb3JlIHNvYnJlIGPDs21vIGhhY2VyIHF1ZSBsYXMgY29zYXMgc2UgcHVlZGFuIGVuY29udHJhciAodGFtYmnDqW4gY29ub2NpZG8gY29tbyBvcHRpbWl6YWNpw7NuIGRlIG1vdG9yZXMgZGUgYsO6c3F1ZWRhIG8gU0VPKTsgRGFkbyBlbCBwb2RlciBjYXNpIG1vbm9ww7NsaWNvIGRlIEdvb2dsZSB5IGxhIGZhbHRhIGRlIHRyYW5zcGFyZW5jaWEsIGxhIG1heW9yIHBhcnRlIHNlIHJlZHVjZSBhIHRyYXRhciBkZSBlc3RhciB1biBwYXNvIHBvciBkZWxhbnRlIGRlIGxvcyBhbGdvcml0bW9zIGRpc2XDsWFkb3MgcGFyYSBldml0YXIgcXVlIGxhcyBwZXJzb25hcyBjbGFzaWZpcXVlbiBlbiBsb3MganVlZ29zLgoKQSBtZW5vcyBxdWUgZXN0w6kgbXV5IGJpZW4gZmluYW5jaWFkbywgbG8gbWVqb3IgcXVlIHB1ZWRlIGhhY2VyIGVzIGJ1c2NhcnNlIGEgc8OtIG1pc21vIHkgYSBzdSBvcmdhbml6YWNpw7NuIGRlIG1hbmVyYSByZWd1bGFyIHkgdmVyIHF1w6kgc3VyZ2UsIGx1ZWdvIGxlZXIgZXN0YXMgcGF1dGFzIHkgaGFjZXIgbG8gcXVlIHB1ZWRhIHBhcmEgbWVqb3JhciBzdSBzaXRpby4gVGVuZ2EgZW4gY3VlbnRhIGVzdGEgY2FyaWNhdHVyYSBkZSBYS0NEOiBsYXMgcGVyc29uYXMgbm8gcXVpZXJlbiBzYWJlciBhY2VyY2EgZGUgc3Ugb3JnYW5pZ3JhbWEgdSBvYnRlbmVyIHVuIHJlY29ycmlkbyB2aXJ0dWFsIGRlIHN1IHNpdGlvOyBxdWllcmVuIHN1IGRpcmVjY2nDs24sIGluZm9ybWFjacOzbiBkZSBlc3RhY2lvbmFtaWVudG8geSBhbGd1bmEgaWRlYSBkZSBsbyBxdWUgZW5zZcOxYSwgY3XDoW5kbyBsbyBlbnNlw7FhIHkgY8OzbW8gVmEgYSBjYW1iaWFyIHN1cyB2aWRhcy4KCj4qKk5vIHRvZG9zIHZpdmVuIGVuIGzDrW5lYSoqCj4KPkVzdG9zIGVqZW1wbG9zIHN1cG9uZW4gcXVlIGxhcyBwZXJzb25hcyB0aWVuZW4gYWNjZXNvIGEgSW50ZXJuZXQgeSBxdWUgbG9zIGdydXBvcyB0aWVuZW4gZGluZXJvLCBtYXRlcmlhbGVzLCB0aWVtcG8gbGlicmUgeSAvIG8gaGFiaWxpZGFkZXMgdMOpY25pY2FzLiBNdWNob3Mgbm8gbG8gaGFjZW4sIGRlIGhlY2hvLCBhcXVlbGxvcyBxdWUgc2lydmVuIGEgZ3J1cG9zIGVjb27Ds21pY2FtZW50ZSBkZXNmYXZvcmVjaWRvcyBjYXNpIGNvbiBjZXJ0ZXphIG5vIGxvIGhhY2VuLiAoQ29tbyBkaWNlIFJvc2FyaW8gUm9iaW5zb24sICJsbyBncmF0dWl0byBmdW5jaW9uYSBwYXJhIGFxdWVsbG9zIHF1ZSBwdWVkZW4gcGFnYXJsbyBncmF0aXMiKS4gTGFzIGhpc3RvcmlhcyBzb24gbcOhcyBpbXBvcnRhbnRlcyBxdWUgbG9zIGVzcXVlbWFzIGRlbCBjdXJzbyBlbiBlc2FzIHNpdHVhY2lvbmVzIHBvcnF1ZSBzb24gbcOhcyBmw6FjaWxlcyBkZSB2b2x2ZXIgYSBjb250YXIuIERlbCBtaXNtbyBtb2RvLCBzaSBsYXMgcGVyc29uYXMgY29uIGxhcyBxdWUgZGVzZWEgY29tdW5pY2Fyc2Ugbm8gZXN0w6FuIGVuIGzDrW5lYSB0YW4gYSBtZW51ZG8gY29tbyB1c3RlZCwgZW50b25jZXMgbG9zIHRhYmxvbmVzIGRlIGFudW5jaW9zIGVuIGxhcyBlc2N1ZWxhcywgYmlibGlvdGVjYXMgbG9jYWxlcywgY2VudHJvcyBkZSBhY29naWRhIHkgdGllbmRhcyBkZSBhYmFycm90ZXMgcHVlZGVuIHNlciBsYSBmb3JtYSBtw6FzIGVmZWN0aXZhIGRlIGNvbXVuaWNhcnNlIGNvbiBlbGxvcy4KCiMjIEVsIGFydGUgZGUgbGEgbGxhbWFkYSBmcsOtYQpDb25zdHJ1aXIgdW4gc2l0aW8gd2ViIHkgZXNwZXJhciBxdWUgbGEgZ2VudGUgbG8gZW5jdWVudHJlIGVzIGbDoWNpbDsgbGxhbWFyIGEgbGFzIHBlcnNvbmFzIG8gbGxhbWFyIGEgc3UgcHVlcnRhIHNpbiBuaW5nw7puIHRpcG8gZGUgcHJlc2VudGFjacOzbiBwcmV2aWEgZXMgbXVjaG8gbcOhcyBkaWbDrWNpbC4gU2luIGVtYmFyZ28sIGFsIGlndWFsIHF1ZSBwYXJhcnNlIHkgZW5zZcOxYXIsIGVzIHVuIG9maWNpbyBxdWUgc2UgcHVlZGUgYXByZW5kZXIuIEFxdcOtIGhheSBkaWV6IHJlZ2xhcyBzaW1wbGVzIHBhcmEgY29udmVuY2VyIGEgbGFzIHBlcnNvbmFzIGRlIGxhcyBjb3NhczoKCioqMS4gbm8uKioKU2kgdGllbmVzIHF1ZSBjb252ZW5jZXIgYSBhbGd1aWVuIGRlIGFsZ28sIGxvIG3DoXMgcHJvYmFibGUgZXMgcXVlIHJlYWxtZW50ZSBubyBxdWllcmFuIGhhY2VybG8uIFJlc3BldGEgZXNvLiBjYXNpIHNpZW1wcmUgZXMgbWVqb3IgYSBsYXJnbyBwbGF6byBkZWphciBhbGdvIHNpbiBoYWNlciBxdWUgdXNhciBsYSBjdWxwYSBvIGN1YWxxdWllciB0cnVjbyBwc2ljb2zDs2dpY28gcXVlIHNvbG8gZ2VuZXJlIHJlc2VudGltaWVudG8uCgoqKjIuIFPDqSBhbWFibGUuKioKTm8gc8OpIHNpIHJlYWxtZW50ZSBoYXkgdW4gbGlicm8gbGxhbWFkbyBTZWNyZXQgVHJpY2tzIG9mIHRoZSBOaW5qYSBTYWxlcyBNYXN0ZXJzLCBwZXJvIHNpIGxvIGhheSwgcHJvYmFibGVtZW50ZSBsZXMgZGljZSBhIGxvcyBsZWN0b3JlcyBxdWUgaGFjZXIgYWxnbyBwb3IgdW4gY2xpZW50ZSBwb3RlbmNpYWwgY3JlYSB1bmEgc2Vuc2FjacOzbiBkZSBvYmxpZ2FjacOzbiwgbG8gcXVlIGEgc3UgdmV6IGF1bWVudGEgbGFzIHByb2JhYmlsaWRhZGVzIGRlIHVuIHJlYmFqYS4gRXNvIHB1ZWRlIGZ1bmNpb25hciwgcGVybyBzb2xvIGZ1bmNpb25hIHVuYSB2ZXogeSBlcyBhbGdvIGRpZsOtY2lsIGRlIGhhY2VyLiBQb3Igb3RybyBsYWRvLCBzaSBlcmVzIGdlbnVpbmFtZW50ZSBhbWFibGUgeSBheXVkYXMgYSBvdHJhcyBwZXJzb25hcyBwb3JxdWUgZXMgbG8gcXVlIGhhY2VuIGxhcyBwZXJzb25hcyBidWVuYXMsIHBvZHLDrWFzIGluc3BpcmFybGFzIGEgc2VyIGJ1ZW5hcyBwZXJzb25hcyB0YW1iacOpbi4KCioqMy4gQXBlbGFyIGFsIGJpZW4gbWF5b3IuKioKU2kgYWJyZXMgaGFibGFuZG8gZGUgbG8gcXVlIGhheSBwYXJhIGVsbG9zLCBlc3TDoXMgaW5kaWNhbmRvIHF1ZSBkZWJlcsOtYW4gcGVuc2FyIGVuIHN1IGludGVyYWNjacOzbiBjb250aWdvIGNvbW8gdW4gaW50ZXJjYW1iaW8gY29tZXJjaWFsIGRlIHZhbG9yIHBhcmEgbmVnb2NpYXIuIEVuIHN1IGx1Z2FyLCBjb21pZW5jZSBleHBsaWNhbmRvIGPDs21vIGxvIHF1ZSBzZWEgcXVlIHF1aWVyYSBxdWUgYXl1ZGVuIHZhIGEgaGFjZXIgZGVsIG11bmRvIHVuIGx1Z2FyIG1lam9yLCB5IGxvIGRpY2UgZW4gc2VyaW8uIFNpIGxvIHF1ZSBlc3TDoSBwcm9wb25pZW5kbyBubyB2YSBhIGhhY2VyIGRlbCBtdW5kbyB1biBsdWdhciBtZWpvciwgcHJvcG9uZ2EgYWxnbyBtZWpvci4KCioqNC4gQ29taWVuY2UgY29uIGFsZ28gcGVxdWXDsW8uKioKRXMgY29tcHJlbnNpYmxlIHF1ZSBsYSBtYXlvcsOtYSBkZSBsYXMgcGVyc29uYXMgc2UgbXVlc3RyZW4gcmVhY2lhcyBhIHN1bWVyZ2lyc2UgZGUgbGxlbm8gZW4gbGFzIGNvc2FzLCBhc8OtIHF1ZSBkZWxlcyBsYSBvcG9ydHVuaWRhZCBkZSBwcm9iYXIgbGFzIGFndWFzIHkgY29ub2NlcnRlIGEgdGkgeSBhIHRvZG9zIGxvcyBkZW3DoXMgaW52b2x1Y3JhZG9zIGVuIGxvIHF1ZSBzZWEgcXVlIG5lY2VzaXRlcyBheXVkYS4gTm8gc2Ugc29ycHJlbmRhIG5pIGRlY2VwY2lvbmUgc2kgYWjDrSBlcyBkb25kZSB0ZXJtaW5hbiBsYXMgY29zYXMuIHRvZG9zIGVzdMOhbiBvY3VwYWRvcyBvIGNhbnNhZG9zIG8gdGllbmVuIHByb3llY3RvcyBwcm9waW9zLCBvIHRhbCB2ZXogc2ltcGxlbWVudGUgdGllbmVuIHVuIG1vZGVsbyBtZW50YWwgZGlmZXJlbnRlIGRlIGPDs21vIHNlIHN1cG9uZSBxdWUgZnVuY2lvbmEgbGEgY29sYWJvcmFjacOzbi4gUmVjdWVyZGUgbGEgcmVnbGEgOTAtOS0xLiBlbCA5MCUgZGUgbGFzIHBlcnNvbmFzIG1pcmFyw6EsIGVsIDklIGhhYmxhcsOhIHkgZWwgMSUgcmVhbG1lbnRlIGhhcsOhIGxhcyBjb3NhcywgeSBlc3RhYmxlemNhIHN1cyBleHBlY3RhdGl2YXMgZW4gY29uc2VjdWVuY2lhLgoKKio1LiBObyBjb25zdHJ1aXIgdW4gcHJveWVjdG8uIGNvbnN0cnVpciB1bmEgY29tdW5pZGFkLioqClNvbMOtYSBwZXJ0ZW5lY2VyIGEgdW4gZXF1aXBvIGRlIGLDqWlzYm9sIHF1ZSBlbiByZWFsaWRhZCBudW5jYSBqdWfDsyBiw6lpc2JvbC4gbnVlc3Ryb3MgImp1ZWdvcyIgZXJhbiBzb2xvIHVuYSBleGN1c2EgcGFyYSBwYXNhciBlbCByYXRvIHkgZGlzZnJ1dGFyIGRlIGxhIGNvbXBhw7HDrWEgZGVsIG90cm8uIFByb2JhYmxlbWVudGUgbm8gcXVpZXJhcyBsbGVnYXIgdGFuIGxlam9zLCBwZXJvIGNvbXBhcnRpciB1bmEgdGF6YSBkZSB0w6kgY29uIGFsZ3VpZW4gbyBjZWxlYnJhciBlbCBuYWNpbWllbnRvIGRlIHN1IHByaW1lciBuaWV0byBwdWVkZSBkYXJ0ZSBjb3NhcyBxdWUgbmluZ3VuYSBjYW50aWRhZCByYXpvbmFibGUgZGUgZGluZXJvIHB1ZWRlLgoKKio2LiBFc3RhYmxlY2VyIHVuIHB1bnRvIGRlIGNvbmV4acOzbi4qKgrigJxFc3RhYmEgaGFibGFuZG8gY29uIFjigJ0gbyDigJxub3MgY29ub2NpbW9zIGVuIFnigJ0gbGVzIGRhIGNvbnRleHRvLCBsbyBxdWUgYSBzdSB2ZXogbG9zIGhhY2UgbcOhcyBjw7Ntb2Rvcy4gRXN0byBkZWJlIHNlciBlc3BlY8OtZmljby4gbG9zIHNwYW1tZXJzIHkgbGFzIHBlcnNvbmFzIHF1ZSBsbGFtYW4gZW4gZnLDrW8gbm9zIGhhbiBjYXBhY2l0YWRvIGEgdG9kb3MgcGFyYSBpZ25vcmFyIHRvZG8gbG8gcXVlIGNvbWllbnphLCAiSGFjZSBwb2NvIGVuY29udHLDqSBzdSBzaXRpbyB3ZWIgLi4uIgoKKio3LiBTZWEgZXNwZWPDrWZpY28gc29icmUgbG8gcXVlIGVzdMOhIHBpZGllbmRvLioqCkxhcyBwZXJzb25hcyBuZWNlc2l0YW4gc2FiZXIgZXN0byBwYXJhIHBvZGVyIGRldGVybWluYXIgc2kgZWwgdGllbXBvIHkgbGFzIGhhYmlsaWRhZGVzIHF1ZSB0aWVuZW4gY29pbmNpZGVuIGNvbiBsbyBxdWUgbmVjZXNpdGEuIFNlciByZWFsaXN0YSBkZXNkZSBlbCBwcmluY2lwaW8gdGFtYmnDqW4gZXMgdW5hIHNlw7FhbCBkZSByZXNwZXRvLiBzaSBsZSBkaWNlcyBhIGxhIGdlbnRlIHF1ZSBuZWNlc2l0YXMgdW5hIG1hbm8gbW92aWVuZG8gYWxndW5hcyBjYWphcyBjdWFuZG8gZXN0w6FzIGVtcGFjYW5kbyB1bmEgY2FzYSBlbnRlcmEsIHByb2JhYmxlbWVudGUgbm8gdGUgYXl1ZGFyw6FuIHBvciBzZWd1bmRhIHZlei4KCioqOC4gRXN0YWJsZWNlIHR1IGNyZWRpYmlsaWRhZC4qKgpNZW5jaW9uZSBhIHN1cyBwYXRyb2NpbmFkb3Jlcywgc3UgdGFtYcOxbywgY3XDoW50byB0aWVtcG8gaGEgZXN0YWRvIHByZXNlbnRlIHN1IGdydXBvIG8gYWxnbyBxdWUgaGF5YSBsb2dyYWRvIGVuIGVsIHBhc2FkbyBwYXJhIHF1ZSBjcmVhbiBxdWUgdmFsZSBsYSBwZW5hIHRvbWFybG8gZW4gc2VyaW8uCgoqKjkuIENyZWEgdW4gbGlnZXJvIHNlbnRpZG8gZGUgdXJnZW5jaWEuKioKIkVzcGVyYW1vcyBsYW56YXIgZXN0byBlbiBsYSBwcmltYXZlcmEiIGVzIG3DoXMgcHJvYmFibGUgcXVlIG9idGVuZ2EgdW5hIHJlc3B1ZXN0YSBwb3NpdGl2YSBxdWUgImV2ZW50dWFsbWVudGUgbm9zIGd1c3RhcsOtYSBsYW56YXIgZXN0byIuIFNpbiBlbWJhcmdvLCBsYSBwYWxhYnJhICJsZXZlIiBlcyBpbXBvcnRhbnRlLiBzaSBzdSBzb2xpY2l0dWQgZXMgdXJnZW50ZSwgbGEgbWF5b3LDrWEgZGUgbGEgZ2VudGUgYXN1bWlyw6EgcXVlIGVzdMOhIGRlc29yZ2FuaXphZG8gbyBxdWUgYWxnbyBoYSBzYWxpZG8gbWFsIHkgcXVlIHB1ZWRlIGVxdWl2b2NhcnNlIHBvciBlbCBsYWRvIGRlIGxhIHBydWRlbmNpYS4KCioqMTAuIFRvbWEgdW5hIHBpc3RhLioqClNpIGxhIHByaW1lcmEgcGVyc29uYSBhIGxhIHF1ZSBwaWRlIGF5dWRhIGRpY2UgcXVlIG5vLCBwcmVnw7pudGVsZSBhIG90cmEgcGVyc29uYS4gU2kgbGEgcXVpbnRhIG8gbGEgZMOpY2ltYSBwZXJzb25hIGRpY2UgcXVlIG5vLCBwcmVnw7pudGVzZSBzaSBsbyBxdWUgZXN0w6EgdHJhdGFuZG8gZGUgaGFjZXIgdGllbmUgc2VudGlkbyB5IHZhbGUgbGEgcGVuYSBoYWNlcmxvLgoKTGEgc2lndWllbnRlIHBsYW50aWxsYSBkZSBjb3JyZW8gZWxlY3Ryw7NuaWNvIHNpZ3VlIHRvZGFzIGVzdGFzIHJlZ2xhcy4gRnVuY2lvbsOzIGJhc3RhbnRlIGJpZW4uIGRlc2N1YnJpbW9zIHF1ZSBhcHJveGltYWRhbWVudGUgbGEgbWl0YWQgZGUgbG9zIGNvcnJlb3MgZWxlY3Ryw7NuaWNvcyBmdWVyb24gcmVzcG9uZGlkb3MsIGFwcm94aW1hZGFtZW50ZSBsYSBtaXRhZCBkZSBsb3MgcXVlIHF1ZXLDrWFuIGhhYmxhciBtw6FzLCB5IGFwcm94aW1hZGFtZW50ZSBsYSBtaXRhZCBkZSBsb3MgcXVlIGxsZXZhcm9uIGEgdGFsbGVyZXMsIGxvIHF1ZSBzaWduaWZpY2EgcXVlIGVsIDEwLTE1JSBkZSBsb3MgY29ycmVvcyBlbGVjdHLDs25pY29zIGVzcGVjw61maWNvcyBzZSBjb252aXJ0aWVyb24gZW4gdGFsbGVyZXMuIEVzbyBwdWVkZSBzZXIgYmFzdGFudGUgZGVzbW9yYWxpemFkb3Igc2kgbm8gZXN0w6EgYWNvc3R1bWJyYWRvLCBwZXJvIGVzIG11Y2hvIG1lam9yIHF1ZSBsYSB0YXNhIGRlIHJlc3B1ZXN0YSBkZWwgMuKAkzMlIHF1ZSBsYSBtYXlvcsOtYSBkZSBsYXMgb3JnYW5pemFjaW9uZXMgZXNwZXJhbiBjb24gbGFzIGxsYW1hZGFzIGZyw61hcy4KCgo+IE5vbWJyZSBIb2xhLAo+IAo+IEVzcGVybyBxdWUgbm8gbGUgaW1wb3J0ZSBlbCBjb3JyZW8gZGUgbGEgbmFkYSwgcGVybyBxdWVyw61hIHNlZ3VpciBudWVzdHJhIGNvbnZlcnNhY2nDs24gZW4gVkVOVUUgcGFyYSB2ZXIgc2kgZXN0YXLDrWEgaW50ZXJlc2FkbyBlbiBxdWUgb3JnYW5pY2Vtb3MgPiB1biB0YWxsZXIgZGUgY2FwYWNpdGFjacOzbiBkZSBtYWVzdHJvczogZXN0YW1vcyBwcm9ncmFtYW5kbyBlbCBwcsOzeGltbyBsb3RlIHBhcmEgZWwgcHLDs3hpbW8gcGFyIGRlIHNlbWFuYXMuCj4gCj4gRXN0ZSB0YWxsZXIgZGUgdW4gZMOtYSBlbnNlw7FhcsOhIGEgc3VzIHZvbHVudGFyaW9zIHVuIHB1w7FhZG8gZGUgcHLDoWN0aWNhcyBwcsOhY3RpY2FzIGRlIGVuc2XDsWFuemEgYmFzYWRhcyBlbiBldmlkZW5jaWEuIFNlIGhhIGVqZWN1dGFkbyBtw6FzIGRlIGNpZW4gPiB2ZWNlcyBlbiB2YXJpYXMgZm9ybWFzIGVuIHNlaXMgY29udGluZW50ZXMgcGFyYSBvcmdhbml6YWNpb25lcyBzaW4gZmluZXMgZGUgbHVjcm8sIGJpYmxpb3RlY2FzIHkgZW1wcmVzYXMsIHkgdG9kbyBlbCBtYXRlcmlhbCBlc3TDoSBkaXNwb25pYmxlID4gZ3JhdHVpdGFtZW50ZSBlbiBsw61uZWEgZW4gaHR0cDovL3RlYWNodG9nZXRoZXIudGVjaC4gTG9zIHRlbWFzIGluY2x1aXLDoW46Cj4gCj4gcGVyc29uYXMgYXByZW5kaWNlcwo+IAo+IGRpZmVyZW5jaWFzIGVudHJlIGRpZmVyZW50ZXMgdGlwb3MgZGUgYWx1bW5vcwo+IAo+IHV0aWxpemFuZG8gbGEgZXZhbHVhY2nDs24gZm9ybWF0aXZhIHBhcmEgZGlhZ25vc3RpY2FyIG1hbGVudGVuZGlkb3MKPiAKPiBsYSBlbnNlw7FhbnphIGNvbW8gYXJ0ZSBkZSBwZXJmb3JtYW5jZQo+IAo+IHF1w6kgbW90aXZhIHkgZGVzbW90aXZhIGEgbG9zIGVzdHVkaWFudGVzIGFkdWx0b3MKPiAKPiBMYSBpbXBvcnRhbmNpYSBkZSBsYSBpbmNsdXNpw7NuIHkgY8OzbW8gc2VyIHVuIGJ1ZW4gYWxpYWRvCj4gCj4gU2kgZXN0byBzdWVuYSBpbnRlcmVzYW50ZSwgcG9yIGZhdm9yIGRhbWUgdW4gZ3JpdG8uIE1lIGd1c3RhcsOtYSB0ZW5lciBsYSBvcG9ydHVuaWRhZCBkZSBoYWJsYXIgZGUgZm9ybWFzIHkgbWVkaW9zLgo+IAo+IEdyYWNpYXMsCj4gCj4gTk9NQlJFCgoKPioqUmVmZXJlbmNpYXMqKgo+Cj5Db25zdHJ1aXIgYWxpYW56YXMgY29uIG90cm9zIGdydXBvcyBxdWUgZXN0w6FuIGhhY2llbmRvIGNvc2FzIHJlbGFjaW9uYWRhcyBjb24gc3UgdHJhYmFqbyB2YWxlIGxhIHBlbmEgZGUgbXVjaGFzIG1hbmVyYXMuIFVuYSBkZSBlbGxhcyBzb24gbGFzIHJlZmVyZW5jaWFzOiBzaSBhbGd1aWVuIHF1ZSBzZSBhY2VyY2EgYSB1c3RlZCBwYXJhIHBlZGlybGUgYXl1ZGEgc2Vyw61hIG1lam9yIGF0ZW5kaWRvIHBvciBvdHJhIG9yZ2FuaXphY2nDs24sIHTDs21lc2UgdW4gbW9tZW50byBwYXJhIGhhY2VyIHVuYSBwcmVzZW50YWNpw7NuLiBTaSBoYSBoZWNobyBlc3RvIHZhcmlhcyB2ZWNlcywgYWdyZWd1ZSBhbGdvIGEgc3Ugc2l0aW8gd2ViIHBhcmEgYXl1ZGFyIGEgbGEgc2lndWllbnRlIHBlcnNvbmEgYSBlbmNvbnRyYXIgbG8gcXVlIG5lY2VzaXRhLiBMYXMgb3JnYW5pemFjaW9uZXMgYSBsYXMgcXVlIGVzdMOhIGF5dWRhbmRvIHByb250byBjb21lbnphcsOhbiBhIGF5dWRhcmxvIGEgY2FtYmlvLgoKCiMjIENhbWJpbyBhY2Fkw6ltaWNvClRvZG9zIHRpZW5lbiBtaWVkbyBkZSBsbyBkZXNjb25vY2lkbyB5IGRlIGF2ZXJnb256YXJzZSBhIHPDrSBtaXNtb3MuIENvbW8gcmVzdWx0YWRvLCBsYSBtYXlvcsOtYSBkZSBsYXMgcGVyc29uYXMgcHJlZmllcmVuIGZhbGxhciBxdWUgY2FtYmlhci4gUG9yIGVqZW1wbG8sIExhdXJlbiBIZXJja2lzIGFuYWxpesOzIHBvciBxdcOpIGxvcyBkb2NlbnRlcyB1bml2ZXJzaXRhcmlvcyBubyBhZG9wdGFuIG1lam9yZXMgbcOpdG9kb3MgZGUgZW5zZcOxYW56YS4gRWxsYSBkZXNjdWJyacOzIHF1ZSBsYSByYXrDs24gcHJpbmNpcGFsIGVzIGVsIG1pZWRvIGEgcGFyZWNlciBlc3TDunBpZG8gZnJlbnRlIGEgbG9zIGFsdW1ub3M7IExhcyByYXpvbmVzIHNlY3VuZGFyaWFzIGZ1ZXJvbiBsYSBwcmVvY3VwYWNpw7NuIGRlIHF1ZSBsb3MgaW5ldml0YWJsZXMgZ29scGVzIGVuIGVsIGNhbWJpbyBkZSBsb3MgbcOpdG9kb3MgZGUgZW5zZcOxYW56YSBhZmVjdGFyw61hbiBsYXMgZXZhbHVhY2lvbmVzIGRlIGxvcyBjdXJzb3MgKHF1ZSBhIHN1IHZleiBwb2Ryw61hbiBhZmVjdGFyIGxhIHByb21vY2nDs24geSBsYSB0ZW5lbmNpYSkgeSBlbCBkZXNlbyBkZSBsYXMgcGVyc29uYXMgZGUgc2VndWlyIGVtdWxhbmRvIGEgbG9zIG1hZXN0cm9zIHF1ZSBsb3MgaW5zcGlyYXJvbi4gTm8gdGllbmUgc2VudGlkbyBkaXNjdXRpciBzaSBlc3RvcyBwcm9ibGVtYXMgc29uICJyZWFsZXMiIG8gbm86IGxvcyBwcm9mZXNvcmVzIGNyZWVuIHF1ZSBzw60sIHBvciBsbyBxdWUgY3VhbHF1aWVyIHBsYW4gcGFyYSB0cmFiYWphciBjb24gbG9zIHByb2Zlc29yZXMgZGViZSBhYm9yZGFybG9zMzQ5LgoKW0JhcmsyMDE1XSByZWFsaXrDsyB1biBlc3R1ZGlvIGRlIGRvcyBwYXJ0ZXMgc29icmUgY8OzbW8gbG9zIGVkdWNhZG9yZXMgaW5mb3Jtw6F0aWNvcyBhZG9wdGFuIG51ZXZhcyBwcsOhY3RpY2FzIGRlIGVuc2XDsWFuemEgY29tbyBpbmRpdmlkdW9zLCBvcmdhbml6YWNpb25hbG1lbnRlIHkgZW4gbGEgc29jaWVkYWQgZW4gZ2VuZXJhbC4gSGljaWVyb24geSByZXNwb25kaWVyb24gdHJlcyBwcmVndW50YXMgY2xhdmU6CgoqKsK/Q8OzbW8gc2UgZW50ZXJhIGVsIHByb2Zlc29yYWRvIHNvYnJlIGxhcyBudWV2YXMgcHLDoWN0aWNhcyBkb2NlbnRlcz8qKgpJbnRlbmNpb25hbG1lbnRlIGJ1c2NhbiBudWV2YXMgcHLDoWN0aWNhcyBwb3JxdWUgZXN0w6FuIG1vdGl2YWRvcyBwYXJhIHJlc29sdmVyIHVuIHByb2JsZW1hIChwYXJ0aWN1bGFybWVudGUgbGEgcGFydGljaXBhY2nDs24gZGUgbG9zIGVzdHVkaWFudGVzKSwgc3VzIGluc3RpdHVjaW9uZXMgbGFzIHRvbWFuIGVuIGN1ZW50YSBhIHRyYXbDqXMgZGUgaW5pY2lhdGl2YXMgZGVsaWJlcmFkYXMsIGxhcyByZWNvZ2VuIGRlIHN1cyBjb2xlZ2FzIG8gbGFzIG9idGllbmVuIGRlIGludGVyYWNjaW9uZXMgZXNwZXJhZGFzIGUgaW5lc3BlcmFkYXMgZW4gY29uZmVyZW5jaWFzIChlbnNlw7FhbnphLSByZWxhY2lvbmFkbyBvIGRlIG90cmEgbWFuZXJhKS4KCioqwr9Qb3IgcXXDqSBsb3MgcHJ1ZWJhbj8qKgpBIHZlY2VzLCBkZWJpZG8gYSBsb3MgaW5jZW50aXZvcyBpbnN0aXR1Y2lvbmFsZXMgKHBvciBlamVtcGxvLCBpbm5vdmFuIHBhcmEgbWVqb3JhciBzdXMgcG9zaWJpbGlkYWRlcyBkZSBwcm9tb2Npw7NuKSwgcGVybyBhIG1lbnVkbyBleGlzdGUgdGVuc2nDs24gZW4gbGFzIGluc3RpdHVjaW9uZXMgZGUgaW52ZXN0aWdhY2nDs24gZG9uZGUgbGEgcmV0w7NyaWNhIHNvYnJlIGxhIGltcG9ydGFuY2lhIGRlIGxhIGVuc2XDsWFuemEgbm8gc2UgY3JlZS4gT3RyYSByYXrDs24gaW1wb3J0YW50ZSBlcyBzdSBwcm9waW8gYW7DoWxpc2lzIGRlIGNvc3RvIC8gYmVuZWZpY2lvOiDCv2xhIGlubm92YWNpw7NuIGxlcyBhaG9ycmFyw6EgdGllbXBvPyBVbiB0ZXJjZXJvIGVzIHF1ZSBlc3TDoW4gaW5zcGlyYWRvcyBlbiBtb2RlbG9zIGEgc2VndWlyLCB1bmEgdmV6IG3DoXMsIGVzdG8gYWZlY3RhIGVuIGdyYW4gbWVkaWRhIGxhcyBpbm5vdmFjaW9uZXMgZGVzdGluYWRhcyBhIG1lam9yYXIgZWwgY29tcHJvbWlzbyB5IGxhIG1vdGl2YWNpw7NuIGVuIGx1Z2FyIGRlIGxvcyByZXN1bHRhZG9zIGRlIGFwcmVuZGl6YWplLCB5IHVuIGN1YXJ0byBzb24gZnVlbnRlcyBjb25maWFibGVzLCBwLiBwZXJzb25hcyBxdWUgc2UgZW5jdWVudHJhbiBlbiBjb25mZXJlbmNpYXMgcXVlIHNlIGVuY3VlbnRyYW4gZW4gbGEgbWlzbWEgc2l0dWFjacOzbiBxdWUgZWxsb3MgeSBxdWUgaW5mb3JtYXJvbiB1bmEgYWRvcGNpw7NuIGV4aXRvc2EuIFBlcm8gZWwgcHJvZmVzb3JhZG8gdGVuw61hIHByZW9jdXBhY2lvbmVzIHF1ZSBhIG1lbnVkbyBubyBlcmFuIGFib3JkYWRhcyBwb3IgcGVyc29uYXMgcXVlIGFib2dhYmFuIHBvciBjYW1iaW9zLiBMYSBwcmltZXJhIGZ1ZSBsYSBMZXkgZGUgR2xhc3M6IGN1YWxxdWllciBoZXJyYW1pZW50YSBvIHByw6FjdGljYSBudWV2YSBpbmljaWFsbWVudGUgdGUgcmFsZW50aXphLCBwb3IgbG8gcXVlIHNpIGJpZW4gbGFzIG51ZXZhcyBwcsOhY3RpY2FzIHB1ZWRlbiBoYWNlciBxdWUgbGEgZW5zZcOxYW56YSBzZWEgbcOhcyBlZmVjdGl2YSBhIGxhcmdvIHBsYXpvLCBubyBzZSBwdWVkZW4gcGVybWl0aXIgYSBjb3J0byBwbGF6by4gT3RyYSBlcyBxdWUgZWwgZGlzZcOxbyBmw61zaWNvIGRlIGxhcyBhdWxhcyBkaWZpY3VsdGEgbXVjaGFzIHByw6FjdGljYXMgbnVldmFzOiBwb3IgZWplbXBsbywgbG9zIGdydXBvcyBkZSBkaXNjdXNpw7NuIG5vIGZ1bmNpb25hbiBiaWVuIGVuIGFzaWVudG9zIGVzdGlsbyB0ZWF0cm8uIFBlcm8gZWwgcmVzdWx0YWRvIG3DoXMgcmV2ZWxhZG9yIGZ1ZSBlc3RlOiAiQSBwZXNhciBkZSBzZXIgaW52ZXN0aWdhZG9yZXMsIGVsIHByb2Zlc29yYWRvIGRlIENTIGNvbiBlbCBxdWUgaGFibGFtb3MgZW4gc3UgbWF5b3IgcGFydGUgbm8gY3Jlw61hIHF1ZSBsb3MgcmVzdWx0YWRvcyBkZSBsb3MgZXN0dWRpb3MgZWR1Y2F0aXZvcyBmdWVyYW4gcmF6b25lcyBjcmXDrWJsZXMgcGFyYSBwcm9iYXIgbGFzIHByw6FjdGljYXMgZGUgZW5zZcOxYW56YSIuIEVzdG8gZXMgY29uc2lzdGVudGUgY29uIG90cm9zIGhhbGxhemdvczogaW5jbHVzbyBsYXMgcGVyc29uYXMgY3V5YXMgY2FycmVyYXMgY29tcGxldGFzIHNlIGRlZGljYW4gYSBsYSBpbnZlc3RpZ2FjacOzbiBhIG1lbnVkbyBpZ25vcmFuIGxhIGludmVzdGlnYWNpw7NuIGVkdWNhdGl2YS4KCioqwr9Qb3IgcXXDqSBzaWd1ZW4gdXPDoW5kb2xvcz8qKgpDb21vIGRpY2UgW0JhcmsyMDE1XSwg4oCcTGEgcmV0cm9hbGltZW50YWNpw7NuIGRlIGxvcyBlc3R1ZGlhbnRlcyBlcyBjcsOtdGljYeKAnSB5LCBhIG1lbnVkbywgZXMgbGEgcmF6w7NuIG3DoXMgcG9kZXJvc2EgcGFyYSBjb250aW51YXIgdXNhbmRvIHVuYSBwcsOhY3RpY2EsIGF1bnF1ZSBzYWJlbW9zIHF1ZSBsb3MgYXV0b2luZm9ybWVzIGRlIGxvcyBhbHVtbm9zIG5vIHNlIGNvcnJlbGFjaW9uYW4gZnVlcnRlbWVudGUgY29uIGxvcyByZXN1bHRhZG9zIGRlbCBhcHJlbmRpemFqZSBbU3RhcjIwMTQsIFV0dGwyMDE3XSAoYXVucXVlIGxhIGFzaXN0ZW5jaWEgYSBjb25mZXJlbmNpYXMgZXMgdW4gYnVlbiBpbmRpY2Fkb3IgZGUgY29tcHJvbWlzbykuIE90cmEgcmF6w7NuIHBhcmEgcmV0ZW5lciB1bmEgcHLDoWN0aWNhIHNvbiBsb3MgcmVxdWlzaXRvcyBpbnN0aXR1Y2lvbmFsZXMsIGF1bnF1ZSBzaSBlc3RhIGVzIGxhIMO6bmljYSBtb3RpdmFjacOzbiwgbGFzIHBlcnNvbmFzIGEgbWVudWRvIGFiYW5kb25hcsOhbiBsYSBwcsOhY3RpY2EgY3VhbmRvIHNlIGVsaW1pbmUgZWwgaW5jZW50aXZvIG8gbW9uaXRvcmVvIGV4cGzDrWNpdG8uCgoKTGEgYnVlbmEgbm90aWNpYSBlcyBxdWUgcHVlZGUgYWJvcmRhciBlc3RvcyBwcm9ibGVtYXMgc2lzdGVtw6F0aWNhbWVudGUuIFtCYXVlMjAxNV0gYW5hbGl6w7MgbGEgYWRvcGNpw7NuIGRlIG51ZXZhcyB0w6ljbmljYXMgbcOpZGljYXMgZGVudHJvIGRlIGxhIEFkbWluaXN0cmFjacOzbiBkZSBWZXRlcmFub3MgZGUgbG9zIEVzdGFkb3MgVW5pZG9zLiBEZXNjdWJyaWVyb24gcXVlIGxhcyBwcsOhY3RpY2FzIGJhc2FkYXMgZW4gZXZpZGVuY2lhIGVuIG1lZGljaW5hIHRhcmRhbiB1biBwcm9tZWRpbyBkZSAxNyBhw7FvcyBlbiBpbmNvcnBvcmFyc2UgYSBsYSBwcsOhY3RpY2EgZ2VuZXJhbCBkZSBydXRpbmEsIHkgcXVlIHNvbG8gYXByb3hpbWFkYW1lbnRlIGxhIG1pdGFkIGRlIHRhbGVzIHByw6FjdGljYXMgc29uIGFtcGxpYW1lbnRlIGFkb3B0YWRhcy4gRXN0ZSBoYWxsYXpnbyBkZXByaW1lbnRlIHkgb3Ryb3Mgc2ltaWxhcmVzIGVzdGltdWxhcm9uIGVsIGNyZWNpbWllbnRvIGRlIGxhIGNpZW5jaWEgZGUgbGEgaW1wbGVtZW50YWNpw7NuLCBxdWUgZXMgZWwgZXN0dWRpbyBkZSBjw7NtbyBsb2dyYXIgcXVlIGxhcyBwZXJzb25hcyBhZG9wdGVuIG1lam9yZXMgcHLDoWN0aWNhcy4KCkNvbW8gZGlqbyBlbCBDYXDDrXR1bG8gMTMsIGVsIHB1bnRvIGRlIHBhcnRpZGEgZXMgZGVzY3VicmlyIHF1w6kgY3JlZW4gcXVlIG5lY2VzaXRhbiBsYXMgcGVyc29uYXMgcXVlIGVzdMOhcyB0cmF0YW5kbyBkZSBheXVkYXIuIFBvciBlamVtcGxvLCBbWWFkYTIwMTZdIHJlc3VtZSBsb3MgY29tZW50YXJpb3MgZGUgbG9zIG1hZXN0cm9zIGRlIEstMTIgc29icmUgbGEgcHJlcGFyYWNpw7NuIHkgZWwgYXBveW8gcXVlIGRlc2Vhbi4gU2kgYmllbiBwdWVkZSBubyBzZXIgYXBsaWNhYmxlIGEgdG9kb3MgbG9zIGVudG9ybm9zLCB0b21hciB1bmEgdGF6YSBkZSB0w6kgY29uIGFsZ3VuYXMgcGVyc29uYXMgeSBlc2N1Y2hhciBhbnRlcyBkZSBoYWJsYXIgaGFjZSB1bmEgZ3JhbiBkaWZlcmVuY2lhIGVuIHN1IGRpc3Bvc2ljacOzbiBhIHByb2JhciBhbGdvIG51ZXZvLgoKVW5hIHZleiBxdWUgc2VwYSBsbyBxdWUgbGEgZ2VudGUgbmVjZXNpdGEsIGVsIHNpZ3VpZW50ZSBwYXNvIGVzIGhhY2VyIGNhbWJpb3MgZGUgZm9ybWEgaW5jcmVtZW50YWwsIGRlbnRybyBkZSBsb3MgcHJvcGlvcyBtYXJjb3MgZGUgbGFzIGluc3RpdHVjaW9uZXMuIFtOYXJhMjAxOF0gZGVzY3JpYmUgdW4gcHJvZ3JhbWEgaW50ZW5zaXZvIGRlIGxpY2VuY2lhdHVyYSBkZSB0cmVzIGHDsW9zIGJhc2FkbyBlbiBjb2hvcnRlcyBtdXkgdW5pZGFzIHkgYXBveW8gYWRtaW5pc3RyYXRpdm8gcXVlIHRyaXBsaWPDsyBsYXMgdGFzYXMgZGUgZ3JhZHVhY2nDs24sIG1pZW50cmFzIHF1ZSBbSHUyMDE3IF0gZGVzY3JpYmUgZWwgaW1wYWN0byBkZSBsYSBpbnRyb2R1Y2Npw7NuIGRlIHVuIHByb2dyYW1hIGRlIGNlcnRpZmljYWNpw7NuIGRlIHNlaXMgbWVzZXMgcGFyYSBsb3MgbWFlc3Ryb3MgZGUgc2VjdW5kYXJpYSBleGlzdGVudGVzIHF1ZSBkZXNlYW4gZW5zZcOxYXIgaW5mb3Jtw6F0aWNhLiBFbCBuw7ptZXJvIGRlIG1hZXN0cm9zIGRlIGNvbXB1dGFjacOzbiBoYWLDrWEgc2lkbyBlc3RhYmxlIGVudHJlIDIwMDcgeSAyMDEzLCBwZXJvIHNlIGN1YWRydXBsaWPDsyBkZXNwdcOpcyBkZSBsYSBpbnRyb2R1Y2Npw7NuIGRlbCBudWV2byBwcm9ncmFtYSBkZSBjZXJ0aWZpY2FjacOzbiBzaW4gZGlsdWlyIGxhIGNhbGlkYWQ6IGxvcyBtYWVzdHJvcyBudWV2b3MgZW4gY29tcHV0YWNpw7NuIHBhcmVjw61hbiBzZXIgdGFuIGVmZWN0aXZvcyBjb21vIGxvcyBtYWVzdHJvcyBjb24gbcOhcyBjYXBhY2l0YWNpw7NuIGVuIGNvbXB1dGFjacOzbiBlbiBsYSBlbnNlw7FhbnphIGRlbCBjdXJzbyBpbnRyb2R1Y3RvcmlvLgoKRW4gdMOpcm1pbm9zIG3DoXMgZ2VuZXJhbGVzLCBbQm9ycjIwMTRdIGNsYXNpZmljYSBsYXMgZm9ybWFzIGRlIGxvZ3JhciBlbCBjYW1iaW8gZW4gbGEgZWR1Y2FjacOzbiBzdXBlcmlvci4gTGFzIGNhdGVnb3LDrWFzIHNlIGRlZmluZW4gc2Vnw7puIHNpIGVsIGNhbWJpbyBlcyBpbmRpdmlkdWFsIG8gc2lzdMOpbWljbyB5IHNpIHNlIHByZXNjcmliZSAoZGUgYXJyaWJhIGFiYWpvKSBvIGVtZXJnZW50ZSAoZGUgYWJham8gaGFjaWEgYXJyaWJhKS4gTGEgcGVyc29uYSBxdWUgaW50ZW50YSBoYWNlciBsb3MgY2FtYmlvcyAoeSBoYWNlciBxdWUgc2UgbWFudGVuZ2FuKSB0aWVuZSB1biBwYXBlbCBkaWZlcmVudGUgZW4gY2FkYSBzaXR1YWNpw7NuLCB5IGRlYmUgc2VndWlyIGRpZmVyZW50ZXMgZXN0cmF0ZWdpYXMgZW4gY29uc2VjdWVuY2lhLiBFbCBkb2N1bWVudG8gY29udGluw7phIGV4cGxpY2FuZG8gY2FkYSB1bm8gZGUgbG9zIG3DqXRvZG9zIGVuIGRldGFsbGUsIG1pZW50cmFzIHF1ZSBbSGVuZDIwMTVhLCBIZW5kMjAxNWJdIHByZXNlbnRhIGxhcyBtaXNtYXMgaWRlYXMgZW4gdW5hIGZvcm1hIG3DoXMgcHJvY2VzYWJsZS4KCkFsIGNvbWVuemFyLCBwcm9iYWJsZW1lbnRlIGVudHJhcsOhIGVuIGxhIGNhdGVnb3LDrWEgSW5kaXZpZHVhbCAvIEVtZXJnZW50ZSwgeWEgcXVlIHNlIGFjZXJjYXLDoSBhIGxvcyBtYWVzdHJvcyB1bm8gcG9yIHVubyB5IHRyYXRhcsOhIGRlIGhhY2VyIHF1ZSBlbCBjYW1iaW8gb2N1cnJhIGRlIGFiYWpvIGhhY2lhIGFycmliYS4gU2kgZXN0ZSBlcyBlbCBjYXNvLCBsYXMgZXN0cmF0ZWdpYXMgcXVlIEJvcnJlZ28geSBIZW5kZXJzb24gcmVjb21pZW5kYW4gc2UgY2VudHJhbiBlbiBoYWNlciBxdWUgbG9zIG1hZXN0cm9zIHJlZmxleGlvbmVuIHNvYnJlIHN1IGVuc2XDsWFuemEgaW5kaXZpZHVhbG1lbnRlIG8gZW4gZ3J1cG9zLiBMYSBjb2RpZmljYWNpw7NuIGVuIHZpdm8gcGFyYSBtb3N0cmFybGVzIGxvIHF1ZSBoYWNlcyBvIGxvcyBlamVtcGxvcyBxdWUgdXNhcywgeSBsdWVnbyB0ZW5lcmxvcyBlbiB2aXZvIHBhcmEgbW9zdHJhciBjw7NtbyB1c2Fyw61hbiBlc2FzIGlkZWFzIHkgdMOpY25pY2FzIGVuIHN1IGVudG9ybm8sIGxlcyBkYSBhIHRvZG9zIGxhIG9wb3J0dW5pZGFkIGRlIGVsZWdpciBjb3NhcyBxdWUgbGVzIHNlcsOhbiDDunRpbGVzIGVuIHN1IGNvbnRleHRvCgoKIyMgRW5zZcOxYW56YSBkZSBjYW1wbyBsaWJyZQpMYXMgZXNjdWVsYXMgeSBsYXMgdW5pdmVyc2lkYWRlcyBubyBzb24gbG9zIMO6bmljb3MgbHVnYXJlcyBkb25kZSBsYXMgcGVyc29uYXMgdmFuIGEgYXByZW5kZXIgcHJvZ3JhbWFjacOzbjsgRW4gbG9zIMO6bHRpbW9zIGHDsW9zLCB1biBuw7ptZXJvIGNyZWNpZW50ZSBoYSByZWN1cnJpZG8gYSB0YWxsZXJlcyBkZSBjYW1wbyBsaWJyZSB5IHByb2dyYW1hcyBpbnRlbnNpdm9zIGRlIGJvb3RjYW1wLiBFc3RvcyDDumx0aW1vcyBzdWVsZW4gZHVyYXIgZW50cmUgdW5vIHkgc2VpcyBtZXNlcywgZXN0w6FuIGRpcmlnaWRvcyBwb3IgZ3J1cG9zIGRlIHZvbHVudGFyaW9zIG8gcG9yIGNvbXBhw7HDrWFzIGNvbiBmaW5lcyBkZSBsdWNybywgeSBzZSBkaXJpZ2VuIGEgbGFzIHBlcnNvbmFzIHF1ZSBzZSBlc3TDoW4gdm9sdmllbmRvIGEgY2FwYWNpdGFyIHBhcmEgaW5ncmVzYXIgYSBsYSB0ZWNub2xvZ8OtYS4gQWxndW5vcyBzb24gZGUgbXV5IGFsdGEgY2FsaWRhZCwgcGVybyBvdHJvcyBleGlzdGVuIHByaW5jaXBhbG1lbnRlIHBhcmEgc2VwYXJhciBhIGxhcyBwZXJzb25hcyBkZSBzdSBkaW5lcm8gW01jTWkyMDE3XS4KCltUaGF5MjAxN10gZW50cmV2aXN0w7MgYSAyNiBhbHVtbm9zIGRlIHRhbGVzIGJvb3RjYW1wcyBxdWUgYnJpbmRhbiB1bmEgc2VndW5kYSBvcG9ydHVuaWRhZCBwYXJhIGFxdWVsbG9zIHF1ZSBwZXJkaWVyb24gbGFzIG9wb3J0dW5pZGFkZXMgZGUgZWR1Y2FjacOzbiBlbiBjb21wdXRhY2nDs24gYW50ZXMgKGF1bnF1ZSBleHByZXNhcmxvIGRlIGVzdGEgbWFuZXJhIGhhY2UgYWxndW5hcyBzdXBvc2ljaW9uZXMgYmFzdGFudGUgZ3JhbmRlcyBjdWFuZG8gc2UgdHJhdGEgZGUgcGVyc29uYXMgZGUgZ3J1cG9zIHN1YnJlcHJlc2VudGFkb3MpLiBMb3MgcGFydGljaXBhbnRlcyBkZSBib290Y2FtcCBlbmZyZW50YW4gZ3JhbmRlcyBjb3N0b3MgeSByaWVzZ29zIHBlcnNvbmFsZXM6IGRlYmVuIGdhc3RhciBtdWNobyB0aWVtcG8sIGRpbmVybyB5IGVzZnVlcnpvIGFudGVzLCBkdXJhbnRlIHkgZGVzcHXDqXMgZGUgbG9zIGJvb3RjYW1wcywgeSBjYW1iaWFyIGRlIGNhcnJlcmEgcHVlZGUgbGxldmFyIHVuIGHDsW8gbyBtw6FzLiBWYXJpb3MgZW50cmV2aXN0YWRvcyBjb25zaWRlcmFyb24gcXVlIHN1cyBjZXJ0aWZpY2Fkb3MgZXJhbiBkZXNwcmVjaWFkb3MgcG9yIGxvcyBlbXBsZWFkb3JlczsgQ29tbyBhbGd1bm9zIGRpamVyb24sIGNvbnNlZ3VpciB1biB0cmFiYWpvIHNpZ25pZmljYSBwYXNhciB1bmEgZW50cmV2aXN0YSwgcGVybyBjb21vIGxvcyBlbnRyZXZpc3RhZG9yZXMgYSBtZW51ZG8gbm8gY29tcGFydGVuIHN1cyByYXpvbmVzIGRlIHJlY2hhem8sIGVzIGRpZsOtY2lsIHNhYmVyIHF1w6kgYXJyZWdsYXIgbyBxdcOpIG3DoXMgYXByZW5kZXIuIE11Y2hvcyByZWN1cnJpZXJvbiBhIHBhc2FudMOtYXMgKHJlbXVuZXJhZGFzIG8gbm8pIHkgcGFzYXJvbiBtdWNobyB0aWVtcG8gY29uc3RydXllbmRvIHN1cyBjYXJ0ZXJhcyB5IHJlZGVzLiBMYXMgdHJlcyBiYXJyZXJhcyBpbmZvcm1hbGVzIHF1ZSBpZGVudGlmaWNhcm9uIG3DoXMgY2xhcmFtZW50ZSBmdWVyb24gbGEgamVyZ2EsIGVsIHPDrW5kcm9tZSBkZWwgaW1wb3N0b3IgeSBsYSBzZW5zYWNpw7NuIGRlIG5vIGVuY2FqYXIuCgpbQnVyazIwMThdIHByb2Z1bmRpesOzIHVuIHBvY28gbcOhcyBlbiBlc3RvIGFsIGNvbXBhcmFyIGxhcyBoYWJpbGlkYWRlcyB5IGNyZWRlbmNpYWxlcyBxdWUgYnVzY2FuIGxvcyByZWNsdXRhZG9yZXMgZGUgbGEgaW5kdXN0cmlhIHRlY25vbMOzZ2ljYSBjb24gbGFzIHF1ZSBicmluZGFuIGxvcyB0w610dWxvcyBkZSBjdWF0cm8gYcOxb3MgeSBsb3MgY2FtcGFtZW50b3MgZGUgZW50cmVuYW1pZW50by4gQmFzYWRvIGVuIGVudHJldmlzdGFzIGNvbiAxNSBnZXJlbnRlcyBkZSBjb250cmF0YWNpw7NuIGRlIGVtcHJlc2FzIGRlIHZhcmlvcyB0YW1hw7FvcyB5IGFsZ3Vub3MgZ3J1cG9zIGZvY2FsZXMsIGRlc2N1YnJpZXJvbiBxdWUgbG9zIHJlY2x1dGFkb3JlcyBlbmZhdGl6YWJhbiB1bmlmb3JtZW1lbnRlIGxhcyBoYWJpbGlkYWRlcyBibGFuZGFzIChlc3BlY2lhbG1lbnRlIGVsIHRyYWJham8gZW4gZXF1aXBvLCBsYSBjb211bmljYWNpw7NuIHkgbGEgY2FwYWNpZGFkIGRlIGNvbnRpbnVhciBhcHJlbmRpZW5kbykuIE11Y2hhcyBjb21wYcOxw61hcyByZXF1aWVyZW4gdW4gdMOtdHVsbyBkZSBjdWF0cm8gYcOxb3MgKGF1bnF1ZSBubyBuZWNlc2FyaWFtZW50ZSBlbiBjaWVuY2lhcyBkZSBsYSBjb21wdXRhY2nDs24pLCBwZXJvIG11Y2hhcyB0YW1iacOpbiBlbG9naWFyb24gYSBsb3MgZ3JhZHVhZG9zIGRlIGJvb3RjYW1wIHBvciBzZXIgbWF5b3JlcyBvIG3DoXMgbWFkdXJvcyB5IHRlbmVyIHVuIGNvbm9jaW1pZW50byBtw6FzIGFjdHVhbGl6YWRvLgoKU2kgc2UgZXN0w6EgYWNlcmNhbmRvIGEgdW4gY2FtcGFtZW50byBkZSBlbnRyZW5hbWllbnRvIGV4aXN0ZW50ZSwgc3UgbWVqb3IgZXN0cmF0ZWdpYSBwb2Ryw61hIHNlciBlbmZhdGl6YXIgbG8gcXVlIHNhYmUgc29icmUgbGEgZW5zZcOxYW56YSBlbiBsdWdhciBkZSBsbyBxdWUgc2FiZSBzb2JyZSB0ZWNub2xvZ8OtYSwgeWEgcXVlIG11Y2hvcyBkZSBzdXMgZnVuZGFkb3JlcyB5IHBlcnNvbmFsIHRpZW5lbiBleHBlcmllbmNpYSBlbiBwcm9ncmFtYWNpw7NuIHBlcm8gcG9jYSBvIG5pbmd1bmEgY2FwYWNpdGFjacOzbiBlbiBlZHVjYWNpw7NuLiBMb3MgcHJpbWVyb3MgY2Fww610dWxvcyBkZSBlc3RlIGxpYnJvIGhhbiBqdWdhZG8gYmllbiBjb24gZXN0YSBhdWRpZW5jaWEgZW4gZWwgcGFzYWRvLCB5IFtMYW5nMjAxNl0gZGVzY3JpYmUgcHLDoWN0aWNhcyBkZSBlbnNlw7FhbnphIGJhc2FkYXMgZW4gZXZpZGVuY2lhIHF1ZSBwdWVkZW4gaW1wbGVtZW50YXJzZSBjb24gdW4gbcOtbmltbyBlc2Z1ZXJ6byB5IGJham8gY29zdG8uIEVzIHBvc2libGUgcXVlIGVzdG9zIG5vIHRlbmdhbiBlbCBtYXlvciBpbXBhY3RvLCBwZXJvIG9idGVuZXIgYWxndW5hcyB2aWN0b3JpYXMgdGVtcHJhbmFzIGF5dWRhIGEgZ2VuZXJhciBhcG95byBwYXJhIGVzZnVlcnpvcyBtw6FzIGdyYW5kZXMuCgojIyBQZW5zYW1pZW50b3MgZmluYWxlcwpFcyBpbXBvc2libGUgY2FtYmlhciBsYXMgZ3JhbmRlcyBpbnN0aXR1Y2lvbmVzIHBvciBzdSBjdWVudGE6IG5lY2VzaXRhIGFsaWFkb3MsIHkgcGFyYSBvYnRlbmVyIGFsaWFkb3MsIG5lY2VzaXRhIHTDoWN0aWNhcy4gTGEgZ3XDrWEgbcOhcyDDunRpbCBxdWUgaGUgZW5jb250cmFkbyBlcyBbTWFubjIwMTVdLCBxdWUgY2F0YWxvZ2EgbcOhcyBkZSBjdWF0cm8gZG9jZW5hcyBkZSBlc3RvcyB5IGxvcyBvcmdhbml6YSBkZSBhY3VlcmRvIGEgc2kgc2UgaW1wbGVtZW50YW4gbWVqb3IgdGVtcHJhbm8sIG3DoXMgdGFyZGUsIGR1cmFudGUgdG9kbyBlbCBjaWNsbyBkZSBjYW1iaW8gbyBjdWFuZG8gZW5jdWVudHJhIHJlc2lzdGVuY2lhLiBBbGd1bm9zIGRlIHN1cyBwYXRyb25lcyBpbmNsdXllbjoKCioqRW4gdHUgZXNwYWNpbyoqCk1hbnRlbmdhIHZpc2libGUgbGEgbnVldmEgaWRlYSBjb2xvY2FuZG8gcmVjb3JkYXRvcmlvcyBlbiB0b2RhIGxhIG9yZ2FuaXphY2nDs24uCgoqKlNpbWLDs2xpY286KioKUGFyYSBtYW50ZW5lciB2aXZhIHVuYSBudWV2YSBpZGVhIGVuIGxhIG1lbW9yaWEgZGUgdW5hIHBlcnNvbmEsIGVudHJlZ3VlIGZpY2hhcyBxdWUgcHVlZGFuIGlkZW50aWZpY2Fyc2UgY29uIGVsIHRlbWEgcXVlIHNlIHByZXNlbnRhLgoKKipFc2PDqXB0aWNvIGNhbXBlw7NuOioqClBpZGEgYSBsw61kZXJlcyBkZSBvcGluacOzbiBmdWVydGVzIHF1ZSBzZWFuIGVzY8OpcHRpY29zIGFjZXJjYSBkZSBzdSBudWV2YSBpZGVhIHF1ZSBqdWVndWVuIGVsIHBhcGVsIGRlICJlc2PDqXB0aWNvcyBvZmljaWFsZXMiLiBVc2Ugc3VzIGNvbWVudGFyaW9zIHBhcmEgbWVqb3JhciBzdSBlc2Z1ZXJ6bywgaW5jbHVzbyBzaSBubyBjYW1iaWEgZGUgb3BpbmnDs24uCgoqKkNvbXByb21pc28gZnV0dXJvOioqClNpIHB1ZWRlIGFudGljaXBhciBhbGd1bmFzIGRlIHN1cyBuZWNlc2lkYWRlcywgcHVlZGUgc29saWNpdGFyIHVuIGNvbXByb21pc28gZnV0dXJvIGRlIHBlcnNvbmFzIG9jdXBhZGFzLiBTaSBzZSBsZXMgZGEgdW4gcGxhem8gZGUgZW50cmVnYSwgcHVlZGVuIGVzdGFyIG3DoXMgZGlzcHVlc3RvcyBhIGF5dWRhci4KTGEgZXN0cmF0ZWdpYSBtw6FzIGltcG9ydGFudGUgZXMgZXN0YXIgZGlzcHVlc3RvIGEgY2FtYmlhciBzdXMgb2JqZXRpdm9zIGVuIGZ1bmNpw7NuIGRlIGxvIHF1ZSBhcHJlbmRhIGRlIGxhcyBwZXJzb25hcyBhIGxhcyBxdWUgaW50ZW50YSBheXVkYXIuIExvcyB0dXRvcmlhbGVzIHF1ZSBsZXMgbXVlc3RyYW4gY8OzbW8gdXNhciB1bmEgaG9qYSBkZSBjw6FsY3VsbyBwdWVkZW4gYXl1ZGFybG9zIGRlIG1hbmVyYSBtw6FzIHLDoXBpZGEgeSBjb25maWFibGUgcXVlIHVuYSBpbnRyb2R1Y2Npw7NuIGEgSmF2YVNjcmlwdC4gQSBtZW51ZG8gaGUgY29tZXRpZG8gZWwgZXJyb3IgZGUgY29uZnVuZGlyIGNvc2FzIHF1ZSBtZSBhcGFzaW9uYWJhbiBjb24gY29zYXMgcXVlIG90cmFzIHBlcnNvbmFzIGRlYmVyw61hbiBzYWJlcjsgU2kgcmVhbG1lbnRlIHF1aWVyZXMgc2VyIHVuIHNvY2lvLCByZWN1ZXJkYSBzaWVtcHJlIHF1ZSBlbCBhcHJlbmRpemFqZSB5IGVsIGNhbWJpbyB0aWVuZW4gcXVlIHNlciBlbiBhbWJvcyBzZW50aWRvcy4KCkxhIHBhcnRlIG3DoXMgZGlmw61jaWwgZGUgY29uc3RydWlyIHJlbGFjaW9uZXMgZXMgY29tZW56YXIuIFJlc2VydmUgdW5hIG8gZG9zIGhvcmFzIGNhZGEgbWVzIHBhcmEgZW5jb250cmFyIGFsaWFkb3MgeSBtYW50ZW5lciBzdXMgcmVsYWNpb25lcyBjb24gZWxsb3MuIFVuYSBmb3JtYSBkZSBoYWNlciBlc3RvIGVzIHBlZGlybGVzIGNvbnNlam86IMK/Y8OzbW8gY3JlZW4gcXVlIGRlYmVyw61hIGNyZWFyIGNvbmNpZW5jaWEgc29icmUgbG8gcXVlIGVzdMOhIGhhY2llbmRvPyDCv0TDs25kZSBoYW4gZW5jb250cmFkbyBlc3BhY2lvIHBhcmEgZWplY3V0YXIgY2xhc2VzPyDCv1F1w6kgbmVjZXNpZGFkZXMgY3JlZW4gcXVlIG5vIHNlIGVzdMOhbiBjdW1wbGllbmRvIHkgc2Vyw61hIGNhcGF6IGRlIHNhdGlzZmFjZXI/IEN1YWxxdWllciBncnVwbyBxdWUgaGF5YSBleGlzdGlkbyBkdXJhbnRlIGFsZ3Vub3MgYcOxb3MgdGVuZHLDoSBjb25zZWpvcyDDunRpbGVzOyB0YW1iacOpbiBzZSBzZW50aXLDoW4gaGFsYWdhZG9zIGRlIHF1ZSBzZSBsZXMgcHJlZ3VudGUgeSBzYWJyw6FuIHF1acOpbiBlcyBsYSBwcsOzeGltYSB2ZXogcXVlIGxsYW1lLgoKWSBjb21vIGRpY2UgW0t1Y2gyMDExXSwgc2kgbm8gcHVlZGUgc2VyIGVsIHByaW1lcm8gZW4gdW5hIGNhdGVnb3LDrWEsIGludGVudGUgY3JlYXIgdW5hIG51ZXZhIGNhdGVnb3LDrWEgZW4gbGEgcXVlIHB1ZWRhIHNlciBlbCBwcmltZXJvLiBTaSBubyBwdWVkZSBoYWNlcmxvLCDDum5hc2UgYSB1biBncnVwbyBleGlzdGVudGUgbyBwaWVuc2UgZW4gaGFjZXIgYWxnbyBjb21wbGV0YW1lbnRlIGRpZmVyZW50ZS4gLiBFc3RvIG5vIGVzIGRlcnJvdGlzdGE6IHNpIGFsZ3VpZW4gbcOhcyB5YSBlc3TDoSBoYWNpZW5kbyBsbyBxdWUgdGllbmVzIGVuIG1lbnRlLCBkZWJlcsOtYXMgaW50ZXJ2ZW5pciBvIGFib3JkYXIgdW5hIGRlIGxhcyBvdHJhcyBjb3NhcyBpZ3VhbG1lbnRlIMO6dGlsZXMgcXVlIHBvZHLDrWFzIGVzdGFyIGhhY2llbmRvIGVuIHN1IGx1Z2FyLgoKCiMjIEVqZXJjaWNpb3MKIyMjTGFuemFyIGEgdW4gY29uY2VqYWwgZGUgbGEgY2l1ZGFkIChpbmRpdmlkdWFsIC8gMTApCkVzdGUgY2Fww610dWxvIGRlc2NyaWJlIHVuYSBvcmdhbml6YWNpw7NuIHF1ZSBvZnJlY2UgdGFsbGVyZXMgZGUgcHJvZ3JhbWFjacOzbiBkZSBmaW4gZGUgc2VtYW5hIHBhcmEgcGVyc29uYXMgcXVlIHZ1ZWx2ZW4gYSBpbmdyZXNhciBhIGxhIGZ1ZXJ6YSBsYWJvcmFsLiBFc2NyaWJhIHVuYSBwcmVzZW50YWNpw7NuIGRlIGFzY2Vuc29yIHBhcmEgZXNhIG9yZ2FuaXphY2nDs24gZGlyaWdpZGEgYSB1biBjb25jZWphbCBkZSBsYSBjaXVkYWQgY3V5byBhcG95byBuZWNlc2l0YSBsYSBvcmdhbml6YWNpw7NuLgoKIyMjIExhbnphbmRvIHN1IG9yZ2FuaXphY2nDs24gKGluZGl2aWR1YWwgLyAzMCkKSWRlbnRpZmlxdWUgZG9zIGdydXBvcyBkZSBwZXJzb25hcyBkZSBsYXMgcXVlIHN1IG9yZ2FuaXphY2nDs24gbmVjZXNpdGEgYXBveW8geSBlc2NyaWJhIHVuIGRpc2N1cnNvIGRlIGFzY2Vuc29yIGRpcmlnaWRvIGEgY2FkYSB1bm8uCgojIyMgVGVtYXMgZGUgY29ycmVvIGVsZWN0csOzbmljbyAocGFyZXMgLyAxMCkKRXNjcmliYSBsYXMgbMOtbmVhcyBkZSBhc3VudG8gKHkgc29sbyBsYXMgbMOtbmVhcyBkZSBhc3VudG8pIHBhcmEgdHJlcyBtZW5zYWplcyBkZSBjb3JyZW8gZWxlY3Ryw7NuaWNvOiB1bm8gYW51bmNpYW5kbyB1biBudWV2byBjdXJzbywgdW5vIGFudW5jaWFuZG8gdW4gbnVldm8gcGF0cm9jaW5hZG9yIHkgb3RybyBhbnVuY2lhbmRvIHVuIGNhbWJpbyBlbiBlbCBsaWRlcmF6Z28gZGVsIHByb3llY3RvLiBDb21wYXJlIHN1cyBsw61uZWFzIGRlIGFzdW50byBjb24gbGFzIGRlIHVuIHNvY2lvIHkgdmVhIHNpIHB1ZWRlIGNvbWJpbmFyIGxhcyBtZWpvcmVzIGNhcmFjdGVyw61zdGljYXMgZGUgY2FkYSB1bmEgYWwgdGllbXBvIHF1ZSBsYXMgYWNvcnRhLgoKIyMjIE1hbmVqbyBkZSByZXNpc3RlbmNpYSBwYXNpdmEgKGdydXBvcyBwZXF1ZcOxb3MgLyAzMCkKTGFzIHBlcnNvbmFzIHF1ZSBubyBxdWllcmVuIHVuIGNhbWJpbyBhIHZlY2VzIGxvIGRpY2VuIGVuIHZveiBhbHRhLCBwZXJvIGEgbWVudWRvIHRhbWJpw6luIHB1ZWRlbiB1c2FyIHZhcmlhcyBmb3JtYXMgZGUgcmVzaXN0ZW5jaWEgcGFzaXZhLCBjb21vIG5vIGhhY2VybG8gdW5hIHkgb3RyYSB2ZXosIG8gcGxhbnRlYXIgdW4gcG9zaWJsZSBwcm9ibGVtYSB0cmFzIG90cm8gcGFyYSBoYWNlciBxdWUgZWwgY2FtYmlvIHBhcmV6Y2EgbcOhcyByaWVzZ29zbyB5IG3DoXMgY29zdG9zbyBkZSBsbyBxdWUgZXMgcHJvYmFibGUgcXVlIHNlYS4gW1Njb3QxOTg3XSBUcmFiYWphbmRvIGVuIGdydXBvcyBwZXF1ZcOxb3MsIGVudW1lcmUgdHJlcyBvIGN1YXRybyByYXpvbmVzIHBvciBsYXMgY3VhbGVzIGxhcyBwZXJzb25hcyBwb2Ryw61hbiBubyBxdWVyZXIgcXVlIHN1IGluaWNpYXRpdmEgZGUgZW5zZcOxYW56YSBjb250aW7DumUsIHkgZXhwbGlxdWUgcXXDqSBwdWVkZSBoYWNlciBjb24gZWwgdGllbXBvIHkgbG9zIHJlY3Vyc29zIHF1ZSB0aWVuZSBwYXJhIENvbnRyYXJyZXN0YXIgY2FkYSB1bm8uCgojIyMgwr9Qb3IgcXXDqSBhcHJlbmRlciBhIHByb2dyYW1hcj8gKGluZGl2aWR1YWwgLyAxNSkKVnVlbHZhIGEgdmlzaXRhciAiwr9Qb3IgcXXDqSBhcHJlbmRlciBhIHByb2dyYW1hcj8iIGVqZXJjaWNpbyBlbiBsYSBTZWNjacOzbiAxLjQuIMK/RMOzbmRlIHNlIGFsaW5lYW4gc3VzIHJhem9uZXMgcGFyYSBlbnNlw7FhciB5IGxhcyByYXpvbmVzIGRlIHN1cyBhbHVtbm9zIHBhcmEgYXByZW5kZXI/IMK/RMOzbmRlIG5vIGxvIGhhY2VuPyDCv0PDs21vIGFmZWN0YSBlc28gYSBzdSBjb21lcmNpYWxpemFjacOzbj8KCiMjIyBQcm9ncmFtYWRvcmVzIGNvbnZlcnNhY2lvbmFsZXMgKHRoaW5rLXBhaXItc2hhcmUgLyAxNSkKVW4gcHJvZ3JhbWFkb3IgY29udmVyc2FjaW9uYWwgZXMgYWxndWllbiBxdWUgbmVjZXNpdGEgc2FiZXIgbG8gc3VmaWNpZW50ZSBzb2JyZSBpbmZvcm3DoXRpY2EgcGFyYSB0ZW5lciB1bmEgY29udmVyc2FjacOzbiBzaWduaWZpY2F0aXZhIGNvbiB1biBwcm9ncmFtYWRvciwgcGVybyBubyBzZSB2YSBhIHByb2dyYW1hciBhIHPDrSBtaXNtby4gW1dhbmcyMDE4XSBkZXNjdWJyacOzIHF1ZSBsYSBtYXlvcsOtYSBkZSBsb3MgcmVjdXJzb3MgZGUgYXByZW5kaXphamUgbm8gYWJvcmRhbiBsYXMgbmVjZXNpZGFkZXMgZGUgZXN0ZSBncnVwby4gVHJhYmFqYW5kbyBlbiBwYXJlamFzLCBlc2NyaWJhIHVuIGRpc2N1cnNvIHBhcmEgdW4gdGFsbGVyIGRlIG1lZGlvIGTDrWEgZGVzdGluYWRvIGEgYXl1ZGFyIGEgbGFzIHBlcnNvbmFzIHF1ZSBzZSBhanVzdGVuIGEgZXN0YSBkZXNjcmlwY2nDs24geSBsdWVnbyBjb21wYXJ0YSBlbCBkaXNjdXJzbyBkZSBzdSBwYXJlamEgY29uIGVsIHJlc3RvIGRlIGxhIGNsYXNlLgoKIyMjIENvbGFib3JhY2lvbmVzIChncnVwb3MgcGVxdWXDsW9zIC8gMzApClJlc3BvbmRhIGxhcyBzaWd1aWVudGVzIHByZWd1bnRhcyBwb3Igc3UgY3VlbnRhLCBsdWVnbyBjb21wYXJlIHN1cyByZXNwdWVzdGFzIGNvbiBsYXMgZGUgb3Ryb3MgbWllbWJyb3MgZGUgc3UgZ3J1cG8uCgoxLiDCv1RpZW5lIGFsZ8O6biBhY3VlcmRvIG8gcmVsYWNpw7NuIGNvbiBvdHJvcyBncnVwb3M/CgoyLiDCv1F1aWVyZXMgdGVuZXIgcmVsYWNpb25lcyBjb24gb3Ryb3MgZ3J1cG9zPwoKMy4gwr9EZSBxdcOpIG1hbmVyYSB0ZW5lciAobyBubyB0ZW5lcikgY29sYWJvcmFjaW9uZXMgbG8gYXl1ZGFyw61hIGEgbG9ncmFyIHN1cyBvYmpldGl2b3M/Cgo0LiDCv0N1w6FsZXMgc29uIHN1cyByZWxhY2lvbmVzIGNvbGFib3JhdGl2YXMgY2xhdmU/Cgo1LiDCv1NvbiBlc3RvcyBsb3MgY29sYWJvcmFkb3JlcyBhZGVjdWFkb3MgcGFyYSBhbGNhbnphciBzdXMgb2JqZXRpdm9zPwoKNi4gwr9Db24gcXXDqSBncnVwb3MgbyBlbnRpZGFkZXMgbGUgZ3VzdGFyw61hIHF1ZSBzdSBvcmdhbml6YWNpw7NuIHR1dmllcmEgYWN1ZXJkb3MgbyByZWxhY2lvbmVzPwoKCiMjIyBFZHVjYWNpb24gKGNsYXNlIGVudGVyYSAvIDEwKQpbTGFiYTIwMDhdIGV4cGxvcmEgcG9yIHF1w6kgRXN0YWRvcyBVbmlkb3MgeSBvdHJvcyBwYcOtc2VzIHNpZ3VlbiBwcmVzaW9uYW5kbyBsYSBzb2x1Y2nDs24gZGUgcHJvYmxlbWFzIHNvY2lhbGVzIGVuIGxhcyBpbnN0aXR1Y2lvbmVzIGVkdWNhdGl2YXMgeSBwb3IgcXXDqSBlc28gc2lndWUgc2luIGZ1bmNpb25hci4gQ29tbyDDqWwgc2XDsWFsYSwg4oCcW2xhIGVkdWNhY2nDs25dIGhhIGhlY2hvIG11eSBwb2NvIHBhcmEgcHJvbW92ZXIgbGEgaWd1YWxkYWQgZGUgcmF6YSwgY2xhc2UgeSBnw6luZXJvOyBwYXJhIG1lam9yYXIgbGEgc2FsdWQgcMO6YmxpY2EsIGxhIHByb2R1Y3RpdmlkYWQgZWNvbsOzbWljYSB5IGxhIGJ1ZW5hIGNpdWRhZGFuw61hOyBvIHBhcmEgcmVkdWNpciBlbCBzZXhvIGFkb2xlc2NlbnRlLCBsYXMgbXVlcnRlcyBwb3IgdHLDoWZpY28sIGxhIG9iZXNpZGFkIHkgbGEgZGVzdHJ1Y2Npw7NuIGRlbCBtZWRpbyBhbWJpZW50ZS4gRGUgaGVjaG8sIGVuIG11Y2hvcyBzZW50aWRvcyBoYSB0ZW5pZG8gdW4gZWZlY3RvIG5lZ2F0aXZvIGVuIGVzdG9zIHByb2JsZW1hcyBhbCBkcmVuYXIgZWwgZGluZXJvIHkgbGEgZW5lcmfDrWEgZGUgbGFzIHJlZm9ybWFzIHNvY2lhbGVzIHF1ZSBwb2Ryw61hbiBoYWJlciB0ZW5pZG8gdW4gaW1wYWN0byBtw6FzIHN1c3RhbmNpYWwgIi4gw4lsIGNvbnRpbsO6YSBlc2NyaWJpZW5kbzoKCj5FbnRvbmNlcywgwr9jw7NtbyBkZWJlbW9zIGVudGVuZGVyIGVsIMOpeGl0byBkZSBlc3RhIGluc3RpdHVjacOzbiBhIGxhIGx1eiBkZSBzdSBpbmNhcGFjaWRhZCBwYXJhIGhhY2VyIGxvIHF1ZSBsZSBwZWRpbW9zPyBVbmEgZm9ybWEgZGUgcGVuc2FyIHNvYnJlIGVzdG8gZXMgcXVlIGxhIGVkdWNhY2nDs24gcHVlZGUgbm8gZXN0YXIgaGFjaWVuZG8gbG8gcXVlIGxlIHBlZGltb3MsIHBlcm8gZXN0w6EgaGFjaWVuZG8gbG8gcXVlIHF1ZXJlbW9zLiBRdWVyZW1vcyB1bmEgaW5zdGl0dWNpw7NuIHF1ZSBwZXJzaWdhIG51ZXN0cm9zIG9iamV0aXZvcyBzb2NpYWxlcyBkZSB1bmEgbWFuZXJhIHF1ZSBlc3TDqSBlbiBsw61uZWEgY29uIGVsIGluZGl2aWR1YWxpc21vIGVuIGVsIGNvcmF6w7NuIGRlbCBpZGVhbCBsaWJlcmFsLCBjb24gZWwgb2JqZXRpdm8gZGUgcmVzb2x2ZXIgbG9zIHByb2JsZW1hcyBzb2NpYWxlcyBidXNjYW5kbyBjYW1iaWFyIGxvcyBjb3Jhem9uZXMsIGxhcyBtZW50ZXMgeSBsYXMgY2FwYWNpZGFkZXMgZGUgbG9zIGVzdHVkaWFudGVzIGluZGl2aWR1YWxlcy4gT3RyYSBmb3JtYSBkZSBkZWNpciBlc3RvIGVzIHF1ZSBxdWVyZW1vcyB1bmEgaW5zdGl0dWNpw7NuIGEgdHJhdsOpcyBkZSBsYSBjdWFsIHBvZGFtb3MgZXhwcmVzYXIgbnVlc3Ryb3Mgb2JqZXRpdm9zIHNvY2lhbGVzIHNpbiB2aW9sYXIgZWwgcHJpbmNpcGlvIGRlIGVsZWNjacOzbiBpbmRpdmlkdWFsIHF1ZSBzZSBlbmN1ZW50cmEgZW4gZWwgY2VudHJvIGRlIGxhIGVzdHJ1Y3R1cmEgc29jaWFsLCBpbmNsdXNvIHNpIGVzdG8gdGllbmUgZWwgY29zdG8gZGUgbm8gbG9ncmFyIGVzdG9zIG9iamV0aXZvcy4gUG9yIGxvIHRhbnRvLCBsYSBlZHVjYWNpw7NuIHB1ZWRlIHNlcnZpciBjb21vIHVuIHB1bnRvIGRlIG9yZ3VsbG8gY8OtdmljbywgdW4gbHVnYXIgZGUgZXhoaWJpY2nDs24gcGFyYSBudWVzdHJvcyBpZGVhbGVzIHkgdW4gbWVkaW8gcGFyYSBwYXJ0aWNpcGFyIGVuIGRpc3B1dGFzIGVkaWZpY2FudGVzIHBlcm8gZW4gw7psdGltYSBpbnN0YW5jaWEgc2luIGNvbnNlY3VlbmNpYXMgc29icmUgdmlzaW9uZXMgYWx0ZXJuYXRpdmFzIGRlIGxhIGJ1ZW5hIHZpZGEuIEFsIG1pc21vIHRpZW1wbywgdGFtYmnDqW4gcHVlZGUgc2VydmlyIGNvbW8gdW4gbmnDsW8gZGUgYXpvdGVzIGNvbnZlbmllbnRlIHF1ZSBwb2RlbW9zIGN1bHBhciBwb3Igc3UgZnJhY2FzbyBwYXJhIGxvZ3JhciBudWVzdHJhcyBhc3BpcmFjaW9uZXMgbcOhcyBhbHRhcyBwYXJhIG5vc290cm9zIG1pc21vcyBjb21vIHNvY2llZGFkLgoKwr9Dw7NtbyBlbmNhamFuIGxvcyBlc2Z1ZXJ6b3MgcGFyYSBlbnNlw7FhciBlbCBwZW5zYW1pZW50byBjb21wdXRhY2lvbmFsIHkgbGEgY2l1ZGFkYW7DrWEgZGlnaXRhbCBlbiBsYXMgZXNjdWVsYXMgZW4gZXN0ZSBtYXJjbz8gwr9Mb3MgYm9vdGNhbXBzIGV2aXRhbiBlc3RhcyB0cmFtcGFzIG8gc2ltcGxlbWVudGUgbGFzIGVudHJlZ2FuIGNvbiB1bmEgbnVldmEgYXBhcmllbmNpYT8KCiMjIyBBZG9wY2nDs24gSW5zdGl0dWNpb25hbCAoY2xhc2UgZW50ZXJhIC8gMTUpClZ1ZWx2YSBhIGxlZXIgbGEgbGlzdGEgZGUgbW90aXZhY2lvbmVzIHBhcmEgYWRvcHRhciBudWV2YXMgcHLDoWN0aWNhcyBxdWUgZmlndXJhIGVuIGxhIFNlY2Npw7NuIDE0LjQuIMK/Q3XDoWwgZGUgZXN0b3Mgc2UgYXBsaWNhIGEgdXN0ZWQgeSBzdXMgY29sZWdhcz8gwr9DdcOhbGVzIHNvbiBpcnJlbGV2YW50ZXMgcGFyYSBzdSBjb250ZXh0bz8gwr9RdcOpIGVuZmF0aXphIHNpIGludGVyYWN0w7phIGNvbiBwZXJzb25hcyBxdWUgdHJhYmFqYW4gZW4gaW5zdGl0dWNpb25lcyBlZHVjYXRpdmFzIGZvcm1hbGVzPwoKIyMjIFNpIGFsIHByaW5jaXBpbyBubyB0aWVuZXMgw6l4aXRvIChncnVwb3MgcGVxdWXDsW9zIC8gMTUpCkJBw5FPLiBQcm9iYWJsZW1lbnRlIEZpZWxkcyBudW5jYSBkaWpvOiAiU2kgYWwgcHJpbmNpcGlvIG5vIHRpZW5lcyDDqXhpdG8sIGludMOpbnRhbG8sIGludMOpbnRhbG8gZGUgbnVldm8uIEx1ZWdvLCBkw6lqYWxvLCBubyBzaXJ2ZSBkZSBuYWRhIHNlciB1biB0b250byAiLiBTaWd1ZSBzaWVuZG8gdW4gYnVlbiBjb25zZWpvOiBzaSBsYXMgcGVyc29uYXMgY29uIGxhcyBxdWUgaW50ZW50YSBjb211bmljYXJzZSBubyByZXNwb25kZW4sIGVzIHBvc2libGUgcXVlIG51bmNhIGxhcyBjb252ZW56YS4gRW4gZ3J1cG9zIGRlIDMgYSA0LCBoYWdhIHVuYSBicmV2ZSBsaXN0YSBkZSBzZcOxYWxlcyBkZSBxdWUgZGViZSBkZWphciBkZSBpbnRlbnRhciBoYWNlciBhbGdvIGVuIGxvIHF1ZSBjcmVlLiDCv0N1w6FudG9zIGRlIGVsbG9zIHlhIHNvbiBjaWVydG9zPwoKIyMjIEhhY2VyIHF1ZSBmYWxsZSAoaW5kaXZpZHVhbCAvIDE1KQpbRmFybTIwMDZdIHByZXNlbnRhIGFsZ3VuYXMgcmVnbGFzIGlyw7NuaWNhcyBwYXJhIGdhcmFudGl6YXIgcXVlIG5vIHNlIGFkb3B0ZW4gbnVldmFzIGhlcnJhbWllbnRhcywgdG9kYXMgbGFzIGN1YWxlcyBzZSBhcGxpY2FuIGEgbGFzIG51ZXZhcyBwcsOhY3RpY2FzIGRlIGVuc2XDsWFuemE6CgoxLiBIYXpsbyBvcGNpb25hbC4KCjIuIEVjb25vbWl6YXIgZW4gZm9ybWFjacOzbi4KCjMuIE5vIGxvIHVzZSBlbiB1biBwcm95ZWN0byByZWFsLgoKNC4gTnVuY2EgbG8gaW50ZWdyZXMuCgo1LiDDmnNlbG8gZXNwb3LDoWRpY2FtZW50ZS4KCjYuIEhhemxvIHBhcnRlIGRlIHVuYSBpbmljaWF0aXZhIGRlIGNhbGlkYWQuCgo3LiBNYXJnaW5hciBhbCBjYW1wZcOzbi4KCjguIEFwcm92ZWNoZSBsb3MgcHJpbWVyb3MgcGFzb3MgZW4gZmFsc28uCgo5LiBIYXogdW5hIHBlcXVlw7FhIGludmVyc2nDs24uCgoxMC4gRXhwbG90YXIgZWwgbWllZG8sIGxhIGluY2VydGlkdW1icmUsIGxhIGR1ZGEsIGxhIHBlcmV6YSB5IGxhIGluZXJjaWEuCgrCv0N1w6FsIGRlIGVzdG9zIGhhcyB2aXN0byBoZWNobyByZWNpZW50ZW1lbnRlPyDCv1F1w6kgaGFzIGhlY2hvIHTDuiBtaXNtbz8gwr9RdcOpIGZvcm1hIHRvbWFyb24/CgojIyMgVHV0b3LDrWEgKHRvZGEgbGEgY2xhc2UgLyAxNSkKRWwgSW5zdGl0dXRvIGRlIE1lbnRvcsOtYSBBZnJvYW1lcmljYW5hIGVuIEluZm9ybcOhdGljYSBoYSBwdWJsaWNhZG8gcGF1dGFzIHBhcmEgbGEgdHV0b3LDrWEgZGUgZXN0dWRpYW50ZXMgZGUgZG9jdG9yYWRvLiBMw6lhbG9zIGluZGl2aWR1YWxtZW50ZSwgbHVlZ28gcmVww6FzZWxvcyBjb21vIHVuYSBjbGFzZSB5IGNhbGlmaXF1ZSBzdXMgZXNmdWVyem9zIHBhcmEgc3UgcHJvcGlvIGdydXBvIGNvbW8gKzEgKGRlZmluaXRpdmFtZW50ZSBoYWNpZW5kbyksIDAgKG5vIGVzdG95IHNlZ3VybyBvIG5vIGVzIGFwbGljYWJsZSkgbyAtMSAoZGVmaW5pdGl2YW1lbnRlIG5vIGVzdMOhIGhhY2llbmRvKS4KCgojIMK/UG9yIHF1w6kgZW5zZcOxbz8KQ3VhbmRvIGNvbWVuY8OpIGEgc2VyIHZvbHVudGFyaW8gZW4gbGEgVW5pdmVyc2lkYWQgZGUgVG9yb250bywgYWxndW5vcyBkZSBtaXMgZXN0dWRpYW50ZXMgbWUgcHJlZ3VudGFyb24gcG9yIHF1w6kgaWJhIGEgZW5zZcOxYXIgZGUgZm9ybWEgZ3JhdHVpdGEuIEVzdGEgZnVlIG1pIHJlc3B1ZXN0YToKCj5DdWFuZG8gdGVuw61hIHR1IGVkYWQsIHBlbnNhYmEgcXVlIGxhcyB1bml2ZXJzaWRhZGVzIGV4aXN0w61hbiBwYXJhIGVuc2XDsWFyIGEgbGEgZ2VudGUgYSBhcHJlbmRlci4gTcOhcyB0YXJkZSwgZW4gbGEgZXNjdWVsYSBkZSBwb3NncmFkbywgcGVuc8OpIHF1ZSBsYXMgdW5pdmVyc2lkYWRlcyBzZSBkZWRpY2FiYW4gYSBpbnZlc3RpZ2FyIHkgY3JlYXIgbnVldm9zIGNvbm9jaW1pZW50b3MuIFNpbiBlbWJhcmdvLCBhaG9yYSBxdWUgdGVuZ28gbcOhcyBkZSBjdWFyZW50YSBhw7FvcywgbWUgaGUgZGFkbyBjdWVudGEgZGUgcXVlIGxvIHF1ZSByZWFsbWVudGUgbGUgZXN0YW1vcyBlbnNlw7FhbmRvIGVzIGPDs21vIGRvbWluYXIgZWwgbXVuZG8sIHBvcnF1ZSB0ZW5kcsOhIHF1ZSBkZWNpZGlyIHNpIHF1aWVyZSBvIG5vLgo+Cj5NaXMgcGFkcmVzIHRpZW5lbiBzZXRlbnRhIGHDsW9zLiBZYSBubyBjb3JyZW4gZWwgbXVuZG87IFNvbiBsYXMgcGVyc29uYXMgZGUgbWkgZWRhZCBsYXMgcXVlIGFwcnVlYmFuIGxleWVzIHkgdG9tYW4gZGVjaXNpb25lcyBkZSB2aWRhIG8gbXVlcnRlIGVuIGxvcyBob3NwaXRhbGVzLiBUYW4gYXRlcnJhZG9yIGNvbW8gZXMsIHNvbW9zIGxvcyBhZHVsdG9zLgo+Cj5EZW50cm8gZGUgdmVpbnRlIGHDsW9zLCBub3MgZGlyaWdpcmVtb3MgYSBsYSBqdWJpbGFjacOzbiB5IHVzdGVkIGVzdGFyw6EgYSBjYXJnby4gUHVlZGUgcGFyZWNlciBtdWNobyB0aWVtcG8gY3VhbmRvIHRpZW5lcyBkaWVjaW51ZXZlIGHDsW9zLCBwZXJvIHRvbWEgdHJlcyByZXNwaXJhY2lvbmVzIHkgZGVzYXBhcmVjZXLDoS4gRXMgcG9yIGVzbyBxdWUgbGUgZGFtb3MgcHJvYmxlbWFzIGN1eWFzIHJlc3B1ZXN0YXMgbm8gc2UgcHVlZGVuIGFuYWxpemFyIGEgcGFydGlyIGRlIGxhcyBub3RhcyBkZWwgYcOxbyBwYXNhZG8uIEVzIHBvciBlc28gcXVlIGxvIHBvbmVtb3MgZW4gc2l0dWFjaW9uZXMgZW4gbGFzIHF1ZSB0aWVuZSBxdWUgZGVzY3VicmlyIHF1w6kgZGViZSBoYWNlcnNlIGVuIGVzdGUgbW9tZW50bywgcXXDqSBwdWVkZSBkZWphciBwYXJhIG3DoXMgYWRlbGFudGUgeSBxdcOpIHB1ZWRlIHNpbXBsZW1lbnRlIGlnbm9yYXIuIEVzIHBvcnF1ZSBzaSBubyBhcHJlbmRlIGPDs21vIGhhY2VyIGVzdGFzIGNvc2FzIGFob3JhLCBubyBlc3RhcsOhIGxpc3RvIHBhcmEgaGFjZXJsbyBjdWFuZG8gc2VhIG5lY2VzYXJpby4KClRvZG8gZXJhIGNpZXJ0bywgcGVybyBubyBlcmEgdG9kYSBsYSBoaXN0b3JpYS4gTm8gcXVpZXJvIHF1ZSBsYSBnZW50ZSBoYWdhIGRlbCBtdW5kbyB1biBsdWdhciBtZWpvciBwYXJhIHBvZGVyIHJldGlyYXJtZSBjw7Ntb2RhbWVudGUuIFF1aWVybyBxdWUgbG8gaGFnYW4gcG9ycXVlIGVzIGxhIG1heW9yIGF2ZW50dXJhIGRlIG51ZXN0cm8gdGllbXBvLiBIYWNlIGNpZW50byBjaW5jdWVudGEgYcOxb3MsIGxhIG1heW9yw61hIGRlIGxhcyBzb2NpZWRhZGVzIHByYWN0aWNhYmFuIGxhIGVzY2xhdml0dWQuIEhhY2UgY2llbiBhw7FvcywgbWkgYWJ1ZWxhIG5vIGVyYSBsZWdhbG1lbnRlIHVuYSBwZXJzb25hIGVuIENhbmFkw6EuIEVuIGVsIGHDsW8gZW4gcXVlIG5hY8OtLCBsYSBtYXlvcsOtYSBkZSBsYXMgcGVyc29uYXMgZGVsIG11bmRvIHN1ZnJpZXJvbiBiYWpvIHVuIGdvYmllcm5vIHRvdGFsaXRhcmlvLCB5IGxvcyBqdWVjZXMgdG9kYXbDrWEgb3JkZW5hYmFuIGxhIHRlcmFwaWEgZGUgZWxlY3Ryb2Nob3F1ZSBwYXJhICJjdXJhciIgYSBsb3MgaG9tb3NleHVhbGVzLiBUb2RhdsOtYSBoYXkgbXVjaG8gbWFsIGNvbiBlbCBtdW5kbywgcGVybyBtaXJhIGN1w6FudGFzIG9wY2lvbmVzIG3DoXMgdGVuZW1vcyBxdWUgbnVlc3Ryb3MgYWJ1ZWxvcy4gTWlyYSBjdcOhbnRhcyBjb3NhcyBtw6FzIHBvZGVtb3Mgc2FiZXIsIHNlciB5IGRpc2ZydXRhciwgcG9ycXVlIGZpbmFsbWVudGUgbm9zIGVzdGFtb3MgdG9tYW5kbyBlbiBzZXJpbyBsYSBSZWdsYSBkZSBPcm8uCgpIb3kgc295IG1lbm9zIG9wdGltaXN0YSBxdWUgYW50ZXMuIEVsIGNhbWJpbyBjbGltw6F0aWNvLCBsYSBleHRpbmNpw7NuIG1hc2l2YSwgbGEgdmlnaWxhbmNpYSBkZWwgY2FwaXRhbGlzbW8sIGxhIGRlc2lndWFsZGFkIGVuIHVuYSBlc2NhbGEgcXVlIG5vIGhlbW9zIHZpc3RvIGVuIHVuIHNpZ2xvLCBlbCByZXN1cmdpbWllbnRvIGRlbCBuYWNpb25hbGlzbW8gcmFjaXN0YTogbWkgZ2VuZXJhY2nDs24gbG8gaGEgdmlzdG8gdG9kbyB5IHNlIGVuY29nacOzIGRlIGhvbWJyb3MuIEVsIHByb3llY3RvIGRlIGxleSBwYXJhIG51ZXN0cmEgY29iYXJkw61hLCBsZXRhcmdvIHkgYXZhcmljaWEgbm8gc2UgcGFnYXLDoSBoYXN0YSBxdWUgbWkgaGlqYSBjcmV6Y2EsIHBlcm8gbGxlZ2Fyw6EsIHkgcGFyYSBlbCBtb21lbnRvIGVuIHF1ZSBsbyBoYWdhLCBubyBoYWJyw6Egc29sdWNpb25lcyBmw6FjaWxlcyBwYXJhIGVzdG9zIHByb2JsZW1hcyAoeSBwb3NpYmxlbWVudGUgbmluZ3VuYSBzb2x1Y2nDs24pLgoKUG9yIGVzbyBlbnNlw7FvIGhveTogZXN0b3kgZW5vamFkby4gRXN0b3kgZW5vamFkbyBwb3JxdWUgdHUgc2V4byB5IHR1IGNvbG9yIHkgbGEgcmlxdWV6YSB5IGxhcyBjb25leGlvbmVzIGRlIHR1cyBwYWRyZXMgbm8gZGViZXLDrWFuIGNvbnRhciBtw6FzIHF1ZSBjdcOhbiBpbnRlbGlnZW50ZSwgaG9uZXN0byBvIHRyYWJhamFkb3IgZXJlcy4gRXN0b3kgZW5vamFkbyBwb3JxdWUgY29udmVydGltb3MgSW50ZXJuZXQgZW4gdW4gcG96byBuZWdyby4gRXN0b3kgZW5vamFkbyBwb3JxdWUgbG9zIG5hemlzIGVzdMOhbiBlbiBtYXJjaGEgdW5hIHZleiBtw6FzIHkgbG9zIG11bHRpbWlsbG9uYXJpb3MganVlZ2FuIGNvbiBjb2hldGVzIG1pZW50cmFzIGVsIHBsYW5ldGEgc2UgZGVycml0ZS4gRXN0b3kgZW5vamFkbywgYXPDrSBxdWUgZW5zZcOxbywgcG9ycXVlIGVsIG11bmRvIHNvbG8gbWVqb3JhIGN1YW5kbyBlbnNlw7FhbW9zIGEgbGFzIHBlcnNvbmFzIGPDs21vIG1lam9yYXJsby4KCkVuIHN1IGVuc2F5byBkZSAxOTQ3ICJQb3IgcXXDqSBlc2NyaWJvIiwgR2VvcmdlIE9yd2VsbCBlc2NyaWJpw7M6Cgo+RW4gdW5hIMOpcG9jYSBwYWPDrWZpY2EsIHBvZHLDrWEgaGFiZXIgZXNjcml0byBsaWJyb3Mgb3JuYW1lbnRhZG9zIG8gbWVyYW1lbnRlIGRlc2NyaXB0aXZvcywgeSBwb2Ryw61hIGhhYmVyIHBlcm1hbmVjaWRvIGNhc2kgaW5jb25zY2llbnRlIGRlIG1pcyBsZWFsdGFkZXMgcG9sw610aWNhcy4gRGUgaGVjaG8sIG1lIGhlIHZpc3RvIG9ibGlnYWRvIGEgY29udmVydGlybWUgZW4gdW5hIGVzcGVjaWUgZGUgcGFuZmxldG8gLi4uIENhZGEgbMOtbmVhIGRlIHRyYWJham8gc2VyaW8gcXVlIGhlIGVzY3JpdG8gZGVzZGUgMTkzNiBzZSBoYSBlc2NyaXRvLCBkaXJlY3RhIG8gaW5kaXJlY3RhbWVudGUsIGNvbnRyYSBlbCB0b3RhbGl0YXJpc21vIC4uLiBNZSBwYXJlY2UgYWJzdXJkbywgZW4gdW4gcGVyw61vZG8gY29tbyBlbCBudWVzdHJvLCBwaWVuc2EgcXVlIHVubyBwdWVkZSBldml0YXIgZXNjcmliaXIgc29icmUgdGFsZXMgdGVtYXMuIFRvZG9zIGVzY3JpYmVuIGRlIGVsbG9zIGRlIHVuYSBtYW5lcmEgdSBvdHJhLiBFcyBzaW1wbGVtZW50ZSB1bmEgY3Vlc3Rpw7NuIGRlIHF1w6kgbGFkbyBzZSB0b21hLgoKUmVlbXBsYWNlICJlc2NyaXR1cmEiIGNvbiAiZW5zZcOxYW56YSIgeSB0ZW5kcsOhIGxhIHJhesOzbiBwb3IgbGEgcXVlIGhhZ28gbG8gcXVlIGhhZ28uCgpHcmFjaWFzIHBvciBsZWVyLiBFc3Blcm8gcXVlIHBvZGFtb3MgZW5zZcOxYXIganVudG9zIGFsZ8O6biBkw61hLiBIYXN0YSBlbnRvbmNlczoKCkNvbWllbmNlIGRvbmRlIGVzdMOhLgpVc2EgbG8gcXVlIHRpZW5lcy4KQXl1ZGEgYSBxdWllbiBwdWVkYXMu