Study description

Data for this project come from a larger parent 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 placebo-controlled randomized crossover study, designed to test the neuropeptide oxytocin as a potential mechanism of poor adaptation in complicated vs. typical grief. Participants were 40 bereaved adults ages 55-80, who experienced the death of a spouse or long-term romantic partner between six months and three years prior to their participation.

Participants attended two identical experimental sessions, at which they received one of two intranasal sprays (treatment A/B) and then took part in an fMRI scan, which involved a structural sequence, a behavioral task involving viewing images of their deceased partner, and a resting state sequence (in that order).

Data wrangling steps

Import static and dynamic FNC from GIFT output

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

# read in static FNC stats
## FNC = correlation between pair of IC
fnc_corrs_all <- read_csv("~/Dropbox/fnc_corrs_all.csv", col_names = TRUE)

# subset only FNCs of interest by session

# placebo session only:
fnc_corrs_all_Pl <- select(fnc_corrs_all,c(ID, 
fnc_c04c13_txA, # intra-frontoparietal network (R, L dlPFC) / Placebo
fnc_c04c14_txA, # R frontoparietal-default mode network / Placebo
fnc_c14c17_txA, # intra-default mode network / Placebo
fnc_c14c27_txA, # intra-default mode network / Placebo
fnc_c19c27_txA)) # salience network-default mode network / Placebo

# drop the "txA" suffix and add a new column "tx" for the long dataframe
fnc_corrs_all_Pl <- fnc_corrs_all_Pl %>%
   rename_all(.funs = funs(sub("\\_txA", "", names(fnc_corrs_all_Pl))))
fnc_corrs_all_Pl$tx <- "txA"
names(fnc_corrs_all_Pl)

# oxytocin session only:
fnc_corrs_all_Ot <- select(fnc_corrs_all,c(ID, 
fnc_c04c13_txB, # intra-frontoparietal network (R, L dlPFC) / Oxytocin
fnc_c04c14_txB, # R frontoparietal-default mode network / Oxytocin
fnc_c14c17_txB, # intra-default mode network / Oxytocin
fnc_c14c27_txB, # intra-default mode network / Oxytocin
fnc_c19c27_txB)) # salience network-default mode network / Oxytocin

# drop the "txB" suffix and add a new column "tx" for the long dataframe
fnc_corrs_all_Ot <- fnc_corrs_all_Ot %>%
   rename_all(.funs = funs(sub("\\_txB", "", names(fnc_corrs_all_Ot))))
fnc_corrs_all_Ot$tx <- "txB"
names(fnc_corrs_all_Ot)

# create the long FNC dataframe
fnc_corrs_all_long <- bind_rows(fnc_corrs_all_Pl, fnc_corrs_all_Ot)

# read in the temporal dynamic functional connectivity (DFNC) stats
# already long so no reshaping needed
state_vector_stats <- read_csv("~/Dropbox/state_vector_stats.csv", col_names = TRUE)
head(state_vector_stats)

# merge on columns ID and tx
gift_out <- left_join(state_vector_stats,fnc_corrs_all_long, by=c("ID", "tx"))

Add state and time-invariant variables

# using the % of content that was spouse/death-related from their post scan reports as a very imperfect measure of ruminative content for Aim 1 H3
# (this will probably change)

# placebo:
rumA <- read_csv("/Users/sarenseeley/Dropbox/Grants\ and\ Applications/NRSA\ F31\ 2018-2019/Resubmission\ Reviews/power-analysis/rumination_txA.csv")

# create composite variables for (1) focus on spouse in post-scan responses, and (2) of all of the things they reported thinking about, what % of what they mentioned was related to their spouse/death?
rumA$focus_spouse <- (rumA$spouse_1+rumA$spouse_2) 
rumA$focus_task <- (rumA$task_1+rumA$task_2) 
rumA$focus_whoto <- (rumA$whoto_1+rumA$whoto_2) 
rumA$focus_otherpics <- (rumA$otherpics_1+rumA$otherpics_2) 
rumA$focus_nonspouse <- (rumA$spouse_1+rumA$spouse_2+rumA$task_1+rumA$task_2+rumA$whoto_1+rumA$whoto_2+rumA$otherpics_1+rumA$otherpics_2+rumA$somatic_1+rumA$somatic_2+rumA$metacog_1+rumA$metacog_2)
rumA$focus_spouse_perc <- (rumA$focus_spouse/rumA$focus_nonspouse)
View(rumA)

# replace NaNs (generated by dividing zero by zero) with 0
fix_nan <- function(x){
    x[is.nan(x)] <- 0
    x
}
rumA$focus_spouse_perc <- fix_nan(rumA$focus_spouse_perc)   

# drop variables extraneous for power analysis
rumA <- rumA %>% select(-c(post_sroe_1_A, spouse_1, task_1, whoto_1, otherpics_1, somatic_1, metacog_1, post_sroe_2_A, spouse_2, task_2, whoto_2, otherpics_2, somatic_2, metacog_2, focus_spouse, focus_task, focus_whoto, focus_otherpics, focus_nonspouse))
names(rumA)

                                
# make a subset of data from master dataset
dataforjf <- select(data_spr19,c(ID, 
                                 group, # complicated grief (CG) or non-complicated grief (NCG), based on tot_icg clinical cutoff of >25
                                 tot_icg, # Inventory of Complicated Grief total score
                                 tot_bdi, # Beck Depression Inventory total
                                 age_yrs, # age in years
                                 sex_m, # sex (m is reference category)
                                 timesincedeath, # time elapsed (in days) between spouse's death and study participation
                                 tx_v1)) # which treatment they got at their first visit (A = placebo)

# replace "D" prefix in ID to "sub-" so that the ID variables match across dataframes to merge
dataforjf <- dataforjf %>% 
  mutate(ID = str_replace(ID, "D", "sub-"))
head(dataforjf)

# merge state reports with FNC/DFNC variables
scandata <- left_join(gift_out, rumA, by=c("ID","tx"))

# merge with time-invariant variables
dataforjf <- left_join(dataforjf,scandata, by=c("ID"))

# recode factors: substitute "placebo" for A/txA, and "oxytocin" for B/txB
# placebo = 0, oxytocin = 1
dataforjf <- dataforjf %>% mutate(tx_v1 = recode_factor(tx_v1, "A" = 0, "B" = 1), tx = recode_factor(tx, "txA" = 0, "txB" = 1)) 

# save as csv file
write_csv(dataforjf, "/Users/sarenseeley/Dropbox/Grants\ and\ Applications/NRSA\ F31\ 2018-2019/Resubmission\ Reviews/power-analysis/dataforjf.csv")

Which states do I care about?

Looking at results from 1-sample t test (FDR-corrected p < .05) in tDFNC toolbox…

State 1 is characterized by:

  • greater + connectivity between default mode (IC14, IC17 [precuneus/PCC, autobio memory])
  • greater + connectivity between the salience network (IC19) and right frontoparietal network (IC4)
  • greater + connectivity between the salience network (IC19) and default mode network (IC14 [precuneus/PCC])
  • greater + connectivity between the salience network (IC19) and default mode network (IC14 [precuneus/PCC])
  • greater - connectivity between the salience network (IC19) and default mode network (IC27 [midline/self-reference/social cog])

State 2 is characterized by strong intercorrelations between and within all networks except for:

  • between the salience network (IC19) and one of the default mode ICs (IC27 [midline/self-reference/social cog])
  • IC27 is also less strongly connected with the right frontoparietal network (IC13) and another default mode IC (IC17 [autobio memory])

 

State 3 is characterized by:

  • greater + connectivity within the default mode network (ICs 14, 17, 27)
  • greater - connectivity between the salience network (IC19) and default mode network (IC27 [midline/self-reference/social cog])

State 4 is characterized by:

  • greater + connectivity within the frontoparietal network (ICs 4, 13)
  • greater + connectivity within the default mode ICs (IC14 [precuneus/PCC] w/IC27 [midline/self-reference/social cog] and IC14 [precuneus/PCC] w/IC17 [autobio memory])
  • greater + connectivity between the frontoparietal network (IC 4, 13) and midline default mode network (IC14 [precuneus/PCC], IC27 [midline/self-reference/social cog])
  • greater - connectivity between the salience network (IC19) and midline default mode network (IC14 [precuneus/PCC], IC27 [midline/self-reference/social cog])
  • greater - connectivity between the salience network (IC19) and left frontoparietal network (IC4)
Interpretations

State 1: Vast majority (35/38) of subjects show this state. This one seems mostly about connectivity within the posterior DMN, and of L frontoparietal with default mode and salience networks.

State 2: Strong intercorrelations within and between nearly all ICs. (Meaning???) This is the state in which default mode components (IC14, IC17) are positively coupled with the salience network component (IC19), and looks the most like Fig. 2 from my proposal:

Figure 2. Hypothesized major network interactions in complicated grief, showing the flow and content of spontaneous thought as potentially more automatically constrained and less variable due to (a) lesser influence from executive control regions over default mode influence26, (b) greater influence from default mode core subsystem regions48, and (c) greater influence of the salience network – so thoughts are intrusive, inflexible, and fixated on the loss.

State 3: Cognition driven by internally-oriented thoughts from default mode network (memory, self-referential). Salience and frontoparietal networks are negatively correlated with default mode activity - few constraints over thought. Mind-wandering?

State 4: Strong FNC within and between default mode and frontoparietal control network components. Salience network negatively coupled with frontoparietal network and default mode components. May reflect more goal-directed cognition?

Variables in dataset ‘dataforjf.csv’

    ID: Subject ID

    tot_icg: Inventory of Complicated Grief total score (grief symptoms measure)

    group: Complicated grief (CG) or non-complicated grief (NCG), based on tot_icg clinical cutoff of >25 (NCG = 0, CG = 1)

    age_yrs: Age in years

    timesincedeath: Time (in days) elapsed between date of spouse’s death and date of study participation (session 1)

    sex_m: Sex (male = 0, female = 1)

    tx_v1: Treatment received at first visit (placebo = 0, oxytocin = 1) (for order effects)

    tx: Observation comes from which session? (placebo = 0, oxytocin = 1)

    focus_spouse_perc: Of the number of different content areas mentioned in the post-scan free response self-report questions about what they were thinking/feeling and doing during the task, what proportion was spouse-related? (each of six content areas was scored 0/1 for absent/present, scores on spouse dummy variable summed [range 0-2], then divided by an aggregate score that summed all dummy variables to yield a measure of how focused they were on their spouse and/or their death during the task.) I need to think more about how best to get a metric that captures what I’m looking for – I’m not sure this is it.

    meta_states_numstates: Number of unique windows for each subject

    meta_states_totaldist: Sum of L1 distances between successive meta-states for each subject

    meta_states_changestates: Number of times each subject changes from one meta state to other

    meta_states_statespan: Maximum L1 distance between states for each subject

    statestats_fract_time_s1: Fraction of time spent in state 1

    statestats_fract_time_s2: Fraction of time spent in state 2

    statestats_fract_time_s3: Fraction of time spent in state 3

    statestats_fract_time_s4: Fraction of time spent in state 4

    statestats_dwelltime_s1: The average amount of time spent state 1 before shifting to another state (for each subject and session)

    statestats_dwelltime_s2: The average amount of time spent state 2 before shifting to another state (for each subject and session)

    statestats_dwelltime_s3: The average amount of time spent state 3 before shifting to another state (for each subject and session)

    statestats_dwelltime_s4: The average amount of time spent state 4 before shifting to another state (for each subject and session)

    statestats_numtransitions: How many state transitions occurred (for each subject and session)

    fnc_c04c13: Static FNC within the frontoparietal network

    fnc_c04c14: Static FNC between the frontoparietal and default mode network

    fnc_c14c17: Static FNC within the default mode network

    fnc_c14c27: Static FNC within the default mode network

    fnc_c19c27: Static FNC between the salience and default mode network

