Integrantes :

Astrid Paola González Díaz A00830114.
Alexa Mariana Marín Villar A00831342.
Ana Estefanía López Alanís A01284416.
Arantza Gabriela Isaías Mares A00830804.

Importación base de datos

cancer <-read_excel("~/UNIVERSIDAD/CONCENTRACIÓN/cancer_de_mama.xls")

Exploración BD (Entender la base de datos)

head(cancer)
## # A tibble: 6 × 31
##   diagnosis radius_mean textur…¹ perim…² area_…³ smoot…⁴ compa…⁵ conca…⁶ conca…⁷
##   <chr>           <dbl>    <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
## 1 M                18.0     10.4   123.    1001   0.118   0.278   0.300   0.147 
## 2 M                20.6     17.8   133.    1326   0.0847  0.0786  0.0869  0.0702
## 3 M                19.7     21.2   130     1203   0.110   0.160   0.197   0.128 
## 4 M                11.4     20.4    77.6    386.  0.142   0.284   0.241   0.105 
## 5 M                20.3     14.3   135.    1297   0.100   0.133   0.198   0.104 
## 6 M                12.4     15.7    82.6    477.  0.128   0.17    0.158   0.0809
## # … with 22 more variables: symmetry_mean <dbl>, fractal_dimension_mean <dbl>,
## #   radius_se <dbl>, texture_se <dbl>, perimeter_se <dbl>, area_se <dbl>,
## #   smoothness_se <dbl>, compactness_se <dbl>, concavity_se <dbl>,
## #   concave.points_se <dbl>, symmetry_se <dbl>, fractal_dimension_se <dbl>,
## #   radius_worst <dbl>, texture_worst <dbl>, perimeter_worst <dbl>,
## #   area_worst <dbl>, smoothness_worst <dbl>, compactness_worst <dbl>,
## #   concavity_worst <dbl>, concave.points_worst <dbl>, symmetry_worst <dbl>, …
str(cancer)
## tibble [569 × 31] (S3: tbl_df/tbl/data.frame)
##  $ diagnosis              : chr [1:569] "M" "M" "M" "M" ...
##  $ radius_mean            : num [1:569] 18 20.6 19.7 11.4 20.3 ...
##  $ texture_mean           : num [1:569] 10.4 17.8 21.2 20.4 14.3 ...
##  $ perimeter_mean         : num [1:569] 122.8 132.9 130 77.6 135.1 ...
##  $ area_mean              : num [1:569] 1001 1326 1203 386 1297 ...
##  $ smoothness_mean        : num [1:569] 0.1184 0.0847 0.1096 0.1425 0.1003 ...
##  $ compactness_mean       : num [1:569] 0.2776 0.0786 0.1599 0.2839 0.1328 ...
##  $ concavity_mean         : num [1:569] 0.3001 0.0869 0.1974 0.2414 0.198 ...
##  $ concave.points_mean    : num [1:569] 0.1471 0.0702 0.1279 0.1052 0.1043 ...
##  $ symmetry_mean          : num [1:569] 0.242 0.181 0.207 0.26 0.181 ...
##  $ fractal_dimension_mean : num [1:569] 0.0787 0.0567 0.06 0.0974 0.0588 ...
##  $ radius_se              : num [1:569] 1.095 0.543 0.746 0.496 0.757 ...
##  $ texture_se             : num [1:569] 0.905 0.734 0.787 1.156 0.781 ...
##  $ perimeter_se           : num [1:569] 8.59 3.4 4.58 3.44 5.44 ...
##  $ area_se                : num [1:569] 153.4 74.1 94 27.2 94.4 ...
##  $ smoothness_se          : num [1:569] 0.0064 0.00522 0.00615 0.00911 0.01149 ...
##  $ compactness_se         : num [1:569] 0.049 0.0131 0.0401 0.0746 0.0246 ...
##  $ concavity_se           : num [1:569] 0.0537 0.0186 0.0383 0.0566 0.0569 ...
##  $ concave.points_se      : num [1:569] 0.0159 0.0134 0.0206 0.0187 0.0188 ...
##  $ symmetry_se            : num [1:569] 0.03 0.0139 0.0225 0.0596 0.0176 ...
##  $ fractal_dimension_se   : num [1:569] 0.00619 0.00353 0.00457 0.00921 0.00511 ...
##  $ radius_worst           : num [1:569] 25.4 25 23.6 14.9 22.5 ...
##  $ texture_worst          : num [1:569] 17.3 23.4 25.5 26.5 16.7 ...
##  $ perimeter_worst        : num [1:569] 184.6 158.8 152.5 98.9 152.2 ...
##  $ area_worst             : num [1:569] 2019 1956 1709 568 1575 ...
##  $ smoothness_worst       : num [1:569] 0.162 0.124 0.144 0.21 0.137 ...
##  $ compactness_worst      : num [1:569] 0.666 0.187 0.424 0.866 0.205 ...
##  $ concavity_worst        : num [1:569] 0.712 0.242 0.45 0.687 0.4 ...
##  $ concave.points_worst   : num [1:569] 0.265 0.186 0.243 0.258 0.163 ...
##  $ symmetry_worst         : num [1:569] 0.46 0.275 0.361 0.664 0.236 ...
##  $ fractal_dimension_worst: num [1:569] 0.1189 0.089 0.0876 0.173 0.0768 ...
summary(cancer)
##   diagnosis          radius_mean      texture_mean   perimeter_mean  
##  Length:569         Min.   : 6.981   Min.   : 9.71   Min.   : 43.79  
##  Class :character   1st Qu.:11.700   1st Qu.:16.17   1st Qu.: 75.17  
##  Mode  :character   Median :13.370   Median :18.84   Median : 86.24  
##                     Mean   :14.127   Mean   :19.29   Mean   : 91.97  
##                     3rd Qu.:15.780   3rd Qu.:21.80   3rd Qu.:104.10  
##                     Max.   :28.110   Max.   :39.28   Max.   :188.50  
##    area_mean      smoothness_mean   compactness_mean  concavity_mean   
##  Min.   : 143.5   Min.   :0.05263   Min.   :0.01938   Min.   :0.00000  
##  1st Qu.: 420.3   1st Qu.:0.08637   1st Qu.:0.06492   1st Qu.:0.02956  
##  Median : 551.1   Median :0.09587   Median :0.09263   Median :0.06154  
##  Mean   : 654.9   Mean   :0.09636   Mean   :0.10434   Mean   :0.08880  
##  3rd Qu.: 782.7   3rd Qu.:0.10530   3rd Qu.:0.13040   3rd Qu.:0.13070  
##  Max.   :2501.0   Max.   :0.16340   Max.   :0.34540   Max.   :0.42680  
##  concave.points_mean symmetry_mean    fractal_dimension_mean   radius_se     
##  Min.   :0.00000     Min.   :0.1060   Min.   :0.04996        Min.   :0.1115  
##  1st Qu.:0.02031     1st Qu.:0.1619   1st Qu.:0.05770        1st Qu.:0.2324  
##  Median :0.03350     Median :0.1792   Median :0.06154        Median :0.3242  
##  Mean   :0.04892     Mean   :0.1812   Mean   :0.06280        Mean   :0.4052  
##  3rd Qu.:0.07400     3rd Qu.:0.1957   3rd Qu.:0.06612        3rd Qu.:0.4789  
##  Max.   :0.20120     Max.   :0.3040   Max.   :0.09744        Max.   :2.8730  
##    texture_se      perimeter_se       area_se        smoothness_se     
##  Min.   :0.3602   Min.   : 0.757   Min.   :  6.802   Min.   :0.001713  
##  1st Qu.:0.8339   1st Qu.: 1.606   1st Qu.: 17.850   1st Qu.:0.005169  
##  Median :1.1080   Median : 2.287   Median : 24.530   Median :0.006380  
##  Mean   :1.2169   Mean   : 2.866   Mean   : 40.337   Mean   :0.007041  
##  3rd Qu.:1.4740   3rd Qu.: 3.357   3rd Qu.: 45.190   3rd Qu.:0.008146  
##  Max.   :4.8850   Max.   :21.980   Max.   :542.200   Max.   :0.031130  
##  compactness_se      concavity_se     concave.points_se   symmetry_se      
##  Min.   :0.002252   Min.   :0.00000   Min.   :0.000000   Min.   :0.007882  
##  1st Qu.:0.013080   1st Qu.:0.01509   1st Qu.:0.007638   1st Qu.:0.015160  
##  Median :0.020450   Median :0.02589   Median :0.010930   Median :0.018730  
##  Mean   :0.025478   Mean   :0.03189   Mean   :0.011796   Mean   :0.020542  
##  3rd Qu.:0.032450   3rd Qu.:0.04205   3rd Qu.:0.014710   3rd Qu.:0.023480  
##  Max.   :0.135400   Max.   :0.39600   Max.   :0.052790   Max.   :0.078950  
##  fractal_dimension_se  radius_worst   texture_worst   perimeter_worst 
##  Min.   :0.0008948    Min.   : 7.93   Min.   :12.02   Min.   : 50.41  
##  1st Qu.:0.0022480    1st Qu.:13.01   1st Qu.:21.08   1st Qu.: 84.11  
##  Median :0.0031870    Median :14.97   Median :25.41   Median : 97.66  
##  Mean   :0.0037949    Mean   :16.27   Mean   :25.68   Mean   :107.26  
##  3rd Qu.:0.0045580    3rd Qu.:18.79   3rd Qu.:29.72   3rd Qu.:125.40  
##  Max.   :0.0298400    Max.   :36.04   Max.   :49.54   Max.   :251.20  
##    area_worst     smoothness_worst  compactness_worst concavity_worst 
##  Min.   : 185.2   Min.   :0.07117   Min.   :0.02729   Min.   :0.0000  
##  1st Qu.: 515.3   1st Qu.:0.11660   1st Qu.:0.14720   1st Qu.:0.1145  
##  Median : 686.5   Median :0.13130   Median :0.21190   Median :0.2267  
##  Mean   : 880.6   Mean   :0.13237   Mean   :0.25427   Mean   :0.2722  
##  3rd Qu.:1084.0   3rd Qu.:0.14600   3rd Qu.:0.33910   3rd Qu.:0.3829  
##  Max.   :4254.0   Max.   :0.22260   Max.   :1.05800   Max.   :1.2520  
##  concave.points_worst symmetry_worst   fractal_dimension_worst
##  Min.   :0.00000      Min.   :0.1565   Min.   :0.05504        
##  1st Qu.:0.06493      1st Qu.:0.2504   1st Qu.:0.07146        
##  Median :0.09993      Median :0.2822   Median :0.08004        
##  Mean   :0.11461      Mean   :0.2901   Mean   :0.08395        
##  3rd Qu.:0.16140      3rd Qu.:0.3179   3rd Qu.:0.09208        
##  Max.   :0.29100      Max.   :0.6638   Max.   :0.20750
sum(is.na(cancer)) ## Al no tener nas seguimos el analisis
## [1] 0

