Sample Description


  • The final sample consisted of 28 patients with OCD and 28 healthy control (HC) participants.

  • Patients with OCD and HC participants were individually matched for gender, age, and level of education.

  • Patients were recruited from the specialized OCD outpatient clinic at Humboldt-Universität zu Berlin. All patients were diagnosed with OCD as the primary diagnosis, as assessed with the Structured Clinical Interview for DSM-IV (SCID-I; Wittchen et al., 1997).

  • General inclusion criteria were age between 18 and 65 years and normal or corrected-to-normal vision.

  • Exclusion criteria for all participants were: lifetime diagnosis of any psychotic, bipolar, or substance-related disorder; use of benzodiazepines in the last week or of neuroleptic medication in the last three months; history of head trauma or neurological disease; any general exclusion criteria for tDCS.

  • Further exclusion criteria for healthy control participants were any current or past psychiatric disorder or current or past psychotherapeutic treatment.



Sample Characteristics


This table corresponds to Table 1 in the manuscript.

# Load data
participant_data <- read.spss("./data/Probandendaten.sav", to.data.frame = TRUE)
questionnaires   <- read.spss("./data/psychoEQExport.sav", to.data.frame = TRUE, add.undeclared.levels = "no")


# Select relevant variables
participant_data <- participant_data[, c("Code", "Alter", "Geschlecht",
  "Schuljahre", "YBOCS_gesamt", "YBOCS_Gedanken", "YBOCS_Handlungen")]
questionnaires   <- questionnaires[, c("CODE", "BD2SUMT0", "OCISUMT0")]


# Merge dataframes and rename columns
participant_data$Code <- gsub(" ", "", participant_data$Code, fixed = TRUE) # delete spaces for merging
demographics <- left_join(participant_data, questionnaires, by = c("Code" = "CODE")) %>%
  # Rename columns
  dplyr::rename("participant_id" = Code,
    "Age (years)"        = Alter,
    "Gender"             = Geschlecht,
    "Years of education" = Schuljahre,
    "Y-BOCS total score" = YBOCS_gesamt,
    "Y-BOCS obsessions"  = YBOCS_Gedanken,
    "Y-BOCS compulsions" = YBOCS_Handlungen,
    "BDI-II"             = BD2SUMT0,
    "OCI-R"              = OCISUMT0) %>%
  # Add group variable
  dplyr::mutate(group = as.factor(ifelse(substr(participant_id, 13, 13) == "C", "HC", "OCD"))) %>%
  # Exclude P_02 and C_02 and row with NA
  dplyr::filter(participant_id != "ModERN_tDCS_P02" & participant_id != "ModERN_tDCS_C02" & !is.na(Gender)) %>%
  # Select and reorder columns
  dplyr::select(c("group", "Age (years)", "Gender", "Years of education",  "BDI-II",  "OCI-R",
    "Y-BOCS total score",  "Y-BOCS obsessions",  "Y-BOCS compulsions"))



### Numeric variables

# Extract demographics per group
demographics_groups <- list()
demographics_groups <- psych::describeBy(demographics %>% dplyr::select(-c("Gender", "group")),
  demographics$group)
OCD <- as.data.frame(demographics_groups$`OCD`)
HC  <- as.data.frame(demographics_groups$`HC`)


# Create table with demographics formatted as "M (SD)"
demographics_groups <- as.data.frame(cbind(
  Characteristic = rownames(OCD),
  OCD = paste0(format(round(OCD$mean, 2), nsmall = 2), " (", format(round(OCD$sd, 2), nsmall = 2), ")"),
  HC  = paste0(format(round(HC$mean,  2), nsmall = 2), " (", format(round(HC$sd,  2), nsmall = 2), ")")
))


# Calculate t tests
t_tests <- demographics %>%
  dplyr::select("Age (years)", "Years of education",  "BDI-II",  "OCI-R", "group") %>%
  tidyr::gather(key = Characteristic, value = value, -group) %>%
  dplyr::group_by(group, Characteristic) %>%
  dplyr::summarise(value = list(value)) %>%
  tidyr::spread(group, value) %>%
  dplyr::ungroup() %>%
  dplyr::group_by(Characteristic) %>%
  dplyr::mutate("Test statistic" = t.test(unlist(HC), unlist(OCD))$statistic,
    df = t.test(unlist(HC), unlist(OCD))$parameter,
    p  = t.test(unlist(HC), unlist(OCD))$p.value) %>%
  dplyr::select(-c(HC, OCD))  %>%
  dplyr::ungroup()


