ProyectoFinal-Energia

Andrea Borboa, Irving Flores, Tatiana Hinostro

5/12/2021

INTRODUCCIÓN

Se observa en el mundo que la generación de energía eléctrica está muy relacionada con el desarrollo de un país. La razón de esta nota técnica es dar a conocer el parque eléctrico nacional que tiene México, cómo ha crecido en centrales, potencia y generación a través del tiempo; conocer cuál es la demanda actual de este fluido en el ámbito nacional, y su proyección a futuro. Otro objetivo de este trabajo es proponer el incremento de las fuentes de generación de energía eléctrica por medio de fuentes que utilicen recursos renovables, a fin de mitigar el cambio climático, sin descuidar el abasto de energía, para no frenar el desarrollo nacional.

ANTECEDENTES

La generación de energía eléctrica inició en México a fines del siglo XIX. La primera planta generadora que se instaló en el país (1879) estuvo en León, Guanajuato, y era utilizada por la fábrica textil “La Americana”. Casi inmediatamente se extendió esta forma de generar electricidad dentro de la producción minera y escasamente para la iluminación residencial y pública.

En 1889 operaba la primera planta hidroeléctrica en Batopilas (Chihuahua) y extendió sus redes de distribución hacia mercados urbanos y comerciales donde la población era de mayor capacidad económica.

Durante el régimen de Porfirio Díaz se otorgó al sector eléctrico el carácter de servicio público, colocándose las primeras 40 lámparas “de arco” en la Plaza de la Constitución, cien más en la Alameda Central, y comenzó la iluminación de la entonces calle de Reforma y de algunas otras vías de la Ciudad de México.

En 1937 México tenía 18.3 millones de habitantes, de los cuales únicamente siete millones contaban con electricidad, proporcionada con serias dificultades por tres empresas privadas.

En ese momento las interrupciones de luz eran constantes y las tarifas muy elevadas.

Para resolver esa situación que no permitía el desarrollo del país, el gobierno federal creó, el 14 de agosto de 1937, la Comisión Federal de Electricidad (CFE), que tendría por objeto organizar y dirigir un sistema nacional de generación, transmisión y distribución de energía eléctrica, basado en principios técnicos y económicos, sin propósitos de lucro y con la finalidad de obtener con un costo mínimo, el mayor rendimiento posible en beneficio de los intereses generales. (Ley promulgada en la Ciudad de Mérida, Yucatán el 14 de agosto de 1937 y publicada en el Diario Oficial de la Federación el 24 de agosto de 1937).

Actualmente (septiembre, 2020), cuenta con 335 mil 195 torres de transmisión y subtransmisión; 110,187 kilómetros de longitud de línea (cables); 2,236 subestaciones de potencia y 50,808 kilómetros de longitud de la Red Nacional de Comunicaciones, cable de Fibra Óptica. Tiene 16 Gerencias Divisionales de Distribución y 1,269 Centros de Atención a Clientes.

Su parque de generación está conformado por 192 centrales: ciclo combinado, termoeléctricas, hidroeléctricas, carboeléctricas, nucleoeléctrica, turbogás, geotermoeléctrica, eoloeléctrica, diesel y fotovoltaicas.

La CFE es reconocida como una de las mayores empresas eléctricas del mundo y su objetivo principal es proveer el servicio de energía eléctrica a la población mexicana.

OBJETIVOS PARTICULARES

1.-¿Como es el panorama general de generación de energía eléctrica en México? 2.-Como está Sonora en términos de capacidad de generacion de energia, tomando en cuenta el crecimiento poblacional, vamos a poder abastecer de energia a la poblacion?

TEORÍA

¿Que es la energía electrica?

La energía eléctrica es el movimiento de electrones. Definimos energía eléctrica o electricidad como la forma de energía que resulta de la existencia de una diferencia de potencial entre dos puntos.

Cuando estos dos puntos se los pone en contacto mediante un conductor eléctrico obtenemos una corriente eléctrica.

La electricidad tiene muchas aplicaciones técnicas. Muchos de los fenómenos relacionados con la electricidad pueden medirse y calcularse previamente con gran precisión.

Caracteristicas de la Energía Electrica

De forma habitual, estas cargas eléctricas negativas (electrones) se mueven a través del conductor eléctrico. Normalmente el conductor es de un material metálico debido a que disponen de mayor cantidad de electrones libres.

Las cargas eléctricas que se desplazan a través del conductor forman parte de los átomos de las sustancias del propio conductor.

En general, un átomo tiene carga neutra. Esto significa que tiene el mismo número de cargas positivas (protones) que negativas (neutrones). Sin embargo, algunos átomos tienen carga eléctrica: son los iones

¿Como se genera?

La energía eléctrica apenas no se puede encontrar de forma libre en la naturaleza de una forma que pueda ser aprovechable. Se puede observar en las tormentas eléctricas pero a la práctica no se pueden almacenar y controlar tal cantidad de energía.

Las centrales eléctricas son capaces de producir electricidad desde diferentes fuentes. Los diferentes tipos de centrales dependerá de la fuente de energía que utilicen.

Estas fuentes las podemos clasificar en:

Fuentes de energía renovables. Fuentes de energía no-renovables.

MÉTODOS

Para responder estas preguntas se utilizaran los siguientes datos:

-Generación bruta de energía en México. -Compradores de energía en méxico -Capacidad efectiva por entidad federativa de energía electrica

Los cuales pueden ser consultados en los siguientes enlaces:

https://datos.gob.mx/busca/dataset/generacion-bruta-de-electricidad-por-tecnologia

https://datos.gob.mx/busca/dataset/capacidad-efectiva-por-entidad-federativa-de-energia-electrica

https://datos.gob.mx/busca/dataset/electricidad

Además se utilizaran los siguientes metododos estadisticos:

-Serie de tiempo -Analisis Comparativo -Primedios anuales

Resultados y discución

Importamos Librerias

library(pacman)
p_load(rmdformats, readr, readxl, ggplot2, plotly, DT, xfun, gridExtra, leaflet, GGally, psych, corrplot, cluster, plotly, gapminder,forecast,tseries,lattice,ggfortify,zoo)
library(readr)
Ventasenergy <- read_csv("Ventasenergy.csv")
## Rows: 155 Columns: 8
## -- Column specification --------------------------------------------------------
## Delimiter: ","
## dbl (8): Total, Residencial, Comercial, Servicios, Agricola, Industrial, Emp...
## 
## i Use `spec()` to retrieve the full column specification for this data.
## i Specify the column types or set `show_col_types = FALSE` to quiet this message.
View(Ventasenergy)
GeneracionFechas <- read_csv("GeneracionFechas.csv")
## Rows: 156 Columns: 18
## -- Column specification --------------------------------------------------------
## Delimiter: ","
## dbl (18): Anhos, Total, Termoelectrica, Vapor, Ciclo_combinado, CFE_1, PIE, ...
## 
## i Use `spec()` to retrieve the full column specification for this data.
## i Specify the column types or set `show_col_types = FALSE` to quiet this message.
View(GeneracionFechas)
GeneracionEnergy <- read_csv("GeneracionEnergy.csv")
## New names:
## * CFE -> CFE...5
## * `PIE (1)` -> `PIE (1)...6`
## * CFE -> CFE...14
## * `PIE (1)` -> `PIE (1)...15`
## Rows: 156 Columns: 17
## -- Column specification --------------------------------------------------------
## Delimiter: ","
## dbl (17): Total, Termoelectrica, Vapor, Ciclo combinado, CFE...5, PIE (1)......
## 
## i Use `spec()` to retrieve the full column specification for this data.
## i Specify the column types or set `show_col_types = FALSE` to quiet this message.
View(GeneracionEnergy)
base <- read_csv("base.csv")
## Rows: 156 Columns: 28
## -- Column specification --------------------------------------------------------
## Delimiter: ","
## dbl (28): Baja California, Baja California Sur, Campeche, Chiapas, Chihuahua...
## 
## i Use `spec()` to retrieve the full column specification for this data.
## i Specify the column types or set `show_col_types = FALSE` to quiet this message.
View(base)
CapacidadEnergy <- read_csv("CapacidadEnergy.csv")
## New names:
## * `47001.11` -> `47001.11...6`
## * `47001.11` -> `47001.11...7`
## * `46464.31` -> `46464.31...11`
## * `46464.31` -> `46464.31...12`
## * `46531.15` -> `46531.15...15`
## * ...
## Rows: 28 Columns: 158
## -- Column specification --------------------------------------------------------
## Delimiter: ","
## chr  (12): Total, 55574.556, 55607.556...149, 55607.556...150, 55606.187...1...
## dbl (146): 46537.6, 46536.81, 47035.41, 47535.41, 47001.11...6, 47001.11...7...
## 
## i Use `spec()` to retrieve the full column specification for this data.
## i Specify the column types or set `show_col_types = FALSE` to quiet this message.
View(CapacidadEnergy)
GeneracionEnergy.ts=ts(GeneracionEnergy, start = 2005,frequency = 12)

