PC-les 4: Enkelvoudige lineaire regressie

Enkelvoudige lineaire regressie met een continue predictor: log-transformatie

Herinner u de opgave van de gezamelijke oefeningenles:

Bij 96 vissen (dojovissen, goudvissen en zebravissen) werd de resistentie tegen het vergif EI-43,064 getest door elke vis individueel in een vat met 2 liter water en een bepaalde dosis (in mg) van het vergif te steken. Naast de overlevingstijd in minuten (de uitkomst, minsurv) werd ook het gewicht van de vis gemeten (in gram).

In deze aparte oefeningenles gaan we verder in op de onderzoeksvraag: “Wat is de associatie tussen dosis en overlevingstijd?” In de gezamelijke oefeningenles zagen we immers dat de residuen geen normale verdeling volgen en ook assumptie van homoscedasticiteit geschonden is. In deze les zullen we beroep doen op een (log-)transformatie van de afhankelijke variabele om toch aan deze assumpties te voldoen.

Lees de dataset poison.dat opnieuw in via read.table. Verander de directory naar de folder waarin je de poision.dat file hebt opgeslaan.

poison <- read.table("/Users/koenvandenberge/Dropbox/PhD/Onderwijs/Statistiek Biochemie/201819/dropboxStats1819/class4/full/poison.dat", sep = "", header = TRUE)
#We gebruiken de volgende variabelen:
soort <- poison$soort
gewicht <- poison$gewicht
dosis <- poison$dosis
minsurv <- poison$minsurv

1. Waarom een log-transformatie?

Herinner u: bij het model van vorige les hadden de residuen een korte linkse staart en een lagen rechtse staart.

model1 <- lm(minsurv~dosis) 
qqnorm(resid(model1))
qqline(resid(model1))

Een log-transformatie maakt grote waarden heel veel kleiner terwijl kleine waarden slechts een beetje kleiner zullen worden. Een log-transformatie heeft dus het potentieel om verdelingen die scheef naar rechts zijn meer symmetrisch te maken. Dit zie je ook wanneer je een histogram maakt van de uitkomstvariabele voor en na logtransformatie.

hist(minsurv, main="Histogram van de overlevingstijd")

#Log-transformatie van de afhankelijke variabele minsurv
log.minsurv <- log(minsurv)
hist(log.minsurv, main="Histogram van de log-overlevingstijd")

Herinner u ook de plot van de vierkantswortel van de absolute waarde van de residuen i.f.v. de gefitte waarden. Hieruit besloten we dat de variantie toeneemt naarmate de geschatte uitkomstvariabele groter wordt.

plot(fitted(model1),sqrt(abs(resid(model1))))
lines(lowess(x=fitted(model1),y=sqrt(abs(resid(model1)))),col="red")

Dit is een extra indicatie dat een log-transformatie zinvol kan zijn: een logtransformatie zal een additieve errorstructuur omzetten naar een multiplicatieve structuur.

2. Voer een log-transformatie uit van de afhankelijke variabele en voer een lineaire-regressieanalyse uit voor de getransformeerde variabele.

#Log-transformatie van de afhankelijke variabele minsurv
log.minsurv <- log(minsurv)
#fit een lineair regressiemodel met 'log-minsurv' als afhankelijke en 'dosis' als onafhankelijke variabele
logModel <- lm(log.minsurv~dosis)
logModel

Call:
lm(formula = log.minsurv ~ dosis)

Coefficients:
(Intercept)        dosis  
     2.1046      -0.5112  

Merk op dat de functie log in R het natuurlijk logaritme (d.w.z. het logaritme met grondtal \(e\)) berekent. Om een logaritme met een ander grondtal te berekenen, kan je het argument base = ... gebruiken. De volgende code berekent het logaritme van 100 met grondtal 10.

log(100, base=10)
[1] 2

3. Ga zelf na of de voorwaarden voor lineaire regressie nu wel voldaan zijn.

par(mfrow=c(2,2))
plot(logModel)

  1. Onafhankelijkheid

Idem als voordien: als je ervan uitgaat dat de randomisatie correct gebeurde en het selecteren van de vissen willekeurig gebeurde, kun je in principe onafhankelijkheid aannemen omdat bij een goede randomisatie observaties onafhankelijk van elkaar worden gemeten.

  1. Lineariteit

Lineariteit gaan we na op basis van de “Residuals vs Fitted” plot. Deze toont de waarden van de residuen in functie van de door het model gefitte waarden. Hier lijkt goed aan de lineariteitsassumptie voldaan te zijn, aangezien de residuen mooi rond nul verdeeld zijn over heel het bereik van de gefitte waarden. De smoother ligt daarom ook dicht rond de nul-lijn zonder duidelijke trends.

  1. Normaal verdeelde residuen

Hiervoor kijken we naar de QQ-plot. De residuen lijken niet sterk af te wijken van wat men zou verwachten als ze normaal verdeeld zouden zijn (de percentielen van de residuen komen goed overeen met de percentielen die men verwacht op basis van de normale verdeling). De iets kortere linkse staart is niet van die aard dat we ons zorgen zouden moeten maken over schendingen van normaliteit. De normaliteitsassuptie lijkt dus voldaan.

  1. Homoscedasticiteit

Hiervoor kijken we naar de plot die de gefitte waarden uitzet in functie van de vierkantswortel van de absolute waarde van de gestandaardiseerde residuen. Als de data homoscedastisch is, dan zal het gemiddelde van de absolute waarde van de gestandaardiseerde residuen altijd rond dezelfde waarde liggen, onafhankelijk van de gefitte waarde. Een smoother door de puntenwolk zal dan vrijwel horizontaal zijn en geen duidelijke trends vertonen. Er is geen patroon te zien wanneer de vierkantswortel van de gestandaardiseerde residuen wordt uitgezet in functie van de gefitte waarden. Onze smoother loopt dan ook vrijwel horizontaal, de zeer beperkte stijging is niet van die aard dat we ons zorgen moeten maken over de homoscedasticiteitsassumptie. De assumptie van homoscedasticiteit lijkt dus voldaan.

Besluit: al onze assumpties lijken voldaan te zijn. We gaan dus een correcte inferentie kunnen doen op basis van dit model.

4. Geef de nul- en alternatieve hypothese voor de t-test in de modeloutput die geassocieerd is met het dosis-effect enerzijds en de nul- en alternatieve hypothese voor de t-test in de modeloutput die geassocieerd is met het intercept anderzijds.

Nulhypothese voor het dosiseffect: er is geen verband tussen de dosis vergif die dojovissen, goudvissen en zebravissen toegediend kregen en het gemiddeld logaritme van hun overlevingstijd.

Alternatieve hypothese voor het dosiseffect: er is een lineair effect van de dosis vergif op het gemiddeld logaritme van hun overlevingstijd in minuten van dojovissen, goudvissen en zebravissen.

Nulhypothese voor het intercept: het gemiddeld logaritme van de overlevingstijd in minuten voor dojovissen, goudvissen en zebravissen die geen vergif toegediend kregen is gelijk aan 0.

Alternatieve hypothese voor het intercept: het gemiddeld logaritme van de overlevingstijd in minuten voor dojovissen, goudvissen en zebravissen die geen vergif toegediend kregen is niet gelijk aan 0.

5. Interpretatie van het dosis-effect voor het model met een log-getransformeerde uitkomstvariabele.

1. Interpretatie op de schaal van getransformeerde waarden:

\(\widehat{log(minsurv_i)} = \hat{\beta_0} + \hat{\beta_1} dosis_i\)

\(\widehat{log(minsurv_i)} = 2.105 - 0.5112*dosis_i\)

Interpretatie: als de dosis met 1 miligram stijgt, dan daalt het gemiddelde van het natuurlijk logaritme van de overlevingstijd met 0.5112.

2. Interpretatie op de originele schaal:

Vanwege de transformatie modelleren we het gemiddelde van het logaritme van de responsvariabele, en interpreteer je de parameters in deze context, zoals hierboven. Als men de exponent neemt van de geschatte parameters, gelden ze in termen van het geometrisch gemiddelde van de responsvariabele op de originele schaal. Het geometrisch gemiddelde van \(Y\) is gelijk aan:

\(e^{rekenkundig\ gemiddelde(log(y_i))} = exp(\frac{\sum_{i=1}^n log(y_i)}{n}).\)

Opmerking: “exp(…)” betekent hetzelfde als “e^…”!

Zoals reeds aangehaald duidt de log-transformatie in de statistiek typisch op het natuurlijk logaritme (i.e. met basis gelijk aan \(e\) en niet met basis \(10\)). Op deze manier interpreteren we dan ook de parameters.

\(\widehat{minsurv}_i = exp(2.105 - 0.5112*dosis_i) = \frac{e^{2.105}}{e^{0.5112*{dosis}_i}}\) (we maakten gebruik van de rekenregel: \(e^{a-b} = e^a/e^b\))

Interpretatie: als de dosis van het vergif stijgt met één miligram, dan daalt het geometrisch gemiddelde van de overlevingstijd van dojovissen, goudvissen en zebravissen met een factor van \(e^{-0.5112} = 1/e^{0.5112} = 0.60\).

Doe het volgende zelfstandig om bovenstaande interpretatie te verduidelijken:

  • Bereken het verwachte geometrische gemiddelde van de overlevingstijd voor een dosis van 1 miligram.
exp(2.105 - 0.5112*1)
[1] 4.922419
  • Doe hetzelfde voor een dosis van 2 miligram.
exp(2.105 - 0.5112*2)
[1] 2.952346
  • Vergelijk deze waarden. Wat merk je op?

\(2.952346/4.922419 = 0.5997754 = 1/e^{0.5112} = 0.60\).

6. Probeer nu zelf eens een correcte en volledige interpretatie van het effect van de dosis op de verwachte uitkomst te geven, samen met zijn bijhorende 95%-betrouwbaarheidsinterval, zowel op de log-schaal als op de originele schaal.

Interpretatie op de log-schaal

summary(logModel)

Call:
lm(formula = log.minsurv ~ dosis)

Residuals:
     Min       1Q   Median       3Q 
-1.14507 -0.38506 -0.06518  0.37175 
     Max 
 1.09357 

Coefficients:
            Estimate Std. Error
(Intercept)   2.1046     0.2396
dosis        -0.5112     0.1509
            t value Pr(>|t|)    
(Intercept)   8.782 7.13e-14 ***
dosis        -3.387  0.00103 ** 
---
Signif. codes:  
  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’
  0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.5104 on 94 degrees of freedom
Multiple R-squared:  0.1088,    Adjusted R-squared:  0.0993 
F-statistic: 11.47 on 1 and 94 DF,  p-value: 0.001032
confint(logModel)
                2.5 %     97.5 %
(Intercept)  1.628792  2.5804330
dosis       -0.810830 -0.2115505

Interpretatie van de parameter dosis op de log-schaal:

