Marvin López, 23 Junio de 2020
library(dplyr)
library(ggplot2)
library(kableExtra)
Programas de TV y películas que figuran en Netflix
Este conjunto de datos consta de programas de televisión y películas disponibles en Netflix del año 2015 a Enero 2020.
Realizar una exploración de los datos para poder determinar en que se enfoca más la plataforma y cuales son aquellos casos en donde se es diferente.
Dataset
14 variables y 6224 observaciones
dataset<-read.csv("netflix_titles.csv")
dataset
I. Análisis Descriptivo
Muestra la cantidad de películas y la cantidad de programas de televisión en los 5 años.
summary(dataset$type)
Movie TV Show
4257 1967
Muestra de clasificación de los títulos.
summary(dataset$rating)
G NC-17 NR PG PG-13 R TV-14 TV-G TV-MA TV-PG TV-Y TV-Y7
37 2 218 184 286 508 1698 149 2027 701 143 169
TV-Y7-FV UR
95 7
Medidas de tendencia central
En esta sección se realizan dos arreglos a la columna de duración, el cual contiene información del número de temporadas y el tiempo en minutos para el caso de las películas.
Por lo que el arreglo tvShows, se retiró el dato de “Season” y “Seasons”, en cuanto al de movies el de “min”.
tvShows<-dataset %>%
filter(type== "TV Show")
tvShows$duration<-as.character(tvShows$duration)
temp<-unlist(strsplit(tvShows$duration, " "))
temp<-temp[temp != "Season"]
temp<-temp[temp != "Seasons"]
tvShows$durationNum<-as.numeric(temp)
movies<-dataset %>%
filter(type== "Movie")
movies$duration<-as.character(movies$duration)
temp<-unlist(strsplit(movies$duration, " "))
temp<-temp[temp != "min"]
movies$durationNum<-as.numeric(temp)
En base a los arreglos obtener la información siguiete:
Moda
TVShows
tabla<-table(tvShows$durationNum)
sort(tabla, decreasing = T)
1 2 3 4 5 6 7 8 9 10 11 12 13 15 14
1319 304 158 61 46 22 21 16 7 3 3 2 2 2 1
Movies
tabla2<-table(movies$durationNum)
sort(tabla2, decreasing = T)
90 91 92 94 95 93 97 99 88 96 98 100 89 86 103 102 101 87 105 106 110 104 107 108 85 109 84
111 104 101 94 94 90 88 88 86 85 83 80 78 77 75 74 71 70 70 70 69 62 60 56 50 50 49
116 83 119 81 118 111 112 113 117 78 82 121 124 127 126 114 122 128 137 79 80 120 123 115 125 130 75
49 48 47 46 45 43 41 40 40 39 38 37 36 36 35 33 33 33 33 32 32 32 32 30 30 30 28
133 135 74 132 63 66 53 77 69 73 129 131 61 65 72 54 59 60 62 71 58 24 70 134 52 76 140
28 28 27 27 26 25 24 24 23 23 23 23 22 21 21 20 20 20 20 20 19 18 18 18 17 17 17
46 67 68 141 44 136 143 64 150 22 40 55 139 148 151 57 138 146 163 56 153 154 162 29 45 142 145
16 16 16 16 15 15 15 14 14 13 13 13 13 13 13 12 12 12 12 11 11 11 11 9 9 9 9
158 47 49 51 147 149 25 155 161 168 23 50 144 156 159 166 26 28 30 42 48 160 165 32 38 152 157
9 8 8 8 8 8 7 7 7 7 6 6 6 6 6 6 5 5 5 5 5 5 5 4 4 4 4
170 171 185 164 172 173 176 177 12 14 19 27 31 35 41 169 179 3 10 11 15 18 20 33 34 36 43
4 4 4 3 3 3 3 3 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
167 174 178 180 181 182 187 189 190 191 192 193 195 196 200 201 203 205 209 214 224 228 312
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Gráfica Temporadas
tvShows %>%
ggplot(aes(x=durationNum, y=..density.. ))+
geom_density()

Gráfica Movies
movies %>%
ggplot(aes(x=durationNum, y=..density..))+
geom_density()

Medidas de dispersión
Dispersión
¿Cuál es la dispersión entre la duración para ambos typos?
TVShows
DispersionTV<-tvShows$durationNum
mean(DispersionTV)
[1] 1.780376
range(DispersionTV)
[1] 1 15
hist(DispersionTV, col = "magenta")