# Combine demographics and t test results
demographics_numeric <- left_join(demographics_groups, t_tests, by = "Characteristic")



### Count variables (gender)

# Calculate chi-squared test and extract counts formatted as "female:male"
gender_test <- chisq.test(demographics$Gender, demographics$group)
gender      <- demographics %>% dplyr::group_by(group) %>% dplyr::count(Gender)
gender_OCD  <- paste0(gender[gender$group == "OCD" & gender$Gender == "weiblich", ]$n, ":",
                      gender[gender$group == "OCD" & gender$Gender == "männlich", ]$n)
gender_HC   <- paste0(gender[gender$group == "HC"  & gender$Gender == "weiblich", ]$n, ":",
                      gender[gender$group == "HC"  & gender$Gender == "männlich", ]$n)


# Combine demographics and chi-squared test
demographics_factorial <- as.data.frame(cbind(
  Characteristic = "Gender (female:male)",
  OCD = gender_OCD,
  HC  = gender_HC,
  "Test statistic" = gender_test$statistic,
  df = gender_test$parameter,
  p = gender_test$p.value
))



### Create and display table

# Re-order rows and format p values
table <- rbind(demographics_numeric[c(1), ],
  demographics_factorial,
  demographics_numeric[c(2:nrow(demographics_numeric)), ])
table[, c("df", "Test statistic", "p")] <- as.numeric(unlist(table[, c("df", "Test statistic", "p")]))
table[, c("p")] <- format.pval(table[, c("p")], eps = 0.001, digits = 3)


