1 Introductie

1.1 Proefopzet (1)

  • Scope: De onderzoeker bepaalt de populatie naar waar ze de resultaten van de studie wensen te veralgemenen.
  • FinanciĆ«le and logistieke beperkingen \(\rightarrow\) representatieve steekproef van de populatie: Randomisatie!

1.2 Data analysis (2 & 3)

  • Data-Exploratie en Beschrijvende Statistiek (2):

    • exploreren,
    • visualiseren,
    • samenvatten,
    • inzicht verwerven in de data,
    • aannames nagaan
  • Statistische Besluitvorming (3) (statistical inference):

  • Veralgemeen wat we observeren in de steekproef naar de populatie zodat we algemene conclusies kunnen trekken over het proces die we bestuderen.

  • Gebruik van statistische modellen voor data analyse en om onzekerheid te kwantificeren en te rapporteren.


1.3 Voorbeeld

  • National Health and Nutrition Examination Survey (NHANES)
  • Americaanse demografische studie
  • Groot aantal van fysieke, demografische, nutritionele, gezondheids karakteristieken
ID Gender Height BMI_WHO DirectChol SexNumPartnLife
51624 male 164.7 30.0_plus 1.29 8
51625 male 105.4 12.0_18.5 NA NA
51630 female 168.4 30.0_plus 1.16 10
51638 male 133.1 12.0_18.5 1.34 NA
51646 male 130.6 18.5_to_24.9 1.55 NA
51647 female 166.7 25.0_to_29.9 2.12 20

2 Variabelen

  • We meten variabelen op subjecten in een steekproef
  • Een Variabele is een karateristiek b.v. Lengte, Direct cholesterol, Age, Gender, ā€¦
  • Het varieert van subject tot subject in de populatie en is dus ook in de steekproef en tussen steekproeven.

2.1 Types van variabelen

  1. Kwalitatieve variabelen: een beperkt aantal categorieƫn, niet numeriek.
    • nominale variabelen: geen natuurlijke ordening, v.b. Gender, blood group, ā€¦
    • ordinale variabelen: ordening, v.b. BMI class, smoking status (1: never smoked, 2: stopped smoking, 3: smoker)
  2. Numerieke variabelen:
    • discrete variabelen: tellingen v.b. number of partners in life span, ā€¦

    • continue variabelen: kunnen (in theorie) elke mogelijke waarde aannemen binnen bepaalde grenzen v.b. Age, Height, Weight, BMI, Direct Cholestorolā€¦

    • Soms dichotomiseren naar een nominale kwalitatieve variabele \(\rightarrow\) informatieverlies: BMI \(\rightarrow\) BMI class


3 Populatie

  • Doel van wetenschappelijke studie: uitspraken doen over de algemene populatie.

  • V.b. nagaan of de lengte tussen mannen en vrouwen gemiddeld verschillend is.

  • Populatie is een theoretisch concept

    • Is meestal continu in verandering
    • Vaak ook interesse in toekomstige subjecten \(\rightarrow\) dus op bepaald ogenblik niet volledig observeerbaar
    • kan als oneindig groot worden beschouwd
  • Populatie duidelijk omschrijven!

3.1 Populatie duidelijk omschrijven

Inclusiecriteria zijn karakteristieken die een subject/experimentele eenheid moet hebben om tot de populatie te behoren, b.v.

  • leeftijdscategorie 45-65
  • normaal BMI
  • ā€¦

Exclusiecriteria zijn karakteristieken die een subject/experimentele eenheid niet mag hebben om tot de populatie te behoren, b.v.

  • diabetes
  • historiek van hard drugs
  • lage gezondheidsstatus
  • slaapproblemen
  • ā€¦

4 Toevalsveranderlijken (toevallige veranderlijken)

  • Variabelen (vb Systolische bloeddruk) variĆ«ren in de populatie van subject tot subject!
  • Variabelen zijn dus random of veranderlijk aangezien hun waarde veranderlijk is in de populatie
  • Cruciale vraag: Hoe nauwkeurig zijn uitspraken over de populatie o.b.v. een groep gemeten subjecten in een steekproef!
  • We zullen dus steeds verschillen zien van steekproef tot steekproef
  • Spreiding op gegevens speelt cruciale rol

4.1 Conventie

  • Gebruik hoofdletters om aan te geven dat bestudeerde karakteristiek (vb. systolische bloeddruk) variabel is in de populatie zonder daarbij concreet over de gerealiseerde waarde voor een bepaald subject na te denken.
  • Variabele \(X\) wordt algemeen een toevalsveranderlijke genoemd: is formeel resultaat van een toevallige trekking van een bepaalde karakteristiek uit de studiepopulatie.
  • Een toevalsveranderlijke \(X\) kan men dus opvatten als onbekende veranderlijke die een meting voorstelt die we plannen te verzamelen bij een random subject, maar nog niet hebben verzameld.
  • Noodzakelijk om te kunnen redeneren hoe resultaten van steekproef tot steekproef kunnen wijzigen
  • Toevallig veranderlijken kunnen kwalitatief, kwantitatief, discreet, continu, ā€¦. zijn

5 Beschrijven van de populatie

  • Voor we een random variabele meten is het onmogelijk exact te voorspellen hoe hoog ze zal zijn.

  • Gerealiseerde waarde van \(X\) is onderhevig aan random variabiliteit

  • Als we weten hoe de variabele verdeeld is dan kunnen we probabiliteitstheorie gebruiken om de kans te berekenen dat een bepaald voorval (event) zich voordoet: vb wat is de kans dat het IQ van een random subject uit de populatie kleiner of gelijk is aan 80.

  • Notatie:

    • Event: \(X \leq 80\)
    • Probabiliteit op event: \(Pr(X \leq 80)\)

##Intermezzo probabiliteitstheorie

5.0.1 Discrete toevallig veranderlijken

  • Stel dat we een discrete random variabele meten \(X\)

  • Alle mogelijke waarden voor \(X\) worden de steekproefruimte \(\Omega\) genoemd.

    • Voor Gender is de steekproefruimte \(\Omega=(0,1)\) met 0 (vrouw) or 1 (man).
    • Voor het werpen van een dobbelsteen is de steekproefruimte \(\Omega=(1,2,3,4,5,6)\).
  • Een event \(A\) is een subset van de steekproefruimte

    - Een even getal werpen met een dobbelsteen: $A=(2,4,6)$.
    - Kan ook een specifieke waarde zijn $A=(1)$.
  • Event ruimte \(\mathcal{A}\) is de klasse van alle mogelijke events die kunnen optreden bij een bepaald experiment.

  • Twee events (\(A_1\) en \(A_2\)) zijn multueel exclusief als ze niet samen op kunnen treden.

    • v.b. event van de oneven getallen \(A_1=(1,3,5)\) en het event om \(A_2=(6)\) te gooien.
    • Dus \(A_1 \bigcap A_2=\emptyset\).
  • Probabiliteit \(Pr(A)\) is een function \(Pr: A \rightarrow [0,1]\) die voldoet aan

    1. \(Pr(A) \geq 0\) en \(Pr(A) \leq 1\) voor elke \(A \in \mathcal{A}\)
    2. \(Pr(\Omega)=1\)
    3. Voor multueel exclusieve events \(A_1, A_2, \ldots A_k\) geldt dat \(Pr(A_1 \cup A_2 \ldots \cup A_k)= Pr(A_1) + \ldots + Pr(A_k)\)
  • Dobbelsteen voorbeeld

    • oneven number \(A=(1,3,5)\): is de unie van 3 multueel exclusieve events \(A_1=1\), \(A_2=3\) en \(A_3=5\) zodat \(Pr(A)=Pr(1)+Pr(3)+Pr(5)=1/6+1/6+1/6=0.5\)
    • \(\Omega=(1,2,3,4,5,6)\): \(Pr(\Omega)=1\)
  • Als we twee subjecten (j en k) onafhankelijk trekken van de populatie dan is de gezamelijke probabiliteit \(P(X_j,X_k)= P(X_j)P(X_j)\)


