R notebooks (Cuadernos de R)

Este es un cuaderno [R Markdown] (http://rmarkdown.rstudio.com). Cuando ejecuta código dentro del cuaderno, los resultados aparecen debajo del código.

Intente ejecutar este fragmento haciendo clic en el botón Run dentro del fragmento o colocando el cursor dentro de él y presionando Ctrl+ Mayús +Enter.

5 + 3

Agregue un nuevo fragmento haciendo clic en el botón Insert chunk en la barra de herramientas o presionando Ctrl+Alt+I.

Cuando guarde el cuaderno, un archivo HTML que contiene el código y la salida se guardará junto a él (haga clic en el botón Preview o presione Ctrl + Mayús + K para obtener una vista previa del archivo HTML).

La vista previa muestra una copia HTML renderizada del contenido del editor. En consecuencia, a diferencia de Knit, Preview no ejecuta ningún fragmento de código R. En su lugar, se muestra la salida del fragmento cuando se ejecutó por última vez en el editor.

Ahora, resolvamos el caso de estudio.

Paquetes Requeridos

Antes de correr estos paquetes, instalelos por favor:

library(dplyr)
library(readxl)
library(ggplot2)
library(Hmisc)
library(RcmdrMisc)

Ahora, establecemos el tema clásico:

theme_set(theme_classic())

Introducción

Contexto del problema

La sostenibilidad es la capacidad de la humanidad para convivir con la naturaleza sin alterar su homeostasis. Una acción que contribuye enormemente a lograrlo es el ahorro energético. Por esta razón, el rendimiento energético de los edificios es un campo de investigación activo. Algunos informes oficiales sugieren que el consumo de energía al alza ha aumentado en los últimos años debido al uso de calefacción, refrigeración y ventilación en interiores.

Contexto analítico

Suponga que es contratado como ingeniero en una empresa consultora para una Oficina de Urbanismo y su cliente está interesado en estudiar el impacto de la geometría del edificio en el consumo de energía para el aire acondicionado en interiores. Con este resultado, redactarían políticas y regulaciones para gobernar la construcción de nuevos edificios.

Estás a cargo de la EDA. Tu objetivo será:

  1. Extraer y la información relevante de los datos. Deberá manipular varios conjuntos de datos para obtener información útil para el caso.

  2. Realizar análisis de datos exploratorios. Tendrá que crear gráficos significativos y estudiar la relación entre varias características de los edificios existentes.

Los datos

El conjunto de datos se obtiene de una simulación de edificios de 771,75 \(m^3\). Este contiene ocho características y dos variables de respuesta (resultados), indicadas por (outcomes), y1ey2`, como sigue:

En los datos se encuentran cinco escenarios de distribución diferentes para cada área de acristalamiento: (1) uniforme: con un 25% de acristalamiento en cada lado, (2) norte: 55% en el lado norte y 15% en cada uno de los otros lados, (3) este: 55% en el lado este y 15% en cada uno de los otros lados, (4) sur: 55% en el lado sur y 15% en cada uno de los otros lados, y (5) oeste: 55% en el oeste lado y 15% en cada uno de los otros lados. (0) parece ser para edificios sin vidrios.

Echemos un vistazo al marco de datos:

buildings <- read_xlsx(path='ENB2012_data.xlsx', sheet=1)
head(buildings)

y también mira dentro:

str(buildings)
buildings$X2

Además, podemos ver que se utilizaron tres tipos de áreas de acristalamiento, que se expresan como porcentajes del área del piso: 10%, 25% y 40%.

Ejercicio 0

Hay algunas características categóricas que R ha interpretado como numéricas. Conviértelos en categóricos usando la función factor() y guárdelos en nuevas columnas.

# Code here
buildings$X6_f <- factor(buildings$X6)
buildings$X7_f <- factor(buildings$X7)
buildings$X8_f <- factor(buildings$X8)
head(buildings)

Ejercicio 1

Un conjunto de datos está equilibrado (balanceado) si tiene el mismo (al menos, similar) número de muestras para cada valor de una variable categórica. Examine los datos y determine cuántos puntos de datos hay para cada orientación, cada área de acristalamiento y la distribución de cada área de acristalamiento.

¿Está balanceado el conjunto de datos para la variable área de acristalamiento?

Sugerencia: Utilice la función count () del paquete ** dplyr ** .

# Code here

Eiercicio 2

Utilice el resultado del ejercicio 1 para trazar los resultados para el área de acristalamiento variable. Sugerencia: debes identificar qué gráfico realizar.

# Code here

Ahora, hagamos un análisis marginal, es decir, comparación por parejas.

Eiercicio 3

¿Qué distribución de la superficie acristalada es mejor? Calcule estadísticas resumidas de respuestas por grupos. Tome la característica X8, filtre los marcos de datos para cada valor y calcule las estadísticas de resumen para cada caso. Utilice la función numSummary () de RcmdrMisc.

# Code here

Bonificación (opcional): también puede usar describe () de ** Hmisc ** para calcular estadísticas resumidas. Sugerencia: Para obtener más información sobre describe (), ejecute ?describe después de cargar el paquete ** Hmisc ** .

# Code here

Eiercicio 4

¿Cómo influye la orientación y el área de acristalamiento en el consumo de energía? Utilice diagramas de caja para responder a esta pregunta.

# Code here

Ahora, use otras gráficas para responder a esta pregunta. Sugerencia: en las notas de clase exploramos gráficos básicos. Por favor, sea creativo. Tal vez sea más fácil probar ggplots.

Eiercicio 5

¿Cuál de las características (geométricas) tiene poca influencia en las respuestas? Sugerencia: use la comparación por pares entre las características y las respuestas para dar la respuesta.

# Code here
plot(select(buildings, c(X1:X3,Y1:Y2)))
plot(select(buildings, c(X4:X6,Y1:Y2)))
plot(select(buildings, c(X7:X8,Y1:Y2)))

Conclusión

En base a su análisis, proporcione una respuesta breve: ¿qué configuración permite obtener un edificio más eficiente?

LS0tDQp0aXRsZTogIk51ZXN0cm8gcHJpbWVyIEFFRCAoQW7DoWxpc2lzIEV4cGxvcmF0b3JpbyBkZSBEYXRvcykiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojIyBSIG5vdGVib29rcyAoQ3VhZGVybm9zIGRlIFIpDQpFc3RlIGVzIHVuIGN1YWRlcm5vIFtSIE1hcmtkb3duXSAoaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkuIEN1YW5kbyBlamVjdXRhIGPDs2RpZ28gZGVudHJvIGRlbCBjdWFkZXJubywgbG9zIHJlc3VsdGFkb3MgYXBhcmVjZW4gZGViYWpvIGRlbCBjw7NkaWdvLg0KDQpJbnRlbnRlIGVqZWN1dGFyIGVzdGUgZnJhZ21lbnRvIGhhY2llbmRvIGNsaWMgZW4gZWwgYm90w7NuICpSdW4qIGRlbnRybyBkZWwgZnJhZ21lbnRvIG8gY29sb2NhbmRvIGVsIGN1cnNvciBkZW50cm8gZGUgw6lsIHkgcHJlc2lvbmFuZG8gKkN0cmwrIE1hecO6cyArRW50ZXIqLg0KDQpgYGB7cn0NCjUgKyAzDQpgYGANCg0KQWdyZWd1ZSB1biBudWV2byBmcmFnbWVudG8gaGFjaWVuZG8gY2xpYyBlbiBlbCBib3TDs24gKkluc2VydCBjaHVuayogZW4gbGEgYmFycmEgZGUgaGVycmFtaWVudGFzIG8gcHJlc2lvbmFuZG8gKkN0cmwrQWx0K0kqLg0KDQpDdWFuZG8gZ3VhcmRlIGVsIGN1YWRlcm5vLCB1biBhcmNoaXZvIEhUTUwgcXVlIGNvbnRpZW5lIGVsIGPDs2RpZ28geSBsYSBzYWxpZGEgc2UgZ3VhcmRhcsOhIGp1bnRvIGEgw6lsIChoYWdhIGNsaWMgZW4gZWwgYm90w7NuICpQcmV2aWV3KiBvIHByZXNpb25lICpDdHJsICsgTWF5w7pzICsgSyoNCnBhcmEgb2J0ZW5lciB1bmEgdmlzdGEgcHJldmlhIGRlbCBhcmNoaXZvIEhUTUwpLg0KDQpMYSB2aXN0YSBwcmV2aWEgbXVlc3RyYSB1bmEgY29waWEgSFRNTCByZW5kZXJpemFkYSBkZWwgY29udGVuaWRvIGRlbCBlZGl0b3IuIEVuIGNvbnNlY3VlbmNpYSwgYSBkaWZlcmVuY2lhIGRlICpLbml0KiwgKlByZXZpZXcqIG5vIGVqZWN1dGEgbmluZ8O6biBmcmFnbWVudG8gZGUNCmPDs2RpZ28gUi4gRW4gc3UgbHVnYXIsIHNlIG11ZXN0cmEgbGEgc2FsaWRhIGRlbCBmcmFnbWVudG8gY3VhbmRvIHNlIGVqZWN1dMOzIHBvciDDumx0aW1hIHZleiBlbiBlbCBlZGl0b3IuDQoNCkFob3JhLCByZXNvbHZhbW9zIGVsIGNhc28gZGUgZXN0dWRpby4NCg0KIyMgUGFxdWV0ZXMgUmVxdWVyaWRvcw0KDQpBbnRlcyBkZSBjb3JyZXIgZXN0b3MgcGFxdWV0ZXMsIGluc3RhbGVsb3MgcG9yIGZhdm9yOg0KDQpgYGB7ciwgd2FybmluZz1GQUxTRSwgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShIbWlzYykNCmxpYnJhcnkoUmNtZHJNaXNjKQ0KYGBgDQoNCkFob3JhLCBlc3RhYmxlY2Vtb3MgZWwgdGVtYSBjbMOhc2ljbzoNCg0KYGBge3J9DQp0aGVtZV9zZXQodGhlbWVfY2xhc3NpYygpKQ0KYGBgDQoNCg0KIyMgSW50cm9kdWNjacOzbg0KDQojIyMgQ29udGV4dG8gZGVsIHByb2JsZW1hDQoNCkxhIHNvc3RlbmliaWxpZGFkIGVzIGxhIGNhcGFjaWRhZCBkZSBsYSBodW1hbmlkYWQgcGFyYSBjb252aXZpciBjb24gbGEgbmF0dXJhbGV6YSBzaW4gYWx0ZXJhciBzdSBob21lb3N0YXNpcy4gVW5hIGFjY2nDs24gcXVlIGNvbnRyaWJ1eWUgZW5vcm1lbWVudGUgYSBsb2dyYXJsbyBlcyBlbCBhaG9ycm8NCmVuZXJnw6l0aWNvLiBQb3IgZXN0YSByYXrDs24sIGVsIHJlbmRpbWllbnRvIGVuZXJnw6l0aWNvIGRlIGxvcyBlZGlmaWNpb3MgZXMgdW4gY2FtcG8gZGUgaW52ZXN0aWdhY2nDs24gYWN0aXZvLiBBbGd1bm9zIGluZm9ybWVzIG9maWNpYWxlcyBzdWdpZXJlbiBxdWUgZWwgY29uc3VtbyBkZSBlbmVyZ8OtYSBhbA0KYWx6YSBoYSBhdW1lbnRhZG8gZW4gbG9zIMO6bHRpbW9zIGHDsW9zIGRlYmlkbyBhbCB1c28gZGUgY2FsZWZhY2Npw7NuLCByZWZyaWdlcmFjacOzbiB5IHZlbnRpbGFjacOzbiBlbiBpbnRlcmlvcmVzLg0KDQojIyMgQ29udGV4dG8gYW5hbMOtdGljbw0KDQpTdXBvbmdhIHF1ZSBlcyBjb250cmF0YWRvIGNvbW8gaW5nZW5pZXJvIGVuIHVuYSBlbXByZXNhIGNvbnN1bHRvcmEgcGFyYSB1bmEgT2ZpY2luYSBkZSBVcmJhbmlzbW8geSBzdSBjbGllbnRlIGVzdMOhIGludGVyZXNhZG8gZW4gZXN0dWRpYXIgKiplbCBpbXBhY3RvIGRlIGxhIGdlb21ldHLDrWEgZGVsIGVkaWZpY2lvIGVuIGVsIGNvbnN1bW8gZGUgZW5lcmfDrWEgcGFyYSBlbCBhaXJlIGFjb25kaWNpb25hZG8gZW4gaW50ZXJpb3JlcyoqLiBDb24gZXN0ZSByZXN1bHRhZG8sIHJlZGFjdGFyw61hbiBwb2zDrXRpY2FzIHkgcmVndWxhY2lvbmVzIHBhcmEgZ29iZXJuYXIgbGEgY29uc3RydWNjacOzbiBkZSBudWV2b3MgZWRpZmljaW9zLg0KDQpFc3TDoXMgYSBjYXJnbyBkZSBsYSBFREEuIFR1IG9iamV0aXZvIHNlcsOhOg0KDQoxLiBFeHRyYWVyIHkgbGEgaW5mb3JtYWNpw7NuIHJlbGV2YW50ZSBkZSBsb3MgZGF0b3MuIERlYmVyw6EgbWFuaXB1bGFyIHZhcmlvcyBjb25qdW50b3MgZGUgZGF0b3MgcGFyYSBvYnRlbmVyIGluZm9ybWFjacOzbiDDunRpbCBwYXJhIGVsIGNhc28uDQoNCjIuIFJlYWxpemFyIGFuw6FsaXNpcyBkZSBkYXRvcyBleHBsb3JhdG9yaW9zLiBUZW5kcsOhIHF1ZSBjcmVhciBncsOhZmljb3Mgc2lnbmlmaWNhdGl2b3MgeSBlc3R1ZGlhciBsYSByZWxhY2nDs24gZW50cmUgdmFyaWFzIGNhcmFjdGVyw61zdGljYXMgZGUgbG9zIGVkaWZpY2lvcyBleGlzdGVudGVzLg0KDQojIyBMb3MgZGF0b3MNCg0KRWwgY29uanVudG8gZGUgZGF0b3Mgc2Ugb2J0aWVuZSBkZSB1bmEgc2ltdWxhY2nDs24gZGUgZWRpZmljaW9zIGRlIDc3MSw3NSAkbV4zJC4gRXN0ZSBjb250aWVuZSBvY2hvIGNhcmFjdGVyw61zdGljYXMgeSBkb3MgdmFyaWFibGVzIGRlIHJlc3B1ZXN0YSAocmVzdWx0YWRvcyksIGluZGljYWRhcyBwb3IgKG91dGNvbWVzKSwgeTFgIGUgYHkyYCwgY29tbyBzaWd1ZToNCg0KLSBgWDFgIENvbXBhY3RhY2nDs24gcmVsYXRpdmENCi0gYFgyYCDDgXJlYSBzdXBlcmZpY2lhbA0KLSBgWDNgIMOBcmVhIGRlIHBhcmVkDQotIGBYNGAgQXJlYSBkZWwgdGVjaG8NCi0gYFg1YCBBbHR1cmEgdG90YWwNCi0gYFg2YCBPcmllbnRhY2nDs24NCi0gYFg3YCDDgXJlYSBkZSBhY3Jpc3RhbGFtaWVudG8NCi0gYFg4YCBEaXN0cmlidWNpw7NuIGRlbCDDoXJlYSBkZSBhY3Jpc3RhbGFtaWVudG8NCi0gYHkxYCBDYXJnYSBkZSBjYWxlbnRhbWllbnRvDQotIGB5MmAgQ2FyZ2EgZGUgZW5mcmlhbWllbnRvDQoNCkVuIGxvcyBkYXRvcyBzZSBlbmN1ZW50cmFuIGNpbmNvIGVzY2VuYXJpb3MgZGUgZGlzdHJpYnVjacOzbiBkaWZlcmVudGVzIHBhcmEgY2FkYSDDoXJlYSBkZSBhY3Jpc3RhbGFtaWVudG86ICgxKSB1bmlmb3JtZTogY29uIHVuIDI1JSBkZSBhY3Jpc3RhbGFtaWVudG8gZW4gY2FkYSBsYWRvLCAoMikgbm9ydGU6IDU1JSBlbiBlbCBsYWRvIG5vcnRlIHkgMTUlIGVuIGNhZGEgdW5vIGRlIGxvcyBvdHJvcyBsYWRvcywgKDMpIGVzdGU6IDU1JSBlbiBlbCBsYWRvIGVzdGUgeSAxNSUgZW4gY2FkYSB1bm8gZGUgbG9zIG90cm9zIGxhZG9zLCAoNCkgc3VyOiA1NSUgZW4gZWwgbGFkbyBzdXIgeSAxNSUgZW4gY2FkYSB1bm8gZGUgbG9zIG90cm9zIGxhZG9zLCB5ICg1KSBvZXN0ZTogNTUlIGVuIGVsIG9lc3RlIGxhZG8geSAxNSUgZW4gY2FkYSB1bm8gZGUgbG9zIG90cm9zIGxhZG9zLiAoMCkgcGFyZWNlIHNlciBwYXJhIGVkaWZpY2lvcyBzaW4gdmlkcmlvcy4NCg0KRWNoZW1vcyB1biB2aXN0YXpvIGFsIG1hcmNvIGRlIGRhdG9zOg0KDQpgYGB7cn0NCmJ1aWxkaW5ncyA8LSByZWFkX3hsc3gocGF0aD0nRU5CMjAxMl9kYXRhLnhsc3gnLCBzaGVldD0xKQ0KaGVhZChidWlsZGluZ3MpDQpgYGANCg0KeSB0YW1iacOpbiBtaXJhIGRlbnRybzoNCg0KYGBge3J9DQpzdHIoYnVpbGRpbmdzKQ0KYGBgDQpgYGB7cn0NCmJ1aWxkaW5ncyRYMg0KYGBgDQoNCkFkZW3DoXMsIHBvZGVtb3MgdmVyIHF1ZSBzZSB1dGlsaXphcm9uIHRyZXMgdGlwb3MgZGUgw6FyZWFzIGRlIGFjcmlzdGFsYW1pZW50bywgcXVlIHNlIGV4cHJlc2FuIGNvbW8gcG9yY2VudGFqZXMgZGVsIMOhcmVhIGRlbCBwaXNvOiAxMCUsIDI1JSB5IDQwJS4NCg0KDQojIyBFamVyY2ljaW8gMA0KDQpIYXkgYWxndW5hcyBjYXJhY3RlcsOtc3RpY2FzIGNhdGVnw7NyaWNhcyBxdWUgUiBoYSBpbnRlcnByZXRhZG8gY29tbyBudW3DqXJpY2FzLiBDb252acOpcnRlbG9zIGVuIGNhdGVnw7NyaWNvcyB1c2FuZG8gbGEgZnVuY2nDs24gYGZhY3RvcigpYCB5IGd1w6FyZGVsb3MgZW4gbnVldmFzIGNvbHVtbmFzLg0KDQpgYGB7cn0NCiMgQ29kZSBoZXJlDQpidWlsZGluZ3MkWDZfZiA8LSBmYWN0b3IoYnVpbGRpbmdzJFg2KQ0KYnVpbGRpbmdzJFg3X2YgPC0gZmFjdG9yKGJ1aWxkaW5ncyRYNykNCmJ1aWxkaW5ncyRYOF9mIDwtIGZhY3RvcihidWlsZGluZ3MkWDgpDQpgYGANCg0KYGBge3J9DQpoZWFkKGJ1aWxkaW5ncykNCmBgYA0KDQoNCiMjIEVqZXJjaWNpbyAxDQoNClVuIGNvbmp1bnRvIGRlIGRhdG9zIGVzdMOhIGVxdWlsaWJyYWRvIChiYWxhbmNlYWRvKSBzaSB0aWVuZSBlbCBtaXNtbyAoYWwgbWVub3MsIHNpbWlsYXIpIG7Dum1lcm8gZGUgbXVlc3RyYXMgcGFyYSBjYWRhIHZhbG9yIGRlIHVuYSB2YXJpYWJsZSBjYXRlZ8OzcmljYS4gRXhhbWluZSBsb3MgZGF0b3MgeSBkZXRlcm1pbmUNCmN1w6FudG9zIHB1bnRvcyBkZSBkYXRvcyBoYXkgcGFyYSBjYWRhIG9yaWVudGFjacOzbiwgY2FkYSDDoXJlYSBkZSBhY3Jpc3RhbGFtaWVudG8geSBsYSBkaXN0cmlidWNpw7NuIGRlIGNhZGEgw6FyZWEgZGUgYWNyaXN0YWxhbWllbnRvLg0KDQrCv0VzdMOhIGJhbGFuY2VhZG8gZWwgY29uanVudG8gZGUgZGF0b3MgcGFyYSBsYSB2YXJpYWJsZSBfw6FyZWEgZGUgYWNyaXN0YWxhbWllbnRvXz8NCg0KX1N1Z2VyZW5jaWE6IFV0aWxpY2UgbGEgZnVuY2nDs24gYGNvdW50ICgpYCBkZWwgcGFxdWV0ZSAqKiBkcGx5ciAqKiAuXw0KDQpgYGB7cn0NCiMgQ29kZSBoZXJlDQpgYGANCg0KIyMgRWllcmNpY2lvIDINCg0KVXRpbGljZSBlbCByZXN1bHRhZG8gZGVsIGVqZXJjaWNpbyAxIHBhcmEgdHJhemFyIGxvcyByZXN1bHRhZG9zIHBhcmEgZWwgw6FyZWEgZGUgYWNyaXN0YWxhbWllbnRvIHZhcmlhYmxlLiBfU3VnZXJlbmNpYTpfIGRlYmVzIGlkZW50aWZpY2FyIHF1w6kgZ3LDoWZpY28gcmVhbGl6YXIuDQoNCmBgYHtyfQ0KIyBDb2RlIGhlcmUNCmBgYA0KDQpBaG9yYSwgaGFnYW1vcyB1biBhbsOhbGlzaXMgbWFyZ2luYWwsIGVzIGRlY2lyLCBjb21wYXJhY2nDs24gcG9yIHBhcmVqYXMuDQoNCiMjIEVpZXJjaWNpbyAzDQoNCsK/UXXDqSBkaXN0cmlidWNpw7NuIGRlIGxhIHN1cGVyZmljaWUgYWNyaXN0YWxhZGEgZXMgbWVqb3I/IENhbGN1bGUgZXN0YWTDrXN0aWNhcyByZXN1bWlkYXMgZGUgcmVzcHVlc3RhcyBwb3IgZ3J1cG9zLiBUb21lIGxhIGNhcmFjdGVyw61zdGljYSBgWDhgLCBmaWx0cmUgbG9zIG1hcmNvcyBkZSBkYXRvcyBwYXJhIGNhZGEgdmFsb3IgeSBjYWxjdWxlIGxhcyBlc3RhZMOtc3RpY2FzIGRlIHJlc3VtZW4gcGFyYSBjYWRhIGNhc28uIFV0aWxpY2UgbGEgZnVuY2nDs24gYG51bVN1bW1hcnkgKClgIGRlICoqUmNtZHJNaXNjKiouDQoNCmBgYHtyfQ0KIyBDb2RlIGhlcmUNCmBgYA0KDQoqKkJvbmlmaWNhY2nDs24gKG9wY2lvbmFsKSoqOiB0YW1iacOpbiBwdWVkZSB1c2FyIGBkZXNjcmliZSAoKWAgZGUgKiogSG1pc2MgKiogcGFyYSBjYWxjdWxhciBlc3RhZMOtc3RpY2FzIHJlc3VtaWRhcy4NCl9TdWdlcmVuY2lhOiBQYXJhIG9idGVuZXIgbcOhcyBpbmZvcm1hY2nDs24gc29icmUgYGRlc2NyaWJlICgpYCwgZWplY3V0ZSBgP2Rlc2NyaWJlYCBkZXNwdcOpcyBkZSBjYXJnYXIgZWwgcGFxdWV0ZSAqKiBIbWlzYyAqKiAuXw0KDQpgYGB7cn0NCiMgQ29kZSBoZXJlDQpgYGANCg0KIyMgRWllcmNpY2lvIDQNCg0Kwr9Dw7NtbyBpbmZsdXllIGxhIG9yaWVudGFjacOzbiB5IGVsIMOhcmVhIGRlIGFjcmlzdGFsYW1pZW50byBlbiBlbCBjb25zdW1vIGRlIGVuZXJnw61hPyBVdGlsaWNlIGRpYWdyYW1hcyBkZSBjYWphIHBhcmEgcmVzcG9uZGVyIGEgZXN0YSBwcmVndW50YS4NCg0KYGBge3J9DQojIENvZGUgaGVyZQ0KYGBgDQoNCkFob3JhLCB1c2Ugb3RyYXMgZ3LDoWZpY2FzIHBhcmEgcmVzcG9uZGVyIGEgZXN0YSBwcmVndW50YS4gX1N1Z2VyZW5jaWE6XyBlbiBsYXMgbm90YXMgZGUgY2xhc2UgZXhwbG9yYW1vcyBncsOhZmljb3MgYsOhc2ljb3MuIFBvciBmYXZvciwgc2VhIGNyZWF0aXZvLiBUYWwgdmV6IHNlYSBtw6FzIGbDoWNpbA0KcHJvYmFyIF9nZ3Bsb3RzXy4NCg0KIyMgRWllcmNpY2lvIDUNCg0Kwr9DdcOhbCBkZSBsYXMgY2FyYWN0ZXLDrXN0aWNhcyAoZ2VvbcOpdHJpY2FzKSB0aWVuZSBwb2NhIGluZmx1ZW5jaWEgZW4gbGFzIHJlc3B1ZXN0YXM/IF9TdWdlcmVuY2lhOl8gdXNlIGxhIGNvbXBhcmFjacOzbiBwb3IgcGFyZXMgZW50cmUgbGFzIGNhcmFjdGVyw61zdGljYXMgeSBsYXMgcmVzcHVlc3RhcyBwYXJhIGRhciBsYSByZXNwdWVzdGEuDQoNCmBgYHtyfQ0KIyBDb2RlIGhlcmUNCnBsb3Qoc2VsZWN0KGJ1aWxkaW5ncywgYyhYMTpYMyxZMTpZMikpKQ0KcGxvdChzZWxlY3QoYnVpbGRpbmdzLCBjKFg0Olg2LFkxOlkyKSkpDQpwbG90KHNlbGVjdChidWlsZGluZ3MsIGMoWDc6WDgsWTE6WTIpKSkNCmBgYA0KDQojIyBDb25jbHVzacOzbg0KDQpFbiBiYXNlIGEgc3UgYW7DoWxpc2lzLCBwcm9wb3JjaW9uZSB1bmEgcmVzcHVlc3RhIGJyZXZlOiDCv3F1w6kgY29uZmlndXJhY2nDs24gcGVybWl0ZSBvYnRlbmVyIHVuIGVkaWZpY2lvIG3DoXMgZWZpY2llbnRlPw0K