Caso 1: Estudio económico en Penitenciarías

Un grupo de especialistas pretende realizar un estudio económico en presos de una penitenciaría. La penitenciaría cuenta con 25 pabellones, pero con distinta cantidad de presos por pabellón. Los especialistas deciden trabajar con determinadas cantidades de pabellones tomados al azar. Las variables que consideraron estudiar son las siguientes:

  • Cantidad: Número de presos por pabellón
  • Gasto: Gasto mensual total en alimentación por pabellón
  • Trabajo: Número de presos por pabellón que realizan algún trajo institucional dentro de la penitenciaría
  • Tiempo: Número de presos por pabellón que llevan más de 10 años de condena
caso1 <- read_excel("PC1-2022-II-Parte I.xlsx")

Desarrollo

1, Mediante el muestreo aleatorio simple, calcule un intervalo de confianza de la media al 94% para la variable el número de presos por pabellón. Justifique los resultados mediante la interpretación.

t.test(caso1$Cantidad,conf.level = 0.94)
## 
##  One Sample t-test
## 
## data:  caso1$Cantidad
## t = 16.618, df = 24, p-value = 0.00000000000001143
## alternative hypothesis: true mean is not equal to 0
## 94 percent confidence interval:
##  29.78513 37.81487
## sample estimates:
## mean of x 
##      33.8

Con un intervalo de confianza al 94% para la media nos da un rango de 29.78513 a 37.81487

2. Calcular el tamaño de la muestra para la estimación de la media para en la variable Gasto con un e=20, con un nivel de confianza del 90%. Justifique los resultados mediante la interpretación.

N=nrow(caso1)
s=sd(caso1$Gasto)*sqrt(N-1)/sqrt(N)
e=20
sample.size.mean(e=e, S=s, N = N, level = 0.90)
## 
## sample.size.mean object: Sample size for mean estimate
## With finite population correction: N=25, precision e=20 and standard deviation S=3250.671
## 
## Sample size needed: 25

Con un intervalo de confianza al 90% para la media en la variable gastos nos da una muestra de 25

3. Calcular el tamaño de la muestra para la estimación de la media para en la variable número de presos medio por pabellón que llevan más de 10 años de condena. con un e=20, con un nivel de confianza del 97%. Justifique los resultados mediante la interpretación.

p3 <- caso1 %>% filter(Tiempo>10)
N=nrow(p3)
s=sd(p3$Cantidad)*sqrt(N-1)/sqrt(N)
e=20
sample.size.mean(e=e, S=s, N = N, level = 0.97)
## 
## sample.size.mean object: Sample size for mean estimate
## With finite population correction: N=7, precision e=20 and standard deviation S=5.6424
## 
## Sample size needed: 1

Con un intervalo de confianza al 97% para la media en la variable número de presos medio por pabellón que llevan más de 10 años de condena nos da una muestra de 1

4. Estime e interprete a un 90% de confianza mediante el estimador Horvitz y Thompson gasto promedio mensual por preso. Nota: Presente además el estimador, el error estándar, y el CV. Justifique los resultados mediante la interpretación.

t.test(caso1$Gasto,conf.level = 0.90)
## 
##  One Sample t-test
## 
## data:  caso1$Gasto
## t = 12.284, df = 24, p-value = 0.000000000007687
## alternative hypothesis: true mean is not equal to 0
## 90 percent confidence interval:
##  7015.801 9286.279
## sample estimates:
## mean of x 
##   8151.04
X = c(3,13,16,11,25)
pik = inclusionprobabilities(X,2)
pik
## [1] 0.08823529 0.38235294 0.47058824 0.32352941 0.73529412
library(TeachingSampling)
library(combinat) # Requiere del paquete combinat
pisppt <-function(X,n){
  N = length(X)
  XT = sum(X)
  m = apply(combn(X,n),2,permn)
  m = matrix(unlist(m),ncol=n,byrow=TRUE)
  nm = dim(m)[1] # Numero de permutaciones de N en n
  p<-pi1<-0
  for (j in 1:nm){
    p[j] = prod(m[j,])/(XT*prod(XT-cumsum(m[j,1:n-1])))}
  pi2=matrix(0,N,N)
  for (i in 1:(N-1)){
    aux1 = (m==X[i])
    index = which(apply(1*aux1,1,sum)==1)
    pi1[i] = sum(p[index])
    for (j in (i+1):N){
      aux2 = (m==X[j])
      aux2 = 1*aux2[index,]
      pi2[i,j] = sum(p[index[which(apply(aux2,1,sum)==1)]])}}
  pi1[N] = n-sum(pi1)
  pi2 = pi2+t(pi2)
  diag(pi2) = pi1
  pi2}

p = pisppt(X,2) ; p
##            [,1]       [,2]       [,3]       [,4]       [,5]
## [1,] 0.10228384 0.01925134 0.02443439 0.01598000 0.04261812
## [2,] 0.01925134 0.40686635 0.11443850 0.07512900 0.19804751
## [3,] 0.02443439 0.11443850 0.48397536 0.09518139 0.24992108
## [4,] 0.01598000 0.07512900 0.09518139 0.35128907 0.16499868
## [5,] 0.04261812 0.19804751 0.24992108 0.16499868 0.65558538
y = c(7335,7372,7500,7695,8850)

HTestimator(y[3:5],diag(p)[3:5])
##          [,1]
## [1,] 50901.08
pik2 = p[3:5,3:5]
sqrt(varHT(y[3:5],pik2,2))
## [1] 7831.117

5. Estime e interprete a un 93% de confianza mediante el estimador Horvitz y Thompson en el número de presos medio por pabellón que llevan más de 10 años de condena. Nota: Presente además el estimador, el error estándar, y el CV. Justifique los resultados mediante la interpretación.

