Berechnung der Teststatistik

Der Kruskal-Wallis-Test basiert auf der Idee der Rangierung der Daten. Das heisst, es wird nicht mit den Messwerten selbst gerechnet, sondern diese werden durch Ränge ersetzt, mit welchen der eigentliche Test durchgeführt wird. Damit beruht die Berechnung des Tests ausschliesslich auf der Ordnung der Daten (grösser als, kleiner als). Die absoluten Abstände zwischen den Werten werden nicht berücksichtigt.

Hierbei werden die Messwerte mit Rängen versehen. Als erstes werden die einzelnen Messwerte ihrer Gröse nach aufgereiht. Dies geschieht unabhängig von der Gruppenzugehörigkeit (Spalte “Gruppe”). Danach werden die Messwerte rangiert und getrennt für jede Gruppe benannt.

Diese Ränge sind in Abbildung in den Spalten “Ränge ‘0-30’” bis 56+’" enthalten. Kommt ein Messwert mehrfach vor (engl. “ties”), so werden sogenannte “verbundene Ränge” gebildet.

Wenn Rang 1 und 2 beide die gleichen Messwerte aufweisen, wird aus diesen beiden der Mittelwert gebildet ((1 + 2)/2 = 1.5) und die Ränge 1 und 2 werden neu beide mit dem Rang 1.5 versehen. Dies ist im vorliegenden Beispiel für die Ränge 12 und 13 (mittlerer Rang: (12+13)/2 = 12.5), sowie 14 bis 16 der Fall (mittlerer Rang: (14+15+16)/3 = 15).

Schliesslich werden aus diesen ermittelten Rängen sogenannte Rangsummen gebildet (“Summen”). Hierfür werden lediglich die Ränge der jeweiligen Gruppe aufsummiert. Dies ergibt eine Rangsumme von 237.5 für die Gruppe 0-30 (n = 10), 124 für die Gruppe “31-55” (n = 8) und 73.5 für die Gruppe “56+” (n = 11). Zur Berechnung der Teststatistik H werden diese Rangsummen verwendet:

Ohne Korrektur

\[ \begin{align} H &= \frac{12}{N(N+1)}\sum^{k}_{i=1}\frac{R^2_i}{n_i}-3(N+1) \end{align} \]

\[ \begin{align} H &= \frac{12}{29(29+1)}*(\frac{237.5^2}{10}+\frac{124^2}{8}+\frac{73.5^2}{11})-3(29+1) = 21.08 \end{align} \]

mit:

  • \(R_i =\) Rangsummen für jede Gruppe

  • \(N =\) Gesamtstichprobengröße

  • \(n_i =\) Größe der einzelnen Gruppe

  • \(k =\) Anzahl der Gruppen

Freiheitsgrade

\[df = k -1 \]

\[df = 3 -1 = 2\]

mit: * \(k =\) Anzahl der Gruppen

Mit Korrektur

Bei verbundenen Rängen muss die Teststatistik korrigiert werden. (Wird von der Methode kruskal.test() ibn R automatisch gemacht.)

\[ \begin{align} H_{korr} &= \frac{H}{1-\frac{\sum^{m}_{j=1}(t^3_j-t_j)}{N^3-N}} \\ \end{align} \]

Da beim Beispiel verbundene Ränge vorliegen, muss die Korrekturformel angewendet werden.
Es liegen dreimal verbundene Ränge vor (daher m = 4): Ränge 1 & 2 (daher t1 = 2) sowie 13 & 28 (daher t2 = 2), 16 & 2 (daher t3 = 2) und 22 & 2 &18 (daher t3 = 3)
Dies ergibt:

\[ \begin{align} H_{korr} &= \frac{21.08}{1-\frac{(2^3-2)+(2^3-2)+(2^3-2)+(3^3-3)}{29^3-29}} =21.1 \end{align} \]

round(21.08/(1-((2^3-2)+(2^3-2)+(2^3-2)+(3^3-3))/(29^3-29)),2)
[1] 21.12

mit:

  • \(m =\) Anzahl verbundene Ränge

  • \(t_j =\) Anzahl Rohdatenwerte, die im \(j\)-ten Rangplatz stehen



Der emprischer Wert

Der emprische Wert liegt bei \(|21.1|\).

Der kritisch Wert

Der berechnete Wert muss nun auf Signifikanz geprüft werden. Die Teststatistik vergleicht den kritischen Wert der durch die Freiheitsgrade bestimmten Chi-Quadrat-Verteilung mit dem errechneten Wert. Dieser kritische Wert kann Tabellen entnommen werden.

qchisq(0.975,df=2)
[1] 7.377759

Der kritische Wert liegt bei 7.37



Vergleich

\[|−21.1| > 7.37 →\text {Es liegt ein sig. Unterschied vor.}\]

Für das vorliegende Beispiel betrüge der kritische Wert 7.37 bei df = 2 und α = .05. Ist der Betrag der Teststatistik höher als der kritische Wert, so ist der Unterschied signifikant. Dies wäre für das Beispiel der Fall (21.122 > 7.37). Es könnte daher davon ausgegangen werden, dass sich die zentralen Tendenzen unterscheiden (Chi-Quadrat(2) = 21.122, p < .05).