Se cuenta con 31 variables de los cuales 30 son factores numéricos y uno, el seleccionado para predecir si un tumor es maligno o benigno, como factor caractér que será transformado a factor más adelante.
De estas variables se puede dividir la base de datos en 3. Una con variables que comprendan aquellas con medidas promedio, aquellas con medidas de error estandar y las que tienen las peores medidas registradas.

Cambiando tipo de datos

# Se convierte a factor la variable a predecir
cancer$diagnosis<-as.factor(cancer$diagnosis)

Separación de variables por medida

Worst

cancer_worst <- cancer[,c("diagnosis","radius_worst", "texture_worst", "perimeter_worst", "area_worst", "smoothness_worst", "compactness_worst", "concavity_worst", "concave.points_worst", "symmetry_worst", "fractal_dimension_worst")]
cancer_worst$diagnosis <- as.factor(cancer_worst$diagnosis)

Mean

cancer_mean <- cancer[,c("diagnosis","radius_mean","texture_mean","perimeter_mean","area_mean","smoothness_mean","compactness_mean","concavity_mean","concave.points_mean","symmetry_mean","fractal_dimension_mean")]

cancer_mean$diagnosis <-as.factor(cancer_mean$diagnosis)

Árbol de Decisión

Todas las variables

arbol <- rpart(formula=diagnosis ~ ., data = cancer)
arbol
## n= 569 
## 
## node), split, n, loss, yval, (yprob)
##       * denotes terminal node
## 
##  1) root 569 212 B (0.62741652 0.37258348)  
##    2) radius_worst< 16.795 379  33 B (0.91292876 0.08707124)  
##      4) concave.points_worst< 0.1358 333   5 B (0.98498498 0.01501502) *
##      5) concave.points_worst>=0.1358 46  18 M (0.39130435 0.60869565)  
##       10) texture_worst< 25.67 19   4 B (0.78947368 0.21052632) *
##       11) texture_worst>=25.67 27   3 M (0.11111111 0.88888889) *
##    3) radius_worst>=16.795 190  11 M (0.05789474 0.94210526) *
rpart.plot(arbol)

