analisis DRIS,realizado en base al curso de Nutricon vegetal Universidad de Caldas 2016.
datos iniciales de analisis foliares del cultivo de papa en fincas del Departamento de Caldas.
primero,se sube el archivo de analisis foliares que llamaremos Relaciones_binarias,el cual se ha subido en formato “data.frame” con Rstudio
library(readxl)
Relaciones_binarias <- read_excel("~/Descargas/1.xlsx")
View(Relaciones_binarias)
segundo,se calculan las variables para el analisis DRIS,por el metodo en R de agregar columnas al “data.frame” relaciones con Nitrogeno
#relacion nitrogeno fosforo
Relaciones_binarias$`N/P`<-Relaciones_binarias$`% N`/Relaciones_binarias$`% P`
Relaciones_binarias$`P/N`<-Relaciones_binarias$`% P`/Relaciones_binarias$`% N`
#relacion nitrogeno potasio
Relaciones_binarias$`N/K`<-Relaciones_binarias$`% N`/Relaciones_binarias$`% K`
Relaciones_binarias$`K/N`<-Relaciones_binarias$`% K`/Relaciones_binarias$`% N`
#relacion nitrogeno Calcio
Relaciones_binarias$`N/Ca`<-Relaciones_binarias$`% N`/Relaciones_binarias$`% Ca`
Relaciones_binarias$`Ca/N`<-Relaciones_binarias$`% Ca`/Relaciones_binarias$`% N`
#relacion nitrogeno Magnesio
Relaciones_binarias$`N/Mg`<-Relaciones_binarias$`% N`/Relaciones_binarias$`% Mg`
Relaciones_binarias$`Mg/N`<-Relaciones_binarias$`% Mg`/Relaciones_binarias$`% N`
#relacion nitrogeno Azufre
Relaciones_binarias$`N/S`<-Relaciones_binarias$`% N`/Relaciones_binarias$`% S`
Relaciones_binarias$`S/N`<-Relaciones_binarias$`% S`/Relaciones_binarias$`% N`
#para aquellos elementos que se presentan como partes por millon se debe multiplicar el elemento presentado como %, por 100.
#relacion nitrogeno Hierro
Relaciones_binarias$`N/Fe`<-((Relaciones_binarias$`% N`)*100)/Relaciones_binarias$`Fe ppm`
Relaciones_binarias$`Fe/N`<-Relaciones_binarias$`Fe ppm`/((Relaciones_binarias$`% N`)*100)
#relacion nitrogeno Boro
Relaciones_binarias$`N/B`<-((Relaciones_binarias$`% N`)*100)/Relaciones_binarias$`B ppm`
Relaciones_binarias$`B/N`<-Relaciones_binarias$`B ppm`/((Relaciones_binarias$`% N`)*100)
#relacion nitrogeno Zinc
Relaciones_binarias$`N/Zn`<-((Relaciones_binarias$`% N`)*100)/Relaciones_binarias$`Zn ppm`
Relaciones_binarias$`Zn/N`<-Relaciones_binarias$`Zn ppm`/((Relaciones_binarias$`% N`)*100)
#relacion nitrogeno Manganeso
Relaciones_binarias$`N/Mn`<-((Relaciones_binarias$`% N`)*100)/Relaciones_binarias$`Mn ppm`
Relaciones_binarias$`Mn/N`<-Relaciones_binarias$`Mn ppm`/((Relaciones_binarias$`% N`)*100)
#relacion nitrogeno Cobre
Relaciones_binarias$`N/Cu`<-((Relaciones_binarias$`% N`)*100)/Relaciones_binarias$`Cu ppm`
Relaciones_binarias$`Cu/N`<-Relaciones_binarias$`Cu ppm`/((Relaciones_binarias$`% N`)*100)
relaciones con Fosforo. como ya se han calculado las relaciones con Nitrogeno estas se han omitido.
#relacion fosforo potasio
Relaciones_binarias$`P/K`<-Relaciones_binarias$`% P`/Relaciones_binarias$`% K`
Relaciones_binarias$`K/P`<-Relaciones_binarias$`% K`/Relaciones_binarias$`% P`
#relacion fosforo Calcio
Relaciones_binarias$`P/Ca`<-Relaciones_binarias$`% P`/Relaciones_binarias$`% Ca`
Relaciones_binarias$`Ca/P`<-Relaciones_binarias$`% Ca`/Relaciones_binarias$`% P`
#relacion fosforo Magnesio
Relaciones_binarias$`P/Mg`<-Relaciones_binarias$`% P`/Relaciones_binarias$`% Mg`
Relaciones_binarias$`Mg/P`<-Relaciones_binarias$`% Mg`/Relaciones_binarias$`% P`
#relacion fosforo Azufre
Relaciones_binarias$`P/S`<-Relaciones_binarias$`% P`/Relaciones_binarias$`% S`
Relaciones_binarias$`S/P`<-Relaciones_binarias$`% S`/Relaciones_binarias$`% P`
#para aquellos elementos que se presentan como partes por millon se debe multiplicar el elemento presentado como %, por 100.
#relacion fosforo Hierro
Relaciones_binarias$`P/Fe`<-((Relaciones_binarias$`% P`)*100)/Relaciones_binarias$`Fe ppm`
Relaciones_binarias$`Fe/P`<-Relaciones_binarias$`Fe ppm`/((Relaciones_binarias$`% P`)*100)
#relacion fosforo Boro
Relaciones_binarias$`P/B`<-((Relaciones_binarias$`% P`)*100)/Relaciones_binarias$`B ppm`
Relaciones_binarias$`B/P`<-Relaciones_binarias$`B ppm`/((Relaciones_binarias$`% P`)*100)
#relacion fosforo Zinc
Relaciones_binarias$`P/Zn`<-((Relaciones_binarias$`% P`)*100)/Relaciones_binarias$`Zn ppm`
Relaciones_binarias$`Zn/P`<-Relaciones_binarias$`Zn ppm`/((Relaciones_binarias$`% P`)*100)
#relacion fosforo Manganeso
Relaciones_binarias$`P/Mn`<-((Relaciones_binarias$`% P`)*100)/Relaciones_binarias$`Mn ppm`
Relaciones_binarias$`Mn/P`<-Relaciones_binarias$`Mn ppm`/((Relaciones_binarias$`% P`)*100)
#relacion fosforo Cobre
Relaciones_binarias$`P/Cu`<-((Relaciones_binarias$`% P`)*100)/Relaciones_binarias$`Cu ppm`
Relaciones_binarias$`Cu/P`<-Relaciones_binarias$`Cu ppm`/((Relaciones_binarias$`% P`)*100)
relaciones con Potasio. como ya se han calculado las relaciones con Nitrogeno y fosforo estas se han omitido.
#relacion potasio Calcio
Relaciones_binarias$`K/Ca`<-Relaciones_binarias$`% K`/Relaciones_binarias$`% Ca`
Relaciones_binarias$`Ca/K`<-Relaciones_binarias$`% Ca`/Relaciones_binarias$`% K`
#relacion potasio Magnesio
Relaciones_binarias$`K/Mg`<-Relaciones_binarias$`% K`/Relaciones_binarias$`% Mg`
Relaciones_binarias$`Mg/K`<-Relaciones_binarias$`% Mg`/Relaciones_binarias$`% K`
#relacion potasio Azufre
Relaciones_binarias$`K/S`<-Relaciones_binarias$`% K`/Relaciones_binarias$`% S`
Relaciones_binarias$`S/K`<-Relaciones_binarias$`% S`/Relaciones_binarias$`% K`
#para aquellos elementos que se presentan como partes por millon se debe multiplicar el elemento presentado como %, por 100.
#relacion potasio Hierro
Relaciones_binarias$`K/Fe`<-((Relaciones_binarias$`% K`)*100)/Relaciones_binarias$`Fe ppm`
Relaciones_binarias$`Fe/K`<-Relaciones_binarias$`Fe ppm`/((Relaciones_binarias$`% K`)*100)
#relacion potasio Boro
Relaciones_binarias$`K/B`<-((Relaciones_binarias$`% K`)*100)/Relaciones_binarias$`B ppm`
Relaciones_binarias$`B/K`<-Relaciones_binarias$`B ppm`/((Relaciones_binarias$`% K`)*100)
#relacion potasio Zinc
Relaciones_binarias$`K/Zn`<-((Relaciones_binarias$`% K`)*100)/Relaciones_binarias$`Zn ppm`
Relaciones_binarias$`Zn/K`<-Relaciones_binarias$`Zn ppm`/((Relaciones_binarias$`% K`)*100)
#relacion potasio Manganeso
Relaciones_binarias$`K/Mn`<-((Relaciones_binarias$`% K`)*100)/Relaciones_binarias$`Mn ppm`
Relaciones_binarias$`Mn/K`<-Relaciones_binarias$`Mn ppm`/((Relaciones_binarias$`% K`)*100)
#relacion potasio Cobre
Relaciones_binarias$`K/Cu`<-((Relaciones_binarias$`% K`)*100)/Relaciones_binarias$`Cu ppm`
Relaciones_binarias$`Cu/K`<-Relaciones_binarias$`Cu ppm`/((Relaciones_binarias$`% K`)*100)
relaciones con Calcio. como ya se han calculado las relaciones con Nitrogeno, Fosforo y Potasio estas se han omitido.
#relacion Calcio Magnesio
Relaciones_binarias$`Ca/Mg`<-Relaciones_binarias$`% Ca`/Relaciones_binarias$`% Mg`
Relaciones_binarias$`Mg/Ca`<-Relaciones_binarias$`% Mg`/Relaciones_binarias$`% Ca`
#relacion Calcio Azufre
Relaciones_binarias$`Ca/S`<-Relaciones_binarias$`% Ca`/Relaciones_binarias$`% S`
Relaciones_binarias$`S/Ca`<-Relaciones_binarias$`% S`/Relaciones_binarias$`% Ca`
#para aquellos elementos que se presentan como partes por millon se debe multiplicar el elemento presentado como %, por 100.
#relacion Calcio Hierro
Relaciones_binarias$`Ca/Fe`<-((Relaciones_binarias$`% Ca`)*100)/Relaciones_binarias$`Fe ppm`
Relaciones_binarias$`Fe/Ca`<-Relaciones_binarias$`Fe ppm`/((Relaciones_binarias$`% Ca`)*100)
#relacion Calcio Boro
Relaciones_binarias$`Ca/B`<-((Relaciones_binarias$`% Ca`)*100)/Relaciones_binarias$`B ppm`
Relaciones_binarias$`B/Ca`<-Relaciones_binarias$`B ppm`/((Relaciones_binarias$`% Ca`)*100)
#relacion Calcio Zinc
Relaciones_binarias$`Ca/Zn`<-((Relaciones_binarias$`% Ca`)*100)/Relaciones_binarias$`Zn ppm`
Relaciones_binarias$`Zn/Ca`<-Relaciones_binarias$`Zn ppm`/((Relaciones_binarias$`% Ca`)*100)
#relacion Calcio Manganeso
Relaciones_binarias$`Ca/Mn`<-((Relaciones_binarias$`% Ca`)*100)/Relaciones_binarias$`Mn ppm`
Relaciones_binarias$`Mn/Ca`<-Relaciones_binarias$`Mn ppm`/((Relaciones_binarias$`% Ca`)*100)
#relacion Calcio Cobre
Relaciones_binarias$`Ca/Cu`<-((Relaciones_binarias$`% Ca`)*100)/Relaciones_binarias$`Cu ppm`
Relaciones_binarias$`Cu/Ca`<-Relaciones_binarias$`Cu ppm`/((Relaciones_binarias$`% Ca`)*100)
relaciones con Magnesio. como ya se han calculado las relaciones con Nitrogeno, Fosforo,Potasio y Calcio estas se han omitido.
#relacion Magnesio Azufre
Relaciones_binarias$`Mg/S`<-Relaciones_binarias$`% Mg`/Relaciones_binarias$`% S`
Relaciones_binarias$`S/Mg`<-Relaciones_binarias$`% S`/Relaciones_binarias$`% Mg`
#para aquellos elementos que se presentan como partes por millon se debe multiplicar el elemento presentado como %, por 100.
#relacion Magnesio Hierro
Relaciones_binarias$`Mg/Fe`<-((Relaciones_binarias$`% Mg`)*100)/Relaciones_binarias$`Fe ppm`
Relaciones_binarias$`Fe/Mg`<-Relaciones_binarias$`Fe ppm`/((Relaciones_binarias$`% Mg`)*100)
#relacion Magnesio Boro
Relaciones_binarias$`Mg/B`<-((Relaciones_binarias$`% Mg`)*100)/Relaciones_binarias$`B ppm`
Relaciones_binarias$`B/Mg`<-Relaciones_binarias$`B ppm`/((Relaciones_binarias$`% Mg`)*100)
#relacion Magnesio Zinc
Relaciones_binarias$`Mg/Zn`<-((Relaciones_binarias$`% Mg`)*100)/Relaciones_binarias$`Zn ppm`
Relaciones_binarias$`Zn/Mg`<-Relaciones_binarias$`Zn ppm`/((Relaciones_binarias$`% Mg`)*100)
#relacion Magnesio Manganeso
Relaciones_binarias$`Mg/Mn`<-((Relaciones_binarias$`% Mg`)*100)/Relaciones_binarias$`Mn ppm`
Relaciones_binarias$`Mn/Mg`<-Relaciones_binarias$`Mn ppm`/((Relaciones_binarias$`% Mg`)*100)
#relacion Magnesio Cobre
Relaciones_binarias$`Mg/Cu`<-((Relaciones_binarias$`% Mg`)*100)/Relaciones_binarias$`Cu ppm`
Relaciones_binarias$`Cu/Mg`<-Relaciones_binarias$`Cu ppm`/((Relaciones_binarias$`% Mg`)*100)
relaciones con Azufre. como ya se han calculado las relaciones con Nitrogeno, Fosforo,Potasio,Calcio y Magnesio estas se han omitido.
#para aquellos elementos que se presentan como partes por millon se debe multiplicar el elemento presentado como %, por 100.
#relacion Azufre Hierro
Relaciones_binarias$`S/Fe`<-((Relaciones_binarias$`% S`)*100)/Relaciones_binarias$`Fe ppm`
Relaciones_binarias$`Fe/S`<-Relaciones_binarias$`Fe ppm`/((Relaciones_binarias$`% S`)*100)
#relacion Azufre Boro
Relaciones_binarias$`S/B`<-((Relaciones_binarias$`% S`)*100)/Relaciones_binarias$`B ppm`
Relaciones_binarias$`B/S`<-Relaciones_binarias$`B ppm`/((Relaciones_binarias$`% S`)*100)
#relacion Azufre Zinc
Relaciones_binarias$`S/Zn`<-((Relaciones_binarias$`% S`)*100)/Relaciones_binarias$`Zn ppm`
Relaciones_binarias$`Zn/S`<-Relaciones_binarias$`Zn ppm`/((Relaciones_binarias$`% S`)*100)
#relacion Azufre Manganeso
Relaciones_binarias$`S/Mn`<-((Relaciones_binarias$`% S`)*100)/Relaciones_binarias$`Mn ppm`
Relaciones_binarias$`Mn/S`<-Relaciones_binarias$`Mn ppm`/((Relaciones_binarias$`% S`)*100)
#relacion Azufre Cobre
Relaciones_binarias$`S/Cu`<-((Relaciones_binarias$`% S`)*100)/Relaciones_binarias$`Cu ppm`
Relaciones_binarias$`Cu/S`<-Relaciones_binarias$`Cu ppm`/((Relaciones_binarias$`% S`)*100)
relaciones con Hierro. como Hierro es presentado en el analisi de suelos como ppm,no es necesario multiplicar por 100 para las variables que se presentan como ppm. como ya se han calculado las relaciones con Nitrogeno, Fosforo,Potasio,Calcio,Magnesio y Azufre estas se han omitido.
#relacion Hierro Boro
Relaciones_binarias$`Fe ppm/B`<-(Relaciones_binarias$`Fe ppm`)/Relaciones_binarias$`B ppm`
Relaciones_binarias$`B/Fe ppm`<-Relaciones_binarias$`B ppm`/(Relaciones_binarias$`Fe ppm`)
#relacion Hierro Zinc
Relaciones_binarias$`Fe ppm/Zn`<-(Relaciones_binarias$`Fe ppm`)/Relaciones_binarias$`Zn ppm`
Relaciones_binarias$`Zn/Fe ppm`<-Relaciones_binarias$`Zn ppm`/(Relaciones_binarias$`Fe ppm`)
#relacion Hierro Manganeso
Relaciones_binarias$`Fe ppm/Mn`<-(Relaciones_binarias$`Fe ppm`)/Relaciones_binarias$`Mn ppm`
Relaciones_binarias$`Mn/Fe ppm`<-Relaciones_binarias$`Mn ppm`/(Relaciones_binarias$`Fe ppm`)
#relacion Hierro Cobre
Relaciones_binarias$`Fe ppm/Cu`<-(Relaciones_binarias$`Fe ppm`)/Relaciones_binarias$`Cu ppm`
Relaciones_binarias$`Cu/Fe ppm`<-Relaciones_binarias$`Cu ppm`/(Relaciones_binarias$`Fe ppm`)
relaciones con Boro. como Boro es presentado en el analisi de suelos como ppm,no es necesario multiplicar por 100 para las variables que se presentan como ppm. como ya se han calculado las relaciones con Nitrogeno, Fosforo,Potasio,Calcio,Magnesio,Azufre y Hierro estas se han omitido.
#relacion Boro Zinc
Relaciones_binarias$`B ppm/Zn`<-(Relaciones_binarias$`B ppm`)/Relaciones_binarias$`Zn ppm`
Relaciones_binarias$`Zn/B ppm`<-Relaciones_binarias$`Zn ppm`/(Relaciones_binarias$`B ppm`)
#relacion Boro Manganeso
Relaciones_binarias$`B ppm/Mn`<-(Relaciones_binarias$`B ppm`)/Relaciones_binarias$`Mn ppm`
Relaciones_binarias$`Mn/B ppm`<-Relaciones_binarias$`Mn ppm`/(Relaciones_binarias$`B ppm`)
#relacion Boro Cobre
Relaciones_binarias$`B ppm/Cu`<-(Relaciones_binarias$`B ppm`)/Relaciones_binarias$`Cu ppm`
Relaciones_binarias$`Cu/B ppm`<-Relaciones_binarias$`Cu ppm`/(Relaciones_binarias$`B ppm`)
relaciones con Zinc. como Zinc es presentado en el analisi de suelos como ppm,no es necesario multiplicar por 100 para las variables que se presentan como ppm. como ya se han calculado las relaciones con Nitrogeno, Fosforo,Potasio,Calcio,Magnesio,Azufre,Hierro y Boro estas se han omitido.
#relacion Zinc Manganeso
Relaciones_binarias$`Zn ppm/Mn`<-(Relaciones_binarias$`Zn ppm`)/Relaciones_binarias$`Mn ppm`
Relaciones_binarias$`Mn/Zn ppm`<-Relaciones_binarias$`Mn ppm`/(Relaciones_binarias$`Zn ppm`)
#relacion Zinc Cobre
Relaciones_binarias$`Zn ppm/Cu`<-(Relaciones_binarias$`Zn ppm`)/Relaciones_binarias$`Cu ppm`
Relaciones_binarias$`Cu/Zn ppm`<-Relaciones_binarias$`Cu ppm`/(Relaciones_binarias$`Zn ppm`)
relaciones con Cobre y Manganeso. como Cobre y Manganeso es presentado en el analisi de suelos como ppm,no es necesario multiplicar por 100 para las variables que se presentan como ppm. como ya se han calculado las relaciones con Nitrogeno, Fosforo,Potasio,Calcio,Magnesio,Azufre,Hierro,Boro y Zinc
#relacion Manganeso Cobre
Relaciones_binarias$`Mn ppm/Cu`<-(Relaciones_binarias$`Mn ppm`)/Relaciones_binarias$`Cu ppm`
Relaciones_binarias$`Cu/Mn ppm`<-Relaciones_binarias$`Cu ppm`/(Relaciones_binarias$`Mn ppm`)
head(Relaciones_binarias)
si desearamos corregir datos del data.frame
## fix(Relaciones_binarias)
estadisticas de todas las columnas
seleccion<-Relaciones_binarias[,14:123]
media<-apply(seleccion,2,mean)
varianza<-apply(seleccion,2,var)
desviacion_estandar<-apply(seleccion,2,sd)
data.frame con la estasdisticas
estadisticas<-data.frame(media,varianza,desviacion_estandar)
agregamos la columna coeficiente de variacion que nos servira mas adelante para el analisis DRIS
estadisticas$coeficiente_de_variacion<-estadisticas$desviacion_estandar/estadisticas$media
para arreglar la tabla de estadisticas en una manera comoda de ver utilizamos la funcion t(),para transponer los datos
estadisticas_en_filas<-t(estadisticas)
LS0tCnRpdGxlOiAiYW5hbGlzaXMgRFJJU3MiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCgphbmFsaXNpcyBEUklTLHJlYWxpemFkbyBlbiBiYXNlIGFsIGN1cnNvIGRlIE51dHJpY29uIHZlZ2V0YWwgVW5pdmVyc2lkYWQgZGUgQ2FsZGFzIDIwMTYuCgpkYXRvcyBpbmljaWFsZXMgZGUgYW5hbGlzaXMgZm9saWFyZXMgZGVsIGN1bHRpdm8gZGUgcGFwYSBlbiBmaW5jYXMgZGVsIERlcGFydGFtZW50byBkZSBDYWxkYXMuCgpwcmltZXJvLHNlIHN1YmUgZWwgYXJjaGl2byBkZSBhbmFsaXNpcyBmb2xpYXJlcyAgcXVlIGxsYW1hcmVtb3MgUmVsYWNpb25lc19iaW5hcmlhcyxlbCBjdWFsIHNlIGhhIHN1YmlkbyBlbiBmb3JtYXRvICJkYXRhLmZyYW1lIiBjb24gUnN0dWRpbwoKYGBge3J9CmxpYnJhcnkocmVhZHhsKQpSZWxhY2lvbmVzX2JpbmFyaWFzIDwtIHJlYWRfZXhjZWwoIn4vRGVzY2FyZ2FzLzEueGxzeCIpClZpZXcoUmVsYWNpb25lc19iaW5hcmlhcykKYGBgCgoKc2VndW5kbyxzZSBjYWxjdWxhbiBsYXMgdmFyaWFibGVzIHBhcmEgZWwgYW5hbGlzaXMgRFJJUyxwb3IgZWwgbWV0b2RvIGVuIFIgZGUgYWdyZWdhciBjb2x1bW5hcyBhbCAiZGF0YS5mcmFtZSIKcmVsYWNpb25lcyBjb24gTml0cm9nZW5vCgpgYGB7ciByZWxhY2lvbmVzIGNvbiBOaXRyb2dlbm99CgojcmVsYWNpb24gbml0cm9nZW5vIGZvc2Zvcm8KUmVsYWNpb25lc19iaW5hcmlhcyRgTi9QYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgJSBOYC9SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIFBgCgpSZWxhY2lvbmVzX2JpbmFyaWFzJGBQL05gPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIFBgL1JlbGFjaW9uZXNfYmluYXJpYXMkYCUgTmAKCiNyZWxhY2lvbiBuaXRyb2dlbm8gcG90YXNpbwoKUmVsYWNpb25lc19iaW5hcmlhcyRgTi9LYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgJSBOYC9SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIEtgClJlbGFjaW9uZXNfYmluYXJpYXMkYEsvTmA8LVJlbGFjaW9uZXNfYmluYXJpYXMkYCUgS2AvUmVsYWNpb25lc19iaW5hcmlhcyRgJSBOYAoKI3JlbGFjaW9uIG5pdHJvZ2VubyBDYWxjaW8KClJlbGFjaW9uZXNfYmluYXJpYXMkYE4vQ2FgPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIE5gL1JlbGFjaW9uZXNfYmluYXJpYXMkYCUgQ2FgClJlbGFjaW9uZXNfYmluYXJpYXMkYENhL05gPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIENhYC9SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIE5gCgojcmVsYWNpb24gbml0cm9nZW5vIE1hZ25lc2lvClJlbGFjaW9uZXNfYmluYXJpYXMkYE4vTWdgPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIE5gL1JlbGFjaW9uZXNfYmluYXJpYXMkYCUgTWdgClJlbGFjaW9uZXNfYmluYXJpYXMkYE1nL05gPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIE1nYC9SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIE5gCgojcmVsYWNpb24gbml0cm9nZW5vIEF6dWZyZQpSZWxhY2lvbmVzX2JpbmFyaWFzJGBOL1NgPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIE5gL1JlbGFjaW9uZXNfYmluYXJpYXMkYCUgU2AKUmVsYWNpb25lc19iaW5hcmlhcyRgUy9OYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgJSBTYC9SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIE5gCgojcGFyYSBhcXVlbGxvcyBlbGVtZW50b3MgcXVlIHNlIHByZXNlbnRhbiBjb21vIHBhcnRlcyBwb3IgbWlsbG9uIHNlIGRlYmUgbXVsdGlwbGljYXIgZWwgZWxlbWVudG8gcHJlc2VudGFkbyBjb21vICUsIHBvciAxMDAuCgojcmVsYWNpb24gbml0cm9nZW5vIEhpZXJybwpSZWxhY2lvbmVzX2JpbmFyaWFzJGBOL0ZlYDwtKChSZWxhY2lvbmVzX2JpbmFyaWFzJGAlIE5gKSoxMDApL1JlbGFjaW9uZXNfYmluYXJpYXMkYEZlIHBwbWAKUmVsYWNpb25lc19iaW5hcmlhcyRgRmUvTmA8LVJlbGFjaW9uZXNfYmluYXJpYXMkYEZlIHBwbWAvKChSZWxhY2lvbmVzX2JpbmFyaWFzJGAlIE5gKSoxMDApCgojcmVsYWNpb24gbml0cm9nZW5vIEJvcm8KClJlbGFjaW9uZXNfYmluYXJpYXMkYE4vQmA8LSgoUmVsYWNpb25lc19iaW5hcmlhcyRgJSBOYCkqMTAwKS9SZWxhY2lvbmVzX2JpbmFyaWFzJGBCIHBwbWAKUmVsYWNpb25lc19iaW5hcmlhcyRgQi9OYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgQiBwcG1gLygoUmVsYWNpb25lc19iaW5hcmlhcyRgJSBOYCkqMTAwKQoKI3JlbGFjaW9uIG5pdHJvZ2VubyBaaW5jCgpSZWxhY2lvbmVzX2JpbmFyaWFzJGBOL1puYDwtKChSZWxhY2lvbmVzX2JpbmFyaWFzJGAlIE5gKSoxMDApL1JlbGFjaW9uZXNfYmluYXJpYXMkYFpuIHBwbWAKUmVsYWNpb25lc19iaW5hcmlhcyRgWm4vTmA8LVJlbGFjaW9uZXNfYmluYXJpYXMkYFpuIHBwbWAvKChSZWxhY2lvbmVzX2JpbmFyaWFzJGAlIE5gKSoxMDApCgojcmVsYWNpb24gbml0cm9nZW5vIE1hbmdhbmVzbwoKUmVsYWNpb25lc19iaW5hcmlhcyRgTi9NbmA8LSgoUmVsYWNpb25lc19iaW5hcmlhcyRgJSBOYCkqMTAwKS9SZWxhY2lvbmVzX2JpbmFyaWFzJGBNbiBwcG1gClJlbGFjaW9uZXNfYmluYXJpYXMkYE1uL05gPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGBNbiBwcG1gLygoUmVsYWNpb25lc19iaW5hcmlhcyRgJSBOYCkqMTAwKQoKI3JlbGFjaW9uIG5pdHJvZ2VubyBDb2JyZQoKUmVsYWNpb25lc19iaW5hcmlhcyRgTi9DdWA8LSgoUmVsYWNpb25lc19iaW5hcmlhcyRgJSBOYCkqMTAwKS9SZWxhY2lvbmVzX2JpbmFyaWFzJGBDdSBwcG1gClJlbGFjaW9uZXNfYmluYXJpYXMkYEN1L05gPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGBDdSBwcG1gLygoUmVsYWNpb25lc19iaW5hcmlhcyRgJSBOYCkqMTAwKQoKCgpgYGAKCnJlbGFjaW9uZXMgY29uIEZvc2Zvcm8uCmNvbW8geWEgc2UgaGFuIGNhbGN1bGFkbyBsYXMgcmVsYWNpb25lcyBjb24gTml0cm9nZW5vIGVzdGFzIHNlIGhhbiBvbWl0aWRvLgoKCgpgYGB7ciByZWxhY2lvbmVzIGNvbiBGb3Nmb3JvfQojcmVsYWNpb24gZm9zZm9ybyBwb3Rhc2lvCgpSZWxhY2lvbmVzX2JpbmFyaWFzJGBQL0tgPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIFBgL1JlbGFjaW9uZXNfYmluYXJpYXMkYCUgS2AKUmVsYWNpb25lc19iaW5hcmlhcyRgSy9QYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgJSBLYC9SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIFBgCgojcmVsYWNpb24gZm9zZm9ybyBDYWxjaW8KClJlbGFjaW9uZXNfYmluYXJpYXMkYFAvQ2FgPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIFBgL1JlbGFjaW9uZXNfYmluYXJpYXMkYCUgQ2FgClJlbGFjaW9uZXNfYmluYXJpYXMkYENhL1BgPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIENhYC9SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIFBgCgojcmVsYWNpb24gZm9zZm9ybyBNYWduZXNpbwpSZWxhY2lvbmVzX2JpbmFyaWFzJGBQL01nYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgJSBQYC9SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIE1nYApSZWxhY2lvbmVzX2JpbmFyaWFzJGBNZy9QYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgJSBNZ2AvUmVsYWNpb25lc19iaW5hcmlhcyRgJSBQYAoKI3JlbGFjaW9uIGZvc2Zvcm8gQXp1ZnJlClJlbGFjaW9uZXNfYmluYXJpYXMkYFAvU2A8LVJlbGFjaW9uZXNfYmluYXJpYXMkYCUgUGAvUmVsYWNpb25lc19iaW5hcmlhcyRgJSBTYApSZWxhY2lvbmVzX2JpbmFyaWFzJGBTL1BgPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIFNgL1JlbGFjaW9uZXNfYmluYXJpYXMkYCUgUGAKCiNwYXJhIGFxdWVsbG9zIGVsZW1lbnRvcyBxdWUgc2UgcHJlc2VudGFuIGNvbW8gcGFydGVzIHBvciBtaWxsb24gc2UgZGViZSBtdWx0aXBsaWNhciBlbCBlbGVtZW50byBwcmVzZW50YWRvIGNvbW8gJSwgcG9yIDEwMC4KCiNyZWxhY2lvbiBmb3Nmb3JvIEhpZXJybwpSZWxhY2lvbmVzX2JpbmFyaWFzJGBQL0ZlYDwtKChSZWxhY2lvbmVzX2JpbmFyaWFzJGAlIFBgKSoxMDApL1JlbGFjaW9uZXNfYmluYXJpYXMkYEZlIHBwbWAKUmVsYWNpb25lc19iaW5hcmlhcyRgRmUvUGA8LVJlbGFjaW9uZXNfYmluYXJpYXMkYEZlIHBwbWAvKChSZWxhY2lvbmVzX2JpbmFyaWFzJGAlIFBgKSoxMDApCgojcmVsYWNpb24gZm9zZm9ybyBCb3JvCgpSZWxhY2lvbmVzX2JpbmFyaWFzJGBQL0JgPC0oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgUGApKjEwMCkvUmVsYWNpb25lc19iaW5hcmlhcyRgQiBwcG1gClJlbGFjaW9uZXNfYmluYXJpYXMkYEIvUGA8LVJlbGFjaW9uZXNfYmluYXJpYXMkYEIgcHBtYC8oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgUGApKjEwMCkKCiNyZWxhY2lvbiBmb3Nmb3JvIFppbmMKClJlbGFjaW9uZXNfYmluYXJpYXMkYFAvWm5gPC0oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgUGApKjEwMCkvUmVsYWNpb25lc19iaW5hcmlhcyRgWm4gcHBtYApSZWxhY2lvbmVzX2JpbmFyaWFzJGBabi9QYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgWm4gcHBtYC8oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgUGApKjEwMCkKCiNyZWxhY2lvbiBmb3Nmb3JvIE1hbmdhbmVzbwoKUmVsYWNpb25lc19iaW5hcmlhcyRgUC9NbmA8LSgoUmVsYWNpb25lc19iaW5hcmlhcyRgJSBQYCkqMTAwKS9SZWxhY2lvbmVzX2JpbmFyaWFzJGBNbiBwcG1gClJlbGFjaW9uZXNfYmluYXJpYXMkYE1uL1BgPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGBNbiBwcG1gLygoUmVsYWNpb25lc19iaW5hcmlhcyRgJSBQYCkqMTAwKQoKI3JlbGFjaW9uIGZvc2Zvcm8gQ29icmUKClJlbGFjaW9uZXNfYmluYXJpYXMkYFAvQ3VgPC0oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgUGApKjEwMCkvUmVsYWNpb25lc19iaW5hcmlhcyRgQ3UgcHBtYApSZWxhY2lvbmVzX2JpbmFyaWFzJGBDdS9QYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgQ3UgcHBtYC8oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgUGApKjEwMCkKYGBgCgpyZWxhY2lvbmVzIGNvbiBQb3Rhc2lvLgpjb21vIHlhIHNlIGhhbiBjYWxjdWxhZG8gbGFzIHJlbGFjaW9uZXMgY29uIE5pdHJvZ2VubyB5IGZvc2Zvcm8gZXN0YXMgc2UgaGFuIG9taXRpZG8uCgpgYGB7ciBSZWxhY2lvbmVzIGNvbiBQb3Rhc2lvfQojcmVsYWNpb24gcG90YXNpbyBDYWxjaW8KClJlbGFjaW9uZXNfYmluYXJpYXMkYEsvQ2FgPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIEtgL1JlbGFjaW9uZXNfYmluYXJpYXMkYCUgQ2FgClJlbGFjaW9uZXNfYmluYXJpYXMkYENhL0tgPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIENhYC9SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIEtgCgojcmVsYWNpb24gcG90YXNpbyBNYWduZXNpbwpSZWxhY2lvbmVzX2JpbmFyaWFzJGBLL01nYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgJSBLYC9SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIE1nYApSZWxhY2lvbmVzX2JpbmFyaWFzJGBNZy9LYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgJSBNZ2AvUmVsYWNpb25lc19iaW5hcmlhcyRgJSBLYAoKI3JlbGFjaW9uIHBvdGFzaW8gQXp1ZnJlClJlbGFjaW9uZXNfYmluYXJpYXMkYEsvU2A8LVJlbGFjaW9uZXNfYmluYXJpYXMkYCUgS2AvUmVsYWNpb25lc19iaW5hcmlhcyRgJSBTYApSZWxhY2lvbmVzX2JpbmFyaWFzJGBTL0tgPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIFNgL1JlbGFjaW9uZXNfYmluYXJpYXMkYCUgS2AKCiNwYXJhIGFxdWVsbG9zIGVsZW1lbnRvcyBxdWUgc2UgcHJlc2VudGFuIGNvbW8gcGFydGVzIHBvciBtaWxsb24gc2UgZGViZSBtdWx0aXBsaWNhciBlbCBlbGVtZW50byBwcmVzZW50YWRvIGNvbW8gJSwgcG9yIDEwMC4KCiNyZWxhY2lvbiBwb3Rhc2lvIEhpZXJybwpSZWxhY2lvbmVzX2JpbmFyaWFzJGBLL0ZlYDwtKChSZWxhY2lvbmVzX2JpbmFyaWFzJGAlIEtgKSoxMDApL1JlbGFjaW9uZXNfYmluYXJpYXMkYEZlIHBwbWAKUmVsYWNpb25lc19iaW5hcmlhcyRgRmUvS2A8LVJlbGFjaW9uZXNfYmluYXJpYXMkYEZlIHBwbWAvKChSZWxhY2lvbmVzX2JpbmFyaWFzJGAlIEtgKSoxMDApCgojcmVsYWNpb24gcG90YXNpbyBCb3JvCgpSZWxhY2lvbmVzX2JpbmFyaWFzJGBLL0JgPC0oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgS2ApKjEwMCkvUmVsYWNpb25lc19iaW5hcmlhcyRgQiBwcG1gClJlbGFjaW9uZXNfYmluYXJpYXMkYEIvS2A8LVJlbGFjaW9uZXNfYmluYXJpYXMkYEIgcHBtYC8oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgS2ApKjEwMCkKCiNyZWxhY2lvbiBwb3Rhc2lvIFppbmMKClJlbGFjaW9uZXNfYmluYXJpYXMkYEsvWm5gPC0oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgS2ApKjEwMCkvUmVsYWNpb25lc19iaW5hcmlhcyRgWm4gcHBtYApSZWxhY2lvbmVzX2JpbmFyaWFzJGBabi9LYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgWm4gcHBtYC8oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgS2ApKjEwMCkKCiNyZWxhY2lvbiBwb3Rhc2lvIE1hbmdhbmVzbwoKUmVsYWNpb25lc19iaW5hcmlhcyRgSy9NbmA8LSgoUmVsYWNpb25lc19iaW5hcmlhcyRgJSBLYCkqMTAwKS9SZWxhY2lvbmVzX2JpbmFyaWFzJGBNbiBwcG1gClJlbGFjaW9uZXNfYmluYXJpYXMkYE1uL0tgPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGBNbiBwcG1gLygoUmVsYWNpb25lc19iaW5hcmlhcyRgJSBLYCkqMTAwKQoKI3JlbGFjaW9uIHBvdGFzaW8gQ29icmUKClJlbGFjaW9uZXNfYmluYXJpYXMkYEsvQ3VgPC0oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgS2ApKjEwMCkvUmVsYWNpb25lc19iaW5hcmlhcyRgQ3UgcHBtYApSZWxhY2lvbmVzX2JpbmFyaWFzJGBDdS9LYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgQ3UgcHBtYC8oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgS2ApKjEwMCkKYGBgCgpyZWxhY2lvbmVzIGNvbiBDYWxjaW8uCmNvbW8geWEgc2UgaGFuIGNhbGN1bGFkbyBsYXMgcmVsYWNpb25lcyBjb24gTml0cm9nZW5vLCBGb3Nmb3JvIHkgUG90YXNpbyBlc3RhcyBzZSBoYW4gb21pdGlkby4KCmBgYHtyIENhbGNpb30KI3JlbGFjaW9uIENhbGNpbyBNYWduZXNpbwpSZWxhY2lvbmVzX2JpbmFyaWFzJGBDYS9NZ2A8LVJlbGFjaW9uZXNfYmluYXJpYXMkYCUgQ2FgL1JlbGFjaW9uZXNfYmluYXJpYXMkYCUgTWdgClJlbGFjaW9uZXNfYmluYXJpYXMkYE1nL0NhYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgJSBNZ2AvUmVsYWNpb25lc19iaW5hcmlhcyRgJSBDYWAKCiNyZWxhY2lvbiBDYWxjaW8gQXp1ZnJlClJlbGFjaW9uZXNfYmluYXJpYXMkYENhL1NgPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIENhYC9SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIFNgClJlbGFjaW9uZXNfYmluYXJpYXMkYFMvQ2FgPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIFNgL1JlbGFjaW9uZXNfYmluYXJpYXMkYCUgQ2FgCgojcGFyYSBhcXVlbGxvcyBlbGVtZW50b3MgcXVlIHNlIHByZXNlbnRhbiBjb21vIHBhcnRlcyBwb3IgbWlsbG9uIHNlIGRlYmUgbXVsdGlwbGljYXIgZWwgZWxlbWVudG8gcHJlc2VudGFkbyBjb21vICUsIHBvciAxMDAuCgojcmVsYWNpb24gQ2FsY2lvIEhpZXJybwpSZWxhY2lvbmVzX2JpbmFyaWFzJGBDYS9GZWA8LSgoUmVsYWNpb25lc19iaW5hcmlhcyRgJSBDYWApKjEwMCkvUmVsYWNpb25lc19iaW5hcmlhcyRgRmUgcHBtYApSZWxhY2lvbmVzX2JpbmFyaWFzJGBGZS9DYWA8LVJlbGFjaW9uZXNfYmluYXJpYXMkYEZlIHBwbWAvKChSZWxhY2lvbmVzX2JpbmFyaWFzJGAlIENhYCkqMTAwKQoKI3JlbGFjaW9uIENhbGNpbyBCb3JvCgpSZWxhY2lvbmVzX2JpbmFyaWFzJGBDYS9CYDwtKChSZWxhY2lvbmVzX2JpbmFyaWFzJGAlIENhYCkqMTAwKS9SZWxhY2lvbmVzX2JpbmFyaWFzJGBCIHBwbWAKUmVsYWNpb25lc19iaW5hcmlhcyRgQi9DYWA8LVJlbGFjaW9uZXNfYmluYXJpYXMkYEIgcHBtYC8oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgQ2FgKSoxMDApCgojcmVsYWNpb24gQ2FsY2lvIFppbmMKClJlbGFjaW9uZXNfYmluYXJpYXMkYENhL1puYDwtKChSZWxhY2lvbmVzX2JpbmFyaWFzJGAlIENhYCkqMTAwKS9SZWxhY2lvbmVzX2JpbmFyaWFzJGBabiBwcG1gClJlbGFjaW9uZXNfYmluYXJpYXMkYFpuL0NhYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgWm4gcHBtYC8oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgQ2FgKSoxMDApCgojcmVsYWNpb24gQ2FsY2lvIE1hbmdhbmVzbwoKUmVsYWNpb25lc19iaW5hcmlhcyRgQ2EvTW5gPC0oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgQ2FgKSoxMDApL1JlbGFjaW9uZXNfYmluYXJpYXMkYE1uIHBwbWAKUmVsYWNpb25lc19iaW5hcmlhcyRgTW4vQ2FgPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGBNbiBwcG1gLygoUmVsYWNpb25lc19iaW5hcmlhcyRgJSBDYWApKjEwMCkKCiNyZWxhY2lvbiBDYWxjaW8gQ29icmUKClJlbGFjaW9uZXNfYmluYXJpYXMkYENhL0N1YDwtKChSZWxhY2lvbmVzX2JpbmFyaWFzJGAlIENhYCkqMTAwKS9SZWxhY2lvbmVzX2JpbmFyaWFzJGBDdSBwcG1gClJlbGFjaW9uZXNfYmluYXJpYXMkYEN1L0NhYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgQ3UgcHBtYC8oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgQ2FgKSoxMDApCmBgYAoKcmVsYWNpb25lcyBjb24gTWFnbmVzaW8uCmNvbW8geWEgc2UgaGFuIGNhbGN1bGFkbyBsYXMgcmVsYWNpb25lcyBjb24gTml0cm9nZW5vLCBGb3Nmb3JvLFBvdGFzaW8geSBDYWxjaW8gZXN0YXMgc2UgaGFuIG9taXRpZG8uCgpgYGB7ciBNYWduZXNpb30KI3JlbGFjaW9uIE1hZ25lc2lvIEF6dWZyZQpSZWxhY2lvbmVzX2JpbmFyaWFzJGBNZy9TYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgJSBNZ2AvUmVsYWNpb25lc19iaW5hcmlhcyRgJSBTYApSZWxhY2lvbmVzX2JpbmFyaWFzJGBTL01nYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgJSBTYC9SZWxhY2lvbmVzX2JpbmFyaWFzJGAlIE1nYAoKI3BhcmEgYXF1ZWxsb3MgZWxlbWVudG9zIHF1ZSBzZSBwcmVzZW50YW4gY29tbyBwYXJ0ZXMgcG9yIG1pbGxvbiBzZSBkZWJlIG11bHRpcGxpY2FyIGVsIGVsZW1lbnRvIHByZXNlbnRhZG8gY29tbyAlLCBwb3IgMTAwLgoKI3JlbGFjaW9uIE1hZ25lc2lvIEhpZXJybwpSZWxhY2lvbmVzX2JpbmFyaWFzJGBNZy9GZWA8LSgoUmVsYWNpb25lc19iaW5hcmlhcyRgJSBNZ2ApKjEwMCkvUmVsYWNpb25lc19iaW5hcmlhcyRgRmUgcHBtYApSZWxhY2lvbmVzX2JpbmFyaWFzJGBGZS9NZ2A8LVJlbGFjaW9uZXNfYmluYXJpYXMkYEZlIHBwbWAvKChSZWxhY2lvbmVzX2JpbmFyaWFzJGAlIE1nYCkqMTAwKQoKI3JlbGFjaW9uIE1hZ25lc2lvIEJvcm8KClJlbGFjaW9uZXNfYmluYXJpYXMkYE1nL0JgPC0oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgTWdgKSoxMDApL1JlbGFjaW9uZXNfYmluYXJpYXMkYEIgcHBtYApSZWxhY2lvbmVzX2JpbmFyaWFzJGBCL01nYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgQiBwcG1gLygoUmVsYWNpb25lc19iaW5hcmlhcyRgJSBNZ2ApKjEwMCkKCiNyZWxhY2lvbiBNYWduZXNpbyBaaW5jCgpSZWxhY2lvbmVzX2JpbmFyaWFzJGBNZy9abmA8LSgoUmVsYWNpb25lc19iaW5hcmlhcyRgJSBNZ2ApKjEwMCkvUmVsYWNpb25lc19iaW5hcmlhcyRgWm4gcHBtYApSZWxhY2lvbmVzX2JpbmFyaWFzJGBabi9NZ2A8LVJlbGFjaW9uZXNfYmluYXJpYXMkYFpuIHBwbWAvKChSZWxhY2lvbmVzX2JpbmFyaWFzJGAlIE1nYCkqMTAwKQoKI3JlbGFjaW9uIE1hZ25lc2lvIE1hbmdhbmVzbwoKUmVsYWNpb25lc19iaW5hcmlhcyRgTWcvTW5gPC0oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgTWdgKSoxMDApL1JlbGFjaW9uZXNfYmluYXJpYXMkYE1uIHBwbWAKUmVsYWNpb25lc19iaW5hcmlhcyRgTW4vTWdgPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGBNbiBwcG1gLygoUmVsYWNpb25lc19iaW5hcmlhcyRgJSBNZ2ApKjEwMCkKCiNyZWxhY2lvbiBNYWduZXNpbyBDb2JyZQoKUmVsYWNpb25lc19iaW5hcmlhcyRgTWcvQ3VgPC0oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgTWdgKSoxMDApL1JlbGFjaW9uZXNfYmluYXJpYXMkYEN1IHBwbWAKUmVsYWNpb25lc19iaW5hcmlhcyRgQ3UvTWdgPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGBDdSBwcG1gLygoUmVsYWNpb25lc19iaW5hcmlhcyRgJSBNZ2ApKjEwMCkKYGBgCgpyZWxhY2lvbmVzIGNvbiBBenVmcmUuCmNvbW8geWEgc2UgaGFuIGNhbGN1bGFkbyBsYXMgcmVsYWNpb25lcyBjb24gTml0cm9nZW5vLCBGb3Nmb3JvLFBvdGFzaW8sQ2FsY2lvIHkgTWFnbmVzaW8gZXN0YXMgc2UgaGFuIG9taXRpZG8uCgpgYGB7ciBBenVmcmV9CgoKI3BhcmEgYXF1ZWxsb3MgZWxlbWVudG9zIHF1ZSBzZSBwcmVzZW50YW4gY29tbyBwYXJ0ZXMgcG9yIG1pbGxvbiBzZSBkZWJlIG11bHRpcGxpY2FyIGVsIGVsZW1lbnRvIHByZXNlbnRhZG8gY29tbyAlLCBwb3IgMTAwLgoKI3JlbGFjaW9uIEF6dWZyZSBIaWVycm8KUmVsYWNpb25lc19iaW5hcmlhcyRgUy9GZWA8LSgoUmVsYWNpb25lc19iaW5hcmlhcyRgJSBTYCkqMTAwKS9SZWxhY2lvbmVzX2JpbmFyaWFzJGBGZSBwcG1gClJlbGFjaW9uZXNfYmluYXJpYXMkYEZlL1NgPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGBGZSBwcG1gLygoUmVsYWNpb25lc19iaW5hcmlhcyRgJSBTYCkqMTAwKQoKI3JlbGFjaW9uIEF6dWZyZSBCb3JvCgpSZWxhY2lvbmVzX2JpbmFyaWFzJGBTL0JgPC0oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgU2ApKjEwMCkvUmVsYWNpb25lc19iaW5hcmlhcyRgQiBwcG1gClJlbGFjaW9uZXNfYmluYXJpYXMkYEIvU2A8LVJlbGFjaW9uZXNfYmluYXJpYXMkYEIgcHBtYC8oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgU2ApKjEwMCkKCiNyZWxhY2lvbiBBenVmcmUgWmluYwoKUmVsYWNpb25lc19iaW5hcmlhcyRgUy9abmA8LSgoUmVsYWNpb25lc19iaW5hcmlhcyRgJSBTYCkqMTAwKS9SZWxhY2lvbmVzX2JpbmFyaWFzJGBabiBwcG1gClJlbGFjaW9uZXNfYmluYXJpYXMkYFpuL1NgPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGBabiBwcG1gLygoUmVsYWNpb25lc19iaW5hcmlhcyRgJSBTYCkqMTAwKQoKI3JlbGFjaW9uIEF6dWZyZSBNYW5nYW5lc28KClJlbGFjaW9uZXNfYmluYXJpYXMkYFMvTW5gPC0oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgU2ApKjEwMCkvUmVsYWNpb25lc19iaW5hcmlhcyRgTW4gcHBtYApSZWxhY2lvbmVzX2JpbmFyaWFzJGBNbi9TYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgTW4gcHBtYC8oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgU2ApKjEwMCkKCiNyZWxhY2lvbiBBenVmcmUgQ29icmUKClJlbGFjaW9uZXNfYmluYXJpYXMkYFMvQ3VgPC0oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgU2ApKjEwMCkvUmVsYWNpb25lc19iaW5hcmlhcyRgQ3UgcHBtYApSZWxhY2lvbmVzX2JpbmFyaWFzJGBDdS9TYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgQ3UgcHBtYC8oKFJlbGFjaW9uZXNfYmluYXJpYXMkYCUgU2ApKjEwMCkKYGBgCgpyZWxhY2lvbmVzIGNvbiBIaWVycm8uCmNvbW8gSGllcnJvIGVzIHByZXNlbnRhZG8gZW4gZWwgYW5hbGlzaSBkZSBzdWVsb3MgY29tbyBwcG0sbm8gZXMgbmVjZXNhcmlvIG11bHRpcGxpY2FyIHBvciAxMDAgcGFyYSBsYXMgdmFyaWFibGVzIHF1ZSBzZSBwcmVzZW50YW4gY29tbyBwcG0uCmNvbW8geWEgc2UgaGFuIGNhbGN1bGFkbyBsYXMgcmVsYWNpb25lcyBjb24gTml0cm9nZW5vLCBGb3Nmb3JvLFBvdGFzaW8sQ2FsY2lvLE1hZ25lc2lvIHkgQXp1ZnJlIGVzdGFzIHNlIGhhbiBvbWl0aWRvLgoKCmBgYHtyIEhpZXJyb30KCiNyZWxhY2lvbiBIaWVycm8gQm9ybwoKUmVsYWNpb25lc19iaW5hcmlhcyRgRmUgcHBtL0JgPC0oUmVsYWNpb25lc19iaW5hcmlhcyRgRmUgcHBtYCkvUmVsYWNpb25lc19iaW5hcmlhcyRgQiBwcG1gClJlbGFjaW9uZXNfYmluYXJpYXMkYEIvRmUgcHBtYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgQiBwcG1gLyhSZWxhY2lvbmVzX2JpbmFyaWFzJGBGZSBwcG1gKQoKI3JlbGFjaW9uIEhpZXJybyBaaW5jCgpSZWxhY2lvbmVzX2JpbmFyaWFzJGBGZSBwcG0vWm5gPC0oUmVsYWNpb25lc19iaW5hcmlhcyRgRmUgcHBtYCkvUmVsYWNpb25lc19iaW5hcmlhcyRgWm4gcHBtYApSZWxhY2lvbmVzX2JpbmFyaWFzJGBabi9GZSBwcG1gPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGBabiBwcG1gLyhSZWxhY2lvbmVzX2JpbmFyaWFzJGBGZSBwcG1gKQoKI3JlbGFjaW9uIEhpZXJybyBNYW5nYW5lc28KClJlbGFjaW9uZXNfYmluYXJpYXMkYEZlIHBwbS9NbmA8LShSZWxhY2lvbmVzX2JpbmFyaWFzJGBGZSBwcG1gKS9SZWxhY2lvbmVzX2JpbmFyaWFzJGBNbiBwcG1gClJlbGFjaW9uZXNfYmluYXJpYXMkYE1uL0ZlIHBwbWA8LVJlbGFjaW9uZXNfYmluYXJpYXMkYE1uIHBwbWAvKFJlbGFjaW9uZXNfYmluYXJpYXMkYEZlIHBwbWApCgojcmVsYWNpb24gSGllcnJvIENvYnJlCgpSZWxhY2lvbmVzX2JpbmFyaWFzJGBGZSBwcG0vQ3VgPC0oUmVsYWNpb25lc19iaW5hcmlhcyRgRmUgcHBtYCkvUmVsYWNpb25lc19iaW5hcmlhcyRgQ3UgcHBtYApSZWxhY2lvbmVzX2JpbmFyaWFzJGBDdS9GZSBwcG1gPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGBDdSBwcG1gLyhSZWxhY2lvbmVzX2JpbmFyaWFzJGBGZSBwcG1gKQpgYGAKCgpyZWxhY2lvbmVzIGNvbiBCb3JvLgpjb21vIEJvcm8gZXMgcHJlc2VudGFkbyBlbiBlbCBhbmFsaXNpIGRlIHN1ZWxvcyBjb21vIHBwbSxubyBlcyBuZWNlc2FyaW8gbXVsdGlwbGljYXIgcG9yIDEwMCBwYXJhIGxhcyB2YXJpYWJsZXMgcXVlIHNlIHByZXNlbnRhbiBjb21vIHBwbS4KY29tbyB5YSBzZSBoYW4gY2FsY3VsYWRvIGxhcyByZWxhY2lvbmVzIGNvbiBOaXRyb2dlbm8sIEZvc2Zvcm8sUG90YXNpbyxDYWxjaW8sTWFnbmVzaW8sQXp1ZnJlIHkgSGllcnJvIGVzdGFzIHNlIGhhbiBvbWl0aWRvLgoKCmBgYHtyIEJvcm99CiNyZWxhY2lvbiBCb3JvIFppbmMKClJlbGFjaW9uZXNfYmluYXJpYXMkYEIgcHBtL1puYDwtKFJlbGFjaW9uZXNfYmluYXJpYXMkYEIgcHBtYCkvUmVsYWNpb25lc19iaW5hcmlhcyRgWm4gcHBtYApSZWxhY2lvbmVzX2JpbmFyaWFzJGBabi9CIHBwbWA8LVJlbGFjaW9uZXNfYmluYXJpYXMkYFpuIHBwbWAvKFJlbGFjaW9uZXNfYmluYXJpYXMkYEIgcHBtYCkKCiNyZWxhY2lvbiBCb3JvIE1hbmdhbmVzbwoKUmVsYWNpb25lc19iaW5hcmlhcyRgQiBwcG0vTW5gPC0oUmVsYWNpb25lc19iaW5hcmlhcyRgQiBwcG1gKS9SZWxhY2lvbmVzX2JpbmFyaWFzJGBNbiBwcG1gClJlbGFjaW9uZXNfYmluYXJpYXMkYE1uL0IgcHBtYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgTW4gcHBtYC8oUmVsYWNpb25lc19iaW5hcmlhcyRgQiBwcG1gKQoKI3JlbGFjaW9uIEJvcm8gQ29icmUKClJlbGFjaW9uZXNfYmluYXJpYXMkYEIgcHBtL0N1YDwtKFJlbGFjaW9uZXNfYmluYXJpYXMkYEIgcHBtYCkvUmVsYWNpb25lc19iaW5hcmlhcyRgQ3UgcHBtYApSZWxhY2lvbmVzX2JpbmFyaWFzJGBDdS9CIHBwbWA8LVJlbGFjaW9uZXNfYmluYXJpYXMkYEN1IHBwbWAvKFJlbGFjaW9uZXNfYmluYXJpYXMkYEIgcHBtYCkKYGBgCgoKCgoKcmVsYWNpb25lcyBjb24gWmluYy4KY29tbyBaaW5jIGVzIHByZXNlbnRhZG8gZW4gZWwgYW5hbGlzaSBkZSBzdWVsb3MgY29tbyBwcG0sbm8gZXMgbmVjZXNhcmlvIG11bHRpcGxpY2FyIHBvciAxMDAgcGFyYSBsYXMgdmFyaWFibGVzIHF1ZSBzZSBwcmVzZW50YW4gY29tbyBwcG0uCmNvbW8geWEgc2UgaGFuIGNhbGN1bGFkbyBsYXMgcmVsYWNpb25lcyBjb24gTml0cm9nZW5vLCBGb3Nmb3JvLFBvdGFzaW8sQ2FsY2lvLE1hZ25lc2lvLEF6dWZyZSxIaWVycm8geSBCb3JvIGVzdGFzIHNlIGhhbiBvbWl0aWRvLgoKCmBgYHtyIFppbmN9CiNyZWxhY2lvbiBaaW5jICBNYW5nYW5lc28KClJlbGFjaW9uZXNfYmluYXJpYXMkYFpuIHBwbS9NbmA8LShSZWxhY2lvbmVzX2JpbmFyaWFzJGBabiBwcG1gKS9SZWxhY2lvbmVzX2JpbmFyaWFzJGBNbiBwcG1gClJlbGFjaW9uZXNfYmluYXJpYXMkYE1uL1puIHBwbWA8LVJlbGFjaW9uZXNfYmluYXJpYXMkYE1uIHBwbWAvKFJlbGFjaW9uZXNfYmluYXJpYXMkYFpuIHBwbWApCgojcmVsYWNpb24gWmluYyBDb2JyZQoKUmVsYWNpb25lc19iaW5hcmlhcyRgWm4gcHBtL0N1YDwtKFJlbGFjaW9uZXNfYmluYXJpYXMkYFpuIHBwbWApL1JlbGFjaW9uZXNfYmluYXJpYXMkYEN1IHBwbWAKUmVsYWNpb25lc19iaW5hcmlhcyRgQ3UvWm4gcHBtYDwtUmVsYWNpb25lc19iaW5hcmlhcyRgQ3UgcHBtYC8oUmVsYWNpb25lc19iaW5hcmlhcyRgWm4gcHBtYCkKYGBgCgpyZWxhY2lvbmVzIGNvbiBDb2JyZSB5IE1hbmdhbmVzby4KY29tbyBDb2JyZSB5IE1hbmdhbmVzbyBlcyBwcmVzZW50YWRvIGVuIGVsIGFuYWxpc2kgZGUgc3VlbG9zIGNvbW8gcHBtLG5vIGVzIG5lY2VzYXJpbyBtdWx0aXBsaWNhciBwb3IgMTAwIHBhcmEgbGFzIHZhcmlhYmxlcyBxdWUgc2UgcHJlc2VudGFuIGNvbW8gcHBtLgpjb21vIHlhIHNlIGhhbiBjYWxjdWxhZG8gbGFzIHJlbGFjaW9uZXMgY29uIE5pdHJvZ2VubywgRm9zZm9ybyxQb3Rhc2lvLENhbGNpbyxNYWduZXNpbyxBenVmcmUsSGllcnJvLEJvcm8geSBaaW5jCgoKYGBge3IgQ29icmUgTWFuZ2FuZXNvfQojcmVsYWNpb24gTWFuZ2FuZXNvIENvYnJlCgpSZWxhY2lvbmVzX2JpbmFyaWFzJGBNbiBwcG0vQ3VgPC0oUmVsYWNpb25lc19iaW5hcmlhcyRgTW4gcHBtYCkvUmVsYWNpb25lc19iaW5hcmlhcyRgQ3UgcHBtYApSZWxhY2lvbmVzX2JpbmFyaWFzJGBDdS9NbiBwcG1gPC1SZWxhY2lvbmVzX2JpbmFyaWFzJGBDdSBwcG1gLyhSZWxhY2lvbmVzX2JpbmFyaWFzJGBNbiBwcG1gKQpoZWFkKFJlbGFjaW9uZXNfYmluYXJpYXMpCmBgYAoKCnNpIGRlc2VhcmFtb3MgY29ycmVnaXIgZGF0b3MgZGVsIGRhdGEuZnJhbWUKCmBgYHtyfQoKIyMgIGZpeChSZWxhY2lvbmVzX2JpbmFyaWFzKQpgYGAKCmVzdGFkaXN0aWNhcyAgZGUgdG9kYXMgbGFzIGNvbHVtbmFzCgpgYGB7cn0KCnNlbGVjY2lvbjwtUmVsYWNpb25lc19iaW5hcmlhc1ssMTQ6MTIzXQptZWRpYTwtYXBwbHkoc2VsZWNjaW9uLDIsbWVhbikKdmFyaWFuemE8LWFwcGx5KHNlbGVjY2lvbiwyLHZhcikKZGVzdmlhY2lvbl9lc3RhbmRhcjwtYXBwbHkoc2VsZWNjaW9uLDIsc2QpCgpgYGAKCgpkYXRhLmZyYW1lIGNvbiBsYSBlc3Rhc2Rpc3RpY2FzIAoKYGBge3J9CmVzdGFkaXN0aWNhczwtZGF0YS5mcmFtZShtZWRpYSx2YXJpYW56YSxkZXN2aWFjaW9uX2VzdGFuZGFyKQpgYGAKCmFncmVnYW1vcyBsYSBjb2x1bW5hIGNvZWZpY2llbnRlIGRlIHZhcmlhY2lvbiBxdWUgbm9zIHNlcnZpcmEgbWFzIGFkZWxhbnRlIHBhcmEgZWwgYW5hbGlzaXMgRFJJUwoKCmBgYHtyfQplc3RhZGlzdGljYXMkY29lZmljaWVudGVfZGVfdmFyaWFjaW9uPC1lc3RhZGlzdGljYXMkZGVzdmlhY2lvbl9lc3RhbmRhci9lc3RhZGlzdGljYXMkbWVkaWEKYGBgCgoKcGFyYSBhcnJlZ2xhciBsYSB0YWJsYSBkZSBlc3RhZGlzdGljYXMgZW4gdW5hIG1hbmVyYSBjb21vZGEgZGUgdmVyIHV0aWxpemFtb3MgbGEgZnVuY2lvbiB0KCkscGFyYSB0cmFuc3BvbmVyIGxvcyBkYXRvcwpgYGB7cn0KZXN0YWRpc3RpY2FzX2VuX2ZpbGFzPC10KGVzdGFkaXN0aWNhcykKYGBgCgoKCgoKCgoKCg==