Registros sobre velocidad de la luz de Michelson en 1879: Bases de datos (Crawley, 2013, 2014) http://www.bio.ic.ac.uk/research/mjcraw/therbook/index.htm http://www.bio.ic.ac.uk/research/crawley/statistics/

Pruebas de Normalidad

library(nortest)
luz = read.table("./light.txt", header=T)
luz
##    speed
## 1    850
## 2    740
## 3    900
## 4   1070
## 5    930
## 6    850
## 7    950
## 8    980
## 9    980
## 10   880
## 11  1000
## 12   980
## 13   930
## 14   650
## 15   760
## 16   810
## 17  1000
## 18  1000
## 19   960
## 20   960
names(luz) = "velocidad"
luz
##    velocidad
## 1        850
## 2        740
## 3        900
## 4       1070
## 5        930
## 6        850
## 7        950
## 8        980
## 9        980
## 10       880
## 11      1000
## 12       980
## 13       930
## 14       650
## 15       760
## 16       810
## 17      1000
## 18      1000
## 19       960
## 20       960

Contraste de hipótesis

H0: Los datos tienden una distribución Normal

H1: Los datos no tienden una distribución Normal

Comprobar la normalidad de los datos con pruebas estadisticas:

1. Prueba de Anderson-Darling

Es la derivada del Kolmorof

head(cars)
##   speed dist
## 1     4    2
## 2     4   10
## 3     7    4
## 4     7   22
## 5     8   16
## 6     9   10
attach(cars)
ad.test(speed)
## 
##  Anderson-Darling normality test
## 
## data:  speed
## A = 0.26143, p-value = 0.6927
ad.test(dist)
## 
##  Anderson-Darling normality test
## 
## data:  dist
## A = 0.74067, p-value = 0.05021
ad.test(luz$velocidad)
## 
##  Anderson-Darling normality test
## 
## data:  luz$velocidad
## A = 0.67243, p-value = 0.0671

2. Prueba de Cramer-von Mises

Es útil para pequeñas muestras y usa los momentos como criterio.

sd <- c(23,76,2,3,23,2,3,2,3,23,23)
cvm.test(sd)
## 
##  Cramer-von Mises normality test
## 
## data:  sd
## W = 0.23633, p-value = 0.001408
cvm.test(dist)
## 
##  Cramer-von Mises normality test
## 
## data:  dist
## W = 0.12632, p-value = 0.04742
cvm.test(luz$velocidad)
## 
##  Cramer-von Mises normality test
## 
## data:  luz$velocidad
## W = 0.11806, p-value = 0.05815

3. Prueba de Kolmogorov-Smirnov

Kolmogorov-Smirnov … no hay que usarla por ser poco confiable (Steinskog et al., 2007; Pedrosa et al., 2015)

ks.test(luz$velocidad,"pnorm",mean(luz$velocidad),sd(luz$velocidad))
## Warning in ks.test.default(luz$velocidad, "pnorm", mean(luz$velocidad), : ties
## should not be present for the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  luz$velocidad
## D = 0.17931, p-value = 0.541
## alternative hypothesis: two-sided

Crawley (2013) para más información sobre esta prueba

4. Prueba de Lilliefors (Kolmogorov-Smirnov)

Se aplica mas ampliamente cuando la muestra es grande.

Usar K-S con corrección de Lilliefors en lugar de K-S (Razali & Wah, 2011; Pedrosa et al., 2015):

lillie.test(dist)
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  dist
## D = 0.12675, p-value = 0.04335
install.packages("nortest")
## Warning: package 'nortest' is in use and will not be installed
library("nortest")
lillie.test(luz$velocidad)
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  luz$velocidad
## D = 0.17931, p-value = 0.09138

Otras pruebas de normalidad (ver Yap & Sim, 2011 y librer?a “nortest”):

5. Prueba de Pearson chi-square

basada en una distribución Ji cuadrado y que corresponde a una prueba de bondad de ajuste.

pearson.test(dist)
## 
##  Pearson chi-square normality test
## 
## data:  dist
## P = 11.2, p-value = 0.1301
pearson.test(luz$velocidad)
## 
##  Pearson chi-square normality test
## 
## data:  luz$velocidad
## P = 8.7, p-value = 0.06905

6. Prueba de Shapiro-Wilk

Es más poderosa cuando se compara con otras pruebas de normalidad cuando la muestra es pequeña.

Prueba de normalidad más robusta (Yap & Sim, 2011; Ghasemi & Zahediasl, 2012). Aunque tiene limitaciones (Yap & Sim, 2011; Razali & Wah, 2011)

shapiro.test(luz$velocidad)
## 
##  Shapiro-Wilk normality test
## 
## data:  luz$velocidad
## W = 0.91992, p-value = 0.09876

“El valor de P es una medida de credibilidad de la hipótesis nula” (Crawley, 2014).

La hipótesis nula de la prueba de Shapiro-Wilk (así como de la mayoría de las pruebas de normalidad) es que la distribución de nuestros datos sea normal.

Para nuestro ejemplo de la velocidad de la luz (registrada por Michelson en 1879), se tiene un porcentaje de credibilidad del 9.9% de que la velocidad de la luz tenga una distribución normal. Puesto que es mayor al 5%, concluimos que tiene una distribución normal.

La manera en como se reportaría, sería algo como lo siguiente: Las medidas registradas sobre la velocidad de la luz por Michelson, en 1879, presentaron una distribución normal (W=0.92; P=0.099) [NOTA: la “P” siempre irá en mayúsculas e itálicas].

7. Prueba de Shapiro-Francia

simplificacion de la prueba shapiro-W