Se realizo un analisis mediante los graficos acontinuación presentados:

Electricidad <- ggplot(GeneracionFechas)+
  geom_line(aes(x=Anhos,y=Termoelectrica,colour="Termoelectrica"))+
    geom_line(aes(x=Anhos,y=Vapor,colour="Vapor"))+
    geom_line(aes(x=Anhos,y=Ciclo_combinado,colour="Ciclo combinado"))+
  geom_line(aes(x=Anhos,y=CFE_1,colour="CFE"))+
    geom_line(aes(x=Anhos,y=PIE,colour="PIE"))+
    geom_line(aes(x=Anhos,y=Turbogas,colour="Turbogas"))+
    geom_line(aes(x=Anhos,y=Combustion_interna,colour="Combustion interna"))+
  geom_line(aes(x=Anhos,y=Dual,colour="DUAL"))+
    geom_line(aes(x=Anhos,y=Carboelectrica,colour="Carboelectrica"))+
    geom_line(aes(x=Anhos,y=Geotermolectrica,colour="Geotermolectrica"))+
  geom_line(aes(x=Anhos,y=Nucleoelectrica,colour="Nucleoelectrica"))+
    geom_line(aes(x=Anhos,y=Eolica,colour="Eolica"))+
    geom_line(aes(x=Anhos,y=CFE_2,colour="CFE"))+
  geom_line(aes(x=Anhos,y=PIE_1,colour="PIE_1"))+
    geom_line(aes(x=Anhos,y=Hidroelectrica,colour="Hidroelectrica"))+
    geom_line(aes(x=Anhos,y=Fotovoltaica,colour="Fotovoltaica"))+
    labs(title="Reporte de Generación de energía",x="Fecha",y="Energía")


ggplotly(Electricidad)

En este grafico se muestra como los diferentes sectores generan energía, dandonos un alto porcentaje en el sector industrial ya que el consumo generado de energía por termoelectricas es el más alto hasta el momento y esto nos indica que muchas industrias aun no tratan de analizar como pudiera ser eficiente el consumo de energia para beneficiar con el uso de nuevas tecnologías y energias renovables.

GeneracionFechas%>%
  names()
##  [1] "Anhos"              "Total"              "Termoelectrica"    
##  [4] "Vapor"              "Ciclo_combinado"    "CFE_1"             
##  [7] "PIE"                "Turbogas"           "Combustion_interna"
## [10] "Dual"               "Carboelectrica"     "Geotermolectrica"  
## [13] "Nucleoelectrica"    "Eolica"             "CFE_2"             
## [16] "PIE_1"              "Hidroelectrica"     "Fotovoltaica"

#Energía Generada en México

#Capacidad de energia Mexico

base.ts=ts(base, start = 2005,frequency = 12)
autoplot(base.ts, xlab="Años", ylab="Energía", main="Capacidad de Energía")

### Este grafico nos indica que atraves de los años los estados de la republica mexicana han generado una mayor capacidad de energía puesto que esto se debe a que la energía electrica esta llegando a todas las comunidades donde antes no se contaba con el servicio.

Sonora.ts=ts(base.ts[,24], start = 2005,frequency = 12)
autoplot(Sonora.ts, xlab="Años", ylab="Energía", main="Energia en Sonora", colour = "purple")

# Energía Electrica en Sonora ### En este grafico se logra analizar como alrededor del año 2013 la energia electrica aumento en el estado de Sonora para despues lograr un consumo menor alrededor del año 2014, dandonos cuenta que problablemente existio una mayor producción de comercio para que surgiera el consumo de energias primarias y secundarias en transformación.

VENTAS DE ENERGÍA ELECTRICA

Ventasenergy.ts=ts(Ventasenergy, start = 2005,frequency = 12)
autoplot(Ventasenergy.ts, xlab="Años", ylab="Ventas energía", main="Compradores de Energía Electrica y Ventas")

### En el grafico “Compradores de energía electrica” se logra observar como existe una mayor venta de energia en el sector agricola e industrial, y que son los que generan un mayor consumo de energía confirmando así la información consultada donde nos dice que la industria por su acelerado desarrollo, lo que los lleva a realizar convenios con empresas que generen consumo de energias renovables para una mayor eficiencia.

servicios.ts=ts(Ventasenergy.ts[,4], start = 2005, frequency = 12)
autoplot(servicios.ts, colour = "Magenta", xlab = "años", ylab = "Ventas", main="Ventas de Energía a Servicios")

### Aquí se realizo el siguiente grafico con la finalidad de indagar a fondo sobre las ventas de energía a servicios donde existe un pico alrededor del año 2013 confirmando lo anteriormente mencionado que existe una mayor demanda de produccion en el estado de Sonora lo que genero un consumo mayor.

Industrias.ts=ts(Ventasenergy.ts[,8], start = 2005, frequency = 12)
autoplot(Industrias.ts, colour = "red" , xlab="Años", ylab="Ventas", main="Ventas de energía a Industrias")

### Las ventas de energía a industrias siempre indican un mayor aumento a principio y finales de año ya que es cuando exigen un mayor rendimiento para su producción, lo que nos indica que las industrias manejan un rango de producción estrategicamente para ahorrar gastos y hacer eficiente el consumo de energía.

Estadistica Descriptiva

Generacion de energía en México

names(GeneracionEnergy) [1] <- "1"
names(GeneracionEnergy)[2] <- "2"
names(GeneracionEnergy)[3] <- "3"
names(GeneracionEnergy)[4] <- "4"
names(GeneracionEnergy)[5] <- "5"
names(GeneracionEnergy)[6] <- "6"
names(GeneracionEnergy)[7] <- "7"
names(GeneracionEnergy)[8] <- "8"
names(GeneracionEnergy)[9] <- "9"
names(GeneracionEnergy)[10] <- "10"
names(GeneracionEnergy)[11] <- "11"
names(GeneracionEnergy)[12] <- "12"
names(GeneracionEnergy)[13] <- "13"
names(GeneracionEnergy)[14] <- "14"
names(GeneracionEnergy)[15] <- "15"
names(GeneracionEnergy)[16] <- "16"
names(GeneracionEnergy)[17] <- "17"
boxplot(GeneracionEnergy, main= "Generación de Energía", ylab="Energia",xlab="Categoria", col = rainbow(ncol(GeneracionEnergy)))

### Existen diferentes tipos de energía que se pueden categorizar para analizar que tipo genera un mayor consumo como lo muestra el grafico.

summary(GeneracionEnergy) 
##        1                  2                  3                 4           
##  Min.   :15577533   Min.   :10331146   Min.   :1503008   Min.   : 4987603  
##  1st Qu.:18892873   1st Qu.:12537526   1st Qu.:2974517   1st Qu.: 8815889  
##  Median :20133709   Median :13692202   Median :3759207   Median : 9726007  
##  Mean   :20492573   Mean   :13748318   Mean   :3781962   Mean   : 9537640  
##  3rd Qu.:22210866   3rd Qu.:14959046   3rd Qu.:4596420   3rd Qu.:10796477  
##  Max.   :25187626   Max.   :17892462   Max.   :5850912   Max.   :12299316  
##        5                 6                 7                8         
##  Min.   :1530718   Min.   :3019979   Min.   : 39370   Min.   : 41751  
##  1st Qu.:2627984   1st Qu.:6130131   1st Qu.:198011   1st Qu.: 87467  
##  Median :3102047   Median :6640034   Median :289234   Median :105372  
##  Mean   :3166364   Mean   :6371275   Mean   :318633   Mean   :110083  
##  3rd Qu.:3679124   3rd Qu.:7101767   3rd Qu.:420014   3rd Qu.:130699  
##  Max.   :4515546   Max.   :7862715   Max.   :961949   Max.   :206368  
##        9                 10                11               12         
##  Min.   :      0   Min.   :1043342   Min.   :403339   Min.   :  67531  
##  1st Qu.: 613027   1st Qu.:1363302   1st Qu.:504250   1st Qu.: 719561  
##  Median :1116736   Median :1531070   Median :535037   Median : 940047  
##  Mean   : 917569   Mean   :1730957   Mean   :541300   Mean   : 843841  
##  3rd Qu.:1287381   3rd Qu.:1719758   3rd Qu.:576832   3rd Qu.:1001680  
##  Max.   :1747974   Max.   :3370106   Max.   :664233   Max.   :1179548  
##        13               14              15               16         
##  Min.   :   196   Min.   :  196   Min.   :     0   Min.   :1026103  
##  1st Qu.: 11622   1st Qu.: 8063   1st Qu.:     0   1st Qu.:2042564  
##  Median : 28523   Median :13644   Median :     0   Median :2531674  
##  Mean   : 88370   Mean   :13841   Mean   : 74529   Mean   :2621809  
##  3rd Qu.:159198   3rd Qu.:19981   3rd Qu.:142181   3rd Qu.:3155817  
##  Max.   :320174   Max.   :37711   Max.   :301580   Max.   :5927349  
##        17        
##  Min.   :   0.0  
##  1st Qu.:   0.0  
##  Median :   0.0  
##  Mean   : 409.4  
##  3rd Qu.: 941.1  
##  Max.   :2076.4