5.0.1.1 Distributie of verdeling

  • De distributie of de verdeling van een discrete toevallig veranderlijke \(X\) beschrijft de kans op elke mogelijke waarde van de steekproefruimte.

  • Voorbeeld: Gender is een binaire variabele (0: vrouw, 1: man) en binaire variabelen volgen een Bernoulli verdeling. 50.8% van de subjecten in de Amerikaanse populatie zijn vrouw en 49.2% is man.

  • Laat \(\pi\) de probabiliteit zijn op een man \(\pi=0.492\). \[ X\sim \left \{ \begin{array}{lcl} P(X=0) &=& 1-\pi\\ P(X=1) &=& \pi \end{array} \right . \]

    tibble(X=c(0,1),prob=c(0.508,0.492)) %>%
      ggplot(aes(x=X,xend=X,y=0,yend=prob)) +
      geom_segment() +
      ylab("Probability")

Toevallig veranderlijke \(X\) volgt een Bernoulli verdeling \(B(\pi)\) met parameter \(\pi=0.492\), \[B(\pi)= \pi^x(1-\pi)^{(1-x)}\]


5.0.1.2 Cumulative distributie functie

  • De cumulative distributie functie F(x) geeft de probabiliteit weer om een random variable X te observeren waarvoor geldt dat \(X\leq x\): \[ F(x) = \sum\limits_{\forall X\leq x} P(x)\]

  • Gender voorbeeld \(F(0)=1-\pi\) and F(1)= P(X=0) + P(X=1)=1

    tibble(X=c(0,1),cumprob=c(0.508,1)) %>%
      ggplot(aes(x=X,xend=X,y=0,yend=cumprob)) +
      geom_segment() +
      ylab("F(x)")

  • Dobbelsteen:

    tibble(X=1:6,cumprob=cumsum(rep(1/6,6))) %>%
      ggplot(aes(x=X,xend=X,y=rep(0,6),yend=cumprob)) +
      geom_segment() +
      ylab("F(x)")


5.0.1.3 Gemiddelde

Het gemiddelde of de verwachte waarde \(E[X]\) van een discrete toevallig veranderlijke \(X\) is gegeven door:

\[E[X]=\sum\limits_{x\in\Omega} x P(X=x)\]

  • Gender voorbeeld

    • \(E[X]= 0 \times (1-\pi) + 1 \times (\pi) = \pi\)
    • The mean equals \(E[X]=0.492\).
  • Dobbelsteen:

\(E[X]= 1 \times \frac{1}{6} + 2 \times \frac{1}{6} + \ldots + 6 \times \frac{1}{6} =\) 3.5


5.0.1.4 Variantie

De variantie is een maat voor de variabiliteit van een toevallig veranderlijke en wordt gegeven door:

\[E[(X-E[X])^2]=\sum\limits_{x\in\Omega} (x-E[X])^2 P(X=x)\]

  • Gender voorbeeld \[\begin{eqnarray} E[(X-E[X])^2]&=&(0-\pi)^2\times (1-\pi)+(1-\pi)^2 \times \pi\\ &=& \pi^2 (1-\pi) + (1-\pi)^2 \pi\\ &=&\pi (1-\pi)(\pi+1-\pi)\\ &=&\pi(1-\pi) \end{eqnarray}\]

5.0.2 Continue toevallig veranderlijke

  • Een continue toevallig veranderlijke kan binnen bepaalde grenzen alle mogelijke waarden aannemen.

  • De kans om exact Ć©Ć©n bepaalde waarde aan te nemen is daarom gelijk aan 0.

  • De distributie (verdeling) wordt daarom weergegeven a.d.h.v. de densiteitsfunctie of de dichtheidsfunctie \(f(x)\)

  • Veel biologische karakteristieken zijn approximatief normaal verdeeld (lengte, bloeddruk, IQ, concentratie metingen na logaritmische transformatie) \[f(x) = \frac{1}{\sqrt{2\pi\sigma^2}} e^{-\frac{(x-\mu)^2}{2\sigma^2}}\]

  • Dat wordt kort genoteerd als \(f(x) = N(\mu,\sigma^2)\)

  • Van het IQ is geweten dat het normale verdeling volgt met gemiddelde \(\mu=100\) en standaardafwijking \(\sigma=15\).
    \[IQ \sim N(100,15^2)\]

  • In R kunnen we de dnorm functie gebruiken om de densiteit te berekenen voor een bepaalde waarde X=x.

  • De argumenten van dnorm zijn mean (\(\mu\)) en sd (standaardafwijking \(\sigma\)).

iq <- tibble(
  IQ = seq(40,150,.1),
  Densiteit = dnorm(seq(40,150,.1),mean=100,sd=15)
  )
iq %>%
  ggplot(aes(x=IQ,y=Densiteit)) +
  geom_line()

  • Binnen bepaalde grenzen kunnen continue toevallig veranderlijken alle mogelijke waarden aannemen dus is \(\Omega\) oneindig groot.

####Cumulatieve distributie

  • Opnieuw is de cumulatieve distributie \(F(X)=Pr(X\leq x)\).

  • Omdat X continu is berekenen we deze probabiliteit a.d.h.v. een integraal \[F(x)=\int \limits_{-\infty}^x f(x) dx\]

  • Merk op dat \(f(x)=0\) als x niet tot de steekproefruimte behoord.

  • We kunnen \(F(x)\) berekenen voor een normaal verdeelde toevallig veranderlijke met de functie pnorm die opnieuw argumenten mean en sd heeft.

iq %>%
  mutate(Probability=pnorm(IQ,mean=100,sd=15)) %>%
  ggplot(aes(x=IQ,y=Probability)) +
  geom_line()

De probabiliteit dat het IQ van een random subject lager is dan 80 wordt in R berekend door

pnorm(80,mean=100,sd=15)
[1] 0.09121122

  • Voor de grootst mogelijke waarde voor \(X\) integreren we over de volledige steekproefruimte \(\Omega\) dus \[\int \limits_{x \in \Omega} f(x) dx=1\]

  • De oppervlakte onder de dichtheidsfunctie is dus 1!


5.0.2.1 Gemiddelde en variantie

  • Het gemiddelde of de verwachte waarde is

\[\int \limits_{x \in \Omega} x f(x) dx\]

  • Voor de normale distributie \[\int \limits_{-\infty}^{+\infty} x f(x) dx = \mu\]

  • De variance \(E[(X-E[X])^2]\)

\[\int \limits_{x \in \Omega} (x-E[X])^2 f(x) dx\]

  • Voor de normale distributie bekomen we

\[\int \limits_{-\infty}^{+\infty} (x-\mu)^2 f(x) dx = \sigma^2\]

  • Het is vaak moeilijk om de variantie te interpreteren gezien ze niet in de zelfde eenheden staat als het gemiddelde. Daarom werken we vaak met de standaardafwijking:

\[SD=\sqrt{E[(X-E[X])^2]}\]

DE SD voor de normale distributie, \(\sigma\) heeft de mooie interpretatie dat ongeveer 68% van de populatie een waarde heeft voor de karakteristiek X binnen het interval van 1 standaardafwijking(\(\sigma\)) rond het gemiddelde:

\[P(\mu-\sigma < X < \mu + \sigma) \approx 0.68\]

  • Voor normaal verdeelde toevallig veranderlijken heeft ongeveer 95% van de subjecten in de populatie een waarde die binnen twee standaardafwijkingen (\(2 \sigma\)) ligt van het gemiddelde.

\[P[\mu - 2 \sigma < X < \mu + 2 \sigma]\approx 0.95\]


5.1 Standardisatie

  • Normale data worden vaak gestandardiseerd.

\[z=\frac{x-\mu}{\sigma}\]

  • Na standardisatie volgen de data een standaard normaal verdeling met gemiddelde \(\mu=0\) en variantie \(\sigma^2=1\): \[z \sim N(0,1)\]

We kunnen de qnorm functie gebruiken om kwantielen \(z_{2.5\%}\) en \(z_{97.5\%}\) die respectievelijk corresponderen met \(F(z_{2.5\%})=0.025\) en \(F(z_{97.5\%})=0.975\).

qnorm(0.025)
[1] -1.959964
qnorm(0.975)
[1] 1.959964

Voor een standaard normaal verdeelde toevallig veranderlijke valt inderdaad ongeveer \(0.975 - 0.025=0.95\) van de waarden binnen het interval [-2,2], of binnen 2 standaardafwijkingen (\(\sigma=1\)) van het gemiddelde (\(\mu=0\)).


6 Steekproef

  • In echte studies kennen we de distributie van een random veranderlijke in de populatie niet!

  • Omwille van financiĆ«le en logsitieke beperkingen kunen we bijna nooit de volledige populatie bestuderen.

  • De populatie parameters (v.b. gemiddeld IQ, variantie van IQ) kunnen daardoor niet zonder onzekerheid worden bepaald.

  • We kunnen enkel een kleine subset van de populatie bestuderen: de steekproef (engels: sample)

  • Trek observaties volgens een gestructureerd design: trek de subjecten volledig at random uit de populatie zodat elk subject een gelijke kans heeft om in de steekproef te worden opgenomen \(\rightarrow\) Representatieve steekproef.

  • Steekproef \(x_1, x_2, . . . , x_{n}\) kan als \(n\) realisatie van dezelfde toevallig veranderlijke \(X\) worden beschouwd voor subjecten \(i = 1,2,...,n\).

  • De distributie in de populatie is ongekend en moet worden geschat op basis van de steekproef.

  • Als we aannemen dat de gegevens een bepaalde distributie volgen (b.v. de normale verdeling \(N(\mu,\sigma^2)\)) dan moeten we enkel de populatie parameters (\(\mu\) en \(\sigma^2\)) schatten op basis van de steekproef.

  • We noemen dit schattingen (engels: estimates) en noteren ze als volgt: \(\hat \mu\) en \(\hat \sigma^2\).


6.1 NHANES voorbeeld

  • Gender in the population

  • Selecteer \(n=10000\) subjecten at random van de Amerikaanse populatie.

  • Eens de steekproef is getrokken hebben we \(n\) realisaties geobserveerd voor de toevallig veranderlijke \(X\).

  • Conventie: Geobserveerde waarden worden met een kleine letter aangeduid \(x\).

  • \(x\) is een welbepaalde waarde die werd gemeten/geobserveerd in een uitgevoerd experiment en is niet langer een ongekende variabele.

6.2 Samenvatting

  • Voor we het experiment uitvoeren is de populatie karakteristiek voor de proefpersonen \(1,\ldots,n\) die we uit de populatie zullen trekken ongekend en zijn dat toevallig veranderlijken: \(X_1, \ldots, X_n\)
  • Dit is noodzakelijk om te kunnen redeneren over hoe de resultaten van steekproef tot steekproef kunnen wijzigen
  • In een steekproef observeren we gerealiseerde uitkomsten \(x_1, x_2, \dots, x_n\): v.b. gender of lengte van subjecten in de steekproef.

7 Gender Example

library(NHANES)
NHANES %>% ggplot(aes(x=Gender)) + geom_bar()

  • Gender is een binaire variabele.
  • Het volgt een Bernoulli distibutie.
  • De Bernoulli distributie heeft een parameter: het gemiddelde \(\pi\).
  • We kunnen \(\pi\) schatten op basis van de steekproef door het steekproefgemiddelde te berekenen \(\bar x = \sum\limits_{i=1}^n x_i\)
  • Merk op dat het steekproefgemiddelde zelf een toevallig veranderlijke is! Het wijzigt ook van steekproef tot steekproef!
NHANES %>%
  count(Gender) %>%
  mutate(probability = n/sum(n))
# A tibble: 2 x 3
  Gender     n probability
  <fct>  <int>       <dbl>
1 female  5020       0.502
2 male    4980       0.498

8 Lengte

8.1 Empirische distributie

  • We kunnen de distributie van de lengte voor volwassen vrouwen schatten aan de hand van het histogram.
NHANES %>%
  filter(Gender=="female"&!is.na(Height)&Age>18) %>%
  ggplot(aes(x=Height)) +
  geom_histogram()

  • We kunnen de cumulative distributie functie schatten door gebruik te maken van de empirische cumulatieve distributie functie.
    • Elke observatie werd Ć©Ć©n keer geobserveerd in het staal.
    • Dus empirische cumulatieve distributie functie van het staal is een discrete distributie met probabiliteit 1/n op elke observatie.
    • De empirische cumulatieve distributie functie (ECDF) is gegeven door \[ECDF(x) = \sum\limits_{x_i \leq x} \frac{1}{n} = \frac{\# (x_i \leq x)}{n}\]
NHANES %>%
  filter(Gender=="female"&!is.na(Height)&Age>18) %>%
  ggplot(aes(x=Height)) +
  stat_ecdf()

We kunnen de empische cumulatieve distributie functie gebruiken om kansen te berekenen. Wat is de kans dat een vrouw kleiner is dan 150 cm.

ecdfFem <- NHANES %>%
  filter(Gender=="female"&!is.na(Height)&Age>18) %>%
  pull("Height") %>%
  ecdf
ecdfFem(150)
[1] 0.05222073
- We illustreren dit ook voor een steekproef van grootte 10
set.seed(502)
fem10<- NHANES %>%
  filter(Gender=="female"&!is.na(Height)&Age>18) %>%
  sample_n(size=10)

fem10 %>%
  ggplot(aes(x=Height)) +
  stat_ecdf()

ecdfFem10 <- fem10 %>%
  pull(Height) %>%
  ecdf
ecdfFem10(150)
[1] 0
  • Merk op dat die kans niet goed wordt geschat o.b.v. de steekproef.

  • Merk ook op dat we die kans ook hadden kunnen schatten door te berekenen hoeveel lengtemetingen er lager zijn dan 150.

NHANES %>%
  filter(Gender=="female"&!is.na(Height)&Age>18) %>% count(Height <=150) %>%
  mutate(prob=n/sum(n))
# A tibble: 2 x 3
  `Height <= 150`     n   prob
  <lgl>           <int>  <dbl>
1 FALSE            3521 0.948 
2 TRUE              194 0.0522
ecdfFem(150)
[1] 0.05222073
fem10 %>%
  count(Height <=150) %>%
  mutate(prob=n/sum(n))
# A tibble: 1 x 3
  `Height <= 150`     n  prob
  <lgl>           <int> <dbl>
1 FALSE              10     1
ecdfFem10(150)
[1] 0

8.2 Normale benadering

  • In de introductie zagen we dat de lengte metingen een mooie klokvorm hadden.

  • We kunnen dus aannemen dat de metingen approximatief normaal verdeeld zijn.

  • We kunnen de verdeling van de lengte metingen ook benaderen d.m.v. een normale distribution.

  • We moeten hiervoor enkel twee parameters schatten:

    • gemiddelde via steekproefgemiddelde (\(\hat\mu=\bar x\))
    • variantie via steekproefvariantie (\(\hat{\sigma}^2= s^2\)) of de standaardafwijking d.m.v. steekproef standaarddeviatie (\(\hat\sigma=s\)).
HeightSum <- NHANES %>%
  filter(Gender=="female"&!is.na(Height)&Age>18) %>%
  summarize(mean=mean(Height),sd=sd(Height))
HeightSum
# A tibble: 1 x 2
   mean    sd
  <dbl> <dbl>
1  162.  7.27

We zien dat de benadering goed werkt:

NHANES %>%
  filter(Gender=="female"&!is.na(Height)&Age>18) %>%
  ggplot(aes(x=Height)) +
  geom_histogram(aes(y=..density.., fill=..count..)) +
  xlab("Lengte (cm)") +
  stat_function(
    fun=dnorm,
    color="red",
    args=list(
      mean=HeightSum$mean[1],
      sd=HeightSum$sd[1]
      )
    )

  • We doen nu hetzelfde op basis van de steekproef met de 10 vrouwen.
HeightSum10 <- fem10 %>%
  summarize(mean=mean(Height),sd=sd(Height))

HeightSum10
# A tibble: 1 x 2
   mean    sd
  <dbl> <dbl>
1  163.  8.19
fem10 %>%
  ggplot(aes(x=Height)) +
  geom_histogram(aes(y=..density.., fill=..count..),bins=10) +
  xlab("Lengte (cm)") +
  stat_function(
    fun=dnorm,
    color="red",
    args=list(
      mean=HeightSum10$mean[1],
      sd=HeightSum10$sd[1]
      )
    ) +
  xlim(130,190)

  • We kunnen de normale benadering nu ook gebruiken om de kans te berekenen dat een vrouw kleiner is dan 150 cm: Pr(X <= 150).

  • We doen dit op basis van de volledige steekproef en vergelijken dit uit wat we bekomen met de ECDF.

pnorm(150,HeightSum$mean[1],HeightSum$sd[1])
[1] 0.0484516
ecdfFem(150)
[1] 0.05222073
  • Op basis van de kleine steekproef:
pnorm(150,HeightSum10$mean[1],HeightSum10$sd[1])
[1] 0.05346615
ecdfFem10(150)
[1] 0
  • Voor kleine steekproef is geschatte kans o.b.v. empirische distributie veel minder nauwkeurig.

  • Kwantielen geschat o.b.v. kleine steekproef zijn immers vrij onzeker. Ze gebruiken immers maar een fractie van de data.

  • De schatting o.b.v. de normale verdeling laat toe om alle data te gebruiken voor het schatten van de model parameters.


8.3 Referentie intervallen

  • Normale waarden voor de lengte kunnen worden bekomen door gebruik te maken van een referentie interval.

  • Typisch wordt een 95% referentie interval gebruikt zodat we voor 95% van de subjecten in de populatie verwachten dat ze een karakteristiek hebben die in het referentie interval ligt.

  • We kunnen dat opnieuw op basis van de empirische distributie.

  • We moeten hiervoor \(\hat{F}(x_{2.5\%})=0.025\) en \(\hat{F}(x_{97.5\%})=0.975\) berekenen zodat 95% van de observaties in de steekproef vallen in het interval [x_{2.5%},x_{97.5%}].

  • Dat kan met de quantile functie.

  • Grote steekproef

NHANES %>%
  filter(Gender=="female"&!is.na(Height)&Age>18) %>%
  pull(Height) %>%
  quantile(prob=c(0.025,0.975))
 2.5% 97.5% 
147.6 176.7 
  • Op basis van de grote steekproef schatten we dat 95% van de vrouwen in de populatie een lengte heeft die ligt in het interval [147.6, 176.7].

  • Kleine steekproef

fem10 %>%
  pull(Height) %>%
  quantile(prob=c(0.025,0.975))
    2.5%    97.5% 
154.7250 178.3275 
  • Dit interval o.b.v. de kleine steekproef is een ruwe benadering.
  • We hebben immers niet voldoende observaties om een goede benadering te hebben voor extreme quantielen.

8.3.1 Normale benadering

  • We kunnen de functie qnorm gebruiken om quantielen te berekenen van de normale distributie.

  • We weten dat een 95% referentie interval ongeveer binnen twee standaard deviaties rond het gemiddelde ligt.

  • Grote steekproef

qnorm(0.025,mean=HeightSum$mean,sd=HeightSum$sd)
[1] 147.8192
HeightSum$mean - 2 * HeightSum$sd
[1] 147.528
qnorm(0.975,mean=HeightSum$mean,sd=HeightSum$sd)
[1] 176.3237
HeightSum$mean + 2 * HeightSum$sd
[1] 176.6149
  • Kleine steekproef
qnorm(0.025,mean=HeightSum10$mean,sd=HeightSum10$sd)
[1] 147.1499
qnorm(0.975,mean=HeightSum10$mean,sd=HeightSum10$sd)
[1] 179.2701

8.4 Conclusions

  • Voor de grote steekproef geven de empirische distributie en de normale benadering vergelijkbare resultaten.

  • Voor de kleine steekproef werkt de normale benadering beter dan de empirische distributie.

    • We kijken immers naar extreme quantielen 2.5% en 97.5%.
    • Er zijn inderdaad weinig gegevens in de steekproef die toelaten om deze quantielen direct te schatten.
    • Met de normale benadering kunnen we alle data gebruiken om het gemiddelde en de standaarddeviatie te schatten.
    • Als de aanname van normaliteit geldt dan krijgen we betere schattingen voor deze kwantielen.

9 Statistieken

  • Formule die we gebruiken om parameters van de distributie in de populatie te schatten op basis van een steekproef. We refereren hiernaar als statistieken of schatters.

  • Het numerieke resultaat die wordt bekomen door deze formules te evalueren worden ook statistieken of schattingen genoemd.

  • Onderzoekers wensen ongekende parameters van de distributie in de populatie te kennen en schatten deze o.b.v. de steekproef.

  • Omdat we statistieken berekenen o.b.v. de observaties in een steekproef, variĆ«ren statistieken ook van steekproef tot steekproef. Het zijn dus ook random variabelen en we noteren ze dus ook met hoofdletters (b.v. \(\bar X\) voor het steekproefgemiddelde en \(S^2\) voor de steekproefvariantie).

  • Als we data analyseren moeten we dus nadenken over hoe de statistieken variĆ«ren van steekproef tot steekproef.

  • Als een statistiek verwijst naar een numerieke waarde die werd gerealiseerd in een bepaalde steekproef dan noteren we deze met een kleine letter: \(\bar x\) en \(s^2\).


10 Conventie

  • Populatieparameters nemen vaste waarden aan maar zijn meestal ongekend \(\rightarrow\) Griekse symbolen.

  • Statistieken waarmee we deze ongekende parameters schatten o.b.v. een steekproef \(\rightarrow\) letters.

  • Vb Normale verdeling

Populatie Steekproef
\(\mu\) \(\bar X\)
\(\sigma^2\) \(S^2\)

LS0tCnRpdGxlOiAiMi4gQ29uY2VwdGVuIgphdXRob3I6ICJMaWV2ZW4gQ2xlbWVudCIKZGF0ZTogInN0YXRPbWljcywgR2hlbnQgVW5pdmVyc2l0eSAoaHR0cHM6Ly9zdGF0b21pY3MuZ2l0aHViLmlvKSIKb3V0cHV0OgogICAgaHRtbF9kb2N1bWVudDoKICAgICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgICB0aGVtZTogY29zbW8KICAgICAgdG9jOiB0cnVlCiAgICAgIHRvY19mbG9hdDogdHJ1ZQogICAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQotLS0KCiMgSW50cm9kdWN0aWUKYGBge3IgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGluY2x1ZGUgPSBUUlVFLCBjb21tZW50ID0gTkEsIGVjaG8gPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KE5IQU5FUykKYGBgCgpgYGB7ciBwb3AyU2FtcDJQb3AsIG91dC53aWR0aD0nODAlJyxmaWcuYXNwPS44LCBmaWcuYWxpZ249J2NlbnRlcicsZWNobz1GQUxTRX0KaWYgKCJwaSIlaW4lbHMoKSkgcm0oInBpIikKa29wdm9ldGVyPC1mdW5jdGlvbih4LHksYW5nbGU9MCxsPS4yLGNleC5kb3Q9LjUscGNoPTE5LGNvbD0iYmxhY2siKQp7CmFuZ2xlPWFuZ2xlLzE4MCpwaQpwb2ludHMoeCx5LGNleD1jZXguZG90LHBjaD1wY2gsY29sPWNvbCkKbGluZXMoYyh4LHgrbCpjb3MoLXBpLzIrYW5nbGUpKSxjKHkseStsKnNpbigtcGkvMithbmdsZSkpLGNvbD1jb2wpCmxpbmVzKGMoeCtsLzIqY29zKC1waS8yK2FuZ2xlKSx4K2wvMipjb3MoLXBpLzIrYW5nbGUpK2wvNCpjb3MoYW5nbGUpKSxjKHkrbC8yKnNpbigtcGkvMithbmdsZSkseStsLzIqc2luKC1waS8yK2FuZ2xlKStsLzQqc2luKGFuZ2xlKSksY29sPWNvbCkKbGluZXMoYyh4K2wvMipjb3MoLXBpLzIrYW5nbGUpLHgrbC8yKmNvcygtcGkvMithbmdsZSkrbC80KmNvcyhwaSthbmdsZSkpLGMoeStsLzIqc2luKC1waS8yK2FuZ2xlKSx5K2wvMipzaW4oLXBpLzIrYW5nbGUpK2wvNCpzaW4ocGkrYW5nbGUpKSxjb2w9Y29sKQpsaW5lcyhjKHgrbCpjb3MoLXBpLzIrYW5nbGUpLHgrbCpjb3MoLXBpLzIrYW5nbGUpK2wvMipjb3MoLXBpLzIrcGkvNCthbmdsZSkpLGMoeStsKnNpbigtcGkvMithbmdsZSkseStsKnNpbigtcGkvMithbmdsZSkrbC8yKnNpbigtcGkvMitwaS80K2FuZ2xlKSksY29sPWNvbCkKbGluZXMoYyh4K2wqY29zKC1waS8yK2FuZ2xlKSx4K2wqY29zKC1waS8yK2FuZ2xlKStsLzIqY29zKC1waS8yLXBpLzQrYW5nbGUpKSxjKHkrbCpzaW4oLXBpLzIrYW5nbGUpLHkrbCpzaW4oLXBpLzIrYW5nbGUpK2wvMipzaW4oLXBpLzItcGkvNCthbmdsZSkpLGNvbD1jb2wpCn0KCnBhcihtYXI9YygwLDAsMCwwKSxtYWk9YygwLDAsMCwwKSkKcGxvdCgwLDAseGxhYj0iIix5bGFiPSIiLHhsaW09YygwLDEwKSx5bGltPWMoMCwxMCksY29sPTAseGF4dD0ibm9uZSIseWF4dD0ibm9uZSIsYXhlcz1GQUxTRSkKcmVjdCgwLDYsMTAsMTAsYm9yZGVyPSJyZWQiLGx3ZD0yKQp0ZXh0KC41LDgsInBvcHVsYXRpb24iLHNydD05MCxjb2w9InJlZCIsY2V4PTIpCnN5bWJvbHMgKDMsIDgsIGNpcmNsZXM9MS41LCBjb2w9InJlZCIsYWRkPVRSVUUsZmc9InJlZCIsaW5jaGVzPUZBTFNFLGx3ZD0yKQpzZXQuc2VlZCgzMzApCmdyaWQ9c2VxKDAsMS4zLC4wMSkKCmZvciAoaSBpbiAxOjUwKQp7CglhbmdsZTE9cnVuaWYobj0xLG1pbj0wLG1heD0zNjApCglhbmdsZTI9cnVuaWYobj0xLG1pbj0wLG1heD0zNjApCglyYWRpdXM9c2FtcGxlKGdyaWQscHJvYj1ncmlkXjIqcGkvc3VtKGdyaWReMipwaSksc2l6ZT0xKQoJa29wdm9ldGVyKDMrcmFkaXVzKmNvcyhhbmdsZTEvMTgwKnBpKSw4K3JhZGl1cypzaW4oYW5nbGUxLzE4MCpwaSksYW5nbGU9YW5nbGUyKQp9CnRleHQoNy41LDgsIkxlbmd0ZSBpbiBwb3B1bGF0aWUiLGNvbD0icmVkIixjZXg9MS4yKQoKcmVjdCgwLDAsMTAsNCxib3JkZXI9ImJsdWUiLGx3ZD0yKQp0ZXh0KC41LDIsInNhbXBsZSIsc3J0PTkwLGNvbD0iYmx1ZSIsY2V4PTIpCnN5bWJvbHMgKDMsIDIsIGNpcmNsZXM9MS41LCBjb2w9InJlZCIsYWRkPVRSVUUsZmc9ImJsdWUiLGluY2hlcz1GQUxTRSxsd2Q9MikKZm9yIChpIGluIDA6MikKCWZvciAoaiBpbiAwOjQpCnsKCglrb3B2b2V0ZXIoMi4xK2oqKDMuOS0yLjEpLzQsMS4xK2kpCn0KdGV4dCg3LjUsMiwiTGVuZ3RlIGluIHN0ZWVrcHJvZWYiLGNvbD0iYmx1ZSIsY2V4PTEuMikKCmFycm93cygzLDUuOSwzLDQuMSxjb2w9ImJsYWNrIixsd2Q9MykKYXJyb3dzKDcsNC4xLDcsNS45LGNvbD0iYmxhY2siLGx3ZD0zKQp0ZXh0KDEuNSw1LCJFWFAuIERFU0lHTiAoMSkiLGNvbD0iYmxhY2siLGNleD0xLjIpCnRleHQoOC41LDUsIlNDSEFUVElORyAmXG5JTkZFUkVOVElFICgzKSIsY29sPSJibGFjayIsY2V4PTEuMikKdGV4dCg3LjUsLjUsIkRBVEEgRVhQTE9SQVRJRSAmXG5CRVNDSFJJSlZFTkRFIFNUQVRJU1RJRUsgKDIpIixjb2w9ImJsYWNrIixjZXg9MS4yKQpgYGAKCgojIyBQcm9lZm9wemV0ICgxKQogICAtIFNjb3BlOiBEZSBvbmRlcnpvZWtlciBiZXBhYWx0IGRlICoqcG9wdWxhdGllKiogbmFhciB3YWFyIHplIGRlIHJlc3VsdGF0ZW4gdmFuIGRlIHN0dWRpZSB3ZW5zZW4gdGUgdmVyYWxnZW1lbmVuLgogICAtIEZpbmFuY2nDq2xlIGFuZCBsb2dpc3RpZWtlIGJlcGVya2luZ2VuICRccmlnaHRhcnJvdyQgKipyZXByZXNlbnRhdGlldmUgc3RlZWtwcm9lZioqIHZhbiBkZSBwb3B1bGF0aWU6IFJhbmRvbWlzYXRpZSEKCiMjIERhdGEgYW5hbHlzaXMgKDIgJiAzKQogICAtICoqRGF0YS1FeHBsb3JhdGllIGVuIEJlc2NocmlqdmVuZGUgU3RhdGlzdGllayAoMikqKjoKCiAgICAgIC0gZXhwbG9yZXJlbiwKICAgICAgLSB2aXN1YWxpc2VyZW4sCiAgICAgIC0gc2FtZW52YXR0ZW4sCiAgICAgIC0gaW56aWNodCB2ZXJ3ZXJ2ZW4gaW4gZGUgZGF0YSwKICAgICAgLSBhYW5uYW1lcyBuYWdhYW4KCiAgIC0gKipTdGF0aXN0aXNjaGUgQmVzbHVpdHZvcm1pbmcgKDMpKiogKHN0YXRpc3RpY2FsIGluZmVyZW5jZSk6CiAgIC0gVmVyYWxnZW1lZW4gd2F0IHdlIG9ic2VydmVyZW4gaW4gZGUgc3RlZWtwcm9lZiBuYWFyIGRlIHBvcHVsYXRpZSB6b2RhdCB3ZSBhbGdlbWVuZSBjb25jbHVzaWVzIGt1bm5lbiB0cmVra2VuIG92ZXIgaGV0IHByb2NlcyBkaWUgd2UgYmVzdHVkZXJlbi4gIAogICAtIEdlYnJ1aWsgdmFuIHN0YXRpc3Rpc2NoZSBtb2RlbGxlbiB2b29yIGRhdGEgYW5hbHlzZSBlbiBvbSBvbnpla2VyaGVpZCB0ZSBrd2FudGlmaWNlcmVuIGVuIHRlIHJhcHBvcnRlcmVuLgoKCi0tLQoKIyMgVm9vcmJlZWxkCgotIE5hdGlvbmFsIEhlYWx0aCBhbmQgTnV0cml0aW9uIEV4YW1pbmF0aW9uIFN1cnZleSAoTkhBTkVTKQotIEFtZXJpY2FhbnNlIGRlbW9ncmFmaXNjaGUgc3R1ZGllCi0gR3Jvb3QgYWFudGFsIHZhbiBmeXNpZWtlLCBkZW1vZ3JhZmlzY2hlLCBudXRyaXRpb25lbGUsIGdlem9uZGhlaWRzIGthcmFrdGVyaXN0aWVrZW4gIAoKYGBge3IgbmhhbmVzLCB0aWR5PUZBTFNFLGVjaG89RkFMU0V9CmxpYnJhcnkoTkhBTkVTKQprbml0cjo6a2FibGUoTkhBTkVTW2MoMSw0LDUsNiw3LDgpLGMoMSwzLDIwLDIzLDM0LDcyKV0sICAgICAKICAgIGZvcm1hdCA9ICJtYXJrZG93biIpCmBgYAoKLS0tCgojIFZhcmlhYmVsZW4KCi0gV2UgbWV0ZW4gKnZhcmlhYmVsZW4qIG9wIHN1YmplY3RlbiBpbiBlZW4gc3RlZWtwcm9lZgotIEVlbiBWYXJpYWJlbGUgaXMgZWVuIGthcmF0ZXJpc3RpZWsgYi52LiBMZW5ndGUsIERpcmVjdCBjaG9sZXN0ZXJvbCwgQWdlLCBHZW5kZXIsIC4uLgotIEhldCB2YXJpZWVydCB2YW4gc3ViamVjdCB0b3Qgc3ViamVjdCBpbiBkZSBwb3B1bGF0aWUgZW4gaXMgZHVzIG9vayBpbiBkZSBzdGVla3Byb2VmIGVuIHR1c3NlbiBzdGVla3Byb2V2ZW4uCgoKIyMgKlR5cGVzKiB2YW4gdmFyaWFiZWxlbgoKMS4gKkt3YWxpdGF0aWV2ZSB2YXJpYWJlbGVuKjogZWVuIGJlcGVya3QgYWFudGFsIGNhdGVnb3JpZcOrbiwgbmlldCBudW1lcmllay4KCS0gICpub21pbmFsZSB2YXJpYWJlbGVuKjogZ2VlbiBuYXR1dXJsaWprZSBvcmRlbmluZywgdi5iLiAgR2VuZGVyLCBibG9vZCBncm91cCwgLi4uCgktICAqb3JkaW5hbGUgdmFyaWFiZWxlbio6IG9yZGVuaW5nLCB2LmIuIEJNSSBjbGFzcywgc21va2luZyBzdGF0dXMgKDE6IG5ldmVyIHNtb2tlZCwgMjogc3RvcHBlZCBzbW9raW5nLCAzOiBzbW9rZXIpCgoyLiAqTnVtZXJpZWtlIHZhcmlhYmVsZW4qOgogICAJLSAqZGlzY3JldGUgdmFyaWFiZWxlbio6IHRlbGxpbmdlbiB2LmIuIG51bWJlciBvZiBwYXJ0bmVycyBpbiBsaWZlIHNwYW4sIC4uLgoJLSAqY29udGludWUgdmFyaWFiZWxlbio6IGt1bm5lbiAoaW4gdGhlb3JpZSkgZWxrZSBtb2dlbGlqa2Ugd2FhcmRlIGFhbm5lbWVuIGJpbm5lbiBiZXBhYWxkZSBncmVuemVuIHYuYi4gQWdlLCBIZWlnaHQsIFdlaWdodCwgQk1JLCBEaXJlY3QgQ2hvbGVzdG9yb2wuLi4KCgktIFNvbXMgZGljaG90b21pc2VyZW4gbmFhciBlZW4gbm9taW5hbGUga3dhbGl0YXRpZXZlIHZhcmlhYmVsZSAkXHJpZ2h0YXJyb3ckIGluZm9ybWF0aWV2ZXJsaWVzOiBCTUkgJFxyaWdodGFycm93JCBCTUkgY2xhc3MKCi0tLQoKIyBQb3B1bGF0aWUKCi0gRG9lbCB2YW4gd2V0ZW5zY2hhcHBlbGlqa2Ugc3R1ZGllOiB1aXRzcHJha2VuIGRvZW4gb3ZlciBkZSBhbGdlbWVuZSBwb3B1bGF0aWUuCgotIFYuYi4gbmFnYWFuIG9mIGRlIGxlbmd0ZSB0dXNzZW4gbWFubmVuIGVuIHZyb3V3ZW4gZ2VtaWRkZWxkIHZlcnNjaGlsbGVuZCBpcy4KCgotIFBvcHVsYXRpZSBpcyBlZW4gdGhlb3JldGlzY2ggY29uY2VwdAoJLSBJcyBtZWVzdGFsIGNvbnRpbnUgaW4gdmVyYW5kZXJpbmcKCS0gVmFhayBvb2sgaW50ZXJlc3NlIGluIHRvZWtvbXN0aWdlIHN1YmplY3RlbiAkXHJpZ2h0YXJyb3ckIGR1cyBvcCBiZXBhYWxkIG9nZW5ibGlrIG5pZXQgdm9sbGVkaWcgb2JzZXJ2ZWVyYmFhcgogIAktIGthbiBhbHMgb25laW5kaWcgZ3Jvb3Qgd29yZGVuIGJlc2Nob3V3ZAoKLSBQb3B1bGF0aWUgZHVpZGVsaWprIG9tc2NocmlqdmVuISAgCgojIyBQb3B1bGF0aWUgZHVpZGVsaWprIG9tc2NocmlqdmVuCgoqSW5jbHVzaWVjcml0ZXJpYSogemlqbiBrYXJha3RlcmlzdGlla2VuIGRpZSBlZW4gc3ViamVjdC9leHBlcmltZW50ZWxlIGVlbmhlaWQgbW9ldCBoZWJiZW4gb20gdG90IGRlIHBvcHVsYXRpZSB0ZSBiZWhvcmVuLCBiLnYuCgotIGxlZWZ0aWpkc2NhdGVnb3JpZSA0NS02NQotIG5vcm1hYWwgQk1JCi0gLi4uCgoqRXhjbHVzaWVjcml0ZXJpYSogemlqbiBrYXJha3RlcmlzdGlla2VuIGRpZSBlZW4gc3ViamVjdC9leHBlcmltZW50ZWxlIGVlbmhlaWQgbmlldCBtYWcgaGViYmVuIG9tIHRvdCBkZSBwb3B1bGF0aWUgdGUgYmVob3JlbiwgYi52LgoKLSBkaWFiZXRlcwotIGhpc3RvcmllayB2YW4gaGFyZCBkcnVncwotIGxhZ2UgZ2V6b25kaGVpZHNzdGF0dXMKLSBzbGFhcHByb2JsZW1lbgotIC4uLgoKLS0tCgojIFRvZXZhbHN2ZXJhbmRlcmxpamtlbiAodG9ldmFsbGlnZSB2ZXJhbmRlcmxpamtlbikKCi0gVmFyaWFiZWxlbiAodmIgU3lzdG9saXNjaGUgYmxvZWRkcnVrKSB2YXJpw6tyZW4gaW4gZGUgcG9wdWxhdGllIHZhbiBzdWJqZWN0IHRvdCBzdWJqZWN0IQpcdnNwYWNlezE1cHR9Ci0gVmFyaWFiZWxlbiB6aWpuIGR1cyAqcmFuZG9tIG9mIHZlcmFuZGVybGlqayogYWFuZ2V6aWVuIGh1biB3YWFyZGUgdmVyYW5kZXJsaWprIGlzIGluIGRlIHBvcHVsYXRpZQpcdnNwYWNlezE1cHR9Ci0gKipDcnVjaWFsZSB2cmFhZyoqOiBIb2UgbmF1d2tldXJpZyB6aWpuIHVpdHNwcmFrZW4gb3ZlciBkZSBwb3B1bGF0aWUgby5iLnYuIGVlbiBncm9lcCBnZW1ldGVuIHN1YmplY3RlbiBpbiBlZW4gc3RlZWtwcm9lZiEKXHZzcGFjZXsxNXB0fQotIFdlIHp1bGxlbiBkdXMgc3RlZWRzIHZlcnNjaGlsbGVuIHppZW4gdmFuIHN0ZWVrcHJvZWYgdG90IHN0ZWVrcHJvZWYKXHZzcGFjZXsxNXB0fQotIFNwcmVpZGluZyBvcCBnZWdldmVucyBzcGVlbHQgY3J1Y2lhbGUgcm9sCgotLS0KCiMjIENvbnZlbnRpZQoKLSBHZWJydWlrIGhvb2ZkbGV0dGVycyBvbSBhYW4gdGUgZ2V2ZW4gZGF0IGJlc3R1ZGVlcmRlIGthcmFrdGVyaXN0aWVrICh2Yi4gc3lzdG9saXNjaGUgYmxvZWRkcnVrKSB2YXJpYWJlbCBpcyBpbiBkZSBwb3B1bGF0aWUgem9uZGVyIGRhYXJiaWogY29uY3JlZXQgb3ZlciBkZSBnZXJlYWxpc2VlcmRlIHdhYXJkZSB2b29yIGVlbiBiZXBhYWxkIHN1YmplY3QgbmEgdGUgZGVua2VuLgpcdnNwYWNlezE1cHR9Ci0gVmFyaWFiZWxlICRYJCB3b3JkdCBhbGdlbWVlbiBlZW4gKnRvZXZhbHN2ZXJhbmRlcmxpamtlKiBnZW5vZW1kOiBpcyBmb3JtZWVsCnJlc3VsdGFhdCB2YW4gZWVuICp0b2V2YWxsaWdlIHRyZWtraW5nKiB2YW4gZWVuIGJlcGFhbGRlCmthcmFrdGVyaXN0aWVrIHVpdCBkZSBzdHVkaWVwb3B1bGF0aWUuClx2c3BhY2V7MTVwdH0KLSAgRWVuIHRvZXZhbHN2ZXJhbmRlcmxpamtlICRYJCBrYW4gbWVuIGR1cyBvcHZhdHRlbiBhbHMgb25iZWtlbmRlIHZlcmFuZGVybGlqa2UgZGllIGVlbiBtZXRpbmcgdm9vcnN0ZWx0IGRpZSB3ZSBwbGFubmVuIHRlIHZlcnphbWVsZW4gYmlqIGVlbiByYW5kb20gc3ViamVjdCwgbWFhciBub2cgbmlldCBoZWJiZW4gdmVyemFtZWxkLgpcdnNwYWNlezE1cHR9Ci0gTm9vZHpha2VsaWprIG9tIHRlIGt1bm5lbiByZWRlbmVyZW4gaG9lIHJlc3VsdGF0ZW4gdmFuIHN0ZWVrcHJvZWYgdG90IHN0ZWVrcHJvZWYga3VubmVuIHdpanppZ2VuClx2c3BhY2V7MTVwdH0KLSBUb2V2YWxsaWcgdmVyYW5kZXJsaWprZW4ga3VubmVuIGt3YWxpdGF0aWVmLCBrd2FudGl0YXRpZWYsIGRpc2NyZWV0LCBjb250aW51LCAuLi4uIHppam4KCi0tLQoKCiMgQmVzY2hyaWp2ZW4gdmFuIGRlIHBvcHVsYXRpZQoKLSBWb29yIHdlIGVlbiByYW5kb20gdmFyaWFiZWxlIG1ldGVuIGlzIGhldCBvbm1vZ2VsaWprIGV4YWN0IHRlIHZvb3JzcGVsbGVuIGhvZSBob29nIHplIHphbCB6aWpuLgoKLSBHZXJlYWxpc2VlcmRlIHdhYXJkZSB2YW4gJFgkIGlzIG9uZGVyaGV2aWcgYWFuIHJhbmRvbSB2YXJpYWJpbGl0ZWl0CgotIEFscyB3ZSB3ZXRlbiBob2UgZGUgdmFyaWFiZWxlIHZlcmRlZWxkIGlzIGRhbiBrdW5uZW4gd2UgcHJvYmFiaWxpdGVpdHN0aGVvcmllIGdlYnJ1aWtlbiBvbSBkZSBrYW5zIHRlIGJlcmVrZW5lbiBkYXQgZWVuIGJlcGFhbGQgdm9vcnZhbCAoZXZlbnQpIHppY2ggdm9vcmRvZXQ6IHZiIHdhdCBpcyBkZSBrYW5zIGRhdCBoZXQgSVEgdmFuIGVlbiByYW5kb20gc3ViamVjdCB1aXQgZGUgcG9wdWxhdGllIGtsZWluZXIgb2YgZ2VsaWprIGlzIGFhbiA4MC4KCi0gTm90YXRpZToKCiAgICAtIEV2ZW50OiAkWCBcbGVxIDgwJAogICAgLSBQcm9iYWJpbGl0ZWl0IG9wIGV2ZW50OiAkUHIoWCBcbGVxIDgwKSQKCi0tLQoKIyNJbnRlcm1lenpvIHByb2JhYmlsaXRlaXRzdGhlb3JpZQoKIyMjIERpc2NyZXRlIHRvZXZhbGxpZyB2ZXJhbmRlcmxpamtlbgoKLSBTdGVsIGRhdCB3ZSBlZW4gZGlzY3JldGUgcmFuZG9tIHZhcmlhYmVsZSBtZXRlbiAkWCQKCi0gQWxsZSBtb2dlbGlqa2Ugd2FhcmRlbiB2b29yICRYJCB3b3JkZW4gZGUgc3RlZWtwcm9lZnJ1aW10ZSAgJFxPbWVnYSQgZ2Vub2VtZC4KCiAgICAtIFZvb3IgR2VuZGVyIGlzIGRlIHN0ZWVrcHJvZWZydWltdGUgJFxPbWVnYT0oMCwxKSQgIG1ldCAwICh2cm91dykgb3IgMSAobWFuKS4KICAgIC0gVm9vciBoZXQgd2VycGVuIHZhbiBlZW4gZG9iYmVsc3RlZW4gaXMgZGUgc3RlZWtwcm9lZnJ1aW10ZSAkXE9tZWdhPSgxLDIsMyw0LDUsNikkLgoKCi0gRWVuIGV2ZW50ICRBJCAgaXMgZWVuIHN1YnNldCB2YW4gZGUgc3RlZWtwcm9lZnJ1aW10ZQoKICAgICAgLSBFZW4gZXZlbiBnZXRhbCB3ZXJwZW4gbWV0IGVlbiBkb2JiZWxzdGVlbjogJEE9KDIsNCw2KSQuCiAgICAgIC0gS2FuIG9vayBlZW4gc3BlY2lmaWVrZSB3YWFyZGUgemlqbiAkQT0oMSkkLgoKCi0gRXZlbnQgcnVpbXRlICRcbWF0aGNhbHtBfSQgaXMgZGUga2xhc3NlIHZhbiBhbGxlIG1vZ2VsaWprZSBldmVudHMgZGllIGt1bm5lbiBvcHRyZWRlbiBiaWogZWVuIGJlcGFhbGQgZXhwZXJpbWVudC4KCi0gVHdlZSBldmVudHMgKCRBXzEkIGVuICRBXzIkKSB6aWpuIG11bHR1ZWVsIGV4Y2x1c2llZiBhbHMgemUgbmlldCBzYW1lbiBvcCBrdW5uZW4gdHJlZGVuLgoKICAgIC0gdi5iLiBldmVudCB2YW4gZGUgb25ldmVuIGdldGFsbGVuICRBXzE9KDEsMyw1KSQgZW4gaGV0IGV2ZW50IG9tICRBXzI9KDYpJCB0ZSBnb29pZW4uCiAgICAtIER1cyAkQV8xIFxiaWdjYXAgQV8yPVxlbXB0eXNldCQuCgoKLSBQcm9iYWJpbGl0ZWl0ICRQcihBKSQgIGlzIGVlbiBmdW5jdGlvbiAkUHI6IEEgXHJpZ2h0YXJyb3cgWzAsMV0kIGRpZSB2b2xkb2V0IGFhbgoKICAgIDEuICRQcihBKSBcZ2VxIDAkIGVuICRQcihBKSBcbGVxIDEkIHZvb3IgZWxrZSAkQSBcaW4gXG1hdGhjYWx7QX0kCiAgICAyLiAkUHIoXE9tZWdhKT0xJAogICAgMy4gVm9vciBtdWx0dWVlbCBleGNsdXNpZXZlIGV2ZW50cyAkQV8xLCBBXzIsIFxsZG90cyBBX2skIGdlbGR0IGRhdCAkUHIoQV8xIFxjdXAgQV8yIFxsZG90cyBcY3VwIEFfayk9IFByKEFfMSkgKyBcbGRvdHMgKyBQcihBX2spJAoKCi0gRG9iYmVsc3RlZW4gdm9vcmJlZWxkCgogICAgLSBvbmV2ZW4gbnVtYmVyICRBPSgxLDMsNSkkOiBpcyBkZSB1bmllIHZhbiAzIG11bHR1ZWVsIGV4Y2x1c2lldmUgZXZlbnRzICRBXzE9MSQsICRBXzI9MyQgZW4gJEFfMz01JCB6b2RhdAogICAgJFByKEEpPVByKDEpK1ByKDMpK1ByKDUpPTEvNisxLzYrMS82PTAuNSQKICAgIC0gJFxPbWVnYT0oMSwyLDMsNCw1LDYpJDogJFByKFxPbWVnYSk9MSQKCgotIEFscyB3ZSB0d2VlIHN1YmplY3RlbiAoaiBlbiBrKSBvbmFmaGFua2VsaWprIHRyZWtrZW4gdmFuIGRlIHBvcHVsYXRpZSBkYW4gaXMgZGUgZ2V6YW1lbGlqa2UgcHJvYmFiaWxpdGVpdAokUChYX2osWF9rKT0gUChYX2opUChYX2opJAoKLS0tCgojIyMjIERpc3RyaWJ1dGllIG9mIHZlcmRlbGluZwoKLSBEZSBkaXN0cmlidXRpZSBvZiBkZSB2ZXJkZWxpbmcgdmFuIGVlbiBkaXNjcmV0ZSB0b2V2YWxsaWcgdmVyYW5kZXJsaWprZSAkWCQgYmVzY2hyaWpmdCBkZSBrYW5zIG9wIGVsa2UgbW9nZWxpamtlIHdhYXJkZSB2YW4gZGUgc3RlZWtwcm9lZnJ1aW10ZS4gIAoKLSBWb29yYmVlbGQ6IEdlbmRlciBpcyBlZW4gYmluYWlyZSB2YXJpYWJlbGUgKDA6IHZyb3V3LCAxOiBtYW4pIGVuIGJpbmFpcmUgdmFyaWFiZWxlbiB2b2xnZW4gZWVuIEJlcm5vdWxsaSB2ZXJkZWxpbmcuIDUwLjglIHZhbiBkZSBzdWJqZWN0ZW4gaW4gZGUgQW1lcmlrYWFuc2UgcG9wdWxhdGllIHppam4gdnJvdXcgZW4gNDkuMiUgaXMgbWFuLgoKLSBMYWF0ICRccGkkIGRlIHByb2JhYmlsaXRlaXQgemlqbiBvcCBlZW4gbWFuICRccGk9MC40OTIkLgogICAgJCQgWFxzaW0gXGxlZnQgXHsKICAgIFxiZWdpbnthcnJheX17bGNsfQogICAgUChYPTApICY9JiAxLVxwaVxcCiAgICBQKFg9MSkgJj0mIFxwaQogICAgXGVuZHthcnJheX0gXHJpZ2h0IC4gJCQKCiAgICBgYGB7cn0KICAgIHRpYmJsZShYPWMoMCwxKSxwcm9iPWMoMC41MDgsMC40OTIpKSAlPiUKICAgICAgZ2dwbG90KGFlcyh4PVgseGVuZD1YLHk9MCx5ZW5kPXByb2IpKSArCiAgICAgIGdlb21fc2VnbWVudCgpICsKICAgICAgeWxhYigiUHJvYmFiaWxpdHkiKQogICAgYGBgCgpUb2V2YWxsaWcgdmVyYW5kZXJsaWprZSAkWCQgdm9sZ3QgZWVuIEJlcm5vdWxsaSB2ZXJkZWxpbmcgJEIoXHBpKSQgbWV0IHBhcmFtZXRlciAkXHBpPTAuNDkyJCwKICAgICQkQihccGkpPSBccGleeCgxLVxwaSleeygxLXgpfSQkCgotLS0KCiMjIyMgQ3VtdWxhdGl2ZSBkaXN0cmlidXRpZSBmdW5jdGllCgotIERlIGN1bXVsYXRpdmUgZGlzdHJpYnV0aWUgZnVuY3RpZSBGKHgpIGdlZWZ0IGRlIHByb2JhYmlsaXRlaXQgd2VlciBvbSBlZW4gcmFuZG9tIHZhcmlhYmxlIFggdGUgb2JzZXJ2ZXJlbiB3YWFydm9vciBnZWxkdCBkYXQgJFhcbGVxIHgkOgokJCBGKHgpID0gXHN1bVxsaW1pdHNfe1xmb3JhbGwgWFxsZXEgeH0gUCh4KSQkCgotIEdlbmRlciB2b29yYmVlbGQgJEYoMCk9MS1ccGkkIGFuZCBGKDEpPSBQKFg9MCkgKyBQKFg9MSk9MQoKICAgIGBgYHtyfQogICAgdGliYmxlKFg9YygwLDEpLGN1bXByb2I9YygwLjUwOCwxKSkgJT4lCiAgICAgIGdncGxvdChhZXMoeD1YLHhlbmQ9WCx5PTAseWVuZD1jdW1wcm9iKSkgKwogICAgICBnZW9tX3NlZ21lbnQoKSArCiAgICAgIHlsYWIoIkYoeCkiKQogICAgYGBgCgotIERvYmJlbHN0ZWVuOgoKICAgIGBgYHtyfQogICAgdGliYmxlKFg9MTo2LGN1bXByb2I9Y3Vtc3VtKHJlcCgxLzYsNikpKSAlPiUKICAgICAgZ2dwbG90KGFlcyh4PVgseGVuZD1YLHk9cmVwKDAsNikseWVuZD1jdW1wcm9iKSkgKwogICAgICBnZW9tX3NlZ21lbnQoKSArCiAgICAgIHlsYWIoIkYoeCkiKQogICAgYGBgCgotLS0KCiMjIyMgR2VtaWRkZWxkZQoKSGV0IGdlbWlkZGVsZGUgb2YgZGUgdmVyd2FjaHRlIHdhYXJkZSAkRVtYXSQgdmFuIGVlbiBkaXNjcmV0ZSB0b2V2YWxsaWcgdmVyYW5kZXJsaWprZSAkWCQgaXMgZ2VnZXZlbiBkb29yOgoKJCRFW1hdPVxzdW1cbGltaXRzX3t4XGluXE9tZWdhfSB4IFAoWD14KSQkCgotIEdlbmRlciB2b29yYmVlbGQKCiAgICAtICRFW1hdPSAwIFx0aW1lcyAoMS1ccGkpICsgMSBcdGltZXMgKFxwaSkgPSBccGkkCiAgICAtIFRoZSBtZWFuIGVxdWFscyAkRVtYXT0wLjQ5MiQuCgotIERvYmJlbHN0ZWVuOgoKJEVbWF09IDEgXHRpbWVzIFxmcmFjezF9ezZ9ICsgMiBcdGltZXMgXGZyYWN7MX17Nn0gKyBcbGRvdHMgKyA2IFx0aW1lcyBcZnJhY3sxfXs2fSA9JCBgciBzdW0oMTo2KS82YAoKLS0tCgojIyMjIFZhcmlhbnRpZQoKRGUgdmFyaWFudGllIGlzIGVlbiBtYWF0IHZvb3IgZGUgdmFyaWFiaWxpdGVpdCB2YW4gZWVuIHRvZXZhbGxpZyB2ZXJhbmRlcmxpamtlIGVuIHdvcmR0IGdlZ2V2ZW4gZG9vcjoKCiQkRVsoWC1FW1hdKV4yXT1cc3VtXGxpbWl0c197eFxpblxPbWVnYX0gKHgtRVtYXSleMiBQKFg9eCkkJAoKLSBHZW5kZXIgdm9vcmJlZWxkCiAgICBcYmVnaW57ZXFuYXJyYXl9CiAgICBFWyhYLUVbWF0pXjJdJj0mKDAtXHBpKV4yXHRpbWVzICgxLVxwaSkrKDEtXHBpKV4yIFx0aW1lcyBccGlcXAogICAgJj0mIFxwaV4yICgxLVxwaSkgKyAoMS1ccGkpXjIgXHBpXFwKICAgICY9JlxwaSAoMS1ccGkpKFxwaSsxLVxwaSlcXAogICAgJj0mXHBpKDEtXHBpKQogICAgXGVuZHtlcW5hcnJheX0KCi0tLQoKIyMjIENvbnRpbnVlIHRvZXZhbGxpZyB2ZXJhbmRlcmxpamtlCgoKLSBFZW4gY29udGludWUgdG9ldmFsbGlnIHZlcmFuZGVybGlqa2Uga2FuIGJpbm5lbiBiZXBhYWxkZSBncmVuemVuIGFsbGUgbW9nZWxpamtlIHdhYXJkZW4gYWFubmVtZW4uCgotIERlIGthbnMgb20gZXhhY3Qgw6nDqW4gYmVwYWFsZGUgd2FhcmRlIGFhbiB0ZSBuZW1lbiBpcyBkYWFyb20gZ2VsaWprIGFhbiAwLgoKLSBEZSBkaXN0cmlidXRpZSAodmVyZGVsaW5nKSB3b3JkdCBkYWFyb20gd2VlcmdlZ2V2ZW4gYS5kLmgudi4gZGUgZGVuc2l0ZWl0c2Z1bmN0aWUgb2YgZGUgZGljaHRoZWlkc2Z1bmN0aWUgJGYoeCkkCgotIFZlZWwgYmlvbG9naXNjaGUga2FyYWt0ZXJpc3RpZWtlbiB6aWpuIGFwcHJveGltYXRpZWYgbm9ybWFhbCB2ZXJkZWVsZCAobGVuZ3RlLCBibG9lZGRydWssIElRLCBjb25jZW50cmF0aWUgbWV0aW5nZW4gbmEgbG9nYXJpdG1pc2NoZSB0cmFuc2Zvcm1hdGllKQogICAgJCRmKHgpID0gXGZyYWN7MX17XHNxcnR7MlxwaVxzaWdtYV4yfX0gZV57LVxmcmFjeyh4LVxtdSleMn17MlxzaWdtYV4yfX0kJAoKLSBEYXQgd29yZHQga29ydCBnZW5vdGVlcmQgYWxzICRmKHgpID0gTihcbXUsXHNpZ21hXjIpJAoKLSBWYW4gaGV0IElRIGlzIGdld2V0ZW4gZGF0IGhldCBub3JtYWxlIHZlcmRlbGluZyB2b2xndCBtZXQgZ2VtaWRkZWxkZSAkXG11PTEwMCQgZW4gc3RhbmRhYXJkYWZ3aWpraW5nICRcc2lnbWE9MTUkLiAgCiQkSVEgXHNpbSBOKDEwMCwxNV4yKSQkCgoKLSBJbiBSIGt1bm5lbiB3ZSBkZSBkbm9ybSBmdW5jdGllIGdlYnJ1aWtlbiBvbSBkZSBkZW5zaXRlaXQgdGUgYmVyZWtlbmVuIHZvb3IgZWVuIGJlcGFhbGRlIHdhYXJkZSBYPXguCgotIERlIGFyZ3VtZW50ZW4gdmFuIGBkbm9ybWAgemlqbiBgbWVhbmAgKCRcbXUkKSBlbiBgc2RgIChzdGFuZGFhcmRhZndpamtpbmcgJFxzaWdtYSQpLgoKYGBge3IgSVEsIGZpZy5hbGlnbj0nY2VudGVyJ30KaXEgPC0gdGliYmxlKAogIElRID0gc2VxKDQwLDE1MCwuMSksCiAgRGVuc2l0ZWl0ID0gZG5vcm0oc2VxKDQwLDE1MCwuMSksbWVhbj0xMDAsc2Q9MTUpCiAgKQppcSAlPiUKICBnZ3Bsb3QoYWVzKHg9SVEseT1EZW5zaXRlaXQpKSArCiAgZ2VvbV9saW5lKCkKYGBgCgotIEJpbm5lbiBiZXBhYWxkZSBncmVuemVuIGt1bm5lbiBjb250aW51ZSB0b2V2YWxsaWcgdmVyYW5kZXJsaWprZW4gYWxsZSBtb2dlbGlqa2Ugd2FhcmRlbiBhYW5uZW1lbiBkdXMgaXMgJFxPbWVnYSQgb25laW5kaWcgZ3Jvb3QuCgotLS0KCiMjIyNDdW11bGF0aWV2ZSBkaXN0cmlidXRpZQoKLSBPcG5pZXV3IGlzIGRlIGN1bXVsYXRpZXZlIGRpc3RyaWJ1dGllICRGKFgpPVByKFhcbGVxIHgpJC4KCi0gT21kYXQgWCBjb250aW51IGlzIGJlcmVrZW5lbiB3ZSBkZXplIHByb2JhYmlsaXRlaXQgYS5kLmgudi4gZWVuIGludGVncmFhbAokJEYoeCk9XGludCBcbGltaXRzX3stXGluZnR5fV54IGYoeCkgZHgkJAoKLSBNZXJrIG9wIGRhdCAkZih4KT0wJCBhbHMgeCBuaWV0IHRvdCBkZSBzdGVla3Byb2VmcnVpbXRlIGJlaG9vcmQuCgotIFdlIGt1bm5lbiAkRih4KSQgYmVyZWtlbmVuIHZvb3IgZWVuIG5vcm1hYWwgdmVyZGVlbGRlIHRvZXZhbGxpZyB2ZXJhbmRlcmxpamtlIG1ldCBkZSBmdW5jdGllIGBwbm9ybWAgZGllIG9wbmlldXcgYXJndW1lbnRlbiBgbWVhbmAgZW4gYHNkYCBoZWVmdC4KCmBgYHtyfQppcSAlPiUKICBtdXRhdGUoUHJvYmFiaWxpdHk9cG5vcm0oSVEsbWVhbj0xMDAsc2Q9MTUpKSAlPiUKICBnZ3Bsb3QoYWVzKHg9SVEseT1Qcm9iYWJpbGl0eSkpICsKICBnZW9tX2xpbmUoKQpgYGAKCkRlIHByb2JhYmlsaXRlaXQgZGF0IGhldCBJUSB2YW4gZWVuIHJhbmRvbSBzdWJqZWN0IGxhZ2VyIGlzIGRhbiA4MCB3b3JkdCBpbiBSIGJlcmVrZW5kIGRvb3IKCmBgYHtyfQpwbm9ybSg4MCxtZWFuPTEwMCxzZD0xNSkKYGBgCgpgYGB7ciBmaWcuYWxpZ249J2NlbnRlcicsZWNobz1GQUxTRX0KZ3JpZCA8LSBzZXEoNDAsMTUwLC4xKQpncmlkMiA8LSBzZXEoNDAsODAsLjAxKQpwbG90KGdyaWQsZG5vcm0oZ3JpZCxtZWFuPTEwMCxzZD0xNSksCiAgICAgeGxhYj0iSVEiLAogICAgIGNvbD0yLHlsYWI9IkRlbnNpdGVpdCIsdHlwZT0ibCIsbHdkPTIsY2V4LmxhYj0xLjUsY2V4LmF4aXM9MS41KQpwb2x5Z29uKHg9YyhncmlkMiw4MCw0MCkseT1jKGRub3JtKGdyaWQyLDEwMCwxNSksMCwwKSxjb2w9Mixib3JkZXI9MikKdGV4dCg4MCxkbm9ybSg4MCxtZWFuPTEwMCxzZD0xNSkscGFzdGUwKCJQKFggPCA4MCkgPSAiLHJvdW5kKHBub3JtKDgwLDEwMCwxNSkqMTAwLDEpLCIlIiksY29sPTIsY2V4PTEuNSxwb3M9NCkKYGBgCgpgYGB7ciBmaWcuYWxpZ249J2NlbnRlcicsZWNobz1GQUxTRX0KcGxvdChncmlkLHBub3JtKGdyaWQsbWVhbj0xMDAsc2Q9MTUpLHR5cGU9ImwiLHhsYWI9IklRIix5bGFiPSJQcm9iYWJpbGl0eSIsbHdkPTIsY29sPTIpCmxpbmVzKGMoODAsODAsODAsMCksYygwLHJlcChwbm9ybSg4MCwxMDAsMTUpLDMpKSxsdHk9MikKYGBgCgotIFZvb3IgZGUgZ3Jvb3RzdCBtb2dlbGlqa2Ugd2FhcmRlIHZvb3IgJFgkIGludGVncmVyZW4gd2Ugb3ZlciBkZSB2b2xsZWRpZ2Ugc3RlZWtwcm9lZnJ1aW10ZSAkXE9tZWdhJCBkdXMKJCRcaW50IFxsaW1pdHNfe3ggXGluIFxPbWVnYX0gZih4KSBkeD0xJCQKCi0gRGUgb3BwZXJ2bGFrdGUgb25kZXIgZGUgZGljaHRoZWlkc2Z1bmN0aWUgaXMgZHVzIDEhCgotLS0KCiMjIyMgR2VtaWRkZWxkZSBlbiB2YXJpYW50aWUKCi0gSGV0IGdlbWlkZGVsZGUgb2YgZGUgdmVyd2FjaHRlIHdhYXJkZSBpcwoKJCRcaW50IFxsaW1pdHNfe3ggXGluIFxPbWVnYX0geCBmKHgpIGR4JCQKCi0gVm9vciBkZSBub3JtYWxlIGRpc3RyaWJ1dGllCiQkXGludCBcbGltaXRzX3stXGluZnR5fV57K1xpbmZ0eX0geCBmKHgpIGR4ID0gXG11JCQKCi0gRGUgdmFyaWFuY2UgJEVbKFgtRVtYXSleMl0kICAgCgokJFxpbnQgXGxpbWl0c197eCBcaW4gXE9tZWdhfSAoeC1FW1hdKV4yIGYoeCkgZHgkJAoKLSBWb29yIGRlIG5vcm1hbGUgZGlzdHJpYnV0aWUgYmVrb21lbiB3ZQoKJCRcaW50IFxsaW1pdHNfey1caW5mdHl9XnsrXGluZnR5fSAoeC1cbXUpXjIgZih4KSBkeCA9IFxzaWdtYV4yJCQKCi0gSGV0IGlzIHZhYWsgbW9laWxpamsgb20gZGUgdmFyaWFudGllIHRlIGludGVycHJldGVyZW4gZ2V6aWVuIHplIG5pZXQgaW4gZGUgemVsZmRlIGVlbmhlZGVuIHN0YWF0IGFscyBoZXQgZ2VtaWRkZWxkZS4gRGFhcm9tIHdlcmtlbiB3ZSB2YWFrIG1ldCBkZSBzdGFuZGFhcmRhZndpamtpbmc6CgokJFNEPVxzcXJ0e0VbKFgtRVtYXSleMl19JCQKCgpERSBTRCB2b29yIGRlIG5vcm1hbGUgZGlzdHJpYnV0aWUsICRcc2lnbWEkIGhlZWZ0IGRlIG1vb2llIGludGVycHJldGF0aWUgZGF0IG9uZ2V2ZWVyIDY4JSB2YW4gZGUgcG9wdWxhdGllIGVlbiB3YWFyZGUgaGVlZnQgdm9vciBkZSBrYXJha3RlcmlzdGllayBYIGJpbm5lbiBoZXQgaW50ZXJ2YWwgdmFuIDEgc3RhbmRhYXJkYWZ3aWpraW5nKCRcc2lnbWEkKSByb25kIGhldCBnZW1pZGRlbGRlOgoKJCRQKFxtdS1cc2lnbWEgPCBYIDwgXG11ICsgXHNpZ21hKSBcYXBwcm94IDAuNjgkJAoKCmBgYHtyIGZpZy5hbGlnbj0nY2VudGVyJyxlY2hvPUZBTFNFfQpncmlkMjwtc2VxKDg1LDExNSwuMDEpCnBsb3QoZ3JpZCxkbm9ybShncmlkLG1lYW49MTAwLHNkPTE1KSwKICAgICB4bGFiPSJJUSIsCiAgICAgY29sPTIseWxhYj0iRGVuc2l0ZWl0Iix0eXBlPSJsIixsd2Q9MixjZXgubGFiPTEuNSxjZXguYXhpcz0xLjUpCnBvbHlnb24oeD1jKGdyaWQyLDExNSw4NSkseT1jKGRub3JtKGdyaWQyLDEwMCwxNSksMCwwKSxjb2w9ImdyZXkiLGJvcmRlcj0iZ3JleSIpCnRleHQoMTE1LGRub3JtKDExNSxtZWFuPTEwMCxzZD0xNSkscGFzdGUwKCJQKDg1PFg8MTE1KSA9ICIscm91bmQoKHBub3JtKDExNSwxMDAsMTUpLXBub3JtKDg1LDEwMCwxNSkpKjEwMCwxKSwiJSIpLGNvbD0yLGNleD0xLjMscG9zPTQpCmFibGluZSh2PTEwMCkKdGV4dCg0LDAsZXhwcmVzc2lvbihtdSkpCmxpbmVzKGMoODUsMTE1KSxyZXAoZG5vcm0oMTE1LDEwMCwxNSksMikpCnRleHQoMTA3LjUsZG5vcm0oMTE0LjUsMTAwLDE1KSxleHByZXNzaW9uKHNpZ21hKSkKdGV4dCgxMDAtMTUvMixkbm9ybSgxMTQuNSwxMDAsMTUpLGV4cHJlc3Npb24oc2lnbWEpKQpgYGAKCi0gVm9vciBub3JtYWFsIHZlcmRlZWxkZSB0b2V2YWxsaWcgdmVyYW5kZXJsaWprZW4gaGVlZnQgb25nZXZlZXIgOTUlIHZhbiBkZSBzdWJqZWN0ZW4gaW4gZGUgcG9wdWxhdGllIGVlbiB3YWFyZGUgZGllIGJpbm5lbiB0d2VlIHN0YW5kYWFyZGFmd2lqa2luZ2VuICgkMiBcc2lnbWEkKSBsaWd0IHZhbiBoZXQgZ2VtaWRkZWxkZS4KCiQkUFtcbXUgLSAyIFxzaWdtYSA8IFggPCBcbXUgKyAyIFxzaWdtYV1cYXBwcm94IDAuOTUkJApgYGB7ciBmaWcuYWxpZ249J2NlbnRlcicsZWNobz1GQUxTRX0KZ3JpZDI8LXNlcSg3MCwxMzAsLjAxKQpwbG90KGdyaWQsZG5vcm0oZ3JpZCxtZWFuPTEwMCxzZD0xNSksCiAgICAgeGxhYj0iSVEiLAogICAgIGNvbD0yLHlsYWI9IkRlbnNpdGVpdCIsdHlwZT0ibCIsbHdkPTIsY2V4LmxhYj0xLjUsY2V4LmF4aXM9MS41KQpwb2x5Z29uKHg9YyhncmlkMiwxMzAsNzApLHk9Yyhkbm9ybShncmlkMiwxMDAsMTUpLDAsMCksY29sPSJncmV5Iixib3JkZXI9ImdyZXkiKQp0ZXh0KDExNSxkbm9ybSgxMTUsbWVhbj0xMDAsc2Q9MTUpLHBhc3RlMCgiUCg3MDxYPDEzMCkgPSAiLHJvdW5kKChwbm9ybSgxMzAsMTAwLDE1KS1wbm9ybSg3MCwxMDAsMTUpKSoxMDAsMSksIiUiKSxjb2w9MixjZXg9MS4zLHBvcz00KQphYmxpbmUodj0xMDApCnRleHQoNCwwLGV4cHJlc3Npb24obXUpKQpsaW5lcyhjKDcwLDEzMCkscmVwKGRub3JtKDEzMCwxMDAsMTUpLDIpKQp0ZXh0KDExNSxkbm9ybSgxMjgsMTAwLDE1KSxleHByZXNzaW9uKDIgKiBzaWdtYSkpCnRleHQoODUsZG5vcm0oMTI4LDEwMCwxNSksZXhwcmVzc2lvbigyICogc2lnbWEpKQpgYGAKCi0tLQoKIyMgU3RhbmRhcmRpc2F0aWUKCi0gTm9ybWFsZSBkYXRhIHdvcmRlbiB2YWFrIGdlc3RhbmRhcmRpc2VlcmQuCgokJHo9XGZyYWN7eC1cbXV9e1xzaWdtYX0kJAoKLSBOYSBzdGFuZGFyZGlzYXRpZSB2b2xnZW4gZGUgZGF0YSBlZW4gc3RhbmRhYXJkIG5vcm1hYWwgdmVyZGVsaW5nICBtZXQgZ2VtaWRkZWxkZSAkXG11PTAkIGVuIHZhcmlhbnRpZSAkXHNpZ21hXjI9MSQ6CiQkeiBcc2ltIE4oMCwxKSQkCgpXZSBrdW5uZW4gZGUgYHFub3JtYCBmdW5jdGllIGdlYnJ1aWtlbiBvbSBrd2FudGllbGVuICR6X3syLjVcJX0kIGVuICR6X3s5Ny41XCV9JCBkaWUgcmVzcGVjdGlldmVsaWprIGNvcnJlc3BvbmRlcmVuIG1ldCAkRih6X3syLjVcJX0pPTAuMDI1JCBlbiAkRih6X3s5Ny41XCV9KT0wLjk3NSQuCgpgYGB7cn0KcW5vcm0oMC4wMjUpCnFub3JtKDAuOTc1KQoKYGBgCgpWb29yIGVlbiBzdGFuZGFhcmQgbm9ybWFhbCB2ZXJkZWVsZGUgdG9ldmFsbGlnIHZlcmFuZGVybGlqa2UgdmFsdCBpbmRlcmRhYWQgb25nZXZlZXIgJDAuOTc1IC0gMC4wMjU9MC45NSQgdmFuIGRlIHdhYXJkZW4gYmlubmVuIGhldCBpbnRlcnZhbCBbLTIsMl0sIG9mIGJpbm5lbiAyIHN0YW5kYWFyZGFmd2lqa2luZ2VuICgkXHNpZ21hPTEkKSB2YW4gaGV0IGdlbWlkZGVsZGUgICgkXG11PTAkKS4KCi0tLQoKIyBTdGVla3Byb2VmCgotIEluIGVjaHRlIHN0dWRpZXMga2VubmVuIHdlIGRlIGRpc3RyaWJ1dGllIHZhbiBlZW4gcmFuZG9tIHZlcmFuZGVybGlqa2UgaW4gZGUgcG9wdWxhdGllIG5pZXQhCgotIE9td2lsbGUgdmFuIGZpbmFuY2nDq2xlIGVuIGxvZ3NpdGlla2UgYmVwZXJraW5nZW4ga3VuZW4gd2UgYmlqbmEgbm9vaXQgZGUgdm9sbGVkaWdlIHBvcHVsYXRpZSBiZXN0dWRlcmVuLgoKLSBEZSBwb3B1bGF0aWUgcGFyYW1ldGVycyAodi5iLiBnZW1pZGRlbGQgSVEsIHZhcmlhbnRpZSB2YW4gSVEpIGt1bm5lbiBkYWFyZG9vciBuaWV0IHpvbmRlciBvbnpla2VyaGVpZCB3b3JkZW4gYmVwYWFsZC4gIAoKLSBXZSBrdW5uZW4gZW5rZWwgZWVuIGtsZWluZSBzdWJzZXQgdmFuIGRlIHBvcHVsYXRpZSBiZXN0dWRlcmVuOiBkZSAqc3RlZWtwcm9lZiogIChlbmdlbHM6IHNhbXBsZSkKLSBUcmVrIG9ic2VydmF0aWVzIHZvbGdlbnMgZWVuIGdlc3RydWN0dXJlZXJkIGRlc2lnbjogdHJlayBkZSAgKipzdWJqZWN0ZW4gdm9sbGVkaWcgYXQgcmFuZG9tIHVpdCBkZSBwb3B1bGF0aWUqKiB6b2RhdCBlbGsgc3ViamVjdCBlZW4gZ2VsaWprZSBrYW5zIGhlZWZ0IG9tIGluIGRlIHN0ZWVrcHJvZWYgdGUgd29yZGVuIG9wZ2Vub21lbiAkXHJpZ2h0YXJyb3ckICoqUmVwcmVzZW50YXRpZXZlIHN0ZWVrcHJvZWYqKi4KCi0gU3RlZWtwcm9lZiAkeF8xLCB4XzIsIC4gLiAuICwgeF97bn0kIGthbiBhbHMgJG4kIHJlYWxpc2F0aWUgdmFuIGRlemVsZmRlIHRvZXZhbGxpZyB2ZXJhbmRlcmxpamtlICRYJCB3b3JkZW4gYmVzY2hvdXdkIHZvb3Igc3ViamVjdGVuICRpID0gMSwyLC4uLixuJC4KCi0gRGUgZGlzdHJpYnV0aWUgaW4gZGUgcG9wdWxhdGllIGlzIG9uZ2VrZW5kIGVuIG1vZXQgd29yZGVuIGdlc2NoYXQgb3AgYmFzaXMgdmFuIGRlIHN0ZWVrcHJvZWYuICAKCi0gQWxzIHdlIGFhbm5lbWVuIGRhdCBkZSBnZWdldmVucyBlZW4gYmVwYWFsZGUgZGlzdHJpYnV0aWUgdm9sZ2VuIChiLnYuIGRlIG5vcm1hbGUgdmVyZGVsaW5nICROKFxtdSxcc2lnbWFeMikkKSBkYW4gbW9ldGVuIHdlIGVua2VsIGRlIHBvcHVsYXRpZSBwYXJhbWV0ZXJzICgkXG11JCBlbiAkXHNpZ21hXjIkKSBzY2hhdHRlbiBvcCBiYXNpcyB2YW4gZGUgc3RlZWtwcm9lZi4KCi0gV2Ugbm9lbWVuIGRpdCBzY2hhdHRpbmdlbiAoZW5nZWxzOiBlc3RpbWF0ZXMpIGVuIG5vdGVyZW4gemUgYWxzIHZvbGd0OiAgJFxoYXQgXG11JCBlbiAkXGhhdCBcc2lnbWFeMiQuCgotLS0KCiMjIE5IQU5FUyB2b29yYmVlbGQKCi0gR2VuZGVyIGluIHRoZSBwb3B1bGF0aW9uCgotIFNlbGVjdGVlciAkbj0xMDAwMCQgc3ViamVjdGVuIGF0IHJhbmRvbSB2YW4gZGUgQW1lcmlrYWFuc2UgcG9wdWxhdGllLgoKLSBFZW5zIGRlIHN0ZWVrcHJvZWYgaXMgZ2V0cm9ra2VuIGhlYmJlbiB3ZSAkbiQgcmVhbGlzYXRpZXMgZ2VvYnNlcnZlZXJkIHZvb3IgZGUgdG9ldmFsbGlnIHZlcmFuZGVybGlqa2UgJFgkLgoKLSAqQ29udmVudGllKjogR2VvYnNlcnZlZXJkZSB3YWFyZGVuICB3b3JkZW4gbWV0IGVlbiBrbGVpbmUgbGV0dGVyIGFhbmdlZHVpZCAkeCQuCgotICR4JCBpcyBlZW4gd2VsYmVwYWFsZGUgd2FhcmRlIGRpZSB3ZXJkIGdlbWV0ZW4vZ2VvYnNlcnZlZXJkIGluIGVlbiB1aXRnZXZvZXJkIGV4cGVyaW1lbnQgZW4gaXMgbmlldCBsYW5nZXIgZWVuIG9uZ2VrZW5kZSB2YXJpYWJlbGUuCgojIyBTYW1lbnZhdHRpbmcgIAoKICAtIFZvb3Igd2UgaGV0IGV4cGVyaW1lbnQgdWl0dm9lcmVuIGlzIGRlIHBvcHVsYXRpZSBrYXJha3RlcmlzdGllayB2b29yIGRlIHByb2VmcGVyc29uZW4gJDEsXGxkb3RzLG4kIGRpZSB3ZSB1aXQgZGUgcG9wdWxhdGllIHp1bGxlbiB0cmVra2VuIG9uZ2VrZW5kIGVuIHppam4gZGF0IHRvZXZhbGxpZyB2ZXJhbmRlcmxpamtlbjogJFhfMSwgXGxkb3RzLCBYX24kCiAgLSBEaXQgaXMgbm9vZHpha2VsaWprIG9tIHRlIGt1bm5lbiByZWRlbmVyZW4gb3ZlciBob2UgZGUgcmVzdWx0YXRlbiB2YW4gc3RlZWtwcm9lZiB0b3Qgc3RlZWtwcm9lZiBrdW5uZW4gd2lqemlnZW4KICAtIEluIGVlbiBzdGVla3Byb2VmIG9ic2VydmVyZW4gd2UgZ2VyZWFsaXNlZXJkZSB1aXRrb21zdGVuICR4XzEsIHhfMiwgXGRvdHMsIHhfbiQ6IHYuYi4gZ2VuZGVyIG9mIGxlbmd0ZSB2YW4gc3ViamVjdGVuIGluIGRlIHN0ZWVrcHJvZWYuCgotLS0KCiMgR2VuZGVyIEV4YW1wbGUKCmBgYHtyfQpsaWJyYXJ5KE5IQU5FUykKTkhBTkVTICU+JSBnZ3Bsb3QoYWVzKHg9R2VuZGVyKSkgKyBnZW9tX2JhcigpCmBgYAoKLSBHZW5kZXIgaXMgZWVuIGJpbmFpcmUgdmFyaWFiZWxlLgotIEhldCB2b2xndCBlZW4gQmVybm91bGxpIGRpc3RpYnV0aWUuCi0gRGUgQmVybm91bGxpIGRpc3RyaWJ1dGllIGhlZWZ0IGVlbiBwYXJhbWV0ZXI6IGhldCBnZW1pZGRlbGRlICRccGkkLgotIFdlIGt1bm5lbiAkXHBpJCBzY2hhdHRlbiBvcCBiYXNpcyB2YW4gZGUgc3RlZWtwcm9lZiBkb29yIGhldCBzdGVla3Byb2VmZ2VtaWRkZWxkZSB0ZSBiZXJla2VuZW4gJFxiYXIgeCA9IFxzdW1cbGltaXRzX3tpPTF9Xm4geF9pJAotIE1lcmsgb3AgZGF0IGhldCBzdGVla3Byb2VmZ2VtaWRkZWxkZSB6ZWxmIGVlbiB0b2V2YWxsaWcgdmVyYW5kZXJsaWprZSBpcyEgSGV0IHdpanppZ3Qgb29rIHZhbiBzdGVla3Byb2VmIHRvdCBzdGVla3Byb2VmIQoKCmBgYHtyfQpOSEFORVMgJT4lCiAgY291bnQoR2VuZGVyKSAlPiUKICBtdXRhdGUocHJvYmFiaWxpdHkgPSBuL3N1bShuKSkKYGBgCgotLS0KCiMgTGVuZ3RlCgojIyBFbXBpcmlzY2hlIGRpc3RyaWJ1dGllCgotIFdlIGt1bm5lbiBkZSBkaXN0cmlidXRpZSB2YW4gZGUgbGVuZ3RlIHZvb3Igdm9sd2Fzc2VuIHZyb3V3ZW4gc2NoYXR0ZW4gYWFuIGRlIGhhbmQgdmFuIGhldCBoaXN0b2dyYW0uCgpgYGB7cn0KTkhBTkVTICU+JQogIGZpbHRlcihHZW5kZXI9PSJmZW1hbGUiJiFpcy5uYShIZWlnaHQpJkFnZT4xOCkgJT4lCiAgZ2dwbG90KGFlcyh4PUhlaWdodCkpICsKICBnZW9tX2hpc3RvZ3JhbSgpCmBgYAoKCi0gV2Uga3VubmVuIGRlIGN1bXVsYXRpdmUgZGlzdHJpYnV0aWUgZnVuY3RpZSBzY2hhdHRlbiBkb29yIGdlYnJ1aWsgdGUgbWFrZW4gdmFuIGRlIGVtcGlyaXNjaGUgY3VtdWxhdGlldmUgZGlzdHJpYnV0aWUgZnVuY3RpZS4KICAgIC0gRWxrZSBvYnNlcnZhdGllIHdlcmQgw6nDqW4ga2VlciBnZW9ic2VydmVlcmQgaW4gaGV0IHN0YWFsLgogICAgLSBEdXMgZW1waXJpc2NoZSBjdW11bGF0aWV2ZSBkaXN0cmlidXRpZSBmdW5jdGllIHZhbiBoZXQgc3RhYWwgaXMgZWVuIGRpc2NyZXRlIGRpc3RyaWJ1dGllIG1ldCBwcm9iYWJpbGl0ZWl0IDEvbiBvcCBlbGtlIG9ic2VydmF0aWUuCiAgICAtIERlIGVtcGlyaXNjaGUgY3VtdWxhdGlldmUgZGlzdHJpYnV0aWUgZnVuY3RpZSAoRUNERikgaXMgZ2VnZXZlbiBkb29yCiAgICAkJEVDREYoeCkgPSBcc3VtXGxpbWl0c197eF9pIFxsZXEgeH0gXGZyYWN7MX17bn0gPSBcZnJhY3tcIyAoeF9pIFxsZXEgeCl9e259JCQKCmBgYHtyfQpOSEFORVMgJT4lCiAgZmlsdGVyKEdlbmRlcj09ImZlbWFsZSImIWlzLm5hKEhlaWdodCkmQWdlPjE4KSAlPiUKICBnZ3Bsb3QoYWVzKHg9SGVpZ2h0KSkgKwogIHN0YXRfZWNkZigpCmBgYAoKV2Uga3VubmVuIGRlIGVtcGlzY2hlIGN1bXVsYXRpZXZlIGRpc3RyaWJ1dGllIGZ1bmN0aWUgZ2VicnVpa2VuIG9tIGthbnNlbiB0ZSBiZXJla2VuZW4uCldhdCBpcyBkZSBrYW5zIGRhdCBlZW4gdnJvdXcga2xlaW5lciBpcyBkYW4gMTUwIGNtLgoKYGBge3J9CmVjZGZGZW0gPC0gTkhBTkVTICU+JQogIGZpbHRlcihHZW5kZXI9PSJmZW1hbGUiJiFpcy5uYShIZWlnaHQpJkFnZT4xOCkgJT4lCiAgcHVsbCgiSGVpZ2h0IikgJT4lCiAgZWNkZgplY2RmRmVtKDE1MCkKYGBgCgogICAgLSBXZSBpbGx1c3RyZXJlbiBkaXQgb29rIHZvb3IgZWVuIHN0ZWVrcHJvZWYgdmFuIGdyb290dGUgMTAKCmBgYHtyfQpzZXQuc2VlZCg1MDIpCmZlbTEwPC0gTkhBTkVTICU+JQogIGZpbHRlcihHZW5kZXI9PSJmZW1hbGUiJiFpcy5uYShIZWlnaHQpJkFnZT4xOCkgJT4lCiAgc2FtcGxlX24oc2l6ZT0xMCkKCmZlbTEwICU+JQogIGdncGxvdChhZXMoeD1IZWlnaHQpKSArCiAgc3RhdF9lY2RmKCkKYGBgCgpgYGB7cn0KZWNkZkZlbTEwIDwtIGZlbTEwICU+JQogIHB1bGwoSGVpZ2h0KSAlPiUKICBlY2RmCmVjZGZGZW0xMCgxNTApCmBgYAoKLSBNZXJrIG9wIGRhdCBkaWUga2FucyBuaWV0IGdvZWQgd29yZHQgZ2VzY2hhdCBvLmIudi4gZGUgc3RlZWtwcm9lZi4KCi0gTWVyayBvb2sgb3AgZGF0IHdlIGRpZSBrYW5zIG9vayBoYWRkZW4ga3VubmVuIHNjaGF0dGVuIGRvb3IgdGUgYmVyZWtlbmVuIGhvZXZlZWwgbGVuZ3RlbWV0aW5nZW4gZXIgbGFnZXIgemlqbiBkYW4gMTUwLgoKYGBge3J9Ck5IQU5FUyAlPiUKICBmaWx0ZXIoR2VuZGVyPT0iZmVtYWxlIiYhaXMubmEoSGVpZ2h0KSZBZ2U+MTgpICU+JSBjb3VudChIZWlnaHQgPD0xNTApICU+JQogIG11dGF0ZShwcm9iPW4vc3VtKG4pKQoKZWNkZkZlbSgxNTApCmBgYAoKYGBge3J9CmZlbTEwICU+JQogIGNvdW50KEhlaWdodCA8PTE1MCkgJT4lCiAgbXV0YXRlKHByb2I9bi9zdW0obikpCgplY2RmRmVtMTAoMTUwKQpgYGAKCi0tLQoKIyMgTm9ybWFsZSBiZW5hZGVyaW5nCgotIEluIGRlIGludHJvZHVjdGllIHphZ2VuIHdlIGRhdCBkZSBsZW5ndGUgbWV0aW5nZW4gZWVuIG1vb2llIGtsb2t2b3JtIGhhZGRlbi4KCi0gV2Uga3VubmVuIGR1cyBhYW5uZW1lbiBkYXQgZGUgbWV0aW5nZW4gYXBwcm94aW1hdGllZiBub3JtYWFsIHZlcmRlZWxkIHppam4uCgoKLSBXZSBrdW5uZW4gZGUgdmVyZGVsaW5nIHZhbiBkZSBsZW5ndGUgbWV0aW5nZW4gb29rIGJlbmFkZXJlbiBkLm0udi4gZWVuIG5vcm1hbGUgZGlzdHJpYnV0aW9uLgoKLSBXZSBtb2V0ZW4gaGllcnZvb3IgZW5rZWwgdHdlZSBwYXJhbWV0ZXJzIHNjaGF0dGVuOgogICAgLSBnZW1pZGRlbGRlIHZpYSBzdGVla3Byb2VmZ2VtaWRkZWxkZSAoJFxoYXRcbXU9XGJhciB4JCkKICAgIC0gdmFyaWFudGllIHZpYSBzdGVla3Byb2VmdmFyaWFudGllICgkXGhhdHtcc2lnbWF9XjI9IHNeMiQpIG9mIGRlIHN0YW5kYWFyZGFmd2lqa2luZyBkLm0udi4gc3RlZWtwcm9lZiBzdGFuZGFhcmRkZXZpYXRpZSAoJFxoYXRcc2lnbWE9cyQpLgoKCmBgYHtyfQpIZWlnaHRTdW0gPC0gTkhBTkVTICU+JQogIGZpbHRlcihHZW5kZXI9PSJmZW1hbGUiJiFpcy5uYShIZWlnaHQpJkFnZT4xOCkgJT4lCiAgc3VtbWFyaXplKG1lYW49bWVhbihIZWlnaHQpLHNkPXNkKEhlaWdodCkpCkhlaWdodFN1bQpgYGAKCldlIHppZW4gZGF0IGRlIGJlbmFkZXJpbmcgZ29lZCB3ZXJrdDoKCmBgYHtyfQpOSEFORVMgJT4lCiAgZmlsdGVyKEdlbmRlcj09ImZlbWFsZSImIWlzLm5hKEhlaWdodCkmQWdlPjE4KSAlPiUKICBnZ3Bsb3QoYWVzKHg9SGVpZ2h0KSkgKwogIGdlb21faGlzdG9ncmFtKGFlcyh5PS4uZGVuc2l0eS4uLCBmaWxsPS4uY291bnQuLikpICsKICB4bGFiKCJMZW5ndGUgKGNtKSIpICsKICBzdGF0X2Z1bmN0aW9uKAogICAgZnVuPWRub3JtLAogICAgY29sb3I9InJlZCIsCiAgICBhcmdzPWxpc3QoCiAgICAgIG1lYW49SGVpZ2h0U3VtJG1lYW5bMV0sCiAgICAgIHNkPUhlaWdodFN1bSRzZFsxXQogICAgICApCiAgICApCmBgYAoKCi0gV2UgZG9lbiBudSBoZXR6ZWxmZGUgb3AgYmFzaXMgdmFuIGRlIHN0ZWVrcHJvZWYgbWV0IGRlIDEwIHZyb3V3ZW4uCgpgYGB7cn0KSGVpZ2h0U3VtMTAgPC0gZmVtMTAgJT4lCiAgc3VtbWFyaXplKG1lYW49bWVhbihIZWlnaHQpLHNkPXNkKEhlaWdodCkpCgpIZWlnaHRTdW0xMApgYGAKCmBgYHtyfQpmZW0xMCAlPiUKICBnZ3Bsb3QoYWVzKHg9SGVpZ2h0KSkgKwogIGdlb21faGlzdG9ncmFtKGFlcyh5PS4uZGVuc2l0eS4uLCBmaWxsPS4uY291bnQuLiksYmlucz0xMCkgKwogIHhsYWIoIkxlbmd0ZSAoY20pIikgKwogIHN0YXRfZnVuY3Rpb24oCiAgICBmdW49ZG5vcm0sCiAgICBjb2xvcj0icmVkIiwKICAgIGFyZ3M9bGlzdCgKICAgICAgbWVhbj1IZWlnaHRTdW0xMCRtZWFuWzFdLAogICAgICBzZD1IZWlnaHRTdW0xMCRzZFsxXQogICAgICApCiAgICApICsKICB4bGltKDEzMCwxOTApCmBgYAoKLSBXZSBrdW5uZW4gZGUgbm9ybWFsZSBiZW5hZGVyaW5nIG51IG9vayBnZWJydWlrZW4gb20gZGUga2FucyB0ZSBiZXJla2VuZW4gZGF0IGVlbiB2cm91dyBrbGVpbmVyIGlzIGRhbiAxNTAgY206IFByKFggPD0gMTUwKS4KCi0gV2UgZG9lbiBkaXQgb3AgYmFzaXMgdmFuIGRlIHZvbGxlZGlnZSBzdGVla3Byb2VmIGVuIHZlcmdlbGlqa2VuIGRpdCB1aXQgd2F0IHdlIGJla29tZW4gbWV0IGRlIEVDREYuICAKCmBgYHtyfQpwbm9ybSgxNTAsSGVpZ2h0U3VtJG1lYW5bMV0sSGVpZ2h0U3VtJHNkWzFdKQplY2RmRmVtKDE1MCkKYGBgCgotIE9wIGJhc2lzIHZhbiBkZSBrbGVpbmUgc3RlZWtwcm9lZjoKCgpgYGB7cn0KcG5vcm0oMTUwLEhlaWdodFN1bTEwJG1lYW5bMV0sSGVpZ2h0U3VtMTAkc2RbMV0pCmVjZGZGZW0xMCgxNTApCmBgYAoKLSBWb29yIGtsZWluZSBzdGVla3Byb2VmIGlzIGdlc2NoYXR0ZSBrYW5zIG8uYi52LiBlbXBpcmlzY2hlIGRpc3RyaWJ1dGllIHZlZWwgbWluZGVyIG5hdXdrZXVyaWcuCgotIEt3YW50aWVsZW4gZ2VzY2hhdCBvLmIudi4ga2xlaW5lIHN0ZWVrcHJvZWYgemlqbiBpbW1lcnMgdnJpaiBvbnpla2VyLiBaZSBnZWJydWlrZW4gaW1tZXJzIG1hYXIgZWVuIGZyYWN0aWUgdmFuIGRlIGRhdGEuICAgCgotIERlIHNjaGF0dGluZyBvLmIudi4gZGUgbm9ybWFsZSB2ZXJkZWxpbmcgbGFhdCB0b2Ugb20gYWxsZSBkYXRhIHRlIGdlYnJ1aWtlbiB2b29yIGhldCBzY2hhdHRlbiB2YW4gZGUgbW9kZWwgcGFyYW1ldGVycy4KCi0tLQoKIyMgUmVmZXJlbnRpZSBpbnRlcnZhbGxlbgoKLSBOb3JtYWxlIHdhYXJkZW4gdm9vciBkZSBsZW5ndGUga3VubmVuIHdvcmRlbiBiZWtvbWVuIGRvb3IgZ2VicnVpayB0ZSBtYWtlbiB2YW4gZWVuIHJlZmVyZW50aWUgaW50ZXJ2YWwuCgotIFR5cGlzY2ggd29yZHQgZWVuIDk1JSByZWZlcmVudGllIGludGVydmFsIGdlYnJ1aWt0IHpvZGF0IHdlIHZvb3IgOTUlIHZhbiBkZSBzdWJqZWN0ZW4gaW4gZGUgcG9wdWxhdGllIHZlcndhY2h0ZW4gZGF0IHplIGVlbiBrYXJha3RlcmlzdGllayBoZWJiZW4gZGllIGluIGhldCByZWZlcmVudGllIGludGVydmFsIGxpZ3QuCgotIFdlIGt1bm5lbiBkYXQgb3BuaWV1dyBvcCBiYXNpcyB2YW4gZGUgZW1waXJpc2NoZSBkaXN0cmlidXRpZS4KCi0gV2UgbW9ldGVuIGhpZXJ2b29yICRcaGF0e0Z9KHhfezIuNVwlfSk9MC4wMjUkIGVuICRcaGF0e0Z9KHhfezk3LjVcJX0pPTAuOTc1JCBiZXJla2VuZW4gem9kYXQgOTUlIHZhbiBkZSBvYnNlcnZhdGllcyBpbiBkZSBzdGVla3Byb2VmIHZhbGxlbiBpbiBoZXQgaW50ZXJ2YWwgW3hfezIuNSV9LHhfezk3LjUlfV0uCgotIERhdCBrYW4gbWV0IGRlIGBxdWFudGlsZWAgZnVuY3RpZS4KCi0gR3JvdGUgc3RlZWtwcm9lZgoKYGBge3J9Ck5IQU5FUyAlPiUKICBmaWx0ZXIoR2VuZGVyPT0iZmVtYWxlIiYhaXMubmEoSGVpZ2h0KSZBZ2U+MTgpICU+JQogIHB1bGwoSGVpZ2h0KSAlPiUKICBxdWFudGlsZShwcm9iPWMoMC4wMjUsMC45NzUpKQpgYGAKCi0gT3AgYmFzaXMgdmFuIGRlIGdyb3RlIHN0ZWVrcHJvZWYgc2NoYXR0ZW4gd2UgZGF0IDk1JSB2YW4gZGUgdnJvdXdlbiBpbiBkZSBwb3B1bGF0aWUgZWVuIGxlbmd0ZSBoZWVmdCBkaWUgbGlndCBpbiBoZXQgaW50ZXJ2YWwgW2ByIE5IQU5FUyAlPiUKICBmaWx0ZXIoR2VuZGVyPT0iZmVtYWxlIiYhaXMubmEoSGVpZ2h0KSZBZ2U+MTgpICU+JQogIHB1bGwoSGVpZ2h0KSAlPiUKICBxdWFudGlsZShwcm9iPWMoMC4wMjUsMC45NzUpKWBdLgoKLSBLbGVpbmUgc3RlZWtwcm9lZgoKYGBge3J9CmZlbTEwICU+JQogIHB1bGwoSGVpZ2h0KSAlPiUKICBxdWFudGlsZShwcm9iPWMoMC4wMjUsMC45NzUpKQpgYGAKCi0gRGl0IGludGVydmFsIG8uYi52LiBkZSBrbGVpbmUgc3RlZWtwcm9lZiBpcyBlZW4gcnV3ZSBiZW5hZGVyaW5nLgotIFdlIGhlYmJlbiBpbW1lcnMgbmlldCB2b2xkb2VuZGUgb2JzZXJ2YXRpZXMgb20gZWVuIGdvZWRlIGJlbmFkZXJpbmcgdGUgaGViYmVuIHZvb3IgZXh0cmVtZSBxdWFudGllbGVuLgoKIyMjIE5vcm1hbGUgYmVuYWRlcmluZwoKLSBXZSBrdW5uZW4gZGUgZnVuY3RpZSBxbm9ybSBnZWJydWlrZW4gb20gcXVhbnRpZWxlbiB0ZSBiZXJla2VuZW4gdmFuIGRlIG5vcm1hbGUgZGlzdHJpYnV0aWUuCgotIFdlIHdldGVuIGRhdCBlZW4gOTUlIHJlZmVyZW50aWUgaW50ZXJ2YWwgb25nZXZlZXIgYmlubmVuIHR3ZWUgc3RhbmRhYXJkIGRldmlhdGllcyByb25kIGhldCBnZW1pZGRlbGRlIGxpZ3QuCgoKLSBHcm90ZSBzdGVla3Byb2VmCmBgYHtyfQpxbm9ybSgwLjAyNSxtZWFuPUhlaWdodFN1bSRtZWFuLHNkPUhlaWdodFN1bSRzZCkKSGVpZ2h0U3VtJG1lYW4gLSAyICogSGVpZ2h0U3VtJHNkCnFub3JtKDAuOTc1LG1lYW49SGVpZ2h0U3VtJG1lYW4sc2Q9SGVpZ2h0U3VtJHNkKQpIZWlnaHRTdW0kbWVhbiArIDIgKiBIZWlnaHRTdW0kc2QKYGBgCgotIEtsZWluZSBzdGVla3Byb2VmCgpgYGB7cn0KcW5vcm0oMC4wMjUsbWVhbj1IZWlnaHRTdW0xMCRtZWFuLHNkPUhlaWdodFN1bTEwJHNkKQpxbm9ybSgwLjk3NSxtZWFuPUhlaWdodFN1bTEwJG1lYW4sc2Q9SGVpZ2h0U3VtMTAkc2QpCmBgYAoKLS0tCgojIyBDb25jbHVzaW9ucwoKLSBWb29yIGRlIGdyb3RlIHN0ZWVrcHJvZWYgZ2V2ZW4gZGUgZW1waXJpc2NoZSBkaXN0cmlidXRpZSBlbiBkZSBub3JtYWxlIGJlbmFkZXJpbmcgdmVyZ2VsaWprYmFyZSByZXN1bHRhdGVuLgoKLSBWb29yIGRlIGtsZWluZSBzdGVla3Byb2VmIHdlcmt0IGRlIG5vcm1hbGUgYmVuYWRlcmluZyBiZXRlciBkYW4gZGUgZW1waXJpc2NoZSBkaXN0cmlidXRpZS4KCiAgICAtIFdlIGtpamtlbiBpbW1lcnMgbmFhciBleHRyZW1lIHF1YW50aWVsZW4gMi41JSBlbiA5Ny41JS4KICAgIC0gRXIgemlqbiBpbmRlcmRhYWQgd2VpbmlnIGdlZ2V2ZW5zIGluIGRlIHN0ZWVrcHJvZWYgZGllIHRvZWxhdGVuIG9tIGRlemUgcXVhbnRpZWxlbiBkaXJlY3QgdGUgc2NoYXR0ZW4uCiAgICAtIE1ldCBkZSBub3JtYWxlIGJlbmFkZXJpbmcga3VubmVuIHdlIGFsbGUgZGF0YSBnZWJydWlrZW4gb20gaGV0IGdlbWlkZGVsZGUgZW4gZGUgc3RhbmRhYXJkZGV2aWF0aWUgdGUgc2NoYXR0ZW4uCiAgICAtIEFscyBkZSBhYW5uYW1lIHZhbiBub3JtYWxpdGVpdCBnZWxkdCBkYW4ga3JpamdlbiB3ZSBiZXRlcmUgc2NoYXR0aW5nZW4gdm9vciBkZXplIGt3YW50aWVsZW4uICAKCi0tLQoKIyBTdGF0aXN0aWVrZW4KCi0gRm9ybXVsZSBkaWUgd2UgZ2VicnVpa2VuIG9tIHBhcmFtZXRlcnMgdmFuIGRlIGRpc3RyaWJ1dGllIGluIGRlIHBvcHVsYXRpZSB0ZSBzY2hhdHRlbiBvcCBiYXNpcyB2YW4gZWVuIHN0ZWVrcHJvZWYuIFdlIHJlZmVyZXJlbiBoaWVybmFhciBhbHMgc3RhdGlzdGlla2VuIG9mIHNjaGF0dGVycy4KCi0gSGV0IG51bWVyaWVrZSByZXN1bHRhYXQgZGllIHdvcmR0IGJla29tZW4gZG9vciBkZXplIGZvcm11bGVzIHRlIGV2YWx1ZXJlbiB3b3JkZW4gb29rIHN0YXRpc3RpZWtlbiBvZiBzY2hhdHRpbmdlbiBnZW5vZW1kLgoKLSBPbmRlcnpvZWtlcnMgd2Vuc2VuIG9uZ2VrZW5kZSBwYXJhbWV0ZXJzIHZhbiBkZSBkaXN0cmlidXRpZSBpbiBkZSBwb3B1bGF0aWUgdGUga2VubmVuIGVuIHNjaGF0dGVuIGRlemUgby5iLnYuIGRlIHN0ZWVrcHJvZWYuCgotIE9tZGF0IHdlIHN0YXRpc3RpZWtlbiBiZXJla2VuZW4gby5iLnYuIGRlIG9ic2VydmF0aWVzIGluIGVlbiBzdGVla3Byb2VmLCB2YXJpw6tyZW4gc3RhdGlzdGlla2VuIG9vayB2YW4gc3RlZWtwcm9lZiB0b3Qgc3RlZWtwcm9lZi4gSGV0IHppam4gZHVzIG9vayByYW5kb20gdmFyaWFiZWxlbiBlbiB3ZSBub3RlcmVuIHplIGR1cyBvb2sgbWV0IGhvb2ZkbGV0dGVycyAoYi52LiAkXGJhciBYJCB2b29yIGhldCBzdGVla3Byb2VmZ2VtaWRkZWxkZSBlbiAkU14yJCB2b29yIGRlIHN0ZWVrcHJvZWZ2YXJpYW50aWUpLgoKLSBBbHMgd2UgZGF0YSBhbmFseXNlcmVuIG1vZXRlbiB3ZSBkdXMgbmFkZW5rZW4gb3ZlciBob2UgZGUgc3RhdGlzdGlla2VuIHZhcmnDq3JlbiB2YW4gc3RlZWtwcm9lZiB0b3Qgc3RlZWtwcm9lZi4KCi0gQWxzIGVlbiBzdGF0aXN0aWVrIHZlcndpanN0IG5hYXIgZWVuIG51bWVyaWVrZSB3YWFyZGUgZGllIHdlcmQgZ2VyZWFsaXNlZXJkIGluIGVlbiBiZXBhYWxkZSBzdGVla3Byb2VmIGRhbiBub3RlcmVuIHdlIGRlemUgbWV0IGVlbiBrbGVpbmUgbGV0dGVyOiAkXGJhciB4JCBlbiAkc14yJC4KCi0tLQoKIyBDb252ZW50aWUKCi0gKipQb3B1bGF0aWVwYXJhbWV0ZXJzKiogbmVtZW4gdmFzdGUgd2FhcmRlbiBhYW4gbWFhciB6aWpuIG1lZXN0YWwgb25nZWtlbmQgJFxyaWdodGFycm93JCAqKkdyaWVrc2Ugc3ltYm9sZW4qKi4KXHZzcGFjZXsxNXB0fQoKLSAqKlN0YXRpc3RpZWtlbioqIHdhYXJtZWUgd2UgZGV6ZSBvbmdla2VuZGUgcGFyYW1ldGVycyBzY2hhdHRlbiBvLmIudi4gZWVuIHN0ZWVrcHJvZWYgICRccmlnaHRhcnJvdyQgICoqbGV0dGVycyoqLgpcdnNwYWNlezE1cHR9CgotIFZiIE5vcm1hbGUgdmVyZGVsaW5nCgp8IFBvcHVsYXRpZSB8IFN0ZWVrcHJvZWZ8CnwgOi0tLTogfCA6LS0tOiB8CnwgJFxtdSQgfCAkXGJhciBYJCB8CnwgJFxzaWdtYV4yJCB8ICRTXjIkIHwKCgoKLS0tCgojIFtIb21lXShodHRwczovL3N0YXRvbWljcy5naXRodWIuaW8vc2JjMjApIHstfQo=