Kruskal-Wallis-Test in R


Hypothese

H0: Es gibt keinen Unterschied zwischen Altersgruppe(0-30/31-55/56+) und der Sportlichkeit gemessen auf dem Laufband in Minuten.

H1: Es gibt einen Unterschied zwischen Altersgruppe(0-30/31-55/56+) und der Sportlichkeit gemessen auf dem Laufband in Minuten.

Voraussetzungen für den Kruskal-Wallis-Test

Die abhängige Variable ist mindestens ordinalskaliert -> ist gegeben

Es liegt eine unabhängige Variable vor, mittels der die zu vergleichenden Gruppen gebildet werden. -> Die Altergruppen sind unabhängig.

Deskriptive Statistiken

Diese “library(dplyr)” muss verwendet werden.

wallis %>%
group_by(Altersgruppe) %>%
  summarize(Anzahl = n(),  Median = median(Sportlichkeit)) %>%
  mutate_if(is.numeric, round, 2)
`summarise()` ungrouping output (override with `.groups` argument)

Die Mediane der Gruppen unterscheiden sich. Die Gruppe “0-30” scheint am sportlichsten zu sein mit einem Wert von 13.5 min (N=10). Die Gruppe “31-55” schaffen 9.2 Min.(N=8) auf dem Laufbahn und am wenigsten sportlich ist die Gruppe der “56+” mit einem Median von 3 (N=11).

Boxplots

boxplot(wallis$Sportlichkeit ~ wallis$Altersgruppe, main = "Boxplots Altersgruppen-Sportlichkeit  ", ylab = "Sportlichkeit gemessen auf dem Laufbahn in Minuten", xlab= "Altergruppe" , col = c("lightgreen", "deepskyblue","tomato"))

Die Mediane der Gruppen unterscheiden sich. Es gibt augenscheinlich keine Ausreisser.

ALTERNATIV

library(ggplot2)
ggplot(wallis, aes(x=Altersgruppe, y=Sportlichkeit, color=Altersgruppe)) + 
geom_violin() + 
geom_boxplot(width=0.2) +
labs(x= "Altersgruppe",y = "Sportlichkeit", title="Boxplots zwischen Altersgruppen" )

Ergebnisse der Kruskal-Wallis-Test

test <- kruskal.test(Sportlichkeit ~ Altersgruppe, data=wallis)
test

    Kruskal-Wallis rank sum test

data:  Sportlichkeit by Altersgruppe
Kruskal-Wallis chi-squared = 21.122, df = 2, p-value = 2.59e-05

Die Tabelle zeigt Unterschiede. Für das Beispiel wird eine Signifikanz von .000 ausgegeben. Also kann davon ausgegangen werden, dass es Unterschiede bezüglich der zentralen Tendenzen der Gruppen gibt (Chi-Quadrat(2) = 21.22,p = .000). Allerdings lässt sich aufgrund dieses Tests nicht bestimmen, welche der drei 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.


PostHoc <- aov(Sportlichkeit ~ Altersgruppe, data=wallis)
TukeyHSD(PostHoc)
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = Sportlichkeit ~ Altersgruppe, data = wallis)

$Altersgruppe
                diff        lwr       upr     p adj
31-55-0-30 -5.000000  -8.225499 -1.774501 0.0019217
56+-0-30   -9.731818 -12.702930 -6.760707 0.0000000
56+-31-55  -4.731818  -7.891484 -1.572153 0.0026789

Der Post-Hoc-Test ergibt, dass sich alle vergleichenden Gruppen signifikant unterscheiden (p < 0.05).

Es gibt einem signifikanten Unterschied zwischen den drei getesteten Gruppen, das heisst, dass jede Altersgruppe einen deutlichen Unterschied in der Sportlichkeit aufweist.

Es können drei unabhängige Gruppen gebildet werden. Eine Generalisierung ist möglich.

Berechnung der Effektstärke

\[r = \Biggl| \frac{z}{\sqrt{n}}\Biggl|\]

mit:

Zstat<-qnorm(test$p.value/2) #ungerichtet 

sprintf("Z-Wert für den H-Test : %.2f", Zstat)
[1] "Z-Wert für den H-Test : -4.21"
daten <- nrow(wallis)
sprintf("Anzahl der Daten: %.f", daten)
[1] "Anzahl der Daten: 29"
eff <- abs(Zstat/sqrt(daten))
sprintf("Effektstärke: %.2f", eff)
[1] "Effektstärke: 0.78"

Zur Beurteilung der Groesse des Effektes dient die Einteilung von Cohen (1992):

\[ \begin{align} \text{Schwacher Effekt: } 0.10 &< ||r|| < 0.30 \\ \text{Schwacher bis mittlerer Effekt: } 0.30 &= ||r|| \\ \text{Mittlerer Effekt: } 0.30 &< ||r|| < 0.50 \\ \text{Mittlerer bis starker Effekt: }0.50 &= ||r|| \\ \text{Starker Effekt: } 0.50 &< ||r|| \end{align} \]

