I. Analyse descriptive

Justification

L’analyse descriptive permet de comprendre la distribution et les caractéristiques générales des données, offrant ainsi un aperçu préliminaire des tendances et des associations potentielles entre les variables étudiées.

fastggplot <- function(data, x_var, title, x_label, y_label) {
  # Calcul des fréquences
  freq_data <- data %>%
    count(.data[[x_var]]) %>%
    mutate(percentage = n / sum(n) * 100)  # Calcul des pourcentages
  
  ggplot(data, aes(x = factor(.data[[x_var]]), fill = factor(.data[[x_var]]))) +
    geom_bar(color = "black", alpha = 0.8) +
    geom_label(data = freq_data, aes(x = factor(.data[[x_var]]), y = n + 1, label = paste0(round(percentage, 1), "%")), 
               position = position_dodge(width = 0.8), size = 5, color = "black", fontface = "bold", fill = "white", label.padding = unit(0.2, "lines")) +
    labs(title = title, x = x_label, y = y_label, fill = x_var) +
    theme_minimal() +
    theme(axis.text = element_text(size = 12),
          axis.title = element_text(size = 14, face = "bold"),
          plot.title = element_text(size = 16, face = "bold"))
}

a. Répartion des étudiants en fonction de la bourse

Boursier <- fastggplot(data, "Boursier", "Répartition en fonction de la bourse", "", "Nombre d'occurence")
Boursier

b. Répartion des étudiants en fonction du sexe

Sexe <- fastggplot(data, "Sexe", "Répartition homme femme", "", "Nombre de cas")
Sexe <- Sexe + theme(axis.text.x = element_text(angle = 45, hjust = 1))
Sexe

c. Répartion des étudiants en fonction de la catégorie socio-professionnele du parent 1

PCS_Parent1 <- fastggplot(data, "PCS_Parent1", "Catégorie socio-professionnelle du parent 1", "", "Nombre d'occurence")
PCS_Parent1 <- PCS_Parent1 + theme(axis.text.x = element_text(angle = 45, hjust = 1))
PCS_Parent1

d. Répartion des étudiants en fonction de la bourse

PCS_Parent2 = fastggplot(data, "PCS_Parent2", "Catégorie socio-professionnelle du parent 2", "", "Nombre d'occurence")
PCS_Parent2 <- PCS_Parent2 + theme(axis.text.x = element_text(angle = 45, hjust = 1))
PCS_Parent2

e.Répartion des étudiants en fonction du bac

Bac = fastggplot(data, "Bac_Groupe", "Bac", "", "Nombre d'occurence")
Bac <- Bac + theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 7))
Bac

f. Répartion de la mention des étudiants au Bac


Bac_Mention = fastggplot(data, "Bac_Mention", "Mention au Bac", "", "Nombre d'occurence")
Bac_Mention <- Bac_Mention + theme(axis.text.x = element_text(angle = 45, hjust = 1))
Bac_Mention 

g. Intitulé d’étude en 2023-2024

note2023 = fastggplot(data, "2023", "Intitulé d'étude en 2023-2024", "", "Nombre d'occurence")
note2023 <- note2023 +theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 7))
note2023

h. Résultat des étudiants en 2023-2024

Resultat2023 = fastggplot(data, "Resultat", "Résultat 2023", "", "Nombre d'occurence")
Resultat2023 <- Resultat2023 + theme(axis.text.x = element_text(angle = 45, hjust = 1))
Resultat2023

i. Intitulé de formation en 2024-2025


Formation2024 = fastggplot(data, "2024", "Formation 2024-2025", "", "Nombre d'occurence")
Formation2024 <- Formation2024 + theme(axis.text.x = element_text(angle = 45, hjust = 1))
Formation2024

j. Moyenne générale des étudiants en 2023-2024

# Histogramme amélioré pour la variable Note
library(ggplot2)

noted = ggplot(data, aes(x = Note)) +
  geom_histogram(binwidth = 1, fill = "#69b3a2", color = "white", alpha = 0.8) +
  labs(
    title = "Distribution des Notes",
    x = "Note",
    y = "Fréquence"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 18, face = "bold", color = "#2a3d3f"),
    axis.title = element_text(size = 14, face = "bold", color = "#2a3d3f"),
    axis.text = element_text(size = 12, color = "#2a3d3f"),
    panel.grid.major = element_line(color = "#d3d3d3"),
    panel.grid.minor = element_blank()
  )
noted

II. Analyse inférentielle

L’analyse inférentielle entre les notes et les autres variables vise à déterminer si des facteurs comme le statut de boursier, le sexe, la catégorie socioprofessionnelle des parents, ou les mentions au bac influencent les résultats académiques.

a. Sexe et notes


# Effectuer le test t de Student entre Sexe et Note
t_test_result10 <- t.test(Note ~ Boursier, data = data, var.equal = TRUE)

# Extraire la p-value du test
p_value10 <- t_test_result1$p.value

# Créer un boxplot et ajouter la p-value sur le graphique
library(ggplot2)

ggplot(data, aes(x = Sexe, y = Note, fill = Sexe)) +
  geom_boxplot(color = "black", alpha = 0.6) +
  labs(title = "Comparaison des notes selon le sexe",
       x = "Sexe", y = "Note") +
  theme_minimal() +
  theme(axis.text = element_text(size = 12),
        axis.title = element_text(size = 14, face = "bold"),
        plot.title = element_text(size = 16, face = "bold")) +
  # Ajouter la p-value sur le graphique
  annotate("text", x = 1.5, y = max(data$Note, na.rm = TRUE), 
           label = paste("p-value =", round(p_value10, 4)), 
           size = 5, color = "red", fontface = "bold")

b. Bourse et notes


# Effectuer le test t de Student entre Boursier et Note
t_test_result1 <- t.test(Note ~ Boursier, data = data)

# Extraire la p-value du test
p_value1 <- t_test_result1$p.value

# Créer un boxplot et ajouter la p-value sur le graphique
library(ggplot2)