t.test(p3$Cantidad,conf.level = 0.93)
## 
##  One Sample t-test
## 
## data:  p3$Cantidad
## t = 19.473, df = 6, p-value = 0.000001188
## alternative hypothesis: true mean is not equal to 0
## 93 percent confidence interval:
##  39.78700 49.92729
## sample estimates:
## mean of x 
##  44.85714
X = c(1,3,11,10,19,9)
pik = inclusionprobabilities(X,2)
pik
## [1] 0.03773585 0.11320755 0.41509434 0.37735849 0.71698113 0.33962264
library(TeachingSampling)
library(combinat) # Requiere del paquete combinat
pisppt <-function(X,n){
  N = length(X)
  XT = sum(X)
  m = apply(combn(X,n),2,permn)
  m = matrix(unlist(m),ncol=n,byrow=TRUE)
  nm = dim(m)[1] # Numero de permutaciones de N en n
  p<-pi1<-0
  for (j in 1:nm){
    p[j] = prod(m[j,])/(XT*prod(XT-cumsum(m[j,1:n-1])))}
  pi2=matrix(0,N,N)
  for (i in 1:(N-1)){
    aux1 = (m==X[i])
    index = which(apply(1*aux1,1,sum)==1)
    pi1[i] = sum(p[index])
    for (j in (i+1):N){
      aux2 = (m==X[j])
      aux2 = 1*aux2[index,]
      pi2[i,j] = sum(p[index[which(apply(aux2,1,sum)==1)]])}}
  pi1[N] = n-sum(pi1)
  pi2 = pi2+t(pi2)
  diag(pi2) = pi1
  pi2}

p = pisppt(X,2) ; p
##             [,1]       [,2]        [,3]        [,4]       [,5]        [,6]
## [1,] 0.043732677 0.00222061 0.008932891 0.008016336 0.01743789 0.007124951
## [2,] 0.002220610 0.12889034 0.027277628 0.024484423 0.05314095 0.021766724
## [3,] 0.008932891 0.02727763 0.430693148 0.097682776 0.20987263 0.086927224
## [4,] 0.008016336 0.02448442 0.097682776 0.397076324 0.18880830 0.078084487
## [5,] 0.017437890 0.05314095 0.209872628 0.188808301 0.63748195 0.168222177
## [6,] 0.007124951 0.02176672 0.086927224 0.078084487 0.16822218 0.362125562
y = c(43,45,45,45,47,47)

HTestimator(y[4:6],diag(p)[4:6])
##          [,1]
## [1,] 316.8452
pik2 = p[4:6,4:6]
sqrt(varHT(y[4:6],pik2,2))
## [1] 43.95797

6. Estime e interprete a un 98% de confianza mediante el estimador Horvitz y Thompson en el número de presos por pabellón. Nota: Presente además el estimador, el error estándar, y el CV. Justifique los resultados mediante la interpretación.

t.test(caso1$Cantidad,conf.level = 0.98)
## 
##  One Sample t-test
## 
## data:  caso1$Cantidad
## t = 16.618, df = 24, p-value = 0.00000000000001143
## alternative hypothesis: true mean is not equal to 0
## 98 percent confidence interval:
##  28.73125 38.86875
## sample estimates:
## mean of x 
##      33.8
X = c(22,7,20,12,8,6,5,13)
pik = inclusionprobabilities(X,2)
pik
## [1] 0.4731183 0.1505376 0.4301075 0.2580645 0.1720430 0.1290323 0.1075269
## [8] 0.2795699
library(TeachingSampling)
library(combinat) # Requiere del paquete combinat
pisppt <-function(X,n){
  N = length(X)
  XT = sum(X)
  m = apply(combn(X,n),2,permn)
  m = matrix(unlist(m),ncol=n,byrow=TRUE)
  nm = dim(m)[1] # Numero de permutaciones de N en n
  p<-pi1<-0
  for (j in 1:nm){
    p[j] = prod(m[j,])/(XT*prod(XT-cumsum(m[j,1:n-1])))}
  pi2=matrix(0,N,N)
  for (i in 1:(N-1)){
    aux1 = (m==X[i])
    index = which(apply(1*aux1,1,sum)==1)
    pi1[i] = sum(p[index])
    for (j in (i+1):N){
      aux2 = (m==X[j])
      aux2 = 1*aux2[index,]
      pi2[i,j] = sum(p[index[which(apply(aux2,1,sum)==1)]])}}
  pi1[N] = n-sum(pi1)
  pi2 = pi2+t(pi2)
  diag(pi2) = pi1
  pi2}

p = pisppt(X,2) ; p
##            [,1]        [,2]       [,3]       [,4]        [,5]        [,6]
## [1,] 0.44613101 0.042577546 0.13144710 0.07502762 0.048918941 0.036305337
## [2,] 0.04257755 0.159146976 0.03812597 0.02165356 0.014085874 0.010442266
## [3,] 0.13144710 0.038125970 0.41329118 0.06721112 0.043807890 0.032506946
## [4,] 0.07502762 0.021653562 0.06721112 0.26421012 0.024888139 0.018456721
## [5,] 0.04891894 0.014085874 0.04380789 0.02488814 0.180787867 0.012004624
## [6,] 0.03630534 0.010442266 0.03250695 0.01845672 0.012004624 0.137213618
## [7,] 0.03009995 0.008652731 0.02694867 0.01529633 0.009947674 0.007373513
## [8,] 0.08175451 0.023609027 0.07324348 0.04167662 0.027134725 0.020124212
##             [,7]       [,8]
## [1,] 0.030099955 0.08175451
## [2,] 0.008652731 0.02360903
## [3,] 0.026948674 0.07324348
## [4,] 0.015296333 0.04167662
## [5,] 0.009947674 0.02713472
## [6,] 0.007373513 0.02012421
## [7,] 0.114997764 0.01667889
## [8,] 0.016678886 0.28422146
y = c(30,30,32,32,33,35,35,38)

HTestimator(y[4:6],diag(p)[4:6])
##          [,1]
## [1,] 558.7268
pik2 = p[4:6,4:6]
sqrt(varHT(y[4:6],pik2,2))
## [1] 162.4287

7. Estime e interprete a un 95% de confianza mediante el estimador Horvitz y Thompson en el número de presos por pabellón. Nota: Presente además el estimador, el error estándar, y el CV. Justifique los resultados mediante la interpretación.