sf.test(dist)
## 
##  Shapiro-Francia normality test
## 
## data:  dist
## W = 0.95206, p-value = 0.04179
sf.test(luz$velocidad)
## 
##  Shapiro-Francia normality test
## 
## data:  luz$velocidad
## W = 0.91666, p-value = 0.07992

8. Prueba de Frosini

library(normtest)
frosini.norm.test(speed)
## 
##  Frosini test for normality
## 
## data:  speed
## B = 0.14841, p-value = 0.734

9. Prueba de Geary

Usa los valores acumulados muestrales, sus medias y desviaciones estándar.

geary.norm.test(speed)
## 
##  Geary test for normality
## 
## data:  speed
## d = 0.82835, p-value = 0.181

10. Prueba de Hegazy-Green

hegazy1.norm.test(dist, nrepl=20000) ###nrepl: considera el número de replicas en simulación de Monte Carlo
## 
##  Hegazy-Green test for normality
## 
## data:  dist
## T = 0.16856, p-value = 0.03545

11. Prueba de Jarque-Bera

Utiliza un estadístico en la prueba que involucra la curtosis y la asimetría. –Usada por economistas.

jb.norm.test(dist, nrepl=2000)
## 
##  Jarque-Bera test for normality
## 
## data:  dist
## JB = 5.2305, p-value = 0.053

12. Prueba de Kurtosis

kurtosis.norm.test(speed, nrepl=2000)
## 
##  Kurtosis test for normality
## 
## data:  speed
## T = 2.4229, p-value = 0.325

13. Prueba de Skewness

skewness.norm.test(speed, nrepl=2000)
## 
##  Skewness test for normality
## 
## data:  speed
## T = -0.11395, p-value = 0.711

14. Prueba de Spiegelhalter

spiegelhalter.norm.test(speed, nrepl=2000)
## 
##  Spiegelhalter test for normality
## 
## data:  speed
## T = 1.2295, p-value = 0.7475

15. Puerba de Weisberg-Bingham

wb.norm.test(speed, nrepl=2000)
## 
##  Weisberg-Bingham test for normality
## 
## data:  speed
## WB = 0.98416, p-value = 0.652

16. Prueba de Agostino

library(moments)
agostino.test(dist)
## 
##  D'Agostino skewness test
## 
## data:  dist
## skew = 0.78248, z = 2.31281, p-value = 0.02073
## alternative hypothesis: data have a skewness

Método gráficos

Comprobar normalidad con gráficas:

Histograma:

hist(luz$velocidad)

Gráfico cuantil-cuantil (Crawley, 2014):

qqnorm(luz$velocidad)
qqline(luz$velocidad)

Si nuestros datos de interés (puntos) están alineados con la línea graficada, quiere decir que tienen una distribución normal. Si por el contrario, observamos que se acomodan en forma de “S” o de plátano (curva o en “U”), no son normales. Para más información consulta Crawley (2013,2014).

Gráfico para probar normalidad de Crawley (2013):

crawley.plot <- function(y) {
  s <- sd(y)
  plot(c(0,3),
       c(min(y,mean(y)-s*4*qnorm(0.75)),max(y,mean(y)+s*4*qnorm(0.75))),
       xaxt="n",
       xlab="",
       type="n",
       ylab="")
       
       
  # for your data's boxes and whiskers, centred at x = 1
  top <- quantile(y,0.75)
  bottom <- quantile(y,0.25)
  w1u <- quantile(y,0.91)
  w2u <- quantile(y,0.98)
  w1d <- quantile(y,0.09)
  w2d <- quantile(y,0.02)
  rect(0.8,bottom,1.2,top)
  lines(c(0.8,1.2),c(mean(y),mean(y)),lty=3)
  lines(c(0.8,1.2),c(median(y),median(y)))
  lines(c(1,1),c(top,w1u))
  lines(c(0.9,1.1),c(w1u,w1u))
  lines(c(1,1),c(w2u,w1u),lty=3)
  lines(c(0.9,1.1),c(w2u,w2u),lty=3)
  nou <- length(y[y>w2u])
  points(rep(1,nou),jitter(y[y>w2u]))
  lines(c(1,1),c(bottom,w1d))
  lines(c(0.9,1.1),c(w1d,w1d))
  lines(c(1,1),c(w2d,w1d),lty=3)
  lines(c(0.9,1.1),c(w2d,w2d),lty=3)
  nod <- length(y[y<w2d])
  points(rep(1,nod),jitter(y[y<w2d]))
  #for the normal box and whiskers, centred at x = 2
  n75 <- mean(y)+ s * qnorm(0.75)
  n25 <- mean(y)- s * qnorm(0.75)
  n91 <- mean(y)+ s * 2* qnorm(0.75)
  n98 <- mean(y)+ s * 3* qnorm(0.75)
  n9 <- mean(y)- s * 2* qnorm(0.75)
  n2 <- mean(y)- s * 3* qnorm(0.75)
  rect(1.8,n25,2.2,n75)
  lines(c(1.8,2.2),c(mean(y),mean(y)),lty=3)
  lines(c(2,2),c(n75,n91))
  lines(c(1.9,2.1),c(n91,n91))
  lines(c(2,2),c(n98,n91),lty=3)
  lines(c(1.9,2.1),c(n98,n98),lty=3)
  lines(c(2,2),c(n25,n9))
  lines(c(1.9,2.1),c(n9,n9))
  lines(c(2,2),c(n9,n2),lty=3)
  lines(c(1.9,2.1),c(n2,n2),lty=3)
  lines(c(1.2,1.8),c(top,n75),lty=3,col="gray")
  lines(c(1.1,1.9),c(w1u,n91),lty=3,col="gray")
  lines(c(1.1,1.9),c(w2u,n98),lty=3,col="gray")
  lines(c(1.2,1.8),c(bottom,n25),lty=3,col="gray")
  lines(c(1.1,1.9),c(w1d,n9),lty=3,col="gray")
  lines(c(1.1,1.9),c(w2d,n2),lty=3,col="gray")
  # label the two boxes
  axis(1,c(1,2),c("data","normal")) }