prp(arbol,extra = 7, prefix="fracción")

Solo con variables de peores mediciones

arbol_worst <- rpart(formula=diagnosis ~ ., data = cancer_worst)
arbol_worst
## n= 569 
## 
## node), split, n, loss, yval, (yprob)
##       * denotes terminal node
## 
##  1) root 569 212 B (0.62741652 0.37258348)  
##    2) radius_worst< 16.795 379  33 B (0.91292876 0.08707124)  
##      4) concave.points_worst< 0.1358 333   5 B (0.98498498 0.01501502) *
##      5) concave.points_worst>=0.1358 46  18 M (0.39130435 0.60869565)  
##       10) texture_worst< 25.67 19   4 B (0.78947368 0.21052632) *
##       11) texture_worst>=25.67 27   3 M (0.11111111 0.88888889) *
##    3) radius_worst>=16.795 190  11 M (0.05789474 0.94210526) *
rpart.plot(arbol_worst)

prp(arbol_worst,extra = 7, prefix="fracción")

Solo con variables de promedios

arbol_mean <- rpart(formula=diagnosis ~ ., data = cancer_mean)
arbol_mean
## n= 569 
## 
## node), split, n, loss, yval, (yprob)
##       * denotes terminal node
## 
##  1) root 569 212 B (0.62741652 0.37258348)  
##    2) concave.points_mean< 0.05142 349  20 B (0.94269341 0.05730659)  
##      4) area_mean< 696.25 331   9 B (0.97280967 0.02719033) *
##      5) area_mean>=696.25 18   7 M (0.38888889 0.61111111) *
##    3) concave.points_mean>=0.05142 220  28 M (0.12727273 0.87272727)  
##      6) texture_mean< 16.395 28  11 B (0.60714286 0.39285714)  
##       12) concave.points_mean< 0.07905 17   1 B (0.94117647 0.05882353) *
##       13) concave.points_mean>=0.07905 11   1 M (0.09090909 0.90909091) *
##      7) texture_mean>=16.395 192  11 M (0.05729167 0.94270833) *
rpart.plot(arbol_mean)