Movies
DispersionMovies<-movies$durationNum
mean(DispersionMovies)
[1] 99.15645
range(DispersionMovies)
[1] 3 312
hist(DispersionMovies, col = "blue")

Varianza
¿Encontrar la varianza para ambos typos?
TVShows
VarianzaTV<-tvShows$durationNum
var(VarianzaTV)
[1] 2.642483
Movies
VarianzaM<-movies$durationNum
var(VarianzaM)
[1] 787.1738
Medidas de posición
Cuantiles
TVShows
quantile(tvShows$durationNum)
0% 25% 50% 75% 100%
1 1 1 2 15
Movies
quantile(movies$durationNum)
0% 25% 50% 75% 100%
3 86 98 115 312
Análisis de los datos descriptivos
Para el caso de los títulos que corresponden a Programas televisivos podemos notar que el mayor contenido se encuentra entre 1 y 2 temporadas por lo que la curva empieza a notarse a partir de la tercera y a aplanarse más, luego de la 8va temporada. En este punto ya son muy pocas los programas que contiene más de este número.
En cuento a las películas en su mayoría tienen un tiempo de duración de 1 hora y 40 minutos por lo que la curva se comienza a elevar a partir de 45 minutos, observando que llegando a las dos y 3 horas ya son muy pocas las películas en este rango y se ve el descenso hasta notar la línea más plana.
I. Estudio comportamiento probabilístico.
Si todo el contenido de los 5 años estuviera cargado a la plataforma de Netflix con los 6,224 títulos. ¿Cúal es la probabilidad de que 20 amigos eligiendo aleatoriamente un título este sea de clasificación TV14. Se pretende encontrar la función de densidad de probabilidad.
a. Determine PDF.
b. Determine CDF
c. Anánilisis probabilistico de este evento
Distribucíon binomial
PDF
n<-20
p<-0.27
x<-0:20
PDF<-dbinom(x, n, p)
PDF
[1] 1.846959e-03 1.366243e-02 4.800568e-02 1.065331e-01 1.674614e-01 1.982008e-01 1.832679e-01 1.355680e-01
[9] 8.148010e-02 4.018197e-02 1.634801e-02 5.496839e-03 1.524808e-03 3.470585e-04 6.418206e-05 9.495428e-06
[17] 1.097502e-06 9.551189e-08 5.887719e-09 2.292263e-10 4.239116e-12
barplot(PDF_2,
main="PMF Distribucion Binomial",
xlab="Valores de x",
ylab="Densidad de Probabildiad",
col=rainbow(21),
space=rep(0, 21),
names.arg = x)
lines(x=x+0.5, y=PDF_2, col="blue", lwd=2)

DatosBinomiales<-data.frame(x=x, y=PDF)
DatosBinomiales
Valor_Esperado(DatosBinomiales)
[1] 63.64332
CDF
CDF_1<-pbinom(x, n, p)
CDF_1
[1] 0.001846959 0.015509394 0.063515072 0.170048221 0.337509576 0.535710412 0.718978309 0.854546342
[9] 0.936026444 0.976208412 0.992556418 0.998053257 0.999578065 0.999925123 0.999989305 0.999998801
[17] 0.999999898 0.999999994 1.000000000 1.000000000 1.000000000
plot(x, CDF_1,
main="PMF Distribucion Binomial",
xlab="Valores de x", ylab="Densidad de Probabilidad",
col="magenta",
type="b",
lwd=2,
pch=16)

