Data and Functions

source("0_helpers.R")
knitr::opts_chunk$set(warning = FALSE, message = FALSE)
pander::panderOptions("table.split.table", Inf)
pander::panderOptions('round',2)
pander::panderOptions('digits',2)
pander::panderOptions('keep.trailing.zeros',TRUE)

load("data/cleaned_selected.rdata")

Select Variables

Initial Survey

data = all_surveys %>%
  select(session,
         age,
         education_years,
         net_income,
         starts_with("bfi_agree"),
         starts_with("bfi_consc"),
         starts_with("bfi_open"),
         starts_with("bfi_extra"),
         starts_with("bfi_neuro"),
         religiosity,
         duration_relationship_years,
         duration_relationship_month,
         contraception_at_all,
         contraception_method,
         contraception_approach,
         contraception_method_broad,
         contraception_meeting_partner,
         partner_attractiveness_face,
         partner_attractiveness_body,
         relationship_satisfaction_overall,
         relationship_satisfaction_2,
         relationship_satisfaction_3,
         relationship_problems_R,
         relationship_conflict_R,
         satisfaction_sexual_intercourse,
         reasons_for_exclusion)

Diary

data_diary = diary %>%
  select(session,
         reasons_for_exclusion,
         high_libido, sexual_desire_for_whom,
         sex_active, sex_activity_anal_sex, sex_activity_bdsm_dom, sex_activity_bdsm_sub,
         sex_activity_cuddling, sex_activity_cunnilingus, sex_activity_cybersex,
         sex_activity_dirty_talk,
         sex_activity_fellatio, sex_activity_kissing,  sex_activity_masturbated_by_partner,
         sex_activity_masturbated_partner, sex_activity_masturbation, sex_activity_other,
         sex_activity_phone_skype_sex, sex_activity_pornography, sex_activity_sex, 
         sex_activity_touch_other, 
         sex_activity_toys, sex_activity_unclear,  sex_other, sex_solo, sex_unclear,
         days_done)

Exclusion

Initial Survey

n_excluded = data %>% filter(reasons_for_exclusion != "") %>% nrow()
data = data %>% filter(reasons_for_exclusion == "")

481 people were excluded.

Diary

Exclusion criteria based on initial

session_codes = data$session

data_diary = data_diary %>%
  filter(session %in% session_codes)

length(data_diary$session)
## [1] 53332

The 1179 participants filled out 53332.

Skipped diary entry

n_skipped_diary = data_diary %>%
  filter(reasons_for_exclusion %contains% "skipped_diary_entry") %>%
  count()

data_diary = data_diary %>%
  filter(!(reasons_for_exclusion %contains% "skipped_diary_entry"))

745 days were skipped.

Dishonest answers

n_dishonest = data_diary %>%
  filter(reasons_for_exclusion %contains% "dishonest") %>%
  count()

data_diary = data_diary %>%
  filter(!(reasons_for_exclusion %contains% "dishonest"))

142 days contained dishonest answers.

Filled out less than 14 days

number_of_days = data_diary %>%
  group_by(session) %>%
  summarise(n = n()) %>%
  rename(number_of_days = n)
  
data_diary = left_join(data_diary, number_of_days, by = "session")

data_diary_include = data_diary %>%
  filter(as.numeric(number_of_days) >= 14)

data_diary_exclude = data_diary %>%
  filter(as.numeric(number_of_days) < 14)

data_diary = data_diary_include

170 participants were excluded because they filled out less than 14 days - resulting in 1014 excluded days.

Summary

In total 968 participants with 51431 diary days were included for the analyses in which outcomes were based on diary information.

Wrangle data

Income

Set factor level correctly

data = data %>%
  mutate(net_income = factor(net_income,
                             levels = c("euro_lt_500", "euro_500_1000",
                                        "euro_1000_2000", "euro_2000_3000",
                                        "euro_gt_3000", "dont_tell")))

Relationship status (single vs partnered)

data = data %>% mutate(
  relationship_status = ifelse(is.na(duration_relationship_month), "Single", "Partnered"))

qplot(data$relationship_status) + coord_flip()

Relationship duration

data = data %>%
  mutate(relationship_duration = duration_relationship_years * 12 +
           duration_relationship_month)

qplot(data$relationship_duration)

data = data %>%
   mutate(relationship_duration_factor = 
            factor(ifelse(relationship_status == "Single",
                   "Single",
                   ifelse(relationship_duration <= 12,
                          "Partnered_upto12months",
                          ifelse(relationship_duration <= 28, 
                                 "Partnered_upto28months",
                                 ifelse(relationship_duration <= 52,
                                        "Partnered_upto52months",
                                        ifelse(relationship_duration > 52,
                                        "Partnered_morethan52months",
                                        NA))))),
                   levels = c("Single", "Partnered_upto12months",
                              "Partnered_upto28months", "Partnered_upto52months",
                              "Partnered_morethan52months")))

qplot(data$relationship_duration_factor)

ggplot(data, aes(relationship_duration)) +
  geom_histogram(aes(fill = relationship_duration_factor), bins = 100)

Contraception approach

data = data %>%
  mutate(# Participants, who indicated having no penetrative sex:
         contraception_method = if_else(contraception_at_all == 5,
                                   "barrier_no_penetrative_sex",
                                   contraception_method),
         # Participants, who indicated having no penetrative sex
         # use no contraceptives
         contraception_approach = factor(ifelse(
           contraception_method =="barrier_no_penetrative_sex",
           "nothing",
           as.character(contraception_approach))),
         # Fixed contraception_approach for
         # "hormonal_pill, barrier_coitus_interruptus"
         contraception_approach = factor(ifelse(
           contraception_method == "hormonal_pill, barrier_coitus_interruptus",
           "hormonal_pill_only",
           as.character(contraception_approach))),
         # Fixed contraception_approach for
         # "hormonal_pill, barrier_no_penetrative_sex"
         contraception_approach = factor(ifelse(
           contraception_method == "hormonal_pill, barrier_no_penetrative_sex",
           "hormonal_pill_only",
           as.character(contraception_approach))),
         # Fixed contraception_approach for
         # "hormonal_other, barrier_condoms"
         contraception_approach = factor(ifelse(
           contraception_method == "hormonal_other, barrier_condoms",
           "hormonal_other+condoms",
           as.character(contraception_approach))),
         # Fixed contraception_approach for
         # "hormonal_other, barrier_condoms, barrier_coitus_interruptus"
         contraception_approach = factor(ifelse(
           contraception_method ==
             "hormonal_other, barrier_condoms, barrier_coitus_interruptus",
           "hormonal_other+condoms",
           as.character(contraception_approach))),
         contraception_approach = factor(ifelse(
           contraception_approach == "hormonal+barrier",
           "hormonal_pill+condoms",
           as.character(contraception_approach))),
         contraception_approach = factor(ifelse(
           contraception_method %contains% "awareness" &
             contraception_method %contains% "condoms" &
             !(contraception_method %contains% "hormonal"),
           "awareness+condoms",
           as.character(contraception_approach))))