Ventas de energía y Compradores

names(Ventasenergy) [1] <- "Total"
names(Ventasenergy)[2] <- "C2"
names(Ventasenergy)[3] <- "C3"
names(Ventasenergy)[4] <- "C4"
names(Ventasenergy)[5] <- "C5"
names(Ventasenergy)[6] <- "C6"
names(Ventasenergy)[7] <- "C7"
names(Ventasenergy)[8] <- "C8"
boxplot(Ventasenergy, main="Ventas Energía y Compradores", ylab="Ventas", xlab="Compradores", col=rainbow(ncol(Ventasenergy)))

### Los compradores a traves de el grafico nos muestran como hay mayores compras y por lo tanto ventas en el rango C6.

summary(Ventasenergy) 
##      Total                C2                C3                C4         
##  Min.   :12538886   Min.   :2896777   Min.   : 924609   Min.   : 506517  
##  1st Qu.:15012213   1st Qu.:3593316   1st Qu.:1065454   1st Qu.: 579979  
##  Median :16079752   Median :4075946   Median :1153860   Median : 673598  
##  Mean   :16319818   Mean   :4237194   Mean   :1153467   Mean   : 659441  
##  3rd Qu.:17881757   3rd Qu.:4762456   3rd Qu.:1219744   3rd Qu.: 708973  
##  Max.   :20799210   Max.   :6240224   Max.   :1398128   Max.   :1401087  
##        C5                C6                 C7                C8         
##  Min.   : 397743   Min.   : 7356544   Min.   :4471911   Min.   :2379151  
##  1st Qu.: 579317   1st Qu.: 8802070   1st Qu.:5568001   1st Qu.:3131213  
##  Median : 776266   Median : 9349133   Median :6064118   Median :3321533  
##  Mean   : 801466   Mean   : 9468251   Mean   :6121878   Mean   :3346373  
##  3rd Qu.: 964071   3rd Qu.:10342441   3rd Qu.:6708489   3rd Qu.:3592222  
##  Max.   :1513284   Max.   :11747054   Max.   :8189389   Max.   :4099213

CONCLUSIONES

El consumo de energia electricae en Mexico a comparación con los demas paises muestra como Mexico no invierte en energias renovables, que esto generaria un beneficio tanto economicamente hablando para el pais como en desarrollo a nivel mundial, generando empleos y nuevas tecnologías al invertir en ello.

REFERENCIAS BIBLIOGRÁFICAS

CFE. Programa de Obras e Inversiones del Sector Eléctrico. POISE (2011-2025). México, D.F.: Comisión Federal de Electricidad, 2010.

CFE. Estadísticas año 2011. Comisión Federal de Electricidad, Subdirección de Generación, 2011. Disponible en World Wide Web: www.cfe.gob.mx.

DOF. Ley para el Aprovechamiento de Energías Renovables y el Financiamiento de la Transición Energética, México. DOF 12-01-2012.

INTERNATIONAL ENERGY AGENCY. World Energy Balances, OECD and OECD data bases. 2008 Edition. International Energy Agency, 2008. Disponible en World Wide Web: www.iea.org.

INTERNATIONAL ENERGY AGENCY. Statistics and balances retrieved 2008 1-5-8, Implementing Agreement on Ocean Energy Systems. In: 2009 Annual Report. International Energy Agency, 2010.

INTERNATIONAL ENERGY AGENCY. Energy use in the new millennium - Trends in IEA countries Magazine.

INTERGOVERNMENTAL PANEL ON CLIMATE CHANGE. Task force on national greenhouse gas inventories - Guidelines. Vol. 2. Energy. Intergovernmental Panel On Climate Change, 2006.

SENER. Planeación energética. (PRONASE), Eficiencia energética para México. México, D.F.: Secretaría de Energía, 2010.

Descargar Codigo

xfun::embed_file("base.csv")

Download base.csv

xfun::embed_file("Ventasenergy.csv")

Download Ventasenergy.csv

xfun::embed_file("GeneracionEnergy.csv")

Download GeneracionEnergy.csv

xfun::embed_file("GeneracionFechas.csv")

Download GeneracionFechas.csv

xfun::embed_file("ProyectoFinal-Energia.rmd")

Download ProyectoFinal-Energia.rmd

