Résumé

Utilisant les données relatives aux infections associées aux soins dans les établissements de santé et la méthode des moindres carrés, cette étude montre que les scores de performance des établissements publics ou participant au service public hospitalier semblent inférieurs à ceux des établissements privés de santé concernant la consommation de solutions hydro-alcooliques (hygiène des mains) mais ne sont pas significativement différents concernant le bon usage des antibiotiques.

Objectif de l’étude

Cette étude recherche l’existence d’un lien entre le statut d’un établissement de santé - privé, public, privé participant au service public hospitalier (PSPH) - et certains indicateurs de qualité et de sécurité. Il s’agit en l’occurrence de scores liés aux infections associées aux soins : d’une part, l’usage des antibiotiques ; d’autre part, la consommation de solutions hydro-alcooliques (hygiène des mains).

Plan

  1. Préparation des données ;
  2. Bon usage des antibiotiques ;
  3. Consommation de solutions hydro-alcooliques.

1. Préparation des données

Les données ont été mises à disposition par la Haute Autorité de Santé (HAS) sur le site d’ouverture des données publiques. Elles concernent l’année 2017. Elles sont accessibles à l’adresse suivante, ainsi qu’un dictionnaire des variables : https://www.data.gouv.fr/fr/datasets/indicateurs-de-qualite-et-de-securite-des-soins-infections-associees-aux-soins-recueil-2018/

La préparation des données implique de retirer des colonnes doublons ou inutiles pour l’analyse, telles que des colonnes d’identité, ainsi que des lignes inutiles, en l’occurrence celles pour lesquelles la valeur des indicateurs n’est pas disponible. De plus, compte tenu du faible nombre d’établissements en Guyane, il apparait nécessaire d’agréger dans un même niveau les établissements d’outre-mer d’Amérique.

library(readr)
library(caret)
library(ggplot2)
library(tidyverse)
resultats <- read_delim("resultats-ias-recueil-2018-sur-donnees-2017-1.csv", ";", 
                        escape_double = FALSE, locale = locale(encoding = "ISO-8859-1"), trim_ws = TRUE)
resultats <- data.frame(resultats)
str(resultats)
'data.frame':   2628 obs. of  12 variables:
 $ type_etablissement_2017: chr  "03-ETAB. PSY" "13-SSR" "09-HAD" "05-CL INF 100 LP" ...
 $ statut_2017            : chr  "PSPH" "Prive" "Prive" "Prive" ...
 $ finess                 : chr  "10000495" "10002129" "10005379" "10007300" ...
 $ raison_sociale_2017    : chr  "CENTRE PSYCHOTHÉRAPIQUE DE L'AIN" "CLINIQUE DE READAPTATION LES ARBELLES" "HAD AMBÉRIEU EN BUGEY" "CLINIQUE AMBULATOIRE CENDANEG" ...
 $ region_2017            : chr  "Auvergne-Rhône-Alpes" "Auvergne-Rhône-Alpes" "Auvergne-Rhône-Alpes" "Auvergne-Rhône-Alpes" ...
 $ controle_icatb2_2017   : chr  "Pas de contrôle" "Pas de contrôle" "Pas de contrôle" "Pas de contrôle" ...
 $ score_icatb2_2017      : num  0 98 0 0 69 65 84 65 69 100 ...
 $ classe_icatb2_2017     : chr  "NC" "A" "NC" "NC" ...
 $ evolution_icatb2_2017  : chr  NA "Amélioration" NA NA ...
 $ controle_icsha3_2017   : chr  "Pas de contrôle" "Pas de contrôle" "Pas de contrôle" "Pas de contrôle" ...
 $ score_icsha3_2017      : num  50.2 70.6 172.8 51.9 50.5 ...
 $ classe_icsha3_2017     : chr  "C" "C" "A" "C" ...
# retirer des colonnes inutiles
resultats$raison_sociale_2017 <- NULL
resultats$finess <- NULL
resultats$controle_icatb2_2017 <- NULL
resultats$controle_icsha3_2017 <- NULL
resultats$classe_icsha3_2017 <- NULL
resultats$classe_icatb2_2017 <- NULL
resultats$evolution_icatb2_2017 <- NULL
# retirer les lignes inutiles
resultats <- filter(resultats, score_icatb2_2017 != 0) # 569 
resultats <- filter(resultats, score_icsha3_2017 != 0) # 9 
colSums(sapply(resultats, is.na)) # pas de valeurs manquantes
type_etablissement_2017             statut_2017             region_2017       score_icatb2_2017       score_icsha3_2017 
                      0                       0                       0                       0                       0 
cat("Le nombre de doublons s'élève à : ", nrow(resultats) - nrow(unique(resultats))) 
Le nombre de doublons s'élève à :  1
resultats <- unique(resultats) # retirer les doublons
table(resultats$region_2017)

      Auvergne-Rhône-Alpes    Bourgogne-Franche-Comté                   Bretagne        Centre-Val de Loire 
                       246                        100                         89                         76 
                     Corse                  Grand-Est                 Guadeloupe                     Guyane 
                        18                        178                         19                          5 
           Hauts-de-France              Ile-de-France       La Réunion - Mayotte                 Martinique 
                       166                        297                         18                         11 
                 Normandie         Nouvelle-Aquitaine                  Occitanie           Pays de la Loire 
                       105                        198                        209                         98 
Provence-Alpes-Côte d'Azur 
                       216 
# Recode resultats$region_2017
resultats$region_2017[resultats$region_2017 == "Guadeloupe"] <- "Outremer_Amerique"
resultats$region_2017[resultats$region_2017 == "Martinique"] <- "Outremer_Amerique"
resultats$region_2017[resultats$region_2017 == "Guyane"] <- "Outremer_Amerique"
table(resultats$region_2017)

      Auvergne-Rhône-Alpes    Bourgogne-Franche-Comté                   Bretagne        Centre-Val de Loire 
                       246                        100                         89                         76 
                     Corse                  Grand-Est            Hauts-de-France              Ile-de-France 
                        18                        178                        166                        297 
      La Réunion - Mayotte                  Normandie         Nouvelle-Aquitaine                  Occitanie 
                        18                        105                        198                        209 
         Outremer_Amerique           Pays de la Loire Provence-Alpes-Côte d'Azur 
                        35                         98                        216 
resultats$type_etablissement_2017 <- factor(resultats$type_etablissement_2017)
resultats$statut_2017 <- factor(resultats$statut_2017)
resultats$region_2017 <- factor(resultats$region_2017)

2. Bon usage des antibiotiques

D’après la HAS, l’indicateur de bon usage des antibiotiques version 2 (ICATB.2) “témoigne de l’organisation mise en place dans l’établissement pour promouvoir le bon usage des antibiotiques, les moyens mobilisés et les actions mises en oeuvre”. Le score maximum pouvant être obtenu est 100.

A. Exploration des données

Les graphiques mettent en évidence les enseignements suivants :

  • les établissements ont obtenu des scores très différents en 2017, même si pour plus de la moitié d’entre eux le score excède 89/100 ;
  • les scores sont sensiblement différents en fonction du statut de l’établissement (public, privé, privé participant au service public hospitalier), de la région et du type d’établissement (hôpital local, CHU/CHR, centre de lutte contre le cancer, etc.).
summary(resultats$score_icatb2_2017)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  10.00   78.00   89.00   84.96   96.00  100.00 
ggplot(data = resultats) +
        ggtitle("Score obtenu à l'indicateur composite de bon usage des antibiotiques") +
        geom_histogram(mapping = aes(x = score_icatb2_2017), bins = 70) +
        labs(x = "Indicateur composite de bon usage des antibiotiques")

ggplot(data = resultats) +
        geom_boxplot(mapping = aes(x = region_2017, y = score_icatb2_2017, color = statut_2017)) +
        labs(title = "Bon usage des antibiotiques par région", x = "région") +
        coord_flip()

ggplot(data = resultats) +
        geom_boxplot(mapping = aes(x = type_etablissement_2017, y = score_icatb2_2017)) +
        labs(title = "Bon usage des antibiotiques par type d'établissement", x = "Type d'établissement") +
        coord_flip()

ggplot(data = resultats) +
        geom_boxplot(mapping = aes(x = statut_2017, y = score_icatb2_2017)) +
        labs(title = "Bon usage des antibiotiques par statut", x = "statut") 

ggplot(data = resultats) +
        geom_boxplot(mapping = aes(x = type_etablissement_2017, y = score_icatb2_2017, color = statut_2017)) +
        labs(title = "Bon usage des antibiotiques par type d'établissement", x = "Type d'établissement") +
        coord_flip()

B. Modélisation du lien entre le statut de l’établissement et le bon usage des antibiotiques

La variable explicative d’intérêt pour cette étude est une variable discrète, le statut juridique de l’établissement, qui peut prendre trois modalités : public, privé, privé participant au SPH. Par conséquent, il n’est pas judicieux de la transformer en trois variables binaires car cela entraînerait un problème de dépendance linéaire entre l’une de ces modalités et le coefficient d’interception. Au contraire, la méthode des moindres carrés requiert, notamment, l’indépendance entre les variables explicatives.

Sans création de variable binaire, il n’est pas possible de calculer les coefficients associés à chacune des modalités de la variable “statut juridique” en même temps. Le calcul est donc réalisé à trois reprises afin qu’à chaque fois, les coefficients de deux des trois modalités soient calculés tandis que la troisième est en quelque sorte incluse dans l’interception. Le coefficient de chacune des trois modalités est calculé à deux reprises, ce qui donne un ordre de grandeur de sa valeur probable.

Le jeu de données permet de contrôler pour le type d’établissement (hôpital local, CHR/CHU, soins de longue durée, etc.) et sa région d’implantation. Du reste, on applique l’hypothèse “toutes choses égales par ailleurs”.

Concernant le bon usage des antibiotiques, les calculs font apparaître les résultats suivants :

  • le statut public d’un établissement est associé à un score inférieur entre 1 et 3 points environ (sur 100) par rapport aux deux autres statuts. Cependant, la significativité statistique de ce résultat est faible ;
  • le statut privé est associé à un score supérieur de 1.5 à 3 points environ par rapport aux deux autres statuts. Là encore, la significativité statistique s’avère faible ;
  • le statut de PSPH n’est pas associé à un score significativement différent de 0 : autrement dit, on ne peut pas rejeter l’hypothèse nulle selon laquelle le fait de relever du statut de PSPH n’a pas de lien avec le score du bon usage d’antibiotiques.
        # PSPH et public
model_icatb2 <- train(score_icatb2_2017 ~ type_etablissement_2017 + statut_2017 + region_2017, 
                      data = resultats, method = "lm")
summary(model_icatb2)

Call:
lm(formula = .outcome ~ ., data = dat)

Residuals:
    Min      1Q  Median      3Q     Max 
-71.873  -6.086   2.934   8.773  28.903 

Coefficients:
                                          Estimate Std. Error t value Pr(>|t|)    
