Hypothese

H1: Es gibt einen Mittelwertsunterschied zwischen der Trainingsarten (Training1, Training 2, Training 3, Training 4) und der Ausdauer.

\(M_{1} \neq M_{2} \neq M_{3} \neq M_{4} \text { für min. einen Vergleich}\)

H0: Es gibt keinen Mittelwertsunterschied zwischen der Trainingsarten (Training1, Training 2, Training 3, Training 4) und der Ausdauer. \(M_{1} = M_{2}= M_{3}= M_{4}\)

Voraussetzungen der einfaktoriellen Varianzanalyse ohne Messwiederholung

✓ Die abhängige Variable ist intervallskaliert -> Ausdauer ist metrisch

✓ Die unabhängige Variable (Faktor) ist kategorial (nominal- oder ordinalskaliert) -> Die Trainingsarten sind nominal-skaliert.

✓ Die durch den Faktor gebildeten Gruppen sind unabhängig Jeder TeilnehmerIn hat ausschliesslich in seiner oder ihrer Gruppe trainiert.

✓ Die abhängige Variablen ist normalverteilt innerhalb jeder der Gruppen (Ab > 25 Probanden pro Gruppe sind Verletzungen in der Regel unproblematisch) -> siehe Histogramm und QQplot

✓ Homogenität der Varianzen: Die Gruppen stammen aus Grundgesamtheiten mit annähernd identischen Varianzen der abhängigen Variablen -> siehe Levene-Test

Boxplots

boxplot(anovaohne$Ausdauertest ~ anovaohne$Trainingsarten, main = "Boxplots zum Vergleich", ylab = "Ausdauer", xlab= "Trainingsmethode" , col = c("lightgreen", "deepskyblue","tomato", "orange"))

Boxplot zeigt keine Ausreisser. Die Verteilungen scheinen sich von einander zu unterscheiden, allerdings nicht so eindeutig bei Training 3 und Training 4.

Normalverteilung -> Prüfung mittels Histogramm

Um einen ersten Überblick über die Daten zu gewinnen, empfiehlt es sich Histogrammm zu erstellen.

anovaohne %>%
  group_by(Trainingsarten) %>%
  ggplot(aes(Ausdauertest, color=Trainingsarten)) + 
  geom_histogram(aes(fill = Trainingsarten), bins = 20) +
  facet_wrap(~Trainingsarten) +
  theme_grey()+
  labs(x= "Ausdauertest",y = "Anzahl" )

Die Daten sind normalverteilt, wenn auch nicht perfekt.

Alternativ QQPlot

library(car)

qqPlot(Ausdauertest ~ Trainingsarten, data=anovaohne, 
       layout=c(1, 4))

Die Daten sind normalverteilt.

Prüfung der Varianzhomogenität (Levene-Test)

Für die Durchführung eines **t-Tests für unabhängige Gruppen** ist die Annahme der *Varianzhomogenität* erforderlich. Wenn jedoch Varianzheterogenität – also ungleiche Varianzen – vorliegt, müssen unter anderem die Freiheitsgrade des t-Wertes angepasst werden. Ob die Varianzen tatsächlich gleich sind, lässt sich mit dem Levene-Test überprüfen. Der Levene-Test geht von der Nullhypothese aus, dass sich die Varianzen *nicht unterscheiden*. Ein nicht signifikantes Ergebnis spricht daher dafür, dass die Varianzen als gleich angenommen werden können – es liegt also Varianzhomogenität vor. Ist das Testergebnis hingegen ignifikant, deutet dies auf Varianzheterogenität/ hin – die Annahme gleicher Varianzen muss dann verworfen werden.

leveneTest(anovaohne$Ausdauertest ~ anovaohne$Trainingsarten, center="mean")
group coerced to factor.
Levene's Test for Homogeneity of Variance (center = "mean")
       Df F value  Pr(>F)  
group   3  2.9087 0.03762 *
      115                  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Im vorliegenden Beispiel ist der Levene-Test signifikant(F(3,115) = 2.908, p = .037), so dass von Varianzhetrogenität ausgegangen werden kann. Das heisst - es muss eine Welch-Korrektur durchgeführt werden.

Mit Welch-Korrektur: p < 0.05 => Ergebnis Signifikant –> Varianzen heterogen

Ohne Welch-Korrektur: p > 0.05 => Ergebnis nicht Signifikant –> Varianzen homogen –> H0 mit Annahme Var1=Var2=… -> Var_n wird angenommen

Deskriptive Statistiken

Die Tabelle in Abbildung gibt die Mittelwerte, Standardabweichungen und Grössen aller vier Gruppen wieder. Diese Informationen werden für die Berichterstattung verwendet.

# sollte ein Meldung zum Thema "summarise" erscheinen - tauschen Sie s mit z oder anderes rum 
anovaohne %>%
group_by(Trainingsarten) %>%
  summarise(Anzahl = n(), Mittelwert = mean(Ausdauertest), Median = median(Ausdauertest), Standardabweichung = sd(Ausdauertest)) %>%
  mutate_if(is.numeric, round, 2)

Es gibt einen Mittelwertsunterschied zwischen den Gruppen. Trainingsart 2 (M = 48.16, SD = 3.45, n = 30) zeigt die besten Ausdauerergebnisse, gefolgt von Trainingsgruppe 2 (M 38.82, SD = 3.99,n = 29). Wie bereits beim Boxplot zu erkennen war, ist der Abstand der Mittelwert bei Trainingsart 3 (M = 25.10, SD = 3.05, n = 30) und Trainingsart 4( M = 22.03, SD = 2.42, n = 30) ähnlich ausgefallen.

Ergebnisse der einfaktoriellen Varianzanalyse

Modell

Das Modell wird im Post-Hoc als auch beim Eta^2 verwendet.

ANOVA <- aov(data=anovaohne, anovaohne$Ausdauertest~anovaohne$Trainingsarten) #Model gebildet

mit Welch-Korrektur

ANOVAmitWelch <- oneway.test(anovaohne$Ausdauertest ~ anovaohne$Trainingsarten)
ANOVAmitWelch

    One-way analysis of means (not assuming equal variances)

data:  anovaohne$Ausdauertest and anovaohne$Trainingsarten
F = 446.85, num df = 3.00, denom df = 62.68, p-value < 2.2e-16

Das Gesamtergebnis der Analyse ist signifikant (F(3, 62.68) = 446.85, p < .001). Dies zeigt, dass es insgesamt Unterschiede zwischen den vier Gruppen gibt. Allerdings verrät dieser Test noch nicht, zwischen welchen Gruppen die Unterschiede tatsächlich bestehen. Es ist z. B. möglich, dass sich nur ein einzelnes Gruppenpaar signifikant unterscheidet, während die übrigen Gruppen ähnlich abschneiden. Um dies genauer zu untersuchen, wird ein Post-hoc-Test durchgeführt, der paarweise Vergleiche ermöglicht.

ohne Welch-Korrektur

ANOVA <- aov(data=anovaohne, anovaohne$Ausdauertest~anovaohne$Trainingsarten) #Model gebildet
summary(ANOVA)
                          Df Sum Sq Mean Sq F value Pr(>F)    
anovaohne$Trainingsarten   3  13338    4446   414.3 <2e-16 ***
Residuals                115   1234      11                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Post-hoc-Tests