# Display table
my_table_template(table, caption = "Demographic and Clinical Characteristics of Patients With OCD and 
                  HC Participants ", digits = 2) %>%
  add_footnote("Note. Values are means with standard deviations in parentheses except for gender. 
               Years of education refer to primary and secondary education, not to higher education. 
               Test statistic refers to Welch’s t test except for gender, which was analyzed using
               a chi-squared test. BDI-II = Beck Depression Inventory-II; OCI-R = Obsessive-Compulsive 
               Inventory-Revised; Y-BOCS = Yale-Brown Obsessive Compulsive Scale.", notation = "none")
Demographic and Clinical Characteristics of Patients With OCD and HC Participants
Characteristic OCD HC Test statistic df p
Age (years) 33.29 ( 8.57) 33.07 (8.20) -0.10 53.90 0.924
Gender (female:male) 17:11 17:11 0.00 1.00 1.000
Years of education 12.14 ( 1.46) 12.14 (1.08) 0.00 49.74 1.000
BDI-II 14.14 (11.34) 1.86 (2.69) -5.58 30.03 <0.001
OCI-R 25.75 ( 9.95) 6.25 (5.65) -9.02 42.75 <0.001
Y-BOCS total score 23.36 ( 3.84) NaN ( NA) NA NA NA
Y-BOCS obsessions 11.43 ( 1.81) NaN ( NA) NA NA NA
Y-BOCS compulsions 11.86 ( 2.53) NaN ( NA) NA NA NA
Note. Values are means with standard deviations in parentheses except for gender.
Years of education refer to primary and secondary education, not to higher education.
Test statistic refers to Welch’s t test except for gender, which was analyzed using
a chi-squared test. BDI-II = Beck Depression Inventory-II; OCI-R = Obsessive-Compulsive
Inventory-Revised; Y-BOCS = Yale-Brown Obsessive Compulsive Scale.



References


Wittchen, H., Zaudig, M., & Fydrich, T. (1997). Strukturiertes Klinisches Interview für DSM–IV. [User’s guide for the Structured Clinical Interview for DSM-IV–German modified version]. Hogrefe.


Session Info


sessionInfo()
## R version 3.6.1 (2019-07-05)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 10 x64 (build 19044)
## 
## Matrix products: default
## 
## locale:
## [1] LC_COLLATE=German_Germany.1252  LC_CTYPE=German_Germany.1252   
## [3] LC_MONETARY=German_Germany.1252 LC_NUMERIC=C                   
## [5] LC_TIME=German_Germany.1252    
## 
## attached base packages:
## [1] stats     graphics  grDevices datasets  utils     methods   base     
## 
## other attached packages:
## [1] tidyr_1.1.2      psych_1.8.12     foreign_0.8-71   kableExtra_1.3.1
## [5] knitr_1.30       dplyr_1.0.6     
## 
## loaded via a namespace (and not attached):
##  [1] highr_0.8         pillar_1.6.0      compiler_3.6.1    tools_3.6.1      
##  [5] digest_0.6.27     nlme_3.1-140      lattice_0.20-38   evaluate_0.14    
##  [9] lifecycle_1.0.0   tibble_3.0.4      viridisLite_0.3.0 pkgconfig_2.0.3  
## [13] rlang_0.4.11      rstudioapi_0.11   parallel_3.6.1    yaml_2.2.1       
## [17] xfun_0.19         stringr_1.4.0     httr_1.4.2        xml2_1.3.2       
## [21] generics_0.1.0    vctrs_0.3.8       grid_3.6.1        webshot_0.5.2    
## [25] tidyselect_1.1.0  glue_1.4.2        R6_2.5.0          fansi_0.4.1      
## [29] rmarkdown_2.5     purrr_0.3.4       magrittr_2.0.1    scales_1.1.1     
## [33] ellipsis_0.3.2    htmltools_0.5.0   mnormt_2.0.2      rvest_1.0.2      
## [37] colorspace_1.4-1  renv_0.12.0       utf8_1.1.4        stringi_1.5.3    
## [41] munsell_0.5.0     tmvnsim_1.0-2     crayon_1.3.4
LS0tDQp0aXRsZTogIlBhcnRpY2lwYW50cyINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQNCi0tLQ0KDQo8IS0tIFNldCBnZW5lcmFsIHNldHRpbmdzIC0tPg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQ0KDQojIFNldCBnZW5lcmFsIHNldHRpbmdzIGZvciBtYXJrZG93biBmaWxlDQprbml0cjo6b3B0c19jaHVuayRzZXQoDQogIG1lc3NhZ2UgPSBGQUxTRSwNCiAgd2FybmluZyA9IEZBTFNFDQopDQoNCg0KIyBDbGVhciBlbnZpcm9ubWVudA0Kcm0obGlzdCA9IGxzKCkpDQoNCg0KIyBMb2FkIHBhY2thZ2VzDQpsaWJyYXJ5KGRwbHlyKSAgICAgICMgZm9yIGRhdGEgbWFuaXB1bGF0aW9uDQpsaWJyYXJ5KGtuaXRyKSAgICAgICMgZm9yIGludGVncmF0aW5nIGNvbXB1dGluZyBhbmQgcmVwb3J0aW5nIGluIG1hcmtkb3duDQpsaWJyYXJ5KGthYmxlRXh0cmEpICMgZm9yIGN1c3RvbWl6aW5nIGFwcGVhcmFuY2Ugb2YgdGFibGVzDQpsaWJyYXJ5KGZvcmVpZ24pICAgICMgZm9yIHJlYWRpbmcgaW4gU1BTUyBmaWxlDQpsaWJyYXJ5KHBzeWNoKSAgICAgICMgZm9yIGRlc2NyaWJlQnkgZnVuY3Rpb24NCmxpYnJhcnkodGlkeXIpICAgICAgIyBmb3IgZ2F0aGVyIGFuZCBzcHJlYWQgZnVuY3Rpb24NCg0KDQojIExvYWQgZnVuY3Rpb25zDQpzb3VyY2UoIi4vZnVuY3Rpb25zL215X3RhYmxlX3RlbXBsYXRlLlIiKQ0KDQoNCiMgVHVybiBvZmYgc2NpZW50aWZpYyBub3RhdGlvbg0Kb3B0aW9ucyhzY2lwZW4gPSA5OTkpDQpgYGANCjxicj48YnI+IA0KDQojIyBTYW1wbGUgRGVzY3JpcHRpb24NCioqKg0KDQoqIFRoZSBmaW5hbCBzYW1wbGUgY29uc2lzdGVkIG9mIDI4IHBhdGllbnRzIHdpdGggT0NEIGFuZCAyOCBoZWFsdGh5IGNvbnRyb2wgKEhDKSBwYXJ0aWNpcGFudHMuIA0KDQoqIFBhdGllbnRzIHdpdGggT0NEIGFuZCBIQyBwYXJ0aWNpcGFudHMgd2VyZSBpbmRpdmlkdWFsbHkgbWF0Y2hlZCBmb3IgZ2VuZGVyLCBhZ2UsIGFuZCBsZXZlbCBvZiBlZHVjYXRpb24uDQoNCiogUGF0aWVudHMgd2VyZSByZWNydWl0ZWQgZnJvbSB0aGUgc3BlY2lhbGl6ZWQgT0NEIG91dHBhdGllbnQgY2xpbmljIGF0IEh1bWJvbGR0LVVuaXZlcnNpdMOkdCB6dSBCZXJsaW4uIEFsbCBwYXRpZW50cyB3ZXJlIGRpYWdub3NlZCB3aXRoIE9DRCBhcyB0aGUgcHJpbWFyeSBkaWFnbm9zaXMsIGFzIGFzc2Vzc2VkIHdpdGggdGhlIFN0cnVjdHVyZWQgQ2xpbmljYWwgSW50ZXJ2aWV3IGZvciBEU00tSVYgKFNDSUQtSTsgV2l0dGNoZW4gZXQgYWwuLCAxOTk3KS4NCg0KKiBHZW5lcmFsIGluY2x1c2lvbiBjcml0ZXJpYSB3ZXJlIGFnZSBiZXR3ZWVuIDE4IGFuZCA2NSB5ZWFycyBhbmQgbm9ybWFsIG9yIGNvcnJlY3RlZC10by1ub3JtYWwgdmlzaW9uLiANCg0KKiBFeGNsdXNpb24gY3JpdGVyaWEgZm9yIGFsbCBwYXJ0aWNpcGFudHMgd2VyZTogbGlmZXRpbWUgZGlhZ25vc2lzIG9mIGFueSBwc3ljaG90aWMsIGJpcG9sYXIsIG9yIHN1YnN0YW5jZS1yZWxhdGVkIGRpc29yZGVyOyB1c2Ugb2YgYmVuem9kaWF6ZXBpbmVzIGluIHRoZSBsYXN0IHdlZWsgb3Igb2YgbmV1cm9sZXB0aWMgbWVkaWNhdGlvbiBpbiB0aGUgbGFzdCB0aHJlZSBtb250aHM7IGhpc3Rvcnkgb2YgaGVhZCB0cmF1bWEgb3IgbmV1cm9sb2dpY2FsIGRpc2Vhc2U7IGFueSBnZW5lcmFsIGV4Y2x1c2lvbiBjcml0ZXJpYSBmb3IgdERDUy4gDQoNCiogRnVydGhlciBleGNsdXNpb24gY3JpdGVyaWEgZm9yIGhlYWx0aHkgY29udHJvbCBwYXJ0aWNpcGFudHMgd2VyZSBhbnkgY3VycmVudCBvciBwYXN0IHBzeWNoaWF0cmljIGRpc29yZGVyIG9yIGN1cnJlbnQgb3IgcGFzdCBwc3ljaG90aGVyYXBldXRpYyB0cmVhdG1lbnQuIA0KDQo8YnI+PGJyPg0KDQojIyBTYW1wbGUgQ2hhcmFjdGVyaXN0aWNzDQoqKioNCg0KVGhpcyB0YWJsZSBjb3JyZXNwb25kcyB0byBUYWJsZSAxIGluIHRoZSBtYW51c2NyaXB0Lg0KDQpgYGB7ciBkZW1vZ3JhcGhpY3N9DQoNCiMgTG9hZCBkYXRhDQpwYXJ0aWNpcGFudF9kYXRhIDwtIHJlYWQuc3BzcygiLi9kYXRhL1Byb2JhbmRlbmRhdGVuLnNhdiIsIHRvLmRhdGEuZnJhbWUgPSBUUlVFKQ0KcXVlc3Rpb25uYWlyZXMgICA8LSByZWFkLnNwc3MoIi4vZGF0YS9wc3ljaG9FUUV4cG9ydC5zYXYiLCB0by5kYXRhLmZyYW1lID0gVFJVRSwgYWRkLnVuZGVjbGFyZWQubGV2ZWxzID0gIm5vIikNCg0KDQojIFNlbGVjdCByZWxldmFudCB2YXJpYWJsZXMNCnBhcnRpY2lwYW50X2RhdGEgPC0gcGFydGljaXBhbnRfZGF0YVssIGMoIkNvZGUiLCAiQWx0ZXIiLCAiR2VzY2hsZWNodCIsDQogICJTY2h1bGphaHJlIiwgIllCT0NTX2dlc2FtdCIsICJZQk9DU19HZWRhbmtlbiIsICJZQk9DU19IYW5kbHVuZ2VuIildDQpxdWVzdGlvbm5haXJlcyAgIDwtIHF1ZXN0aW9ubmFpcmVzWywgYygiQ09ERSIsICJCRDJTVU1UMCIsICJPQ0lTVU1UMCIpXQ0KDQoNCiMgTWVyZ2UgZGF0YWZyYW1lcyBhbmQgcmVuYW1lIGNvbHVtbnMNCnBhcnRpY2lwYW50X2RhdGEkQ29kZSA8LSBnc3ViKCIgIiwgIiIsIHBhcnRpY2lwYW50X2RhdGEkQ29kZSwgZml4ZWQgPSBUUlVFKSAjIGRlbGV0ZSBzcGFjZXMgZm9yIG1lcmdpbmcNCmRlbW9ncmFwaGljcyA8LSBsZWZ0X2pvaW4ocGFydGljaXBhbnRfZGF0YSwgcXVlc3Rpb25uYWlyZXMsIGJ5ID0gYygiQ29kZSIgPSAiQ09ERSIpKSAlPiUNCiAgIyBSZW5hbWUgY29sdW1ucw0KICBkcGx5cjo6cmVuYW1lKCJwYXJ0aWNpcGFudF9pZCIgPSBDb2RlLA0KICAgICJBZ2UgKHllYXJzKSIgICAgICAgID0gQWx0ZXIsDQogICAgIkdlbmRlciIgICAgICAgICAgICAgPSBHZXNjaGxlY2h0LA0KICAgICJZZWFycyBvZiBlZHVjYXRpb24iID0gU2NodWxqYWhyZSwNCiAgICAiWS1CT0NTIHRvdGFsIHNjb3JlIiA9IFlCT0NTX2dlc2FtdCwNCiAgICAiWS1CT0NTIG9ic2Vzc2lvbnMiICA9IFlCT0NTX0dlZGFua2VuLA0KICAgICJZLUJPQ1MgY29tcHVsc2lvbnMiID0gWUJPQ1NfSGFuZGx1bmdlbiwNCiAgICAiQkRJLUlJIiAgICAgICAgICAgICA9IEJEMlNVTVQwLA0KICAgICJPQ0ktUiIgICAgICAgICAgICAgID0gT0NJU1VNVDApICU+JQ0KICAjIEFkZCBncm91cCB2YXJpYWJsZQ0KICBkcGx5cjo6bXV0YXRlKGdyb3VwID0gYXMuZmFjdG9yKGlmZWxzZShzdWJzdHIocGFydGljaXBhbnRfaWQsIDEzLCAxMykgPT0gIkMiLCAiSEMiLCAiT0NEIikpKSAlPiUNCiAgIyBFeGNsdWRlIFBfMDIgYW5kIENfMDIgYW5kIHJvdyB3aXRoIE5BDQogIGRwbHlyOjpmaWx0ZXIocGFydGljaXBhbnRfaWQgIT0gIk1vZEVSTl90RENTX1AwMiIgJiBwYXJ0aWNpcGFudF9pZCAhPSAiTW9kRVJOX3REQ1NfQzAyIiAmICFpcy5uYShHZW5kZXIpKSAlPiUNCiAgIyBTZWxlY3QgYW5kIHJlb3JkZXIgY29sdW1ucw0KICBkcGx5cjo6c2VsZWN0KGMoImdyb3VwIiwgIkFnZSAoeWVhcnMpIiwgIkdlbmRlciIsICJZZWFycyBvZiBlZHVjYXRpb24iLCAgIkJESS1JSSIsICAiT0NJLVIiLA0KICAgICJZLUJPQ1MgdG90YWwgc2NvcmUiLCAgIlktQk9DUyBvYnNlc3Npb25zIiwgICJZLUJPQ1MgY29tcHVsc2lvbnMiKSkNCg0KDQoNCiMjIyBOdW1lcmljIHZhcmlhYmxlcw0KDQojIEV4dHJhY3QgZGVtb2dyYXBoaWNzIHBlciBncm91cA0KZGVtb2dyYXBoaWNzX2dyb3VwcyA8LSBsaXN0KCkNCmRlbW9ncmFwaGljc19ncm91cHMgPC0gcHN5Y2g6OmRlc2NyaWJlQnkoZGVtb2dyYXBoaWNzICU+JSBkcGx5cjo6c2VsZWN0KC1jKCJHZW5kZXIiLCAiZ3JvdXAiKSksDQogIGRlbW9ncmFwaGljcyRncm91cCkNCk9DRCA8LSBhcy5kYXRhLmZyYW1lKGRlbW9ncmFwaGljc19ncm91cHMkYE9DRGApDQpIQyAgPC0gYXMuZGF0YS5mcmFtZShkZW1vZ3JhcGhpY3NfZ3JvdXBzJGBIQ2ApDQoNCg0KIyBDcmVhdGUgdGFibGUgd2l0aCBkZW1vZ3JhcGhpY3MgZm9ybWF0dGVkIGFzICJNIChTRCkiDQpkZW1vZ3JhcGhpY3NfZ3JvdXBzIDwtIGFzLmRhdGEuZnJhbWUoY2JpbmQoDQogIENoYXJhY3RlcmlzdGljID0gcm93bmFtZXMoT0NEKSwNCiAgT0NEID0gcGFzdGUwKGZvcm1hdChyb3VuZChPQ0QkbWVhbiwgMiksIG5zbWFsbCA9IDIpLCAiICgiLCBmb3JtYXQocm91bmQoT0NEJHNkLCAyKSwgbnNtYWxsID0gMiksICIpIiksDQogIEhDICA9IHBhc3RlMChmb3JtYXQocm91bmQoSEMkbWVhbiwgIDIpLCBuc21hbGwgPSAyKSwgIiAoIiwgZm9ybWF0KHJvdW5kKEhDJHNkLCAgMiksIG5zbWFsbCA9IDIpLCAiKSIpDQopKQ0KDQoNCiMgQ2FsY3VsYXRlIHQgdGVzdHMNCnRfdGVzdHMgPC0gZGVtb2dyYXBoaWNzICU+JQ0KICBkcGx5cjo6c2VsZWN0KCJBZ2UgKHllYXJzKSIsICJZZWFycyBvZiBlZHVjYXRpb24iLCAgIkJESS1JSSIsICAiT0NJLVIiLCAiZ3JvdXAiKSAlPiUNCiAgdGlkeXI6OmdhdGhlcihrZXkgPSBDaGFyYWN0ZXJpc3RpYywgdmFsdWUgPSB2YWx1ZSwgLWdyb3VwKSAlPiUNCiAgZHBseXI6Omdyb3VwX2J5KGdyb3VwLCBDaGFyYWN0ZXJpc3RpYykgJT4lDQogIGRwbHlyOjpzdW1tYXJpc2UodmFsdWUgPSBsaXN0KHZhbHVlKSkgJT4lDQogIHRpZHlyOjpzcHJlYWQoZ3JvdXAsIHZhbHVlKSAlPiUNCiAgZHBseXI6OnVuZ3JvdXAoKSAlPiUNCiAgZHBseXI6Omdyb3VwX2J5KENoYXJhY3RlcmlzdGljKSAlPiUNCiAgZHBseXI6Om11dGF0ZSgiVGVzdCBzdGF0aXN0aWMiID0gdC50ZXN0KHVubGlzdChIQyksIHVubGlzdChPQ0QpKSRzdGF0aXN0aWMsDQogICAgZGYgPSB0LnRlc3QodW5saXN0KEhDKSwgdW5saXN0KE9DRCkpJHBhcmFtZXRlciwNCiAgICBwICA9IHQudGVzdCh1bmxpc3QoSEMpLCB1bmxpc3QoT0NEKSkkcC52YWx1ZSkgJT4lDQogIGRwbHlyOjpzZWxlY3QoLWMoSEMsIE9DRCkpICAlPiUNCiAgZHBseXI6OnVuZ3JvdXAoKQ0KDQoNCiMgQ29tYmluZSBkZW1vZ3JhcGhpY3MgYW5kIHQgdGVzdCByZXN1bHRzDQpkZW1vZ3JhcGhpY3NfbnVtZXJpYyA8LSBsZWZ0X2pvaW4oZGVtb2dyYXBoaWNzX2dyb3VwcywgdF90ZXN0cywgYnkgPSAiQ2hhcmFjdGVyaXN0aWMiKQ0KDQoNCg0KIyMjIENvdW50IHZhcmlhYmxlcyAoZ2VuZGVyKQ0KDQojIENhbGN1bGF0ZSBjaGktc3F1YXJlZCB0ZXN0IGFuZCBleHRyYWN0IGNvdW50cyBmb3JtYXR0ZWQgYXMgImZlbWFsZTptYWxlIg0KZ2VuZGVyX3Rlc3QgPC0gY2hpc3EudGVzdChkZW1vZ3JhcGhpY3MkR2VuZGVyLCBkZW1vZ3JhcGhpY3MkZ3JvdXApDQpnZW5kZXIgICAgICA8LSBkZW1vZ3JhcGhpY3MgJT4lIGRwbHlyOjpncm91cF9ieShncm91cCkgJT4lIGRwbHlyOjpjb3VudChHZW5kZXIpDQpnZW5kZXJfT0NEICA8LSBwYXN0ZTAoZ2VuZGVyW2dlbmRlciRncm91cCA9PSAiT0NEIiAmIGdlbmRlciRHZW5kZXIgPT0gIndlaWJsaWNoIiwgXSRuLCAiOiIsDQogICAgICAgICAgICAgICAgICAgICAgZ2VuZGVyW2dlbmRlciRncm91cCA9PSAiT0NEIiAmIGdlbmRlciRHZW5kZXIgPT0gIm3DpG5ubGljaCIsIF0kbikNCmdlbmRlcl9IQyAgIDwtIHBhc3RlMChnZW5kZXJbZ2VuZGVyJGdyb3VwID09ICJIQyIgICYgZ2VuZGVyJEdlbmRlciA9PSAid2VpYmxpY2giLCBdJG4sICI6IiwNCiAgICAgICAgICAgICAgICAgICAgICBnZW5kZXJbZ2VuZGVyJGdyb3VwID09ICJIQyIgICYgZ2VuZGVyJEdlbmRlciA9PSAibcOkbm5saWNoIiwgXSRuKQ0KDQoNCiMgQ29tYmluZSBkZW1vZ3JhcGhpY3MgYW5kIGNoaS1zcXVhcmVkIHRlc3QNCmRlbW9ncmFwaGljc19mYWN0b3JpYWwgPC0gYXMuZGF0YS5mcmFtZShjYmluZCgNCiAgQ2hhcmFjdGVyaXN0aWMgPSAiR2VuZGVyIChmZW1hbGU6bWFsZSkiLA0KICBPQ0QgPSBnZW5kZXJfT0NELA0KICBIQyAgPSBnZW5kZXJfSEMsDQogICJUZXN0IHN0YXRpc3RpYyIgPSBnZW5kZXJfdGVzdCRzdGF0aXN0aWMsDQogIGRmID0gZ2VuZGVyX3Rlc3QkcGFyYW1ldGVyLA0KICBwID0gZ2VuZGVyX3Rlc3QkcC52YWx1ZQ0KKSkNCg0KDQoNCiMjIyBDcmVhdGUgYW5kIGRpc3BsYXkgdGFibGUNCg0KIyBSZS1vcmRlciByb3dzIGFuZCBmb3JtYXQgcCB2YWx1ZXMNCnRhYmxlIDwtIHJiaW5kKGRlbW9ncmFwaGljc19udW1lcmljW2MoMSksIF0sDQogIGRlbW9ncmFwaGljc19mYWN0b3JpYWwsDQogIGRlbW9ncmFwaGljc19udW1lcmljW2MoMjpucm93KGRlbW9ncmFwaGljc19udW1lcmljKSksIF0pDQp0YWJsZVssIGMoImRmIiwgIlRlc3Qgc3RhdGlzdGljIiwgInAiKV0gPC0gYXMubnVtZXJpYyh1bmxpc3QodGFibGVbLCBjKCJkZiIsICJUZXN0IHN0YXRpc3RpYyIsICJwIildKSkNCnRhYmxlWywgYygicCIpXSA8LSBmb3JtYXQucHZhbCh0YWJsZVssIGMoInAiKV0sIGVwcyA9IDAuMDAxLCBkaWdpdHMgPSAzKQ0KDQoNCiMgRGlzcGxheSB0YWJsZQ0KbXlfdGFibGVfdGVtcGxhdGUodGFibGUsIGNhcHRpb24gPSAiRGVtb2dyYXBoaWMgYW5kIENsaW5pY2FsIENoYXJhY3RlcmlzdGljcyBvZiBQYXRpZW50cyBXaXRoIE9DRCBhbmQgDQogICAgICAgICAgICAgICAgICBIQyBQYXJ0aWNpcGFudHMgIiwgZGlnaXRzID0gMikgJT4lDQogIGFkZF9mb290bm90ZSgiTm90ZS4gVmFsdWVzIGFyZSBtZWFucyB3aXRoIHN0YW5kYXJkIGRldmlhdGlvbnMgaW4gcGFyZW50aGVzZXMgZXhjZXB0IGZvciBnZW5kZXIuIA0KICAgICAgICAgICAgICAgWWVhcnMgb2YgZWR1Y2F0aW9uIHJlZmVyIHRvIHByaW1hcnkgYW5kIHNlY29uZGFyeSBlZHVjYXRpb24sIG5vdCB0byBoaWdoZXIgZWR1Y2F0aW9uLiANCiAgICAgICAgICAgICAgIFRlc3Qgc3RhdGlzdGljIHJlZmVycyB0byBXZWxjaOKAmXMgdCB0ZXN0IGV4Y2VwdCBmb3IgZ2VuZGVyLCB3aGljaCB3YXMgYW5hbHl6ZWQgdXNpbmcNCiAgICAgICAgICAgICAgIGEgY2hpLXNxdWFyZWQgdGVzdC4gQkRJLUlJID0gQmVjayBEZXByZXNzaW9uIEludmVudG9yeS1JSTsgT0NJLVIgPSBPYnNlc3NpdmUtQ29tcHVsc2l2ZSANCiAgICAgICAgICAgICAgIEludmVudG9yeS1SZXZpc2VkOyBZLUJPQ1MgPSBZYWxlLUJyb3duIE9ic2Vzc2l2ZSBDb21wdWxzaXZlIFNjYWxlLiIsIG5vdGF0aW9uID0gIm5vbmUiKQ0KYGBgDQo8YnI+PGJyPg0KDQojIyBSZWZlcmVuY2VzDQoqKioNCldpdHRjaGVuLCBILiwgWmF1ZGlnLCBNLiwgJiBGeWRyaWNoLCBULiAoMTk5NykuICpTdHJ1a3R1cmllcnRlcyBLbGluaXNjaGVzIEludGVydmlldyBmw7xyIERTTeKAk0lWLiBbVXNlcuKAmXMgZ3VpZGUgZm9yIHRoZSBTdHJ1Y3R1cmVkIENsaW5pY2FsIEludGVydmlldyBmb3IgRFNNLUlW4oCTR2VybWFuIG1vZGlmaWVkIHZlcnNpb25dLiogSG9ncmVmZS4gCQ0KPGJyPjxicj4NCg0KIyMgU2Vzc2lvbiBJbmZvDQoqKioNCmBgYHtyIHNlc3Npb24taW5mb30NCg0Kc2Vzc2lvbkluZm8oKQ0KYGBgDQo=