Modelle
\[\large X_{i}=\sigma_{i}+\beta_{i} \cdot \theta+\varepsilon_{i}\]
Wenn ein strengeres Modell gilt, dann gilt immer auch gleichzeitig jedes weniger strenge Modell. Andersrum gilt dies nicht.
Paralleles Modell
Annahmen:
\[\large {\color{green} {\tau_{i}=\theta }} \text{ und somit } {\color{green} {X_{i}=\theta+\varepsilon_{i}}} \text{ für alle Items } i\]
\[\large \operatorname{VAR}\left(\varepsilon_{i}\right)=\operatorname{VAR}\left(\varepsilon_{j}\right) \text{ für alle Itempaare } i, j\]
\[\large \operatorname{COV}\left(\varepsilon_{i}, \varepsilon_{j}\right)=0 \text{ für alle Itempaare } i, j\]
Folgerungen:
\[\large \tau_{i \text { Person }}=\theta_{\text {Person }}=\tau_{j \text { Person }}\]
\[\large \beta_{i} = 1\]
\[\large \sigma_{i} = 0\] \[\large \operatorname{COV}\left(X_{i}, X_{j}\right)=\operatorname{VAR}\left(\tau_{i}\right)\]
Essentiell paralleles Modell
Annahmen:
\[\large {\color{green} {\tau_{i}=\sigma_{i}+\theta}} \text{ und somit } {\color{green} {X_{i}=\sigma_{i}+\theta+\varepsilon_{i}}} \text{ für alle Items } i\]
\[\large \operatorname{VAR}\left(\varepsilon_{i}\right)=\operatorname{Var}\left(\varepsilon_{j}\right) \text{ für alle Itempaare } i, j\] \[\large \operatorname{COV}\left(\varepsilon_{i}, \varepsilon_{j}\right)=0 \text{ für alle Itempaare } i, j\] Festlegungen:
\[\large E(\theta)=0\]
Folgerungen:
\[\large \tau_{i \text { Person }}=\sigma_{i}+\theta_{\text {Person }}\]
\[\large \beta_{i} = 1\]
\[\large E(X_{i})=\sigma_{i}\] \[\large \operatorname{COV}\left(X_{i}, X_{j}\right)=\operatorname{VAR}\left(\tau_{i}\right)\]
tau-äquivalentes Modell
Annahmen:
\[\large {\color{green} {\tau_{i}=\theta }} \text{ und somit } {\color{green} {X_{i}=\theta+\varepsilon_{i}}} \text{ für alle Items } i\]
\[\large \operatorname{COV}\left(\varepsilon_{i}, \varepsilon_{j}\right)=0 \text{ für alle Itempaare } i, j\] Folgerungen:
\[\large \tau_{i \text { Person }}=\theta_{\text {Person }}=\tau_{j \text { Person }}\]
\[\large \beta_{i} = 1\]
\[\large \sigma_{i} = 0\] \[\large \operatorname{COV}\left(X_{i}, X_{j}\right)=\operatorname{VAR}\left(\tau_{i}\right)\]
Essentiell tau-äquivalentes Modell
Annahmen: \[\large {\color{green} {\tau_{i}=\sigma_{i}+\theta}} \text{ und somit } {\color{green} {X_{i}=\sigma_{i}+\theta+\varepsilon_{i}}} \text{ für alle Items } i\]
\[\large \operatorname{COV}\left(\varepsilon_{i}, \varepsilon_{j}\right)=0 \text{ für alle Itempaare } i, j\] Festlegungen:
\[\large E(\theta)=0\]
Folgerungen:
\[\large \tau_{i \text { Person }}=\sigma_{i}+\theta_{\text {Person }}\]
\[\large \beta_{i} = 1\]
\[\large \operatorname{COV}\left(X_{i}, X_{j}\right)=\operatorname{VAR}\left(\tau_{i}\right)\]
tau-kongenerisches Modell
Annahmen:
\[\large {\color{green} {\tau_{i}=\sigma_{i}+\beta_{i} \cdot \theta}} \text { und somit } {\color{green} {X_{i}=\sigma_{i}+\beta_{i} \cdot \theta+\varepsilon_{i}}} \text { für alle Items } i\]
\[\large \operatorname{COV}\left(\varepsilon_{i}, \varepsilon_{j}\right)=0 \text{ für alle Itempaare } i, j\] Festlegungen:
\[\large E(\theta)=0\]
\[\large \operatorname{VAR}(\theta)=1\] Folgerungen:
\[\large E(X_{i})=\sigma_{i}\]
Mehrdimensionales tau-kongenerisches Modell
Annahmen:
\[ \large \begin{gathered} \tau_{i}=\sigma_{i}+\beta_{i 1} \cdot \theta_{1}+\beta_{i 2} \cdot \theta_{2}+\cdots+\beta_{i q} \cdot \theta_{q} \text { und somit } \\ X_{i}=\sigma_{i}+\beta_{i 1} \cdot \theta_{1}+\beta_{i 2} \cdot \theta_{2}+\cdots+\beta_{i q} \cdot \theta_{q}+\varepsilon_{i} \text { für alle Items } i \\ \operatorname{COV}\left(\varepsilon_{i}, \varepsilon_{j}\right)=0 \text { für alle Itempaare } i, j \end{gathered} \]
Festlegungen:
\[\large E(\theta_{l})=0\]
\[\large \operatorname{VAR}(\theta_{l})=1\] \[\large \operatorname{COV}\left(\theta_{l}, \theta_{m}\right)=0 \text { für alle latenten Variablen } l \neq m\]
Folgerungen:
\[\large E\left(X_{i}\right)=\sigma_{i}\] z-Standardisierung:
\[\large Z_{i}=\frac{X_{i}-E\left(X_{i}\right)}{\sqrt{\operatorname{VAR}\left(X_{i}\right)}}=\frac{X_{i}-\sigma_{i}}{\sqrt{\operatorname{VAR}\left(X_{i}\right)}}\]
item_answers = c(1, 4)
vars_items = c(4, 3)
sigmas = c(5, 1)
(item_answers - sigmas)/sqrt(vars_items)
\[\large Z_{i}=\beta_{z i 1} \cdot \theta_{1}+\beta_{z i 2} \cdot \theta_{2}+\cdots+\beta_{z i q} \cdot \theta_{q}+\varepsilon_{z i} \text { für alle Items } i\] \[\large \boldsymbol{\beta}_{z i q} = \frac{\beta_{i q}}{\sqrt{V A R\left(X_{i}\right)}}\]
beta = 1
var_item = 2
beta/sqrt(var_item)
Skalierung
Ein psychologischer Test gilt als skalierbar, wenn die Zuordnung der Messwerte zu den Personen auf der Basis eines empirisch nachgewiesenen testtheoretischen Modells geschieht.
- \(H_{0}\) : Die Folgerungen aus dem Modell sind erfüllt
- \(H_{1}\) : Mindestens eine Folgerung aus dem Modell ist nicht erfüllt
Paralleles Modell
Zu überprüfende Hypothesen:
\[\large \begin{gathered} E\left(X_{i}\right)=E\left(X_{j}\right) \text { für alle Items } i, j \\ \operatorname{VAR}\left(X_{i}\right)=\operatorname{VAR}\left(X_{j}\right) \text { für alle Items } i, j \\ \operatorname{COV}\left(X_{i}, X_{j}\right)=\operatorname{COV}\left(X_{o}, X_{u}\right) \text { für alle Itempaare } i, j \text { und } o, u \end{gathered}\]
Essentiell paralleles Modell
Zu überprüfende Hypothesen:
\[\large \begin{gathered} \operatorname{VAR}\left(X_{i}\right)=\operatorname{VAR}\left(X_{j}\right) \text { für alle Items } i, j \\ \operatorname{COV}\left(X_{i}, X_{j}\right)=\operatorname{COV}\left(X_{o}, X_{u}\right) \text { für alle Itempaare } i, j \text { und } o, u \end{gathered} \]
tau-äquivalentes Modell
Zu überprüfende Hypothesen:
\[\large \begin{gathered} E\left(X_{i}\right)=E\left(X_{j}\right) \text { für alle Items } i, j \\ \operatorname{COV}\left(X_{i}, X_{j}\right)=\operatorname{COV}\left(X_{o}, X_{u}\right) \text { für alle Itempaare } i, j \text { und } o, u \end{gathered} \]
Essentiell tau-äquivalentes Modell
Zu überprüfende Hypothesen:
\[\large \operatorname{COV}\left(X_{i}, X_{j}\right)=\operatorname{COV}\left(X_{o}, X_{u}\right) \text { für alle Itempaare } i, j \text { und o, } u \]
tau-kongenerisches Modell
Zu überprüfende Hypothesen:
\[\large \operatorname{COV}\left(X_{i}, X_{j}\right)=\beta_{i} \cdot \beta_{j} \text { für alle Itempaare } i, j\]
Mehrdimensionales tau-kongenerisches Modell
Zu überprüfende Hypothesen:
\[\large \operatorname{COV}\left(X_{i}, X_{j}\right)=\sum_{l=1}^{q} \beta_{i l} \cdot \beta_{j l} \text { für alle Itempaare } i, j\]
Parameterschätzung
Einzelfalldiagnostik
\[\large X_{i P e r s o n}=\sigma_{i}+\beta_{i} \cdot \theta_{P e r s o n}+\varepsilon_{i P e r s o n} \]
\(X_{i P e r s o n}\): Zufallsvariable, die für die Itemantwort der festen Person steht
\(\theta_{\text {Person }}\): unbekannte Konstante
\(\sigma_{i}\) und \(\beta_{i}\): Parameter des Modells, für die schon Schätzwerte aus der Normstichprobe vorliegen
zwischen \(\varepsilon_{i}\) auf der Ebene der zufälligen Person und \(\varepsilon_{i P e r s o n}\) auf der Ebene der festen Person gibt es zwar mathematisch gesehen einen geringfügigen Unterschied, der für uns jedoch nicht relevant ist
Standardmessfehler
\[ \large \operatorname{SE}\left(\hat{\theta}_{\text {Person }}\right)=\sqrt{V A R\left(\hat{\theta}_{\text {Person }}\right)}\]
Konfidenzintervall
\[\large I\left(X_{1 \text { Person }}, X_{2 \text { Person }}, \ldots, X_{k \text { Person }}\right)=\left[\hat{\theta}_{\text {Person }} \pm Z_{1-\frac{\alpha}{2}} \cdot S E\left(\hat{\theta}_{\text {Person }}\right)\right]\]
Normwerte
Z-Werte | 0 | 1 | |
IQ-Werte | 100 | 15 | |
Standardwerte | 100 | 10 | |
T-Werte | 50 | 10 | |
Stanine | 5 | 2 | |
KI, falls man Punktschätzwerte in Normwerte umrechnet: \[\large \left[\hat{\theta}_{\text {Person,Norm }} \pm z_{1-\frac{\alpha}{2}} \cdot \widehat{S E}\left(\hat{\theta}_{\text {Person,Norm }}\right)\right]\] Besser: Normalisieren der Werte (tau-kongenerisch sind bereits normiert), dann Werte umrechnen:
\[\large \hat{\theta}_{\text {Person, } z-\text { Wert }}=\frac{\hat{\theta}_{\text {Person,Wert }}-E(\theta)}{\sqrt{\operatorname{VAR}(\theta)}}\]
\[\large E\left(\theta_{z}\right)=0 \text { und } V A R\left(\theta_{z}\right)=1\]
est_person = 20
est_theta = 10
var_theta = 5
(est_person-est_theta)/sqrt(var_theta)
\[\large \hat{\theta}_{\text {Person,Normwert }}=E\left(\theta_{\text {Norm }}\right)+\operatorname{STD}\left(\theta_{\text {Norm }}\right) \cdot \hat{\theta}_{\text {Person, } z-\text { Wert }}\]
norm_mean = 100
norm_std = 15
z_theta_pers = 0.5
norm_mean + norm_std * z_theta_pers
Schätzung Standardmessfehler mit unvollständigen Informationen:
\[\large \widehat{S E}\left(\hat{\theta}_{\text {PersonNorm }}\right)_{\text {Wert }}=\sqrt{\operatorname{VAR}\left(\theta_{\text {Norm }}\right) \cdot(1-\operatorname{rel}(\bar{x}))}\] Prozentränge (% der Personen, die einen gleichen oder niedrigeren Wert auf der Latenten Variable haben):
z_theta_pers = 0.5
norm_mean = 100
norm_std = 15
pnorm(norm_mean + norm_std * z_theta_pers, mean=norm_mean, sd=norm_std)
Paralleles Modell
\[\large \hat{\theta}_{\text {Person }}=\frac{1}{k} \sum_{i=1}^{k} X_{i \text { Person }}\]
items_pers = c(70,50,60,50)
mean(items_pers)
\[\large \operatorname{SE}\left(\hat{\theta}_{\text {Person }}\right)=\sqrt{\frac{\operatorname{VAR}\left(\varepsilon_{i}\right)}{k}}\]
k = 4 # number of items
item_var_pers = 24.352 # "Variances: ", alle identisch
sqrt(item_var_pers/k)
# Konfidenzintervall
items_pers = c(70,50,60,50)
item_var_pers = 24.352 # "Variances: ", alle identisch
conf.level = 0.95
k = length(items_pers)
est_pers = mean(items_pers)
stderr_pers = sqrt(item_var_pers/k)
c = stderr_pers * qnorm(1-(1-conf.level)/2)
c(est_pers - c, est_pers + c)
# Gegebenes Konfidenzintervall -> Normwerte
lower_limit_pers = 12
higher_limit_pers = 14
est_theta = 10 # Intercepts: f Estimate
var_theta = 5 # Variances: f Estimate
norm_mean = 100
norm_std = 15
z_lower_limit_pers = (lower_limit_pers-est_theta)/sqrt(var_theta)
z_higher_limit_pers = (higher_limit_pers-est_theta)/sqrt(var_theta)
c(norm_mean + norm_std * z_lower_limit_pers, norm_mean + norm_std * z_higher_limit_pers)
Essentiell paralleles Modell
\[\large \hat{\theta}_{\text {Person }}=\frac{1}{k} \sum_{i=1}^{k} X_{i \text { Person }}-\frac{1}{k} \sum_{i=1}^{k} \sigma_{i}\]
items_pers = c(70,50,60,50)
sigmas = c(10, 30, 40, 5) # Intercepts:
mean(items_pers) - mean(sigmas)
\[\large S E\left(\hat{\theta}_{\text {Person }}\right)=\sqrt{\frac{V A R\left(\varepsilon_{i}\right)}{k}}\]
k = 4 # number of items
item_var_pers = 24.352 # "Variances: ", alle identisch
sqrt(item_var_pers/k)
# Konfidenzintervall
items_pers = c(70,50,60,50)
item_var_pers = 24.352 # "Variances: ", alle identisch
sigmas = c(10, 30, 40, 5) # Intercepts:
conf.level = 0.95
k = length(items_pers)
est_pers = mean(items_pers) - mean(sigmas)
stderr_pers = sqrt(item_var_pers/k)
c = stderr_pers * qnorm(1-(1-conf.level)/2)
c(est_pers - c, est_pers + c)
# Gegebenes Konfidenzintervall -> Normwerte
lower_limit_pers = -3
higher_limit_pers = 2
var_theta = 5 # Variances: f Estimate
norm_mean = 100
norm_std = 15
z_lower_limit_pers = (lower_limit_pers)/sqrt(var_theta)
z_higher_limit_pers = (higher_limit_pers)/sqrt(var_theta)
c(norm_mean + norm_std * z_lower_limit_pers, norm_mean + norm_std * z_higher_limit_pers)
Tau-äquivalentes Modell
\[ \large \hat{\theta}_{\text {Person }}=\frac{\sum_{i=1}^{k} \frac{X_{i P e r s o n}}{V A R\left(\varepsilon_{i}\right)}}{\sum_{i=1}^{k} \frac{1}{V A R\left(\varepsilon_{i}\right)}} \]
items_pers = c(5,4,5,4)
item_vars_pers = c(0.043, 0.495, 0.972, 0.080)
sum(items_pers/item_vars_pers)/sum(1/item_vars_pers)
\[\large S E\left(\hat{\theta}_{\text {Person }}\right)=\frac{1}{\sqrt{\sum_{i=1}^{k} \frac{1}{V A R\left(\varepsilon_{i}\right)}}}\]
item_vars_pers = c(0.043, 0.495, 0.972, 0.080)
1/sqrt(sum(1/item_vars_pers))
# Konfidenzintervall
items_pers = c(5,4,5,4)
item_vars_pers = c(0.043, 0.495, 0.972, 0.080) # "Variances: "
conf.level = 0.95
est_pers = sum(items_pers/item_vars_pers)/sum(1/item_vars_pers)
stderr_pers = 1/sqrt(sum(1/item_vars_pers))
c = stderr_pers * qnorm(1-(1-conf.level)/2)
c(est_pers - c, est_pers + c)
# Gegebenes Konfidenzintervall -> Normwerte
lower_limit_pers = 12
higher_limit_pers = 14
est_theta = 10 # Intercepts: f Estimate
var_theta = 5 # Variances: f Estimate
norm_mean = 100
norm_std = 15
z_lower_limit_pers = (lower_limit_pers-est_theta)/sqrt(var_theta)
z_higher_limit_pers = (higher_limit_pers-est_theta)/sqrt(var_theta)
c(norm_mean + norm_std * z_lower_limit_pers, norm_mean + norm_std * z_higher_limit_pers)
Essentiell tau-äquivalentes Modell
\[\large \hat{\theta}_{\text {Person }}=\frac{\sum_{i=1}^{k} \frac{X_{i P e r s o n}-\sigma_{i}}{V A R\left(\varepsilon_{i}\right)}}{\sum_{i=1}^{k} \frac{1}{V A R\left(\varepsilon_{i}\right)}}\]
items_pers = c(5,4,5,4)
item_vars_pers = c(0.043, 0.495, 0.972, 0.080) # "Variances: "
intercepts = c(1.091, 2.123, 2.618, 4.086) # Intercepts:
sum((items_pers-intercepts)/item_vars_pers)/sum(1/item_vars_pers)
\[\large \operatorname{SE}\left(\hat{\theta}_{\text {Person }}\right)=\frac{1}{\sqrt{\sum_{i=1}^{k} \frac{1}{V A R\left(\varepsilon_{i}\right)}}}\]
item_vars_pers = c(0.043, 0.495, 0.972, 0.080) # "Variances: "
1/sqrt(sum(1/item_vars_pers))
# Konfidenzintervall
items_pers = c(5,4,5,4)
item_vars_pers = c(0.043, 0.495, 0.972, 0.080) # "Variances: "
intercepts = c(1.091, 2.123, 2.618, 4.086) # Intercepts:
conf.level = 0.95
est_pers = sum((items_pers-intercepts)/item_vars_pers)/sum(1/item_vars_pers)
stderr_pers = 1/sqrt(sum(1/item_vars_pers))
c = stderr_pers * qnorm(1-(1-conf.level)/2)
c(est_pers - c, est_pers + c)
# Gegebenes Konfidenzintervall -> Normwerte
lower_limit_pers = -3
higher_limit_pers = 2
var_theta = 5 # Variances: f Estimate
norm_mean = 100
norm_std = 15
z_lower_limit_pers = (lower_limit_pers)/sqrt(var_theta)
z_higher_limit_pers = (higher_limit_pers)/sqrt(var_theta)
c(norm_mean + norm_std * z_lower_limit_pers, norm_mean + norm_std * z_higher_limit_pers)
Tau-kongenerisches Modell
\[\large Z_{i \text { Person }}=\frac{X_{i \text { Person }}-E\left(X_{i}\right)}{\sqrt{\operatorname{VAR}\left(X_{i}\right)}}=\frac{X_{i \text { Person }}-\sigma_{i}}{\sqrt{\operatorname{VAR}\left(X_{i}\right)}}\]
items_pers = c(3,1,3,2)
item_vars_pers = c(1, 1.1, 2, 1.2) # Nicht ablesbar aus Normstichprobe!
intercepts = c(1.033, 2.002, 2.495, 4.014) # Intercepts:
z_items_pers = (items_pers - intercepts)/sqrt(item_vars_pers)
\[\large \hat{\theta}_{\text {Person }}=\frac{\sum_{i=1}^{k} \frac{\beta_{z i} \cdot Z_{i P e r s o n}}{1-\beta_{z i}^{2}}}{\sum_{i=1}^{k} \frac{\beta_{z i}^{2}}{1-\beta_{z i}^{2}}}\]
items_pers = c(3,1,3,2)
item_vars_pers = c(1, 1.1, 2, 1.2) # Nicht ablesbar aus Normstichprobe!
intercepts = c(1.033, 2.002, 2.495, 4.014) # Intercepts:
beta_z = c(0.995, 0.576, 0.703, 0.981) # "Latent Variables: Std.all"
z_items_pers = (items_pers - intercepts)/sqrt(item_vars_pers)
sum((beta_z*z_items_pers)/(1-beta_z^2))/sum(beta_z^2/(1-beta_z^2))
\[\large S E\left(\hat{\theta}_{\text {Person }}\right)=\frac{1}{\sqrt{\sum_{i=1}^{k} \frac{\beta_{z i}^{2}}{1-\beta_{z i}^{2}}}}\]
items_pers = c(3,1,3,2)
item_vars_pers = c(1, 1.1, 2, 1.2) # Nicht ablesbar aus Normstichprobe!
intercepts = c(1.033, 2.002, 2.495, 4.014) # "Intercepts: "
beta_z = c(0.995, 0.576, 0.703, 0.981) # "Latent Variables: Std.all"
z_items_pers = (items_pers - intercepts)/sqrt(item_vars_pers)
1/sqrt(sum(beta_z^2/(1-beta_z^2)))
# Konfidenzintervall
items_pers = c(3,1,3,2)
item_vars_pers = c(1, 1.1, 2, 1.2) # Nicht ablesbar aus Normstichprobe!
intercepts = c(1.033, 2.002, 2.495, 4.014) # "Intercepts: "
beta_z = c(0.995, 0.576, 0.703, 0.981) # "Latent Variables: Std.all"
conf.level = 0.95
z_items_pers = (items_pers - intercepts)/sqrt(item_vars_pers)
est_pers = sum((beta_z*z_items_pers)/(1-beta_z^2))/sum(beta_z^2/(1-beta_z^2))
stderr_pers = 1/sqrt(sum(beta_z^2/(1-beta_z^2)))
c = stderr_pers * qnorm(1-(1-conf.level)/2)
c(est_pers - c, est_pers + c)
# Gegebenes Konfidenzintervall -> Normwerte
lower_limit_pers = 0.5 # Bereits Z standardisiert
higher_limit_pers = 1.0 # Bereits Z standardisiert
norm_mean = 100
norm_std = 15
c(norm_mean + norm_std * lower_limit_pers, norm_mean + norm_std * higher_limit_pers)
Mehrdimensionales tau-kongenerisches Modell
Einfachstruktur -> aufteilen und mehrere eindimensionale tau-kongenerische Modelle betrachten
Approximative Konfidenzintervalle
Wenn modellbasierte Konstuktion eines Konfidenzintervalls nicht möglich ist (Standardmessfehler und/oder Parameter nicht angegeben) Konfidenzintervalle hier deutlich breiter
\[\large S E\left(\hat{\theta}_{\text {Person }}\right)=\sqrt{\operatorname{VAR}(X) \cdot(1-\operatorname{Rel}(X))}\]
var_norm = 0.04
rel = 0.8
sqrt(var_norm*(1-rel))
Normorientierte Interpretation KI
\[\large I\left(X_{1 \text { Person }}, X_{2 \text { Person }}, \ldots, X_{k \text { Person }}\right)=[UP,OP]\]
Intervall der Werte, die als “Durchschnitt” zählen:
\[\large [E(\theta)-\sqrt{\operatorname{VAR}(\theta)}, E(\theta)+\sqrt{\operatorname{VAR}(\theta)} ] = [UD, OD] \]
\(OP < UD \implies\) unterdurchschnittlich
\(UP < UD < OP \land OP < OD \implies\) unterdurchschnittlich bis durchschnittlich
\(UD < UP \land OP < OD \implies\) durchschnittlich
\(UD < UP < OD \land OD < OP \implies\) durchschnittlich bis überdurchschnttlich
\(UD < UP \implies\) überdurchschnittlich
var_norm = 0.04
est_norm = 0.8
lower_limit_pers = 0.4
higher_limit_pers = 0.7
lower_limit_normavg = est_norm - sqrt(var_norm)
higher_limit_normavg = est_norm + sqrt(var_norm)
paste("Avg Intervall: [",lower_limit_normavg,";",higher_limit_normavg,"]")
if(higher_limit_pers < lower_limit_normavg){print("unterdurchschnittlich")
}else if(
lower_limit_pers < lower_limit_normavg &
lower_limit_normavg < higher_limit_pers &
higher_limit_pers < higher_limit_normavg
){print("unterdurchschnittlich bis durchschnittlich")
}else if(
lower_limit_normavg < lower_limit_pers &
higher_limit_pers < higher_limit_normavg
){print("durchschnittlich")
}else if(
lower_limit_normavg < lower_limit_pers &
lower_limit_pers < higher_limit_normavg &
higher_limit_normavg < higher_limit_pers
){print("durchschnittlich bis überdurchschnittlich")
} else if(higher_limit_normavg < lower_limit_pers){print("überdurchschnittlich")
} else {print("Check input for errors")}
Hypothesentest
\[\large Z \sim N(0,1)\]
Unterschied von vorgegebenem Wert
\[\large Z=\frac{\hat{\theta}_{\text {Person }}-\theta_{0}}{\operatorname{SE}\left(\hat{\theta}_{\text {Person }}\right)} \]
theta0 = 67.5
est_pers = 57.5
stderr_pers = 2.47
(est_pers-theta0)/stderr_pers
\[ \large \begin{aligned} &H_{0}: \theta_{\text {Person }}=\theta_{0} \\ &H_{1}: \theta_{\text {Person }} \neq \theta_{0} \end{aligned}\]
# Hypothesentest von Hand - Beidseitig
alpha = 0.05
theta0 = 50
est_pers = 57.5
stderr_pers = 2.47
klinks = qnorm(alpha/2)
krechts = qnorm(1-(alpha/2))
paste("Krit. Bereich: ]-INF;", klinks,"] [", krechts, "; INF[", sep="")
z = (est_pers-theta0)/stderr_pers
paste("Realisierung Teststatistik: ",z)
p = if(z <= 0) 2*pnorm(z) else 2*pnorm(-z)
paste("p-Wert: ", p)
if(p <= alpha) print("H1 annehmen") else print("H0 annehmen")
\[ \large \begin{aligned} &H_{0}: \theta_{\text {Person }} \leq \theta_{0} \\ &H_{1}: \theta_{\text {Person }}>\theta_{0} \end{aligned} \]
# Hypothesentest von Hand - Rechtsgerichtet
alpha = 0.05
theta0 = 50
est_pers = 57.5
stderr_pers = 2.47
krechts = qnorm(1-alpha)
paste("Krit. Bereich: [", krechts,";INF[", sep="")
z = (est_pers-theta0)/stderr_pers
paste("Realisierung Teststatistik: ",z)
p = 1-pnorm(z)
paste("p-Wert: ", p)
if(p <= alpha) print("H1 annehmen") else print("H0 annehmen")
\[ \large \begin{aligned} &H_{0}: \theta_{\text {Person }} \geq \theta_{0} \\ &H_{1}: \theta_{\text {Person }}<\theta_{0} \end{aligned} \]
# Hypothesentest von Hand - Linksgerichtet
alpha = 0.05
theta0 = 50
est_pers = 57.5
stderr_pers = 2.47
klinks = qnorm(alpha)
paste("Krit. Bereich: ] -INF;", klinks,"]", sep="")
z = (est_pers-theta0)/stderr_pers
paste("Realisierung Teststatistik: ",z)
p = pnorm(z)
paste("p-Wert: ", z)
if(p <= alpha) print("H1 annehmen") else print("H0 annehmen")
Unterschied zwei Personen
\[\large Z=\frac{\hat{\theta}_{\text {Person } 1}-\hat{\theta}_{\text {Person } 2}}{\sqrt{2} \cdot S E\left(\hat{\theta}_{\text {Person }}\right)} \]
est_pers1 = 67.5
est_pers2 = 57.5
stderr_pers = 2.47
(est_pers1-est_pers2)/(sqrt(2)*stderr_pers)
\[\large \begin{aligned} &H_{0}: \theta_{\text {Person } 1}=\theta_{\text {Person } 2} \\ &H_{1}: \theta_{\text {Person } 1} \neq \theta_{\text {Person } 2} \end{aligned} \]
# Hypothesentest von Hand - Beidseitig
alpha = 0.05
est_pers1 = 67.5
est_pers2 = 57.5
stderr_pers = 2.47
klinks = qnorm(alpha/2)
krechts = qnorm(1-(alpha/2))
paste("Krit. Bereich: ]-INF;", klinks,"] [", krechts, "; INF[", sep="")
z = (est_pers1-est_pers2)/(sqrt(2)*stderr_pers)
paste("Realisierung Teststatistik: ",z)
p = if(z <= 0) 2*pnorm(z) else 2*pnorm(-z)
paste("p-Wert: ", p)
if(p <= alpha) print("H1 annehmen") else print("H0 annehmen")
\[\large \begin{aligned} &H_{0}: \theta_{\text {Person } 1}\leq\theta_{\text {Person } 2} \\ &H_{1}: \theta_{\text {Person } 1} > \theta_{\text {Person } 2} \end{aligned} \]
# Hypothesentest von Hand - Rechtsgerichtet
alpha = 0.05
est_pers1 = 67.5
est_pers2 = 57.5
stderr_pers = 2.47
krechts = qnorm(1-alpha)
paste("Krit. Bereich: [", krechts,";INF[", sep="")
z = (est_pers1-est_pers2)/(sqrt(2)*stderr_pers)
paste("Realisierung Teststatistik: ",z)
p = 1-pnorm(z)
paste("p-Wert: ", p)
if(p <= alpha) print("H1 annehmen") else print("H0 annehmen")
\[\large \begin{aligned} &H_{0}: \theta_{\text {Person } 1}\geq\theta_{\text {Person } 2} \\ &H_{1}: \theta_{\text {Person } 1} < \theta_{\text {Person } 2} \end{aligned} \]
# Hypothesentest von Hand - Linksgerichtet
alpha = 0.05
est_pers1 = 67.5
est_pers2 = 57.5
stderr_pers = 2.47
klinks = qnorm(alpha)
paste("Krit. Bereich: ] -INF;", klinks,"]", sep="")
z = (est_pers1-est_pers2)/(sqrt(2)*stderr_pers)
paste("Realisierung Teststatistik: ",z)
p = pnorm(z)
paste("p-Wert: ", p)
if(p <= alpha) print("H1 annehmen") else print("H0 annehmen")
Unterschied zwei Zeitpunkte
\[\large Z=\frac{\hat{\theta}_{\text {PersonZeitpunkt } 1}-\hat{\theta}_{\text {PersonZeitpunkt } 2}}{\sqrt{2} \cdot S E\left(\hat{\theta}_{\text {Person }}\right)} \] R Code identisch zu dem für 2 unterschiedliche Personen
LS0tDQp0aXRsZTogIkRpYWdub3N0aWsgMSBGb3JtZWxzYW1tbHVuZyArIFIgQ29kZSINCmF1dGhvcjogIkFkcmlhbiBTdGVmZmFuIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQogIHBkZl9kb2N1bWVudDogZGVmYXVsdA0KLS0tDQoNCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQogIGJvZHl7DQogIGZvbnQtc2l6ZTogMTFwdDsNCn0NCmgxLGgyLGgzLGg0LGg1IHsNCiAgICBtYXJnaW4tdG9wOiAzMHB4Ow0KICB9DQo8L3N0eWxlPg0KDQojIyMjIyMgKERhbmtlIGFuIERlbmlzZSwgTHlzYW5kZXIgdW5kIE1heSBmw7xycyBLb3JyZWt0dXJsZXNlbikNCg0KRGFzIGhpZXIgaXN0IGVpbmUgc2VtaS1pbnRlcmFrdGl2ZSBGb3JtZWxzYW1tbHVuZyDDvGJlciBhbGxlIHdpY2h0aWdlbiBGb3JtZWxuIGRlciBEaWFnbm9zdGlrIDEgVm9ybGVzdW5nLiBadSBkZW4gbWVpc3RlbiBGb3JtZWxuIHVuZCBUZXN0cyBzaW5kIGVudHNwcmVjaGVuZGUgUiBCZWlzcGllbGUgenVyIEJlcmVjaG51bmcgYmVpZ2Vmw7xndCwgZGllc2UgYW0gYmVzdGVuIHBlciBDb3B5LVBhc3RlIGluIFJTdHVkaW8gZWluZsO8Z2VuIHVuZCBlaWdlbmUgV2VydGUgZWluc2V0emVuLiBBbHRlcm5hdGl2IGthbm4gZGFzIGdhbnplIE5vdGVib29rIGluIFJTdHVkaW8gYXVzZ2Vmw7xocnQgd2VyZGVuOiByZWNodHMgb2JlbiBhdWYgYENvZGUgLT4gRG93bmxvYWQgUm1kYCBrbGlja2VuIHVuZCBkaWUgaGVydW50ZXJnZWxhZGVuZSBEYXRlaSBpbiBSU3R1ZGlvIMO2ZmZuZW4uDQoNCkRvd25sb2FkIGbDvHIgT2ZmbGluZS1OdXR6dW5nOiBSZWNodHNrbGljayBpcmdlbmR3byBhdWYgZGllIFNlaXRlIC0+IGBTcGVpY2hlcm4gdW50ZXJgIC0+IGBXZWJzaXRlLCBudXIgSFRNTGAgKHdpY2h0aWcpLiBBbnNjaGxpZcOfZW5kIGRhcyBnZXNwZWljaGVydGUgRG9rdW1lbnQgZWluZmFjaCBtaXQgZGVtIEJyb3dzZXIgw7ZmZm5lbi4NCg0KRmFsbHMgenUgdW7DvGJlcnNpY2h0bGljaDogcmVjaHRzIG9iZW4gYXVmIGBDb2RlIC0+IEhpZGUgYWxsIENvZGVgIGtsaWNrZW4uDQpBbnNjaGxpZcOfZW5kIGJlaW0gZW50c3ByZWNoZW5kZW4gQWJzY2huaXR0IHJlY2h0cyBhdWYgYENvZGVgIGtsaWNrZW4sIHVtIGRpZSBwYXNzZW5kZW4gQmVmZWhsZSB3aWVkZXIgZWluenVibGVuZGVuLg0KDQojIyMjIyMgW1p1csO8Y2sgenVyIEhvbWVwYWdlXShodHRwczovL2FkcmlhbnN0ZWZmYW4uY29tL2Rvd25sb2Fkcy9wc3ljaG9sb2d5KQ0KDQojIyMgSW5oYWx0c3ZlcnplaWNobmlzDQoNCiogW0dydW5kbGFnZW5dKDwjR3J1bmRsYWdlbj4pDQoqIFtNb2RlbGxlXSg8I01vZGVsbGU+KQ0KICAqIFtwYXJhbGxlbGVzIE1vZGVsbGxdKCNtb3BhcmEpDQogICogW2Vzc2VudGllbGwgcGFyYWxsZWxlcyBNb2RlbGxdKCNtb2VwYXIpDQogICogW3RhdS3DpHF1aXZhbGVudGVzIE1vZGVsbF0oI21vdGF1KQ0KICAqIFtlc3NlbnRpZWxsIHRhdS3DpHF1aXZhbGVudGVzIE1vZGVsbF0oI21vZXRhdSkNCiAgKiBbdC1rb25nZW5lcmlzY2hlcyBNb2RlbGxdKCNtb3RhdWtvbikNCiAgKiBbbWVocmRpbWVuc2lvbmFsZXMgdC1rb25nZW5lcmlzY2hlcyBNb2RlbGxdKCNtb21laHJ0YXVrb24pDQoqIFtTa2FsaWVydW5nXSg8I1NrYWxpZXJ1bmc+KQ0KICAqIFtQYXJhbWV0ZXJzY2jDpHR6dW5nXSgjc2thbHBhcmEpDQoqIFtGYWt0b3JlbmFuYWx5c2VdKDwjRmFrdG9yZW5hbmFseXNlPikNCiAgKiBbR3J1bmRiZWdyaWZmZV0oI2ZhZ3J1bmQpDQogICogW0NGQSB2cyBFRkFdKCNmZWN2c2UpIA0KICAqIFtNb2RlbGxldmFsdWF0aW9uXSgjZmFtb2RlbGwpIA0KICAqIFtSb3RhdGlvbl0oI2Zhcm90YXRpb24pIA0KKiBbUmVsaWFiaWxpdMOkdF0oI1JlbGlhYmlsaXTDpHQpDQogICAgKiBbcGFyYWxsZWxlcyBNb2RlbGwsIGVzc2VudGllbGwgcGFyYWxsZWxlcyBNb2RlbGxdKCNyZWxwYXIpDQogICAgKiBbdGF1LcOkcXVpdmFsZW50ZXMgTW9kZWxsLCBlc3NlbnRpZWxsIHRhdS3DpHF1aXZhbGVudGVzIE1vZGVsbF0oI3JlbHRhdcOkKQ0KICAgICogW3RhdS1rb25nZW5lcmlzY2hlcyBNb2RlbGxdKCNyZWx0YXVrb24pDQogICAgKiBbQWxsZ2VtZWluZSBNZXRob2Rlbl0oI3JlbGFsbCkNCiogW1ZhbGlkaXTDpHRdKCNWYWxpZGl0w6R0KQ0KICAqIFtGYWt0b3JpZWxsZSBWYWxpZGl0w6R0XSgjZmFrdHZhbCkNCiAgKiBbS29uc3RydWt0dmFsaWRpdMOkdF0oI2tvbnN2YWwpDQogICogW0tyaXRlcml1bXN2YWxpZGl0w6R0XSgja3JpdHZhbCkNCiogW0VpbnplbGZhbGxkaWFnbm9zdGlrXSg8I0VpbnplbGZhbGxkaWFnbm9zdGlrPikNCiAgKiBbTm9ybXdlcnRlXSgjZWZub3JtKQ0KICAqIFtwYXJhbGxlbGVzIE1vZGVsbGxdKCNlZnBhcmEpDQogICogW2Vzc2VudGllbGwgcGFyYWxsZWxlcyBNb2RlbGxdKCNlZmVwYXIpDQogICogW3RhdS3DpHF1aXZhbGVudGVzIE1vZGVsbF0oI2VmdGF1KQ0KICAqIFtlc3NlbnRpZWxsIHRhdS3DpHF1aXZhbGVudGVzIE1vZGVsbF0oI2VmZXRhdSkNCiAgKiBbdC1rb25nZW5lcmlzY2hlcyBNb2RlbGxdKCNlZnRhdWtvbikNCiAgKiBbSW50ZXJwcmV0YXRpb25dKCNlZmludGVyKQ0KICAqIFtIeXBvdGhlc2VuXSgjZWZoeXBvKQ0KDQojIyBHcnVuZGxhZ2VuIHsjR3J1bmRsYWdlbn0NCg0KIyMjIFp1ZmFsbHN2YXJpYWJsZW4gDQoNCiogJFxsYXJnZSBYX3tcdGV4dCB7aVBlcnNvbiB9fSQ6IEVpbmUgZmVzdGUgUGVyc29uIGFudHdvcnRldCBhdWYgZWluIEl0ZW0gaSBlaW5lcyBUZXN0cy4NCg0KICAqIEtvbnN0YW50ZSAkXGxhcmdlIEVcbGVmdChYX3tpIFAgZSByIHMgbyBufVxyaWdodCk9XHRhdV97aSBQIGUgciBzIG8gbn0kOiB3YWhyZXIgV2VydCBkZXIgUGVyc29uICh6dWRlbSBlaW5lIFJlYWxpc2llcnVuZyBkZXMgenVmw6RsbGlnZW4gd2FocmVuDQpXZXJ0ZXMgJFxsYXJnZSBcdGF1X3tpfSQpDQoNCiogJFxsYXJnZSBYX3tpfSQ6IEVpbmUgUGVyc29uIHdpcmQgenVmw6RsbGlnIGF1cyBlaW5lciBQb3B1bGF0aW9uIGdlem9nZW4gdW5kIGFudHdvcnRldCBkYW5uIGF1ZiBlaW4gSXRlbSBpDQplaW5lcyBUZXN0cywNCg0KKiAkXGxhcmdlIFx0YXVfe2l9JDogKFp1ZsOkbGxpZ2VyKSB3YWhyZXIgV2VydCwgZGVuIGRpZSB6dWbDpGxsaWcgZ2V6b2dlbmUgUGVyc29uIGF1ZiBJdGVtIGkgaGFiZW4gd2lyZCAoRWluZSBQZXJzb24gd2lyZCB6dWbDpGxsaWcgYXVzIGVpbmVyIFBvcHVsYXRpb24gZ2V6b2dlbiwgYW50d29ydGV0IG5vY2ggbmljaHQgYXVmIEl0ZW0gaSkgLSBSZWFsaXNhdGlvbiBpc3QgbmljaHQgYmVvYmFjaHRiYXINCg0KKiAkXGxhcmdlIFx0aGV0YSQ6IHp1ZsOkbGxpZ2UgbGF0ZW50ZSBWYXJpYWJsZSAoUmVhbGlzYXRpb246ICRcdGhldGFfe1x0ZXh0IHtQZXJzb24gfX0kKQ0KDQokJFxsYXJnZSBFXGxlZnQoWF97aX1ccmlnaHQpJCQNCg0KYGBge3IgY2h1bms2MCwgZXhlcmNpc2U9VFJVRX0NCml0ZW1fYW5zd2VycyA9IGMoNSw2LDcsOCw5KQ0KDQptZWFuKGl0ZW1fYW5zd2VycykNCmBgYA0KDQokJFxsYXJnZSBcb3BlcmF0b3JuYW1le1ZBUn1cbGVmdChYX3tpfVxyaWdodCkkJA0KDQpgYGB7ciBjaHVuazYxLCBleGVyY2lzZT1UUlVFfQ0KaXRlbV9hbnN3ZXJzID0gYyg1LDYsNyw4LDkpDQoNCnZhcihpdGVtX2Fuc3dlcnMpDQpgYGANCg0KJCRcbGFyZ2UgXG9wZXJhdG9ybmFtZXtDb3Z9XGxlZnQoWF97aX0sIFhfe2p9XHJpZ2h0KSQkDQoNCmBgYHtyIGNodW5rMTAwLCBleGVyY2lzZT1UUlVFfQ0KaXRlbXNfYW5zd2VycyA9IGNiaW5kKA0KICBjKDUsNiw3LDgsOSksICMgaXRlbTENCiAgYygxLDMsMTAsMCwxKSwgIyBpdGVtMg0KICBjKDEsMywxLDMsNSkgIyBpdGVtIDMNCikNCg0KY292KGl0ZW1zX2Fuc3dlcnMpDQpgYGANCg0KJCRcbGFyZ2UgXG9wZXJhdG9ybmFtZXtDb3J9KFgsIFkpPVxmcmFje1xvcGVyYXRvcm5hbWV7Q292fShYLCBZKX17XHNxcnR7XG9wZXJhdG9ybmFtZXtWYXJ9KFgpIFxjZG90IFxvcGVyYXRvcm5hbWV7VmFyfShZKX19JCQNCg0KYGBge3IgY2h1bmsxMTAsIGV4ZXJjaXNlPVRSVUV9DQpjb3ZYWSA9IDMNCg0KdmFyWCA9IDQNCnZhclkgPSA2DQoNCmNvdlhZL3NxcnQodmFyWCAqIHZhclkpDQpgYGANCg0KDQojIyMgQXhpb21lIGRlciBUZXN0dGhlb3JpZQ0KDQojIyMjIEF4aW9tIDENCg0KRsO8ciBqZWRlcyBJdGVtICRpJCBpc3QgJFx0YXVfe2l9JCBkaWUgWnVmYWxsc3ZhcmlhYmxlLCBkZXJlbiBSZWFsaXNhdGlvbiBkZXIgd2FocmUgV2VydCAkXHRhdV97XHRleHQge2lQZXJzb24gfX0kIGRlciBJdGVtYW50d29ydCBkZXIgenVmw6RsbGlnIGdlem9nZW5lbiBQZXJzb24gaXN0Lg0KDQojIyMjIEF4aW9tIDINCg0KRsO8ciBqZWRlcyBJdGVtICRpJCBpc3QgZGllIEZlaGxlcnZhcmlhYmxlICRcdmFyZXBzaWxvbl97aX0kIGVpbmUgWnVmYWxsc3ZhcmlhYmxlLCBkaWUgd2llIGZvbGd0IGRlZmluaWVydCBpc3Q6DQokJCBcbGFyZ2UNClx2YXJlcHNpbG9uX3tpfTo9WF97aX0tXHRhdV97aX0NCiQkDQoNCiMjIyMgRm9sZ2VydW5nZW4NCg0KJCRcbGFyZ2UgWF97aX09XHRhdV97aX0rXHZhcmVwc2lsb25fe2l9JCQNCg0KJCRcbGFyZ2UgRVxsZWZ0KFx2YXJlcHNpbG9uX3tpfVxyaWdodCk9MCQkDQoNCiQkXGxhcmdlIEVcbGVmdChYX3tpfVxyaWdodCk9RVxsZWZ0KFx0YXVfe2l9XHJpZ2h0KSQkDQoNCiQkXGxhcmdlIFxvcGVyYXRvcm5hbWV7Q09WfVxsZWZ0KFx0YXVfe2l9LCBcdmFyZXBzaWxvbl97aX1ccmlnaHQpPTAkJA0KJCRcbGFyZ2UgXG9wZXJhdG9ybmFtZXtDT1Z9XGxlZnQoXHRhdV97aX0sIFx2YXJlcHNpbG9uX3tqfVxyaWdodCk9MCQkDQokJFxsYXJnZSBWIEEgUlxsZWZ0KFhfe2l9XHJpZ2h0KT1WIEEgUlxsZWZ0KFx0YXVfe2l9XHJpZ2h0KStWIEEgUlxsZWZ0KFx2YXJlcHNpbG9uX3tpfVxyaWdodCkkJA0KDQojIyBNb2RlbGxlIHsjTW9kZWxsZX0NCg0KJCRcbGFyZ2UgWF97aX09XHNpZ21hX3tpfStcYmV0YV97aX0gXGNkb3QgXHRoZXRhK1x2YXJlcHNpbG9uX3tpfSQkDQoNCldlbm4gZWluIHN0cmVuZ2VyZXMgTW9kZWxsIGdpbHQsIGRhbm4gZ2lsdCBpbW1lciBhdWNoIGdsZWljaHplaXRpZyBqZWRlcyB3ZW5pZ2VyIHN0cmVuZ2UgTW9kZWxsLiBBbmRlcnNydW0gZ2lsdCBkaWVzIG5pY2h0Lg0KDQojIyMgUGFyYWxsZWxlcyBNb2RlbGwgeyNtb3BhcmF9DQoNCkFubmFobWVuOg0KDQokJFxsYXJnZSB7XGNvbG9ye2dyZWVufSB7XHRhdV97aX09XHRoZXRhIH19IFx0ZXh0eyB1bmQgc29taXQgfSAgIHtcY29sb3J7Z3JlZW59IHtYX3tpfT1cdGhldGErXHZhcmVwc2lsb25fe2l9fX0gXHRleHR7IGbDvHIgYWxsZSBJdGVtcyB9IGkkJA0KDQokJFxsYXJnZSAgXG9wZXJhdG9ybmFtZXtWQVJ9XGxlZnQoXHZhcmVwc2lsb25fe2l9XHJpZ2h0KT1cb3BlcmF0b3JuYW1le1ZBUn1cbGVmdChcdmFyZXBzaWxvbl97an1ccmlnaHQpIFx0ZXh0eyBmw7xyIGFsbGUgSXRlbXBhYXJlIH0gaSwgaiQkDQoNCiQkXGxhcmdlIFxvcGVyYXRvcm5hbWV7Q09WfVxsZWZ0KFx2YXJlcHNpbG9uX3tpfSwgXHZhcmVwc2lsb25fe2p9XHJpZ2h0KT0wIFx0ZXh0eyBmw7xyIGFsbGUgSXRlbXBhYXJlIH0gaSwgaiQkDQoNCkZvbGdlcnVuZ2VuOiANCg0KJCRcbGFyZ2UgXHRhdV97aSBcdGV4dCB7IFBlcnNvbiB9fT1cdGhldGFfe1x0ZXh0IHtQZXJzb24gfX09XHRhdV97aiBcdGV4dCB7IFBlcnNvbiB9fSQkDQoNCiQkXGxhcmdlIFxiZXRhX3tpfSA9IDEkJA0KDQokJFxsYXJnZSBcc2lnbWFfe2l9ID0gMCQkDQokJFxsYXJnZSBcb3BlcmF0b3JuYW1le0NPVn1cbGVmdChYX3tpfSwgWF97an1ccmlnaHQpPVxvcGVyYXRvcm5hbWV7VkFSfVxsZWZ0KFx0YXVfe2l9XHJpZ2h0KSQkDQoNCiMjIyBFc3NlbnRpZWxsIHBhcmFsbGVsZXMgTW9kZWxsIHsjbW9lcGFyfQ0KDQpBbm5haG1lbjoNCg0KJCRcbGFyZ2Uge1xjb2xvcntncmVlbn0ge1x0YXVfe2l9PVxzaWdtYV97aX0rXHRoZXRhfX0gXHRleHR7IHVuZCBzb21pdCB9IHtcY29sb3J7Z3JlZW59IHtYX3tpfT1cc2lnbWFfe2l9K1x0aGV0YStcdmFyZXBzaWxvbl97aX19fSBcdGV4dHsgZsO8ciBhbGxlIEl0ZW1zIH0gaSQkDQoNCg0KJCRcbGFyZ2UgXG9wZXJhdG9ybmFtZXtWQVJ9XGxlZnQoXHZhcmVwc2lsb25fe2l9XHJpZ2h0KT1cb3BlcmF0b3JuYW1le1Zhcn1cbGVmdChcdmFyZXBzaWxvbl97an1ccmlnaHQpIFx0ZXh0eyBmw7xyIGFsbGUgSXRlbXBhYXJlIH0gaSwgaiQkDQokJFxsYXJnZSBcb3BlcmF0b3JuYW1le0NPVn1cbGVmdChcdmFyZXBzaWxvbl97aX0sIFx2YXJlcHNpbG9uX3tqfVxyaWdodCk9MCBcdGV4dHsgZsO8ciBhbGxlIEl0ZW1wYWFyZSB9IGksIGokJA0KRmVzdGxlZ3VuZ2VuOg0KDQokJFxsYXJnZSBFKFx0aGV0YSk9MCQkDQoNCkZvbGdlcnVuZ2VuOg0KDQokJFxsYXJnZSBcdGF1X3tpIFx0ZXh0IHsgUGVyc29uIH19PVxzaWdtYV97aX0rXHRoZXRhX3tcdGV4dCB7UGVyc29uIH19JCQNCg0KJCRcbGFyZ2UgXGJldGFfe2l9ID0gMSQkDQoNCiQkXGxhcmdlIEUoWF97aX0pPVxzaWdtYV97aX0kJA0KJCRcbGFyZ2UgXG9wZXJhdG9ybmFtZXtDT1Z9XGxlZnQoWF97aX0sIFhfe2p9XHJpZ2h0KT1cb3BlcmF0b3JuYW1le1ZBUn1cbGVmdChcdGF1X3tpfVxyaWdodCkkJA0KDQojIyMgdGF1LcOkcXVpdmFsZW50ZXMgTW9kZWxsIHsjbW90YXV9DQoNCkFubmFobWVuOg0KDQokJFxsYXJnZSB7XGNvbG9ye2dyZWVufSB7XHRhdV97aX09XHRoZXRhIH19IFx0ZXh0eyB1bmQgc29taXQgfSAgIHtcY29sb3J7Z3JlZW59IHtYX3tpfT1cdGhldGErXHZhcmVwc2lsb25fe2l9fX0gXHRleHR7IGbDvHIgYWxsZSBJdGVtcyB9IGkkJA0KDQoNCiQkXGxhcmdlIFxvcGVyYXRvcm5hbWV7Q09WfVxsZWZ0KFx2YXJlcHNpbG9uX3tpfSwgXHZhcmVwc2lsb25fe2p9XHJpZ2h0KT0wIFx0ZXh0eyBmw7xyIGFsbGUgSXRlbXBhYXJlIH0gaSwgaiQkDQpGb2xnZXJ1bmdlbjoNCg0KJCRcbGFyZ2UgXHRhdV97aSBcdGV4dCB7IFBlcnNvbiB9fT1cdGhldGFfe1x0ZXh0IHtQZXJzb24gfX09XHRhdV97aiBcdGV4dCB7IFBlcnNvbiB9fSQkDQoNCiQkXGxhcmdlIFxiZXRhX3tpfSA9IDEkJA0KDQokJFxsYXJnZSBcc2lnbWFfe2l9ID0gMCQkDQokJFxsYXJnZSBcb3BlcmF0b3JuYW1le0NPVn1cbGVmdChYX3tpfSwgWF97an1ccmlnaHQpPVxvcGVyYXRvcm5hbWV7VkFSfVxsZWZ0KFx0YXVfe2l9XHJpZ2h0KSQkDQoNCiMjIyBFc3NlbnRpZWxsIHRhdS3DpHF1aXZhbGVudGVzIE1vZGVsbCB7I21vZXRhdX0NCg0KQW5uYWhtZW46IA0KJCRcbGFyZ2Uge1xjb2xvcntncmVlbn0ge1x0YXVfe2l9PVxzaWdtYV97aX0rXHRoZXRhfX0gXHRleHR7IHVuZCBzb21pdCB9IHtcY29sb3J7Z3JlZW59IHtYX3tpfT1cc2lnbWFfe2l9K1x0aGV0YStcdmFyZXBzaWxvbl97aX19fSBcdGV4dHsgZsO8ciBhbGxlIEl0ZW1zIH0gaSQkDQoNCg0KJCRcbGFyZ2UgXG9wZXJhdG9ybmFtZXtDT1Z9XGxlZnQoXHZhcmVwc2lsb25fe2l9LCBcdmFyZXBzaWxvbl97an1ccmlnaHQpPTAgXHRleHR7IGbDvHIgYWxsZSBJdGVtcGFhcmUgfSBpLCBqJCQNCkZlc3RsZWd1bmdlbjoNCg0KJCRcbGFyZ2UgRShcdGhldGEpPTAkJA0KDQpGb2xnZXJ1bmdlbjoNCg0KJCRcbGFyZ2UgXHRhdV97aSBcdGV4dCB7IFBlcnNvbiB9fT1cc2lnbWFfe2l9K1x0aGV0YV97XHRleHQge1BlcnNvbiB9fSQkDQoNCiQkXGxhcmdlIFxiZXRhX3tpfSA9IDEkJA0KDQokJFxsYXJnZSBcb3BlcmF0b3JuYW1le0NPVn1cbGVmdChYX3tpfSwgWF97an1ccmlnaHQpPVxvcGVyYXRvcm5hbWV7VkFSfVxsZWZ0KFx0YXVfe2l9XHJpZ2h0KSQkDQoNCg0KIyMjIHRhdS1rb25nZW5lcmlzY2hlcyBNb2RlbGwgeyNtb3RhdWtvbn0NCg0KQW5uYWhtZW46DQoNCiQkXGxhcmdlIHtcY29sb3J7Z3JlZW59IHtcdGF1X3tpfT1cc2lnbWFfe2l9K1xiZXRhX3tpfSBcY2RvdCBcdGhldGF9fSBcdGV4dCB7IHVuZCBzb21pdCB9IHtcY29sb3J7Z3JlZW59IHtYX3tpfT1cc2lnbWFfe2l9K1xiZXRhX3tpfSBcY2RvdCBcdGhldGErXHZhcmVwc2lsb25fe2l9fX0gXHRleHQgeyBmw7xyIGFsbGUgSXRlbXMgfSBpJCQNCg0KJCRcbGFyZ2UgXG9wZXJhdG9ybmFtZXtDT1Z9XGxlZnQoXHZhcmVwc2lsb25fe2l9LCBcdmFyZXBzaWxvbl97an1ccmlnaHQpPTAgXHRleHR7IGbDvHIgYWxsZSBJdGVtcGFhcmUgfSBpLCBqJCQNCkZlc3RsZWd1bmdlbjoNCg0KJCRcbGFyZ2UgRShcdGhldGEpPTAkJA0KDQokJFxsYXJnZSBcb3BlcmF0b3JuYW1le1ZBUn0oXHRoZXRhKT0xJCQNCkZvbGdlcnVuZ2VuOg0KDQokJFxsYXJnZSBFKFhfe2l9KT1cc2lnbWFfe2l9JCQNCg0KDQojIyMgTWVocmRpbWVuc2lvbmFsZXMgdGF1LWtvbmdlbmVyaXNjaGVzIE1vZGVsbCB7I21vbWVocnRhdWtvbn0NCg0KQW5uYWhtZW46IA0KDQokJCBcbGFyZ2UNClxiZWdpbntnYXRoZXJlZH0NClx0YXVfe2l9PVxzaWdtYV97aX0rXGJldGFfe2kgMX0gXGNkb3QgXHRoZXRhX3sxfStcYmV0YV97aSAyfSBcY2RvdCBcdGhldGFfezJ9K1xjZG90cytcYmV0YV97aSBxfSBcY2RvdCBcdGhldGFfe3F9IFx0ZXh0IHsgdW5kIHNvbWl0IH0gXFwNClhfe2l9PVxzaWdtYV97aX0rXGJldGFfe2kgMX0gXGNkb3QgXHRoZXRhX3sxfStcYmV0YV97aSAyfSBcY2RvdCBcdGhldGFfezJ9K1xjZG90cytcYmV0YV97aSBxfSBcY2RvdCBcdGhldGFfe3F9K1x2YXJlcHNpbG9uX3tpfSBcdGV4dCB7IGbDvHIgYWxsZSBJdGVtcyB9IGkgXFwNClxvcGVyYXRvcm5hbWV7Q09WfVxsZWZ0KFx2YXJlcHNpbG9uX3tpfSwgXHZhcmVwc2lsb25fe2p9XHJpZ2h0KT0wIFx0ZXh0IHsgZsO8ciBhbGxlIEl0ZW1wYWFyZSB9IGksIGoNClxlbmR7Z2F0aGVyZWR9DQokJA0KDQpGZXN0bGVndW5nZW46DQoNCiQkXGxhcmdlIEUoXHRoZXRhX3tsfSk9MCQkDQoNCiQkXGxhcmdlIFxvcGVyYXRvcm5hbWV7VkFSfShcdGhldGFfe2x9KT0xJCQNCiQkXGxhcmdlIFxvcGVyYXRvcm5hbWV7Q09WfVxsZWZ0KFx0aGV0YV97bH0sIFx0aGV0YV97bX1ccmlnaHQpPTAgXHRleHQgeyBmw7xyIGFsbGUgbGF0ZW50ZW4gVmFyaWFibGVuIH0gbCBcbmVxIG0kJA0KDQpGb2xnZXJ1bmdlbjoNCg0KJCRcbGFyZ2UgRVxsZWZ0KFhfe2l9XHJpZ2h0KT1cc2lnbWFfe2l9JCQNCnotU3RhbmRhcmRpc2llcnVuZzoNCg0KJCRcbGFyZ2UgWl97aX09XGZyYWN7WF97aX0tRVxsZWZ0KFhfe2l9XHJpZ2h0KX17XHNxcnR7XG9wZXJhdG9ybmFtZXtWQVJ9XGxlZnQoWF97aX1ccmlnaHQpfX09XGZyYWN7WF97aX0tXHNpZ21hX3tpfX17XHNxcnR7XG9wZXJhdG9ybmFtZXtWQVJ9XGxlZnQoWF97aX1ccmlnaHQpfX0kJA0KDQpgYGB7ciBjaHVuazYzLCBleGVyY2lzZT1UUlVFfQ0KaXRlbV9hbnN3ZXJzID0gYygxLCA0KQ0KdmFyc19pdGVtcyA9IGMoNCwgMykNCnNpZ21hcyA9IGMoNSwgMSkNCg0KKGl0ZW1fYW5zd2VycyAtIHNpZ21hcykvc3FydCh2YXJzX2l0ZW1zKQ0KYGBgDQoNCiQkXGxhcmdlIFpfe2l9PVxiZXRhX3t6IGkgMX0gXGNkb3QgXHRoZXRhX3sxfStcYmV0YV97eiBpIDJ9IFxjZG90IFx0aGV0YV97Mn0rXGNkb3RzK1xiZXRhX3t6IGkgcX0gXGNkb3QgXHRoZXRhX3txfStcdmFyZXBzaWxvbl97eiBpfSBcdGV4dCB7IGbDvHIgYWxsZSBJdGVtcyB9IGkkJA0KJCRcbGFyZ2UgXGJvbGRzeW1ib2x7XGJldGF9X3t6IGkgcX0gPSBcZnJhY3tcYmV0YV97aSBxfX17XHNxcnR7ViBBIFJcbGVmdChYX3tpfVxyaWdodCl9fSQkDQpgYGB7ciBjaHVuazY0LCBleGVyY2lzZT1UUlVFfQ0KYmV0YSA9IDENCnZhcl9pdGVtID0gMg0KDQpiZXRhL3NxcnQodmFyX2l0ZW0pDQpgYGANCg0KIyMgU2thbGllcnVuZyB7I1NrYWxpZXJ1bmd9DQoNCkVpbiBwc3ljaG9sb2dpc2NoZXIgVGVzdCBnaWx0IGFscyBza2FsaWVyYmFyLCB3ZW5uIGRpZSBadW9yZG51bmcgZGVyIE1lc3N3ZXJ0ZSB6dSBkZW4gUGVyc29uZW4gYXVmIGRlciBCYXNpcyBlaW5lcyBlbXBpcmlzY2ggbmFjaGdld2llc2VuZW4gdGVzdHRoZW9yZXRpc2NoZW4gTW9kZWxscyBnZXNjaGllaHQuDQoNCiogJEhfezB9JCA6IERpZSBGb2xnZXJ1bmdlbiBhdXMgZGVtIE1vZGVsbCBzaW5kIGVyZsO8bGx0DQoqICRIX3sxfSQgOiBNaW5kZXN0ZW5zIGVpbmUgRm9sZ2VydW5nIGF1cyBkZW0gTW9kZWxsIGlzdCBuaWNodCBlcmbDvGxsdA0KDQoNCiMjIyBQYXJhbGxlbGVzIE1vZGVsbA0KDQpadSDDvGJlcnByw7xmZW5kZSBIeXBvdGhlc2VuOg0KDQokJFxsYXJnZSBcYmVnaW57Z2F0aGVyZWR9DQpFXGxlZnQoWF97aX1ccmlnaHQpPUVcbGVmdChYX3tqfVxyaWdodCkgXHRleHQgeyBmw7xyIGFsbGUgSXRlbXMgfSBpLCBqIFxcDQpcb3BlcmF0b3JuYW1le1ZBUn1cbGVmdChYX3tpfVxyaWdodCk9XG9wZXJhdG9ybmFtZXtWQVJ9XGxlZnQoWF97an1ccmlnaHQpIFx0ZXh0IHsgZsO8ciBhbGxlIEl0ZW1zIH0gaSwgaiBcXA0KXG9wZXJhdG9ybmFtZXtDT1Z9XGxlZnQoWF97aX0sIFhfe2p9XHJpZ2h0KT1cb3BlcmF0b3JuYW1le0NPVn1cbGVmdChYX3tvfSwgWF97dX1ccmlnaHQpIFx0ZXh0IHsgZsO8ciBhbGxlIEl0ZW1wYWFyZSB9IGksIGogXHRleHQgeyB1bmQgfSBvLCB1DQpcZW5ke2dhdGhlcmVkfSQkDQoNCiMjIyBFc3NlbnRpZWxsIHBhcmFsbGVsZXMgTW9kZWxsDQoNClp1IMO8YmVycHLDvGZlbmRlIEh5cG90aGVzZW46DQoNCiQkXGxhcmdlDQpcYmVnaW57Z2F0aGVyZWR9DQpcb3BlcmF0b3JuYW1le1ZBUn1cbGVmdChYX3tpfVxyaWdodCk9XG9wZXJhdG9ybmFtZXtWQVJ9XGxlZnQoWF97an1ccmlnaHQpIFx0ZXh0IHsgZsO8ciBhbGxlIEl0ZW1zIH0gaSwgaiBcXA0KXG9wZXJhdG9ybmFtZXtDT1Z9XGxlZnQoWF97aX0sIFhfe2p9XHJpZ2h0KT1cb3BlcmF0b3JuYW1le0NPVn1cbGVmdChYX3tvfSwgWF97dX1ccmlnaHQpIFx0ZXh0IHsgZsO8ciBhbGxlIEl0ZW1wYWFyZSB9IGksIGogXHRleHQgeyB1bmQgfSBvLCB1DQpcZW5ke2dhdGhlcmVkfQ0KJCQNCg0KIyMjIHRhdS3DpHF1aXZhbGVudGVzIE1vZGVsbA0KDQpadSDDvGJlcnByw7xmZW5kZSBIeXBvdGhlc2VuOg0KDQokJFxsYXJnZQ0KXGJlZ2lue2dhdGhlcmVkfQ0KRVxsZWZ0KFhfe2l9XHJpZ2h0KT1FXGxlZnQoWF97an1ccmlnaHQpIFx0ZXh0IHsgZsO8ciBhbGxlIEl0ZW1zIH0gaSwgaiBcXA0KXG9wZXJhdG9ybmFtZXtDT1Z9XGxlZnQoWF97aX0sIFhfe2p9XHJpZ2h0KT1cb3BlcmF0b3JuYW1le0NPVn1cbGVmdChYX3tvfSwgWF97dX1ccmlnaHQpIFx0ZXh0IHsgZsO8ciBhbGxlIEl0ZW1wYWFyZSB9IGksIGogXHRleHQgeyB1bmQgfSBvLCB1DQpcZW5ke2dhdGhlcmVkfQ0KJCQNCg0KIyMjIEVzc2VudGllbGwgdGF1LcOkcXVpdmFsZW50ZXMgTW9kZWxsDQoNClp1IMO8YmVycHLDvGZlbmRlIEh5cG90aGVzZW46DQoNCiQkXGxhcmdlDQpcb3BlcmF0b3JuYW1le0NPVn1cbGVmdChYX3tpfSwgWF97an1ccmlnaHQpPVxvcGVyYXRvcm5hbWV7Q09WfVxsZWZ0KFhfe299LCBYX3t1fVxyaWdodCkgXHRleHQgeyBmw7xyIGFsbGUgSXRlbXBhYXJlIH0gaSwgaiBcdGV4dCB7IHVuZCBvLCB9IHUNCiQkDQoNCiMjIyB0YXUta29uZ2VuZXJpc2NoZXMgTW9kZWxsDQoNClp1IMO8YmVycHLDvGZlbmRlIEh5cG90aGVzZW46DQoNCiQkXGxhcmdlIFxvcGVyYXRvcm5hbWV7Q09WfVxsZWZ0KFhfe2l9LCBYX3tqfVxyaWdodCk9XGJldGFfe2l9IFxjZG90IFxiZXRhX3tqfSBcdGV4dCB7IGbDvHIgYWxsZSBJdGVtcGFhcmUgfSBpLCBqJCQNCg0KIyMjIE1laHJkaW1lbnNpb25hbGVzIHRhdS1rb25nZW5lcmlzY2hlcyBNb2RlbGwNCg0KWnUgw7xiZXJwcsO8ZmVuZGUgSHlwb3RoZXNlbjoNCg0KJCRcbGFyZ2UgXG9wZXJhdG9ybmFtZXtDT1Z9XGxlZnQoWF97aX0sIFhfe2p9XHJpZ2h0KT1cc3VtX3tsPTF9XntxfSBcYmV0YV97aSBsfSBcY2RvdCBcYmV0YV97aiBsfSBcdGV4dCB7IGbDvHIgYWxsZSBJdGVtcGFhcmUgfSBpLCBqJCQNCg0KIyMjIFBhcmFtZXRlcnNjaMOkdHp1bmcgeyNza2FscGFyYX0NCg0KIVtdKGh0dHBzOi8vc2hpbnkuYWRyaWFuc3RlZmZhbi5jb20vYXNzZXRzL3N0YXRzMy9pbWFnZXMvcGFyYW1ldGVycy5wbmcpDQoNCiMjIEZha3RvcmVuYW5hbHlzZSB7I0Zha3RvcmVuYW5hbHlzZX0NCg0KIyMjIEdydW5kYmVncmlmZmUgeyNmYWdydW5kfQ0KDQoqIEVpbmZhY2hzdHJ1a3R1cg0KICAqIEplZGVzIEl0ZW0gaW4gZGVyIFBvcHVsYXRpb24gd2Vpw590IG51ciBhdWYgZWluZW0gRmFrdG9yIGVpbmVuIHZvbiBOdWxsIHZlcnNjaGllZGVuZW4gU3RlaWd1bmdzcGFyYW1ldGVyIGF1Zi4NCiogS29tbXVuYWxpdMOkdCAkXGJvbGRzeW1ib2x7aH1fe2l9XnsyfSQNCiAgKiBEaWUgU3VtbWUgZGVyIHF1YWRyaWVydGVuIExhZHVuZ2VuIGRlcyBJdGVtcyDDvGJlciBhbGxlIEZha3RvcmVuIGRlciBBbmZhbmdzbMO2c3VuZw0KICAqIE1hw58gZsO8ciBkaWUg4oCeV2ljaHRpZ2tlaXTigJwgZGVzIEl0ZW1zIGJlaSBkZXIgSW50ZXJwcmV0YXRpb24NCiogRWlnZW53ZXJ0DQogICogRGllIFN1bW1lIGRlciBxdWFkcmllcnRlbiBMYWR1bmdlbiBhbGxlciBJdGVtcyBhdWYgZGllc2VuIEZha3RvcmVuICAoU1MgbG9hZGluZ3MpDQogICogTWHDnyBmw7xyIGRpZSDigJ5XaWNodGlna2VpdOKAnCBkZXMgRmFrdG9ycw0KKiBIYXVwdGxhZHVuZyANCiAgKiBpc3QgZGllIExhZHVuZyBlaW5lcyBJdGVtcyBhdWYgZGVtIEZha3RvciwgZGllIGFtIGjDtmNoc3RlbiBhdXNmw6RsbHQgdW5kIHNpZ25pZmlrYW50IGlzdA0KKiBOZWJlbmxhZHVuZyhlbikgDQogICogc2luZCBkaWUgTGFkdW5nZW4gZWluZXMgSXRlbXMgYXVmIGVpbmVtIG9kZXIgbWVocmVyZW4gRmFrdG9yZW4sIGRpZSBuaWNodCBkaWUgaMO2Y2hzdGUgTGFkdW5nIGF1ZiBkZW0gRmFrdG9yIGRhcnN0ZWxsZW4sIGFiZXIgc2lnbmlmaWthbnQgc2luZA0KDQogIA0KIyMjIENGQSB2cyBFRkEgeyNmZWN2c2V9DQoNCiMjIyMgQ0ZBDQoNCnNjaMOkdHp0IGRpZSBQYXJhbWV0ZXIgZWluZXMgKG5haGV6dSkgYmVsaWViaWdlbiAodm9yaGVyIGZlc3RnZWxlZ3RlbikgVGVzdG1vZGVsbHMgdW5kDQpwcsO8ZnQgZGVzc2VuIEFubmFobWVuDQoNCiogU3BlemlmaWthdGlvbiBlaW5lcyBUZXN0bW9kZWxsZXMNCiAgKiBNZXNzbW9kZWxsID0gQmV6aWVodW5nIG1hbmlmZXN0LWxhdGVudDogR2xlaWNodW5nc3N5c3RlbQ0KICAqIFN0cnVrdHVybW9kZWxsID0gQmV6aWVodW5nIGxhdGVudC1sYXRlbnQ6IENvdmFyaWFuemVuDQoqIFdhaGwgZWluZXIgZmFrdG9yZW5hbmFseXRpc2NoZW4gU2Now6R0em1ldGhvZGUgKE1heGltdW0tTGlrZWxpaG9vZCwgV0xTLCBXTFNNLi4uKQ0KICAqIEtvdmFyaWFuem1hdHJpeCBkZXIgSXRlbXMgUyAtPiBMYWR1bmdzbWF0cml4ICRcU2lnbWEkXA0KKiBNb2RlbGxldmFsdWF0aW9uDQoNCiMjIyMgRUZBDQoNCnNjaMOkdHp0IGRpZSBQYXJhbWV0ZXIgZWluZXMgZWluLSBvZGVyIG1laHJkaW1lbnNpb25hbGVuDQp0YXUta29uZ2VuZXJpc2NoZW4gTW9kZWxscyAodW5kIHByw7xmdCBldmVudHVlbGwgZGVzc2VuIEFubmFobWVuKS4gQXVjaCBuw7x0emxpY2gsIHdlbm4gTW9kZWxsIGluIENGQSBhYmdlbGVobnQgd3VyZGUNCg0KKiBXYWhsIGVpbmVyIGZha3RvcmVuYW5hbHl0aXNjaGVuIFNjaMOkdHptZXRob2RlIChNYXhpbXVtLUxpa2VsaWhvb2QsIFdMUywgV0xTTS4uLikNCiAgKiBLb3ZhcmlhbnptYXRyaXggZGVyIEl0ZW1zIFMgLT4gTGFkdW5nc21hdHJpeCAkXFNpZ21hJFwNCiogTW9kZWxsZXZhbHVhdGlvbg0KKiBCZXN0aW1tdW5nIGRlciBBbnphaGwgZGVyIGxhdGVudGVuIFZhcmlhYmxlbg0KICAqIFBhcmFsbGVsYW5hbHlzZSAtPiBOdXR6dCBkaWUgRWlnZW53ZXJ0ZSB2b24gc3RlaWdlbmRlciBBbnphaGwgYW4gRmFrdG9yZW4sIHVtIHBsYXVzaWJsZSBBbnphaGwgYW4gRmFrdG9yZW4genUgZXJtaXR0ZWxuDQoqIFdhaGwgZWluZXIgYW5nZW1lc3NlbmVuIFJvdGF0aW9uc3RlY2huaWsNCiAgKiBNZWhyZXJlIGdsZWljaHdlcnRpZ2UgTMO2c3VuZ2VuIC0+IE1pdCBSb3RhdGlvbiAoUHJvbWF4LCBvYmxpbWluKSBhdWYgZWluZSBmZXN0bGVnZW4gDQoNCiMjIyBNb2RlbGxldmFsdWF0aW9uIHsjZmFtb2RlbGx9DQoNCiMjIyMgSHlwb3RoZXNlbnRlc3QNCg0KVmFsdWUgb2YgRml0dGluZy1GdW5jdGlvbiAoVkZGKTogTWluaW1hbGUgRGlza3JlcGFueiBuYWNoIGZpdHRpbmcNCg0KRGllIFRlc3RzdGF0aXN0aWsNCg0KJCRcbGFyZ2UgXGNoaV97ZSBtIHB9XnsyfT1WIEYgRiBcY2RvdChuLTEpJCQsIHZlcnRlaWx0IG5hY2ggQ2hpLVF1YWRyYXQgbWl0IGRmID0gYmVrYW5udGUgR3LDtsOfZW4gLSB1bmJla2FubnRlIEdyw7bDn2VuLCBwcsO8ZnQgDQoNCiRcU2lnbWEkIE1vZGVsbCBQb3B1bGF0aW9uICQ9UyQgUG9wdWxhdGlvbiANCg0Kb2Rlcg0KDQokUCQgTW9kZWxsIFBvcHVsYXRpb24gJD1SJCBQb3B1bGF0aW9uDQoNCiMjIyMgRml0LUluZGl6ZXMNCg0KRGllc2UgQW5nYWJlbiBzaW5kIGdyb2JlIFJpY2h0d2VydGUgZsO8ciBNTC1NZXRob2RlOg0KDQoqIEFid2VpY2h1bmcgdm9uIGJlc3QgZml0IChJZGVhbGUgV2VydGUgc2luZCAwKQ0KICAqIFNSTVIgU3RhbmRhcmRpemVkLVNxdWFyZWQtTWVhbi1SZXNpZHVhbCAkXGxlcSAwLjExJA0KICAqIFJNU0VBIFJvb3QtTWVhbi1TcXVhcmUtRXJyb3Itb2YtQXBwcm94aW1hdGlvbiAkXGxlcSAwLjA4KG48MjUwKSQgdW5kIHVudGVyICRcbGVxIDAuMDYobj4yNTApJA0KKiBBYndlaWNodW5nIHZvbSB3b3JzdCBmaXQgKElkZWFsZSBXZXJ0ZSBzaW5kIDEpDQogICogQ0ZJIENvbXBhcmF0aXZlIEZpdCBJbmRleCAkXGdlcSAwLjk1JA0KDQpBbmRlcmUgTWV0aG9kZTogQmF5ZXMgSW5mb3JtYXRpb24gQ3JpdGVyaW9uLCAoQklDKTogd2llIGd1dCBkYXMgTW9kZWxsIHBhc3N0LCB3aWUgZ3Jvw58gZGllIFN0aWNocHJvYmUgaXN0IHVuZCB3aWUga29tcGxleCBkYXMgTW9kZWxsIGlzdA0KDQoNCiQkXGxhcmdlIEIgSSBDPVxjaGlfe2UgbSBwfV57Mn0rXGxuIChuKStuX3twfSQkDQoqICRuPSQgU3RpY2hwcm9iZW5ncsO2w59lDQoqICRuX3twfT0kIHVuYmVrYW5udGUgTW9kZWxsZ3LDtsOfZW4gLyB6dSBzY2jDpHR6ZW5kZSBNb2RlbGxwYXJhbWV0ZXINCg0KUGFzc2VuZHN0ZXMgdW5kIHNwYXJzYW1zdGVzIE1vZGVsbC0+IGtsZWluc3RlbiBXZXJ0IGFsbGVyIGJldHJhY2h0ZXRlbiBNb2RlbGxlIHfDpGhsZW4NCg0KIyMjIyBMb2thbGVyIEZpdA0KDQpTb2dlbmFubnRlIE1vZGlmaWthdGlvbnNpbmRpemVzIChtaSkgcHLDvGZlbiwgYW4gd2VsY2hlbiBTdGVsbGVuIGRpZSBGcmVpc2V0enVuZyBlaW5lcyBQYXJhbWV0ZXJzIHp1IGVpbmVyIHNpZ25pZmlrYW50ZW4gTW9kZWxsdmVyYmVzc2VydW5nIGbDvGhydCAoc3RyZW5nZSBkZXMgTW9kZWxscyBsb2thbCB2ZXJyaW5nZXJuKQ0KDQoqIEJlaSBlaW5lbSBGcmVpaGVpdHNncmFkIHNpbmQgMy44NCBDaGktUXVhZHJhdC1QdW5rdGUgbm90d2VuZGlnLCBkYW1pdCBkYXMgTW9kZWxsIHNpZ25pZmlrYW50IHZlcmJlc3NlcnQgd2VyZGVuIGthbm4gDQoqIFByw7xmdW5nIGxva2FsZXIgRml0IChtaSDiiaUgMy44NCkgLT4gRnJlaXNldHp1bmcNCg0KDQojIyMgUm90YXRpb24geyNmYXJvdGF0aW9ufQ0KDQojIyMjIEFuZmFuZ3Nsw7ZzdW5nIChGYWt0b3JtYXRyaXgpDQoNCiFbXShodHRwczovL3NoaW55LmFkcmlhbnN0ZWZmYW4uY29tL2Fzc2V0cy9zdGF0czMvaW1hZ2VzL2ZhYW5mYW5nLnBuZykNCg0KIyMjIyBSb3RpZXJ0ZSBMw7ZzdW5nIChNdXN0ZXJtYXRyaXgpDQoNCiFbXShodHRwczovL3NoaW55LmFkcmlhbnN0ZWZmYW4uY29tL2Fzc2V0cy9zdGF0czMvaW1hZ2VzL2ZhcHJvbWF4LnBuZykNCg0KDQoNCg0KDQojIyBSZWxpYWJpbGl0w6R0IHsjUmVsaWFiaWxpdMOkdH0NCg0KKiBEaWUgUmVsaWFiaWxpdMOkdCBiZXNjaHJlaWJ0IGRpZSBHZW5hdWlna2VpdCBiencuIFp1dmVybMOkc3NpZ2tlaXQgKERJTiAzMzQzMCksIG1pdA0KZGVyIGVpbiBwc3ljaG9sb2dpc2NoZXIgVGVzdCBlaW4gTWVya21hbCBlcmZhc3N0DQoNCiogdW5hYmjDpG5naWcgdm9uIGRlciBFaW5oZWl0IGRlcyBJdGVtcyANCg0KIyMjIyBFaW56ZWxuZXMgSXRlbQ0KDQokJFxsYXJnZSBSRUxcbGVmdChYX3tpfVxyaWdodCk9XGZyYWN7XG9wZXJhdG9ybmFtZXtWQVJ9XGxlZnQoXHRhdV97aX1ccmlnaHQpfXtcb3BlcmF0b3JuYW1le1ZBUn1cbGVmdChYX3tpfVxyaWdodCl9PVxmcmFje1xvcGVyYXRvcm5hbWV7VkFSfVxsZWZ0KFx0YXVfe2l9XHJpZ2h0KX17XG9wZXJhdG9ybmFtZXtWQVJ9XGxlZnQoXHRhdV97aX1ccmlnaHQpK1xvcGVyYXRvcm5hbWV7VkFSfVxsZWZ0KFx2YXJlcHNpbG9uX3tpfVxyaWdodCl9JCQNCiQkXGxhcmdlIDAgXGxlcSBSIEUgTFxsZWZ0KFhfe2l9XHJpZ2h0KSBcbGVxIDEkJA0KDQoqICRcbGFyZ2UgXG9wZXJhdG9ybmFtZXtWQVJ9KFx2YXJlcHNpbG9uX3tpfSkgPSAwIFxpbXBsaWVzIFIgRSBMXGxlZnQoWF97aX1ccmlnaHQpPSAxJA0KDQoqICRcbGFyZ2UgXGxpbV97XG9wZXJhdG9ybmFtZXtWQVJ9XGxlZnQoXHZhcmVwc2lsb25fe2l9XHJpZ2h0KSBccmlnaHRhcnJvdyBcaW5mdHl9IFIgRSBMXGxlZnQoWF97aX1ccmlnaHQpPTAkDQoNCiMjIyMgSXRlbW1pdHRlbHdlcnQgdW5kIEl0ZW1zdW1tZQ0KDQokJCBcbGFyZ2UgUiBFIEwoXGJhcntYfSk9XGZyYWN7ViBBIFJcbGVmdChcZnJhY3sxfXtrfSBcc3VtX3tpPTF9XntrfSBcdGF1X3tpfVxyaWdodCl9e1YgQSBSXGxlZnQoXGZyYWN7MX17a30gXHN1bV97aT0xfV57a30gWF97aX1ccmlnaHQpfSA9IFxmcmFje1xvcGVyYXRvcm5hbWV7VkFSfVxsZWZ0KFxzdW1fe2k9MX1ee2t9IFx0YXVfe2l9XHJpZ2h0KX17XG9wZXJhdG9ybmFtZXtWQVJ9XGxlZnQoXHN1bV97aT0xfV57a30gWF97aX1ccmlnaHQpfT1SIEUgTFxsZWZ0KFxzdW1fe2k9MX1ee2t9IFhfe2l9XHJpZ2h0KSQkDQoNCkNyb25iYWNocyBBbHBoYToNCg0KJCQgXGxhcmdlIFxhbHBoYT1cZnJhY3trfXtrLTF9IFxjZG90XGxlZnQoMS1cZnJhY3tcc3VtX3tpPTF9XntrfSBcb3BlcmF0b3JuYW1le1ZBUn1cbGVmdChYX3tpfVxyaWdodCl9e1xvcGVyYXRvcm5hbWV7VkFSfVxsZWZ0KFxzdW1fe2k9MX1ee2t9IFhfe2l9XHJpZ2h0KX1ccmlnaHQpICQkDQpgYGB7ciBjaHVuazEwMSwgZXhlcmNpc2U9VFJVRX0NCiMgZXhhbXBsZSBkYXRhOiA0IHBlb3BsZSBhbnN3ZXJlZA0KZGF0YSA9IGNiaW5kKA0KICBjKDQsIDUsIDcsIDUpLCAjIGl0ZW0xIC0gY29sdW1uIDENCiAgYygxLCAxLCAyLCAxKSwgIyBpdGVtMiAtIGNvbHVtbiAyDQogIGMoMSwgMiwgMiwgMSkgIyBpdGVtMyAtIGNvbHVtbiAzDQopDQoNCmsgPSBuY29sKGRhdGEpDQp2YXJzX3Blcl9pdGVtID0gYXBwbHkoZGF0YSwgMiwgdmFyKQ0KYW5zd2VyX3N1bXNfcGVyX3BlcnNvbiA9IHJvd1N1bXMoZGF0YSkNCg0Kay8oay0xKSogKDEtc3VtKHZhcnNfcGVyX2l0ZW0pL3ZhcihhbnN3ZXJfc3Vtc19wZXJfcGVyc29uKSkgDQpgYGANCg0KU3BlYXJtYW4gQnJvd246DQoNCiQkXGxhcmdlIFIgRSBMKFxiYXJ7WH0pPVxmcmFje2teezJ9fXtrKGstMSkrXHN1bV97aT0xfV57a30gXGZyYWN7MX17UiBFIExcbGVmdChYX3tpfVxyaWdodCl9fSA9IFxhbHBoYSQkDQoNCg0KYGBge3IgY2h1bms0OCwgZXhlcmNpc2U9VFJVRX0NCnJlbF9pdGVtcyA8LSBjKDAuNywgMC45LCAwLjYpDQprID0gbGVuZ3RoKHJlbF9pdGVtcykNCg0KayprLyhrKihrLTEpICsgc3VtKDEvcmVsX2l0ZW1zKSkNCg0KYGBgDQoNCiMjIyBwYXJhbGxlbGVzIE1vZGVsbCwgZXNzZW50aWVsbCBwYXJhbGxlbGVzIE1vZGVsbCB7I3JlbHBhcn0NCg0KIyMjIyBFaW56ZWxuZXMgSXRlbQ0KJCRcbGFyZ2UgUiBFIExcbGVmdChYX3tpfVxyaWdodCk9XG9wZXJhdG9ybmFtZXtDT1J9XGxlZnQoWF97aX0sIFhfe2p9XHJpZ2h0KT1cb3BlcmF0b3JuYW1le0NPUn1cbGVmdChYX3tqfSwgWF97aX1ccmlnaHQpPVIgRSBMXGxlZnQoWF97an1ccmlnaHQpJCQNCg0KYGBge3IgY2h1bms1MCwgZXhlcmNpc2U9VFJVRX0NCiMgU2Now6R0enVuZyBrb25rcmV0OiBEdXJjaHNjaG5pdHQgZGVyIEtvcnJlbGF0aW9uZW4gw7xiZXIgYWxsZSBQYWFyZQ0KY29ybWF0cml4ID0gcmJpbmQoDQogIGMoTkEgLCAwLjgsIDAuNiksDQogIGMoTkEgLCBOQSAsIDAuNyksDQogIGMoTkEgLCBOQSAsIE5BICkNCikNCg0KbiA9IGRpbShjb3JtYXRyaXgpW1sxXV0NCnN1bV9jb3IgPSAwDQoNCmZvcihpIGluIDE6KG4tMSkpew0KICBmb3IgKGogaW4gKGkrMSk6bil7DQogICAgc3VtX2NvciA9IHN1bV9jb3IgKyBjb3JtYXRyaXhbW2ksal1dDQogIH0NCn0NCg0KcmVsX2l0ZW1zID0gKHJlcChzdW1fY29yLCBuKS9uKQ0KDQpmb3IgKGkgaW4gMTpuKXsNCiAgcHJpbnQocGFzdGUoIkl0ZW0gIixpLCI6ICIscmVsX2l0ZW1zW1tpXV0pKQ0KfQ0KDQpgYGANCg0KIyMjIyBJdGVtbWl0dGVsd2VydA0KDQoNCkNyb25iYWNocyBhbHBoYSwgDQpTcGVhcm1hbiBCcm93biAtIHZlcmVpbmZhY2h0LCBkYSBkaWUgUmVscyBmw7xyIGFsbGUgSXRlbXMgZ2xlaWNoIHNpbmQ6DQoNCiQkXGxhcmdlIFxvcGVyYXRvcm5hbWV7UkVMfShcYmFye1h9KT1cZnJhY3trfXsoay0xKStcZnJhY3sxfXtSIEUgTFxsZWZ0KFhfe2l9XHJpZ2h0KX19JCQNCmBgYHtyIGNodW5rNywgZXhlcmNpc2U9VFJVRX0NCg0KY29ybWF0cml4ID0gcmJpbmQoDQogIGMoTkEgLCAwLjgsIDAuNiksDQogIGMoTkEgLCBOQSAsIDAuNyksDQogIGMoTkEgLCBOQSAsIE5BICkNCikNCg0KayA9IGRpbShjb3JtYXRyaXgpW1sxXV0NCnN1bV9jb3IgPSAwDQoNCmZvcihpIGluIDE6KGstMSkpew0KICBmb3IgKGogaW4gKGkrMSk6ayl7DQogICAgc3VtX2NvciA9IHN1bV9jb3IgKyBjb3JtYXRyaXhbW2ksal1dDQogIH0NCn0NCg0KcmVsX2l0ZW1zID0gKHJlcChzdW1fY29yLCBrKS9rKQ0KDQprLyhrLTErKDEvcmVsX2l0ZW1zW1sxXV0pKQ0KDQpgYGANCg0KSmVkZXMgSXRlbSBlcmjDtmh0IGRpZSBSZWxpYWJpbGl0w6R0IGRlcyBJdGVtbWl0dGVsd2VydHMhDQoNCiMjIyB0YXUtw6RxdWl2YWxlbnRlcyBNb2RlbGwsIGVzc2VudGllbGwgdGF1LcOkcXVpdmFsZW50ZXMgTW9kZWxsIHsjcmVsdGF1w6R9DQoNCiMjIyMgRWluemVsbmVzIEl0ZW0NCg0KJCRSRUxcbGVmdChYX3tpfVxyaWdodCk9XGZyYWN7XG9wZXJhdG9ybmFtZXtDT1Z9XGxlZnQoWF97aX0sIFhfe2p9XHJpZ2h0KX17XG9wZXJhdG9ybmFtZXtWQVJ9XGxlZnQoWF97aX1ccmlnaHQpfSQkDQpuaWNodCBzeW1tZXRyaXNjaCENCg0KYGBge3IgY2h1bms0OSwgZXhlcmNpc2U9VFJVRX0NCiMgU2Now6R0enVuZyBrb25rcmV0OiBEdXJjaHNjaG5pdHQgZGVyIGtvcnJlbGF0aW9uZW4gw7xiZXIgYWxsZSBQYWFyZSBEVVJDSCBqZXdlaWxpZ2UgVmFyaWFueiBkZXMgSXRlbXMNCmNvdm1hdHJpeCA9IHJiaW5kKA0KICBjKDIgICwgMS40LCAxLjUpLA0KICBjKE5BICwgMyAgLCAxICApLA0KICBjKE5BICwgTkEgLCAxMCApDQopDQoNCm4gPSBkaW0oY292bWF0cml4KVtbMV1dDQpzdW1fY292ID0gMA0KDQpmb3IoaSBpbiAxOihuLTEpKXsNCiAgZm9yIChqIGluIChpKzEpOm4pew0KICAgIHN1bV9jb3YgPSBzdW1fY292ICsgY292bWF0cml4W1tpLGpdXQ0KICB9DQp9DQoNCnJlbF9pdGVtcyA9IChyZXAoc3VtX2NvdiwgbikvbikvZGlhZyhjb3ZtYXRyaXgpDQoNCmZvciAoaSBpbiAxOm4pew0KICBwcmludChwYXN0ZSgiSXRlbSAiLGksIjogIixyZWxfaXRlbXNbW2ldXSkpDQp9DQoNCmBgYA0KDQojIyMjIEl0ZW1taXR0ZWx3ZXJ0DQoNClNwZWFybWFuIEJyb3duLCBDcm9uYmFjaHMgYWxwaGENCg0KYGBge3IgY2h1bms1MSwgZXhlcmNpc2U9VFJVRX0NCmNvdm1hdHJpeCA9IHJiaW5kKA0KICBjKDIgICwgMS40LCAxLjUpLA0KICBjKE5BICwgMyAgLCAxICApLA0KICBjKE5BICwgTkEgLCAxMCApDQopDQoNCmsgPSBkaW0oY292bWF0cml4KVtbMV1dDQpzdW1fY292ID0gMA0KDQpmb3IoaSBpbiAxOihrLTEpKXsNCiAgZm9yIChqIGluIChpKzEpOmspew0KICAgIHN1bV9jb3YgPSBzdW1fY292ICsgY292bWF0cml4W1tpLGpdXQ0KICB9DQp9DQoNCnJlbF9pdGVtcyA9IChyZXAoc3VtX2NvdiwgaykvaykvZGlhZyhjb3ZtYXRyaXgpDQoNCg0KayprLyhrKihrLTEpICsgc3VtKDEvcmVsX2l0ZW1zKSkNCg0KYGBgDQoNCg0KIyMjIHQta29uZ2VuZXJpc2NoZXMgTW9kZWxsIHsjcmVsdGF1a29ufQ0KDQojIyMjIEVpbnplbG5lcyBJdGVtDQoNCiQkUiBFIExcbGVmdChYX3tpfVxyaWdodCk9XGJldGFfe3ogaX1eezJ9JCQNCg0KYGBge3IgY2h1bms1MiwgZXhlcmNpc2U9VFJVRX0NCiMgU2Now6R0enVuZyBrb25rcmV0DQpiZXRhX3ogPSBjKDAuMjQ2LCAwLjg2NiwgMC44NzksIDAuNTE0KSAjICJMYXRlbnQgVmFyaWFibGVzOiBTdGQuYWxsIg0KDQpyZWxfaXRlbXMgPSBiZXRhX3peMg0KDQpmb3IgKGkgaW4gMTpsZW5ndGgocmVsX2l0ZW1zKSl7DQogIHByaW50KHBhc3RlKCJJdGVtICIsaSwiOiAiLHJlbF9pdGVtc1tbaV1dKSkNCn0NCg0KYGBgDQoNCiMjIyMgSXRlbW1pdHRlbHdlcnQNCg0KTWNEb25hbGRzJ3MgT21lZ2EgKGknbSBsb3ZpbicgaXQpOg0KDQokJFxsYXJnZSBcb21lZ2E9XGZyYWN7XGxlZnQoXHN1bV97aT0xfV57a30gXGJldGFfe2l9XHJpZ2h0KV57Mn19e1YgQSBSXGxlZnQoXHN1bV97aT0xfV57a30gWF97aX1ccmlnaHQpfSQkDQpgYGB7ciBjaHVuazEwMiwgZXhlcmNpc2U9VFJVRX0NCiMgbmVlZHMgYm90aCBkYXRhIGFuZCBiZXRhcyBhcyBpbnB1dCAtPiBuZXZlciByZWFsbHkgY2FsY3VsYXRlZCBieSBoYW5kDQojIGV4YW1wbGUgZGF0YTogNCBwZW9wbGUgYW5zd2VyZWQNCmRhdGEgPSBjYmluZCgNCiAgYyg0LCA1LCA3LCA1KSwgIyBpdGVtMSAtIGNvbHVtbiAxDQogIGMoMSwgMSwgMiwgMSksICMgaXRlbTIgLSBjb2x1bW4gMg0KICBjKDEsIDIsIDIsIDEpICMgaXRlbTMgLSBjb2x1bW4gMw0KKQ0KDQpiZXRhcyA9IGMoMC42LCAwLjgsIDAuNykNCg0KayA9IG5jb2woZGF0YSkNCnZhcnNfcGVyX2l0ZW0gPSBhcHBseShkYXRhLCAyLCB2YXIpDQphbnN3ZXJfc3Vtc19wZXJfcGVyc29uID0gcm93U3VtcyhkYXRhKQ0KDQooc3VtKGJldGFzKSleMi92YXIoYW5zd2VyX3N1bXNfcGVyX3BlcnNvbikNCmBgYA0KDQpDcm9uYmFjaHMgQWxwaGEgYmlldGV0IGVpbmUgdW50ZXJlIFNjaHJhbmtlIGbDvHIgZGllIFJlbGlhYmlsaXTDpHQgDQoNCiQkIFxsYXJnZSBcYWxwaGEgXGxlcSBcb21lZ2E9XG9wZXJhdG9ybmFtZXtSRUx9KFxiYXJ7WH0pICQkDQpNY0RvbmFsZCdzIE9tZWdhIGthbm4gw7xiZXJhbGwgZG9ydCB2ZXJ3ZW5kZXQgd2VyZGVuLCB3byBhdWNoIENyb25iYWNocyBBbHBoYSB2ZXJ3ZW5kZXQgd2lyZCwgYmVuw7Z0aWd0IGFiZXIgV2VydGUgYXVzIGVpbmVyIEZha3RvcmVuYW5hbHlzZQ0KDQojIyMgTWVocmRpbWVuc2lvbmFsIHQta29uZ2VuZXJpc2NoZXMgTW9kZWxsDQoNCiMjIyMgRWluemVsbmVzIEl0ZW0NCg0KJCRSIEUgTFxsZWZ0KFhfe2l9XHJpZ2h0KT1cc3VtX3tsPTF9XntxfSBcYmV0YV97eiBpIGx9XnsyfSQkDQpLYW5uIGF1Y2ggYXVzIGRlciBBbmZhbmdzbMO2c3VuZyBkZXIgRmFrdG9yZW5hbmFseXNlIGJlcmVjaG5ldCB3ZXJkZW4gLT4gZW50c3ByaWNodCBkZXIgS29tbXVuYWxpdMOkdCAoaDIpDQoNCg0KIyMjIyBJdGVtbWl0dGVsd2VydA0KDQpXZW5uIEVpbmZhY2hzdHJ1a3R1ciAtPiBtZWhyZXJlIGVpbmRpbWVuc2lvbmFsZSB0LWtvbmdlbmVyaXNjaGUgTW9kZWxsZQ0KDQoNCiMjIyBBbGxnZW1laW5lIE1ldGhvZGVuIHsjcmVsYWxsfQ0KDQpBY2h0dW5nOiBLb3ZhcmlhbnpnbGVpY2hoZWl0IGRlciBlaW56ZWxuZW4gSXRlbXMga2FubiBpbiBiZWlkZW4gRsOkbGxlbiBuaWNodCDDvGJlcnByw7xmdCB3ZXJkZW4NCg0KIyMjIyBTcGxpdC1IYWxmIE1ldGhvZGUNCg0KWndlaSBJdGVtczogTWl0dGVsd2VydCBqZSBlaW5lciBUZXN0aMOkbGZ0ZQ0KDQokJFxsYXJnZSBcYmFye1h9PVxmcmFjezF9ezJ9XGxlZnQoXGJhcntYfV97MX0rXGJhcntYfV97Mn1ccmlnaHQpJCQNCkZhbGxzIGRpZXNlIHBhcmFsbGVsIG9kZXIgZXNzZW50aWVsbCBwYXJhbGxlbDogVmVyZWluZmFjaHVuZyBkZXIgU3BlYXJtYW4gQnJvd24gRm9ybWVsDQoNCiQkXGxhcmdlIFIgRSBMKFxiYXJ7WH0pPVxmcmFjezJ9eygyLTEpK1xmcmFjezF9e1IgRSBMXGxlZnQoXGJhcntYfV97aX1ccmlnaHQpfX0gPVxmcmFjezIgXGNkb3QgXG9wZXJhdG9ybmFtZXtDT1J9XGxlZnQoXGJhcntYfV97MX0sIFxiYXJ7WH1fezJ9XHJpZ2h0KX17XG9wZXJhdG9ybmFtZXtDT1J9XGxlZnQoXGJhcntYfV97MX0sIFxiYXJ7WH1fezJ9XHJpZ2h0KSsxfSQkDQoNCmBgYHtyIGNodW5rMywgZXhlcmNpc2U9VFJVRX0NCmNvcnJBQiA8LSAwLjcNCigyKmNvcnJBQikvKGNvcnJBQisxKQ0KYGBgDQoNCiMjIyMgUGFyYWxsZWx0ZXN0LU1ldGhvZGUNCg0KRXJnZWJuaXNzZSB6d2VpZXIgVGVzdHMgbGllZ2VuIHZvciwgYmlsZGVuIGpld2VpbHMgZWluIEl0ZW0NCg0KJCRcbGFyZ2UgUkVMXGxlZnQoWF97aX1ccmlnaHQpPVxvcGVyYXRvcm5hbWV7Q09SfVxsZWZ0KFhfezF9LCBYX3syfVxyaWdodCkkJA0KDQpgYGB7ciBjaHVuazUzLCBleGVyY2lzZT1UUlVFfQ0KeDEgPSBjKDEsMSwxLDIsMikNCngyID0gYygxLDIsMyw0LDUpDQoNCmNvcih4MSx4MikNCmBgYA0KDQojIyBWYWxpZGl0w6R0IHsjVmFsaWRpdMOkdH0NCg0KRGllIFZhbGlkaXTDpHQgZ2lidCBhbiwgb2IgZWluIHBzeWNob2xvZ2lzY2hlciBUZXN0IGF1Y2ggd2lya2xpY2ggZGFzIG1pc3N0LCB3YXMgZXINCnp1IG1lc3NlbiBiZWFuc3BydWNodA0KDQojIyMgRmFrdG9yaWVsbGUgVmFsaWRpdMOkdCB7I2Zha3R2YWx9DQoNCiogWnVzYW1tZW5ow6RuZ2UgbGF0ZW50ZSBWYXJpYWJsZW4gZWluZXMgVGVzdHMgdW50ZXJlaW5hbmRlcg0KDQpTaW5kIGRpZSBLb3JyZWxhdGlvbmVuIHp3aXNjaGVuIGRlbiBsYXRlbnRlbiBWYXJpYWJsZW4gJFx0aGV0YV97QSAxfSwgXHRoZXRhX3tBIDJ9LCBcdGhldGFfe0EgM30kIGRlcyBUZXN0cyAkQSQgbWl0IGRlciBwc3ljaG9sb2dpc2NoZW4gVGhlb3JpZSB2ZXJlaW5iYXI/DQoNCiQkXGxhcmdlIFxvcGVyYXRvcm5hbWV7Q09SfVxsZWZ0KFx0aGV0YV97QSAxfSwgXHRoZXRhX3tBIDJ9XHJpZ2h0KSQkDQoNCiFbXShodHRwczovL3NoaW55LmFkcmlhbnN0ZWZmYW4uY29tL2Fzc2V0cy9zdGF0czMvaW1hZ2VzL3ZhbGNvcnIucG5nKXt3aWR0aD01MCV9DQoNCiMjIyBLb25zdHJ1a3R2YWxpZGl0w6R0IHsja29uc3ZhbH0NCg0KKiBadXNhbW1lbmjDpG5nZSBsYXRlbnRlIFZhcmlhYmxlbiBtZWhyZXJlciBUZXN0cyANCg0KU2luZCBkaWUgS29ycmVsYXRpb25lbiB6d2lzY2hlbiBkZXIgbGF0ZW50ZW4gVmFyaWFibGUgJFx0aGV0YV97QSAxfSQgZGVzIFRlc3RzICRBJCB1bmQgZGVuIGxhdGVudGVuIFZhcmlhYmxlbiAkXHRoZXRhX3tCfSwgXHRoZXRhX3tDfSQgYW5kZXJlciBUZXN0cyAkQiwgQyQgbWl0IGRlciBwc3ljaG9sb2dpc2NoZW4gVGhlb3JpZSB2ZXJlaW5iYXI/DQoNCiQkXGxhcmdlIFxvcGVyYXRvcm5hbWV7Q09SfVxsZWZ0KFx0aGV0YV97QSAxfSwgXHRoZXRhX3tCfVxyaWdodCkkJA0KDQpadXPDpHR6bGljaGUgQW5uYWhtZTogRGllIEZlaGxlciBtw7xzc2VuIG5pY2h0IG51ciBpbm5lcmhhbGIsIHNvbmRlcm4NCmF1Y2ggw7xiZXIgYmVpZGUgVGVzdHMgQSwgQiBoaW53ZWcgdW5rb3JyZWxpZXJ0IHNlaW4uDQoNCldlaXRlcmUgZsO2cmRlcmxpY2hlIEJlZGluZ3VuZ2VuOg0KDQoxLiBEaWUgdGhlb3JldGlzY2ggYW5nZW5vbW1lbmUgQW56YWhsIGFuIEZha3RvcmVuIGVudHNwcmljaHQgZGVtDQpFcmdlYm5pcyBkZXIgUGFyYWxsZWxhbmFseXNlIChvZGVyIGFuZGVyZXIgTWV0aG9kZSB6dXIgQmVzdGltbXVuZw0KZGVyIEZha3RvcmVuYW56YWhsKQ0KDQoyLiBFcyBsaWVndCBlaW5lIEVpbmZhY2hzdHJ1a3R1ciB2b3INCg0KMy4gRGllIEZha3RvcmVuIGvDtm5uZW4gaW5oYWx0bGljaCBpbSBTaW5uZSBkZXIgVGhlb3JpZSBpbnRlcnByZXRpZXJ0DQp3ZXJkZW4sIGQuaC4gYWxsZSBJdGVtcyBlaW5lcyBUZXN0cyBzaW5kIGVpbmRldXRpZyBkZW4gbGF0ZW50ZW4NClZhcmlhYmxlbiBpaHJlcyBUZXN0cyB6dW9yZGVuYmFyDQoNCiMjIyMgRG9wcGVsdGUgTWluZGVydW5nc2tvcnJla3R1cg0KDQpBbm5haG1lOiB0YXUta29uZ2VuZXJpc2NoZXMgTW9kZWxsIG9kZXIgc3RyZW5nZXINCg0KJCRcbGFyZ2UgXG9wZXJhdG9ybmFtZXtDT1J9XGxlZnQoXHRoZXRhX3tBfSwgXHRoZXRhX3tCfVxyaWdodCk9XGZyYWN7XG9wZXJhdG9ybmFtZXtDT1J9XGxlZnQoXHN1bV97aT0xfV57a197QX19IFhfe2kgQX0sIFxzdW1fe2o9MX1ee2tfe0J9fSBYX3tqIEJ9XHJpZ2h0KX17XHNxcnR7UiBFIExcbGVmdChcc3VtX3tpPTF9XntrX3tBfX0gWF97aSBBfVxyaWdodCkgXGNkb3QgXG9wZXJhdG9ybmFtZXtSRUx9XGxlZnQoXHN1bV97aj0xfV57a197Qn19IFhfe2ogQn1ccmlnaHQpfX0kJA0KYGBge3IgY2h1bms1NCwgZXhlcmNpc2U9VFJVRX0NCmNvcl9hYiA9IDAuMzgNCnJlbEEgPSAwLjY1DQpyZWxCID0gMC44MQ0KICANCihjb3JfYWIpL3NxcnQocmVsQSpyZWxCKQ0KDQpgYGANCg0KDQoNCiMjIyBLcml0ZXJpdW1zdmFsaWRpdMOkdCB7I2tyaXR2YWx9DQoNCiogIFp1c2FtbWVuaMOkbmdlIGxhdGVudGUgVmFyaWFibGVuIHVuZCBtZXNzZmVobGVyZnJlaWUgVmFyaWFibGVuIA0KDQpTaW5kIGRpZSBLb3JyZWxhdGlvbmVuIHp3aXNjaGVuIGRlbiBsYXRlbnRlbiBWYXJpYWJsZW4gJFx0aGV0YV97QSAxfSQsICRcdGhldGFfe0EyfSQNCmRlcyBUZXN0cyBBIHVuZCAobWVzc2ZlaGxlcmZyZWllbikgbWFuaWZlc3RlbiBWYXJpYWJsZW4gKHNvZ2VuYW5udGVuDQpLcml0ZXJpZW4pIEsxLCBLMiBtaXQgZGVyIHBzeWNob2xvZ2lzY2hlbiBUaGVvcmllIHZlcmVpbmJhcj8NCg0KJCRcbGFyZ2UgXG9wZXJhdG9ybmFtZXtDT1J9XGxlZnQoXHRoZXRhX3tBIDF9LCBLX3sxfVxyaWdodCkkJA0KDQojIyMjIEVpbmZhY2hlIE1pbmRlcnVuZ3Nrb3JyZWt0dXINCg0KQW5uYWhtZTogdGF1LWtvbmdlbmVyaXNjaGVzIE1vZGVsbCBvZGVyIHN0cmVuZ2VyDQoNCiQkXGxhcmdlIFxvcGVyYXRvcm5hbWV7Q09SfVxsZWZ0KFx0aGV0YV97QX0sIEtccmlnaHQpPVxmcmFje1xvcGVyYXRvcm5hbWV7Q09SfVxsZWZ0KFxzdW1fe2k9MX1ee2tfe0F9fSBYX3tpIEF9LCBLXHJpZ2h0KX17XHNxcnR7UiBFIExcbGVmdChcc3VtX3tpPTF9XntrX3tBfX0gWF97aSBBfVxyaWdodCl9fSQkDQoNCmBgYHtyIGNodW5rNTUsIGV4ZXJjaXNlPVRSVUV9DQpjb3JfYWsgPSAwLjM4DQpyZWxBID0gMC42NQ0KDQooY29yX2FrKS9zcXJ0KHJlbEEpDQoNCmBgYA0KDQoNCiMjIEVpbnplbGZhbGxkaWFnbm9zdGlrIHsjRWluemVsZmFsbGRpYWdub3N0aWt9DQoNCiQkXGxhcmdlIFhfe2kgUCBlIHIgcyBvIG59PVxzaWdtYV97aX0rXGJldGFfe2l9IFxjZG90IFx0aGV0YV97UCBlIHIgcyBvIG59K1x2YXJlcHNpbG9uX3tpIFAgZSByIHMgbyBufSAkJA0KDQoqICRYX3tpIFAgZSByIHMgbyBufSQ6IFp1ZmFsbHN2YXJpYWJsZSwgZGllIGbDvHIgZGllIEl0ZW1hbnR3b3J0IGRlciBmZXN0ZW4gUGVyc29uIHN0ZWh0DQoNCiogJFx0aGV0YV97XHRleHQge1BlcnNvbiB9fSQ6IHVuYmVrYW5udGUgS29uc3RhbnRlDQoNCiogJFxzaWdtYV97aX0kIHVuZCAkXGJldGFfe2l9JDogUGFyYW1ldGVyIGRlcyBNb2RlbGxzLCBmw7xyIGRpZSBzY2hvbiBTY2jDpHR6d2VydGUgYXVzIGRlciBOb3Jtc3RpY2hwcm9iZSB2b3JsaWVnZW4NCg0KKiB6d2lzY2hlbiAkXHZhcmVwc2lsb25fe2l9JCBhdWYgZGVyIEViZW5lIGRlciB6dWbDpGxsaWdlbiBQZXJzb24gdW5kICRcdmFyZXBzaWxvbl97aSBQIGUgciBzIG8gbn0kIGF1ZiBkZXIgRWJlbmUgZGVyIGZlc3RlbiBQZXJzb24gZ2lidCBlcyB6d2FyIG1hdGhlbWF0aXNjaCBnZXNlaGVuIGVpbmVuIGdlcmluZ2bDvGdpZ2VuIFVudGVyc2NoaWVkLCBkZXIgZsO8ciB1bnMgamVkb2NoIG5pY2h0IHJlbGV2YW50IGlzdA0KDQojIyMjIFN0YW5kYXJkbWVzc2ZlaGxlcg0KDQokJCBcbGFyZ2UgXG9wZXJhdG9ybmFtZXtTRX1cbGVmdChcaGF0e1x0aGV0YX1fe1x0ZXh0IHtQZXJzb24gfX1ccmlnaHQpPVxzcXJ0e1YgQSBSXGxlZnQoXGhhdHtcdGhldGF9X3tcdGV4dCB7UGVyc29uIH19XHJpZ2h0KX0kJA0KDQojIyMjIEtvbmZpZGVuemludGVydmFsbCANCg0KJCRcbGFyZ2UgSVxsZWZ0KFhfezEgXHRleHQgeyBQZXJzb24gfX0sIFhfezIgXHRleHQgeyBQZXJzb24gfX0sIFxsZG90cywgWF97ayBcdGV4dCB7IFBlcnNvbiB9fVxyaWdodCk9XGxlZnRbXGhhdHtcdGhldGF9X3tcdGV4dCB7UGVyc29uIH19IFxwbSBaX3sxLVxmcmFje1xhbHBoYX17Mn19IFxjZG90IFMgRVxsZWZ0KFxoYXR7XHRoZXRhfV97XHRleHQge1BlcnNvbiB9fVxyaWdodClccmlnaHRdJCQNCg0KIyMjIE5vcm13ZXJ0ZSB7I2Vmbm9ybX0NCg0KfCBOYW1lIHwgJEVcbGVmdChcdGhldGFfe1x0ZXh0IHtOb3JtIH19XHJpZ2h0KSQgfCAkXG9wZXJhdG9ybmFtZXtTVER9XGxlZnQoXHRoZXRhX3tcdGV4dCB7Tm9ybSB9fVxyaWdodCkkIHwNCnwgLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0gfA0KfCBaLVdlcnRlIHwgMCB8IDEgfA0KfCBJUS1XZXJ0ZSB8IDEwMCB8IDE1IHwNCnwgU3RhbmRhcmR3ZXJ0ZSB8IDEwMCB8IDEwIHwNCnwgVC1XZXJ0ZSB8IDUwIHwgMTAgfA0KfCBTdGFuaW5lIHwgNSB8IDIgfA0KDQpLSSwgZmFsbHMgbWFuIFB1bmt0c2Now6R0endlcnRlIGluIE5vcm13ZXJ0ZSB1bXJlY2huZXQ6DQokJFxsYXJnZSBcbGVmdFtcaGF0e1x0aGV0YX1fe1x0ZXh0IHtQZXJzb24sTm9ybSB9fSBccG0gel97MS1cZnJhY3tcYWxwaGF9ezJ9fSBcY2RvdCBcd2lkZWhhdHtTIEV9XGxlZnQoXGhhdHtcdGhldGF9X3tcdGV4dCB7UGVyc29uLE5vcm0gfX1ccmlnaHQpXHJpZ2h0XSQkDQpCZXNzZXI6IE5vcm1hbGlzaWVyZW4gZGVyIFdlcnRlICh0YXUta29uZ2VuZXJpc2NoIHNpbmQgYmVyZWl0cyBub3JtaWVydCksIGRhbm4gV2VydGUgdW1yZWNobmVuOg0KDQokJFxsYXJnZSBcaGF0e1x0aGV0YX1fe1x0ZXh0IHtQZXJzb24sIH0gei1cdGV4dCB7IFdlcnQgfX09XGZyYWN7XGhhdHtcdGhldGF9X3tcdGV4dCB7UGVyc29uLFdlcnQgfX0tRShcdGhldGEpfXtcc3FydHtcb3BlcmF0b3JuYW1le1ZBUn0oXHRoZXRhKX19JCQNCg0KDQokJFxsYXJnZSBFXGxlZnQoXHRoZXRhX3t6fVxyaWdodCk9MCBcdGV4dCB7IHVuZCB9IFYgQSBSXGxlZnQoXHRoZXRhX3t6fVxyaWdodCk9MSQkDQoNCmBgYHtyIGNodW5rIDQwLCBleGVyY2lzZT1UUlVFfQ0KZXN0X3BlcnNvbiA9IDIwDQplc3RfdGhldGEgPSAxMA0KdmFyX3RoZXRhID0gNQ0KDQooZXN0X3BlcnNvbi1lc3RfdGhldGEpL3NxcnQodmFyX3RoZXRhKQ0KYGBgDQoNCiQkXGxhcmdlIFxoYXR7XHRoZXRhfV97XHRleHQge1BlcnNvbixOb3Jtd2VydCB9fT1FXGxlZnQoXHRoZXRhX3tcdGV4dCB7Tm9ybSB9fVxyaWdodCkrXG9wZXJhdG9ybmFtZXtTVER9XGxlZnQoXHRoZXRhX3tcdGV4dCB7Tm9ybSB9fVxyaWdodCkgXGNkb3QgXGhhdHtcdGhldGF9X3tcdGV4dCB7UGVyc29uLCB9IHotXHRleHQgeyBXZXJ0IH19JCQNCmBgYHtyIGNodW5rIDQ0LCBleGVyY2lzZT1UUlVFfQ0Kbm9ybV9tZWFuID0gMTAwIA0Kbm9ybV9zdGQgPSAxNQ0KDQp6X3RoZXRhX3BlcnMgPSAwLjUNCg0Kbm9ybV9tZWFuICsgbm9ybV9zdGQgKiB6X3RoZXRhX3BlcnMNCmBgYA0KDQpTY2jDpHR6dW5nIFN0YW5kYXJkbWVzc2ZlaGxlciBtaXQgdW52b2xsc3TDpG5kaWdlbiBJbmZvcm1hdGlvbmVuOg0KDQokJFxsYXJnZSBcd2lkZWhhdHtTIEV9XGxlZnQoXGhhdHtcdGhldGF9X3tcdGV4dCB7UGVyc29uTm9ybSB9fVxyaWdodClfe1x0ZXh0IHtXZXJ0IH19PVxzcXJ0e1xvcGVyYXRvcm5hbWV7VkFSfVxsZWZ0KFx0aGV0YV97XHRleHQge05vcm0gfX1ccmlnaHQpIFxjZG90KDEtXG9wZXJhdG9ybmFtZXtyZWx9KFxiYXJ7eH0pKX0kJA0KUHJvemVudHLDpG5nZSAoJSBkZXIgUGVyc29uZW4sIGRpZSBlaW5lbiBnbGVpY2hlbiBvZGVyIG5pZWRyaWdlcmVuIFdlcnQgYXVmIGRlciBMYXRlbnRlbiBWYXJpYWJsZSBoYWJlbik6DQoNCmBgYHtyIGNodW5rIDQzLCBleGVyY2lzZT1UUlVFfQ0Kel90aGV0YV9wZXJzID0gMC41DQoNCm5vcm1fbWVhbiA9IDEwMA0Kbm9ybV9zdGQgPSAxNQ0KDQpwbm9ybShub3JtX21lYW4gKyBub3JtX3N0ZCAqIHpfdGhldGFfcGVycywgbWVhbj1ub3JtX21lYW4sIHNkPW5vcm1fc3RkKQ0KYGBgDQoNCiMjIyBQYXJhbGxlbGVzIE1vZGVsbCB7I2VmcGFyYX0NCg0KDQokJFxsYXJnZSBcaGF0e1x0aGV0YX1fe1x0ZXh0IHtQZXJzb24gfX09XGZyYWN7MX17a30gXHN1bV97aT0xfV57a30gWF97aSBcdGV4dCB7IFBlcnNvbiB9fSQkDQpgYGB7ciBjaHVuazEwLCBleGVyY2lzZT1UUlVFfQ0KaXRlbXNfcGVycyA9IGMoNzAsNTAsNjAsNTApDQoNCm1lYW4oaXRlbXNfcGVycykNCmBgYA0KDQokJFxsYXJnZSBcb3BlcmF0b3JuYW1le1NFfVxsZWZ0KFxoYXR7XHRoZXRhfV97XHRleHQge1BlcnNvbiB9fVxyaWdodCk9XHNxcnR7XGZyYWN7XG9wZXJhdG9ybmFtZXtWQVJ9XGxlZnQoXHZhcmVwc2lsb25fe2l9XHJpZ2h0KX17a319JCQNCmBgYHtyIGNodW5rMTEsIGV4ZXJjaXNlPVRSVUV9DQprID0gNCAjIG51bWJlciBvZiBpdGVtcw0KaXRlbV92YXJfcGVycyA9IDI0LjM1MiAjICJWYXJpYW5jZXM6ICIsIGFsbGUgaWRlbnRpc2NoDQoNCnNxcnQoaXRlbV92YXJfcGVycy9rKQ0KYGBgDQoNCmBgYHtyIGNodW5rMTIsIGV4ZXJjaXNlPVRSVUV9DQojIEtvbmZpZGVuemludGVydmFsbA0KaXRlbXNfcGVycyA9IGMoNzAsNTAsNjAsNTApDQppdGVtX3Zhcl9wZXJzID0gMjQuMzUyICMgIlZhcmlhbmNlczogIiwgYWxsZSBpZGVudGlzY2gNCmNvbmYubGV2ZWwgPSAwLjk1DQoNCmsgPSBsZW5ndGgoaXRlbXNfcGVycykNCg0KZXN0X3BlcnMgPSBtZWFuKGl0ZW1zX3BlcnMpDQpzdGRlcnJfcGVycyA9IHNxcnQoaXRlbV92YXJfcGVycy9rKQ0KDQpjID0gc3RkZXJyX3BlcnMgKiBxbm9ybSgxLSgxLWNvbmYubGV2ZWwpLzIpDQpjKGVzdF9wZXJzIC0gYywgZXN0X3BlcnMgKyBjKQ0KYGBgDQoNCmBgYHtyIGNodW5rIDQyLCBleGVyY2lzZT1UUlVFfQ0KIyBHZWdlYmVuZXMgS29uZmlkZW56aW50ZXJ2YWxsIC0+IE5vcm13ZXJ0ZQ0KbG93ZXJfbGltaXRfcGVycyA9IDEyDQpoaWdoZXJfbGltaXRfcGVycyA9IDE0DQoNCmVzdF90aGV0YSA9IDEwICMgSW50ZXJjZXB0czogZiBFc3RpbWF0ZQ0KdmFyX3RoZXRhID0gNSAjIFZhcmlhbmNlczogZiBFc3RpbWF0ZQ0KDQpub3JtX21lYW4gPSAxMDANCm5vcm1fc3RkID0gMTUNCg0Kel9sb3dlcl9saW1pdF9wZXJzID0gKGxvd2VyX2xpbWl0X3BlcnMtZXN0X3RoZXRhKS9zcXJ0KHZhcl90aGV0YSkNCnpfaGlnaGVyX2xpbWl0X3BlcnMgPSAoaGlnaGVyX2xpbWl0X3BlcnMtZXN0X3RoZXRhKS9zcXJ0KHZhcl90aGV0YSkNCg0KYyhub3JtX21lYW4gKyBub3JtX3N0ZCAqIHpfbG93ZXJfbGltaXRfcGVycywgbm9ybV9tZWFuICsgbm9ybV9zdGQgKiB6X2hpZ2hlcl9saW1pdF9wZXJzKQ0KYGBgDQoNCiMjIyBFc3NlbnRpZWxsIHBhcmFsbGVsZXMgTW9kZWxsIHsjZWZlcGFyfQ0KDQokJFxsYXJnZSBcaGF0e1x0aGV0YX1fe1x0ZXh0IHtQZXJzb24gfX09XGZyYWN7MX17a30gXHN1bV97aT0xfV57a30gWF97aSBcdGV4dCB7IFBlcnNvbiB9fS1cZnJhY3sxfXtrfSBcc3VtX3tpPTF9XntrfSBcc2lnbWFfe2l9JCQNCmBgYHtyIGNodW5rMTMsIGV4ZXJjaXNlPVRSVUV9DQppdGVtc19wZXJzID0gYyg3MCw1MCw2MCw1MCkNCnNpZ21hcyA9IGMoMTAsIDMwLCA0MCwgNSkgIyBJbnRlcmNlcHRzOg0KDQptZWFuKGl0ZW1zX3BlcnMpIC0gbWVhbihzaWdtYXMpDQpgYGANCg0KJCRcbGFyZ2UgUyBFXGxlZnQoXGhhdHtcdGhldGF9X3tcdGV4dCB7UGVyc29uIH19XHJpZ2h0KT1cc3FydHtcZnJhY3tWIEEgUlxsZWZ0KFx2YXJlcHNpbG9uX3tpfVxyaWdodCl9e2t9fSQkDQoNCmBgYHtyIGNodW5rMTQsIGV4ZXJjaXNlPVRSVUV9DQprID0gNCAjIG51bWJlciBvZiBpdGVtcw0KaXRlbV92YXJfcGVycyA9IDI0LjM1MiAjICJWYXJpYW5jZXM6ICIsIGFsbGUgaWRlbnRpc2NoDQoNCnNxcnQoaXRlbV92YXJfcGVycy9rKQ0KYGBgDQoNCmBgYHtyIGNodW5rMTUsIGV4ZXJjaXNlPVRSVUV9DQojIEtvbmZpZGVuemludGVydmFsbA0KaXRlbXNfcGVycyA9IGMoNzAsNTAsNjAsNTApDQppdGVtX3Zhcl9wZXJzID0gMjQuMzUyICMgIlZhcmlhbmNlczogIiwgYWxsZSBpZGVudGlzY2gNCnNpZ21hcyA9IGMoMTAsIDMwLCA0MCwgNSkgIyBJbnRlcmNlcHRzOg0KY29uZi5sZXZlbCA9IDAuOTUNCg0KayA9IGxlbmd0aChpdGVtc19wZXJzKQ0KDQplc3RfcGVycyA9IG1lYW4oaXRlbXNfcGVycykgLSBtZWFuKHNpZ21hcykNCnN0ZGVycl9wZXJzID0gc3FydChpdGVtX3Zhcl9wZXJzL2spDQoNCmMgPSBzdGRlcnJfcGVycyAqIHFub3JtKDEtKDEtY29uZi5sZXZlbCkvMikNCmMoZXN0X3BlcnMgLSBjLCBlc3RfcGVycyArIGMpDQpgYGANCg0KYGBge3IgY2h1bmsgNDQ1LCBleGVyY2lzZT1UUlVFfQ0KIyBHZWdlYmVuZXMgS29uZmlkZW56aW50ZXJ2YWxsIC0+IE5vcm13ZXJ0ZQ0KbG93ZXJfbGltaXRfcGVycyA9IC0zDQpoaWdoZXJfbGltaXRfcGVycyA9IDINCg0KdmFyX3RoZXRhID0gNSAjIFZhcmlhbmNlczogZiBFc3RpbWF0ZQ0KDQpub3JtX21lYW4gPSAxMDANCm5vcm1fc3RkID0gMTUNCg0Kel9sb3dlcl9saW1pdF9wZXJzID0gKGxvd2VyX2xpbWl0X3BlcnMpL3NxcnQodmFyX3RoZXRhKQ0Kel9oaWdoZXJfbGltaXRfcGVycyA9IChoaWdoZXJfbGltaXRfcGVycykvc3FydCh2YXJfdGhldGEpDQoNCmMobm9ybV9tZWFuICsgbm9ybV9zdGQgKiB6X2xvd2VyX2xpbWl0X3BlcnMsIG5vcm1fbWVhbiArIG5vcm1fc3RkICogel9oaWdoZXJfbGltaXRfcGVycykNCmBgYA0KDQojIyMgVGF1LcOkcXVpdmFsZW50ZXMgTW9kZWxseyNlZnRhdX0NCg0KJCQgXGxhcmdlIFxoYXR7XHRoZXRhfV97XHRleHQge1BlcnNvbiB9fT1cZnJhY3tcc3VtX3tpPTF9XntrfSBcZnJhY3tYX3tpIFAgZSByIHMgbyBufX17ViBBIFJcbGVmdChcdmFyZXBzaWxvbl97aX1ccmlnaHQpfX17XHN1bV97aT0xfV57a30gXGZyYWN7MX17ViBBIFJcbGVmdChcdmFyZXBzaWxvbl97aX1ccmlnaHQpfX0gJCQNCg0KYGBge3IgY2h1bmsxNiwgZXhlcmNpc2U9VFJVRX0NCml0ZW1zX3BlcnMgPSBjKDUsNCw1LDQpDQppdGVtX3ZhcnNfcGVycyA9IGMoMC4wNDMsIDAuNDk1LCAwLjk3MiwgMC4wODApDQoNCnN1bShpdGVtc19wZXJzL2l0ZW1fdmFyc19wZXJzKS9zdW0oMS9pdGVtX3ZhcnNfcGVycykNCmBgYA0KDQokJFxsYXJnZSBTIEVcbGVmdChcaGF0e1x0aGV0YX1fe1x0ZXh0IHtQZXJzb24gfX1ccmlnaHQpPVxmcmFjezF9e1xzcXJ0e1xzdW1fe2k9MX1ee2t9IFxmcmFjezF9e1YgQSBSXGxlZnQoXHZhcmVwc2lsb25fe2l9XHJpZ2h0KX19fSQkDQoNCmBgYHtyIGNodW5rMTcsIGV4ZXJjaXNlPVRSVUV9DQppdGVtX3ZhcnNfcGVycyA9IGMoMC4wNDMsIDAuNDk1LCAwLjk3MiwgMC4wODApDQoNCjEvc3FydChzdW0oMS9pdGVtX3ZhcnNfcGVycykpDQpgYGANCg0KYGBge3IgY2h1bmsxOCwgZXhlcmNpc2U9VFJVRX0NCiMgS29uZmlkZW56aW50ZXJ2YWxsDQppdGVtc19wZXJzID0gYyg1LDQsNSw0KQ0KaXRlbV92YXJzX3BlcnMgPSBjKDAuMDQzLCAwLjQ5NSwgMC45NzIsIDAuMDgwKSAjICJWYXJpYW5jZXM6ICINCmNvbmYubGV2ZWwgPSAwLjk1DQoNCmVzdF9wZXJzID0gc3VtKGl0ZW1zX3BlcnMvaXRlbV92YXJzX3BlcnMpL3N1bSgxL2l0ZW1fdmFyc19wZXJzKQ0Kc3RkZXJyX3BlcnMgPSAxL3NxcnQoc3VtKDEvaXRlbV92YXJzX3BlcnMpKQ0KDQpjID0gc3RkZXJyX3BlcnMgKiBxbm9ybSgxLSgxLWNvbmYubGV2ZWwpLzIpDQpjKGVzdF9wZXJzIC0gYywgZXN0X3BlcnMgKyBjKQ0KYGBgDQoNCmBgYHtyIGNodW5rIDQ1LCBleGVyY2lzZT1UUlVFfQ0KIyBHZWdlYmVuZXMgS29uZmlkZW56aW50ZXJ2YWxsIC0+IE5vcm13ZXJ0ZQ0KbG93ZXJfbGltaXRfcGVycyA9IDEyDQpoaWdoZXJfbGltaXRfcGVycyA9IDE0DQoNCmVzdF90aGV0YSA9IDEwICMgSW50ZXJjZXB0czogZiBFc3RpbWF0ZQ0KdmFyX3RoZXRhID0gNSAjIFZhcmlhbmNlczogZiBFc3RpbWF0ZQ0KDQpub3JtX21lYW4gPSAxMDANCm5vcm1fc3RkID0gMTUNCg0Kel9sb3dlcl9saW1pdF9wZXJzID0gKGxvd2VyX2xpbWl0X3BlcnMtZXN0X3RoZXRhKS9zcXJ0KHZhcl90aGV0YSkNCnpfaGlnaGVyX2xpbWl0X3BlcnMgPSAoaGlnaGVyX2xpbWl0X3BlcnMtZXN0X3RoZXRhKS9zcXJ0KHZhcl90aGV0YSkNCg0KYyhub3JtX21lYW4gKyBub3JtX3N0ZCAqIHpfbG93ZXJfbGltaXRfcGVycywgbm9ybV9tZWFuICsgbm9ybV9zdGQgKiB6X2hpZ2hlcl9saW1pdF9wZXJzKQ0KYGBgDQoNCiMjIyBFc3NlbnRpZWxsIHRhdS3DpHF1aXZhbGVudGVzIE1vZGVsbCB7I2VmZXRhdX0NCg0KJCRcbGFyZ2UgXGhhdHtcdGhldGF9X3tcdGV4dCB7UGVyc29uIH19PVxmcmFje1xzdW1fe2k9MX1ee2t9IFxmcmFje1hfe2kgUCBlIHIgcyBvIG59LVxzaWdtYV97aX19e1YgQSBSXGxlZnQoXHZhcmVwc2lsb25fe2l9XHJpZ2h0KX19e1xzdW1fe2k9MX1ee2t9IFxmcmFjezF9e1YgQSBSXGxlZnQoXHZhcmVwc2lsb25fe2l9XHJpZ2h0KX19JCQNCg0KYGBge3IgY2h1bmsxOSwgZXhlcmNpc2U9VFJVRX0NCml0ZW1zX3BlcnMgPSBjKDUsNCw1LDQpDQppdGVtX3ZhcnNfcGVycyA9IGMoMC4wNDMsIDAuNDk1LCAwLjk3MiwgMC4wODApICMgIlZhcmlhbmNlczogIg0KaW50ZXJjZXB0cyA9IGMoMS4wOTEsIDIuMTIzLCAyLjYxOCwgNC4wODYpICMgSW50ZXJjZXB0czoNCg0Kc3VtKChpdGVtc19wZXJzLWludGVyY2VwdHMpL2l0ZW1fdmFyc19wZXJzKS9zdW0oMS9pdGVtX3ZhcnNfcGVycykNCmBgYA0KDQokJFxsYXJnZSBcb3BlcmF0b3JuYW1le1NFfVxsZWZ0KFxoYXR7XHRoZXRhfV97XHRleHQge1BlcnNvbiB9fVxyaWdodCk9XGZyYWN7MX17XHNxcnR7XHN1bV97aT0xfV57a30gXGZyYWN7MX17ViBBIFJcbGVmdChcdmFyZXBzaWxvbl97aX1ccmlnaHQpfX19JCQNCg0KYGBge3IgY2h1bmsyMCwgZXhlcmNpc2U9VFJVRX0NCml0ZW1fdmFyc19wZXJzID0gYygwLjA0MywgMC40OTUsIDAuOTcyLCAwLjA4MCkgIyAiVmFyaWFuY2VzOiAiDQoNCjEvc3FydChzdW0oMS9pdGVtX3ZhcnNfcGVycykpDQpgYGANCg0KYGBge3IgY2h1bmsyMSwgZXhlcmNpc2U9VFJVRX0NCiMgS29uZmlkZW56aW50ZXJ2YWxsDQppdGVtc19wZXJzID0gYyg1LDQsNSw0KQ0KaXRlbV92YXJzX3BlcnMgPSBjKDAuMDQzLCAwLjQ5NSwgMC45NzIsIDAuMDgwKSAjICJWYXJpYW5jZXM6ICINCmludGVyY2VwdHMgPSBjKDEuMDkxLCAyLjEyMywgMi42MTgsIDQuMDg2KSAjIEludGVyY2VwdHM6DQpjb25mLmxldmVsID0gMC45NQ0KDQplc3RfcGVycyA9IHN1bSgoaXRlbXNfcGVycy1pbnRlcmNlcHRzKS9pdGVtX3ZhcnNfcGVycykvc3VtKDEvaXRlbV92YXJzX3BlcnMpDQpzdGRlcnJfcGVycyA9IDEvc3FydChzdW0oMS9pdGVtX3ZhcnNfcGVycykpDQoNCmMgPSBzdGRlcnJfcGVycyAqIHFub3JtKDEtKDEtY29uZi5sZXZlbCkvMikNCmMoZXN0X3BlcnMgLSBjLCBlc3RfcGVycyArIGMpDQpgYGANCg0KYGBge3IgY2h1bmsgNDYsIGV4ZXJjaXNlPVRSVUV9DQojIEdlZ2ViZW5lcyBLb25maWRlbnppbnRlcnZhbGwgLT4gTm9ybXdlcnRlDQpsb3dlcl9saW1pdF9wZXJzID0gLTMNCmhpZ2hlcl9saW1pdF9wZXJzID0gMg0KDQp2YXJfdGhldGEgPSA1ICMgVmFyaWFuY2VzOiBmIEVzdGltYXRlDQoNCm5vcm1fbWVhbiA9IDEwMA0Kbm9ybV9zdGQgPSAxNQ0KDQp6X2xvd2VyX2xpbWl0X3BlcnMgPSAobG93ZXJfbGltaXRfcGVycykvc3FydCh2YXJfdGhldGEpDQp6X2hpZ2hlcl9saW1pdF9wZXJzID0gKGhpZ2hlcl9saW1pdF9wZXJzKS9zcXJ0KHZhcl90aGV0YSkNCg0KYyhub3JtX21lYW4gKyBub3JtX3N0ZCAqIHpfbG93ZXJfbGltaXRfcGVycywgbm9ybV9tZWFuICsgbm9ybV9zdGQgKiB6X2hpZ2hlcl9saW1pdF9wZXJzKQ0KYGBgDQoNCiMjIyBUYXUta29uZ2VuZXJpc2NoZXMgTW9kZWxsIHsjZWZ0YXVrb259DQoNCiQkXGxhcmdlIFpfe2kgXHRleHQgeyBQZXJzb24gfX09XGZyYWN7WF97aSBcdGV4dCB7IFBlcnNvbiB9fS1FXGxlZnQoWF97aX1ccmlnaHQpfXtcc3FydHtcb3BlcmF0b3JuYW1le1ZBUn1cbGVmdChYX3tpfVxyaWdodCl9fT1cZnJhY3tYX3tpIFx0ZXh0IHsgUGVyc29uIH19LVxzaWdtYV97aX19e1xzcXJ0e1xvcGVyYXRvcm5hbWV7VkFSfVxsZWZ0KFhfe2l9XHJpZ2h0KX19JCQNCmBgYHtyIGNodW5rMjIsIGV4ZXJjaXNlPVRSVUV9DQppdGVtc19wZXJzID0gYygzLDEsMywyKQ0KaXRlbV92YXJzX3BlcnMgPSBjKDEsIDEuMSwgMiwgMS4yKSAjIE5pY2h0IGFibGVzYmFyIGF1cyBOb3Jtc3RpY2hwcm9iZSENCmludGVyY2VwdHMgPSBjKDEuMDMzLCAyLjAwMiwgMi40OTUsIDQuMDE0KSAjIEludGVyY2VwdHM6DQoNCnpfaXRlbXNfcGVycyA9IChpdGVtc19wZXJzIC0gaW50ZXJjZXB0cykvc3FydChpdGVtX3ZhcnNfcGVycykNCmBgYA0KDQokJFxsYXJnZSBcaGF0e1x0aGV0YX1fe1x0ZXh0IHtQZXJzb24gfX09XGZyYWN7XHN1bV97aT0xfV57a30gXGZyYWN7XGJldGFfe3ogaX0gXGNkb3QgWl97aSBQIGUgciBzIG8gbn19ezEtXGJldGFfe3ogaX1eezJ9fX17XHN1bV97aT0xfV57a30gXGZyYWN7XGJldGFfe3ogaX1eezJ9fXsxLVxiZXRhX3t6IGl9XnsyfX19JCQNCmBgYHtyIGNodW5rMjMsIGV4ZXJjaXNlPVRSVUV9DQppdGVtc19wZXJzID0gYygzLDEsMywyKQ0KaXRlbV92YXJzX3BlcnMgPSBjKDEsIDEuMSwgMiwgMS4yKSAjIE5pY2h0IGFibGVzYmFyIGF1cyBOb3Jtc3RpY2hwcm9iZSENCmludGVyY2VwdHMgPSBjKDEuMDMzLCAyLjAwMiwgMi40OTUsIDQuMDE0KSAjIEludGVyY2VwdHM6DQpiZXRhX3ogPSBjKDAuOTk1LCAwLjU3NiwgMC43MDMsIDAuOTgxKSAjICJMYXRlbnQgVmFyaWFibGVzOiBTdGQuYWxsIg0KDQp6X2l0ZW1zX3BlcnMgPSAoaXRlbXNfcGVycyAtIGludGVyY2VwdHMpL3NxcnQoaXRlbV92YXJzX3BlcnMpDQoNCnN1bSgoYmV0YV96KnpfaXRlbXNfcGVycykvKDEtYmV0YV96XjIpKS9zdW0oYmV0YV96XjIvKDEtYmV0YV96XjIpKQ0KYGBgDQoNCiQkXGxhcmdlIFMgRVxsZWZ0KFxoYXR7XHRoZXRhfV97XHRleHQge1BlcnNvbiB9fVxyaWdodCk9XGZyYWN7MX17XHNxcnR7XHN1bV97aT0xfV57a30gXGZyYWN7XGJldGFfe3ogaX1eezJ9fXsxLVxiZXRhX3t6IGl9XnsyfX19fSQkDQoNCmBgYHtyIGNodW5rMjQsIGV4ZXJjaXNlPVRSVUV9DQppdGVtc19wZXJzID0gYygzLDEsMywyKQ0KaXRlbV92YXJzX3BlcnMgPSBjKDEsIDEuMSwgMiwgMS4yKSAjIE5pY2h0IGFibGVzYmFyIGF1cyBOb3Jtc3RpY2hwcm9iZSENCmludGVyY2VwdHMgPSBjKDEuMDMzLCAyLjAwMiwgMi40OTUsIDQuMDE0KSAjICJJbnRlcmNlcHRzOiAiDQpiZXRhX3ogPSBjKDAuOTk1LCAwLjU3NiwgMC43MDMsIDAuOTgxKSAjICJMYXRlbnQgVmFyaWFibGVzOiBTdGQuYWxsIg0KDQp6X2l0ZW1zX3BlcnMgPSAoaXRlbXNfcGVycyAtIGludGVyY2VwdHMpL3NxcnQoaXRlbV92YXJzX3BlcnMpDQoNCjEvc3FydChzdW0oYmV0YV96XjIvKDEtYmV0YV96XjIpKSkNCmBgYA0KDQpgYGB7ciBjaHVuazI1LCBleGVyY2lzZT1UUlVFfQ0KIyBLb25maWRlbnppbnRlcnZhbGwNCml0ZW1zX3BlcnMgPSBjKDMsMSwzLDIpDQppdGVtX3ZhcnNfcGVycyA9IGMoMSwgMS4xLCAyLCAxLjIpICMgTmljaHQgYWJsZXNiYXIgYXVzIE5vcm1zdGljaHByb2JlIQ0KaW50ZXJjZXB0cyA9IGMoMS4wMzMsIDIuMDAyLCAyLjQ5NSwgNC4wMTQpICMgIkludGVyY2VwdHM6ICINCmJldGFfeiA9IGMoMC45OTUsIDAuNTc2LCAwLjcwMywgMC45ODEpICMgIkxhdGVudCBWYXJpYWJsZXM6IFN0ZC5hbGwiDQpjb25mLmxldmVsID0gMC45NQ0KDQp6X2l0ZW1zX3BlcnMgPSAoaXRlbXNfcGVycyAtIGludGVyY2VwdHMpL3NxcnQoaXRlbV92YXJzX3BlcnMpDQoNCmVzdF9wZXJzID0gc3VtKChiZXRhX3oqel9pdGVtc19wZXJzKS8oMS1iZXRhX3peMikpL3N1bShiZXRhX3peMi8oMS1iZXRhX3peMikpDQpzdGRlcnJfcGVycyA9IDEvc3FydChzdW0oYmV0YV96XjIvKDEtYmV0YV96XjIpKSkNCg0KYyA9IHN0ZGVycl9wZXJzICogcW5vcm0oMS0oMS1jb25mLmxldmVsKS8yKQ0KYyhlc3RfcGVycyAtIGMsIGVzdF9wZXJzICsgYykNCmBgYA0KDQpgYGB7ciBjaHVuayA0MSwgZXhlcmNpc2U9VFJVRX0NCiMgR2VnZWJlbmVzIEtvbmZpZGVuemludGVydmFsbCAtPiBOb3Jtd2VydGUNCmxvd2VyX2xpbWl0X3BlcnMgPSAwLjUgIyBCZXJlaXRzIFogc3RhbmRhcmRpc2llcnQNCmhpZ2hlcl9saW1pdF9wZXJzID0gMS4wICMgQmVyZWl0cyBaIHN0YW5kYXJkaXNpZXJ0DQoNCm5vcm1fbWVhbiA9IDEwMA0Kbm9ybV9zdGQgPSAxNQ0KDQpjKG5vcm1fbWVhbiArIG5vcm1fc3RkICogbG93ZXJfbGltaXRfcGVycywgbm9ybV9tZWFuICsgbm9ybV9zdGQgKiBoaWdoZXJfbGltaXRfcGVycykNCmBgYA0KDQojIyMgTWVocmRpbWVuc2lvbmFsZXMgdGF1LWtvbmdlbmVyaXNjaGVzIE1vZGVsbA0KDQpFaW5mYWNoc3RydWt0dXIgLT4gYXVmdGVpbGVuIHVuZCBtZWhyZXJlIGVpbmRpbWVuc2lvbmFsZSB0YXUta29uZ2VuZXJpc2NoZSBNb2RlbGxlIGJldHJhY2h0ZW4NCg0KIyMjIEFwcHJveGltYXRpdmUgS29uZmlkZW56aW50ZXJ2YWxsZQ0KDQpXZW5uIG1vZGVsbGJhc2llcnRlIEtvbnN0dWt0aW9uIGVpbmVzIEtvbmZpZGVuemludGVydmFsbHMgbmljaHQgbcO2Z2xpY2ggaXN0IChTdGFuZGFyZG1lc3NmZWhsZXIgdW5kL29kZXIgUGFyYW1ldGVyIG5pY2h0IGFuZ2VnZWJlbikNCktvbmZpZGVuemludGVydmFsbGUgaGllciBkZXV0bGljaCBicmVpdGVyDQoNCiQkXGxhcmdlIFMgRVxsZWZ0KFxoYXR7XHRoZXRhfV97XHRleHQge1BlcnNvbiB9fVxyaWdodCk9XHNxcnR7XG9wZXJhdG9ybmFtZXtWQVJ9KFgpIFxjZG90KDEtXG9wZXJhdG9ybmFtZXtSZWx9KFgpKX0kJA0KYGBge3IgY2h1bmszNCwgZXhlcmNpc2U9VFJVRX0NCnZhcl9ub3JtID0gMC4wNA0KcmVsID0gMC44DQoNCnNxcnQodmFyX25vcm0qKDEtcmVsKSkNCg0KYGBgDQoNCiMjIyBOb3Jtb3JpZW50aWVydGUgSW50ZXJwcmV0YXRpb24gS0kgeyNlZmludGVyfQ0KDQokJFxsYXJnZSBJXGxlZnQoWF97MSBcdGV4dCB7IFBlcnNvbiB9fSwgWF97MiBcdGV4dCB7IFBlcnNvbiB9fSwgXGxkb3RzLCBYX3trIFx0ZXh0IHsgUGVyc29uIH19XHJpZ2h0KT1bVVAsT1BdJCQNCg0KSW50ZXJ2YWxsIGRlciBXZXJ0ZSwgZGllIGFscyAiRHVyY2hzY2huaXR0IiB6w6RobGVuOg0KDQokJFxsYXJnZSAgW0UoXHRoZXRhKS1cc3FydHtcb3BlcmF0b3JuYW1le1ZBUn0oXHRoZXRhKX0sIEUoXHRoZXRhKStcc3FydHtcb3BlcmF0b3JuYW1le1ZBUn0oXHRoZXRhKX0gXSA9IFtVRCwgT0RdICQkDQoNCiogJE9QIDwgVUQgXGltcGxpZXMkIHVudGVyZHVyY2hzY2huaXR0bGljaA0KDQoqICRVUCA8IFVEIDwgT1AgXGxhbmQgT1AgPCBPRCBcaW1wbGllcyQgdW50ZXJkdXJjaHNjaG5pdHRsaWNoIGJpcyBkdXJjaHNjaG5pdHRsaWNoDQoNCiogJFVEIDwgVVAgXGxhbmQgT1AgPCBPRCBcaW1wbGllcyQgZHVyY2hzY2huaXR0bGljaA0KDQoqICRVRCA8IFVQIDwgT0QgXGxhbmQgT0QgPCBPUCBcaW1wbGllcyQgZHVyY2hzY2huaXR0bGljaCBiaXMgw7xiZXJkdXJjaHNjaG50dGxpY2gNCg0KKiAkVUQgPCBVUCBcaW1wbGllcyQgw7xiZXJkdXJjaHNjaG5pdHRsaWNoDQoNCg0KYGBge3IgY2h1bmszNSwgZXhlcmNpc2U9VFJVRX0NCnZhcl9ub3JtID0gMC4wNA0KZXN0X25vcm0gPSAwLjgNCg0KbG93ZXJfbGltaXRfcGVycyA9IDAuNA0KaGlnaGVyX2xpbWl0X3BlcnMgPSAwLjcgDQoNCmxvd2VyX2xpbWl0X25vcm1hdmcgPSBlc3Rfbm9ybSAtIHNxcnQodmFyX25vcm0pDQpoaWdoZXJfbGltaXRfbm9ybWF2ZyA9IGVzdF9ub3JtICsgc3FydCh2YXJfbm9ybSkNCg0KcGFzdGUoIkF2ZyBJbnRlcnZhbGw6IFsiLGxvd2VyX2xpbWl0X25vcm1hdmcsIjsiLGhpZ2hlcl9saW1pdF9ub3JtYXZnLCJdIikNCg0KaWYoaGlnaGVyX2xpbWl0X3BlcnMgPCBsb3dlcl9saW1pdF9ub3JtYXZnKXtwcmludCgidW50ZXJkdXJjaHNjaG5pdHRsaWNoIikNCn1lbHNlIGlmKA0KICBsb3dlcl9saW1pdF9wZXJzIDwgbG93ZXJfbGltaXRfbm9ybWF2ZyAmIA0KICBsb3dlcl9saW1pdF9ub3JtYXZnIDwgaGlnaGVyX2xpbWl0X3BlcnMgJiANCiAgaGlnaGVyX2xpbWl0X3BlcnMgPCBoaWdoZXJfbGltaXRfbm9ybWF2Zw0KICApe3ByaW50KCJ1bnRlcmR1cmNoc2Nobml0dGxpY2ggYmlzIGR1cmNoc2Nobml0dGxpY2giKQ0KfWVsc2UgaWYoDQogIGxvd2VyX2xpbWl0X25vcm1hdmcgPCBsb3dlcl9saW1pdF9wZXJzICYNCiAgaGlnaGVyX2xpbWl0X3BlcnMgPCBoaWdoZXJfbGltaXRfbm9ybWF2Zw0KICApe3ByaW50KCJkdXJjaHNjaG5pdHRsaWNoIikNCn1lbHNlIGlmKA0KICBsb3dlcl9saW1pdF9ub3JtYXZnIDwgbG93ZXJfbGltaXRfcGVycyAmIA0KICBsb3dlcl9saW1pdF9wZXJzIDwgaGlnaGVyX2xpbWl0X25vcm1hdmcgJiANCiAgaGlnaGVyX2xpbWl0X25vcm1hdmcgPCBoaWdoZXJfbGltaXRfcGVycw0KICApe3ByaW50KCJkdXJjaHNjaG5pdHRsaWNoIGJpcyDDvGJlcmR1cmNoc2Nobml0dGxpY2giKQ0KfSBlbHNlIGlmKGhpZ2hlcl9saW1pdF9ub3JtYXZnIDwgbG93ZXJfbGltaXRfcGVycyl7cHJpbnQoIsO8YmVyZHVyY2hzY2huaXR0bGljaCIpDQp9IGVsc2Uge3ByaW50KCJDaGVjayBpbnB1dCBmb3IgZXJyb3JzIil9DQpgYGANCg0KIyMjIEh5cG90aGVzZW50ZXN0IHsjZWZoeXBvfQ0KDQokJFxsYXJnZSBaIFxzaW0gTigwLDEpJCQNCg0KIyMjIyBVbnRlcnNjaGllZCB2b24gdm9yZ2VnZWJlbmVtIFdlcnQNCg0KJCRcbGFyZ2UgDQpaPVxmcmFje1xoYXR7XHRoZXRhfV97XHRleHQge1BlcnNvbiB9fS1cdGhldGFfezB9fXtcb3BlcmF0b3JuYW1le1NFfVxsZWZ0KFxoYXR7XHRoZXRhfV97XHRleHQge1BlcnNvbiB9fVxyaWdodCl9DQokJA0KDQpgYGB7ciBjaHVuayAyNjUsIGV4ZXJjaXNlPVRSVUV9DQp0aGV0YTAgPSA2Ny41DQplc3RfcGVycyA9IDU3LjUNCnN0ZGVycl9wZXJzID0gMi40Nw0KDQooZXN0X3BlcnMtdGhldGEwKS9zdGRlcnJfcGVycw0KYGBgDQoNCg0KJCQgXGxhcmdlDQpcYmVnaW57YWxpZ25lZH0NCiZIX3swfTogXHRoZXRhX3tcdGV4dCB7UGVyc29uIH19PVx0aGV0YV97MH0gXFwNCiZIX3sxfTogXHRoZXRhX3tcdGV4dCB7UGVyc29uIH19IFxuZXEgXHRoZXRhX3swfQ0KXGVuZHthbGlnbmVkfSQkDQoNCg0KYGBge3IgY2h1bmsyNywgZXhlcmNpc2U9VFJVRX0NCiMgSHlwb3RoZXNlbnRlc3Qgdm9uIEhhbmQgLSBCZWlkc2VpdGlnDQphbHBoYSA9IDAuMDUNCnRoZXRhMCA9IDUwDQoNCmVzdF9wZXJzID0gNTcuNQ0Kc3RkZXJyX3BlcnMgPSAyLjQ3DQoNCmtsaW5rcyA9IHFub3JtKGFscGhhLzIpDQprcmVjaHRzID0gcW5vcm0oMS0oYWxwaGEvMikpDQpwYXN0ZSgiS3JpdC4gQmVyZWljaDogXS1JTkY7Iiwga2xpbmtzLCJdIFsiLCBrcmVjaHRzLCAiOyBJTkZbIiwgc2VwPSIiKQ0KDQp6ID0gKGVzdF9wZXJzLXRoZXRhMCkvc3RkZXJyX3BlcnMNCnBhc3RlKCJSZWFsaXNpZXJ1bmcgVGVzdHN0YXRpc3RpazogIix6KQ0KDQpwID0gaWYoeiA8PSAwKSAyKnBub3JtKHopIGVsc2UgMipwbm9ybSgteikNCnBhc3RlKCJwLVdlcnQ6ICIsIHApDQoNCmlmKHAgPD0gYWxwaGEpIHByaW50KCJIMSBhbm5laG1lbiIpIGVsc2UgcHJpbnQoIkgwIGFubmVobWVuIikNCmBgYA0KDQokJCBcbGFyZ2UNClxiZWdpbnthbGlnbmVkfQ0KJkhfezB9OiBcdGhldGFfe1x0ZXh0IHtQZXJzb24gfX0gXGxlcSBcdGhldGFfezB9IFxcDQomSF97MX06IFx0aGV0YV97XHRleHQge1BlcnNvbiB9fT5cdGhldGFfezB9DQpcZW5ke2FsaWduZWR9DQokJA0KDQpgYGB7ciBjaHVuazI4LCBleGVyY2lzZT1UUlVFfQ0KIyBIeXBvdGhlc2VudGVzdCB2b24gSGFuZCAtIFJlY2h0c2dlcmljaHRldA0KYWxwaGEgPSAwLjA1DQp0aGV0YTAgPSA1MA0KDQplc3RfcGVycyA9IDU3LjUNCnN0ZGVycl9wZXJzID0gMi40Nw0KDQprcmVjaHRzID0gcW5vcm0oMS1hbHBoYSkNCnBhc3RlKCJLcml0LiBCZXJlaWNoOiBbIiwga3JlY2h0cywiO0lORlsiLCBzZXA9IiIpDQoNCnogPSAoZXN0X3BlcnMtdGhldGEwKS9zdGRlcnJfcGVycw0KcGFzdGUoIlJlYWxpc2llcnVuZyBUZXN0c3RhdGlzdGlrOiAiLHopDQoNCnAgPSAxLXBub3JtKHopDQpwYXN0ZSgicC1XZXJ0OiAiLCBwKQ0KDQppZihwIDw9IGFscGhhKSBwcmludCgiSDEgYW5uZWhtZW4iKSBlbHNlIHByaW50KCJIMCBhbm5laG1lbiIpDQpgYGANCiQkIFxsYXJnZQ0KXGJlZ2lue2FsaWduZWR9DQomSF97MH06IFx0aGV0YV97XHRleHQge1BlcnNvbiB9fSBcZ2VxIFx0aGV0YV97MH0gXFwNCiZIX3sxfTogXHRoZXRhX3tcdGV4dCB7UGVyc29uIH19PFx0aGV0YV97MH0NClxlbmR7YWxpZ25lZH0NCiQkDQoNCmBgYHtyIGNodW5rMjksIGV4ZXJjaXNlPVRSVUV9DQojIEh5cG90aGVzZW50ZXN0IHZvbiBIYW5kIC0gTGlua3NnZXJpY2h0ZXQNCmFscGhhID0gMC4wNQ0KdGhldGEwID0gNTANCg0KZXN0X3BlcnMgPSA1Ny41DQpzdGRlcnJfcGVycyA9IDIuNDcNCmtsaW5rcyA9IHFub3JtKGFscGhhKQ0KcGFzdGUoIktyaXQuIEJlcmVpY2g6IF0gLUlORjsiLCBrbGlua3MsIl0iLCBzZXA9IiIpDQoNCnogPSAoZXN0X3BlcnMtdGhldGEwKS9zdGRlcnJfcGVycw0KcGFzdGUoIlJlYWxpc2llcnVuZyBUZXN0c3RhdGlzdGlrOiAiLHopDQoNCnAgPSBwbm9ybSh6KQ0KcGFzdGUoInAtV2VydDogIiwgeikNCg0KaWYocCA8PSBhbHBoYSkgcHJpbnQoIkgxIGFubmVobWVuIikgZWxzZSBwcmludCgiSDAgYW5uZWhtZW4iKQ0KYGBgDQoNCiMjIyMgVW50ZXJzY2hpZWQgendlaSBQZXJzb25lbg0KDQokJFxsYXJnZQ0KWj1cZnJhY3tcaGF0e1x0aGV0YX1fe1x0ZXh0IHtQZXJzb24gfSAxfS1caGF0e1x0aGV0YX1fe1x0ZXh0IHtQZXJzb24gfSAyfX17XHNxcnR7Mn0gXGNkb3QgUyBFXGxlZnQoXGhhdHtcdGhldGF9X3tcdGV4dCB7UGVyc29uIH19XHJpZ2h0KX0NCiQkDQpgYGB7ciBjaHVuazMwLCBleGVyY2lzZT1UUlVFfQ0KZXN0X3BlcnMxID0gNjcuNQ0KZXN0X3BlcnMyID0gNTcuNQ0Kc3RkZXJyX3BlcnMgPSAyLjQ3DQoNCihlc3RfcGVyczEtZXN0X3BlcnMyKS8oc3FydCgyKSpzdGRlcnJfcGVycykNCmBgYA0KDQokJFxsYXJnZQ0KXGJlZ2lue2FsaWduZWR9DQomSF97MH06IFx0aGV0YV97XHRleHQge1BlcnNvbiB9IDF9PVx0aGV0YV97XHRleHQge1BlcnNvbiB9IDJ9IFxcDQomSF97MX06IFx0aGV0YV97XHRleHQge1BlcnNvbiB9IDF9IFxuZXEgXHRoZXRhX3tcdGV4dCB7UGVyc29uIH0gMn0NClxlbmR7YWxpZ25lZH0NCiQkDQoNCmBgYHtyIGNodW5rMzEsIGV4ZXJjaXNlPVRSVUV9DQojIEh5cG90aGVzZW50ZXN0IHZvbiBIYW5kIC0gQmVpZHNlaXRpZw0KYWxwaGEgPSAwLjA1DQoNCmVzdF9wZXJzMSA9IDY3LjUNCmVzdF9wZXJzMiA9IDU3LjUNCnN0ZGVycl9wZXJzID0gMi40Nw0KDQprbGlua3MgPSBxbm9ybShhbHBoYS8yKQ0Ka3JlY2h0cyA9IHFub3JtKDEtKGFscGhhLzIpKQ0KcGFzdGUoIktyaXQuIEJlcmVpY2g6IF0tSU5GOyIsIGtsaW5rcywiXSBbIiwga3JlY2h0cywgIjsgSU5GWyIsIHNlcD0iIikNCg0KeiA9IChlc3RfcGVyczEtZXN0X3BlcnMyKS8oc3FydCgyKSpzdGRlcnJfcGVycykNCnBhc3RlKCJSZWFsaXNpZXJ1bmcgVGVzdHN0YXRpc3RpazogIix6KQ0KDQpwID0gaWYoeiA8PSAwKSAyKnBub3JtKHopIGVsc2UgMipwbm9ybSgteikNCnBhc3RlKCJwLVdlcnQ6ICIsIHApDQoNCmlmKHAgPD0gYWxwaGEpIHByaW50KCJIMSBhbm5laG1lbiIpIGVsc2UgcHJpbnQoIkgwIGFubmVobWVuIikNCmBgYA0KDQokJFxsYXJnZQ0KXGJlZ2lue2FsaWduZWR9DQomSF97MH06IFx0aGV0YV97XHRleHQge1BlcnNvbiB9IDF9XGxlcVx0aGV0YV97XHRleHQge1BlcnNvbiB9IDJ9IFxcDQomSF97MX06IFx0aGV0YV97XHRleHQge1BlcnNvbiB9IDF9ID4gXHRoZXRhX3tcdGV4dCB7UGVyc29uIH0gMn0NClxlbmR7YWxpZ25lZH0NCiQkDQpgYGB7ciBjaHVuazMyLCBleGVyY2lzZT1UUlVFfQ0KIyBIeXBvdGhlc2VudGVzdCB2b24gSGFuZCAtIFJlY2h0c2dlcmljaHRldA0KYWxwaGEgPSAwLjA1DQoNCmVzdF9wZXJzMSA9IDY3LjUNCmVzdF9wZXJzMiA9IDU3LjUNCnN0ZGVycl9wZXJzID0gMi40Nw0KDQprcmVjaHRzID0gcW5vcm0oMS1hbHBoYSkNCnBhc3RlKCJLcml0LiBCZXJlaWNoOiBbIiwga3JlY2h0cywiO0lORlsiLCBzZXA9IiIpDQoNCnogPSAoZXN0X3BlcnMxLWVzdF9wZXJzMikvKHNxcnQoMikqc3RkZXJyX3BlcnMpDQpwYXN0ZSgiUmVhbGlzaWVydW5nIFRlc3RzdGF0aXN0aWs6ICIseikNCg0KcCA9IDEtcG5vcm0oeikNCnBhc3RlKCJwLVdlcnQ6ICIsIHApDQoNCmlmKHAgPD0gYWxwaGEpIHByaW50KCJIMSBhbm5laG1lbiIpIGVsc2UgcHJpbnQoIkgwIGFubmVobWVuIikNCmBgYA0KDQokJFxsYXJnZQ0KXGJlZ2lue2FsaWduZWR9DQomSF97MH06IFx0aGV0YV97XHRleHQge1BlcnNvbiB9IDF9XGdlcVx0aGV0YV97XHRleHQge1BlcnNvbiB9IDJ9IFxcDQomSF97MX06IFx0aGV0YV97XHRleHQge1BlcnNvbiB9IDF9IDwgXHRoZXRhX3tcdGV4dCB7UGVyc29uIH0gMn0NClxlbmR7YWxpZ25lZH0NCiQkDQoNCmBgYHtyIGNodW5rMzMsIGV4ZXJjaXNlPVRSVUV9DQojIEh5cG90aGVzZW50ZXN0IHZvbiBIYW5kIC0gTGlua3NnZXJpY2h0ZXQNCmFscGhhID0gMC4wNQ0KDQplc3RfcGVyczEgPSA2Ny41DQplc3RfcGVyczIgPSA1Ny41DQpzdGRlcnJfcGVycyA9IDIuNDcNCg0Ka2xpbmtzID0gcW5vcm0oYWxwaGEpDQpwYXN0ZSgiS3JpdC4gQmVyZWljaDogXSAtSU5GOyIsIGtsaW5rcywiXSIsIHNlcD0iIikNCg0KeiA9IChlc3RfcGVyczEtZXN0X3BlcnMyKS8oc3FydCgyKSpzdGRlcnJfcGVycykNCnBhc3RlKCJSZWFsaXNpZXJ1bmcgVGVzdHN0YXRpc3RpazogIix6KQ0KDQpwID0gcG5vcm0oeikNCnBhc3RlKCJwLVdlcnQ6ICIsIHApDQoNCmlmKHAgPD0gYWxwaGEpIHByaW50KCJIMSBhbm5laG1lbiIpIGVsc2UgcHJpbnQoIkgwIGFubmVobWVuIikNCmBgYA0KDQojIyMjIFVudGVyc2NoaWVkIHp3ZWkgWmVpdHB1bmt0ZQ0KDQokJFxsYXJnZQ0KWj1cZnJhY3tcaGF0e1x0aGV0YX1fe1x0ZXh0IHtQZXJzb25aZWl0cHVua3QgfSAxfS1caGF0e1x0aGV0YX1fe1x0ZXh0IHtQZXJzb25aZWl0cHVua3QgfSAyfX17XHNxcnR7Mn0gXGNkb3QgUyBFXGxlZnQoXGhhdHtcdGhldGF9X3tcdGV4dCB7UGVyc29uIH19XHJpZ2h0KX0NCiQkDQpSIENvZGUgaWRlbnRpc2NoIHp1IGRlbSBmw7xyIDIgdW50ZXJzY2hpZWRsaWNoZSBQZXJzb25lbg0K