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
Relaciones_binarias$`N/P`<-Relaciones_binarias$`% N`/Relaciones_binarias$`% P`
Relaciones_binarias$`P/N`<-Relaciones_binarias$`% P`/Relaciones_binarias$`% N`
Relaciones_binarias$`N/K`<-Relaciones_binarias$`% N`/Relaciones_binarias$`% K`
Relaciones_binarias$`K/N`<-Relaciones_binarias$`% K`/Relaciones_binarias$`% N`
Relaciones_binarias$`N/Ca`<-Relaciones_binarias$`% N`/Relaciones_binarias$`% Ca`
Relaciones_binarias$`Ca/N`<-Relaciones_binarias$`% Ca`/Relaciones_binarias$`% N`
Relaciones_binarias$`N/Mg`<-Relaciones_binarias$`% N`/Relaciones_binarias$`% Mg`
Relaciones_binarias$`Mg/N`<-Relaciones_binarias$`% Mg`/Relaciones_binarias$`% N`
Relaciones_binarias$`N/S`<-Relaciones_binarias$`% N`/Relaciones_binarias$`% S`
Relaciones_binarias$`S/N`<-Relaciones_binarias$`% S`/Relaciones_binarias$`% N`
Relaciones_binarias$`N/Fe`<-((Relaciones_binarias$`% N`)*100)/Relaciones_binarias$`Fe ppm`
Relaciones_binarias$`Fe/N`<-Relaciones_binarias$`Fe ppm`/((Relaciones_binarias$`% N`)*100)
Relaciones_binarias$`N/B`<-((Relaciones_binarias$`% N`)*100)/Relaciones_binarias$`B ppm`
Relaciones_binarias$`B/N`<-Relaciones_binarias$`B ppm`/((Relaciones_binarias$`% N`)*100)
Relaciones_binarias$`N/Zn`<-((Relaciones_binarias$`% N`)*100)/Relaciones_binarias$`Zn ppm`
Relaciones_binarias$`Zn/N`<-Relaciones_binarias$`Zn ppm`/((Relaciones_binarias$`% N`)*100)
Relaciones_binarias$`N/Mn`<-((Relaciones_binarias$`% N`)*100)/Relaciones_binarias$`Mn ppm`
Relaciones_binarias$`Mn/N`<-Relaciones_binarias$`Mn ppm`/((Relaciones_binarias$`% N`)*100)
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.
Relaciones_binarias$`P/K`<-Relaciones_binarias$`% P`/Relaciones_binarias$`% K`
Relaciones_binarias$`K/P`<-Relaciones_binarias$`% K`/Relaciones_binarias$`% P`
Relaciones_binarias$`P/Ca`<-Relaciones_binarias$`% P`/Relaciones_binarias$`% Ca`
Relaciones_binarias$`Ca/P`<-Relaciones_binarias$`% Ca`/Relaciones_binarias$`% P`
Relaciones_binarias$`P/Mg`<-Relaciones_binarias$`% P`/Relaciones_binarias$`% Mg`
Relaciones_binarias$`Mg/P`<-Relaciones_binarias$`% Mg`/Relaciones_binarias$`% P`
Relaciones_binarias$`P/S`<-Relaciones_binarias$`% P`/Relaciones_binarias$`% S`
Relaciones_binarias$`S/P`<-Relaciones_binarias$`% S`/Relaciones_binarias$`% P`
Relaciones_binarias$`P/Fe`<-((Relaciones_binarias$`% P`)*100)/Relaciones_binarias$`Fe ppm`
Relaciones_binarias$`Fe/P`<-Relaciones_binarias$`Fe ppm`/((Relaciones_binarias$`% P`)*100)
Relaciones_binarias$`P/B`<-((Relaciones_binarias$`% P`)*100)/Relaciones_binarias$`B ppm`
Relaciones_binarias$`B/P`<-Relaciones_binarias$`B ppm`/((Relaciones_binarias$`% P`)*100)
Relaciones_binarias$`P/Zn`<-((Relaciones_binarias$`% P`)*100)/Relaciones_binarias$`Zn ppm`
Relaciones_binarias$`Zn/P`<-Relaciones_binarias$`Zn ppm`/((Relaciones_binarias$`% P`)*100)
Relaciones_binarias$`P/Mn`<-((Relaciones_binarias$`% P`)*100)/Relaciones_binarias$`Mn ppm`
Relaciones_binarias$`Mn/P`<-Relaciones_binarias$`Mn ppm`/((Relaciones_binarias$`% P`)*100)
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.
Relaciones_binarias$`K/Ca`<-Relaciones_binarias$`% K`/Relaciones_binarias$`% Ca`
Relaciones_binarias$`Ca/K`<-Relaciones_binarias$`% Ca`/Relaciones_binarias$`% K`
Relaciones_binarias$`K/Mg`<-Relaciones_binarias$`% K`/Relaciones_binarias$`% Mg`
Relaciones_binarias$`Mg/K`<-Relaciones_binarias$`% Mg`/Relaciones_binarias$`% K`
Relaciones_binarias$`K/S`<-Relaciones_binarias$`% K`/Relaciones_binarias$`% S`
Relaciones_binarias$`S/K`<-Relaciones_binarias$`% S`/Relaciones_binarias$`% K`
Relaciones_binarias$`K/Fe`<-((Relaciones_binarias$`% K`)*100)/Relaciones_binarias$`Fe ppm`
Relaciones_binarias$`Fe/K`<-Relaciones_binarias$`Fe ppm`/((Relaciones_binarias$`% K`)*100)
Relaciones_binarias$`K/B`<-((Relaciones_binarias$`% K`)*100)/Relaciones_binarias$`B ppm`
Relaciones_binarias$`B/K`<-Relaciones_binarias$`B ppm`/((Relaciones_binarias$`% K`)*100)
Relaciones_binarias$`K/Zn`<-((Relaciones_binarias$`% K`)*100)/Relaciones_binarias$`Zn ppm`
Relaciones_binarias$`Zn/K`<-Relaciones_binarias$`Zn ppm`/((Relaciones_binarias$`% K`)*100)
Relaciones_binarias$`K/Mn`<-((Relaciones_binarias$`% K`)*100)/Relaciones_binarias$`Mn ppm`
Relaciones_binarias$`Mn/K`<-Relaciones_binarias$`Mn ppm`/((Relaciones_binarias$`% K`)*100)
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.
Relaciones_binarias$`Ca/Mg`<-Relaciones_binarias$`% Ca`/Relaciones_binarias$`% Mg`
Relaciones_binarias$`Mg/Ca`<-Relaciones_binarias$`% Mg`/Relaciones_binarias$`% Ca`
Relaciones_binarias$`Ca/S`<-Relaciones_binarias$`% Ca`/Relaciones_binarias$`% S`
Relaciones_binarias$`S/Ca`<-Relaciones_binarias$`% S`/Relaciones_binarias$`% Ca`
Relaciones_binarias$`Ca/Fe`<-((Relaciones_binarias$`% Ca`)*100)/Relaciones_binarias$`Fe ppm`
Relaciones_binarias$`Fe/Ca`<-Relaciones_binarias$`Fe ppm`/((Relaciones_binarias$`% Ca`)*100)
Relaciones_binarias$`Ca/B`<-((Relaciones_binarias$`% Ca`)*100)/Relaciones_binarias$`B ppm`
Relaciones_binarias$`B/Ca`<-Relaciones_binarias$`B ppm`/((Relaciones_binarias$`% Ca`)*100)
Relaciones_binarias$`Ca/Zn`<-((Relaciones_binarias$`% Ca`)*100)/Relaciones_binarias$`Zn ppm`
Relaciones_binarias$`Zn/Ca`<-Relaciones_binarias$`Zn ppm`/((Relaciones_binarias$`% Ca`)*100)
Relaciones_binarias$`Ca/Mn`<-((Relaciones_binarias$`% Ca`)*100)/Relaciones_binarias$`Mn ppm`
Relaciones_binarias$`Mn/Ca`<-Relaciones_binarias$`Mn ppm`/((Relaciones_binarias$`% Ca`)*100)
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.
Relaciones_binarias$`Mg/S`<-Relaciones_binarias$`% Mg`/Relaciones_binarias$`% S`
Relaciones_binarias$`S/Mg`<-Relaciones_binarias$`% S`/Relaciones_binarias$`% Mg`
Relaciones_binarias$`Mg/Fe`<-((Relaciones_binarias$`% Mg`)*100)/Relaciones_binarias$`Fe ppm`
Relaciones_binarias$`Fe/Mg`<-Relaciones_binarias$`Fe ppm`/((Relaciones_binarias$`% Mg`)*100)
Relaciones_binarias$`Mg/B`<-((Relaciones_binarias$`% Mg`)*100)/Relaciones_binarias$`B ppm`
Relaciones_binarias$`B/Mg`<-Relaciones_binarias$`B ppm`/((Relaciones_binarias$`% Mg`)*100)
Relaciones_binarias$`Mg/Zn`<-((Relaciones_binarias$`% Mg`)*100)/Relaciones_binarias$`Zn ppm`
Relaciones_binarias$`Zn/Mg`<-Relaciones_binarias$`Zn ppm`/((Relaciones_binarias$`% Mg`)*100)
Relaciones_binarias$`Mg/Mn`<-((Relaciones_binarias$`% Mg`)*100)/Relaciones_binarias$`Mn ppm`
Relaciones_binarias$`Mn/Mg`<-Relaciones_binarias$`Mn ppm`/((Relaciones_binarias$`% Mg`)*100)
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.
Relaciones_binarias$`S/Fe`<-((Relaciones_binarias$`% S`)*100)/Relaciones_binarias$`Fe ppm`
Relaciones_binarias$`Fe/S`<-Relaciones_binarias$`Fe ppm`/((Relaciones_binarias$`% S`)*100)
Relaciones_binarias$`S/B`<-((Relaciones_binarias$`% S`)*100)/Relaciones_binarias$`B ppm`
Relaciones_binarias$`B/S`<-Relaciones_binarias$`B ppm`/((Relaciones_binarias$`% S`)*100)
Relaciones_binarias$`S/Zn`<-((Relaciones_binarias$`% S`)*100)/Relaciones_binarias$`Zn ppm`
Relaciones_binarias$`Zn/S`<-Relaciones_binarias$`Zn ppm`/((Relaciones_binarias$`% S`)*100)
Relaciones_binarias$`S/Mn`<-((Relaciones_binarias$`% S`)*100)/Relaciones_binarias$`Mn ppm`
Relaciones_binarias$`Mn/S`<-Relaciones_binarias$`Mn ppm`/((Relaciones_binarias$`% S`)*100)
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.
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`)
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`)
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`)
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.
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`)
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`)
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.
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`)
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
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
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==