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

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