ggplot(data, aes(x = Boursier, y = Note, fill = Boursier)) +
  geom_boxplot(color = "black", alpha = 0.6) +
  labs(title = "Comparaison des notes entre boursiers et non-boursiers",
       x = "Statut Boursier", y = "Note") +
  theme_minimal() +
  theme(axis.text = element_text(size = 12),
        axis.title = element_text(size = 14, face = "bold"),
        plot.title = element_text(size = 16, face = "bold")) +
  # Ajouter la p-value sur le graphique
  annotate("text", x = 1.5, y = max(data$Note, na.rm = TRUE), 
           label = paste("p-value =", round(p_value1, 4)), 
           size = 5, color = "red", fontface = "bold")

c. Notes et catégorie socio-professionnelle du parent 1


# Effectuer une ANOVA entre PCS_Parent1 et Note
anova_result1 <- aov(Note ~ PCS_Parent1, data = data)

# Extraire la p-value de l'ANOVA
anova_p_value2 <- summary(anova_result1)[[1]][["Pr(>F)"]][1]

# Créer un boxplot avec p-value et ajuster l'apparence des noms des variables
ggplot(data, aes(x = PCS_Parent1, y = Note, fill = PCS_Parent1)) +
  geom_boxplot(color = "black", alpha = 0.6) +
  labs(
    title = "Comparaison des notes selon la PCS du parent 1",
    x = "PCS Parent 1", 
    y = "Note"
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(size = 10, angle = 45, hjust = 1),  # Taille réduite et rotation des noms
    axis.text.y = element_text(size = 12),                         # Taille des étiquettes de l'axe Y
    axis.title = element_text(size = 14, face = "bold"),           # Taille et style des titres des axes
    plot.title = element_text(size = 16, face = "bold")            # Taille et style du titre principal
  ) +
  # Ajouter la p-value en bas à droite
  annotate(
    "text", 
    x = length(unique(data$PCS_Parent1)),  # Position x (dernière catégorie)
    y = min(data$Note, na.rm = TRUE) - 1,  # Position y légèrement sous le minimum des notes
    label = paste("p-value =", round(anova_p_value2, 4)), 
    size = 5, 
    color = "red", 
    fontface = "bold",
    hjust = 1  # Alignement à droite
  )

NA
NA

d. Notes et catégorie-professionnelle du parent 2


# Effectuer une ANOVA entre PCS_Parent1 et Note
anova_result2 <- aov(Note ~ PCS_Parent2, data = data)

# Extraire la p-value de l'ANOVA
anova_p_value3 <- summary(anova_result2)[[1]][["Pr(>F)"]][1]

# Créer un boxplot avec p-value et ajuster l'apparence des noms des variables
ggplot(data, aes(x = PCS_Parent2, y = Note, fill = PCS_Parent2)) +
  geom_boxplot(color = "black", alpha = 0.6) +
  labs(
    title = "Comparaison des notes selon la PCS du parent 2",
    x = "PCS Parent 2", 
    y = "Note"
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(size = 10, angle = 45, hjust = 1),  # Taille réduite et rotation des noms
    axis.text.y = element_text(size = 12),                         # Taille des étiquettes de l'axe Y
    axis.title = element_text(size = 14, face = "bold"),           # Taille et style des titres des axes
    plot.title = element_text(size = 16, face = "bold")            # Taille et style du titre principal
  ) +
  # Ajouter la p-value en bas à droite
  annotate(
    "text", 
    x = length(unique(data$PCS_Parent1)),  # Position x (dernière catégorie)
    y = min(data$Note, na.rm = TRUE) - 1,  # Position y légèrement sous le minimum des notes
    label = paste("p-value =", round(anova_p_value3, 4)), 
    size = 5, 
    color = "red", 
    fontface = "bold",
    hjust = 1  # Alignement à droite
  )

e. Notes et mention au bac

anova_result3 <- aov(Note ~ Bac_Mention, data = data)

# Extraire la p-value de l'ANOVA
anova_p_value4 <- summary(anova_result3)[[1]][["Pr(>F)"]][1]

# Créer un boxplot avec p-value et ajuster l'apparence des noms des variables
ggplot(data, aes(x = Bac_Mention, y = Note, fill = Bac_Mention)) +
  geom_boxplot(color = "black", alpha = 0.6) +
  labs(
    title = "Comparaison des notes selon la mention au bac",
    x = "Mention au Bac", 
    y = "Note"
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(size = 10, angle = 45, hjust = 1),  # Taille réduite et rotation des noms
    axis.text.y = element_text(size = 12),                         # Taille des étiquettes de l'axe Y
    axis.title = element_text(size = 14, face = "bold"),           # Taille et style des titres des axes
    plot.title = element_text(size = 16, face = "bold")            # Taille et style du titre principal
  ) +
  # Ajouter la p-value en bas à droite
  annotate(
    "text", 
    x = length(unique(data$Bac_Mention)),  # Position x (dernière catégorie)
    y = min(data$Note, na.rm = TRUE) - 1,  # Position y légèrement sous le minimum des notes
    label = paste("p-value =", round(anova_p_value4, 4)), 
    size = 5, 
    color = "green", 
    fontface = "bold",
    hjust = 1  # Alignement à droite
  )

III. Modèle prenant toutes les variables ensemble


# Création du graphique avec ggplot2
ggplot(importance_data, aes(x = reorder(Variable, Importance), y = Importance)) +
  geom_bar(stat = "identity", fill = "skyblue", color = "black") +  # Barres avec couleur et bordure
  coord_flip() +  # Inverser les axes pour une meilleure lisibilité
  labs(title = "Variables significatives avec importance > seuil 95%",
       x = "Variables", y = "Importance") +
  theme_minimal() +  # Thème minimaliste
  theme(
    axis.text.x = element_text(size = 10, angle = 45, hjust = 1),  # Rotation des noms des variables
    axis.text.y = element_text(size = 10)  # Taille des noms des variables
  ) +
  geom_hline(yintercept = seuil_importance, linetype = "dashed", color = "red", size = 1.5)  # Ajouter le seuil