t.test(caso1$Cantidad,conf.level = 0.95)
## 
##  One Sample t-test
## 
## data:  caso1$Cantidad
## t = 16.618, df = 24, p-value = 0.00000000000001143
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  29.60228 37.99772
## sample estimates:
## mean of x 
##      33.8
X = c(22,7,20,12,8,6,5)
pik = inclusionprobabilities(X,2)
pik
## [1] 0.550 0.175 0.500 0.300 0.200 0.150 0.125
library(TeachingSampling)
library(combinat) # Requiere del paquete combinat
pisppt <-function(X,n){
  N = length(X)
  XT = sum(X)
  m = apply(combn(X,n),2,permn)
  m = matrix(unlist(m),ncol=n,byrow=TRUE)
  nm = dim(m)[1] # Numero de permutaciones de N en n
  p<-pi1<-0
  for (j in 1:nm){
    p[j] = prod(m[j,])/(XT*prod(XT-cumsum(m[j,1:n-1])))}
  pi2=matrix(0,N,N)
  for (i in 1:(N-1)){
    aux1 = (m==X[i])
    index = which(apply(1*aux1,1,sum)==1)
    pi1[i] = sum(p[index])
    for (j in (i+1):N){
      aux2 = (m==X[j])
      aux2 = 1*aux2[index,]
      pi2[i,j] = sum(p[index[which(apply(aux2,1,sum)==1)]])}}
  pi1[N] = n-sum(pi1)
  pi2 = pi2+t(pi2)
  diag(pi2) = pi1
  pi2}

p = pisppt(X,2) ; p
##            [,1]       [,2]       [,3]       [,4]       [,5]       [,6]
## [1,] 0.51275213 0.05955952 0.18649425 0.10542596 0.06848659 0.05074557
## [2,] 0.05955952 0.18794765 0.05313927 0.02982474 0.01931126 0.01428638
## [3,] 0.18649425 0.05313927 0.47763255 0.09411765 0.06111111 0.04527027
## [4,] 0.10542596 0.02982474 0.09411765 0.31010894 0.03431373 0.02539746
## [5,] 0.06848659 0.01931126 0.06111111 0.03431373 0.21327524 0.01644144
## [6,] 0.05074557 0.01428638 0.04527027 0.02539746 0.01644144 0.16220868
## [7,] 0.04204023 0.01182648 0.03750000 0.02102941 0.01361111 0.01006757
##            [,7]
## [1,] 0.04204023
## [2,] 0.01182648
## [3,] 0.03750000
## [4,] 0.02102941
## [5,] 0.01361111
## [6,] 0.01006757
## [7,] 0.13607480
y = c(30,30,32,32,33,35,35)

HTestimator(y[4:6],diag(p)[4:6])
##          [,1]
## [1,] 473.6906
pik2 = p[4:6,4:6]
sqrt(varHT(y[4:6],pik2,2))
## [1] 137.8648

Caso 2: Banco del Sur

Banco del Sur es una entidad financiera que viene operando a partir de enero del 2019 en nuestro país. Un analista de datos que labora en el banco desea realizar un estudio descriptivo de las siguientes características de interés:

  • Sucursal: Sucursal donde el cliente tiene su asesor de servicios. (1: San Isidro, 2: San Borja, 3: San Luis).
  • Ingreso: Ingreso mensual (en miles de soles) reportado por el cliente en el año 2021.
  • Crédito: Monto de crédito (en miles de soles) utilizado por el cliente en el presente mes.
  • NIF: Número de integrantes de la familia.
  • Edad: Edad del cliente (en años).
caso2 <- read_excel("PC1-2022-II-Parte II.xlsx")

Desarrollo

11. Estime e interprete a un 93.5% de confianza mediante el estimador Horvitz y Thompson ingreso mensual reportado por el cliente en el año 2021 en las sucursales de estudio. Nota: Presente además el estimador, el error estándar, y el CV. Justifique los resultados mediante la interpretación.

t.test(caso2$Ingreso,conf.level = 0.935)
## 
##  One Sample t-test
## 
## data:  caso2$Ingreso
## t = 48.118, df = 179, p-value < 0.00000000000000022
## alternative hypothesis: true mean is not equal to 0
## 93.5 percent confidence interval:
##  5.779700 6.243634
## sample estimates:
## mean of x 
##  6.011667

12. Para una muestra de tamaño 3, suponiendo la sucursal donde el cliente tiene su asesor de servicios: San Isidro, San Borja y San Luis. Estime e interprete a un 95.5% de confianza mediante el estimador Hansen y Hurwitz el monto de crédito (en miles de soles) utilizado por el cliente en el presente mes y Número de integrantes de la familia. Justifique los resultados mediante la interpretación.

N <- dim(caso2)[1] ; N
## [1] 180
m <- 3
sam <- sample(N,m,replace=TRUE) ; sam
## [1] 153  47  73
pk <- rep(1/N,m)

data <- caso2[sam,]
attach(data)
names(data)
## [1] "Sucursal" "Ingreso"  "Crédito"  "Edad"     "NIF"
estima <- data.frame(Crédito,NIF)
HH(estima, pk)
##                  Crédito   NIF
## Estimation     762.00000 480.0
## Standard Error 178.89662  60.0
## CVE             23.47725  12.5

14.Emplear el soporte simétrico sin reemplazo de tamaño de fijo de n=2 para las sucursales de estudio. En la salida de la matriz de membresía de la muestra para tamaños fijos de los diseños de muestreo de reemplazo. Justifique los resultados mediante la interpretación.

U <- c("San Isidro", "San Borja", "San Luis")
N <- length(U)
n <- 2