Aims, analyses and syntax

Aim 1

Aim 1. To test whether dynamic functional connectivity under placebo differs among widowed older adults who are adjusting well, versus those who are adjusting poorly (i.e., complicated grief).

  • H1: Complicated grief symptom severity [tot_icg] will predict lower variability in spontaneous thought flow over time, as indexed by fewer functional connectivity state transitions over the resting state scan [statestats_numtransitions].

  • H2: Complicated grief symptom severity [tot_icg] will predict greater automatic constraints on thought content, as indexed by more dwell time in states of default mode-salience network interconnectivity [statestats_dwelltime_s2].

  • H3: Ruminative content in self-reported pre-resting state thought content [state_rum] will mediate the relationship between grief symptom severity [tot_icg] and automatic constraints as indexed by dwell time in states of default mode-salience network interconnectivity [statestats_dwelltime_s2].

Analysis
From the grant:

  • H1 & H2: Two separate hierarchical regression models will be used to test (A) whether the continuous score of grief severity predicts dynamic functional connectivity variables (n transitions in H1; dwell time in H2), and (B) whether grief severity remains predictive when other plausible explanatory variables including but not limited to time since death, depressive symptom severity, and age are included in the model. Using R, I will manually build each linear regression model then perform model comparison to identify whether the model with the additional predictors performs significantly better than the simpler model, based on the F test.

For the power analysis, we had discussed just using the first model without the covariates, I think.

  • H3: Observer-rated ruminative content in the post-scan reports…will be tested to identify whether the effect of grief severity on DFNC is explained by how much people were ruminating immediately before the resting state scan. A mediation model will be used to test the indirect and total effects of ruminative content on dwell time, using the R package “mediation”79.
# install.packages("mediation")
# install.packages("dplyr")
library(mediation)
library(dplyr)
filter <- dplyr::filter
dataforjf <- read_csv("/Users/sarenseeley/Dropbox/Grants\ and\ Applications/NRSA\ F31\ 2018-2019/Resubmission\ Reviews/power-analysis/dataforjf.csv")
Parsed with column specification:
cols(
  .default = col_double(),
  ID = col_character(),
  group = col_character(),
  tot_icg = col_integer(),
  tot_bdi = col_integer(),
  sex_m = col_character(),
  timesincedeath = col_integer(),
  tx_v1 = col_integer(),
  tx = col_integer(),
  meta_states_numstates = col_integer(),
  meta_states_totaldist = col_integer(),
  meta_states_changestates = col_integer(),
  meta_states_statespan = col_integer(),
  statestats_numtransitions = col_integer()
)
See spec(...) for full column specifications.
# Use PLACEBO SESSIONS ONLY for the following analyses
data_pl <- dataforjf %>% filter(tx == 0)
### Aim 1 Hypothesis 1
# First model with grief severity only
m1 <- lm(statestats_numtransitions ~ tot_icg, data = data_pl)
summary(m1)

Call:
lm(formula = statestats_numtransitions ~ tot_icg, data = data_pl)

Residuals:
    Min      1Q  Median      3Q     Max 
-6.3907 -2.2391  0.5366  1.8778  7.9650 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  6.71051    1.05108   6.384 2.14e-07 ***
tot_icg      0.03580    0.04053   0.883    0.383    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 3.091 on 36 degrees of freedom
Multiple R-squared:  0.02121,   Adjusted R-squared:  -0.005982 
F-statistic:  0.78 on 1 and 36 DF,  p-value: 0.383
# Second model including other hypothesized predictors 
# (here, depression symptoms + age + time since spouse's death at time of study):
m2 <- lm(statestats_numtransitions ~ tot_icg + tot_bdi + age_yrs + timesincedeath, data = data_pl) 
summary(m2)

Call:
lm(formula = statestats_numtransitions ~ tot_icg + tot_bdi + 
    age_yrs + timesincedeath, data = data_pl)

Residuals:
    Min      1Q  Median      3Q     Max 
-6.1019 -2.0838  0.0861  1.3641  6.9568 

Coefficients:
                 Estimate Std. Error t value Pr(>|t|)  
(Intercept)    11.2152610  5.2925972   2.119   0.0417 *
tot_icg        -0.0277563  0.0575273  -0.482   0.6326  
tot_bdi         0.1637882  0.0987070   1.659   0.1065  
age_yrs        -0.0698957  0.0757697  -0.922   0.3630  
timesincedeath  0.0003477  0.0020626   0.169   0.8672  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 3.047 on 33 degrees of freedom
Multiple R-squared:  0.1283,    Adjusted R-squared:  0.02265 
F-statistic: 1.214 on 4 and 33 DF,  p-value: 0.3234
# Comparing sum of squares & corresponding F statistics and p-values for m1 and m2: 
anova(m1,m2)
Analysis of Variance Table

Model 1: statestats_numtransitions ~ tot_icg
Model 2: statestats_numtransitions ~ tot_icg + tot_bdi + age_yrs + timesincedeath
  Res.Df    RSS Df Sum of Sq      F Pr(>F)
1     36 344.02                           
2     33 306.38  3    37.644 1.3515 0.2746
### Aim 1 Hypothesis 2
# First model with grief severity only
m3 <- lm(statestats_dwelltime_s2 ~ tot_icg, data = data_pl)
summary(m3)

Call:
lm(formula = statestats_dwelltime_s2 ~ tot_icg, data = data_pl)

Residuals:
    Min      1Q  Median      3Q     Max 
-12.095  -7.043  -2.783   3.531  30.975 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)   
(Intercept)   0.6992     3.4777   0.201  0.84180   
tot_icg       0.3930     0.1341   2.930  0.00585 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 10.23 on 36 degrees of freedom
Multiple R-squared:  0.1926,    Adjusted R-squared:  0.1701 
F-statistic: 8.586 on 1 and 36 DF,  p-value: 0.00585
# Second model including other hypothesized predictors 
# (here, depression symptoms + age + time since spouse's death at time of study):
m4 <- lm(statestats_dwelltime_s2 ~ tot_icg + tot_bdi + age_yrs + timesincedeath, data = data_pl) 
summary(m4)

Call:
lm(formula = statestats_dwelltime_s2 ~ tot_icg + tot_bdi + age_yrs + 
    timesincedeath, data = data_pl)

Residuals:
    Min      1Q  Median      3Q     Max 
-16.460  -6.495  -1.384   3.852  28.209 

Coefficients:
                 Estimate Std. Error t value Pr(>|t|)   
(Intercept)    -16.360323  17.465160  -0.937  0.35570   
tot_icg          0.615572   0.189835   3.243  0.00271 **
tot_bdi         -0.558718   0.325725  -1.715  0.09567 . 
age_yrs          0.205128   0.250034   0.820  0.41788   
timesincedeath   0.007230   0.006806   1.062  0.29584   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 10.05 on 33 degrees of freedom
Multiple R-squared:  0.2847,    Adjusted R-squared:  0.198 
F-statistic: 3.284 on 4 and 33 DF,  p-value: 0.02262
# Comparing sum of squares & corresponding F statistics and p-values for m3 and m4: 
anova(m3,m4)
Analysis of Variance Table

Model 1: statestats_dwelltime_s2 ~ tot_icg
Model 2: statestats_dwelltime_s2 ~ tot_icg + tot_bdi + age_yrs + timesincedeath
  Res.Df    RSS Df Sum of Sq      F Pr(>F)
1     36 3766.2                           
2     33 3336.3  3    429.88 1.4174 0.2552
### Aim 1 Hypothesis 3
# model.M <- lm(M ~ X, myData)
# model.Y <- lm(Y ~ X + M, myData)
# results <- mediate(model.M, model.Y, treat='X', mediator='M',
#                   boot=TRUE, sims=100)
# X = tot_icg
# M = focus_spouse_perc
# Y = statestats_dwelltime_s2
mM <- lm(focus_spouse_perc ~ tot_icg, data_pl)
summary(mM)

Call:
lm(formula = focus_spouse_perc ~ tot_icg, data = data_pl)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.46451 -0.15519 -0.00541  0.13085  0.64133 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)   
(Intercept) 0.137369   0.088959   1.544  0.13129   
tot_icg     0.009622   0.003431   2.805  0.00807 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.2616 on 36 degrees of freedom
Multiple R-squared:  0.1793,    Adjusted R-squared:  0.1565 
F-statistic: 7.866 on 1 and 36 DF,  p-value: 0.00807
mY <- lm(statestats_dwelltime_s2 ~ tot_icg + focus_spouse_perc, data_pl)
summary(mY)

Call:
lm(formula = statestats_dwelltime_s2 ~ tot_icg + focus_spouse_perc, 
    data = data_pl)

Residuals:
    Min      1Q  Median      3Q     Max 
-11.932  -6.955  -2.662   4.076  30.950 

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)   
(Intercept)         0.9679     3.6374   0.266  0.79172   
tot_icg             0.4118     0.1500   2.746  0.00946 **
focus_spouse_perc  -1.9564     6.5997  -0.296  0.76865   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 10.36 on 35 degrees of freedom
Multiple R-squared:  0.1946,    Adjusted R-squared:  0.1486 
F-statistic: 4.228 on 2 and 35 DF,  p-value: 0.02266
results <- mediation::mediate(mM, mY, treat='tot_icg', mediator='focus_spouse_perc',
                   boot=TRUE, sims=1000)
summary(results)

Causal Mediation Analysis 

Nonparametric Bootstrap Confidence Intervals with the Percentile Method

               Estimate 95% CI Lower 95% CI Upper p-value
ACME            -0.0188      -0.1588       0.0559    0.76
ADE              0.4118       0.0765       0.7380    0.00
Total Effect     0.3930       0.0819       0.7334    0.01
Prop. Mediated  -0.0479      -0.6164       0.2482    0.77

Sample Size Used: 38 


Simulations: 1000 
# ACME stands for Average Causal Mediation Effects
# ADE stands for Average Direct Effects
# Total Effect is a sum of a mediation (indirect) effect and a direct effect

Aim 2

Aim 2. To identify how intranasal oxytocin alters dynamic functional connectivity in older adults, and whether effects of oxytocin are moderated by grief severity.

  • H1: Under oxytocin [tx == 1], the sample as a whole will show increased time in salience network-dominant states [statestats_dwelltime_s2], relative to placebo [tx == 0].

  • H2: Complicated grief symptom severity will moderate oxytocin effects on DFNC [statestats_dwelltime_s2].

Analyses
From the grant:

  • H1: Dependent t-tests will be used to compare oxytocin and placebo conditions to test whether oxytocin (A) increases dwell time in salience-network dominant states and/or (B) reduces n state transitions in the sample.