Het gemiddeld logaritme van de overlevingstijd in minuten ligt 0,51 lager voor elke 1 mg vergif extra die wordt gegeven aan dojovissen, goudvissen en zebravissen (95%-betrouwbaarheidsinterval: 0,21 tot 0,81). Dit verschil is sterk significant op het 5%-significantnieniveau (p = 0,001).

Interpretatie van het 95%-betrouwbaarheidsinterval voor dosis op de log-schaal:

Met een waarschijnlijkheid van 95% bevat het interval van 0,21 tot 0,81 het werkelijke gemiddelde verschil in logaritme van de overlevingstijd in minuten tussen vissen die 1 mg vergif minder kregen en vissen wel een extra mg vergif kregen.

Interpretatie op de originele schaal

exp(summary(logModel)$coefficients[,"Estimate"])
(Intercept)       dosis 
  8.2039216   0.5997813 
exp(confint(logModel))
               2.5 %     97.5 %
(Intercept) 5.097711 13.2028535
dosis       0.444489  0.8093284

Interpretatie van de parameter dosis op de originele schaal:

Het geometrisch gemiddelde van de overlevingstijd in minuten ligt een factor 0,60 lager voor elke 1 mg vergif extra die wordt gegeven aan dojovissen, goudvissen en zebravissen (95%-betrouwbaarheidsinterval: 0,44 tot 0,81). Dit verschil is sterk significant op het 5%-significantnieniveau (p = 0,001).

Interpretatie van het 95%-betrouwbaarheidsinterval voor dosis op de originele schaal:

Met een waarschijnlijkheid van 95% bevat het interval van 0,44 tot 0,81 de werkelijke factor waarmee het geometrisch gemiddelde van de overlevingstijd in minuten afneemt tussen vissen die 1 mg vergif extra kregen en vissen geen extra mg vergif kregen.

Gegeven een model waarvan de uitkomstvariabele log-getransformeerd is, als ik u voor een bepaalde parameter een 95%-betrouwbaarheidsinterval op de originele schaal zou geven en u zou zeggen dat de p-waarde voor die parameter kleiner is dan 0,05, welke waarde ligt er dan met zekerheid NIET in het gegeven 95%-betrouwbaarheidsinterval?

De waarde 1. De nulhypothese van onze t-test veronderstelt dat de parameter op de log-schaal gelijk is aan nul. Aangezien p < 0,05, wordt de nulhypothese verworpen op het 5%-significantieniveau. Een 95%-betrouwbaarheidsinterval voor deze parameter op de log-schaal zal dus zeker niet de waarde 0 bevatten. Als we de parameter terugtransformeren, zal de waarde e^0 = 1 dus zeker niet in het gegeven interval liggen.

Merk ook op dat de betrouwbaarheidsintervallen op een geometrisch gemiddelde (dus na terugtransformatie) niet meer symmetrisch rond de geschatte parameterwaarde liggen!

7. Geef een correcte en volledige interpretatie van het intercept met zijn bijhorende 95%-betrouwbaarheidsinterval, zowel op de log-schaal als op de originele schaal

summary(logModel)

Call:
lm(formula = log.minsurv ~ dosis)

Residuals:
     Min       1Q   Median       3Q 
-1.14507 -0.38506 -0.06518  0.37175 
     Max 
 1.09357 

Coefficients:
            Estimate Std. Error
(Intercept)   2.1046     0.2396
dosis        -0.5112     0.1509
            t value Pr(>|t|)    
(Intercept)   8.782 7.13e-14 ***
dosis        -3.387  0.00103 ** 
---
Signif. codes:  
  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’
  0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.5104 on 94 degrees of freedom
Multiple R-squared:  0.1088,    Adjusted R-squared:  0.0993 
F-statistic: 11.47 on 1 and 94 DF,  p-value: 0.001032
confint(logModel)
                2.5 %     97.5 %
(Intercept)  1.628792  2.5804330
dosis       -0.810830 -0.2115505

Interpretatie op de log-schaal

Interpretatie van het intercept op de log-schaal:

Het gemiddeld logaritme van de overlevingstijd in minuten voor dojovissen, goudvissen en zebravissen die geen vergif toegediend kregen is gelijk aan 2,1 (95%-betrouwbaarheidsinterval: 1,62 tot 2,58). Dit is extreem significant verschillend van nul op het 5%-significantnieniveau (p = 7,13e-14).

Interpretatie van het 95%-betrouwbaarheidsinterval voor het intercept op de log-schaal:

Met een waarschijnlijkheid van 95% bevat het interval van 1,62 tot 2,58 het werkelijke gemiddelde logaritme van de overlevingstijd in minuten voor vissen die geen vergif toegediend kregen.

exp(confint(logModel))
               2.5 %     97.5 %
(Intercept) 5.097711 13.2028535
dosis       0.444489  0.8093284
exp(summary(logModel)$coefficients[,"Estimate"])
(Intercept)       dosis 
  8.2039216   0.5997813 

Interpretatie op de originele schaal

Interpretatie van het intercept op de originele schaal:

Het geometrisch gemiddelde van de overlevingstijd in minuten voor dojovissen, goudvissen en zebravissen die geen vergif toegediend kregen is gelijk aan 8,20 (95%-betrouwbaarheidsinterval: 5,10 tot 13,20). Dit verschil is extreem significant op het 5%-significantnieniveau (p = 7,13e-14).

Interpretatie van het 95%-betrouwbaarheidsinterval voor het intercept op de originele schaal:

Met een waarschijnlijkheid van 95% bevat het interval van 5,10 tot 13,20 het werkelijke geometrisch gemiddelde van de overlevingstijd in minuten voor vissen die geen vergif toegediend vergif kregen.

Is deze interpretatie van het intercept biologisch relevant?

Deze interpretatie is biologisch niet relevant omdat ze buiten het modelbereik valt.

range(dosis) #print de minimale en maximale waarde van de dosis-variabele
[1] 1.0 2.1

8. Schat het geometrisch gemiddelde van de overlevingstijd bij een dosis van 2 mg. Geef een bijhorend 95%-betrouwbaarheidsinterval.

2.1046 - 0.5112*2
[1] 1.0822
 
hulpdata<-data.frame(dosis = c(2))
# predictie op log-schaal: predict mean(log(y))
predict(logModel,hulpdata, interval="confidence") 
       fit       lwr      upr
1 1.082232 0.9122891 1.252174
# interval="c" duidt aan dat we een confidence interval willen verkrijgen.

Hoe interpreteren we dit 95% betrouwbaarheidsinterval?

Het gemiddelde logaritme van de overlevingstijd in minuten van dojovissen en goudvissen bij een dosis van 2 mg vergif bedraagt 1,08. Met een waarschijnlijkheid van 95% bevat het interval van 0,91 tot 1,25 het werkelijke gemiddelde logaritme van de overlevingstijd in minuten van vissen die 2 mg vergif toegediend kregen.

exp(2.1046 - 0.5112*2)
[1] 2.951165
exp(2.1046)/exp(0.5112*2)
[1] 2.951165
# geometrisch gemiddelde: exp(mean(log(y)))
exp(predict(logModel,hulpdata, interval="confidence")) 
       fit      lwr      upr
1 2.951259 2.490016 3.497941

Merk op dat \(e^{0.9122891}=2.490016\) en \(e^{1.252174}=3.497941\).

Hoe interpreteren we het 95% betrouwbaarheidsinterval na terugtransformatie?

Het geometrische gemiddelde van de overlevingstijd van dojovissen en goudvissen bij een dosis van 2 mg vergif bedraagt 2,95 minuten. Met een waarschijnlijkheid van 95% bevat het interval van 2,49 tot 3,50 het werkelijke geometrische gemiddelde van overlevingstijd in minuten van vissen die 2 mg vergif toegediend kregen.

9. Wat kunnen we besluiten uit de waarde voor de meervoudige correlatiecoëfficiënt? Deze waarde staat in de output van het lineaire regressiemodel (als u de “summary” opvraagt) bij “multiple R-Squared”.

summary(logModel)

Call:
lm(formula = log.minsurv ~ dosis)

Residuals:
     Min       1Q   Median       3Q 
-1.14507 -0.38506 -0.06518  0.37175 
     Max 
 1.09357 

Coefficients:
            Estimate Std. Error
(Intercept)   2.1046     0.2396
dosis        -0.5112     0.1509
            t value Pr(>|t|)    
(Intercept)   8.782 7.13e-14 ***
dosis        -3.387  0.00103 ** 
---
Signif. codes:  
  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’
  0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.5104 on 94 degrees of freedom
Multiple R-squared:  0.1088,    Adjusted R-squared:  0.0993 
F-statistic: 11.47 on 1 and 94 DF,  p-value: 0.001032

De predictorvariabele “dosis” slaagt erin om 10,88% van de totale variatie in de responsvariabele “logaritme van de overlevingstijd in minuten” te verklaren.

Intuïtief: de regressielijn capteert 10,88% van de totale variatie in het natuurlijk logaritme van de overlevingstijd in minuten.

10. Uitwerken van effectgroottes, standaardfouten, T-waarden en p-waarden

In dit laatste deel zullen we zelf de effectgroottes, standaardfouten, T-waarden en p-waarden van de parameters van het lineair regressiemodel berekenen.

Voor het effect van dosis

Op basis van hoofdstuk 5.3 van de cursus weten we dat:

\[\hat{\beta}_1 = \frac{\sum_{i=1}^{n}(y_i-\bar{y})(x_i-\bar{x})}{\sum_{i=1}^{n}(x_i-\bar{x})^2}\]

Voor ons voorbeeld:

\[\hat{\beta}_1 = \frac{\sum_{i=1}^{n}(log.minsurv_i-\overline{log.minsurv_i})(dosis_i-\overline{dosis})}{\sum_{i=1}^{n}(dosis_i-\overline{dosis})^2}\]

De grootte van het dosis-effect is dus gelijk aan:

beta1 = sum((log.minsurv-mean(log.minsurv))*(dosis-mean(dosis)))/sum((dosis-mean(dosis))^2)
beta1
[1] -0.5111903
summary(logModel)$coefficients["dosis","Estimate"]
[1] -0.5111903

De geschatte variantie op het dosis-effect kunnen we als volgt berekenen:

\[\hat{\sigma}^2_{\hat{\beta_1}} = \frac{\hat{\sigma}^2}{\sum_{i=1}^{n}(x_i-\bar{x})^2}\]

De geschatte standaardfout op \(\hat{\beta_1}\) is dus:

\[\hat{\sigma}_{\hat{\beta_1}} = \frac{\hat{\sigma}}{\sqrt{\sum_{i=1}^{n}(x_i-\bar{x})^2}}\]

sigma_beta1 = sigma(logModel)/sqrt(sum((dosis-mean(dosis))^2))
summary(logModel)$coefficients["dosis","Std. Error"]
[1] 0.1509122

Onze geschatte t-waarde is simpelweg:

\[t = \frac{\hat{\beta}_1}{\hat{\sigma}_{\hat{\beta_1}}}\]