crawley.plot(luz$velocidad)

A la derecha del grafico (cajas y bigotes) tenemos una distrubución normal creada con la media y las desviación estantdar de la distribución de nuestros datos, en este caso de la variable velocidad de la luz (las lineas de meidana y media se impalman, los rangos intecuantílicos, osea la seccion de los bigotes y la seccion de las cajas son mas o menos del mismo tamaño o iguales, los datos atípicos son cosas poco comun)

a lado izquierdo tenemos nuestros datos sin ningun tipo de transformación (las lineas punteadas y sombreada no se impalman, quiere decir que la linea punteada es la media y linea sólida es la mediana,en este caso se oberva que el bigote inferior es mucho mas grande la la superior, por último nuestros datos presentan datos atípicos)

Podemos ver que la distribución de la velocidad de la luz NO ES NORMAL sim embargo nuestras pruebas estadísticas del inicio dicen que sí, esto se debe porque solamente tenemos 20 valores en nuestra variable, entonces algunos test no son buenos cuando tenemos menos de 30 datos.

Si utilizamos muestras mayores a 30

peces = read.table("./fishes.txt", header=T)

Podemos observar que tenemos mas de 150 datos

hist(peces$mass)

Graficando el histograma observamos que tiene una distribución normal

shapiro.test(peces$mass)
## 
##  Shapiro-Wilk normality test
## 
## data:  peces$mass
## W = 0.91651, p-value = 1.287e-10
lillie.test(peces$mass)
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  peces$mass
## D = 0.10448, p-value = 5.865e-07
ad.test(peces$mass)
## 
##  Anderson-Darling normality test
## 
## data:  peces$mass
## A = 4.6184, p-value = 1.777e-11

Haciendo las pruebas de normalidad observamos que los p son mucho menores que el 0,05, que quiere decir que esta variable no tiene una distribución normal

Doctor en estadística Ian Fellows, por parte de la universidad de California: http://blog.fellstat.com/?p=61

x = rt(1000,df=200)
hist(x)

qqnorm(x)
qqline(x)

shapiro.test(x)
## 
##  Shapiro-Wilk normality test
## 
## data:  x
## W = 0.99782, p-value = 0.2162
lillie.test(x)
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  x
## D = 0.023704, p-value = 0.1889
ad.test(x)
## 
##  Anderson-Darling normality test
## 
## data:  x
## A = 0.62939, p-value = 0.1008

R Markdown

This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see http://rmarkdown.rstudio.com.

When you click the Knit button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:

summary(cars)
##      speed           dist       
##  Min.   : 4.0   Min.   :  2.00  
##  1st Qu.:12.0   1st Qu.: 26.00  
##  Median :15.0   Median : 36.00  
##  Mean   :15.4   Mean   : 42.98  
##  3rd Qu.:19.0   3rd Qu.: 56.00  
##  Max.   :25.0   Max.   :120.00

Including Plots

You can also embed plots, for example:

Note that the echo = FALSE parameter was added to the code chunk to prevent printing of the R code that generated the plot.