(Intercept)                                90.1484     2.3712  38.018  < 2e-16 ***
`type_etablissement_201702-CH INF 300 LP`  -4.3478     1.8506  -2.349  0.01890 *  
`type_etablissement_201702-CH SUP 300 LP`  -2.4818     1.8995  -1.307  0.19152    
`type_etablissement_201704-HOPITAL LOCAL` -14.9220     1.8895  -7.897 4.64e-15 ***
`type_etablissement_201705-CL INF 100 LP`  -1.6938     2.4140  -0.702  0.48299    
`type_etablissement_201705-CL SUP 100 LP`   0.7645     2.3016   0.332  0.73980    
`type_etablissement_201708-CLCC-CANCER`     6.9239     3.7372   1.853  0.06407 .  
`type_etablissement_201713-SSR`            -5.2472     2.0946  -2.505  0.01232 *  
`type_etablissement_201714-SLD`            -7.6243     2.6325  -2.896  0.00382 ** 
statut_2017PSPH                            -1.5021     1.0011  -1.501  0.13362    
statut_2017Public                          -2.8681     1.4412  -1.990  0.04672 *  
`region_2017Bourgogne-Franche-Comté`       -5.2048     1.6113  -3.230  0.00126 ** 
region_2017Bretagne                        -1.0513     1.6756  -0.627  0.53045    
`region_2017Centre-Val de Loire`           -1.3776     1.7769  -0.775  0.43826    
region_2017Corse                           -1.2615     3.3130  -0.381  0.70340    
`region_2017Grand-Est`                      2.0720     1.3388   1.548  0.12187    
`region_2017Hauts-de-France`                0.6930     1.3687   0.506  0.61271    
`region_2017Ile-de-France`                  1.0037     1.1963   0.839  0.40156    
`region_2017La Réunion - Mayotte`           1.9408     3.3199   0.585  0.55888    
region_2017Normandie                        1.1530     1.5809   0.729  0.46587    
`region_2017Nouvelle-Aquitaine`             0.9715     1.2979   0.748  0.45425    
region_2017Occitanie                        3.0289     1.2790   2.368  0.01797 *  
region_2017Outremer_Amerique              -12.2222     2.4668  -4.955 7.85e-07 ***
`region_2017Pays de la Loire`               4.2942     1.6184   2.653  0.00803 ** 
`region_2017Provence-Alpes-Côte d'Azur`     2.2916     1.2736   1.799  0.07212 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 13.53 on 2024 degrees of freedom
Multiple R-squared:  0.1595,    Adjusted R-squared:  0.1496 
F-statistic: 16.01 on 24 and 2024 DF,  p-value: < 2.2e-16
# Privé et public
## Réordonnancement de resultats$statut_2017
resultats$statut_2017 <- factor(resultats$statut_2017, levels=c("PSPH", "Prive", "Public"))
model_2_icatb2 <- train(score_icatb2_2017 ~ type_etablissement_2017 + statut_2017 + region_2017, 
                        data = resultats, method = "lm")
summary(model_2_icatb2)

Call:
lm(formula = .outcome ~ ., data = dat)

Residuals:
    Min      1Q  Median      3Q     Max 
-71.873  -6.086   2.934   8.773  28.903 

Coefficients:
                                          Estimate Std. Error t value Pr(>|t|)    
(Intercept)                                88.6462     2.2345  39.672  < 2e-16 ***
`type_etablissement_201702-CH INF 300 LP`  -4.3478     1.8506  -2.349  0.01890 *  
`type_etablissement_201702-CH SUP 300 LP`  -2.4818     1.8995  -1.307  0.19152    
`type_etablissement_201704-HOPITAL LOCAL` -14.9220     1.8895  -7.897 4.64e-15 ***
`type_etablissement_201705-CL INF 100 LP`  -1.6938     2.4140  -0.702  0.48299    
`type_etablissement_201705-CL SUP 100 LP`   0.7645     2.3016   0.332  0.73980    
`type_etablissement_201708-CLCC-CANCER`     6.9239     3.7372   1.853  0.06407 .  
`type_etablissement_201713-SSR`            -5.2472     2.0946  -2.505  0.01232 *  
`type_etablissement_201714-SLD`            -7.6243     2.6325  -2.896  0.00382 ** 
statut_2017Prive                            1.5021     1.0011   1.501  0.13362    
statut_2017Public                          -1.3659     1.2445  -1.098  0.27253    
`region_2017Bourgogne-Franche-Comté`       -5.2048     1.6113  -3.230  0.00126 ** 
region_2017Bretagne                        -1.0513     1.6756  -0.627  0.53045    
`region_2017Centre-Val de Loire`           -1.3776     1.7769  -0.775  0.43826    
region_2017Corse                           -1.2615     3.3130  -0.381  0.70340    
`region_2017Grand-Est`                      2.0720     1.3388   1.548  0.12187    
`region_2017Hauts-de-France`                0.6930     1.3687   0.506  0.61271    
`region_2017Ile-de-France`                  1.0037     1.1963   0.839  0.40156    
`region_2017La Réunion - Mayotte`           1.9408     3.3199   0.585  0.55888    
region_2017Normandie                        1.1530     1.5809   0.729  0.46587    
`region_2017Nouvelle-Aquitaine`             0.9715     1.2979   0.748  0.45425    
region_2017Occitanie                        3.0289     1.2790   2.368  0.01797 *  
region_2017Outremer_Amerique              -12.2222     2.4668  -4.955 7.85e-07 ***
`region_2017Pays de la Loire`               4.2942     1.6184   2.653  0.00803 ** 
`region_2017Provence-Alpes-Côte d'Azur`     2.2916     1.2736   1.799  0.07212 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 13.53 on 2024 degrees of freedom
Multiple R-squared:  0.1595,    Adjusted R-squared:  0.1496 
F-statistic: 16.01 on 24 and 2024 DF,  p-value: < 2.2e-16
        # Privé et PSPH
## Réordonnancement de resultats$statut_2017
resultats$statut_2017 <- factor(resultats$statut_2017, levels=c("Public", "PSPH", "Prive"))
model_3_icatb2 <- train(score_icatb2_2017 ~ type_etablissement_2017 + statut_2017 + region_2017, 
                        data = resultats, method = "lm")
summary(model_3_icatb2)

Call:
lm(formula = .outcome ~ ., data = dat)

Residuals:
    Min      1Q  Median      3Q     Max 
-71.873  -6.086   2.934   8.773  28.903 

Coefficients:
                                          Estimate Std. Error t value Pr(>|t|)    
(Intercept)                                87.2803     1.8444  47.323  < 2e-16 ***
`type_etablissement_201702-CH INF 300 LP`  -4.3478     1.8506  -2.349  0.01890 *  
`type_etablissement_201702-CH SUP 300 LP`  -2.4818     1.8995  -1.307  0.19152    
`type_etablissement_201704-HOPITAL LOCAL` -14.9220     1.8895  -7.897 4.64e-15 ***
`type_etablissement_201705-CL INF 100 LP`  -1.6938     2.4140  -0.702  0.48299    
`type_etablissement_201705-CL SUP 100 LP`   0.7645     2.3016   0.332  0.73980    
`type_etablissement_201708-CLCC-CANCER`     6.9239     3.7372   1.853  0.06407 .  
`type_etablissement_201713-SSR`            -5.2472     2.0946  -2.505  0.01232 *  
`type_etablissement_201714-SLD`            -7.6243     2.6325  -2.896  0.00382 ** 
statut_2017PSPH                             1.3659     1.2445   1.098  0.27253    
statut_2017Prive                            2.8681     1.4412   1.990  0.04672 *  
`region_2017Bourgogne-Franche-Comté`       -5.2048     1.6113  -3.230  0.00126 ** 
region_2017Bretagne                        -1.0513     1.6756  -0.627  0.53045    
`region_2017Centre-Val de Loire`           -1.3776     1.7769  -0.775  0.43826    
region_2017Corse                           -1.2615     3.3130  -0.381  0.70340    
`region_2017Grand-Est`                      2.0720     1.3388   1.548  0.12187    
`region_2017Hauts-de-France`                0.6930     1.3687   0.506  0.61271    
`region_2017Ile-de-France`                  1.0037     1.1963   0.839  0.40156    
`region_2017La Réunion - Mayotte`           1.9408     3.3199   0.585  0.55888    
region_2017Normandie                        1.1530     1.5809   0.729  0.46587    
`region_2017Nouvelle-Aquitaine`             0.9715     1.2979   0.748  0.45425    
region_2017Occitanie                        3.0289     1.2790   2.368  0.01797 *  
region_2017Outremer_Amerique              -12.2222     2.4668  -4.955 7.85e-07 ***
`region_2017Pays de la Loire`               4.2942     1.6184   2.653  0.00803 ** 
`region_2017Provence-Alpes-Côte d'Azur`     2.2916     1.2736   1.799  0.07212 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 13.53 on 2024 degrees of freedom
Multiple R-squared:  0.1595,    Adjusted R-squared:  0.1496 
F-statistic: 16.01 on 24 and 2024 DF,  p-value: < 2.2e-16

Une autre méthode possible est d’agréger dans un même niveau les établissements publics et les établissements privés participant au SPH, afin d’obtenir, au regard du statut, une opposition binaire entre service public et secteur privé. Il apparait dès lors que le statut privé, toutes choses égales par ailleurs, est associé à un score légèrement supérieur à celui du service public, de l’ordre de +1.7 point (sur 100). Cependant, la significativité statistique de ce résultat est faible.

        # Service public et privé
resultats_2 <- resultats
                # Recodage de resultats_2$statut_2017
resultats_2$statut_2017 <- fct_recode(resultats_2$statut_2017,
               "SP" = "Public",
               "SP" = "PSPH")
model_SP_prive_icatb2 <- train(score_icatb2_2017 ~ type_etablissement_2017 + statut_2017 + region_2017, 
                        data = resultats_2, method = "lm")
summary(model_SP_prive_icatb2)

Call:
lm(formula = .outcome ~ ., data = dat)

Residuals:
    Min      1Q  Median      3Q     Max 
-71.829  -6.118   2.854   8.756  28.876 

Coefficients:
                                          Estimate Std. Error t value Pr(>|t|)    
(Intercept)                                87.2616     1.8444  47.312  < 2e-16 ***
`type_etablissement_201702-CH INF 300 LP`  -4.1031     1.8372  -2.233  0.02564 *  
`type_etablissement_201702-CH SUP 300 LP`  -2.3529     1.8960  -1.241  0.21475    
`type_etablissement_201704-HOPITAL LOCAL` -14.8139     1.8871  -7.850 6.67e-15 ***
`type_etablissement_201705-CL INF 100 LP`  -0.5171     2.1630  -0.239  0.81108    
`type_etablissement_201705-CL SUP 100 LP`   1.9588     2.0283   0.966  0.33429    
`type_etablissement_201708-CLCC-CANCER`     8.3058     3.5189   2.360  0.01835 *  
`type_etablissement_201713-SSR`            -4.0723     1.8004  -2.262  0.02381 *  
`type_etablissement_201714-SLD`            -7.0198     2.5743  -2.727  0.00645 ** 
statut_2017Prive                            1.7111     0.9828   1.741  0.08185 .  
`region_2017Bourgogne-Franche-Comté`       -5.3177     1.6081  -3.307  0.00096 ***
region_2017Bretagne                        -1.0015     1.6751  -0.598  0.55000    
`region_2017Centre-Val de Loire`           -1.4025     1.7768  -0.789  0.43001    
region_2017Corse                           -1.3233     3.3127  -0.399  0.68958    
`region_2017Grand-Est`                      2.1155     1.3383   1.581  0.11410    
`region_2017Hauts-de-France`                0.6594     1.3685   0.482  0.62998    
`region_2017Ile-de-France`                  1.0647     1.1950   0.891  0.37304    
`region_2017La Réunion - Mayotte`           1.9258     3.3200   0.580  0.56194    
region_2017Normandie                        1.0941     1.5801   0.692  0.48876    
`region_2017Nouvelle-Aquitaine`             0.9290     1.2974   0.716  0.47405    
region_2017Occitanie                        2.9876     1.2785   2.337  0.01955 *  
region_2017Outremer_Amerique              -12.4958     2.4543  -5.091 3.88e-07 ***
`region_2017Pays de la Loire`               4.3113     1.6184   2.664  0.00779 ** 
`region_2017Provence-Alpes-Côte d'Azur`     2.3437     1.2728   1.841  0.06571 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 13.53 on 2025 degrees of freedom
Multiple R-squared:  0.159, Adjusted R-squared:  0.1495 
F-statistic: 16.65 on 23 and 2025 DF,  p-value: < 2.2e-16