tval_beta1 = beta1/sigma_beta1
tval_beta1
[1] -3.387335
summary(logModel)$coefficients["dosis", "t value"]
[1] -3.387335

De p-waarde is de kans om een even extreem of nog extremer resultaat te observeren onder de nulhypothese als ons geveven resultaat -3.3873346. We weten dat als aan al onze assumpties voldaan is, de teststatistiek onder de nulhypothese (\(\beta_1 = 0\)) een t-verdeling volgt met “# observaties - 2” = 96 - 2 = 94 vrijheidsgraden.

De kans dat een t-verdeelde variabele met 94 vrijheidsgraden kleiner is dan -3.3873346 is gelijk aan:

pt(tval_beta1, df=94, lower.tail=TRUE)
[1] 0.0005160421

Aangezien we tweezijdig testen, moeten we hier ook de kans bij optellen dat onze t-verdeelde variabele groter is dan 3.3873346. Deze kans is gelijk aan:

pt(-tval_beta1, df=94, lower.tail=FALSE)
[1] 0.0005160421

De p-waarde is dus gelijk aan de kans dat een t-verdeelde toevalsveranderlijke extremer (d.w.z. groter dan 3.38 of kleiner dan -3.38) is:

pt(tval_beta1, df=94, lower.tail=TRUE)+pt(-tval_beta1, df=94, lower.tail=FALSE)
[1] 0.001032084

Aangezien een t-verdeling symmetrisch is, kan de p-waarde ook gewoon als volgt berekend worden:

pval_beta1 = 2*pt(-abs(tval_beta1), df=94, lower.tail=TRUE) #Met -abs(tval_beta1) nemen we de absolute waarde en maken de t-waarde dan negatief, zodat je onafhankelijk van het teken van de t-waarde altijd in de linkerstaart test.
pval_beta1
[1] 0.001032084
summary(logModel)$coefficients["dosis", "Pr(>|t|)"]
[1] 0.001032084

Voor het intercept

Op basis van hoofdstuk 5.3 van de cursus weten we dat:

\(\hat{\beta}_0 = \bar{y} - \hat{\beta}_1 \bar{x}\)

Voor ons voorbeeld:

\(\hat{\beta}_0 = \overline{log.minsurv} - \hat{\beta}_1 \overline{dosis}\)

beta0 = mean(log.minsurv)-beta1*mean(dosis)
beta0
[1] 2.104612
summary(logModel)$coefficients["(Intercept)","Estimate"]
[1] 2.104612

De geschatte standaardfout op het intercept kunnen we als volgt berekenen:

\[\hat{\sigma}_{\hat{\beta_0}} = \hat{\sigma}*\sqrt{\frac{\sum_{i=1}^{n}(x_i)^2}{n*\sum_{i=1}^{n}(x_i-\bar{x})^2}}\]

sigma_beta0 <- sigma(logModel)*sqrt(sum(dosis^2)/(96*sum((dosis-mean(dosis))^2)))
sigma_beta0
[1] 0.239645
summary(logModel)$coefficients["(Intercept)","Std. Error"]
[1] 0.239645

Onze geschatte t-waarde is opnieuw:

\[t = \frac{\hat{\beta}_0}{\hat{\sigma}_{\hat{\beta_0}}}\]

tval_beta0 <- beta0/sigma_beta0
tval_beta0
[1] 8.78221
summary(logModel)$coefficients["(Intercept)", "t value"]
[1] 8.78221

Onze p-waarde berekenen we opnieuw als de kans dat een t-verdeelde variabele met 94 vrijheidsgraden nog extremer is dan 8.7822095:

pval_beta0 <- 2*pt(-abs(tval_beta0), df=94)
pval_beta0
[1] 7.127514e-14
summary(logModel)$coefficients["(Intercept)", "Pr(>|t|)"]
[1] 7.127514e-14
LS0tCnRpdGxlOiAiRW5rZWx2b3VkaWdlIGxpbmVhaXJlIHJlZ3Jlc3NpZSIKYXV0aG9yOiAiTHVkZ2VyIEdvZW1pbm5lICYgS29lbiBWYW4gZGVuIEJlcmdlIgpkYXRlOiAiMTcvMTEvMjAxNyIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQpgYGAKCiMgUEMtbGVzIDQ6IEVua2Vsdm91ZGlnZSBsaW5lYWlyZSByZWdyZXNzaWUKCiMjIEVua2Vsdm91ZGlnZSBsaW5lYWlyZSByZWdyZXNzaWUgbWV0IGVlbiBjb250aW51ZSBwcmVkaWN0b3I6IGxvZy10cmFuc2Zvcm1hdGllCgpIZXJpbm5lciB1IGRlIG9wZ2F2ZSB2YW4gZGUgZ2V6YW1lbGlqa2Ugb2VmZW5pbmdlbmxlczoKCkJpaiA5NiB2aXNzZW4gKGRvam92aXNzZW4sIGdvdWR2aXNzZW4gZW4gemVicmF2aXNzZW4pIHdlcmQgZGUgcmVzaXN0ZW50aWUgdGVnZW4gaGV0IHZlcmdpZiBFSS00MywwNjQgZ2V0ZXN0IGRvb3IgZWxrZSB2aXMgaW5kaXZpZHVlZWwgaW4gZWVuIHZhdCBtZXQgMiBsaXRlciB3YXRlciBlbiBlZW4gYmVwYWFsZGUgYGRvc2lzYCAoaW4gbWcpIHZhbiBoZXQgdmVyZ2lmIHRlIHN0ZWtlbi4gTmFhc3QgZGUgb3ZlcmxldmluZ3N0aWpkIGluIG1pbnV0ZW4gKGRlIHVpdGtvbXN0LCBgbWluc3VydmApIHdlcmQgb29rIGhldCBgZ2V3aWNodGAgdmFuIGRlIHZpcyBnZW1ldGVuIChpbiBncmFtKS4KCkluIGRlemUgYXBhcnRlIG9lZmVuaW5nZW5sZXMgZ2FhbiB3ZSB2ZXJkZXIgaW4gb3AgZGUgb25kZXJ6b2Vrc3ZyYWFnOiAiV2F0IGlzIGRlIGFzc29jaWF0aWUgdHVzc2VuIGRvc2lzIGVuIG92ZXJsZXZpbmdzdGlqZD8iIEluIGRlIGdlemFtZWxpamtlIG9lZmVuaW5nZW5sZXMgemFnZW4gd2UgaW1tZXJzIGRhdCBkZSByZXNpZHVlbiBnZWVuIG5vcm1hbGUgdmVyZGVsaW5nIHZvbGdlbiBlbiAgb29rIGFzc3VtcHRpZSB2YW4gaG9tb3NjZWRhc3RpY2l0ZWl0IGdlc2Nob25kZW4gaXMuIEluIGRlemUgbGVzIHp1bGxlbiB3ZSBiZXJvZXAgZG9lbiBvcCBlZW4gKGxvZy0pdHJhbnNmb3JtYXRpZSB2YW4gZGUgYWZoYW5rZWxpamtlIHZhcmlhYmVsZSBvbSB0b2NoIGFhbiBkZXplIGFzc3VtcHRpZXMgdGUgdm9sZG9lbi4KCkxlZXMgZGUgZGF0YXNldCBwb2lzb24uZGF0IG9wbmlldXcgaW4gdmlhIGByZWFkLnRhYmxlYC4gVmVyYW5kZXIgZGUgZGlyZWN0b3J5IG5hYXIgZGUgZm9sZGVyIHdhYXJpbiBqZSBkZSBgcG9pc2lvbi5kYXRgIGZpbGUgaGVidCBvcGdlc2xhYW4uCgpgYGB7cn0KcG9pc29uIDwtIHJlYWQudGFibGUoIi9Vc2Vycy9rb2VudmFuZGVuYmVyZ2UvRHJvcGJveC9QaEQvT25kZXJ3aWpzL1N0YXRpc3RpZWsgQmlvY2hlbWllLzIwMTgxOS9kcm9wYm94U3RhdHMxODE5L2NsYXNzNC9mdWxsL3BvaXNvbi5kYXQiLCBzZXAgPSAiIiwgaGVhZGVyID0gVFJVRSkKCiNXZSBnZWJydWlrZW4gZGUgdm9sZ2VuZGUgdmFyaWFiZWxlbjoKc29vcnQgPC0gcG9pc29uJHNvb3J0Cmdld2ljaHQgPC0gcG9pc29uJGdld2ljaHQKZG9zaXMgPC0gcG9pc29uJGRvc2lzCm1pbnN1cnYgPC0gcG9pc29uJG1pbnN1cnYKYGBgCgojIyMjIDEuIFdhYXJvbSBlZW4gbG9nLXRyYW5zZm9ybWF0aWU/CgpIZXJpbm5lciB1OiBiaWogaGV0IG1vZGVsIHZhbiB2b3JpZ2UgbGVzIGhhZGRlbiBkZSByZXNpZHVlbiBlZW4ga29ydGUgbGlua3NlIHN0YWFydCBlbiBlZW4gbGFnZW4gcmVjaHRzZSBzdGFhcnQuCgpgYGB7cn0KbW9kZWwxIDwtIGxtKG1pbnN1cnZ+ZG9zaXMpIApxcW5vcm0ocmVzaWQobW9kZWwxKSkKcXFsaW5lKHJlc2lkKG1vZGVsMSkpCmBgYAoKRWVuIGxvZy10cmFuc2Zvcm1hdGllIG1hYWt0IGdyb3RlIHdhYXJkZW4gaGVlbCB2ZWVsIGtsZWluZXIgdGVyd2lqbCBrbGVpbmUgd2FhcmRlbiBzbGVjaHRzIGVlbiBiZWV0amUga2xlaW5lciB6dWxsZW4gd29yZGVuLiBFZW4gbG9nLXRyYW5zZm9ybWF0aWUgaGVlZnQgZHVzIGhldCBwb3RlbnRpZWVsIG9tIHZlcmRlbGluZ2VuIGRpZSBzY2hlZWYgbmFhciByZWNodHMgemlqbiBtZWVyIHN5bW1ldHJpc2NoIHRlIG1ha2VuLiBEaXQgemllIGplIG9vayB3YW5uZWVyIGplIGVlbiBoaXN0b2dyYW0gbWFha3QgdmFuIGRlIHVpdGtvbXN0dmFyaWFiZWxlIHZvb3IgZW4gbmEgbG9ndHJhbnNmb3JtYXRpZS4KCmBgYHtyfQpoaXN0KG1pbnN1cnYsIG1haW49Ikhpc3RvZ3JhbSB2YW4gZGUgb3ZlcmxldmluZ3N0aWpkIikKYGBgCgpgYGB7cn0KI0xvZy10cmFuc2Zvcm1hdGllIHZhbiBkZSBhZmhhbmtlbGlqa2UgdmFyaWFiZWxlIG1pbnN1cnYKbG9nLm1pbnN1cnYgPC0gbG9nKG1pbnN1cnYpCmhpc3QobG9nLm1pbnN1cnYsIG1haW49Ikhpc3RvZ3JhbSB2YW4gZGUgbG9nLW92ZXJsZXZpbmdzdGlqZCIpCmBgYAoKSGVyaW5uZXIgdSBvb2sgZGUgcGxvdCB2YW4gZGUgdmllcmthbnRzd29ydGVsIHZhbiBkZSBhYnNvbHV0ZSB3YWFyZGUgdmFuIGRlIHJlc2lkdWVuIGkuZi52LiBkZSBnZWZpdHRlIHdhYXJkZW4uIEhpZXJ1aXQgYmVzbG90ZW4gd2UgZGF0IGRlIHZhcmlhbnRpZSB0b2VuZWVtdCBuYWFybWF0ZSBkZSBnZXNjaGF0dGUgdWl0a29tc3R2YXJpYWJlbGUgZ3JvdGVyIHdvcmR0LgoKYGBge3J9CnBsb3QoZml0dGVkKG1vZGVsMSksc3FydChhYnMocmVzaWQobW9kZWwxKSkpKQpsaW5lcyhsb3dlc3MoeD1maXR0ZWQobW9kZWwxKSx5PXNxcnQoYWJzKHJlc2lkKG1vZGVsMSkpKSksY29sPSJyZWQiKQpgYGAKCkRpdCBpcyBlZW4gZXh0cmEgaW5kaWNhdGllIGRhdCBlZW4gbG9nLXRyYW5zZm9ybWF0aWUgemludm9sIGthbiB6aWpuOiBlZW4gbG9ndHJhbnNmb3JtYXRpZSB6YWwgZWVuIGFkZGl0aWV2ZSBlcnJvcnN0cnVjdHV1ciBvbXpldHRlbiBuYWFyIGVlbiBtdWx0aXBsaWNhdGlldmUgc3RydWN0dXVyLgoKIyMjIyAyLiBWb2VyIGVlbiBsb2ctdHJhbnNmb3JtYXRpZSB1aXQgdmFuIGRlIGFmaGFua2VsaWprZSB2YXJpYWJlbGUgZW4gdm9lciBlZW4gbGluZWFpcmUtcmVncmVzc2llYW5hbHlzZSB1aXQgdm9vciBkZSBnZXRyYW5zZm9ybWVlcmRlIHZhcmlhYmVsZS4KCgpgYGB7cn0KI0xvZy10cmFuc2Zvcm1hdGllIHZhbiBkZSBhZmhhbmtlbGlqa2UgdmFyaWFiZWxlIG1pbnN1cnYKbG9nLm1pbnN1cnYgPC0gbG9nKG1pbnN1cnYpCgojZml0IGVlbiBsaW5lYWlyIHJlZ3Jlc3NpZW1vZGVsIG1ldCAnbG9nLW1pbnN1cnYnIGFscyBhZmhhbmtlbGlqa2UgZW4gJ2Rvc2lzJyBhbHMgb25hZmhhbmtlbGlqa2UgdmFyaWFiZWxlCmxvZ01vZGVsIDwtIGxtKGxvZy5taW5zdXJ2fmRvc2lzKQpsb2dNb2RlbApgYGAKCk1lcmsgb3AgZGF0IGRlIGZ1bmN0aWUgYGxvZ2AgaW4gYFJgIGhldCBuYXR1dXJsaWprIGxvZ2FyaXRtZSAoZC53LnouIGhldCBsb2dhcml0bWUgbWV0IGdyb25kdGFsICRlJCkgYmVyZWtlbnQuIE9tIGVlbiBsb2dhcml0bWUgbWV0IGVlbiBhbmRlciBncm9uZHRhbCB0ZSBiZXJla2VuZW4sIGthbiBqZSBoZXQgYXJndW1lbnQgYGJhc2UgPSAuLi5gIGdlYnJ1aWtlbi4gRGUgdm9sZ2VuZGUgY29kZSBiZXJla2VudCBoZXQgbG9nYXJpdG1lIHZhbiAxMDAgbWV0IGdyb25kdGFsIDEwLgoKYGBge3J9CmxvZygxMDAsIGJhc2U9MTApCmBgYAoKIyMjIDMuIEdhIHplbGYgbmEgb2YgZGUgdm9vcndhYXJkZW4gdm9vciBsaW5lYWlyZSByZWdyZXNzaWUgbnUgd2VsIHZvbGRhYW4gemlqbi4KCmBgYHtyfQpwYXIobWZyb3c9YygyLDIpKQpwbG90KGxvZ01vZGVsKQpgYGAKCjEuIE9uYWZoYW5rZWxpamtoZWlkCgpJZGVtIGFscyB2b29yZGllbjogYWxzIGplIGVydmFuIHVpdGdhYXQgZGF0IGRlIHJhbmRvbWlzYXRpZSBjb3JyZWN0IGdlYmV1cmRlIGVuIGhldCBzZWxlY3RlcmVuIHZhbiBkZSB2aXNzZW4gd2lsbGVrZXVyaWcgZ2ViZXVyZGUsIGt1biBqZSBpbiBwcmluY2lwZSBvbmFmaGFua2VsaWpraGVpZCBhYW5uZW1lbiBvbWRhdCBiaWogZWVuIGdvZWRlIHJhbmRvbWlzYXRpZSBvYnNlcnZhdGllcyBvbmFmaGFua2VsaWprIHZhbiBlbGthYXIgd29yZGVuIGdlbWV0ZW4uCgoyLiBMaW5lYXJpdGVpdAoKTGluZWFyaXRlaXQgZ2FhbiB3ZSBuYSBvcCBiYXNpcyB2YW4gZGUgIlJlc2lkdWFscyB2cyBGaXR0ZWQiIHBsb3QuIERlemUgdG9vbnQgZGUgd2FhcmRlbiB2YW4gZGUgcmVzaWR1ZW4gaW4gZnVuY3RpZSB2YW4gZGUgZG9vciBoZXQgbW9kZWwgZ2VmaXR0ZSB3YWFyZGVuLiBIaWVyIGxpamt0IGdvZWQgYWFuIGRlIGxpbmVhcml0ZWl0c2Fzc3VtcHRpZSB2b2xkYWFuIHRlIHppam4sIGFhbmdlemllbiBkZSByZXNpZHVlbiBtb29pIHJvbmQgbnVsIHZlcmRlZWxkIHppam4gb3ZlciBoZWVsIGhldCBiZXJlaWsgdmFuIGRlIGdlZml0dGUgd2FhcmRlbi4gRGUgc21vb3RoZXIgbGlndCBkYWFyb20gb29rIGRpY2h0IHJvbmQgZGUgbnVsLWxpam4gem9uZGVyIGR1aWRlbGlqa2UgdHJlbmRzLgoKMy4gTm9ybWFhbCB2ZXJkZWVsZGUgcmVzaWR1ZW4KCkhpZXJ2b29yIGtpamtlbiB3ZSBuYWFyIGRlIFFRLXBsb3QuIERlIHJlc2lkdWVuIGxpamtlbiBuaWV0IHN0ZXJrIGFmIHRlIHdpamtlbiB2YW4gd2F0IG1lbiB6b3UgdmVyd2FjaHRlbiBhbHMgemUgbm9ybWFhbCB2ZXJkZWVsZCB6b3VkZW4gemlqbiAoZGUgcGVyY2VudGllbGVuIHZhbiBkZSByZXNpZHVlbiBrb21lbiBnb2VkIG92ZXJlZW4gbWV0IGRlIHBlcmNlbnRpZWxlbiBkaWUgbWVuIHZlcndhY2h0IG9wIGJhc2lzIHZhbiBkZSBub3JtYWxlIHZlcmRlbGluZykuIERlIGlldHMga29ydGVyZSBsaW5rc2Ugc3RhYXJ0IGlzIG5pZXQgdmFuIGRpZSBhYXJkIGRhdCB3ZSBvbnMgem9yZ2VuIHpvdWRlbiBtb2V0ZW4gbWFrZW4gb3ZlciBzY2hlbmRpbmdlbiB2YW4gbm9ybWFsaXRlaXQuIERlIG5vcm1hbGl0ZWl0c2Fzc3VwdGllIGxpamt0IGR1cyB2b2xkYWFuLgoKNC4gSG9tb3NjZWRhc3RpY2l0ZWl0CgpIaWVydm9vciBraWprZW4gd2UgbmFhciBkZSBwbG90IGRpZSBkZSBnZWZpdHRlIHdhYXJkZW4gdWl0emV0IGluIGZ1bmN0aWUgdmFuIGRlIHZpZXJrYW50c3dvcnRlbCB2YW4gZGUgYWJzb2x1dGUgd2FhcmRlIHZhbiBkZSBnZXN0YW5kYWFyZGlzZWVyZGUgcmVzaWR1ZW4uIEFscyBkZSBkYXRhIGhvbW9zY2VkYXN0aXNjaCBpcywgZGFuIHphbCBoZXQgZ2VtaWRkZWxkZSB2YW4gZGUgYWJzb2x1dGUgd2FhcmRlIHZhbiBkZSBnZXN0YW5kYWFyZGlzZWVyZGUgcmVzaWR1ZW4gYWx0aWpkIHJvbmQgZGV6ZWxmZGUgd2FhcmRlIGxpZ2dlbiwgb25hZmhhbmtlbGlqayB2YW4gZGUgZ2VmaXR0ZSB3YWFyZGUuIEVlbiBzbW9vdGhlciBkb29yIGRlIHB1bnRlbndvbGsgemFsIGRhbiB2cmlqd2VsIGhvcml6b250YWFsIHppam4gZW4gZ2VlbiBkdWlkZWxpamtlIHRyZW5kcyB2ZXJ0b25lbi4gRXIgaXMgZ2VlbiBwYXRyb29uIHRlIHppZW4gd2FubmVlciBkZSB2aWVya2FudHN3b3J0ZWwgdmFuIGRlIGdlc3RhbmRhYXJkaXNlZXJkZSByZXNpZHVlbiB3b3JkdCB1aXRnZXpldCBpbiBmdW5jdGllIHZhbiBkZSBnZWZpdHRlIHdhYXJkZW4uIE9uemUgc21vb3RoZXIgbG9vcHQgZGFuIG9vayB2cmlqd2VsIGhvcml6b250YWFsLCBkZSB6ZWVyIGJlcGVya3RlIHN0aWpnaW5nIGlzIG5pZXQgdmFuIGRpZSBhYXJkIGRhdCB3ZSBvbnMgem9yZ2VuIG1vZXRlbiBtYWtlbiBvdmVyIGRlIGhvbW9zY2VkYXN0aWNpdGVpdHNhc3N1bXB0aWUuIERlIGFzc3VtcHRpZSB2YW4gaG9tb3NjZWRhc3RpY2l0ZWl0IGxpamt0IGR1cyB2b2xkYWFuLgoKQmVzbHVpdDogYWwgb256ZSBhc3N1bXB0aWVzIGxpamtlbiB2b2xkYWFuIHRlIHppam4uIFdlIGdhYW4gZHVzIGVlbiBjb3JyZWN0ZSBpbmZlcmVudGllIGt1bm5lbiBkb2VuIG9wIGJhc2lzIHZhbiBkaXQgbW9kZWwuCgoKCiMjIyMgNC4gR2VlZiBkZSBudWwtIGVuIGFsdGVybmF0aWV2ZSBoeXBvdGhlc2Ugdm9vciBkZSB0LXRlc3QgaW4gZGUgbW9kZWxvdXRwdXQgZGllIGdlYXNzb2NpZWVyZCBpcyBtZXQgaGV0IGRvc2lzLWVmZmVjdCBlbmVyemlqZHMgZW4gZGUgbnVsLSBlbiBhbHRlcm5hdGlldmUgaHlwb3RoZXNlIHZvb3IgZGUgdC10ZXN0IGluIGRlIG1vZGVsb3V0cHV0IGRpZSBnZWFzc29jaWVlcmQgaXMgbWV0IGhldCBpbnRlcmNlcHQgYW5kZXJ6aWpkcy4KCioqTnVsaHlwb3RoZXNlIHZvb3IgaGV0IGRvc2lzZWZmZWN0OioqIGVyIGlzIGdlZW4gdmVyYmFuZCB0dXNzZW4gZGUgZG9zaXMgdmVyZ2lmIGRpZSAgZG9qb3Zpc3NlbiwgZ291ZHZpc3NlbiBlbiB6ZWJyYXZpc3NlbiB0b2VnZWRpZW5kIGtyZWdlbiBlbiBoZXQgKipnZW1pZGRlbGQqKiBsb2dhcml0bWUgdmFuIGh1biBvdmVybGV2aW5nc3RpamQuCgoqKkFsdGVybmF0aWV2ZSBoeXBvdGhlc2Ugdm9vciBoZXQgZG9zaXNlZmZlY3Q6KiogZXIgaXMgZWVuIGxpbmVhaXIgZWZmZWN0IHZhbiBkZSBkb3NpcyB2ZXJnaWYgb3AgaGV0ICoqZ2VtaWRkZWxkKiogbG9nYXJpdG1lIHZhbiBodW4gb3ZlcmxldmluZ3N0aWpkIGluIG1pbnV0ZW4gdmFuIGRvam92aXNzZW4sIGdvdWR2aXNzZW4gZW4gemVicmF2aXNzZW4uCgoqKk51bGh5cG90aGVzZSB2b29yIGhldCBpbnRlcmNlcHQ6KiogaGV0ICoqZ2VtaWRkZWxkKiogbG9nYXJpdG1lIHZhbiBkZSBvdmVybGV2aW5nc3RpamQgaW4gbWludXRlbiB2b29yIGRvam92aXNzZW4sIGdvdWR2aXNzZW4gZW4gemVicmF2aXNzZW4gZGllIGdlZW4gdmVyZ2lmIHRvZWdlZGllbmQga3JlZ2VuIGlzIGdlbGlqayBhYW4gMC4KCioqQWx0ZXJuYXRpZXZlIGh5cG90aGVzZSB2b29yIGhldCBpbnRlcmNlcHQ6KiogaGV0ICoqZ2VtaWRkZWxkKiogbG9nYXJpdG1lIHZhbiBkZSBvdmVybGV2aW5nc3RpamQgaW4gbWludXRlbiB2b29yIGRvam92aXNzZW4sIGdvdWR2aXNzZW4gZW4gemVicmF2aXNzZW4gZGllIGdlZW4gdmVyZ2lmIHRvZWdlZGllbmQga3JlZ2VuIGlzIG5pZXQgZ2VsaWprIGFhbiAwLgoKCgojIyMjIDUuIEludGVycHJldGF0aWUgdmFuIGhldCBkb3Npcy1lZmZlY3Qgdm9vciBoZXQgbW9kZWwgbWV0IGVlbiBsb2ctZ2V0cmFuc2Zvcm1lZXJkZSB1aXRrb21zdHZhcmlhYmVsZS4KCioqMS4gSW50ZXJwcmV0YXRpZSBvcCBkZSBzY2hhYWwgdmFuIGdldHJhbnNmb3JtZWVyZGUgd2FhcmRlbjoqKgoKJFx3aWRlaGF0e2xvZyhtaW5zdXJ2X2kpfSA9IFxoYXR7XGJldGFfMH0gKyBcaGF0e1xiZXRhXzF9IGRvc2lzX2kkCgokXHdpZGVoYXR7bG9nKG1pbnN1cnZfaSl9ID0gMi4xMDUgLSAwLjUxMTIqZG9zaXNfaSQKCioqSW50ZXJwcmV0YXRpZToqKiBhbHMgZGUgZG9zaXMgbWV0IDEgbWlsaWdyYW0gc3Rpamd0LCBkYW4gZGFhbHQgaGV0IGdlbWlkZGVsZGUgdmFuIGhldCBuYXR1dXJsaWprIGxvZ2FyaXRtZSB2YW4gZGUgb3ZlcmxldmluZ3N0aWpkIG1ldCAwLjUxMTIuCgoqKjIuIEludGVycHJldGF0aWUgb3AgZGUgb3JpZ2luZWxlIHNjaGFhbDoqKgoKVmFud2VnZSBkZSB0cmFuc2Zvcm1hdGllIG1vZGVsbGVyZW4gd2UgaGV0IGdlbWlkZGVsZGUgdmFuIGhldCBsb2dhcml0bWUgdmFuIGRlIHJlc3BvbnN2YXJpYWJlbGUsIGVuIGludGVycHJldGVlciBqZSBkZSBwYXJhbWV0ZXJzIGluIGRlemUgY29udGV4dCwgem9hbHMgaGllcmJvdmVuLiBBbHMgbWVuIGRlIGV4cG9uZW50IG5lZW10IHZhbiBkZSBnZXNjaGF0dGUgcGFyYW1ldGVycywgZ2VsZGVuIHplIGluIHRlcm1lbiB2YW4gaGV0ICoqZ2VvbWV0cmlzY2ggZ2VtaWRkZWxkZSoqIHZhbiBkZSByZXNwb25zdmFyaWFiZWxlIG9wIGRlIG9yaWdpbmVsZSBzY2hhYWwuIEhldCBnZW9tZXRyaXNjaCBnZW1pZGRlbGRlIHZhbiAkWSQgaXMgZ2VsaWprIGFhbjoKCiRlXntyZWtlbmt1bmRpZ1wgZ2VtaWRkZWxkZShsb2coeV9pKSl9ID0gZXhwKFxmcmFje1xzdW1fe2k9MX1ebiBsb2coeV9pKX17bn0pLiQKCioqT3BtZXJraW5nOioqICJleHAoLi4uKSIgYmV0ZWtlbnQgaGV0emVsZmRlIGFscyAiZV4uLi4iIQoKWm9hbHMgcmVlZHMgYWFuZ2VoYWFsZCBkdWlkdCBkZSAqKmBsb2dgLXRyYW5zZm9ybWF0aWUqKiBpbiBkZSBzdGF0aXN0aWVrIHR5cGlzY2ggCm9wIGhldCAqKm5hdHV1cmxpamsgbG9nYXJpdG1lKiogKGkuZS4gbWV0ICoqYmFzaXMgZ2VsaWprIGFhbiAkZSQqKiBlbiBuaWV0IG1ldCBiYXNpcyAkMTAkKS4gT3AgZGV6ZSBtYW5pZXIgaW50ZXJwcmV0ZXJlbiB3ZSBkYW4gb29rIGRlIHBhcmFtZXRlcnMuCgokXHdpZGVoYXR7bWluc3Vydn1faSA9IGV4cCgyLjEwNSAtIDAuNTExMipkb3Npc19pKSA9IFxmcmFje2VeezIuMTA1fX17ZV57MC41MTEyKntkb3Npc31faX19JCAod2UgbWFha3RlbiBnZWJydWlrIHZhbiBkZSByZWtlbnJlZ2VsOiAkZV57YS1ifSA9IGVeYS9lXmIkKQoKKipJbnRlcnByZXRhdGllOioqIGFscyBkZSBkb3NpcyB2YW4gaGV0IHZlcmdpZiBzdGlqZ3QgbWV0IMOpw6luIG1pbGlncmFtLCBkYW4gZGFhbHQgaGV0ICoqZ2VvbWV0cmlzY2ggZ2VtaWRkZWxkZSoqIHZhbiBkZSBvdmVybGV2aW5nc3RpamQgdmFuIGRvam92aXNzZW4sIGdvdWR2aXNzZW4gZW4gemVicmF2aXNzZW4gbWV0IGVlbiAqKmZhY3RvcioqIHZhbiAkZV57LTAuNTExMn0gPSAxL2VeezAuNTExMn0gPSAwLjYwJC4KCkRvZSBoZXQgdm9sZ2VuZGUgemVsZnN0YW5kaWcgb20gYm92ZW5zdGFhbmRlIGludGVycHJldGF0aWUgdGUgdmVyZHVpZGVsaWprZW46CgogLSBCZXJla2VuIGhldCB2ZXJ3YWNodGUgZ2VvbWV0cmlzY2hlIGdlbWlkZGVsZGUgdmFuIGRlIG92ZXJsZXZpbmdzdGlqZCB2b29yIGVlbiBkb3NpcyB2YW4gMSBtaWxpZ3JhbS4KIApgYGB7cn0KZXhwKDIuMTA1IC0gMC41MTEyKjEpCmBgYAogCiAtIERvZSBoZXR6ZWxmZGUgdm9vciBlZW4gZG9zaXMgdmFuIDIgbWlsaWdyYW0uCiAKYGBge3J9CmV4cCgyLjEwNSAtIDAuNTExMioyKQpgYGAKIAogLSBWZXJnZWxpamsgZGV6ZSB3YWFyZGVuLiBXYXQgbWVyayBqZSBvcD8KCiQyLjk1MjM0Ni80LjkyMjQxOSA9ICAwLjU5OTc3NTQgPSAxL2VeezAuNTExMn0gPSAwLjYwJC4KCgoKIyMjIyA2LiBQcm9iZWVyIG51IHplbGYgZWVucyBlZW4gY29ycmVjdGUgZW4gdm9sbGVkaWdlIGludGVycHJldGF0aWUgdmFuIGhldCBlZmZlY3QgdmFuIGRlIGRvc2lzIG9wIGRlIHZlcndhY2h0ZSB1aXRrb21zdCB0ZSBnZXZlbiwgc2FtZW4gbWV0IHppam4gYmlqaG9yZW5kZSA5NSUtYmV0cm91d2JhYXJoZWlkc2ludGVydmFsLCB6b3dlbCBvcCBkZSBsb2ctc2NoYWFsIGFscyBvcCBkZSBvcmlnaW5lbGUgc2NoYWFsLgoKKipJbnRlcnByZXRhdGllIG9wIGRlIGxvZy1zY2hhYWwqKgoKYGBge3J9CnN1bW1hcnkobG9nTW9kZWwpCmNvbmZpbnQobG9nTW9kZWwpCmBgYAoKSW50ZXJwcmV0YXRpZSB2YW4gZGUgcGFyYW1ldGVyIGBkb3Npc2Agb3AgZGUgbG9nLXNjaGFhbDoKCkhldCAqKmdlbWlkZGVsZCoqIGxvZ2FyaXRtZSB2YW4gZGUgb3ZlcmxldmluZ3N0aWpkIGluIG1pbnV0ZW4gbGlndCAwLDUxIGxhZ2VyIHZvb3IgZWxrZSAxIG1nIHZlcmdpZiBleHRyYSBkaWUgd29yZHQgZ2VnZXZlbiBhYW4gZG9qb3Zpc3NlbiwgZ291ZHZpc3NlbiBlbiB6ZWJyYXZpc3NlbiAoOTUlLWJldHJvdXdiYWFyaGVpZHNpbnRlcnZhbDogMCwyMSB0b3QgMCw4MSkuIERpdCB2ZXJzY2hpbCBpcyAqKnN0ZXJrIHNpZ25pZmljYW50Kiogb3AgaGV0ICoqNSUtc2lnbmlmaWNhbnRuaWVuaXZlYXUgKHAgPSAwLDAwMSkqKi4KCkludGVycHJldGF0aWUgdmFuIGhldCA5NSUtYmV0cm91d2JhYXJoZWlkc2ludGVydmFsIHZvb3IgYGRvc2lzYCBvcCBkZSBsb2ctc2NoYWFsOgoKTWV0IGVlbiB3YWFyc2NoaWpubGlqa2hlaWQgdmFuIDk1JSBiZXZhdCBoZXQgaW50ZXJ2YWwgdmFuIDAsMjEgdG90IDAsODEgaGV0IHdlcmtlbGlqa2UgZ2VtaWRkZWxkZSB2ZXJzY2hpbCBpbiBsb2dhcml0bWUgdmFuIGRlIG92ZXJsZXZpbmdzdGlqZCBpbiBtaW51dGVuIHR1c3NlbiB2aXNzZW4gZGllIDEgbWcgdmVyZ2lmIG1pbmRlciBrcmVnZW4gZW4gdmlzc2VuIHdlbCBlZW4gZXh0cmEgbWcgdmVyZ2lmIGtyZWdlbi4KCioqSW50ZXJwcmV0YXRpZSBvcCBkZSBvcmlnaW5lbGUgc2NoYWFsKioKCmBgYHtyfQpleHAoc3VtbWFyeShsb2dNb2RlbCkkY29lZmZpY2llbnRzWywiRXN0aW1hdGUiXSkKZXhwKGNvbmZpbnQobG9nTW9kZWwpKQpgYGAKCkludGVycHJldGF0aWUgdmFuIGRlIHBhcmFtZXRlciBgZG9zaXNgIG9wIGRlIG9yaWdpbmVsZSBzY2hhYWw6CgpIZXQgKipnZW9tZXRyaXNjaCBnZW1pZGRlbGRlKiogdmFuIGRlIG92ZXJsZXZpbmdzdGlqZCBpbiBtaW51dGVuIGxpZ3QgKiplZW4gZmFjdG9yKiogMCw2MCBsYWdlciB2b29yIGVsa2UgMSBtZyB2ZXJnaWYgZXh0cmEgZGllIHdvcmR0IGdlZ2V2ZW4gYWFuIGRvam92aXNzZW4sIGdvdWR2aXNzZW4gZW4gemVicmF2aXNzZW4gKDk1JS1iZXRyb3V3YmFhcmhlaWRzaW50ZXJ2YWw6IDAsNDQgdG90IDAsODEpLiBEaXQgdmVyc2NoaWwgaXMgKipzdGVyayBzaWduaWZpY2FudCoqIG9wIGhldCAqKjUlLXNpZ25pZmljYW50bmllbml2ZWF1IChwID0gMCwwMDEpKiouCgpJbnRlcnByZXRhdGllIHZhbiBoZXQgOTUlLWJldHJvdXdiYWFyaGVpZHNpbnRlcnZhbCB2b29yIGBkb3Npc2Agb3AgZGUgb3JpZ2luZWxlIHNjaGFhbDoKCk1ldCBlZW4gd2FhcnNjaGlqbmxpamtoZWlkIHZhbiA5NSUgYmV2YXQgaGV0IGludGVydmFsIHZhbiAwLDQ0IHRvdCAwLDgxIGRlIHdlcmtlbGlqa2UgZmFjdG9yIHdhYXJtZWUgaGV0IGdlb21ldHJpc2NoIGdlbWlkZGVsZGUgdmFuIGRlIG92ZXJsZXZpbmdzdGlqZCBpbiBtaW51dGVuIGFmbmVlbXQgdHVzc2VuIHZpc3NlbiBkaWUgMSBtZyB2ZXJnaWYgZXh0cmEga3JlZ2VuIGVuIHZpc3NlbiBnZWVuIGV4dHJhIG1nIHZlcmdpZiBrcmVnZW4uCgoqKkdlZ2V2ZW4gZWVuIG1vZGVsIHdhYXJ2YW4gZGUgdWl0a29tc3R2YXJpYWJlbGUgbG9nLWdldHJhbnNmb3JtZWVyZCBpcywgYWxzIGlrIHUgdm9vciBlZW4gYmVwYWFsZGUgcGFyYW1ldGVyIGVlbiA5NSUtYmV0cm91d2JhYXJoZWlkc2ludGVydmFsIG9wIGRlIG9yaWdpbmVsZSBzY2hhYWwgem91IGdldmVuIGVuIHUgem91IHplZ2dlbiBkYXQgZGUgcC13YWFyZGUgdm9vciBkaWUgcGFyYW1ldGVyIGtsZWluZXIgaXMgZGFuIDAsMDUsIHdlbGtlIHdhYXJkZSBsaWd0IGVyIGRhbiBtZXQgemVrZXJoZWlkIE5JRVQgaW4gaGV0IGdlZ2V2ZW4gOTUlLWJldHJvdXdiYWFyaGVpZHNpbnRlcnZhbD8qKgoKRGUgd2FhcmRlIDEuIERlIG51bGh5cG90aGVzZSB2YW4gb256ZSB0LXRlc3QgdmVyb25kZXJzdGVsdCBkYXQgZGUgcGFyYW1ldGVyIG9wIGRlIGxvZy1zY2hhYWwgZ2VsaWprIGlzIGFhbiBudWwuIEFhbmdlemllbiBwIDwgMCwwNSwgd29yZHQgZGUgbnVsaHlwb3RoZXNlIHZlcndvcnBlbiBvcCBoZXQgNSUtc2lnbmlmaWNhbnRpZW5pdmVhdS4gRWVuIDk1JS1iZXRyb3V3YmFhcmhlaWRzaW50ZXJ2YWwgdm9vciBkZXplIHBhcmFtZXRlciBvcCBkZSBsb2ctc2NoYWFsIHphbCBkdXMgemVrZXIgbmlldCBkZSB3YWFyZGUgMCBiZXZhdHRlbi4gQWxzIHdlIGRlIHBhcmFtZXRlciB0ZXJ1Z3RyYW5zZm9ybWVyZW4sIHphbCBkZSB3YWFyZGUgZV4wID0gMSBkdXMgemVrZXIgbmlldCBpbiBoZXQgZ2VnZXZlbiBpbnRlcnZhbCBsaWdnZW4uCgpNZXJrIG9vayBvcCBkYXQgZGUgYmV0cm91d2JhYXJoZWlkc2ludGVydmFsbGVuIG9wIGVlbiBnZW9tZXRyaXNjaCBnZW1pZGRlbGRlIChkdXMgbmEgdGVydWd0cmFuc2Zvcm1hdGllKSBuaWV0IG1lZXIgc3ltbWV0cmlzY2ggcm9uZCBkZSBnZXNjaGF0dGUgcGFyYW1ldGVyd2FhcmRlIGxpZ2dlbiEKCgoKIyMjIyA3LiBHZWVmIGVlbiBjb3JyZWN0ZSBlbiB2b2xsZWRpZ2UgaW50ZXJwcmV0YXRpZSB2YW4gaGV0IGludGVyY2VwdCBtZXQgemlqbiBiaWpob3JlbmRlIDk1JS1iZXRyb3V3YmFhcmhlaWRzaW50ZXJ2YWwsIHpvd2VsIG9wIGRlIGxvZy1zY2hhYWwgYWxzIG9wIGRlIG9yaWdpbmVsZSBzY2hhYWwKCmBgYHtyfQpzdW1tYXJ5KGxvZ01vZGVsKQpjb25maW50KGxvZ01vZGVsKQpgYGAKCioqSW50ZXJwcmV0YXRpZSBvcCBkZSBsb2ctc2NoYWFsKioKCkludGVycHJldGF0aWUgdmFuIGhldCBpbnRlcmNlcHQgb3AgZGUgbG9nLXNjaGFhbDoKCkhldCAqKmdlbWlkZGVsZCoqIGxvZ2FyaXRtZSB2YW4gZGUgb3ZlcmxldmluZ3N0aWpkIGluIG1pbnV0ZW4gdm9vciBkb2pvdmlzc2VuLCBnb3Vkdmlzc2VuIGVuIHplYnJhdmlzc2VuIGRpZSBnZWVuIHZlcmdpZiB0b2VnZWRpZW5kIGtyZWdlbiBpcyBnZWxpamsgYWFuIDIsMSAoOTUlLWJldHJvdXdiYWFyaGVpZHNpbnRlcnZhbDogMSw2MiB0b3QgMiw1OCkuIERpdCBpcyAqKmV4dHJlZW0gc2lnbmlmaWNhbnQqKiB2ZXJzY2hpbGxlbmQgdmFuIG51bCBvcCBoZXQgKio1JS1zaWduaWZpY2FudG5pZW5pdmVhdSAocCA9IDcsMTNlLTE0KSoqLgoKSW50ZXJwcmV0YXRpZSB2YW4gaGV0IDk1JS1iZXRyb3V3YmFhcmhlaWRzaW50ZXJ2YWwgdm9vciBoZXQgaW50ZXJjZXB0IG9wIGRlIGxvZy1zY2hhYWw6CgpNZXQgZWVuIHdhYXJzY2hpam5saWpraGVpZCB2YW4gOTUlIGJldmF0IGhldCBpbnRlcnZhbCB2YW4gMSw2MiB0b3QgMiw1OCBoZXQgd2Vya2VsaWprZSBnZW1pZGRlbGRlIGxvZ2FyaXRtZSB2YW4gZGUgb3ZlcmxldmluZ3N0aWpkIGluIG1pbnV0ZW4gdm9vciB2aXNzZW4gZGllIGdlZW4gdmVyZ2lmIHRvZWdlZGllbmQga3JlZ2VuLgoKYGBge3J9CmV4cChjb25maW50KGxvZ01vZGVsKSkKZXhwKHN1bW1hcnkobG9nTW9kZWwpJGNvZWZmaWNpZW50c1ssIkVzdGltYXRlIl0pCmBgYAoKKipJbnRlcnByZXRhdGllIG9wIGRlIG9yaWdpbmVsZSBzY2hhYWwqKgoKSW50ZXJwcmV0YXRpZSB2YW4gaGV0IGludGVyY2VwdCBvcCBkZSBvcmlnaW5lbGUgc2NoYWFsOgoKSGV0ICoqZ2VvbWV0cmlzY2ggZ2VtaWRkZWxkZSoqIHZhbiBkZSBvdmVybGV2aW5nc3RpamQgaW4gbWludXRlbiB2b29yIGRvam92aXNzZW4sIGdvdWR2aXNzZW4gZW4gemVicmF2aXNzZW4gZGllIGdlZW4gdmVyZ2lmIHRvZWdlZGllbmQga3JlZ2VuIGlzIGdlbGlqayBhYW4gOCwyMCAoOTUlLWJldHJvdXdiYWFyaGVpZHNpbnRlcnZhbDogNSwxMCB0b3QgMTMsMjApLiBEaXQgdmVyc2NoaWwgaXMgKipleHRyZWVtIHNpZ25pZmljYW50Kiogb3AgaGV0ICoqNSUtc2lnbmlmaWNhbnRuaWVuaXZlYXUgKHAgPSA3LDEzZS0xNCkqKi4KCkludGVycHJldGF0aWUgdmFuIGhldCA5NSUtYmV0cm91d2JhYXJoZWlkc2ludGVydmFsIHZvb3IgaGV0IGludGVyY2VwdCBvcCBkZSBvcmlnaW5lbGUgc2NoYWFsOgoKTWV0IGVlbiB3YWFyc2NoaWpubGlqa2hlaWQgdmFuIDk1JSBiZXZhdCBoZXQgaW50ZXJ2YWwgdmFuIDUsMTAgdG90IDEzLDIwIGhldCB3ZXJrZWxpamtlIGdlb21ldHJpc2NoIGdlbWlkZGVsZGUgdmFuIGRlIG92ZXJsZXZpbmdzdGlqZCBpbiBtaW51dGVuIHZvb3Igdmlzc2VuIGRpZSBnZWVuIHZlcmdpZiB0b2VnZWRpZW5kIHZlcmdpZiBrcmVnZW4uCgoqKklzIGRlemUgaW50ZXJwcmV0YXRpZSB2YW4gaGV0IGludGVyY2VwdCBiaW9sb2dpc2NoIHJlbGV2YW50PyoqCgpEZXplIGludGVycHJldGF0aWUgaXMgYmlvbG9naXNjaCBuaWV0IHJlbGV2YW50IG9tZGF0IHplIGJ1aXRlbiBoZXQgbW9kZWxiZXJlaWsgdmFsdC4KCmBgYHtyfQpyYW5nZShkb3NpcykgI3ByaW50IGRlIG1pbmltYWxlIGVuIG1heGltYWxlIHdhYXJkZSB2YW4gZGUgZG9zaXMtdmFyaWFiZWxlCmBgYAoKIyMjIyA4LiBTY2hhdCBoZXQgZ2VvbWV0cmlzY2ggZ2VtaWRkZWxkZSB2YW4gZGUgb3ZlcmxldmluZ3N0aWpkIGJpaiBlZW4gZG9zaXMgdmFuIDIgbWcuIEdlZWYgZWVuIGJpamhvcmVuZCA5NSUtYmV0cm91d2JhYXJoZWlkc2ludGVydmFsLgoKYGBge3J9CjIuMTA0NiAtIDAuNTExMioyCgoKIApodWxwZGF0YTwtZGF0YS5mcmFtZShkb3NpcyA9IGMoMikpCiMgcHJlZGljdGllIG9wIGxvZy1zY2hhYWw6IHByZWRpY3QgbWVhbihsb2coeSkpCnByZWRpY3QobG9nTW9kZWwsaHVscGRhdGEsIGludGVydmFsPSJjb25maWRlbmNlIikgCiMgaW50ZXJ2YWw9ImMiIGR1aWR0IGFhbiBkYXQgd2UgZWVuIGNvbmZpZGVuY2UgaW50ZXJ2YWwgd2lsbGVuIHZlcmtyaWpnZW4uCmBgYAoKKipIb2UgaW50ZXJwcmV0ZXJlbiB3ZSBkaXQgOTUlIGJldHJvdXdiYWFyaGVpZHNpbnRlcnZhbD8qKgoKSGV0IGdlbWlkZGVsZGUgbG9nYXJpdG1lIHZhbiBkZSBvdmVybGV2aW5nc3RpamQgaW4gbWludXRlbiB2YW4gZG9qb3Zpc3NlbiBlbiBnb3Vkdmlzc2VuIGJpaiBlZW4gZG9zaXMgdmFuIDIgbWcgdmVyZ2lmIGJlZHJhYWd0IDEsMDguIE1ldCBlZW4gd2FhcnNjaGlqbmxpamtoZWlkIHZhbiA5NSUgYmV2YXQgaGV0IGludGVydmFsIHZhbiAwLDkxIHRvdCAxLDI1IGhldCB3ZXJrZWxpamtlIGdlbWlkZGVsZGUgbG9nYXJpdG1lIHZhbiBkZSBvdmVybGV2aW5nc3RpamQgaW4gbWludXRlbiB2YW4gdmlzc2VuIGRpZSAyIG1nIHZlcmdpZiB0b2VnZWRpZW5kIGtyZWdlbi4KCmBgYHtyfQpleHAoMi4xMDQ2IC0gMC41MTEyKjIpCmV4cCgyLjEwNDYpL2V4cCgwLjUxMTIqMikKCiMgZ2VvbWV0cmlzY2ggZ2VtaWRkZWxkZTogZXhwKG1lYW4obG9nKHkpKSkKZXhwKHByZWRpY3QobG9nTW9kZWwsaHVscGRhdGEsIGludGVydmFsPSJjb25maWRlbmNlIikpIApgYGAKCk1lcmsgb3AgZGF0ICRlXnswLjkxMjI4OTF9PTIuNDkwMDE2JCBlbiAkZV57MS4yNTIxNzR9PTMuNDk3OTQxJC4KCioqSG9lIGludGVycHJldGVyZW4gd2UgaGV0IDk1JSBiZXRyb3V3YmFhcmhlaWRzaW50ZXJ2YWwgbmEgdGVydWd0cmFuc2Zvcm1hdGllPyoqCgpIZXQgKipnZW9tZXRyaXNjaGUgZ2VtaWRkZWxkZSoqIHZhbiBkZSBvdmVybGV2aW5nc3RpamQgdmFuIGRvam92aXNzZW4gZW4gZ291ZHZpc3NlbiBiaWogZWVuIGRvc2lzIHZhbiAyIG1nIHZlcmdpZiBiZWRyYWFndCAyLDk1IG1pbnV0ZW4uIE1ldCBlZW4gd2FhcnNjaGlqbmxpamtoZWlkIHZhbiA5NSUgYmV2YXQgaGV0IGludGVydmFsIHZhbiAyLDQ5IHRvdCAzLDUwIGhldCB3ZXJrZWxpamtlIGdlb21ldHJpc2NoZSBnZW1pZGRlbGRlIHZhbiBvdmVybGV2aW5nc3RpamQgaW4gbWludXRlbiB2YW4gdmlzc2VuIGRpZSAyIG1nIHZlcmdpZiB0b2VnZWRpZW5kIGtyZWdlbi4KCiMjIyMgOS4gV2F0IGt1bm5lbiB3ZSBiZXNsdWl0ZW4gdWl0IGRlIHdhYXJkZSB2b29yIGRlIG1lZXJ2b3VkaWdlIGNvcnJlbGF0aWVjb8OrZmZpY2nDq250PyBEZXplIHdhYXJkZSBzdGFhdCBpbiBkZSBvdXRwdXQgdmFuIGhldCBsaW5lYWlyZSByZWdyZXNzaWVtb2RlbCAoYWxzIHUgZGUgInN1bW1hcnkiIG9wdnJhYWd0KSBiaWogIm11bHRpcGxlIFItU3F1YXJlZCIuCgpgYGB7cn0Kc3VtbWFyeShsb2dNb2RlbCkKYGBgCgpEZSBwcmVkaWN0b3J2YXJpYWJlbGUgImRvc2lzIiBzbGFhZ3QgZXJpbiBvbSAxMCw4OCUgdmFuIGRlIHRvdGFsZSB2YXJpYXRpZSBpbiBkZSByZXNwb25zdmFyaWFiZWxlICJsb2dhcml0bWUgdmFuIGRlIG92ZXJsZXZpbmdzdGlqZCBpbiBtaW51dGVuIiB0ZSB2ZXJrbGFyZW4uCgpJbnR1w690aWVmOiBkZSByZWdyZXNzaWVsaWpuIGNhcHRlZXJ0IDEwLDg4JSB2YW4gZGUgdG90YWxlIHZhcmlhdGllIGluIGhldCBuYXR1dXJsaWprIGxvZ2FyaXRtZSB2YW4gZGUgb3ZlcmxldmluZ3N0aWpkIGluIG1pbnV0ZW4uCgojIyMjIDEwLiBVaXR3ZXJrZW4gdmFuIGVmZmVjdGdyb290dGVzLCBzdGFuZGFhcmRmb3V0ZW4sIFQtd2FhcmRlbiBlbiBwLXdhYXJkZW4KCkluIGRpdCBsYWF0c3RlIGRlZWwgenVsbGVuIHdlIHplbGYgZGUgZWZmZWN0Z3Jvb3R0ZXMsIHN0YW5kYWFyZGZvdXRlbiwgVC13YWFyZGVuIGVuIHAtd2FhcmRlbiB2YW4gZGUgcGFyYW1ldGVycyB2YW4gaGV0IGxpbmVhaXIgcmVncmVzc2llbW9kZWwgYmVyZWtlbmVuLgoKKipWb29yIGhldCBlZmZlY3QgdmFuIGRvc2lzKioKCk9wIGJhc2lzIHZhbiBob29mZHN0dWsgNS4zIHZhbiBkZSBjdXJzdXMgd2V0ZW4gd2UgZGF0OgoKJCRcaGF0e1xiZXRhfV8xID0gXGZyYWN7XHN1bV97aT0xfV57bn0oeV9pLVxiYXJ7eX0pKHhfaS1cYmFye3h9KX17XHN1bV97aT0xfV57bn0oeF9pLVxiYXJ7eH0pXjJ9JCQKClZvb3Igb25zIHZvb3JiZWVsZDoKCiQkXGhhdHtcYmV0YX1fMSA9IFxmcmFje1xzdW1fe2k9MX1ee259KGxvZy5taW5zdXJ2X2ktXG92ZXJsaW5le2xvZy5taW5zdXJ2X2l9KShkb3Npc19pLVxvdmVybGluZXtkb3Npc30pfXtcc3VtX3tpPTF9XntufShkb3Npc19pLVxvdmVybGluZXtkb3Npc30pXjJ9JCQKCkRlIGdyb290dGUgdmFuIGhldCBkb3Npcy1lZmZlY3QgaXMgZHVzIGdlbGlqayBhYW46CgpgYGB7cn0KYmV0YTEgPSBzdW0oKGxvZy5taW5zdXJ2LW1lYW4obG9nLm1pbnN1cnYpKSooZG9zaXMtbWVhbihkb3NpcykpKS9zdW0oKGRvc2lzLW1lYW4oZG9zaXMpKV4yKQpiZXRhMQpzdW1tYXJ5KGxvZ01vZGVsKSRjb2VmZmljaWVudHNbImRvc2lzIiwiRXN0aW1hdGUiXQpgYGAKCkRlIGdlc2NoYXR0ZSB2YXJpYW50aWUgb3AgaGV0IGRvc2lzLWVmZmVjdCBrdW5uZW4gd2UgYWxzIHZvbGd0IGJlcmVrZW5lbjoKCiQkXGhhdHtcc2lnbWF9XjJfe1xoYXR7XGJldGFfMX19ID0gXGZyYWN7XGhhdHtcc2lnbWF9XjJ9e1xzdW1fe2k9MX1ee259KHhfaS1cYmFye3h9KV4yfSQkCgpEZSBnZXNjaGF0dGUgc3RhbmRhYXJkZm91dCBvcCAkXGhhdHtcYmV0YV8xfSQgaXMgZHVzOgoKJCRcaGF0e1xzaWdtYX1fe1xoYXR7XGJldGFfMX19ID0gXGZyYWN7XGhhdHtcc2lnbWF9fXtcc3FydHtcc3VtX3tpPTF9XntufSh4X2ktXGJhcnt4fSleMn19JCQKCmBgYHtyfQpzaWdtYV9iZXRhMSA9IHNpZ21hKGxvZ01vZGVsKS9zcXJ0KHN1bSgoZG9zaXMtbWVhbihkb3NpcykpXjIpKQpzdW1tYXJ5KGxvZ01vZGVsKSRjb2VmZmljaWVudHNbImRvc2lzIiwiU3RkLiBFcnJvciJdCmBgYAoKT256ZSBnZXNjaGF0dGUgdC13YWFyZGUgaXMgc2ltcGVsd2VnOgoKJCR0ID0gXGZyYWN7XGhhdHtcYmV0YX1fMX17XGhhdHtcc2lnbWF9X3tcaGF0e1xiZXRhXzF9fX0kJAoKYGBge3J9CnR2YWxfYmV0YTEgPSBiZXRhMS9zaWdtYV9iZXRhMQp0dmFsX2JldGExCnN1bW1hcnkobG9nTW9kZWwpJGNvZWZmaWNpZW50c1siZG9zaXMiLCAidCB2YWx1ZSJdCmBgYAoKRGUgcC13YWFyZGUgaXMgZGUga2FucyBvbSBlZW4gZXZlbiBleHRyZWVtIG9mIG5vZyBleHRyZW1lciByZXN1bHRhYXQgdGUgb2JzZXJ2ZXJlbiBvbmRlciBkZSBudWxoeXBvdGhlc2UgYWxzIG9ucyBnZXZldmVuIHJlc3VsdGFhdCBgciB0dmFsX2JldGExYC4gV2Ugd2V0ZW4gZGF0IGFscyBhYW4gYWwgb256ZSBhc3N1bXB0aWVzIHZvbGRhYW4gaXMsIGRlIHRlc3RzdGF0aXN0aWVrIG9uZGVyIGRlIG51bGh5cG90aGVzZSAoJFxiZXRhXzEgPSAwJCkgZWVuIHQtdmVyZGVsaW5nIHZvbGd0IG1ldCAiIyBvYnNlcnZhdGllcyAtIDIiID0gOTYgLSAyID0gOTQgdnJpamhlaWRzZ3JhZGVuLgoKRGUga2FucyBkYXQgZWVuIHQtdmVyZGVlbGRlIHZhcmlhYmVsZSBtZXQgOTQgdnJpamhlaWRzZ3JhZGVuIGtsZWluZXIgaXMgZGFuIGByIHR2YWxfYmV0YTFgIGlzIGdlbGlqayBhYW46CgpgYGB7cn0KcHQodHZhbF9iZXRhMSwgZGY9OTQsIGxvd2VyLnRhaWw9VFJVRSkKYGBgCgpBYW5nZXppZW4gd2UgdHdlZXppamRpZyB0ZXN0ZW4sIG1vZXRlbiB3ZSBoaWVyIG9vayBkZSBrYW5zIGJpaiBvcHRlbGxlbiBkYXQgb256ZSB0LXZlcmRlZWxkZSB2YXJpYWJlbGUgZ3JvdGVyIGlzIGRhbiBgciAtdHZhbF9iZXRhMWAuIERlemUga2FucyBpcyBnZWxpamsgYWFuOgoKYGBge3J9CnB0KC10dmFsX2JldGExLCBkZj05NCwgbG93ZXIudGFpbD1GQUxTRSkKYGBgCgpEZSBwLXdhYXJkZSBpcyBkdXMgZ2VsaWprIGFhbiBkZSBrYW5zIGRhdCBlZW4gdC12ZXJkZWVsZGUgdG9ldmFsc3ZlcmFuZGVybGlqa2UgZXh0cmVtZXIgKGQudy56LiBncm90ZXIgZGFuIDMuMzggb2Yga2xlaW5lciBkYW4gLTMuMzgpIGlzOgoKYGBge3J9CnB0KHR2YWxfYmV0YTEsIGRmPTk0LCBsb3dlci50YWlsPVRSVUUpK3B0KC10dmFsX2JldGExLCBkZj05NCwgbG93ZXIudGFpbD1GQUxTRSkKYGBgCgpBYW5nZXppZW4gZWVuIHQtdmVyZGVsaW5nIHN5bW1ldHJpc2NoIGlzLCBrYW4gZGUgcC13YWFyZGUgb29rIGdld29vbiBhbHMgdm9sZ3QgYmVyZWtlbmQgd29yZGVuOgoKYGBge3J9CnB2YWxfYmV0YTEgPSAyKnB0KC1hYnModHZhbF9iZXRhMSksIGRmPTk0LCBsb3dlci50YWlsPVRSVUUpICNNZXQgLWFicyh0dmFsX2JldGExKSBuZW1lbiB3ZSBkZSBhYnNvbHV0ZSB3YWFyZGUgZW4gbWFrZW4gZGUgdC13YWFyZGUgZGFuIG5lZ2F0aWVmLCB6b2RhdCBqZSBvbmFmaGFua2VsaWprIHZhbiBoZXQgdGVrZW4gdmFuIGRlIHQtd2FhcmRlIGFsdGlqZCBpbiBkZSBsaW5rZXJzdGFhcnQgdGVzdC4KcHZhbF9iZXRhMQpzdW1tYXJ5KGxvZ01vZGVsKSRjb2VmZmljaWVudHNbImRvc2lzIiwgIlByKD58dHwpIl0KYGBgCgoqKlZvb3IgaGV0IGludGVyY2VwdCoqCgpPcCBiYXNpcyB2YW4gaG9vZmRzdHVrIDUuMyB2YW4gZGUgY3Vyc3VzIHdldGVuIHdlIGRhdDoKCiRcaGF0e1xiZXRhfV8wID0gXGJhcnt5fSAtIFxoYXR7XGJldGF9XzEgXGJhcnt4fSQKClZvb3Igb25zIHZvb3JiZWVsZDoKCiRcaGF0e1xiZXRhfV8wID0gXG92ZXJsaW5le2xvZy5taW5zdXJ2fSAtIFxoYXR7XGJldGF9XzEgXG92ZXJsaW5le2Rvc2lzfSQKCmBgYHtyfQpiZXRhMCA9IG1lYW4obG9nLm1pbnN1cnYpLWJldGExKm1lYW4oZG9zaXMpCmJldGEwCnN1bW1hcnkobG9nTW9kZWwpJGNvZWZmaWNpZW50c1siKEludGVyY2VwdCkiLCJFc3RpbWF0ZSJdCmBgYAoKRGUgZ2VzY2hhdHRlIHN0YW5kYWFyZGZvdXQgb3AgaGV0IGludGVyY2VwdCBrdW5uZW4gd2UgYWxzIHZvbGd0IGJlcmVrZW5lbjoKCiQkXGhhdHtcc2lnbWF9X3tcaGF0e1xiZXRhXzB9fSA9IFxoYXR7XHNpZ21hfSpcc3FydHtcZnJhY3tcc3VtX3tpPTF9XntufSh4X2kpXjJ9e24qXHN1bV97aT0xfV57bn0oeF9pLVxiYXJ7eH0pXjJ9fSQkCgpgYGB7cn0Kc2lnbWFfYmV0YTAgPC0gc2lnbWEobG9nTW9kZWwpKnNxcnQoc3VtKGRvc2lzXjIpLyg5NipzdW0oKGRvc2lzLW1lYW4oZG9zaXMpKV4yKSkpCnNpZ21hX2JldGEwCnN1bW1hcnkobG9nTW9kZWwpJGNvZWZmaWNpZW50c1siKEludGVyY2VwdCkiLCJTdGQuIEVycm9yIl0KYGBgCgpPbnplIGdlc2NoYXR0ZSB0LXdhYXJkZSBpcyBvcG5pZXV3OgoKJCR0ID0gXGZyYWN7XGhhdHtcYmV0YX1fMH17XGhhdHtcc2lnbWF9X3tcaGF0e1xiZXRhXzB9fX0kJAoKYGBge3J9CnR2YWxfYmV0YTAgPC0gYmV0YTAvc2lnbWFfYmV0YTAKdHZhbF9iZXRhMApzdW1tYXJ5KGxvZ01vZGVsKSRjb2VmZmljaWVudHNbIihJbnRlcmNlcHQpIiwgInQgdmFsdWUiXQpgYGAKCk9uemUgcC13YWFyZGUgYmVyZWtlbmVuIHdlIG9wbmlldXcgYWxzIGRlIGthbnMgZGF0IGVlbiB0LXZlcmRlZWxkZSB2YXJpYWJlbGUgbWV0IDk0IHZyaWpoZWlkc2dyYWRlbiBub2cgZXh0cmVtZXIgaXMgZGFuIGByIHR2YWxfYmV0YTBgOgoKYGBge3J9CnB2YWxfYmV0YTAgPC0gMipwdCgtYWJzKHR2YWxfYmV0YTApLCBkZj05NCkKcHZhbF9iZXRhMApzdW1tYXJ5KGxvZ01vZGVsKSRjb2VmZmljaWVudHNbIihJbnRlcmNlcHQpIiwgIlByKD58dHwpIl0KYGBgCgo=