NA
NA
LS0tDQp0aXRsZTogIkdyYXBoaXF1ZSBTVEFQUyINCmF1dGhvcjogIkJFQ0sgVmFsZW50aW4iDQpvdXRwdXQ6DQogIA0KICBodG1sX25vdGVib29rOg0KICAgIHRvYzogdHJ1ZQ0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIHRoZW1lOiBqb3VybmFsDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgc291cmNlOiBlbWJlZA0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIGRmX3ByaW50OiBwYWdlZA0KLS0tDQoNCmBgYHs9aHRtbH0NCjxzdHlsZT4NCmJvZHl7DQogIHRleHQtYWxpZ246IGp1c3RpZnl9DQo8L3N0eWxlPg0KYGBgDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCm9wdGlvbnMocmVwb3MgPSBjKENSQU4gPSAiaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmciKSkNCg0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KDQpsaWJyYXJ5KGRhdGEudGFibGUpDQpsaWJyYXJ5KGNhcmV0KQ0KbGlicmFyeShyYW5kb21Gb3Jlc3QpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHZjZCkNCmxpYnJhcnkocnBhcnQpDQpsaWJyYXJ5KHJwYXJ0LnBsb3QpDQpsaWJyYXJ5KGNhcikNCmxpYnJhcnkoTUFTUykNCmxpYnJhcnkoZ3JpZEV4dHJhKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KHBST0MpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShGYWN0b01pbmVSKQ0KaW5zdGFsbC5wYWNrYWdlcygiYXJtIikNCmxpYnJhcnkoYXJtKQ0KaW5zdGFsbC5wYWNrYWdlcygicmVhZHhsIikNCmxpYnJhcnkocmVhZHhsKQ0KDQpzZXR3ZCgiQzovVXNlcnMvVmFsZW4vRGVza3RvcC9NYWNoaW5lIGxlYXJuaW5nLyIpDQoNCg0KICBkYXRhID0gcmVhZF9leGNlbCgnU1RBUFMueGxzeCcpDQogIGRhdGEgPSBkYXRhWy0xMzMsXQ0KICANCiAgZGF0YSA8LSBkYXRhWywgLWMoMSwgMiwzLCA0LCA3ICwgOCldICAjIFN1cHByaW1lIGxlcyBjb2xvbm5lcyAxIGV0IDINCiAgDQoNCg0KDQpjb2xuYW1lcyhkYXRhKSA8LSBjKA0KIkJvdXJzaWVyIiwgIlNleGUiLCANCiAgIlBDU19QYXJlbnQyIiwgIlBDU19QYXJlbnQxIiwgIkJhY19Hcm91cGUiLCAiQmFjX01lbnRpb24iLCANCiAgIjIwMjMiLCAiTm90ZSIsICJSZXN1bHRhdCIsICIyMDI0Ig0KKQ0KDQoNCg0KIyBUcmFuc2Zvcm1lciBsZXMgY29sb25uZXMgZGUgdHlwZSAiY2hyIiBlbiAiZmFjdG9yIg0KZGF0YSA8LSBkYXRhICU+JQ0KICBtdXRhdGUoYWNyb3NzKHdoZXJlKGlzLmNoYXJhY3RlciksIGFzLmZhY3RvcikpDQoNCg0KDQojIENyw6lhdGlvbiBkJ3VuIHZlY3RldXIgZGUgcmVncm91cGVtZW50DQpjYXRlZ29yaWVzIDwtIGMoDQogICIxMSIgPSAiQWdyaWN1bHRldXJzIiwNCiAgIjEyIiA9ICJBZ3JpY3VsdGV1cnMiLA0KICAiMjEiID0gIkFncmljdWx0ZXVycyIsDQogICIyMiIgPSAiQXJ0aXNhbnMgZXQgY29tbWVyw6dhbnRzIiwNCiAgIjMxIiA9ICJBcnRpc2FucyBldCBjb21tZXLDp2FudHMiLA0KICAiMzMiID0gIkNhZHJlcyIsDQogICIzNCIgPSAiQ2FkcmVzIiwNCiAgIjM3IiA9ICJQcm9mZXNzaW9ucyBpbnRlcm3DqWRpYWlyZXMiLA0KICAiMzgiID0gIlByb2Zlc3Npb25zIGludGVybcOpZGlhaXJlcyIsDQogICI0MiIgPSAiRW1wbG95w6lzIiwNCiAgIjQzIiA9ICJFbXBsb3nDqXMiLA0KICAiNDUiID0gIkVtcGxvecOpcyIsDQogICI0NiIgPSAiT3V2cmllcnMiLA0KICAiNDciID0gIk91dnJpZXJzIiwNCiAgIjQ4IiA9ICJPdXZyaWVycyIsDQogICI1MiIgPSAiUmV0cmFpdMOpcyIsDQogICI1MyIgPSAiUmV0cmFpdMOpcyIsDQogICI1NCIgPSAiUmV0cmFpdMOpcyIsDQogICI1NSIgPSAiUmV0cmFpdMOpcyIsDQogICI1NiIgPSAiUmV0cmFpdMOpcyIsDQogICI3NCIgPSAiQXV0cmVzIGluYWN0aWZzIiwNCiAgIjc3IiA9ICJBdXRyZXMgaW5hY3RpZnMiLA0KICAiNzgiID0gIkF1dHJlcyBpbmFjdGlmcyIsDQogICI4NSIgPSAiQXV0cmVzIGluYWN0aWZzIiwNCiAgIjk5IiA9ICJBdXRyZXMgaW5hY3RpZnMiDQopDQoNCiMgUmVtcGxhY2VtZW50IGRhbnMgbGEgY29sb25uZSBQQ1NfUGFyZW50MQ0KZGF0YSRQQ1NfUGFyZW50MSA8LSBhcy5jaGFyYWN0ZXIoZGF0YSRQQ1NfUGFyZW50MSkgICMgUydhc3N1cmVyIHF1ZSBsYSBjb2xvbm5lIGVzdCBlbiBjYXJhY3TDqHJlcw0KZGF0YSRQQ1NfUGFyZW50MSA8LSBjYXRlZ29yaWVzW2RhdGEkUENTX1BhcmVudDFdICAgIyBSZW1wbGFjZXIgbGVzIGNvZGVzIHBhciBsZXMgbm9tcw0KDQojIFJlbXBsYWNlbWVudCBkYW5zIGxhIGNvbG9ubmUgUENTX1BhcmVudDINCmRhdGEkUENTX1BhcmVudDIgPC0gYXMuY2hhcmFjdGVyKGRhdGEkUENTX1BhcmVudDIpICAjIFMnYXNzdXJlciBxdWUgbGEgY29sb25uZSBlc3QgZW4gY2FyYWN0w6hyZXMNCmRhdGEkUENTX1BhcmVudDIgPC0gY2F0ZWdvcmllc1tkYXRhJFBDU19QYXJlbnQyXSAgICMgUmVtcGxhY2VyIGxlcyBjb2RlcyBwYXIgbGVzIG5vbXMNCg0KDQoNCm9wdGlvbnMod2FybiA9IC0xKQ0KDQpgYGANCg0KIyBJLiBBbmFseXNlIGRlc2NyaXB0aXZlDQoNCiMjIEp1c3RpZmljYXRpb24NCg0KTCdhbmFseXNlIGRlc2NyaXB0aXZlIHBlcm1ldCBkZSBjb21wcmVuZHJlIGxhIGRpc3RyaWJ1dGlvbiBldCBsZXMgY2FyYWN0w6lyaXN0aXF1ZXMgZ8OpbsOpcmFsZXMgZGVzIGRvbm7DqWVzLCBvZmZyYW50IGFpbnNpIHVuIGFwZXLDp3UgcHLDqWxpbWluYWlyZSBkZXMgdGVuZGFuY2VzIGV0IGRlcyBhc3NvY2lhdGlvbnMgcG90ZW50aWVsbGVzIGVudHJlIGxlcyB2YXJpYWJsZXMgw6l0dWRpw6llcy4NCg0KDQpgYGB7ciBjYXJzfQ0KZmFzdGdncGxvdCA8LSBmdW5jdGlvbihkYXRhLCB4X3ZhciwgdGl0bGUsIHhfbGFiZWwsIHlfbGFiZWwpIHsNCiAgIyBDYWxjdWwgZGVzIGZyw6lxdWVuY2VzDQogIGZyZXFfZGF0YSA8LSBkYXRhICU+JQ0KICAgIGNvdW50KC5kYXRhW1t4X3Zhcl1dKSAlPiUNCiAgICBtdXRhdGUocGVyY2VudGFnZSA9IG4gLyBzdW0obikgKiAxMDApICAjIENhbGN1bCBkZXMgcG91cmNlbnRhZ2VzDQogIA0KICBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBmYWN0b3IoLmRhdGFbW3hfdmFyXV0pLCBmaWxsID0gZmFjdG9yKC5kYXRhW1t4X3Zhcl1dKSkpICsNCiAgICBnZW9tX2Jhcihjb2xvciA9ICJibGFjayIsIGFscGhhID0gMC44KSArDQogICAgZ2VvbV9sYWJlbChkYXRhID0gZnJlcV9kYXRhLCBhZXMoeCA9IGZhY3RvciguZGF0YVtbeF92YXJdXSksIHkgPSBuICsgMSwgbGFiZWwgPSBwYXN0ZTAocm91bmQocGVyY2VudGFnZSwgMSksICIlIikpLCANCiAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLCBzaXplID0gNSwgY29sb3IgPSAiYmxhY2siLCBmb250ZmFjZSA9ICJib2xkIiwgZmlsbCA9ICJ3aGl0ZSIsIGxhYmVsLnBhZGRpbmcgPSB1bml0KDAuMiwgImxpbmVzIikpICsNCiAgICBsYWJzKHRpdGxlID0gdGl0bGUsIHggPSB4X2xhYmVsLCB5ID0geV9sYWJlbCwgZmlsbCA9IHhfdmFyKSArDQogICAgdGhlbWVfbWluaW1hbCgpICsNCiAgICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwNCiAgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgZmFjZSA9ICJib2xkIiksDQogICAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYsIGZhY2UgPSAiYm9sZCIpKQ0KfQ0KDQoNCmBgYA0KDQojIyBhLiBSw6lwYXJ0aW9uIGRlcyDDqXR1ZGlhbnRzIGVuIGZvbmN0aW9uIGRlIGxhIGJvdXJzZQ0KDQpgYGB7cn0NCkJvdXJzaWVyIDwtIGZhc3RnZ3Bsb3QoZGF0YSwgIkJvdXJzaWVyIiwgIlLDqXBhcnRpdGlvbiBlbiBmb25jdGlvbiBkZSBsYSBib3Vyc2UiLCAiIiwgIk5vbWJyZSBkJ29jY3VyZW5jZSIpDQpCb3Vyc2llcg0KYGBgDQoNCg0KIyMgYi4gUsOpcGFydGlvbiBkZXMgw6l0dWRpYW50cyBlbiBmb25jdGlvbiBkdSBzZXhlDQoNCmBgYHtyfQ0KU2V4ZSA8LSBmYXN0Z2dwbG90KGRhdGEsICJTZXhlIiwgIlLDqXBhcnRpdGlvbiBob21tZSBmZW1tZSIsICIiLCAiTm9tYnJlIGRlIGNhcyIpDQpTZXhlIDwtIFNleGUgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KU2V4ZQ0KYGBgDQojIyBjLiBSw6lwYXJ0aW9uIGRlcyDDqXR1ZGlhbnRzIGVuIGZvbmN0aW9uIGRlIGxhIGNhdMOpZ29yaWUgc29jaW8tcHJvZmVzc2lvbm5lbGUgZHUgcGFyZW50IDENCg0KDQpgYGB7cn0NClBDU19QYXJlbnQxIDwtIGZhc3RnZ3Bsb3QoZGF0YSwgIlBDU19QYXJlbnQxIiwgIkNhdMOpZ29yaWUgc29jaW8tcHJvZmVzc2lvbm5lbGxlIGR1IHBhcmVudCAxIiwgIiIsICJOb21icmUgZCdvY2N1cmVuY2UiKQ0KUENTX1BhcmVudDEgPC0gUENTX1BhcmVudDEgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KUENTX1BhcmVudDENCmBgYA0KIyMgZC4gUsOpcGFydGlvbiBkZXMgw6l0dWRpYW50cyBlbiBmb25jdGlvbiBkZSBsYSBib3Vyc2UNCg0KYGBge3J9DQpQQ1NfUGFyZW50MiA9IGZhc3RnZ3Bsb3QoZGF0YSwgIlBDU19QYXJlbnQyIiwgIkNhdMOpZ29yaWUgc29jaW8tcHJvZmVzc2lvbm5lbGxlIGR1IHBhcmVudCAyIiwgIiIsICJOb21icmUgZCdvY2N1cmVuY2UiKQ0KUENTX1BhcmVudDIgPC0gUENTX1BhcmVudDIgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KUENTX1BhcmVudDINCmBgYA0KDQojIyBlLlLDqXBhcnRpb24gZGVzIMOpdHVkaWFudHMgZW4gZm9uY3Rpb24gZHUgYmFjDQoNCmBgYHtyfQ0KQmFjID0gZmFzdGdncGxvdChkYXRhLCAiQmFjX0dyb3VwZSIsICJCYWMiLCAiIiwgIk5vbWJyZSBkJ29jY3VyZW5jZSIpDQpCYWMgPC0gQmFjICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gNykpDQpCYWMNCmBgYA0KIyMgZi4gUsOpcGFydGlvbiBkZSBsYSBtZW50aW9uIGRlcyDDqXR1ZGlhbnRzIGF1IEJhYw0KDQpgYGB7cn0NCg0KQmFjX01lbnRpb24gPSBmYXN0Z2dwbG90KGRhdGEsICJCYWNfTWVudGlvbiIsICJNZW50aW9uIGF1IEJhYyIsICIiLCAiTm9tYnJlIGQnb2NjdXJlbmNlIikNCkJhY19NZW50aW9uIDwtIEJhY19NZW50aW9uICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNCkJhY19NZW50aW9uIA0KYGBgDQojIyBnLiBJbnRpdHVsw6kgZCfDqXR1ZGUgZW4gMjAyMy0yMDI0DQoNCmBgYHtyfQ0Kbm90ZTIwMjMgPSBmYXN0Z2dwbG90KGRhdGEsICIyMDIzIiwgIkludGl0dWzDqSBkJ8OpdHVkZSBlbiAyMDIzLTIwMjQiLCAiIiwgIk5vbWJyZSBkJ29jY3VyZW5jZSIpDQpub3RlMjAyMyA8LSBub3RlMjAyMyArdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gNykpDQpub3RlMjAyMw0KYGBgDQojIyBoLiBSw6lzdWx0YXQgZGVzIMOpdHVkaWFudHMgZW4gMjAyMy0yMDI0DQoNCmBgYHtyfQ0KUmVzdWx0YXQyMDIzID0gZmFzdGdncGxvdChkYXRhLCAiUmVzdWx0YXQiLCAiUsOpc3VsdGF0IDIwMjMiLCAiIiwgIk5vbWJyZSBkJ29jY3VyZW5jZSIpDQpSZXN1bHRhdDIwMjMgPC0gUmVzdWx0YXQyMDIzICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNClJlc3VsdGF0MjAyMw0KYGBgDQoNCiMjIGkuIEludGl0dWzDqSBkZSBmb3JtYXRpb24gZW4gMjAyNC0yMDI1DQoNCg0KYGBge3J9DQoNCkZvcm1hdGlvbjIwMjQgPSBmYXN0Z2dwbG90KGRhdGEsICIyMDI0IiwgIkZvcm1hdGlvbiAyMDI0LTIwMjUiLCAiIiwgIk5vbWJyZSBkJ29jY3VyZW5jZSIpDQpGb3JtYXRpb24yMDI0IDwtIEZvcm1hdGlvbjIwMjQgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KRm9ybWF0aW9uMjAyNA0KYGBgDQojIyBqLiBNb3llbm5lIGfDqW7DqXJhbGUgZGVzIMOpdHVkaWFudHMgZW4gMjAyMy0yMDI0DQoNCmBgYHtyfQ0KIyBIaXN0b2dyYW1tZSBhbcOpbGlvcsOpIHBvdXIgbGEgdmFyaWFibGUgTm90ZQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQpub3RlZCA9IGdncGxvdChkYXRhLCBhZXMoeCA9IE5vdGUpKSArDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMSwgZmlsbCA9ICIjNjliM2EyIiwgY29sb3IgPSAid2hpdGUiLCBhbHBoYSA9IDAuOCkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBkZXMgTm90ZXMiLA0KICAgIHggPSAiTm90ZSIsDQogICAgeSA9ICJGcsOpcXVlbmNlIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgsIGZhY2UgPSAiYm9sZCIsIGNvbG9yID0gIiMyYTNkM2YiKSwNCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgZmFjZSA9ICJib2xkIiwgY29sb3IgPSAiIzJhM2QzZiIpLA0KICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGNvbG9yID0gIiMyYTNkM2YiKSwNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG9yID0gIiNkM2QzZDMiKSwNCiAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpDQogICkNCm5vdGVkDQpgYGANCg0KIyBJSS4gQW5hbHlzZSBpbmbDqXJlbnRpZWxsZQ0KDQpMJ2FuYWx5c2UgaW5mw6lyZW50aWVsbGUgZW50cmUgbGVzIG5vdGVzIGV0IGxlcyBhdXRyZXMgdmFyaWFibGVzIHZpc2Ugw6AgZMOpdGVybWluZXIgc2kgZGVzIGZhY3RldXJzIGNvbW1lIGxlIHN0YXR1dCBkZSBib3Vyc2llciwgbGUgc2V4ZSwgbGEgY2F0w6lnb3JpZSBzb2Npb3Byb2Zlc3Npb25uZWxsZSBkZXMgcGFyZW50cywgb3UgbGVzIG1lbnRpb25zIGF1IGJhYyBpbmZsdWVuY2VudCBsZXMgcsOpc3VsdGF0cyBhY2Fkw6ltaXF1ZXMuDQoNCg0KIyMgYS4gU2V4ZSBldCBub3Rlcw0KDQpgYGB7cn0NCg0KIyBFZmZlY3R1ZXIgbGUgdGVzdCB0IGRlIFN0dWRlbnQgZW50cmUgU2V4ZSBldCBOb3RlDQp0X3Rlc3RfcmVzdWx0MTAgPC0gdC50ZXN0KE5vdGUgfiBCb3Vyc2llciwgZGF0YSA9IGRhdGEsIHZhci5lcXVhbCA9IFRSVUUpDQoNCiMgRXh0cmFpcmUgbGEgcC12YWx1ZSBkdSB0ZXN0DQpwX3ZhbHVlMTAgPC0gdF90ZXN0X3Jlc3VsdDEkcC52YWx1ZQ0KDQojIENyw6llciB1biBib3hwbG90IGV0IGFqb3V0ZXIgbGEgcC12YWx1ZSBzdXIgbGUgZ3JhcGhpcXVlDQpsaWJyYXJ5KGdncGxvdDIpDQoNCmdncGxvdChkYXRhLCBhZXMoeCA9IFNleGUsIHkgPSBOb3RlLCBmaWxsID0gU2V4ZSkpICsNCiAgZ2VvbV9ib3hwbG90KGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjYpICsNCiAgbGFicyh0aXRsZSA9ICJDb21wYXJhaXNvbiBkZXMgbm90ZXMgc2Vsb24gbGUgc2V4ZSIsDQogICAgICAgeCA9ICJTZXhlIiwgeSA9ICJOb3RlIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwNCiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIGZhY2UgPSAiYm9sZCIpLA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiwgZmFjZSA9ICJib2xkIikpICsNCiAgIyBBam91dGVyIGxhIHAtdmFsdWUgc3VyIGxlIGdyYXBoaXF1ZQ0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSAxLjUsIHkgPSBtYXgoZGF0YSROb3RlLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgbGFiZWwgPSBwYXN0ZSgicC12YWx1ZSA9Iiwgcm91bmQocF92YWx1ZTEwLCA0KSksIA0KICAgICAgICAgICBzaXplID0gNSwgY29sb3IgPSAicmVkIiwgZm9udGZhY2UgPSAiYm9sZCIpDQpgYGANCg0KIyMgYi4gQm91cnNlIGV0IG5vdGVzDQoNCmBgYHtyfQ0KDQojIEVmZmVjdHVlciBsZSB0ZXN0IHQgZGUgU3R1ZGVudCBlbnRyZSBCb3Vyc2llciBldCBOb3RlDQp0X3Rlc3RfcmVzdWx0MSA8LSB0LnRlc3QoTm90ZSB+IEJvdXJzaWVyLCBkYXRhID0gZGF0YSkNCg0KIyBFeHRyYWlyZSBsYSBwLXZhbHVlIGR1IHRlc3QNCnBfdmFsdWUxIDwtIHRfdGVzdF9yZXN1bHQxJHAudmFsdWUNCg0KIyBDcsOpZXIgdW4gYm94cGxvdCBldCBham91dGVyIGxhIHAtdmFsdWUgc3VyIGxlIGdyYXBoaXF1ZQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQpnZ3Bsb3QoZGF0YSwgYWVzKHggPSBCb3Vyc2llciwgeSA9IE5vdGUsIGZpbGwgPSBCb3Vyc2llcikpICsNCiAgZ2VvbV9ib3hwbG90KGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjYpICsNCiAgbGFicyh0aXRsZSA9ICJDb21wYXJhaXNvbiBkZXMgbm90ZXMgZW50cmUgYm91cnNpZXJzIGV0IG5vbi1ib3Vyc2llcnMiLA0KICAgICAgIHggPSAiU3RhdHV0IEJvdXJzaWVyIiwgeSA9ICJOb3RlIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwNCiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIGZhY2UgPSAiYm9sZCIpLA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiwgZmFjZSA9ICJib2xkIikpICsNCiAgIyBBam91dGVyIGxhIHAtdmFsdWUgc3VyIGxlIGdyYXBoaXF1ZQ0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSAxLjUsIHkgPSBtYXgoZGF0YSROb3RlLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgbGFiZWwgPSBwYXN0ZSgicC12YWx1ZSA9Iiwgcm91bmQocF92YWx1ZTEsIDQpKSwgDQogICAgICAgICAgIHNpemUgPSA1LCBjb2xvciA9ICJyZWQiLCBmb250ZmFjZSA9ICJib2xkIikNCg0KYGBgDQojIyBjLiBOb3RlcyBldCBjYXTDqWdvcmllIHNvY2lvLXByb2Zlc3Npb25uZWxsZSBkdSBwYXJlbnQgMQ0KDQoNCmBgYHtyfQ0KDQojIEVmZmVjdHVlciB1bmUgQU5PVkEgZW50cmUgUENTX1BhcmVudDEgZXQgTm90ZQ0KYW5vdmFfcmVzdWx0MSA8LSBhb3YoTm90ZSB+IFBDU19QYXJlbnQxLCBkYXRhID0gZGF0YSkNCg0KIyBFeHRyYWlyZSBsYSBwLXZhbHVlIGRlIGwnQU5PVkENCmFub3ZhX3BfdmFsdWUyIDwtIHN1bW1hcnkoYW5vdmFfcmVzdWx0MSlbWzFdXVtbIlByKD5GKSJdXVsxXQ0KDQojIENyw6llciB1biBib3hwbG90IGF2ZWMgcC12YWx1ZSBldCBhanVzdGVyIGwnYXBwYXJlbmNlIGRlcyBub21zIGRlcyB2YXJpYWJsZXMNCmdncGxvdChkYXRhLCBhZXMoeCA9IFBDU19QYXJlbnQxLCB5ID0gTm90ZSwgZmlsbCA9IFBDU19QYXJlbnQxKSkgKw0KICBnZW9tX2JveHBsb3QoY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuNikgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkNvbXBhcmFpc29uIGRlcyBub3RlcyBzZWxvbiBsYSBQQ1MgZHUgcGFyZW50IDEiLA0KICAgIHggPSAiUENTIFBhcmVudCAxIiwgDQogICAgeSA9ICJOb3RlIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLCAgIyBUYWlsbGUgcsOpZHVpdGUgZXQgcm90YXRpb24gZGVzIG5vbXMNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICAgICAjIFRhaWxsZSBkZXMgw6l0aXF1ZXR0ZXMgZGUgbCdheGUgWQ0KICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBmYWNlID0gImJvbGQiKSwgICAgICAgICAgICMgVGFpbGxlIGV0IHN0eWxlIGRlcyB0aXRyZXMgZGVzIGF4ZXMNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiwgZmFjZSA9ICJib2xkIikgICAgICAgICAgICAjIFRhaWxsZSBldCBzdHlsZSBkdSB0aXRyZSBwcmluY2lwYWwNCiAgKSArDQogICMgQWpvdXRlciBsYSBwLXZhbHVlIGVuIGJhcyDDoCBkcm9pdGUNCiAgYW5ub3RhdGUoDQogICAgInRleHQiLCANCiAgICB4ID0gbGVuZ3RoKHVuaXF1ZShkYXRhJFBDU19QYXJlbnQxKSksICAjIFBvc2l0aW9uIHggKGRlcm5pw6hyZSBjYXTDqWdvcmllKQ0KICAgIHkgPSBtaW4oZGF0YSROb3RlLCBuYS5ybSA9IFRSVUUpIC0gMSwgICMgUG9zaXRpb24geSBsw6lnw6hyZW1lbnQgc291cyBsZSBtaW5pbXVtIGRlcyBub3Rlcw0KICAgIGxhYmVsID0gcGFzdGUoInAtdmFsdWUgPSIsIHJvdW5kKGFub3ZhX3BfdmFsdWUyLCA0KSksIA0KICAgIHNpemUgPSA1LCANCiAgICBjb2xvciA9ICJyZWQiLCANCiAgICBmb250ZmFjZSA9ICJib2xkIiwNCiAgICBoanVzdCA9IDEgICMgQWxpZ25lbWVudCDDoCBkcm9pdGUNCiAgKQ0KDQoNCmBgYA0KIyMgZC4gTm90ZXMgZXQgY2F0w6lnb3JpZS1wcm9mZXNzaW9ubmVsbGUgZHUgcGFyZW50IDINCg0KYGBge3J9DQoNCiMgRWZmZWN0dWVyIHVuZSBBTk9WQSBlbnRyZSBQQ1NfUGFyZW50MSBldCBOb3RlDQphbm92YV9yZXN1bHQyIDwtIGFvdihOb3RlIH4gUENTX1BhcmVudDIsIGRhdGEgPSBkYXRhKQ0KDQojIEV4dHJhaXJlIGxhIHAtdmFsdWUgZGUgbCdBTk9WQQ0KYW5vdmFfcF92YWx1ZTMgPC0gc3VtbWFyeShhbm92YV9yZXN1bHQyKVtbMV1dW1siUHIoPkYpIl1dWzFdDQoNCiMgQ3LDqWVyIHVuIGJveHBsb3QgYXZlYyBwLXZhbHVlIGV0IGFqdXN0ZXIgbCdhcHBhcmVuY2UgZGVzIG5vbXMgZGVzIHZhcmlhYmxlcw0KZ2dwbG90KGRhdGEsIGFlcyh4ID0gUENTX1BhcmVudDIsIHkgPSBOb3RlLCBmaWxsID0gUENTX1BhcmVudDIpKSArDQogIGdlb21fYm94cGxvdChjb2xvciA9ICJibGFjayIsIGFscGhhID0gMC42KSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiQ29tcGFyYWlzb24gZGVzIG5vdGVzIHNlbG9uIGxhIFBDUyBkdSBwYXJlbnQgMiIsDQogICAgeCA9ICJQQ1MgUGFyZW50IDIiLCANCiAgICB5ID0gIk5vdGUiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksICAjIFRhaWxsZSByw6lkdWl0ZSBldCByb3RhdGlvbiBkZXMgbm9tcw0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksICAgICAgICAgICAgICAgICAgICAgICAgICMgVGFpbGxlIGRlcyDDqXRpcXVldHRlcyBkZSBsJ2F4ZSBZDQogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIGZhY2UgPSAiYm9sZCIpLCAgICAgICAgICAgIyBUYWlsbGUgZXQgc3R5bGUgZGVzIHRpdHJlcyBkZXMgYXhlcw0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LCBmYWNlID0gImJvbGQiKSAgICAgICAgICAgICMgVGFpbGxlIGV0IHN0eWxlIGR1IHRpdHJlIHByaW5jaXBhbA0KICApICsNCiAgIyBBam91dGVyIGxhIHAtdmFsdWUgZW4gYmFzIMOgIGRyb2l0ZQ0KICBhbm5vdGF0ZSgNCiAgICAidGV4dCIsIA0KICAgIHggPSBsZW5ndGgodW5pcXVlKGRhdGEkUENTX1BhcmVudDEpKSwgICMgUG9zaXRpb24geCAoZGVybmnDqHJlIGNhdMOpZ29yaWUpDQogICAgeSA9IG1pbihkYXRhJE5vdGUsIG5hLnJtID0gVFJVRSkgLSAxLCAgIyBQb3NpdGlvbiB5IGzDqWfDqHJlbWVudCBzb3VzIGxlIG1pbmltdW0gZGVzIG5vdGVzDQogICAgbGFiZWwgPSBwYXN0ZSgicC12YWx1ZSA9Iiwgcm91bmQoYW5vdmFfcF92YWx1ZTMsIDQpKSwgDQogICAgc2l6ZSA9IDUsIA0KICAgIGNvbG9yID0gInJlZCIsIA0KICAgIGZvbnRmYWNlID0gImJvbGQiLA0KICAgIGhqdXN0ID0gMSAgIyBBbGlnbmVtZW50IMOgIGRyb2l0ZQ0KICApDQpgYGANCiMjIGUuIE5vdGVzIGV0IG1lbnRpb24gYXUgYmFjDQoNCmBgYHtyfQ0KYW5vdmFfcmVzdWx0MyA8LSBhb3YoTm90ZSB+IEJhY19NZW50aW9uLCBkYXRhID0gZGF0YSkNCg0KIyBFeHRyYWlyZSBsYSBwLXZhbHVlIGRlIGwnQU5PVkENCmFub3ZhX3BfdmFsdWU0IDwtIHN1bW1hcnkoYW5vdmFfcmVzdWx0MylbWzFdXVtbIlByKD5GKSJdXVsxXQ0KDQojIENyw6llciB1biBib3hwbG90IGF2ZWMgcC12YWx1ZSBldCBhanVzdGVyIGwnYXBwYXJlbmNlIGRlcyBub21zIGRlcyB2YXJpYWJsZXMNCmdncGxvdChkYXRhLCBhZXMoeCA9IEJhY19NZW50aW9uLCB5ID0gTm90ZSwgZmlsbCA9IEJhY19NZW50aW9uKSkgKw0KICBnZW9tX2JveHBsb3QoY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuNikgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkNvbXBhcmFpc29uIGRlcyBub3RlcyBzZWxvbiBsYSBtZW50aW9uIGF1IGJhYyIsDQogICAgeCA9ICJNZW50aW9uIGF1IEJhYyIsIA0KICAgIHkgPSAiTm90ZSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSwgICMgVGFpbGxlIHLDqWR1aXRlIGV0IHJvdGF0aW9uIGRlcyBub21zDQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwgICAgICAgICAgICAgICAgICAgICAgICAgIyBUYWlsbGUgZGVzIMOpdGlxdWV0dGVzIGRlIGwnYXhlIFkNCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgZmFjZSA9ICJib2xkIiksICAgICAgICAgICAjIFRhaWxsZSBldCBzdHlsZSBkZXMgdGl0cmVzIGRlcyBheGVzDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYsIGZhY2UgPSAiYm9sZCIpICAgICAgICAgICAgIyBUYWlsbGUgZXQgc3R5bGUgZHUgdGl0cmUgcHJpbmNpcGFsDQogICkgKw0KICAjIEFqb3V0ZXIgbGEgcC12YWx1ZSBlbiBiYXMgw6AgZHJvaXRlDQogIGFubm90YXRlKA0KICAgICJ0ZXh0IiwgDQogICAgeCA9IGxlbmd0aCh1bmlxdWUoZGF0YSRCYWNfTWVudGlvbikpLCAgIyBQb3NpdGlvbiB4IChkZXJuacOocmUgY2F0w6lnb3JpZSkNCiAgICB5ID0gbWluKGRhdGEkTm90ZSwgbmEucm0gPSBUUlVFKSAtIDEsICAjIFBvc2l0aW9uIHkgbMOpZ8OocmVtZW50IHNvdXMgbGUgbWluaW11bSBkZXMgbm90ZXMNCiAgICBsYWJlbCA9IHBhc3RlKCJwLXZhbHVlID0iLCByb3VuZChhbm92YV9wX3ZhbHVlNCwgNCkpLCANCiAgICBzaXplID0gNSwgDQogICAgY29sb3IgPSAiZ3JlZW4iLCANCiAgICBmb250ZmFjZSA9ICJib2xkIiwNCiAgICBoanVzdCA9IDEgICMgQWxpZ25lbWVudCDDoCBkcm9pdGUNCiAgKQ0KYGBgDQojIElJSS4gTW9kw6hsZSBwcmVuYW50IHRvdXRlcyBsZXMgdmFyaWFibGVzIGVuc2VtYmxlDQoNCg0KYGBge3J9DQoNCiMgQ3LDqWF0aW9uIGR1IGdyYXBoaXF1ZSBhdmVjIGdncGxvdDINCmdncGxvdChpbXBvcnRhbmNlX2RhdGEsIGFlcyh4ID0gcmVvcmRlcihWYXJpYWJsZSwgSW1wb3J0YW5jZSksIHkgPSBJbXBvcnRhbmNlKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICJza3libHVlIiwgY29sb3IgPSAiYmxhY2siKSArICAjIEJhcnJlcyBhdmVjIGNvdWxldXIgZXQgYm9yZHVyZQ0KICBjb29yZF9mbGlwKCkgKyAgIyBJbnZlcnNlciBsZXMgYXhlcyBwb3VyIHVuZSBtZWlsbGV1cmUgbGlzaWJpbGl0w6kNCiAgbGFicyh0aXRsZSA9ICJWYXJpYWJsZXMgc2lnbmlmaWNhdGl2ZXMgYXZlYyBpbXBvcnRhbmNlID4gc2V1aWwgOTUlIiwNCiAgICAgICB4ID0gIlZhcmlhYmxlcyIsIHkgPSAiSW1wb3J0YW5jZSIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsgICMgVGjDqG1lIG1pbmltYWxpc3RlDQogIHRoZW1lKA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSwgICMgUm90YXRpb24gZGVzIG5vbXMgZGVzIHZhcmlhYmxlcw0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCkgICMgVGFpbGxlIGRlcyBub21zIGRlcyB2YXJpYWJsZXMNCiAgKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHNldWlsX2ltcG9ydGFuY2UsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gInJlZCIsIHNpemUgPSAxLjUpICAjIEFqb3V0ZXIgbGUgc2V1aWwNCg0KDQpgYGANCg0KDQoNCg0K