3. Consommation de solutions hydro-alcooliques

L’indicateur de consommation de solutions hydro-alcooliques (ICSHA.3) est “un marqueur indirect de la mise en oeuvre effective de l’hygiène des mains”. L’usage de ces solutions permet de réduire le risque d’infection et de dissémination de bactéries. L’indicateur n’est pas limité à 100, contrairement au bon usage des antibiotiques.

A. Exploration des données

L’exploration des données fait apparaître les constats suivants :

  • si l’étendue des données est très élevée (de 10 à 359), c’est principalement en raison de la présence de quelques valeurs très divergentes (en particulier le maximum, isolé à 359), tandis que la moitié des observations sont comprises entre 54 et 86 ;
  • comme pour le bon usage des antibiotiques, les scores diffèrent sensiblement selon le statut juridique, la région et le type d’établissement.
# consommation de solutions hydro-alcooliques
summary(resultats$score_icsha3_2017)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  10.90   53.90   68.90   72.41   86.80  359.40 
ggplot(data = resultats) +
        ggtitle("Score obtenu à l'indicateur de consommation de solutions hydro-alcooliques") +
        geom_histogram(mapping = aes(x = score_icsha3_2017), bins = 70) + # one important outlier (maximum)
        labs(x = "Indicateur de consommation de solutions hydro-alcooliques")

ggplot(data = resultats) +
        geom_boxplot(mapping = aes(x = region_2017, y = score_icsha3_2017, color = statut_2017)) +
        labs(title = "Indicateur de consommation de solutions hydro-alcooliques par région", x = "région") +
        coord_flip()

ggplot(data = resultats) +
        geom_boxplot(mapping = aes(x = type_etablissement_2017, y = score_icsha3_2017)) +
        labs(title = "Indicateur de consommation de solutions hydro-alcooliques par type d'établissement", x = "Type d'établissement") +
        coord_flip()

ggplot(data = resultats) +
        geom_boxplot(mapping = aes(x = statut_2017, y = score_icsha3_2017)) +
        labs(title = "Indicateur de consommation de solutions hydro-alcooliques par statut", x = "statut") 

ggplot(data = resultats) +
        geom_boxplot(mapping = aes(x = type_etablissement_2017, y = score_icsha3_2017, color = statut_2017)) +
        labs(title = "Indicateur de consommation de solutions hydro-alcooliques par type d'établissement", x = "Type d'établissement") +
        coord_flip()

B. Modélisation du lien entre le statut de l’établissement et la consommation de solutions hydro-alcooliques

La méthodologie employée dans cette partie est identique à celle concernant le bon usage des antibiotiques (voir 2.B).

Les calculs permettent de dresser les constats suivants relatifs à la consommation de solutions hydro-alcooliques :

  • le statut public de l’établissement est très significativement associé à un score plus faible que les deux autres statuts, de l’ordre de -9 à -14 points (pour mémoire, le score maximum n’est pas borné à 100 pour cet indicateur) ;
  • le statut privé de l’établissement est très significativement associé à un score plus élevé que les deux autres statuts, de l’ordre de +5 à +14 points ;
  • le statut PSPH de l’établissement est plus difficile d’interprétation : très positif si l’on contrôle directement pour le statut privé, négatif si l’on contrôle directement pour le statut public.
        # public et PSPH
## Réordonnancement de resultats$statut_2017
resultats$statut_2017 <- factor(resultats$statut_2017, levels=c("Prive", "Public", "PSPH"))
model_1_icsha3 <- train(score_icsha3_2017 ~ type_etablissement_2017 + statut_2017 + region_2017, 
                        data = resultats, method = "lm")
summary(model_1_icsha3)

Call:
lm(formula = .outcome ~ ., data = dat)

Residuals:
    Min      1Q  Median      3Q     Max 
-73.072 -14.826  -1.853  12.236 285.879 

Coefficients:
                                          Estimate Std. Error t value Pr(>|t|)    
(Intercept)                                98.7897     4.2379  23.311  < 2e-16 ***
`type_etablissement_201702-CH INF 300 LP` -23.4168     3.3075  -7.080 1.98e-12 ***
`type_etablissement_201702-CH SUP 300 LP` -20.3556     3.3949  -5.996 2.39e-09 ***
`type_etablissement_201704-HOPITAL LOCAL` -20.4465     3.3770  -6.055 1.67e-09 ***
`type_etablissement_201705-CL INF 100 LP` -25.6027     4.3144  -5.934 3.46e-09 ***
`type_etablissement_201705-CL SUP 100 LP` -21.6687     4.1135  -5.268 1.53e-07 ***
`type_etablissement_201708-CLCC-CANCER`    -9.3107     6.6793  -1.394  0.16349    
`type_etablissement_201713-SSR`           -22.2500     3.7435  -5.944 3.28e-09 ***
`type_etablissement_201714-SLD`           -30.2225     4.7048  -6.424 1.65e-10 ***
statut_2017Public                         -14.3793     2.5758  -5.582 2.69e-08 ***
statut_2017PSPH                            -4.9129     1.7891  -2.746  0.00609 ** 
`region_2017Bourgogne-Franche-Comté`       -6.0693     2.8798  -2.108  0.03520 *  
region_2017Bretagne                        -6.4432     2.9947  -2.152  0.03155 *  
`region_2017Centre-Val de Loire`           -0.6370     3.1757  -0.201  0.84104    
region_2017Corse                          -10.3699     5.9211  -1.751  0.08003 .  
`region_2017Grand-Est`                     -2.9676     2.3928  -1.240  0.21504    
`region_2017Hauts-de-France`               11.4177     2.4463   4.667 3.25e-06 ***
`region_2017Ile-de-France`                  6.7705     2.1380   3.167  0.00156 ** 
`region_2017La Réunion - Mayotte`          11.8225     5.9334   1.993  0.04645 *  
region_2017Normandie                       -0.5672     2.8254  -0.201  0.84090    
`region_2017Nouvelle-Aquitaine`            -3.5857     2.3197  -1.546  0.12232    
region_2017Occitanie                        1.9048     2.2858   0.833  0.40476    
region_2017Outremer_Amerique               12.7641     4.4088   2.895  0.00383 ** 
`region_2017Pays de la Loire`              -1.8269     2.8924  -0.632  0.52771    
`region_2017Provence-Alpes-Côte d'Azur`     7.4322     2.2763   3.265  0.00111 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 24.17 on 2024 degrees of freedom
Multiple R-squared:  0.1338,    Adjusted R-squared:  0.1235 
F-statistic: 13.03 on 24 and 2024 DF,  p-value: < 2.2e-16
        # privé et public
## Réordonnancement de resultats$statut_2017
resultats$statut_2017 <- factor(resultats$statut_2017, levels=c("PSPH", "Prive", "Public"))
model_2_icsha3 <- train(score_icsha3_2017 ~ type_etablissement_2017 + statut_2017 + region_2017, 
                        data = resultats, method = "lm")
summary(model_2_icsha3)

Call:
lm(formula = .outcome ~ ., data = dat)

Residuals:
    Min      1Q  Median      3Q     Max 
-73.072 -14.826  -1.853  12.236 285.879 

Coefficients:
                                          Estimate Std. Error t value Pr(>|t|)    
(Intercept)                                93.8768     3.9935  23.507  < 2e-16 ***
`type_etablissement_201702-CH INF 300 LP` -23.4168     3.3075  -7.080 1.98e-12 ***
`type_etablissement_201702-CH SUP 300 LP` -20.3556     3.3949  -5.996 2.39e-09 ***
`type_etablissement_201704-HOPITAL LOCAL` -20.4465     3.3770  -6.055 1.67e-09 ***
`type_etablissement_201705-CL INF 100 LP` -25.6027     4.3144  -5.934 3.46e-09 ***
`type_etablissement_201705-CL SUP 100 LP` -21.6687     4.1135  -5.268 1.53e-07 ***
`type_etablissement_201708-CLCC-CANCER`    -9.3107     6.6793  -1.394  0.16349    
`type_etablissement_201713-SSR`           -22.2500     3.7435  -5.944 3.28e-09 ***
`type_etablissement_201714-SLD`           -30.2225     4.7048  -6.424 1.65e-10 ***
statut_2017Prive                            4.9129     1.7891   2.746  0.00609 ** 
statut_2017Public                          -9.4664     2.2242  -4.256 2.18e-05 ***
`region_2017Bourgogne-Franche-Comté`       -6.0693     2.8798  -2.108  0.03520 *  
region_2017Bretagne                        -6.4432     2.9947  -2.152  0.03155 *  
`region_2017Centre-Val de Loire`           -0.6370     3.1757  -0.201  0.84104    
region_2017Corse                          -10.3699     5.9211  -1.751  0.08003 .  
`region_2017Grand-Est`                     -2.9676     2.3928  -1.240  0.21504    
`region_2017Hauts-de-France`               11.4177     2.4463   4.667 3.25e-06 ***
`region_2017Ile-de-France`                  6.7705     2.1380   3.167  0.00156 ** 
`region_2017La Réunion - Mayotte`          11.8225     5.9334   1.993  0.04645 *  
region_2017Normandie                       -0.5672     2.8254  -0.201  0.84090    
`region_2017Nouvelle-Aquitaine`            -3.5857     2.3197  -1.546  0.12232    
region_2017Occitanie                        1.9048     2.2858   0.833  0.40476    
region_2017Outremer_Amerique               12.7641     4.4088   2.895  0.00383 ** 
`region_2017Pays de la Loire`              -1.8269     2.8924  -0.632  0.52771    
`region_2017Provence-Alpes-Côte d'Azur`     7.4322     2.2763   3.265  0.00111 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 24.17 on 2024 degrees of freedom
Multiple R-squared:  0.1338,    Adjusted R-squared:  0.1235 
F-statistic: 13.03 on 24 and 2024 DF,  p-value: < 2.2e-16
        # PSPH et privé
## Réordonnancement de resultats$statut_2017
resultats$statut_2017 <- factor(resultats$statut_2017, levels=c("Public", "PSPH", "Prive"))
model_3_icsha3 <- train(score_icsha3_2017 ~ type_etablissement_2017 + statut_2017 + region_2017, 
                      data = resultats, method = "lm")
summary(model_3_icsha3)

Call:
lm(formula = .outcome ~ ., data = dat)

Residuals:
    Min      1Q  Median      3Q     Max 
-73.072 -14.826  -1.853  12.236 285.879 

Coefficients:
                                          Estimate Std. Error t value Pr(>|t|)    