Im Allgemeinen sollen durch Post-hoc Tests folgende drei Fragestellungen addressiert werden:
Frage 01 Welcher Vergleich wird signifikant und welcher nicht?
Frage 02 Welche Gruppen sind unabhängig und welche nicht?
Frage 03 Optional: Sind Gruppenbildungen möglich/ sinnvoll? - Wenn ja, welche?

Der F-Test weist darauf hin, dass die Trainingsart einen Einfluss auf die Ergebnisse im Ausdauertest hat. Er zeigt jedoch nicht, welche konkreten Trainingsmethoden sich voneinander unterscheiden. Um festzustellen, zwischen welchen Gruppen tatsächlich signifikante Unterschiede bestehen, sind weiterführende Post-hoc-Analysen notwendig.

\[\frac{k\cdot(k-1)}{2} =\frac{4\cdot(4-1)}{2} = \frac{12}{2} = 6\] mit \(k\) = Ausprägungen/ Gruppen/ Stufen

Bei Post-hoc-Tests wird im Grunde für jede mögliche Paarung von Gruppen ein t-Test durchgeführt, um ihre Mittelwerte miteinander zu vergleichen. In unserem Fall mit vier Gruppen ergeben sich daraus sechs Paarvergleiche.

Das Problem dabei: Je mehr Tests durchgeführt werden, desto größer wird die Wahrscheinlichkeit, dass fälschlich ein signifikanter Unterschied festgestellt wird – also ein sogenannter Alpha-Fehler (Fehler 1. Art).

Ein einzelner t-Test mit einem Signifikanzniveau von 0.05 bedeutet, dass mit 95 %iger Wahrscheinlichkeit kein Alpha-Fehler auftritt. Werden aber sechs unabhängige Tests durchgeführt, liegt die Wahrscheinlichkeit, dass kein einziger dieser Tests einen Alpha-Fehler macht, nur noch bei 0.956 = 0.735. Daraus ergibt sich eine Wahrscheinlichkeit von 1 − 0.735 = 0.2649 für mindestens einen Alpha-Fehler – also rund 26.5 %.

Diese kumulierte Fehlerwahrscheinlichkeit über mehrere Tests hinweg wird als Familywise Error Rate (FWER) bezeichnet. Um diesen Effekt zu kontrollieren, verwendet man in der Regel Korrekturverfahren wie z. B. die Bonferroni-Korrektur, die eine starke Kontrolle der Familywise Error Rate gewährleistet.

Um dieses Problem zu beheben kann zum Beispiel die TukeyHSD angewendet werden. Python rechnet das neue Niveau ein, daher können wir weiter auf 0.05 testen.

TUKEY<- TukeyHSD(aov(data=anovaohne, anovaohne$Ausdauertest~anovaohne$Trainingsarten))
TUKEY
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = anovaohne$Ausdauertest ~ anovaohne$Trainingsarten, data = anovaohne)

$`anovaohne$Trainingsarten`
                                    diff        lwr        upr     p adj
Trainingsart 2-Trainingsart 1   9.339080   7.115206  11.562955 0.0000000
Trainingsart 3-Trainingsart 1 -13.727586 -15.951461 -11.503712 0.0000000
Trainingsart 4-Trainingsart 1 -16.794253 -19.018128 -14.570378 0.0000000
Trainingsart 3-Trainingsart 2 -23.066667 -25.271614 -20.861719 0.0000000
Trainingsart 4-Trainingsart 2 -26.133333 -28.338281 -23.928386 0.0000000
Trainingsart 4-Trainingsart 3  -3.066667  -5.271614  -0.861719 0.0024018

Hinweis für Frage 01 und 02

plot(TUKEY , las=1 , col="red")

Hinweis für Frage 03

library(multcompView)
generate_label_df <- function(TUKEY, variable){
     Tukey.levels <- TUKEY[[variable]][,4]
     Tukey.labels <- data.frame(multcompLetters(Tukey.levels)['Letters'])
     Tukey.labels$treatment=rownames(Tukey.labels)
     Tukey.labels=Tukey.labels[order(Tukey.labels$treatment) , ]
     return(Tukey.labels)
}
 
LABELS <- generate_label_df(TUKEY , "anovaohne$Trainingsarten")

table(LABELS)
       treatment
Letters Trainingsart 1 Trainingsart 2 Trainingsart 3 Trainingsart 4
      a              0              1              0              0
      b              0              0              1              0
      c              0              0              0              1
      d              1              0              0              0

Es wird ersichtlich, dass sich die Trainingsmethoden 1 und 2 sowie 3 und 4 bezüglich der Ausdauertest signifikant unterscheiden. (p < .05).

Es können also vier unabhängige/ generalisierbare Gruppen von Trainingsmethoden gebildet werden.

Hinweis: Sie sollten folgende Fragen beantworten:

  1. Welcher Vergleich wird signifikant und welcher nicht?
    Es wird ersichtlich, dass sich die Trainingsmethoden 1 und 2 sowie 3 und 4 bezüglich der Ausdauertest signifikant unterscheiden (p < .05).

  2. Welche Gruppen sind unabhängig und welche nicht?
    Es gibt also vier unabhängige Gruppen von Trainingsmethoden.

  3. Optional: Sind Gruppenbildungen möglich/ sinnvoll? - Wenn ja, welche?
    Es werden vier Gruppen gebildet - kein Veränderung.

Der TukeyHSD ist für homogene Varianzen sehr gut geeignet, aber nicht für hetrogene Varianzen.

library(rstatix)
anovaohne %>% 
  games_howell_test(Ausdauertest ~ Trainingsarten)

Der Games-Howell ist ein Post-Hoc-Test, der optimiert für hetrogene Daten ist. Daher der Levene-Test eine Verletzung der Homogenotät nahliegt, sollte in Verfahren verwendet werden, welche dieses Verletzung bei dem multiple Tests berücksichtigt.

Wie der Tabelle zu entnehmen ist, gibt es keinen Unterschied- daher bestätigt der Games-Howell-Test das Ergebnis des TukeyHSDs.

Profildiagramm

Spannend ist auch sich die Mittelwerte hilfe dieses Plots anzeigen zu lassen.

ggplot(anovaohne, aes(x=Trainingsarten, y=Ausdauertest, group=1))+
  stat_summary(fun = mean, geom="point", size=3)+
  stat_summary(fun = mean, geom="line")+
  stat_summary(fun.data = mean_cl_normal, geom="errorbar",width=.2, size=.25)+
  labs(x="Trainingsart", y="Ausdauer")+
  theme_classic()

Wie der Plot in Abbildung erkennen lassen, bestehen bezüglich der vier Trainingsmethoden unterschiede im Mittelwert.

Das partielle Eta-Quadrat

Das partielle Eta-Quadrat (partielles η²) ist ein Maß für die Effektstärke, das die durch einen Faktor erklärte Variation ins Verhältnis zurjenigen setzt, die nicht durch die übrigen Faktoren im Modell erklärt wird.
Anders gesagt, es betrachtet ausschließlich den Anteil der Gesamtvariation, der nach Herausrechnung der Effekte aller anderen Faktoren übrig bleibt, und zeigt, welchen Anteil davon der betrachtete Faktor erklärt.
Bei einer einfaktoriellen Varianzanalyse entspricht das partielle η² genau dem Anteil der korrigierten Gesamtvariation, den das Modell (bzw. der Faktor) erklärt.

\[\eta^2 =\frac{QS_{Zwischen}}{QS_{total}}\] \[\eta^2_{par.} =\frac{QS_{Zwischen}}{QS_{zwischen}+QS_{innerhalb}}\]