Hmm, not sure why I proposed doing t tests here - I think I would get the same info from the main effect of tx (oxytocin/placebo) in the model below for H2 because the observations are nested within person. Am I missing something here or was I just not thinking when I wrote this?

  • H2: A multivariate linear mixed effects model will be used to test grief severity as a potential moderator of the relationship between condition (oxytocin vs. placebo) and DNFC dependent variables. Broadly, the two- intercept model80 will predict dwell time and n transitions as a function of “indicator variable” (i.e., which DV), condition, and ICG score (nested within person to account for interdependence), using maximum likelihood as implemented in the R package nlme81. This type of model allows for testing differential effects on the two DVs (dwell time; n transitions) and reduces chance of experiment-wise Type-I error. A multivariate linear mixed effects model also estimates the correlation between the DVs, and allows them to have different residual variances. It is most powerful when the dependent variables are correlated (as we might expect them to be here since dwell time and number of transitions are likely inversely related to each other).

I would revise this analysis to just do a regular linear mixed effects model with one outcome variable, statestats_dwelltime_s2. Dwell time in a particular state is more specific in terms of what it is measuring than number of transitions overall. I found a tutorial on multivariate random coefficient models using nlme but it’s a bit over my head at this time.

I also noted that dwell time in state 2 and n transitions are actually not correlated, as I expected them to be (corr.test(data$statestats_dwelltime_s2, data$statestats_numtransitions) outputs r = .05, p = .70).

library(nlme)

Attaching package: ‘nlme’

The following object is masked from ‘package:dplyr’:

    collapse
### Aim 2 Hypothesis 1
# This hypothesis tests the main effect of `tx` in the model below. I think it makes sense to have just random slopes and not random intercepts here but correct me if I'm wrong...
### Aim 2 Hypothesis 2
# This hypothesis tests the treatment x grief severity interaction in the model below.
m5 <- lme(statestats_dwelltime_s2 ~ tx*tot_icg, data = data, random = ~ 1|ID, method="ML")
summary(m5)
Linear mixed-effects model fit by maximum likelihood
 Data: data 
       AIC      BIC    logLik
  598.7121 612.6965 -293.3561

Random effects:
 Formula: ~1 | ID
        (Intercept) Residual
StdDev:      7.8943 9.141035

Fixed effects: statestats_dwelltime_s2 ~ tx * tot_icg 
                Value Std.Error DF    t-value p-value
(Intercept)  0.699176  4.219227 36  0.1657119  0.8693
tx          11.363483  4.515934 36  2.5163087  0.0165
tot_icg      0.392973  0.162709 36  2.4151859  0.0209
tx:tot_icg  -0.232347  0.174151 36 -1.3341660  0.1905
 Correlation: 
           (Intr) tx     tot_cg
tx         -0.535              
tot_icg    -0.879  0.470       
tx:tot_icg  0.470 -0.879 -0.535

Standardized Within-Group Residuals:
       Min         Q1        Med         Q3        Max 
-1.5035893 -0.5997914 -0.1110756  0.2787453  2.6633116 