(Intercept)                                84.4104     3.2963  25.607  < 2e-16 ***
`type_etablissement_201702-CH INF 300 LP` -23.4168     3.3075  -7.080 1.98e-12 ***
`type_etablissement_201702-CH SUP 300 LP` -20.3556     3.3949  -5.996 2.39e-09 ***
`type_etablissement_201704-HOPITAL LOCAL` -20.4465     3.3770  -6.055 1.67e-09 ***
`type_etablissement_201705-CL INF 100 LP` -25.6027     4.3144  -5.934 3.46e-09 ***
`type_etablissement_201705-CL SUP 100 LP` -21.6687     4.1135  -5.268 1.53e-07 ***
`type_etablissement_201708-CLCC-CANCER`    -9.3107     6.6793  -1.394  0.16349    
`type_etablissement_201713-SSR`           -22.2500     3.7435  -5.944 3.28e-09 ***
`type_etablissement_201714-SLD`           -30.2225     4.7048  -6.424 1.65e-10 ***
statut_2017PSPH                             9.4664     2.2242   4.256 2.18e-05 ***
statut_2017Prive                           14.3793     2.5758   5.582 2.69e-08 ***
`region_2017Bourgogne-Franche-Comté`       -6.0693     2.8798  -2.108  0.03520 *  
region_2017Bretagne                        -6.4432     2.9947  -2.152  0.03155 *  
`region_2017Centre-Val de Loire`           -0.6370     3.1757  -0.201  0.84104    
region_2017Corse                          -10.3699     5.9211  -1.751  0.08003 .  
`region_2017Grand-Est`                     -2.9676     2.3928  -1.240  0.21504    
`region_2017Hauts-de-France`               11.4177     2.4463   4.667 3.25e-06 ***
`region_2017Ile-de-France`                  6.7705     2.1380   3.167  0.00156 ** 
`region_2017La Réunion - Mayotte`          11.8225     5.9334   1.993  0.04645 *  
region_2017Normandie                       -0.5672     2.8254  -0.201  0.84090    
`region_2017Nouvelle-Aquitaine`            -3.5857     2.3197  -1.546  0.12232    
region_2017Occitanie                        1.9048     2.2858   0.833  0.40476    
region_2017Outremer_Amerique               12.7641     4.4088   2.895  0.00383 ** 
`region_2017Pays de la Loire`              -1.8269     2.8924  -0.632  0.52771    
`region_2017Provence-Alpes-Côte d'Azur`     7.4322     2.2763   3.265  0.00111 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 24.17 on 2024 degrees of freedom
Multiple R-squared:  0.1338,    Adjusted R-squared:  0.1235 
F-statistic: 13.03 on 24 and 2024 DF,  p-value: < 2.2e-16

De même que pour le bon usage des antibiotiques (2.B), il est possible d’opposer de manière binaire le statut privé face au service public. Il apparait que le statut privé est très significativement associé à un meilleur score, toutes choses égales par ailleurs, de l’ordre de +6 points. Ce résultat conforte les précédents pour affirmer qu’il existe une réelle différence entre les établissements selon leur statut juridique en ce qui concerne la consommation de solutions hydro-alcooliques.

model_SP_prive_icsha3 <- train(score_icsha3_2017 ~ type_etablissement_2017 + statut_2017 + region_2017, 
                      data = resultats_2, method = "lm")
summary(model_SP_prive_icsha3)

Call:
lm(formula = .outcome ~ ., data = dat)

Residuals:
    Min      1Q  Median      3Q     Max 
-73.428 -15.168  -1.912  12.592 294.582 

Coefficients:
                                          Estimate Std. Error t value Pr(>|t|)    
(Intercept)                                84.2807     3.3101  25.462  < 2e-16 ***
`type_etablissement_201702-CH INF 300 LP` -21.7211     3.2972  -6.588 5.68e-11 ***
`type_etablissement_201702-CH SUP 300 LP` -19.4626     3.4027  -5.720 1.23e-08 ***
`type_etablissement_201704-HOPITAL LOCAL` -19.6978     3.3867  -5.816 6.98e-09 ***
`type_etablissement_201705-CL INF 100 LP` -17.4479     3.8819  -4.495 7.36e-06 ***
`type_etablissement_201705-CL SUP 100 LP` -13.3920     3.6401  -3.679 0.000240 ***
`type_etablissement_201708-CLCC-CANCER`     0.2667     6.3154   0.042 0.966324    
`type_etablissement_201713-SSR`           -14.1068     3.2312  -4.366 1.33e-05 ***
`type_etablissement_201714-SLD`           -26.0328     4.6201  -5.635 2.00e-08 ***
statut_2017Prive                            6.3608     1.7639   3.606 0.000318 ***
`region_2017Bourgogne-Franche-Comté`       -6.8513     2.8861  -2.374 0.017694 *  
region_2017Bretagne                        -6.0977     3.0062  -2.028 0.042656 *  
`region_2017Centre-Val de Loire`           -0.8096     3.1888  -0.254 0.799597    
region_2017Corse                          -10.7983     5.9452  -1.816 0.069469 .  
`region_2017Grand-Est`                     -2.6662     2.4018  -1.110 0.267110    
`region_2017Hauts-de-France`               11.1848     2.4560   4.554 5.57e-06 ***
`region_2017Ile-de-France`                  7.1938     2.1447   3.354 0.000810 ***
`region_2017La Réunion - Mayotte`          11.7186     5.9584   1.967 0.049348 *  
region_2017Normandie                       -0.9759     2.8357  -0.344 0.730779    
`region_2017Nouvelle-Aquitaine`            -3.8803     2.3284  -1.666 0.095776 .  
region_2017Occitanie                        1.6185     2.2944   0.705 0.480655    
region_2017Outremer_Amerique               10.8678     4.4047   2.467 0.013695 *  
`region_2017Pays de la Loire`              -1.7084     2.9045  -0.588 0.556470    
`region_2017Provence-Alpes-Côte d'Azur`     7.7932     2.2843   3.412 0.000658 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 24.28 on 2025 degrees of freedom
Multiple R-squared:  0.126, Adjusted R-squared:  0.1161 
F-statistic:  12.7 on 23 and 2025 DF,  p-value: < 2.2e-16

Conclusion

Les résultats obtenus mettent en évidence des scores plutôt meilleurs pour les établissements sous statut privé par rapport au statut public ou au statut privé participant au service public hospitalier pour la performance relative à la consommation de solutions hydro-alcooliques (3.B). En revanche, il n’est pas apparu possible de distinguer la performance des établissements en fonction de leur statut concernant le bon usage des antibiotiques (2.B). Une explication possible vient de la différence de mesure entre les deux indicateurs : le score relatif à l’usage des antibiotiques étant borné à 100, et plus de la moitié des valeurs étant comprise entre 89 et 100, il est plus difficile d’observer des écarts notables que pour le score relatif à l’hygiène des mains, dont les valeurs sont sensiblement plus dispersées.

En tout état de cause, il convient de rappeler que ces résultats ne permettent pas d’affirmer sans aucun doute l’existence d’une relation de causalité entre le statut d’un établissement et ses scores de performances en raison des limites méthodologiques pouvant biaiser les résultats.