Damit entspricht eine Effektstärke von 0.78 einem starken Effekt.

ALTERNATIVE

\[w = \left|\sqrt\frac{\mathcal{X}^2}{n}\right|\] mit:

anzahl <- nrow(wallis)
chi <- test$statistic

w<- sqrt(chi /anzahl)
 sprintf("Effektstärke: %.2f",w)
[1] "Effektstärke: 0.85"

\[ \begin{align} \text{Schwacher Effekt: } 0.10 &< w \le 0.30 \\ \text{Mittlerer Effekt: } 0.30 &< w \le 0.50 \\ \text{Starker Effekt: } 0.50 &< w \end{align} \]

Damit entspricht eine Effektstärke von 0.85 einem starken Effekt.

Eine Aussage

Der Kruskal-Wallis-Test bestätigt, dass die Sportlichkeit sich durch die Altersgruppe unterscheidet (Chi-Quadrat(2) = 21.22, p = .000).

Der anschliessend durchgeführte Post-hoc-Test (Tukey) zeigt, dass alle Gruppen “0-30” (Median = 13.5, n = 10)und “31-55” (Median = 9.2, n = 8), sowie “56+” (Median = 3.0, n = 9) signifikant unterscheiden (p < .05).

Die Effektstärke (w = .85) zeigt ein starken Effekt, sodass tatsächlich die Altersgruppe einen grossen Effekt auf die Ausdauer, gemessen in Minuten auf dem Laufband, hat.

H0 wird ablehnen.