prp(arbol_mean,extra = 7, prefix="fracción")

Conclusiones

Árbol de Decisión (Worst Meassures)

  1. Las probabilidades de que se diagnostique un tumor como maligno, tomando en cuenta las peores medidas en el historial médico del paciente; son más altas si el radio es mayor a 17 (94%), y si el radio es menor de 17, los puntos de concatividad son mayores que 0.14 y si la textura es mayor que 26 (89%).
  2. Las probabilidades de que se diagnostique un tumor como benigno, tomando en cuenta las peores medidas en el histroial médico del paciente, son más altas si el radio es menor a 17, los puntos de concatividad son mayores a 0.14 y si la textura es menor a 26 (21%).

Árbol de Decisión (Mean Meassures)

  1. Para que un tumor cuente con mayor probabilidad de ser diagnosticado como maligno debe tener un puntaje de concatividad mayor a 0.051 y una textura promedio mayor a 16 (94%), o tener un puntaje de concatividad inicialmente mayor a 0.051 y tener una textura promedio menor a 16, pero al cumplir con esta condición los puntos de concatividad deben ser al menos 0.079 para que se alcance un 91% de probabilidad de que sea un tumor maligno.
  2. Aquellos casos que tienen una menor probabilidad de ser diagnosticados como malignos, es decir benignos, son los que tienen un puntaje de concatividad menor a 0.051 y que tienen un área promedio menor a 696 (3%), el otro caso serían los que tienen un puntaje de concatividad entre 0.051 y 0.079 adicionalmente de una textura promedio a 16 (6%).