data = data %>%
  mutate(contraception_approach = factor(contraception_approach,
                                         levels = c("hormonal_pill_only",
                                                    "hormonal_other_only",
                                                    "hormonal_pill+condoms",
                                                    "hormonal_other+condoms",
                                                    "barrier_pessar",
                                                    "awareness",
                                                    "awareness+condoms",
                                                    "condoms",
                                                    "other",
                                                    "nothing")))

qplot(factor(data$contraception_approach, levels = rev(levels(data$contraception_approach)))) +
  coord_flip()

table(data$contraception_approach)
## 
##     hormonal_pill_only    hormonal_other_only  hormonal_pill+condoms hormonal_other+condoms 
##                    254                     61                    159                     17 
##         barrier_pessar              awareness      awareness+condoms                condoms 
##                     85                     20                    100                    380 
##                  other                nothing 
##                     14                     89

Current contraceptive status (hormonal vs. non hormonal)

data = data %>% mutate(
  contraception_hormonal = factor(ifelse(contraception_approach %contains% "hormonal",
                                         "yes",
                                         "no")))
qplot(data$contraception_hormonal) + coord_flip()

table(data$contraception_hormonal)
## 
##  no yes 
## 688 491

Changed contraception since meeting their partner

There will be NAs because we asked about contracetion when meeting partner only if participants were currently in a relationship

crosstabs(~contraception_hormonal + contraception_meeting_partner, data = data)
##                       contraception_meeting_partner
## contraception_hormonal   0   1 <NA>
##                    no  251 150  287
##                    yes 133 240  118
data = data %>% mutate(
  contraception_change_since_meeting_partner =
    ifelse(contraception_hormonal == "yes" & contraception_meeting_partner == 1,
           "congruent_hormonal",
           ifelse(contraception_hormonal == "no" & contraception_meeting_partner == 0,
                  "congruent_nonhormonal",
                  ifelse(contraception_hormonal == "yes" & contraception_meeting_partner == 0,
                         "switched_to_hormonal",
                         ifelse(contraception_hormonal == "no" &
                                  contraception_meeting_partner == 1, "switched_to_nonhormonal",
                                NA)))))

qplot(data$contraception_change_since_meeting_partner) + coord_flip()

data = data %>% 
  mutate(congruent_contraception = 
           factor(ifelse(contraception_change_since_meeting_partner %contains% "congruent",
                  1, 0)))

Contraception meeting partner

data = data %>%
  mutate(contraception_meeting_partner = factor(if_else(
    contraception_meeting_partner == 1,
    "yes", "no")))

Attractiveness Partner Scale

data = data %>%
  mutate(attractiveness_partner = as.numeric(
    (partner_attractiveness_face + partner_attractiveness_body)/2))

Relationship Satisfaction Scale

data = data %>%
  mutate(relationship_satisfaction = as.numeric(
           (relationship_satisfaction_overall +
              relationship_satisfaction_2 +
              relationship_satisfaction_3 +
              (6 - relationship_problems_R) +
              (6 - relationship_conflict_R))/5))

Diary information

calculate mean of libido, sex_active_frequency and actual sex frequency based on diary

data_diary_means = data_diary %>%
  group_by(session, number_of_days) %>%
  summarise(diary_libido_mean = mean(high_libido, na.rm = T),
            diary_sex_active_mean = mean(sex_active, na.rm = T),
            diary_sex_active_sex_mean = mean(sex_activity_sex, na.rm = T),
            diary_masturbation_mean = mean(sex_activity_masturbation, na.rm = T))

qplot(data_diary_means$diary_libido_mean)

qplot(data_diary_means$diary_sex_active_mean)

qplot(data_diary_means$diary_sex_active_sex_mean)

data_diary_means = data_diary_means %>%
  mutate(diary_sex_active_sex_sum = as.integer(round(diary_sex_active_sex_mean*number_of_days, 1)),
         diary_sex_active_sum = as.integer(round(diary_sex_active_mean*number_of_days, 1)),
         diary_masturbation_sum = as.integer(round(diary_masturbation_mean*number_of_days, 1)))

data = left_join(data, data_diary_means, by = "session")

Set sex_freq and mas_freq as missing, if participants indicated having no penetrative sexual intercourse and using no other form of contraception

data = data %>%
  mutate(diary_sex_active_sex_mean =
           ifelse(contraception_method == "barrier_no_penetrative_sex",
                  NA,
                  diary_sex_active_sex_mean),
         diary_sex_active_sex_sum =
           ifelse(contraception_method == "barrier_no_penetrative_sex",
                  NA,
                  diary_sex_active_sex_sum),
         diary_sex_active_mean =
           ifelse(contraception_method == "barrier_no_penetrative_sex",
                  NA,
                  diary_sex_active_mean),
         diary_sex_active_sum =
           ifelse(contraception_method == "barrier_no_penetrative_sex",
                  NA,
                  diary_sex_active_sum),
         diary_masturbation_mean =
           ifelse(contraception_method == "barrier_no_penetrative_sex",
                  NA,
                  diary_masturbation_mean),
         diary_masturbation_sum =
           ifelse(contraception_method == "barrier_no_penetrative_sex",
                  NA,
                  diary_masturbation_sum))

Select Data

data = data %>%
  select(-duration_relationship_years, -duration_relationship_month,
         -contraception_at_all, -contraception_approach, -contraception_method_broad)

Save Data