Análisis Probabilístico
Llegando al análisis podemos ver que de los 20 amigos 5 de ellos es probable que eligan aleatoriamente un título de clasificación T14.
LS0tDQp0aXRsZTogIlBST1lFQ1RPIEZJTkFMIC0gVMOtVFVMT1MgTkVURkxJWCINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQpNYXJ2aW4gTMOzcGV6LCANCjIzIEp1bmlvIGRlIDIwMjANCg0KDQpgYGB7cn0NCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpgYGANCg0KDQoNCiMjIyAgUHJvZ3JhbWFzIGRlIFRWIHkgcGVsw61jdWxhcyBxdWUgZmlndXJhbiBlbiBOZXRmbGl4DQoNCg0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij5Fc3RlIGNvbmp1bnRvIGRlIGRhdG9zIGNvbnN0YSBkZSBwcm9ncmFtYXMgZGUgdGVsZXZpc2nDs24geSBwZWzDrWN1bGFzIGRpc3BvbmlibGVzIGVuIE5ldGZsaXggZGVsIGHDsW8gMjAxNSBhIEVuZXJvIDIwMjAuPGRpdi8+DQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPlJlYWxpemFyIHVuYSBleHBsb3JhY2nDs24gZGUgbG9zIGRhdG9zIHBhcmEgcG9kZXIgZGV0ZXJtaW5hciBlbiBxdWUgc2UgZW5mb2NhIG3DoXMgbGEgcGxhdGFmb3JtYSB5IGN1YWxlcyBzb24gYXF1ZWxsb3MgY2Fzb3MgZW4gZG9uZGUgc2UgZXMgZGlmZXJlbnRlLjxkaXYvPg0KDQoNCiMjIyBEYXRhc2V0DQojIyMjIDE0IHZhcmlhYmxlcyB5IDYyMjQgb2JzZXJ2YWNpb25lcw0KYGBge3J9DQpkYXRhc2V0PC1yZWFkLmNzdigibmV0ZmxpeF90aXRsZXMuY3N2IikNCmRhdGFzZXQNCmBgYA0KDQojIyMgSS4gQW7DoWxpc2lzIERlc2NyaXB0aXZvDQoNCg0KIyMjIyMjIyBNdWVzdHJhIGxhIGNhbnRpZGFkIGRlIHBlbMOtY3VsYXMgeSBsYSBjYW50aWRhZCBkZSBwcm9ncmFtYXMgZGUgdGVsZXZpc2nDs24gZW4gbG9zIDUgYcOxb3MuDQoNCmBgYHtyfQ0Kc3VtbWFyeShkYXRhc2V0JHR5cGUpDQpgYGANCg0KIyMjIyMjIyBNdWVzdHJhIGxvcyBhw7FvcyBjb24gaW5mb3JtYWNpw7NuIHF1ZSBjb250aWVuZSBlbCBkYXRhc2V0Lg0KYGBge3J9DQpzdW1tYXJ5KGRhdGFzZXQkeWVhcl9hZGRlZCkNCmBgYA0KDQojIyMjIyMjIE11ZXN0cmEgZGUgY2xhc2lmaWNhY2nDs24gZGUgbG9zIHTDrXR1bG9zLg0KYGBge3J9DQpzdW1tYXJ5KGRhdGFzZXQkcmF0aW5nKQ0KYGBgDQoNCiMjIyBNZWRpZGFzIGRlIHRlbmRlbmNpYSBjZW50cmFsDQoNCkVuIGVzdGEgc2VjY2nDs24gc2UgcmVhbGl6YW4gZG9zIGFycmVnbG9zIGEgbGEgY29sdW1uYSBkZSBkdXJhY2nDs24sIGVsIGN1YWwgY29udGllbmUgaW5mb3JtYWNpw7NuIGRlbCBuw7ptZXJvIGRlIHRlbXBvcmFkYXMgeSBlbCB0aWVtcG8gZW4gbWludXRvcyBwYXJhIGVsIGNhc28gZGUgbGFzIHBlbMOtY3VsYXMuDQoNClBvciBsbyBxdWUgZWwgYXJyZWdsbyB0dlNob3dzLCBzZSByZXRpcsOzIGVsIGRhdG8gZGUgIlNlYXNvbiIgeSAiU2Vhc29ucyIsIGVuIGN1YW50byBhbCBkZSBtb3ZpZXMgZWwgZGUgIm1pbiIuDQoNCmBgYHtyfQ0KdHZTaG93czwtZGF0YXNldCAlPiUNCiAgZmlsdGVyKHR5cGU9PSAiVFYgU2hvdyIpDQoNCnR2U2hvd3MkZHVyYXRpb248LWFzLmNoYXJhY3Rlcih0dlNob3dzJGR1cmF0aW9uKQ0KdGVtcDwtdW5saXN0KHN0cnNwbGl0KHR2U2hvd3MkZHVyYXRpb24sICIgIikpDQp0ZW1wPC10ZW1wW3RlbXAgIT0gIlNlYXNvbiJdDQp0ZW1wPC10ZW1wW3RlbXAgIT0gIlNlYXNvbnMiXQ0KdHZTaG93cyRkdXJhdGlvbk51bTwtYXMubnVtZXJpYyh0ZW1wKQ0KDQpgYGANCg0KYGBge3J9DQptb3ZpZXM8LWRhdGFzZXQgJT4lDQogIGZpbHRlcih0eXBlPT0gIk1vdmllIikgDQoNCm1vdmllcyRkdXJhdGlvbjwtYXMuY2hhcmFjdGVyKG1vdmllcyRkdXJhdGlvbikNCnRlbXA8LXVubGlzdChzdHJzcGxpdChtb3ZpZXMkZHVyYXRpb24sICIgIikpDQp0ZW1wPC10ZW1wW3RlbXAgIT0gIm1pbiJdDQptb3ZpZXMkZHVyYXRpb25OdW08LWFzLm51bWVyaWModGVtcCkNCg0KYGBgDQoNCkVuIGJhc2UgYSBsb3MgYXJyZWdsb3Mgb2J0ZW5lciBsYSBpbmZvcm1hY2nDs24gc2lndWlldGU6DQoNCiMjIyMjIyMgwr9DdcOhbCBlcyBsYSBtZWRpYSBkZSBsYSBkdXJhY2nDs24gcGFyYSBhbWJvcyB0eXBvcz8NCg0KIyMjIyBNZWRpYQ0KDQojIyMjIyMgVFZTaG93cw0KYGBge3J9DQptZWFuKHR2U2hvd3MkZHVyYXRpb25OdW0pDQpgYGANCiMjIyMjIyBNb3ZpZXMNCmBgYHtyfQ0KbWVhbihtb3ZpZXMkZHVyYXRpb25OdW0pDQpgYGANCg0KIyMjIyMjIyDCv0N1w6FsIGVzIGxhIG1lZGlhbmEgZGUgbGEgZHVyYWNpw7NuIHBhcmEgYW1ib3MgdHlwb3M/DQoNCiMjIyMgTWVkaWFuYQ0KDQojIyMjIyMgVFZTaG93cw0KYGBge3J9DQptZWRpYW4odHZTaG93cyRkdXJhdGlvbk51bSkNCmBgYA0KDQojIyMjIyMgTW92aWVzDQpgYGB7cn0NCm1lZGlhbihtb3ZpZXMkZHVyYXRpb25OdW0pDQpgYGANCg0KIyMjIyMjIyDCv0N1w6FsIGVzIGxhIG1vZGEgZGUgbGEgZHVyYWNpw7NuIHBhcmEgYW1ib3MgdHlwb3M/DQojIyMjIE1vZGENCg0KIyMjIyMjIFRWU2hvd3MNCmBgYHtyfQ0KdGFibGE8LXRhYmxlKHR2U2hvd3MkZHVyYXRpb25OdW0pDQpzb3J0KHRhYmxhLCBkZWNyZWFzaW5nID0gVCkNCmBgYA0KDQojIyMjIyMgTW92aWVzDQpgYGB7cn0NCnRhYmxhMjwtdGFibGUobW92aWVzJGR1cmF0aW9uTnVtKQ0Kc29ydCh0YWJsYTIsIGRlY3JlYXNpbmcgPSBUKQ0KYGBgDQoNCiMjIyMgR3LDoWZpY2EgVGVtcG9yYWRhcw0KYGBge3J9DQp0dlNob3dzICU+JQ0KICBnZ3Bsb3QoYWVzKHg9ZHVyYXRpb25OdW0sIHk9Li5kZW5zaXR5Li4gKSkrDQogICAgZ2VvbV9kZW5zaXR5KCkNCmBgYA0KDQojIyMjIEdyw6FmaWNhIE1vdmllcw0KYGBge3J9DQptb3ZpZXMgJT4lDQogIGdncGxvdChhZXMoeD1kdXJhdGlvbk51bSwgeT0uLmRlbnNpdHkuLikpKw0KICBnZW9tX2RlbnNpdHkoKQ0KYGBgDQoNCg0KDQojIyMgTWVkaWRhcyBkZSBkaXNwZXJzacOzbg0KDQoNCiMjIyMgRGlzcGVyc2nDs24NCg0KIyMjIyMjIyDCv0N1w6FsIGVzIGxhIGRpc3BlcnNpw7NuIGVudHJlIGxhIGR1cmFjacOzbiBwYXJhIGFtYm9zIHR5cG9zPw0KDQojIyMjIyMgVFZTaG93cw0KDQpgYGB7cn0NCkRpc3BlcnNpb25UVjwtdHZTaG93cyRkdXJhdGlvbk51bQ0KbWVhbihEaXNwZXJzaW9uVFYpDQpgYGANCg0KDQpgYGB7cn0NCnJhbmdlKERpc3BlcnNpb25UVikNCmBgYA0KYGBge3J9DQpoaXN0KERpc3BlcnNpb25UViwgY29sID0gIm1hZ2VudGEiKQ0KYGBgDQoNCiMjIyMjIyBNb3ZpZXMNCg0KYGBge3J9DQpEaXNwZXJzaW9uTW92aWVzPC1tb3ZpZXMkZHVyYXRpb25OdW0NCm1lYW4oRGlzcGVyc2lvbk1vdmllcykNCmBgYA0KYGBge3J9DQpyYW5nZShEaXNwZXJzaW9uTW92aWVzKQ0KYGBgDQpgYGB7cn0NCmhpc3QoRGlzcGVyc2lvbk1vdmllcywgY29sID0gImJsdWUiKQ0KYGBgDQoNCiMjIyMgVmFyaWFuemENCg0KIyMjIyMjIyDCv0VuY29udHJhciBsYSB2YXJpYW56YSBwYXJhIGFtYm9zIHR5cG9zPw0KDQojIyMjIyMgVFZTaG93cw0KYGBge3J9DQpWYXJpYW56YVRWPC10dlNob3dzJGR1cmF0aW9uTnVtDQp2YXIoVmFyaWFuemFUVikNCg0KYGBgDQoNCg0KIyMjIyMjIE1vdmllcw0KYGBge3J9DQpWYXJpYW56YU08LW1vdmllcyRkdXJhdGlvbk51bQ0KdmFyKFZhcmlhbnphTSkNCg0KYGBgDQoNCiMjIyBNZWRpZGFzIGRlIHBvc2ljacOzbg0KDQoNCiMjIyMgQ3VhbnRpbGVzDQoNCiMjIyMjIyMgwr9FbmNvbnRyYXIgbGEgcG9zaWNpw7NuIGRlIGxhIG1lZGlhbmEgZW4gYmFzZSBhIGxvcyBjdWFudGlsZXMsIHRvbWFuZG8gZW4gY3VlbnRhIHF1ZSBsYSBtZWRpYW5hIGVuIFRWU2hvdyBlcyAxIHkgcGFyYSBNb3ZpZXMgZXMgOTg/DQoNCiMjIyMjIyBUVlNob3dzDQpgYGB7cn0NCnF1YW50aWxlKHR2U2hvd3MkZHVyYXRpb25OdW0pDQpgYGANCg0KIyMjIyMjIE1vdmllcw0KYGBge3J9DQpxdWFudGlsZShtb3ZpZXMkZHVyYXRpb25OdW0pDQpgYGANCg0KIyMjIEFuw6FsaXNpcyBkZSBsb3MgZGF0b3MgZGVzY3JpcHRpdm9zDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPlBhcmEgZWwgY2FzbyBkZSBsb3MgdMOtdHVsb3MgcXVlIGNvcnJlc3BvbmRlbiBhIFByb2dyYW1hcyB0ZWxldmlzaXZvcyBwb2RlbW9zIG5vdGFyIHF1ZSBlbCBtYXlvciBjb250ZW5pZG8gc2UgZW5jdWVudHJhIGVudHJlIDEgeSAyIHRlbXBvcmFkYXMgcG9yIGxvIHF1ZSBsYSBjdXJ2YSBlbXBpZXphIGEgbm90YXJzZSBhIHBhcnRpciBkZSBsYSB0ZXJjZXJhIHkgYSBhcGxhbmFyc2UgbcOhcywgbHVlZ28gZGUgbGEgOHZhIHRlbXBvcmFkYS4gRW4gZXN0ZSBwdW50byB5YSBzb24gbXV5IHBvY2FzIGxvcyBwcm9ncmFtYXMgcXVlIGNvbnRpZW5lIG3DoXMgZGUgZXN0ZSBuw7ptZXJvLjxkaXYvPg0KDQpFbiBjdWVudG8gYSBsYXMgcGVsw61jdWxhcyBlbiBzdSBtYXlvcsOtYSB0aWVuZW4gdW4gdGllbXBvIGRlIGR1cmFjacOzbiBkZSAxIGhvcmEgeSA0MCBtaW51dG9zIHBvciBsbyBxdWUgbGEgY3VydmEgc2UgY29taWVuemEgYSBlbGV2YXIgYSBwYXJ0aXIgZGUgNDUgbWludXRvcywgb2JzZXJ2YW5kbyBxdWUgbGxlZ2FuZG8gYSBsYXMgZG9zIHkgMyBob3JhcyB5YSBzb24gbXV5IHBvY2FzIGxhcyBwZWzDrWN1bGFzIGVuIGVzdGUgcmFuZ28geSBzZSB2ZSBlbCBkZXNjZW5zbyBoYXN0YSBub3RhciBsYSBsw61uZWEgbcOhcyBwbGFuYS4gDQoNCg0KDQoNCiMjIyBJLiBFc3R1ZGlvIGNvbXBvcnRhbWllbnRvIHByb2JhYmlsw61zdGljby4NCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+U2kgdG9kbyBlbCBjb250ZW5pZG8gZGUgbG9zIDUgYcOxb3MgZXN0dXZpZXJhIGNhcmdhZG8gYSBsYSBwbGF0YWZvcm1hIGRlIE5ldGZsaXggY29uIGxvcyA2LDIyNCB0w610dWxvcy4gwr9Dw7phbCBlcyBsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIDIwIGFtaWdvcyBlbGlnaWVuZG8gYWxlYXRvcmlhbWVudGUgdW4gdMOtdHVsbyBlc3RlIHNlYSBkZSBjbGFzaWZpY2FjacOzbiBUVjE0LiBTZSBwcmV0ZW5kZSBlbmNvbnRyYXIgbGEgZnVuY2nDs24gZGUgZGVuc2lkYWQgZGUgcHJvYmFiaWxpZGFkLjxkaXYvPg0KDQojIyMjIGEuIERldGVybWluZSBQREYuDQojIyMjIGIuIERldGVybWluZSBDREYNCiMjIyMgYy4gQW7DoW5pbGlzaXMgcHJvYmFiaWxpc3RpY28gZGUgZXN0ZSBldmVudG8NCg0KIyMjIERpc3RyaWJ1Y8Otb24gYmlub21pYWwNCg0KIyMjIyBQREYgDQoNCmBgYHtyfQ0KbjwtMjANCnA8LTAuMjcNCng8LTA6MjANCg0KDQpQREY8LWRiaW5vbSh4LCBuLCBwKQ0KUERGDQoNCmBgYA0KDQpgYGB7cn0NCmJhcnBsb3QoUERGXzIsDQogICAgICAgIG1haW49IlBNRiBEaXN0cmlidWNpb24gQmlub21pYWwiLA0KICAgICAgICB4bGFiPSJWYWxvcmVzIGRlIHgiLA0KICAgICAgICB5bGFiPSJEZW5zaWRhZCBkZSBQcm9iYWJpbGRpYWQiLA0KICAgICAgICBjb2w9cmFpbmJvdygyMSksDQogICAgICAgIHNwYWNlPXJlcCgwLCAyMSksDQogICAgICAgIG5hbWVzLmFyZyA9IHgpDQpsaW5lcyh4PXgrMC41LCB5PVBERl8yLCBjb2w9ImJsdWUiLCBsd2Q9MikNCmBgYA0KDQpgYGB7cn0NCkRhdG9zQmlub21pYWxlczwtZGF0YS5mcmFtZSh4PXgsIHk9UERGKQ0KRGF0b3NCaW5vbWlhbGVzDQpgYGANCg0KYGBge3J9DQpWYWxvcl9Fc3BlcmFkbyhEYXRvc0Jpbm9taWFsZXMpDQpgYGANCg0KIyMjIyBDREYNCg0KYGBge3J9DQpDREZfMTwtcGJpbm9tKHgsIG4sIHApDQpDREZfMQ0KYGBgDQoNCmBgYHtyfQ0KcGxvdCh4LCBDREZfMSwNCiAgICAgbWFpbj0iUE1GIERpc3RyaWJ1Y2lvbiBCaW5vbWlhbCIsDQogICAgIHhsYWI9IlZhbG9yZXMgZGUgeCIsIHlsYWI9IkRlbnNpZGFkIGRlIFByb2JhYmlsaWRhZCIsDQogICAgIGNvbD0ibWFnZW50YSIsDQogICAgIHR5cGU9ImIiLA0KICAgICBsd2Q9MiwNCiAgICAgcGNoPTE2KQ0KYGBgDQoNCiMjIyBBbsOhbGlzaXMgUHJvYmFiaWzDrXN0aWNvDQoNCkxsZWdhbmRvIGFsIGFuw6FsaXNpcyBwb2RlbW9zIHZlciBxdWUgZGUgbG9zIDIwIGFtaWdvcyA1IGRlIGVsbG9zIGVzIHByb2JhYmxlIHF1ZSBlbGlnYW4gYWxlYXRvcmlhbWVudGUgdW4gdMOtdHVsbyBkZSBjbGFzaWZpY2FjacOzbiBUMTQuDQoNCg==