Conclusión General

Al dividir la base de datos para utilizar la misma variable pero con diferentes métricas (mean y worst) podemos observar que la cantidad de niveles y ramas del árbol de decisión cambian. Al seleccionar solo las variables con las peores métricas se cuenta con 3 factores para determinar si un tumor es maligno o benigno (radio, puntos de concatividad y textura), en cambio, si se seleccionan las variables con métrica promedio se tiene un factor más para la determinación del tipo de tumor, agregando así el promedio de área.

LS0tDQp0aXRsZTogIsOBcmJvbCBEZSBEZWNpc2nDs24gQ8OhbmNlciBkZSBNYW1hIg0KYXV0aG9yOiAiRXF1aXBvIDIiDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KLS0tDQoNCioqSW50ZWdyYW50ZXMgOioqDQoNCkFzdHJpZCBQYW9sYSBHb256w6FsZXogRMOtYXogKkEwMDgzMDExNCouXA0KQWxleGEgTWFyaWFuYSBNYXLDrW4gVmlsbGFyICpBMDA4MzEzNDIqLlwNCkFuYSBFc3RlZmFuw61hIEzDs3BleiBBbGFuw61zICpBMDEyODQ0MTYqLlwNCkFyYW50emEgR2FicmllbGEgSXNhw61hcyBNYXJlcyAqQTAwODMwODA0Ki4NCg0KIVtdKGltYWdlcy9jYW5jZXJfbWFtYS5qcGcpe3dpZHRoPSI2NzYifQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkoaHJicnRoZW1lcykNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShycGFydCkNCmxpYnJhcnkocnBhcnQucGxvdCkNCmBgYA0KDQojIyBJbXBvcnRhY2nDs24gYmFzZSBkZSBkYXRvcw0KDQpgYGB7cn0NCmNhbmNlciA8LXJlYWRfZXhjZWwoIn4vVU5JVkVSU0lEQUQvQ09OQ0VOVFJBQ0nDk04vY2FuY2VyX2RlX21hbWEueGxzIikNCg0KYGBgDQoNCiMjIEV4cGxvcmFjacOzbiBCRCAoRW50ZW5kZXIgbGEgYmFzZSBkZSBkYXRvcykNCg0KYGBge3J9DQpoZWFkKGNhbmNlcikNCmBgYA0KDQpgYGB7cn0NCnN0cihjYW5jZXIpDQpzdW1tYXJ5KGNhbmNlcikNCg0Kc3VtKGlzLm5hKGNhbmNlcikpICMjIEFsIG5vIHRlbmVyIG5hcyBzZWd1aW1vcyBlbCBhbmFsaXNpcw0KYGBgDQoNClNlIGN1ZW50YSBjb24gMzEgdmFyaWFibGVzIGRlIGxvcyBjdWFsZXMgMzAgc29uIGZhY3RvcmVzIG51bcOpcmljb3MgeSB1bm8sIGVsIHNlbGVjY2lvbmFkbyBwYXJhIHByZWRlY2lyIHNpIHVuIHR1bW9yIGVzIG1hbGlnbm8gbyBiZW5pZ25vLCBjb21vIGZhY3RvciBjYXJhY3TDqXIgcXVlIHNlcsOhIHRyYW5zZm9ybWFkbyBhIGZhY3RvciBtw6FzIGFkZWxhbnRlLlwNCkRlIGVzdGFzIHZhcmlhYmxlcyBzZSBwdWVkZSBkaXZpZGlyIGxhIGJhc2UgZGUgZGF0b3MgZW4gMy4gVW5hIGNvbiB2YXJpYWJsZXMgcXVlIGNvbXByZW5kYW4gYXF1ZWxsYXMgY29uIG1lZGlkYXMgcHJvbWVkaW8sIGFxdWVsbGFzIGNvbiBtZWRpZGFzIGRlIGVycm9yIGVzdGFuZGFyIHkgbGFzIHF1ZSB0aWVuZW4gbGFzIHBlb3JlcyBtZWRpZGFzIHJlZ2lzdHJhZGFzLg0KDQojIyMgQ2FtYmlhbmRvIHRpcG8gZGUgZGF0b3MNCg0KYGBge3J9DQojIFNlIGNvbnZpZXJ0ZSBhIGZhY3RvciBsYSB2YXJpYWJsZSBhIHByZWRlY2lyDQpjYW5jZXIkZGlhZ25vc2lzPC1hcy5mYWN0b3IoY2FuY2VyJGRpYWdub3NpcykNCmBgYA0KDQojIyMgU2VwYXJhY2nDs24gZGUgdmFyaWFibGVzIHBvciBtZWRpZGENCg0KIyMjIyBXb3JzdA0KDQpgYGB7cn0NCmNhbmNlcl93b3JzdCA8LSBjYW5jZXJbLGMoImRpYWdub3NpcyIsInJhZGl1c193b3JzdCIsICJ0ZXh0dXJlX3dvcnN0IiwgInBlcmltZXRlcl93b3JzdCIsICJhcmVhX3dvcnN0IiwgInNtb290aG5lc3Nfd29yc3QiLCAiY29tcGFjdG5lc3Nfd29yc3QiLCAiY29uY2F2aXR5X3dvcnN0IiwgImNvbmNhdmUucG9pbnRzX3dvcnN0IiwgInN5bW1ldHJ5X3dvcnN0IiwgImZyYWN0YWxfZGltZW5zaW9uX3dvcnN0IildDQpjYW5jZXJfd29yc3QkZGlhZ25vc2lzIDwtIGFzLmZhY3RvcihjYW5jZXJfd29yc3QkZGlhZ25vc2lzKQ0KDQpgYGANCg0KIyMjIyBNZWFuDQoNCmBgYHtyfQ0KY2FuY2VyX21lYW4gPC0gY2FuY2VyWyxjKCJkaWFnbm9zaXMiLCJyYWRpdXNfbWVhbiIsInRleHR1cmVfbWVhbiIsInBlcmltZXRlcl9tZWFuIiwiYXJlYV9tZWFuIiwic21vb3RobmVzc19tZWFuIiwiY29tcGFjdG5lc3NfbWVhbiIsImNvbmNhdml0eV9tZWFuIiwiY29uY2F2ZS5wb2ludHNfbWVhbiIsInN5bW1ldHJ5X21lYW4iLCJmcmFjdGFsX2RpbWVuc2lvbl9tZWFuIildDQoNCmNhbmNlcl9tZWFuJGRpYWdub3NpcyA8LWFzLmZhY3RvcihjYW5jZXJfbWVhbiRkaWFnbm9zaXMpDQoNCmBgYA0KDQojIMOBcmJvbCBkZSBEZWNpc2nDs24NCg0KIyMgVG9kYXMgbGFzIHZhcmlhYmxlcw0KDQpgYGB7cn0NCmFyYm9sIDwtIHJwYXJ0KGZvcm11bGE9ZGlhZ25vc2lzIH4gLiwgZGF0YSA9IGNhbmNlcikNCmFyYm9sDQoNCnJwYXJ0LnBsb3QoYXJib2wpDQoNCnBycChhcmJvbCxleHRyYSA9IDcsIHByZWZpeD0iZnJhY2Npw7NuIikNCmBgYA0KDQojIyBTb2xvIGNvbiB2YXJpYWJsZXMgZGUgcGVvcmVzIG1lZGljaW9uZXMNCg0KYGBge3J9DQoNCmFyYm9sX3dvcnN0IDwtIHJwYXJ0KGZvcm11bGE9ZGlhZ25vc2lzIH4gLiwgZGF0YSA9IGNhbmNlcl93b3JzdCkNCmFyYm9sX3dvcnN0DQoNCg0KcnBhcnQucGxvdChhcmJvbF93b3JzdCkNCg0KcHJwKGFyYm9sX3dvcnN0LGV4dHJhID0gNywgcHJlZml4PSJmcmFjY2nDs24iKQ0KYGBgDQoNCiMjIFNvbG8gY29uIHZhcmlhYmxlcyBkZSBwcm9tZWRpb3MNCg0KYGBge3J9DQphcmJvbF9tZWFuIDwtIHJwYXJ0KGZvcm11bGE9ZGlhZ25vc2lzIH4gLiwgZGF0YSA9IGNhbmNlcl9tZWFuKQ0KYXJib2xfbWVhbg0KDQoNCnJwYXJ0LnBsb3QoYXJib2xfbWVhbikNCg0KcHJwKGFyYm9sX21lYW4sZXh0cmEgPSA3LCBwcmVmaXg9ImZyYWNjacOzbiIpDQpgYGANCg0KIyBDb25jbHVzaW9uZXMNCg0KIyMjIMOBcmJvbCBkZSBEZWNpc2nDs24gKFdvcnN0IE1lYXNzdXJlcykNCg0KMS4gIExhcyBwcm9iYWJpbGlkYWRlcyBkZSBxdWUgc2UgZGlhZ25vc3RpcXVlIHVuIHR1bW9yIGNvbW8gbWFsaWdubywgdG9tYW5kbyBlbiBjdWVudGEgbGFzIHBlb3JlcyBtZWRpZGFzIGVuIGVsIGhpc3RvcmlhbCBtw6lkaWNvIGRlbCBwYWNpZW50ZTsgc29uIG3DoXMgYWx0YXMgc2kgZWwgcmFkaW8gZXMgbWF5b3IgYSAxNyAoOTQlKSwgeSBzaSBlbCByYWRpbyBlcyBtZW5vciBkZSAxNywgbG9zIHB1bnRvcyBkZSBjb25jYXRpdmlkYWQgc29uIG1heW9yZXMgcXVlIDAuMTQgeSBzaSBsYSB0ZXh0dXJhIGVzIG1heW9yIHF1ZSAyNiAoODklKS5cDQoyLiAgTGFzIHByb2JhYmlsaWRhZGVzIGRlIHF1ZSBzZSBkaWFnbm9zdGlxdWUgdW4gdHVtb3IgY29tbyBiZW5pZ25vLCB0b21hbmRvIGVuIGN1ZW50YSBsYXMgcGVvcmVzIG1lZGlkYXMgZW4gZWwgaGlzdHJvaWFsIG3DqWRpY28gZGVsIHBhY2llbnRlLCBzb24gbcOhcyBhbHRhcyBzaSBlbCByYWRpbyBlcyBtZW5vciBhIDE3LCBsb3MgcHVudG9zIGRlIGNvbmNhdGl2aWRhZCBzb24gbWF5b3JlcyBhIDAuMTQgeSBzaSBsYSB0ZXh0dXJhIGVzIG1lbm9yIGEgMjYgKDIxJSkuDQoNCiMjIyDDgXJib2wgZGUgRGVjaXNpw7NuIChNZWFuIE1lYXNzdXJlcykNCg0KMS4gIFBhcmEgcXVlIHVuIHR1bW9yIGN1ZW50ZSBjb24gbWF5b3IgcHJvYmFiaWxpZGFkIGRlIHNlciBkaWFnbm9zdGljYWRvIGNvbW8gbWFsaWdubyBkZWJlIHRlbmVyIHVuIHB1bnRhamUgZGUgY29uY2F0aXZpZGFkIG1heW9yIGEgMC4wNTEgeSB1bmEgdGV4dHVyYSBwcm9tZWRpbyBtYXlvciBhIDE2ICg5NCUpLCBvIHRlbmVyIHVuIHB1bnRhamUgZGUgY29uY2F0aXZpZGFkIGluaWNpYWxtZW50ZSBtYXlvciBhIDAuMDUxIHkgdGVuZXIgdW5hIHRleHR1cmEgcHJvbWVkaW8gbWVub3IgYSAxNiwgcGVybyBhbCBjdW1wbGlyIGNvbiBlc3RhIGNvbmRpY2nDs24gbG9zIHB1bnRvcyBkZSBjb25jYXRpdmlkYWQgZGViZW4gc2VyIGFsIG1lbm9zIDAuMDc5IHBhcmEgcXVlIHNlIGFsY2FuY2UgdW4gOTElIGRlIHByb2JhYmlsaWRhZCBkZSBxdWUgc2VhIHVuIHR1bW9yIG1hbGlnbm8uXA0KMi4gIEFxdWVsbG9zIGNhc29zIHF1ZSB0aWVuZW4gdW5hIG1lbm9yIHByb2JhYmlsaWRhZCBkZSBzZXIgZGlhZ25vc3RpY2Fkb3MgY29tbyBtYWxpZ25vcywgZXMgZGVjaXIgYmVuaWdub3MsIHNvbiBsb3MgcXVlIHRpZW5lbiB1biBwdW50YWplIGRlIGNvbmNhdGl2aWRhZCBtZW5vciBhIDAuMDUxIHkgcXVlIHRpZW5lbiB1biDDoXJlYSBwcm9tZWRpbyBtZW5vciBhIDY5NiAoMyUpLCBlbCBvdHJvIGNhc28gc2Vyw61hbiBsb3MgcXVlIHRpZW5lbiB1biBwdW50YWplIGRlIGNvbmNhdGl2aWRhZCBlbnRyZSAwLjA1MSB5IDAuMDc5IGFkaWNpb25hbG1lbnRlIGRlIHVuYSB0ZXh0dXJhIHByb21lZGlvIGEgMTYgKDYlKS4NCg0KIyMjIENvbmNsdXNpw7NuIEdlbmVyYWwNCg0KQWwgZGl2aWRpciBsYSBiYXNlIGRlIGRhdG9zIHBhcmEgdXRpbGl6YXIgbGEgbWlzbWEgdmFyaWFibGUgcGVybyBjb24gZGlmZXJlbnRlcyBtw6l0cmljYXMgKG1lYW4geSB3b3JzdCkgcG9kZW1vcyBvYnNlcnZhciBxdWUgbGEgY2FudGlkYWQgZGUgbml2ZWxlcyB5IHJhbWFzIGRlbCDDoXJib2wgZGUgZGVjaXNpw7NuIGNhbWJpYW4uIEFsIHNlbGVjY2lvbmFyIHNvbG8gbGFzIHZhcmlhYmxlcyBjb24gbGFzIHBlb3JlcyBtw6l0cmljYXMgc2UgY3VlbnRhIGNvbiAzIGZhY3RvcmVzIHBhcmEgZGV0ZXJtaW5hciBzaSB1biB0dW1vciBlcyBtYWxpZ25vIG8gYmVuaWdubyAocmFkaW8sIHB1bnRvcyBkZSBjb25jYXRpdmlkYWQgeSB0ZXh0dXJhKSwgZW4gY2FtYmlvLCBzaSBzZSBzZWxlY2Npb25hbiBsYXMgdmFyaWFibGVzIGNvbiBtw6l0cmljYSBwcm9tZWRpbyBzZSB0aWVuZSB1biBmYWN0b3IgbcOhcyBwYXJhIGxhIGRldGVybWluYWNpw7NuIGRlbCB0aXBvIGRlIHR1bW9yLCBhZ3JlZ2FuZG8gYXPDrSBlbCBwcm9tZWRpbyBkZSDDoXJlYS4NCg==