library(effectsize)

ANOVA <- aov(data=anovaohne, anovaohne$Ausdauertest~anovaohne$Trainingsarten)
eta <- effectsize::eta_squared(ANOVA, partial = TRUE)
For one-way between subjects designs, partial eta squared is equivalent to eta squared.
Returning eta squared.
eta
Parameter                | Eta2 |       90% CI
----------------------------------------------
anovaohne$Trainingsarten | 0.92 | [0.89, 0.93]

Hinweis: Im vorliegenden Beispiel beträgt das partielle Eta-Quadrat .92. Das heisst, es wird 92% der Variation in Ausdauertest durch Trainingsarten aufgeklärt. Das partielle Eta² wird gerundet.“90% CI” beschreibt das Konfidenzintervall für 90 %. Dieses liegt hier zwischen 89% und 93%.

Effektstärke

Um die Bedeutsamkeit eines Ergebnisses zu beurteilen, werden Effektstärken berechnet.

Da R das partielle Eta-Quadrat ausgibt, wird dieses hier in die Effektstärke nach Cohen (1988) umgerechnet. In diesem Fall befindet sich die Effektstärke immer zwischen 0 und unendlich.

\[f=\sqrt\frac{eta^{2}}{1-eta^{2}}\]


eff<- sqrt(eta$Eta2/(1-eta$Eta2))
sprintf ("Die Effektstärke liegt bei:%.2f",eff)

Um zu beurteilen, wie gross dieser Effekt ist, kann man sich an der Einteilung von Cohen (1988) orientieren:

\[ \begin{align} \text{Schwacher Effekt: } 0.10 &< ||f|| < 0.25 \\ \text{Schwacher bis mittlerer Effekt: } 0.25 &= ||f|| \\ \text{Mittlerer Effekt: } 0.25 &< ||f|| < 0.40 \\ \text{Mittlerer bis starker Effekt: }0.40 &= ||f|| \\ \text{Starker Effekt: } 0.40 &< ||f|| \end{align} \]

Hinweis: Diese Beispiel ist sehr sauber und etwas “zu” eindeutig. Damit entspricht eine Effektstärke von 3.29 einem starken Effekt.

Eine Aussage

Die Auswahl der Trainingsmethode hat einen signifikanten Einfluss auf die Ausdauer (F(3,62.68) = 446.85 , p = .000). 92% der Streuung der Ausdauer-Werte um den Gesamtmittelwert kann durch die Trainingsmethoden erklärt werden. Die Effektstärke nach Cohen (1988) liegt bei f = 3.28 und entspricht einem starken Effekt. H0 wird abgelehnt, H1 angenommen.

Post-hoc-Tests mit Tukey zeigen, dass sich vier Gruppen von Trainingsarten bilden lassen (alle p < .05):

Trainingsart 1 (M = 38.82, SD = 3.99, n = 29), Trainingsart 2 (M = 48.16, SD = 3.45, n = 30) Trainingsart 3 (M = 25.10, SD = 3.05, n = 30) und Trainingsart 4 (M = 22.03, SD = 2.42, n = 30) bilden jede für sich eine eigene Gruppe.

Damit kann festgehalten, werden, dass alle vier Gruppen unabhängige Gruppen bilden und sich signifikant unterscheiden. Trainingsart 2 ist am effektivsten und die Trainingsart 4 am schlechtesten für die Ausdauer der Senioren.

