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)

Der Levene-Test prüft die Nullhypothese, dass die Varianzen der Gruppen sich nicht unterscheiden. Ist der Levene-Test nichtsignifikant, so kann von homogenen Varianzen ausgegangen. Wäre der Levene-Test jedoch signifikant, so wäre eine der Grundvoraussetzungen der Varianzanalyse verletzt. Gegen leichte Verletzungen gilt die Varianzanalyse als robust; vor allem bei genügend grossen und etwa gleich grossen Gruppen sind Verletzungen nicht problematisch. Bei ungleich grossen Gruppen führt eine starke Verletzung der Varianzhomogenität zu einer Verzerrung des F-Tests. Alternativ können dann auf den den Welch-Test zurückgegriffen werden. Dabei handelt es sich um adjustierte F-Tests.

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 Gesamtmodel ist signifikant geworden (F(3,62.68) = 446.85 , p = .000). Allerdings lässt sich aufgrund dieses Tests nicht bestimmen, welche der vier Gruppen sich signifikant voneinander unterscheiden. Es ist denkbar, dass sich lediglich ein Paar signifikant unterscheidet und zwischen den übrigen keine signifikanten Unterschiede vorliegen. Daher wird ein Post-hoc-Test durchgeführt.

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

Obwohl der F -Test zeigt, dass ein Haupteffekt von Trainingsarten auf Ausdauertest besteht, muss anhand von Post-hoc-Tests geklärt werden, zwischen welchen Faktorstufen (Trainingsmethoden) signifikante Unterschiede bezüglich der Ausdauertest bestehen.

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

Bei der Berechnung von Post-hoc-Tests wird im Prinzip für jede Kombination von zwei Mittelwerten ein t -Test durchgeführt. Im aktuellen Beispiel mit vier Gruppen sind dies 6 Tests. Multiple Tests sind jedoch problematisch, da der Alpha-Fehler (die fälschliche Ablehnung der Nullhypothese) mit der Anzahl der Vergleiche steigt.

Wird nur ein t-Test mit einem Signifikanzlevel von .05 durchgeführt, so beträgt die Wahrscheinlichkeit des Nicht-Eintreffens des Alpha-Fehlers 95 Prozent. Werden jedoch sechs solcher Paarvergleiche vorgenommen, so beträgt die Nicht-Eintreffens-Wahrscheinlichkeit des Alpha-Fehlers (.95)^6 = .735. Um die Wahrscheinlichkeit des Eintreffens des Alpha-Fehlers zu bestimmen, wird 1 - .735 = .2649 gerechnet. Die Wahrscheinlichkeit des Eintreffens des Alpha-Fehlers liegt somit bei 26.49 Prozent. Diese Fehlerwahrscheinlichkeit wird als “Familywise Error Rate” bezeichnet.

Um dieses Problem zu beheben kann zum Beispiel die TukeyHSD angewendet werden. RStudio 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 η2) ist ein Mass für die Effektgrösse: Es setzt die Variation, die durch einen Faktor erklärt wird, in Bezug mit jener Variation, die nicht durch andere Faktoren im Modell erklärt wird. Das heisst, es wird ausschliesslich jene Variation betrachtet, welche nicht durch die anderen Faktoren im Modell erklärt wird. Das partielle Eta-Quadrat zeigt, welchen Anteil davon ein Faktor erklärt. Im Falle der einfaktoriellen Varianzanalyse ist das partielle Eta-Quadrat ist jener Anteil der korrigierten Gesamtvariation, der durch das Modell erklärt wird.

\[\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==