LS0tDQp0aXRsZTogIkxlcyBwZXJmb3JtYW5jZXMgZGVzIOl0YWJsaXNzZW1lbnRzIGRlIHNhbnTpIHJlbGF0aXZlcyBhdXggaW5mZWN0aW9ucyBhc3NvY2npZXMgYXV4IHNvaW5zIGVuIGZvbmN0aW9uIGRlIGxldXIgc3RhdHV0IGp1cmlkaXF1ZSINCmF1dGhvcjogT2xpdmllciBWaW9sbGV0LCBvbGl2aWVyLnZpb2xsZXRbYV1nbWFpbC5jb20NCmRhdGU6IEbpdnJpZXIsIDIwMTkNCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiMgUulzdW3pDQoNClV0aWxpc2FudCBsZXMgZG9ubullcyByZWxhdGl2ZXMgYXV4IGluZmVjdGlvbnMgYXNzb2Np6WVzIGF1eCBzb2lucyBkYW5zIGxlcyDpdGFibGlzc2VtZW50cyBkZSBzYW506SBldCBsYSBt6XRob2RlIGRlcyBtb2luZHJlcyBjYXJy6XMsIGNldHRlIOl0dWRlIG1vbnRyZSBxdWUgbGVzIHNjb3JlcyBkZSBwZXJmb3JtYW5jZSBkZXMg6XRhYmxpc3NlbWVudHMgcHVibGljcyBvdSBwYXJ0aWNpcGFudCBhdSBzZXJ2aWNlIHB1YmxpYyBob3NwaXRhbGllciBzZW1ibGVudCBpbmbpcmlldXJzIOAgY2V1eCBkZXMg6XRhYmxpc3NlbWVudHMgcHJpdulzIGRlIHNhbnTpIGNvbmNlcm5hbnQgbGEgY29uc29tbWF0aW9uIGRlIHNvbHV0aW9ucyBoeWRyby1hbGNvb2xpcXVlcyAoaHlnaehuZSBkZXMgbWFpbnMpIG1haXMgbmUgc29udCBwYXMgc2lnbmlmaWNhdGl2ZW1lbnQgZGlmZulyZW50cyBjb25jZXJuYW50IGxlIGJvbiB1c2FnZSBkZXMgYW50aWJpb3RpcXVlcy4NCg0KIyMgT2JqZWN0aWYgZGUgbCfpdHVkZQ0KDQpDZXR0ZSDpdHVkZSByZWNoZXJjaGUgbCdleGlzdGVuY2UgZCd1biBsaWVuIGVudHJlIGxlIHN0YXR1dCBkJ3VuIOl0YWJsaXNzZW1lbnQgZGUgc2FudOkgLSBwcml26SwgcHVibGljLCBwcml26SBwYXJ0aWNpcGFudCBhdSBzZXJ2aWNlIHB1YmxpYyBob3NwaXRhbGllciAoUFNQSCkgLSBldCBjZXJ0YWlucyBpbmRpY2F0ZXVycyBkZSBxdWFsaXTpIGV0IGRlIHPpY3VyaXTpLiBJbCBzJ2FnaXQgZW4gbCdvY2N1cnJlbmNlIGRlIHNjb3JlcyBsaelzIGF1eCBpbmZlY3Rpb25zIGFzc29jaellcyBhdXggc29pbnMgOiBkJ3VuZSBwYXJ0LCBsJ3VzYWdlIGRlcyBhbnRpYmlvdGlxdWVzIDsgZCdhdXRyZSBwYXJ0LCBsYSBjb25zb21tYXRpb24gZGUgc29sdXRpb25zIGh5ZHJvLWFsY29vbGlxdWVzIChoeWdp6G5lIGRlcyBtYWlucykuIA0KDQojIyBQbGFuIA0KDQoxLiBQculwYXJhdGlvbiBkZXMgZG9ubullcyA7DQoyLiBCb24gdXNhZ2UgZGVzIGFudGliaW90aXF1ZXMgOyANCjMuIENvbnNvbW1hdGlvbiBkZSBzb2x1dGlvbnMgaHlkcm8tYWxjb29saXF1ZXMuDQoNCiMjIDEuIFBy6XBhcmF0aW9uIGRlcyBkb25u6WVzDQoNCkxlcyBkb25u6WVzIG9udCDpdOkgbWlzZXMg4CBkaXNwb3NpdGlvbiBwYXIgbGEgSGF1dGUgQXV0b3JpdOkgZGUgU2FudOkgKEhBUykgc3VyIGxlIHNpdGUgZCdvdXZlcnR1cmUgZGVzIGRvbm7pZXMgcHVibGlxdWVzLiBFbGxlcyBjb25jZXJuZW50IGwnYW5u6WUgMjAxNy4gRWxsZXMgc29udCBhY2Nlc3NpYmxlcyDgIGwnYWRyZXNzZSBzdWl2YW50ZSwgYWluc2kgcXUndW4gZGljdGlvbm5haXJlIGRlcyB2YXJpYWJsZXMgOiBodHRwczovL3d3dy5kYXRhLmdvdXYuZnIvZnIvZGF0YXNldHMvaW5kaWNhdGV1cnMtZGUtcXVhbGl0ZS1ldC1kZS1zZWN1cml0ZS1kZXMtc29pbnMtaW5mZWN0aW9ucy1hc3NvY2llZXMtYXV4LXNvaW5zLXJlY3VlaWwtMjAxOC8gDQoNCkxhIHBy6XBhcmF0aW9uIGRlcyBkb25u6WVzIGltcGxpcXVlIGRlIHJldGlyZXIgZGVzIGNvbG9ubmVzIGRvdWJsb25zIG91IGludXRpbGVzIHBvdXIgbCdhbmFseXNlLCB0ZWxsZXMgcXVlIGRlcyBjb2xvbm5lcyBkJ2lkZW50aXTpLCBhaW5zaSBxdWUgZGVzIGxpZ25lcyBpbnV0aWxlcywgZW4gbCdvY2N1cnJlbmNlIGNlbGxlcyBwb3VyIGxlc3F1ZWxsZXMgbGEgdmFsZXVyIGRlcyBpbmRpY2F0ZXVycyBuJ2VzdCBwYXMgZGlzcG9uaWJsZS4gRGUgcGx1cywgY29tcHRlIHRlbnUgZHUgZmFpYmxlIG5vbWJyZSBkJ+l0YWJsaXNzZW1lbnRzIGVuIEd1eWFuZSwgaWwgYXBwYXJhaXQgbuljZXNzYWlyZSBkJ2FnculnZXIgZGFucyB1biBt6m1lIG5pdmVhdSBsZXMg6XRhYmxpc3NlbWVudHMgZCdvdXRyZS1tZXIgZCdBbelyaXF1ZS4gDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KHJlYWRyKQ0KbGlicmFyeShjYXJldCkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpyZXN1bHRhdHMgPC0gcmVhZF9kZWxpbSgicmVzdWx0YXRzLWlhcy1yZWN1ZWlsLTIwMTgtc3VyLWRvbm5lZXMtMjAxNy0xLmNzdiIsICI7IiwgDQogICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVfZG91YmxlID0gRkFMU0UsIGxvY2FsZSA9IGxvY2FsZShlbmNvZGluZyA9ICJJU08tODg1OS0xIiksIHRyaW1fd3MgPSBUUlVFKQ0KcmVzdWx0YXRzIDwtIGRhdGEuZnJhbWUocmVzdWx0YXRzKQ0KYGBgDQoNCmBgYHtyfQ0Kc3RyKHJlc3VsdGF0cykNCmBgYA0KDQpgYGB7cn0NCiMgcmV0aXJlciBkZXMgY29sb25uZXMgaW51dGlsZXMNCnJlc3VsdGF0cyRyYWlzb25fc29jaWFsZV8yMDE3IDwtIE5VTEwNCnJlc3VsdGF0cyRmaW5lc3MgPC0gTlVMTA0KcmVzdWx0YXRzJGNvbnRyb2xlX2ljYXRiMl8yMDE3IDwtIE5VTEwNCnJlc3VsdGF0cyRjb250cm9sZV9pY3NoYTNfMjAxNyA8LSBOVUxMDQpyZXN1bHRhdHMkY2xhc3NlX2ljc2hhM18yMDE3IDwtIE5VTEwNCnJlc3VsdGF0cyRjbGFzc2VfaWNhdGIyXzIwMTcgPC0gTlVMTA0KcmVzdWx0YXRzJGV2b2x1dGlvbl9pY2F0YjJfMjAxNyA8LSBOVUxMDQoNCiMgcmV0aXJlciBsZXMgbGlnbmVzIGludXRpbGVzDQpyZXN1bHRhdHMgPC0gZmlsdGVyKHJlc3VsdGF0cywgc2NvcmVfaWNhdGIyXzIwMTcgIT0gMCkgIyA1NjkgDQpyZXN1bHRhdHMgPC0gZmlsdGVyKHJlc3VsdGF0cywgc2NvcmVfaWNzaGEzXzIwMTcgIT0gMCkgIyA5IA0KDQpgYGANCg0KYGBge3J9DQpjb2xTdW1zKHNhcHBseShyZXN1bHRhdHMsIGlzLm5hKSkgIyBwYXMgZGUgdmFsZXVycyBtYW5xdWFudGVzDQpgYGANCg0KYGBge3J9DQpjYXQoIkxlIG5vbWJyZSBkZSBkb3VibG9ucyBzJ+ls6HZlIOAgOiAiLCBucm93KHJlc3VsdGF0cykgLSBucm93KHVuaXF1ZShyZXN1bHRhdHMpKSkgDQpyZXN1bHRhdHMgPC0gdW5pcXVlKHJlc3VsdGF0cykgIyByZXRpcmVyIGxlcyBkb3VibG9ucw0KYGBgDQoNCmBgYHtyfQ0KdGFibGUocmVzdWx0YXRzJHJlZ2lvbl8yMDE3KQ0KIyBSZWNvZGUgcmVzdWx0YXRzJHJlZ2lvbl8yMDE3DQpyZXN1bHRhdHMkcmVnaW9uXzIwMTdbcmVzdWx0YXRzJHJlZ2lvbl8yMDE3ID09ICJHdWFkZWxvdXBlIl0gPC0gIk91dHJlbWVyX0FtZXJpcXVlIg0KcmVzdWx0YXRzJHJlZ2lvbl8yMDE3W3Jlc3VsdGF0cyRyZWdpb25fMjAxNyA9PSAiTWFydGluaXF1ZSJdIDwtICJPdXRyZW1lcl9BbWVyaXF1ZSINCnJlc3VsdGF0cyRyZWdpb25fMjAxN1tyZXN1bHRhdHMkcmVnaW9uXzIwMTcgPT0gIkd1eWFuZSJdIDwtICJPdXRyZW1lcl9BbWVyaXF1ZSINCg0KdGFibGUocmVzdWx0YXRzJHJlZ2lvbl8yMDE3KQ0KDQpgYGANCg0KYGBge3J9DQpyZXN1bHRhdHMkdHlwZV9ldGFibGlzc2VtZW50XzIwMTcgPC0gZmFjdG9yKHJlc3VsdGF0cyR0eXBlX2V0YWJsaXNzZW1lbnRfMjAxNykNCnJlc3VsdGF0cyRzdGF0dXRfMjAxNyA8LSBmYWN0b3IocmVzdWx0YXRzJHN0YXR1dF8yMDE3KQ0KcmVzdWx0YXRzJHJlZ2lvbl8yMDE3IDwtIGZhY3RvcihyZXN1bHRhdHMkcmVnaW9uXzIwMTcpDQoNCmBgYA0KDQojIyAyLiBCb24gdXNhZ2UgZGVzIGFudGliaW90aXF1ZXMNCg0KRCdhcHLocyBsYSBIQVMsIGwnaW5kaWNhdGV1ciBkZSBib24gdXNhZ2UgZGVzIGFudGliaW90aXF1ZXMgdmVyc2lvbiAyIChJQ0FUQi4yKSAidOltb2lnbmUgZGUgbCdvcmdhbmlzYXRpb24gbWlzZSBlbiBwbGFjZSBkYW5zIGwn6XRhYmxpc3NlbWVudCBwb3VyIHByb21vdXZvaXIgbGUgYm9uIHVzYWdlIGRlcyBhbnRpYmlvdGlxdWVzLCBsZXMgbW95ZW5zIG1vYmlsaXPpcyBldCBsZXMgYWN0aW9ucyBtaXNlcyBlbiBvZXV2cmUiLiBMZSBzY29yZSBtYXhpbXVtIHBvdXZhbnQg6nRyZSBvYnRlbnUgZXN0IDEwMC4NCg0KIyMjIEEuIEV4cGxvcmF0aW9uIGRlcyBkb25u6WVzDQoNCkxlcyBncmFwaGlxdWVzIG1ldHRlbnQgZW4g6XZpZGVuY2UgbGVzIGVuc2VpZ25lbWVudHMgc3VpdmFudHMgOiANCg0KLSBsZXMg6XRhYmxpc3NlbWVudHMgb250IG9idGVudSBkZXMgc2NvcmVzIHRy6HMgZGlmZulyZW50cyBlbiAyMDE3LCBt6m1lIHNpIHBvdXIgcGx1cyBkZSBsYSBtb2l0aekgZCdlbnRyZSBldXggbGUgc2NvcmUgZXhj6GRlIDg5LzEwMCA7DQotIGxlcyBzY29yZXMgc29udCBzZW5zaWJsZW1lbnQgZGlmZulyZW50cyBlbiBmb25jdGlvbiBkdSBzdGF0dXQgZGUgbCfpdGFibGlzc2VtZW50IChwdWJsaWMsIHByaXbpLCBwcml26SBwYXJ0aWNpcGFudCBhdSBzZXJ2aWNlIHB1YmxpYyBob3NwaXRhbGllciksIGRlIGxhIHLpZ2lvbiBldCBkdSB0eXBlIGQn6XRhYmxpc3NlbWVudCAoaPRwaXRhbCBsb2NhbCwgQ0hVL0NIUiwgY2VudHJlIGRlIGx1dHRlIGNvbnRyZSBsZSBjYW5jZXIsIGV0Yy4pLg0KDQpgYGB7cn0NCnN1bW1hcnkocmVzdWx0YXRzJHNjb3JlX2ljYXRiMl8yMDE3KQ0KZ2dwbG90KGRhdGEgPSByZXN1bHRhdHMpICsNCiAgICAgICAgZ2d0aXRsZSgiU2NvcmUgb2J0ZW51IOAgbCdpbmRpY2F0ZXVyIGNvbXBvc2l0ZSBkZSBib24gdXNhZ2UgZGVzIGFudGliaW90aXF1ZXMiKSArDQogICAgICAgIGdlb21faGlzdG9ncmFtKG1hcHBpbmcgPSBhZXMoeCA9IHNjb3JlX2ljYXRiMl8yMDE3KSwgYmlucyA9IDcwKSArDQogICAgICAgIGxhYnMoeCA9ICJJbmRpY2F0ZXVyIGNvbXBvc2l0ZSBkZSBib24gdXNhZ2UgZGVzIGFudGliaW90aXF1ZXMiKQ0KDQpnZ3Bsb3QoZGF0YSA9IHJlc3VsdGF0cykgKw0KICAgICAgICBnZW9tX2JveHBsb3QobWFwcGluZyA9IGFlcyh4ID0gcmVnaW9uXzIwMTcsIHkgPSBzY29yZV9pY2F0YjJfMjAxNywgY29sb3IgPSBzdGF0dXRfMjAxNykpICsNCiAgICAgICAgbGFicyh0aXRsZSA9ICJCb24gdXNhZ2UgZGVzIGFudGliaW90aXF1ZXMgcGFyIHLpZ2lvbiIsIHggPSAiculnaW9uIikgKw0KICAgICAgICBjb29yZF9mbGlwKCkNCg0KZ2dwbG90KGRhdGEgPSByZXN1bHRhdHMpICsNCiAgICAgICAgZ2VvbV9ib3hwbG90KG1hcHBpbmcgPSBhZXMoeCA9IHR5cGVfZXRhYmxpc3NlbWVudF8yMDE3LCB5ID0gc2NvcmVfaWNhdGIyXzIwMTcpKSArDQogICAgICAgIGxhYnModGl0bGUgPSAiQm9uIHVzYWdlIGRlcyBhbnRpYmlvdGlxdWVzIHBhciB0eXBlIGQn6XRhYmxpc3NlbWVudCIsIHggPSAiVHlwZSBkJ+l0YWJsaXNzZW1lbnQiKSArDQogICAgICAgIGNvb3JkX2ZsaXAoKQ0KDQpnZ3Bsb3QoZGF0YSA9IHJlc3VsdGF0cykgKw0KICAgICAgICBnZW9tX2JveHBsb3QobWFwcGluZyA9IGFlcyh4ID0gc3RhdHV0XzIwMTcsIHkgPSBzY29yZV9pY2F0YjJfMjAxNykpICsNCiAgICAgICAgbGFicyh0aXRsZSA9ICJCb24gdXNhZ2UgZGVzIGFudGliaW90aXF1ZXMgcGFyIHN0YXR1dCIsIHggPSAic3RhdHV0IikgDQoNCmdncGxvdChkYXRhID0gcmVzdWx0YXRzKSArDQogICAgICAgIGdlb21fYm94cGxvdChtYXBwaW5nID0gYWVzKHggPSB0eXBlX2V0YWJsaXNzZW1lbnRfMjAxNywgeSA9IHNjb3JlX2ljYXRiMl8yMDE3LCBjb2xvciA9IHN0YXR1dF8yMDE3KSkgKw0KICAgICAgICBsYWJzKHRpdGxlID0gIkJvbiB1c2FnZSBkZXMgYW50aWJpb3RpcXVlcyBwYXIgdHlwZSBkJ+l0YWJsaXNzZW1lbnQiLCB4ID0gIlR5cGUgZCfpdGFibGlzc2VtZW50IikgKw0KICAgICAgICBjb29yZF9mbGlwKCkNCg0KDQpgYGANCg0KIyMjIEIuIE1vZOlsaXNhdGlvbiBkdSBsaWVuIGVudHJlIGxlIHN0YXR1dCBkZSBsJ+l0YWJsaXNzZW1lbnQgZXQgbGUgYm9uIHVzYWdlIGRlcyBhbnRpYmlvdGlxdWVzDQoNCkxhIHZhcmlhYmxlICpleHBsaWNhdGl2ZSogZCdpbnTpcup0IHBvdXIgY2V0dGUg6XR1ZGUgZXN0IHVuZSB2YXJpYWJsZSBkaXNjcuh0ZSwgbGUgKipzdGF0dXQganVyaWRpcXVlKiogZGUgbCfpdGFibGlzc2VtZW50LCBxdWkgcGV1dCBwcmVuZHJlIHRyb2lzIG1vZGFsaXTpcyA6IHB1YmxpYywgcHJpduksIHByaXbpIHBhcnRpY2lwYW50IGF1IFNQSC4gUGFyIGNvbnPpcXVlbnQsIGlsIG4nZXN0IHBhcyBqdWRpY2lldXggZGUgbGEgdHJhbnNmb3JtZXIgZW4gdHJvaXMgdmFyaWFibGVzIGJpbmFpcmVzIGNhciBjZWxhIGVudHJh7m5lcmFpdCB1biBwcm9ibOhtZSBkZSAqZOlwZW5kYW5jZSBsaW7pYWlyZSogZW50cmUgbCd1bmUgZGUgY2VzIG1vZGFsaXTpcyBldCBsZSBjb2VmZmljaWVudCBkJ2ludGVyY2VwdGlvbi4gQXUgY29udHJhaXJlLCBsYSBt6XRob2RlIGRlcyBtb2luZHJlcyBjYXJy6XMgcmVxdWllcnQsIG5vdGFtbWVudCwgbCdpbmTpcGVuZGFuY2UgZW50cmUgbGVzIHZhcmlhYmxlcyBleHBsaWNhdGl2ZXMuIA0KDQpTYW5zIGNy6WF0aW9uIGRlIHZhcmlhYmxlIGJpbmFpcmUsIGlsIG4nZXN0IHBhcyBwb3NzaWJsZSBkZSBjYWxjdWxlciBsZXMgY29lZmZpY2llbnRzIGFzc29jaelzIOAgY2hhY3VuZSBkZXMgbW9kYWxpdOlzIGRlIGxhIHZhcmlhYmxlICJzdGF0dXQganVyaWRpcXVlIiBlbiBt6m1lIHRlbXBzLiBMZSBjYWxjdWwgZXN0IGRvbmMgculhbGlz6SDgIHRyb2lzIHJlcHJpc2VzIGFmaW4gcXUn4CBjaGFxdWUgZm9pcywgbGVzIGNvZWZmaWNpZW50cyBkZSBkZXV4IGRlcyB0cm9pcyBtb2RhbGl06XMgc29pZW50IGNhbGN1bOlzIHRhbmRpcyBxdWUgbGEgdHJvaXNp6G1lIGVzdCBlbiBxdWVscXVlIHNvcnRlIGluY2x1c2UgZGFucyBsJ2ludGVyY2VwdGlvbi4gTGUgY29lZmZpY2llbnQgZGUgY2hhY3VuZSBkZXMgdHJvaXMgbW9kYWxpdOlzIGVzdCBjYWxjdWzpIOAgZGV1eCByZXByaXNlcywgY2UgcXVpIGRvbm5lIHVuIG9yZHJlIGRlIGdyYW5kZXVyIGRlIHNhIHZhbGV1ciBwcm9iYWJsZS4gDQoNCkxlIGpldSBkZSBkb25u6WVzIHBlcm1ldCBkZSBjb250cvRsZXIgcG91ciBsZSAqdHlwZSBkJ+l0YWJsaXNzZW1lbnQqICho9HBpdGFsIGxvY2FsLCBDSFIvQ0hVLCBzb2lucyBkZSBsb25ndWUgZHVy6WUsIGV0Yy4pIGV0IHNhICpy6Wdpb24qIGQnaW1wbGFudGF0aW9uLiBEdSByZXN0ZSwgb24gYXBwbGlxdWUgbCdoeXBvdGjoc2UgInRvdXRlcyBjaG9zZXMg6WdhbGVzIHBhciBhaWxsZXVycyIuIA0KDQpDb25jZXJuYW50IGxlICoqYm9uIHVzYWdlIGRlcyBhbnRpYmlvdGlxdWVzKiosIGxlcyBjYWxjdWxzIGZvbnQgYXBwYXJh7nRyZSBsZXMgculzdWx0YXRzIHN1aXZhbnRzIDoNCg0KLSBsZSBzdGF0dXQgcHVibGljIGQndW4g6XRhYmxpc3NlbWVudCBlc3QgYXNzb2Np6SDgIHVuIHNjb3JlIGluZulyaWV1ciBlbnRyZSAxIGV0IDMgcG9pbnRzIGVudmlyb24gKHN1ciAxMDApIHBhciByYXBwb3J0IGF1eCBkZXV4IGF1dHJlcyBzdGF0dXRzLiBDZXBlbmRhbnQsIGxhIHNpZ25pZmljYXRpdml06SBzdGF0aXN0aXF1ZSBkZSBjZSBy6XN1bHRhdCBlc3QgZmFpYmxlIDsNCi0gbGUgc3RhdHV0IHByaXbpIGVzdCBhc3NvY2npIOAgdW4gc2NvcmUgc3Vw6XJpZXVyIGRlIDEuNSDgIDMgcG9pbnRzIGVudmlyb24gcGFyIHJhcHBvcnQgYXV4IGRldXggYXV0cmVzIHN0YXR1dHMuIEzgIGVuY29yZSwgbGEgc2lnbmlmaWNhdGl2aXTpIHN0YXRpc3RpcXVlIHMnYXbocmUgZmFpYmxlIDsNCi0gbGUgc3RhdHV0IGRlIFBTUEggbidlc3QgcGFzIGFzc29jaekg4CB1biBzY29yZSBzaWduaWZpY2F0aXZlbWVudCBkaWZm6XJlbnQgZGUgMCA6IGF1dHJlbWVudCBkaXQsIG9uIG5lIHBldXQgcGFzIHJlamV0ZXIgbCdoeXBvdGjoc2UgbnVsbGUgc2Vsb24gbGFxdWVsbGUgbGUgZmFpdCBkZSByZWxldmVyIGR1IHN0YXR1dCBkZSBQU1BIIG4nYSBwYXMgZGUgbGllbiBhdmVjIGxlIHNjb3JlIGR1IGJvbiB1c2FnZSBkJ2FudGliaW90aXF1ZXMuDQoNCg0KYGBge3J9DQogICAgICAgICMgUFNQSCBldCBwdWJsaWMNCm1vZGVsX2ljYXRiMiA8LSB0cmFpbihzY29yZV9pY2F0YjJfMjAxNyB+IHR5cGVfZXRhYmxpc3NlbWVudF8yMDE3ICsgc3RhdHV0XzIwMTcgKyByZWdpb25fMjAxNywgDQogICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHJlc3VsdGF0cywgbWV0aG9kID0gImxtIikNCnN1bW1hcnkobW9kZWxfaWNhdGIyKQ0KDQpgYGANCg0KYGBge3J9DQojIFByaXbpIGV0IHB1YmxpYw0KDQojIyBS6W9yZG9ubmFuY2VtZW50IGRlIHJlc3VsdGF0cyRzdGF0dXRfMjAxNw0KcmVzdWx0YXRzJHN0YXR1dF8yMDE3IDwtIGZhY3RvcihyZXN1bHRhdHMkc3RhdHV0XzIwMTcsIGxldmVscz1jKCJQU1BIIiwgIlByaXZlIiwgIlB1YmxpYyIpKQ0KDQptb2RlbF8yX2ljYXRiMiA8LSB0cmFpbihzY29yZV9pY2F0YjJfMjAxNyB+IHR5cGVfZXRhYmxpc3NlbWVudF8yMDE3ICsgc3RhdHV0XzIwMTcgKyByZWdpb25fMjAxNywgDQogICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gcmVzdWx0YXRzLCBtZXRob2QgPSAibG0iKQ0Kc3VtbWFyeShtb2RlbF8yX2ljYXRiMikNCg0KYGBgDQoNCg0KYGBge3J9DQogICAgICAgICMgUHJpdukgZXQgUFNQSA0KDQojIyBS6W9yZG9ubmFuY2VtZW50IGRlIHJlc3VsdGF0cyRzdGF0dXRfMjAxNw0KcmVzdWx0YXRzJHN0YXR1dF8yMDE3IDwtIGZhY3RvcihyZXN1bHRhdHMkc3RhdHV0XzIwMTcsIGxldmVscz1jKCJQdWJsaWMiLCAiUFNQSCIsICJQcml2ZSIpKQ0KbW9kZWxfM19pY2F0YjIgPC0gdHJhaW4oc2NvcmVfaWNhdGIyXzIwMTcgfiB0eXBlX2V0YWJsaXNzZW1lbnRfMjAxNyArIHN0YXR1dF8yMDE3ICsgcmVnaW9uXzIwMTcsIA0KICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHJlc3VsdGF0cywgbWV0aG9kID0gImxtIikNCnN1bW1hcnkobW9kZWxfM19pY2F0YjIpDQoNCg0KYGBgDQoNClVuZSBhdXRyZSBt6XRob2RlIHBvc3NpYmxlIGVzdCBkJ2FnculnZXIgZGFucyB1biBt6m1lIG5pdmVhdSBsZXMg6XRhYmxpc3NlbWVudHMgcHVibGljcyBldCBsZXMg6XRhYmxpc3NlbWVudHMgcHJpdulzIHBhcnRpY2lwYW50IGF1IFNQSCwgYWZpbiBkJ29idGVuaXIsIGF1IHJlZ2FyZCBkdSBzdGF0dXQsIHVuZSAqKm9wcG9zaXRpb24gYmluYWlyZSBlbnRyZSBzZXJ2aWNlIHB1YmxpYyBldCBzZWN0ZXVyIHByaXbpKiouIElsIGFwcGFyYWl0IGTocyBsb3JzIHF1ZSBsZSAqKnN0YXR1dCBwcml26SoqLCB0b3V0ZXMgY2hvc2VzIOlnYWxlcyBwYXIgYWlsbGV1cnMsIGVzdCBhc3NvY2npIOAgdW4gc2NvcmUgbOln6HJlbWVudCBzdXDpcmlldXIg4CBjZWx1aSBkdSBzZXJ2aWNlIHB1YmxpYywgZGUgbCdvcmRyZSBkZSArMS43IHBvaW50IChzdXIgMTAwKS4gQ2VwZW5kYW50LCBsYSBzaWduaWZpY2F0aXZpdOkgc3RhdGlzdGlxdWUgZGUgY2UgculzdWx0YXQgZXN0IGZhaWJsZS4gDQoNCmBgYHtyfQ0KICAgICAgICAjIFNlcnZpY2UgcHVibGljIGV0IHByaXbpDQpyZXN1bHRhdHNfMiA8LSByZXN1bHRhdHMNCg0KICAgICAgICAgICAgICAgICMgUmVjb2RhZ2UgZGUgcmVzdWx0YXRzXzIkc3RhdHV0XzIwMTcNCnJlc3VsdGF0c18yJHN0YXR1dF8yMDE3IDwtIGZjdF9yZWNvZGUocmVzdWx0YXRzXzIkc3RhdHV0XzIwMTcsDQogICAgICAgICAgICAgICAiU1AiID0gIlB1YmxpYyIsDQogICAgICAgICAgICAgICAiU1AiID0gIlBTUEgiKQ0KDQptb2RlbF9TUF9wcml2ZV9pY2F0YjIgPC0gdHJhaW4oc2NvcmVfaWNhdGIyXzIwMTcgfiB0eXBlX2V0YWJsaXNzZW1lbnRfMjAxNyArIHN0YXR1dF8yMDE3ICsgcmVnaW9uXzIwMTcsIA0KICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHJlc3VsdGF0c18yLCBtZXRob2QgPSAibG0iKQ0Kc3VtbWFyeShtb2RlbF9TUF9wcml2ZV9pY2F0YjIpDQoNCg0KYGBgDQoNCg0KIyMgMy4gQ29uc29tbWF0aW9uIGRlIHNvbHV0aW9ucyBoeWRyby1hbGNvb2xpcXVlcw0KDQpMJ2luZGljYXRldXIgZGUgY29uc29tbWF0aW9uIGRlIHNvbHV0aW9ucyBoeWRyby1hbGNvb2xpcXVlcyAoSUNTSEEuMykgZXN0ICJ1biBtYXJxdWV1ciBpbmRpcmVjdCBkZSBsYSBtaXNlIGVuIG9ldXZyZSBlZmZlY3RpdmUgZGUgbCdoeWdp6G5lIGRlcyBtYWlucyIuIEwndXNhZ2UgZGUgY2VzIHNvbHV0aW9ucyBwZXJtZXQgZGUgculkdWlyZSBsZSByaXNxdWUgZCdpbmZlY3Rpb24gZXQgZGUgZGlzc+ltaW5hdGlvbiBkZSBiYWN06XJpZXMuIEwnaW5kaWNhdGV1ciBuJ2VzdCBwYXMgbGltaXTpIOAgMTAwLCBjb250cmFpcmVtZW50IGF1IGJvbiB1c2FnZSBkZXMgYW50aWJpb3RpcXVlcy4NCg0KIyMjIEEuIEV4cGxvcmF0aW9uIGRlcyBkb25u6WVzDQoNCkwnZXhwbG9yYXRpb24gZGVzIGRvbm7pZXMgZmFpdCBhcHBhcmHudHJlIGxlcyBjb25zdGF0cyBzdWl2YW50cyA6DQoNCi0gc2kgbCfpdGVuZHVlIGRlcyBkb25u6WVzIGVzdCB0cuhzIOlsZXbpZSAoZGUgMTAg4CAzNTkpLCBjJ2VzdCBwcmluY2lwYWxlbWVudCBlbiByYWlzb24gZGUgbGEgcHLpc2VuY2UgZGUgKipxdWVscXVlcyB2YWxldXJzIHRy6HMgZGl2ZXJnZW50ZXMqKiAoZW4gcGFydGljdWxpZXIgbGUgbWF4aW11bSwgaXNvbOkg4CAzNTkpLCB0YW5kaXMgcXVlIGxhIG1vaXRp6SBkZXMgb2JzZXJ2YXRpb25zIHNvbnQgY29tcHJpc2VzIGVudHJlIDU0IGV0IDg2IDsNCi0gY29tbWUgcG91ciBsZSBib24gdXNhZ2UgZGVzIGFudGliaW90aXF1ZXMsIGxlcyBzY29yZXMgZGlmZuhyZW50IHNlbnNpYmxlbWVudCBzZWxvbiBsZSBzdGF0dXQganVyaWRpcXVlLCBsYSBy6Wdpb24gZXQgbGUgdHlwZSBkJ+l0YWJsaXNzZW1lbnQuDQoNCmBgYHtyfQ0KIyBjb25zb21tYXRpb24gZGUgc29sdXRpb25zIGh5ZHJvLWFsY29vbGlxdWVzDQpzdW1tYXJ5KHJlc3VsdGF0cyRzY29yZV9pY3NoYTNfMjAxNykNCmdncGxvdChkYXRhID0gcmVzdWx0YXRzKSArDQogICAgICAgIGdndGl0bGUoIlNjb3JlIG9idGVudSDgIGwnaW5kaWNhdGV1ciBkZSBjb25zb21tYXRpb24gZGUgc29sdXRpb25zIGh5ZHJvLWFsY29vbGlxdWVzIikgKw0KICAgICAgICBnZW9tX2hpc3RvZ3JhbShtYXBwaW5nID0gYWVzKHggPSBzY29yZV9pY3NoYTNfMjAxNyksIGJpbnMgPSA3MCkgKyAjIG9uZSBpbXBvcnRhbnQgb3V0bGllciAobWF4aW11bSkNCiAgICAgICAgbGFicyh4ID0gIkluZGljYXRldXIgZGUgY29uc29tbWF0aW9uIGRlIHNvbHV0aW9ucyBoeWRyby1hbGNvb2xpcXVlcyIpDQoNCmdncGxvdChkYXRhID0gcmVzdWx0YXRzKSArDQogICAgICAgIGdlb21fYm94cGxvdChtYXBwaW5nID0gYWVzKHggPSByZWdpb25fMjAxNywgeSA9IHNjb3JlX2ljc2hhM18yMDE3LCBjb2xvciA9IHN0YXR1dF8yMDE3KSkgKw0KICAgICAgICBsYWJzKHRpdGxlID0gIkluZGljYXRldXIgZGUgY29uc29tbWF0aW9uIGRlIHNvbHV0aW9ucyBoeWRyby1hbGNvb2xpcXVlcyBwYXIgculnaW9uIiwgeCA9ICJy6Wdpb24iKSArDQogICAgICAgIGNvb3JkX2ZsaXAoKQ0KDQpnZ3Bsb3QoZGF0YSA9IHJlc3VsdGF0cykgKw0KICAgICAgICBnZW9tX2JveHBsb3QobWFwcGluZyA9IGFlcyh4ID0gdHlwZV9ldGFibGlzc2VtZW50XzIwMTcsIHkgPSBzY29yZV9pY3NoYTNfMjAxNykpICsNCiAgICAgICAgbGFicyh0aXRsZSA9ICJJbmRpY2F0ZXVyIGRlIGNvbnNvbW1hdGlvbiBkZSBzb2x1dGlvbnMgaHlkcm8tYWxjb29saXF1ZXMgcGFyIHR5cGUgZCfpdGFibGlzc2VtZW50IiwgeCA9ICJUeXBlIGQn6XRhYmxpc3NlbWVudCIpICsNCiAgICAgICAgY29vcmRfZmxpcCgpDQoNCmdncGxvdChkYXRhID0gcmVzdWx0YXRzKSArDQogICAgICAgIGdlb21fYm94cGxvdChtYXBwaW5nID0gYWVzKHggPSBzdGF0dXRfMjAxNywgeSA9IHNjb3JlX2ljc2hhM18yMDE3KSkgKw0KICAgICAgICBsYWJzKHRpdGxlID0gIkluZGljYXRldXIgZGUgY29uc29tbWF0aW9uIGRlIHNvbHV0aW9ucyBoeWRyby1hbGNvb2xpcXVlcyBwYXIgc3RhdHV0IiwgeCA9ICJzdGF0dXQiKSANCg0KZ2dwbG90KGRhdGEgPSByZXN1bHRhdHMpICsNCiAgICAgICAgZ2VvbV9ib3hwbG90KG1hcHBpbmcgPSBhZXMoeCA9IHR5cGVfZXRhYmxpc3NlbWVudF8yMDE3LCB5ID0gc2NvcmVfaWNzaGEzXzIwMTcsIGNvbG9yID0gc3RhdHV0XzIwMTcpKSArDQogICAgICAgIGxhYnModGl0bGUgPSAiSW5kaWNhdGV1ciBkZSBjb25zb21tYXRpb24gZGUgc29sdXRpb25zIGh5ZHJvLWFsY29vbGlxdWVzIHBhciB0eXBlIGQn6XRhYmxpc3NlbWVudCIsIHggPSAiVHlwZSBkJ+l0YWJsaXNzZW1lbnQiKSArDQogICAgICAgIGNvb3JkX2ZsaXAoKQ0KYGBgDQoNCiMjIyBCLiBNb2TpbGlzYXRpb24gZHUgbGllbiBlbnRyZSBsZSBzdGF0dXQgZGUgbCfpdGFibGlzc2VtZW50IGV0IGxhIGNvbnNvbW1hdGlvbiBkZSBzb2x1dGlvbnMgaHlkcm8tYWxjb29saXF1ZXMNCg0KTGEgbel0aG9kb2xvZ2llIGVtcGxveellIGRhbnMgY2V0dGUgcGFydGllIGVzdCBpZGVudGlxdWUg4CBjZWxsZSBjb25jZXJuYW50IGxlIGJvbiB1c2FnZSBkZXMgYW50aWJpb3RpcXVlcyAodm9pciAyLkIpLg0KDQpMZXMgY2FsY3VscyBwZXJtZXR0ZW50IGRlIGRyZXNzZXIgbGVzIGNvbnN0YXRzIHN1aXZhbnRzIHJlbGF0aWZzIOAgbGEgY29uc29tbWF0aW9uIGRlIHNvbHV0aW9ucyBoeWRyby1hbGNvb2xpcXVlcyA6DQoNCi0gbGUgKipzdGF0dXQgcHVibGljKiogZGUgbCfpdGFibGlzc2VtZW50IGVzdCB0cuhzIHNpZ25pZmljYXRpdmVtZW50IGFzc29jaekg4CB1biBzY29yZSBwbHVzIGZhaWJsZSBxdWUgbGVzIGRldXggYXV0cmVzIHN0YXR1dHMsIGRlIGwnb3JkcmUgZGUgLTkg4CAtMTQgcG9pbnRzIChwb3VyIG3pbW9pcmUsIGxlIHNjb3JlIG1heGltdW0gbidlc3QgcGFzIGJvcm7pIOAgMTAwIHBvdXIgY2V0IGluZGljYXRldXIpIDsNCi0gbGUgKipzdGF0dXQgcHJpdukqKiBkZSBsJ+l0YWJsaXNzZW1lbnQgZXN0IHRy6HMgc2lnbmlmaWNhdGl2ZW1lbnQgYXNzb2Np6SDgIHVuIHNjb3JlIHBsdXMg6WxldukgcXVlIGxlcyBkZXV4IGF1dHJlcyBzdGF0dXRzLCBkZSBsJ29yZHJlIGRlICs1IOAgKzE0IHBvaW50cyA7DQotIGxlICoqc3RhdHV0IFBTUEgqKiBkZSBsJ+l0YWJsaXNzZW1lbnQgZXN0IHBsdXMgZGlmZmljaWxlIGQnaW50ZXJwcul0YXRpb24gOiB0cuhzIHBvc2l0aWYgc2kgbCdvbiBjb250cvRsZSBkaXJlY3RlbWVudCBwb3VyIGxlIHN0YXR1dCBwcml26SwgbulnYXRpZiBzaSBsJ29uIGNvbnRy9GxlIGRpcmVjdGVtZW50IHBvdXIgbGUgc3RhdHV0IHB1YmxpYy4gDQoNCmBgYHtyfQ0KICAgICAgICAjIHB1YmxpYyBldCBQU1BIDQoNCiMjIFLpb3Jkb25uYW5jZW1lbnQgZGUgcmVzdWx0YXRzJHN0YXR1dF8yMDE3DQpyZXN1bHRhdHMkc3RhdHV0XzIwMTcgPC0gZmFjdG9yKHJlc3VsdGF0cyRzdGF0dXRfMjAxNywgbGV2ZWxzPWMoIlByaXZlIiwgIlB1YmxpYyIsICJQU1BIIikpDQoNCm1vZGVsXzFfaWNzaGEzIDwtIHRyYWluKHNjb3JlX2ljc2hhM18yMDE3IH4gdHlwZV9ldGFibGlzc2VtZW50XzIwMTcgKyBzdGF0dXRfMjAxNyArIHJlZ2lvbl8yMDE3LCANCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSByZXN1bHRhdHMsIG1ldGhvZCA9ICJsbSIpDQpzdW1tYXJ5KG1vZGVsXzFfaWNzaGEzKQ0KDQpgYGANCg0KYGBge3J9DQogICAgICAgICMgcHJpdukgZXQgcHVibGljDQoNCiMjIFLpb3Jkb25uYW5jZW1lbnQgZGUgcmVzdWx0YXRzJHN0YXR1dF8yMDE3DQpyZXN1bHRhdHMkc3RhdHV0XzIwMTcgPC0gZmFjdG9yKHJlc3VsdGF0cyRzdGF0dXRfMjAxNywgbGV2ZWxzPWMoIlBTUEgiLCAiUHJpdmUiLCAiUHVibGljIikpDQoNCm1vZGVsXzJfaWNzaGEzIDwtIHRyYWluKHNjb3JlX2ljc2hhM18yMDE3IH4gdHlwZV9ldGFibGlzc2VtZW50XzIwMTcgKyBzdGF0dXRfMjAxNyArIHJlZ2lvbl8yMDE3LCANCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSByZXN1bHRhdHMsIG1ldGhvZCA9ICJsbSIpDQpzdW1tYXJ5KG1vZGVsXzJfaWNzaGEzKQ0KDQpgYGANCg0KDQpgYGB7cn0NCiAgICAgICAgIyBQU1BIIGV0IHByaXbpDQojIyBS6W9yZG9ubmFuY2VtZW50IGRlIHJlc3VsdGF0cyRzdGF0dXRfMjAxNw0KcmVzdWx0YXRzJHN0YXR1dF8yMDE3IDwtIGZhY3RvcihyZXN1bHRhdHMkc3RhdHV0XzIwMTcsIGxldmVscz1jKCJQdWJsaWMiLCAiUFNQSCIsICJQcml2ZSIpKQ0KDQptb2RlbF8zX2ljc2hhMyA8LSB0cmFpbihzY29yZV9pY3NoYTNfMjAxNyB+IHR5cGVfZXRhYmxpc3NlbWVudF8yMDE3ICsgc3RhdHV0XzIwMTcgKyByZWdpb25fMjAxNywgDQogICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHJlc3VsdGF0cywgbWV0aG9kID0gImxtIikNCnN1bW1hcnkobW9kZWxfM19pY3NoYTMpDQoNCmBgYA0KDQpEZSBt6m1lIHF1ZSBwb3VyIGxlIGJvbiB1c2FnZSBkZXMgYW50aWJpb3RpcXVlcyAoMi5CKSwgaWwgZXN0IHBvc3NpYmxlIGQnb3Bwb3NlciBkZSBtYW5p6HJlIGJpbmFpcmUgbGUgc3RhdHV0IHByaXbpIGZhY2UgYXUgc2VydmljZSBwdWJsaWMuIElsIGFwcGFyYWl0IHF1ZSBsZSAqKnN0YXR1dCBwcml26SBlc3QgdHLocyBzaWduaWZpY2F0aXZlbWVudCBhc3NvY2npIOAgdW4gbWVpbGxldXIgc2NvcmUqKiwgdG91dGVzIGNob3NlcyDpZ2FsZXMgcGFyIGFpbGxldXJzLCBkZSBsJ29yZHJlIGRlICs2IHBvaW50cy4gQ2UgculzdWx0YXQgY29uZm9ydGUgbGVzIHBy6WPpZGVudHMgcG91ciBhZmZpcm1lciBxdSdpbCBleGlzdGUgdW5lIHLpZWxsZSBkaWZm6XJlbmNlIGVudHJlIGxlcyDpdGFibGlzc2VtZW50cyBzZWxvbiBsZXVyIHN0YXR1dCBqdXJpZGlxdWUgZW4gY2UgcXVpIGNvbmNlcm5lIGxhIGNvbnNvbW1hdGlvbiBkZSBzb2x1dGlvbnMgaHlkcm8tYWxjb29saXF1ZXMuDQoNCmBgYHtyfQ0KbW9kZWxfU1BfcHJpdmVfaWNzaGEzIDwtIHRyYWluKHNjb3JlX2ljc2hhM18yMDE3IH4gdHlwZV9ldGFibGlzc2VtZW50XzIwMTcgKyBzdGF0dXRfMjAxNyArIHJlZ2lvbl8yMDE3LCANCiAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gcmVzdWx0YXRzXzIsIG1ldGhvZCA9ICJsbSIpDQpzdW1tYXJ5KG1vZGVsX1NQX3ByaXZlX2ljc2hhMykNCmBgYA0KDQojIyBDb25jbHVzaW9uDQoNCkxlcyBy6XN1bHRhdHMgb2J0ZW51cyBtZXR0ZW50IGVuIOl2aWRlbmNlIGRlcyBzY29yZXMgcGx1dPR0IG1laWxsZXVycyBwb3VyIGxlcyDpdGFibGlzc2VtZW50cyBzb3VzIHN0YXR1dCBwcml26SBwYXIgcmFwcG9ydCBhdSBzdGF0dXQgcHVibGljIG91IGF1IHN0YXR1dCBwcml26SBwYXJ0aWNpcGFudCBhdSBzZXJ2aWNlIHB1YmxpYyBob3NwaXRhbGllciBwb3VyIGxhIHBlcmZvcm1hbmNlIHJlbGF0aXZlIOAgbGEgY29uc29tbWF0aW9uIGRlIHNvbHV0aW9ucyBoeWRyby1hbGNvb2xpcXVlcyAoMy5CKS4gRW4gcmV2YW5jaGUsIGlsIG4nZXN0IHBhcyBhcHBhcnUgcG9zc2libGUgZGUgZGlzdGluZ3VlciBsYSBwZXJmb3JtYW5jZSBkZXMg6XRhYmxpc3NlbWVudHMgZW4gZm9uY3Rpb24gZGUgbGV1ciBzdGF0dXQgY29uY2VybmFudCBsZSBib24gdXNhZ2UgZGVzIGFudGliaW90aXF1ZXMgKDIuQikuIFVuZSBleHBsaWNhdGlvbiBwb3NzaWJsZSB2aWVudCBkZSBsYSBkaWZm6XJlbmNlIGRlIG1lc3VyZSBlbnRyZSBsZXMgZGV1eCBpbmRpY2F0ZXVycyA6IGxlIHNjb3JlIHJlbGF0aWYg4CBsJ3VzYWdlIGRlcyBhbnRpYmlvdGlxdWVzIOl0YW50IGJvcm7pIOAgMTAwLCBldCBwbHVzIGRlIGxhIG1vaXRp6SBkZXMgdmFsZXVycyDpdGFudCBjb21wcmlzZSBlbnRyZSA4OSBldCAxMDAsIGlsIGVzdCBwbHVzIGRpZmZpY2lsZSBkJ29ic2VydmVyIGRlcyDpY2FydHMgbm90YWJsZXMgcXVlIHBvdXIgbGUgc2NvcmUgcmVsYXRpZiDgIGwnaHlnaehuZSBkZXMgbWFpbnMsIGRvbnQgbGVzIHZhbGV1cnMgc29udCBzZW5zaWJsZW1lbnQgcGx1cyBkaXNwZXJz6WVzLg0KDQpFbiB0b3V0IOl0YXQgZGUgY2F1c2UsIGlsIGNvbnZpZW50IGRlIHJhcHBlbGVyIHF1ZSBjZXMgculzdWx0YXRzIG5lIHBlcm1ldHRlbnQgcGFzIGQnYWZmaXJtZXIgc2FucyBhdWN1biBkb3V0ZSBsJ2V4aXN0ZW5jZSBkJ3VuZSByZWxhdGlvbiBkZSBjYXVzYWxpdOkgZW50cmUgbGUgc3RhdHV0IGQndW4g6XRhYmxpc3NlbWVudCBldCBzZXMgc2NvcmVzIGRlIHBlcmZvcm1hbmNlcyBlbiByYWlzb24gZGVzIGxpbWl0ZXMgbel0aG9kb2xvZ2lxdWVzIHBvdXZhbnQgYmlhaXNlciBsZXMgculzdWx0YXRzLiANCg0K