save(data, data, file = "data/cleaned_selected_wrangled.rdata")
LS0tDQp0aXRsZTogIkRhdGF3cmFuZ2xpbmciDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiAnc2hvdycNCiAgICBzZWxmX2NvbnRhaW5lZDogZmFsc2UNCi0tLQ0KDQoNCiMjIERhdGEgYW5kIEZ1bmN0aW9ucw0KYGBge3IgZGF0YSBhbmQgZnVuY3Rpb24sIHJlc3VsdHM9J2hpZGUnLG1lc3NhZ2U9Rix3YXJuaW5nPUZ9DQpzb3VyY2UoIjBfaGVscGVycy5SIikNCmtuaXRyOjpvcHRzX2NodW5rJHNldCh3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSkNCnBhbmRlcjo6cGFuZGVyT3B0aW9ucygidGFibGUuc3BsaXQudGFibGUiLCBJbmYpDQpwYW5kZXI6OnBhbmRlck9wdGlvbnMoJ3JvdW5kJywyKQ0KcGFuZGVyOjpwYW5kZXJPcHRpb25zKCdkaWdpdHMnLDIpDQpwYW5kZXI6OnBhbmRlck9wdGlvbnMoJ2tlZXAudHJhaWxpbmcuemVyb3MnLFRSVUUpDQoNCmxvYWQoImRhdGEvY2xlYW5lZF9zZWxlY3RlZC5yZGF0YSIpDQpgYGANCg0KDQojIyBTZWxlY3QgVmFyaWFibGVzIHsudGFic2V0fQ0KIyMjIEluaXRpYWwgU3VydmV5DQpgYGB7ciBzZWxlY3QgdmFyaWFibGVzfQ0KZGF0YSA9IGFsbF9zdXJ2ZXlzICU+JQ0KICBzZWxlY3Qoc2Vzc2lvbiwNCiAgICAgICAgIGFnZSwNCiAgICAgICAgIGVkdWNhdGlvbl95ZWFycywNCiAgICAgICAgIG5ldF9pbmNvbWUsDQogICAgICAgICBzdGFydHNfd2l0aCgiYmZpX2FncmVlIiksDQogICAgICAgICBzdGFydHNfd2l0aCgiYmZpX2NvbnNjIiksDQogICAgICAgICBzdGFydHNfd2l0aCgiYmZpX29wZW4iKSwNCiAgICAgICAgIHN0YXJ0c193aXRoKCJiZmlfZXh0cmEiKSwNCiAgICAgICAgIHN0YXJ0c193aXRoKCJiZmlfbmV1cm8iKSwNCiAgICAgICAgIHJlbGlnaW9zaXR5LA0KICAgICAgICAgZHVyYXRpb25fcmVsYXRpb25zaGlwX3llYXJzLA0KICAgICAgICAgZHVyYXRpb25fcmVsYXRpb25zaGlwX21vbnRoLA0KICAgICAgICAgY29udHJhY2VwdGlvbl9hdF9hbGwsDQogICAgICAgICBjb250cmFjZXB0aW9uX21ldGhvZCwNCiAgICAgICAgIGNvbnRyYWNlcHRpb25fYXBwcm9hY2gsDQogICAgICAgICBjb250cmFjZXB0aW9uX21ldGhvZF9icm9hZCwNCiAgICAgICAgIGNvbnRyYWNlcHRpb25fbWVldGluZ19wYXJ0bmVyLA0KICAgICAgICAgcGFydG5lcl9hdHRyYWN0aXZlbmVzc19mYWNlLA0KICAgICAgICAgcGFydG5lcl9hdHRyYWN0aXZlbmVzc19ib2R5LA0KICAgICAgICAgcmVsYXRpb25zaGlwX3NhdGlzZmFjdGlvbl9vdmVyYWxsLA0KICAgICAgICAgcmVsYXRpb25zaGlwX3NhdGlzZmFjdGlvbl8yLA0KICAgICAgICAgcmVsYXRpb25zaGlwX3NhdGlzZmFjdGlvbl8zLA0KICAgICAgICAgcmVsYXRpb25zaGlwX3Byb2JsZW1zX1IsDQogICAgICAgICByZWxhdGlvbnNoaXBfY29uZmxpY3RfUiwNCiAgICAgICAgIHNhdGlzZmFjdGlvbl9zZXh1YWxfaW50ZXJjb3Vyc2UsDQogICAgICAgICByZWFzb25zX2Zvcl9leGNsdXNpb24pDQpgYGANCg0KIyMjIERpYXJ5DQpgYGB7ciBzZWxlY3QgdmFyaWFibGVzIGRpYXJ5fQ0KZGF0YV9kaWFyeSA9IGRpYXJ5ICU+JQ0KICBzZWxlY3Qoc2Vzc2lvbiwNCiAgICAgICAgIHJlYXNvbnNfZm9yX2V4Y2x1c2lvbiwNCiAgICAgICAgIGhpZ2hfbGliaWRvLCBzZXh1YWxfZGVzaXJlX2Zvcl93aG9tLA0KICAgICAgICAgc2V4X2FjdGl2ZSwgc2V4X2FjdGl2aXR5X2FuYWxfc2V4LCBzZXhfYWN0aXZpdHlfYmRzbV9kb20sIHNleF9hY3Rpdml0eV9iZHNtX3N1YiwNCiAgICAgICAgIHNleF9hY3Rpdml0eV9jdWRkbGluZywgc2V4X2FjdGl2aXR5X2N1bm5pbGluZ3VzLCBzZXhfYWN0aXZpdHlfY3liZXJzZXgsDQogICAgICAgICBzZXhfYWN0aXZpdHlfZGlydHlfdGFsaywNCiAgICAgICAgIHNleF9hY3Rpdml0eV9mZWxsYXRpbywgc2V4X2FjdGl2aXR5X2tpc3NpbmcsICBzZXhfYWN0aXZpdHlfbWFzdHVyYmF0ZWRfYnlfcGFydG5lciwNCiAgICAgICAgIHNleF9hY3Rpdml0eV9tYXN0dXJiYXRlZF9wYXJ0bmVyLCBzZXhfYWN0aXZpdHlfbWFzdHVyYmF0aW9uLCBzZXhfYWN0aXZpdHlfb3RoZXIsDQogICAgICAgICBzZXhfYWN0aXZpdHlfcGhvbmVfc2t5cGVfc2V4LCBzZXhfYWN0aXZpdHlfcG9ybm9ncmFwaHksIHNleF9hY3Rpdml0eV9zZXgsIA0KICAgICAgICAgc2V4X2FjdGl2aXR5X3RvdWNoX290aGVyLCANCiAgICAgICAgIHNleF9hY3Rpdml0eV90b3lzLCBzZXhfYWN0aXZpdHlfdW5jbGVhciwgIHNleF9vdGhlciwgc2V4X3NvbG8sIHNleF91bmNsZWFyLA0KICAgICAgICAgZGF5c19kb25lKQ0KYGBgDQoNCg0KIyMgRXhjbHVzaW9uIHsudGFic2V0fQ0KIyMjIEluaXRpYWwgU3VydmV5DQpgYGB7ciBleGNsdXNpb24gaW5pdGlhbCBzdXJ2ZXl9DQpuX2V4Y2x1ZGVkID0gZGF0YSAlPiUgZmlsdGVyKHJlYXNvbnNfZm9yX2V4Y2x1c2lvbiAhPSAiIikgJT4lIG5yb3coKQ0KZGF0YSA9IGRhdGEgJT4lIGZpbHRlcihyZWFzb25zX2Zvcl9leGNsdXNpb24gPT0gIiIpDQpgYGANCmByIG5fZXhjbHVkZWRgIHBlb3BsZSB3ZXJlIGV4Y2x1ZGVkLg0KDQojIyMgRGlhcnkgIHsudGFic2V0fQ0KIyMjIyBFeGNsdXNpb24gY3JpdGVyaWEgYmFzZWQgb24gaW5pdGlhbA0KYGBge3J9DQpzZXNzaW9uX2NvZGVzID0gZGF0YSRzZXNzaW9uDQoNCmRhdGFfZGlhcnkgPSBkYXRhX2RpYXJ5ICU+JQ0KICBmaWx0ZXIoc2Vzc2lvbiAlaW4lIHNlc3Npb25fY29kZXMpDQoNCmxlbmd0aChkYXRhX2RpYXJ5JHNlc3Npb24pDQpgYGANClRoZSBgciBsZW5ndGgodW5pcXVlKGRhdGFfZGlhcnkkc2Vzc2lvbikpYCBwYXJ0aWNpcGFudHMgZmlsbGVkIG91dCBgciBsZW5ndGgoZGF0YV9kaWFyeSRzZXNzaW9uKWAuDQoNCiMjIyMgU2tpcHBlZCBkaWFyeSBlbnRyeQ0KYGBge3J9DQpuX3NraXBwZWRfZGlhcnkgPSBkYXRhX2RpYXJ5ICU+JQ0KICBmaWx0ZXIocmVhc29uc19mb3JfZXhjbHVzaW9uICVjb250YWlucyUgInNraXBwZWRfZGlhcnlfZW50cnkiKSAlPiUNCiAgY291bnQoKQ0KDQpkYXRhX2RpYXJ5ID0gZGF0YV9kaWFyeSAlPiUNCiAgZmlsdGVyKCEocmVhc29uc19mb3JfZXhjbHVzaW9uICVjb250YWlucyUgInNraXBwZWRfZGlhcnlfZW50cnkiKSkNCmBgYA0KYHIgbl9za2lwcGVkX2RpYXJ5YCBkYXlzIHdlcmUgc2tpcHBlZC4NCg0KIyMjIyBEaXNob25lc3QgYW5zd2Vycw0KYGBge3J9DQpuX2Rpc2hvbmVzdCA9IGRhdGFfZGlhcnkgJT4lDQogIGZpbHRlcihyZWFzb25zX2Zvcl9leGNsdXNpb24gJWNvbnRhaW5zJSAiZGlzaG9uZXN0IikgJT4lDQogIGNvdW50KCkNCg0KZGF0YV9kaWFyeSA9IGRhdGFfZGlhcnkgJT4lDQogIGZpbHRlcighKHJlYXNvbnNfZm9yX2V4Y2x1c2lvbiAlY29udGFpbnMlICJkaXNob25lc3QiKSkNCmBgYA0KYHIgbl9kaXNob25lc3RgIGRheXMgY29udGFpbmVkIGRpc2hvbmVzdCBhbnN3ZXJzLg0KDQojIyMjIEZpbGxlZCBvdXQgbGVzcyB0aGFuIDE0IGRheXMNCmBgYHtyfQ0KbnVtYmVyX29mX2RheXMgPSBkYXRhX2RpYXJ5ICU+JQ0KICBncm91cF9ieShzZXNzaW9uKSAlPiUNCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQ0KICByZW5hbWUobnVtYmVyX29mX2RheXMgPSBuKQ0KICANCmRhdGFfZGlhcnkgPSBsZWZ0X2pvaW4oZGF0YV9kaWFyeSwgbnVtYmVyX29mX2RheXMsIGJ5ID0gInNlc3Npb24iKQ0KDQpkYXRhX2RpYXJ5X2luY2x1ZGUgPSBkYXRhX2RpYXJ5ICU+JQ0KICBmaWx0ZXIoYXMubnVtZXJpYyhudW1iZXJfb2ZfZGF5cykgPj0gMTQpDQoNCmRhdGFfZGlhcnlfZXhjbHVkZSA9IGRhdGFfZGlhcnkgJT4lDQogIGZpbHRlcihhcy5udW1lcmljKG51bWJlcl9vZl9kYXlzKSA8IDE0KQ0KDQpkYXRhX2RpYXJ5ID0gZGF0YV9kaWFyeV9pbmNsdWRlDQpgYGANCmByIGxlbmd0aCh1bmlxdWUoZGF0YV9kaWFyeV9leGNsdWRlJHNlc3Npb24pKWAgcGFydGljaXBhbnRzIHdlcmUgZXhjbHVkZWQgYmVjYXVzZSB0aGV5IGZpbGxlZCBvdXQgbGVzcyB0aGFuIDE0IGRheXMgLSByZXN1bHRpbmcgaW4gYHIgbGVuZ3RoKGRhdGFfZGlhcnlfZXhjbHVkZSRzZXNzaW9uKWAgZXhjbHVkZWQgZGF5cy4NCg0KIyMjIyBTdW1tYXJ5IHsuYWN0aXZlfQ0KSW4gdG90YWwgYHIgbGVuZ3RoKHVuaXF1ZShkYXRhX2RpYXJ5JHNlc3Npb24pKWAgcGFydGljaXBhbnRzIHdpdGggYHIgbGVuZ3RoKGRhdGFfZGlhcnkkc2Vzc2lvbilgIGRpYXJ5IGRheXMgd2VyZSBpbmNsdWRlZCBmb3IgdGhlIGFuYWx5c2VzIGluIHdoaWNoIG91dGNvbWVzIHdlcmUgYmFzZWQgb24gZGlhcnkgaW5mb3JtYXRpb24uIA0KDQojIyBXcmFuZ2xlIGRhdGEgey50YWJzZXR9DQoNCiMjIyBJbmNvbWUNClNldCBmYWN0b3IgbGV2ZWwgY29ycmVjdGx5DQpgYGB7cn0NCmRhdGEgPSBkYXRhICU+JQ0KICBtdXRhdGUobmV0X2luY29tZSA9IGZhY3RvcihuZXRfaW5jb21lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJldXJvX2x0XzUwMCIsICJldXJvXzUwMF8xMDAwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXVyb18xMDAwXzIwMDAiLCAiZXVyb18yMDAwXzMwMDAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJldXJvX2d0XzMwMDAiLCAiZG9udF90ZWxsIikpKQ0KYGBgDQoNCg0KIyMjIFJlbGF0aW9uc2hpcCBzdGF0dXMgKHNpbmdsZSB2cyBwYXJ0bmVyZWQpDQpgYGB7cn0NCmRhdGEgPSBkYXRhICU+JSBtdXRhdGUoDQogIHJlbGF0aW9uc2hpcF9zdGF0dXMgPSBpZmVsc2UoaXMubmEoZHVyYXRpb25fcmVsYXRpb25zaGlwX21vbnRoKSwgIlNpbmdsZSIsICJQYXJ0bmVyZWQiKSkNCg0KcXBsb3QoZGF0YSRyZWxhdGlvbnNoaXBfc3RhdHVzKSArIGNvb3JkX2ZsaXAoKQ0KYGBgDQoNCiMjIyBSZWxhdGlvbnNoaXAgZHVyYXRpb24NCmBgYHtyfQ0KZGF0YSA9IGRhdGEgJT4lDQogIG11dGF0ZShyZWxhdGlvbnNoaXBfZHVyYXRpb24gPSBkdXJhdGlvbl9yZWxhdGlvbnNoaXBfeWVhcnMgKiAxMiArDQogICAgICAgICAgIGR1cmF0aW9uX3JlbGF0aW9uc2hpcF9tb250aCkNCg0KcXBsb3QoZGF0YSRyZWxhdGlvbnNoaXBfZHVyYXRpb24pDQoNCg0KZGF0YSA9IGRhdGEgJT4lDQogICBtdXRhdGUocmVsYXRpb25zaGlwX2R1cmF0aW9uX2ZhY3RvciA9IA0KICAgICAgICAgICAgZmFjdG9yKGlmZWxzZShyZWxhdGlvbnNoaXBfc3RhdHVzID09ICJTaW5nbGUiLA0KICAgICAgICAgICAgICAgICAgICJTaW5nbGUiLA0KICAgICAgICAgICAgICAgICAgIGlmZWxzZShyZWxhdGlvbnNoaXBfZHVyYXRpb24gPD0gMTIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJQYXJ0bmVyZWRfdXB0bzEybW9udGhzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHJlbGF0aW9uc2hpcF9kdXJhdGlvbiA8PSAyOCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGFydG5lcmVkX3VwdG8yOG1vbnRocyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UocmVsYXRpb25zaGlwX2R1cmF0aW9uIDw9IDUyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQYXJ0bmVyZWRfdXB0bzUybW9udGhzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UocmVsYXRpb25zaGlwX2R1cmF0aW9uID4gNTIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBhcnRuZXJlZF9tb3JldGhhbjUybW9udGhzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSkpKSkpLA0KICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIlNpbmdsZSIsICJQYXJ0bmVyZWRfdXB0bzEybW9udGhzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQYXJ0bmVyZWRfdXB0bzI4bW9udGhzIiwgIlBhcnRuZXJlZF91cHRvNTJtb250aHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBhcnRuZXJlZF9tb3JldGhhbjUybW9udGhzIikpKQ0KDQpxcGxvdChkYXRhJHJlbGF0aW9uc2hpcF9kdXJhdGlvbl9mYWN0b3IpDQoNCmdncGxvdChkYXRhLCBhZXMocmVsYXRpb25zaGlwX2R1cmF0aW9uKSkgKw0KICBnZW9tX2hpc3RvZ3JhbShhZXMoZmlsbCA9IHJlbGF0aW9uc2hpcF9kdXJhdGlvbl9mYWN0b3IpLCBiaW5zID0gMTAwKQ0KYGBgDQoNCg0KDQojIyMgQ29udHJhY2VwdGlvbiBhcHByb2FjaA0KYGBge3IgY29udHJhY2VwdGlvbiBhcHByb2FjaH0NCmRhdGEgPSBkYXRhICU+JQ0KICBtdXRhdGUoIyBQYXJ0aWNpcGFudHMsIHdobyBpbmRpY2F0ZWQgaGF2aW5nIG5vIHBlbmV0cmF0aXZlIHNleDoNCiAgICAgICAgIGNvbnRyYWNlcHRpb25fbWV0aG9kID0gaWZfZWxzZShjb250cmFjZXB0aW9uX2F0X2FsbCA9PSA1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFycmllcl9ub19wZW5ldHJhdGl2ZV9zZXgiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cmFjZXB0aW9uX21ldGhvZCksDQogICAgICAgICAjIFBhcnRpY2lwYW50cywgd2hvIGluZGljYXRlZCBoYXZpbmcgbm8gcGVuZXRyYXRpdmUgc2V4DQogICAgICAgICAjIHVzZSBubyBjb250cmFjZXB0aXZlcw0KICAgICAgICAgY29udHJhY2VwdGlvbl9hcHByb2FjaCA9IGZhY3RvcihpZmVsc2UoDQogICAgICAgICAgIGNvbnRyYWNlcHRpb25fbWV0aG9kID09ImJhcnJpZXJfbm9fcGVuZXRyYXRpdmVfc2V4IiwNCiAgICAgICAgICAgIm5vdGhpbmciLA0KICAgICAgICAgICBhcy5jaGFyYWN0ZXIoY29udHJhY2VwdGlvbl9hcHByb2FjaCkpKSwNCiAgICAgICAgICMgRml4ZWQgY29udHJhY2VwdGlvbl9hcHByb2FjaCBmb3INCiAgICAgICAgICMgImhvcm1vbmFsX3BpbGwsIGJhcnJpZXJfY29pdHVzX2ludGVycnVwdHVzIg0KICAgICAgICAgY29udHJhY2VwdGlvbl9hcHByb2FjaCA9IGZhY3RvcihpZmVsc2UoDQogICAgICAgICAgIGNvbnRyYWNlcHRpb25fbWV0aG9kID09ICJob3Jtb25hbF9waWxsLCBiYXJyaWVyX2NvaXR1c19pbnRlcnJ1cHR1cyIsDQogICAgICAgICAgICJob3Jtb25hbF9waWxsX29ubHkiLA0KICAgICAgICAgICBhcy5jaGFyYWN0ZXIoY29udHJhY2VwdGlvbl9hcHByb2FjaCkpKSwNCiAgICAgICAgICMgRml4ZWQgY29udHJhY2VwdGlvbl9hcHByb2FjaCBmb3INCiAgICAgICAgICMgImhvcm1vbmFsX3BpbGwsIGJhcnJpZXJfbm9fcGVuZXRyYXRpdmVfc2V4Ig0KICAgICAgICAgY29udHJhY2VwdGlvbl9hcHByb2FjaCA9IGZhY3RvcihpZmVsc2UoDQogICAgICAgICAgIGNvbnRyYWNlcHRpb25fbWV0aG9kID09ICJob3Jtb25hbF9waWxsLCBiYXJyaWVyX25vX3BlbmV0cmF0aXZlX3NleCIsDQogICAgICAgICAgICJob3Jtb25hbF9waWxsX29ubHkiLA0KICAgICAgICAgICBhcy5jaGFyYWN0ZXIoY29udHJhY2VwdGlvbl9hcHByb2FjaCkpKSwNCiAgICAgICAgICMgRml4ZWQgY29udHJhY2VwdGlvbl9hcHByb2FjaCBmb3INCiAgICAgICAgICMgImhvcm1vbmFsX290aGVyLCBiYXJyaWVyX2NvbmRvbXMiDQogICAgICAgICBjb250cmFjZXB0aW9uX2FwcHJvYWNoID0gZmFjdG9yKGlmZWxzZSgNCiAgICAgICAgICAgY29udHJhY2VwdGlvbl9tZXRob2QgPT0gImhvcm1vbmFsX290aGVyLCBiYXJyaWVyX2NvbmRvbXMiLA0KICAgICAgICAgICAiaG9ybW9uYWxfb3RoZXIrY29uZG9tcyIsDQogICAgICAgICAgIGFzLmNoYXJhY3Rlcihjb250cmFjZXB0aW9uX2FwcHJvYWNoKSkpLA0KICAgICAgICAgIyBGaXhlZCBjb250cmFjZXB0aW9uX2FwcHJvYWNoIGZvcg0KICAgICAgICAgIyAiaG9ybW9uYWxfb3RoZXIsIGJhcnJpZXJfY29uZG9tcywgYmFycmllcl9jb2l0dXNfaW50ZXJydXB0dXMiDQogICAgICAgICBjb250cmFjZXB0aW9uX2FwcHJvYWNoID0gZmFjdG9yKGlmZWxzZSgNCiAgICAgICAgICAgY29udHJhY2VwdGlvbl9tZXRob2QgPT0NCiAgICAgICAgICAgICAiaG9ybW9uYWxfb3RoZXIsIGJhcnJpZXJfY29uZG9tcywgYmFycmllcl9jb2l0dXNfaW50ZXJydXB0dXMiLA0KICAgICAgICAgICAiaG9ybW9uYWxfb3RoZXIrY29uZG9tcyIsDQogICAgICAgICAgIGFzLmNoYXJhY3Rlcihjb250cmFjZXB0aW9uX2FwcHJvYWNoKSkpLA0KICAgICAgICAgY29udHJhY2VwdGlvbl9hcHByb2FjaCA9IGZhY3RvcihpZmVsc2UoDQogICAgICAgICAgIGNvbnRyYWNlcHRpb25fYXBwcm9hY2ggPT0gImhvcm1vbmFsK2JhcnJpZXIiLA0KICAgICAgICAgICAiaG9ybW9uYWxfcGlsbCtjb25kb21zIiwNCiAgICAgICAgICAgYXMuY2hhcmFjdGVyKGNvbnRyYWNlcHRpb25fYXBwcm9hY2gpKSksDQogICAgICAgICBjb250cmFjZXB0aW9uX2FwcHJvYWNoID0gZmFjdG9yKGlmZWxzZSgNCiAgICAgICAgICAgY29udHJhY2VwdGlvbl9tZXRob2QgJWNvbnRhaW5zJSAiYXdhcmVuZXNzIiAmDQogICAgICAgICAgICAgY29udHJhY2VwdGlvbl9tZXRob2QgJWNvbnRhaW5zJSAiY29uZG9tcyIgJg0KICAgICAgICAgICAgICEoY29udHJhY2VwdGlvbl9tZXRob2QgJWNvbnRhaW5zJSAiaG9ybW9uYWwiKSwNCiAgICAgICAgICAgImF3YXJlbmVzcytjb25kb21zIiwNCiAgICAgICAgICAgYXMuY2hhcmFjdGVyKGNvbnRyYWNlcHRpb25fYXBwcm9hY2gpKSkpDQoNCg0KZGF0YSA9IGRhdGEgJT4lDQogIG11dGF0ZShjb250cmFjZXB0aW9uX2FwcHJvYWNoID0gZmFjdG9yKGNvbnRyYWNlcHRpb25fYXBwcm9hY2gsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoImhvcm1vbmFsX3BpbGxfb25seSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhvcm1vbmFsX290aGVyX29ubHkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJob3Jtb25hbF9waWxsK2NvbmRvbXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJob3Jtb25hbF9vdGhlcitjb25kb21zIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFycmllcl9wZXNzYXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhd2FyZW5lc3MiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhd2FyZW5lc3MrY29uZG9tcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbmRvbXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdGhlciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdGhpbmciKSkpDQoNCnFwbG90KGZhY3RvcihkYXRhJGNvbnRyYWNlcHRpb25fYXBwcm9hY2gsIGxldmVscyA9IHJldihsZXZlbHMoZGF0YSRjb250cmFjZXB0aW9uX2FwcHJvYWNoKSkpKSArDQogIGNvb3JkX2ZsaXAoKQ0KdGFibGUoZGF0YSRjb250cmFjZXB0aW9uX2FwcHJvYWNoKQ0KYGBgDQoNCiMjIyBDdXJyZW50IGNvbnRyYWNlcHRpdmUgc3RhdHVzIChob3Jtb25hbCB2cy4gbm9uIGhvcm1vbmFsKQ0KYGBge3J9DQpkYXRhID0gZGF0YSAlPiUgbXV0YXRlKA0KICBjb250cmFjZXB0aW9uX2hvcm1vbmFsID0gZmFjdG9yKGlmZWxzZShjb250cmFjZXB0aW9uX2FwcHJvYWNoICVjb250YWlucyUgImhvcm1vbmFsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInllcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJubyIpKSkNCnFwbG90KGRhdGEkY29udHJhY2VwdGlvbl9ob3Jtb25hbCkgKyBjb29yZF9mbGlwKCkNCnRhYmxlKGRhdGEkY29udHJhY2VwdGlvbl9ob3Jtb25hbCkNCmBgYA0KDQoNCiMjIyBDaGFuZ2VkIGNvbnRyYWNlcHRpb24gc2luY2UgbWVldGluZyB0aGVpciBwYXJ0bmVyDQpUaGVyZSB3aWxsIGJlIE5BcyBiZWNhdXNlIHdlIGFza2VkIGFib3V0IGNvbnRyYWNldGlvbiB3aGVuIG1lZXRpbmcgcGFydG5lciBvbmx5IGlmIHBhcnRpY2lwYW50cyB3ZXJlIGN1cnJlbnRseSBpbiBhIHJlbGF0aW9uc2hpcA0KYGBge3J9DQpjcm9zc3RhYnMofmNvbnRyYWNlcHRpb25faG9ybW9uYWwgKyBjb250cmFjZXB0aW9uX21lZXRpbmdfcGFydG5lciwgZGF0YSA9IGRhdGEpDQpkYXRhID0gZGF0YSAlPiUgbXV0YXRlKA0KICBjb250cmFjZXB0aW9uX2NoYW5nZV9zaW5jZV9tZWV0aW5nX3BhcnRuZXIgPQ0KICAgIGlmZWxzZShjb250cmFjZXB0aW9uX2hvcm1vbmFsID09ICJ5ZXMiICYgY29udHJhY2VwdGlvbl9tZWV0aW5nX3BhcnRuZXIgPT0gMSwNCiAgICAgICAgICAgImNvbmdydWVudF9ob3Jtb25hbCIsDQogICAgICAgICAgIGlmZWxzZShjb250cmFjZXB0aW9uX2hvcm1vbmFsID09ICJubyIgJiBjb250cmFjZXB0aW9uX21lZXRpbmdfcGFydG5lciA9PSAwLA0KICAgICAgICAgICAgICAgICAgImNvbmdydWVudF9ub25ob3Jtb25hbCIsDQogICAgICAgICAgICAgICAgICBpZmVsc2UoY29udHJhY2VwdGlvbl9ob3Jtb25hbCA9PSAieWVzIiAmIGNvbnRyYWNlcHRpb25fbWVldGluZ19wYXJ0bmVyID09IDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgInN3aXRjaGVkX3RvX2hvcm1vbmFsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoY29udHJhY2VwdGlvbl9ob3Jtb25hbCA9PSAibm8iICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cmFjZXB0aW9uX21lZXRpbmdfcGFydG5lciA9PSAxLCAic3dpdGNoZWRfdG9fbm9uaG9ybW9uYWwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSkpKSkpDQoNCnFwbG90KGRhdGEkY29udHJhY2VwdGlvbl9jaGFuZ2Vfc2luY2VfbWVldGluZ19wYXJ0bmVyKSArIGNvb3JkX2ZsaXAoKQ0KDQpkYXRhID0gZGF0YSAlPiUgDQogIG11dGF0ZShjb25ncnVlbnRfY29udHJhY2VwdGlvbiA9IA0KICAgICAgICAgICBmYWN0b3IoaWZlbHNlKGNvbnRyYWNlcHRpb25fY2hhbmdlX3NpbmNlX21lZXRpbmdfcGFydG5lciAlY29udGFpbnMlICJjb25ncnVlbnQiLA0KICAgICAgICAgICAgICAgICAgMSwgMCkpKQ0KYGBgDQoNCiMjIyBDb250cmFjZXB0aW9uIG1lZXRpbmcgcGFydG5lcg0KYGBge3J9DQpkYXRhID0gZGF0YSAlPiUNCiAgbXV0YXRlKGNvbnRyYWNlcHRpb25fbWVldGluZ19wYXJ0bmVyID0gZmFjdG9yKGlmX2Vsc2UoDQogICAgY29udHJhY2VwdGlvbl9tZWV0aW5nX3BhcnRuZXIgPT0gMSwNCiAgICAieWVzIiwgIm5vIikpKQ0KYGBgDQoNCiMjIyBBdHRyYWN0aXZlbmVzcyBQYXJ0bmVyIFNjYWxlDQpgYGB7cn0NCmRhdGEgPSBkYXRhICU+JQ0KICBtdXRhdGUoYXR0cmFjdGl2ZW5lc3NfcGFydG5lciA9IGFzLm51bWVyaWMoDQogICAgKHBhcnRuZXJfYXR0cmFjdGl2ZW5lc3NfZmFjZSArIHBhcnRuZXJfYXR0cmFjdGl2ZW5lc3NfYm9keSkvMikpDQpgYGANCg0KIyMjIFJlbGF0aW9uc2hpcCBTYXRpc2ZhY3Rpb24gU2NhbGUNCmBgYHtyfQ0KZGF0YSA9IGRhdGEgJT4lDQogIG11dGF0ZShyZWxhdGlvbnNoaXBfc2F0aXNmYWN0aW9uID0gYXMubnVtZXJpYygNCiAgICAgICAgICAgKHJlbGF0aW9uc2hpcF9zYXRpc2ZhY3Rpb25fb3ZlcmFsbCArDQogICAgICAgICAgICAgIHJlbGF0aW9uc2hpcF9zYXRpc2ZhY3Rpb25fMiArDQogICAgICAgICAgICAgIHJlbGF0aW9uc2hpcF9zYXRpc2ZhY3Rpb25fMyArDQogICAgICAgICAgICAgICg2IC0gcmVsYXRpb25zaGlwX3Byb2JsZW1zX1IpICsNCiAgICAgICAgICAgICAgKDYgLSByZWxhdGlvbnNoaXBfY29uZmxpY3RfUikpLzUpKQ0KYGBgDQoNCiMjIyBEaWFyeSBpbmZvcm1hdGlvbg0KDQoNCmNhbGN1bGF0ZSBtZWFuIG9mIGxpYmlkbywgc2V4X2FjdGl2ZV9mcmVxdWVuY3kgYW5kIGFjdHVhbCBzZXggZnJlcXVlbmN5IGJhc2VkIG9uIGRpYXJ5DQpgYGB7cn0NCmRhdGFfZGlhcnlfbWVhbnMgPSBkYXRhX2RpYXJ5ICU+JQ0KICBncm91cF9ieShzZXNzaW9uLCBudW1iZXJfb2ZfZGF5cykgJT4lDQogIHN1bW1hcmlzZShkaWFyeV9saWJpZG9fbWVhbiA9IG1lYW4oaGlnaF9saWJpZG8sIG5hLnJtID0gVCksDQogICAgICAgICAgICBkaWFyeV9zZXhfYWN0aXZlX21lYW4gPSBtZWFuKHNleF9hY3RpdmUsIG5hLnJtID0gVCksDQogICAgICAgICAgICBkaWFyeV9zZXhfYWN0aXZlX3NleF9tZWFuID0gbWVhbihzZXhfYWN0aXZpdHlfc2V4LCBuYS5ybSA9IFQpLA0KICAgICAgICAgICAgZGlhcnlfbWFzdHVyYmF0aW9uX21lYW4gPSBtZWFuKHNleF9hY3Rpdml0eV9tYXN0dXJiYXRpb24sIG5hLnJtID0gVCkpDQoNCnFwbG90KGRhdGFfZGlhcnlfbWVhbnMkZGlhcnlfbGliaWRvX21lYW4pDQpxcGxvdChkYXRhX2RpYXJ5X21lYW5zJGRpYXJ5X3NleF9hY3RpdmVfbWVhbikNCnFwbG90KGRhdGFfZGlhcnlfbWVhbnMkZGlhcnlfc2V4X2FjdGl2ZV9zZXhfbWVhbikNCg0KZGF0YV9kaWFyeV9tZWFucyA9IGRhdGFfZGlhcnlfbWVhbnMgJT4lDQogIG11dGF0ZShkaWFyeV9zZXhfYWN0aXZlX3NleF9zdW0gPSBhcy5pbnRlZ2VyKHJvdW5kKGRpYXJ5X3NleF9hY3RpdmVfc2V4X21lYW4qbnVtYmVyX29mX2RheXMsIDEpKSwNCiAgICAgICAgIGRpYXJ5X3NleF9hY3RpdmVfc3VtID0gYXMuaW50ZWdlcihyb3VuZChkaWFyeV9zZXhfYWN0aXZlX21lYW4qbnVtYmVyX29mX2RheXMsIDEpKSwNCiAgICAgICAgIGRpYXJ5X21hc3R1cmJhdGlvbl9zdW0gPSBhcy5pbnRlZ2VyKHJvdW5kKGRpYXJ5X21hc3R1cmJhdGlvbl9tZWFuKm51bWJlcl9vZl9kYXlzLCAxKSkpDQoNCmRhdGEgPSBsZWZ0X2pvaW4oZGF0YSwgZGF0YV9kaWFyeV9tZWFucywgYnkgPSAic2Vzc2lvbiIpDQoNCmBgYA0KDQojIyMgU2V0IHNleF9mcmVxIGFuZCBtYXNfZnJlcSBhcyBtaXNzaW5nLCBpZiBwYXJ0aWNpcGFudHMgaW5kaWNhdGVkIGhhdmluZyBubyBwZW5ldHJhdGl2ZSBzZXh1YWwgaW50ZXJjb3Vyc2UgYW5kIHVzaW5nIG5vIG90aGVyIGZvcm0gb2YgY29udHJhY2VwdGlvbg0KYGBge3J9DQpkYXRhID0gZGF0YSAlPiUNCiAgbXV0YXRlKGRpYXJ5X3NleF9hY3RpdmVfc2V4X21lYW4gPQ0KICAgICAgICAgICBpZmVsc2UoY29udHJhY2VwdGlvbl9tZXRob2QgPT0gImJhcnJpZXJfbm9fcGVuZXRyYXRpdmVfc2V4IiwNCiAgICAgICAgICAgICAgICAgIE5BLA0KICAgICAgICAgICAgICAgICAgZGlhcnlfc2V4X2FjdGl2ZV9zZXhfbWVhbiksDQogICAgICAgICBkaWFyeV9zZXhfYWN0aXZlX3NleF9zdW0gPQ0KICAgICAgICAgICBpZmVsc2UoY29udHJhY2VwdGlvbl9tZXRob2QgPT0gImJhcnJpZXJfbm9fcGVuZXRyYXRpdmVfc2V4IiwNCiAgICAgICAgICAgICAgICAgIE5BLA0KICAgICAgICAgICAgICAgICAgZGlhcnlfc2V4X2FjdGl2ZV9zZXhfc3VtKSwNCiAgICAgICAgIGRpYXJ5X3NleF9hY3RpdmVfbWVhbiA9DQogICAgICAgICAgIGlmZWxzZShjb250cmFjZXB0aW9uX21ldGhvZCA9PSAiYmFycmllcl9ub19wZW5ldHJhdGl2ZV9zZXgiLA0KICAgICAgICAgICAgICAgICAgTkEsDQogICAgICAgICAgICAgICAgICBkaWFyeV9zZXhfYWN0aXZlX21lYW4pLA0KICAgICAgICAgZGlhcnlfc2V4X2FjdGl2ZV9zdW0gPQ0KICAgICAgICAgICBpZmVsc2UoY29udHJhY2VwdGlvbl9tZXRob2QgPT0gImJhcnJpZXJfbm9fcGVuZXRyYXRpdmVfc2V4IiwNCiAgICAgICAgICAgICAgICAgIE5BLA0KICAgICAgICAgICAgICAgICAgZGlhcnlfc2V4X2FjdGl2ZV9zdW0pLA0KICAgICAgICAgZGlhcnlfbWFzdHVyYmF0aW9uX21lYW4gPQ0KICAgICAgICAgICBpZmVsc2UoY29udHJhY2VwdGlvbl9tZXRob2QgPT0gImJhcnJpZXJfbm9fcGVuZXRyYXRpdmVfc2V4IiwNCiAgICAgICAgICAgICAgICAgIE5BLA0KICAgICAgICAgICAgICAgICAgZGlhcnlfbWFzdHVyYmF0aW9uX21lYW4pLA0KICAgICAgICAgZGlhcnlfbWFzdHVyYmF0aW9uX3N1bSA9DQogICAgICAgICAgIGlmZWxzZShjb250cmFjZXB0aW9uX21ldGhvZCA9PSAiYmFycmllcl9ub19wZW5ldHJhdGl2ZV9zZXgiLA0KICAgICAgICAgICAgICAgICAgTkEsDQogICAgICAgICAgICAgICAgICBkaWFyeV9tYXN0dXJiYXRpb25fc3VtKSkNCmBgYA0KDQojIyBTZWxlY3QgRGF0YQ0KYGBge3J9DQpkYXRhID0gZGF0YSAlPiUNCiAgc2VsZWN0KC1kdXJhdGlvbl9yZWxhdGlvbnNoaXBfeWVhcnMsIC1kdXJhdGlvbl9yZWxhdGlvbnNoaXBfbW9udGgsDQogICAgICAgICAtY29udHJhY2VwdGlvbl9hdF9hbGwsIC1jb250cmFjZXB0aW9uX2FwcHJvYWNoLCAtY29udHJhY2VwdGlvbl9tZXRob2RfYnJvYWQpDQpgYGANCg0KIA0KIyMgU2F2ZSBEYXRhDQpgYGB7cn0NCnNhdmUoZGF0YSwgZGF0YSwgZmlsZSA9ICJkYXRhL2NsZWFuZWRfc2VsZWN0ZWRfd3JhbmdsZWQucmRhdGEiKQ0KYGBgDQoNCg==