LS0tDQp0aXRsZTogIkRlciBlaW5mYWt0b3JpZWxsZW4gVmFyaWFuemFuYWx5c2UiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCmxpYnJhcnkoZ2dwbG90MikgI0RpYWdyYW1tZQ0KbGlicmFyeShkcGx5cikgICAjICU8JSBHcnVwcGllcnVuZyANCmxpYnJhcnkocHN5Y2gpICAgIyBEaXMuIFN0YXRpc3Rpaw0KbGlicmFyeShjYXIpICAgICMgbGV2ZW5lDQpsaWJyYXJ5KGVmZnNpemUpICNldGENCmxpYnJhcnkobHNyKSAgICAjZXRhDQpsaWJyYXJ5KEhtaXNjKQ0KDQpgYGANCg0KDQoNCiMgSHlwb3RoZXNlIA0KSDE6IEVzIGdpYnQgZWluZW4gTWl0dGVsd2VydHN1bnRlcnNjaGllZCB6d2lzY2hlbiBkZXIgVHJhaW5pbmdzYXJ0ZW4NCiooVHJhaW5pbmcxLCBUcmFpbmluZyAyLCBUcmFpbmluZyAzLCBUcmFpbmluZyA0KSogdW5kIGRlciBBdXNkYXVlci4NCg0KJE1fezF9IFxuZXEgTV97Mn0gXG5lcSBNX3szfSBcbmVxIE1fezR9IFx0ZXh0IHsgIGbDvHIgbWluLiBlaW5lbiBWZXJnbGVpY2h9JA0KDQpIMDogRXMgZ2lidCBrZWluZW4gTWl0dGVsd2VydHN1bnRlcnNjaGllZCB6d2lzY2hlbiBkZXIgVHJhaW5pbmdzYXJ0ZW4NCiooVHJhaW5pbmcxLCBUcmFpbmluZyAyLCBUcmFpbmluZyAzLCBUcmFpbmluZyA0KSogdW5kIGRlciBBdXNkYXVlci4NCiRNX3sxfSA9IE1fezJ9PSBNX3szfT0gTV97NH0kDQoNCiMgVm9yYXVzc2V0enVuZ2VuIGRlciBlaW5mYWt0b3JpZWxsZW4gVmFyaWFuemFuYWx5c2Ugb2huZSBNZXNzd2llZGVyaG9sdW5nDQoNCuKckyBEaWUgYWJow6RuZ2lnZSBWYXJpYWJsZSBpc3QgaW50ZXJ2YWxsc2thbGllcnQgLT4gQXVzZGF1ZXIgaXN0IG1ldHJpc2NoDQogDQrinJMgRGllIHVuYWJow6RuZ2lnZSBWYXJpYWJsZSAoRmFrdG9yKSBpc3Qga2F0ZWdvcmlhbCAobm9taW5hbC0gb2RlciBvcmRpbmFsc2thbGllcnQpDQotPiBEaWUgVHJhaW5pbmdzYXJ0ZW4gc2luZCBub21pbmFsLXNrYWxpZXJ0Lg0KDQoNCuKckyBEaWUgZHVyY2ggZGVuIEZha3RvciBnZWJpbGRldGVuIEdydXBwZW4gc2luZCB1bmFiaMOkbmdpZw0KSmVkZXIgVGVpbG5laG1lckluIGhhdCBhdXNzY2hsaWVzc2xpY2ggaW4gc2VpbmVyIG9kZXIgaWhyZXIgR3J1cHBlIHRyYWluaWVydC4NCg0K4pyTIERpZSBhYmjDpG5naWdlIFZhcmlhYmxlbiBpc3Qgbm9ybWFsdmVydGVpbHQgaW5uZXJoYWxiIGplZGVyIGRlciBHcnVwcGVuIA0KKEFiID4gMjUgUHJvYmFuZGVuIHBybyBHcnVwcGUgc2luZCBWZXJsZXR6dW5nZW4gaW4gZGVyIFJlZ2VsIHVucHJvYmxlbWF0aXNjaCkgLT4gc2llaGUgSGlzdG9ncmFtbSB1bmQgUVFwbG90DQoNCg0K4pyTIEhvbW9nZW5pdMOkdCBkZXIgVmFyaWFuemVuOiBEaWUgR3J1cHBlbiBzdGFtbWVuIGF1cyBHcnVuZGdlc2FtdGhlaXRlbiBtaXQgDQphbm7DpGhlcm5kIGlkZW50aXNjaGVuIFZhcmlhbnplbiBkZXIgYWJow6RuZ2lnZW4gVmFyaWFibGVuIC0+IHNpZWhlIExldmVuZS1UZXN0DQoNCg0KIyBCb3hwbG90cyANCg0KYGBge3J9DQpib3hwbG90KGFub3Zhb2huZSRBdXNkYXVlcnRlc3QgfiBhbm92YW9obmUkVHJhaW5pbmdzYXJ0ZW4sIG1haW4gPSAiQm94cGxvdHMgenVtIFZlcmdsZWljaCIsIHlsYWIgPSAiQXVzZGF1ZXIiLCB4bGFiPSAiVHJhaW5pbmdzbWV0aG9kZSIgLCBjb2wgPSBjKCJsaWdodGdyZWVuIiwgImRlZXBza3libHVlIiwidG9tYXRvIiwgIm9yYW5nZSIpKQ0KDQpgYGANCg0KQm94cGxvdCB6ZWlndCBrZWluZSBBdXNyZWlzc2VyLg0KRGllIFZlcnRlaWx1bmdlbiBzY2hlaW5lbiBzaWNoIHZvbiBlaW5hbmRlciB6dSB1bnRlcnNjaGVpZGVuLCBhbGxlcmRpbmdzIG5pY2h0IHNvIGVpbmRldXRpZyBiZWkgVHJhaW5pbmcgMyB1bmQgVHJhaW5pbmcgNC4NCg0KDQoNCg0KIyBOb3JtYWx2ZXJ0ZWlsdW5nIC0+IFByw7xmdW5nIG1pdHRlbHMgSGlzdG9ncmFtbQ0KDQpVbSBlaW5lbiBlcnN0ZW4gw5xiZXJibGljayDDvGJlciBkaWUgRGF0ZW4genUgZ2V3aW5uZW4sIGVtcGZpZWhsdCBlcyBzaWNoIEhpc3RvZ3JhbW1tIHp1IGVyc3RlbGxlbi4NCmBgYHtyfQ0KYW5vdmFvaG5lICU+JQ0KICBncm91cF9ieShUcmFpbmluZ3NhcnRlbikgJT4lDQogIGdncGxvdChhZXMoQXVzZGF1ZXJ0ZXN0LCBjb2xvcj1UcmFpbmluZ3NhcnRlbikpICsgDQogIGdlb21faGlzdG9ncmFtKGFlcyhmaWxsID0gVHJhaW5pbmdzYXJ0ZW4pLCBiaW5zID0gMjApICsNCiAgZmFjZXRfd3JhcCh+VHJhaW5pbmdzYXJ0ZW4pICsNCiAgdGhlbWVfZ3JleSgpKw0KICBsYWJzKHg9ICJBdXNkYXVlcnRlc3QiLHkgPSAiQW56YWhsIiApDQpgYGANCkRpZSBEYXRlbiBzaW5kIG5vcm1hbHZlcnRlaWx0LCB3ZW5uIGF1Y2ggbmljaHQgcGVyZmVrdC4NCg0KIyMjIEFsdGVybmF0aXYgUVFQbG90DQoNCmBgYHtyfQ0KbGlicmFyeShjYXIpDQoNCnFxUGxvdChBdXNkYXVlcnRlc3QgfiBUcmFpbmluZ3NhcnRlbiwgZGF0YT1hbm92YW9obmUsIA0KICAgICAgIGxheW91dD1jKDEsIDQpKQ0KDQpgYGANCg0KRGllIERhdGVuIHNpbmQgbm9ybWFsdmVydGVpbHQuDQoNCg0KIyBQcsO8ZnVuZyBkZXIgVmFyaWFuemhvbW9nZW5pdMOkdCAoTGV2ZW5lLVRlc3QpDQoNCg0KRGVyIExldmVuZS1UZXN0IHByw7xmdCBkaWUgTnVsbGh5cG90aGVzZSwgZGFzcyBkaWUgVmFyaWFuemVuIGRlciBHcnVwcGVuIHNpY2ggbmljaHQgdW50ZXJzY2hlaWRlbi4gSXN0IGRlciBMZXZlbmUtVGVzdCBuaWNodHNpZ25pZmlrYW50LCBzbyBrYW5uIHZvbiBob21vZ2VuZW4gVmFyaWFuemVuIGF1c2dlZ2FuZ2VuLiBXw6RyZSBkZXIgTGV2ZW5lLVRlc3QgamVkb2NoIHNpZ25pZmlrYW50LCBzbyB3w6RyZSBlaW5lIGRlciBHcnVuZHZvcmF1c3NldHp1bmdlbiBkZXIgVmFyaWFuemFuYWx5c2UgdmVybGV0enQuIEdlZ2VuIGxlaWNodGUgVmVybGV0enVuZ2VuIGdpbHQgZGllIFZhcmlhbnphbmFseXNlIGFscyByb2J1c3Q7IHZvciBhbGxlbSBiZWkgZ2Vuw7xnZW5kIGdyb3NzZW4gdW5kIGV0d2EgZ2xlaWNoIGdyb3NzZW4gR3J1cHBlbiBzaW5kIFZlcmxldHp1bmdlbiBuaWNodCBwcm9ibGVtYXRpc2NoLiBCZWkgdW5nbGVpY2ggZ3Jvc3NlbiBHcnVwcGVuIGbDvGhydCBlaW5lIHN0YXJrZSBWZXJsZXR6dW5nIGRlciBWYXJpYW56aG9tb2dlbml0w6R0IHp1IGVpbmVyIFZlcnplcnJ1bmcgZGVzIEYtVGVzdHMuIEFsdGVybmF0aXYga8O2bm5lbiBkYW5uIGF1ZiBkZW4gZGVuIFdlbGNoLVRlc3QgenVyw7xja2dlZ3JpZmZlbiB3ZXJkZW4uIERhYmVpIGhhbmRlbHQgZXMgc2ljaCB1bSBhZGp1c3RpZXJ0ZSBGLVRlc3RzLiANCg0KYGBge3J9DQpsZXZlbmVUZXN0KGFub3Zhb2huZSRBdXNkYXVlcnRlc3QgfiBhbm92YW9obmUkVHJhaW5pbmdzYXJ0ZW4sIGNlbnRlcj0ibWVhbiIpDQpgYGANCg0KSW0gdm9ybGllZ2VuZGVuIEJlaXNwaWVsIGlzdCBkZXIgTGV2ZW5lLVRlc3Qgc2lnbmlmaWthbnQoRigzLDExNSkgPSAyLjkwOCwgcCA9IC4wMzcpLCBzbyBkYXNzIHZvbiBWYXJpYW56aGV0cm9nZW5pdMOkdCBhdXNnZWdhbmdlbiB3ZXJkZW4ga2Fubi4NCkRhcyBoZWlzc3QgLSBlcyBtdXNzIGVpbmUgV2VsY2gtS29ycmVrdHVyIGR1cmNoZ2Vmw7xocnQgd2VyZGVuLiANCg0KDQoqKk1pdCBXZWxjaC1Lb3JyZWt0dXI6IHAgPCAwLjA1ID0+IEVyZ2VibmlzIFNpZ25pZmlrYW50IC0tPiBWYXJpYW56ZW4gaGV0ZXJvZ2VuKioNCg0KKipPaG5lIFdlbGNoLUtvcnJla3R1cjogcCA+IDAuMDUgPT4gRXJnZWJuaXMgbmljaHQgU2lnbmlmaWthbnQgLS0+IFZhcmlhbnplbiBob21vZ2VuIC0tPiBIMCBtaXQgQW5uYWhtZSBWYXIxPVZhcjI9Li4uIC0+IFZhcl9uIHdpcmQgYW5nZW5vbW1lbioqDQogICANCiAgIA0KICAgDQoNCg0KIyBEZXNrcmlwdGl2ZSBTdGF0aXN0aWtlbg0KDQpEaWUgVGFiZWxsZSBpbiBBYmJpbGR1bmcgZ2lidCBkaWUgTWl0dGVsd2VydGUsIFN0YW5kYXJkYWJ3ZWljaHVuZ2VuIHVuZCBHcsO2c3NlbiBhbGxlciB2aWVyIEdydXBwZW4gd2llZGVyLiBEaWVzZSBJbmZvcm1hdGlvbmVuIHdlcmRlbiBmw7xyIGRpZSBCZXJpY2h0ZXJzdGF0dHVuZyB2ZXJ3ZW5kZXQuDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIHNvbGx0ZSBlaW4gTWVsZHVuZyB6dW0gVGhlbWEgInN1bW1hcmlzZSIgZXJzY2hlaW5lbiAtIHRhdXNjaGVuIFNpZSBzIG1pdCB6IG9kZXIgYW5kZXJlcyBydW0gDQphbm92YW9obmUgJT4lDQpncm91cF9ieShUcmFpbmluZ3NhcnRlbikgJT4lDQogIHN1bW1hcmlzZShBbnphaGwgPSBuKCksIE1pdHRlbHdlcnQgPSBtZWFuKEF1c2RhdWVydGVzdCksIE1lZGlhbiA9IG1lZGlhbihBdXNkYXVlcnRlc3QpLCBTdGFuZGFyZGFid2VpY2h1bmcgPSBzZChBdXNkYXVlcnRlc3QpKSAlPiUNCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIHJvdW5kLCAyKQ0KYGBgDQoNCkVzIGdpYnQgZWluZW4gTWl0dGVsd2VydHN1bnRlcnNjaGllZCB6d2lzY2hlbiBkZW4gR3J1cHBlbi4gVHJhaW5pbmdzYXJ0IDIgKE0gPSA0OC4xNiwgU0QgPSAzLjQ1LCBuID0gMzApIHplaWd0IGRpZSBiZXN0ZW4gQXVzZGF1ZXJlcmdlYm5pc3NlLCBnZWZvbGd0IHZvbiBUcmFpbmluZ3NncnVwcGUgMiAoTSAzOC44MiwgU0QgPSAzLjk5LG4gPSAyOSkuIA0KV2llIGJlcmVpdHMgYmVpbSBCb3hwbG90IHp1IGVya2VubmVuIHdhciwgaXN0IGRlciBBYnN0YW5kIGRlciBNaXR0ZWx3ZXJ0IGJlaSBUcmFpbmluZ3NhcnQgMyAoTSA9IDI1LjEwLCBTRCA9IDMuMDUsIG4gPSAzMCkgdW5kIFRyYWluaW5nc2FydCA0KCBNID0gMjIuMDMsIFNEID0gMi40MiwgbiA9IDMwKSDDpGhubGljaCBhdXNnZWZhbGxlbi4NCg0KDQoNCiMgRXJnZWJuaXNzZSBkZXIgZWluZmFrdG9yaWVsbGVuIFZhcmlhbnphbmFseXNlDQoNCg0KIyMgTW9kZWxsIA0KRGFzIE1vZGVsbCB3aXJkIGltIFBvc3QtSG9jIGFscyBhdWNoIGJlaW0gRXRhXjIgdmVyd2VuZGV0Lg0KDQpgYGB7cn0NCkFOT1ZBIDwtIGFvdihkYXRhPWFub3Zhb2huZSwgYW5vdmFvaG5lJEF1c2RhdWVydGVzdH5hbm92YW9obmUkVHJhaW5pbmdzYXJ0ZW4pICNNb2RlbCBnZWJpbGRldA0KYGBgDQoNCg0KDQojIyMgbWl0IFdlbGNoLUtvcnJla3R1cg0KDQoNCmBgYHtyfQ0KQU5PVkFtaXRXZWxjaCA8LSBvbmV3YXkudGVzdChhbm92YW9obmUkQXVzZGF1ZXJ0ZXN0IH4gYW5vdmFvaG5lJFRyYWluaW5nc2FydGVuKQ0KQU5PVkFtaXRXZWxjaA0KDQpgYGANCg0KDQpEYXMgR2VzYW10bW9kZWwgaXN0IHNpZ25pZmlrYW50IGdld29yZGVuIChGKDMsNjIuNjgpID0gNDQ2Ljg1ICwgcCA9IC4wMDApLiBBbGxlcmRpbmdzIGzDpHNzdCBzaWNoIGF1ZmdydW5kIGRpZXNlcyBUZXN0cyBuaWNodCBiZXN0aW1tZW4sIHdlbGNoZSBkZXIgdmllciBHcnVwcGVuIHNpY2ggc2lnbmlmaWthbnQgdm9uZWluYW5kZXIgdW50ZXJzY2hlaWRlbi4gRXMgaXN0IGRlbmtiYXIsIGRhc3Mgc2ljaCBsZWRpZ2xpY2ggZWluIFBhYXIgc2lnbmlmaWthbnQgdW50ZXJzY2hlaWRldCB1bmQgendpc2NoZW4gZGVuIMO8YnJpZ2VuIGtlaW5lIHNpZ25pZmlrYW50ZW4gVW50ZXJzY2hpZWRlIHZvcmxpZWdlbi4gRGFoZXIgd2lyZCBlaW4gUG9zdC1ob2MtVGVzdCBkdXJjaGdlZsO8aHJ0Lg0KDQoNCiMjIyBvaG5lIFdlbGNoLUtvcnJla3R1cg0KDQpgYGB7cn0NCnN1bW1hcnkoQU5PVkEpDQpgYGANCg0KDQoNCiMgUG9zdC1ob2MtVGVzdHMNCg0KT2J3b2hsIGRlciBGIC1UZXN0IHplaWd0LCBkYXNzIGVpbiBIYXVwdGVmZmVrdCB2b24gVHJhaW5pbmdzYXJ0ZW4gIGF1ZiBBdXNkYXVlcnRlc3QgIGJlc3RlaHQsIG11c3MgYW5oYW5kIHZvbiBQb3N0LWhvYy1UZXN0cyBnZWtsw6RydCB3ZXJkZW4sIHp3aXNjaGVuIHdlbGNoZW4gRmFrdG9yc3R1ZmVuIChUcmFpbmluZ3NtZXRob2Rlbikgc2lnbmlmaWthbnRlIFVudGVyc2NoaWVkZSBiZXrDvGdsaWNoIGRlciBBdXNkYXVlcnRlc3QgYmVzdGVoZW4uDQoNCiQkXGZyYWN7a1xjZG90KGstMSl9ezJ9ID1cZnJhY3s0XGNkb3QoNC0xKX17Mn0gPSBcZnJhY3sxMn17Mn0gPSA2JCQNCm1pdCANCiRrJCA9IEF1c3Byw6RndW5nZW4vIEdydXBwZW4vIFN0dWZlbg0KDQpCZWkgZGVyIEJlcmVjaG51bmcgdm9uIFBvc3QtaG9jLVRlc3RzIHdpcmQgaW0gUHJpbnppcCBmw7xyIGplZGUgS29tYmluYXRpb24gdm9uIHp3ZWkgTWl0dGVsd2VydGVuIGVpbiB0IC1UZXN0IGR1cmNoZ2Vmw7xocnQuIEltIGFrdHVlbGxlbiBCZWlzcGllbCBtaXQgdmllciBHcnVwcGVuIHNpbmQgZGllcyA2IFRlc3RzLiBNdWx0aXBsZSBUZXN0cyBzaW5kIGplZG9jaCBwcm9ibGVtYXRpc2NoLCBkYSBkZXIgQWxwaGEtRmVobGVyIChkaWUgZsOkbHNjaGxpY2hlIEFibGVobnVuZyBkZXIgTnVsbGh5cG90aGVzZSkgbWl0IGRlciBBbnphaGwgZGVyIFZlcmdsZWljaGUgc3RlaWd0Lg0KDQpXaXJkIG51ciBlaW4gdC1UZXN0IG1pdCBlaW5lbSBTaWduaWZpa2FuemxldmVsIHZvbiAuMDUgZHVyY2hnZWbDvGhydCwgc28gYmV0csOkZ3QgZGllIFdhaHJzY2hlaW5saWNoa2VpdCBkZXMgTmljaHQtRWludHJlZmZlbnMgZGVzIEFscGhhLUZlaGxlcnMgOTUgUHJvemVudC4gV2VyZGVuIGplZG9jaCBzZWNocyBzb2xjaGVyIFBhYXJ2ZXJnbGVpY2hlIHZvcmdlbm9tbWVuLCBzbyBiZXRyw6RndCBkaWUgTmljaHQtRWludHJlZmZlbnMtV2FocnNjaGVpbmxpY2hrZWl0IGRlcyBBbHBoYS1GZWhsZXJzICguOTUpXjYgPSAuNzM1LiBVbSBkaWUgV2FocnNjaGVpbmxpY2hrZWl0IGRlcyBFaW50cmVmZmVucyBkZXMgQWxwaGEtRmVobGVycyB6dSBiZXN0aW1tZW4sIHdpcmQgMSAtIC43MzUgPSAuMjY0OSBnZXJlY2huZXQuIERpZSBXYWhyc2NoZWlubGljaGtlaXQgZGVzIEVpbnRyZWZmZW5zIGRlcyBBbHBoYS1GZWhsZXJzIGxpZWd0IHNvbWl0IA0KYmVpIDI2LjQ5IFByb3plbnQuIERpZXNlIEZlaGxlcndhaHJzY2hlaW5saWNoa2VpdCB3aXJkIGFscyAiRmFtaWx5d2lzZSBFcnJvciBSYXRlIiBiZXplaWNobmV0Lg0KDQpVbSBkaWVzZXMgUHJvYmxlbSB6dSBiZWhlYmVuIGthbm4genVtIEJlaXNwaWVsIGRpZSBUdXJrZXkgYW5nZXdlbmRldCB3ZXJkZW4uIA0KUlN0dWRpbyByZWNobmV0IGRhcyBuZXVlIE5pdmVhdSBlaW4sIGRhaGVyIGvDtm5uZW4gd2lyIHdlaXRlciBhdWYgMC4wNSB0ZXN0ZW4uDQoNCmBgYHtyfQ0KVFVLRVk8LSBUdWtleUhTRChhb3YoZGF0YT1hbm92YW9obmUsIGFub3Zhb2huZSRBdXNkYXVlcnRlc3R+YW5vdmFvaG5lJFRyYWluaW5nc2FydGVuKSkNClRVS0VZDQpgYGANCg0KKipIaW53ZWlzIGbDvHIgRnJhZ2UgMDEgdW5kIDAyKioNCmBgYHtyfQ0KcGxvdChUVUtFWSAsIGxhcz0xICwgY29sPSJyZWQiKQ0KYGBgDQoNCioqSGlud2VpcyBmw7xyIEZyYWdlIDAzKioNCg0KYGBge3J9DQpsaWJyYXJ5KG11bHRjb21wVmlldykNCmdlbmVyYXRlX2xhYmVsX2RmIDwtIGZ1bmN0aW9uKFRVS0VZLCB2YXJpYWJsZSl7DQogICAgIFR1a2V5LmxldmVscyA8LSBUVUtFWVtbdmFyaWFibGVdXVssNF0NCiAgICAgVHVrZXkubGFiZWxzIDwtIGRhdGEuZnJhbWUobXVsdGNvbXBMZXR0ZXJzKFR1a2V5LmxldmVscylbJ0xldHRlcnMnXSkNCiAgICAgVHVrZXkubGFiZWxzJHRyZWF0bWVudD1yb3duYW1lcyhUdWtleS5sYWJlbHMpDQogICAgIFR1a2V5LmxhYmVscz1UdWtleS5sYWJlbHNbb3JkZXIoVHVrZXkubGFiZWxzJHRyZWF0bWVudCkgLCBdDQogICAgIHJldHVybihUdWtleS5sYWJlbHMpDQp9DQogDQpMQUJFTFMgPC0gZ2VuZXJhdGVfbGFiZWxfZGYoVFVLRVkgLCAiYW5vdmFvaG5lJFRyYWluaW5nc2FydGVuIikNCg0KdGFibGUoTEFCRUxTKQ0KYGBgDQoNCg0KRXMgd2lyZCBlcnNpY2h0bGljaCwgZGFzcyBzaWNoIGRpZSBUcmFpbmluZ3NtZXRob2RlbiAxIHVuZCAyIHNvd2llIDMgdW5kIDQgDQpiZXrDvGdsaWNoIGRlciBBdXNkYXVlcnRlc3Qgc2lnbmlmaWthbnQgdW50ZXJzY2hlaWRlbi4gKHAgPCAuMDUpLiANCg0KDQpFcyBrw7ZubmVuIGFsc28gdmllciB1bmFiaMOkbmdpZ2UvIGdlbmVyYWxpc2llcmJhcmUgR3J1cHBlbiB2b24gVHJhaW5pbmdzbWV0aG9kZW4gZ2ViaWxkZXQgd2VyZGVuLg0KDQoNCioqSGlud2VpczoqKg0KU2llIHNvbGx0ZW4gZm9sZ2VuZGUgRnJhZ2VuIGJlYW50d29ydGVuOiANCg0KDQoxKSBXZWxjaGVyIFZlcmdsZWljaCB3aXJkIHNpZ25pZmlrYW50IHVuZCB3ZWxjaGVyIG5pY2h0PyA8YnI+DQpFcyB3aXJkIGVyc2ljaHRsaWNoLCBkYXNzIHNpY2ggZGllIFRyYWluaW5nc21ldGhvZGVuIDEgdW5kIDIgc293aWUgMyB1bmQgNCBiZXrDvGdsaWNoIGRlciBBdXNkYXVlcnRlc3Qgc2lnbmlmaWthbnQgdW50ZXJzY2hlaWRlbiAocCA8IC4wNSkuIA0KDQoyKSBXZWxjaGUgR3J1cHBlbiBzaW5kIHVuYWJow6RuZ2lnIHVuZCB3ZWxjaGUgbmljaHQ/PGJyPg0KRXMgZ2lidCBhbHNvIHZpZXIgdW5hYmjDpG5naWdlIEdydXBwZW4gdm9uIFRyYWluaW5nc21ldGhvZGVuLg0KDQozKSBPcHRpb25hbDogU2luZCBHcnVwcGVuYmlsZHVuZ2VuIG3DtmdsaWNoLyBzaW5udm9sbD8gLSBXZW5uIGphLCB3ZWxjaGU/IDxicj4NCkVzIHdlcmRlbiB2aWVyIEdydXBwZW4gZ2ViaWxkZXQgLSBrZWluIFZlcsOkbmRlcnVuZy4gDQoNCg0KDQoqKkRlciBUdWtleUhTRCBpc3QgZsO8ciBob21vZ2VuZSBWYXJpYW56ZW4gc2VociBndXQgZ2VlaWduZXQsIGFiZXIgbmljaHQgZsO8ciBoZXRyb2dlbmUgVmFyaWFuemVuLioqDQoNCmBgYHtyfQ0KbGlicmFyeShyc3RhdGl4KQ0KYGBgDQoNCmBgYHtyfQ0KYW5vdmFvaG5lICU+JSANCiAgZ2FtZXNfaG93ZWxsX3Rlc3QoQXVzZGF1ZXJ0ZXN0IH4gVHJhaW5pbmdzYXJ0ZW4pDQoNCmBgYA0KDQpEZXIgR2FtZXMtSG93ZWxsIGlzdCBlaW4gUG9zdC1Ib2MtVGVzdCwgZGVyIG9wdGltaWVydCBmw7xyIGhldHJvZ2VuZSBEYXRlbiBpc3QuIERhaGVyIGRlciBMZXZlbmUtVGVzdCBlaW5lIFZlcmxldHp1bmcgZGVyIEhvbW9nZW5vdMOkdCBuYWhsaWVndCwgc29sbHRlIGluIFZlcmZhaHJlbiB2ZXJ3ZW5kZXQgd2VyZGVuLCB3ZWxjaGUgZGllc2VzIFZlcmxldHp1bmcgYmVpIGRlbSBtdWx0aXBsZSBUZXN0cyBiZXLDvGNrc2ljaHRpZ3QuIA0KDQpXaWUgZGVyIFRhYmVsbGUgenUgZW50bmVobWVuIGlzdCwgZ2lidCBlcyBrZWluZW4gVW50ZXJzY2hpZWQtIGRhaGVyIGJlc3TDpHRpZ3QgZGVyIEdhbWVzLUhvd2VsbC1UZXN0IGRhcyBFcmdlYm5pcyBkZXMgVHVrZXlIU0RzLiANCg0KDQoNCiMgUHJvZmlsZGlhZ3JhbW0NClNwYW5uZW5kIGlzdCBhdWNoIHNpY2ggZGllIE1pdHRlbHdlcnRlIGhpbGZlIGRpZXNlcyBQbG90cyBhbnplaWdlbiB6dSBsYXNzZW4uDQoNCg0KYGBge3J9DQpnZ3Bsb3QoYW5vdmFvaG5lLCBhZXMoeD1UcmFpbmluZ3NhcnRlbiwgeT1BdXNkYXVlcnRlc3QsIGdyb3VwPTEpKSsNCiAgc3RhdF9zdW1tYXJ5KGZ1biA9IG1lYW4sIGdlb209InBvaW50Iiwgc2l6ZT0zKSsNCiAgc3RhdF9zdW1tYXJ5KGZ1biA9IG1lYW4sIGdlb209ImxpbmUiKSsNCiAgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhID0gbWVhbl9jbF9ub3JtYWwsIGdlb209ImVycm9yYmFyIix3aWR0aD0uMiwgc2l6ZT0uMjUpKw0KICBsYWJzKHg9IlRyYWluaW5nc2FydCIsIHk9IkF1c2RhdWVyIikrDQogIHRoZW1lX2NsYXNzaWMoKQ0KDQpgYGANCg0KV2llIGRlciBQbG90IGluIEFiYmlsZHVuZyBlcmtlbm5lbiBsYXNzZW4sIGJlc3RlaGVuIGJlesO8Z2xpY2ggZGVyIHZpZXIgVHJhaW5pbmdzbWV0aG9kZW4gdW50ZXJzY2hpZWRlIGltIE1pdHRlbHdlcnQuDQoNCiMgRGFzIHBhcnRpZWxsZSBFdGEtUXVhZHJhdA0KDQpEYXMgcGFydGllbGxlIEV0YS1RdWFkcmF0IChwYXJ0aWVsbGVzIM63MikgaXN0IGVpbiBNYXNzIGbDvHIgZGllIEVmZmVrdGdyw7Zzc2U6IEVzIHNldHp0IGRpZSBWYXJpYXRpb24sIGRpZSBkdXJjaCBlaW5lbiBGYWt0b3IgZXJrbMOkcnQgd2lyZCwgaW4gQmV6dWcgbWl0IGplbmVyIFZhcmlhdGlvbiwgZGllIG5pY2h0IGR1cmNoIGFuZGVyZSBGYWt0b3JlbiBpbSBNb2RlbGwgZXJrbMOkcnQgd2lyZC4gRGFzIGhlaXNzdCwgZXMgd2lyZCBhdXNzY2hsaWVzc2xpY2ggamVuZSBWYXJpYXRpb24gYmV0cmFjaHRldCwgd2VsY2hlIG5pY2h0IGR1cmNoIGRpZSBhbmRlcmVuIEZha3RvcmVuIGltIE1vZGVsbCBlcmtsw6RydCB3aXJkLiBEYXMgcGFydGllbGxlIEV0YS1RdWFkcmF0IHplaWd0LCB3ZWxjaGVuIEFudGVpbCBkYXZvbiBlaW4gRmFrdG9yIGVya2zDpHJ0LiBJbSBGYWxsZSBkZXIgZWluZmFrdG9yaWVsbGVuIFZhcmlhbnphbmFseXNlIGlzdCBkYXMgcGFydGllbGxlIEV0YS1RdWFkcmF0IGlzdCBqZW5lciBBbnRlaWwgZGVyIGtvcnJpZ2llcnRlbiBHZXNhbXR2YXJpYXRpb24sIGRlciBkdXJjaCBkYXMgTW9kZWxsIGVya2zDpHJ0IHdpcmQuDQoNCg0KJCRcZXRhXjIgPVxmcmFje1FTX3tad2lzY2hlbn19e1FTX3t0b3RhbH19JCQNCiQkXGV0YV4yX3twYXIufSA9XGZyYWN7UVNfe1p3aXNjaGVufX17UVNfe3p3aXNjaGVufStRU197aW5uZXJoYWxifX0kJA0KDQoNCmBgYHtyfQ0KbGlicmFyeShlZmZlY3RzaXplKQ0KDQpBTk9WQSA8LSBhb3YoZGF0YT1hbm92YW9obmUsIGFub3Zhb2huZSRBdXNkYXVlcnRlc3R+YW5vdmFvaG5lJFRyYWluaW5nc2FydGVuKQ0KZXRhIDwtIGVmZmVjdHNpemU6OmV0YV9zcXVhcmVkKEFOT1ZBLCBwYXJ0aWFsID0gVFJVRSkNCmV0YQ0KDQpgYGANCipIaW53ZWlzOiogSW0gdm9ybGllZ2VuZGVuIEJlaXNwaWVsIGJldHLDpGd0IGRhcyBwYXJ0aWVsbGUgRXRhLVF1YWRyYXQgLjkyLiBEYXMgaGVpc3N0LCBlcyB3aXJkIDkyJSBkZXIgVmFyaWF0aW9uIGluIEF1c2RhdWVydGVzdCAgZHVyY2ggVHJhaW5pbmdzYXJ0ZW4gYXVmZ2VrbMOkcnQuIERhcyBwYXJ0aWVsbGUgRXRhwrIgd2lyZCBnZXJ1bmRldC4iOTAlIENJIiBiZXNjaHJlaWJ0IGRhcyBLb25maWRlbnppbnRlcnZhbGwgZsO8ciA5MCAlLiBEaWVzZXMgbGllZ3QgaGllciB6d2lzY2hlbiA4OSUgdW5kIDkzJS4NCg0KDQoNCiMgRWZmZWt0c3TDpHJrZSANCg0KVW0gZGllIEJlZGV1dHNhbWtlaXQgZWluZXMgRXJnZWJuaXNzZXMgenUgYmV1cnRlaWxlbiwgd2VyZGVuIEVmZmVrdHN0w6Rya2VuIGJlcmVjaG5ldC4NCiAgICANCkRhIFIgZGFzIHBhcnRpZWxsZSBFdGEtUXVhZHJhdCBhdXNnaWJ0LCB3aXJkIGRpZXNlcyBoaWVyIGluIGRpZSBFZmZla3RzdMOkcmtlIG5hY2ggQ29oZW4gKDE5ODgpIHVtZ2VyZWNobmV0LiBJbiBkaWVzZW0gRmFsbCBiZWZpbmRldCBzaWNoIGRpZSBFZmZla3RzdMOkcmtlIGltbWVyIHp3aXNjaGVuIDAgdW5kIHVuZW5kbGljaC4NCiAgICANCg0KJCRmPVxzcXJ0XGZyYWN7ZXRhXnsyfX17MS1ldGFeezJ9fSQkDQoNCmBgYHtyfQ0KDQplZmY8LSBzcXJ0KGV0YSRFdGEyLygxLWV0YSRFdGEyKSkNCnNwcmludGYgKCJEaWUgRWZmZWt0c3TDpHJrZSBsaWVndCBiZWk6JS4yZiIsZWZmKQ0KYGBgDQoNCg0KVW0genUgYmV1cnRlaWxlbiwgd2llIGdyb3NzIGRpZXNlciBFZmZla3QgaXN0LCBrYW5uIG1hbiBzaWNoIGFuIGRlciBFaW50ZWlsdW5nIHZvbiBDb2hlbiAoMTk4OCkgb3JpZW50aWVyZW46DQoNCg0KJCQNClxiZWdpbnthbGlnbn0NClx0ZXh0e1NjaHdhY2hlciBFZmZla3Q6IH0gMC4xMCAmPCB8fGZ8fCA8IDAuMjUgICAgICAgICAgICAgXFwNClx0ZXh0e1NjaHdhY2hlciBiaXMgbWl0dGxlcmVyIEVmZmVrdDogfSAwLjI1ICY9IHx8Znx8ICAgICAgXFwNClx0ZXh0e01pdHRsZXJlciBFZmZla3Q6IH0gMC4yNSAmPCB8fGZ8fCA8IDAuNDAgICAgICAgICAgICAgXFwNClx0ZXh0e01pdHRsZXJlciBiaXMgc3RhcmtlciBFZmZla3Q6IH0wLjQwICY9IHx8Znx8ICAgICAgICAgXFwNClx0ZXh0e1N0YXJrZXIgRWZmZWt0OiB9IDAuNDAgJjwgfHxmfHwgICAgICAgIA0KXGVuZHthbGlnbn0NCiQkDQoNCipIaW53ZWlzOiogRGllc2UgQmVpc3BpZWwgaXN0IHNlaHIgc2F1YmVyIHVuZCBldHdhcyAienUiIGVpbmRldXRpZy4NCkRhbWl0IGVudHNwcmljaHQgZWluZSBFZmZla3RzdMOkcmtlIHZvbiAzLjI5IGVpbmVtIHN0YXJrZW4gRWZmZWt0Lg0KDQoNCiMgRWluZSBBdXNzYWdlDQoNCkRpZSBBdXN3YWhsIGRlciBUcmFpbmluZ3NtZXRob2RlIGhhdCBlaW5lbiBzaWduaWZpa2FudGVuIEVpbmZsdXNzIGF1ZiBkaWUgQXVzZGF1ZXIgKEYoMyw2Mi42OCkgPSA0NDYuODUgLCBwID0gLjAwMCkuIDkyJSBkZXIgU3RyZXV1bmcgZGVyIEF1c2RhdWVyLVdlcnRlIHVtIGRlbiBHZXNhbXRtaXR0ZWx3ZXJ0IGthbm4gZHVyY2ggZGllIFRyYWluaW5nc21ldGhvZGVuIGVya2zDpHJ0IHdlcmRlbi4gRGllIEVmZmVrdHN0w6Rya2UgbmFjaCBDb2hlbiAoMTk4OCkgbGllZ3QgYmVpIGYgPSAzLjI4IHVuZCBlbnRzcHJpY2h0IGVpbmVtIHN0YXJrZW4gRWZmZWt0LiBIMCB3aXJkIGFiZ2VsZWhudCwgSDEgYW5nZW5vbW1lbi4NCg0KUG9zdC1ob2MtVGVzdHMgbWl0IFR1a2V5IHplaWdlbiwgZGFzcyBzaWNoIHZpZXIgR3J1cHBlbiB2b24gVHJhaW5pbmdzYXJ0ZW4gYmlsZGVuIGxhc3NlbiAgKGFsbGUgcCA8IC4wNSk6IA0KDQpUcmFpbmluZ3NhcnQgMSAoTSA9IDM4LjgyLCBTRCA9IDMuOTksIG4gPSAyOSksIA0KVHJhaW5pbmdzYXJ0IDIgKE0gPSA0OC4xNiwgU0QgPSAzLjQ1LCBuID0gMzApDQpUcmFpbmluZ3NhcnQgMyAoTSA9IDI1LjEwLCBTRCA9IDMuMDUsIG4gPSAzMCkgdW5kIA0KVHJhaW5pbmdzYXJ0IDQgKE0gPSAyMi4wMywgU0QgPSAyLjQyLCBuID0gMzApIGJpbGRlbiBqZWRlIGbDvHIgc2ljaCBlaW5lIGVpZ2VuZSBHcnVwcGUuIA0KDQpEYW1pdCBrYW5uIGZlc3RnZWhhbHRlbiwgd2VyZGVuLCBkYXNzIGFsbGUgdmllciBHcnVwcGVuIHVuYWJow6RuZ2lnZSBHcnVwcGVuIGJpbGRlbiB1bmQgc2ljaCBzaWduaWZpa2FudCB1bnRlcnNjaGVpZGVuLiBUcmFpbmluZ3NhcnQgMiBpc3QgYW0gZWZmZWt0aXZzdGVuIHVuZCBkaWUgVHJhaW5pbmdzYXJ0IDQgYW0gc2NobGVjaHRlc3RlbiBmw7xyIGRpZSBBdXNkYXVlciBkZXIgU2VuaW9yZW4uIA0KDQoNCg==