LS0tDQp0aXRsZTogIlBydWViYXMgZGUgbm9ybWFsaWRhZCINCmF1dGhvcjogIkUgRWRpc29uIEFjaGFsbWEgTWVuZG96YSINCmRhdGU6ICcyMDIyLTA2LTA0Jw0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQogICAgdGhlbWU6IHVuaXRlZA0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICBwZGZfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCnN1YnRpdGxlOiBVbml2ZXJzaWRhZCBOYWNpb25hbCBkZSBTYW4gQ3Jpc3TDs2JhbCBkZSBIdWFtYW5nYQ0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNClJlZ2lzdHJvcyBzb2JyZSB2ZWxvY2lkYWQgZGUgbGEgbHV6IGRlIE1pY2hlbHNvbiBlbiAxODc5Og0KQmFzZXMgZGUgZGF0b3MgKENyYXdsZXksIDIwMTMsIDIwMTQpDQpodHRwOi8vd3d3LmJpby5pYy5hYy51ay9yZXNlYXJjaC9tamNyYXcvdGhlcmJvb2svaW5kZXguaHRtDQpodHRwOi8vd3d3LmJpby5pYy5hYy51ay9yZXNlYXJjaC9jcmF3bGV5L3N0YXRpc3RpY3MvDQoNCiMjIFBydWViYXMgZGUgTm9ybWFsaWRhZA0KDQoNCmBgYHtyfQ0KbGlicmFyeShub3J0ZXN0KQ0KYGBgDQoNCmBgYHtyfQ0KbHV6ID0gcmVhZC50YWJsZSgiLi9saWdodC50eHQiLCBoZWFkZXI9VCkNCmx1eg0KbmFtZXMobHV6KSA9ICJ2ZWxvY2lkYWQiDQpsdXoNCmBgYA0KIyMgQ29udHJhc3RlIGRlIGhpcMOzdGVzaXMNCg0KSDA6IExvcyBkYXRvcyB0aWVuZGVuIHVuYSBkaXN0cmlidWNpw7NuIE5vcm1hbA0KDQpIMTogTG9zIGRhdG9zIG5vIHRpZW5kZW4gdW5hIGRpc3RyaWJ1Y2nDs24gTm9ybWFsDQoNCkNvbXByb2JhciBsYSBub3JtYWxpZGFkIGRlIGxvcyBkYXRvcyBjb24gcHJ1ZWJhcyBlc3RhZGlzdGljYXM6DQoNCiMjIyAxLiBQcnVlYmEgZGUgQW5kZXJzb24tRGFybGluZw0KRXMgbGEgZGVyaXZhZGEgZGVsIEtvbG1vcm9mDQpgYGB7cn0NCmhlYWQoY2FycykNCmBgYA0KDQpgYGB7cn0NCmF0dGFjaChjYXJzKQ0KYWQudGVzdChzcGVlZCkNCmBgYA0KDQpgYGB7cn0NCmFkLnRlc3QoZGlzdCkNCmBgYA0KDQpgYGB7cn0NCmFkLnRlc3QobHV6JHZlbG9jaWRhZCkNCmBgYA0KDQojIyMgMi4gUHJ1ZWJhIGRlIENyYW1lci12b24gTWlzZXMNCkVzIMO6dGlsIHBhcmEgcGVxdWXDsWFzIG11ZXN0cmFzIHkgdXNhIGxvcyBtb21lbnRvcyBjb21vIGNyaXRlcmlvLg0KYGBge3J9DQpzZCA8LSBjKDIzLDc2LDIsMywyMywyLDMsMiwzLDIzLDIzKQ0KY3ZtLnRlc3Qoc2QpDQpgYGANCg0KYGBge3J9DQpjdm0udGVzdChkaXN0KQ0KYGBgDQoNCmBgYHtyfQ0KY3ZtLnRlc3QobHV6JHZlbG9jaWRhZCkNCmBgYA0KDQoNCiMjIyAzLiBQcnVlYmEgZGUgS29sbW9nb3Jvdi1TbWlybm92DQoNCktvbG1vZ29yb3YtU21pcm5vdiAuLi4gbm8gaGF5IHF1ZSB1c2FybGEgcG9yIHNlciBwb2NvIGNvbmZpYWJsZSAoU3RlaW5za29nIGV0IGFsLiwgMjAwNzsgUGVkcm9zYSBldCBhbC4sIDIwMTUpDQoNCmBgYHtyfQ0Ka3MudGVzdChsdXokdmVsb2NpZGFkLCJwbm9ybSIsbWVhbihsdXokdmVsb2NpZGFkKSxzZChsdXokdmVsb2NpZGFkKSkNCmBgYA0KDQpDcmF3bGV5ICgyMDEzKSBwYXJhIG3DoXMgaW5mb3JtYWNpw7NuIHNvYnJlIGVzdGEgcHJ1ZWJhDQoNCiMjIyA0LiBQcnVlYmEgZGUgTGlsbGllZm9ycyAoS29sbW9nb3Jvdi1TbWlybm92KQ0KDQpTZSBhcGxpY2EgbWFzIGFtcGxpYW1lbnRlIGN1YW5kbyBsYSBtdWVzdHJhIGVzIGdyYW5kZS4NCg0KVXNhciBLLVMgY29uIGNvcnJlY2Npw7NuIGRlIExpbGxpZWZvcnMgZW4gbHVnYXIgZGUgSy1TIChSYXphbGkgJiBXYWgsIDIwMTE7IFBlZHJvc2EgZXQgYWwuLCAyMDE1KToNCg0KYGBge3J9DQpsaWxsaWUudGVzdChkaXN0KQ0KYGBgDQoNCmBgYHtyfQ0KDQppbnN0YWxsLnBhY2thZ2VzKCJub3J0ZXN0IikNCmxpYnJhcnkoIm5vcnRlc3QiKQ0KbGlsbGllLnRlc3QobHV6JHZlbG9jaWRhZCkNCmBgYA0KDQpPdHJhcyBwcnVlYmFzIGRlIG5vcm1hbGlkYWQgKHZlciBZYXAgJiBTaW0sIDIwMTEgeSBsaWJyZXI/YSAibm9ydGVzdCIpOg0KDQoNCiMjIyA1LiBQcnVlYmEgZGUgUGVhcnNvbiBjaGktc3F1YXJlDQoNCmJhc2FkYSBlbiB1bmEgZGlzdHJpYnVjacOzbiBKaSBjdWFkcmFkbyB5IHF1ZSBjb3JyZXNwb25kZSBhIHVuYSBwcnVlYmEgZGUgYm9uZGFkIGRlIGFqdXN0ZS4NCg0KYGBge3J9DQpwZWFyc29uLnRlc3QoZGlzdCkNCmBgYA0KDQpgYGB7cn0NCnBlYXJzb24udGVzdChsdXokdmVsb2NpZGFkKQ0KYGBgDQoNCiMjIyA2LiBQcnVlYmEgZGUgU2hhcGlyby1XaWxrDQoNCkVzIG3DoXMgcG9kZXJvc2EgY3VhbmRvIHNlIGNvbXBhcmEgY29uIG90cmFzIHBydWViYXMgZGUgbm9ybWFsaWRhZCBjdWFuZG8gbGEgbXVlc3RyYSBlcyBwZXF1ZcOxYS4NCg0KUHJ1ZWJhIGRlIG5vcm1hbGlkYWQgbcOhcyByb2J1c3RhIChZYXAgJiBTaW0sIDIwMTE7IEdoYXNlbWkgJiBaYWhlZGlhc2wsIDIwMTIpLiBBdW5xdWUgdGllbmUgbGltaXRhY2lvbmVzIChZYXAgJiBTaW0sIDIwMTE7IFJhemFsaSAmIFdhaCwgMjAxMSkNCg0KYGBge3J9DQpzaGFwaXJvLnRlc3QobHV6JHZlbG9jaWRhZCkNCmBgYA0KDQoNCiJFbCB2YWxvciBkZSBQIGVzIHVuYSBtZWRpZGEgZGUgY3JlZGliaWxpZGFkIGRlIGxhIGhpcMOzdGVzaXMgbnVsYSIgKENyYXdsZXksIDIwMTQpLg0KDQpMYSBoaXDDs3Rlc2lzIG51bGEgZGUgbGEgcHJ1ZWJhIGRlIFNoYXBpcm8tV2lsayAoYXPDrSBjb21vIGRlIGxhIG1heW9yw61hIGRlIGxhcyBwcnVlYmFzIGRlIG5vcm1hbGlkYWQpIGVzIHF1ZSBsYSBkaXN0cmlidWNpw7NuIGRlIG51ZXN0cm9zIGRhdG9zIHNlYSBub3JtYWwuDQoNClBhcmEgbnVlc3RybyBlamVtcGxvIGRlIGxhIHZlbG9jaWRhZCBkZSBsYSBsdXogKHJlZ2lzdHJhZGEgcG9yIE1pY2hlbHNvbiBlbiAxODc5KSwgc2UgdGllbmUgdW4gcG9yY2VudGFqZSBkZSBjcmVkaWJpbGlkYWQgZGVsIDkuOSUgZGUgcXVlIGxhIHZlbG9jaWRhZCBkZSBsYSBsdXogdGVuZ2EgdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsLiBQdWVzdG8gcXVlIGVzIG1heW9yIGFsIDUlLCBjb25jbHVpbW9zIHF1ZSB0aWVuZSB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwuIA0KDQpMYSBtYW5lcmEgZW4gY29tbyBzZSByZXBvcnRhcsOtYSwgc2Vyw61hIGFsZ28gY29tbyBsbyBzaWd1aWVudGU6IExhcyBtZWRpZGFzIHJlZ2lzdHJhZGFzIHNvYnJlIGxhIHZlbG9jaWRhZCBkZSBsYSBsdXogcG9yIE1pY2hlbHNvbiwgZW4gMTg3OSwgcHJlc2VudGFyb24gdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIChXPTAuOTI7IFA9MC4wOTkpIFtOT1RBOiBsYSAiUCIgc2llbXByZSBpcsOhIGVuIG1hecO6c2N1bGFzIGUgaXTDoWxpY2FzXS4NCg0KDQoNCiMjIyA3LiBQcnVlYmEgZGUgU2hhcGlyby1GcmFuY2lhDQoNCnNpbXBsaWZpY2FjaW9uIGRlIGxhIHBydWViYSBzaGFwaXJvLVcNCg0KYGBge3J9DQpzZi50ZXN0KGRpc3QpDQpgYGANCg0KYGBge3J9DQpzZi50ZXN0KGx1eiR2ZWxvY2lkYWQpDQpgYGANCg0KIyMjIDguIFBydWViYSBkZSBGcm9zaW5pDQoNCmBgYHtyfQ0KbGlicmFyeShub3JtdGVzdCkNCmZyb3Npbmkubm9ybS50ZXN0KHNwZWVkKQ0KYGBgDQoNCiMjIyA5LiBQcnVlYmEgZGUgR2VhcnkNCg0KVXNhIGxvcyB2YWxvcmVzIGFjdW11bGFkb3MgbXVlc3RyYWxlcywgc3VzIG1lZGlhcyB5IGRlc3ZpYWNpb25lcyBlc3TDoW5kYXIuDQoNCmBgYHtyfQ0KZ2Vhcnkubm9ybS50ZXN0KHNwZWVkKQ0KYGBgDQoNCiMjIyAxMC4gUHJ1ZWJhIGRlIEhlZ2F6eS1HcmVlbg0KDQpgYGB7cn0NCmhlZ2F6eTEubm9ybS50ZXN0KGRpc3QsIG5yZXBsPTIwMDAwKSAjIyNucmVwbDogY29uc2lkZXJhIGVsIG7Dum1lcm8gZGUgcmVwbGljYXMgZW4gc2ltdWxhY2nDs24gZGUgTW9udGUgQ2FybG8NCmBgYA0KDQojIyMgMTEuIFBydWViYSBkZSBKYXJxdWUtQmVyYQ0KDQpVdGlsaXphIHVuIGVzdGFkw61zdGljbyBlbiBsYSBwcnVlYmEgcXVlIGludm9sdWNyYSBsYSBjdXJ0b3NpcyB5IGxhIGFzaW1ldHLDrWEuIOKAk1VzYWRhIHBvciBlY29ub21pc3Rhcy4NCg0KYGBge3J9DQpqYi5ub3JtLnRlc3QoZGlzdCwgbnJlcGw9MjAwMCkNCmBgYA0KDQojIyMgMTIuIFBydWViYSBkZSBLdXJ0b3Npcw0KDQpgYGB7cn0NCmt1cnRvc2lzLm5vcm0udGVzdChzcGVlZCwgbnJlcGw9MjAwMCkNCmBgYA0KDQojIyMgMTMuIFBydWViYSBkZSBTa2V3bmVzcw0KDQpgYGB7cn0NCnNrZXduZXNzLm5vcm0udGVzdChzcGVlZCwgbnJlcGw9MjAwMCkNCmBgYA0KDQojIyMgMTQuIFBydWViYSBkZSBTcGllZ2VsaGFsdGVyDQoNCmBgYHtyfQ0Kc3BpZWdlbGhhbHRlci5ub3JtLnRlc3Qoc3BlZWQsIG5yZXBsPTIwMDApDQpgYGANCg0KDQojIyMgMTUuIFB1ZXJiYSBkZSBXZWlzYmVyZy1CaW5naGFtDQoNCmBgYHtyfQ0Kd2Iubm9ybS50ZXN0KHNwZWVkLCBucmVwbD0yMDAwKQ0KYGBgDQoNCiMjIyAxNi4gUHJ1ZWJhIGRlIEFnb3N0aW5vDQoNCmBgYHtyfQ0KbGlicmFyeShtb21lbnRzKQ0KYWdvc3Rpbm8udGVzdChkaXN0KQ0KYGBgDQoNCg0KDQojIyBNw6l0b2RvIGdyw6FmaWNvcw0KDQpDb21wcm9iYXIgbm9ybWFsaWRhZCBjb24gZ3LDoWZpY2FzOg0KDQojIyMgSGlzdG9ncmFtYToNCg0KYGBge3J9DQpoaXN0KGx1eiR2ZWxvY2lkYWQpDQpgYGANCg0KDQoNCiMjIyBHcsOhZmljbyBjdWFudGlsLWN1YW50aWwgKENyYXdsZXksIDIwMTQpOg0KDQpgYGB7cn0NCnFxbm9ybShsdXokdmVsb2NpZGFkKQ0KcXFsaW5lKGx1eiR2ZWxvY2lkYWQpDQpgYGANCg0KU2kgbnVlc3Ryb3MgZGF0b3MgZGUgaW50ZXLDqXMgKHB1bnRvcykgZXN0w6FuIGFsaW5lYWRvcyBjb24gbGEgbMOtbmVhIGdyYWZpY2FkYSwgcXVpZXJlIGRlY2lyIHF1ZSB0aWVuZW4gdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsLiBTaSBwb3IgZWwgY29udHJhcmlvLCBvYnNlcnZhbW9zIHF1ZSBzZSBhY29tb2RhbiBlbiBmb3JtYSBkZSAiUyIgbyBkZSBwbMOhdGFubyAoY3VydmEgbyBlbiAiVSIpLCBubyBzb24gbm9ybWFsZXMuIFBhcmEgbcOhcyBpbmZvcm1hY2nDs24gY29uc3VsdGEgQ3Jhd2xleSAoMjAxMywyMDE0KS4gDQoNCiMjIyBHcsOhZmljbyBwYXJhIHByb2JhciBub3JtYWxpZGFkIGRlIENyYXdsZXkgKDIwMTMpOg0KYGBge3J9DQpjcmF3bGV5LnBsb3QgPC0gZnVuY3Rpb24oeSkgew0KICBzIDwtIHNkKHkpDQogIHBsb3QoYygwLDMpLA0KICAgICAgIGMobWluKHksbWVhbih5KS1zKjQqcW5vcm0oMC43NSkpLG1heCh5LG1lYW4oeSkrcyo0KnFub3JtKDAuNzUpKSksDQogICAgICAgeGF4dD0ibiIsDQogICAgICAgeGxhYj0iIiwNCiAgICAgICB0eXBlPSJuIiwNCiAgICAgICB5bGFiPSIiKQ0KICAgICAgIA0KICAgICAgIA0KICAjIGZvciB5b3VyIGRhdGEncyBib3hlcyBhbmQgd2hpc2tlcnMsIGNlbnRyZWQgYXQgeCA9IDENCiAgdG9wIDwtIHF1YW50aWxlKHksMC43NSkNCiAgYm90dG9tIDwtIHF1YW50aWxlKHksMC4yNSkNCiAgdzF1IDwtIHF1YW50aWxlKHksMC45MSkNCiAgdzJ1IDwtIHF1YW50aWxlKHksMC45OCkNCiAgdzFkIDwtIHF1YW50aWxlKHksMC4wOSkNCiAgdzJkIDwtIHF1YW50aWxlKHksMC4wMikNCiAgcmVjdCgwLjgsYm90dG9tLDEuMix0b3ApDQogIGxpbmVzKGMoMC44LDEuMiksYyhtZWFuKHkpLG1lYW4oeSkpLGx0eT0zKQ0KICBsaW5lcyhjKDAuOCwxLjIpLGMobWVkaWFuKHkpLG1lZGlhbih5KSkpDQogIGxpbmVzKGMoMSwxKSxjKHRvcCx3MXUpKQ0KICBsaW5lcyhjKDAuOSwxLjEpLGModzF1LHcxdSkpDQogIGxpbmVzKGMoMSwxKSxjKHcydSx3MXUpLGx0eT0zKQ0KICBsaW5lcyhjKDAuOSwxLjEpLGModzJ1LHcydSksbHR5PTMpDQogIG5vdSA8LSBsZW5ndGgoeVt5PncydV0pDQogIHBvaW50cyhyZXAoMSxub3UpLGppdHRlcih5W3k+dzJ1XSkpDQogIGxpbmVzKGMoMSwxKSxjKGJvdHRvbSx3MWQpKQ0KICBsaW5lcyhjKDAuOSwxLjEpLGModzFkLHcxZCkpDQogIGxpbmVzKGMoMSwxKSxjKHcyZCx3MWQpLGx0eT0zKQ0KICBsaW5lcyhjKDAuOSwxLjEpLGModzJkLHcyZCksbHR5PTMpDQogIG5vZCA8LSBsZW5ndGgoeVt5PHcyZF0pDQogIHBvaW50cyhyZXAoMSxub2QpLGppdHRlcih5W3k8dzJkXSkpDQogICNmb3IgdGhlIG5vcm1hbCBib3ggYW5kIHdoaXNrZXJzLCBjZW50cmVkIGF0IHggPSAyDQogIG43NSA8LSBtZWFuKHkpKyBzICogcW5vcm0oMC43NSkNCiAgbjI1IDwtIG1lYW4oeSktIHMgKiBxbm9ybSgwLjc1KQ0KICBuOTEgPC0gbWVhbih5KSsgcyAqIDIqIHFub3JtKDAuNzUpDQogIG45OCA8LSBtZWFuKHkpKyBzICogMyogcW5vcm0oMC43NSkNCiAgbjkgPC0gbWVhbih5KS0gcyAqIDIqIHFub3JtKDAuNzUpDQogIG4yIDwtIG1lYW4oeSktIHMgKiAzKiBxbm9ybSgwLjc1KQ0KICByZWN0KDEuOCxuMjUsMi4yLG43NSkNCiAgbGluZXMoYygxLjgsMi4yKSxjKG1lYW4oeSksbWVhbih5KSksbHR5PTMpDQogIGxpbmVzKGMoMiwyKSxjKG43NSxuOTEpKQ0KICBsaW5lcyhjKDEuOSwyLjEpLGMobjkxLG45MSkpDQogIGxpbmVzKGMoMiwyKSxjKG45OCxuOTEpLGx0eT0zKQ0KICBsaW5lcyhjKDEuOSwyLjEpLGMobjk4LG45OCksbHR5PTMpDQogIGxpbmVzKGMoMiwyKSxjKG4yNSxuOSkpDQogIGxpbmVzKGMoMS45LDIuMSksYyhuOSxuOSkpDQogIGxpbmVzKGMoMiwyKSxjKG45LG4yKSxsdHk9MykNCiAgbGluZXMoYygxLjksMi4xKSxjKG4yLG4yKSxsdHk9MykNCiAgbGluZXMoYygxLjIsMS44KSxjKHRvcCxuNzUpLGx0eT0zLGNvbD0iZ3JheSIpDQogIGxpbmVzKGMoMS4xLDEuOSksYyh3MXUsbjkxKSxsdHk9Myxjb2w9ImdyYXkiKQ0KICBsaW5lcyhjKDEuMSwxLjkpLGModzJ1LG45OCksbHR5PTMsY29sPSJncmF5IikNCiAgbGluZXMoYygxLjIsMS44KSxjKGJvdHRvbSxuMjUpLGx0eT0zLGNvbD0iZ3JheSIpDQogIGxpbmVzKGMoMS4xLDEuOSksYyh3MWQsbjkpLGx0eT0zLGNvbD0iZ3JheSIpDQogIGxpbmVzKGMoMS4xLDEuOSksYyh3MmQsbjIpLGx0eT0zLGNvbD0iZ3JheSIpDQogICMgbGFiZWwgdGhlIHR3byBib3hlcw0KICBheGlzKDEsYygxLDIpLGMoImRhdGEiLCJub3JtYWwiKSkgfQ0KDQpjcmF3bGV5LnBsb3QobHV6JHZlbG9jaWRhZCkNCmBgYA0KDQpBIGxhIGRlcmVjaGEgZGVsIGdyYWZpY28gKGNhamFzIHkgYmlnb3RlcykgdGVuZW1vcyB1bmEgZGlzdHJ1YnVjacOzbiBub3JtYWwgY3JlYWRhIGNvbiBsYSBtZWRpYSB5IGxhcyBkZXN2aWFjacOzbiBlc3RhbnRkYXIgZGUgbGENCmRpc3RyaWJ1Y2nDs24gZGUgbnVlc3Ryb3MgZGF0b3MsIGVuIGVzdGUgY2FzbyBkZSBsYSB2YXJpYWJsZSB2ZWxvY2lkYWQgZGUgbGEgbHV6IChsYXMgbGluZWFzIGRlIG1laWRhbmEgeSBtZWRpYSBzZSBpbXBhbG1hbiwgbG9zIHJhbmdvcyBpbnRlY3VhbnTDrWxpY29zLCBvc2VhIGxhIHNlY2Npb24gZGUgbG9zIGJpZ290ZXMgeSBsYSBzZWNjaW9uIGRlIGxhcyBjYWphcyBzb24gbWFzIG8gbWVub3MgZGVsIG1pc21vIHRhbWHDsW8gbyBpZ3VhbGVzLCBsb3MgZGF0b3MgYXTDrXBpY29zIHNvbiBjb3NhcyBwb2NvIGNvbXVuKQ0KDQphIGxhZG8gaXpxdWllcmRvIHRlbmVtb3MgbnVlc3Ryb3MgZGF0b3Mgc2luIG5pbmd1biB0aXBvIGRlIHRyYW5zZm9ybWFjacOzbiAobGFzIGxpbmVhcyBwdW50ZWFkYXMgeSBzb21icmVhZGEgbm8gc2UgaW1wYWxtYW4sIHF1aWVyZSBkZWNpciBxdWUgbGEgbGluZWEgcHVudGVhZGEgZXMgbGEgbWVkaWEgeSBsaW5lYSBzw7NsaWRhIGVzIGxhIG1lZGlhbmEsZW4gZXN0ZSBjYXNvIHNlIG9iZXJ2YSBxdWUgZWwgYmlnb3RlIGluZmVyaW9yIGVzIG11Y2hvIG1hcyBncmFuZGUgbGEgbGEgc3VwZXJpb3IsIHBvciDDumx0aW1vIG51ZXN0cm9zIGRhdG9zIHByZXNlbnRhbiBkYXRvcyBhdMOtcGljb3MpDQoNCg0KUG9kZW1vcyB2ZXIgcXVlIGxhIGRpc3RyaWJ1Y2nDs24gZGUgbGEgdmVsb2NpZGFkIGRlIGxhIGx1eiBOTyBFUyBOT1JNQUwgc2ltIGVtYmFyZ28gbnVlc3RyYXMgcHJ1ZWJhcyBlc3RhZMOtc3RpY2FzIGRlbCBpbmljaW8gZGljZW4gcXVlIHPDrSwgZXN0byBzZSBkZWJlIHBvcnF1ZSBzb2xhbWVudGUgdGVuZW1vcyAyMCB2YWxvcmVzIGVuIG51ZXN0cmEgdmFyaWFibGUsIGVudG9uY2VzIGFsZ3Vub3MgdGVzdCBubyBzb24gYnVlbm9zIGN1YW5kbyB0ZW5lbW9zIG1lbm9zIGRlIDMwIGRhdG9zLg0KDQoNCg0KU2kgdXRpbGl6YW1vcyBtdWVzdHJhcyBtYXlvcmVzIGEgMzANCg0KYGBge3J9DQpwZWNlcyA9IHJlYWQudGFibGUoIi4vZmlzaGVzLnR4dCIsIGhlYWRlcj1UKQ0KYGBgDQoNClBvZGVtb3Mgb2JzZXJ2YXIgcXVlIHRlbmVtb3MgbWFzIGRlIDE1MCBkYXRvcw0KDQpgYGB7cn0NCmhpc3QocGVjZXMkbWFzcykNCmBgYA0KDQpHcmFmaWNhbmRvIGVsIGhpc3RvZ3JhbWEgb2JzZXJ2YW1vcyBxdWUgdGllbmUgdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsDQoNCmBgYHtyfQ0Kc2hhcGlyby50ZXN0KHBlY2VzJG1hc3MpDQpgYGANCg0KYGBge3J9DQpsaWxsaWUudGVzdChwZWNlcyRtYXNzKQ0KYGBgDQoNCmBgYHtyfQ0KYWQudGVzdChwZWNlcyRtYXNzKQ0KYGBgDQoNCkhhY2llbmRvIGxhcyBwcnVlYmFzIGRlIG5vcm1hbGlkYWQgb2JzZXJ2YW1vcyBxdWUgbG9zIHAgc29uIG11Y2hvIG1lbm9yZXMgcXVlIGVsIDAsMDUsIHF1ZSBxdWllcmUgZGVjaXIgcXVlIGVzdGEgdmFyaWFibGUgbm8gdGllbmUgdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsDQoNCg0KRG9jdG9yIGVuIGVzdGFkw61zdGljYSBJYW4gRmVsbG93cywgcG9yIHBhcnRlIGRlIGxhIHVuaXZlcnNpZGFkIGRlIENhbGlmb3JuaWE6IGh0dHA6Ly9ibG9nLmZlbGxzdGF0LmNvbS8/cD02MQ0KDQpgYGB7cn0NCnggPSBydCgxMDAwLGRmPTIwMCkNCmBgYA0KDQpgYGB7cn0NCmhpc3QoeCkNCmBgYA0KDQoNCmBgYHtyfQ0KcXFub3JtKHgpDQpxcWxpbmUoeCkNCmBgYA0KDQpgYGB7cn0NCnNoYXBpcm8udGVzdCh4KQ0KYGBgDQoNCmBgYHtyfQ0KbGlsbGllLnRlc3QoeCkNCmBgYA0KDQpgYGB7cn0NCmFkLnRlc3QoeCkNCmBgYA0KDQoNCiMjIFIgTWFya2Rvd24NCg0KVGhpcyBpcyBhbiBSIE1hcmtkb3duIGRvY3VtZW50LiBNYXJrZG93biBpcyBhIHNpbXBsZSBmb3JtYXR0aW5nIHN5bnRheCBmb3IgYXV0aG9yaW5nIEhUTUwsIFBERiwgYW5kIE1TIFdvcmQgZG9jdW1lbnRzLiBGb3IgbW9yZSBkZXRhaWxzIG9uIHVzaW5nIFIgTWFya2Rvd24gc2VlIDxodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tPi4NCg0KV2hlbiB5b3UgY2xpY2sgdGhlICoqS25pdCoqIGJ1dHRvbiBhIGRvY3VtZW50IHdpbGwgYmUgZ2VuZXJhdGVkIHRoYXQgaW5jbHVkZXMgYm90aCBjb250ZW50IGFzIHdlbGwgYXMgdGhlIG91dHB1dCBvZiBhbnkgZW1iZWRkZWQgUiBjb2RlIGNodW5rcyB3aXRoaW4gdGhlIGRvY3VtZW50LiBZb3UgY2FuIGVtYmVkIGFuIFIgY29kZSBjaHVuayBsaWtlIHRoaXM6DQoNCmBgYHtyIGNhcnN9DQpzdW1tYXJ5KGNhcnMpDQpgYGANCg0KIyMgSW5jbHVkaW5nIFBsb3RzDQoNCllvdSBjYW4gYWxzbyBlbWJlZCBwbG90cywgZm9yIGV4YW1wbGU6DQoNCmBgYHtyIHByZXNzdXJlLCBlY2hvPUZBTFNFfQ0KcGxvdChwcmVzc3VyZSkNCmBgYA0KDQpOb3RlIHRoYXQgdGhlIGBlY2hvID0gRkFMU0VgIHBhcmFtZXRlciB3YXMgYWRkZWQgdG8gdGhlIGNvZGUgY2h1bmsgdG8gcHJldmVudCBwcmludGluZyBvZiB0aGUgUiBjb2RlIHRoYXQgZ2VuZXJhdGVkIHRoZSBwbG90Lg0K