Number of Observations: 76
Number of Groups: 38 
LS0tCnRpdGxlOiAiRGF0YSBhbmQgbW9kZWxzIGZvciBOUlNBIHBvd2VyIGFuYWx5c2lzIgphdXRob3I6ICJTYXJlbiBTZWVsZXkiCmRhdGU6ICIwNC0xNS0yMDE5IgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIG51bWJlcl9zZWN0aW9uczogbm8KICAgIHRoZW1lOiBwYXBlcgogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogeWVzCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICB0b2M6IHllcwogICAgc2VsZl9jb250YWluZWQ6IGZhbHNlCi0tLQoKIyBTdHVkeSBkZXNjcmlwdGlvbgpEYXRhIGZvciB0aGlzIHByb2plY3QgY29tZSBmcm9tIGEgbGFyZ2VyIHBhcmVudCBzdHVkeSAoIlRoZSBlZmZlY3Qgb2YgaW50cmFuYXNhbCBveHl0b2NpbiBvbiBuZXVyYWwgZnVuY3Rpb25pbmcgaW4gd2lkb3coZXIpcyIgKCMxNTAzNzQ0NDIwLCBQSTogTWFyeS1GcmFuY2VzIE8nQ29ubm9yLCBDby1QSTogQnJpYW4gQXJpem1lbmRpKS4gSXQgd2FzIGEgZG91YmxlLWJsaW5kIHBsYWNlYm8tY29udHJvbGxlZCByYW5kb21pemVkIGNyb3Nzb3ZlciBzdHVkeSwgZGVzaWduZWQgdG8gdGVzdCB0aGUgbmV1cm9wZXB0aWRlIG94eXRvY2luIGFzIGEgcG90ZW50aWFsIG1lY2hhbmlzbSBvZiBwb29yIGFkYXB0YXRpb24gaW4gY29tcGxpY2F0ZWQgdnMuIHR5cGljYWwgZ3JpZWYuIFBhcnRpY2lwYW50cyB3ZXJlIDQwIGJlcmVhdmVkIGFkdWx0cyBhZ2VzIDU1LTgwLCB3aG8gZXhwZXJpZW5jZWQgdGhlIGRlYXRoIG9mIGEgc3BvdXNlIG9yIGxvbmctdGVybSByb21hbnRpYyBwYXJ0bmVyIGJldHdlZW4gc2l4IG1vbnRocyBhbmQgdGhyZWUgeWVhcnMgcHJpb3IgdG8gdGhlaXIgcGFydGljaXBhdGlvbi4gCgpQYXJ0aWNpcGFudHMgYXR0ZW5kZWQgdHdvIGlkZW50aWNhbCBleHBlcmltZW50YWwgc2Vzc2lvbnMsIGF0IHdoaWNoIHRoZXkgcmVjZWl2ZWQgb25lIG9mIHR3byBpbnRyYW5hc2FsIHNwcmF5cyAodHJlYXRtZW50IEEvQikgYW5kIHRoZW4gdG9vayBwYXJ0IGluIGFuIGZNUkkgc2Nhbiwgd2hpY2ggaW52b2x2ZWQgYSBzdHJ1Y3R1cmFsIHNlcXVlbmNlLCBhIGJlaGF2aW9yYWwgdGFzayBpbnZvbHZpbmcgdmlld2luZyBpbWFnZXMgb2YgdGhlaXIgZGVjZWFzZWQgcGFydG5lciwgYW5kIGEgcmVzdGluZyBzdGF0ZSBzZXF1ZW5jZSAoaW4gdGhhdCBvcmRlcikuCgojIERhdGEgd3JhbmdsaW5nIHN0ZXBzCiMjIEltcG9ydCBzdGF0aWMgYW5kIGR5bmFtaWMgRk5DIGZyb20gR0lGVCBvdXRwdXQKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKZmlsdGVyIDwtIGRwbHlyOjpmaWx0ZXIKc2VsZWN0IDwtIGRwbHlyOjpzZWxlY3QKCiMgcmVhZCBpbiBzdGF0aWMgRk5DIHN0YXRzCiMjIEZOQyA9IGNvcnJlbGF0aW9uIGJldHdlZW4gcGFpciBvZiBJQwpmbmNfY29ycnNfYWxsIDwtIHJlYWRfY3N2KCJ+L0Ryb3Bib3gvZm5jX2NvcnJzX2FsbC5jc3YiLCBjb2xfbmFtZXMgPSBUUlVFKQoKIyBzdWJzZXQgb25seSBGTkNzIG9mIGludGVyZXN0IGJ5IHNlc3Npb24KCiMgcGxhY2VibyBzZXNzaW9uIG9ubHk6CmZuY19jb3Jyc19hbGxfUGwgPC0gc2VsZWN0KGZuY19jb3Jyc19hbGwsYyhJRCwgCmZuY19jMDRjMTNfdHhBLCAjIGludHJhLWZyb250b3BhcmlldGFsIG5ldHdvcmsgKFIsIEwgZGxQRkMpIC8gUGxhY2VibwpmbmNfYzA0YzE0X3R4QSwgIyBSIGZyb250b3BhcmlldGFsLWRlZmF1bHQgbW9kZSBuZXR3b3JrIC8gUGxhY2VibwpmbmNfYzE0YzE3X3R4QSwgIyBpbnRyYS1kZWZhdWx0IG1vZGUgbmV0d29yayAvIFBsYWNlYm8KZm5jX2MxNGMyN190eEEsICMgaW50cmEtZGVmYXVsdCBtb2RlIG5ldHdvcmsgLyBQbGFjZWJvCmZuY19jMTljMjdfdHhBKSkgIyBzYWxpZW5jZSBuZXR3b3JrLWRlZmF1bHQgbW9kZSBuZXR3b3JrIC8gUGxhY2VibwoKIyBkcm9wIHRoZSAidHhBIiBzdWZmaXggYW5kIGFkZCBhIG5ldyBjb2x1bW4gInR4IiBmb3IgdGhlIGxvbmcgZGF0YWZyYW1lCmZuY19jb3Jyc19hbGxfUGwgPC0gZm5jX2NvcnJzX2FsbF9QbCAlPiUKICAgcmVuYW1lX2FsbCguZnVucyA9IGZ1bnMoc3ViKCJcXF90eEEiLCAiIiwgbmFtZXMoZm5jX2NvcnJzX2FsbF9QbCkpKSkKZm5jX2NvcnJzX2FsbF9QbCR0eCA8LSAidHhBIgpuYW1lcyhmbmNfY29ycnNfYWxsX1BsKQoKIyBveHl0b2NpbiBzZXNzaW9uIG9ubHk6CmZuY19jb3Jyc19hbGxfT3QgPC0gc2VsZWN0KGZuY19jb3Jyc19hbGwsYyhJRCwgCmZuY19jMDRjMTNfdHhCLCAjIGludHJhLWZyb250b3BhcmlldGFsIG5ldHdvcmsgKFIsIEwgZGxQRkMpIC8gT3h5dG9jaW4KZm5jX2MwNGMxNF90eEIsICMgUiBmcm9udG9wYXJpZXRhbC1kZWZhdWx0IG1vZGUgbmV0d29yayAvIE94eXRvY2luCmZuY19jMTRjMTdfdHhCLCAjIGludHJhLWRlZmF1bHQgbW9kZSBuZXR3b3JrIC8gT3h5dG9jaW4KZm5jX2MxNGMyN190eEIsICMgaW50cmEtZGVmYXVsdCBtb2RlIG5ldHdvcmsgLyBPeHl0b2NpbgpmbmNfYzE5YzI3X3R4QikpICMgc2FsaWVuY2UgbmV0d29yay1kZWZhdWx0IG1vZGUgbmV0d29yayAvIE94eXRvY2luCgojIGRyb3AgdGhlICJ0eEIiIHN1ZmZpeCBhbmQgYWRkIGEgbmV3IGNvbHVtbiAidHgiIGZvciB0aGUgbG9uZyBkYXRhZnJhbWUKZm5jX2NvcnJzX2FsbF9PdCA8LSBmbmNfY29ycnNfYWxsX090ICU+JQogICByZW5hbWVfYWxsKC5mdW5zID0gZnVucyhzdWIoIlxcX3R4QiIsICIiLCBuYW1lcyhmbmNfY29ycnNfYWxsX090KSkpKQpmbmNfY29ycnNfYWxsX090JHR4IDwtICJ0eEIiCm5hbWVzKGZuY19jb3Jyc19hbGxfT3QpCgojIGNyZWF0ZSB0aGUgbG9uZyBGTkMgZGF0YWZyYW1lCmZuY19jb3Jyc19hbGxfbG9uZyA8LSBiaW5kX3Jvd3MoZm5jX2NvcnJzX2FsbF9QbCwgZm5jX2NvcnJzX2FsbF9PdCkKCiMgcmVhZCBpbiB0aGUgdGVtcG9yYWwgZHluYW1pYyBmdW5jdGlvbmFsIGNvbm5lY3Rpdml0eSAoREZOQykgc3RhdHMKIyBhbHJlYWR5IGxvbmcgc28gbm8gcmVzaGFwaW5nIG5lZWRlZApzdGF0ZV92ZWN0b3Jfc3RhdHMgPC0gcmVhZF9jc3YoIn4vRHJvcGJveC9zdGF0ZV92ZWN0b3Jfc3RhdHMuY3N2IiwgY29sX25hbWVzID0gVFJVRSkKaGVhZChzdGF0ZV92ZWN0b3Jfc3RhdHMpCgojIG1lcmdlIG9uIGNvbHVtbnMgSUQgYW5kIHR4CmdpZnRfb3V0IDwtIGxlZnRfam9pbihzdGF0ZV92ZWN0b3Jfc3RhdHMsZm5jX2NvcnJzX2FsbF9sb25nLCBieT1jKCJJRCIsICJ0eCIpKQoKYGBgCgojIyMgQWRkIHN0YXRlIGFuZCB0aW1lLWludmFyaWFudCB2YXJpYWJsZXMKYGBge3J9CiMgdXNpbmcgdGhlICUgb2YgY29udGVudCB0aGF0IHdhcyBzcG91c2UvZGVhdGgtcmVsYXRlZCBmcm9tIHRoZWlyIHBvc3Qgc2NhbiByZXBvcnRzIGFzIGEgdmVyeSBpbXBlcmZlY3QgbWVhc3VyZSBvZiBydW1pbmF0aXZlIGNvbnRlbnQgZm9yIEFpbSAxIEgzCiMgKHRoaXMgd2lsbCBwcm9iYWJseSBjaGFuZ2UpCgojIHBsYWNlYm86CnJ1bUEgPC0gcmVhZF9jc3YoIi9Vc2Vycy9zYXJlbnNlZWxleS9Ecm9wYm94L0dyYW50c1wgYW5kXCBBcHBsaWNhdGlvbnMvTlJTQVwgRjMxXCAyMDE4LTIwMTkvUmVzdWJtaXNzaW9uXCBSZXZpZXdzL3Bvd2VyLWFuYWx5c2lzL3J1bWluYXRpb25fdHhBLmNzdiIpCgojIGNyZWF0ZSBjb21wb3NpdGUgdmFyaWFibGVzIGZvciAoMSkgZm9jdXMgb24gc3BvdXNlIGluIHBvc3Qtc2NhbiByZXNwb25zZXMsIGFuZCAoMikgb2YgYWxsIG9mIHRoZSB0aGluZ3MgdGhleSByZXBvcnRlZCB0aGlua2luZyBhYm91dCwgd2hhdCAlIG9mIHdoYXQgdGhleSBtZW50aW9uZWQgd2FzIHJlbGF0ZWQgdG8gdGhlaXIgc3BvdXNlL2RlYXRoPwpydW1BJGZvY3VzX3Nwb3VzZSA8LSAocnVtQSRzcG91c2VfMStydW1BJHNwb3VzZV8yKSAKcnVtQSRmb2N1c190YXNrIDwtIChydW1BJHRhc2tfMStydW1BJHRhc2tfMikgCnJ1bUEkZm9jdXNfd2hvdG8gPC0gKHJ1bUEkd2hvdG9fMStydW1BJHdob3RvXzIpIApydW1BJGZvY3VzX290aGVycGljcyA8LSAocnVtQSRvdGhlcnBpY3NfMStydW1BJG90aGVycGljc18yKSAKcnVtQSRmb2N1c19ub25zcG91c2UgPC0gKHJ1bUEkc3BvdXNlXzErcnVtQSRzcG91c2VfMitydW1BJHRhc2tfMStydW1BJHRhc2tfMitydW1BJHdob3RvXzErcnVtQSR3aG90b18yK3J1bUEkb3RoZXJwaWNzXzErcnVtQSRvdGhlcnBpY3NfMitydW1BJHNvbWF0aWNfMStydW1BJHNvbWF0aWNfMitydW1BJG1ldGFjb2dfMStydW1BJG1ldGFjb2dfMikKcnVtQSRmb2N1c19zcG91c2VfcGVyYyA8LSAocnVtQSRmb2N1c19zcG91c2UvcnVtQSRmb2N1c19ub25zcG91c2UpClZpZXcocnVtQSkKCiMgcmVwbGFjZSBOYU5zIChnZW5lcmF0ZWQgYnkgZGl2aWRpbmcgemVybyBieSB6ZXJvKSB3aXRoIDAKZml4X25hbiA8LSBmdW5jdGlvbih4KXsKICAgIHhbaXMubmFuKHgpXSA8LSAwCiAgICB4Cn0KcnVtQSRmb2N1c19zcG91c2VfcGVyYyA8LSBmaXhfbmFuKHJ1bUEkZm9jdXNfc3BvdXNlX3BlcmMpICAgCgojIGRyb3AgdmFyaWFibGVzIGV4dHJhbmVvdXMgZm9yIHBvd2VyIGFuYWx5c2lzCnJ1bUEgPC0gcnVtQSAlPiUgc2VsZWN0KC1jKHBvc3Rfc3JvZV8xX0EsIHNwb3VzZV8xLCB0YXNrXzEsIHdob3RvXzEsIG90aGVycGljc18xLCBzb21hdGljXzEsIG1ldGFjb2dfMSwgcG9zdF9zcm9lXzJfQSwgc3BvdXNlXzIsIHRhc2tfMiwgd2hvdG9fMiwgb3RoZXJwaWNzXzIsIHNvbWF0aWNfMiwgbWV0YWNvZ18yLCBmb2N1c19zcG91c2UsIGZvY3VzX3Rhc2ssIGZvY3VzX3dob3RvLCBmb2N1c19vdGhlcnBpY3MsIGZvY3VzX25vbnNwb3VzZSkpCm5hbWVzKHJ1bUEpCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAojIG1ha2UgYSBzdWJzZXQgb2YgZGF0YSBmcm9tIG1hc3RlciBkYXRhc2V0CmRhdGFmb3JqZiA8LSBzZWxlY3QoZGF0YV9zcHIxOSxjKElELCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAsICMgY29tcGxpY2F0ZWQgZ3JpZWYgKENHKSBvciBub24tY29tcGxpY2F0ZWQgZ3JpZWYgKE5DRyksIGJhc2VkIG9uIHRvdF9pY2cgY2xpbmljYWwgY3V0b2ZmIG9mID4yNQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RfaWNnLCAjIEludmVudG9yeSBvZiBDb21wbGljYXRlZCBHcmllZiB0b3RhbCBzY29yZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RfYmRpLCAjIEJlY2sgRGVwcmVzc2lvbiBJbnZlbnRvcnkgdG90YWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdlX3lycywgIyBhZ2UgaW4geWVhcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V4X20sICMgc2V4IChtIGlzIHJlZmVyZW5jZSBjYXRlZ29yeSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXNpbmNlZGVhdGgsICMgdGltZSBlbGFwc2VkIChpbiBkYXlzKSBiZXR3ZWVuIHNwb3VzZSdzIGRlYXRoIGFuZCBzdHVkeSBwYXJ0aWNpcGF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4X3YxKSkgIyB3aGljaCB0cmVhdG1lbnQgdGhleSBnb3QgYXQgdGhlaXIgZmlyc3QgdmlzaXQgKEEgPSBwbGFjZWJvKQoKIyByZXBsYWNlICJEIiBwcmVmaXggaW4gSUQgdG8gInN1Yi0iIHNvIHRoYXQgdGhlIElEIHZhcmlhYmxlcyBtYXRjaCBhY3Jvc3MgZGF0YWZyYW1lcyB0byBtZXJnZQpkYXRhZm9yamYgPC0gZGF0YWZvcmpmICU+JSAKICBtdXRhdGUoSUQgPSBzdHJfcmVwbGFjZShJRCwgIkQiLCAic3ViLSIpKQpoZWFkKGRhdGFmb3JqZikKCiMgbWVyZ2Ugc3RhdGUgcmVwb3J0cyB3aXRoIEZOQy9ERk5DIHZhcmlhYmxlcwpzY2FuZGF0YSA8LSBsZWZ0X2pvaW4oZ2lmdF9vdXQsIHJ1bUEsIGJ5PWMoIklEIiwidHgiKSkKCiMgbWVyZ2Ugd2l0aCB0aW1lLWludmFyaWFudCB2YXJpYWJsZXMKZGF0YWZvcmpmIDwtIGxlZnRfam9pbihkYXRhZm9yamYsc2NhbmRhdGEsIGJ5PWMoIklEIikpCgojIHJlY29kZSBmYWN0b3JzOiBzdWJzdGl0dXRlICJwbGFjZWJvIiBmb3IgQS90eEEsIGFuZCAib3h5dG9jaW4iIGZvciBCL3R4QgojIHBsYWNlYm8gPSAwLCBveHl0b2NpbiA9IDEKZGF0YWZvcmpmIDwtIGRhdGFmb3JqZiAlPiUgbXV0YXRlKHR4X3YxID0gcmVjb2RlX2ZhY3Rvcih0eF92MSwgIkEiID0gMCwgIkIiID0gMSksIHR4ID0gcmVjb2RlX2ZhY3Rvcih0eCwgInR4QSIgPSAwLCAidHhCIiA9IDEpKSAKCiMgc2F2ZSBhcyBjc3YgZmlsZQp3cml0ZV9jc3YoZGF0YWZvcmpmLCAiL1VzZXJzL3NhcmVuc2VlbGV5L0Ryb3Bib3gvR3JhbnRzXCBhbmRcIEFwcGxpY2F0aW9ucy9OUlNBXCBGMzFcIDIwMTgtMjAxOS9SZXN1Ym1pc3Npb25cIFJldmlld3MvcG93ZXItYW5hbHlzaXMvZGF0YWZvcmpmLmNzdiIpCmBgYAoKIyMjIFdoaWNoIHN0YXRlcyBkbyBJIGNhcmUgYWJvdXQ/IAoKX0xvb2tpbmcgYXQgcmVzdWx0cyBmcm9tIDEtc2FtcGxlIHQgdGVzdCAoRkRSLWNvcnJlY3RlZCBwIDwgLjA1KSBpbiB0REZOQyB0b29sYm94Li4uXwoKKipTdGF0ZSAxKiogaXMgY2hhcmFjdGVyaXplZCBieToKCiogZ3JlYXRlciArIGNvbm5lY3Rpdml0eSBiZXR3ZWVuIGRlZmF1bHQgbW9kZSAoSUMxNCwgSUMxNyBbcHJlY3VuZXVzL1BDQywgYXV0b2JpbyBtZW1vcnldKQoqIGdyZWF0ZXIgKyBjb25uZWN0aXZpdHkgYmV0d2VlbiB0aGUgc2FsaWVuY2UgbmV0d29yayAoSUMxOSkgYW5kIHJpZ2h0IGZyb250b3BhcmlldGFsIG5ldHdvcmsgKElDNCkKKiBncmVhdGVyICsgY29ubmVjdGl2aXR5IGJldHdlZW4gdGhlIHNhbGllbmNlIG5ldHdvcmsgKElDMTkpIGFuZCBkZWZhdWx0IG1vZGUgbmV0d29yayAoSUMxNCBbcHJlY3VuZXVzL1BDQ10pCiogZ3JlYXRlciArIGNvbm5lY3Rpdml0eSBiZXR3ZWVuIHRoZSBzYWxpZW5jZSBuZXR3b3JrIChJQzE5KSBhbmQgZGVmYXVsdCBtb2RlIG5ldHdvcmsgKElDMTQgW3ByZWN1bmV1cy9QQ0NdKQoqIGdyZWF0ZXIgLSBjb25uZWN0aXZpdHkgYmV0d2VlbiB0aGUgc2FsaWVuY2UgbmV0d29yayAoSUMxOSkgYW5kIGRlZmF1bHQgbW9kZSBuZXR3b3JrIChJQzI3IFttaWRsaW5lL3NlbGYtcmVmZXJlbmNlL3NvY2lhbCBjb2ddKQoKIVtdKC9Vc2Vycy9zYXJlbnNlZWxleS9EZXNrdG9wL3Jlc3RpbmdzdGF0ZS9kYXRhL2Rlcml2YXRpdmVzL2dpZnQvYW5hbHlzZXMtbnJzYS1waWxvdC1wb3dlci9yZXN1bHRzX2ljYS1hcm9tYS9pY2EtYXJvbWEtZGVub2lzZWRfX3RERk5DL3RkZm5jXzRzdGF0ZXMvb25lLXNhbXBsZS10dGVzdF9yZXN1bHRzL2h0bWwvaWNhLWFyb21hLWRlbm9pc2VkX19kZm5jX2xvZ3BfdmFsdWVfMC4wNV9mZHJfY2x1c3Rlcl90dGVzdF8wMDEuanBnKQoKCgoqKlN0YXRlIDIqKiBpcyBjaGFyYWN0ZXJpemVkIGJ5IHN0cm9uZyBpbnRlcmNvcnJlbGF0aW9ucyBiZXR3ZWVuIGFuZCB3aXRoaW4gYWxsIG5ldHdvcmtzIF9leGNlcHQgZm9yXzoKCiogYmV0d2VlbiB0aGUgc2FsaWVuY2UgbmV0d29yayAoSUMxOSkgYW5kIG9uZSBvZiB0aGUgZGVmYXVsdCBtb2RlIElDcyAoSUMyNyBbbWlkbGluZS9zZWxmLXJlZmVyZW5jZS9zb2NpYWwgY29nXSkKKiBJQzI3IGlzIGFsc28gbGVzcyBzdHJvbmdseSBjb25uZWN0ZWQgd2l0aCB0aGUgcmlnaHQgZnJvbnRvcGFyaWV0YWwgbmV0d29yayAoSUMxMykgYW5kIGFub3RoZXIgZGVmYXVsdCBtb2RlIElDIChJQzE3IFthdXRvYmlvIG1lbW9yeV0pCgohW10oL1VzZXJzL3NhcmVuc2VlbGV5L0Rlc2t0b3AvcmVzdGluZ3N0YXRlL2RhdGEvZGVyaXZhdGl2ZXMvZ2lmdC9hbmFseXNlcy1ucnNhLXBpbG90LXBvd2VyL3Jlc3VsdHNfaWNhLWFyb21hL2ljYS1hcm9tYS1kZW5vaXNlZF9fdERGTkMvdGRmbmNfNHN0YXRlcy9vbmUtc2FtcGxlLXR0ZXN0X3Jlc3VsdHMvaHRtbC9pY2EtYXJvbWEtZGVub2lzZWRfX2RmbmNfbG9ncF92YWx1ZV8wLjA1X2Zkcl9jbHVzdGVyX3R0ZXN0XzAwMi5qcGcpCjxwPiZuYnNwOzxwPgoKKipTdGF0ZSAzKiogaXMgY2hhcmFjdGVyaXplZCBieToKCiogZ3JlYXRlciArIGNvbm5lY3Rpdml0eSB3aXRoaW4gdGhlIGRlZmF1bHQgbW9kZSBuZXR3b3JrIChJQ3MgMTQsIDE3LCAyNykKKiBncmVhdGVyIC0gY29ubmVjdGl2aXR5IGJldHdlZW4gdGhlIHNhbGllbmNlIG5ldHdvcmsgKElDMTkpIGFuZCBkZWZhdWx0IG1vZGUgbmV0d29yayAoSUMyNyBbbWlkbGluZS9zZWxmLXJlZmVyZW5jZS9zb2NpYWwgY29nXSkKCiFbXSgvVXNlcnMvc2FyZW5zZWVsZXkvRGVza3RvcC9yZXN0aW5nc3RhdGUvZGF0YS9kZXJpdmF0aXZlcy9naWZ0L2FuYWx5c2VzLW5yc2EtcGlsb3QtcG93ZXIvcmVzdWx0c19pY2EtYXJvbWEvaWNhLWFyb21hLWRlbm9pc2VkX190REZOQy90ZGZuY180c3RhdGVzL29uZS1zYW1wbGUtdHRlc3RfcmVzdWx0cy9odG1sL2ljYS1hcm9tYS1kZW5vaXNlZF9fZGZuY19sb2dwX3ZhbHVlXzAuMDVfZmRyX2NsdXN0ZXJfdHRlc3RfMDAzLmpwZykKCioqU3RhdGUgNCoqIGlzIGNoYXJhY3Rlcml6ZWQgYnk6CgoqIGdyZWF0ZXIgKyBjb25uZWN0aXZpdHkgd2l0aGluIHRoZSBmcm9udG9wYXJpZXRhbCBuZXR3b3JrIChJQ3MgNCwgMTMpCiogZ3JlYXRlciArIGNvbm5lY3Rpdml0eSB3aXRoaW4gdGhlIGRlZmF1bHQgbW9kZSBJQ3MgKElDMTQgW3ByZWN1bmV1cy9QQ0NdIHcvSUMyNyBbbWlkbGluZS9zZWxmLXJlZmVyZW5jZS9zb2NpYWwgY29nXSBhbmQgSUMxNCBbcHJlY3VuZXVzL1BDQ10gdy9JQzE3IFthdXRvYmlvIG1lbW9yeV0pCiogZ3JlYXRlciArIGNvbm5lY3Rpdml0eSBiZXR3ZWVuIHRoZSBmcm9udG9wYXJpZXRhbCBuZXR3b3JrIChJQyA0LCAxMykgYW5kIG1pZGxpbmUgZGVmYXVsdCBtb2RlIG5ldHdvcmsgKElDMTQgW3ByZWN1bmV1cy9QQ0NdLCBJQzI3IFttaWRsaW5lL3NlbGYtcmVmZXJlbmNlL3NvY2lhbCBjb2ddKQoqIGdyZWF0ZXIgLSBjb25uZWN0aXZpdHkgYmV0d2VlbiB0aGUgc2FsaWVuY2UgbmV0d29yayAoSUMxOSkgYW5kIG1pZGxpbmUgZGVmYXVsdCBtb2RlIG5ldHdvcmsgKElDMTQgW3ByZWN1bmV1cy9QQ0NdLCBJQzI3IFttaWRsaW5lL3NlbGYtcmVmZXJlbmNlL3NvY2lhbCBjb2ddKQoqIGdyZWF0ZXIgLSBjb25uZWN0aXZpdHkgYmV0d2VlbiB0aGUgc2FsaWVuY2UgbmV0d29yayAoSUMxOSkgYW5kIGxlZnQgZnJvbnRvcGFyaWV0YWwgbmV0d29yayAoSUM0KQoKIVtdKC9Vc2Vycy9zYXJlbnNlZWxleS9EZXNrdG9wL3Jlc3RpbmdzdGF0ZS9kYXRhL2Rlcml2YXRpdmVzL2dpZnQvYW5hbHlzZXMtbnJzYS1waWxvdC1wb3dlci9yZXN1bHRzX2ljYS1hcm9tYS9pY2EtYXJvbWEtZGVub2lzZWRfX3RERk5DL3RkZm5jXzRzdGF0ZXMvb25lLXNhbXBsZS10dGVzdF9yZXN1bHRzL2h0bWwvaWNhLWFyb21hLWRlbm9pc2VkX19kZm5jX2xvZ3BfdmFsdWVfMC4wNV9mZHJfY2x1c3Rlcl90dGVzdF8wMDQuanBnKQoKIyMjIyMgSW50ZXJwcmV0YXRpb25zCioqU3RhdGUgMSoqOiBWYXN0IG1ham9yaXR5ICgzNS8zOCkgb2Ygc3ViamVjdHMgc2hvdyB0aGlzIHN0YXRlLiBUaGlzIG9uZSBzZWVtcyBtb3N0bHkgYWJvdXQgY29ubmVjdGl2aXR5IHdpdGhpbiB0aGUgcG9zdGVyaW9yIERNTiwgYW5kIG9mIEwgZnJvbnRvcGFyaWV0YWwgd2l0aCBkZWZhdWx0IG1vZGUgYW5kIHNhbGllbmNlIG5ldHdvcmtzLiAKCioqU3RhdGUgMioqOiBTdHJvbmcgaW50ZXJjb3JyZWxhdGlvbnMgd2l0aGluIGFuZCBiZXR3ZWVuIG5lYXJseSBhbGwgSUNzLiAoTWVhbmluZz8/PykgVGhpcyBpcyB0aGUgc3RhdGUgaW4gd2hpY2ggZGVmYXVsdCBtb2RlIGNvbXBvbmVudHMgKElDMTQsIElDMTcpIGFyZSBwb3NpdGl2ZWx5IGNvdXBsZWQgd2l0aCB0aGUgc2FsaWVuY2UgbmV0d29yayBjb21wb25lbnQgKElDMTkpLCBhbmQgbG9va3MgdGhlIG1vc3QgbGlrZSBGaWcuIDIgZnJvbSBteSBwcm9wb3NhbDoKCiFbXSgvVXNlcnMvc2FyZW5zZWVsZXkvRHJvcGJveC9HcmFudHMgYW5kIEFwcGxpY2F0aW9ucy9OUlNBIEYzMSAyMDE4LTIwMTkvUmVzdWJtaXNzaW9uIFJldmlld3MvcG93ZXItYW5hbHlzaXMvaHRtbC9yZXNlYXJjaC1zdHJhdGVneV9maWcyLnBuZykKCl9GaWd1cmUgMi4gSHlwb3RoZXNpemVkIG1ham9yIG5ldHdvcmsgaW50ZXJhY3Rpb25zIGluIGNvbXBsaWNhdGVkIGdyaWVmLCBzaG93aW5nIHRoZSBmbG93IGFuZCBjb250ZW50IG9mIHNwb250YW5lb3VzIHRob3VnaHQgYXMgcG90ZW50aWFsbHkgbW9yZSBhdXRvbWF0aWNhbGx5IGNvbnN0cmFpbmVkIGFuZCBsZXNzIHZhcmlhYmxlIGR1ZSB0byAoYSkgbGVzc2VyIGluZmx1ZW5jZSBmcm9tIGV4ZWN1dGl2ZSBjb250cm9sIHJlZ2lvbnMgb3ZlciBkZWZhdWx0IG1vZGUgaW5mbHVlbmNlMjYsIChiKSBncmVhdGVyIGluZmx1ZW5jZSBmcm9tIGRlZmF1bHQgbW9kZSBjb3JlIHN1YnN5c3RlbSByZWdpb25zNDgsIGFuZCAoYykgZ3JlYXRlciBpbmZsdWVuY2Ugb2YgdGhlIHNhbGllbmNlIG5ldHdvcmsg4oCTIHNvIHRob3VnaHRzIGFyZSBpbnRydXNpdmUsIGluZmxleGlibGUsIGFuZCBmaXhhdGVkIG9uIHRoZSBsb3NzLl8KCioqU3RhdGUgMyoqOiBDb2duaXRpb24gZHJpdmVuIGJ5IGludGVybmFsbHktb3JpZW50ZWQgdGhvdWdodHMgZnJvbSBkZWZhdWx0IG1vZGUgbmV0d29yayAobWVtb3J5LCBzZWxmLXJlZmVyZW50aWFsKS4gU2FsaWVuY2UgYW5kIGZyb250b3BhcmlldGFsIG5ldHdvcmtzIGFyZSBuZWdhdGl2ZWx5IGNvcnJlbGF0ZWQgd2l0aCBkZWZhdWx0IG1vZGUgYWN0aXZpdHkgLSBmZXcgY29uc3RyYWludHMgb3ZlciB0aG91Z2h0LiBNaW5kLXdhbmRlcmluZz8KCioqU3RhdGUgNCoqOiBTdHJvbmcgRk5DIHdpdGhpbiBhbmQgYmV0d2VlbiBkZWZhdWx0IG1vZGUgYW5kIGZyb250b3BhcmlldGFsIGNvbnRyb2wgbmV0d29yayBjb21wb25lbnRzLiBTYWxpZW5jZSBuZXR3b3JrIG5lZ2F0aXZlbHkgY291cGxlZCB3aXRoIGZyb250b3BhcmlldGFsIG5ldHdvcmsgYW5kIGRlZmF1bHQgbW9kZSBjb21wb25lbnRzLiBNYXkgcmVmbGVjdCBtb3JlIGdvYWwtZGlyZWN0ZWQgY29nbml0aW9uPwoKCiMgVmFyaWFibGVzIGluIGRhdGFzZXQgJ2RhdGFmb3JqZi5jc3YnCjx1bD4KYElEYDogU3ViamVjdCBJRAoKYHRvdF9pY2dgOiBJbnZlbnRvcnkgb2YgQ29tcGxpY2F0ZWQgR3JpZWYgdG90YWwgc2NvcmUgXyhncmllZiBzeW1wdG9tcyBtZWFzdXJlKV8KCmBncm91cGA6IENvbXBsaWNhdGVkIGdyaWVmIChDRykgb3Igbm9uLWNvbXBsaWNhdGVkIGdyaWVmIChOQ0cpLCBiYXNlZCBvbiBgdG90X2ljZ2AgY2xpbmljYWwgY3V0b2ZmIG9mID4yNSBfKE5DRyA9IDAsIENHID0gMSlfCgpgYWdlX3lyc2A6IEFnZSBpbiB5ZWFycwoKYHRpbWVzaW5jZWRlYXRoYDogVGltZSAoaW4gZGF5cykgZWxhcHNlZCBiZXR3ZWVuIGRhdGUgb2Ygc3BvdXNlJ3MgZGVhdGggYW5kIGRhdGUgb2Ygc3R1ZHkgcGFydGljaXBhdGlvbiAoc2Vzc2lvbiAxKQoKYHNleF9tYDogU2V4IF8obWFsZSA9IDAsIGZlbWFsZSA9IDEpXwoKYHR4X3YxYDogVHJlYXRtZW50IHJlY2VpdmVkIGF0IGZpcnN0IHZpc2l0IF8ocGxhY2VibyA9IDAsIG94eXRvY2luID0gMSlfIChmb3Igb3JkZXIgZWZmZWN0cykKCmB0eGA6IE9ic2VydmF0aW9uIGNvbWVzIGZyb20gd2hpY2ggc2Vzc2lvbj8gXyhwbGFjZWJvID0gMCwgb3h5dG9jaW4gPSAxKV8KCmBmb2N1c19zcG91c2VfcGVyY2A6IE9mIHRoZSBudW1iZXIgb2YgZGlmZmVyZW50IGNvbnRlbnQgYXJlYXMgbWVudGlvbmVkIGluIHRoZSBwb3N0LXNjYW4gZnJlZSByZXNwb25zZSBzZWxmLXJlcG9ydCBxdWVzdGlvbnMgYWJvdXQgd2hhdCB0aGV5IHdlcmUgdGhpbmtpbmcvZmVlbGluZyBhbmQgZG9pbmcgZHVyaW5nIHRoZSB0YXNrLCB3aGF0IHByb3BvcnRpb24gd2FzIHNwb3VzZS1yZWxhdGVkPyAoZWFjaCBvZiBzaXggY29udGVudCBhcmVhcyB3YXMgc2NvcmVkIDAvMSBmb3IgYWJzZW50L3ByZXNlbnQsIHNjb3JlcyBvbiBzcG91c2UgZHVtbXkgdmFyaWFibGUgc3VtbWVkIFtyYW5nZSAwLTJdLCB0aGVuIGRpdmlkZWQgYnkgYW4gYWdncmVnYXRlIHNjb3JlIHRoYXQgc3VtbWVkIGFsbCBkdW1teSB2YXJpYWJsZXMgdG8geWllbGQgYSBtZWFzdXJlIG9mIGhvdyBmb2N1c2VkIHRoZXkgd2VyZSBvbiB0aGVpciBzcG91c2UgYW5kL29yIHRoZWlyIGRlYXRoIGR1cmluZyB0aGUgdGFzay4pIEkgbmVlZCB0byB0aGluayBtb3JlIGFib3V0IGhvdyBiZXN0IHRvIGdldCBhIG1ldHJpYyB0aGF0IGNhcHR1cmVzIHdoYXQgSSdtIGxvb2tpbmcgZm9yIC0tIEknbSBub3Qgc3VyZSB0aGlzIGlzIGl0LiAKCmBtZXRhX3N0YXRlc19udW1zdGF0ZXNgOiBOdW1iZXIgb2YgdW5pcXVlIHdpbmRvd3MgZm9yIGVhY2ggc3ViamVjdAoKYG1ldGFfc3RhdGVzX3RvdGFsZGlzdGA6IFN1bSBvZiBMMSBkaXN0YW5jZXMgYmV0d2VlbiBzdWNjZXNzaXZlIG1ldGEtc3RhdGVzIGZvciBlYWNoIHN1YmplY3QgCgpgbWV0YV9zdGF0ZXNfY2hhbmdlc3RhdGVzYDogTnVtYmVyIG9mIHRpbWVzIGVhY2ggc3ViamVjdCBjaGFuZ2VzIGZyb20gb25lIG1ldGEgc3RhdGUgdG8gb3RoZXIKCmBtZXRhX3N0YXRlc19zdGF0ZXNwYW5gOiBNYXhpbXVtIEwxIGRpc3RhbmNlIGJldHdlZW4gc3RhdGVzIGZvciBlYWNoIHN1YmplY3QKCmBzdGF0ZXN0YXRzX2ZyYWN0X3RpbWVfczFgOiBGcmFjdGlvbiBvZiB0aW1lIHNwZW50IGluIHN0YXRlIDEKCmBzdGF0ZXN0YXRzX2ZyYWN0X3RpbWVfczJgOiBGcmFjdGlvbiBvZiB0aW1lIHNwZW50IGluIHN0YXRlIDIKCmBzdGF0ZXN0YXRzX2ZyYWN0X3RpbWVfczNgOiBGcmFjdGlvbiBvZiB0aW1lIHNwZW50IGluIHN0YXRlIDMKCmBzdGF0ZXN0YXRzX2ZyYWN0X3RpbWVfczRgOiBGcmFjdGlvbiBvZiB0aW1lIHNwZW50IGluIHN0YXRlIDQKCmBzdGF0ZXN0YXRzX2R3ZWxsdGltZV9zMWA6IFRoZSBhdmVyYWdlIGFtb3VudCBvZiB0aW1lIHNwZW50IHN0YXRlIDEgYmVmb3JlIHNoaWZ0aW5nIHRvIGFub3RoZXIgc3RhdGUgKGZvciBlYWNoIHN1YmplY3QgYW5kIHNlc3Npb24pCgpgc3RhdGVzdGF0c19kd2VsbHRpbWVfczJgOiBUaGUgYXZlcmFnZSBhbW91bnQgb2YgdGltZSBzcGVudCBzdGF0ZSAyIGJlZm9yZSBzaGlmdGluZyB0byBhbm90aGVyIHN0YXRlIChmb3IgZWFjaCBzdWJqZWN0IGFuZCBzZXNzaW9uKQoKYHN0YXRlc3RhdHNfZHdlbGx0aW1lX3MzYDogVGhlIGF2ZXJhZ2UgYW1vdW50IG9mIHRpbWUgc3BlbnQgc3RhdGUgMyBiZWZvcmUgc2hpZnRpbmcgdG8gYW5vdGhlciBzdGF0ZSAoZm9yIGVhY2ggc3ViamVjdCBhbmQgc2Vzc2lvbikKCmBzdGF0ZXN0YXRzX2R3ZWxsdGltZV9zNGA6IFRoZSBhdmVyYWdlIGFtb3VudCBvZiB0aW1lIHNwZW50IHN0YXRlIDQgYmVmb3JlIHNoaWZ0aW5nIHRvIGFub3RoZXIgc3RhdGUgKGZvciBlYWNoIHN1YmplY3QgYW5kIHNlc3Npb24pCgpgc3RhdGVzdGF0c19udW10cmFuc2l0aW9uc2A6IEhvdyBtYW55IHN0YXRlIHRyYW5zaXRpb25zIG9jY3VycmVkIChmb3IgZWFjaCBzdWJqZWN0IGFuZCBzZXNzaW9uKQoKYGZuY19jMDRjMTNgOiBTdGF0aWMgRk5DIHdpdGhpbiB0aGUgZnJvbnRvcGFyaWV0YWwgbmV0d29yawoKYGZuY19jMDRjMTRgOiBTdGF0aWMgRk5DIGJldHdlZW4gdGhlIGZyb250b3BhcmlldGFsIGFuZCBkZWZhdWx0IG1vZGUgbmV0d29yawoKYGZuY19jMTRjMTdgOiBTdGF0aWMgRk5DIHdpdGhpbiB0aGUgZGVmYXVsdCBtb2RlIG5ldHdvcmsKCmBmbmNfYzE0YzI3YDogU3RhdGljIEZOQyB3aXRoaW4gdGhlIGRlZmF1bHQgbW9kZSBuZXR3b3JrCgpgZm5jX2MxOWMyN2A6IFN0YXRpYyBGTkMgYmV0d2VlbiB0aGUgc2FsaWVuY2UgYW5kIGRlZmF1bHQgbW9kZSBuZXR3b3JrCjwvdWw+CgoKCgojIEFpbXMsIGFuYWx5c2VzIGFuZCBzeW50YXgKCiMjIyBBaW0gMQoKKipBaW0gMS4gVG8gdGVzdCB3aGV0aGVyIGR5bmFtaWMgZnVuY3Rpb25hbCBjb25uZWN0aXZpdHkgdW5kZXIgcGxhY2VibyBkaWZmZXJzIGFtb25nIHdpZG93ZWQgb2xkZXIgYWR1bHRzIHdobyBhcmUgYWRqdXN0aW5nIHdlbGwsIHZlcnN1cyB0aG9zZSB3aG8gYXJlIGFkanVzdGluZyBwb29ybHkgKGkuZS4sIGNvbXBsaWNhdGVkIGdyaWVmKS4qKgoKICogSDE6IENvbXBsaWNhdGVkIGdyaWVmIHN5bXB0b20gc2V2ZXJpdHkgW2B0b3RfaWNnYF0gd2lsbCBwcmVkaWN0IGxvd2VyIHZhcmlhYmlsaXR5IGluIHNwb250YW5lb3VzIHRob3VnaHQgZmxvdyBvdmVyIHRpbWUsIGFzIGluZGV4ZWQgYnkgZmV3ZXIgZnVuY3Rpb25hbCBjb25uZWN0aXZpdHkgc3RhdGUgdHJhbnNpdGlvbnMgb3ZlciB0aGUgcmVzdGluZyBzdGF0ZSBzY2FuIFtgc3RhdGVzdGF0c19udW10cmFuc2l0aW9uc2BdLgogCiAqIEgyOiBDb21wbGljYXRlZCBncmllZiBzeW1wdG9tIHNldmVyaXR5IFtgdG90X2ljZ2BdIHdpbGwgcHJlZGljdCBncmVhdGVyIGF1dG9tYXRpYyBjb25zdHJhaW50cyBvbiB0aG91Z2h0IGNvbnRlbnQsIGFzIGluZGV4ZWQgYnkgbW9yZSBkd2VsbCB0aW1lIGluIHN0YXRlcyBvZiBkZWZhdWx0IG1vZGUtc2FsaWVuY2UgbmV0d29yayBpbnRlcmNvbm5lY3Rpdml0eSBbYHN0YXRlc3RhdHNfZHdlbGx0aW1lX3MyYF0uCiAKICogSDM6IFJ1bWluYXRpdmUgY29udGVudCBpbiBzZWxmLXJlcG9ydGVkIHByZS1yZXN0aW5nIHN0YXRlIHRob3VnaHQgY29udGVudCBbYHN0YXRlX3J1bWBdIHdpbGwgbWVkaWF0ZSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gZ3JpZWYgc3ltcHRvbSBzZXZlcml0eSBbYHRvdF9pY2dgXSBhbmQgYXV0b21hdGljIGNvbnN0cmFpbnRzIGFzIGluZGV4ZWQgYnkgZHdlbGwgdGltZSBpbiBzdGF0ZXMgb2YgZGVmYXVsdCBtb2RlLXNhbGllbmNlIG5ldHdvcmsgaW50ZXJjb25uZWN0aXZpdHkgW2BzdGF0ZXN0YXRzX2R3ZWxsdGltZV9zMmBdLgogCioqQW5hbHlzaXMqKiA8YnI+IApGcm9tIHRoZSBncmFudDogCgoqIEgxICYgSDI6IF9Ud28gc2VwYXJhdGUgaGllcmFyY2hpY2FsIHJlZ3Jlc3Npb24gbW9kZWxzIHdpbGwgYmUgdXNlZCB0byB0ZXN0IChBKSB3aGV0aGVyIHRoZSBjb250aW51b3VzIHNjb3JlIG9mIGdyaWVmIHNldmVyaXR5IHByZWRpY3RzIGR5bmFtaWMgZnVuY3Rpb25hbCBjb25uZWN0aXZpdHkgdmFyaWFibGVzIChuIHRyYW5zaXRpb25zIGluIEgxOyBkd2VsbCB0aW1lIGluIEgyKSwgYW5kIChCKSB3aGV0aGVyIGdyaWVmIHNldmVyaXR5IHJlbWFpbnMgcHJlZGljdGl2ZSB3aGVuIG90aGVyIHBsYXVzaWJsZSBleHBsYW5hdG9yeSB2YXJpYWJsZXMgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aW1lIHNpbmNlIGRlYXRoLCBkZXByZXNzaXZlIHN5bXB0b20gc2V2ZXJpdHksIGFuZCBhZ2UgYXJlIGluY2x1ZGVkIGluIHRoZSBtb2RlbC4gVXNpbmcgUiwgSSB3aWxsIG1hbnVhbGx5IGJ1aWxkIGVhY2ggbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgdGhlbiBwZXJmb3JtIG1vZGVsIGNvbXBhcmlzb24gdG8gaWRlbnRpZnkgd2hldGhlciB0aGUgbW9kZWwgd2l0aCB0aGUgYWRkaXRpb25hbCBwcmVkaWN0b3JzIHBlcmZvcm1zIHNpZ25pZmljYW50bHkgYmV0dGVyIHRoYW4gdGhlIHNpbXBsZXIgbW9kZWwsIGJhc2VkIG9uIHRoZSBGIHRlc3QuXwoKPGZvbnQgY29sb3I9InJlZCI+Rm9yIHRoZSBwb3dlciBhbmFseXNpcywgd2UgaGFkIGRpc2N1c3NlZCBqdXN0IHVzaW5nIHRoZSBmaXJzdCBtb2RlbCB3aXRob3V0IHRoZSBjb3ZhcmlhdGVzLCBJIHRoaW5rLjwvZm9udD4KCiogSDM6IF9PYnNlcnZlci1yYXRlZCBydW1pbmF0aXZlIGNvbnRlbnQgaW4gdGhlIHBvc3Qtc2NhbiByZXBvcnRzLi4ud2lsbCBiZSB0ZXN0ZWQgdG8gaWRlbnRpZnkgd2hldGhlciB0aGUgZWZmZWN0IG9mIGdyaWVmIHNldmVyaXR5IG9uIERGTkMgaXMgZXhwbGFpbmVkIGJ5IGhvdyBtdWNoIHBlb3BsZSB3ZXJlIHJ1bWluYXRpbmcgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSByZXN0aW5nIHN0YXRlIHNjYW4uIEEgbWVkaWF0aW9uIG1vZGVsIHdpbGwgYmUgdXNlZCB0byB0ZXN0IHRoZSBpbmRpcmVjdCBhbmQgdG90YWwgZWZmZWN0cyBvZiBydW1pbmF0aXZlIGNvbnRlbnQgb24gZHdlbGwgdGltZSwgdXNpbmcgdGhlIFIgcGFja2FnZSAibWVkaWF0aW9uIjc5Ll8KCgpgYGB7cn0KIyBpbnN0YWxsLnBhY2thZ2VzKCJtZWRpYXRpb24iKQojIGluc3RhbGwucGFja2FnZXMoImRwbHlyIikKbGlicmFyeShtZWRpYXRpb24pCmxpYnJhcnkoZHBseXIpCmZpbHRlciA8LSBkcGx5cjo6ZmlsdGVyCgpkYXRhZm9yamYgPC0gcmVhZF9jc3YoIi9Vc2Vycy9zYXJlbnNlZWxleS9Ecm9wYm94L0dyYW50c1wgYW5kXCBBcHBsaWNhdGlvbnMvTlJTQVwgRjMxXCAyMDE4LTIwMTkvUmVzdWJtaXNzaW9uXCBSZXZpZXdzL3Bvd2VyLWFuYWx5c2lzL2RhdGFmb3JqZi5jc3YiKQoKIyBVc2UgUExBQ0VCTyBTRVNTSU9OUyBPTkxZIGZvciB0aGUgZm9sbG93aW5nIGFuYWx5c2VzCmRhdGFfcGwgPC0gZGF0YWZvcmpmICU+JSBmaWx0ZXIodHggPT0gMCkKCiMjIyBBaW0gMSBIeXBvdGhlc2lzIDEKIyBGaXJzdCBtb2RlbCB3aXRoIGdyaWVmIHNldmVyaXR5IG9ubHkKbTEgPC0gbG0oc3RhdGVzdGF0c19udW10cmFuc2l0aW9ucyB+IHRvdF9pY2csIGRhdGEgPSBkYXRhX3BsKQpzdW1tYXJ5KG0xKQoKIyBTZWNvbmQgbW9kZWwgaW5jbHVkaW5nIG90aGVyIGh5cG90aGVzaXplZCBwcmVkaWN0b3JzIAojIChoZXJlLCBkZXByZXNzaW9uIHN5bXB0b21zICsgYWdlICsgdGltZSBzaW5jZSBzcG91c2UncyBkZWF0aCBhdCB0aW1lIG9mIHN0dWR5KToKbTIgPC0gbG0oc3RhdGVzdGF0c19udW10cmFuc2l0aW9ucyB+IHRvdF9pY2cgKyB0b3RfYmRpICsgYWdlX3lycyArIHRpbWVzaW5jZWRlYXRoLCBkYXRhID0gZGF0YV9wbCkgCnN1bW1hcnkobTIpCgojIENvbXBhcmluZyBzdW0gb2Ygc3F1YXJlcyAmIGNvcnJlc3BvbmRpbmcgRiBzdGF0aXN0aWNzIGFuZCBwLXZhbHVlcyBmb3IgbTEgYW5kIG0yOiAKYW5vdmEobTEsbTIpCgoKIyMjIEFpbSAxIEh5cG90aGVzaXMgMgojIEZpcnN0IG1vZGVsIHdpdGggZ3JpZWYgc2V2ZXJpdHkgb25seQptMyA8LSBsbShzdGF0ZXN0YXRzX2R3ZWxsdGltZV9zMiB+IHRvdF9pY2csIGRhdGEgPSBkYXRhX3BsKQpzdW1tYXJ5KG0zKQoKIyBTZWNvbmQgbW9kZWwgaW5jbHVkaW5nIG90aGVyIGh5cG90aGVzaXplZCBwcmVkaWN0b3JzIAojIChoZXJlLCBkZXByZXNzaW9uIHN5bXB0b21zICsgYWdlICsgdGltZSBzaW5jZSBzcG91c2UncyBkZWF0aCBhdCB0aW1lIG9mIHN0dWR5KToKbTQgPC0gbG0oc3RhdGVzdGF0c19kd2VsbHRpbWVfczIgfiB0b3RfaWNnICsgdG90X2JkaSArIGFnZV95cnMgKyB0aW1lc2luY2VkZWF0aCwgZGF0YSA9IGRhdGFfcGwpIApzdW1tYXJ5KG00KQoKIyBDb21wYXJpbmcgc3VtIG9mIHNxdWFyZXMgJiBjb3JyZXNwb25kaW5nIEYgc3RhdGlzdGljcyBhbmQgcC12YWx1ZXMgZm9yIG0zIGFuZCBtNDogCmFub3ZhKG0zLG00KQoKCiMjIyBBaW0gMSBIeXBvdGhlc2lzIDMKCiMgbW9kZWwuTSA8LSBsbShNIH4gWCwgbXlEYXRhKQojIG1vZGVsLlkgPC0gbG0oWSB+IFggKyBNLCBteURhdGEpCiMgcmVzdWx0cyA8LSBtZWRpYXRlKG1vZGVsLk0sIG1vZGVsLlksIHRyZWF0PSdYJywgbWVkaWF0b3I9J00nLAojICAgICAgICAgICAgICAgICAgIGJvb3Q9VFJVRSwgc2ltcz0xMDApCgojIFggPSB0b3RfaWNnCiMgTSA9IGZvY3VzX3Nwb3VzZV9wZXJjCiMgWSA9IHN0YXRlc3RhdHNfZHdlbGx0aW1lX3MyCgptTSA8LSBsbShmb2N1c19zcG91c2VfcGVyYyB+IHRvdF9pY2csIGRhdGFfcGwpCnN1bW1hcnkobU0pCm1ZIDwtIGxtKHN0YXRlc3RhdHNfZHdlbGx0aW1lX3MyIH4gdG90X2ljZyArIGZvY3VzX3Nwb3VzZV9wZXJjLCBkYXRhX3BsKQpzdW1tYXJ5KG1ZKQpyZXN1bHRzIDwtIG1lZGlhdGlvbjo6bWVkaWF0ZShtTSwgbVksIHRyZWF0PSd0b3RfaWNnJywgbWVkaWF0b3I9J2ZvY3VzX3Nwb3VzZV9wZXJjJywKICAgICAgICAgICAgICAgICAgIGJvb3Q9VFJVRSwgc2ltcz0xMDAwKQpzdW1tYXJ5KHJlc3VsdHMpCgojIEFDTUUgc3RhbmRzIGZvciBBdmVyYWdlIENhdXNhbCBNZWRpYXRpb24gRWZmZWN0cwojIEFERSBzdGFuZHMgZm9yIEF2ZXJhZ2UgRGlyZWN0IEVmZmVjdHMKIyBUb3RhbCBFZmZlY3QgaXMgYSBzdW0gb2YgYSBtZWRpYXRpb24gKGluZGlyZWN0KSBlZmZlY3QgYW5kIGEgZGlyZWN0IGVmZmVjdApgYGAKCgojIyMgQWltIDIKCioqQWltIDIuIFRvIGlkZW50aWZ5IGhvdyBpbnRyYW5hc2FsIG94eXRvY2luIGFsdGVycyBkeW5hbWljIGZ1bmN0aW9uYWwgY29ubmVjdGl2aXR5IGluIG9sZGVyIGFkdWx0cywgYW5kIHdoZXRoZXIgZWZmZWN0cyBvZiBveHl0b2NpbiBhcmUgbW9kZXJhdGVkIGJ5IGdyaWVmIHNldmVyaXR5LioqCgoqIEgxOiBVbmRlciBveHl0b2NpbiBbYHR4YCA9PSAxXSwgdGhlIHNhbXBsZSBhcyBhIHdob2xlIHdpbGwgc2hvdyBpbmNyZWFzZWQgdGltZSBpbiBzYWxpZW5jZSBuZXR3b3JrLWRvbWluYW50IHN0YXRlcyBbYHN0YXRlc3RhdHNfZHdlbGx0aW1lX3MyYF0sIHJlbGF0aXZlIHRvIHBsYWNlYm8gIFtgdHhgID09IDBdLgoKKiBIMjogQ29tcGxpY2F0ZWQgZ3JpZWYgc3ltcHRvbSBzZXZlcml0eSB3aWxsIG1vZGVyYXRlIG94eXRvY2luIGVmZmVjdHMgb24gREZOQyBbYHN0YXRlc3RhdHNfZHdlbGx0aW1lX3MyYF0uCgoqKkFuYWx5c2VzKiogPGJyPiAKRnJvbSB0aGUgZ3JhbnQ6IAoKKiBIMTogX0RlcGVuZGVudCB0LXRlc3RzIHdpbGwgYmUgdXNlZCB0byBjb21wYXJlIG94eXRvY2luIGFuZCBwbGFjZWJvIGNvbmRpdGlvbnMgdG8gdGVzdCB3aGV0aGVyIG94eXRvY2luIChBKSBpbmNyZWFzZXMgZHdlbGwgdGltZSBpbiBzYWxpZW5jZS1uZXR3b3JrIGRvbWluYW50IHN0YXRlcyBhbmQvb3IgKEIpIHJlZHVjZXMgbiBzdGF0ZSB0cmFuc2l0aW9ucyBpbiB0aGUgc2FtcGxlLl8KCjxmb250IGNvbG9yPSJyZWQiPkhtbSwgbm90IHN1cmUgd2h5IEkgcHJvcG9zZWQgZG9pbmcgdCB0ZXN0cyBoZXJlIC0gSSB0aGluayBJIHdvdWxkIGdldCB0aGUgc2FtZSBpbmZvIGZyb20gdGhlIG1haW4gZWZmZWN0IG9mIGB0eGAgKG94eXRvY2luL3BsYWNlYm8pIGluIHRoZSBtb2RlbCBiZWxvdyBmb3IgSDIgYmVjYXVzZSB0aGUgb2JzZXJ2YXRpb25zIGFyZSBuZXN0ZWQgd2l0aGluIHBlcnNvbi4gQW0gSSBtaXNzaW5nIHNvbWV0aGluZyBoZXJlIG9yIHdhcyBJIGp1c3Qgbm90IHRoaW5raW5nIHdoZW4gSSB3cm90ZSB0aGlzPzwvZm9udD4KCiogSDI6IF9BIG11bHRpdmFyaWF0ZSBsaW5lYXIgbWl4ZWQgZWZmZWN0cyBtb2RlbCB3aWxsIGJlIHVzZWQgdG8gdGVzdCBncmllZiBzZXZlcml0eSBhcyBhIHBvdGVudGlhbCBtb2RlcmF0b3Igb2YgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvbmRpdGlvbiAob3h5dG9jaW4gdnMuIHBsYWNlYm8pIGFuZCBETkZDIGRlcGVuZGVudCB2YXJpYWJsZXMuIEJyb2FkbHksIHRoZSB0d28tIGludGVyY2VwdCBtb2RlbDgwIHdpbGwgcHJlZGljdCBkd2VsbCB0aW1lIGFuZCBuIHRyYW5zaXRpb25zIGFzIGEgZnVuY3Rpb24gb2Yg4oCcaW5kaWNhdG9yIHZhcmlhYmxl4oCdIChpLmUuLCB3aGljaCBEViksIGNvbmRpdGlvbiwgYW5kIElDRyBzY29yZSAobmVzdGVkIHdpdGhpbiBwZXJzb24gdG8gYWNjb3VudCBmb3IgaW50ZXJkZXBlbmRlbmNlKSwgdXNpbmcgbWF4aW11bSBsaWtlbGlob29kIGFzIGltcGxlbWVudGVkIGluIHRoZSBSIHBhY2thZ2UgbmxtZTgxLiBUaGlzIHR5cGUgb2YgbW9kZWwgYWxsb3dzIGZvciB0ZXN0aW5nIGRpZmZlcmVudGlhbCBlZmZlY3RzIG9uIHRoZSB0d28gRFZzIChkd2VsbCB0aW1lOyBuIHRyYW5zaXRpb25zKSBhbmQgcmVkdWNlcyBjaGFuY2Ugb2YgZXhwZXJpbWVudC13aXNlIFR5cGUtSSBlcnJvci4gQSBtdWx0aXZhcmlhdGUgbGluZWFyIG1peGVkIGVmZmVjdHMgbW9kZWwgYWxzbyBlc3RpbWF0ZXMgdGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gdGhlIERWcywgYW5kIGFsbG93cyB0aGVtIHRvIGhhdmUgZGlmZmVyZW50IHJlc2lkdWFsIHZhcmlhbmNlcy4gSXQgaXMgbW9zdCBwb3dlcmZ1bCB3aGVuIHRoZSBkZXBlbmRlbnQgdmFyaWFibGVzIGFyZSBjb3JyZWxhdGVkIChhcyB3ZSBtaWdodCBleHBlY3QgdGhlbSB0byBiZSBoZXJlIHNpbmNlIGR3ZWxsIHRpbWUgYW5kIG51bWJlciBvZiB0cmFuc2l0aW9ucyBhcmUgbGlrZWx5IGludmVyc2VseSByZWxhdGVkIHRvIGVhY2ggb3RoZXIpLl8KCjxmb250IGNvbG9yPSJyZWQiPkkgd291bGQgcmV2aXNlIHRoaXMgYW5hbHlzaXMgdG8ganVzdCBkbyBhIHJlZ3VsYXIgbGluZWFyIG1peGVkIGVmZmVjdHMgbW9kZWwgd2l0aCBvbmUgb3V0Y29tZSB2YXJpYWJsZSwgYHN0YXRlc3RhdHNfZHdlbGx0aW1lX3MyYC4gRHdlbGwgdGltZSBpbiBhIHBhcnRpY3VsYXIgc3RhdGUgaXMgbW9yZSBzcGVjaWZpYyBpbiB0ZXJtcyBvZiB3aGF0IGl0IGlzIG1lYXN1cmluZyB0aGFuIG51bWJlciBvZiB0cmFuc2l0aW9ucyBvdmVyYWxsLiBJIGZvdW5kIGEgdHV0b3JpYWwgb24gW211bHRpdmFyaWF0ZSByYW5kb20gY29lZmZpY2llbnQgbW9kZWxzXShodHRwczovL3N0YXRzLmlkcmUudWNsYS5lZHUvci9mYXEvbXVsdGl2YXJpYXRlLXJhbmRvbS1jb2VmZmljaWVudC1tb2RlbC8pIHVzaW5nIGBubG1lYCBidXQgaXQncyBhIGJpdCBvdmVyIG15IGhlYWQgYXQgdGhpcyB0aW1lLiAKCkkgYWxzbyBub3RlZCB0aGF0IGR3ZWxsIHRpbWUgaW4gc3RhdGUgMiBhbmQgbiB0cmFuc2l0aW9ucyBhcmUgYWN0dWFsbHkgbm90IGNvcnJlbGF0ZWQsIGFzIEkgZXhwZWN0ZWQgdGhlbSB0byBiZSAoYGNvcnIudGVzdChkYXRhJHN0YXRlc3RhdHNfZHdlbGx0aW1lX3MyLCBkYXRhJHN0YXRlc3RhdHNfbnVtdHJhbnNpdGlvbnMpYCBvdXRwdXRzIHIgPSAuMDUsIHAgPSAuNzApLjwvZm9udD4KCgpgYGB7cn0KbGlicmFyeShubG1lKQoKIyMjIEFpbSAyIEh5cG90aGVzaXMgMQojIFRoaXMgaHlwb3RoZXNpcyB0ZXN0cyB0aGUgbWFpbiBlZmZlY3Qgb2YgYHR4YCBpbiB0aGUgbW9kZWwgYmVsb3cuIEkgdGhpbmsgaXQgbWFrZXMgc2Vuc2UgdG8gaGF2ZSBqdXN0IHJhbmRvbSBzbG9wZXMgYW5kIG5vdCByYW5kb20gaW50ZXJjZXB0cyBoZXJlIGJ1dCBjb3JyZWN0IG1lIGlmIEknbSB3cm9uZy4uLgoKIyMjIEFpbSAyIEh5cG90aGVzaXMgMgojIFRoaXMgaHlwb3RoZXNpcyB0ZXN0cyB0aGUgdHJlYXRtZW50IHggZ3JpZWYgc2V2ZXJpdHkgaW50ZXJhY3Rpb24gaW4gdGhlIG1vZGVsIGJlbG93LgoKbTUgPC0gbG1lKHN0YXRlc3RhdHNfZHdlbGx0aW1lX3MyIH4gdHgqdG90X2ljZywgZGF0YSA9IGRhdGEsIHJhbmRvbSA9IH4gMXxJRCwgbWV0aG9kPSJNTCIpCnN1bW1hcnkobTUpCmBgYAoK