LS0tDQp0aXRsZTogIlByb3llY3RvRmluYWwtRW5lcmdpYSINCmF1dGhvcjogIkFuZHJlYSBCb3Jib2EsIElydmluZyBGbG9yZXMsIFRhdGlhbmEgSGlub3N0cm8iDQpkYXRlOiAiNS8xMi8yMDIxIg0Kb3V0cHV0OiAgDQogIHJtZGZvcm1hdHM6OmRvd25jdXRlOiANCiAgICBoaWdobGlnaHQ6IHRhbmdvIA0KICAgIGNvZGVfZm9sZGluZzogaGlkZSANCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KDQojIElOVFJPRFVDQ0nDk04NClNlIG9ic2VydmEgZW4gZWwgbXVuZG8gcXVlIGxhIGdlbmVyYWNpw7NuIGRlIGVuZXJnw61hIGVsw6ljdHJpY2EgZXN0w6EgbXV5IHJlbGFjaW9uYWRhIGNvbiBlbCBkZXNhcnJvbGxvIGRlIHVuIHBhw61zLiBMYSByYXrDs24gZGUgZXN0YSBub3RhIHTDqWNuaWNhIGVzIGRhciBhIGNvbm9jZXIgZWwgcGFycXVlIGVsw6ljdHJpY28gbmFjaW9uYWwgcXVlIHRpZW5lIE3DqXhpY28sIGPDs21vIGhhIGNyZWNpZG8gZW4gY2VudHJhbGVzLCBwb3RlbmNpYSB5IGdlbmVyYWNpw7NuIGEgdHJhdsOpcyBkZWwgdGllbXBvOyBjb25vY2VyIGN1w6FsIGVzIGxhIGRlbWFuZGEgYWN0dWFsIGRlIGVzdGUgZmx1aWRvIGVuIGVsIMOhbWJpdG8gbmFjaW9uYWwsIHkgc3UgcHJveWVjY2nDs24gYSBmdXR1cm8uIE90cm8gb2JqZXRpdm8gZGUgZXN0ZSB0cmFiYWpvIGVzIHByb3BvbmVyIGVsIGluY3JlbWVudG8gZGUgbGFzIGZ1ZW50ZXMgZGUgZ2VuZXJhY2nDs24gZGUgZW5lcmfDrWEgZWzDqWN0cmljYSBwb3IgbWVkaW8gZGUgZnVlbnRlcyBxdWUgdXRpbGljZW4gcmVjdXJzb3MgcmVub3ZhYmxlcywgYSBmaW4gZGUgbWl0aWdhciBlbCBjYW1iaW8gY2xpbcOhdGljbywgc2luIGRlc2N1aWRhciBlbCBhYmFzdG8gZGUgZW5lcmfDrWEsIHBhcmEgbm8gZnJlbmFyIGVsIGRlc2Fycm9sbG8gbmFjaW9uYWwuDQoNCiMjIEFOVEVDRURFTlRFUw0KDQpMYSBnZW5lcmFjacOzbiBkZSBlbmVyZ8OtYSBlbMOpY3RyaWNhIGluaWNpw7MgZW4gTcOpeGljbyBhIGZpbmVzIGRlbCBzaWdsbyBYSVguIExhIHByaW1lcmEgcGxhbnRhIGdlbmVyYWRvcmEgcXVlIHNlIGluc3RhbMOzIGVuIGVsIHBhw61zICgxODc5KSBlc3R1dm8gZW4gTGXDs24sIEd1YW5hanVhdG8sIHkgZXJhIHV0aWxpemFkYSBwb3IgbGEgZsOhYnJpY2EgdGV4dGlsIOKAnExhIEFtZXJpY2FuYSIuIENhc2kgaW5tZWRpYXRhbWVudGUgc2UgZXh0ZW5kacOzIGVzdGEgZm9ybWEgZGUgZ2VuZXJhciBlbGVjdHJpY2lkYWQgZGVudHJvIGRlIGxhIHByb2R1Y2Npw7NuIG1pbmVyYSB5IGVzY2FzYW1lbnRlIHBhcmEgbGEgaWx1bWluYWNpw7NuIHJlc2lkZW5jaWFsIHkgcMO6YmxpY2EuDQoNCkVuIDE4ODkgb3BlcmFiYSBsYSBwcmltZXJhIHBsYW50YSBoaWRyb2Vsw6ljdHJpY2EgZW4gQmF0b3BpbGFzIChDaGlodWFodWEpIHkgZXh0ZW5kacOzIHN1cyByZWRlcyBkZSBkaXN0cmlidWNpw7NuIGhhY2lhIG1lcmNhZG9zIHVyYmFub3MgeSBjb21lcmNpYWxlcyBkb25kZSBsYSBwb2JsYWNpw7NuIGVyYSBkZSBtYXlvciBjYXBhY2lkYWQgZWNvbsOzbWljYS4NCg0KRHVyYW50ZSBlbCByw6lnaW1lbiBkZSBQb3JmaXJpbyBEw61heiBzZSBvdG9yZ8OzIGFsIHNlY3RvciBlbMOpY3RyaWNvIGVsIGNhcsOhY3RlciBkZSBzZXJ2aWNpbyBww7pibGljbywgY29sb2PDoW5kb3NlIGxhcyBwcmltZXJhcyA0MCBsw6FtcGFyYXMgImRlIGFyY28iIGVuIGxhIFBsYXphIGRlIGxhIENvbnN0aXR1Y2nDs24sIGNpZW4gbcOhcyBlbiBsYSBBbGFtZWRhIENlbnRyYWwsIHkgY29tZW56w7MgbGEgaWx1bWluYWNpw7NuIGRlIGxhIGVudG9uY2VzIGNhbGxlIGRlIFJlZm9ybWEgeSBkZSBhbGd1bmFzIG90cmFzIHbDrWFzIGRlIGxhIENpdWRhZCBkZSBNw6l4aWNvLg0KDQpFbiAxOTM3IE3DqXhpY28gdGVuw61hIDE4LjMgbWlsbG9uZXMgZGUgaGFiaXRhbnRlcywgZGUgbG9zIGN1YWxlcyDDum5pY2FtZW50ZSBzaWV0ZSBtaWxsb25lcyBjb250YWJhbiBjb24gZWxlY3RyaWNpZGFkLCBwcm9wb3JjaW9uYWRhIGNvbiBzZXJpYXMgZGlmaWN1bHRhZGVzIHBvciB0cmVzIGVtcHJlc2FzIHByaXZhZGFzLg0KDQogRW4gZXNlIG1vbWVudG8gbGFzIGludGVycnVwY2lvbmVzIGRlIGx1eiBlcmFuIGNvbnN0YW50ZXMgeSBsYXMgdGFyaWZhcyBtdXkgZWxldmFkYXMuDQoNClBhcmEgcmVzb2x2ZXIgZXNhIHNpdHVhY2nDs24gcXVlIG5vIHBlcm1pdMOtYSBlbCBkZXNhcnJvbGxvIGRlbCBwYcOtcywgZWwgZ29iaWVybm8gZmVkZXJhbCBjcmXDsywgZWwgMTQgZGUgYWdvc3RvIGRlIDE5MzcsIGxhIENvbWlzacOzbiBGZWRlcmFsIGRlIEVsZWN0cmljaWRhZCAoQ0ZFKSwgcXVlIHRlbmRyw61hIHBvciBvYmpldG8gb3JnYW5pemFyIHkgZGlyaWdpciB1biBzaXN0ZW1hIG5hY2lvbmFsIGRlIGdlbmVyYWNpw7NuLCB0cmFuc21pc2nDs24geSBkaXN0cmlidWNpw7NuIGRlIGVuZXJnw61hIGVsw6ljdHJpY2EsIGJhc2FkbyBlbiBwcmluY2lwaW9zIHTDqWNuaWNvcyB5IGVjb27Ds21pY29zLCBzaW4gcHJvcMOzc2l0b3MgZGUgbHVjcm8geSBjb24gbGEgZmluYWxpZGFkIGRlIG9idGVuZXIgY29uIHVuIGNvc3RvIG3DrW5pbW8sIGVsIG1heW9yIHJlbmRpbWllbnRvIHBvc2libGUgZW4gYmVuZWZpY2lvIGRlIGxvcyBpbnRlcmVzZXMgZ2VuZXJhbGVzLiAoTGV5IHByb211bGdhZGEgZW4gbGEgQ2l1ZGFkIGRlIE3DqXJpZGEsIFl1Y2F0w6FuIGVsIDE0IGRlIGFnb3N0byBkZSAxOTM3IHkgcHVibGljYWRhIGVuIGVsIERpYXJpbyBPZmljaWFsIGRlIGxhIEZlZGVyYWNpw7NuIGVsIDI0IGRlIGFnb3N0byBkZSAxOTM3KS4NCg0KQWN0dWFsbWVudGUgKHNlcHRpZW1icmUsIDIwMjApLCBjdWVudGEgY29uIDMzNSBtaWwgMTk1IHRvcnJlcyBkZSB0cmFuc21pc2nDs24geSBzdWJ0cmFuc21pc2nDs247IDExMCwxODcga2lsw7NtZXRyb3MgZGUgbG9uZ2l0dWQgZGUgbMOtbmVhIChjYWJsZXMpOyAyLDIzNiBzdWJlc3RhY2lvbmVzIGRlIHBvdGVuY2lhIHkgNTAsODA4IGtpbMOzbWV0cm9zIGRlIGxvbmdpdHVkIGRlIGxhIFJlZCBOYWNpb25hbCBkZSBDb211bmljYWNpb25lcywgY2FibGUgZGUgRmlicmEgw5NwdGljYS4gVGllbmUgMTYgR2VyZW5jaWFzIERpdmlzaW9uYWxlcyBkZSBEaXN0cmlidWNpw7NuIHkgMSwyNjkgQ2VudHJvcyBkZSBBdGVuY2nDs24gYSBDbGllbnRlcy4NCg0KU3UgcGFycXVlIGRlIGdlbmVyYWNpw7NuIGVzdMOhIGNvbmZvcm1hZG8gcG9yIDE5MiBjZW50cmFsZXM6IGNpY2xvIGNvbWJpbmFkbywgdGVybW9lbMOpY3RyaWNhcywgaGlkcm9lbMOpY3RyaWNhcywgY2FyYm9lbMOpY3RyaWNhcywgbnVjbGVvZWzDqWN0cmljYSwgdHVyYm9nw6FzLCBnZW90ZXJtb2Vsw6ljdHJpY2EsIGVvbG9lbMOpY3RyaWNhLCBkaWVzZWwgeSBmb3Rvdm9sdGFpY2FzLg0KDQpMYSBDRkUgZXMgcmVjb25vY2lkYSBjb21vIHVuYSBkZSBsYXMgbWF5b3JlcyBlbXByZXNhcyBlbMOpY3RyaWNhcyBkZWwgbXVuZG8geSBzdSBvYmpldGl2byBwcmluY2lwYWwgZXMgcHJvdmVlciBlbCBzZXJ2aWNpbyBkZSBlbmVyZ8OtYSBlbMOpY3RyaWNhIGEgbGEgcG9ibGFjacOzbiBtZXhpY2FuYS4NCg0KDQohW10oaHR0cHM6Ly9pbWFnZW5lcy5taWxlbmlvLmNvbS9iSUFJOUdHdXFSRGV5Rzdwel85QmNZeDJta3c9Lzk1OHg1OTYvaHR0cHM6Ly93d3cubWlsZW5pby5jb20vdXBsb2Fkcy9tZWRpYS8yMDIxLzAyLzExL2xhcy1kaWZlcmVuY2lhcy1lbi1lbC1jb3N0b18wXzI4XzEyMDFfNzQ3LmpwZyl7d2lkdGg9MTAwMCBoZWlnaHQ9aGVpZ2h0fQ0KDQojIE9CSkVUSVZPUyBQQVJUSUNVTEFSRVMNCjEuLcK/Q29tbyBlcyBlbCBwYW5vcmFtYSBnZW5lcmFsIGRlIGdlbmVyYWNpw7NuIGRlIGVuZXJnw61hIGVsw6ljdHJpY2EgZW4gTcOpeGljbz8NCjIuLUNvbW8gZXN0w6EgU29ub3JhIGVuIHTDqXJtaW5vcyBkZSBjYXBhY2lkYWQgZGUgZ2VuZXJhY2lvbiBkZSBlbmVyZ2lhLCB0b21hbmRvIGVuIGN1ZW50YSBlbCBjcmVjaW1pZW50byBwb2JsYWNpb25hbCwgdmFtb3MgYSBwb2RlciBhYmFzdGVjZXIgZGUgZW5lcmdpYSBhIGxhIHBvYmxhY2lvbj8NCg0KIyBURU9Sw41BDQojIyMgwr9RdWUgZXMgbGEgZW5lcmfDrWEgZWxlY3RyaWNhPw0KDQpMYSBlbmVyZ8OtYSBlbMOpY3RyaWNhIGVzIGVsIG1vdmltaWVudG8gZGUgZWxlY3Ryb25lcy4gRGVmaW5pbW9zIGVuZXJnw61hIGVsw6ljdHJpY2EgbyBlbGVjdHJpY2lkYWQgY29tbyBsYSBmb3JtYSBkZSBlbmVyZ8OtYSBxdWUgcmVzdWx0YSBkZSBsYSBleGlzdGVuY2lhIGRlIHVuYSBkaWZlcmVuY2lhIGRlIHBvdGVuY2lhbCBlbnRyZSBkb3MgcHVudG9zLg0KDQpDdWFuZG8gZXN0b3MgZG9zIHB1bnRvcyBzZSBsb3MgcG9uZSBlbiBjb250YWN0byBtZWRpYW50ZSB1biBjb25kdWN0b3IgZWzDqWN0cmljbyBvYnRlbmVtb3MgdW5hIGNvcnJpZW50ZSBlbMOpY3RyaWNhLg0KDQpMYSBlbGVjdHJpY2lkYWQgdGllbmUgbXVjaGFzIGFwbGljYWNpb25lcyB0w6ljbmljYXMuIE11Y2hvcyBkZSBsb3MgZmVuw7NtZW5vcyByZWxhY2lvbmFkb3MgY29uIGxhIGVsZWN0cmljaWRhZCBwdWVkZW4gbWVkaXJzZSB5IGNhbGN1bGFyc2UgcHJldmlhbWVudGUgY29uIGdyYW4gcHJlY2lzacOzbi4NCg0KIyMjIENhcmFjdGVyaXN0aWNhcyBkZSBsYSBFbmVyZ8OtYSBFbGVjdHJpY2ENCkRlIGZvcm1hIGhhYml0dWFsLCBlc3RhcyBjYXJnYXMgZWzDqWN0cmljYXMgbmVnYXRpdmFzIChlbGVjdHJvbmVzKSBzZSBtdWV2ZW4gYSB0cmF2w6lzIGRlbCBjb25kdWN0b3IgZWzDqWN0cmljby4gTm9ybWFsbWVudGUgZWwgY29uZHVjdG9yIGVzIGRlIHVuIG1hdGVyaWFsIG1ldMOhbGljbyBkZWJpZG8gYSBxdWUgZGlzcG9uZW4gZGUgbWF5b3IgY2FudGlkYWQgZGUgZWxlY3Ryb25lcyBsaWJyZXMuDQoNCkxhcyBjYXJnYXMgZWzDqWN0cmljYXMgcXVlIHNlIGRlc3BsYXphbiBhIHRyYXbDqXMgZGVsIGNvbmR1Y3RvciBmb3JtYW4gcGFydGUgZGUgbG9zIMOhdG9tb3MgZGUgbGFzIHN1c3RhbmNpYXMgZGVsIHByb3BpbyBjb25kdWN0b3IuDQoNCkVuIGdlbmVyYWwsIHVuIMOhdG9tbyB0aWVuZSBjYXJnYSBuZXV0cmEuIEVzdG8gc2lnbmlmaWNhIHF1ZSB0aWVuZSBlbCBtaXNtbyBuw7ptZXJvIGRlIGNhcmdhcyBwb3NpdGl2YXMgKHByb3RvbmVzKSBxdWUgbmVnYXRpdmFzIChuZXV0cm9uZXMpLiBTaW4gZW1iYXJnbywgYWxndW5vcyDDoXRvbW9zIHRpZW5lbiBjYXJnYSBlbMOpY3RyaWNhOiBzb24gbG9zIGlvbmVzDQoNCiMjIyDCv0NvbW8gc2UgZ2VuZXJhPw0KTGEgZW5lcmfDrWEgZWzDqWN0cmljYSBhcGVuYXMgbm8gc2UgcHVlZGUgZW5jb250cmFyIGRlIGZvcm1hIGxpYnJlIGVuIGxhIG5hdHVyYWxlemEgZGUgdW5hIGZvcm1hIHF1ZSBwdWVkYSBzZXIgYXByb3ZlY2hhYmxlLiBTZSBwdWVkZSBvYnNlcnZhciBlbiBsYXMgdG9ybWVudGFzIGVsw6ljdHJpY2FzIHBlcm8gYSBsYSBwcsOhY3RpY2Egbm8gc2UgcHVlZGVuIGFsbWFjZW5hciB5IGNvbnRyb2xhciB0YWwgY2FudGlkYWQgZGUgZW5lcmfDrWEuDQoNCkxhcyBjZW50cmFsZXMgZWzDqWN0cmljYXMgc29uIGNhcGFjZXMgZGUgcHJvZHVjaXIgZWxlY3RyaWNpZGFkIGRlc2RlIGRpZmVyZW50ZXMgZnVlbnRlcy4gTG9zIGRpZmVyZW50ZXMgdGlwb3MgZGUgY2VudHJhbGVzIGRlcGVuZGVyw6EgZGUgbGEgZnVlbnRlIGRlIGVuZXJnw61hIHF1ZSB1dGlsaWNlbi4NCg0KRXN0YXMgZnVlbnRlcyBsYXMgcG9kZW1vcyBjbGFzaWZpY2FyIGVuOg0KDQpGdWVudGVzIGRlIGVuZXJnw61hIHJlbm92YWJsZXMuDQpGdWVudGVzIGRlIGVuZXJnw61hIG5vLXJlbm92YWJsZXMuDQoNCg0KIyBNw4lUT0RPUw0KUGFyYSByZXNwb25kZXIgZXN0YXMgcHJlZ3VudGFzIHNlIHV0aWxpemFyYW4gbG9zIHNpZ3VpZW50ZXMgZGF0b3M6DQoNCi1HZW5lcmFjacOzbiBicnV0YSBkZSBlbmVyZ8OtYSBlbiBNw6l4aWNvLg0KLUNvbXByYWRvcmVzIGRlIGVuZXJnw61hIGVuIG3DqXhpY28NCi1DYXBhY2lkYWQgZWZlY3RpdmEgcG9yIGVudGlkYWQgZmVkZXJhdGl2YSBkZSBlbmVyZ8OtYSBlbGVjdHJpY2ENCg0KTG9zIGN1YWxlcyBwdWVkZW4gc2VyIGNvbnN1bHRhZG9zIGVuIGxvcyBzaWd1aWVudGVzIGVubGFjZXM6DQoNCmh0dHBzOi8vZGF0b3MuZ29iLm14L2J1c2NhL2RhdGFzZXQvZ2VuZXJhY2lvbi1icnV0YS1kZS1lbGVjdHJpY2lkYWQtcG9yLXRlY25vbG9naWENCg0KaHR0cHM6Ly9kYXRvcy5nb2IubXgvYnVzY2EvZGF0YXNldC9jYXBhY2lkYWQtZWZlY3RpdmEtcG9yLWVudGlkYWQtZmVkZXJhdGl2YS1kZS1lbmVyZ2lhLWVsZWN0cmljYQ0KDQoNCmh0dHBzOi8vZGF0b3MuZ29iLm14L2J1c2NhL2RhdGFzZXQvZWxlY3RyaWNpZGFkDQoNCkFkZW3DoXMgc2UgdXRpbGl6YXJhbiBsb3Mgc2lndWllbnRlcyBtZXRvZG9kb3MgZXN0YWRpc3RpY29zOg0KDQotU2VyaWUgZGUgdGllbXBvDQotQW5hbGlzaXMgQ29tcGFyYXRpdm8NCi1QcmltZWRpb3MgYW51YWxlcw0KDQoNCiMgUmVzdWx0YWRvcyB5IGRpc2N1Y2nDs24NCg0KSW1wb3J0YW1vcyBMaWJyZXJpYXMNCmBgYHtyfQ0KbGlicmFyeShwYWNtYW4pDQpwX2xvYWQocm1kZm9ybWF0cywgcmVhZHIsIHJlYWR4bCwgZ2dwbG90MiwgcGxvdGx5LCBEVCwgeGZ1biwgZ3JpZEV4dHJhLCBsZWFmbGV0LCBHR2FsbHksIHBzeWNoLCBjb3JycGxvdCwgY2x1c3RlciwgcGxvdGx5LCBnYXBtaW5kZXIsZm9yZWNhc3QsdHNlcmllcyxsYXR0aWNlLGdnZm9ydGlmeSx6b28pDQpgYGANCg0KDQoNCmBgYHtyfQ0KbGlicmFyeShyZWFkcikNClZlbnRhc2VuZXJneSA8LSByZWFkX2NzdigiVmVudGFzZW5lcmd5LmNzdiIpDQpWaWV3KFZlbnRhc2VuZXJneSkNCkdlbmVyYWNpb25GZWNoYXMgPC0gcmVhZF9jc3YoIkdlbmVyYWNpb25GZWNoYXMuY3N2IikNClZpZXcoR2VuZXJhY2lvbkZlY2hhcykNCkdlbmVyYWNpb25FbmVyZ3kgPC0gcmVhZF9jc3YoIkdlbmVyYWNpb25FbmVyZ3kuY3N2IikNClZpZXcoR2VuZXJhY2lvbkVuZXJneSkNCmJhc2UgPC0gcmVhZF9jc3YoImJhc2UuY3N2IikNClZpZXcoYmFzZSkNCkNhcGFjaWRhZEVuZXJneSA8LSByZWFkX2NzdigiQ2FwYWNpZGFkRW5lcmd5LmNzdiIpDQpWaWV3KENhcGFjaWRhZEVuZXJneSkNCg0KDQpgYGANCg0KYGBge3J9DQpHZW5lcmFjaW9uRW5lcmd5LnRzPXRzKEdlbmVyYWNpb25FbmVyZ3ksIHN0YXJ0ID0gMjAwNSxmcmVxdWVuY3kgPSAxMikNCmBgYA0KIyMjIFNlIHJlYWxpem8gdW4gYW5hbGlzaXMgbWVkaWFudGUgbG9zIGdyYWZpY29zIGFjb250aW51YWNpw7NuIHByZXNlbnRhZG9zOg0KDQpgYGB7cn0NCkVsZWN0cmljaWRhZCA8LSBnZ3Bsb3QoR2VuZXJhY2lvbkZlY2hhcykrDQogIGdlb21fbGluZShhZXMoeD1Bbmhvcyx5PVRlcm1vZWxlY3RyaWNhLGNvbG91cj0iVGVybW9lbGVjdHJpY2EiKSkrDQogICAgZ2VvbV9saW5lKGFlcyh4PUFuaG9zLHk9VmFwb3IsY29sb3VyPSJWYXBvciIpKSsNCiAgICBnZW9tX2xpbmUoYWVzKHg9QW5ob3MseT1DaWNsb19jb21iaW5hZG8sY29sb3VyPSJDaWNsbyBjb21iaW5hZG8iKSkrDQogIGdlb21fbGluZShhZXMoeD1Bbmhvcyx5PUNGRV8xLGNvbG91cj0iQ0ZFIikpKw0KICAgIGdlb21fbGluZShhZXMoeD1Bbmhvcyx5PVBJRSxjb2xvdXI9IlBJRSIpKSsNCiAgICBnZW9tX2xpbmUoYWVzKHg9QW5ob3MseT1UdXJib2dhcyxjb2xvdXI9IlR1cmJvZ2FzIikpKw0KICAgIGdlb21fbGluZShhZXMoeD1Bbmhvcyx5PUNvbWJ1c3Rpb25faW50ZXJuYSxjb2xvdXI9IkNvbWJ1c3Rpb24gaW50ZXJuYSIpKSsNCiAgZ2VvbV9saW5lKGFlcyh4PUFuaG9zLHk9RHVhbCxjb2xvdXI9IkRVQUwiKSkrDQogICAgZ2VvbV9saW5lKGFlcyh4PUFuaG9zLHk9Q2FyYm9lbGVjdHJpY2EsY29sb3VyPSJDYXJib2VsZWN0cmljYSIpKSsNCiAgICBnZW9tX2xpbmUoYWVzKHg9QW5ob3MseT1HZW90ZXJtb2xlY3RyaWNhLGNvbG91cj0iR2VvdGVybW9sZWN0cmljYSIpKSsNCiAgZ2VvbV9saW5lKGFlcyh4PUFuaG9zLHk9TnVjbGVvZWxlY3RyaWNhLGNvbG91cj0iTnVjbGVvZWxlY3RyaWNhIikpKw0KICAgIGdlb21fbGluZShhZXMoeD1Bbmhvcyx5PUVvbGljYSxjb2xvdXI9IkVvbGljYSIpKSsNCiAgICBnZW9tX2xpbmUoYWVzKHg9QW5ob3MseT1DRkVfMixjb2xvdXI9IkNGRSIpKSsNCiAgZ2VvbV9saW5lKGFlcyh4PUFuaG9zLHk9UElFXzEsY29sb3VyPSJQSUVfMSIpKSsNCiAgICBnZW9tX2xpbmUoYWVzKHg9QW5ob3MseT1IaWRyb2VsZWN0cmljYSxjb2xvdXI9IkhpZHJvZWxlY3RyaWNhIikpKw0KICAgIGdlb21fbGluZShhZXMoeD1Bbmhvcyx5PUZvdG92b2x0YWljYSxjb2xvdXI9IkZvdG92b2x0YWljYSIpKSsNCiAgICBsYWJzKHRpdGxlPSJSZXBvcnRlIGRlIEdlbmVyYWNpw7NuIGRlIGVuZXJnw61hIix4PSJGZWNoYSIseT0iRW5lcmfDrWEiKQ0KDQoNCmdncGxvdGx5KEVsZWN0cmljaWRhZCkNCmBgYA0KIyMjIEVuIGVzdGUgZ3JhZmljbyBzZSBtdWVzdHJhIGNvbW8gbG9zIGRpZmVyZW50ZXMgc2VjdG9yZXMgZ2VuZXJhbiBlbmVyZ8OtYSwgZGFuZG9ub3MgdW4gYWx0byBwb3JjZW50YWplIGVuIGVsIHNlY3RvciBpbmR1c3RyaWFsIHlhIHF1ZSBlbCBjb25zdW1vIGdlbmVyYWRvIGRlIGVuZXJnw61hIHBvciB0ZXJtb2VsZWN0cmljYXMgZXMgZWwgbcOhcyBhbHRvIGhhc3RhIGVsIG1vbWVudG8geSBlc3RvIG5vcyBpbmRpY2EgcXVlIG11Y2hhcyBpbmR1c3RyaWFzIGF1biBubyB0cmF0YW4gZGUgYW5hbGl6YXIgY29tbyBwdWRpZXJhIHNlciBlZmljaWVudGUgZWwgY29uc3VtbyBkZSBlbmVyZ2lhIHBhcmEgYmVuZWZpY2lhciBjb24gZWwgdXNvIGRlIG51ZXZhcyB0ZWNub2xvZ8OtYXMgeSBlbmVyZ2lhcyByZW5vdmFibGVzLg0KDQoNCg0KYGBge3J9DQpHZW5lcmFjaW9uRmVjaGFzJT4lDQogIG5hbWVzKCkNCmBgYA0KDQoNCg0KDQoNCg0KI0VuZXJnw61hIEdlbmVyYWRhIGVuIE3DqXhpY28NCg0KDQoNCg0KDQojQ2FwYWNpZGFkIGRlIGVuZXJnaWEgTWV4aWNvIA0KDQoNCg0KDQoNCmBgYHtyfQ0KYmFzZS50cz10cyhiYXNlLCBzdGFydCA9IDIwMDUsZnJlcXVlbmN5ID0gMTIpDQpgYGANCg0KYGBge3J9DQphdXRvcGxvdChiYXNlLnRzLCB4bGFiPSJBw7FvcyIsIHlsYWI9IkVuZXJnw61hIiwgbWFpbj0iQ2FwYWNpZGFkIGRlIEVuZXJnw61hIikNCmBgYA0KIyMjIEVzdGUgZ3JhZmljbyBub3MgaW5kaWNhIHF1ZSBhdHJhdmVzIGRlIGxvcyBhw7FvcyBsb3MgZXN0YWRvcyBkZSBsYSByZXB1YmxpY2EgbWV4aWNhbmEgaGFuIGdlbmVyYWRvIHVuYSBtYXlvciBjYXBhY2lkYWQgZGUgZW5lcmfDrWEgcHVlc3RvIHF1ZSBlc3RvIHNlIGRlYmUgYSBxdWUgbGEgZW5lcmfDrWEgZWxlY3RyaWNhIGVzdGEgbGxlZ2FuZG8gYSB0b2RhcyBsYXMgY29tdW5pZGFkZXMgZG9uZGUgYW50ZXMgbm8gc2UgY29udGFiYSBjb24gZWwgc2VydmljaW8uDQoNCg0KYGBge3J9DQpTb25vcmEudHM9dHMoYmFzZS50c1ssMjRdLCBzdGFydCA9IDIwMDUsZnJlcXVlbmN5ID0gMTIpDQpgYGANCg0KYGBge3J9DQphdXRvcGxvdChTb25vcmEudHMsIHhsYWI9IkHDsW9zIiwgeWxhYj0iRW5lcmfDrWEiLCBtYWluPSJFbmVyZ2lhIGVuIFNvbm9yYSIsIGNvbG91ciA9ICJwdXJwbGUiKQ0KYGBgDQojIEVuZXJnw61hIEVsZWN0cmljYSBlbiBTb25vcmENCiMjIyBFbiBlc3RlIGdyYWZpY28gc2UgbG9ncmEgYW5hbGl6YXIgY29tbyBhbHJlZGVkb3IgZGVsIGHDsW8gMjAxMyBsYSBlbmVyZ2lhIGVsZWN0cmljYSBhdW1lbnRvIGVuIGVsIGVzdGFkbyBkZSBTb25vcmEgcGFyYSBkZXNwdWVzIGxvZ3JhciB1biBjb25zdW1vIG1lbm9yIGFscmVkZWRvciBkZWwgYcOxbyAyMDE0LCBkYW5kb25vcyBjdWVudGEgcXVlIHByb2JsYWJsZW1lbnRlIGV4aXN0aW8gdW5hIG1heW9yIHByb2R1Y2Npw7NuIGRlIGNvbWVyY2lvIHBhcmEgcXVlIHN1cmdpZXJhIGVsIGNvbnN1bW8gZGUgZW5lcmdpYXMgcHJpbWFyaWFzIHkgc2VjdW5kYXJpYXMgZW4gdHJhbnNmb3JtYWNpw7NuLg0KDQoNCg0KIyMgVkVOVEFTIERFIEVORVJHw41BIEVMRUNUUklDQQ0KYGBge3J9DQpWZW50YXNlbmVyZ3kudHM9dHMoVmVudGFzZW5lcmd5LCBzdGFydCA9IDIwMDUsZnJlcXVlbmN5ID0gMTIpDQpgYGANCg0KYGBge3J9DQphdXRvcGxvdChWZW50YXNlbmVyZ3kudHMsIHhsYWI9IkHDsW9zIiwgeWxhYj0iVmVudGFzIGVuZXJnw61hIiwgbWFpbj0iQ29tcHJhZG9yZXMgZGUgRW5lcmfDrWEgRWxlY3RyaWNhIHkgVmVudGFzIikNCmBgYA0KIyMjIEVuIGVsIGdyYWZpY28gIkNvbXByYWRvcmVzIGRlIGVuZXJnw61hIGVsZWN0cmljYSIgc2UgbG9ncmEgb2JzZXJ2YXIgY29tbyBleGlzdGUgdW5hIG1heW9yIHZlbnRhIGRlIGVuZXJnaWEgZW4gZWwgc2VjdG9yIGFncmljb2xhIGUgaW5kdXN0cmlhbCwgeSBxdWUgc29uIGxvcyBxdWUgZ2VuZXJhbiB1biBtYXlvciBjb25zdW1vIGRlIGVuZXJnw61hIGNvbmZpcm1hbmRvIGFzw60gbGEgaW5mb3JtYWNpw7NuIGNvbnN1bHRhZGEgZG9uZGUgbm9zIGRpY2UgcXVlIGxhIGluZHVzdHJpYSBwb3Igc3UgYWNlbGVyYWRvIGRlc2Fycm9sbG8sIGxvIHF1ZSBsb3MgbGxldmEgYSByZWFsaXphciBjb252ZW5pb3MgY29uIGVtcHJlc2FzIHF1ZSBnZW5lcmVuIGNvbnN1bW8gZGUgZW5lcmdpYXMgcmVub3ZhYmxlcyBwYXJhIHVuYSBtYXlvciBlZmljaWVuY2lhLg0KDQoNCmBgYHtyfQ0Kc2VydmljaW9zLnRzPXRzKFZlbnRhc2VuZXJneS50c1ssNF0sIHN0YXJ0ID0gMjAwNSwgZnJlcXVlbmN5ID0gMTIpDQphdXRvcGxvdChzZXJ2aWNpb3MudHMsIGNvbG91ciA9ICJNYWdlbnRhIiwgeGxhYiA9ICJhw7FvcyIsIHlsYWIgPSAiVmVudGFzIiwgbWFpbj0iVmVudGFzIGRlIEVuZXJnw61hIGEgU2VydmljaW9zIikNCmBgYA0KIyMjIEFxdcOtIHNlIHJlYWxpem8gZWwgc2lndWllbnRlIGdyYWZpY28gY29uIGxhIGZpbmFsaWRhZCBkZSBpbmRhZ2FyIGEgZm9uZG8gc29icmUgbGFzIHZlbnRhcyBkZSBlbmVyZ8OtYSBhIHNlcnZpY2lvcyBkb25kZSBleGlzdGUgdW4gcGljbyBhbHJlZGVkb3IgZGVsIGHDsW8gMjAxMyBjb25maXJtYW5kbyBsbyBhbnRlcmlvcm1lbnRlIG1lbmNpb25hZG8gcXVlIGV4aXN0ZSB1bmEgbWF5b3IgZGVtYW5kYSBkZSBwcm9kdWNjaW9uIGVuIGVsIGVzdGFkbyBkZSBTb25vcmEgbG8gcXVlIGdlbmVybyB1biBjb25zdW1vIG1heW9yLg0KDQoNCmBgYHtyfQ0KSW5kdXN0cmlhcy50cz10cyhWZW50YXNlbmVyZ3kudHNbLDhdLCBzdGFydCA9IDIwMDUsIGZyZXF1ZW5jeSA9IDEyKQ0KYXV0b3Bsb3QoSW5kdXN0cmlhcy50cywgY29sb3VyID0gInJlZCIgLCB4bGFiPSJBw7FvcyIsIHlsYWI9IlZlbnRhcyIsIG1haW49IlZlbnRhcyBkZSBlbmVyZ8OtYSBhIEluZHVzdHJpYXMiKQ0KYGBgDQojIyMgTGFzIHZlbnRhcyBkZSBlbmVyZ8OtYSBhIGluZHVzdHJpYXMgc2llbXByZSBpbmRpY2FuIHVuIG1heW9yIGF1bWVudG8gYSBwcmluY2lwaW8geSBmaW5hbGVzIGRlIGHDsW8geWEgcXVlIGVzIGN1YW5kbyBleGlnZW4gdW4gbWF5b3IgcmVuZGltaWVudG8gcGFyYSBzdSBwcm9kdWNjacOzbiwgbG8gcXVlIG5vcyBpbmRpY2EgcXVlIGxhcyBpbmR1c3RyaWFzIG1hbmVqYW4gdW4gcmFuZ28gZGUgcHJvZHVjY2nDs24gZXN0cmF0ZWdpY2FtZW50ZSBwYXJhIGFob3JyYXIgZ2FzdG9zIHkgaGFjZXIgZWZpY2llbnRlIGVsIGNvbnN1bW8gZGUgZW5lcmfDrWEuDQoNCg0KDQojIEVzdGFkaXN0aWNhIERlc2NyaXB0aXZhDQoNCg0KIyMgR2VuZXJhY2lvbiBkZSBlbmVyZ8OtYSBlbiBNw6l4aWNvDQpgYGB7cn0NCm5hbWVzKEdlbmVyYWNpb25FbmVyZ3kpIFsxXSA8LSAiMSINCm5hbWVzKEdlbmVyYWNpb25FbmVyZ3kpWzJdIDwtICIyIg0KbmFtZXMoR2VuZXJhY2lvbkVuZXJneSlbM10gPC0gIjMiDQpuYW1lcyhHZW5lcmFjaW9uRW5lcmd5KVs0XSA8LSAiNCINCm5hbWVzKEdlbmVyYWNpb25FbmVyZ3kpWzVdIDwtICI1Ig0KbmFtZXMoR2VuZXJhY2lvbkVuZXJneSlbNl0gPC0gIjYiDQpuYW1lcyhHZW5lcmFjaW9uRW5lcmd5KVs3XSA8LSAiNyINCm5hbWVzKEdlbmVyYWNpb25FbmVyZ3kpWzhdIDwtICI4Ig0KbmFtZXMoR2VuZXJhY2lvbkVuZXJneSlbOV0gPC0gIjkiDQpuYW1lcyhHZW5lcmFjaW9uRW5lcmd5KVsxMF0gPC0gIjEwIg0KbmFtZXMoR2VuZXJhY2lvbkVuZXJneSlbMTFdIDwtICIxMSINCm5hbWVzKEdlbmVyYWNpb25FbmVyZ3kpWzEyXSA8LSAiMTIiDQpuYW1lcyhHZW5lcmFjaW9uRW5lcmd5KVsxM10gPC0gIjEzIg0KbmFtZXMoR2VuZXJhY2lvbkVuZXJneSlbMTRdIDwtICIxNCINCm5hbWVzKEdlbmVyYWNpb25FbmVyZ3kpWzE1XSA8LSAiMTUiDQpuYW1lcyhHZW5lcmFjaW9uRW5lcmd5KVsxNl0gPC0gIjE2Ig0KbmFtZXMoR2VuZXJhY2lvbkVuZXJneSlbMTddIDwtICIxNyINCmBgYA0KDQpgYGB7cn0NCmJveHBsb3QoR2VuZXJhY2lvbkVuZXJneSwgbWFpbj0gIkdlbmVyYWNpw7NuIGRlIEVuZXJnw61hIiwgeWxhYj0iRW5lcmdpYSIseGxhYj0iQ2F0ZWdvcmlhIiwgY29sID0gcmFpbmJvdyhuY29sKEdlbmVyYWNpb25FbmVyZ3kpKSkNCmBgYA0KIyMjIEV4aXN0ZW4gZGlmZXJlbnRlcyB0aXBvcyBkZSBlbmVyZ8OtYSBxdWUgc2UgcHVlZGVuIGNhdGVnb3JpemFyIHBhcmEgYW5hbGl6YXIgcXVlIHRpcG8gZ2VuZXJhIHVuIG1heW9yIGNvbnN1bW8gY29tbyBsbyBtdWVzdHJhIGVsIGdyYWZpY28uDQoNCg0KDQoNCmBgYHtyfQ0Kc3VtbWFyeShHZW5lcmFjaW9uRW5lcmd5KSANCmBgYA0KDQoNCg0KDQoNCiMjIFZlbnRhcyBkZSBlbmVyZ8OtYSB5IENvbXByYWRvcmVzDQpgYGB7cn0NCm5hbWVzKFZlbnRhc2VuZXJneSkgWzFdIDwtICJUb3RhbCINCm5hbWVzKFZlbnRhc2VuZXJneSlbMl0gPC0gIkMyIg0KbmFtZXMoVmVudGFzZW5lcmd5KVszXSA8LSAiQzMiDQpuYW1lcyhWZW50YXNlbmVyZ3kpWzRdIDwtICJDNCINCm5hbWVzKFZlbnRhc2VuZXJneSlbNV0gPC0gIkM1Ig0KbmFtZXMoVmVudGFzZW5lcmd5KVs2XSA8LSAiQzYiDQpuYW1lcyhWZW50YXNlbmVyZ3kpWzddIDwtICJDNyINCm5hbWVzKFZlbnRhc2VuZXJneSlbOF0gPC0gIkM4Ig0KYGBgDQoNCmBgYHtyfQ0KYm94cGxvdChWZW50YXNlbmVyZ3ksIG1haW49IlZlbnRhcyBFbmVyZ8OtYSB5IENvbXByYWRvcmVzIiwgeWxhYj0iVmVudGFzIiwgeGxhYj0iQ29tcHJhZG9yZXMiLCBjb2w9cmFpbmJvdyhuY29sKFZlbnRhc2VuZXJneSkpKQ0KYGBgDQojIyMgTG9zIGNvbXByYWRvcmVzIGEgdHJhdmVzIGRlIGVsIGdyYWZpY28gbm9zIG11ZXN0cmFuIGNvbW8gaGF5IG1heW9yZXMgY29tcHJhcyB5IHBvciBsbyB0YW50byB2ZW50YXMgZW4gZWwgcmFuZ28gQzYuDQoNCmBgYHtyfQ0Kc3VtbWFyeShWZW50YXNlbmVyZ3kpIA0KYGBgDQoNCg0KDQoNCiMgQ09OQ0xVU0lPTkVTDQpFbCBjb25zdW1vIGRlIGVuZXJnaWEgZWxlY3RyaWNhZSBlbiBNZXhpY28gYSBjb21wYXJhY2nDs24gY29uIGxvcyBkZW1hcyBwYWlzZXMgbXVlc3RyYSBjb21vIE1leGljbyBubyBpbnZpZXJ0ZSBlbiBlbmVyZ2lhcyByZW5vdmFibGVzLCBxdWUgZXN0byBnZW5lcmFyaWEgdW4gYmVuZWZpY2lvIHRhbnRvIGVjb25vbWljYW1lbnRlIGhhYmxhbmRvIHBhcmEgZWwgcGFpcyBjb21vIGVuIGRlc2Fycm9sbG8gYSBuaXZlbCBtdW5kaWFsLCBnZW5lcmFuZG8gZW1wbGVvcyB5IG51ZXZhcyB0ZWNub2xvZ8OtYXMgYWwgaW52ZXJ0aXIgZW4gZWxsby4NCg0KIyBSRUZFUkVOQ0lBUyBCSUJMSU9HUsOBRklDQVMNCkNGRS4gUHJvZ3JhbWEgZGUgT2JyYXMgZSBJbnZlcnNpb25lcyBkZWwgU2VjdG9yIEVsw6ljdHJpY28uIFBPSVNFICgyMDExLTIwMjUpLiBNw6l4aWNvLCBELkYuOiBDb21pc2nDs24gRmVkZXJhbCBkZSBFbGVjdHJpY2lkYWQsIDIwMTAuICANCg0KQ0ZFLiBFc3RhZMOtc3RpY2FzIGHDsW8gMjAxMS4gQ29taXNpw7NuIEZlZGVyYWwgZGUgRWxlY3RyaWNpZGFkLCBTdWJkaXJlY2Npw7NuIGRlIEdlbmVyYWNpw7NuLCAyMDExLiBEaXNwb25pYmxlIGVuIFdvcmxkIFdpZGUgV2ViOiB3d3cuY2ZlLmdvYi5teC4gICAgICAgIA0KDQpET0YuIExleSBwYXJhIGVsIEFwcm92ZWNoYW1pZW50byBkZSBFbmVyZ8OtYXMgUmVub3ZhYmxlcyB5IGVsIEZpbmFuY2lhbWllbnRvIGRlIGxhIFRyYW5zaWNpw7NuIEVuZXJnw6l0aWNhLCBNw6l4aWNvLiBET0YgMTItMDEtMjAxMi4gICAgICAgIA0KDQpJTlRFUk5BVElPTkFMIEVORVJHWSBBR0VOQ1kuIFdvcmxkIEVuZXJneSBCYWxhbmNlcywgT0VDRCBhbmQgT0VDRCBkYXRhIGJhc2VzLiAyMDA4IEVkaXRpb24uIEludGVybmF0aW9uYWwgRW5lcmd5IEFnZW5jeSwgMjAwOC4gRGlzcG9uaWJsZSBlbiBXb3JsZCBXaWRlIFdlYjogd3d3LmllYS5vcmcuICAgICAgICANCg0KSU5URVJOQVRJT05BTCBFTkVSR1kgQUdFTkNZLiBTdGF0aXN0aWNzIGFuZCBiYWxhbmNlcyByZXRyaWV2ZWQgMjAwOCAxLTUtOCwgSW1wbGVtZW50aW5nIEFncmVlbWVudCBvbiBPY2VhbiBFbmVyZ3kgU3lzdGVtcy4gSW46IDIwMDkgQW5udWFsIFJlcG9ydC4gSW50ZXJuYXRpb25hbCBFbmVyZ3kgQWdlbmN5LCAyMDEwLiAgIA0KDQpJTlRFUk5BVElPTkFMIEVORVJHWSBBR0VOQ1kuIEVuZXJneSB1c2UgaW4gdGhlIG5ldyBtaWxsZW5uaXVtIC0gVHJlbmRzIGluIElFQSBjb3VudHJpZXMgTWFnYXppbmUuICAgICANCg0KSU5URVJHT1ZFUk5NRU5UQUwgUEFORUwgT04gQ0xJTUFURSBDSEFOR0UuIFRhc2sgZm9yY2Ugb24gbmF0aW9uYWwgZ3JlZW5ob3VzZSBnYXMgaW52ZW50b3JpZXMgLSBHdWlkZWxpbmVzLiBWb2wuIDIuIEVuZXJneS4gSW50ZXJnb3Zlcm5tZW50YWwgUGFuZWwgT24gQ2xpbWF0ZSBDaGFuZ2UsIDIwMDYuICAgICANCg0KU0VORVIuIFBsYW5lYWNpw7NuIGVuZXJnw6l0aWNhLiAoUFJPTkFTRSksIEVmaWNpZW5jaWEgZW5lcmfDqXRpY2EgcGFyYSBNw6l4aWNvLiBNw6l4aWNvLCBELkYuOiBTZWNyZXRhcsOtYSBkZSBFbmVyZ8OtYSwgMjAxMC4gIA0KDQoNCiMgRGVzY2FyZ2FyIENvZGlnbw0KYGBge3J9DQp4ZnVuOjplbWJlZF9maWxlKCJiYXNlLmNzdiIpDQp4ZnVuOjplbWJlZF9maWxlKCJWZW50YXNlbmVyZ3kuY3N2IikNCnhmdW46OmVtYmVkX2ZpbGUoIkdlbmVyYWNpb25FbmVyZ3kuY3N2IikNCnhmdW46OmVtYmVkX2ZpbGUoIkdlbmVyYWNpb25GZWNoYXMuY3N2IikNCmBgYA0KDQpgYGB7cn0NCnhmdW46OmVtYmVkX2ZpbGUoIlByb3llY3RvRmluYWwtRW5lcmdpYS5ybWQiKQ0KYGBgDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0K