About

Questions

  • Which outcome makes the most sense: looking at RTPUSH and RTPULL, or at the bias scores?
  • Which statistical test(s) would be most appropriate for each aim?
  • How to set up planned contrasts correctly
  • Which covariates to include (e.g., controlling for order effects)

At a glance

  • 39 bereaved participants
  • Randomized double-blind placebo-controlled crossover design
      • Two treatments (thus two timepoints): oxytocin or placebo
  • Primary outcome is task performance (reaction time, OR bias scores)
  • Primary independent variables are grief severity (categorical: CG/NCG), treatment (oxytocin/placebo), and stimulus (5 different categories)

Study description

This project uses behavioral and self-report data from the study “The effect of intranasal oxytocin on neural functioning in widow(er)s” (#1503744420, PI: Mary-Frances O’Connor, Co-PI: Brian Arizmendi). It was a double-blind randomized crossover study using an intranasal oxytocin manipulation and approach-avoidance task variant (grief AAT; gAAT) to investigate conflicting accounts of motivated behavior in people with complicated grief. Enrolled participants were older adults who had experienced the death of a spouse or long-term romantic partner between 6-36 months prior to their participation. Stratified sampling was used to ensure a range of grief symptom severity scores was represented in the sample.

Participants attended two identical experimental sessions, at which they received one of two intranasal sprays (oxytocin or placebo) and then took part in an fMRI scan, during which time they completed the task.

Task (gAAT)

In the gAAT, five stimulus categories were presented:

  1. Personal photos of the deceased spouse,
  2. Personal photos of a living loved one,
  3. Photos of a female or male stranger,
  4. Grief-related scenes, and
  5. Neutral scenes.

Photos provided by the participant were scanned,resized, and framed with blue/yellow frames to match the other stimuli used in the task. Photos of the stranger were sex-matched to the participant’s partner.

Participants completed the task using a joystick. The stimuli were animated so that a joystick push would make the image smaller (as if they were pushing it away) and a joystick pull would make the image larger (as if they were bringing it closer).

Participants were instructed to respond during the task to the color of a photo’s frame, e.g., push the joystick when the frame is BLUE, pull when the frame is YELLOW”). Once participants had completed the first run of the task (144 trials), they completed a second run that was identical to the first except for the instructions, which were reversed (e.g. “now push the joystick for YELLOW and pull for BLUE”). Order of instructions was counterbalanced across participants. Stimuli were presented via Inquisit 4 (2014), in a pseudorandomized order determined by genetic algorithm to optimize statistical power and psychological validity (Wager & Nichols, 2003). Each trial last 3000ms, with 2500 ms allowed for response. Intertrial interval was 500ms.

What should we use as DV?

MFO:
Should it be RT to one stimulus type, RT to the contrast of one stimuli type > another, or compatibility scores? Compatibility scores have felt the easiest for me to understand and compare (and they were what at least one of our reviewers was expecting). Is it true that using compatibility scores as a DV has the advantage of reducing the number of predictors in any of our models (as they remove the need for response direction if those are summed in the DV)?

BA:
I agree with this point, and do believe that converting push/pull to one compatibility score as the DV could work well to reduce the number of predictors. This might be good considering w the power issue.

SS:
Yes, it is true that if we use bias scores we do not include “direction” as a predictor.

On the other hand, if we use the mixed effects modeling approach, we have vastly more power because we then have ~288 observations per person per session (so ~576 each subject, if using data from both OT and PL sessions) rather than 10 observations (i.e., 5 stimuli x 2 directions, using medians to compute bias) per person/session. So having “direction” as a predictor is less of an issue.

Either way, I think using the bias scores for figures is helpful in depicting approach/avoid tendencies.

  • Pros of “direction” model: Being able to identify whether the change in bias is driven by faster/slower push or pull is potentially useful. More power than bias scores (more observations - unless we use the trial-level bias scores, which I’m not sure that we should.)

  • Cons of “direction” model: May be more difficult to interpret given the additional level in the interactions (potential 4-way).

Side note: I find the term “compatibility scores” confusing (vs. “bias scores”). I know that’s what Rinck & Becker used, but I think the term “compatibility” only makes sense when you have a sense of what people’s natural response tendencies are – in their paper, they had participants who were afraid of spiders, so a negative compatibility score (faster to pull than push) indicated a compatibility or congruency between their behavior on the task and real-world behaviors. I think the thing that’s always confused me about the use of the term in this project is, compatible with what? We need a strong a priori hypothesis about which tendency the group will show in order for this term to make sense (IMO)

What statistical test should we use?

MFO:
MLM seems unnecessarily complicated after all. I’m generally pro-regression.

BA:
I agree that MLM appears unnecessarily complicated. My thoughts right now are that an RM-ANOVA would be the best way to go because:

  • It appears to be what some others (maccallum) are doing, and the creator of the AAT has published results using this method. It is likely more digestible by reviewers as well.

  • MLM has several advantages in many paradigms, but not necessarily here (e.g., we do not need to account for random effects or missing data). Thus RM-ANOVA is perhaps the simpler route. Link: For reference.
  • The RM-ANOVA and the MLM should theoretically yield very similar results for the reasons described in the previous point

  • Regarding regression: From my understanding, we have basically already done this in MLM. The last line of the model of the MLM is a regression with all variables included… If we did a series of regressions like Eisma did, then we cannot directly compare stimuli types. If I’m understanding the Eisma paper correctly, that group ran a series of regressions, with one regression per stimulus type, and the DV was the median RT. So those conclusions CAN say, for instance: that rumination affects RT on this stimulus, and not on this one (for example) but they CANNOT say that rumination affects RT more or less on one stimulus type than on another stimulus type, because no direct comparison is made in a series of separate regressions.

SS:
Re: BA’s last point - right. I am not a fan of running 5 different regressions. We get an inflated chance of type I error (so would need to adjust our alpha accordingly), and as Brian said, we can’t directly compare stimulus effects. And as we saw from reviewer comment in green below, they’re likely to be skeptical of that approach. Regressions also don’t account for the fact that we have multiple observations that come from the same person.

My vote is that we use the linear mixed effects approach as our main approach (“mixed effects model” is just a different term for MLM – means we include both fixed [e.g., stimulus] and random [e.g., person] effects.) I think there’s a simpler way to do it than the MLM analyses Brian and I both did previous, which were pretty complicated. I’m calling it a mixed model here to distinguish it from those previous analyses but it’s just a different term for MLM.

  • Advantages: Gives us way more power!!! Therefore, we are able to test more complicated models, such as the three- and four-way interactions.

  • We do need to account for the random effect of subject. Regression does not allow us to account for the interdependence of the data. In a mixed model, we address the interdependence by nesting observations within person.

But I also think it makes sense to run the RM-ANOVA, and see how our results differ (or don’t), both because it may be easier to understand and because it’s consistent with what Maccallum did.

  • I propose a single 2 (Group) x 5 (Stimulus Type) [x 2 (Direction) if RT is DV] model - in the placebo data only - to address Aims 1 and 2. This could be LME or ANOVA.

  • Then for Aims 3 and 4, run the full model: 2 (Group) x 2 (Treatment) x 5 (Stimulus Type) [x 2 (Direction) if RT is DV]. This could be LME or ANOVA.

Reviewer comments

If I understand correctly, the authors ran a group (2) x response (2) x stimulus (2) x OT condition (2) analysis, for five of the possible ten stimulus pairs. It would seem more appropriate to run a single omnibus 2x2x5x2 analysis with all 5 stimuli.

SS:
I agree with this reviewer.

One result was that both grief groups showed an approach pattern for idiographic spouse images. This has some methodological implications for reaction time tests and is consistent with the reward component of grief. However, the theoretical contribution of the result is minimal.

The other primary result was that reaction time was slower in the CG group overall after OT administration. This was surprising in that there was no specific effect of stimulus x group x OT (a three way interaction) that would have been very interesting. The failure to obtain a three-way interaction is itself difficult to unpack. Because of the small sample, this study is vulnerable to a type II error. Indeed, this is the principal flaw here. It is difficult to know whether the effect is not present or merely wasn’t detected.

SS:
Using the trial-level data in MLM/mixed model solves the power problem.

Previous studies’ approaches

Note that the experimental design for the present study is not identical to the studies below.

Maccallum et al, 2015:

  • ANOVAs with direction (push or pull) and stimulus as predictors, and median reaction time as outcome.
  • Bias scores were not used as an outcome, but group means are presented (Table 2).

median RT to pull grief, positive, negative and abstract, and median RT to push grief, positive, negative and abstract stimuli. Compatibility effect scores were calculated by subtracting median RT’s in the pull condition from median RT’s in the push condition (Table 2).

A 2 (Group) x 2 (Prime) x 2 (Direction) x 4 (Stimulus Type) repeated measures ANOVA indicated a main effect for Stimulus Type [F(3,49) = 39.88, p < 001, η = 0.71], a significant 2- way interaction between Direction x Stimulus Type [F(3,49) = 6.29 p< .002, η = 0.27], and a significant 3-way interaction between Group x Direction x Stimulus Type, [F(3,49) = 3.79, , p < .017, η = 0.19].

Eisma et al, 2015:

  • Multiple regression analyses (a separate model for each stimulus category) with bias score as outcome and self-reported rumination as predictor.

Median RT’s for all stimuli were calculated for each stimulus type. To be able to test our hypotheses, we also determined push-pull scores for each stimulus type, which are calculated by deducting the Median RT’s for pull trials from the Median RT’s for the push trials.

Our main analyses consisted of multiple regression analyses, in which rumination levels were used as a predictor of reaction times (push-pull) for each stimulus type (deceased + loss word; deceased + neutral word; stranger + loss word; stranger + neutral word; puzzle + X’s).

In both papers, bias scores were computed as (median RTpush - median RTpull) within each stimulus category.

What questions are we trying to answer?

MFO:
These were the questions I thought the field would want to know, and the reviewer seemed to like.

Does intranasal oxytocin affect the CG and Non-CG reaction times differently?

Rephrased as aim:

Aim 3.
To identify whether effects of intranasal oxytocin differ in high-severity [CG group] versus low-severity [Non-CG group] participants.

Analysis
Look at the condition (2) x group (2) interaction in the following model:

Using bias scores:

  • Two within-subjects factors (stimulus [5], oxytocin or placebo [2]) and one between-subjects factor (group [2]).

Using push/pull RTs:

  • Three within-subjects factors (stimulus [5], push or pull [2], oxytocin or placebo [2]) and one between-subjects factor (group [2]).

If we see the expected interaction, then look at whether there is a within-group difference between OT and PL sessions.

See below for analysis & output…

Do those with CG respond differentially to spouse (vs. other stimuli) in the OT condition (vs. placebo) than those with Non-CG? (the question we might not be able to answer)

Rephrased as aim:

Aim 4. To identify whether the response to spouse images in the CG group significantly differs under intranasal oxytocin vs. placebo.

  • Or… whether any observed moderation of oxytocin effects by grief severity is specific to certain types of stimuli?

Look at the stimulus (5) xcondition (2) x group (2) interaction in the following model (same model for Aim 3 above):

Using bias scores:

  • Two within-subjects factors (stimulus [5], oxytocin or placebo [2]) and one between-subjects factor (group [2]).

Using push/pull RTs:

  • Three within-subjects factors (stimulus [5], push or pull [2], oxytocin or placebo [2]) and one between-subjects factor (group [2]).

If we see the expected interaction, then look at planned contrasts. We hypothesize that:

spouse,placebo,CG != spouse,oxytocin,CG

and that

spouse,placebo,NCG == spouse,oxytocin,NCG

(i.e., spouse in the placebo session is not equal to spouse in the oxytocin session, in the CG group only).

Aims 3/4 ANOVA (push/pull RTs)

####### Aims 3/4 model (ANOVA) ######
# A model with three within-subjects factors (stimulus [5], direction [2], treatment [2]) and one between-subjects factor (group [2])
## DV: RTs on push and pull trials separately
## Predicted: Treatment x Group interaction (Aim 3), Stimulus x Direction x Treatment x Group (Aim 4)
# RM-ANOVA
m3a <- aov_ez(id = "ID", dv = "gAAT_RT", data_long, between = "group", within = c("stimulus", "direction", "treatment"), fun_aggregate = median)
Contrasts set to contr.sum for the following variables: group
m3a
Anova Table (Type 3 tests)

Response: gAAT_RT
                               Effect           df       MSE        F    ges p.value
1                               group        1, 37 144383.07     1.75    .03     .19
2                            stimulus 3.64, 134.70   2601.07 9.40 ***    .01  <.0001
3                      group:stimulus 3.64, 134.70   2601.07     1.65   .002     .17
4                           direction        1, 37   6375.61   5.24 *   .004     .03
5                     group:direction        1, 37   6375.61     1.32   .001     .26
6                           treatment        1, 37  27850.76     1.97   .007     .17
7                     group:treatment        1, 37  27850.76     0.81   .003     .38
8                  stimulus:direction 3.44, 127.37   2391.65 8.63 ***   .009  <.0001
9            group:stimulus:direction 3.44, 127.37   2391.65     0.71  .0007     .57
10                 stimulus:treatment 3.79, 140.20   1656.19     1.09  .0009     .36
11           group:stimulus:treatment 3.79, 140.20   1656.19     0.90  .0007     .46
12                direction:treatment        1, 37   1843.57     0.37 <.0001     .55
13          group:direction:treatment        1, 37   1843.57   7.28 *   .002     .01
14       stimulus:direction:treatment 3.30, 122.16   1980.63     0.52  .0004     .69
15 group:stimulus:direction:treatment 3.30, 122.16   1980.63     0.24  .0002     .88
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘+’ 0.1 ‘ ’ 1

Sphericity correction method: GG 
# Stimulus is predictive in the model, but only alone or in interaction with direction.
# There is a significant three-way interaction of group x direction x treatment
# which looks like this:
emmip(m3a, treatment ~direction*group)

emmeans(m3a, ~c(treatment| direction*group), contr = "pairwise", adjust="holm")
$emmeans
direction = PUSH, group = NCG:
 treatment emmean   SE df lower.CL upper.CL
 placebo      748 20.0 37      707      788
 oxytocin     747 23.2 37      700      794

direction = PULL, group = NCG:
 treatment emmean   SE df lower.CL upper.CL
 placebo      721 18.7 37      683      759
 oxytocin     734 18.8 37      696      772

direction = PUSH, group = CG:
 treatment emmean   SE df lower.CL upper.CL
 placebo      758 22.7 37      712      804
 oxytocin     796 26.4 37      742      849

direction = PULL, group = CG:
 treatment emmean   SE df lower.CL upper.CL
 placebo      762 21.2 37      719      805
 oxytocin     779 21.4 37      736      823

Results are averaged over the levels of: stimulus 
Confidence level used: 0.95 

$contrasts
direction = PUSH, group = NCG:
 contrast           estimate   SE df t.ratio p.value
 placebo - oxytocin    0.377 17.5 37  0.022  0.9829 

direction = PULL, group = NCG:
 contrast           estimate   SE df t.ratio p.value
 placebo - oxytocin  -12.605 15.3 37 -0.825  0.4147 

direction = PUSH, group = CG:
 contrast           estimate   SE df t.ratio p.value
 placebo - oxytocin  -37.976 19.9 37 -1.907  0.0643 

direction = PULL, group = CG:
 contrast           estimate   SE df t.ratio p.value
 placebo - oxytocin  -17.500 17.4 37 -1.007  0.3206 

Results are averaged over the levels of: stimulus 

Pairwise comparisons indicate that the CG group showed a marginally significant difference between OT vs. PL on PUSH trials, averaged across stimuli, t = -1.91, p = .064.

Aims 3/4 Linear mixed model (push/pull RTs)

####### Aims 3/4 model (LME) ######
# A model with three within-subjects factors (stimulus [5], direction [2], treatment [2]) and one between-subjects factor (group [2])
## DV: RTs on push and pull trials separately
## Predicted: Treatment x Group interaction (Aim 3), Stimulus x Direction x Treatment x Group (Aim 4)
# Linear mixed model
m3b <- lme(gAAT_RT ~ stimulus*direction*treatment*group, data = data_long, random = ~ 1|ID, method="REML") 
anova(m3b)
                                   numDF denDF  F-value p-value
(Intercept)                            1 21931 3371.640  <.0001
stimulus                               4 21931   19.191  <.0001
direction                              1 21931   27.165  <.0001
treatment                              1 21931   43.261  <.0001
group                                  1    37    1.961  0.1698
stimulus:direction                     4 21931    8.848  <.0001
stimulus:treatment                     4 21931    1.448  0.2151
direction:treatment                    1 21931    0.016  0.8986
stimulus:group                         4 21931    1.951  0.0990
direction:group                        1 21931    0.751  0.3861
treatment:group                        1 21931   41.817  <.0001
stimulus:direction:treatment           4 21931    0.881  0.4741
stimulus:direction:group               4 21931    0.390  0.8163
stimulus:treatment:group               4 21931    0.338  0.8525
direction:treatment:group              1 21931   10.026  0.0015
stimulus:direction:treatment:group     4 21931    0.837  0.5017
# variance explained by the entire model 
fitted <- fitted(m3b)
data_long$fitted_m3b <- as.vector(fitted)
forR2 <- lm(gAAT_RT ~ fitted_m3b, data=data_long)
summary(forR2)

Call:
lm(formula = gAAT_RT ~ fitted_m3b, data = data_long)

Residuals:
    Min      1Q  Median      3Q     Max 
-442.10 -125.60  -36.63   88.27  988.45 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) -6.19743   11.59074  -0.535    0.593    
fitted_m3b   1.00786    0.01461  68.975   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 186 on 22006 degrees of freedom
Multiple R-squared:  0.1778,    Adjusted R-squared:  0.1777 
F-statistic:  4758 on 1 and 22006 DF,  p-value: < 2.2e-16

Like the ANOVA, the linear mixed effects model shows a significant three-way direction x treatment x group interaction. The model explains about 18% of the variance in the data (Adj. R = .177). It does differ from the ANOVA in that there is also a two-way treatment x group interaction (not interpreted in the presence of the higher-order interaction.)

Next, looking at the model summary tells us about some contrasts (but these are not the ones that we are really interested in so I won’t print the output table). Note that the model output includes tests of the null hypotheses that these differences are equal to zero.

summary(m3b)
# we can look at ALL pairwise comparisons using the emmeans package again, but this doesn't take into account the random effects?
emm.m3b1 <- emmeans(m3b, pairwise ~c(treatment | direction*group), adjust="holm") # emm.m3b1[["emmeans"]]@linfct gives us the contrast matrices for each pairwise comparison, this seems useful
NOTE: Results may be misleading due to involvement in interactions
emm.m3b1
$emmeans
direction = PULL, group = NCG:
 treatment emmean   SE df lower.CL upper.CL
 placebo      759 18.3 38      722      796
 oxytocin     769 18.3 38      732      806

direction = PUSH, group = NCG:
 treatment emmean   SE df lower.CL upper.CL
 placebo      781 18.3 38      744      818
 oxytocin     776 18.3 38      739      814

direction = PULL, group = CG:
 treatment emmean   SE df lower.CL upper.CL
 placebo      791 20.8 37      749      833
 oxytocin     818 20.8 37      775      860

direction = PUSH, group = CG:
 treatment emmean   SE df lower.CL upper.CL
 placebo      793 20.8 37      751      835
 oxytocin     837 20.8 37      795      879

Results are averaged over the levels of: stimulus 
d.f. method: containment 
Confidence level used: 0.95 

$contrasts
direction = PULL, group = NCG:
 contrast           estimate   SE    df t.ratio p.value
 placebo - oxytocin    -9.95 4.74 21931 -2.099  0.0358 

direction = PUSH, group = NCG:
 contrast           estimate   SE    df t.ratio p.value
 placebo - oxytocin     4.62 4.75 21931  0.974  0.3301 

direction = PULL, group = CG:
 contrast           estimate   SE    df t.ratio p.value
 placebo - oxytocin   -26.44 5.38 21931 -4.918  <.0001 

direction = PUSH, group = CG:
 contrast           estimate   SE    df t.ratio p.value
 placebo - oxytocin   -44.47 5.43 21931 -8.196  <.0001 

Results are averaged over the levels of: stimulus 
emmip(m3b, group*direction ~treatment)
NOTE: Results may be misleading due to involvement in interactions

Pairwise comparisons show that while the CG group is significantly slower to both PUSH and PULL under OT, the NCG group also gets a bit slower to PULL (but not PUSH) under OT.

Although there is no significant interaction with stimulus, it’s interesting to visualize what it looks like:

emmip(m3b, group*direction ~treatment|stimulus) # lmem

Here we can clearly see that the CG group’s RTs are longer across stimulus types in the OT condition.

Aims 3/4 ANOVA (bias scores)

####### Aims 3/4 model (ANOVA w/bias scores) ######
# A model with two within-subjects factors (stimulus [5], treatment [2]) and one between-subjects factor (group [2])
## DV: bias scores
## Predicted: Treatment x Group interaction (Aim 3), Stimulus x Treatment x Group (Aim 4)
# RM-ANOVA
m3c <- aov_ez(id = "ID", dv = "gAAT_bias", data_bias, between = "group", within = c("stimulus", "treatment"), fun_aggregate = median)
Contrasts set to contr.sum for the following variables: group
m3c
Anova Table (Type 3 tests)

Response: gAAT_bias
                    Effect           df      MSE        F   ges p.value
1                    group        1, 37 12751.21     1.32  .010     .26
2                 stimulus 3.44, 127.37  4783.31 8.63 ***   .08  <.0001
3           group:stimulus 3.44, 127.37  4783.31     0.71  .007     .57
4                treatment        1, 37  3687.15     0.37 .0008     .55
5          group:treatment        1, 37  3687.15   7.28 *   .02     .01
6       stimulus:treatment 3.30, 122.16  3961.26     0.52  .004     .69
7 group:stimulus:treatment 3.30, 122.16  3961.26     0.24  .002     .88
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘+’ 0.1 ‘ ’ 1

Sphericity correction method: GG 
# Stimulus is predictive in the model, but only alone.
# There is a significant two-way interaction of group x treatment
# which looks like this:
emmip(m3c, group ~ treatment)

emmeans(m3c, ~c(treatment|group), contr = "pairwise", adjust="holm") #pairwise comparisons of treatment within group
$emmeans
group = NCG:
 treatment emmean    SE df lower.CL upper.CL
 placebo    26.31  7.88 37    10.35     42.3
 oxytocin   13.33  9.35 37    -5.61     32.3

group = CG:
 treatment emmean    SE df lower.CL upper.CL
 placebo    -3.66  8.96 37   -21.82     14.5
 oxytocin   16.81 10.63 37    -4.73     38.4

Results are averaged over the levels of: stimulus 
Confidence level used: 0.95 

$contrasts
group = NCG:
 contrast           estimate   SE df t.ratio p.value
 placebo - oxytocin     13.0 8.19 37  1.586  0.1214 

group = CG:
 contrast           estimate   SE df t.ratio p.value
 placebo - oxytocin    -20.5 9.31 37 -2.198  0.0343 

Results are averaged over the levels of: stimulus 

There is a significant group x treatment interaction, such that the CG group became more approach-biased when given oxytocin. This is consistent with BA’s previous results.

Pairwise comparisons (treatment within group) confirm that the CG group is significantly more approach-biased in the OT condition.

We can also look at the pairwise comparisons for the main effect of stimulus, if that is useful/interesting in any way…

emmeans(m3c, ~c(stimulus), contr = "pairwise", adjust="holm") #pairwise comparisons of stimulus
$emmeans
 stimulus emmean   SE df lower.CL upper.CL
 neutral   -0.63 6.96 37   -14.73     13.5
 death     -6.58 9.48 37   -25.77     12.6
 living    27.67 9.45 37     8.51     46.8
 spouse    43.72 9.85 37    23.75     63.7
 stranger   1.79 7.49 37   -13.39     17.0

Results are averaged over the levels of: group, treatment 
Confidence level used: 0.95 

$contrasts
 contrast           estimate    SE df t.ratio p.value
 neutral - death        5.94 10.28 37  0.578  1.0000 
 neutral - living     -28.30  8.94 37 -3.165  0.0217 
 neutral - spouse     -44.35  9.57 37 -4.636  0.0004 
 neutral - stranger    -2.42  8.42 37 -0.288  1.0000 
 death - living       -34.24 11.16 37 -3.067  0.0241 
 death - spouse       -50.30 13.12 37 -3.834  0.0038 
 death - stranger      -8.37 10.96 37 -0.763  1.0000 
 living - spouse      -16.05 11.07 37 -1.449  0.6226 
 living - stranger     25.88  9.95 37  2.600  0.0666 
 spouse - stranger     41.93  9.30 37  4.508  0.0006 

Results are averaged over the levels of: group, treatment 
P value adjustment: holm method for 10 tests 

We see that averaged across levels of group and treatment, the sample as a whole does show more approach bias for spouse compared to death, neutral, and stranger stimuli - but not living loved one.

Aims 3/4 Linear mixed model (bias scores)

####### Aims 3/4 model (LME w/bias scores) ######
# A model with two within-subjects factors (stimulus [5], treatment [2]) and one between-subjects factor (group [2])
## DV: bias scores
## Predicted: Treatment x Group interaction (Aim 3), Stimulus x Treatment x Group (Aim 4)
# Linear mixed model
m3d <- lme(gAAT_bias ~ stimulus*treatment*group, data = data_bias, random = ~ 1|ID, method="REML") 
anova(m3d)
                         numDF denDF  F-value p-value
(Intercept)                  1   333 6.033213  0.0145
stimulus                     4   333 9.481681  <.0001
treatment                    1   333 0.067814  0.7947
group                        1    37 1.319279  0.2581
stimulus:treatment           4   333 0.423645  0.7916
stimulus:group               4   333 0.791315  0.5315
treatment:group              1   333 7.268341  0.0074
stimulus:treatment:group     4   333 0.216758  0.9290
# variance explained by the entire model 
fitted <- fitted(m3d)
data_bias$fitted_m3d <- as.vector(fitted)
forR2 <- lm(gAAT_bias ~ fitted_m3d, data=data_bias)
summary(forR2)

Call:
lm(formula = gAAT_bias ~ fitted_m3d, data = data_bias)

Residuals:
     Min       1Q   Median       3Q      Max 
-221.580  -35.774    3.186   33.975  210.900 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) -3.07567    3.11099  -0.989    0.323    
fitted_m3d   1.21899    0.08519  14.310   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 56.71 on 388 degrees of freedom
Multiple R-squared:  0.3454,    Adjusted R-squared:  0.3438 
F-statistic: 204.8 on 1 and 388 DF,  p-value: < 2.2e-16

As above, we see a main effect of stimulus and a two-way interaction of treatment x group. The model explains about 34% of the variance (adj R2 = .34).

This is what the interaction looks like:

p3 <- ggplot(data_bias, aes(fill=group, y=gAAT_bias, x=treatment)) + 
  geom_boxplot(aes(fill=group), outlier.alpha = 0.3)
p3 <- p3 + geom_hline(yintercept=0, linetype="solid", color="black", size=.5) + xlab("Condition") + ylab("Avoid bias                Approach bias")
p4 <- ggplot(data_bias, aes(fill=treatment, y=gAAT_bias, x=group)) + 
  geom_boxplot(aes(fill=treatment), outlier.alpha = 0.3)
p4 <- p4 + geom_hline(yintercept=0, linetype="solid", color="black", size=.5) + xlab("Group") + ylab("Avoid bias                Approach bias")
p3 # treatment on x-axis

p4 # group on x-axis

emm_m3c <- emmeans(m3c, ~ treatment|group) # compare treatment within group (ANOVA)
plot(emm_m3c, comparisons = TRUE, intervals = TRUE, horizontal = FALSE)

emm_m3d <- emmeans(m3d, ~ treatment|group) # compare treatment within group (LME)
NOTE: Results may be misleading due to involvement in interactions
plot(emm_m3d, comparisons = TRUE, intervals = TRUE, horizontal = FALSE)

Custom contrasts

https://aosmith.rbind.io/2019/04/15/custom-contrasts-emmeans/ https://cran.r-project.org/web/packages/afex/vignettes/afex_anova_example.html#running-custom-contrasts

Objects returned from emmeans can also be used to test specific contrasts. For this, we can simply create a list, where each element corresponds to one contrasts. A contrast is defined as a vector of constants on the reference grid (i.e., the object returned from emmeans, here m3). For example, we might be interested in whether there is a difference between the valid and invalid inferences in each of the two conditions.

This section in progress, no results as of yet…

m3d_ref <- emmeans(m3d, ~stimulus+group+treatment, model = "multivariate")
m3d_ref # this is the reference grid
# vector of contrast weights must line up with items as ordered in reference grid

m3a_ref <- emmeans(m3a, ~stimulus+group+treatment, model = "multivariate")
m3a_ref

m3b_ref <- emmeans(m3b, ~stimulus+group+treatment, model = "multivariate")
m3b_ref

m3c_ref <- emmeans(m3c, ~stimulus+group+treatment, model = "multivariate")
m3c_ref

spouse_pl = c(0, # neutral  NCG   placebo
                   0, # death    NCG   placebo
                   0, # living   NCG   placebo
                   .5, # spouse   NCG   placebo
                   0, # stranger NCG   placebo
                   0, # neutral  CG   placebo
                   0, # death    CG   placebo
                   0, # living   CG   placebo
                   .5, # spouse   CG   placebo
                   0, # stranger CG   placebo
                   0, # neutral  NCG   oxytocin
                   0, # death    NCG   oxytocin
                   0, # living   NCG   oxytocin
                   0, # spouse   NCG   oxytocin
                   0, # stranger NCG   oxytocin
                   0, # neutral  CG   oxytocin
                   0, # death    CG   oxytocin
                   0, # living   CG   oxytocin
                   0, # spouse   CG   oxytocin
                   0) # stranger CG   oxytocin

death_pl = c(0, # neutral  NCG   placebo
                   .5, # death    NCG   placebo
                   0, # living   NCG   placebo
                   0, # spouse   NCG   placebo
                   0, # stranger NCG   placebo
                   0, # neutral  CG   placebo
                   .5, # death    CG   placebo
                   0, # living   CG   placebo
                   0, # spouse   CG   placebo
                   0, # stranger CG   placebo
                   0, # neutral  NCG   oxytocin
                   0, # death    NCG   oxytocin
                   0, # living   NCG   oxytocin
                   0, # spouse   NCG   oxytocin
                   0, # stranger NCG   oxytocin
                   0, # neutral  CG   oxytocin
                   0, # death    CG   oxytocin
                   0, # living   CG   oxytocin
                   0, # spouse   CG   oxytocin
                   0) # stranger CG   oxytocin

spouse_ot = c(0, # neutral  NCG   placebo
                   0, # death    NCG   placebo
                   0, # living   NCG   placebo
                   0, # spouse   NCG   placebo
                   0, # stranger NCG   placebo
                   0, # neutral  CG   placebo
                   0, # death    CG   placebo
                   0, # living   CG   placebo
                   0, # spouse   CG   placebo
                   0, # stranger CG   placebo
                   0, # neutral  NCG   oxytocin
                   0, # death    NCG   oxytocin
                   0, # living   NCG   oxytocin
                   .5, # spouse   NCG   oxytocin
                   0, # stranger NCG   oxytocin
                   0, # neutral  CG   oxytocin
                   0, # death    CG   oxytocin
                   0, # living   CG   oxytocin
                   .5, # spouse   CG   oxytocin
                   0) # stranger CG   oxytocin

death_ot = c(0, # neutral  NCG   placebo
                   0, # death    NCG   placebo
                   0, # living   NCG   placebo
                   0, # spouse   NCG   placebo
                   0, # stranger NCG   placebo
                   0, # neutral  CG   placebo
                   0, # death    CG   placebo
                   0, # living   CG   placebo
                   0, # spouse   CG   placebo
                   0, # stranger CG   placebo
                   0, # neutral  NCG   oxytocin
                   .5, # death    NCG   oxytocin
                   0, # living   NCG   oxytocin
                   0, # spouse   NCG   oxytocin
                   0, # stranger NCG   oxytocin
                   0, # neutral  CG   oxytocin
                   .5, # death    CG   oxytocin
                   0, # living   CG   oxytocin
                   0, # spouse   CG   oxytocin
                   0) # stranger CG   oxytocin

spouse_ncg_pl = c(0, # neutral  NCG   placebo
                   0, # death    NCG   placebo
                   0, # living   NCG   placebo
                   1, # spouse   NCG   placebo
                   0, # stranger NCG   placebo
                   0, # neutral  CG   placebo
                   0, # death    CG   placebo
                   0, # living   CG   placebo
                   0, # spouse   CG   placebo
                   0, # stranger CG   placebo
                   0, # neutral  NCG   oxytocin
                   0, # death    NCG   oxytocin
                   0, # living   NCG   oxytocin
                   0, # spouse   NCG   oxytocin
                   0, # stranger NCG   oxytocin
                   0, # neutral  CG   oxytocin
                   0, # death    CG   oxytocin
                   0, # living   CG   oxytocin
                   0, # spouse   CG   oxytocin
                   0) # stranger CG   oxytocin

spouse_ncg_ot = c(0, # neutral  NCG   placebo
                   0, # death    NCG   placebo
                   0, # living   NCG   placebo
                   0, # spouse   NCG   placebo
                   0, # stranger NCG   placebo
                   0, # neutral  CG   placebo
                   0, # death    CG   placebo
                   0, # living   CG   placebo
                   0, # spouse   CG   placebo
                   0, # stranger CG   placebo
                   0, # neutral  NCG   oxytocin
                   0, # death    NCG   oxytocin
                   0, # living   NCG   oxytocin
                   1, # spouse   NCG   oxytocin
                   0, # stranger NCG   oxytocin
                   0, # neutral  CG   oxytocin
                   0, # death    CG   oxytocin
                   0, # living   CG   oxytocin
                   0, # spouse   CG   oxytocin
                   0) # stranger CG   oxytocin

spouse_cg_pl = c(0, # neutral  NCG   placebo
                   0, # death    NCG   placebo
                   0, # living   NCG   placebo
                   0, # spouse   NCG   placebo
                   0, # stranger NCG   placebo
                   0, # neutral  CG   placebo
                   0, # death    CG   placebo
                   0, # living   CG   placebo
                   1, # spouse   CG   placebo
                   0, # stranger CG   placebo
                   0, # neutral  NCG   oxytocin
                   0, # death    NCG   oxytocin
                   0, # living   NCG   oxytocin
                   0, # spouse   NCG   oxytocin
                   0, # stranger NCG   oxytocin
                   0, # neutral  CG   oxytocin
                   0, # death    CG   oxytocin
                   0, # living   CG   oxytocin
                   0, # spouse   CG   oxytocin
                   0) # stranger CG   oxytocin

spouse_cg_ot = c(0, # neutral  NCG   placebo
                   0, # death    NCG   placebo
                   0, # living   NCG   placebo
                   0, # spouse   NCG   placebo
                   0, # stranger NCG   placebo
                   0, # neutral  CG   placebo
                   0, # death    CG   placebo
                   0, # living   CG   placebo
                   0, # spouse   CG   placebo
                   0, # stranger CG   placebo
                   0, # neutral  NCG   oxytocin
                   0, # death    NCG   oxytocin
                   0, # living   NCG   oxytocin
                   0, # spouse   NCG   oxytocin
                   0, # stranger NCG   oxytocin
                   0, # neutral  CG   oxytocin
                   0, # death    CG   oxytocin
                   0, # living   CG   oxytocin
                   1, # spouse   CG   oxytocin
                   0) # stranger CG   oxytocin


###
living_ncg_pl = c(0, # neutral  NCG   placebo
                   0, # death    NCG   placebo
                   1, # living   NCG   placebo
                   0, # spouse   NCG   placebo
                   0, # stranger NCG   placebo
                   0, # neutral  CG   placebo
                   0, # death    CG   placebo
                   0, # living   CG   placebo
                   0, # spouse   CG   placebo
                   0, # stranger CG   placebo
                   0, # neutral  NCG   oxytocin
                   0, # death    NCG   oxytocin
                   0, # living   NCG   oxytocin
                   0, # spouse   NCG   oxytocin
                   0, # stranger NCG   oxytocin
                   0, # neutral  CG   oxytocin
                   0, # death    CG   oxytocin
                   0, # living   CG   oxytocin
                   0, # spouse   CG   oxytocin
                   0) # stranger CG   oxytocin

living_ncg_ot = c(0, # neutral  NCG   placebo
                   0, # death    NCG   placebo
                   0, # living   NCG   placebo
                   0, # spouse   NCG   placebo
                   0, # stranger NCG   placebo
                   0, # neutral  CG   placebo
                   0, # death    CG   placebo
                   0, # living   CG   placebo
                   0, # spouse   CG   placebo
                   0, # stranger CG   placebo
                   0, # neutral  NCG   oxytocin
                   0, # death    NCG   oxytocin
                   1, # living   NCG   oxytocin
                   0, # spouse   NCG   oxytocin
                   0, # stranger NCG   oxytocin
                   0, # neutral  CG   oxytocin
                   0, # death    CG   oxytocin
                   0, # living   CG   oxytocin
                   0, # spouse   CG   oxytocin
                   0) # stranger CG   oxytocin

living_cg_pl = c(0, # neutral  NCG   placebo
                   0, # death    NCG   placebo
                   0, # living   NCG   placebo
                   0, # spouse   NCG   placebo
                   0, # stranger NCG   placebo
                   0, # neutral  CG   placebo
                   0, # death    CG   placebo
                   1, # living   CG   placebo
                   0, # spouse   CG   placebo
                   0, # stranger CG   placebo
                   0, # neutral  NCG   oxytocin
                   0, # death    NCG   oxytocin
                   0, # living   NCG   oxytocin
                   0, # spouse   NCG   oxytocin
                   0, # stranger NCG   oxytocin
                   0, # neutral  CG   oxytocin
                   0, # death    CG   oxytocin
                   0, # living   CG   oxytocin
                   0, # spouse   CG   oxytocin
                   0) # stranger CG   oxytocin

living_cg_ot = c(0, # neutral  NCG   placebo
                   0, # death    NCG   placebo
                   0, # living   NCG   placebo
                   0, # spouse   NCG   placebo
                   0, # stranger NCG   placebo
                   0, # neutral  CG   placebo
                   0, # death    CG   placebo
                   0, # living   CG   placebo
                   0, # spouse   CG   placebo
                   0, # stranger CG   placebo
                   0, # neutral  NCG   oxytocin
                   0, # death    NCG   oxytocin
                   0, # living   NCG   oxytocin
                   0, # spouse   NCG   oxytocin
                   0, # stranger NCG   oxytocin
                   0, # neutral  CG   oxytocin
                   0, # death    CG   oxytocin
                   1, # living   CG   oxytocin
                   0, # spouse   CG   oxytocin
                   0) # stranger CG   oxytocin
###
death_ncg_pl = c(0, # neutral  NCG   placebo
                   1, # death    NCG   placebo
                   0, # living   NCG   placebo
                   0, # spouse   NCG   placebo
                   0, # stranger NCG   placebo
                   0, # neutral  CG   placebo
                   0, # death    CG   placebo
                   0, # living   CG   placebo
                   0, # spouse   CG   placebo
                   0, # stranger CG   placebo
                   0, # neutral  NCG   oxytocin
                   0, # death    NCG   oxytocin
                   0, # living   NCG   oxytocin
                   0, # spouse   NCG   oxytocin
                   0, # stranger NCG   oxytocin
                   0, # neutral  CG   oxytocin
                   0, # death    CG   oxytocin
                   0, # living   CG   oxytocin
                   0, # spouse   CG   oxytocin
                   0) # stranger CG   oxytocin

death_ncg_ot = c(0, # neutral  NCG   placebo
                   0, # death    NCG   placebo
                   0, # living   NCG   placebo
                   0, # spouse   NCG   placebo
                   0, # stranger NCG   placebo
                   0, # neutral  CG   placebo
                   0, # death    CG   placebo
                   0, # living   CG   placebo
                   0, # spouse   CG   placebo
                   0, # stranger CG   placebo
                   0, # neutral  NCG   oxytocin
                   1, # death    NCG   oxytocin
                   0, # living   NCG   oxytocin
                   0, # spouse   NCG   oxytocin
                   0, # stranger NCG   oxytocin
                   0, # neutral  CG   oxytocin
                   0, # death    CG   oxytocin
                   0, # living   CG   oxytocin
                   0, # spouse   CG   oxytocin
                   0) # stranger CG   oxytocin

death_cg_pl = c(0, # neutral  NCG   placebo
                   0, # death    NCG   placebo
                   0, # living   NCG   placebo
                   0, # spouse   NCG   placebo
                   0, # stranger NCG   placebo
                   0, # neutral  CG   placebo
                   1, # death    CG   placebo
                   0, # living   CG   placebo
                   0, # spouse   CG   placebo
                   0, # stranger CG   placebo
                   0, # neutral  NCG   oxytocin
                   0, # death    NCG   oxytocin
                   0, # living   NCG   oxytocin
                   0, # spouse   NCG   oxytocin
                   0, # stranger NCG   oxytocin
                   0, # neutral  CG   oxytocin
                   0, # death    CG   oxytocin
                   0, # living   CG   oxytocin
                   0, # spouse   CG   oxytocin
                   0) # stranger CG   oxytocin

death_cg_ot = c(0, # neutral  NCG   placebo
                   0, # death    NCG   placebo
                   0, # living   NCG   placebo
                   0, # spouse   NCG   placebo
                   0, # stranger NCG   placebo
                   0, # neutral  CG   placebo
                   0, # death    CG   placebo
                   0, # living   CG   placebo
                   0, # spouse   CG   placebo
                   0, # stranger CG   placebo
                   0, # neutral  NCG   oxytocin
                   0, # death    NCG   oxytocin
                   0, # living   NCG   oxytocin
                   0, # spouse   NCG   oxytocin
                   0, # stranger NCG   oxytocin
                   0, # neutral  CG   oxytocin
                   1, # death    CG   oxytocin
                   0, # living   CG   oxytocin
                   0, # spouse   CG   oxytocin
                   0) # stranger CG   oxytocin





# test the contrasts
contrast(m3d_ref, method = list("spouse NCG > death NCG (placebo)" = spouse_ncg_pl - death_ncg_pl,
                            "spouse CG > death CG (placebo)" = spouse_cg_pl - death_cg_pl,
                            "spouse NCG > death NCG (oxytocin)" = spouse_ncg_ot - death_ncg_ot,
                            "spouse CG > death CG (oxytocin)" = spouse_cg_ot - death_cg_ot,
                            "spouse > death (placebo)" = spouse_pl - death_pl,
                            "spouse > death (oxytocin)" = spouse_ot - death_ot), adjust="bonf")

# this is another way to do it:
ppl_vs_scenes_ot = c(0, # neutral  NCG   placebo
                   0, # death    NCG   placebo
                   0, # living   NCG   placebo
                   0, # spouse   NCG   placebo
                   0, # stranger NCG   placebo
                   0, # neutral  CG   placebo
                   0, # death    CG   placebo
                   0, # living   CG   placebo
                   0, # spouse   CG   placebo
                   0, # stranger CG   placebo
                   -1/4, # neutral  NCG   oxytocin
                   -1/4, # death    NCG   oxytocin
                   1/6, # living   NCG   oxytocin
                   1/6, # spouse   NCG   oxytocin
                   1/6, # stranger NCG   oxytocin
                   -1/4, # neutral  CG   oxytocin
                   -1/4, # death    CG   oxytocin
                   1/6, # living   CG   oxytocin
                   1/6, # spouse   CG   oxytocin
                   1/6) # stranger CG   oxytocin
contrast(ref, method=list(ppl_vs_scenes_ot))

#### For Aim 4 ####
# tests OT > PL for spouse stimuli within the CG group
spouse_cg_OTvPL = c(0, # neutral  NCG   placebo
                   0, # death    NCG   placebo
                   0, # living   NCG   placebo
                   0, # spouse   NCG   placebo
                   0, # stranger NCG   placebo
                   0, # neutral  CG   placebo
                   0, # death    CG   placebo
                   0, # living   CG   placebo
                   -1, # spouse   CG   placebo
                   0, # stranger CG   placebo
                   0, # neutral  NCG   oxytocin
                   0, # death    NCG   oxytocin
                   0, # living   NCG   oxytocin
                   0, # spouse   NCG   oxytocin
                   0, # stranger NCG   oxytocin
                   0, # neutral  CG   oxytocin
                   0, # death    CG   oxytocin
                   0, # living   CG   oxytocin
                   1, # spouse   CG   oxytocin
                   0) # stranger CG   oxytocin

# tests OT > PL for spouse stimuli within the NCG group
spouse_ncg_OTvPL = c(0, # neutral  NCG   placebo
                   0, # death    NCG   placebo
                   0, # living   NCG   placebo
                   -1, # spouse   NCG   placebo
                   0, # stranger NCG   placebo
                   0, # neutral  CG   placebo
                   0, # death    CG   placebo
                   0, # living   CG   placebo
                   0, # spouse   CG   placebo
                   0, # stranger CG   placebo
                   0, # neutral  NCG   oxytocin
                   0, # death    NCG   oxytocin
                   0, # living   NCG   oxytocin
                   1, # spouse   NCG   oxytocin
                   0, # stranger NCG   oxytocin
                   0, # neutral  CG   oxytocin
                   0, # death    CG   oxytocin
                   0, # living   CG   oxytocin
                   0, # spouse   CG   oxytocin
                   0) # stranger CG   oxytocin

# tests OT > PL for living stimuli within the CG group
living_cg_OTvPL = c(0, # neutral  NCG   placebo
                   0, # death    NCG   placebo
                   0, # living   NCG   placebo
                   0, # spouse   NCG   placebo
                   0, # stranger NCG   placebo
                   0, # neutral  CG   placebo
                   0, # death    CG   placebo
                   -1, # living   CG   placebo
                   0, # spouse   CG   placebo
                   0, # stranger CG   placebo
                   0, # neutral  NCG   oxytocin
                   0, # death    NCG   oxytocin
                   0, # living   NCG   oxytocin
                   0, # spouse   NCG   oxytocin
                   0, # stranger NCG   oxytocin
                   0, # neutral  CG   oxytocin
                   0, # death    CG   oxytocin
                   1, # living   CG   oxytocin
                   0, # spouse   CG   oxytocin
                   0) # stranger CG   oxytocin

# tests OT > PL for living stimuli within the NCG group
living_ncg_OTvPL = c(0, # neutral  NCG   placebo
                   0, # death    NCG   placebo
                   -1, # living   NCG   placebo
                   0, # spouse   NCG   placebo
                   0, # stranger NCG   placebo
                   0, # neutral  CG   placebo
                   0, # death    CG   placebo
                   0, # living   CG   placebo
                   0, # spouse   CG   placebo
                   0, # stranger CG   placebo
                   0, # neutral  NCG   oxytocin
                   0, # death    NCG   oxytocin
                   1, # living   NCG   oxytocin
                   0, # spouse   NCG   oxytocin
                   0, # stranger NCG   oxytocin
                   0, # neutral  CG   oxytocin
                   0, # death    CG   oxytocin
                   0, # living   CG   oxytocin
                   0, # spouse   CG   oxytocin
                   0) # stranger CG   oxytocin

# tests OT > PL for death stimuli within the CG group
death_cg_OTvPL = c(0, # neutral  NCG   placebo
                   0, # death    NCG   placebo
                   0, # living   NCG   placebo
                   0, # spouse   NCG   placebo
                   0, # stranger NCG   placebo
                   0, # neutral  CG   placebo
                   -1, # death    CG   placebo
                   0, # living   CG   placebo
                   0, # spouse   CG   placebo
                   0, # stranger CG   placebo
                   0, # neutral  NCG   oxytocin
                   0, # death    NCG   oxytocin
                   0, # living   NCG   oxytocin
                   0, # spouse   NCG   oxytocin
                   0, # stranger NCG   oxytocin
                   0, # neutral  CG   oxytocin
                   1, # death    CG   oxytocin
                   0, # living   CG   oxytocin
                   0, # spouse   CG   oxytocin
                   0) # stranger CG   oxytocin

# tests OT > PL for death stimuli within the NCG group
death_ncg_OTvPL = c(0, # neutral  NCG   placebo
                   -1, # death    NCG   placebo
                   0, # living   NCG   placebo
                   0, # spouse   NCG   placebo
                   0, # stranger NCG   placebo
                   0, # neutral  CG   placebo
                   0, # death    CG   placebo
                   0, # living   CG   placebo
                   0, # spouse   CG   placebo
                   0, # stranger CG   placebo
                   0, # neutral  NCG   oxytocin
                   1, # death    NCG   oxytocin
                   0, # living   NCG   oxytocin
                   0, # spouse   NCG   oxytocin
                   0, # stranger NCG   oxytocin
                   0, # neutral  CG   oxytocin
                   0, # death    CG   oxytocin
                   0, # living   CG   oxytocin
                   0, # spouse   CG   oxytocin
                   0) # stranger CG   oxytocin

# tests OT > PL for stranger stimuli within the CG group
stranger_cg_OTvPL = c(0, # neutral  NCG   placebo
                   0, # death    NCG   placebo
                   0, # living   NCG   placebo
                   0, # spouse   NCG   placebo
                   0, # stranger NCG   placebo
                   0, # neutral  CG   placebo
                   0, # death    CG   placebo
                   0, # living   CG   placebo
                   0, # spouse   CG   placebo
                   -1, # stranger CG   placebo
                   0, # neutral  NCG   oxytocin
                   0, # death    NCG   oxytocin
                   0, # living   NCG   oxytocin
                   0, # spouse   NCG   oxytocin
                   0, # stranger NCG   oxytocin
                   0, # neutral  CG   oxytocin
                   0, # death    CG   oxytocin
                   0, # living   CG   oxytocin
                   0, # spouse   CG   oxytocin
                   1) # stranger CG   oxytocin

# tests OT > PL for stranger stimuli within the NCG group
stranger_ncg_OTvPL = c(0, # neutral  NCG   placebo
                   0, # death    NCG   placebo
                   0, # living   NCG   placebo
                   0, # spouse   NCG   placebo
                   -1, # stranger NCG   placebo
                   0, # neutral  CG   placebo
                   0, # death    CG   placebo
                   0, # living   CG   placebo
                   0, # spouse   CG   placebo
                   0, # stranger CG   placebo
                   0, # neutral  NCG   oxytocin
                   0, # death    NCG   oxytocin
                   0, # living   NCG   oxytocin
                   0, # spouse   NCG   oxytocin
                   1, # stranger NCG   oxytocin
                   0, # neutral  CG   oxytocin
                   0, # death    CG   oxytocin
                   0, # living   CG   oxytocin
                   0, # spouse   CG   oxytocin
                   0) # stranger CG   oxytocin




contrast(m3a_ref, method = list("Effect of OT on spouse RT in CG > effect of OT on spouse RT in NCG" = spouse_cg_OTvPL - spouse_ncg_OTvPL))
contrast(m3a_ref, method = list("Effect of OT on living loved one RT in CG > effect of OT on living loved one RT in NCG" = living_cg_OTvPL - living_ncg_OTvPL))
contrast(m3a_ref, method = list("Effect of OT on generic death RT in CG > effect of OT on generic death RT in NCG" = death_cg_OTvPL - death_ncg_OTvPL))
contrast(m3a_ref, method = list("Effect of OT on stranger RT in CG > effect of OT on stranger RT in NCG" = stranger_cg_OTvPL - stranger_ncg_OTvPL))

contrast(m3b_ref, method = list("Effect of OT on spouse RT in CG > effect of OT on spouse RT in NCG" = spouse_cg_OTvPL - spouse_ncg_OTvPL))
contrast(m3b_ref, method = list("Effect of OT on living loved one RT in CG > effect of OT on living loved one RT in NCG" = living_cg_OTvPL - living_ncg_OTvPL))
contrast(m3b_ref, method = list("Effect of OT on generic death RT in CG > effect of OT on generic death RT in NCG" = death_cg_OTvPL - death_ncg_OTvPL))
contrast(m3b_ref, method = list("Effect of OT on stranger RT in CG > effect of OT on stranger RT in NCG" = stranger_cg_OTvPL - stranger_ncg_OTvPL))

contrast(m3c_ref, method = list("Effect of OT on spouse bias in CG > effect of OT on spouse bias in NCG" = spouse_cg_OTvPL - spouse_ncg_OTvPL))
contrast(m3c_ref, method = list("Effect of OT on living loved one bias in CG > effect of OT on living loved one bias in NCG" = living_cg_OTvPL - living_ncg_OTvPL))
contrast(m3c_ref, method = list("Effect of OT on generic death bias in CG > effect of OT on generic death bias in NCG" = death_cg_OTvPL - death_ncg_OTvPL))
contrast(m3c_ref, method = list("Effect of OT on stranger bias in CG > effect of OT on stranger bias in NCG" = stranger_cg_OTvPL - stranger_ncg_OTvPL))

contrast(m3d_ref, method = list("Effect of OT on spouse bias in CG > effect of OT on spouse bias in NCG" = spouse_cg_OTvPL - spouse_ncg_OTvPL))
contrast(m3d_ref, method = list("Effect of OT on living loved one bias in CG > effect of OT on living loved one bias in NCG" = living_cg_OTvPL - living_ncg_OTvPL))
contrast(m3d_ref, method = list("Effect of OT on generic death bias in CG > effect of OT on generic death bias in NCG" = death_cg_OTvPL - death_ncg_OTvPL))
contrast(m3d_ref, method = list("Effect of OT on stranger bias in CG > effect of OT on stranger bias in NCG" = stranger_cg_OTvPL - stranger_ncg_OTvPL))






c1 <- list(
  spouse_death_pl = c(0, # neutral  NCG   placebo
                   -.5, # death    NCG   placebo
                   0, # living   NCG   placebo
                   .5, # spouse   NCG   placebo
                   0, # stranger NCG   placebo
                   0, # neutral  CG   placebo
                   -.5, # death    CG   placebo
                   0, # living   CG   placebo
                   .5, # spouse   CG   placebo
                   0, # stranger CG   placebo
                   0, # neutral  NCG   oxytocin
                   0, # death    NCG   oxytocin
                   0, # living   NCG   oxytocin
                   0, # spouse   NCG   oxytocin
                   0, # stranger NCG   oxytocin
                   0, # neutral  CG   oxytocin
                   0, # death    CG   oxytocin
                   0, # living   CG   oxytocin
                   0, # spouse   CG   oxytocin
                   0), # stranger CG   oxytocin
  spouse_death_ot = c(0, # neutral  NCG   placebo
                   0, # death    NCG   placebo
                   0, # living   NCG   placebo
                   0, # spouse   NCG   placebo
                   0, # stranger NCG   placebo
                   0, # neutral  CG   placebo
                   0, # death    CG   placebo
                   0, # living   CG   placebo
                   0, # spouse   CG   placebo
                   0, # stranger CG   placebo
                   0, # neutral  NCG   oxytocin
                   -.5, # death    NCG   oxytocin
                   0, # living   NCG   oxytocin
                   .5, # spouse   NCG   oxytocin
                   0, # stranger NCG   oxytocin
                   0, # neutral  CG   oxytocin
                   -.5, # death    CG   oxytocin
                   0, # living   CG   oxytocin
                   .5, # spouse   CG   oxytocin
                   0), # stranger CG   oxytocin
  spouse_death_CG = c(0, # neutral  NCG   placebo
                   0, # death    NCG   placebo
                   0, # living   NCG   placebo
                   0, # spouse   NCG   placebo
                   0, # stranger NCG   placebo
                   0, # neutral  CG   placebo
                   -.25, # death    CG   placebo
                   0, # living   CG   placebo
                   .25, # spouse   CG   placebo
                   0, # stranger CG   placebo
                   0, # neutral  NCG   oxytocin
                   0, # death    NCG   oxytocin
                   0, # living   NCG   oxytocin
                   0, # spouse   NCG   oxytocin
                   0, # stranger NCG   oxytocin
                   0, # neutral  CG   oxytocin
                   -.25, # death    CG   oxytocin
                   0, # living   CG   oxytocin
                   .25, # spouse   CG   oxytocin
                   0), # stranger CG   oxytocin
    spouse_death_pl_CG = c(0, # neutral  NCG   placebo
                   0, # death    NCG   placebo
                   0, # living   NCG   placebo
                   0, # spouse   NCG   placebo
                   0, # stranger NCG   placebo
                   0, # neutral  CG   placebo
                   -.5, # death    CG   placebo
                   0, # living   CG   placebo
                   .5, # spouse   CG   placebo
                   0, # stranger CG   placebo
                   0, # neutral  NCG   oxytocin
                   0, # death    NCG   oxytocin
                   0, # living   NCG   oxytocin
                   0, # spouse   NCG   oxytocin
                   0, # stranger NCG   oxytocin
                   0, # neutral  CG   oxytocin
                   0, # death    CG   oxytocin
                   0, # living   CG   oxytocin
                   0, # spouse   CG   oxytocin
                   0), # stranger CG   oxytocin
      NCG_CG_spouse_pl = c(0, # neutral  NCG   placebo
                   0, # death    NCG   placebo
                   0, # living   NCG   placebo
                   1, # spouse   NCG   placebo
                   0, # stranger NCG   placebo
                   0, # neutral  CG   placebo
                   0, # death    CG   placebo
                   0, # living   CG   placebo
                   -1, # spouse   CG   placebo
                   0, # stranger CG   placebo
                   0, # neutral  NCG   oxytocin
                   0, # death    NCG   oxytocin
                   0, # living   NCG   oxytocin
                   0, # spouse   NCG   oxytocin
                   0, # stranger NCG   oxytocin
                   0, # neutral  CG   oxytocin
                   0, # death    CG   oxytocin
                   0, # living   CG   oxytocin
                   0, # spouse   CG   oxytocin
                   0), # stranger CG   oxytocin
        NCG_CG_spouse_ot = c(0, # neutral  NCG   placebo
                   0, # death    NCG   placebo
                   0, # living   NCG   placebo
                   0, # spouse   NCG   placebo
                   0, # stranger NCG   placebo
                   0, # neutral  CG   placebo
                   0, # death    CG   placebo
                   0, # living   CG   placebo
                   0, # spouse   CG   placebo
                   0, # stranger CG   placebo
                   0, # neutral  NCG   oxytocin
                   0, # death    NCG   oxytocin
                   0, # living   NCG   oxytocin
                   1, # spouse   NCG   oxytocin
                   0, # stranger NCG   oxytocin
                   0, # neutral  CG   oxytocin
                   0, # death    CG   oxytocin
                   0, # living   CG   oxytocin
                   -1, # spouse   CG   oxytocin
                   0) # stranger CG   oxytocin
)

Some junk on custom contrasts and effect coding, ignore this

library(multcomp)
library(contrast)
library(sjPlot)

L3vsL2 <- contrast(m2b,
         a = list(stimulus = levels(data_placebo$stimulus), direction = "PULL"),
         b = list(stimulus = levels(data_placebo$stimulus), group = "CG"))
L3vsL2

?contrast


xyplot(data_placebo$gAAT_RT ~ data_placebo$direction * data_placebo$stimulus, 
        col=c("grey90","grey40"), las=2, 
        main="test")

contr <- glht(m2b, linfct=mcp(stimulus="Tukey"))
summary(contr)

coefs <- coef(m2b)
 # difference between parameter estimates for stimulusdeath:directionPUSH:groupCG and stimulusspouse:directionPUSH:groupCG
unique(coefs[19] - coefs[17]) # use unique() to keep it from repeating 39 times
# difference between parameter estimates for stimulusstranger:directionPUSH:groupCG and stimulusspouse:directionPUSH:groupCG
unique(coefs[19] - coefs[20]) # use unique() to keep it from repeating 39 times 

# https://aosmith.rbind.io/2019/04/15/custom-contrasts-emmeans/
# for effect coding
data_long <- data_long %>% mutate(spouse_v_death = ifelse(stimulus == "spouse", 1, 
                                                              (ifelse(stimulus == "death", -1, 0))),
                                  spouse_v_living = ifelse(stimulus == "spouse", 1, 
                                                              (ifelse(stimulus == "living", -1, 0))))

data_bias <- data_bias %>% mutate(spouse_v_death = ifelse(stimulus == "spouse", 1, 
                                                              (ifelse(stimulus == "death", -1, 0))),
                                  spouse_v_living = ifelse(stimulus == "spouse", 1, 
                                                              (ifelse(stimulus == "living", -1, 0))))
        
data_placebo <- data_placebo %>% mutate(spouse_v_death = ifelse(stimulus == "spouse", 1, 
                                                              (ifelse(stimulus == "death", -1, 0))),
                                  spouse_v_living = ifelse(stimulus == "spouse", 1, 
                                                              (ifelse(stimulus == "living", -1, 0))))

data_bias_placebo <- data_bias_placebo %>% mutate(spouse_v_death = ifelse(stimulus == "spouse", 1, 
                                                              (ifelse(stimulus == "death", -1, 0))),
                                  spouse_v_living = ifelse(stimulus == "spouse", 1, 
                                                              (ifelse(stimulus == "living", -1, 0))),
                                  spouse = ifelse(stimulus == "spouse", 1, 0),
                                  death = ifelse(stimulus == "death", 1, 0))

Appendix: Data cleaning

The scripts below generate the data files used in the analyses above.

Pre-R steps:

  1. Removed all .iqdat files under 25KB or so in order to filter out pilot data and false starts.
  2. Removed non-study data (i.e., tests and OT undergrad files).
  3. Organized raw .iqdat files for each visit by run 1/run 2 (two separate folders) based on date/time stamp.

    In Terminal, within each of the folders in turn…

  4. Changed file extensions to .tsv (tab-separated) from .iqdat: find . -iname "*.iqdat" -exec bash -c 'mv "$0" "${0%\.iqdat}.tsv"' {} \;
  5. Merged the files: cat *.tsv > OT_gAAT_run-1.tsv (or OT_gAAT_run-2.tsv)
Notes:
  • D117: Had 3 visits due to scanner technical issues. Use “_b" and “_c" as visit 1 and visit 2 respectively.
  • D114: Has multiple files from visit 2. Use the last two.
  • D135: Use files from 6/06/16 and 6/17/18 (scanner issues on 06/13/16). Use “_b" and “_c" as visit 1 and visit 2 respectively.
  • D147: Visit 1 run 2 is partial data for some reason (I do have notes that she switched back to PUSH-YELLOW during run 2, but did not re-run because running way over time.)

Long dataset (trial-level RTs)

Import data

library(tidyverse)
filter <- dplyr::filter
select <- dplyr::select

# read in the data (only importing a subset of columns)
raw_r1 <- as_data_frame(read_tsv("~/Dropbox/GLASS Lab/OT Study/data/raw-data/OT-gAAT-behavioral-data/Run1_tsv/OT_gAAT_run-1.tsv", col_types=cols_only(
  date = col_integer(),
  time = col_character(),
  subject = col_character(),
  blockcode = col_character(),
  blocknum = col_character(),
  trialcode = col_character(),
  values.trialcode = col_character(),
  values.stimulus = col_character(),
  values.initialresponse = col_character(),
  values.RT = col_number()
)))

raw_r2 <- as_tibble(read_tsv("~/Dropbox/GLASS Lab/OT Study/data/raw-data/OT-gAAT-behavioral-data/Run2_tsv/OT_gAAT_run-2.tsv", col_types=cols_only(
  date = col_integer(),
  time = col_character(),
  subject = col_character(),
  blockcode = col_character(),
  blocknum = col_character(),
  trialcode = col_character(),
  values.trialcode = col_character(),
  values.stimulus = col_character(),
  values.initialresponse = col_character(),
  values.RT = col_number()
)))

# header line repeats when I used `cat` to merge, so get those out of there
raw_r1 <- raw_r1 %>% filter(!is.na(date))
raw_r2 <- raw_r2 %>% filter(!is.na(date))

unique(raw_r1$subject)
# D118 is showing up as "test" for some reason (checked against the .iqdat file), and D130_b is missing
# both of D130's and D142's visits were entered as "D130"/"D142", so change the subject ID for the visit on 052416 to D130_b and on 
raw_r1$subject[raw_r1$date == 020916] <- "D118"
raw_r1$subject[raw_r1$date == 052416] <- "D130_b"
raw_r1$subject[raw_r1$date == 111516] <- "D142_b"

# fixing some other stuff in a similar vein
raw_r1$subject[raw_r1$subject == "D101_2"] <- "D101_b"
raw_r1$subject[raw_r1$subject == "D102_B"] <- "D102_b"
raw_r1$subject[raw_r1$subject == "D117_b"] <- "D117"
raw_r1$subject[raw_r1$subject == "D117_c"] <- "D117_b"
raw_r1$subject[raw_r1$subject == "D135_c"] <- "D135_b"

length(unique(raw_r1$subject)) # 78 unique - that is correct

unique(raw_r2$subject)
# some similar issues to fix
raw_r2$subject[raw_r2$subject == "D101_2Y"] <- "D101_b"
raw_r2$subject[raw_r2$subject == "D102_B"] <- "D102_b"
raw_r2$subject[raw_r2$subject == "D107_B_2"] <- "D107_b"
raw_r2$subject[raw_r2$subject == "D117_b"] <- "D117"
raw_r2$subject[raw_r2$subject == "D117_c"] <- "D117_b"
raw_r2$subject[raw_r2$subject == "D126_B"] <- "D126_b"
raw_r2$subject[raw_r2$subject == "D135_c"] <- "D135_b"
raw_r2$subject[raw_r2$date == 111516] <- "D142_b"

length(unique(raw_r2$subject)) # 78 unique - that is correct

str(raw_r1)
str(raw_r2)
# take out ITIs
unique(raw_r1$trialcode)
mlm_r1 <- filter(raw_r1, grepl("^A",trialcode))
unique(mlm_r1$trialcode)

unique(raw_r2$trialcode)
mlm_r2 <- filter(raw_r2, grepl("^A",trialcode))
unique(mlm_r2$trialcode)

# add a "trialnum" variable, grouped by ID
mlm_r1 <- mlm_r1 %>% group_by(subject) %>% mutate(trialnum = row_number())
View(mlm_r1)
mlm_r2 <- mlm_r2 %>% group_by(subject) %>% mutate(trialnum = row_number())
View(mlm_r2)

mlm_r1 %>% group_by(subject) %>% count() # everyone has 144 trials
mlm_r2 %>% group_by(subject) %>% count() # everyone has 144 trials, except D122_b has 177
# no clue why that happened, although I do vaguely remember we had one session where the task seemed to go on and on and we force quit it?

# remove trials 145-177 for D122_b:
mlm_r2 <- filter(mlm_r2, trialnum <=144)
mlm_r2 %>% group_by(subject) %>% count()
# now everyone has 144 trials

# add a column for "run"
mlm_r1$run <- "1"
mlm_r2$run <- "2"

# add a column for "visit"
mlm_r1$visit <- as.factor(ifelse(grepl("*_b", mlm_r1$subject), "2", "1"))
mlm_r2$visit <- as.factor(ifelse(grepl("*_b", mlm_r2$subject), "2", "1"))

mlm_r1 %>% group_by(subject, visit, run) %>% count() # all looks good: everyone has 144 trials for each run at each visit
mlm_r2 %>% group_by(subject, visit, run) %>% count() # all looks good: everyone has 144 trials for each run at each visit

# now remove the "_b" from visit 2 IDs
mlm_r1 <- mlm_r1 %>% ungroup() %>%
  mutate(subject = str_replace(subject, "_b", ""))
unique(mlm_r1$subject)

mlm_r2 <- mlm_r2 %>% ungroup() %>%
  mutate(subject = str_replace(subject, "_b", ""))
unique(mlm_r2$subject)

# merge data from the 2 runs 
bx <- bind_rows(mlm_r1, mlm_r2)

# split up by visit
bx_v1 <- bx %>% filter(visit == "1")
bx_v2 <- bx %>% filter(visit == "2")

bx_v1 %>% group_by(subject, run) %>% count() # everyone has 144 trials for each run at visit 1
bx_v2 %>% group_by(subject, run) %>% count() # everyone has 144 trials for each run at visit 2
# add columns for "cond" at visit 1 and visit 2 [condition: A/placebo or B/oxytocin]
# load in the randomization data
randomize <- readRDS("~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/randomization.rds")
str(randomize)

bx_v1 <- bx_v1 %>%
  rename("ID" = subject)

bx_v2 <- bx_v2 %>%
  rename("ID" = subject)

# get the IDs for everyone who got treatment A at visit 1 
IDs_v1_txA <- randomize %>% filter(tx_v1 == "A") 
txA_list <- IDs_v1_txA$ID
txA_list

# ifelse statement: if ID = any of those listed in txA_list, make cond_v1 = "A", else make it "B"
bx_v1 <- bx_v1 %>%
  mutate(cond_v1 = as.factor(ifelse(ID == "D101" | ID == "D105" | ID == "D109" | ID == "D110" | ID == "D114" | ID == "D115" | ID == "D116" | ID == "D118" | ID == "D119" | ID == "D120" | ID == "D123" | ID == "D124" | ID == "D126" | ID == "D128" | ID == "D132" | ID == "D135" | ID == "D136" | ID == "D137" | ID == "D138" | ID == "D140" | ID == "D141" | ID == "D145" | ID == "D148" | ID == "D149" | ID == "D117", "A", "B")), cond_v2 = as.factor(ifelse(ID == "D101" | ID == "D105" | ID == "D109" | ID == "D110" | ID == "D114" | ID == "D115" | ID == "D116" | ID == "D118" | ID == "D119" | ID == "D120" | ID == "D123" | ID == "D124" | ID == "D126" | ID == "D128" | ID == "D132" | ID == "D135" | ID == "D136" | ID == "D137" | ID == "D138" | ID == "D140" | ID == "D141" | ID == "D145" | ID == "D148" | ID == "D149" | ID == "D117", "B", "A")))

# ifelse statement: if ID = any of those listed in txA_list, make cond_v2 = "B", else make it "A" (people who were A at visit 1 should be B for visit 2, and vice versa)
bx_v2 <- bx_v2 %>%
  mutate(cond_v2 = as.factor(ifelse(ID == "D101" | ID == "D105" | ID == "D109" | ID == "D110" | ID == "D114" | ID == "D115" | ID == "D116" | ID == "D118" | ID == "D119" | ID == "D120" | ID == "D123" | ID == "D124" | ID == "D126" | ID == "D128" | ID == "D132" | ID == "D135" | ID == "D136" | ID == "D137" | ID == "D138" | ID == "D140" | ID == "D141" | ID == "D145" | ID == "D148" | ID == "D149" | ID == "D117", "B", "A")), cond_v1 = as.factor(ifelse(ID == "D101" | ID == "D105" | ID == "D109" | ID == "D110" | ID == "D114" | ID == "D115" | ID == "D116" | ID == "D118" | ID == "D119" | ID == "D120" | ID == "D123" | ID == "D124" | ID == "D126" | ID == "D128" | ID == "D132" | ID == "D135" | ID == "D136" | ID == "D137" | ID == "D138" | ID == "D140" | ID == "D141" | ID == "D145" | ID == "D148" | ID == "D149" | ID == "D117", "A", "B")))

levels(bx_v1$cond_v1)
levels(bx_v2$cond_v2)

head(bx_v1)

txA_list
bx_v1 %>% group_by(cond_v1) %>% count(ID) # IDs and cond match txA_list *note that some IDs from the randomization dataset are listed in txA but not in the behavioral data. This is because some participants were dropped or never ended up completing their experimental session: D109 (dropped after 1st session), D116 and D136 (never enrolled), D124 (incidental finding, excluded after T1MPRAGE).
bx_v2 %>% group_by(cond_v2) %>% count(ID) # IDs and cond match txA_list

bx_long <- bind_rows(bx_v1,bx_v2)
View(bx_long)
# rename some variables
colnames(bx_long)
bx_long <- bx_long %>% rename("push_pull" = values.initialresponse,
                              "gAAT_RT" = values.RT)
head(bx_long)

# add a new variable for condition
bx_long <- bx_long %>% mutate(cond = as.factor(ifelse(cond_v1 == "A" & visit == "1", "A",
                                                      ifelse(cond_v2 == "A" & visit == "2", "A",
                                                             ifelse(cond_v1 == "B" & visit == "1", "B",
                                                                    ifelse(cond_v2 == "B" & visit == "2", "B", NA))))))

View(bx_long) # check that it coded the "cond" column correctly      

# add a new variable for stimulus category
# in values.stimulus:
# 1 = spouse, 2 = living loved one/WHOTO, 3 = stranger, 4 = nomothetic death-related, 5 = neutral images

sort(unique(bx_long$values.stimulus))

bx_long <- bx_long %>%
  mutate(stim = as.factor(ifelse(values.stimulus == "1B_1.jpg"|values.stimulus == "1B_2.jpg"|values.stimulus == "1B_3.jpg"|values.stimulus == "1Y_1.jpg"|values.stimulus == "1Y_2.jpg"|values.stimulus == "1Y_3.jpg", "spouse", 
                                 ifelse(values.stimulus == "2B_1.jpg"|values.stimulus == "2B_2.jpg"|values.stimulus == "2B_3.jpg"|values.stimulus == "2Y_1.jpg"|values.stimulus == "2Y_2.jpg"|values.stimulus == "2Y_3.jpg", "living",
                                        ifelse(values.stimulus == "3B_1.jpg"|values.stimulus == "3B_2.jpg"|values.stimulus == "3B_3.jpg"|values.stimulus == "3Y_1.jpg"|values.stimulus == "3Y_2.jpg"|values.stimulus == "3Y_3.jpg", "stranger",
                                               ifelse(values.stimulus == "4B_1.jpg"|values.stimulus == "4B_2.jpg"|values.stimulus == "4B_3.jpg"|values.stimulus == "4Y_1.jpg"|values.stimulus == "4Y_2.jpg"|values.stimulus == "4Y_3.jpg", "death",
                                                      ifelse(values.stimulus == "5B_1.jpg"|values.stimulus == "5B_2.jpg"|values.stimulus == "5B_3.jpg"|values.stimulus == "5Y_1.jpg"|values.stimulus == "5Y_2.jpg"|values.stimulus == "5Y_3.jpg", "neutral", NA)))))))

levels(bx_long$stim)
bx_long$stim <- relevel(bx_long$stim, ref = "neutral") # make neutral the reference level

# save it
saveRDS(bx_long, "~/Dropbox/GLASS Lab/OT gAAT for meeting 5-10-19/bx_long.rds")

Remove outliers

Outlier removal follows conventions from other gAAT papers, which exclude trials with RTs that are equal to or above the 99th percentile (calculated from the sample as a whole) or equal to or below 1st percentile.

# calculate percentiles separately for placebo/oxytocin conditions
bx_pl <- bx_long %>% filter(cond == "A")
bx_ot <- bx_long %>% filter(cond == "B")
p99pl <- quantile(bx_pl$gAAT_RT, 0.99) # 1716.76 ms
p01pl <- quantile(bx_pl$gAAT_RT, 0.01) # 463 ms
p99ot <- quantile(bx_ot$gAAT_RT, 0.99) # 1711.07 ms
p01ot <- quantile(bx_ot$gAAT_RT, 0.01) # 473 ms

# identify placebo condition outliers
bx_pl <- bx_pl %>%
  mutate(outlier_RT = ifelse(gAAT_RT <= p01pl | gAAT_RT >= p99pl, 1, 0))
table(bx_pl$outlier_RT) 
227/11005 # about 2% of trials are outliers

# identify oxytocin condition outliers
bx_ot <- bx_ot %>%
  mutate(outlier_RT = ifelse(gAAT_RT <= p01ot | gAAT_RT >= p99ot, 1, 0))
table(bx_ot$outlier_RT) 
229/11003 # about 2% of trials are outliers

bx_long_noOut <- bind_rows(bx_pl, bx_ot) %>% filter(outlier_RT == 0)

dim(bx_long)
dim(bx_long_noOut)  # after outliers removed, there are 22008 trials total of the original 22464: 22464 - (227+229) = 22008

saveRDS(bx_long_noOut, "~/Dropbox/GLASS Lab/OT gAAT for meeting 5-10-19/bx_long_noOut.rds")
write_csv(bx_long_noOut, "~/Dropbox/GLASS Lab/OT gAAT for meeting 5-10-19/bx_long_noOut.csv")

Check data and distribution

library(psych)

# how much missing data is there?
ntrials <- bx_long_noOut %>% group_by(ID, cond) %>% count() # don't group by push_pull because peopled pulled/pushed on different numbers of trials, for ex. responses in the wrong direction
describe(ntrials$n/288) # everyone has at least 90% of the 288 trials expected at each visit (no more than 10% trials dropped because of outliers or missed responses)

describe(bx_long_noOut$gAAT_RT) # skewness is 1.17, kurtosis is 1.7
hist(bx_long_noOut$gAAT_RT) # distribution is skewed, as usual for RT data...
qqnorm(bx_long_noOut$gAAT_RT) # and skewness is reflected in QQ plot

Bias scores (based on median RTs)

# creating a wide dataset with the bias variables, which will then be converted back to a long dataset
# The arguments to spread():
# - data: Data object
# - key: Name of column containing the new column names
# - value: Name of column containing values
data_wide <- spread(bx_long_noOut, key=stim, value=gAAT_RT)
colnames(data_wide)
View(data_wide)

# subset by condition and direction
data_pushA <- data_wide %>% select(ID, cond, push_pull, visit, neutral, death, living, spouse, stranger) %>% filter(cond == "A" & push_pull == "PUSH") %>% group_by(ID) %>% mutate(neutralApush = median(neutral, na.rm = TRUE), deathApush = median(death, na.rm = TRUE), spouseApush = median(spouse, na.rm=TRUE), livingApush = median(living, na.rm=TRUE), strangerApush = median(stranger, na.rm=TRUE))

data_pullA <- data_wide %>% select(ID, cond, push_pull, visit, neutral, death, living, spouse, stranger) %>% filter(cond == "A" & push_pull == "PULL") %>% group_by(ID) %>% mutate(neutralApull = median(neutral, na.rm = TRUE), deathApull = median(death, na.rm = TRUE), spouseApull = median(spouse, na.rm=TRUE), livingApull = median(living, na.rm=TRUE), strangerApull = median(stranger, na.rm=TRUE))

data_pushB <- data_wide %>% select(ID, cond, push_pull, visit, neutral, death, living, spouse, stranger) %>% filter(cond == "B" & push_pull == "PUSH") %>% group_by(ID) %>% mutate(neutralBpush = median(neutral, na.rm = TRUE), deathBpush = median(death, na.rm = TRUE), spouseBpush = median(spouse, na.rm=TRUE), livingBpush = median(living, na.rm=TRUE), strangerBpush = median(stranger, na.rm=TRUE))

data_pullB <- data_wide %>% select(ID, cond, push_pull, visit, neutral, death, living, spouse, stranger) %>% filter(cond == "B" & push_pull == "PULL") %>% group_by(ID) %>% mutate(neutralBpull = median(neutral, na.rm = TRUE), deathBpull = median(death, na.rm = TRUE), spouseBpull = median(spouse, na.rm=TRUE), livingBpull = median(living, na.rm=TRUE), strangerBpull = median(stranger, na.rm=TRUE))

# summarize by ID
data_pushA1 <- data_pushA[!duplicated(data_pushA$ID), ] %>% select(-c(neutral, death, living, spouse, stranger, visit, cond, push_pull))
data_pushB1 <- data_pushB[!duplicated(data_pushB$ID), ] %>% select(-c(neutral, death, living, spouse, stranger, visit, cond, push_pull))
data_pullA1 <- data_pullA[!duplicated(data_pullA$ID), ] %>% select(-c(neutral, death, living, spouse, stranger, visit, cond, push_pull))
data_pullB1 <- data_pullB[!duplicated(data_pullB$ID), ] %>% select(-c(neutral, death, living, spouse, stranger, visit, cond, push_pull))

# merge the 4 subsets together
join1 <- left_join(data_pushA1, data_pushB1, by="ID")
join2 <- left_join(join1, data_pullA1, by = "ID")
bias <- left_join(join2, data_pullB1, by = "ID")
head(bias)

bias <- bias %>% mutate(bias_neu_A = neutralApush - neutralApull,
                        bias_dea_A = deathApush - deathApull,
                        bias_spo_A = spouseApush - spouseApull,
                        bias_str_A = strangerApush - strangerApull,
                        bias_liv_A = livingApush - livingApull,
                        bias_neu_B = neutralBpush - neutralBpull,
                        bias_dea_B = deathBpush - deathBpull,
                        bias_spo_B = spouseBpush - spouseBpull,
                        bias_str_B = strangerBpush - strangerBpull,
                        bias_liv_B = livingBpush - livingBpull
)

# drop the condition/stim specific variables
bias <- bias %>% select(-c(neutralApush, deathApush,  spouseApush,  livingApush, strangerApush, neutralBpush, deathBpush,   spouseBpush,  livingBpush,  strangerBpush, neutralApull, deathApull, spouseApull, livingApull, strangerApull, neutralBpull, deathBpull, spouseBpull, livingBpull, strangerBpull))
colnames(bias)

# turn it into a long dataset
bias_long <- gather(bias,
                    key = "stim",
                    value = "bias", -c(ID)) 
head(bias_long)



# create new columns for stimulus category and condition
bias_long$cond <- as.factor(ifelse(grepl("*_A", bias_long$stim), "A", "B"))
bias_long$stimulus <- as.factor(ifelse(grepl("*neu*", bias_long$stim), "neutral", 
                                       ifelse(grepl("*dea*", bias_long$stim), "death",
                                              ifelse(grepl("*spo*", bias_long$stim), "spouse", 
                                                     ifelse(grepl("*str*", bias_long$stim), "stranger", 
                                                            ifelse(grepl("*liv*", bias_long$stim), "living", NA))))))

bias_long <- bias_long %>% select(-stim) # no longer need the "stim" variable

Check data and distribution

describe(bias_long$bias) # skewness is -.01, kurtosis is 1.34, M = 14.04, SD = 70.01
hist(bias_long$bias) # normal distribution
qqnorm(bias_long$bias) # definitely some outliers

# check out the outliers
## function from https://stackoverflow.com/questions/12866189/calculating-the-outliers-in-r
outfun <- function(x) {
  abs(x-mean(x,na.rm=TRUE)) > 3*sd(x,na.rm=TRUE)
}

# add a variable for outlier = T/F
bias_long$outlier <- outfun(bias_long$bias)
table(bias_long$outlier) # 4 observations where outlier = TRUE (>3SD)
# which are these?
bias_long %>% filter(outlier==TRUE)

### this is another way to do it using boxplot.stats
# outlier_values <- boxplot.stats(medians_long$bias)$out
# boxplot(data_long$bias, main="Outliers", boxwex=0.3)
# mtext(paste("Outlying values: ", paste(round(outlier_values, digits=2), collapse=", ")), cex=0.9, side=1)

saveRDS(bias_long, "~/Dropbox/GLASS Lab/OT gAAT for meeting 5-10-19/bias_long.rds")
write_csv(bias_long, "~/Dropbox/GLASS Lab/OT gAAT for meeting 5-10-19/bias_long.csv")
The four extreme outliers (>3 SD) are:
    D137 death A (-284.0) D145 death A (-247.5) D147 death A (233.0) D139 spouse B (275.5)

Trial-level bias scores (for MLM only)

To calculate trial-level bias (aka “compatibility”) scores: separate push minus pull trials, then subtract RT on that trial at run1 from RT on that trial at run2.

bx_long <- readRDS("~/Dropbox/GLASS Lab/OT gAAT for meeting 5-10-19/bx_long.rds")
bx_r1.1 <- bx_long %>% filter(run == "1")
bx_r2.1 <- bx_long %>% filter(run == "2")
tail(bx_r1.1)
tail(bx_r2.1) 
# run1 should line up with run2: "stim" should match (i.e, spouse trials with spouse trials) but push_pull should say PUSH at one run and PULL at the other

# calculate percentiles for outlier removal (run1 and run2)
p99r1 <- quantile(bx_r1.1$gAAT_RT, 0.99) 
p01r1 <- quantile(bx_r1.1$gAAT_RT, 0.01) 
p99r1 # 99th percentile RTs = 1713.38ms 
p01r1 # 1st percentile RTs = 472ms

p99r2 <- quantile(bx_r2.1$gAAT_RT, 0.99) 
p01r2 <- quantile(bx_r2.1$gAAT_RT, 0.01) 
p99r2 # 99th percentile RTs = 1712.45ms 
p01r2 # 1st percentile RTs = 463ms

bx_r1.2 <- bx_r1.1 %>%
  mutate(outlier_RT = ifelse(gAAT_RT <= p01r1 | gAAT_RT >= p99r1, 1, 0))
table(bx_r1.2$outlier_RT) 
227/11005 # 227 trials will be dropped, 11005 will be retained...about 2% of trials.

bx_r2.2 <- bx_r2.1 %>%
  mutate(outlier_RT = ifelse(gAAT_RT <= p01r2 | gAAT_RT >= p99r2, 1, 0))
table(bx_r2.2$outlier_RT) 
230/11002 # 230 trials will be dropped, 11002 will be retained...about 2% of trials.

bx_r1r2 <- bind_cols(bx_r1.2, bx_r2.2)
dim(bx_r1r2)  # after outliers removed, there are 11232 trials total

# make sure that trials in the two runs line up post-merge
head(bx_r1r2) 
tail(bx_r1r2)

# get rid of any trials with outliers in either run1 or run2 
# (need run1/run2 to be the same length so that the trials match up)
bx_r1r2.1 <- bx_r1r2 %>% filter(outlier_RT == "0" & outlier_RT1 == "0") 
count(bx_r1r2.1) # 10790 obs.
10790/11232 # ~96% of trials retained = 4% data excluded

push_pull <- bx_r1r2.1 %>% filter(push_pull == "PUSH" & push_pull1 == "PULL") %>% mutate(bias = (gAAT_RT-gAAT_RT1))
pull_push <- bx_r1r2.1 %>% filter(push_pull == "PULL" & push_pull1 == "PUSH") %>% mutate(bias = (gAAT_RT1-gAAT_RT))
bx_pp <- bind_rows(push_pull,pull_push)

head(bx_pp) # can see from this that D101 (and possibly others) has only a few trials, because they failed to reverse the instructions (i.e., push_pull and push_pull1 columns have the same values instead of PUSH at one and PULL at the other)
# in essence, this removes their "error" trials

bx_pp %>% group_by(ID, cond) %>% count() # yep, this is visible in their *very low* trialcounts:
# D101 A n = 3
# D141 A n = 18
# D147 B n = 1
# D148 A n = 19

As we see from the last part of the script above, 4 participants have extremely low trial counts at one visit or another, due to failure to reverse the instructions. This will be addressed next.

# create a "drop" variable for these 4
bx_pp <- bx_pp %>% mutate(low_n_trials = ifelse(ID == "D101" & cond == "A" | ID == "D141" & cond == "A"| ID == "D148" & cond == "A" | ID == "D147" & cond == "B", 1, 0))

# check whether the rows line up
notlinedup <- bx_pp %>% filter(stim != stim1)
notlinedup
notlinedup <- bx_pp %>% filter(trialcode != trialcode1)
notlinedup
notlinedup <- bx_pp %>% filter(trialnum != trialnum1)
notlinedup
notlinedup <- bx_pp %>% filter(push_pull == push_pull1)
notlinedup
# 0 rows returned; all the rows match. Thus we conclude the rows from the two runs line up.

saveRDS(bx_pp, "~/Dropbox/GLASS Lab/OT gAAT for meeting 5-10-19/bx_long_trialbytrialBias.rds")
LS0tCnRpdGxlOiAiT1QgZ0FBVCBiZWhhdmlvcmFsIGRhdGEgYW5hbHlzZXMgZm9yIG1lZXRpbmciCmF1dGhvcjogIlNhcmVuIFNlZWxleSIKZGF0ZTogIjA1LTE1LTIwMTkiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgbnVtYmVyX3NlY3Rpb25zOiBubwogICAgdGhlbWU6IHBhcGVyCiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICB0b2M6IHllcwotLS0KIyBBYm91dAoKIyMgUXVlc3Rpb25zCiogV2hpY2ggb3V0Y29tZSBtYWtlcyB0aGUgbW9zdCBzZW5zZTogbG9va2luZyBhdCBSVDxzdWI+UFVTSDwvc3ViPiBhbmQgUlQ8c3ViPlBVTEw8L3N1Yj4sIG9yIGF0IHRoZSBiaWFzIHNjb3Jlcz8KKiBXaGljaCBzdGF0aXN0aWNhbCB0ZXN0KHMpIHdvdWxkIGJlIG1vc3QgYXBwcm9wcmlhdGUgZm9yIGVhY2ggYWltPwoqIEhvdyB0byBzZXQgdXAgcGxhbm5lZCBjb250cmFzdHMgY29ycmVjdGx5CiogV2hpY2ggY292YXJpYXRlcyB0byBpbmNsdWRlIChlLmcuLCBjb250cm9sbGluZyBmb3Igb3JkZXIgZWZmZWN0cykKCiMjIEF0IGEgZ2xhbmNlCgoqIDM5IGJlcmVhdmVkIHBhcnRpY2lwYW50cwoqIFJhbmRvbWl6ZWQgZG91YmxlLWJsaW5kIHBsYWNlYm8tY29udHJvbGxlZCBjcm9zc292ZXIgZGVzaWduCjx1bD4qIFR3byB0cmVhdG1lbnRzICh0aHVzIHR3byB0aW1lcG9pbnRzKTogb3h5dG9jaW4gb3IgcGxhY2VibzwvdWw+CiogUHJpbWFyeSBvdXRjb21lIGlzIHRhc2sgcGVyZm9ybWFuY2UgKHJlYWN0aW9uIHRpbWUsIE9SIGJpYXMgc2NvcmVzKQoqIFByaW1hcnkgaW5kZXBlbmRlbnQgdmFyaWFibGVzIGFyZSBncmllZiBzZXZlcml0eSAoY2F0ZWdvcmljYWw6IENHL05DRyksIHRyZWF0bWVudCAob3h5dG9jaW4vcGxhY2VibyksIGFuZCBzdGltdWx1cyAoNSBkaWZmZXJlbnQgY2F0ZWdvcmllcykKCgojIyBTdHVkeSBkZXNjcmlwdGlvbgpUaGlzIHByb2plY3QgdXNlcyBiZWhhdmlvcmFsIGFuZCBzZWxmLXJlcG9ydCBkYXRhIGZyb20gdGhlIHN0dWR5IOKAnFRoZSBlZmZlY3Qgb2YgaW50cmFuYXNhbCBveHl0b2NpbiBvbiBuZXVyYWwgZnVuY3Rpb25pbmcgaW4gd2lkb3coZXIpc+KAnSAoIzE1MDM3NDQ0MjAsIFBJOiBNYXJ5LUZyYW5jZXMgTydDb25ub3IsIENvLVBJOiBCcmlhbiBBcml6bWVuZGkpLiBJdCB3YXMgYSBkb3VibGUtYmxpbmQgcmFuZG9taXplZCBjcm9zc292ZXIgc3R1ZHkgdXNpbmcgYW4gaW50cmFuYXNhbCBveHl0b2NpbiBtYW5pcHVsYXRpb24gYW5kIGFwcHJvYWNoLWF2b2lkYW5jZSB0YXNrIHZhcmlhbnQgKGdyaWVmIEFBVDsgZ0FBVCkgdG8gaW52ZXN0aWdhdGUgY29uZmxpY3RpbmcgYWNjb3VudHMgb2YgbW90aXZhdGVkIGJlaGF2aW9yIGluIHBlb3BsZSB3aXRoIGNvbXBsaWNhdGVkIGdyaWVmLiBFbnJvbGxlZCBwYXJ0aWNpcGFudHMgd2VyZSBvbGRlciBhZHVsdHMgd2hvIGhhZCBleHBlcmllbmNlZCB0aGUgZGVhdGggb2YgYSBzcG91c2Ugb3IgbG9uZy10ZXJtIHJvbWFudGljIHBhcnRuZXIgYmV0d2VlbiA2LTM2IG1vbnRocyBwcmlvciB0byB0aGVpciBwYXJ0aWNpcGF0aW9uLiBTdHJhdGlmaWVkIHNhbXBsaW5nIHdhcyB1c2VkIHRvIGVuc3VyZSBhIHJhbmdlIG9mIGdyaWVmIHN5bXB0b20gc2V2ZXJpdHkgc2NvcmVzIHdhcyByZXByZXNlbnRlZCBpbiB0aGUgc2FtcGxlLgoKUGFydGljaXBhbnRzIGF0dGVuZGVkIHR3byBpZGVudGljYWwgZXhwZXJpbWVudGFsIHNlc3Npb25zLCBhdCB3aGljaCB0aGV5IHJlY2VpdmVkIG9uZSBvZiB0d28gaW50cmFuYXNhbCBzcHJheXMgKG94eXRvY2luIG9yIHBsYWNlYm8pIGFuZCB0aGVuIHRvb2sgcGFydCBpbiBhbiBmTVJJIHNjYW4sIGR1cmluZyB3aGljaCB0aW1lIHRoZXkgY29tcGxldGVkIHRoZSB0YXNrLgoKIyMgVGFzayAoZ0FBVCkKSW4gdGhlIGdBQVQsIGZpdmUgc3RpbXVsdXMgY2F0ZWdvcmllcyB3ZXJlIHByZXNlbnRlZDogCgoxLiBQZXJzb25hbCBwaG90b3Mgb2YgdGhlIGRlY2Vhc2VkIHNwb3VzZSwKMi4gUGVyc29uYWwgcGhvdG9zIG9mIGEgbGl2aW5nIGxvdmVkIG9uZSwgCjMuIFBob3RvcyBvZiBhIGZlbWFsZSBvciBtYWxlIHN0cmFuZ2VyLAo0LiBHcmllZi1yZWxhdGVkIHNjZW5lcywgYW5kIAo1LiBOZXV0cmFsIHNjZW5lcy4gCgpQaG90b3MgcHJvdmlkZWQgYnkgdGhlIHBhcnRpY2lwYW50IHdlcmUgc2Nhbm5lZCxyZXNpemVkLCBhbmQgZnJhbWVkIHdpdGggYmx1ZS95ZWxsb3cgZnJhbWVzIHRvIG1hdGNoIHRoZSBvdGhlciBzdGltdWxpIHVzZWQgaW4gdGhlIHRhc2suIFBob3RvcyBvZiB0aGUgc3RyYW5nZXIgd2VyZSBzZXgtbWF0Y2hlZCB0byB0aGUgcGFydGljaXBhbnQncyBwYXJ0bmVyLiAKClBhcnRpY2lwYW50cyBjb21wbGV0ZWQgdGhlIHRhc2sgdXNpbmcgYSBqb3lzdGljay4gVGhlIHN0aW11bGkgd2VyZSBhbmltYXRlZCBzbyB0aGF0IGEgam95c3RpY2sgcHVzaCB3b3VsZCBtYWtlIHRoZSBpbWFnZSBzbWFsbGVyIChhcyBpZiB0aGV5IHdlcmUgcHVzaGluZyBpdCBhd2F5KSBhbmQgYSBqb3lzdGljayBwdWxsIHdvdWxkIG1ha2UgdGhlIGltYWdlIGxhcmdlciAoYXMgaWYgdGhleSB3ZXJlIGJyaW5naW5nIGl0IGNsb3NlcikuCgpQYXJ0aWNpcGFudHMgd2VyZSBpbnN0cnVjdGVkIHRvIHJlc3BvbmQgZHVyaW5nIHRoZSB0YXNrIHRvIHRoZSBjb2xvciBvZiBhIHBob3RvJ3MgZnJhbWUsIGUuZy4sIF8iKipwdXNoKiogdGhlIGpveXN0aWNrIHdoZW4gdGhlIGZyYW1lIGlzIEJMVUUsICoqcHVsbCoqIHdoZW4gdGhlIGZyYW1lIGlzIFlFTExPVyJfKS4gT25jZSBwYXJ0aWNpcGFudHMgaGFkIGNvbXBsZXRlZCB0aGUgZmlyc3QgcnVuIG9mIHRoZSB0YXNrICgxNDQgdHJpYWxzKSwgdGhleSBjb21wbGV0ZWQgYSBzZWNvbmQgcnVuIHRoYXQgd2FzIGlkZW50aWNhbCB0byB0aGUgZmlyc3QgZXhjZXB0IGZvciB0aGUgaW5zdHJ1Y3Rpb25zLCB3aGljaCB3ZXJlIHJldmVyc2VkIChlLmcuIF8ibm93ICoqcHVzaCoqIHRoZSBqb3lzdGljayBmb3IgWUVMTE9XIGFuZCAqKnB1bGwqKiBmb3IgQkxVRSJfKS4gT3JkZXIgb2YgaW5zdHJ1Y3Rpb25zIHdhcyBjb3VudGVyYmFsYW5jZWQgYWNyb3NzIHBhcnRpY2lwYW50cy4gU3RpbXVsaSB3ZXJlIHByZXNlbnRlZCB2aWEgSW5xdWlzaXQgNCAoMjAxNCksIGluIGEgcHNldWRvcmFuZG9taXplZCBvcmRlciBkZXRlcm1pbmVkIGJ5IGdlbmV0aWMgYWxnb3JpdGhtIHRvIG9wdGltaXplIHN0YXRpc3RpY2FsIHBvd2VyIGFuZCBwc3ljaG9sb2dpY2FsIHZhbGlkaXR5IChXYWdlciAmIE5pY2hvbHMsIDIwMDMpLiBFYWNoIHRyaWFsIGxhc3QgMzAwMG1zLCB3aXRoIDI1MDAgbXMgYWxsb3dlZCBmb3IgcmVzcG9uc2UuIEludGVydHJpYWwgaW50ZXJ2YWwgd2FzIDUwMG1zLgoKCgoKIyBXaGF0IHNob3VsZCB3ZSB1c2UgYXMgRFY/IAoKTUZPOjxicj4gClNob3VsZCBpdCBiZSBSVCB0byBvbmUgc3RpbXVsdXMgdHlwZSwgUlQgdG8gdGhlIGNvbnRyYXN0IG9mIG9uZSBzdGltdWxpIHR5cGUgPiBhbm90aGVyLCBvciBjb21wYXRpYmlsaXR5IHNjb3Jlcz8gQ29tcGF0aWJpbGl0eSBzY29yZXMgaGF2ZSBmZWx0IHRoZSBlYXNpZXN0IGZvciBtZSB0byB1bmRlcnN0YW5kIGFuZCBjb21wYXJlIChhbmQgdGhleSB3ZXJlIHdoYXQgYXQgbGVhc3Qgb25lIG9mIG91ciByZXZpZXdlcnMgd2FzIGV4cGVjdGluZykuIElzIGl0IHRydWUgdGhhdCB1c2luZyBjb21wYXRpYmlsaXR5IHNjb3JlcyBhcyBhIERWIGhhcyB0aGUgYWR2YW50YWdlIG9mIHJlZHVjaW5nIHRoZSBudW1iZXIgb2YgcHJlZGljdG9ycyBpbiBhbnkgb2Ygb3VyIG1vZGVscyAoYXMgdGhleSByZW1vdmUgdGhlIG5lZWQgZm9yIHJlc3BvbnNlIGRpcmVjdGlvbiBpZiB0aG9zZSBhcmUgc3VtbWVkIGluIHRoZSBEVik/CgpCQTo8YnI+Cl9JIGFncmVlIHdpdGggdGhpcyBwb2ludCwgYW5kIGRvIGJlbGlldmUgdGhhdCBjb252ZXJ0aW5nIHB1c2gvcHVsbCB0byBvbmUgY29tcGF0aWJpbGl0eSBzY29yZSBhcyB0aGUgRFYgY291bGQgd29yayB3ZWxsIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHByZWRpY3RvcnMuICBUaGlzIG1pZ2h0IGJlIGdvb2QgY29uc2lkZXJpbmcgdyB0aGUgcG93ZXIgaXNzdWUuXwoKU1M6PGJyPgpZZXMsIGl0IGlzIHRydWUgdGhhdCBpZiB3ZSB1c2UgYmlhcyBzY29yZXMgd2UgZG8gbm90IGluY2x1ZGUg4oCcZGlyZWN0aW9u4oCdIGFzIGEgcHJlZGljdG9yLgoKT24gdGhlIG90aGVyIGhhbmQsIGlmIHdlIHVzZSB0aGUgbWl4ZWQgZWZmZWN0cyBtb2RlbGluZyBhcHByb2FjaCwgd2UgaGF2ZSB2YXN0bHkgbW9yZSBwb3dlciBiZWNhdXNlIHdlIHRoZW4gaGF2ZSB+Mjg4IG9ic2VydmF0aW9ucyBwZXIgcGVyc29uIHBlciBzZXNzaW9uIChzbyB+NTc2IGVhY2ggc3ViamVjdCwgaWYgdXNpbmcgZGF0YSBmcm9tIGJvdGggT1QgYW5kIFBMIHNlc3Npb25zKSByYXRoZXIgdGhhbiAxMCBvYnNlcnZhdGlvbnMgKGkuZS4sIDUgc3RpbXVsaSB4IDIgZGlyZWN0aW9ucywgdXNpbmcgbWVkaWFucyB0byBjb21wdXRlIGJpYXMpIHBlciBwZXJzb24vc2Vzc2lvbi4gU28gaGF2aW5nICJkaXJlY3Rpb24iIGFzIGEgcHJlZGljdG9yIGlzIGxlc3Mgb2YgYW4gaXNzdWUuCgpFaXRoZXIgd2F5LCBJIHRoaW5rIHVzaW5nIHRoZSBiaWFzIHNjb3JlcyBfZm9yIGZpZ3VyZXNfIGlzIGhlbHBmdWwgaW4gZGVwaWN0aW5nIGFwcHJvYWNoL2F2b2lkIHRlbmRlbmNpZXMuCgoqIFByb3Mgb2YgImRpcmVjdGlvbiIgbW9kZWw6CUJlaW5nIGFibGUgdG8gaWRlbnRpZnkgd2hldGhlciB0aGUgY2hhbmdlIGluIGJpYXMgaXMgZHJpdmVuIGJ5IGZhc3Rlci9zbG93ZXIgcHVzaCBvciBwdWxsIGlzIHBvdGVudGlhbGx5IHVzZWZ1bC4gTW9yZSBwb3dlciB0aGFuIGJpYXMgc2NvcmVzIChtb3JlIG9ic2VydmF0aW9ucyAtIHVubGVzcyB3ZSB1c2UgdGhlIHRyaWFsLWxldmVsIGJpYXMgc2NvcmVzLCB3aGljaCBJJ20gbm90IHN1cmUgdGhhdCB3ZSBzaG91bGQuKQoKKiBDb25zIG9mICJkaXJlY3Rpb24iIG1vZGVsOglNYXkgYmUgbW9yZSBkaWZmaWN1bHQgdG8gaW50ZXJwcmV0IGdpdmVuIHRoZSBhZGRpdGlvbmFsIGxldmVsIGluIHRoZSBpbnRlcmFjdGlvbnMgKHBvdGVudGlhbCA0LXdheSkuCgpTaWRlIG5vdGU6IEkgZmluZCB0aGUgdGVybSDigJxjb21wYXRpYmlsaXR5IHNjb3Jlc+KAnSBjb25mdXNpbmcgKHZzLiDigJxiaWFzIHNjb3Jlc+KAnSkuIEkga25vdyB0aGF04oCZcyB3aGF0IFJpbmNrICYgQmVja2VyIHVzZWQsIGJ1dCBJIHRoaW5rIHRoZSB0ZXJtIOKAnGNvbXBhdGliaWxpdHnigJ0gb25seSBtYWtlcyBzZW5zZSB3aGVuIHlvdSBoYXZlIGEgc2Vuc2Ugb2Ygd2hhdCBwZW9wbGXigJlzIG5hdHVyYWwgcmVzcG9uc2UgdGVuZGVuY2llcyBhcmUg4oCTIGluIHRoZWlyIHBhcGVyLCB0aGV5IGhhZCBwYXJ0aWNpcGFudHMgd2hvIHdlcmUgYWZyYWlkIG9mIHNwaWRlcnMsIHNvIGEgbmVnYXRpdmUgY29tcGF0aWJpbGl0eSBzY29yZSAoZmFzdGVyIHRvIHB1bGwgdGhhbiBwdXNoKSBpbmRpY2F0ZWQgYSBjb21wYXRpYmlsaXR5IG9yIGNvbmdydWVuY3kgYmV0d2VlbiB0aGVpciBiZWhhdmlvciBvbiB0aGUgdGFzayBhbmQgcmVhbC13b3JsZCBiZWhhdmlvcnMuIEkgdGhpbmsgdGhlIHRoaW5nIHRoYXTigJlzIGFsd2F5cyBjb25mdXNlZCBtZSBhYm91dCB0aGUgdXNlIG9mIHRoZSB0ZXJtIGluIHRoaXMgcHJvamVjdCBpcywgY29tcGF0aWJsZSB3aXRoIHdoYXQ/IFdlIG5lZWQgYSBzdHJvbmcgYSBwcmlvcmkgaHlwb3RoZXNpcyBhYm91dCB3aGljaCB0ZW5kZW5jeSB0aGUgZ3JvdXAgd2lsbCBzaG93IGluIG9yZGVyIGZvciB0aGlzIHRlcm0gdG8gbWFrZSBzZW5zZSAoSU1PKQoKCiMgV2hhdCBzdGF0aXN0aWNhbCB0ZXN0IHNob3VsZCB3ZSB1c2U/IAoKTUZPOiA8YnI+Ck1MTSBzZWVtcyB1bm5lY2Vzc2FyaWx5IGNvbXBsaWNhdGVkIGFmdGVyIGFsbC4gSeKAmW0gZ2VuZXJhbGx5IHByby1yZWdyZXNzaW9uLgoKQkE6IDxicj4KSSBhZ3JlZSB0aGF0IE1MTSBhcHBlYXJzIHVubmVjZXNzYXJpbHkgY29tcGxpY2F0ZWQuIE15IHRob3VnaHRzIHJpZ2h0IG5vdyBhcmUgdGhhdCBhbiBSTS1BTk9WQSB3b3VsZCBiZSB0aGUgYmVzdCB3YXkgdG8gZ28gYmVjYXVzZToKCioJSXQgYXBwZWFycyB0byBiZSB3aGF0IHNvbWUgb3RoZXJzIChtYWNjYWxsdW0pIGFyZSBkb2luZywgYW5kIHRoZSBjcmVhdG9yIG9mIHRoZSBBQVQgaGFzIHB1Ymxpc2hlZCByZXN1bHRzIHVzaW5nIHRoaXMgbWV0aG9kLiBJdCBpcyBsaWtlbHkgbW9yZSBkaWdlc3RpYmxlIGJ5IHJldmlld2VycyBhcyB3ZWxsLgoKKglNTE0gaGFzIHNldmVyYWwgYWR2YW50YWdlcyBpbiBtYW55IHBhcmFkaWdtcywgYnV0IG5vdCBuZWNlc3NhcmlseSBoZXJlIChlLmcuLCB3ZSBkbyBub3QgbmVlZCB0byBhY2NvdW50IGZvciByYW5kb20gZWZmZWN0cyBvciBtaXNzaW5nIGRhdGEpLiBUaHVzIFJNLUFOT1ZBIGlzIHBlcmhhcHMgdGhlIHNpbXBsZXIgcm91dGUuIExpbms6IEZvciByZWZlcmVuY2UuCioJVGhlIFJNLUFOT1ZBIGFuZCB0aGUgTUxNIHNob3VsZCB0aGVvcmV0aWNhbGx5IHlpZWxkIHZlcnkgc2ltaWxhciByZXN1bHRzIGZvciB0aGUgcmVhc29ucyBkZXNjcmliZWQgaW4gdGhlIHByZXZpb3VzIHBvaW50CgoqCVJlZ2FyZGluZyByZWdyZXNzaW9uOiBGcm9tIG15IHVuZGVyc3RhbmRpbmcsIHdlIGhhdmUgYmFzaWNhbGx5IGFscmVhZHkgZG9uZSB0aGlzIGluIE1MTS4gVGhlIGxhc3QgbGluZSBvZiB0aGUgbW9kZWwgb2YgdGhlIE1MTSBpcyBhIHJlZ3Jlc3Npb24gd2l0aCBhbGwgdmFyaWFibGVzIGluY2x1ZGVk4oCmIElmIHdlIGRpZCBhIHNlcmllcyBvZiByZWdyZXNzaW9ucyBsaWtlIEVpc21hIGRpZCwgdGhlbiB3ZSBjYW5ub3QgZGlyZWN0bHkgY29tcGFyZSBzdGltdWxpIHR5cGVzLiBJZiBJ4oCZbSB1bmRlcnN0YW5kaW5nIHRoZSBFaXNtYSBwYXBlciBjb3JyZWN0bHksIHRoYXQgZ3JvdXAgcmFuIGEgc2VyaWVzIG9mIHJlZ3Jlc3Npb25zLCB3aXRoIG9uZSByZWdyZXNzaW9uIHBlciBzdGltdWx1cyB0eXBlLCBhbmQgdGhlIERWIHdhcyB0aGUgbWVkaWFuIFJULiBTbyB0aG9zZSBjb25jbHVzaW9ucyBDQU4gc2F5LCBmb3IgaW5zdGFuY2U6ICB0aGF0IHJ1bWluYXRpb24gYWZmZWN0cyBSVCBvbiB0aGlzIHN0aW11bHVzLCBhbmQgbm90IG9uIHRoaXMgb25lIChmb3IgZXhhbXBsZSkgYnV0IHRoZXkgQ0FOTk9UIHNheSB0aGF0IHJ1bWluYXRpb24gYWZmZWN0cyBSVCBtb3JlIG9yIGxlc3Mgb24gb25lIHN0aW11bHVzIHR5cGUgdGhhbiBvbiBhbm90aGVyIHN0aW11bHVzIHR5cGUsIGJlY2F1c2Ugbm8gZGlyZWN0IGNvbXBhcmlzb24gaXMgbWFkZSBpbiBhIHNlcmllcyBvZiBzZXBhcmF0ZSByZWdyZXNzaW9ucy4KClNTOiA8YnI+ClJlOiBCQSdzIGxhc3QgcG9pbnQgLSByaWdodC4gSSBhbSBub3QgYSBmYW4gb2YgcnVubmluZyA1IGRpZmZlcmVudCByZWdyZXNzaW9ucy4gV2UgZ2V0IGFuIGluZmxhdGVkIGNoYW5jZSBvZiB0eXBlIEkgZXJyb3IgKHNvIHdvdWxkIG5lZWQgdG8gYWRqdXN0IG91ciBhbHBoYSBhY2NvcmRpbmdseSksIGFuZCBhcyBCcmlhbiBzYWlkLCB3ZSBjYW7igJl0IGRpcmVjdGx5IGNvbXBhcmUgc3RpbXVsdXMgZWZmZWN0cy4gQW5kIGFzIHdlIHNhdyBmcm9tIHJldmlld2VyIGNvbW1lbnQgaW4gZ3JlZW4gYmVsb3csIHRoZXnigJlyZSBsaWtlbHkgdG8gYmUgc2tlcHRpY2FsIG9mIHRoYXQgYXBwcm9hY2guIFJlZ3Jlc3Npb25zIGFsc28gZG9u4oCZdCBhY2NvdW50IGZvciB0aGUgZmFjdCB0aGF0IHdlIGhhdmUgbXVsdGlwbGUgb2JzZXJ2YXRpb25zIHRoYXQgY29tZSBmcm9tIHRoZSBzYW1lIHBlcnNvbi4KCk15IHZvdGUgaXMgdGhhdCB3ZSB1c2UgdGhlIGxpbmVhciBtaXhlZCBlZmZlY3RzIGFwcHJvYWNoIGFzIG91ciBtYWluIGFwcHJvYWNoICjigJxtaXhlZCBlZmZlY3RzIG1vZGVs4oCdIGlzIGp1c3QgYSBkaWZmZXJlbnQgdGVybSBmb3IgTUxNIOKAkyBtZWFucyB3ZSBpbmNsdWRlIGJvdGggZml4ZWQgW2UuZy4sIHN0aW11bHVzXSBhbmQgcmFuZG9tIFtlLmcuLCBwZXJzb25dIGVmZmVjdHMuKSBJIHRoaW5rIHRoZXJl4oCZcyBhIHNpbXBsZXIgd2F5IHRvIGRvIGl0IHRoYW4gdGhlIE1MTSBhbmFseXNlcyBCcmlhbiBhbmQgSSBib3RoIGRpZCBwcmV2aW91cywgd2hpY2ggd2VyZSBwcmV0dHkgY29tcGxpY2F0ZWQuIEnigJltIGNhbGxpbmcgaXQgYSBfbWl4ZWQgbW9kZWxfIGhlcmUgdG8gZGlzdGluZ3Vpc2ggaXQgZnJvbSB0aG9zZSBwcmV2aW91cyBhbmFseXNlcyBidXQgaXQncyBqdXN0IGEgZGlmZmVyZW50IHRlcm0gZm9yIE1MTS4KCiogQWR2YW50YWdlczogR2l2ZXMgdXMgd2F5IG1vcmUgcG93ZXIhISEgVGhlcmVmb3JlLCB3ZSBhcmUgYWJsZSB0byB0ZXN0IG1vcmUgY29tcGxpY2F0ZWQgbW9kZWxzLCBzdWNoIGFzIHRoZSB0aHJlZS0gYW5kIGZvdXItd2F5IGludGVyYWN0aW9ucy4KCioJV2UgX2RvXyBuZWVkIHRvIGFjY291bnQgZm9yIHRoZSByYW5kb20gZWZmZWN0IG9mIHN1YmplY3QuIFJlZ3Jlc3Npb24gZG9lcyBub3QgYWxsb3cgdXMgdG8gYWNjb3VudCBmb3IgdGhlIGludGVyZGVwZW5kZW5jZSBvZiB0aGUgZGF0YS4gSW4gYSBtaXhlZCBtb2RlbCwgd2UgYWRkcmVzcyB0aGUgaW50ZXJkZXBlbmRlbmNlIGJ5IG5lc3Rpbmcgb2JzZXJ2YXRpb25zIHdpdGhpbiBwZXJzb24uIAoKQnV0IEkgYWxzbyB0aGluayBpdCBtYWtlcyBzZW5zZSB0byBydW4gdGhlIFJNLUFOT1ZBLCBhbmQgc2VlIGhvdyBvdXIgcmVzdWx0cyBkaWZmZXIgKG9yIGRvbuKAmXQpLCBib3RoIGJlY2F1c2UgaXQgbWF5IGJlIGVhc2llciB0byB1bmRlcnN0YW5kIGFuZCBiZWNhdXNlIGl04oCZcyBjb25zaXN0ZW50IHdpdGggd2hhdCBNYWNjYWxsdW0gZGlkLgoKKiBJIHByb3Bvc2UgYSBzaW5nbGUgMiAoR3JvdXApIHggNSAoU3RpbXVsdXMgVHlwZSkgX1t4IDIgKERpcmVjdGlvbikgaWYgUlQgaXMgRFZdXyBtb2RlbCAtIGluIHRoZSBwbGFjZWJvIGRhdGEgb25seSAtIHRvIGFkZHJlc3MgQWltcyAxIGFuZCAyLiBUaGlzIGNvdWxkIGJlIExNRSBvciBBTk9WQS4KCiogVGhlbiBmb3IgQWltcyAzIGFuZCA0LCBydW4gdGhlIGZ1bGwgbW9kZWw6IDIgKEdyb3VwKSB4IDIgKFRyZWF0bWVudCkgeCA1IChTdGltdWx1cyBUeXBlKSBfW3ggMiAoRGlyZWN0aW9uKSBpZiBSVCBpcyBEVl1fLiBUaGlzIGNvdWxkIGJlIExNRSBvciBBTk9WQS4KCiMjIyMgUmV2aWV3ZXIgY29tbWVudHMKCj4gSWYgSSB1bmRlcnN0YW5kIGNvcnJlY3RseSwgdGhlIGF1dGhvcnMgcmFuIGEgZ3JvdXAgKDIpIHggcmVzcG9uc2UgKDIpIHggc3RpbXVsdXMgKDIpIHggT1QgY29uZGl0aW9uICgyKSBhbmFseXNpcywgZm9yIGZpdmUgb2YgdGhlIHBvc3NpYmxlIHRlbiBzdGltdWx1cyBwYWlycy4gSXQgd291bGQgc2VlbSBtb3JlIGFwcHJvcHJpYXRlIHRvIHJ1biBhIHNpbmdsZSBvbW5pYnVzIDJ4Mng1eDIgYW5hbHlzaXMgd2l0aCBhbGwgNSBzdGltdWxpLgoKU1M6PGJyPiBJIGFncmVlIHdpdGggdGhpcyByZXZpZXdlci4KCj4gT25lIHJlc3VsdCB3YXMgdGhhdCBib3RoIGdyaWVmIGdyb3VwcyBzaG93ZWQgYW4gYXBwcm9hY2ggcGF0dGVybiBmb3IgaWRpb2dyYXBoaWMgc3BvdXNlIGltYWdlcy4gVGhpcyBoYXMgc29tZSBtZXRob2RvbG9naWNhbCBpbXBsaWNhdGlvbnMgZm9yIHJlYWN0aW9uIHRpbWUgdGVzdHMgYW5kIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmV3YXJkIGNvbXBvbmVudCBvZiBncmllZi4gSG93ZXZlciwgdGhlIHRoZW9yZXRpY2FsIGNvbnRyaWJ1dGlvbiBvZiB0aGUgcmVzdWx0IGlzIG1pbmltYWwuPHA+ClRoZSBvdGhlciBwcmltYXJ5IHJlc3VsdCB3YXMgdGhhdCByZWFjdGlvbiB0aW1lIHdhcyBzbG93ZXIgaW4gdGhlIENHIGdyb3VwIG92ZXJhbGwgYWZ0ZXIgT1QgYWRtaW5pc3RyYXRpb24uIFRoaXMgd2FzIHN1cnByaXNpbmcgaW4gdGhhdCB0aGVyZSB3YXMgbm8gc3BlY2lmaWMgZWZmZWN0IG9mIHN0aW11bHVzIHggZ3JvdXAgeCBPVCAoYSB0aHJlZSB3YXkgaW50ZXJhY3Rpb24pIHRoYXQgd291bGQgaGF2ZSBiZWVuIHZlcnkgaW50ZXJlc3RpbmcuIFRoZSBmYWlsdXJlIHRvIG9idGFpbiBhIHRocmVlLXdheSBpbnRlcmFjdGlvbiBpcyBpdHNlbGYgZGlmZmljdWx0IHRvIHVucGFjay4gQmVjYXVzZSBvZiB0aGUgc21hbGwgc2FtcGxlLCB0aGlzIHN0dWR5IGlzIHZ1bG5lcmFibGUgdG8gYSB0eXBlIElJIGVycm9yLiBJbmRlZWQsIHRoaXMgaXMgdGhlIHByaW5jaXBhbCBmbGF3IGhlcmUuIEl0IGlzIGRpZmZpY3VsdCB0byBrbm93IHdoZXRoZXIgdGhlIGVmZmVjdCBpcyBub3QgcHJlc2VudCBvciBtZXJlbHkgd2FzbuKAmXQgZGV0ZWN0ZWQuCgpTUzo8YnI+ClVzaW5nIHRoZSB0cmlhbC1sZXZlbCBkYXRhIGluIE1MTS9taXhlZCBtb2RlbCBzb2x2ZXMgdGhlIHBvd2VyIHByb2JsZW0uCgoKCiMjIFByZXZpb3VzIHN0dWRpZXMnIGFwcHJvYWNoZXMKCl9Ob3RlIHRoYXQgdGhlIGV4cGVyaW1lbnRhbCBkZXNpZ24gZm9yIHRoZSBwcmVzZW50IHN0dWR5IGlzIG5vdCBpZGVudGljYWwgdG8gdGhlIHN0dWRpZXMgYmVsb3cuXwoKIyMjIyBNYWNjYWxsdW0gZXQgYWwsIDIwMTU6Cjx1bD48bGk+QU5PVkFzIHdpdGggZGlyZWN0aW9uIChwdXNoIG9yIHB1bGwpIGFuZCBzdGltdWx1cyBhcyBwcmVkaWN0b3JzLCBhbmQgbWVkaWFuIHJlYWN0aW9uIHRpbWUgYXMgb3V0Y29tZS48L2xpPgo8bGk+QmlhcyBzY29yZXMgd2VyZSBub3QgdXNlZCBhcyBhbiBvdXRjb21lLCBidXQgZ3JvdXAgbWVhbnMgYXJlIHByZXNlbnRlZCAoVGFibGUgMikuPC9saT48L3VsPgoKPm1lZGlhbiBSVCB0byBwdWxsIGdyaWVmLCBwb3NpdGl2ZSwgbmVnYXRpdmUgYW5kIGFic3RyYWN0LCBhbmQgbWVkaWFuIFJUIHRvIHB1c2ggZ3JpZWYsIHBvc2l0aXZlLCBuZWdhdGl2ZSBhbmQgYWJzdHJhY3Qgc3RpbXVsaS4gQ29tcGF0aWJpbGl0eSBlZmZlY3Qgc2NvcmVzIHdlcmUgY2FsY3VsYXRlZCBieSBzdWJ0cmFjdGluZyBtZWRpYW4gUlTigJlzIGluIHRoZSBwdWxsIGNvbmRpdGlvbiBmcm9tIG1lZGlhbiBSVOKAmXMgaW4gdGhlIHB1c2ggY29uZGl0aW9uIChUYWJsZSAyKS4gCgo+QSAyIChHcm91cCkgeCAyIChQcmltZSkgeCAyIChEaXJlY3Rpb24pIHggNCAoU3RpbXVsdXMgVHlwZSkgcmVwZWF0ZWQgbWVhc3VyZXMgQU5PVkEgaW5kaWNhdGVkIGEgbWFpbiBlZmZlY3QgZm9yIFN0aW11bHVzIFR5cGUgW0YoMyw0OSkgPSAzOS44OCwgcCA8IDAwMSwgzrcgPSAwLjcxXSwgYSBzaWduaWZpY2FudCAyLSB3YXkgaW50ZXJhY3Rpb24gYmV0d2VlbiBEaXJlY3Rpb24geCBTdGltdWx1cyBUeXBlIFtGKDMsNDkpID0gNi4yOSBwPCAuMDAyLCDOtyA9IDAuMjddLCBhbmQgYSBzaWduaWZpY2FudCAzLXdheSBpbnRlcmFjdGlvbiBiZXR3ZWVuIEdyb3VwIHggRGlyZWN0aW9uIHggU3RpbXVsdXMgVHlwZSwgW0YoMyw0OSkgPSAzLjc5LCAsIHAgPCAuMDE3LCDOtyA9IDAuMTldLiAKCiMjIyMgRWlzbWEgZXQgYWwsIDIwMTU6Cjx1bD48bGk+TXVsdGlwbGUgcmVncmVzc2lvbiBhbmFseXNlcyAoYSBzZXBhcmF0ZSBtb2RlbCBmb3IgZWFjaCBzdGltdWx1cyBjYXRlZ29yeSkgd2l0aCBiaWFzIHNjb3JlIGFzIG91dGNvbWUgYW5kIHNlbGYtcmVwb3J0ZWQgcnVtaW5hdGlvbiBhcyBwcmVkaWN0b3IuPC9saT48L3VsPgoKCj5NZWRpYW4gUlQncyBmb3IgYWxsIHN0aW11bGkgd2VyZSBjYWxjdWxhdGVkIGZvciBlYWNoIHN0aW11bHVzIHR5cGUuIFRvIGJlIGFibGUgdG8gdGVzdCBvdXIgaHlwb3RoZXNlcywgd2UgYWxzbyBkZXRlcm1pbmVkIHB1c2gtcHVsbCBzY29yZXMgZm9yIGVhY2ggc3RpbXVsdXMgdHlwZSwgd2hpY2ggYXJlIGNhbGN1bGF0ZWQgYnkgZGVkdWN0aW5nIHRoZSBNZWRpYW4gUlQncyBmb3IgcHVsbCB0cmlhbHMgZnJvbSB0aGUgTWVkaWFuIFJUJ3MgZm9yIHRoZSBwdXNoIHRyaWFscy4gCgo+T3VyIG1haW4gYW5hbHlzZXMgY29uc2lzdGVkIG9mIG11bHRpcGxlIHJlZ3Jlc3Npb24gYW5hbHlzZXMsIGluIHdoaWNoIHJ1bWluYXRpb24gbGV2ZWxzIHdlcmUgdXNlZCBhcyBhIHByZWRpY3RvciBvZiByZWFjdGlvbiB0aW1lcyAocHVzaC1wdWxsKSBmb3IgZWFjaCBzdGltdWx1cyB0eXBlIChkZWNlYXNlZCArIGxvc3Mgd29yZDsgZGVjZWFzZWQgKyBuZXV0cmFsIHdvcmQ7IHN0cmFuZ2VyICsgbG9zcyB3b3JkOyBzdHJhbmdlciArIG5ldXRyYWwgd29yZDsgcHV6emxlICsgWCdzKS4gCgpJbiBib3RoIHBhcGVycywgYmlhcyBzY29yZXMgd2VyZSBjb21wdXRlZCBhcyAobWVkaWFuIFJUPHN1Yj5wdXNoPC9zdWI+IC0gbWVkaWFuIFJUPHN1Yj5wdWxsPC9zdWI+KSB3aXRoaW4gZWFjaCBzdGltdWx1cyBjYXRlZ29yeS4KCgojIFdoYXQgcXVlc3Rpb25zIGFyZSB3ZSB0cnlpbmcgdG8gYW5zd2VyPwoKTUZPOjxicj4KVGhlc2Ugd2VyZSB0aGUgcXVlc3Rpb25zIEkgdGhvdWdodCB0aGUgZmllbGQgd291bGQgd2FudCB0byBrbm93LCBhbmQgdGhlIHJldmlld2VyIHNlZW1lZCB0byBsaWtlLjxicj4KCiMjQ2FuIGNlcnRhaW4gdHlwZXMgb2YgZ3JpZWYtcmVsYXRlZCBzdGltdWxpIGRpc2NyaW1pbmF0ZSBDRyBmcm9tIE5vbi1DRz8gCgpSZXBocmFzZWQgYXMgYWltOgoKKipBaW0gMS4qKiA8YnI+ClRvIGlkZW50aWZ5IHdoZXRoZXIgYmVyZWF2ZWQgaW5kaXZpZHVhbHMgc2hvdyBkaWZmZXJlbnQgYmVoYXZpb3JhbCByZXNwb25zZXMgd2hlbiBncmllZi1yZWxhdGVkIHN0aW11bGkgYXJlIGlkaW9ncmFwaGljIChwZXJzb25hbCBwaG90b3Mgb2Ygc3BvdXNlKSB2ZXJzdXMgbm9tb3RoZXRpYyAoZ2VuZXJpYyBncmllZi1yZWxhdGVkIHNjZW5lcykuCgoqKkFuYWx5c2lzKio8YnI+CkFzc3VtaW5nIE5PIGBncm91cGAgeCBgc3RpbXVsdXNgIGludGVyYWN0aW9uLCBsb29rIGF0IHRoZSBgc3RpbXVsdXM6c3BvdXNlYCAtIGBzdGltdWx1czpkZWF0aGAgY29udHJhc3QgZm9yIHRoZSBtYWluIGVmZmVjdCBvZiBgc3RpbXVsdXNgIGF2ZXJhZ2VkIGFjcm9zcyBncm91cHMgaW4gdGhlIGZvbGxvd2luZyBtb2RlbChzKToKCiogVXNpbmcgYmlhcyBzY29yZXM6IEEgbW9kZWwgaW4gdGhlIHBsYWNlYm8gZGF0YSBvbmx5IHdpdGggb25lIHdpdGhpbi1zdWJqZWN0cyBmYWN0b3IgKHN0aW11bHVzIFs1XSkgYW5kIG9uZSBiZXR3ZWVuLXN1YmplY3RzIGZhY3RvciAoZ3JvdXAgWzJdKS4KCiogVXNpbmcgcHVzaC9wdWxsIFJUczogQSBtb2RlbCBpbiB0aGUgcGxhY2VibyBkYXRhIG9ubHkgd2l0aCB0d28gd2l0aGluLXN1YmplY3RzIGZhY3RvcnMgKHN0aW11bHVzIFs1XSwgZGlyZWN0aW9uIFsyXSkgYW5kIG9uZSBiZXR3ZWVuLXN1YmplY3RzIGZhY3RvciAoZ3JvdXAgWzJdKS4KCiMjRG8gYmVyZWF2ZWQgaW5kaXZpZHVhbHMgc2hvdyBkaWZmZXJlbnRpYWwgYmVoYXZpb3JhbCByZXNwb25zZXMgdG8gZGlmZmVyZW50IHR5cGVzIG9mIGdyaWVmLXJlbGF0ZWQgc3RpbXVsaT8KClJlcGhyYXNlZCBhcyBhaW06CgoqKkFpbSAyLioqIDxicj4KVG8gaWRlbnRpZnkgd2hldGhlciBncmllZiBzZXZlcml0eSBtb2RlcmF0ZXMgYmVoYXZpb3JhbCByZXNwb25zZSB0byBzcGVjaWZpYyB0eXBlcyBvZiBzdGltdWxpLCBjb21wYXJpbmcgaGlnaC1zZXZlcml0eSAoQ0cgZ3JvdXApIGFuZCBsb3ctc2V2ZXJpdHkgKE5vbi1DRyBncm91cCkgcGFydGljaXBhbnRzLgoKKipBbmFseXNpcyoqPGJyPgpMb29rIGF0IHRoZSBgc3RpbXVsdXNgICg1KSB4IGBncm91cGAgKDIpIGludGVyYWN0aW9uIGluIHRoZSBmb2xsb3dpbmcgbW9kZWwgXyhzYW1lIG1vZGVsIGFzIGZvciBBaW0gMSlfOgoKKiBVc2luZyBiaWFzIHNjb3JlczogQSBtb2RlbCBpbiB0aGUgcGxhY2VibyBkYXRhIG9ubHkgd2l0aCBvbmUgd2l0aGluLXN1YmplY3RzIGZhY3RvciAoc3RpbXVsdXMgWzVdKSBhbmQgb25lIGJldHdlZW4tc3ViamVjdHMgZmFjdG9yIChncm91cCBbMl0pLgoKKiBVc2luZyBwdXNoL3B1bGwgUlRzOiBBIG1vZGVsIGluIHRoZSBwbGFjZWJvIGRhdGEgb25seSB3aXRoIHR3byB3aXRoaW4tc3ViamVjdHMgZmFjdG9ycyAoc3RpbXVsdXMgWzVdLCBkaXJlY3Rpb24gWzJdKSBhbmQgb25lIGJldHdlZW4tc3ViamVjdHMgZmFjdG9yIChncm91cCBbMl0pLgoKSWYgd2Ugc2VlIHRoZSBleHBlY3RlZCBpbnRlcmFjdGlvbiwgdGhlbiBleGFtaW5lIHBhaXJ3aXNlIGNvbXBhcmlzb25zIHcvY29ycmVjdGlvbiBmb3IgbXVsdGlwbGUgdGVzdHMuCgoKIyMjIEFpbXMgMS8yIEFOT1ZBIChwdXNoL3B1bGwgUlRzKQoKYGBge3J9CmxpYnJhcnkoYWZleCkKbGlicmFyeShlbW1lYW5zKQpsaWJyYXJ5KG5sbWUpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KG11bHRjb21wKQpsaWJyYXJ5KGNvbnRyYXN0KQoKIyBodHRwczovL2FkZW1vcy5wZW9wbGUudWljLmVkdS9DaGFwdGVyMjEuaHRtbAojIGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9hZmV4L3ZpZ25ldHRlcy9hZmV4X2Fub3ZhX2V4YW1wbGUuaHRtbAoKYWZleF9vcHRpb25zKGVtbWVhbnNfbW9kZWwgPSAibXVsdGl2YXJpYXRlIikKZmlsdGVyIDwtIGRwbHlyOjpmaWx0ZXIKc2VsZWN0IDwtIGRwbHlyOjpzZWxlY3QKCgojIGxvYWQgaW4gYmVoYXZpb3JhbCBkYXRhIChsb25nIGRhdGFzZXQgY29udGFpbmluZyB0cmlhbC1sZXZlbCByZWFjdGlvbiB0aW1lcykKZGF0YV9sb25nIDwtICByZWFkUkRTKCJ+L0Ryb3Bib3gvR0xBU1MgTGFiL09UIGdBQVQgZm9yIG1lZXRpbmcgNS0xMC0xOS9ieF9sb25nX25vT3V0LnJkcyIpCgojIHJlYWQgaW4gbWFzdGVyIGRhdGFzZXQgYW5kIHN1YnNldCB2YXJpYWJsZXMgdG8gYWRkIHRvIGJlaGF2aW9yYWwgZGF0YXNldAojIHZhcnN0b2FkZCA8LSByZWFkUkRTKCJ+L0Ryb3Bib3gvR0xBU1MgTGFiL09UIFN0dWR5L2RhdGEvbWFzdGVyLWRhdGFzZXQvb3QtZm1yaV9tYXN0ZXItZGF0YXNldF8wMjA3MTkucmRzIikKIyB2YXJzdG9hZGQgPC0gc3Vic2V0KHZhcnN0b2FkZCwgc2VsZWN0PWMoSUQsICMgcGFydGljaXBhbnQgSUQKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXhfbSwgIyBzZXggKGZlbWFsZSBhcyByZWZlcmVuY2UgY2F0ZWdvcnkpCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdlX3lycywgIyBhZ2UgaW4geWVhcnMKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldGhuaWNpdHlfaGlzcCwgICMgZXRobmljaXR5IChub24tSGlzcGFuaWMgYXMgcmVmZXJlbmNlIGNhdGVnb3J5KQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhY2UsICMgcmFjZQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzaW5jZWRlYXRoLCAjIHRpbWUgc2luY2UgcGFydG5lcidzIGRlYXRoIGFuZCBiYXNlbGluZSBzdXJ2ZXkgY29tcGxldGlvbgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlyc190b2dldGhlciwgIyByZWxhdGlvbnNoaXAgbGVuZ3RoIGluIHllYXJzCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAsICMgQ0cgb3IgTkNHLCBiYXNlZCBvbiB0b3RfaWNnID4yNSBhcyB0aHJlc2hvbGQgZm9yIENHCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHhfdjEsICMgd2hldGhlciB0aGV5IHJlY2VpdmVkIG94eXRvY2luIG9yIHBsYWNlYm8gYXQgZmlyc3Qgc2Vzc2lvbgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdF9pY2cgIyBncmllZiBzZXZlcml0eSAoSW52ZW50b3J5IG9mIENvbXBsaWNhdGVkIEdyaWVmKQojICkpCiMgc2F2ZVJEUyh2YXJzdG9hZGQsICJ+L0Ryb3Bib3gvR0xBU1MgTGFiL09UIGdBQVQgZm9yIG1lZXRpbmcgNS0xMC0xOS92YXJzdG9hZGQucmRzIikKIyBhbHJlYWR5IHNhdmVkIHRoZSBzdWJzZXQsIHNvIGp1c3QgcmVhZCBpbiB0aGUgc3Vic2V0OgoKdmFyc3RvYWRkIDwtIHJlYWRSRFMoIn4vRHJvcGJveC9HTEFTUyBMYWIvT1QgZ0FBVCBmb3IgbWVldGluZyA1LTEwLTE5L3ZhcnN0b2FkZC5yZHMiKQoKIyBUaGUgbW9kZWwgcmVxdWlyZXMgYSBzdGFja2VkL2xvbmcgZGF0YXNldCBjb250YWluaW5nIHRoZSBmb2xsb3dpbmcsIGF0IG1pbmltdW06CiMjIG9uZSB2YXJpYWJsZSBgSURgIHdpdGggcGFydGljaXBhbnQgSURzCiMjIG9uZSBudW1lcmljIHZhcmlhYmxlIGBnQUFUX1JUYCB3aXRoIFRSSUFMLUxFVkVMIHJlYWN0aW9uIHRpbWVzCiMjIG9uZSBmYWN0b3IgYHN0aW11bHVzYCB3aXRoIDUgbGV2ZWxzIChzcG91c2UsIHN0cmFuZ2VyLCBsb3ZlZCBvbmUsIGdyaWVmIHNjZW5lcywgbmV1dHJhbCBzY2VuZXMpCiMjIG9uZSBmYWN0b3IgYHRyZWF0bWVudGAgd2l0aCAyIGxldmVscyAob3h5dG9jaW4sIHBsYWNlYm8pCiMjIG9uZSBmYWN0b3IgYGRpcmVjdGlvbmAgd2l0aCAyIGxldmVscyAocHVzaCwgcHVsbCkKIyMgb25lIGZhY3RvciBgZ3JvdXBgIHdpdGggMiBmYWN0b3JzIChDRywgTkNHKSAqT1IqIG9uZSBudW1lcmljIHZhcmlhYmxlIGB0b3RfaWNnYCB3aXRoIGluZGl2aWR1YWwgZ3JpZWYgc2V2ZXJpdHkgc2NvcmVzICh0aW1lLWludmFyaWFudCkKCmRhdGFfbG9uZyA8LSBsZWZ0X2pvaW4oZGF0YV9sb25nLCB2YXJzdG9hZGQsIElEPSJJRCIpICU+JSByZW5hbWUodHJlYXRtZW50ID0gY29uZCwKICAgICAgICAgICBzdGltdWx1cyA9IHN0aW0sCiAgICAgICAgICAgZGlyZWN0aW9uID0gcHVzaF9wdWxsKSAlPiUKICBtdXRhdGUodHJlYXRtZW50ID0gcmVjb2RlKHRyZWF0bWVudCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBID0gInBsYWNlYm8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQiA9ICJveHl0b2NpbiIpLAogICAgICAgICBzdGltdWx1cyA9IGZjdF9yZWxldmVsKHN0aW11bHVzLCAibmV1dHJhbCIpKQoKZGF0YV9wbGFjZWJvIDwtIGRhdGFfbG9uZyAlPiUgCiAgZmlsdGVyKHRyZWF0bWVudCA9PSAicGxhY2VibyIpIAoKIyMjIyMjIyBBaW1zIDEvMiBtb2RlbCAoQU5PVkEpICMjIyMjIwojIEEgbW9kZWwgaW4gdGhlIHBsYWNlYm8gZGF0YSBvbmx5IHdpdGggdHdvIHdpdGhpbi1zdWJqZWN0cyBmYWN0b3JzIChzdGltdWx1cyBbNV0sIGRpcmVjdGlvbiBbMl0pIGFuZCBvbmUgYmV0d2Vlbi1zdWJqZWN0cyBmYWN0b3IgKGdyb3VwIFsyXSkKIyMgRFY6IFJUcyBvbiBwdXNoIGFuZCBwdWxsIHRyaWFscyBzZXBhcmF0ZWx5CiMjIFByZWRpY3RlZDogU3RpbXVsdXMgeCBHcm91cCBpbnRlcmFjdGlvbgoKIyBSTS1BTk9WQQptMmEgPC0gYW92X2V6KGlkID0gIklEIiwgZHYgPSAiZ0FBVF9SVCIsIGRhdGFfcGxhY2VibywgYmV0d2VlbiA9ICJncm91cCIsIHdpdGhpbiA9IGMoInN0aW11bHVzIiwgImRpcmVjdGlvbiIpLCBmdW5fYWdncmVnYXRlID0gbWVkaWFuKQpzdW1tYXJ5KG0yYSkKCiMgV2UgZG8gTk9UIHNlZSB0aGUgZXhwZWN0ZWQgc3RpbXVsdXMgeCBncm91cCBpbnRlcmFjdGlvbgojIEhvd2V2ZXIsIHRoZXJlIGlzIGEgc2lnbmlmaWNhbnQgc3RpbXVsdXMgeCBkaXJlY3Rpb24gaW50ZXJhY3Rpb24KIyB3aGljaCBsb29rcyBsaWtlIHRoaXM6CmVtbWlwKG0yYSwgc3RpbXVsdXMgfiBkaXJlY3Rpb24pCmVtbWVhbnMobTJhLCB+YyhzdGltdWx1cypkaXJlY3Rpb24pLCBjb250ciA9ICJwYWlyd2lzZSIsIGFkanVzdD0iaG9sbSIpCgojIFRoZXJlIGlzIGFsc28gYSBzaWduaWZpY2FudCBncm91cCB4IGRpcmVjdGlvbiBpbnRlcmFjdGlvbgojIHdoaWNoIGxvb2tzIGxpa2UgdGhpczoKZW1taXAobTJhLCBkaXJlY3Rpb24gfiBncm91cCkKZW1tZWFucyhtMmEsIH5jKGRpcmVjdGlvbipncm91cCksIGNvbnRyID0gInBhaXJ3aXNlIiwgYWRqdXN0PSJob2xtIikKYGBgCkR1cmluZyB0aGUgcGxhY2VibyBzZXNzaW9uLCB0aGUgcGFpcndpc2UgY29tcGFyaXNvbnMgZm9yIGBzdGltdWx1c2AgeCBgZGlyZWN0aW9uYCBzaG93IHRoYXQsIF8qKnJlbGF0aXZlIHRvIG5ldXRyYWwqKl8uLi4KCiogUGVvcGxlIGFyZSBnZW5lcmFsbHkgc2xvd2VyIHRvIFBVU0ggc3BvdXNlIHN0aW11bGkgKHdpdGhpbi1kaXJlY3Rpb24gY29tcGFyaXNvbikKCkZvciB0aGUgc3BvdXNlIHZzLiBkZWF0aCBjb21wYXJpc29uLCB3ZSBzZWUgdGhhdCwgXyoqcmVsYXRpdmUgdG8gZGVhdGggc3RpbXVsaSoqXy4uLgoKKiBQZW9wbGUgYXJlIGdlbmVyYWxseSBzbG93ZXIgdG8gUFVTSCBzcG91c2Ugc3RpbXVsaSAod2l0aGluLWRpcmVjdGlvbiBjb21wYXJpc29uKQoKVGhlIGNvbXBhcmlzb24gb2YgUFVTSCB2cy4gUFVMTCB3aXRoaW4gc3RpbXVsdXMgY2F0ZWdvcnkgc2hvd3MgdGhhdC4uLgoKKiBQZW9wbGUgYXJlIGdlbmVyYWxseSBzbG93ZXIgdG8gUFVTSCB2cy4gcHVsbCBzcG91c2Ugc3RpbXVsaQoqIE5vIG90aGVyIHNpZ25pZmljYW50IGRpZmZlcmVuY2VzIGluIFJUIGJ5IGZvciBhbnkgb3RoZXIgc3RpbXVsdXMgY2F0ZWdvcnkKClRoZSBwYWlyd2lzZSBjb21wYXJpc29ucyBmb3IgYGdyb3VwYCB4IGBkaXJlY3Rpb25gIHNob3cgdGhhdDoKCiogVGhlIE5DRyBncm91cCBpcyBzaWduaWZpY2FudGx5IGZhc3RlciB0byBwdWxsIHRoYW4gdG8gcHVzaCwgYXZlcmFnaW5nIGFjcm9zcyBsZXZlbHMgb2YgYHN0aW11bHVzYAoqIFRoZSBDRyBncm91cCBzaG93cyBzaW1pbGFyIFJUcyBvbiBib3RoIHB1c2ggYW5kIHB1bGwgdHJpYWxzLgoKIyMjIEFpbXMgMS8yIExpbmVhciBtaXhlZCBtb2RlbCAocHVzaC9wdWxsIFJUcykKYGBge3J9CiMjIyMjIyMgQWltcyAxLzIgbW9kZWwgKExNRSkgIyMjIyMjCiMgQSBtb2RlbCBpbiB0aGUgcGxhY2VibyBkYXRhIG9ubHkgd2l0aCB0d28gd2l0aGluLXN1YmplY3RzIGZhY3RvcnMgKHN0aW11bHVzIFs1XSwgZGlyZWN0aW9uIFsyXSkgYW5kIG9uZSBiZXR3ZWVuLXN1YmplY3RzIGZhY3RvciAoZ3JvdXAgWzJdKQojIyBEVjogUlRzIG9uIHB1c2ggYW5kIHB1bGwgdHJpYWxzIHNlcGFyYXRlbHkKIyMgUHJlZGljdGVkOiBTdGltdWx1cyB4IEdyb3VwIGludGVyYWN0aW9uCgojIExpbmVhciBtaXhlZCBtb2RlbAptMmIgPC0gbG1lKGdBQVRfUlQgfiBzdGltdWx1cypkaXJlY3Rpb24qZ3JvdXAsIGRhdGEgPSBkYXRhX3BsYWNlYm8sIHJhbmRvbSA9IH4gMXxJRCwgbWV0aG9kPSJSRU1MIikgCmFub3ZhKG0yYikKCiMgdmFyaWFuY2UgZXhwbGFpbmVkIGJ5IHRoZSBlbnRpcmUgbW9kZWwgCmZpdHRlZCA8LSBmaXR0ZWQobTJiKQpkYXRhX3BsYWNlYm8kZml0dGVkX20yYiA8LSBhcy52ZWN0b3IoZml0dGVkKQpmb3JSMiA8LSBsbShnQUFUX1JUIH4gZml0dGVkX20yYiwgZGF0YT1kYXRhX3BsYWNlYm8pCnN1bW1hcnkoZm9yUjIpIAoKYGBgCkFzIGFib3ZlLCB0aGVyZSBhcmUgc2lnbmlmaWNhbnQgaW50ZXJhY3Rpb25zIG9mIGBzdGltdWx1c2AgeCBgZGlyZWN0aW9uYCBhbmQgYGdyb3VwIHggZGlyZWN0aW9uYC4gVGhlIHRocmVlLXdheSBpbnRlcmFjdGlvbiBpcyBub3Qgc2lnbmlmaWNhbnQuCgpUaGUgb3ZlcmFsbCBtb2RlbCBleHBsYWlucyBhYm91dCAyMCUgb2YgdGhlIHZhcmlhbmNlIChhZGp1c3RlZCBSPHN1cD4yPC9zdXA+ID0gLjE5OCkKCk5leHQsIGxvb2tpbmcgYXQgdGhlIG1vZGVsIHN1bW1hcnkgdGVsbHMgdXMgYWJvdXQgc29tZSBjb250cmFzdHMuIE5vdGUgdGhhdCB0aGUgbW9kZWwgb3V0cHV0IGluY2x1ZGVzIHRlc3RzIG9mIHRoZSBudWxsIGh5cG90aGVzZXMgdGhhdCB0aGVzZSBkaWZmZXJlbmNlcyBhcmUgZXF1YWwgdG8gemVyby4KCmBgYHtyfQpzdW1tYXJ5KG0yYikKIyBjb2VmKG0yYikgCiMgbG9va2luZyBhdCB0aGUgY29lZmZpY2llbnRzIGNhbiBoZWxwIHVzIHVuZGVyc3RhbmQgZml4ZWQgdnMuIHJhbmRvbSBlZmZlY3RzLiAKIyBub3RpY2UgZXZlcnlvbmUgaGFzIHRoZWlyIG93biB1bmlxdWUgaW50ZXJjZXB0LCBidXQgdGhlIGNvZWZmaWNpZW50cyBmb3IgdGhlIGZpeGVkIGVmZmVjdHMgKHN0aW11bHVzLCBkaXJlY3Rpb24sIGdyb3VwKSBhcmUgaWRlbnRpY2FsIGFjcm9zcyB0aGUgc2FtcGxlCmBgYAoKU2VlIGJlbG93IGZvciBob3cgdG8gaW50ZXJwcmV0IHRoZSBjb2VmZmljaWVudHMgKHBlciBodHRwczovL3N0YXRzLmlkcmUudWNsYS5lZHUvci9mYXEvaG93LWNhbi1pLXRlc3QtY29udHJhc3RzLWluLXIvKS4gU2lnbmlmaWNhbnQtaXNoIGludGVyYWN0aW9ucyBhcmUgYm9sZGVkLiAKCioqSW50ZXJwcmV0aW5nIHRoZSBjb2VmZmljaWVudHMqKgoKKiAqKEludGVyY2VwdCk6KiBSVCBmb3Igc3RpbXVsdXM9bmV1dHJhbCwgZGlyZWN0aW9uPVBVTEwsIGdyb3VwPU5DRy4gXyhmYWN0b3JzJyByZWZlcmVuY2UgbGV2ZWxzKV8KCiogKnN0aW11bHVzZGVhdGg6KiBkaWZmZXJlbmNlIGluIFJUIGJldHdlZW4gc3RpbXVsdXM9ZGVhdGggYW5kIHN0aW11bHVzPW5ldXRyYWwgd2hlbiBkaXJlY3Rpb249UFVMTCBhbmQgZ3JvdXA9TkNHLgoKKiAqc3RpbXVsdXNsaXZpbmc6KiBkaWZmZXJlbmNlIGluIFJUIGJldHdlZW4gc3RpbXVsdXM9bGl2aW5nIGFuZCBzdGltdWx1cz1uZXV0cmFsIHdoZW4gZGlyZWN0aW9uPVBVTEwgYW5kIGdyb3VwPU5DRy4KCiogKnN0aW11bHVzc3BvdXNlOiogZGlmZmVyZW5jZSBpbiBSVCBiZXR3ZWVuIHN0aW11bHVzPXNwb3VzZSBhbmQgc3RpbXVsdXM9bmV1dHJhbCB3aGVuIGRpcmVjdGlvbj1QVUxMIGFuZCBncm91cD1OQ0cuCgoqICpzdGltdWx1c3N0cmFuZ2VyOiogZGlmZmVyZW5jZSBpbiBSVCBiZXR3ZWVuIHN0aW11bHVzPXN0cmFuZ2VyIGFuZCBzdGltdWx1cz1uZXV0cmFsIHdoZW4gZGlyZWN0aW9uPVBVTEwgYW5kIGdyb3VwPU5DRy4KCiogKmRpcmVjdGlvblBVU0g6KiBkaWZmZXJlbmNlIGluIFJUIGJldHdlZW4gZGlyZWN0aW9uPVBVU0ggYW5kIGRpcmVjdGlvbj1QVUxMIHdoZW4gc3RpbXVsdXM9bmV1dHJhbCBhbmQgZ3JvdXA9TkNHLiAgCgoqICpncm91cENHOiogZGlmZmVyZW5jZSBpbiBSVCBiZXR3ZWVuIGdyb3VwPUNHIGFuZCBncm91cD1OQ0cgd2hlbiBzdGltdWx1cz1uZXV0cmFsIGFuZCBkaXJlY3Rpb249UFVMTC4gICAKCiogKnN0aW11bHVzZGVhdGg6ZGlyZWN0aW9uUFVTSCogICAgICAgICAKCiogKnN0aW11bHVzbGl2aW5nOmRpcmVjdGlvblBVU0gqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCiogXyoqc3RpbXVsdXNzcG91c2U6ZGlyZWN0aW9uUFVTSCoqXyAocCA9IC4wNTgpIFRoZSBhZGRpdGlvbmFsIGRpZmZlcmVuY2UgaW4gUlQgYmV0d2VlbiBzcG91c2UgYW5kIG5ldXRyYWwgd2hlbiBkaXJlY3Rpb249UFVTSCwgX29yXyBhZGRpdGlvbmFsIGRpZmZlcmVuY2UgYmV0d2VlbiBkaXJlY3Rpb249UFVTSCBhbmQgZGlyZWN0aW9uPVBVTEwgd2hlbiBzdGltdWx1cz1zcG91c2UgaXMgMjcuOTEgc2Vjb25kcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgoqIF8qKnN0aW11bHVzc3RyYW5nZXI6ZGlyZWN0aW9uUFVTSCoqXyAocCA9IC4wNTUpIFRoZSBhZGRpdGlvbmFsIGRpZmZlcmVuY2UgaW4gUlQgYmV0d2VlbiBzdHJhbmdlciBhbmQgbmV1dHJhbCB3aGVuIGRpcmVjdGlvbj1QVVNILCBfb3JfIGFkZGl0aW9uYWwgZGlmZmVyZW5jZSBiZXR3ZWVuIGRpcmVjdGlvbj1QVVNIIGFuZCBkaXJlY3Rpb249UFVMTCB3aGVuIHN0aW11bHVzPXN0cmFuZ2VyIGlzIC0yNy4zNSBzZWNvbmRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCiogKnN0aW11bHVzZGVhdGg6Z3JvdXBDRyAqICAgICAgICAgICAgICAgICAgICAgIAoKKiAqc3RpbXVsdXNsaXZpbmc6Z3JvdXBDRyogICAgICAgICAgICAgICAKCiogKnN0aW11bHVzc3BvdXNlOmdyb3VwQ0cqICAgICAgCgoqICpzdGltdWx1c3N0cmFuZ2VyOmdyb3VwQ0cqICAgIAoKKiAqZGlyZWN0aW9uUFVTSDpncm91cENHKiAgICAgICAgICAgCgoqICpzdGltdWx1c2RlYXRoOmRpcmVjdGlvblBVU0g6Z3JvdXBDRyAqICAgCgoqICpzdGltdWx1c2xpdmluZzpkaXJlY3Rpb25QVVNIOmdyb3VwQ0cqICAgIAoKKiAqc3RpbXVsdXNzcG91c2U6ZGlyZWN0aW9uUFVTSDpncm91cENHKiAgICAKCiogKnN0aW11bHVzc3RyYW5nZXI6ZGlyZWN0aW9uUFVTSDpncm91cENHKiAgPC91bD4gIAoKSG93ZXZlciwgd2UgYXJlIGludGVyZXN0ZWQgaW4gb3RoZXIgY29udHJhc3RzLiBFbGl6YWJldGggUGFnZS1Hb3VsZCBoYXMgYSBbZ29vZCB0dXRvcmlhbCBmb3IgaG93IHRvIGRvIHRoaXMgd2l0aCBubG1lIG1vZGVsc10oaHR0cDovL3d3dy5wYWdlLWdvdWxkLmNvbS9yL2Fub3ZhLyksIGJ1dCBJIG5lZWQgdG8gc3BlbmQgbW9yZSB0aW1lIHdpdGggaXQuCgpgYGB7cn0KIyB0byBnZXQgYSB0YWJsZSBvZiBmaXhlZCBlZmZlY3QgcGFyYW1ldGVyIGVzdGltYXRlcyBhbmQgdGhlaXIgc3RhbmRhcmQgZXJyb3JzOgojIyBmcm9tIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzI2MTk4OTU4L2V4dHJhY3RpbmctY29lZmZpY2llbnRzLWFuZC10aGVpci1zdGFuZGFyZC1lcnJvci1mcm9tLWxtZQoKIyBtYWtlIGEgZGF0YSBmcmFtZSB3aXRoIGNvbHVtbnMgZm9yIHRoZSBmaXhlZC1lZmZlY3QgcGFyYW1ldGVyIGVzdGltYXRlcyBhbmQgZml4ZWQtZWZmZWN0IHBhcmFtZXRlciBzdGFuZGFyZCBlcnJvcnMKZGY8LWRhdGEuZnJhbWUoY2JpbmQoc3VtbWFyeShtMmIpJHRUYWJsZVssMV0sIHN1bW1hcnkobTJiKSR0VGFibGVbLDJdKSkKbmFtZXMoZGYpPC1jKCJFc3RpbWF0ZSIsIlNFIikKZGYKbTJiJGNvZWZmaWNpZW50cyRyYW5kb20gIyByYW5kb20gY29lZmZpY2llbnRzIC0gYWRqdXN0IGZvciB0aGVzZSBzb21laG93IHdoZW4gcGxvdHRpbmcgZXN0aW1hdGVzPwpgYGAKCldlIGNhbiB1c2UgdGhlIGBlbW1lYW5zYCBwYWNrYWdlIGFnYWluIHRvIGxvb2sgYXQgYWxsIHBhaXJ3aXNlIGNvbXBhcmlzb25zIGZvciB0aGUgdHdvIGludGVyYWN0aW9ucy4gSSBzdGlsbCB3YW50IHRvIGZpZ3VyZSBvdXQgdGhlIGN1c3RvbSBjb250cmFzdHMgYmVjYXVzZSB0aGVuIHdlIGRvbid0IG5lZWQgdG8gY29ycmVjdCBmb3IgYXMgbWFueSBjb21wYXJpc29ucywgYW5kIEkgZG9uJ3QgdGhpbmsgdGhpcyB0YWtlcyBpbnRvIGFjY291bnQgdGhlIHJhbmRvbSBlZmZlY3Qgb2Ygc3ViamVjdCwgYnV0IHRoaXMgY2FuIGdpdmUgdXMgYSBnZW5lcmFsIHNlbnNlIG9mIHdoYXQncyBnb2luZyBvbiBhbmQgd2UgY2FuIGNvbXBhcmUgaXQgdG8gdGhlIEFOT1ZBIHJlc3VsdHMuCgpgYGB7cn0KIyB3ZSBjYW4gbG9vayBhdCBBTEwgcGFpcndpc2UgY29tcGFyaXNvbnMgdXNpbmcgdGhlIGVtbWVhbnMgcGFja2FnZSBhZ2FpbiwgYnV0IHRoaXMgZG9lc24ndCB0YWtlIGludG8gYWNjb3VudCB0aGUgcmFuZG9tIGVmZmVjdHM/CmVtbS5tMmIxIDwtIGVtbWVhbnMobTJiLCBwYWlyd2lzZSB+IHN0aW11bHVzKmRpcmVjdGlvbiwgYWRqdXN0PSJob2xtIikgIyBlbW0ubTJiMVtbImVtbWVhbnMiXV1AbGluZmN0IGdpdmVzIHVzIHRoZSBjb250cmFzdCBtYXRyaWNlcyBmb3IgZWFjaCBwYWlyd2lzZSBjb21wYXJpc29uLCB0aGlzIHNlZW1zIHVzZWZ1bAplbW0ubTJiMQpgYGAKCkZyb20gdGhlIHBhaXJ3aXNlIGNvbXBhcmlzb25zIGZyb20gdGhlIGBzdGltdWx1c2AgeCBgZGlyZWN0aW9uYCBpbnRlcmFjdGlvbiwgd2Ugc2VlIHRoYXQsIF8qKnJlbGF0aXZlIHRvIG5ldXRyYWwgc3RpbXVsaSoqXyAod2l0aGluLWRpcmVjdGlvbiBjb21wYXJpc29ucykuLi4KCiogUGVvcGxlIGFyZSBnZW5lcmFsbHkgc2xvd2VyIHRvIFBVTEwgc3RyYW5nZXIgc3RpbXVsaSAKKiBQZW9wbGUgYXJlIGdlbmVyYWxseSBzbG93ZXIgdG8gUFVTSCBzcG91c2Ugc3RpbXVsaSBfKnNhbWUgcmVzdWx0IGluIEFOT1ZBXwoKRm9yIHRoZSBzcG91c2UgdnMuIGRlYXRoIGNvbXBhcmlzb24gd2UncmUgaW50ZXJlc3RlZCBpbiwgd2Ugc2VlIHRoYXQsIF8qKnJlbGF0aXZlIHRvIGRlYXRoIHN0aW11bGkqKl8gKHdpdGhpbi1kaXJlY3Rpb24gY29tcGFyaXNvbnMpLi4uCgoqIFBlb3BsZSBhcmUgZ2VuZXJhbGx5IHNsb3dlciB0byBQVVNIIHNwb3VzZSBzdGltdWxpCgpUaGUgY29tcGFyaXNvbiBvZiBQVVNIIHZzLiBQVUxMIHdpdGhpbiBzdGltdWx1cyBjYXRlZ29yeSBzaG93cyB0aGF0Li4uCgoqIFBlb3BsZSBhcmUgZ2VuZXJhbGx5IHNsb3dlciB0byBQVVNIIHZzLiBwdWxsIGxpdmluZyBsb3ZlZCBvbmUKKiBQZW9wbGUgYXJlIGdlbmVyYWxseSBzbG93ZXIgdG8gUFVTSCB2cy4gcHVsbCBzcG91c2Ugc3RpbXVsaSBfKnNhbWUgcmVzdWx0IGluIEFOT1ZBXwoKCmBgYHtyfQplbW0ubTJiMiA8LSBlbW1lYW5zKG0yYiwgcGFpcndpc2UgfiBkaXJlY3Rpb24qZ3JvdXAsIGFkanVzdD0iaG9sbSIpICMgZW1tLm0yYjJbWyJlbW1lYW5zIl1dQGxpbmZjdCBnaXZlcyB1cyB0aGUgY29udHJhc3QgbWF0cmljZXMgZm9yIGVhY2ggcGFpcndpc2UgY29tcGFyaXNvbiEKZW1tLm0yYjIKYGBgClRoZSBwYWlyd2lzZSBjb21wYXJpc29ucyBmb3IgYGdyb3VwYCB4IGBkaXJlY3Rpb25gIHNob3cgdGhhdDoKCiogVGhlIE5DRyBncm91cCBpcyBzaWduaWZpY2FudGx5IGZhc3RlciB0byBwdWxsIHRoYW4gdG8gcHVzaCwgYXZlcmFnaW5nIGFjcm9zcyBsZXZlbHMgb2YgYHN0aW11bHVzYCBfKnNhbWUgcmVzdWx0IGluIEFOT1ZBXwoqIFRoZSBDRyBncm91cCBzaG93cyBzaW1pbGFyIFJUcyBvbiBib3RoIHB1c2ggYW5kIHB1bGwgdHJpYWxzIF8qc2FtZSByZXN1bHQgaW4gQU5PVkFfCgoKIyMjIEFpbXMgMS8yIEFOT1ZBIChiaWFzIHNjb3JlcykKCmBgYHtyfQpkYXRhX2JpYXMgPC0gIHJlYWRSRFMoIn4vRHJvcGJveC9HTEFTUyBMYWIvT1QgZ0FBVCBmb3IgbWVldGluZyA1LTEwLTE5L2JpYXNfbG9uZy5yZHMiKQpkYXRhX2JpYXMgPC0gbGVmdF9qb2luKGRhdGFfYmlhcywgdmFyc3RvYWRkLCBieT0iSUQiKSAlPiUgCiAgcmVuYW1lKHRyZWF0bWVudCA9IGNvbmQsCiAgICAgICAgIGdBQVRfYmlhcyA9IGJpYXMpICU+JSAKICBtdXRhdGUodHJlYXRtZW50ID0gcmVjb2RlKHRyZWF0bWVudCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBID0gInBsYWNlYm8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQiA9ICJveHl0b2NpbiIpLAogICAgICAgICBzdGltdWx1cyA9IGZjdF9yZWxldmVsKHN0aW11bHVzLCAibmV1dHJhbCIpKQojIE5PVEUgdGhhdCB0aGlzIGlzIHRoZSBkYXRhc2V0IHRoYXQgY2FsY3VsYXRlcyBiaWFzIGJ5IHN1YnRyYWN0aW5nIHRoZSBtZWRpYW4gcHVsbCByZWFjdGlvbiB0aW1lIGluIGVhY2ggY2F0ZWdvcnkgZnJvbSB0aGUgbWVkaWFuIHB1c2ggcmVhY3Rpb24gdGltZSBpbiB0aGF0IGNhdGVnb3J5IChOT1QgdGhlIHRyaWFsLWJ5LXRyaWFsIGJpYXMgc3VidHJhY3RpbmcgcnVuMSBmcm9tIHJ1bjIpCgpkYXRhX2JpYXNfcGxhY2VibyA8LSBkYXRhX2JpYXMgJT4lIAogIGZpbHRlcih0cmVhdG1lbnQgPT0gInBsYWNlYm8iKSAKCgojIyMjIyMjIEFpbXMgMS8yIG1vZGVsIChBTk9WQSB3L2JpYXMgc2NvcmVzKSAjIyMjIyMKIyBBIG1vZGVsIGluIHRoZSBwbGFjZWJvIGRhdGEgb25seSB3aXRoIG9uZSB3aXRoaW4tc3ViamVjdHMgZmFjdG9ycyAoc3RpbXVsdXMgWzVdKSBhbmQgb25lIGJldHdlZW4tc3ViamVjdHMgZmFjdG9yIChncm91cCBbMl0pCiMjIERWOiBSVCBiaWFzIChwdXNoIC0gcHVsbCkKIyMgUHJlZGljdGVkOiBTdGltdWx1cyB4IEdyb3VwIGludGVyYWN0aW9uCgojIFJNLUFOT1ZBCm0yYyA8LSBhb3ZfZXooaWQgPSAiSUQiLCBkdiA9ICJnQUFUX2JpYXMiLCBkYXRhX2JpYXNfcGxhY2VibywgYmV0d2VlbiA9ICJncm91cCIsIHdpdGhpbiA9IGMoInN0aW11bHVzIiksIGZ1bl9hZ2dyZWdhdGUgPSBtZWRpYW4pCnN1bW1hcnkobTJjKQoKYGBgCldlIGRvIE5PVCBzZWUgdGhlIGV4cGVjdGVkIGBzdGltdWx1c2AgeCBgZ3JvdXBgIGludGVyYWN0aW9uLCBzYW1lIGFzIHdpdGggdGhlIHB1c2gvcHVsbCBSVHMuCkhvd2V2ZXIsIHRoZXJlIGFyZSBzaWduaWZpY2FudCBtYWluIGVmZmVjdHMgb2YgYm90aCBgZ3JvdXBgIGFuZCBgc3RpbXVsdXNgLgoKYGBge3J9CiMgY2hlY2sgb3V0IHRoZSBwbG90dGVkIGVzdGltYXRlZCBtYXJnaW5hbCBtZWFucwplbW1pcChtMmMsIH5ncm91cCkgIyBtYWluIGVmZmVjdCBvZiBncm91cAplbW1pcChtMmMsIH5zdGltdWx1cykgIyBtYWluIGVmZmVjdCBvZiBzdGltdWx1cwplbW1pcChtMmMsIHN0aW11bHVzIH4gZ3JvdXApICMgbm9uLXNpZyBpbnRlcmFjdGlvbgoKYWZleF9wbG90KG0yYywgeCA9ICJzdGltdWx1cyIsIHRyYWNlID0gImdyb3VwIiwgCiAgICAgICAgICBlcnJvciA9ICJ3aXRoaW4iKQoKZW1tZWFucyhtMmMsIH5zdGltdWx1cywgY29udHIgPSAicGFpcndpc2UiLCBhZGp1c3Q9ImhvbG0iKQplbW1lYW5zKG0yYywgfmdyb3VwLCBjb250ciA9ICJwYWlyd2lzZSIsIGFkanVzdD0iaG9sbSIpCgoKCnAxIDwtIGdncGxvdChkYXRhX2JpYXNfcGxhY2VibywgYWVzKGZpbGw9Z3JvdXAsIHk9Z0FBVF9iaWFzLCB4PXN0aW11bHVzKSkgKyAKICBnZW9tX2JveHBsb3QoYWVzKGZpbGw9Z3JvdXApLCBvdXRsaWVyLmFscGhhID0gMC4zKQpwMSA8LSBwMSArIGdlb21faGxpbmUoeWludGVyY2VwdD0wLCBsaW5ldHlwZT0ic29saWQiLCBjb2xvcj0iYmxhY2siLCBzaXplPS41KSArIHhsYWIoIkdyb3VwIikgKyB5bGFiKCJBdm9pZCBiaWFzICAgICAgICAgICAgICAgIEFwcHJvYWNoIGJpYXMiKQpwMSAjIGJ5IGdyb3VwCgpwMiA8LSBnZ3Bsb3QoZGF0YV9iaWFzX3BsYWNlYm8sIGFlcyhmaWxsPXN0aW11bHVzLHk9Z0FBVF9iaWFzLCB4PXN0aW11bHVzKSkgKyAKICBnZW9tX2JveHBsb3Qob3V0bGllci5hbHBoYSA9IDAuMykKcDIgPC0gcDIgKyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MCwgbGluZXR5cGU9InNvbGlkIiwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uNSkgKyB4bGFiKCJTdGltdWx1cyIpICsgeWxhYigiQXZvaWQgYmlhcyAgICAgICAgICAgICAgICBBcHByb2FjaCBiaWFzIikKcDIgIyBvdmVyYWxsCgptMmNbWyJsbSJdXVtbImNvZWZmaWNpZW50cyJdXSAjIG5vdGUgdGhhdCAiZ3JvdXAxIiBzZWVtcyB0byByZWZlciB0byB0aGUgZnVsbCBuPTM5IGJlY2F1c2UgbTJjW1sibG0iXV1bWyJlZmZlY3RzIl1dIHNob3dzIDM5IHJvd3MgPz8KYGBgCkhlcmUgd2Ugc2VlIHRoYXQuLi4KCiogUGVvcGxlIGdlbmVyYWxseSBzaG93IG1vcmUgYXBwcm9hY2ggZm9yIHNwb3VzZSBhbmQgbGl2aW5nIGxvdmVkIG9uZSAocCA9IC4wNykgcmVsYXRpdmUgdG8gbmV1dHJhbCBzdGltdWxpLgoKKiBQZW9wbGUgZ2VuZXJhbGx5IHNob3cgbW9yZSBhcHByb2FjaCBmb3Igc3BvdXNlIHN0aW11bGkgcmVsYXRpdmUgdG8gbmV1dHJhbCBzdGltdWxpLgoKKiBQZW9wbGUgZ2VuZXJhbGx5IHNob3cgbW9yZSBhdm9pZGFuY2UgZm9yIGRlYXRoIHN0aW11bGkgcmVsYXRpdmUgdG8gc3BvdXNlIHN0aW11bGkgKHAgPSAuMTApCgoqIFRoZSBOQ0cgZ3JvdXAgc2hvd3MgZ3JlYXRlciBhcHByb2FjaCBiaWFzIGNvbXBhcmVkIHRvIHRoZSBDRyBncm91cC4KCgoKIyMjIEFpbXMgMS8yIExpbmVhciBtaXhlZCBtb2RlbCAoYmlhcyBzY29yZXMpCmBgYHtyfQojIyMjIyMjIEFpbXMgMS8yIG1vZGVsIChMTUUgdy9iaWFzIHNjb3JlcykgIyMjIyMjCiMgQSBtb2RlbCBpbiB0aGUgcGxhY2VibyBkYXRhIG9ubHkgd2l0aCBvbmUgd2l0aGluLXN1YmplY3RzIGZhY3RvciAoc3RpbXVsdXMgWzVdKSBhbmQgb25lIGJldHdlZW4tc3ViamVjdHMgZmFjdG9yIChncm91cCBbMl0pCiMjIERWOiBnQUFUIGJpYXMgc2NvcmVzCiMjIFByZWRpY3RlZDogU3RpbXVsdXMgeCBHcm91cCBpbnRlcmFjdGlvbgoKIyBMaW5lYXIgbWl4ZWQgbW9kZWwKbTJkIDwtIGxtZShnQUFUX2JpYXMgfiBzdGltdWx1cypncm91cCwgZGF0YSA9IGRhdGFfYmlhc19wbGFjZWJvLCByYW5kb20gPSB+IDF8SUQsIG1ldGhvZD0iUkVNTCIpIAphbm92YShtMmQpCgojIHZhcmlhbmNlIGV4cGxhaW5lZCBieSB0aGUgZW50aXJlIG1vZGVsIApmaXR0ZWQgPC0gZml0dGVkKG0yZCkKZGF0YV9iaWFzX3BsYWNlYm8kZml0dGVkX20yZCA8LSBhcy52ZWN0b3IoZml0dGVkKQpmb3JSMmEgPC0gbG0oZ0FBVF9iaWFzIH4gZml0dGVkX20yZCwgZGF0YT1kYXRhX2JpYXNfcGxhY2VibykKc3VtbWFyeShmb3JSMmEpIAoKYGBgCgpUaGUgbGluZWFyIG1peGVkIGVmZmVjdHMgbW9kZWwgc2hvd3Mgc2lnbmlmaWNhbnQgbWFpbiBlZmZlY3RzIG9mIHN0aW11bHVzIGFuZCBncm91cCwgYnV0IG5vIGBncm91cGAgeCBgc3RpbXVsdXNgIGludGVyYWN0aW9uLiBUaGUgbW9kZWwgZXhwbGFpbnMgYWJvdXQgMzAlIG9mIHRoZSB2YXJpYW5jZSBpbiB0aGUgZGF0YSAoQWRqLiBSPHN1cDI8L3N1cD4gPSAuMjk3KS4KCgpOZXh0LCBsb29raW5nIGF0IHRoZSBtb2RlbCBzdW1tYXJ5IHRlbGxzIHVzIGFib3V0IHNvbWUgY29udHJhc3RzLiBOb3RlIHRoYXQgdGhlIG1vZGVsIG91dHB1dCBpbmNsdWRlcyB0ZXN0cyBvZiB0aGUgbnVsbCBoeXBvdGhlc2VzIHRoYXQgdGhlc2UgZGlmZmVyZW5jZXMgYXJlIGVxdWFsIHRvIHplcm8uCgpgYGB7cn0Kc3VtbWFyeShtMmQpCiMgY29lZihtMmQpIAojIGxvb2tpbmcgYXQgdGhlIGNvZWZmaWNpZW50cyBjYW4gaGVscCB1cyB1bmRlcnN0YW5kIGZpeGVkIHZzLiByYW5kb20gZWZmZWN0cy4gCiMgbm90aWNlIGV2ZXJ5b25lIGhhcyB0aGVpciBvd24gdW5pcXVlIGludGVyY2VwdCwgYnV0IHRoZSBjb2VmZmljaWVudHMgZm9yIHRoZSBmaXhlZCBlZmZlY3RzIChzdGltdWx1cywgZGlyZWN0aW9uLCBncm91cCkgYXJlIGlkZW50aWNhbCBhY3Jvc3MgdGhlIHNhbXBsZQpgYGAKClNlZSBiZWxvdyBmb3IgaG93IHRvIGludGVycHJldCB0aGUgY29lZmZpY2llbnRzIChwZXIgaHR0cHM6Ly9zdGF0cy5pZHJlLnVjbGEuZWR1L3IvZmFxL2hvdy1jYW4taS10ZXN0LWNvbnRyYXN0cy1pbi1yLykuIFNpZ25pZmljYW50IGludGVyYWN0aW9ucyBhcmUgYm9sZGVkLiAKCioqSW50ZXJwcmV0aW5nIHRoZSBjb2VmZmljaWVudHMqKgoKKiAqKEludGVyY2VwdCk6KiBBcHByb2FjaC9hdm9pZGFuY2UgYmlhcyB3aGVuIHN0aW11bHVzPW5ldXRyYWwsIGdyb3VwPU5DRy4gXyhmYWN0b3JzJyByZWZlcmVuY2UgbGV2ZWxzKV8KCiogKnN0aW11bHVzZGVhdGg6KiBkaWZmZXJlbmNlIGluIGJpYXMgYmV0d2VlbiBzdGltdWx1cz1kZWF0aCBhbmQgc3RpbXVsdXM9bmV1dHJhbCB3aGVuIGdyb3VwPU5DRy4KCiogKnN0aW11bHVzbGl2aW5nOiogZGlmZmVyZW5jZSBpbiBiaWFzIGJldHdlZW4gc3RpbXVsdXM9bGl2aW5nIGFuZCBzdGltdWx1cz1uZXV0cmFsIHdoZW4gZ3JvdXA9TkNHLgoKKiAqc3RpbXVsdXNzcG91c2U6KiBkaWZmZXJlbmNlIGluIGJpYXMgYmV0d2VlbiBzdGltdWx1cz1zcG91c2UgYW5kIHN0aW11bHVzPW5ldXRyYWwgd2hlbiBncm91cD1OQ0cuCgoqICpzdGltdWx1c3N0cmFuZ2VyOiogZGlmZmVyZW5jZSBpbiBiaWFzIGJldHdlZW4gc3RpbXVsdXM9c3RyYW5nZXIgYW5kIHN0aW11bHVzPW5ldXRyYWwgd2hlbiBncm91cD1OQ0cuCgoqICpncm91cENHOiogZGlmZmVyZW5jZSBpbiBiaWFzIGJldHdlZW4gZ3JvdXA9Q0cgYW5kIGdyb3VwPU5DRyB3aGVuIHN0aW11bHVzPW5ldXRyYWwuICAgCgoqICpzdGltdWx1c2RlYXRoOmdyb3VwQ0cqOiBUaGUgYWRkaXRpb25hbCBkaWZmZXJlbmNlIGluIGJpYXMgYmV0d2VlbiBkZWF0aCBhbmQgbmV1dHJhbCB3aGVuIGdyb3VwPUNHLCBfb3JfIGFkZGl0aW9uYWwgZGlmZmVyZW5jZSBiZXR3ZWVuIGdyb3VwPUNHIGFuZCBncm91cD1OQ0cgd2hlbiBzdGltdWx1cz1kZWF0aC4gICAgICAgICAgICAgICAgICAgICAgCgoqICpzdGltdWx1c2xpdmluZzpncm91cENHKiAgICAgICAgICAgICAgIAoKKiAqc3RpbXVsdXNzcG91c2U6Z3JvdXBDRyogICAgICAKCiogKnN0aW11bHVzc3RyYW5nZXI6Z3JvdXBDRyogICAgCgoqICpkaXJlY3Rpb25QVVNIOmdyb3VwQ0cqIAoKSG93ZXZlciwgd2UgYXJlIGludGVyZXN0ZWQgaW4gb3RoZXIgY29udHJhc3RzLgoKYGBge3J9CiMgdG8gZ2V0IGEgdGFibGUgb2YgZml4ZWQgZWZmZWN0IHBhcmFtZXRlciBlc3RpbWF0ZXMgYW5kIHRoZWlyIHN0YW5kYXJkIGVycm9yczoKIyMgZnJvbSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yNjE5ODk1OC9leHRyYWN0aW5nLWNvZWZmaWNpZW50cy1hbmQtdGhlaXItc3RhbmRhcmQtZXJyb3ItZnJvbS1sbWUKCiMgbWFrZSBhIGRhdGEgZnJhbWUgd2l0aCBjb2x1bW5zIGZvciB0aGUgZml4ZWQtZWZmZWN0IHBhcmFtZXRlciBlc3RpbWF0ZXMgYW5kIGZpeGVkLWVmZmVjdCBwYXJhbWV0ZXIgc3RhbmRhcmQgZXJyb3JzCmRmPC1kYXRhLmZyYW1lKGNiaW5kKHN1bW1hcnkobTJkKSR0VGFibGVbLDFdLCBzdW1tYXJ5KG0yZCkkdFRhYmxlWywyXSkpCm5hbWVzKGRmKTwtYygiRXN0aW1hdGUiLCJTRSIpCmRmICMjIFdoeSBhcmUgdGhlIFNFJ3MgaGVyZSBpZGVudGljYWwgZm9yIGVhY2ggcHJlZGljdG9yIChvciBjb21iaW5hdGlvbiBvZiBwcmVkaWN0b3JzKT8KbTJkJGNvZWZmaWNpZW50cyRyYW5kb20gIyByYW5kb20gY29lZmZpY2llbnRzIC0gYWRqdXN0IGZvciB0aGVzZSBzb21laG93IHdoZW4gcGxvdHRpbmcgZXN0aW1hdGVzPwpgYGAKCldlIGNhbiB1c2UgdGhlIGBlbW1lYW5zYCBwYWNrYWdlIGFnYWluIHRvIGxvb2sgYXQgYWxsIHBhaXJ3aXNlIGNvbXBhcmlzb25zIGZvciB0aGUgdHdvIGludGVyYWN0aW9ucy4gQXMgYmVmb3JlLCBJIHN0aWxsIHdhbnQgdG8gZmlndXJlIG91dCB0aGUgY3VzdG9tIGNvbnRyYXN0cyBiZWNhdXNlIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byBjb3JyZWN0IGZvciBhcyBtYW55IGNvbXBhcmlzb25zLCBhbmQgSSBkb24ndCB0aGluayB0aGlzIHRha2VzIGludG8gYWNjb3VudCB0aGUgcmFuZG9tIGVmZmVjdCBvZiBzdWJqZWN0LCBidXQgdGhpcyBjYW4gZ2l2ZSB1cyBhIGdlbmVyYWwgc2Vuc2Ugb2Ygd2hhdCdzIGdvaW5nIG9uIGFuZCB3ZSBjYW4gY29tcGFyZSBpdCB0byB0aGUgQU5PVkEgcmVzdWx0cy4KCl9Ob3RlOiBJIHRoaW5rIG9rYXkgdG8gaWdub3JlIHRoZSB3YXJuaW5nIGFib3V0ICJyZXN1bHRzIG1heSBiZSBtaXNsZWFkaW5nIGR1ZSB0byBpbnZvbHZlbWVudCBpbiBpbnRlcmFjdGlvbnMiIGR1ZSB0byBsYWNrIG9mIHNpZ25pZmljYW50IGhpZ2hlci1vcmRlciBpbnRlcmFjdGlvbnMsIGJ1dCBjb3JyZWN0IG1lIGlmIEknbSB3cm9uZy4KCmBgYHtyfQojIHdlIGNhbiBsb29rIGF0IEFMTCBwYWlyd2lzZSBjb21wYXJpc29ucyB1c2luZyB0aGUgZW1tZWFucyBwYWNrYWdlIGFnYWluLCBidXQgdGhpcyBkb2Vzbid0IHRha2UgaW50byBhY2NvdW50IHRoZSByYW5kb20gZWZmZWN0cz8KZW1tLm0yZDEgPC0gZW1tZWFucyhtMmQsIHBhaXJ3aXNlIH4gc3RpbXVsdXMsIGFkanVzdD0iaG9sbSIpICMgZW1tLm0yYjFbWyJlbW1lYW5zIl1dQGxpbmZjdCBnaXZlcyB1cyB0aGUgY29udHJhc3QgbWF0cmljZXMgZm9yIGVhY2ggcGFpcndpc2UgY29tcGFyaXNvbiwgdGhpcyBzZWVtcyB1c2VmdWwKZW1tLm0yZDEKYGBgCkhlcmUgd2Ugc2VlIHRoYXQuLi4KCiogUGVvcGxlIGdlbmVyYWxseSBzaG93IG1vcmUgYXZvaWRhbmNlIGJpYXMgZm9yIGRlYXRoIHN0aW11bGkgcmVsYXRpdmUgdG8gc3BvdXNlIGFuZCBsaXZpbmcgbG92ZWQgb25lIHN0aW11bGkuCgoqIHBlb3BsZSBnZW5lcmFsbHkgc2hvdyBtb3JlIGFwcHJvYWNoIGJpYXMgZm9yIHNwb3VzZSB2cy4gc3RyYW5nZXIgKHAgPSAuMDkpCgoKYGBge3J9CmVtbS5tMmQyIDwtIGVtbWVhbnMobTJkLCBwYWlyd2lzZSB+IGdyb3VwLCBhZGp1c3Q9ImhvbG0iKSAjIGVtbS5tMmQyW1siZW1tZWFucyJdXUBsaW5mY3QgZ2l2ZXMgdXMgdGhlIGNvbnRyYXN0IG1hdHJpY2VzIGZvciBlYWNoIHBhaXJ3aXNlIGNvbXBhcmlzb24sIHRoaXMgc2VlbXMgdXNlZnVsCmVtbS5tMmQyCmBgYAoKQXZlcmFnZWQgYWNyb3NzIHRoZSBsZXZlbHMgb2YgYHN0aW11bHVzYCwgcGVvcGxlIHdpdGggTkNHIHNob3cgbW9yZSBhcHByb2FjaCBiaWFzIHRoYW4gcGVvcGxlIHdpdGggQ0cgXyhub3RlIHRoYXQgdGhlc2UgbnVtYmVycyBhcmUgaWRlbnRpY2FsIHRvIEFOT1ZBIGVtbWVhbnMpXwoKIyMjIFF1ZXN0aW9ucy90aG91Z2h0cwoKKiBUaGUgQU5PVkEgdXNlcyBtZWRpYW5zIHRvIGFnZ3JlZ2F0ZSB0aGUgdHJpYWwtbGV2ZWwgUlRzLCB3aGVyZWFzIHRoZSBtaXhlZCBtb2RlbCBkb2VzIG5vdC4gSW1wYWN0PwoKCgojI0RvZXMgaW50cmFuYXNhbCBveHl0b2NpbiBhZmZlY3QgdGhlIENHIGFuZCBOb24tQ0cgcmVhY3Rpb24gdGltZXMgZGlmZmVyZW50bHk/CgpSZXBocmFzZWQgYXMgYWltOgoKKipBaW0gMy4qKjxicj4KVG8gaWRlbnRpZnkgd2hldGhlciBlZmZlY3RzIG9mIGludHJhbmFzYWwgb3h5dG9jaW4gZGlmZmVyIGluIGhpZ2gtc2V2ZXJpdHkgW0NHIGdyb3VwXSB2ZXJzdXMgbG93LXNldmVyaXR5IFtOb24tQ0cgZ3JvdXBdIHBhcnRpY2lwYW50cy4KCioqQW5hbHlzaXMqKjxicj4KTG9vayBhdCB0aGUgYGNvbmRpdGlvbmAgKDIpIHggYGdyb3VwYCAoMikgaW50ZXJhY3Rpb24gaW4gdGhlIGZvbGxvd2luZyBtb2RlbDoKClVzaW5nIGJpYXMgc2NvcmVzOiAKCiogVHdvIHdpdGhpbi1zdWJqZWN0cyBmYWN0b3JzIChzdGltdWx1cyBbNV0sIG94eXRvY2luIG9yIHBsYWNlYm8gWzJdKSBhbmQgb25lIGJldHdlZW4tc3ViamVjdHMgZmFjdG9yIChncm91cCBbMl0pLgoKVXNpbmcgcHVzaC9wdWxsIFJUczogCgoqIFRocmVlIHdpdGhpbi1zdWJqZWN0cyBmYWN0b3JzIChzdGltdWx1cyBbNV0sIHB1c2ggb3IgcHVsbCBbMl0sIG94eXRvY2luIG9yIHBsYWNlYm8gWzJdKSBhbmQgb25lIGJldHdlZW4tc3ViamVjdHMgZmFjdG9yIChncm91cCBbMl0pLgoKSWYgd2Ugc2VlIHRoZSBleHBlY3RlZCBpbnRlcmFjdGlvbiwgdGhlbiBsb29rIGF0IHdoZXRoZXIgdGhlcmUgaXMgYSAqKndpdGhpbi1ncm91cCoqIGRpZmZlcmVuY2UgYmV0d2VlbiBPVCBhbmQgUEwgc2Vzc2lvbnMuCgpTZWUgYmVsb3cgZm9yIGFuYWx5c2lzICYgb3V0cHV0Li4uCgojI0RvIHRob3NlIHdpdGggQ0cgcmVzcG9uZCBkaWZmZXJlbnRpYWxseSB0byBzcG91c2UgKHZzLiBvdGhlciBzdGltdWxpKSBpbiB0aGUgT1QgY29uZGl0aW9uICh2cy4gcGxhY2VibykgdGhhbiB0aG9zZSB3aXRoIE5vbi1DRz8gKHRoZSBxdWVzdGlvbiB3ZSBtaWdodCBub3QgYmUgYWJsZSB0byBhbnN3ZXIpCgpSZXBocmFzZWQgYXMgYWltOgoKKipBaW0gNC4qKiBUbyBpZGVudGlmeSB3aGV0aGVyIHRoZSByZXNwb25zZSB0byBzcG91c2UgaW1hZ2VzIGluIHRoZSBDRyBncm91cCBzaWduaWZpY2FudGx5IGRpZmZlcnMgdW5kZXIgaW50cmFuYXNhbCBveHl0b2NpbiB2cy4gcGxhY2Viby4KCiogX09yLi4uXyB3aGV0aGVyIGFueSBvYnNlcnZlZCBtb2RlcmF0aW9uIG9mIG94eXRvY2luIGVmZmVjdHMgYnkgZ3JpZWYgc2V2ZXJpdHkgaXMgc3BlY2lmaWMgdG8gY2VydGFpbiB0eXBlcyBvZiBzdGltdWxpPwoKCkxvb2sgYXQgdGhlIGBzdGltdWx1c2AgKDUpIHhgY29uZGl0aW9uYCAoMikgeCBgZ3JvdXBgICgyKSBpbnRlcmFjdGlvbiBpbiB0aGUgZm9sbG93aW5nIG1vZGVsIChfc2FtZSBtb2RlbCBmb3IgQWltIDMgYWJvdmVfKToKClVzaW5nIGJpYXMgc2NvcmVzOiAKCiogVHdvIHdpdGhpbi1zdWJqZWN0cyBmYWN0b3JzIChzdGltdWx1cyBbNV0sIG94eXRvY2luIG9yIHBsYWNlYm8gWzJdKSBhbmQgb25lIGJldHdlZW4tc3ViamVjdHMgZmFjdG9yIChncm91cCBbMl0pLgoKVXNpbmcgcHVzaC9wdWxsIFJUczogCgoqIFRocmVlIHdpdGhpbi1zdWJqZWN0cyBmYWN0b3JzIChzdGltdWx1cyBbNV0sIHB1c2ggb3IgcHVsbCBbMl0sIG94eXRvY2luIG9yIHBsYWNlYm8gWzJdKSBhbmQgb25lIGJldHdlZW4tc3ViamVjdHMgZmFjdG9yIChncm91cCBbMl0pLgoKSWYgd2Ugc2VlIHRoZSBleHBlY3RlZCBpbnRlcmFjdGlvbiwgdGhlbiBsb29rIGF0IHBsYW5uZWQgY29udHJhc3RzLiBXZSBoeXBvdGhlc2l6ZSB0aGF0OgoKPiBzcG91c2UscGxhY2VibyxDRyAgIT0gc3BvdXNlLG94eXRvY2luLENHICAKCmFuZCB0aGF0Cgo+IHNwb3VzZSxwbGFjZWJvLE5DRyAgPT0gc3BvdXNlLG94eXRvY2luLE5DRyAgCgooaS5lLiwgc3BvdXNlIGluIHRoZSBwbGFjZWJvIHNlc3Npb24gaXMgbm90IGVxdWFsIHRvIHNwb3VzZSBpbiB0aGUgb3h5dG9jaW4gc2Vzc2lvbiwgX2luIHRoZSBDRyBncm91cCBvbmx5XykuIAoKCgoKIyMjIEFpbXMgMy80IEFOT1ZBIChwdXNoL3B1bGwgUlRzKQoKYGBge3J9CiMjIyMjIyMgQWltcyAzLzQgbW9kZWwgKEFOT1ZBKSAjIyMjIyMKIyBBIG1vZGVsIHdpdGggdGhyZWUgd2l0aGluLXN1YmplY3RzIGZhY3RvcnMgKHN0aW11bHVzIFs1XSwgZGlyZWN0aW9uIFsyXSwgdHJlYXRtZW50IFsyXSkgYW5kIG9uZSBiZXR3ZWVuLXN1YmplY3RzIGZhY3RvciAoZ3JvdXAgWzJdKQojIyBEVjogUlRzIG9uIHB1c2ggYW5kIHB1bGwgdHJpYWxzIHNlcGFyYXRlbHkKIyMgUHJlZGljdGVkOiBUcmVhdG1lbnQgeCBHcm91cCBpbnRlcmFjdGlvbiAoQWltIDMpLCBTdGltdWx1cyB4IERpcmVjdGlvbiB4IFRyZWF0bWVudCB4IEdyb3VwIChBaW0gNCkKCiMgUk0tQU5PVkEKbTNhIDwtIGFvdl9leihpZCA9ICJJRCIsIGR2ID0gImdBQVRfUlQiLCBkYXRhX2xvbmcsIGJldHdlZW4gPSAiZ3JvdXAiLCB3aXRoaW4gPSBjKCJzdGltdWx1cyIsICJkaXJlY3Rpb24iLCAidHJlYXRtZW50IiksIGZ1bl9hZ2dyZWdhdGUgPSBtZWRpYW4pCm0zYQoKIyBTdGltdWx1cyBpcyBwcmVkaWN0aXZlIGluIHRoZSBtb2RlbCwgYnV0IG9ubHkgYWxvbmUgb3IgaW4gaW50ZXJhY3Rpb24gd2l0aCBkaXJlY3Rpb24uCiMgVGhlcmUgaXMgYSBzaWduaWZpY2FudCB0aHJlZS13YXkgaW50ZXJhY3Rpb24gb2YgZ3JvdXAgeCBkaXJlY3Rpb24geCB0cmVhdG1lbnQKIyB3aGljaCBsb29rcyBsaWtlIHRoaXM6CmVtbWlwKG0zYSwgdHJlYXRtZW50IH5kaXJlY3Rpb24qZ3JvdXApCmVtbWVhbnMobTNhLCB+Yyh0cmVhdG1lbnR8IGRpcmVjdGlvbipncm91cCksIGNvbnRyID0gInBhaXJ3aXNlIiwgYWRqdXN0PSJob2xtIikKCmBgYAoKUGFpcndpc2UgY29tcGFyaXNvbnMgaW5kaWNhdGUgdGhhdCB0aGUgQ0cgZ3JvdXAgc2hvd2VkIGEgbWFyZ2luYWxseSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGJldHdlZW4gT1QgdnMuIFBMIG9uIFBVU0ggdHJpYWxzLCBhdmVyYWdlZCBhY3Jvc3MgYHN0aW11bGlgLCBfdF8gPSAtMS45MSwgX3BfID0gLjA2NC4gCgojIyMgQWltcyAzLzQgTGluZWFyIG1peGVkIG1vZGVsIChwdXNoL3B1bGwgUlRzKQpgYGB7cn0KIyMjIyMjIyBBaW1zIDMvNCBtb2RlbCAoTE1FKSAjIyMjIyMKIyBBIG1vZGVsIHdpdGggdGhyZWUgd2l0aGluLXN1YmplY3RzIGZhY3RvcnMgKHN0aW11bHVzIFs1XSwgZGlyZWN0aW9uIFsyXSwgdHJlYXRtZW50IFsyXSkgYW5kIG9uZSBiZXR3ZWVuLXN1YmplY3RzIGZhY3RvciAoZ3JvdXAgWzJdKQojIyBEVjogUlRzIG9uIHB1c2ggYW5kIHB1bGwgdHJpYWxzIHNlcGFyYXRlbHkKIyMgUHJlZGljdGVkOiBUcmVhdG1lbnQgeCBHcm91cCBpbnRlcmFjdGlvbiAoQWltIDMpLCBTdGltdWx1cyB4IERpcmVjdGlvbiB4IFRyZWF0bWVudCB4IEdyb3VwIChBaW0gNCkKCiMgTGluZWFyIG1peGVkIG1vZGVsCm0zYiA8LSBsbWUoZ0FBVF9SVCB+IHN0aW11bHVzKmRpcmVjdGlvbip0cmVhdG1lbnQqZ3JvdXAsIGRhdGEgPSBkYXRhX2xvbmcsIHJhbmRvbSA9IH4gMXxJRCwgbWV0aG9kPSJSRU1MIikgCmFub3ZhKG0zYikKCiMgdmFyaWFuY2UgZXhwbGFpbmVkIGJ5IHRoZSBlbnRpcmUgbW9kZWwgCmZpdHRlZCA8LSBmaXR0ZWQobTNiKQpkYXRhX2xvbmckZml0dGVkX20zYiA8LSBhcy52ZWN0b3IoZml0dGVkKQpmb3JSMiA8LSBsbShnQUFUX1JUIH4gZml0dGVkX20zYiwgZGF0YT1kYXRhX2xvbmcpCnN1bW1hcnkoZm9yUjIpCmBgYApMaWtlIHRoZSBBTk9WQSwgdGhlIGxpbmVhciBtaXhlZCBlZmZlY3RzIG1vZGVsIHNob3dzIGEgc2lnbmlmaWNhbnQgdGhyZWUtd2F5IGBkaXJlY3Rpb25gIHggYHRyZWF0bWVudGAgeCBgZ3JvdXBgIGludGVyYWN0aW9uLiBUaGUgbW9kZWwgZXhwbGFpbnMgYWJvdXQgMTglIG9mIHRoZSB2YXJpYW5jZSBpbiB0aGUgZGF0YSAoQWRqLiBSPHN1cDI8L3N1cD4gPSAuMTc3KS4gSXQgZG9lcyBkaWZmZXIgZnJvbSB0aGUgQU5PVkEgaW4gdGhhdCB0aGVyZSBpcyBhbHNvIGEgdHdvLXdheSBgdHJlYXRtZW50YCB4IGBncm91cGAgaW50ZXJhY3Rpb24gKG5vdCBpbnRlcnByZXRlZCBpbiB0aGUgcHJlc2VuY2Ugb2YgdGhlIGhpZ2hlci1vcmRlciBpbnRlcmFjdGlvbi4pCgoKTmV4dCwgbG9va2luZyBhdCB0aGUgbW9kZWwgc3VtbWFyeSB0ZWxscyB1cyBhYm91dCBzb21lIGNvbnRyYXN0cyAoYnV0IHRoZXNlIGFyZSBub3QgdGhlIG9uZXMgdGhhdCB3ZSBhcmUgcmVhbGx5IGludGVyZXN0ZWQgaW4gc28gSSB3b24ndCBwcmludCB0aGUgb3V0cHV0IHRhYmxlKS4gTm90ZSB0aGF0IHRoZSBtb2RlbCBvdXRwdXQgaW5jbHVkZXMgdGVzdHMgb2YgdGhlIG51bGwgaHlwb3RoZXNlcyB0aGF0IHRoZXNlIGRpZmZlcmVuY2VzIGFyZSBlcXVhbCB0byB6ZXJvLgoKYGBge3J9CnN1bW1hcnkobTNiKQpgYGAKCgpgYGB7cn0KIyB3ZSBjYW4gbG9vayBhdCBBTEwgcGFpcndpc2UgY29tcGFyaXNvbnMgdXNpbmcgdGhlIGVtbWVhbnMgcGFja2FnZSBhZ2FpbiwgYnV0IHRoaXMgZG9lc24ndCB0YWtlIGludG8gYWNjb3VudCB0aGUgcmFuZG9tIGVmZmVjdHM/CmVtbS5tM2IxIDwtIGVtbWVhbnMobTNiLCBwYWlyd2lzZSB+Yyh0cmVhdG1lbnQgfCBkaXJlY3Rpb24qZ3JvdXApLCBhZGp1c3Q9ImhvbG0iKSAjIGVtbS5tM2IxW1siZW1tZWFucyJdXUBsaW5mY3QgZ2l2ZXMgdXMgdGhlIGNvbnRyYXN0IG1hdHJpY2VzIGZvciBlYWNoIHBhaXJ3aXNlIGNvbXBhcmlzb24sIHRoaXMgc2VlbXMgdXNlZnVsCmVtbS5tM2IxCgplbW1pcChtM2IsIGdyb3VwKmRpcmVjdGlvbiB+dHJlYXRtZW50KQpgYGAKClBhaXJ3aXNlIGNvbXBhcmlzb25zIHNob3cgdGhhdCB3aGlsZSB0aGUgQ0cgZ3JvdXAgaXMgc2lnbmlmaWNhbnRseSBzbG93ZXIgdG8gYm90aCBQVVNIIGFuZCBQVUxMIHVuZGVyIE9ULCB0aGUgTkNHIGdyb3VwIGFsc28gZ2V0cyBhIGJpdCBzbG93ZXIgdG8gUFVMTCAoYnV0IG5vdCBQVVNIKSB1bmRlciBPVC4KCkFsdGhvdWdoIHRoZXJlIGlzIG5vIHNpZ25pZmljYW50IGludGVyYWN0aW9uIHdpdGggYHN0aW11bHVzYCwgaXQncyBpbnRlcmVzdGluZyB0byB2aXN1YWxpemUgd2hhdCBpdCBsb29rcyBsaWtlOgoKYGBge3J9CmVtbWlwKG0zYiwgZ3JvdXAqZGlyZWN0aW9uIH50cmVhdG1lbnR8c3RpbXVsdXMpICMgbG1lbQpgYGAKSGVyZSB3ZSBjYW4gY2xlYXJseSBzZWUgdGhhdCB0aGUgQ0cgZ3JvdXAncyBSVHMgYXJlIGxvbmdlciBfYWNyb3NzIHN0aW11bHVzIHR5cGVzXyBpbiB0aGUgT1QgY29uZGl0aW9uLgoKCiMjIyBBaW1zIDMvNCBBTk9WQSAoYmlhcyBzY29yZXMpCgpgYGB7cn0KIyMjIyMjIyBBaW1zIDMvNCBtb2RlbCAoQU5PVkEgdy9iaWFzIHNjb3JlcykgIyMjIyMjCiMgQSBtb2RlbCB3aXRoIHR3byB3aXRoaW4tc3ViamVjdHMgZmFjdG9ycyAoc3RpbXVsdXMgWzVdLCB0cmVhdG1lbnQgWzJdKSBhbmQgb25lIGJldHdlZW4tc3ViamVjdHMgZmFjdG9yIChncm91cCBbMl0pCiMjIERWOiBiaWFzIHNjb3JlcwojIyBQcmVkaWN0ZWQ6IFRyZWF0bWVudCB4IEdyb3VwIGludGVyYWN0aW9uIChBaW0gMyksIFN0aW11bHVzIHggVHJlYXRtZW50IHggR3JvdXAgKEFpbSA0KQoKIyBSTS1BTk9WQQptM2MgPC0gYW92X2V6KGlkID0gIklEIiwgZHYgPSAiZ0FBVF9iaWFzIiwgZGF0YV9iaWFzLCBiZXR3ZWVuID0gImdyb3VwIiwgd2l0aGluID0gYygic3RpbXVsdXMiLCAidHJlYXRtZW50IiksIGZ1bl9hZ2dyZWdhdGUgPSBtZWRpYW4pCm0zYwoKIyBTdGltdWx1cyBpcyBwcmVkaWN0aXZlIGluIHRoZSBtb2RlbCwgYnV0IG9ubHkgYWxvbmUuCiMgVGhlcmUgaXMgYSBzaWduaWZpY2FudCB0d28td2F5IGludGVyYWN0aW9uIG9mIGdyb3VwIHggdHJlYXRtZW50CiMgd2hpY2ggbG9va3MgbGlrZSB0aGlzOgplbW1pcChtM2MsIGdyb3VwIH4gdHJlYXRtZW50KQplbW1lYW5zKG0zYywgfmModHJlYXRtZW50fGdyb3VwKSwgY29udHIgPSAicGFpcndpc2UiLCBhZGp1c3Q9ImhvbG0iKSAjcGFpcndpc2UgY29tcGFyaXNvbnMgb2YgdHJlYXRtZW50IHdpdGhpbiBncm91cApgYGAKVGhlcmUgaXMgYSBzaWduaWZpY2FudCBgZ3JvdXBgIHggYHRyZWF0bWVudGAgaW50ZXJhY3Rpb24sIHN1Y2ggdGhhdCB0aGUgQ0cgZ3JvdXAgYmVjYW1lIG1vcmUgYXBwcm9hY2gtYmlhc2VkIHdoZW4gZ2l2ZW4gb3h5dG9jaW4uIFRoaXMgaXMgY29uc2lzdGVudCB3aXRoIEJBJ3MgcHJldmlvdXMgcmVzdWx0cy4KClBhaXJ3aXNlIGNvbXBhcmlzb25zIChgdHJlYXRtZW50YCB3aXRoaW4gYGdyb3VwYCkgY29uZmlybSB0aGF0IHRoZSBDRyBncm91cCBpcyBzaWduaWZpY2FudGx5IG1vcmUgYXBwcm9hY2gtYmlhc2VkIGluIHRoZSBPVCBjb25kaXRpb24uCgpXZSBjYW4gYWxzbyBsb29rIGF0IHRoZSBwYWlyd2lzZSBjb21wYXJpc29ucyBmb3IgdGhlIG1haW4gZWZmZWN0IG9mIHN0aW11bHVzLCBpZiB0aGF0IGlzIHVzZWZ1bC9pbnRlcmVzdGluZyBpbiBhbnkgd2F5Li4uCmBgYHtyfQplbW1lYW5zKG0zYywgfmMoc3RpbXVsdXMpLCBjb250ciA9ICJwYWlyd2lzZSIsIGFkanVzdD0iaG9sbSIpICNwYWlyd2lzZSBjb21wYXJpc29ucyBvZiBzdGltdWx1cwpgYGAKV2Ugc2VlIHRoYXQgYXZlcmFnZWQgYWNyb3NzIGxldmVscyBvZiBgZ3JvdXBgIGFuZCBgdHJlYXRtZW50YCwgdGhlIHNhbXBsZSBhcyBhIHdob2xlIGRvZXMgc2hvdyBtb3JlIGFwcHJvYWNoIGJpYXMgZm9yIHNwb3VzZSBjb21wYXJlZCB0byBkZWF0aCwgbmV1dHJhbCwgYW5kIHN0cmFuZ2VyIHN0aW11bGkgLSBidXQgbm90IGxpdmluZyBsb3ZlZCBvbmUuCgoKCiMjIyBBaW1zIDMvNCBMaW5lYXIgbWl4ZWQgbW9kZWwgKGJpYXMgc2NvcmVzKQoKYGBge3J9CiMjIyMjIyMgQWltcyAzLzQgbW9kZWwgKExNRSB3L2JpYXMgc2NvcmVzKSAjIyMjIyMKIyBBIG1vZGVsIHdpdGggdHdvIHdpdGhpbi1zdWJqZWN0cyBmYWN0b3JzIChzdGltdWx1cyBbNV0sIHRyZWF0bWVudCBbMl0pIGFuZCBvbmUgYmV0d2Vlbi1zdWJqZWN0cyBmYWN0b3IgKGdyb3VwIFsyXSkKIyMgRFY6IGJpYXMgc2NvcmVzCiMjIFByZWRpY3RlZDogVHJlYXRtZW50IHggR3JvdXAgaW50ZXJhY3Rpb24gKEFpbSAzKSwgU3RpbXVsdXMgeCBUcmVhdG1lbnQgeCBHcm91cCAoQWltIDQpCgojIExpbmVhciBtaXhlZCBtb2RlbAptM2QgPC0gbG1lKGdBQVRfYmlhcyB+IHN0aW11bHVzKnRyZWF0bWVudCpncm91cCwgZGF0YSA9IGRhdGFfYmlhcywgcmFuZG9tID0gfiAxfElELCBtZXRob2Q9IlJFTUwiKSAKYW5vdmEobTNkKQoKIyB2YXJpYW5jZSBleHBsYWluZWQgYnkgdGhlIGVudGlyZSBtb2RlbCAKZml0dGVkIDwtIGZpdHRlZChtM2QpCmRhdGFfYmlhcyRmaXR0ZWRfbTNkIDwtIGFzLnZlY3RvcihmaXR0ZWQpCmZvclIyIDwtIGxtKGdBQVRfYmlhcyB+IGZpdHRlZF9tM2QsIGRhdGE9ZGF0YV9iaWFzKQpzdW1tYXJ5KGZvclIyKQpgYGAKQXMgYWJvdmUsIHdlIHNlZSBhIG1haW4gZWZmZWN0IG9mIGBzdGltdWx1c2AgYW5kIGEgdHdvLXdheSBpbnRlcmFjdGlvbiBvZiBgdHJlYXRtZW50YCB4IGBncm91cGAuIFRoZSBtb2RlbCBleHBsYWlucyBhYm91dCAzNCUgb2YgdGhlIHZhcmlhbmNlIChhZGogUjxzdXA+Mjwvc3VwPiA9IC4zNCkuCgpUaGlzIGlzIHdoYXQgdGhlIGludGVyYWN0aW9uIGxvb2tzIGxpa2U6CgpgYGB7cn0KcDMgPC0gZ2dwbG90KGRhdGFfYmlhcywgYWVzKGZpbGw9Z3JvdXAsIHk9Z0FBVF9iaWFzLCB4PXRyZWF0bWVudCkpICsgCiAgZ2VvbV9ib3hwbG90KGFlcyhmaWxsPWdyb3VwKSwgb3V0bGllci5hbHBoYSA9IDAuMykKcDMgPC0gcDMgKyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MCwgbGluZXR5cGU9InNvbGlkIiwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uNSkgKyB4bGFiKCJDb25kaXRpb24iKSArIHlsYWIoIkF2b2lkIGJpYXMgICAgICAgICAgICAgICAgQXBwcm9hY2ggYmlhcyIpCgpwNCA8LSBnZ3Bsb3QoZGF0YV9iaWFzLCBhZXMoZmlsbD10cmVhdG1lbnQsIHk9Z0FBVF9iaWFzLCB4PWdyb3VwKSkgKyAKICBnZW9tX2JveHBsb3QoYWVzKGZpbGw9dHJlYXRtZW50KSwgb3V0bGllci5hbHBoYSA9IDAuMykKcDQgPC0gcDQgKyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MCwgbGluZXR5cGU9InNvbGlkIiwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uNSkgKyB4bGFiKCJHcm91cCIpICsgeWxhYigiQXZvaWQgYmlhcyAgICAgICAgICAgICAgICBBcHByb2FjaCBiaWFzIikKCnAzICMgdHJlYXRtZW50IG9uIHgtYXhpcwpwNCAjIGdyb3VwIG9uIHgtYXhpcwoKZW1tX20zYyA8LSBlbW1lYW5zKG0zYywgfiB0cmVhdG1lbnR8Z3JvdXApICMgY29tcGFyZSB0cmVhdG1lbnQgd2l0aGluIGdyb3VwIChBTk9WQSkKcGxvdChlbW1fbTNjLCBjb21wYXJpc29ucyA9IFRSVUUsIGludGVydmFscyA9IFRSVUUsIGhvcml6b250YWwgPSBGQUxTRSkKCmVtbV9tM2QgPC0gZW1tZWFucyhtM2QsIH4gdHJlYXRtZW50fGdyb3VwKSAjIGNvbXBhcmUgdHJlYXRtZW50IHdpdGhpbiBncm91cCAoTE1FKQpwbG90KGVtbV9tM2QsIGNvbXBhcmlzb25zID0gVFJVRSwgaW50ZXJ2YWxzID0gVFJVRSwgaG9yaXpvbnRhbCA9IEZBTFNFKQoKCgpgYGAKCgojIEN1c3RvbSBjb250cmFzdHMKaHR0cHM6Ly9hb3NtaXRoLnJiaW5kLmlvLzIwMTkvMDQvMTUvY3VzdG9tLWNvbnRyYXN0cy1lbW1lYW5zLwpodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvYWZleC92aWduZXR0ZXMvYWZleF9hbm92YV9leGFtcGxlLmh0bWwjcnVubmluZy1jdXN0b20tY29udHJhc3RzCgo+IE9iamVjdHMgcmV0dXJuZWQgZnJvbSBlbW1lYW5zIGNhbiBhbHNvIGJlIHVzZWQgdG8gdGVzdCBzcGVjaWZpYyBjb250cmFzdHMuIEZvciB0aGlzLCB3ZSBjYW4gc2ltcGx5IGNyZWF0ZSBhIGxpc3QsIHdoZXJlIGVhY2ggZWxlbWVudCBjb3JyZXNwb25kcyB0byBvbmUgY29udHJhc3RzLiBBIGNvbnRyYXN0IGlzIGRlZmluZWQgYXMgYSB2ZWN0b3Igb2YgY29uc3RhbnRzIG9uIHRoZSByZWZlcmVuY2UgZ3JpZCAoaS5lLiwgdGhlIG9iamVjdCByZXR1cm5lZCBmcm9tIGVtbWVhbnMsIGhlcmUgbTMpLiBGb3IgZXhhbXBsZSwgd2UgbWlnaHQgYmUgaW50ZXJlc3RlZCBpbiB3aGV0aGVyIHRoZXJlIGlzIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB2YWxpZCBhbmQgaW52YWxpZCBpbmZlcmVuY2VzIGluIGVhY2ggb2YgdGhlIHR3byBjb25kaXRpb25zLgoKVGhpcyBzZWN0aW9uIGluIHByb2dyZXNzLCBubyByZXN1bHRzIGFzIG9mIHlldC4uLgpgYGB7cn0KbTNkX3JlZiA8LSBlbW1lYW5zKG0zZCwgfnN0aW11bHVzK2dyb3VwK3RyZWF0bWVudCwgbW9kZWwgPSAibXVsdGl2YXJpYXRlIikKbTNkX3JlZiAjIHRoaXMgaXMgdGhlIHJlZmVyZW5jZSBncmlkCiMgdmVjdG9yIG9mIGNvbnRyYXN0IHdlaWdodHMgbXVzdCBsaW5lIHVwIHdpdGggaXRlbXMgYXMgb3JkZXJlZCBpbiByZWZlcmVuY2UgZ3JpZAoKbTNhX3JlZiA8LSBlbW1lYW5zKG0zYSwgfnN0aW11bHVzK2dyb3VwK3RyZWF0bWVudCwgbW9kZWwgPSAibXVsdGl2YXJpYXRlIikKbTNhX3JlZgoKbTNiX3JlZiA8LSBlbW1lYW5zKG0zYiwgfnN0aW11bHVzK2dyb3VwK3RyZWF0bWVudCwgbW9kZWwgPSAibXVsdGl2YXJpYXRlIikKbTNiX3JlZgoKbTNjX3JlZiA8LSBlbW1lYW5zKG0zYywgfnN0aW11bHVzK2dyb3VwK3RyZWF0bWVudCwgbW9kZWwgPSAibXVsdGl2YXJpYXRlIikKbTNjX3JlZgoKc3BvdXNlX3BsID0gYygwLCAjIG5ldXRyYWwgIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgZGVhdGggICAgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBsaXZpbmcgICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAuNSwgIyBzcG91c2UgICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIHN0cmFuZ2VyIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgbmV1dHJhbCAgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIGRlYXRoICAgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBsaXZpbmcgICBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIC41LCAjIHNwb3VzZSAgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBzdHJhbmdlciBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgbmV1dHJhbCAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgZGVhdGggICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgbGl2aW5nICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgc3BvdXNlICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgc3RyYW5nZXIgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgbmV1dHJhbCAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBkZWF0aCAgICBDRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIGxpdmluZyAgIENHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgc3BvdXNlICAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCkgIyBzdHJhbmdlciBDRyAgIG94eXRvY2luCgpkZWF0aF9wbCA9IGMoMCwgIyBuZXV0cmFsICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAuNSwgIyBkZWF0aCAgICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIGxpdmluZyAgIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgc3BvdXNlICAgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBzdHJhbmdlciBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIG5ldXRyYWwgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgLjUsICMgZGVhdGggICAgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIGxpdmluZyAgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBzcG91c2UgICBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgc3RyYW5nZXIgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIG5ldXRyYWwgIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIGRlYXRoICAgIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIGxpdmluZyAgIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIHNwb3VzZSAgIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIHN0cmFuZ2VyIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIG5ldXRyYWwgIENHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgZGVhdGggICAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBsaXZpbmcgICBDRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIHNwb3VzZSAgIENHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDApICMgc3RyYW5nZXIgQ0cgICBveHl0b2NpbgoKc3BvdXNlX290ID0gYygwLCAjIG5ldXRyYWwgIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgZGVhdGggICAgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBsaXZpbmcgICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIHNwb3VzZSAgIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgc3RyYW5nZXIgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBuZXV0cmFsICBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgZGVhdGggICAgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIGxpdmluZyAgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBzcG91c2UgICBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgc3RyYW5nZXIgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIG5ldXRyYWwgIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIGRlYXRoICAgIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIGxpdmluZyAgIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAuNSwgIyBzcG91c2UgICBOQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBzdHJhbmdlciBOQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBuZXV0cmFsICBDRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIGRlYXRoICAgIENHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgbGl2aW5nICAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgLjUsICMgc3BvdXNlICAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCkgIyBzdHJhbmdlciBDRyAgIG94eXRvY2luCgpkZWF0aF9vdCA9IGMoMCwgIyBuZXV0cmFsICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIGRlYXRoICAgIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgbGl2aW5nICAgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBzcG91c2UgICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIHN0cmFuZ2VyIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgbmV1dHJhbCAgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIGRlYXRoICAgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBsaXZpbmcgICBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgc3BvdXNlICAgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIHN0cmFuZ2VyIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBuZXV0cmFsICBOQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgLjUsICMgZGVhdGggICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgbGl2aW5nICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgc3BvdXNlICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgc3RyYW5nZXIgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgbmV1dHJhbCAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgLjUsICMgZGVhdGggICAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBsaXZpbmcgICBDRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIHNwb3VzZSAgIENHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDApICMgc3RyYW5nZXIgQ0cgICBveHl0b2NpbgoKc3BvdXNlX25jZ19wbCA9IGMoMCwgIyBuZXV0cmFsICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIGRlYXRoICAgIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgbGl2aW5nICAgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMSwgIyBzcG91c2UgICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIHN0cmFuZ2VyIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgbmV1dHJhbCAgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIGRlYXRoICAgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBsaXZpbmcgICBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgc3BvdXNlICAgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIHN0cmFuZ2VyIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBuZXV0cmFsICBOQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBkZWF0aCAgICBOQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBsaXZpbmcgICBOQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBzcG91c2UgICBOQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBzdHJhbmdlciBOQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBuZXV0cmFsICBDRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIGRlYXRoICAgIENHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgbGl2aW5nICAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBzcG91c2UgICBDRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwKSAjIHN0cmFuZ2VyIENHICAgb3h5dG9jaW4KCnNwb3VzZV9uY2dfb3QgPSBjKDAsICMgbmV1dHJhbCAgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBkZWF0aCAgICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIGxpdmluZyAgIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgc3BvdXNlICAgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBzdHJhbmdlciBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIG5ldXRyYWwgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBkZWF0aCAgICBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgbGl2aW5nICAgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIHNwb3VzZSAgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBzdHJhbmdlciBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgbmV1dHJhbCAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgZGVhdGggICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgbGl2aW5nICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDEsICMgc3BvdXNlICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgc3RyYW5nZXIgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgbmV1dHJhbCAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBkZWF0aCAgICBDRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIGxpdmluZyAgIENHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgc3BvdXNlICAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCkgIyBzdHJhbmdlciBDRyAgIG94eXRvY2luCgpzcG91c2VfY2dfcGwgPSBjKDAsICMgbmV1dHJhbCAgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBkZWF0aCAgICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIGxpdmluZyAgIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgc3BvdXNlICAgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBzdHJhbmdlciBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIG5ldXRyYWwgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBkZWF0aCAgICBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgbGl2aW5nICAgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAxLCAjIHNwb3VzZSAgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBzdHJhbmdlciBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgbmV1dHJhbCAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgZGVhdGggICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgbGl2aW5nICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgc3BvdXNlICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgc3RyYW5nZXIgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgbmV1dHJhbCAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBkZWF0aCAgICBDRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIGxpdmluZyAgIENHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgc3BvdXNlICAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCkgIyBzdHJhbmdlciBDRyAgIG94eXRvY2luCgpzcG91c2VfY2dfb3QgPSBjKDAsICMgbmV1dHJhbCAgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBkZWF0aCAgICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIGxpdmluZyAgIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgc3BvdXNlICAgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBzdHJhbmdlciBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIG5ldXRyYWwgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBkZWF0aCAgICBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgbGl2aW5nICAgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIHNwb3VzZSAgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBzdHJhbmdlciBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgbmV1dHJhbCAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgZGVhdGggICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgbGl2aW5nICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgc3BvdXNlICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgc3RyYW5nZXIgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgbmV1dHJhbCAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBkZWF0aCAgICBDRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIGxpdmluZyAgIENHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDEsICMgc3BvdXNlICAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCkgIyBzdHJhbmdlciBDRyAgIG94eXRvY2luCgoKIyMjCmxpdmluZ19uY2dfcGwgPSBjKDAsICMgbmV1dHJhbCAgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBkZWF0aCAgICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAxLCAjIGxpdmluZyAgIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgc3BvdXNlICAgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBzdHJhbmdlciBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIG5ldXRyYWwgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBkZWF0aCAgICBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgbGl2aW5nICAgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIHNwb3VzZSAgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBzdHJhbmdlciBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgbmV1dHJhbCAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgZGVhdGggICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgbGl2aW5nICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgc3BvdXNlICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgc3RyYW5nZXIgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgbmV1dHJhbCAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBkZWF0aCAgICBDRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIGxpdmluZyAgIENHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgc3BvdXNlICAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCkgIyBzdHJhbmdlciBDRyAgIG94eXRvY2luCgpsaXZpbmdfbmNnX290ID0gYygwLCAjIG5ldXRyYWwgIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgZGVhdGggICAgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBsaXZpbmcgICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIHNwb3VzZSAgIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgc3RyYW5nZXIgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBuZXV0cmFsICBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgZGVhdGggICAgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIGxpdmluZyAgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBzcG91c2UgICBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgc3RyYW5nZXIgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIG5ldXRyYWwgIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIGRlYXRoICAgIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAxLCAjIGxpdmluZyAgIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIHNwb3VzZSAgIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIHN0cmFuZ2VyIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIG5ldXRyYWwgIENHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgZGVhdGggICAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBsaXZpbmcgICBDRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIHNwb3VzZSAgIENHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDApICMgc3RyYW5nZXIgQ0cgICBveHl0b2NpbgoKbGl2aW5nX2NnX3BsID0gYygwLCAjIG5ldXRyYWwgIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgZGVhdGggICAgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBsaXZpbmcgICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIHNwb3VzZSAgIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgc3RyYW5nZXIgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBuZXV0cmFsICBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgZGVhdGggICAgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAxLCAjIGxpdmluZyAgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBzcG91c2UgICBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgc3RyYW5nZXIgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIG5ldXRyYWwgIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIGRlYXRoICAgIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIGxpdmluZyAgIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIHNwb3VzZSAgIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIHN0cmFuZ2VyIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIG5ldXRyYWwgIENHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgZGVhdGggICAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBsaXZpbmcgICBDRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIHNwb3VzZSAgIENHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDApICMgc3RyYW5nZXIgQ0cgICBveHl0b2NpbgoKbGl2aW5nX2NnX290ID0gYygwLCAjIG5ldXRyYWwgIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgZGVhdGggICAgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBsaXZpbmcgICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIHNwb3VzZSAgIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgc3RyYW5nZXIgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBuZXV0cmFsICBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgZGVhdGggICAgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIGxpdmluZyAgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBzcG91c2UgICBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgc3RyYW5nZXIgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIG5ldXRyYWwgIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIGRlYXRoICAgIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIGxpdmluZyAgIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIHNwb3VzZSAgIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIHN0cmFuZ2VyIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIG5ldXRyYWwgIENHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgZGVhdGggICAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMSwgIyBsaXZpbmcgICBDRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIHNwb3VzZSAgIENHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDApICMgc3RyYW5nZXIgQ0cgICBveHl0b2NpbgojIyMKZGVhdGhfbmNnX3BsID0gYygwLCAjIG5ldXRyYWwgIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDEsICMgZGVhdGggICAgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBsaXZpbmcgICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIHNwb3VzZSAgIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgc3RyYW5nZXIgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBuZXV0cmFsICBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgZGVhdGggICAgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIGxpdmluZyAgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBzcG91c2UgICBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgc3RyYW5nZXIgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIG5ldXRyYWwgIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIGRlYXRoICAgIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIGxpdmluZyAgIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIHNwb3VzZSAgIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIHN0cmFuZ2VyIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIG5ldXRyYWwgIENHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgZGVhdGggICAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBsaXZpbmcgICBDRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIHNwb3VzZSAgIENHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDApICMgc3RyYW5nZXIgQ0cgICBveHl0b2NpbgoKZGVhdGhfbmNnX290ID0gYygwLCAjIG5ldXRyYWwgIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgZGVhdGggICAgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBsaXZpbmcgICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIHNwb3VzZSAgIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgc3RyYW5nZXIgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBuZXV0cmFsICBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgZGVhdGggICAgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIGxpdmluZyAgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBzcG91c2UgICBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgc3RyYW5nZXIgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIG5ldXRyYWwgIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAxLCAjIGRlYXRoICAgIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIGxpdmluZyAgIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIHNwb3VzZSAgIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIHN0cmFuZ2VyIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIG5ldXRyYWwgIENHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgZGVhdGggICAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBsaXZpbmcgICBDRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIHNwb3VzZSAgIENHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDApICMgc3RyYW5nZXIgQ0cgICBveHl0b2NpbgoKZGVhdGhfY2dfcGwgPSBjKDAsICMgbmV1dHJhbCAgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBkZWF0aCAgICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIGxpdmluZyAgIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgc3BvdXNlICAgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBzdHJhbmdlciBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIG5ldXRyYWwgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMSwgIyBkZWF0aCAgICBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgbGl2aW5nICAgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIHNwb3VzZSAgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBzdHJhbmdlciBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgbmV1dHJhbCAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgZGVhdGggICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgbGl2aW5nICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgc3BvdXNlICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgc3RyYW5nZXIgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgbmV1dHJhbCAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBkZWF0aCAgICBDRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIGxpdmluZyAgIENHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgc3BvdXNlICAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCkgIyBzdHJhbmdlciBDRyAgIG94eXRvY2luCgpkZWF0aF9jZ19vdCA9IGMoMCwgIyBuZXV0cmFsICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIGRlYXRoICAgIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgbGl2aW5nICAgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBzcG91c2UgICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIHN0cmFuZ2VyIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgbmV1dHJhbCAgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIGRlYXRoICAgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBsaXZpbmcgICBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgc3BvdXNlICAgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIHN0cmFuZ2VyIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBuZXV0cmFsICBOQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBkZWF0aCAgICBOQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBsaXZpbmcgICBOQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBzcG91c2UgICBOQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBzdHJhbmdlciBOQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBuZXV0cmFsICBDRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAxLCAjIGRlYXRoICAgIENHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgbGl2aW5nICAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBzcG91c2UgICBDRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwKSAjIHN0cmFuZ2VyIENHICAgb3h5dG9jaW4KCgoKCgojIHRlc3QgdGhlIGNvbnRyYXN0cwpjb250cmFzdChtM2RfcmVmLCBtZXRob2QgPSBsaXN0KCJzcG91c2UgTkNHID4gZGVhdGggTkNHIChwbGFjZWJvKSIgPSBzcG91c2VfbmNnX3BsIC0gZGVhdGhfbmNnX3BsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwb3VzZSBDRyA+IGRlYXRoIENHIChwbGFjZWJvKSIgPSBzcG91c2VfY2dfcGwgLSBkZWF0aF9jZ19wbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcG91c2UgTkNHID4gZGVhdGggTkNHIChveHl0b2NpbikiID0gc3BvdXNlX25jZ19vdCAtIGRlYXRoX25jZ19vdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcG91c2UgQ0cgPiBkZWF0aCBDRyAob3h5dG9jaW4pIiA9IHNwb3VzZV9jZ19vdCAtIGRlYXRoX2NnX290LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwb3VzZSA+IGRlYXRoIChwbGFjZWJvKSIgPSBzcG91c2VfcGwgLSBkZWF0aF9wbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcG91c2UgPiBkZWF0aCAob3h5dG9jaW4pIiA9IHNwb3VzZV9vdCAtIGRlYXRoX290KSwgYWRqdXN0PSJib25mIikKCiMgdGhpcyBpcyBhbm90aGVyIHdheSB0byBkbyBpdDoKcHBsX3ZzX3NjZW5lc19vdCA9IGMoMCwgIyBuZXV0cmFsICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIGRlYXRoICAgIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgbGl2aW5nICAgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBzcG91c2UgICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIHN0cmFuZ2VyIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgbmV1dHJhbCAgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIGRlYXRoICAgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBsaXZpbmcgICBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgc3BvdXNlICAgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIHN0cmFuZ2VyIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgLTEvNCwgIyBuZXV0cmFsICBOQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgLTEvNCwgIyBkZWF0aCAgICBOQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMS82LCAjIGxpdmluZyAgIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAxLzYsICMgc3BvdXNlICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDEvNiwgIyBzdHJhbmdlciBOQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgLTEvNCwgIyBuZXV0cmFsICBDRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAtMS80LCAjIGRlYXRoICAgIENHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDEvNiwgIyBsaXZpbmcgICBDRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAxLzYsICMgc3BvdXNlICAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMS82KSAjIHN0cmFuZ2VyIENHICAgb3h5dG9jaW4KY29udHJhc3QocmVmLCBtZXRob2Q9bGlzdChwcGxfdnNfc2NlbmVzX290KSkKCiMjIyMgRm9yIEFpbSA0ICMjIyMKIyB0ZXN0cyBPVCA+IFBMIGZvciBzcG91c2Ugc3RpbXVsaSB3aXRoaW4gdGhlIENHIGdyb3VwCnNwb3VzZV9jZ19PVHZQTCA9IGMoMCwgIyBuZXV0cmFsICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIGRlYXRoICAgIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgbGl2aW5nICAgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBzcG91c2UgICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIHN0cmFuZ2VyIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgbmV1dHJhbCAgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIGRlYXRoICAgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBsaXZpbmcgICBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIC0xLCAjIHNwb3VzZSAgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBzdHJhbmdlciBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgbmV1dHJhbCAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgZGVhdGggICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgbGl2aW5nICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgc3BvdXNlICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgc3RyYW5nZXIgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgbmV1dHJhbCAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBkZWF0aCAgICBDRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIGxpdmluZyAgIENHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDEsICMgc3BvdXNlICAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCkgIyBzdHJhbmdlciBDRyAgIG94eXRvY2luCgojIHRlc3RzIE9UID4gUEwgZm9yIHNwb3VzZSBzdGltdWxpIHdpdGhpbiB0aGUgTkNHIGdyb3VwCnNwb3VzZV9uY2dfT1R2UEwgPSBjKDAsICMgbmV1dHJhbCAgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBkZWF0aCAgICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIGxpdmluZyAgIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIC0xLCAjIHNwb3VzZSAgIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgc3RyYW5nZXIgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBuZXV0cmFsICBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgZGVhdGggICAgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIGxpdmluZyAgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBzcG91c2UgICBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgc3RyYW5nZXIgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIG5ldXRyYWwgIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIGRlYXRoICAgIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIGxpdmluZyAgIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAxLCAjIHNwb3VzZSAgIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIHN0cmFuZ2VyIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIG5ldXRyYWwgIENHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgZGVhdGggICAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBsaXZpbmcgICBDRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIHNwb3VzZSAgIENHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDApICMgc3RyYW5nZXIgQ0cgICBveHl0b2NpbgoKIyB0ZXN0cyBPVCA+IFBMIGZvciBsaXZpbmcgc3RpbXVsaSB3aXRoaW4gdGhlIENHIGdyb3VwCmxpdmluZ19jZ19PVHZQTCA9IGMoMCwgIyBuZXV0cmFsICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIGRlYXRoICAgIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgbGl2aW5nICAgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBzcG91c2UgICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIHN0cmFuZ2VyIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgbmV1dHJhbCAgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIGRlYXRoICAgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgLTEsICMgbGl2aW5nICAgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIHNwb3VzZSAgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBzdHJhbmdlciBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgbmV1dHJhbCAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgZGVhdGggICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgbGl2aW5nICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgc3BvdXNlICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgc3RyYW5nZXIgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgbmV1dHJhbCAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBkZWF0aCAgICBDRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAxLCAjIGxpdmluZyAgIENHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgc3BvdXNlICAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCkgIyBzdHJhbmdlciBDRyAgIG94eXRvY2luCgojIHRlc3RzIE9UID4gUEwgZm9yIGxpdmluZyBzdGltdWxpIHdpdGhpbiB0aGUgTkNHIGdyb3VwCmxpdmluZ19uY2dfT1R2UEwgPSBjKDAsICMgbmV1dHJhbCAgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBkZWF0aCAgICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAtMSwgIyBsaXZpbmcgICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIHNwb3VzZSAgIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgc3RyYW5nZXIgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBuZXV0cmFsICBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgZGVhdGggICAgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIGxpdmluZyAgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBzcG91c2UgICBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgc3RyYW5nZXIgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIG5ldXRyYWwgIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIGRlYXRoICAgIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAxLCAjIGxpdmluZyAgIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIHNwb3VzZSAgIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIHN0cmFuZ2VyIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIG5ldXRyYWwgIENHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgZGVhdGggICAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBsaXZpbmcgICBDRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIHNwb3VzZSAgIENHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDApICMgc3RyYW5nZXIgQ0cgICBveHl0b2NpbgoKIyB0ZXN0cyBPVCA+IFBMIGZvciBkZWF0aCBzdGltdWxpIHdpdGhpbiB0aGUgQ0cgZ3JvdXAKZGVhdGhfY2dfT1R2UEwgPSBjKDAsICMgbmV1dHJhbCAgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBkZWF0aCAgICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIGxpdmluZyAgIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgc3BvdXNlICAgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBzdHJhbmdlciBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIG5ldXRyYWwgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgLTEsICMgZGVhdGggICAgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIGxpdmluZyAgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBzcG91c2UgICBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgc3RyYW5nZXIgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIG5ldXRyYWwgIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIGRlYXRoICAgIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIGxpdmluZyAgIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIHNwb3VzZSAgIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIHN0cmFuZ2VyIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIG5ldXRyYWwgIENHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDEsICMgZGVhdGggICAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBsaXZpbmcgICBDRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIHNwb3VzZSAgIENHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDApICMgc3RyYW5nZXIgQ0cgICBveHl0b2NpbgoKIyB0ZXN0cyBPVCA+IFBMIGZvciBkZWF0aCBzdGltdWxpIHdpdGhpbiB0aGUgTkNHIGdyb3VwCmRlYXRoX25jZ19PVHZQTCA9IGMoMCwgIyBuZXV0cmFsICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAtMSwgIyBkZWF0aCAgICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIGxpdmluZyAgIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgc3BvdXNlICAgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBzdHJhbmdlciBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIG5ldXRyYWwgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBkZWF0aCAgICBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgbGl2aW5nICAgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIHNwb3VzZSAgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBzdHJhbmdlciBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgbmV1dHJhbCAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDEsICMgZGVhdGggICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgbGl2aW5nICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgc3BvdXNlICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgc3RyYW5nZXIgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgbmV1dHJhbCAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBkZWF0aCAgICBDRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIGxpdmluZyAgIENHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgc3BvdXNlICAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCkgIyBzdHJhbmdlciBDRyAgIG94eXRvY2luCgojIHRlc3RzIE9UID4gUEwgZm9yIHN0cmFuZ2VyIHN0aW11bGkgd2l0aGluIHRoZSBDRyBncm91cApzdHJhbmdlcl9jZ19PVHZQTCA9IGMoMCwgIyBuZXV0cmFsICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIGRlYXRoICAgIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgbGl2aW5nICAgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBzcG91c2UgICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIHN0cmFuZ2VyIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgbmV1dHJhbCAgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIGRlYXRoICAgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBsaXZpbmcgICBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgc3BvdXNlICAgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAtMSwgIyBzdHJhbmdlciBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgbmV1dHJhbCAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgZGVhdGggICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgbGl2aW5nICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgc3BvdXNlICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgc3RyYW5nZXIgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgbmV1dHJhbCAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBkZWF0aCAgICBDRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIGxpdmluZyAgIENHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgc3BvdXNlICAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMSkgIyBzdHJhbmdlciBDRyAgIG94eXRvY2luCgojIHRlc3RzIE9UID4gUEwgZm9yIHN0cmFuZ2VyIHN0aW11bGkgd2l0aGluIHRoZSBOQ0cgZ3JvdXAKc3RyYW5nZXJfbmNnX09UdlBMID0gYygwLCAjIG5ldXRyYWwgIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgZGVhdGggICAgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBsaXZpbmcgICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIHNwb3VzZSAgIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIC0xLCAjIHN0cmFuZ2VyIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgbmV1dHJhbCAgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIGRlYXRoICAgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBsaXZpbmcgICBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgc3BvdXNlICAgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIHN0cmFuZ2VyIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBuZXV0cmFsICBOQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBkZWF0aCAgICBOQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBsaXZpbmcgICBOQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBzcG91c2UgICBOQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMSwgIyBzdHJhbmdlciBOQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBuZXV0cmFsICBDRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIGRlYXRoICAgIENHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgbGl2aW5nICAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBzcG91c2UgICBDRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwKSAjIHN0cmFuZ2VyIENHICAgb3h5dG9jaW4KCgoKCmNvbnRyYXN0KG0zYV9yZWYsIG1ldGhvZCA9IGxpc3QoIkVmZmVjdCBvZiBPVCBvbiBzcG91c2UgUlQgaW4gQ0cgPiBlZmZlY3Qgb2YgT1Qgb24gc3BvdXNlIFJUIGluIE5DRyIgPSBzcG91c2VfY2dfT1R2UEwgLSBzcG91c2VfbmNnX09UdlBMKSkKY29udHJhc3QobTNhX3JlZiwgbWV0aG9kID0gbGlzdCgiRWZmZWN0IG9mIE9UIG9uIGxpdmluZyBsb3ZlZCBvbmUgUlQgaW4gQ0cgPiBlZmZlY3Qgb2YgT1Qgb24gbGl2aW5nIGxvdmVkIG9uZSBSVCBpbiBOQ0ciID0gbGl2aW5nX2NnX09UdlBMIC0gbGl2aW5nX25jZ19PVHZQTCkpCmNvbnRyYXN0KG0zYV9yZWYsIG1ldGhvZCA9IGxpc3QoIkVmZmVjdCBvZiBPVCBvbiBnZW5lcmljIGRlYXRoIFJUIGluIENHID4gZWZmZWN0IG9mIE9UIG9uIGdlbmVyaWMgZGVhdGggUlQgaW4gTkNHIiA9IGRlYXRoX2NnX09UdlBMIC0gZGVhdGhfbmNnX09UdlBMKSkKY29udHJhc3QobTNhX3JlZiwgbWV0aG9kID0gbGlzdCgiRWZmZWN0IG9mIE9UIG9uIHN0cmFuZ2VyIFJUIGluIENHID4gZWZmZWN0IG9mIE9UIG9uIHN0cmFuZ2VyIFJUIGluIE5DRyIgPSBzdHJhbmdlcl9jZ19PVHZQTCAtIHN0cmFuZ2VyX25jZ19PVHZQTCkpCgpjb250cmFzdChtM2JfcmVmLCBtZXRob2QgPSBsaXN0KCJFZmZlY3Qgb2YgT1Qgb24gc3BvdXNlIFJUIGluIENHID4gZWZmZWN0IG9mIE9UIG9uIHNwb3VzZSBSVCBpbiBOQ0ciID0gc3BvdXNlX2NnX09UdlBMIC0gc3BvdXNlX25jZ19PVHZQTCkpCmNvbnRyYXN0KG0zYl9yZWYsIG1ldGhvZCA9IGxpc3QoIkVmZmVjdCBvZiBPVCBvbiBsaXZpbmcgbG92ZWQgb25lIFJUIGluIENHID4gZWZmZWN0IG9mIE9UIG9uIGxpdmluZyBsb3ZlZCBvbmUgUlQgaW4gTkNHIiA9IGxpdmluZ19jZ19PVHZQTCAtIGxpdmluZ19uY2dfT1R2UEwpKQpjb250cmFzdChtM2JfcmVmLCBtZXRob2QgPSBsaXN0KCJFZmZlY3Qgb2YgT1Qgb24gZ2VuZXJpYyBkZWF0aCBSVCBpbiBDRyA+IGVmZmVjdCBvZiBPVCBvbiBnZW5lcmljIGRlYXRoIFJUIGluIE5DRyIgPSBkZWF0aF9jZ19PVHZQTCAtIGRlYXRoX25jZ19PVHZQTCkpCmNvbnRyYXN0KG0zYl9yZWYsIG1ldGhvZCA9IGxpc3QoIkVmZmVjdCBvZiBPVCBvbiBzdHJhbmdlciBSVCBpbiBDRyA+IGVmZmVjdCBvZiBPVCBvbiBzdHJhbmdlciBSVCBpbiBOQ0ciID0gc3RyYW5nZXJfY2dfT1R2UEwgLSBzdHJhbmdlcl9uY2dfT1R2UEwpKQoKY29udHJhc3QobTNjX3JlZiwgbWV0aG9kID0gbGlzdCgiRWZmZWN0IG9mIE9UIG9uIHNwb3VzZSBiaWFzIGluIENHID4gZWZmZWN0IG9mIE9UIG9uIHNwb3VzZSBiaWFzIGluIE5DRyIgPSBzcG91c2VfY2dfT1R2UEwgLSBzcG91c2VfbmNnX09UdlBMKSkKY29udHJhc3QobTNjX3JlZiwgbWV0aG9kID0gbGlzdCgiRWZmZWN0IG9mIE9UIG9uIGxpdmluZyBsb3ZlZCBvbmUgYmlhcyBpbiBDRyA+IGVmZmVjdCBvZiBPVCBvbiBsaXZpbmcgbG92ZWQgb25lIGJpYXMgaW4gTkNHIiA9IGxpdmluZ19jZ19PVHZQTCAtIGxpdmluZ19uY2dfT1R2UEwpKQpjb250cmFzdChtM2NfcmVmLCBtZXRob2QgPSBsaXN0KCJFZmZlY3Qgb2YgT1Qgb24gZ2VuZXJpYyBkZWF0aCBiaWFzIGluIENHID4gZWZmZWN0IG9mIE9UIG9uIGdlbmVyaWMgZGVhdGggYmlhcyBpbiBOQ0ciID0gZGVhdGhfY2dfT1R2UEwgLSBkZWF0aF9uY2dfT1R2UEwpKQpjb250cmFzdChtM2NfcmVmLCBtZXRob2QgPSBsaXN0KCJFZmZlY3Qgb2YgT1Qgb24gc3RyYW5nZXIgYmlhcyBpbiBDRyA+IGVmZmVjdCBvZiBPVCBvbiBzdHJhbmdlciBiaWFzIGluIE5DRyIgPSBzdHJhbmdlcl9jZ19PVHZQTCAtIHN0cmFuZ2VyX25jZ19PVHZQTCkpCgpjb250cmFzdChtM2RfcmVmLCBtZXRob2QgPSBsaXN0KCJFZmZlY3Qgb2YgT1Qgb24gc3BvdXNlIGJpYXMgaW4gQ0cgPiBlZmZlY3Qgb2YgT1Qgb24gc3BvdXNlIGJpYXMgaW4gTkNHIiA9IHNwb3VzZV9jZ19PVHZQTCAtIHNwb3VzZV9uY2dfT1R2UEwpKQpjb250cmFzdChtM2RfcmVmLCBtZXRob2QgPSBsaXN0KCJFZmZlY3Qgb2YgT1Qgb24gbGl2aW5nIGxvdmVkIG9uZSBiaWFzIGluIENHID4gZWZmZWN0IG9mIE9UIG9uIGxpdmluZyBsb3ZlZCBvbmUgYmlhcyBpbiBOQ0ciID0gbGl2aW5nX2NnX09UdlBMIC0gbGl2aW5nX25jZ19PVHZQTCkpCmNvbnRyYXN0KG0zZF9yZWYsIG1ldGhvZCA9IGxpc3QoIkVmZmVjdCBvZiBPVCBvbiBnZW5lcmljIGRlYXRoIGJpYXMgaW4gQ0cgPiBlZmZlY3Qgb2YgT1Qgb24gZ2VuZXJpYyBkZWF0aCBiaWFzIGluIE5DRyIgPSBkZWF0aF9jZ19PVHZQTCAtIGRlYXRoX25jZ19PVHZQTCkpCmNvbnRyYXN0KG0zZF9yZWYsIG1ldGhvZCA9IGxpc3QoIkVmZmVjdCBvZiBPVCBvbiBzdHJhbmdlciBiaWFzIGluIENHID4gZWZmZWN0IG9mIE9UIG9uIHN0cmFuZ2VyIGJpYXMgaW4gTkNHIiA9IHN0cmFuZ2VyX2NnX09UdlBMIC0gc3RyYW5nZXJfbmNnX09UdlBMKSkKCgoKCgoKYzEgPC0gbGlzdCgKICBzcG91c2VfZGVhdGhfcGwgPSBjKDAsICMgbmV1dHJhbCAgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgLS41LCAjIGRlYXRoICAgIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgbGl2aW5nICAgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgLjUsICMgc3BvdXNlICAgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBzdHJhbmdlciBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIG5ldXRyYWwgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgLS41LCAjIGRlYXRoICAgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBsaXZpbmcgICBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIC41LCAjIHNwb3VzZSAgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBzdHJhbmdlciBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgbmV1dHJhbCAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgZGVhdGggICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgbGl2aW5nICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgc3BvdXNlICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgc3RyYW5nZXIgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgbmV1dHJhbCAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBkZWF0aCAgICBDRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIGxpdmluZyAgIENHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgc3BvdXNlICAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCksICMgc3RyYW5nZXIgQ0cgICBveHl0b2NpbgogIHNwb3VzZV9kZWF0aF9vdCA9IGMoMCwgIyBuZXV0cmFsICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIGRlYXRoICAgIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgbGl2aW5nICAgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBzcG91c2UgICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIHN0cmFuZ2VyIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgbmV1dHJhbCAgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIGRlYXRoICAgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBsaXZpbmcgICBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgc3BvdXNlICAgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIHN0cmFuZ2VyIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBuZXV0cmFsICBOQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgLS41LCAjIGRlYXRoICAgIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIGxpdmluZyAgIE5DRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAuNSwgIyBzcG91c2UgICBOQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBzdHJhbmdlciBOQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBuZXV0cmFsICBDRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAtLjUsICMgZGVhdGggICAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBsaXZpbmcgICBDRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAuNSwgIyBzcG91c2UgICBDRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwKSwgIyBzdHJhbmdlciBDRyAgIG94eXRvY2luCiAgc3BvdXNlX2RlYXRoX0NHID0gYygwLCAjIG5ldXRyYWwgIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgZGVhdGggICAgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBsaXZpbmcgICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIHNwb3VzZSAgIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgc3RyYW5nZXIgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBuZXV0cmFsICBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIC0uMjUsICMgZGVhdGggICAgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIGxpdmluZyAgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgLjI1LCAjIHNwb3VzZSAgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBzdHJhbmdlciBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgbmV1dHJhbCAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgZGVhdGggICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgbGl2aW5nICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgc3BvdXNlICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgc3RyYW5nZXIgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgbmV1dHJhbCAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgLS4yNSwgIyBkZWF0aCAgICBDRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIGxpdmluZyAgIENHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIC4yNSwgIyBzcG91c2UgICBDRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwKSwgIyBzdHJhbmdlciBDRyAgIG94eXRvY2luCiAgICBzcG91c2VfZGVhdGhfcGxfQ0cgPSBjKDAsICMgbmV1dHJhbCAgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBkZWF0aCAgICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIGxpdmluZyAgIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgc3BvdXNlICAgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBzdHJhbmdlciBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIG5ldXRyYWwgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgLS41LCAjIGRlYXRoICAgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBsaXZpbmcgICBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIC41LCAjIHNwb3VzZSAgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBzdHJhbmdlciBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgbmV1dHJhbCAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgZGVhdGggICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgbGl2aW5nICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgc3BvdXNlICAgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgc3RyYW5nZXIgTkNHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgbmV1dHJhbCAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBkZWF0aCAgICBDRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIGxpdmluZyAgIENHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgc3BvdXNlICAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCksICMgc3RyYW5nZXIgQ0cgICBveHl0b2NpbgogICAgICBOQ0dfQ0dfc3BvdXNlX3BsID0gYygwLCAjIG5ldXRyYWwgIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgZGVhdGggICAgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBsaXZpbmcgICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAxLCAjIHNwb3VzZSAgIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgc3RyYW5nZXIgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBuZXV0cmFsICBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgZGVhdGggICAgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIGxpdmluZyAgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgLTEsICMgc3BvdXNlICAgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIHN0cmFuZ2VyIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBuZXV0cmFsICBOQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBkZWF0aCAgICBOQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBsaXZpbmcgICBOQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBzcG91c2UgICBOQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBzdHJhbmdlciBOQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBuZXV0cmFsICBDRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIGRlYXRoICAgIENHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgbGl2aW5nICAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBzcG91c2UgICBDRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwKSwgIyBzdHJhbmdlciBDRyAgIG94eXRvY2luCiAgICAgICAgTkNHX0NHX3Nwb3VzZV9vdCA9IGMoMCwgIyBuZXV0cmFsICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIGRlYXRoICAgIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgbGl2aW5nICAgTkNHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBzcG91c2UgICBOQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIHN0cmFuZ2VyIE5DRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgbmV1dHJhbCAgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIGRlYXRoICAgIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBsaXZpbmcgICBDRyAgIHBsYWNlYm8KICAgICAgICAgICAgICAgICAgIDAsICMgc3BvdXNlICAgQ0cgICBwbGFjZWJvCiAgICAgICAgICAgICAgICAgICAwLCAjIHN0cmFuZ2VyIENHICAgcGxhY2VibwogICAgICAgICAgICAgICAgICAgMCwgIyBuZXV0cmFsICBOQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBkZWF0aCAgICBOQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBsaXZpbmcgICBOQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMSwgIyBzcG91c2UgICBOQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBzdHJhbmdlciBOQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCwgIyBuZXV0cmFsICBDRyAgIG94eXRvY2luCiAgICAgICAgICAgICAgICAgICAwLCAjIGRlYXRoICAgIENHICAgb3h5dG9jaW4KICAgICAgICAgICAgICAgICAgIDAsICMgbGl2aW5nICAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgLTEsICMgc3BvdXNlICAgQ0cgICBveHl0b2NpbgogICAgICAgICAgICAgICAgICAgMCkgIyBzdHJhbmdlciBDRyAgIG94eXRvY2luCikKCmBgYAoKCgojIyMjIFNvbWUganVuayBvbiBjdXN0b20gY29udHJhc3RzIGFuZCBlZmZlY3QgY29kaW5nLCBpZ25vcmUgdGhpcwpgYGB7fQpsaWJyYXJ5KG11bHRjb21wKQpsaWJyYXJ5KGNvbnRyYXN0KQpsaWJyYXJ5KHNqUGxvdCkKCkwzdnNMMiA8LSBjb250cmFzdChtMmIsCiAgICAgICAgIGEgPSBsaXN0KHN0aW11bHVzID0gbGV2ZWxzKGRhdGFfcGxhY2VibyRzdGltdWx1cyksIGRpcmVjdGlvbiA9ICJQVUxMIiksCiAgICAgICAgIGIgPSBsaXN0KHN0aW11bHVzID0gbGV2ZWxzKGRhdGFfcGxhY2VibyRzdGltdWx1cyksIGdyb3VwID0gIkNHIikpCkwzdnNMMgoKP2NvbnRyYXN0CgoKeHlwbG90KGRhdGFfcGxhY2VibyRnQUFUX1JUIH4gZGF0YV9wbGFjZWJvJGRpcmVjdGlvbiAqIGRhdGFfcGxhY2VibyRzdGltdWx1cywgCiAgICAgICAgY29sPWMoImdyZXk5MCIsImdyZXk0MCIpLCBsYXM9MiwgCiAgICAgICAgbWFpbj0idGVzdCIpCgpjb250ciA8LSBnbGh0KG0yYiwgbGluZmN0PW1jcChzdGltdWx1cz0iVHVrZXkiKSkKc3VtbWFyeShjb250cikKCmNvZWZzIDwtIGNvZWYobTJiKQogIyBkaWZmZXJlbmNlIGJldHdlZW4gcGFyYW1ldGVyIGVzdGltYXRlcyBmb3Igc3RpbXVsdXNkZWF0aDpkaXJlY3Rpb25QVVNIOmdyb3VwQ0cgYW5kIHN0aW11bHVzc3BvdXNlOmRpcmVjdGlvblBVU0g6Z3JvdXBDRwp1bmlxdWUoY29lZnNbMTldIC0gY29lZnNbMTddKSAjIHVzZSB1bmlxdWUoKSB0byBrZWVwIGl0IGZyb20gcmVwZWF0aW5nIDM5IHRpbWVzCiMgZGlmZmVyZW5jZSBiZXR3ZWVuIHBhcmFtZXRlciBlc3RpbWF0ZXMgZm9yIHN0aW11bHVzc3RyYW5nZXI6ZGlyZWN0aW9uUFVTSDpncm91cENHIGFuZCBzdGltdWx1c3Nwb3VzZTpkaXJlY3Rpb25QVVNIOmdyb3VwQ0cKdW5pcXVlKGNvZWZzWzE5XSAtIGNvZWZzWzIwXSkgIyB1c2UgdW5pcXVlKCkgdG8ga2VlcCBpdCBmcm9tIHJlcGVhdGluZyAzOSB0aW1lcyAKCiMgaHR0cHM6Ly9hb3NtaXRoLnJiaW5kLmlvLzIwMTkvMDQvMTUvY3VzdG9tLWNvbnRyYXN0cy1lbW1lYW5zLwpgYGAKCmBgYHtyfQojIGZvciBlZmZlY3QgY29kaW5nCmRhdGFfbG9uZyA8LSBkYXRhX2xvbmcgJT4lIG11dGF0ZShzcG91c2Vfdl9kZWF0aCA9IGlmZWxzZShzdGltdWx1cyA9PSAic3BvdXNlIiwgMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmZWxzZShzdGltdWx1cyA9PSAiZGVhdGgiLCAtMSwgMCkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwb3VzZV92X2xpdmluZyA9IGlmZWxzZShzdGltdWx1cyA9PSAic3BvdXNlIiwgMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmZWxzZShzdGltdWx1cyA9PSAibGl2aW5nIiwgLTEsIDApKSkpCgpkYXRhX2JpYXMgPC0gZGF0YV9iaWFzICU+JSBtdXRhdGUoc3BvdXNlX3ZfZGVhdGggPSBpZmVsc2Uoc3RpbXVsdXMgPT0gInNwb3VzZSIsIDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZmVsc2Uoc3RpbXVsdXMgPT0gImRlYXRoIiwgLTEsIDApKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcG91c2Vfdl9saXZpbmcgPSBpZmVsc2Uoc3RpbXVsdXMgPT0gInNwb3VzZSIsIDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZmVsc2Uoc3RpbXVsdXMgPT0gImxpdmluZyIsIC0xLCAwKSkpKQogICAgICAgIApkYXRhX3BsYWNlYm8gPC0gZGF0YV9wbGFjZWJvICU+JSBtdXRhdGUoc3BvdXNlX3ZfZGVhdGggPSBpZmVsc2Uoc3RpbXVsdXMgPT0gInNwb3VzZSIsIDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZmVsc2Uoc3RpbXVsdXMgPT0gImRlYXRoIiwgLTEsIDApKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcG91c2Vfdl9saXZpbmcgPSBpZmVsc2Uoc3RpbXVsdXMgPT0gInNwb3VzZSIsIDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZmVsc2Uoc3RpbXVsdXMgPT0gImxpdmluZyIsIC0xLCAwKSkpKQoKZGF0YV9iaWFzX3BsYWNlYm8gPC0gZGF0YV9iaWFzX3BsYWNlYm8gJT4lIG11dGF0ZShzcG91c2Vfdl9kZWF0aCA9IGlmZWxzZShzdGltdWx1cyA9PSAic3BvdXNlIiwgMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmZWxzZShzdGltdWx1cyA9PSAiZGVhdGgiLCAtMSwgMCkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwb3VzZV92X2xpdmluZyA9IGlmZWxzZShzdGltdWx1cyA9PSAic3BvdXNlIiwgMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmZWxzZShzdGltdWx1cyA9PSAibGl2aW5nIiwgLTEsIDApKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcG91c2UgPSBpZmVsc2Uoc3RpbXVsdXMgPT0gInNwb3VzZSIsIDEsIDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVhdGggPSBpZmVsc2Uoc3RpbXVsdXMgPT0gImRlYXRoIiwgMSwgMCkpCgpgYGAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgQXBwZW5kaXg6IERhdGEgY2xlYW5pbmcKVGhlIHNjcmlwdHMgYmVsb3cgZ2VuZXJhdGUgdGhlIGRhdGEgZmlsZXMgdXNlZCBpbiB0aGUgYW5hbHlzZXMgYWJvdmUuCgo8Yj5QcmUtUiBzdGVwczwvYj46CgoxLiBSZW1vdmVkIGFsbCAuaXFkYXQgZmlsZXMgdW5kZXIgMjVLQiBvciBzbyBpbiBvcmRlciB0byBmaWx0ZXIgb3V0IHBpbG90IGRhdGEgYW5kIGZhbHNlIHN0YXJ0cy48YnI+CjIuIFJlbW92ZWQgbm9uLXN0dWR5IGRhdGEgKGkuZS4sIHRlc3RzIGFuZCBPVCB1bmRlcmdyYWQgZmlsZXMpLiA8YnI+CjMuIE9yZ2FuaXplZCByYXcgLmlxZGF0IGZpbGVzIGZvciBlYWNoIHZpc2l0IGJ5IHJ1biAxL3J1biAyICh0d28gc2VwYXJhdGUgZm9sZGVycykgYmFzZWQgb24gZGF0ZS90aW1lIHN0YW1wLiA8cD4KPGk+SW4gVGVybWluYWwsIHdpdGhpbiBlYWNoIG9mIHRoZSBmb2xkZXJzIGluIHR1cm4uLi48L2k+PHA+CjQuIENoYW5nZWQgZmlsZSBleHRlbnNpb25zIHRvIC50c3YgKHRhYi1zZXBhcmF0ZWQpIGZyb20gLmlxZGF0OiBgZmluZCAuIC1pbmFtZSAiKi5pcWRhdCIgLWV4ZWMgYmFzaCAtYyAnbXYgIiQwIiAiJHswJVwuaXFkYXR9LnRzdiInIHt9IFw7YDxicj4KNS4gTWVyZ2VkIHRoZSBmaWxlczogYGNhdCAqLnRzdiA+IE9UX2dBQVRfcnVuLTEudHN2YCAob3IgYE9UX2dBQVRfcnVuLTIudHN2YCkKCjxpPk5vdGVzOjxicj4KPHVsPjxsaT5EMTE3OiBIYWQgMyB2aXNpdHMgZHVlIHRvIHNjYW5uZXIgdGVjaG5pY2FsIGlzc3Vlcy4gVXNlICJfYiIgYW5kICJfYyIgYXMgdmlzaXQgMSBhbmQgdmlzaXQgMiByZXNwZWN0aXZlbHkuPC9saT4KPGxpPkQxMTQ6IEhhcyBtdWx0aXBsZSBmaWxlcyBmcm9tIHZpc2l0IDIuIFVzZSB0aGUgbGFzdCB0d28uPC9saT4KPGxpPkQxMzU6IFVzZSBmaWxlcyBmcm9tIDYvMDYvMTYgYW5kIDYvMTcvMTggKHNjYW5uZXIgaXNzdWVzIG9uIDA2LzEzLzE2KS4gVXNlICJfYiIgYW5kICJfYyIgYXMgdmlzaXQgMSBhbmQgdmlzaXQgMiByZXNwZWN0aXZlbHkuPC9saT4KPGxpPkQxNDc6IFZpc2l0IDEgcnVuIDIgaXMgcGFydGlhbCBkYXRhIGZvciBzb21lIHJlYXNvbiAoSSBkbyBoYXZlIG5vdGVzIHRoYXQgc2hlIHN3aXRjaGVkIGJhY2sgdG8gPGk+UFVTSC1ZRUxMT1c8L2k+IGR1cmluZyBydW4gMiwgYnV0IGRpZCBub3QgcmUtcnVuIGJlY2F1c2UgcnVubmluZyB3YXkgb3ZlciB0aW1lLik8L2xpPjwvdWw+PC9pPgoKIyMgTG9uZyBkYXRhc2V0ICh0cmlhbC1sZXZlbCBSVHMpCiMjIyBJbXBvcnQgZGF0YQpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmZpbHRlciA8LSBkcGx5cjo6ZmlsdGVyCnNlbGVjdCA8LSBkcGx5cjo6c2VsZWN0CgojIHJlYWQgaW4gdGhlIGRhdGEgKG9ubHkgaW1wb3J0aW5nIGEgc3Vic2V0IG9mIGNvbHVtbnMpCnJhd19yMSA8LSBhc19kYXRhX2ZyYW1lKHJlYWRfdHN2KCJ+L0Ryb3Bib3gvR0xBU1MgTGFiL09UIFN0dWR5L2RhdGEvcmF3LWRhdGEvT1QtZ0FBVC1iZWhhdmlvcmFsLWRhdGEvUnVuMV90c3YvT1RfZ0FBVF9ydW4tMS50c3YiLCBjb2xfdHlwZXM9Y29sc19vbmx5KAogIGRhdGUgPSBjb2xfaW50ZWdlcigpLAogIHRpbWUgPSBjb2xfY2hhcmFjdGVyKCksCiAgc3ViamVjdCA9IGNvbF9jaGFyYWN0ZXIoKSwKICBibG9ja2NvZGUgPSBjb2xfY2hhcmFjdGVyKCksCiAgYmxvY2tudW0gPSBjb2xfY2hhcmFjdGVyKCksCiAgdHJpYWxjb2RlID0gY29sX2NoYXJhY3RlcigpLAogIHZhbHVlcy50cmlhbGNvZGUgPSBjb2xfY2hhcmFjdGVyKCksCiAgdmFsdWVzLnN0aW11bHVzID0gY29sX2NoYXJhY3RlcigpLAogIHZhbHVlcy5pbml0aWFscmVzcG9uc2UgPSBjb2xfY2hhcmFjdGVyKCksCiAgdmFsdWVzLlJUID0gY29sX251bWJlcigpCikpKQoKcmF3X3IyIDwtIGFzX3RpYmJsZShyZWFkX3Rzdigifi9Ecm9wYm94L0dMQVNTIExhYi9PVCBTdHVkeS9kYXRhL3Jhdy1kYXRhL09ULWdBQVQtYmVoYXZpb3JhbC1kYXRhL1J1bjJfdHN2L09UX2dBQVRfcnVuLTIudHN2IiwgY29sX3R5cGVzPWNvbHNfb25seSgKICBkYXRlID0gY29sX2ludGVnZXIoKSwKICB0aW1lID0gY29sX2NoYXJhY3RlcigpLAogIHN1YmplY3QgPSBjb2xfY2hhcmFjdGVyKCksCiAgYmxvY2tjb2RlID0gY29sX2NoYXJhY3RlcigpLAogIGJsb2NrbnVtID0gY29sX2NoYXJhY3RlcigpLAogIHRyaWFsY29kZSA9IGNvbF9jaGFyYWN0ZXIoKSwKICB2YWx1ZXMudHJpYWxjb2RlID0gY29sX2NoYXJhY3RlcigpLAogIHZhbHVlcy5zdGltdWx1cyA9IGNvbF9jaGFyYWN0ZXIoKSwKICB2YWx1ZXMuaW5pdGlhbHJlc3BvbnNlID0gY29sX2NoYXJhY3RlcigpLAogIHZhbHVlcy5SVCA9IGNvbF9udW1iZXIoKQopKSkKCiMgaGVhZGVyIGxpbmUgcmVwZWF0cyB3aGVuIEkgdXNlZCBgY2F0YCB0byBtZXJnZSwgc28gZ2V0IHRob3NlIG91dCBvZiB0aGVyZQpyYXdfcjEgPC0gcmF3X3IxICU+JSBmaWx0ZXIoIWlzLm5hKGRhdGUpKQpyYXdfcjIgPC0gcmF3X3IyICU+JSBmaWx0ZXIoIWlzLm5hKGRhdGUpKQoKdW5pcXVlKHJhd19yMSRzdWJqZWN0KQojIEQxMTggaXMgc2hvd2luZyB1cCBhcyAidGVzdCIgZm9yIHNvbWUgcmVhc29uIChjaGVja2VkIGFnYWluc3QgdGhlIC5pcWRhdCBmaWxlKSwgYW5kIEQxMzBfYiBpcyBtaXNzaW5nCiMgYm90aCBvZiBEMTMwJ3MgYW5kIEQxNDIncyB2aXNpdHMgd2VyZSBlbnRlcmVkIGFzICJEMTMwIi8iRDE0MiIsIHNvIGNoYW5nZSB0aGUgc3ViamVjdCBJRCBmb3IgdGhlIHZpc2l0IG9uIDA1MjQxNiB0byBEMTMwX2IgYW5kIG9uIApyYXdfcjEkc3ViamVjdFtyYXdfcjEkZGF0ZSA9PSAwMjA5MTZdIDwtICJEMTE4IgpyYXdfcjEkc3ViamVjdFtyYXdfcjEkZGF0ZSA9PSAwNTI0MTZdIDwtICJEMTMwX2IiCnJhd19yMSRzdWJqZWN0W3Jhd19yMSRkYXRlID09IDExMTUxNl0gPC0gIkQxNDJfYiIKCiMgZml4aW5nIHNvbWUgb3RoZXIgc3R1ZmYgaW4gYSBzaW1pbGFyIHZlaW4KcmF3X3IxJHN1YmplY3RbcmF3X3IxJHN1YmplY3QgPT0gIkQxMDFfMiJdIDwtICJEMTAxX2IiCnJhd19yMSRzdWJqZWN0W3Jhd19yMSRzdWJqZWN0ID09ICJEMTAyX0IiXSA8LSAiRDEwMl9iIgpyYXdfcjEkc3ViamVjdFtyYXdfcjEkc3ViamVjdCA9PSAiRDExN19iIl0gPC0gIkQxMTciCnJhd19yMSRzdWJqZWN0W3Jhd19yMSRzdWJqZWN0ID09ICJEMTE3X2MiXSA8LSAiRDExN19iIgpyYXdfcjEkc3ViamVjdFtyYXdfcjEkc3ViamVjdCA9PSAiRDEzNV9jIl0gPC0gIkQxMzVfYiIKCmxlbmd0aCh1bmlxdWUocmF3X3IxJHN1YmplY3QpKSAjIDc4IHVuaXF1ZSAtIHRoYXQgaXMgY29ycmVjdAoKdW5pcXVlKHJhd19yMiRzdWJqZWN0KQojIHNvbWUgc2ltaWxhciBpc3N1ZXMgdG8gZml4CnJhd19yMiRzdWJqZWN0W3Jhd19yMiRzdWJqZWN0ID09ICJEMTAxXzJZIl0gPC0gIkQxMDFfYiIKcmF3X3IyJHN1YmplY3RbcmF3X3IyJHN1YmplY3QgPT0gIkQxMDJfQiJdIDwtICJEMTAyX2IiCnJhd19yMiRzdWJqZWN0W3Jhd19yMiRzdWJqZWN0ID09ICJEMTA3X0JfMiJdIDwtICJEMTA3X2IiCnJhd19yMiRzdWJqZWN0W3Jhd19yMiRzdWJqZWN0ID09ICJEMTE3X2IiXSA8LSAiRDExNyIKcmF3X3IyJHN1YmplY3RbcmF3X3IyJHN1YmplY3QgPT0gIkQxMTdfYyJdIDwtICJEMTE3X2IiCnJhd19yMiRzdWJqZWN0W3Jhd19yMiRzdWJqZWN0ID09ICJEMTI2X0IiXSA8LSAiRDEyNl9iIgpyYXdfcjIkc3ViamVjdFtyYXdfcjIkc3ViamVjdCA9PSAiRDEzNV9jIl0gPC0gIkQxMzVfYiIKcmF3X3IyJHN1YmplY3RbcmF3X3IyJGRhdGUgPT0gMTExNTE2XSA8LSAiRDE0Ml9iIgoKbGVuZ3RoKHVuaXF1ZShyYXdfcjIkc3ViamVjdCkpICMgNzggdW5pcXVlIC0gdGhhdCBpcyBjb3JyZWN0CgpzdHIocmF3X3IxKQpzdHIocmF3X3IyKQpgYGAKCmBgYHtyfQojIHRha2Ugb3V0IElUSXMKdW5pcXVlKHJhd19yMSR0cmlhbGNvZGUpCm1sbV9yMSA8LSBmaWx0ZXIocmF3X3IxLCBncmVwbCgiXkEiLHRyaWFsY29kZSkpCnVuaXF1ZShtbG1fcjEkdHJpYWxjb2RlKQoKdW5pcXVlKHJhd19yMiR0cmlhbGNvZGUpCm1sbV9yMiA8LSBmaWx0ZXIocmF3X3IyLCBncmVwbCgiXkEiLHRyaWFsY29kZSkpCnVuaXF1ZShtbG1fcjIkdHJpYWxjb2RlKQoKIyBhZGQgYSAidHJpYWxudW0iIHZhcmlhYmxlLCBncm91cGVkIGJ5IElECm1sbV9yMSA8LSBtbG1fcjEgJT4lIGdyb3VwX2J5KHN1YmplY3QpICU+JSBtdXRhdGUodHJpYWxudW0gPSByb3dfbnVtYmVyKCkpClZpZXcobWxtX3IxKQptbG1fcjIgPC0gbWxtX3IyICU+JSBncm91cF9ieShzdWJqZWN0KSAlPiUgbXV0YXRlKHRyaWFsbnVtID0gcm93X251bWJlcigpKQpWaWV3KG1sbV9yMikKCm1sbV9yMSAlPiUgZ3JvdXBfYnkoc3ViamVjdCkgJT4lIGNvdW50KCkgIyBldmVyeW9uZSBoYXMgMTQ0IHRyaWFscwptbG1fcjIgJT4lIGdyb3VwX2J5KHN1YmplY3QpICU+JSBjb3VudCgpICMgZXZlcnlvbmUgaGFzIDE0NCB0cmlhbHMsIGV4Y2VwdCBEMTIyX2IgaGFzIDE3NwojIG5vIGNsdWUgd2h5IHRoYXQgaGFwcGVuZWQsIGFsdGhvdWdoIEkgZG8gdmFndWVseSByZW1lbWJlciB3ZSBoYWQgb25lIHNlc3Npb24gd2hlcmUgdGhlIHRhc2sgc2VlbWVkIHRvIGdvIG9uIGFuZCBvbiBhbmQgd2UgZm9yY2UgcXVpdCBpdD8KCiMgcmVtb3ZlIHRyaWFscyAxNDUtMTc3IGZvciBEMTIyX2I6Cm1sbV9yMiA8LSBmaWx0ZXIobWxtX3IyLCB0cmlhbG51bSA8PTE0NCkKbWxtX3IyICU+JSBncm91cF9ieShzdWJqZWN0KSAlPiUgY291bnQoKQojIG5vdyBldmVyeW9uZSBoYXMgMTQ0IHRyaWFscwoKIyBhZGQgYSBjb2x1bW4gZm9yICJydW4iCm1sbV9yMSRydW4gPC0gIjEiCm1sbV9yMiRydW4gPC0gIjIiCgojIGFkZCBhIGNvbHVtbiBmb3IgInZpc2l0IgptbG1fcjEkdmlzaXQgPC0gYXMuZmFjdG9yKGlmZWxzZShncmVwbCgiKl9iIiwgbWxtX3IxJHN1YmplY3QpLCAiMiIsICIxIikpCm1sbV9yMiR2aXNpdCA8LSBhcy5mYWN0b3IoaWZlbHNlKGdyZXBsKCIqX2IiLCBtbG1fcjIkc3ViamVjdCksICIyIiwgIjEiKSkKCm1sbV9yMSAlPiUgZ3JvdXBfYnkoc3ViamVjdCwgdmlzaXQsIHJ1bikgJT4lIGNvdW50KCkgIyBhbGwgbG9va3MgZ29vZDogZXZlcnlvbmUgaGFzIDE0NCB0cmlhbHMgZm9yIGVhY2ggcnVuIGF0IGVhY2ggdmlzaXQKbWxtX3IyICU+JSBncm91cF9ieShzdWJqZWN0LCB2aXNpdCwgcnVuKSAlPiUgY291bnQoKSAjIGFsbCBsb29rcyBnb29kOiBldmVyeW9uZSBoYXMgMTQ0IHRyaWFscyBmb3IgZWFjaCBydW4gYXQgZWFjaCB2aXNpdAoKIyBub3cgcmVtb3ZlIHRoZSAiX2IiIGZyb20gdmlzaXQgMiBJRHMKbWxtX3IxIDwtIG1sbV9yMSAlPiUgdW5ncm91cCgpICU+JQogIG11dGF0ZShzdWJqZWN0ID0gc3RyX3JlcGxhY2Uoc3ViamVjdCwgIl9iIiwgIiIpKQp1bmlxdWUobWxtX3IxJHN1YmplY3QpCgptbG1fcjIgPC0gbWxtX3IyICU+JSB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKHN1YmplY3QgPSBzdHJfcmVwbGFjZShzdWJqZWN0LCAiX2IiLCAiIikpCnVuaXF1ZShtbG1fcjIkc3ViamVjdCkKCiMgbWVyZ2UgZGF0YSBmcm9tIHRoZSAyIHJ1bnMgCmJ4IDwtIGJpbmRfcm93cyhtbG1fcjEsIG1sbV9yMikKCiMgc3BsaXQgdXAgYnkgdmlzaXQKYnhfdjEgPC0gYnggJT4lIGZpbHRlcih2aXNpdCA9PSAiMSIpCmJ4X3YyIDwtIGJ4ICU+JSBmaWx0ZXIodmlzaXQgPT0gIjIiKQoKYnhfdjEgJT4lIGdyb3VwX2J5KHN1YmplY3QsIHJ1bikgJT4lIGNvdW50KCkgIyBldmVyeW9uZSBoYXMgMTQ0IHRyaWFscyBmb3IgZWFjaCBydW4gYXQgdmlzaXQgMQpieF92MiAlPiUgZ3JvdXBfYnkoc3ViamVjdCwgcnVuKSAlPiUgY291bnQoKSAjIGV2ZXJ5b25lIGhhcyAxNDQgdHJpYWxzIGZvciBlYWNoIHJ1biBhdCB2aXNpdCAyCmBgYAoKYGBge3J9CiMgYWRkIGNvbHVtbnMgZm9yICJjb25kIiBhdCB2aXNpdCAxIGFuZCB2aXNpdCAyIFtjb25kaXRpb246IEEvcGxhY2VibyBvciBCL294eXRvY2luXQojIGxvYWQgaW4gdGhlIHJhbmRvbWl6YXRpb24gZGF0YQpyYW5kb21pemUgPC0gcmVhZFJEUygifi9Ecm9wYm94L0dMQVNTIExhYi9PVCBTdHVkeS9kYXRhL2NsZWFuZWQtZGF0YS9yYW5kb21pemF0aW9uLnJkcyIpCnN0cihyYW5kb21pemUpCgpieF92MSA8LSBieF92MSAlPiUKICByZW5hbWUoIklEIiA9IHN1YmplY3QpCgpieF92MiA8LSBieF92MiAlPiUKICByZW5hbWUoIklEIiA9IHN1YmplY3QpCgojIGdldCB0aGUgSURzIGZvciBldmVyeW9uZSB3aG8gZ290IHRyZWF0bWVudCBBIGF0IHZpc2l0IDEgCklEc192MV90eEEgPC0gcmFuZG9taXplICU+JSBmaWx0ZXIodHhfdjEgPT0gIkEiKSAKdHhBX2xpc3QgPC0gSURzX3YxX3R4QSRJRAp0eEFfbGlzdAoKIyBpZmVsc2Ugc3RhdGVtZW50OiBpZiBJRCA9IGFueSBvZiB0aG9zZSBsaXN0ZWQgaW4gdHhBX2xpc3QsIG1ha2UgY29uZF92MSA9ICJBIiwgZWxzZSBtYWtlIGl0ICJCIgpieF92MSA8LSBieF92MSAlPiUKICBtdXRhdGUoY29uZF92MSA9IGFzLmZhY3RvcihpZmVsc2UoSUQgPT0gIkQxMDEiIHwgSUQgPT0gIkQxMDUiIHwgSUQgPT0gIkQxMDkiIHwgSUQgPT0gIkQxMTAiIHwgSUQgPT0gIkQxMTQiIHwgSUQgPT0gIkQxMTUiIHwgSUQgPT0gIkQxMTYiIHwgSUQgPT0gIkQxMTgiIHwgSUQgPT0gIkQxMTkiIHwgSUQgPT0gIkQxMjAiIHwgSUQgPT0gIkQxMjMiIHwgSUQgPT0gIkQxMjQiIHwgSUQgPT0gIkQxMjYiIHwgSUQgPT0gIkQxMjgiIHwgSUQgPT0gIkQxMzIiIHwgSUQgPT0gIkQxMzUiIHwgSUQgPT0gIkQxMzYiIHwgSUQgPT0gIkQxMzciIHwgSUQgPT0gIkQxMzgiIHwgSUQgPT0gIkQxNDAiIHwgSUQgPT0gIkQxNDEiIHwgSUQgPT0gIkQxNDUiIHwgSUQgPT0gIkQxNDgiIHwgSUQgPT0gIkQxNDkiIHwgSUQgPT0gIkQxMTciLCAiQSIsICJCIikpLCBjb25kX3YyID0gYXMuZmFjdG9yKGlmZWxzZShJRCA9PSAiRDEwMSIgfCBJRCA9PSAiRDEwNSIgfCBJRCA9PSAiRDEwOSIgfCBJRCA9PSAiRDExMCIgfCBJRCA9PSAiRDExNCIgfCBJRCA9PSAiRDExNSIgfCBJRCA9PSAiRDExNiIgfCBJRCA9PSAiRDExOCIgfCBJRCA9PSAiRDExOSIgfCBJRCA9PSAiRDEyMCIgfCBJRCA9PSAiRDEyMyIgfCBJRCA9PSAiRDEyNCIgfCBJRCA9PSAiRDEyNiIgfCBJRCA9PSAiRDEyOCIgfCBJRCA9PSAiRDEzMiIgfCBJRCA9PSAiRDEzNSIgfCBJRCA9PSAiRDEzNiIgfCBJRCA9PSAiRDEzNyIgfCBJRCA9PSAiRDEzOCIgfCBJRCA9PSAiRDE0MCIgfCBJRCA9PSAiRDE0MSIgfCBJRCA9PSAiRDE0NSIgfCBJRCA9PSAiRDE0OCIgfCBJRCA9PSAiRDE0OSIgfCBJRCA9PSAiRDExNyIsICJCIiwgIkEiKSkpCgojIGlmZWxzZSBzdGF0ZW1lbnQ6IGlmIElEID0gYW55IG9mIHRob3NlIGxpc3RlZCBpbiB0eEFfbGlzdCwgbWFrZSBjb25kX3YyID0gIkIiLCBlbHNlIG1ha2UgaXQgIkEiIChwZW9wbGUgd2hvIHdlcmUgQSBhdCB2aXNpdCAxIHNob3VsZCBiZSBCIGZvciB2aXNpdCAyLCBhbmQgdmljZSB2ZXJzYSkKYnhfdjIgPC0gYnhfdjIgJT4lCiAgbXV0YXRlKGNvbmRfdjIgPSBhcy5mYWN0b3IoaWZlbHNlKElEID09ICJEMTAxIiB8IElEID09ICJEMTA1IiB8IElEID09ICJEMTA5IiB8IElEID09ICJEMTEwIiB8IElEID09ICJEMTE0IiB8IElEID09ICJEMTE1IiB8IElEID09ICJEMTE2IiB8IElEID09ICJEMTE4IiB8IElEID09ICJEMTE5IiB8IElEID09ICJEMTIwIiB8IElEID09ICJEMTIzIiB8IElEID09ICJEMTI0IiB8IElEID09ICJEMTI2IiB8IElEID09ICJEMTI4IiB8IElEID09ICJEMTMyIiB8IElEID09ICJEMTM1IiB8IElEID09ICJEMTM2IiB8IElEID09ICJEMTM3IiB8IElEID09ICJEMTM4IiB8IElEID09ICJEMTQwIiB8IElEID09ICJEMTQxIiB8IElEID09ICJEMTQ1IiB8IElEID09ICJEMTQ4IiB8IElEID09ICJEMTQ5IiB8IElEID09ICJEMTE3IiwgIkIiLCAiQSIpKSwgY29uZF92MSA9IGFzLmZhY3RvcihpZmVsc2UoSUQgPT0gIkQxMDEiIHwgSUQgPT0gIkQxMDUiIHwgSUQgPT0gIkQxMDkiIHwgSUQgPT0gIkQxMTAiIHwgSUQgPT0gIkQxMTQiIHwgSUQgPT0gIkQxMTUiIHwgSUQgPT0gIkQxMTYiIHwgSUQgPT0gIkQxMTgiIHwgSUQgPT0gIkQxMTkiIHwgSUQgPT0gIkQxMjAiIHwgSUQgPT0gIkQxMjMiIHwgSUQgPT0gIkQxMjQiIHwgSUQgPT0gIkQxMjYiIHwgSUQgPT0gIkQxMjgiIHwgSUQgPT0gIkQxMzIiIHwgSUQgPT0gIkQxMzUiIHwgSUQgPT0gIkQxMzYiIHwgSUQgPT0gIkQxMzciIHwgSUQgPT0gIkQxMzgiIHwgSUQgPT0gIkQxNDAiIHwgSUQgPT0gIkQxNDEiIHwgSUQgPT0gIkQxNDUiIHwgSUQgPT0gIkQxNDgiIHwgSUQgPT0gIkQxNDkiIHwgSUQgPT0gIkQxMTciLCAiQSIsICJCIikpKQoKbGV2ZWxzKGJ4X3YxJGNvbmRfdjEpCmxldmVscyhieF92MiRjb25kX3YyKQoKaGVhZChieF92MSkKCnR4QV9saXN0CmJ4X3YxICU+JSBncm91cF9ieShjb25kX3YxKSAlPiUgY291bnQoSUQpICMgSURzIGFuZCBjb25kIG1hdGNoIHR4QV9saXN0ICpub3RlIHRoYXQgc29tZSBJRHMgZnJvbSB0aGUgcmFuZG9taXphdGlvbiBkYXRhc2V0IGFyZSBsaXN0ZWQgaW4gdHhBIGJ1dCBub3QgaW4gdGhlIGJlaGF2aW9yYWwgZGF0YS4gVGhpcyBpcyBiZWNhdXNlIHNvbWUgcGFydGljaXBhbnRzIHdlcmUgZHJvcHBlZCBvciBuZXZlciBlbmRlZCB1cCBjb21wbGV0aW5nIHRoZWlyIGV4cGVyaW1lbnRhbCBzZXNzaW9uOiBEMTA5IChkcm9wcGVkIGFmdGVyIDFzdCBzZXNzaW9uKSwgRDExNiBhbmQgRDEzNiAobmV2ZXIgZW5yb2xsZWQpLCBEMTI0IChpbmNpZGVudGFsIGZpbmRpbmcsIGV4Y2x1ZGVkIGFmdGVyIFQxTVBSQUdFKS4KYnhfdjIgJT4lIGdyb3VwX2J5KGNvbmRfdjIpICU+JSBjb3VudChJRCkgIyBJRHMgYW5kIGNvbmQgbWF0Y2ggdHhBX2xpc3QKCmJ4X2xvbmcgPC0gYmluZF9yb3dzKGJ4X3YxLGJ4X3YyKQpWaWV3KGJ4X2xvbmcpCmBgYAoKYGBge3J9CiMgcmVuYW1lIHNvbWUgdmFyaWFibGVzCmNvbG5hbWVzKGJ4X2xvbmcpCmJ4X2xvbmcgPC0gYnhfbG9uZyAlPiUgcmVuYW1lKCJwdXNoX3B1bGwiID0gdmFsdWVzLmluaXRpYWxyZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdBQVRfUlQiID0gdmFsdWVzLlJUKQpoZWFkKGJ4X2xvbmcpCgojIGFkZCBhIG5ldyB2YXJpYWJsZSBmb3IgY29uZGl0aW9uCmJ4X2xvbmcgPC0gYnhfbG9uZyAlPiUgbXV0YXRlKGNvbmQgPSBhcy5mYWN0b3IoaWZlbHNlKGNvbmRfdjEgPT0gIkEiICYgdmlzaXQgPT0gIjEiLCAiQSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShjb25kX3YyID09ICJBIiAmIHZpc2l0ID09ICIyIiwgIkEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGNvbmRfdjEgPT0gIkIiICYgdmlzaXQgPT0gIjEiLCAiQiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGNvbmRfdjIgPT0gIkIiICYgdmlzaXQgPT0gIjIiLCAiQiIsIE5BKSkpKSkpCgpWaWV3KGJ4X2xvbmcpICMgY2hlY2sgdGhhdCBpdCBjb2RlZCB0aGUgImNvbmQiIGNvbHVtbiBjb3JyZWN0bHkgICAgICAKCiMgYWRkIGEgbmV3IHZhcmlhYmxlIGZvciBzdGltdWx1cyBjYXRlZ29yeQojIGluIHZhbHVlcy5zdGltdWx1czoKIyAxID0gc3BvdXNlLCAyID0gbGl2aW5nIGxvdmVkIG9uZS9XSE9UTywgMyA9IHN0cmFuZ2VyLCA0ID0gbm9tb3RoZXRpYyBkZWF0aC1yZWxhdGVkLCA1ID0gbmV1dHJhbCBpbWFnZXMKCnNvcnQodW5pcXVlKGJ4X2xvbmckdmFsdWVzLnN0aW11bHVzKSkKCmJ4X2xvbmcgPC0gYnhfbG9uZyAlPiUKICBtdXRhdGUoc3RpbSA9IGFzLmZhY3RvcihpZmVsc2UodmFsdWVzLnN0aW11bHVzID09ICIxQl8xLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIxQl8yLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIxQl8zLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIxWV8xLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIxWV8yLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIxWV8zLmpwZyIsICJzcG91c2UiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHZhbHVlcy5zdGltdWx1cyA9PSAiMkJfMS5qcGcifHZhbHVlcy5zdGltdWx1cyA9PSAiMkJfMi5qcGcifHZhbHVlcy5zdGltdWx1cyA9PSAiMkJfMy5qcGcifHZhbHVlcy5zdGltdWx1cyA9PSAiMllfMS5qcGcifHZhbHVlcy5zdGltdWx1cyA9PSAiMllfMi5qcGcifHZhbHVlcy5zdGltdWx1cyA9PSAiMllfMy5qcGciLCAibGl2aW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh2YWx1ZXMuc3RpbXVsdXMgPT0gIjNCXzEuanBnInx2YWx1ZXMuc3RpbXVsdXMgPT0gIjNCXzIuanBnInx2YWx1ZXMuc3RpbXVsdXMgPT0gIjNCXzMuanBnInx2YWx1ZXMuc3RpbXVsdXMgPT0gIjNZXzEuanBnInx2YWx1ZXMuc3RpbXVsdXMgPT0gIjNZXzIuanBnInx2YWx1ZXMuc3RpbXVsdXMgPT0gIjNZXzMuanBnIiwgInN0cmFuZ2VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodmFsdWVzLnN0aW11bHVzID09ICI0Ql8xLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICI0Ql8yLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICI0Ql8zLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICI0WV8xLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICI0WV8yLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICI0WV8zLmpwZyIsICJkZWF0aCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh2YWx1ZXMuc3RpbXVsdXMgPT0gIjVCXzEuanBnInx2YWx1ZXMuc3RpbXVsdXMgPT0gIjVCXzIuanBnInx2YWx1ZXMuc3RpbXVsdXMgPT0gIjVCXzMuanBnInx2YWx1ZXMuc3RpbXVsdXMgPT0gIjVZXzEuanBnInx2YWx1ZXMuc3RpbXVsdXMgPT0gIjVZXzIuanBnInx2YWx1ZXMuc3RpbXVsdXMgPT0gIjVZXzMuanBnIiwgIm5ldXRyYWwiLCBOQSkpKSkpKSkKCmxldmVscyhieF9sb25nJHN0aW0pCmJ4X2xvbmckc3RpbSA8LSByZWxldmVsKGJ4X2xvbmckc3RpbSwgcmVmID0gIm5ldXRyYWwiKSAjIG1ha2UgbmV1dHJhbCB0aGUgcmVmZXJlbmNlIGxldmVsCgojIHNhdmUgaXQKc2F2ZVJEUyhieF9sb25nLCAifi9Ecm9wYm94L0dMQVNTIExhYi9PVCBnQUFUIGZvciBtZWV0aW5nIDUtMTAtMTkvYnhfbG9uZy5yZHMiKQpgYGAKCiMjIyBSZW1vdmUgb3V0bGllcnMKT3V0bGllciByZW1vdmFsIGZvbGxvd3MgY29udmVudGlvbnMgZnJvbSBvdGhlciBnQUFUIHBhcGVycywgd2hpY2ggZXhjbHVkZSB0cmlhbHMgd2l0aCBSVHMgdGhhdCBhcmUgZXF1YWwgdG8gb3IgYWJvdmUgdGhlIDk5dGggcGVyY2VudGlsZSAoY2FsY3VsYXRlZCBmcm9tIHRoZSBzYW1wbGUgYXMgYSB3aG9sZSkgb3IgZXF1YWwgdG8gb3IgYmVsb3cgMXN0IHBlcmNlbnRpbGUuIApgYGB7cn0KIyBjYWxjdWxhdGUgcGVyY2VudGlsZXMgc2VwYXJhdGVseSBmb3IgcGxhY2Viby9veHl0b2NpbiBjb25kaXRpb25zCmJ4X3BsIDwtIGJ4X2xvbmcgJT4lIGZpbHRlcihjb25kID09ICJBIikKYnhfb3QgPC0gYnhfbG9uZyAlPiUgZmlsdGVyKGNvbmQgPT0gIkIiKQpwOTlwbCA8LSBxdWFudGlsZShieF9wbCRnQUFUX1JULCAwLjk5KSAjIDE3MTYuNzYgbXMKcDAxcGwgPC0gcXVhbnRpbGUoYnhfcGwkZ0FBVF9SVCwgMC4wMSkgIyA0NjMgbXMKcDk5b3QgPC0gcXVhbnRpbGUoYnhfb3QkZ0FBVF9SVCwgMC45OSkgIyAxNzExLjA3IG1zCnAwMW90IDwtIHF1YW50aWxlKGJ4X290JGdBQVRfUlQsIDAuMDEpICMgNDczIG1zCgojIGlkZW50aWZ5IHBsYWNlYm8gY29uZGl0aW9uIG91dGxpZXJzCmJ4X3BsIDwtIGJ4X3BsICU+JQogIG11dGF0ZShvdXRsaWVyX1JUID0gaWZlbHNlKGdBQVRfUlQgPD0gcDAxcGwgfCBnQUFUX1JUID49IHA5OXBsLCAxLCAwKSkKdGFibGUoYnhfcGwkb3V0bGllcl9SVCkgCjIyNy8xMTAwNSAjIGFib3V0IDIlIG9mIHRyaWFscyBhcmUgb3V0bGllcnMKCiMgaWRlbnRpZnkgb3h5dG9jaW4gY29uZGl0aW9uIG91dGxpZXJzCmJ4X290IDwtIGJ4X290ICU+JQogIG11dGF0ZShvdXRsaWVyX1JUID0gaWZlbHNlKGdBQVRfUlQgPD0gcDAxb3QgfCBnQUFUX1JUID49IHA5OW90LCAxLCAwKSkKdGFibGUoYnhfb3Qkb3V0bGllcl9SVCkgCjIyOS8xMTAwMyAjIGFib3V0IDIlIG9mIHRyaWFscyBhcmUgb3V0bGllcnMKCmJ4X2xvbmdfbm9PdXQgPC0gYmluZF9yb3dzKGJ4X3BsLCBieF9vdCkgJT4lIGZpbHRlcihvdXRsaWVyX1JUID09IDApCgpkaW0oYnhfbG9uZykKZGltKGJ4X2xvbmdfbm9PdXQpICAjIGFmdGVyIG91dGxpZXJzIHJlbW92ZWQsIHRoZXJlIGFyZSAyMjAwOCB0cmlhbHMgdG90YWwgb2YgdGhlIG9yaWdpbmFsIDIyNDY0OiAyMjQ2NCAtICgyMjcrMjI5KSA9IDIyMDA4CgpzYXZlUkRTKGJ4X2xvbmdfbm9PdXQsICJ+L0Ryb3Bib3gvR0xBU1MgTGFiL09UIGdBQVQgZm9yIG1lZXRpbmcgNS0xMC0xOS9ieF9sb25nX25vT3V0LnJkcyIpCndyaXRlX2NzdihieF9sb25nX25vT3V0LCAifi9Ecm9wYm94L0dMQVNTIExhYi9PVCBnQUFUIGZvciBtZWV0aW5nIDUtMTAtMTkvYnhfbG9uZ19ub091dC5jc3YiKQpgYGAKCgojIyMgQ2hlY2sgZGF0YSBhbmQgZGlzdHJpYnV0aW9uCmBgYHtyfQpsaWJyYXJ5KHBzeWNoKQoKIyBob3cgbXVjaCBtaXNzaW5nIGRhdGEgaXMgdGhlcmU/Cm50cmlhbHMgPC0gYnhfbG9uZ19ub091dCAlPiUgZ3JvdXBfYnkoSUQsIGNvbmQpICU+JSBjb3VudCgpICMgZG9uJ3QgZ3JvdXAgYnkgcHVzaF9wdWxsIGJlY2F1c2UgcGVvcGxlZCBwdWxsZWQvcHVzaGVkIG9uIGRpZmZlcmVudCBudW1iZXJzIG9mIHRyaWFscywgZm9yIGV4LiByZXNwb25zZXMgaW4gdGhlIHdyb25nIGRpcmVjdGlvbgpkZXNjcmliZShudHJpYWxzJG4vMjg4KSAjIGV2ZXJ5b25lIGhhcyBhdCBsZWFzdCA5MCUgb2YgdGhlIDI4OCB0cmlhbHMgZXhwZWN0ZWQgYXQgZWFjaCB2aXNpdCAobm8gbW9yZSB0aGFuIDEwJSB0cmlhbHMgZHJvcHBlZCBiZWNhdXNlIG9mIG91dGxpZXJzIG9yIG1pc3NlZCByZXNwb25zZXMpCgpkZXNjcmliZShieF9sb25nX25vT3V0JGdBQVRfUlQpICMgc2tld25lc3MgaXMgMS4xNywga3VydG9zaXMgaXMgMS43Cmhpc3QoYnhfbG9uZ19ub091dCRnQUFUX1JUKSAjIGRpc3RyaWJ1dGlvbiBpcyBza2V3ZWQsIGFzIHVzdWFsIGZvciBSVCBkYXRhLi4uCnFxbm9ybShieF9sb25nX25vT3V0JGdBQVRfUlQpICMgYW5kIHNrZXduZXNzIGlzIHJlZmxlY3RlZCBpbiBRUSBwbG90CmBgYAoKIyMjIEJpYXMgc2NvcmVzIChiYXNlZCBvbiBtZWRpYW4gUlRzKQpgYGB7cn0KIyBjcmVhdGluZyBhIHdpZGUgZGF0YXNldCB3aXRoIHRoZSBiaWFzIHZhcmlhYmxlcywgd2hpY2ggd2lsbCB0aGVuIGJlIGNvbnZlcnRlZCBiYWNrIHRvIGEgbG9uZyBkYXRhc2V0CiMgVGhlIGFyZ3VtZW50cyB0byBzcHJlYWQoKToKIyAtIGRhdGE6IERhdGEgb2JqZWN0CiMgLSBrZXk6IE5hbWUgb2YgY29sdW1uIGNvbnRhaW5pbmcgdGhlIG5ldyBjb2x1bW4gbmFtZXMKIyAtIHZhbHVlOiBOYW1lIG9mIGNvbHVtbiBjb250YWluaW5nIHZhbHVlcwpkYXRhX3dpZGUgPC0gc3ByZWFkKGJ4X2xvbmdfbm9PdXQsIGtleT1zdGltLCB2YWx1ZT1nQUFUX1JUKQpjb2xuYW1lcyhkYXRhX3dpZGUpClZpZXcoZGF0YV93aWRlKQoKIyBzdWJzZXQgYnkgY29uZGl0aW9uIGFuZCBkaXJlY3Rpb24KZGF0YV9wdXNoQSA8LSBkYXRhX3dpZGUgJT4lIHNlbGVjdChJRCwgY29uZCwgcHVzaF9wdWxsLCB2aXNpdCwgbmV1dHJhbCwgZGVhdGgsIGxpdmluZywgc3BvdXNlLCBzdHJhbmdlcikgJT4lIGZpbHRlcihjb25kID09ICJBIiAmIHB1c2hfcHVsbCA9PSAiUFVTSCIpICU+JSBncm91cF9ieShJRCkgJT4lIG11dGF0ZShuZXV0cmFsQXB1c2ggPSBtZWRpYW4obmV1dHJhbCwgbmEucm0gPSBUUlVFKSwgZGVhdGhBcHVzaCA9IG1lZGlhbihkZWF0aCwgbmEucm0gPSBUUlVFKSwgc3BvdXNlQXB1c2ggPSBtZWRpYW4oc3BvdXNlLCBuYS5ybT1UUlVFKSwgbGl2aW5nQXB1c2ggPSBtZWRpYW4obGl2aW5nLCBuYS5ybT1UUlVFKSwgc3RyYW5nZXJBcHVzaCA9IG1lZGlhbihzdHJhbmdlciwgbmEucm09VFJVRSkpCgpkYXRhX3B1bGxBIDwtIGRhdGFfd2lkZSAlPiUgc2VsZWN0KElELCBjb25kLCBwdXNoX3B1bGwsIHZpc2l0LCBuZXV0cmFsLCBkZWF0aCwgbGl2aW5nLCBzcG91c2UsIHN0cmFuZ2VyKSAlPiUgZmlsdGVyKGNvbmQgPT0gIkEiICYgcHVzaF9wdWxsID09ICJQVUxMIikgJT4lIGdyb3VwX2J5KElEKSAlPiUgbXV0YXRlKG5ldXRyYWxBcHVsbCA9IG1lZGlhbihuZXV0cmFsLCBuYS5ybSA9IFRSVUUpLCBkZWF0aEFwdWxsID0gbWVkaWFuKGRlYXRoLCBuYS5ybSA9IFRSVUUpLCBzcG91c2VBcHVsbCA9IG1lZGlhbihzcG91c2UsIG5hLnJtPVRSVUUpLCBsaXZpbmdBcHVsbCA9IG1lZGlhbihsaXZpbmcsIG5hLnJtPVRSVUUpLCBzdHJhbmdlckFwdWxsID0gbWVkaWFuKHN0cmFuZ2VyLCBuYS5ybT1UUlVFKSkKCmRhdGFfcHVzaEIgPC0gZGF0YV93aWRlICU+JSBzZWxlY3QoSUQsIGNvbmQsIHB1c2hfcHVsbCwgdmlzaXQsIG5ldXRyYWwsIGRlYXRoLCBsaXZpbmcsIHNwb3VzZSwgc3RyYW5nZXIpICU+JSBmaWx0ZXIoY29uZCA9PSAiQiIgJiBwdXNoX3B1bGwgPT0gIlBVU0giKSAlPiUgZ3JvdXBfYnkoSUQpICU+JSBtdXRhdGUobmV1dHJhbEJwdXNoID0gbWVkaWFuKG5ldXRyYWwsIG5hLnJtID0gVFJVRSksIGRlYXRoQnB1c2ggPSBtZWRpYW4oZGVhdGgsIG5hLnJtID0gVFJVRSksIHNwb3VzZUJwdXNoID0gbWVkaWFuKHNwb3VzZSwgbmEucm09VFJVRSksIGxpdmluZ0JwdXNoID0gbWVkaWFuKGxpdmluZywgbmEucm09VFJVRSksIHN0cmFuZ2VyQnB1c2ggPSBtZWRpYW4oc3RyYW5nZXIsIG5hLnJtPVRSVUUpKQoKZGF0YV9wdWxsQiA8LSBkYXRhX3dpZGUgJT4lIHNlbGVjdChJRCwgY29uZCwgcHVzaF9wdWxsLCB2aXNpdCwgbmV1dHJhbCwgZGVhdGgsIGxpdmluZywgc3BvdXNlLCBzdHJhbmdlcikgJT4lIGZpbHRlcihjb25kID09ICJCIiAmIHB1c2hfcHVsbCA9PSAiUFVMTCIpICU+JSBncm91cF9ieShJRCkgJT4lIG11dGF0ZShuZXV0cmFsQnB1bGwgPSBtZWRpYW4obmV1dHJhbCwgbmEucm0gPSBUUlVFKSwgZGVhdGhCcHVsbCA9IG1lZGlhbihkZWF0aCwgbmEucm0gPSBUUlVFKSwgc3BvdXNlQnB1bGwgPSBtZWRpYW4oc3BvdXNlLCBuYS5ybT1UUlVFKSwgbGl2aW5nQnB1bGwgPSBtZWRpYW4obGl2aW5nLCBuYS5ybT1UUlVFKSwgc3RyYW5nZXJCcHVsbCA9IG1lZGlhbihzdHJhbmdlciwgbmEucm09VFJVRSkpCgojIHN1bW1hcml6ZSBieSBJRApkYXRhX3B1c2hBMSA8LSBkYXRhX3B1c2hBWyFkdXBsaWNhdGVkKGRhdGFfcHVzaEEkSUQpLCBdICU+JSBzZWxlY3QoLWMobmV1dHJhbCwgZGVhdGgsIGxpdmluZywgc3BvdXNlLCBzdHJhbmdlciwgdmlzaXQsIGNvbmQsIHB1c2hfcHVsbCkpCmRhdGFfcHVzaEIxIDwtIGRhdGFfcHVzaEJbIWR1cGxpY2F0ZWQoZGF0YV9wdXNoQiRJRCksIF0gJT4lIHNlbGVjdCgtYyhuZXV0cmFsLCBkZWF0aCwgbGl2aW5nLCBzcG91c2UsIHN0cmFuZ2VyLCB2aXNpdCwgY29uZCwgcHVzaF9wdWxsKSkKZGF0YV9wdWxsQTEgPC0gZGF0YV9wdWxsQVshZHVwbGljYXRlZChkYXRhX3B1bGxBJElEKSwgXSAlPiUgc2VsZWN0KC1jKG5ldXRyYWwsIGRlYXRoLCBsaXZpbmcsIHNwb3VzZSwgc3RyYW5nZXIsIHZpc2l0LCBjb25kLCBwdXNoX3B1bGwpKQpkYXRhX3B1bGxCMSA8LSBkYXRhX3B1bGxCWyFkdXBsaWNhdGVkKGRhdGFfcHVsbEIkSUQpLCBdICU+JSBzZWxlY3QoLWMobmV1dHJhbCwgZGVhdGgsIGxpdmluZywgc3BvdXNlLCBzdHJhbmdlciwgdmlzaXQsIGNvbmQsIHB1c2hfcHVsbCkpCgojIG1lcmdlIHRoZSA0IHN1YnNldHMgdG9nZXRoZXIKam9pbjEgPC0gbGVmdF9qb2luKGRhdGFfcHVzaEExLCBkYXRhX3B1c2hCMSwgYnk9IklEIikKam9pbjIgPC0gbGVmdF9qb2luKGpvaW4xLCBkYXRhX3B1bGxBMSwgYnkgPSAiSUQiKQpiaWFzIDwtIGxlZnRfam9pbihqb2luMiwgZGF0YV9wdWxsQjEsIGJ5ID0gIklEIikKaGVhZChiaWFzKQoKYmlhcyA8LSBiaWFzICU+JSBtdXRhdGUoYmlhc19uZXVfQSA9IG5ldXRyYWxBcHVzaCAtIG5ldXRyYWxBcHVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgYmlhc19kZWFfQSA9IGRlYXRoQXB1c2ggLSBkZWF0aEFwdWxsLAogICAgICAgICAgICAgICAgICAgICAgICBiaWFzX3Nwb19BID0gc3BvdXNlQXB1c2ggLSBzcG91c2VBcHVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgYmlhc19zdHJfQSA9IHN0cmFuZ2VyQXB1c2ggLSBzdHJhbmdlckFwdWxsLAogICAgICAgICAgICAgICAgICAgICAgICBiaWFzX2xpdl9BID0gbGl2aW5nQXB1c2ggLSBsaXZpbmdBcHVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgYmlhc19uZXVfQiA9IG5ldXRyYWxCcHVzaCAtIG5ldXRyYWxCcHVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgYmlhc19kZWFfQiA9IGRlYXRoQnB1c2ggLSBkZWF0aEJwdWxsLAogICAgICAgICAgICAgICAgICAgICAgICBiaWFzX3Nwb19CID0gc3BvdXNlQnB1c2ggLSBzcG91c2VCcHVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgYmlhc19zdHJfQiA9IHN0cmFuZ2VyQnB1c2ggLSBzdHJhbmdlckJwdWxsLAogICAgICAgICAgICAgICAgICAgICAgICBiaWFzX2xpdl9CID0gbGl2aW5nQnB1c2ggLSBsaXZpbmdCcHVsbAopCgojIGRyb3AgdGhlIGNvbmRpdGlvbi9zdGltIHNwZWNpZmljIHZhcmlhYmxlcwpiaWFzIDwtIGJpYXMgJT4lIHNlbGVjdCgtYyhuZXV0cmFsQXB1c2gsIGRlYXRoQXB1c2gsICBzcG91c2VBcHVzaCwgIGxpdmluZ0FwdXNoLCBzdHJhbmdlckFwdXNoLCBuZXV0cmFsQnB1c2gsIGRlYXRoQnB1c2gsICAgc3BvdXNlQnB1c2gsICBsaXZpbmdCcHVzaCwgIHN0cmFuZ2VyQnB1c2gsIG5ldXRyYWxBcHVsbCwgZGVhdGhBcHVsbCwgc3BvdXNlQXB1bGwsIGxpdmluZ0FwdWxsLCBzdHJhbmdlckFwdWxsLCBuZXV0cmFsQnB1bGwsIGRlYXRoQnB1bGwsIHNwb3VzZUJwdWxsLCBsaXZpbmdCcHVsbCwgc3RyYW5nZXJCcHVsbCkpCmNvbG5hbWVzKGJpYXMpCgojIHR1cm4gaXQgaW50byBhIGxvbmcgZGF0YXNldApiaWFzX2xvbmcgPC0gZ2F0aGVyKGJpYXMsCiAgICAgICAgICAgICAgICAgICAga2V5ID0gInN0aW0iLAogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gImJpYXMiLCAtYyhJRCkpIApoZWFkKGJpYXNfbG9uZykKCgoKIyBjcmVhdGUgbmV3IGNvbHVtbnMgZm9yIHN0aW11bHVzIGNhdGVnb3J5IGFuZCBjb25kaXRpb24KYmlhc19sb25nJGNvbmQgPC0gYXMuZmFjdG9yKGlmZWxzZShncmVwbCgiKl9BIiwgYmlhc19sb25nJHN0aW0pLCAiQSIsICJCIikpCmJpYXNfbG9uZyRzdGltdWx1cyA8LSBhcy5mYWN0b3IoaWZlbHNlKGdyZXBsKCIqbmV1KiIsIGJpYXNfbG9uZyRzdGltKSwgIm5ldXRyYWwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIqZGVhKiIsIGJpYXNfbG9uZyRzdGltKSwgImRlYXRoIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKnNwbyoiLCBiaWFzX2xvbmckc3RpbSksICJzcG91c2UiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIipzdHIqIiwgYmlhc19sb25nJHN0aW0pLCAic3RyYW5nZXIiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIqbGl2KiIsIGJpYXNfbG9uZyRzdGltKSwgImxpdmluZyIsIE5BKSkpKSkpCgpiaWFzX2xvbmcgPC0gYmlhc19sb25nICU+JSBzZWxlY3QoLXN0aW0pICMgbm8gbG9uZ2VyIG5lZWQgdGhlICJzdGltIiB2YXJpYWJsZQpgYGAKCiMjIyBDaGVjayBkYXRhIGFuZCBkaXN0cmlidXRpb24KYGBge3J9CmRlc2NyaWJlKGJpYXNfbG9uZyRiaWFzKSAjIHNrZXduZXNzIGlzIC0uMDEsIGt1cnRvc2lzIGlzIDEuMzQsIE0gPSAxNC4wNCwgU0QgPSA3MC4wMQpoaXN0KGJpYXNfbG9uZyRiaWFzKSAjIG5vcm1hbCBkaXN0cmlidXRpb24KcXFub3JtKGJpYXNfbG9uZyRiaWFzKSAjIGRlZmluaXRlbHkgc29tZSBvdXRsaWVycwoKIyBjaGVjayBvdXQgdGhlIG91dGxpZXJzCiMjIGZ1bmN0aW9uIGZyb20gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTI4NjYxODkvY2FsY3VsYXRpbmctdGhlLW91dGxpZXJzLWluLXIKb3V0ZnVuIDwtIGZ1bmN0aW9uKHgpIHsKICBhYnMoeC1tZWFuKHgsbmEucm09VFJVRSkpID4gMypzZCh4LG5hLnJtPVRSVUUpCn0KCiMgYWRkIGEgdmFyaWFibGUgZm9yIG91dGxpZXIgPSBUL0YKYmlhc19sb25nJG91dGxpZXIgPC0gb3V0ZnVuKGJpYXNfbG9uZyRiaWFzKQp0YWJsZShiaWFzX2xvbmckb3V0bGllcikgIyA0IG9ic2VydmF0aW9ucyB3aGVyZSBvdXRsaWVyID0gVFJVRSAoPjNTRCkKIyB3aGljaCBhcmUgdGhlc2U/CmJpYXNfbG9uZyAlPiUgZmlsdGVyKG91dGxpZXI9PVRSVUUpCgojIyMgdGhpcyBpcyBhbm90aGVyIHdheSB0byBkbyBpdCB1c2luZyBib3hwbG90LnN0YXRzCiMgb3V0bGllcl92YWx1ZXMgPC0gYm94cGxvdC5zdGF0cyhtZWRpYW5zX2xvbmckYmlhcykkb3V0CiMgYm94cGxvdChkYXRhX2xvbmckYmlhcywgbWFpbj0iT3V0bGllcnMiLCBib3h3ZXg9MC4zKQojIG10ZXh0KHBhc3RlKCJPdXRseWluZyB2YWx1ZXM6ICIsIHBhc3RlKHJvdW5kKG91dGxpZXJfdmFsdWVzLCBkaWdpdHM9MiksIGNvbGxhcHNlPSIsICIpKSwgY2V4PTAuOSwgc2lkZT0xKQoKc2F2ZVJEUyhiaWFzX2xvbmcsICJ+L0Ryb3Bib3gvR0xBU1MgTGFiL09UIGdBQVQgZm9yIG1lZXRpbmcgNS0xMC0xOS9iaWFzX2xvbmcucmRzIikKd3JpdGVfY3N2KGJpYXNfbG9uZywgIn4vRHJvcGJveC9HTEFTUyBMYWIvT1QgZ0FBVCBmb3IgbWVldGluZyA1LTEwLTE5L2JpYXNfbG9uZy5jc3YiKQpgYGAKClRoZSBmb3VyIGV4dHJlbWUgb3V0bGllcnMgKD4zIFNEKSBhcmU6Cjx1bD5EMTM3IGRlYXRoIEEgKC0yODQuMCkKRDE0NSBkZWF0aCBBICgtMjQ3LjUpCkQxNDcgZGVhdGggQSAoMjMzLjApCkQxMzkgc3BvdXNlIEIgKDI3NS41KTwvdWw+CgoKCiMjIyBUcmlhbC1sZXZlbCBiaWFzIHNjb3JlcyAoZm9yIE1MTSBvbmx5KQpUbyBjYWxjdWxhdGUgdHJpYWwtbGV2ZWwgYmlhcyAoYWthICJjb21wYXRpYmlsaXR5Iikgc2NvcmVzOiBzZXBhcmF0ZSBwdXNoIG1pbnVzIHB1bGwgdHJpYWxzLCB0aGVuIHN1YnRyYWN0IFJUIG9uIHRoYXQgdHJpYWwgYXQgcnVuMSBmcm9tIFJUIG9uIHRoYXQgdHJpYWwgYXQgcnVuMi4KCmBgYHtyfQpieF9sb25nIDwtIHJlYWRSRFMoIn4vRHJvcGJveC9HTEFTUyBMYWIvT1QgZ0FBVCBmb3IgbWVldGluZyA1LTEwLTE5L2J4X2xvbmcucmRzIikKYnhfcjEuMSA8LSBieF9sb25nICU+JSBmaWx0ZXIocnVuID09ICIxIikKYnhfcjIuMSA8LSBieF9sb25nICU+JSBmaWx0ZXIocnVuID09ICIyIikKdGFpbChieF9yMS4xKQp0YWlsKGJ4X3IyLjEpIAojIHJ1bjEgc2hvdWxkIGxpbmUgdXAgd2l0aCBydW4yOiAic3RpbSIgc2hvdWxkIG1hdGNoIChpLmUsIHNwb3VzZSB0cmlhbHMgd2l0aCBzcG91c2UgdHJpYWxzKSBidXQgcHVzaF9wdWxsIHNob3VsZCBzYXkgUFVTSCBhdCBvbmUgcnVuIGFuZCBQVUxMIGF0IHRoZSBvdGhlcgoKIyBjYWxjdWxhdGUgcGVyY2VudGlsZXMgZm9yIG91dGxpZXIgcmVtb3ZhbCAocnVuMSBhbmQgcnVuMikKcDk5cjEgPC0gcXVhbnRpbGUoYnhfcjEuMSRnQUFUX1JULCAwLjk5KSAKcDAxcjEgPC0gcXVhbnRpbGUoYnhfcjEuMSRnQUFUX1JULCAwLjAxKSAKcDk5cjEgIyA5OXRoIHBlcmNlbnRpbGUgUlRzID0gMTcxMy4zOG1zIApwMDFyMSAjIDFzdCBwZXJjZW50aWxlIFJUcyA9IDQ3Mm1zCgpwOTlyMiA8LSBxdWFudGlsZShieF9yMi4xJGdBQVRfUlQsIDAuOTkpIApwMDFyMiA8LSBxdWFudGlsZShieF9yMi4xJGdBQVRfUlQsIDAuMDEpIApwOTlyMiAjIDk5dGggcGVyY2VudGlsZSBSVHMgPSAxNzEyLjQ1bXMgCnAwMXIyICMgMXN0IHBlcmNlbnRpbGUgUlRzID0gNDYzbXMKCmJ4X3IxLjIgPC0gYnhfcjEuMSAlPiUKICBtdXRhdGUob3V0bGllcl9SVCA9IGlmZWxzZShnQUFUX1JUIDw9IHAwMXIxIHwgZ0FBVF9SVCA+PSBwOTlyMSwgMSwgMCkpCnRhYmxlKGJ4X3IxLjIkb3V0bGllcl9SVCkgCjIyNy8xMTAwNSAjIDIyNyB0cmlhbHMgd2lsbCBiZSBkcm9wcGVkLCAxMTAwNSB3aWxsIGJlIHJldGFpbmVkLi4uYWJvdXQgMiUgb2YgdHJpYWxzLgoKYnhfcjIuMiA8LSBieF9yMi4xICU+JQogIG11dGF0ZShvdXRsaWVyX1JUID0gaWZlbHNlKGdBQVRfUlQgPD0gcDAxcjIgfCBnQUFUX1JUID49IHA5OXIyLCAxLCAwKSkKdGFibGUoYnhfcjIuMiRvdXRsaWVyX1JUKSAKMjMwLzExMDAyICMgMjMwIHRyaWFscyB3aWxsIGJlIGRyb3BwZWQsIDExMDAyIHdpbGwgYmUgcmV0YWluZWQuLi5hYm91dCAyJSBvZiB0cmlhbHMuCgpieF9yMXIyIDwtIGJpbmRfY29scyhieF9yMS4yLCBieF9yMi4yKQpkaW0oYnhfcjFyMikgICMgYWZ0ZXIgb3V0bGllcnMgcmVtb3ZlZCwgdGhlcmUgYXJlIDExMjMyIHRyaWFscyB0b3RhbAoKIyBtYWtlIHN1cmUgdGhhdCB0cmlhbHMgaW4gdGhlIHR3byBydW5zIGxpbmUgdXAgcG9zdC1tZXJnZQpoZWFkKGJ4X3IxcjIpIAp0YWlsKGJ4X3IxcjIpCgojIGdldCByaWQgb2YgYW55IHRyaWFscyB3aXRoIG91dGxpZXJzIGluIGVpdGhlciBydW4xIG9yIHJ1bjIgCiMgKG5lZWQgcnVuMS9ydW4yIHRvIGJlIHRoZSBzYW1lIGxlbmd0aCBzbyB0aGF0IHRoZSB0cmlhbHMgbWF0Y2ggdXApCmJ4X3IxcjIuMSA8LSBieF9yMXIyICU+JSBmaWx0ZXIob3V0bGllcl9SVCA9PSAiMCIgJiBvdXRsaWVyX1JUMSA9PSAiMCIpIApjb3VudChieF9yMXIyLjEpICMgMTA3OTAgb2JzLgoxMDc5MC8xMTIzMiAjIH45NiUgb2YgdHJpYWxzIHJldGFpbmVkID0gNCUgZGF0YSBleGNsdWRlZAoKcHVzaF9wdWxsIDwtIGJ4X3IxcjIuMSAlPiUgZmlsdGVyKHB1c2hfcHVsbCA9PSAiUFVTSCIgJiBwdXNoX3B1bGwxID09ICJQVUxMIikgJT4lIG11dGF0ZShiaWFzID0gKGdBQVRfUlQtZ0FBVF9SVDEpKQpwdWxsX3B1c2ggPC0gYnhfcjFyMi4xICU+JSBmaWx0ZXIocHVzaF9wdWxsID09ICJQVUxMIiAmIHB1c2hfcHVsbDEgPT0gIlBVU0giKSAlPiUgbXV0YXRlKGJpYXMgPSAoZ0FBVF9SVDEtZ0FBVF9SVCkpCmJ4X3BwIDwtIGJpbmRfcm93cyhwdXNoX3B1bGwscHVsbF9wdXNoKQoKaGVhZChieF9wcCkgIyBjYW4gc2VlIGZyb20gdGhpcyB0aGF0IEQxMDEgKGFuZCBwb3NzaWJseSBvdGhlcnMpIGhhcyBvbmx5IGEgZmV3IHRyaWFscywgYmVjYXVzZSB0aGV5IGZhaWxlZCB0byByZXZlcnNlIHRoZSBpbnN0cnVjdGlvbnMgKGkuZS4sIHB1c2hfcHVsbCBhbmQgcHVzaF9wdWxsMSBjb2x1bW5zIGhhdmUgdGhlIHNhbWUgdmFsdWVzIGluc3RlYWQgb2YgUFVTSCBhdCBvbmUgYW5kIFBVTEwgYXQgdGhlIG90aGVyKQojIGluIGVzc2VuY2UsIHRoaXMgcmVtb3ZlcyB0aGVpciAiZXJyb3IiIHRyaWFscwoKYnhfcHAgJT4lIGdyb3VwX2J5KElELCBjb25kKSAlPiUgY291bnQoKSAjIHllcCwgdGhpcyBpcyB2aXNpYmxlIGluIHRoZWlyICp2ZXJ5IGxvdyogdHJpYWxjb3VudHM6CiMgRDEwMSBBIG4gPSAzCiMgRDE0MSBBIG4gPSAxOAojIEQxNDcgQiBuID0gMQojIEQxNDggQSBuID0gMTkKYGBgCkFzIHdlIHNlZSBmcm9tIHRoZSBsYXN0IHBhcnQgb2YgdGhlIHNjcmlwdCBhYm92ZSwgNCBwYXJ0aWNpcGFudHMgaGF2ZSBleHRyZW1lbHkgbG93IHRyaWFsIGNvdW50cyBhdCBvbmUgdmlzaXQgb3IgYW5vdGhlciwgZHVlIHRvIGZhaWx1cmUgdG8gcmV2ZXJzZSB0aGUgaW5zdHJ1Y3Rpb25zLiBUaGlzIHdpbGwgYmUgYWRkcmVzc2VkIG5leHQuCgpgYGB7cn0KIyBjcmVhdGUgYSAiZHJvcCIgdmFyaWFibGUgZm9yIHRoZXNlIDQKYnhfcHAgPC0gYnhfcHAgJT4lIG11dGF0ZShsb3dfbl90cmlhbHMgPSBpZmVsc2UoSUQgPT0gIkQxMDEiICYgY29uZCA9PSAiQSIgfCBJRCA9PSAiRDE0MSIgJiBjb25kID09ICJBInwgSUQgPT0gIkQxNDgiICYgY29uZCA9PSAiQSIgfCBJRCA9PSAiRDE0NyIgJiBjb25kID09ICJCIiwgMSwgMCkpCgojIGNoZWNrIHdoZXRoZXIgdGhlIHJvd3MgbGluZSB1cApub3RsaW5lZHVwIDwtIGJ4X3BwICU+JSBmaWx0ZXIoc3RpbSAhPSBzdGltMSkKbm90bGluZWR1cApub3RsaW5lZHVwIDwtIGJ4X3BwICU+JSBmaWx0ZXIodHJpYWxjb2RlICE9IHRyaWFsY29kZTEpCm5vdGxpbmVkdXAKbm90bGluZWR1cCA8LSBieF9wcCAlPiUgZmlsdGVyKHRyaWFsbnVtICE9IHRyaWFsbnVtMSkKbm90bGluZWR1cApub3RsaW5lZHVwIDwtIGJ4X3BwICU+JSBmaWx0ZXIocHVzaF9wdWxsID09IHB1c2hfcHVsbDEpCm5vdGxpbmVkdXAKIyAwIHJvd3MgcmV0dXJuZWQ7IGFsbCB0aGUgcm93cyBtYXRjaC4gVGh1cyB3ZSBjb25jbHVkZSB0aGUgcm93cyBmcm9tIHRoZSB0d28gcnVucyBsaW5lIHVwLgoKc2F2ZVJEUyhieF9wcCwgIn4vRHJvcGJveC9HTEFTUyBMYWIvT1QgZ0FBVCBmb3IgbWVldGluZyA1LTEwLTE5L2J4X2xvbmdfdHJpYWxieXRyaWFsQmlhcy5yZHMiKQpgYGAK