IkRS(N)
##      [,1] [,2] [,3]
## [1,]    0    0    0
## [2,]    1    0    0
## [3,]    0    1    0
## [4,]    0    0    1
## [5,]    1    1    0
## [6,]    1    0    1
## [7,]    0    1    1
## [8,]    1    1    1
LS0tDQp0aXRsZTogIlByw6FjdGljYSBDYWxpZmljYWRhIE7CsDEg4oCTIEVzdHJhdGVnaWEgZGUgTXVlc3RyZW8iDQphdXRob3I6ICJCcmF2byBZYXRhY28gTHVpZ2dpIE1hcmlhbm8iDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiBUUlVFDQogICAgdG9jX2Zsb2F0OiBUUlVFDQogICAgY29kZV9kb3dubG9hZDogVFJVRQ0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlID0gRkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFKQ0KYGBgDQoNCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQ0Kcm0obGlzdCA9IGxzKCkpDQpjYXQoIlwwMTQiKQ0KZ3JhcGhpY3Mub2ZmKCkNCm9wdGlvbnMoc2NpcGVuPTk5OSkNCg0KIyBQYXF1ZXRlcw0KDQpsaWJyYXJ5KHBhY21hbikNCnBfbG9hZCh0aWR5dmVyc2UsIHBkZnRvb2xzLCBzdHJpbmdyLCByZWFkeGwsIHRpZHl0ZXh0LCB0bSwgDQogICAgICAgd29yZGNsb3VkMiwgZm9yY2F0cywgcGF0Y2h3b3JrLCB3b3JkY2xvdWQpDQpsaWJyYXJ5KFRlYWNoaW5nU2FtcGxpbmcpDQpsaWJyYXJ5KGRwbHlyKSAgDQpsaWJyYXJ5KGdncGxvdDIpICAgICAgICAgIA0KbGlicmFyeShzYW1wbGluZ2Jvb2spICAgICANCmxpYnJhcnkoc3VydmV5KQ0KYGBgDQoNCiMjICoqKkNhc28gMTogRXN0dWRpbyBlY29uw7NtaWNvIGVuIFBlbml0ZW5jaWFyw61hcyoqKg0KDQpVbiBncnVwbyBkZSBlc3BlY2lhbGlzdGFzIHByZXRlbmRlIHJlYWxpemFyIHVuIGVzdHVkaW8gZWNvbsOzbWljbyBlbiBwcmVzb3MgZGUgdW5hIHBlbml0ZW5jaWFyw61hLiBMYSBwZW5pdGVuY2lhcsOtYSBjdWVudGEgY29uIDI1IHBhYmVsbG9uZXMsIHBlcm8gY29uIGRpc3RpbnRhIGNhbnRpZGFkIGRlIHByZXNvcyBwb3IgcGFiZWxsw7NuLiBMb3MgZXNwZWNpYWxpc3RhcyBkZWNpZGVuIHRyYWJhamFyIGNvbiBkZXRlcm1pbmFkYXMgY2FudGlkYWRlcyBkZQ0KcGFiZWxsb25lcyB0b21hZG9zIGFsIGF6YXIuDQpMYXMgdmFyaWFibGVzIHF1ZSBjb25zaWRlcmFyb24gZXN0dWRpYXIgc29uIGxhcyBzaWd1aWVudGVzOg0KIA0KIC0gQ2FudGlkYWQ6IE7Dum1lcm8gZGUgcHJlc29zIHBvciBwYWJlbGzDs24NCiAtIEdhc3RvOiBHYXN0byBtZW5zdWFsIHRvdGFsIGVuIGFsaW1lbnRhY2nDs24gcG9yIHBhYmVsbMOzbg0KIC0gVHJhYmFqbzogTsO6bWVybyBkZSBwcmVzb3MgcG9yIHBhYmVsbMOzbiBxdWUgcmVhbGl6YW4gYWxnw7puIHRyYWpvIGluc3RpdHVjaW9uYWwgZGVudHJvIGRlIGxhIHBlbml0ZW5jaWFyw61hDQogLSBUaWVtcG86IE7Dum1lcm8gZGUgcHJlc29zIHBvciBwYWJlbGzDs24gcXVlIGxsZXZhbiBtw6FzIGRlIDEwIGHDsW9zIGRlIGNvbmRlbmENCg0KYGBge3J9DQpjYXNvMSA8LSByZWFkX2V4Y2VsKCJQQzEtMjAyMi1JSS1QYXJ0ZSBJLnhsc3giKQ0KYGBgDQoNCiMjICoqKkRlc2Fycm9sbG8qKioNCg0KDQoqKioxLCBNZWRpYW50ZSBlbCBtdWVzdHJlbyBhbGVhdG9yaW8gc2ltcGxlLCBjYWxjdWxlIHVuIGludGVydmFsbyBkZSBjb25maWFuemEgZGUgbGEgbWVkaWEgYWwgOTQlIHBhcmEgbGEgdmFyaWFibGUgZWwgbsO6bWVybyBkZSBwcmVzb3MgcG9yIHBhYmVsbMOzbi4gSnVzdGlmaXF1ZSBsb3MgcmVzdWx0YWRvcyBtZWRpYW50ZSBsYSBpbnRlcnByZXRhY2nDs24uKioqDQoNCmBgYHtyfQ0KdC50ZXN0KGNhc28xJENhbnRpZGFkLGNvbmYubGV2ZWwgPSAwLjk0KQ0KYGBgDQoNCkNvbiB1biBpbnRlcnZhbG8gZGUgY29uZmlhbnphIGFsIDk0JSBwYXJhIGxhIG1lZGlhIG5vcyBkYSB1biByYW5nbyBkZSAyOS43ODUxMyBhIDM3LjgxNDg3DQoNCioqKjIuIENhbGN1bGFyIGVsIHRhbWHDsW8gZGUgbGEgbXVlc3RyYSBwYXJhIGxhIGVzdGltYWNpw7NuIGRlIGxhIG1lZGlhIHBhcmEgZW4gbGEgdmFyaWFibGUgR2FzdG8gY29uIHVuIGU9MjAsIGNvbiB1biBuaXZlbCBkZSBjb25maWFuemEgZGVsIDkwJS4gSnVzdGlmaXF1ZSBsb3MgcmVzdWx0YWRvcyBtZWRpYW50ZSBsYSBpbnRlcnByZXRhY2nDs24uKioqDQoNCmBgYHtyfQ0KTj1ucm93KGNhc28xKQ0Kcz1zZChjYXNvMSRHYXN0bykqc3FydChOLTEpL3NxcnQoTikNCmU9MjANCnNhbXBsZS5zaXplLm1lYW4oZT1lLCBTPXMsIE4gPSBOLCBsZXZlbCA9IDAuOTApDQpgYGANCg0KQ29uIHVuIGludGVydmFsbyBkZSBjb25maWFuemEgYWwgOTAlIHBhcmEgbGEgbWVkaWEgZW4gbGEgdmFyaWFibGUgZ2FzdG9zIG5vcyBkYSB1bmEgbXVlc3RyYSBkZSAyNQ0KDQoqKiozLiBDYWxjdWxhciBlbCB0YW1hw7FvIGRlIGxhIG11ZXN0cmEgcGFyYSBsYSBlc3RpbWFjacOzbiBkZSBsYSBtZWRpYSBwYXJhIGVuIGxhIHZhcmlhYmxlIG7Dum1lcm8gZGUgcHJlc29zIG1lZGlvIHBvciBwYWJlbGzDs24gcXVlIGxsZXZhbiBtw6FzIGRlIDEwIGHDsW9zIGRlIGNvbmRlbmEuIGNvbiB1biBlPTIwLCBjb24gdW4gbml2ZWwgZGUgY29uZmlhbnphIGRlbCA5NyUuIEp1c3RpZmlxdWUgbG9zIHJlc3VsdGFkb3MgbWVkaWFudGUgbGEgaW50ZXJwcmV0YWNpw7NuLioqKg0KDQpgYGB7cn0NCnAzIDwtIGNhc28xICU+JSBmaWx0ZXIoVGllbXBvPjEwKQ0KTj1ucm93KHAzKQ0Kcz1zZChwMyRDYW50aWRhZCkqc3FydChOLTEpL3NxcnQoTikNCmU9MjANCnNhbXBsZS5zaXplLm1lYW4oZT1lLCBTPXMsIE4gPSBOLCBsZXZlbCA9IDAuOTcpDQpgYGANCg0KQ29uIHVuIGludGVydmFsbyBkZSBjb25maWFuemEgYWwgOTclIHBhcmEgbGEgbWVkaWEgZW4gbGEgdmFyaWFibGUgbsO6bWVybyBkZSBwcmVzb3MgbWVkaW8gcG9yIHBhYmVsbMOzbiBxdWUgbGxldmFuIG3DoXMgZGUgMTAgYcOxb3MgZGUgY29uZGVuYSBub3MgZGEgdW5hIG11ZXN0cmEgZGUgMQ0KDQoqKio0LiBFc3RpbWUgZSBpbnRlcnByZXRlIGEgdW4gOTAlIGRlIGNvbmZpYW56YSBtZWRpYW50ZSBlbCBlc3RpbWFkb3IgSG9ydml0eiB5IFRob21wc29uIGdhc3RvIHByb21lZGlvIG1lbnN1YWwgcG9yIHByZXNvLiBOb3RhOiBQcmVzZW50ZSBhZGVtw6FzIGVsIGVzdGltYWRvciwgZWwgZXJyb3IgZXN0w6FuZGFyLCB5IGVsIENWLiBKdXN0aWZpcXVlIGxvcyByZXN1bHRhZG9zIG1lZGlhbnRlIGxhIGludGVycHJldGFjacOzbi4qKioNCg0KYGBge3J9DQp0LnRlc3QoY2FzbzEkR2FzdG8sY29uZi5sZXZlbCA9IDAuOTApDQpYID0gYygzLDEzLDE2LDExLDI1KQ0KcGlrID0gaW5jbHVzaW9ucHJvYmFiaWxpdGllcyhYLDIpDQpwaWsNCg0KbGlicmFyeShUZWFjaGluZ1NhbXBsaW5nKQ0KbGlicmFyeShjb21iaW5hdCkgIyBSZXF1aWVyZSBkZWwgcGFxdWV0ZSBjb21iaW5hdA0KcGlzcHB0IDwtZnVuY3Rpb24oWCxuKXsNCiAgTiA9IGxlbmd0aChYKQ0KICBYVCA9IHN1bShYKQ0KICBtID0gYXBwbHkoY29tYm4oWCxuKSwyLHBlcm1uKQ0KICBtID0gbWF0cml4KHVubGlzdChtKSxuY29sPW4sYnlyb3c9VFJVRSkNCiAgbm0gPSBkaW0obSlbMV0gIyBOdW1lcm8gZGUgcGVybXV0YWNpb25lcyBkZSBOIGVuIG4NCiAgcDwtcGkxPC0wDQogIGZvciAoaiBpbiAxOm5tKXsNCiAgICBwW2pdID0gcHJvZChtW2osXSkvKFhUKnByb2QoWFQtY3Vtc3VtKG1baiwxOm4tMV0pKSl9DQogIHBpMj1tYXRyaXgoMCxOLE4pDQogIGZvciAoaSBpbiAxOihOLTEpKXsNCiAgICBhdXgxID0gKG09PVhbaV0pDQogICAgaW5kZXggPSB3aGljaChhcHBseSgxKmF1eDEsMSxzdW0pPT0xKQ0KICAgIHBpMVtpXSA9IHN1bShwW2luZGV4XSkNCiAgICBmb3IgKGogaW4gKGkrMSk6Til7DQogICAgICBhdXgyID0gKG09PVhbal0pDQogICAgICBhdXgyID0gMSphdXgyW2luZGV4LF0NCiAgICAgIHBpMltpLGpdID0gc3VtKHBbaW5kZXhbd2hpY2goYXBwbHkoYXV4MiwxLHN1bSk9PTEpXV0pfX0NCiAgcGkxW05dID0gbi1zdW0ocGkxKQ0KICBwaTIgPSBwaTIrdChwaTIpDQogIGRpYWcocGkyKSA9IHBpMQ0KICBwaTJ9DQoNCnAgPSBwaXNwcHQoWCwyKSA7IHANCg0KeSA9IGMoNzMzNSw3MzcyLDc1MDAsNzY5NSw4ODUwKQ0KDQpIVGVzdGltYXRvcih5WzM6NV0sZGlhZyhwKVszOjVdKQ0KDQpwaWsyID0gcFszOjUsMzo1XQ0Kc3FydCh2YXJIVCh5WzM6NV0scGlrMiwyKSkNCmBgYA0KDQoNCioqKjUuIEVzdGltZSBlIGludGVycHJldGUgYSB1biA5MyUgZGUgY29uZmlhbnphIG1lZGlhbnRlIGVsIGVzdGltYWRvciBIb3J2aXR6IHkgVGhvbXBzb24gZW4gZWwgbsO6bWVybyBkZSBwcmVzb3MgbWVkaW8gcG9yIHBhYmVsbMOzbiBxdWUgbGxldmFuIG3DoXMgZGUgMTAgYcOxb3MgZGUgY29uZGVuYS4gTm90YTogUHJlc2VudGUgYWRlbcOhcyBlbCBlc3RpbWFkb3IsIGVsIGVycm9yIGVzdMOhbmRhciwgeSBlbCBDVi4gSnVzdGlmaXF1ZSBsb3MgcmVzdWx0YWRvcyBtZWRpYW50ZSBsYSBpbnRlcnByZXRhY2nDs24uKioqDQoNCmBgYHtyfQ0KdC50ZXN0KHAzJENhbnRpZGFkLGNvbmYubGV2ZWwgPSAwLjkzKQ0KWCA9IGMoMSwzLDExLDEwLDE5LDkpDQpwaWsgPSBpbmNsdXNpb25wcm9iYWJpbGl0aWVzKFgsMikNCnBpaw0KDQpsaWJyYXJ5KFRlYWNoaW5nU2FtcGxpbmcpDQpsaWJyYXJ5KGNvbWJpbmF0KSAjIFJlcXVpZXJlIGRlbCBwYXF1ZXRlIGNvbWJpbmF0DQpwaXNwcHQgPC1mdW5jdGlvbihYLG4pew0KICBOID0gbGVuZ3RoKFgpDQogIFhUID0gc3VtKFgpDQogIG0gPSBhcHBseShjb21ibihYLG4pLDIscGVybW4pDQogIG0gPSBtYXRyaXgodW5saXN0KG0pLG5jb2w9bixieXJvdz1UUlVFKQ0KICBubSA9IGRpbShtKVsxXSAjIE51bWVybyBkZSBwZXJtdXRhY2lvbmVzIGRlIE4gZW4gbg0KICBwPC1waTE8LTANCiAgZm9yIChqIGluIDE6bm0pew0KICAgIHBbal0gPSBwcm9kKG1baixdKS8oWFQqcHJvZChYVC1jdW1zdW0obVtqLDE6bi0xXSkpKX0NCiAgcGkyPW1hdHJpeCgwLE4sTikNCiAgZm9yIChpIGluIDE6KE4tMSkpew0KICAgIGF1eDEgPSAobT09WFtpXSkNCiAgICBpbmRleCA9IHdoaWNoKGFwcGx5KDEqYXV4MSwxLHN1bSk9PTEpDQogICAgcGkxW2ldID0gc3VtKHBbaW5kZXhdKQ0KICAgIGZvciAoaiBpbiAoaSsxKTpOKXsNCiAgICAgIGF1eDIgPSAobT09WFtqXSkNCiAgICAgIGF1eDIgPSAxKmF1eDJbaW5kZXgsXQ0KICAgICAgcGkyW2ksal0gPSBzdW0ocFtpbmRleFt3aGljaChhcHBseShhdXgyLDEsc3VtKT09MSldXSl9fQ0KICBwaTFbTl0gPSBuLXN1bShwaTEpDQogIHBpMiA9IHBpMit0KHBpMikNCiAgZGlhZyhwaTIpID0gcGkxDQogIHBpMn0NCg0KcCA9IHBpc3BwdChYLDIpIDsgcA0KDQp5ID0gYyg0Myw0NSw0NSw0NSw0Nyw0NykNCg0KSFRlc3RpbWF0b3IoeVs0OjZdLGRpYWcocClbNDo2XSkNCg0KcGlrMiA9IHBbNDo2LDQ6Nl0NCnNxcnQodmFySFQoeVs0OjZdLHBpazIsMikpDQpgYGANCg0KKioqNi4gRXN0aW1lIGUgaW50ZXJwcmV0ZSBhIHVuIDk4JSBkZSBjb25maWFuemEgbWVkaWFudGUgZWwgZXN0aW1hZG9yIEhvcnZpdHogeSBUaG9tcHNvbiBlbiBlbCBuw7ptZXJvIGRlIHByZXNvcyBwb3IgcGFiZWxsw7NuLiBOb3RhOiBQcmVzZW50ZSBhZGVtw6FzIGVsIGVzdGltYWRvciwgZWwgZXJyb3IgZXN0w6FuZGFyLCB5IGVsIENWLiBKdXN0aWZpcXVlIGxvcyByZXN1bHRhZG9zIG1lZGlhbnRlIGxhIGludGVycHJldGFjacOzbi4qKioNCg0KYGBge3J9DQp0LnRlc3QoY2FzbzEkQ2FudGlkYWQsY29uZi5sZXZlbCA9IDAuOTgpDQpYID0gYygyMiw3LDIwLDEyLDgsNiw1LDEzKQ0KcGlrID0gaW5jbHVzaW9ucHJvYmFiaWxpdGllcyhYLDIpDQpwaWsNCg0KbGlicmFyeShUZWFjaGluZ1NhbXBsaW5nKQ0KbGlicmFyeShjb21iaW5hdCkgIyBSZXF1aWVyZSBkZWwgcGFxdWV0ZSBjb21iaW5hdA0KcGlzcHB0IDwtZnVuY3Rpb24oWCxuKXsNCiAgTiA9IGxlbmd0aChYKQ0KICBYVCA9IHN1bShYKQ0KICBtID0gYXBwbHkoY29tYm4oWCxuKSwyLHBlcm1uKQ0KICBtID0gbWF0cml4KHVubGlzdChtKSxuY29sPW4sYnlyb3c9VFJVRSkNCiAgbm0gPSBkaW0obSlbMV0gIyBOdW1lcm8gZGUgcGVybXV0YWNpb25lcyBkZSBOIGVuIG4NCiAgcDwtcGkxPC0wDQogIGZvciAoaiBpbiAxOm5tKXsNCiAgICBwW2pdID0gcHJvZChtW2osXSkvKFhUKnByb2QoWFQtY3Vtc3VtKG1baiwxOm4tMV0pKSl9DQogIHBpMj1tYXRyaXgoMCxOLE4pDQogIGZvciAoaSBpbiAxOihOLTEpKXsNCiAgICBhdXgxID0gKG09PVhbaV0pDQogICAgaW5kZXggPSB3aGljaChhcHBseSgxKmF1eDEsMSxzdW0pPT0xKQ0KICAgIHBpMVtpXSA9IHN1bShwW2luZGV4XSkNCiAgICBmb3IgKGogaW4gKGkrMSk6Til7DQogICAgICBhdXgyID0gKG09PVhbal0pDQogICAgICBhdXgyID0gMSphdXgyW2luZGV4LF0NCiAgICAgIHBpMltpLGpdID0gc3VtKHBbaW5kZXhbd2hpY2goYXBwbHkoYXV4MiwxLHN1bSk9PTEpXV0pfX0NCiAgcGkxW05dID0gbi1zdW0ocGkxKQ0KICBwaTIgPSBwaTIrdChwaTIpDQogIGRpYWcocGkyKSA9IHBpMQ0KICBwaTJ9DQoNCnAgPSBwaXNwcHQoWCwyKSA7IHANCg0KeSA9IGMoMzAsMzAsMzIsMzIsMzMsMzUsMzUsMzgpDQoNCkhUZXN0aW1hdG9yKHlbNDo2XSxkaWFnKHApWzQ6Nl0pDQoNCnBpazIgPSBwWzQ6Niw0OjZdDQpzcXJ0KHZhckhUKHlbNDo2XSxwaWsyLDIpKQ0KYGBgDQoNCioqKjcuIEVzdGltZSBlIGludGVycHJldGUgYSB1biA5NSUgZGUgY29uZmlhbnphIG1lZGlhbnRlIGVsIGVzdGltYWRvciBIb3J2aXR6IHkgVGhvbXBzb24gZW4gZWwgbsO6bWVybyBkZSBwcmVzb3MgcG9yIHBhYmVsbMOzbi4gTm90YTogUHJlc2VudGUgYWRlbcOhcyBlbCBlc3RpbWFkb3IsIGVsIGVycm9yIGVzdMOhbmRhciwgeSBlbCBDVi4gSnVzdGlmaXF1ZSBsb3MgcmVzdWx0YWRvcyBtZWRpYW50ZSBsYSBpbnRlcnByZXRhY2nDs24uKioqDQoNCmBgYHtyfQ0KdC50ZXN0KGNhc28xJENhbnRpZGFkLGNvbmYubGV2ZWwgPSAwLjk1KQ0KWCA9IGMoMjIsNywyMCwxMiw4LDYsNSkNCnBpayA9IGluY2x1c2lvbnByb2JhYmlsaXRpZXMoWCwyKQ0KcGlrDQoNCmxpYnJhcnkoVGVhY2hpbmdTYW1wbGluZykNCmxpYnJhcnkoY29tYmluYXQpICMgUmVxdWllcmUgZGVsIHBhcXVldGUgY29tYmluYXQNCnBpc3BwdCA8LWZ1bmN0aW9uKFgsbil7DQogIE4gPSBsZW5ndGgoWCkNCiAgWFQgPSBzdW0oWCkNCiAgbSA9IGFwcGx5KGNvbWJuKFgsbiksMixwZXJtbikNCiAgbSA9IG1hdHJpeCh1bmxpc3QobSksbmNvbD1uLGJ5cm93PVRSVUUpDQogIG5tID0gZGltKG0pWzFdICMgTnVtZXJvIGRlIHBlcm11dGFjaW9uZXMgZGUgTiBlbiBuDQogIHA8LXBpMTwtMA0KICBmb3IgKGogaW4gMTpubSl7DQogICAgcFtqXSA9IHByb2QobVtqLF0pLyhYVCpwcm9kKFhULWN1bXN1bShtW2osMTpuLTFdKSkpfQ0KICBwaTI9bWF0cml4KDAsTixOKQ0KICBmb3IgKGkgaW4gMTooTi0xKSl7DQogICAgYXV4MSA9IChtPT1YW2ldKQ0KICAgIGluZGV4ID0gd2hpY2goYXBwbHkoMSphdXgxLDEsc3VtKT09MSkNCiAgICBwaTFbaV0gPSBzdW0ocFtpbmRleF0pDQogICAgZm9yIChqIGluIChpKzEpOk4pew0KICAgICAgYXV4MiA9IChtPT1YW2pdKQ0KICAgICAgYXV4MiA9IDEqYXV4MltpbmRleCxdDQogICAgICBwaTJbaSxqXSA9IHN1bShwW2luZGV4W3doaWNoKGFwcGx5KGF1eDIsMSxzdW0pPT0xKV1dKX19DQogIHBpMVtOXSA9IG4tc3VtKHBpMSkNCiAgcGkyID0gcGkyK3QocGkyKQ0KICBkaWFnKHBpMikgPSBwaTENCiAgcGkyfQ0KDQpwID0gcGlzcHB0KFgsMikgOyBwDQoNCnkgPSBjKDMwLDMwLDMyLDMyLDMzLDM1LDM1KQ0KDQpIVGVzdGltYXRvcih5WzQ6Nl0sZGlhZyhwKVs0OjZdKQ0KDQpwaWsyID0gcFs0OjYsNDo2XQ0Kc3FydCh2YXJIVCh5WzQ6Nl0scGlrMiwyKSkNCmBgYA0KDQojIyAqKipDYXNvIDI6IEJhbmNvIGRlbCBTdXIqKioNCg0KQmFuY28gZGVsIFN1ciBlcyB1bmEgZW50aWRhZCBmaW5hbmNpZXJhIHF1ZSB2aWVuZSBvcGVyYW5kbyBhIHBhcnRpciBkZSBlbmVybyBkZWwgMjAxOSBlbg0KbnVlc3RybyBwYcOtcy4gVW4gYW5hbGlzdGEgZGUgZGF0b3MgcXVlIGxhYm9yYSBlbiBlbCBiYW5jbyBkZXNlYSByZWFsaXphciB1biBlc3R1ZGlvDQpkZXNjcmlwdGl2byBkZSBsYXMgc2lndWllbnRlcyBjYXJhY3RlcsOtc3RpY2FzIGRlIGludGVyw6lzOg0KDQogLSBTdWN1cnNhbDogU3VjdXJzYWwgZG9uZGUgZWwgY2xpZW50ZSB0aWVuZSBzdSBhc2Vzb3IgZGUgc2VydmljaW9zLg0KICgxOiBTYW4gSXNpZHJvLCAyOiBTYW4gQm9yamEsIDM6IFNhbiBMdWlzKS4NCiAtIEluZ3Jlc286IEluZ3Jlc28gbWVuc3VhbCAoZW4gbWlsZXMgZGUgc29sZXMpIHJlcG9ydGFkbyBwb3IgZWwgY2xpZW50ZSBlbiBlbCBhw7FvIDIwMjEuDQogLSBDcsOpZGl0bzogTW9udG8gZGUgY3LDqWRpdG8gKGVuIG1pbGVzIGRlIHNvbGVzKSB1dGlsaXphZG8gcG9yIGVsIGNsaWVudGUgZW4gZWwgcHJlc2VudGUgbWVzLg0KIC0gTklGOiBOw7ptZXJvIGRlIGludGVncmFudGVzIGRlIGxhIGZhbWlsaWEuDQogLSBFZGFkOiBFZGFkIGRlbCBjbGllbnRlIChlbiBhw7FvcykuDQoNCmBgYHtyfQ0KY2FzbzIgPC0gcmVhZF9leGNlbCgiUEMxLTIwMjItSUktUGFydGUgSUkueGxzeCIpDQpgYGANCg0KIyMgKioqRGVzYXJyb2xsbyoqKg0KDQoqKioxMS4gRXN0aW1lIGUgaW50ZXJwcmV0ZSBhIHVuIDkzLjUlIGRlIGNvbmZpYW56YSBtZWRpYW50ZSBlbCBlc3RpbWFkb3IgSG9ydml0eiB5IFRob21wc29uIGluZ3Jlc28gbWVuc3VhbCByZXBvcnRhZG8gcG9yIGVsIGNsaWVudGUgZW4gZWwgYcOxbyAyMDIxIGVuIGxhcyBzdWN1cnNhbGVzIGRlIGVzdHVkaW8uIE5vdGE6IFByZXNlbnRlIGFkZW3DoXMgZWwgZXN0aW1hZG9yLCBlbCBlcnJvciBlc3TDoW5kYXIsIHkgZWwgQ1YuIEp1c3RpZmlxdWUgbG9zIHJlc3VsdGFkb3MgbWVkaWFudGUgbGEgaW50ZXJwcmV0YWNpw7NuLioqKg0KDQpgYGB7cn0NCnQudGVzdChjYXNvMiRJbmdyZXNvLGNvbmYubGV2ZWwgPSAwLjkzNSkNCmBgYA0KDQoqKioxMi4gUGFyYSB1bmEgbXVlc3RyYSBkZSB0YW1hw7FvIDMsIHN1cG9uaWVuZG8gbGEgc3VjdXJzYWwgZG9uZGUgZWwgY2xpZW50ZSB0aWVuZSBzdSBhc2Vzb3IgZGUgc2VydmljaW9zOiBTYW4gSXNpZHJvLCBTYW4gQm9yamEgeSBTYW4gTHVpcy4gRXN0aW1lIGUgaW50ZXJwcmV0ZSBhIHVuIDk1LjUlIGRlIGNvbmZpYW56YSBtZWRpYW50ZSBlbCBlc3RpbWFkb3IgSGFuc2VuIHkgSHVyd2l0eiBlbCBtb250byBkZSBjcsOpZGl0byAoZW4gbWlsZXMgZGUgc29sZXMpIHV0aWxpemFkbyBwb3IgZWwgY2xpZW50ZSBlbiBlbCBwcmVzZW50ZSBtZXMgeSBOw7ptZXJvIGRlIGludGVncmFudGVzIGRlIGxhIGZhbWlsaWEuIEp1c3RpZmlxdWUgbG9zIHJlc3VsdGFkb3MgbWVkaWFudGUgbGEgaW50ZXJwcmV0YWNpw7NuLioqKg0KDQpgYGB7cn0NCk4gPC0gZGltKGNhc28yKVsxXSA7IE4NCm0gPC0gMw0Kc2FtIDwtIHNhbXBsZShOLG0scmVwbGFjZT1UUlVFKSA7IHNhbQ0KDQpwayA8LSByZXAoMS9OLG0pDQoNCmRhdGEgPC0gY2FzbzJbc2FtLF0NCmF0dGFjaChkYXRhKQ0KbmFtZXMoZGF0YSkNCg0KZXN0aW1hIDwtIGRhdGEuZnJhbWUoQ3LDqWRpdG8sTklGKQ0KSEgoZXN0aW1hLCBwaykNCmBgYA0KDQoqKioxNC5FbXBsZWFyIGVsIHNvcG9ydGUgc2ltw6l0cmljbyBzaW4gcmVlbXBsYXpvIGRlIHRhbWHDsW8gZGUgZmlqbyBkZSBuPTIgcGFyYSBsYXMgc3VjdXJzYWxlcyBkZSBlc3R1ZGlvLiBFbiBsYSBzYWxpZGEgZGUgbGEgbWF0cml6IGRlIG1lbWJyZXPDrWEgZGUgbGEgbXVlc3RyYSBwYXJhIHRhbWHDsW9zIGZpam9zIGRlIGxvcyBkaXNlw7FvcyBkZSBtdWVzdHJlbyBkZSByZWVtcGxhem8uIEp1c3RpZmlxdWUgbG9zIHJlc3VsdGFkb3MgbWVkaWFudGUgbGEgaW50ZXJwcmV0YWNpw7NuLioqKg0KDQpgYGB7cn0NClUgPC0gYygiU2FuIElzaWRybyIsICJTYW4gQm9yamEiLCAiU2FuIEx1aXMiKQ0KTiA8LSBsZW5ndGgoVSkNCm4gPC0gMg0KDQpJa1JTKE4pDQpgYGANCg0KDQoNCjxkaXYgY2xhc3M9InRvY2lmeS1leHRlbmQtcGFnZSIgZGF0YS11bmlxdWU9InRvY2lmeS1leHRlbmQtcGFnZSIgc3R5bGU9ImhlaWdodDowOyI+PC9kaXY+DQo=