LS0tDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoNCiMgQmVyZWNobnVuZyBkZXIgVGVzdHN0YXRpc3RpayANCg0KRGVyIEtydXNrYWwtV2FsbGlzLVRlc3QgYmFzaWVydCBhdWYgZGVyIElkZWUgZGVyIFJhbmdpZXJ1bmcgZGVyIERhdGVuLiBEYXMgaGVpc3N0LCBlcyB3aXJkIG5pY2h0IG1pdCBkZW4gTWVzc3dlcnRlbiBzZWxic3QgZ2VyZWNobmV0LCBzb25kZXJuIGRpZXNlIHdlcmRlbiBkdXJjaCBSw6RuZ2UgZXJzZXR6dCwgbWl0IHdlbGNoZW4gZGVyIGVpZ2VudGxpY2hlIFRlc3QgZHVyY2hnZWbDvGhydCB3aXJkLiBEYW1pdCBiZXJ1aHQgZGllIEJlcmVjaG51bmcgZGVzIFRlc3RzIGF1c3NjaGxpZXNzbGljaCBhdWYgZGVyIE9yZG51bmcgZGVyIERhdGVuIChncsO2c3NlciBhbHMsIGtsZWluZXIgYWxzKS4gRGllIGFic29sdXRlbiBBYnN0w6RuZGUgendpc2NoZW4gZGVuIFdlcnRlbiB3ZXJkZW4gbmljaHQgYmVyw7xja3NpY2h0aWd0Lg0KDQpIaWVyYmVpIHdlcmRlbiBkaWUgTWVzc3dlcnRlIG1pdCBSw6RuZ2VuIHZlcnNlaGVuLiBBbHMgZXJzdGVzIHdlcmRlbiBkaWUgZWluemVsbmVuIE1lc3N3ZXJ0ZSBpaHJlciBHcsO2c2UgDQpuYWNoIGF1ZmdlcmVpaHQuIERpZXMgZ2VzY2hpZWh0IHVuYWJow6RuZ2lnIHZvbiBkZXIgR3J1cHBlbnp1Z2Vow7ZyaWdrZWl0IChTcGFsdGUgIkdydXBwZSIpLiBEYW5hY2ggd2VyZGVuIGRpZSBNZXNzd2VydGUgcmFuZ2llcnQgdW5kIGdldHJlbm50IGbDvHIgamVkZSBHcnVwcGUgYmVuYW5udC4NCg0KRGllc2UgUsOkbmdlIHNpbmQgaW4gQWJiaWxkdW5nIGluIGRlbiBTcGFsdGVuICJSw6RuZ2UgJzAtMzAnIiBiaXMgNTYrJyIgZW50aGFsdGVuLiBLb21tdCBlaW4gTWVzc3dlcnQgbWVocmZhY2ggdm9yIChlbmdsLiAidGllcyIpLCBzbyB3ZXJkZW4gc29nZW5hbm50ZSAidmVyYnVuZGVuZSBSw6RuZ2UiIGdlYmlsZGV0Lg0KDQoNCldlbm4gUmFuZyAxIHVuZCAyIGJlaWRlIGRpZSBnbGVpY2hlbiBNZXNzd2VydGUgYXVmd2Vpc2VuLCB3aXJkIGF1cyBkaWVzZW4gYmVpZGVuIGRlciBNaXR0ZWx3ZXJ0IGdlYmlsZGV0ICgoMSArIDIpLzIgPSAxLjUpIHVuZCBkaWUgUsOkbmdlIDEgdW5kIDIgd2VyZGVuIG5ldSBiZWlkZSBtaXQgZGVtIFJhbmcgMS41IHZlcnNlaGVuLiBEaWVzIGlzdCBpbSB2b3JsaWVnZW5kZW4gQmVpc3BpZWwgZsO8ciBkaWUgUsOkbmdlIDEyIHVuZCAxMyAobWl0dGxlcmVyIFJhbmc6ICgxMisxMykvMiA9IDEyLjUpLCBzb3dpZSAxNCBiaXMgMTYgZGVyIEZhbGwgKG1pdHRsZXJlciBSYW5nOiAoMTQrMTUrMTYpLzMgPSAxNSkuDQoNClNjaGxpZXNzbGljaCB3ZXJkZW4gYXVzIGRpZXNlbiBlcm1pdHRlbHRlbiBSw6RuZ2VuIHNvZ2VuYW5udGUgUmFuZ3N1bW1lbiBnZWJpbGRldCAoIlN1bW1lbiIpLiBIaWVyZsO8ciB3ZXJkZW4gbGVkaWdsaWNoIGRpZSBSw6RuZ2UgZGVyIGpld2VpbGlnZW4gR3J1cHBlIGF1ZnN1bW1pZXJ0LiBEaWVzIGVyZ2lidCBlaW5lIFJhbmdzdW1tZSB2b24gMjM3LjUgZsO8ciBkaWUgR3J1cHBlIDAtMzAgKG4gPSAxMCksIDEyNCBmw7xyIGRpZSBHcnVwcGUgIjMxLTU1IiAobiA9IDgpIHVuZCA3My41IGbDvHIgZGllIEdydXBwZSAiNTYrIiAobiA9IDExKS4gWnVyIEJlcmVjaG51bmcgZGVyIFRlc3RzdGF0aXN0aWsgSCB3ZXJkZW4gZGllc2UgUmFuZ3N1bW1lbiB2ZXJ3ZW5kZXQ6IA0KDQoNCiMjIyBPaG5lIEtvcnJla3R1cg0KDQokJA0KXGJlZ2lue2FsaWdufQ0KSCAmPSBcZnJhY3sxMn17TihOKzEpfVxzdW1ee2t9X3tpPTF9XGZyYWN7Ul4yX2l9e25faX0tMyhOKzEpIA0KXGVuZHthbGlnbn0NCiQkDQoNCg0KDQokJA0KXGJlZ2lue2FsaWdufQ0KSCAmPSBcZnJhY3sxMn17MjkoMjkrMSl9KihcZnJhY3syMzcuNV4yfXsxMH0rXGZyYWN7MTI0XjJ9ezh9K1xmcmFjezczLjVeMn17MTF9KS0zKDI5KzEpID0gMjEuMDggDQpcZW5ke2FsaWdufQ0KJCQgDQoNCm1pdDoNCg0KKiAkUl9pID0kIFJhbmdzdW1tZW4gZsO8ciBqZWRlIEdydXBwZQ0KDQoqICROID0kIEdlc2FtdHN0aWNocHJvYmVuZ3LDtsOfZQ0KDQoqICRuX2kgPSQgR3LDtsOfZSBkZXIgZWluemVsbmVuIEdydXBwZQ0KDQoqICRrID0kIEFuemFobCBkZXIgR3J1cHBlbg0KDQoNCg0KDQojIyMgRnJlaWhlaXRzZ3JhZGUgDQoNCiQkZGYgPSBrIC0xICQkDQoNCiQkZGYgPSAzIC0xID0gMiQkDQoNCm1pdDoNCiogJGsgPSQgQW56YWhsIGRlciBHcnVwcGVuDQoNCg0KDQojIyMgTWl0IEtvcnJla3R1cg0KQmVpIHZlcmJ1bmRlbmVuIFLDpG5nZW4gbXVzcyBkaWUgVGVzdHN0YXRpc3RpayBrb3JyaWdpZXJ0IHdlcmRlbi4gKihXaXJkIHZvbiBkZXIgTWV0aG9kZSBrcnVza2FsLnRlc3QoKSBpYm4gUiAgYXV0b21hdGlzY2ggZ2VtYWNodC4pKg0KDQoNCiQkDQpcYmVnaW57YWxpZ259DQpIX3trb3JyfSAmPSBcZnJhY3tIfXsxLVxmcmFje1xzdW1ee219X3tqPTF9KHReM19qLXRfail9e05eMy1OfX0gXFwNClxlbmR7YWxpZ259DQokJA0KDQoNCkRhIGJlaW0gQmVpc3BpZWwgdmVyYnVuZGVuZSBSw6RuZ2Ugdm9ybGllZ2VuLCBtdXNzIGRpZSBLb3JyZWt0dXJmb3JtZWwgYW5nZXdlbmRldCB3ZXJkZW4uIDxicj4NCkVzIGxpZWdlbiBkcmVpbWFsIHZlcmJ1bmRlbmUgUsOkbmdlIHZvciAoZGFoZXIgbSA9IDQpOg0KUsOkbmdlIDEgJiAyIChkYWhlciB0MSA9IDIpIHNvd2llIDEzICYgMjggKGRhaGVyIHQyID0gMiksIDE2ICYgMiAoZGFoZXIgdDMgPSAyKSB1bmQgMjIgJiAyICYxOCAoZGFoZXIgdDMgPSAzKQ0KPGJyPkRpZXMgZXJnaWJ0OiANCg0KDQoNCiQkDQpcYmVnaW57YWxpZ259DQpIX3trb3JyfSAmPSBcZnJhY3syMS4wOH17MS1cZnJhY3soMl4zLTIpKygyXjMtMikrKDJeMy0yKSsoM14zLTMpfXsyOV4zLTI5fX0gPTIxLjENClxlbmR7YWxpZ259DQokJA0KDQoNCg0KYGBge3J9DQpyb3VuZCgyMS4wOC8oMS0oKDJeMy0yKSsoMl4zLTIpKygyXjMtMikrKDNeMy0zKSkvKDI5XjMtMjkpKSwyKQ0KYGBgDQoNCg0KbWl0Og0KDQoqICRtID0kIEFuemFobCB2ZXJidW5kZW5lIFLDpG5nZQ0KDQoqICR0X2ogPSQgQW56YWhsIFJvaGRhdGVud2VydGUsIGRpZSBpbSAkaiQtdGVuIFJhbmdwbGF0eiBzdGVoZW4NCg0KDQoNCg0KYGBge3IgaW5jbHVkZT1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQpsaWJyYXJ5KGRwbHlyKQ0KYGBgDQo8YnI+DQo8YnI+DQoNCiMjIyBEZXIgZW1wcmlzY2hlciBXZXJ0DQoNCkRlciBlbXByaXNjaGUgV2VydCBsaWVndCBiZWkgJHwyMS4xfCQuDQo8YnI+DQo8YnI+DQoNCiMjIyBEZXIga3JpdGlzY2ggV2VydA0KDQpEZXIgYmVyZWNobmV0ZSBXZXJ0IG11c3MgbnVuIGF1ZiBTaWduaWZpa2FueiBnZXByw7xmdCB3ZXJkZW4uIERpZSBUZXN0c3RhdGlzdGlrIHZlcmdsZWljaHQgZGVuIGtyaXRpc2NoZW4gV2VydCBkZXIgZHVyY2ggZGllIEZyZWloZWl0c2dyYWRlIGJlc3RpbW10ZW4gQ2hpLVF1YWRyYXQtVmVydGVpbHVuZyBtaXQgZGVtIGVycmVjaG5ldGVuIFdlcnQuIERpZXNlciBrcml0aXNjaGUgV2VydCBrYW5uIFRhYmVsbGVuIGVudG5vbW1lbiB3ZXJkZW4uDQoNCmBgYHtyfQ0KcWNoaXNxKDAuOTc1LGRmPTIpDQpgYGANCg0KDQpEZXIga3JpdGlzY2hlIFdlcnQgbGllZ3QgYmVpIDUuOTkNCg0KDQoNCjxicj4NCjxicj4NCg0KIyMjIFZlcmdsZWljaA0KDQokJHziiJIyMS4xfCA+IDUuOTkg4oaSXHRleHQge0VzIGxpZWd0IGVpbiBzaWcuIFVudGVyc2NoaWVkIHZvci59JCQNCg0KDQoNCkbDvHIgZGFzIHZvcmxpZWdlbmRlIEJlaXNwaWVsIGJldHLDvGdlIGRlciBrcml0aXNjaGUgV2VydCA1Ljk5IGJlaSBkZiA9IDIgdW5kIM6xID0gLjA1LiBJc3QgZGVyIEJldHJhZyBkZXIgVGVzdHN0YXRpc3RpayBow7ZoZXIgYWxzIGRlciBrcml0aXNjaGUgV2VydCwgc28gaXN0IGRlciBVbnRlcnNjaGllZCBzaWduaWZpa2FudC4gRGllcyB3w6RyZSBmw7xyIGRhcyBCZWlzcGllbCBkZXIgRmFsbCAoMjEuMTIyID4gNS45OSkuIEVzIGvDtm5udGUgZGFoZXIgZGF2b24gYXVzZ2VnYW5nZW4gd2VyZGVuLCBkYXNzIHNpY2ggZGllIHplbnRyYWxlbiBUZW5kZW56ZW4gdW50ZXJzY2hlaWRlbiAoQ2hpLVF1YWRyYXQoMikgPSAyMS4xMjIsIHAgPCAuMDUpLiANCg0KDQo8YnI+DQo8YnI+DQoNCiMgIEtydXNrYWwtV2FsbGlzLVRlc3QgaW4gUiANCjxicj4NCg0KIyBIeXBvdGhlc2UgDQpIMDogRXMgZ2lidCBrZWluZW4gVW50ZXJzY2hpZWQgendpc2NoZW4gQWx0ZXJzZ3J1cHBlKDAtMzAvMzEtNTUvNTYrKSB1bmQgZGVyIFNwb3J0bGljaGtlaXQgZ2VtZXNzZW4gYXVmIGRlbSBMYXVmYmFuZCBpbiBNaW51dGVuLiANCg0KDQpIMTogRXMgZ2lidCBlaW5lbiBVbnRlcnNjaGllZCB6d2lzY2hlbiBBbHRlcnNncnVwcGUoMC0zMC8zMS01NS81NispIHVuZCBkZXIgU3BvcnRsaWNoa2VpdCBnZW1lc3NlbiBhdWYgZGVtIExhdWZiYW5kIGluIE1pbnV0ZW4uDQoNCg0KIyBWb3JhdXNzZXR6dW5nZW4gZsO8ciBkZW4gS3J1c2thbC1XYWxsaXMtVGVzdA0KDQpEaWUgYWJow6RuZ2lnZSBWYXJpYWJsZSBpc3QgbWluZGVzdGVucyBvcmRpbmFsc2thbGllcnQgLT4gaXN0IGdlZ2ViZW4NCg0KRXMgbGllZ3QgZWluZSB1bmFiaMOkbmdpZ2UgVmFyaWFibGUgdm9yLCBtaXR0ZWxzIGRlciBkaWUgenUgdmVyZ2xlaWNoZW5kZW4gR3J1cHBlbiBnZWJpbGRldCB3ZXJkZW4uIC0+IERpZSBBbHRlcmdydXBwZW4gc2luZCB1bmFiaMOkbmdpZy4NCg0KDQoNCiMgRGVza3JpcHRpdmUgU3RhdGlzdGlrZW4NCg0KRGllc2UgImxpYnJhcnkoZHBseXIpIiBtdXNzIHZlcndlbmRldCB3ZXJkZW4uDQpgYGB7cn0NCndhbGxpcyAlPiUNCmdyb3VwX2J5KEFsdGVyc2dydXBwZSkgJT4lDQogIHN1bW1hcml6ZShBbnphaGwgPSBuKCksICBNZWRpYW4gPSBtZWRpYW4oU3BvcnRsaWNoa2VpdCkpICU+JQ0KICBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsIDIpDQpgYGANCg0KRGllIE1lZGlhbmUgZGVyIEdydXBwZW4gdW50ZXJzY2hlaWRlbiBzaWNoLiBEaWUgR3J1cHBlICIwLTMwIiBzY2hlaW50IGFtIHNwb3J0bGljaHN0ZW4genUgc2VpbiBtaXQgZWluZW0gV2VydCB2b24gMTMuNSBtaW4gKE49MTApLiBEaWUgR3J1cHBlICIzMS01NSIgc2NoYWZmZW4gOS4yIE1pbi4oTj04KSBhdWYgZGVtIExhdWZiYWhuIHVuZCBhbSB3ZW5pZ3N0ZW4gc3BvcnRsaWNoIGlzdCBkaWUgR3J1cHBlIGRlciAiNTYrIiBtaXQgZWluZW0gTWVkaWFuIHZvbiAzIChOPTExKS4NCg0KDQoNCg0KIyMgQm94cGxvdHMNCg0KDQpgYGB7cn0NCmJveHBsb3Qod2FsbGlzJFNwb3J0bGljaGtlaXQgfiB3YWxsaXMkQWx0ZXJzZ3J1cHBlLCBtYWluID0gIkJveHBsb3RzIEFsdGVyc2dydXBwZW4tU3BvcnRsaWNoa2VpdCAgIiwgeWxhYiA9ICJTcG9ydGxpY2hrZWl0IGdlbWVzc2VuIGF1ZiBkZW0gTGF1ZmJhaG4gaW4gTWludXRlbiIsIHhsYWI9ICJBbHRlcmdydXBwZSIgLCBjb2wgPSBjKCJsaWdodGdyZWVuIiwgImRlZXBza3libHVlIiwidG9tYXRvIikpDQoNCmBgYA0KDQpEaWUgTWVkaWFuZSBkZXIgR3J1cHBlbiB1bnRlcnNjaGVpZGVuIHNpY2guIEVzIGdpYnQgYXVnZW5zY2hlaW5saWNoIGtlaW5lIEF1c3JlaXNzZXIuDQoNCg0KIyBBTFRFUk5BVElWDQoNCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpnZ3Bsb3Qod2FsbGlzLCBhZXMoeD1BbHRlcnNncnVwcGUsIHk9U3BvcnRsaWNoa2VpdCwgY29sb3I9QWx0ZXJzZ3J1cHBlKSkgKyANCmdlb21fdmlvbGluKCkgKyANCmdlb21fYm94cGxvdCh3aWR0aD0wLjIpICsNCmxhYnMoeD0gIkFsdGVyc2dydXBwZSIseSA9ICJTcG9ydGxpY2hrZWl0IiwgdGl0bGU9IkJveHBsb3RzIHp3aXNjaGVuIEFsdGVyc2dydXBwZW4iICkNCmBgYA0KDQoNCiMgRXJnZWJuaXNzZSBkZXIgS3J1c2thbC1XYWxsaXMtVGVzdA0KDQoNCmBgYHtyfQ0KdGVzdCA8LSBrcnVza2FsLnRlc3QoU3BvcnRsaWNoa2VpdCB+IEFsdGVyc2dydXBwZSwgZGF0YT13YWxsaXMpDQp0ZXN0DQpgYGANCg0KRGllIFRhYmVsbGUgemVpZ3QgVW50ZXJzY2hpZWRlLiBGw7xyIGRhcyBCZWlzcGllbCB3aXJkIGVpbmUgU2lnbmlmaWthbnogdm9uIC4wMDAgYXVzZ2VnZWJlbi4gQWxzbyBrYW5uIGRhdm9uIGF1c2dlZ2FuZ2VuIHdlcmRlbiwgZGFzcyBlcyBVbnRlcnNjaGllZGUgYmV6w7xnbGljaCBkZXIgemVudHJhbGVuIFRlbmRlbnplbiBkZXIgR3J1cHBlbiBnaWJ0IChDaGktUXVhZHJhdCgyKSA9IDIxLjIyLHAgPSAuMDAwKS4gQWxsZXJkaW5ncyBsw6Rzc3Qgc2ljaCBhdWZncnVuZCBkaWVzZXMgVGVzdHMgbmljaHQgYmVzdGltbWVuLCB3ZWxjaGUgZGVyIGRyZWkgR3J1cHBlbiBzaWNoIHNpZ25pZmlrYW50IHZvbmVpbmFuZGVyIHVudGVyc2NoZWlkZW4uIEVzIGlzdCBkZW5rYmFyLCBkYXNzIHNpY2ggbGVkaWdsaWNoIGVpbiBQYWFyIHNpZ25pZmlrYW50IHVudGVyc2NoZWlkZXQgdW5kIHp3aXNjaGVuIGRlbiDDvGJyaWdlbiBrZWluZSBzaWduaWZpa2FudGVuIFVudGVyc2NoaWVkZSB2b3JsaWVnZW4uIERhaGVyIHdpcmQgZWluIFBvc3QtaG9jLVRlc3QgZHVyY2hnZWbDvGhydC4NCg0KDQpgYGB7cn0NCg0KUG9zdEhvYyA8LSBhb3YoU3BvcnRsaWNoa2VpdCB+IEFsdGVyc2dydXBwZSwgZGF0YT13YWxsaXMpDQpUdWtleUhTRChQb3N0SG9jKQ0KDQpgYGANCg0KDQpEZXIgUG9zdC1Ib2MtVGVzdCBlcmdpYnQsIGRhc3Mgc2ljaCBhbGxlIHZlcmdsZWljaGVuZGVuIEdydXBwZW4gc2lnbmlmaWthbnQgdW50ZXJzY2hlaWRlbiAocCA8IDAuMDUpLiANCg0KRXMgZ2lidCBlaW5lbSBzaWduaWZpa2FudGVuIFVudGVyc2NoaWVkIHp3aXNjaGVuIGRlbiBkcmVpIGdldGVzdGV0ZW4gR3J1cHBlbiwgZGFzIGhlaXNzdCwgZGFzcyBqZWRlIEFsdGVyc2dydXBwZSBlaW5lbiBkZXV0bGljaGVuIFVudGVyc2NoaWVkIGluIGRlciBTcG9ydGxpY2hrZWl0IGF1ZndlaXN0Lg0KDQpFcyBrw7ZubmVuIGRyZWkgdW5hYmjDpG5naWdlIEdydXBwZW4gZ2ViaWxkZXQgd2VyZGVuLiBFaW5lIEdlbmVyYWxpc2llcnVuZyBpc3QgbcO2Z2xpY2guDQoNCg0KIyBCZXJlY2hudW5nIGRlciBFZmZla3RzdMOkcmtlDQoNCiQkciA9IFxCaWdnbHwgXGZyYWN7en17XHNxcnR7bn19XEJpZ2dsfCQkDQoNCm1pdDoNCg0KKiAkeiA9JCB6LXRyYW5zZm9ybWllcnRlcyAkcCQgZGVzIENoaS1RdWFkcmF0LVRlc3RzIG5hY2ggS3J1c2thbC1XYWxsaXMuDQoNCiogJG4gPSQgR3LDtsOfZSBkZXIgR2VzYW10c3RpY2hwcm9iZQ0KDQoNCg0KDQoNCmBgYHtyfQ0KWnN0YXQ8LXFub3JtKHRlc3QkcC52YWx1ZS8yKSAjdW5nZXJpY2h0ZXQgDQoNCnNwcmludGYoIlotV2VydCBmw7xyIGRlbiBILVRlc3QgOiAlLjJmIiwgWnN0YXQpDQoNCmRhdGVuIDwtIG5yb3cod2FsbGlzKQ0Kc3ByaW50ZigiQW56YWhsIGRlciBEYXRlbjogJS5mIiwgZGF0ZW4pDQoNCg0KZWZmIDwtIGFicyhac3RhdC9zcXJ0KGRhdGVuKSkNCnNwcmludGYoIkVmZmVrdHN0w6Rya2U6ICUuMmYiLCBlZmYpDQoNCmBgYA0KDQoNClp1ciBCZXVydGVpbHVuZyBkZXIgR3JvZXNzZSBkZXMgRWZmZWt0ZXMgZGllbnQgZGllIEVpbnRlaWx1bmcgdm9uIENvaGVuICgxOTkyKToNCg0KJCQNClxiZWdpbnthbGlnbn0NClx0ZXh0e1NjaHdhY2hlciBFZmZla3Q6IH0gMC4xMCAmPCB8fHJ8fCA8IDAuMzAgICAgICAgICAgICAgXFwNClx0ZXh0e1NjaHdhY2hlciBiaXMgbWl0dGxlcmVyIEVmZmVrdDogfSAwLjMwICY9IHx8cnx8ICAgICAgXFwNClx0ZXh0e01pdHRsZXJlciBFZmZla3Q6IH0gMC4zMCAmPCB8fHJ8fCA8IDAuNTAgICAgICAgICAgICAgXFwNClx0ZXh0e01pdHRsZXJlciBiaXMgc3RhcmtlciBFZmZla3Q6IH0wLjUwICY9IHx8cnx8ICAgICAgICAgXFwNClx0ZXh0e1N0YXJrZXIgRWZmZWt0OiB9IDAuNTAgJjwgfHxyfHwgICAgICAgIA0KXGVuZHthbGlnbn0NCiQkDQoNCkRhbWl0IGVudHNwcmljaHQgZWluZSBFZmZla3RzdMOkcmtlIHZvbiAwLjc4IGVpbmVtIHN0YXJrZW4gRWZmZWt0Lg0KDQojIEFMVEVSTkFUSVZFDQoNCg0KJCR3ID0gXGxlZnR8XHNxcnRcZnJhY3tcbWF0aGNhbHtYfV4yfXtufVxyaWdodHwkJA0KbWl0Og0KDQoqICRcY2hpXjIgPSRDaGktUXVhZHJhdC1XZXJ0IG5hY2ggS3J1c2thbC1XYWxsaXMuDQoNCiogJG4gPSQgR3LDtsOfZSBkZXIgR2VzYW10c3RpY2hwcm9iZQ0KDQoNCg0KYGBge3J9DQphbnphaGwgPC0gbnJvdyh3YWxsaXMpDQpjaGkgPC0gdGVzdCRzdGF0aXN0aWMNCg0KdzwtIHNxcnQoY2hpIC9hbnphaGwpDQogc3ByaW50ZigiRWZmZWt0c3TDpHJrZTogJS4yZiIsdykNCg0KYGBgDQoNCiQkDQpcYmVnaW57YWxpZ259DQpcdGV4dHtTY2h3YWNoZXIgRWZmZWt0OiB9IDAuMTAgJjwgdyBcbGUgMC4zMCAgICAgICAgICAgICBcXA0KXHRleHR7TWl0dGxlcmVyIEVmZmVrdDogfSAwLjMwICY8IHcgXGxlIDAuNTAgICAgICAgICAgICAgXFwNClx0ZXh0e1N0YXJrZXIgRWZmZWt0OiB9IDAuNTAgJjwgdyAgICAgICAgDQpcZW5ke2FsaWdufQ0KJCQNCg0KDQpEYW1pdCBlbnRzcHJpY2h0IGVpbmUgRWZmZWt0c3TDpHJrZSB2b24gMC44NSBlaW5lbSBzdGFya2VuIEVmZmVrdC4NCg0KDQojIEVpbmUgQXVzc2FnZQ0KDQpEZXIgS3J1c2thbC1XYWxsaXMtVGVzdCBiZXN0w6R0aWd0LCBkYXNzIGRpZSBTcG9ydGxpY2hrZWl0IHNpY2ggZHVyY2ggZGllIEFsdGVyc2dydXBwZSB1bnRlcnNjaGVpZGV0IChDaGktUXVhZHJhdCgyKSA9IDIxLjIyLCBwID0gLjAwMCkuIA0KDQpEZXIgYW5zY2hsaWVzc2VuZCBkdXJjaGdlZsO8aHJ0ZSBQb3N0LWhvYy1UZXN0IChUdWtleSkgemVpZ3QsIGRhc3MgYWxsZSBHcnVwcGVuICIwLTMwIiAoTWVkaWFuID0gMTMuNSwgbiA9IDEwKXVuZCAiMzEtNTUiIChNZWRpYW4gPSA5LjIsIG4gPSA4KSwgc293aWUgIjU2KyIgKE1lZGlhbiA9IDMuMCwgbiA9IDkpIHNpZ25pZmlrYW50IHVudGVyc2NoZWlkZW4gKHAgPCAuMDUpLiANCg0KRGllIEVmZmVrdHN0w6Rya2UgKHcgPSAuODUpIHplaWd0IGVpbiBzdGFya2VuIEVmZmVrdCwgc29kYXNzIHRhdHPDpGNobGljaCBkaWUgQWx0ZXJzZ3J1cHBlIGVpbmVuIGdyb3NzZW4gRWZmZWt0IGF1ZiBkaWUgQXVzZGF1ZXIsIGdlbWVzc2VuIGluIE1pbnV0ZW4gYXVmIGRlbSBMYXVmYmFuZCwgaGF0Lg0KDQpIMCB3aXJkIGFibGVobmVuLg==