MOS Scoring
data<-read.csv("/Users/sarenseeley/Dropbox/Postdoc/nwtc_study/meetings/nwtc_data_cleaned_forMeeting_04-06-22.csv", strip.white=FALSE, na.strings="NA")
# get NWTC to BIDS ID conversion
bids_key <- read.csv("/Users/sarenseeley/Dropbox/Postdoc/nwtc_study/notes/nwtc_bids_key.csv")[,-3]
# for people with a 3-month gap between V1 and V2:
mos_int <- data %>% filter(record_id=="NWTC-023" | record_id=="NWTC-025" | record_id=="NWTC-032" | record_id=="NWTC-036" | record_id=="NWTC-079") %>% select(starts_with("mos_") & ends_with("v4_3m"))
ids <- data %>% filter(record_id=="NWTC-023" | record_id=="NWTC-025" | record_id=="NWTC-032" | record_id=="NWTC-036" | record_id=="NWTC-079") %>% select(record_id)
colnames(mos_int)<-gsub("_v4_3m", ".use", names(mos_int)) # rename vars to indicate these are the ones to use
mos_int <- bind_cols(ids,mos_int)
# for people without an interval gap:
mos <- data %>% filter(!record_id %in% mos_int$record_id) %>% select(starts_with("mos_") & !ends_with("_v4_3m"))
colnames(mos) <- paste(colnames(mos),"use",sep=".")
ids <- data %>% filter(!record_id %in% mos_int$record_id) %>% select("record_id")
mos <- bind_cols(ids,mos)
# bind rows, score, and merge back into data
mos <- bind_rows(mos, mos_int)
mos <- left_join(mos,bids_key, by = "record_id") %>%
mutate(tot_mos_emoSup = rowMeans(select(., c(mos_3.use,
mos_4.use,
mos_8.use,
mos_9.use,
mos_13.use,
mos_16.use,
mos_17.use,
mos_19.use)), na.rm=TRUE),
tot_mos_tanSup = rowMeans(select(., c(mos_2.use,
mos_5.use,
mos_12.use,
mos_15.use)),na.rm=TRUE),
tot_mos_affSup = rowMeans(select(., c(mos_6.use,
mos_10.use,
mos_20.use)),na.rm=TRUE),
tot_mos_posSup = rowMeans(select(., c(mos_7.use,
mos_11.use,
mos_18.use)),na.rm=TRUE),
tot_mos_overallSup = rowMeans(select(., c(mos_2.use,
mos_3.use,
mos_4.use,
mos_5.use,
mos_6.use,
mos_7.use,
mos_8.use,
mos_9.use,
mos_10.use,
mos_11.use,
mos_12.use,
mos_13.use,
mos_14.use,
mos_15.use,
mos_16.use,
mos_17.use,
mos_18.use,
mos_19.use,
mos_20.use)),na.rm=TRUE),
tot_mos_nClose = mos_1.use)
mos <- mos %>% mutate(tot_mos_emoSup = 100*((tot_mos_emoSup-1)/4), # convert to 1-100 scale
tot_mos_tanSup = 100*((tot_mos_tanSup-1)/4),
tot_mos_affSup = 100*((tot_mos_affSup-1)/4),
tot_mos_posSup = 100*((tot_mos_posSup-1)/4),
tot_mos_overallSup = 100*((tot_mos_overallSup-1)/4),
)
data <- left_join(mos,data,by="record_id")
tot_mos <- mos %>% select(starts_with("tot") | starts_with("bids"))
rmetWide <- left_join(rmetWide,tot_mos, by ="bids_id")
rmetLong <- left_join(rmetLong,tot_mos, by ="bids_id")
rmetDat <- left_join(rmetDat,tot_mos, by ="bids_id")
# checking MOS scores
mos_dayle <- read.csv("/Users/sarenseeley/Dropbox/Postdoc/nwtc_study/meetings/additional_scales_for_SNT_analyses.csv", strip.white=FALSE, na.strings="NA")[,1:25]
mos_dayle <- mos_dayle %>% mutate(source = "dayle") %>% rename(tot_mos_overallSup = overall_support,
tot_mos_emoSup = emotional_informational,
tot_mos_tanSup = tangible,
tot_mos_affSup = affectionate,
tot_mos_posSup = pos_social_interaction)
mos <- mos %>% mutate(source="saren")
mos1 <- mos %>% select(c("record_id", starts_with("tot"), "source") & !"tot_mos_nClose") %>% select(sort(names(.))) %>%
mutate(tot_mos_overallSup = round(tot_mos_overallSup,0),
tot_mos_emoSup = round(tot_mos_emoSup,0),
tot_mos_tanSup = round(tot_mos_tanSup,0),
tot_mos_affSup = round(tot_mos_affSup,0),
tot_mos_posSup = round(tot_mos_posSup,0))
mos_dayle1 <- mos_dayle %>% select(c("record_id", starts_with("tot"), "source")) %>% select(sort(names(.)))
mos_check <- bind_rows(mos1,mos_dayle1) %>% filter(!record_id %in% c("NWTC-023","NWTC-025","NWTC-032","NWTC-036","NWTC-079"))
mos_check <- pivot_wider(mos_check, id_cols = "record_id",
names_from = starts_with("source"),
values_from = starts_with("tot_mos"))
mos_check <- mos_check %>% filter(!is.na(tot_mos_emoSup_saren) & !is.na(tot_mos_emoSup_dayle)) %>%
mutate(emo_match = as.factor(ifelse(tot_mos_emoSup_saren == tot_mos_emoSup_dayle, 1, 0)),
aff_match = as.factor(ifelse(tot_mos_affSup_saren == tot_mos_affSup_dayle, 1, 0)),
tan_match = as.factor(ifelse(tot_mos_tanSup_saren == tot_mos_tanSup_dayle, 1, 0)),
pos_match = as.factor(ifelse(tot_mos_posSup_saren == tot_mos_posSup_dayle, 1, 0)),
overall_match = as.factor(ifelse(tot_mos_overallSup_saren == tot_mos_overallSup_dayle, 1, 0)))
write.csv(mos_check,"/Users/sarenseeley/Dropbox/Postdoc/nwtc_study/meetings/mos_scoring_comparison.csv")
LS0tCnRpdGxlOiAiUk1FVCBiZWhhdmlvcmFsIGFuYWx5c2VzIChmTVJJIHZlcnNpb24pIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgICBkZl9wcmludDogcGFnZWQKLS0tCgojIyBTdW1tYXJ5CgpGWUk6CgoqIEluY2x1ZGVkIGhlcmUgYXJlIF9uXyA9IDY5IHdpdGggZmluYWwgZ3JvdXAgdmFyaWFibGUgKGFjdHVhbCBfbl8gPSA3MyB3L3NjYW4gZGF0YSB0byBkYXRlKS4KKiBfbl8gPSAzIHdpdGggYWNjdXJhY3kgPDUwJSAoc29jaWFsIHRyaWFscyBvbmx5KQoqIFpvZSBpZGVudGlmaWVkIHRoYXQgYWxsIDMgc3BlYWsgRW5nbGlzaCBhcyBhIHNlY29uZCBsYW5ndWFnZSwgdGhvdWdoIHRoZWlyIEVuZ2xpc2ggYWJpbGl0eSB3YXMgc3VmZmljaWVudCBmb3IgdGhlaXIgZW5yb2xsbWVudCBpbiB0aGUgc3R1ZHkgYW5kIHRoZXkgYWxsIGxlYXJuZWQgRW5nbGlzaCBkdXJpbmcgY2hpbGRob29kLiBPbmUgb2YgdGhlbSBhbHNvIGhhcyB0aGUgaGlnaGVzdCBXVEFSIHNjb3JlICgxMjApIG9mIHRoZSBfbl8gPSAxOSBFU0wgcGFydGljaXBhbnRzLCBzbyB1bmNsZWFyIHdoZXRoZXIgRW5nbGlzaCBwcm9maWNpZW5jeSBpcyB0aGUgc29sZSByZWFzb24gZm9yIHRoZWlyIGxvdyBhY2N1cmFjeS4uLgoKIyMjIyBSZXN1bHRzCgpfTm90ZTogY29uY2x1c2lvbnMgbm90IGJhc2VkIG9uIGFkanVzdGVkIHAgdmFsdWUgZm9yIG11bHRpcGxlIGNvbXBhcmlzb25zLCBJIGp1c3Qgd2FudGVkIHRvIGdldCBhIHNlbnNlIG9mIHdoZXJlIHRoZSBkYXRhIHdlcmUgZm9yIG5vdy5fCgoqIEVmZmVjdCBvZiB0cmlhbCB0eXBlIG9uIHBlcmZvcm1hbmNlIChzZWUgYm94cGxvdHMpOgogICogTWVhbiBSVHMgb24gbm9uLXNvY2lhbCB0cmlhbHMgYXJlIF9mYXN0ZXJfIHRoYW4gb24gc29jaWFsIHRyaWFscywgYWNyb3NzIGFsbCAzIGdyb3Vwcy4KICAqIEFjY3VyYWN5IG9uIG5vbi1zb2NpYWwgdHJpYWxzIGlzIF9oaWdoZXJfIHRoYW4gb24gc29jaWFsIHRyaWFscywgYWNyb3NzIGFsbCAzIGdyb3Vwcy4KIAogCiogRWZmZWN0IG9mIGdyb3VwIG9uIHBlcmZvcm1hbmNlIChzZWUgYm94cGxvdHMpOgogICogTm9uLXNvY2lhbCB0cmlhbHM6IG5vIG1ham9yIGdyb3VwIGRpZmZlcmVuY2VzIGluIG1lYW4gUlQgb3IgYWNjdXJhY3kuCiAgKiBTb2NpYWwgdHJpYWxzOiAKICAgICogVGhlIExvdy1leHBvc2VkIGdyb3VwIGlzIF9zbG93ZXJfIHRoYW4gZWl0aGVyIHRoZSBQVFNEIG9yIFJlc2lsaWVudCBncm91cC4gCiAgICAqIFRoZSBQVFNEIGdyb3VwIGlzICBfbGVzcyBhY2N1cmF0ZV8gdGhhbiBlaXRoZXIgdGhlIExvdy1leHBvc2VkIG9yIFJlc2lsaWVudCBncm91cC4KICAKICAKKiBFZmZlY3Qgb2YgTU9TIGFuZC9vciBncm91cCBvbiBwZXJmb3JtYW5jZSAoc2VlIHNjYXR0ZXItIGFuZCBib3hwbG90cyk6CiAgICogU2NhdHRlcnBsb3RzIHNob3cgdGhlIGxpbmVhciBhc3NvY2lhdGlvbiBiZXR3ZWVuIFJNRVQgcGVyZm9ybWFuY2UgYW5kIE1PUyBzY29yZXMsIHdpdGhpbiBlYWNoIGdyb3VwIGFuZCB0cmlhbCB0eXBlIChubyBzdGF0aXN0aWNhbCB0ZXN0cyBoZXJlLCBJIGRpZCBydW4gdGhlIGxpbmVhciBtb2RlbHMgZm9yIHRoZSB0aHJlZS13YXkgaW50ZXJhY3Rpb24gb2YgYGdyb3VwYCB4IGB0cmlhbHR5cGVgIHggYE1PUyBzdWJzY2FsZSBzY29yZWAgYnV0IEkgd2FzIGNvbmNlcm5lZCBhYm91dCBvdmVyZml0dGluZyBiZWNhdXNlIHRoZXJlIGFyZSBzbyBtYW55IGNvbnRyYXN0cyB3ZSBhcmUgbG9va2luZyBhdCByZWxhdGl2ZSB0byB0aGUgc2FtcGxlIHNpemUpLgogICAKICAKKiBVbnN1cnByaXNpbmdseS4uLmFjcm9zcyBhbGwgTU9TIHN1YnNjYWxlcywgUFRTRCBncm91cCBzY29yZXMgYXJlIHNpZ25pZmljYW50bHkgbG93ZXIgdGhhbiBlaXRoZXIgUmVzaWxpZW50IG9yIExvdy1leHBvc2VkIGdyb3Vwcy4gUmVzaWxpZW50IGFuZCBMb3ctRXhwb3NlZCBncm91cHMgcmVwb3J0ZWQgc2ltaWxhciBsZXZlbHMgb2Ygc29jaWFsIHN1cHBvcnQgKHNlZSBib3hwbG90cykuCiAKCgoKCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFKQpybShsaXN0ID0gbHMoKSkKbGlicmFyeShkcGx5cikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGdnY29ycnBsb3QpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoZ2RhdGEpCmxpYnJhcnkoc3RyaW5ncikKbGlicmFyeShnZ3JlcGVsKQpsaWJyYXJ5KHJlc2hhcGUpCmxpYnJhcnkoY293cGxvdCkKbGlicmFyeShnZ3B1YnIpCgoKcmVuYW1lIDwtIGRwbHlyOjpyZW5hbWUKc2VsZWN0IDwtIGRwbHlyOjpzZWxlY3QKZmlsdGVyIDwtIGRwbHlyOjpmaWx0ZXIKCiMgZGlzYWJsZSBzY2llbnRpZmljIG5vdGF0aW9uCm9wdGlvbnMoc2NpcGVuPTk5OSkKYGBgCgpgYGB7ciwgZWNobz1GQUxTRX0KI2ltcG9ydCBhbmQgY2xlYW4gZGF0YQoKIyBnZXQgYWxsIGZpbGVwYXRocyBmb3IgUk1FVCBiZWhhdmlvcmFsIGRhdGEKZGF0YV9maWxlczwtU3lzLmdsb2IocGF0aD1wYXN0ZTAoIi9Wb2x1bWVzL0V4dGVybmFsL1dUQ19yZXNpbGllbmNlX2ltYWdpbmcvZGF0YS9CSURTX2RhdGEvc3ViLSovZnVuYy8qX3Rhc2stUk1FVF9kaXItQVBfcnVuLTAqX2V2ZW50cy50c3YiKSkKZGF0YV9uYW1lczwtZ3N1YigiL1ZvbHVtZXMvRXh0ZXJuYWwvV1RDX3Jlc2lsaWVuY2VfaW1hZ2luZy9kYXRhL0JJRFNfZGF0YS8iLCIiLGRhdGFfZmlsZXMpCmRhdGFfbmFtZXM8LWdzdWIoIl5zdWItLiovZnVuYy8iLCAiIiwgZGF0YV9uYW1lcykKZGF0YV9uYW1lczwtZ3N1YigiKl90YXNrLVJNRVRfZGlyLUFQX3J1bi0wMV9ldmVudHMudHN2IiwgIi4xIiwgZGF0YV9uYW1lcykKZGF0YV9uYW1lczwtZ3N1YigiKl90YXNrLVJNRVRfZGlyLUFQX3J1bi0wMl9ldmVudHMudHN2IiwgIi4yIiwgZGF0YV9uYW1lcykKZGF0YV9uYW1lczwtZ3N1Yigic3ViLSIsICJzdWIiLCBkYXRhX25hbWVzKQogICAKZm9yKGkgaW4gMTpsZW5ndGgoZGF0YV9maWxlcykpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEhlYWQgb2YgZm9yLWxvb3AKICBhc3NpZ24ocGFzdGUwKG5vcXVvdGUoZGF0YV9uYW1lc1tpXSkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBSZWFkIGFuZCBzdG9yZSBkYXRhIGZyYW1lcwogICAgICAgICByZWFkLnRhYmxlKGRhdGFfZmlsZXNbaV0sc2VwID0gIlx0IiwgaGVhZGVyID0gVFJVRSkpCn0KCnJtKHN1YjA2MS4xLHN1YjA2MS4yKQoKbmV3PC1jb21iaW5lKHN1YjAwMi4xLCBzdWIwMDIuMiwgc3ViMDAzLjEsIHN1YjAwMy4yLCBzdWIwMDQuMSwgc3ViMDA0LjIsIHN1YjAwNS4xLCAKIHN1YjAwNS4yLCBzdWIwMDYuMSwgc3ViMDA2LjIsIHN1YjAwNy4xLCBzdWIwMDcuMiwgc3ViMDA4LjEsIHN1YjAwOC4yLCBzdWIwMDkuMSwKIHN1YjAwOS4yLCBzdWIwMTAuMSwgc3ViMDEwLjIsIHN1YjAxMS4xLCBzdWIwMTEuMiwgc3ViMDEyLjEsIHN1YjAxMi4yLCBzdWIwMTMuMSwKIHN1YjAxMy4yLCBzdWIwMTQuMSwgc3ViMDE0LjIsIHN1YjAxNS4xLCBzdWIwMTUuMiwgc3ViMDE2LjEsIHN1YjAxNi4yLCBzdWIwMTcuMSwKIHN1YjAxNy4yLCBzdWIwMTguMSwgc3ViMDE4LjIsIHN1YjAxOS4xLCBzdWIwMTkuMiwgc3ViMDIwLjEsIHN1YjAyMC4yLCBzdWIwMjEuMSwKIHN1YjAyMS4yLCBzdWIwMjIuMSwgc3ViMDIyLjIsIHN1YjAyMy4xLCBzdWIwMjMuMiwgc3ViMDI0LjEsIHN1YjAyNC4yLCBzdWIwMjUuMSwgc3ViMDI1LjIsIHN1YjAyNi4xLAogc3ViMDI2LjIsIHN1YjAyNy4xLCBzdWIwMjcuMiwgc3ViMDI4LjEsIHN1YjAyOC4yLCBzdWIwMjkuMSwgc3ViMDI5LjIsIHN1YjAzMC4xLAogc3ViMDMwLjIsIHN1YjAzMS4xLCBzdWIwMzEuMiwgc3ViMDMyLjEsIHN1YjAzMi4yLCBzdWIwMzMuMSwgc3ViMDMzLjIsIHN1YjAzNC4xLAogc3ViMDM0LjIsIHN1YjAzNS4xLCBzdWIwMzUuMiwgc3ViMDM2LjEsIHN1YjAzNi4yLCBzdWIwMzcuMSwgc3ViMDM3LjIsIHN1YjAzOC4xLAogc3ViMDM4LjIsIHN1YjAzOS4xLCBzdWIwMzkuMiwgc3ViMDQwLjEsIHN1YjA0MC4yLCBzdWIwNDEuMSwgc3ViMDQxLjIsIHN1YjA0Mi4xLAogc3ViMDQyLjIsIHN1YjA0My4xLCBzdWIwNDMuMiwgc3ViMDQ0LjEsIHN1YjA0NC4yLCBzdWIwNDUuMSwgc3ViMDQ1LjIsIHN1YjA0Ni4xLAogc3ViMDQ2LjIsIHN1YjA0Ny4xLCBzdWIwNDcuMiwgc3ViMDQ4LjEsIHN1YjA0OC4yLCBzdWIwNDkuMSwgc3ViMDQ5LjIsIHN1YjA1MC4xLAogc3ViMDUwLjIsIHN1YjA1MS4xLCBzdWIwNTEuMiwgc3ViMDUyLjEsIHN1YjA1Mi4yLCBzdWIwNTMuMSwgc3ViMDUzLjIsIHN1YjA1NC4xLApzdWIwNTQuMiwgc3ViMDU1LjEsIHN1YjA1NS4yLCBzdWIwNTYuMSwgc3ViMDU2LjIsIHN1YjA1Ny4xLCBzdWIwNTcuMiwgc3ViMDU4LjEsCnN1YjA1OC4yLCBzdWIwNTkuMSwgc3ViMDU5LjIsIHN1YjA2MC4xLCBzdWIwNjAuMiwgc3ViMDYyLjEsIHN1YjA2Mi4yLCBzdWIwNjMuMSwgc3ViMDYzLjIsCnN1YjA2NC4xLCBzdWIwNjQuMiwKc3ViMDY1LjEsIHN1YjA2NS4yLApzdWIwNjYuMSwgc3ViMDY2LjIsCnN1YjA2Ny4xLCBzdWIwNjcuMiwKc3ViMDY4LjEsIHN1YjA2OC4yLApzdWIwNjkuMSwgc3ViMDY5LjIsCnN1YjA3MC4xLCBzdWIwNzAuMiwKc3ViMDcxLjEsIHN1YjA3MS4yLApzdWIwNzIuMSwgc3ViMDcyLjIsCnN1YjA3My4xLCBzdWIwNzMuMikKCiMgYWRkIHZhcmlhYmxlcyBmb3Igc3ViamVjdCBJRCBhbmQgcnVuCm5ldzEgPC0gbmV3ICU+JQogIGZpbHRlcihzdHJfZGV0ZWN0KHNvdXJjZSwgIi4xJCIpKSAlPiUgbXV0YXRlKHJ1biA9ICJydW4gMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkc19pZCA9IGdzdWIoIi4xJCIsIiIsc291cmNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRzX2lkID0gZ3N1Yigic3ViIiwic3ViLSIsIGJpZHNfaWQpKQpuZXcyIDwtIG5ldyAlPiUKICBmaWx0ZXIoc3RyX2RldGVjdChzb3VyY2UsICIuMiQiKSkgJT4lIG11dGF0ZShydW4gPSAicnVuIDIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZHNfaWQgPSBnc3ViKCIuMiQiLCIiLHNvdXJjZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkc19pZCA9IGdzdWIoInN1YiIsInN1Yi0iLCBiaWRzX2lkKSkKCiMgZGVmaW5lIHdvcmRzIGZvciBzb2NpYWwgdHJpYWxzCnNvY2lhbCA9IGMoImNhdXRpb3VzIiwKICAgICAgICAgICAicmVncmV0ZnVsIiwKICAgICAgICAgICAic2NlcHRpY2FsIiwKICAgICAgICAgICAiYW50aWNpcGF0aW5nIiwKICAgICAgICAgICAiYWNjdXNpbmciLAogICAgICAgICAgICJjb250ZW1wbGF0aXZlIiwKICAgICAgICAgICAidGhvdWdodGZ1bCIsCiAgICAgICAgICAgImRvdWJ0ZnVsIiwKICAgICAgICAgICAiZGVjaXNpdmUiLAogICAgICAgICAgICJhZmZlY3Rpb25hdGUiLAogICAgICAgICAgICJpbXBhdGllbnQiLAogICAgICAgICAgICJncmF0ZWZ1bCIsCiAgICAgICAgICAgImFzaGFtZWQiLAogICAgICAgICAgICJiZXdpbGRlcmVkIiwKICAgICAgICAgICAiZ3VpbHR5IiwKICAgICAgICAgICAiYmFmZmxlZCIsCiAgICAgICAgICAgInB1enpsZWQiLAogICAgICAgICAgICJpbmRlY2lzaXZlIiwKICAgICAgICAgICAicGxheWZ1bCIsCiAgICAgICAgICAgInVwc2V0IiwKICAgICAgICAgICAiZGVzaXJlIiwKICAgICAgICAgICAiaW5zaXN0aW5nIiwKICAgICAgICAgICAid29ycmllZCIsCiAgICAgICAgICAgImZhbnRhc2l6aW5nIiwKICAgICAgICAgICAidW5lYXN5IiwKICAgICAgICAgICAiZGVzcG9uZGVudCIsCiAgICAgICAgICAgInByZW9jY3VwaWVkIiwKICAgICAgICAgICAiYXJyb2dhbnQiLAogICAgICAgICAgICJndWlsdHkiLAogICAgICAgICAgICJjb25mdXNlZCIsCiAgICAgICAgICAgImltcGxvcmluZyIsCiAgICAgICAgICAgImN1cmlvdXMiLAogICAgICAgICAgICJob3N0aWxlIiwKICAgICAgICAgICAiaW5jcmVkdWxvdXMiLAogICAgICAgICAgICJzaHkiKQoKIyBjb21iaW5lIHJ1bjEgYW5kIHJ1bjIgZGZzIGFuZCBmaXggdmFyaWFibGVzCiMgInJlc3Bfc3BlZWQiIGlzIGFjdHVhbGx5IHRoZSB0cmlhbC1sZXZlbCBSVCAoaW4gc2Vjb25kcykgdmFyaWFibGUKIyAjICpub3QqICJyZXNwX3J0IgojIGZyb20gLnB5OgojICMgdHJpYWxzLmFkZERhdGEoJ3Jlc3Bfc3BlZWQnLCBrZXlfcmVzcF90cmlhbC5ydCkKIyAjICAgICAgICB0cmlhbHMuYWRkRGF0YSgncmVzcF9ydCcsIGtleV9yZXNwX3RyaWFsLnJ0K3RpbWVyKQoKZGF0MTwtYmluZF9yb3dzKG5ldzEsbmV3MikgJT4lIG11dGF0ZSh0cmlhbHR5cGUgPSBhcy5mYWN0b3IoaWZlbHNlKCFBd29yZHMgJWluJSBzb2NpYWwsICJub24tc29jaWFsIiwgInNvY2lhbCIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzZWQgPSBhcy5mYWN0b3IoaWZlbHNlKGlzLm5hKHJlc3Bfc3BlZWQpLDEsMCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BfUlQgPSByZXNwX3NwZWVkKjEwMDApICU+JQogIHNlbGVjdChjKCJiaWRzX2lkIiwicnVuIiwidHJpYWx0eXBlIiwicmVzcF9SVCIsInJlc3BfYWNjdXJhY3kiLCJtaXNzZWQiKSkKCmhpc3QoZGF0MSRyZXNwX1JULGJyZWFrcyA9IDI1KQptaW4obmEub21pdChkYXQxJHJlc3BfUlQpKQptYXgobmEub21pdChkYXQxJHJlc3BfUlQpKQojIGFsbCB0cmlhbHMgPjUwMG1zLCBzbyBub3QgcmVhbGx5IGNvbmNlcm5lZCBhYm91dCBtaXNmaXJlIHJlc3BvbnNlcyAodXN1YWxseSA8MjAwLTMwMG1zKQoKcm1ldExvbmcgPC0gZGF0MSAlPiUgCiAgZ3JvdXBfYnkoYmlkc19pZCxydW4sdHJpYWx0eXBlKSAlPiUgZmlsdGVyKG1pc3NlZD09MCAmIHJlc3BfYWNjdXJhY3kgPT0gMSkgJT4lICNjb3JyZWN0IHRyaWFscyBvbmx5CiAgc3VtbWFyaXplKG1pbiA9IG1pbihuYS5vbWl0KHJlc3BfUlQpKSwKICAgICAgICAgICAgICAgICAgICAgIG1heCA9IG1heChuYS5vbWl0KHJlc3BfUlQpKSwKICAgICAgICAgICAgICAgICAgICAgIG1lYW5SVCA9IG1lYW4obmEub21pdChyZXNwX1JUKSksIAogICAgICAgICAgICAgICAgICAgICAgbWVkaWFuUlQ9bWVkaWFuKG5hLm9taXQocmVzcF9SVCkpLAogICAgICAgICAgICAgICAgICAgICAgc2QgPSBzZChuYS5vbWl0KHJlc3BfUlQpKSkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhY2N1cmFjeSA9IG4gY29ycmVjdCAvIG4gdG90YWwgdHJpYWxzIHBlciBzdWJqL3J1bi9jb25kaXRpb24KCnJtZXRNaXNzIDwtIGRhdDEgJT4lIGZpbHRlcihtaXNzZWQ9PTEpICU+JSAKICBncm91cF9ieShiaWRzX2lkLHJ1bix0cmlhbHR5cGUpICU+JSBjb3VudChtaXNzZWQpICU+JSByZW5hbWUobWlzc2VkX24gPSBuKSAgJT4lIHNlbGVjdCgtYygibWlzc2VkIikpICU+JSBtdXRhdGUocmVzcG9uZGVkX24gPSAxOC1taXNzZWRfbixtaXNzZWRfcGN0ID0gbWlzc2VkX24vcmVzcG9uZGVkX24pCgpybWV0QWNjIDwtIGRhdDEgJT4lIGZpbHRlcihyZXNwX2FjY3VyYWN5PT0xKSAlPiUgCiAgZ3JvdXBfYnkoYmlkc19pZCxydW4sdHJpYWx0eXBlKSAlPiUgY291bnQocmVzcF9hY2N1cmFjeT09MSkgJT4lIHJlbmFtZShjb3JyZWN0X24gPSBuKSAgJT4lIHNlbGVjdCgtYygicmVzcF9hY2N1cmFjeSA9PSAxIikpCgpybWV0RXJyIDwtIGxlZnRfam9pbihybWV0QWNjLHJtZXRNaXNzLCBieT1jKCJiaWRzX2lkIiwgInJ1biIsICJ0cmlhbHR5cGUiKSkKcm1ldEVyckFjYyA8LSBybWV0RXJyICU+JSBtdXRhdGUocmVzcG9uZGVkX24gPSAxOC1jb2FsZXNjZShtaXNzZWRfbiwgMEwpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzZWRfbiA9IGNvYWxlc2NlKG1pc3NlZF9uLCAwTCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NlZF9wY3QgPSByb3VuZChjb2FsZXNjZShtaXNzZWRfcGN0LCAwTCksNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY3VyYWN5ID0gY29ycmVjdF9uL3Jlc3BvbmRlZF9uKQoKcm1ldExvbmc8LWxlZnRfam9pbihybWV0TG9uZyxybWV0RXJyQWNjLCBieT1jKCJiaWRzX2lkIiwicnVuIiwidHJpYWx0eXBlIikpCiAgICAgICAgICAgCiMgZm9yIGdyb3VwIHZhcmlhYmxlCmdycDwtcmVhZC5jc3YoIi9Vc2Vycy9zYXJlbnNlZWxleS9Ecm9wYm94L1Bvc3Rkb2Mvbnd0Y19zdHVkeS9tZWV0aW5ncy9ud3RjX2V4cG9zdXJlc19jbGVhbmVkXzA1LTMxLTIyX3dpdGhJbmRleEouY3N2Iiwgc3RyaXAud2hpdGU9RkFMU0UsIG5hLnN0cmluZ3M9Ik5BIikKCgpncnAgPC0gZ3JwICU+JSBzZWxlY3QoYmlkc19pZCxncm91cF8zbG93KSAlPiUgbXV0YXRlKGdyb3VwID0gZmFjdG9yKGdyb3VwXzNsb3csIG9yZGVyZWQgPSBGQUxTRSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cF8yZ3JwID0gaWZlbHNlKGdyb3VwXzNsb3c9PSJQVFNEIiwgIlBUU0QiLCJOb24tUFRTRCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBfMmdycCA9IGFzLmZhY3Rvcihncm91cF8yZ3JwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwXzJncnAgPSByZWxldmVsKGdyb3VwXzJncnAsIHJlZj0iTm9uLVBUU0QiKSkKcm1ldERhdDwtbGVmdF9qb2luKGdycCxybWV0TG9uZywgYnk9ImJpZHNfaWQiKSAlPiUgZmlsdGVyKCFpcy5uYShydW4pKSAjIGdldCByaWQgb2Ygc3ViamVjdHMgdy9vIGJlaGF2aW9yYWwgZGF0YQoKd3JpdGUuY3N2KHJtZXREYXQsIi9Wb2x1bWVzL0V4dGVybmFsL1dUQ19yZXNpbGllbmNlX2ltYWdpbmcvZGF0YS9iZWhhdl9kYXRhL2JlaGF2X2RhdGFfUk1FVF8wNjA4MjIuY3N2IikKc2F2ZVJEUyhybWV0RGF0LCIvVm9sdW1lcy9FeHRlcm5hbC9XVENfcmVzaWxpZW5jZV9pbWFnaW5nL2RhdGEvYmVoYXZfZGF0YS9iZWhhdl9kYXRhX1JNRVRfMDYwODIyLnJkcyIpCmBgYAoKIyMgRGVzY3JpcHRpdmVzIGJ5IGdyb3VwCmBgYHtyfQojcm1ldERhdCA8LSByZWFkUkRTKCIvVm9sdW1lcy9FeHRlcm5hbC9XVENfcmVzaWxpZW5jZV9pbWFnaW5nL2RhdGEvYmVoYXZfZGF0YS9iZWhhdl9kYXRhX1JNRVRfMDYwODIyLnJkcyIpCgpkZXNjcmlwdCA8LSBybWV0RGF0ICU+JSBuYS5vbWl0KCkgJT4lCiAgZ3JvdXBfYnkodHJpYWx0eXBlLGdyb3VwLHJ1bikgJT4lIAogIHN1bW1hcml6ZShtZWFuKG1lYW5SVCksIG1lYW4obWVkaWFuUlQpLG1lYW4oc2QpLG1lYW4oYWNjdXJhY3kpKQpkZXNjcmlwdAoKZGVzY3JpcHQgPC0gcm1ldERhdCAlPiUgbmEub21pdCgpICU+JQogIGdyb3VwX2J5KHRyaWFsdHlwZSxncm91cCkgJT4lIAogIHN1bW1hcml6ZShtZWFuKG1lYW5SVCksIG1lYW4oc2QpLG1lYW4oYWNjdXJhY3kpLG1heChhY2N1cmFjeSksbWluKGFjY3VyYWN5KSkKZGVzY3JpcHQKCnJtZXRXaWRlPC1waXZvdF93aWRlcihybWV0RGF0LCAKICAgICAgICAgICAgICAgICAgICAgICAgIGlkX2NvbHMgPSAiYmlkc19pZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc19mcm9tID0gYygicnVuIiwidHJpYWx0eXBlIiksCiAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9IGMoIm1lYW5SVCIsIm1lZGlhblJUIiwiYWNjdXJhY3kiLCJzZCIpLAogICAgICAgICAgICAgICAgICAgICAgbmFtZXNfcHJlZml4ID0gInJtZXQiKSAKc2F2ZVJEUyhybWV0V2lkZSwiL1ZvbHVtZXMvRXh0ZXJuYWwvV1RDX3Jlc2lsaWVuY2VfaW1hZ2luZy9kYXRhL2JlaGF2X2RhdGEvYmVoYXZfZGF0YV9STUVULldpZGVfMDYwODIyLnJkcyIpCmBgYAoKYGBge3J9CnB0c2QgPC0gcm1ldERhdCAlPiUgZmlsdGVyKGdyb3VwID09ICJQVFNEIikKbG93ZXhwIDwtIHJtZXREYXQgJT4lIGZpbHRlcihncm91cCA9PSAiTG93LWV4cG9zZWQiKQpyZXNpbCA8LSBybWV0RGF0ICU+JSBmaWx0ZXIoZ3JvdXAgPT0gIlJlc2lsaWVudCIpCgpoaXN0KGxvd2V4cCRtZWFuUlQpCmhpc3QocmVzaWwkbWVhblJUKQpoaXN0KHB0c2QkbWVhblJUKQoKaGlzdChsb3dleHAkYWNjdXJhY3kpCmhpc3QocmVzaWwkYWNjdXJhY3kpCmhpc3QocHRzZCRhY2N1cmFjeSkKYGBgCgojIyBTdWJqZWN0cyB3aXRoIDw1MCUgYWNjdXJhY3kKCmBzdWItMDI1YCA9IE5XVEMtMDMzIChTcGFuaXNoIDFzdCBsYW5ndWFnZSwgbGVhcm5lZCBFbmdsaXNoIGFnZSA2LCBncmFkLiA0IHllYXIgY29sbGVnZSkKCmBzdWItMDM1YCA9IE5XVEMtMDMyIChTcGFuaXNoIDFzdCBsYW5ndWFnZSwgbGVhcm5lZCBFbmdsaXNoIGFnZSA1LCBncmFkLiA0IHllYXIgY29sbGVnZSkKCmBzdWItMDM5YCA9IE5XVEMtMDM2IChHZXJtYW4gMXN0IGxhbmd1YWdlLCBsZWFybmVkIEVuZ2xpc2ggYWdlIDQsIGdyYWQuIDQgeWVhciBjb2xsZWdlKQoKYGBge3J9CnJtZXREYXQgJT4lIGZpbHRlcihhY2N1cmFjeSA8LjUpCmBgYAoKCmBgYHtyLCBlY2hvPUZBTFNFLCBldmFsPUZBTFNFfQoKIyBvdGhlciBFU0wgc3ViamVjdHMKCmVzbCA9IGMoIk5XVEMtMDI3IiwKIk5XVEMtMDMyIiwKIk5XVEMtMDMzIiwKIk5XVEMtMDM0IiwKIk5XVEMtMDM2IiwKIk5XVEMtMDM5IiwKIk5XVEMtMDY1IiwKIk5XVEMtMDc3IiwKIk5XVEMtMDg5IiwKIk5XVEMtMDk0IiwKIk5XVEMtMTA1IiwKIk5XVEMtMTA2IiwKIk5XVEMtMTExIiwKIk5XVEMtMTEyIikKYGBgCgojIyBCb3hwbG90czogUnVuICYgdHJpYWwgdHlwZQoKIyMjIyBSdW4gMSB2cy4gcnVuIDIKYGBge3J9CgpzdW1tYXJ5KGxtKG1lYW5SVCB+IHRyaWFsdHlwZSxybWV0RGF0KSkKCnJ1bl9jb21wYXJpc29ucyA8LSBsaXN0KCBjKCJydW4gMSIsInJ1biAyIikpCgpwMSA8LSBnZ3Bsb3Qocm1ldERhdCwgYWVzKGNvbG9yPXRyaWFsdHlwZSx5PW1lYW5SVCwgeD1ydW4sbGFiZWw9Ymlkc19pZCkpICsgCiAgICAgICBnZW9tX2JveHBsb3QoKSArIGdlb21fcG9pbnQoKSArIAogIHlsYWIoIk1lYW4gUlQiKSArIHhsYWIoIlJ1biIpICsgZmFjZXRfd3JhcCh2YXJzKHRyaWFsdHlwZSkpICsgCiAgc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gcnVuX2NvbXBhcmlzb25zLCBsYWJlbCA9ICJwLnNpZ25pZiIsIG1ldGhvZD0idC50ZXN0IikgKwogICAgICBnZW9tX2xhYmVsX3JlcGVsKGFlcyhsYWJlbD1pZmVsc2UobWVhblJUPjIxMDAsYXMuY2hhcmFjdGVyKGJpZHNfaWQpLCcnKSksaGp1c3Q9MCx2anVzdD0wLCBtYXgub3ZlcmxhcHMgPSAxMikKCnN1bW1hcnkobG0oYWNjdXJhY3kgfiB0cmlhbHR5cGUscm1ldERhdCkpCgpwMiA8LSBnZ3Bsb3Qocm1ldERhdCwgYWVzKGNvbG9yPXRyaWFsdHlwZSx5PWFjY3VyYWN5LCB4PXJ1bixsYWJlbD1iaWRzX2lkKSkgKyAKICAgICAgIGdlb21fYm94cGxvdCgpICsgZ2VvbV9wb2ludCgpICsgCiAgeWxhYigiQWNjdXJhY3kiKSArIHhsYWIoIlJ1biIpICsgZmFjZXRfd3JhcCh2YXJzKHRyaWFsdHlwZSkpICsgCiAgc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gcnVuX2NvbXBhcmlzb25zLCBsYWJlbCA9ICJwLnNpZ25pZiIsIG1ldGhvZD0idC50ZXN0IikgKwogICAgICBnZW9tX2xhYmVsX3JlcGVsKGFlcyhsYWJlbD1pZmVsc2UobWVhblJUPjIyMDAsYXMuY2hhcmFjdGVyKGJpZHNfaWQpLCcnKSksaGp1c3Q9MCx2anVzdD0wLCBtYXgub3ZlcmxhcHMgPSAxMikKCnAxCnAyCmBgYAoKYGBge3J9Cgp0cmlhbF9jb21wYXJpc29ucyA8LSBsaXN0KCBjKCJub24tc29jaWFsIiwic29jaWFsIikpCgoKcDEgPC0gZ2dwbG90KHJtZXREYXQsIGFlcyh5PW1lYW5SVCwgeD10cmlhbHR5cGUsbGFiZWw9Ymlkc19pZCwgY29sb3I9dHJpYWx0eXBlKSkgKyAKICAgICAgIGdlb21fYm94cGxvdCgpICsgZ2VvbV9wb2ludCgpICsgCiAgeWxhYigiTWVhbiBSVCIpICsgeGxhYigiVHJpYWx0eXBlIikgKyBmYWNldF93cmFwKHZhcnMoZ3JvdXBfM2xvdykpICsgCiAgc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gdHJpYWxfY29tcGFyaXNvbnMsIGxhYmVsID0gInAuc2lnbmlmIiwgbWV0aG9kPSJ0LnRlc3QiKSAKCnAyIDwtIGdncGxvdChybWV0RGF0LCBhZXMoeT1hY2N1cmFjeSwgeD10cmlhbHR5cGUsbGFiZWw9Ymlkc19pZCwgY29sb3I9dHJpYWx0eXBlKSkgKyAKICAgICAgIGdlb21fYm94cGxvdCgpICsgZ2VvbV9wb2ludCgpICsgCiAgeWxhYigiQWNjdXJhY3kiKSArIHhsYWIoIlRyaWFsdHlwZSIpICsgZmFjZXRfd3JhcCh2YXJzKGdyb3VwXzNsb3cpKSArIAogIHN0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IHRyaWFsX2NvbXBhcmlzb25zLCBsYWJlbCA9ICJwLnNpZ25pZiIsIG1ldGhvZD0idC50ZXN0IikgCgpwMQpwMgpgYGAKCgojIyBCb3hwbG90czogR3JvdXAgY29tcGFyaXNvbiBvZiBSTUVUIHBlcmZvcm1hbmNlCgpgYGB7ciwgZmlnLndpZHRoPTR9Cm15X2NvbXBhcmlzb25zIDwtIGxpc3QoIGMoIkxvdy1leHBvc2VkIiwgIlBUU0QiKSwgYygiTG93LWV4cG9zZWQiLCAiUmVzaWxpZW50IiksIGMoIlBUU0QiLCAiUmVzaWxpZW50IikpCgpwMTwtZ2dwbG90KHJtZXREYXQsIGFlcyhncm91cF8zbG93LCBtZWFuUlQpLCBieT1ncm91cF8zbG93LCBmaWxsPWdyb3VwXzNsb3cpICsgCiAgICAgICBnZW9tX2JveHBsb3QoYWVzKGZpbGw9Z3JvdXBfM2xvdykpICsKICAgIHhsYWIoIm1lYW4gUlQiKSArIHRoZW1lX2J3KCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArIGZhY2V0X3dyYXAodmFycyh0cmlhbHR5cGUpKSArIAogIHN0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IG15X2NvbXBhcmlzb25zLCBsYWJlbCA9ICJwLnNpZ25pZiIsIG1ldGhvZD0idC50ZXN0IikKCnAyPC1nZ3Bsb3Qocm1ldERhdCwgYWVzKGdyb3VwXzNsb3csIGFjY3VyYWN5KSwgYnk9Z3JvdXBfM2xvdywgZmlsbD1ncm91cF8zbG93KSArIAogICAgICAgZ2VvbV9ib3hwbG90KGFlcyhmaWxsPWdyb3VwXzNsb3cpKSArCiAgICB4bGFiKCJBY2N1cmFjeSIpICsgdGhlbWVfYncoKSAgKyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArIGZhY2V0X3dyYXAodmFycyh0cmlhbHR5cGUpKSArIAogIHN0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IG15X2NvbXBhcmlzb25zLCBsYWJlbCA9ICJwLnNpZ25pZiIsIG1ldGhvZD0idC50ZXN0IikKCnAxCnAyCmBgYAoKCiMjIE1PUyBTY29yaW5nCmBgYHtyLCBlY2hvPVRSVUV9CgpkYXRhPC1yZWFkLmNzdigiL1VzZXJzL3NhcmVuc2VlbGV5L0Ryb3Bib3gvUG9zdGRvYy9ud3RjX3N0dWR5L21lZXRpbmdzL253dGNfZGF0YV9jbGVhbmVkX2Zvck1lZXRpbmdfMDQtMDYtMjIuY3N2Iiwgc3RyaXAud2hpdGU9RkFMU0UsIG5hLnN0cmluZ3M9Ik5BIikKCiMgZ2V0IE5XVEMgdG8gQklEUyBJRCBjb252ZXJzaW9uCmJpZHNfa2V5IDwtIHJlYWQuY3N2KCIvVXNlcnMvc2FyZW5zZWVsZXkvRHJvcGJveC9Qb3N0ZG9jL253dGNfc3R1ZHkvbm90ZXMvbnd0Y19iaWRzX2tleS5jc3YiKVssLTNdCgojIGZvciBwZW9wbGUgd2l0aCBhIDMtbW9udGggZ2FwIGJldHdlZW4gVjEgYW5kIFYyOgptb3NfaW50IDwtIGRhdGEgJT4lIGZpbHRlcihyZWNvcmRfaWQ9PSJOV1RDLTAyMyIgfCByZWNvcmRfaWQ9PSJOV1RDLTAyNSIgfCByZWNvcmRfaWQ9PSJOV1RDLTAzMiIgfCByZWNvcmRfaWQ9PSJOV1RDLTAzNiIgfCByZWNvcmRfaWQ9PSJOV1RDLTA3OSIpICU+JSBzZWxlY3Qoc3RhcnRzX3dpdGgoIm1vc18iKSAmIGVuZHNfd2l0aCgidjRfM20iKSkKCmlkcyA8LSBkYXRhICU+JSBmaWx0ZXIocmVjb3JkX2lkPT0iTldUQy0wMjMiIHwgcmVjb3JkX2lkPT0iTldUQy0wMjUiIHwgcmVjb3JkX2lkPT0iTldUQy0wMzIiIHwgcmVjb3JkX2lkPT0iTldUQy0wMzYiIHwgcmVjb3JkX2lkPT0iTldUQy0wNzkiKSAlPiUgc2VsZWN0KHJlY29yZF9pZCkKY29sbmFtZXMobW9zX2ludCk8LWdzdWIoIl92NF8zbSIsICIudXNlIiwgbmFtZXMobW9zX2ludCkpICMgcmVuYW1lIHZhcnMgdG8gaW5kaWNhdGUgdGhlc2UgYXJlIHRoZSBvbmVzIHRvIHVzZQptb3NfaW50IDwtIGJpbmRfY29scyhpZHMsbW9zX2ludCkKCiMgZm9yIHBlb3BsZSB3aXRob3V0IGFuIGludGVydmFsIGdhcDoKbW9zIDwtIGRhdGEgJT4lIGZpbHRlcighcmVjb3JkX2lkICVpbiUgbW9zX2ludCRyZWNvcmRfaWQpICU+JSBzZWxlY3Qoc3RhcnRzX3dpdGgoIm1vc18iKSAmICFlbmRzX3dpdGgoIl92NF8zbSIpKQpjb2xuYW1lcyhtb3MpIDwtIHBhc3RlKGNvbG5hbWVzKG1vcyksInVzZSIsc2VwPSIuIikKaWRzIDwtIGRhdGEgJT4lIGZpbHRlcighcmVjb3JkX2lkICVpbiUgbW9zX2ludCRyZWNvcmRfaWQpICU+JSBzZWxlY3QoInJlY29yZF9pZCIpCm1vcyA8LSBiaW5kX2NvbHMoaWRzLG1vcykKCgoKIyBiaW5kIHJvd3MsIHNjb3JlLCBhbmQgbWVyZ2UgYmFjayBpbnRvIGRhdGEKbW9zIDwtIGJpbmRfcm93cyhtb3MsIG1vc19pbnQpCm1vcyA8LSBsZWZ0X2pvaW4obW9zLGJpZHNfa2V5LCBieSA9ICJyZWNvcmRfaWQiKSAlPiUgCiAgICAgICAgICAgICAgICAgbXV0YXRlKHRvdF9tb3NfZW1vU3VwID0gcm93TWVhbnMoc2VsZWN0KC4sIGMobW9zXzMudXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3NfNC51c2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vc184LnVzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9zXzkudXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3NfMTMudXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3NfMTYudXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3NfMTcudXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3NfMTkudXNlKSksIG5hLnJtPVRSVUUpLAogICAgICAgICAgICAgICAgICAgICAgICB0b3RfbW9zX3RhblN1cCA9IHJvd01lYW5zKHNlbGVjdCguLCBjKG1vc18yLnVzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9zXzUudXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3NfMTIudXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3NfMTUudXNlKSksbmEucm09VFJVRSksCiAgICAgICAgICAgICAgICAgICAgICAgIHRvdF9tb3NfYWZmU3VwID0gcm93TWVhbnMoc2VsZWN0KC4sIGMobW9zXzYudXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3NfMTAudXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3NfMjAudXNlKSksbmEucm09VFJVRSksCiAgICAgICAgICAgICAgICAgICAgICAgIHRvdF9tb3NfcG9zU3VwID0gcm93TWVhbnMoc2VsZWN0KC4sIGMobW9zXzcudXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3NfMTEudXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3NfMTgudXNlKSksbmEucm09VFJVRSksCiAgICAgICAgICAgICAgICAgICAgICAgIHRvdF9tb3Nfb3ZlcmFsbFN1cCA9IHJvd01lYW5zKHNlbGVjdCguLCBjKG1vc18yLnVzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vc18zLnVzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vc180LnVzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vc181LnVzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vc182LnVzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vc183LnVzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vc184LnVzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vc185LnVzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vc18xMC51c2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3NfMTEudXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9zXzEyLnVzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vc18xMy51c2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3NfMTQudXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9zXzE1LnVzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vc18xNi51c2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3NfMTcudXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9zXzE4LnVzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vc18xOS51c2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3NfMjAudXNlKSksbmEucm09VFJVRSksCiAgICAgICAgICAgICAgICAgICAgICAgIHRvdF9tb3NfbkNsb3NlID0gbW9zXzEudXNlKQoKbW9zIDwtIG1vcyAlPiUgbXV0YXRlKHRvdF9tb3NfZW1vU3VwID0gMTAwKigodG90X21vc19lbW9TdXAtMSkvNCksICAgIyBjb252ZXJ0IHRvIDEtMTAwIHNjYWxlCiAgICAgICAgICAgICAgICAgICAgICB0b3RfbW9zX3RhblN1cCA9IDEwMCooKHRvdF9tb3NfdGFuU3VwLTEpLzQpLAogICAgICAgICAgICAgICAgICAgICAgdG90X21vc19hZmZTdXAgPSAxMDAqKCh0b3RfbW9zX2FmZlN1cC0xKS80KSwKICAgICAgICAgICAgICAgICAgICAgIHRvdF9tb3NfcG9zU3VwID0gMTAwKigodG90X21vc19wb3NTdXAtMSkvNCksCiAgICAgICAgICAgICAgICAgICAgICB0b3RfbW9zX292ZXJhbGxTdXAgPSAxMDAqKCh0b3RfbW9zX292ZXJhbGxTdXAtMSkvNCksCikKICAKCmRhdGEgPC0gbGVmdF9qb2luKG1vcyxkYXRhLGJ5PSJyZWNvcmRfaWQiKQp0b3RfbW9zIDwtIG1vcyAlPiUgc2VsZWN0KHN0YXJ0c193aXRoKCJ0b3QiKSB8IHN0YXJ0c193aXRoKCJiaWRzIikpCnJtZXRXaWRlIDwtIGxlZnRfam9pbihybWV0V2lkZSx0b3RfbW9zLCBieSA9ImJpZHNfaWQiKQpybWV0TG9uZyA8LSBsZWZ0X2pvaW4ocm1ldExvbmcsdG90X21vcywgYnkgPSJiaWRzX2lkIikKcm1ldERhdCA8LSBsZWZ0X2pvaW4ocm1ldERhdCx0b3RfbW9zLCBieSA9ImJpZHNfaWQiKQoKYGBgCgpgYGB7ciwgZWNobz1UUlVFfQojIGNoZWNraW5nIE1PUyBzY29yZXMKCm1vc19kYXlsZSA8LSByZWFkLmNzdigiL1VzZXJzL3NhcmVuc2VlbGV5L0Ryb3Bib3gvUG9zdGRvYy9ud3RjX3N0dWR5L21lZXRpbmdzL2FkZGl0aW9uYWxfc2NhbGVzX2Zvcl9TTlRfYW5hbHlzZXMuY3N2Iiwgc3RyaXAud2hpdGU9RkFMU0UsIG5hLnN0cmluZ3M9Ik5BIilbLDE6MjVdCgptb3NfZGF5bGUgPC0gbW9zX2RheWxlICU+JSBtdXRhdGUoc291cmNlID0gImRheWxlIikgJT4lIHJlbmFtZSh0b3RfbW9zX292ZXJhbGxTdXAgPSBvdmVyYWxsX3N1cHBvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90X21vc19lbW9TdXAgPSAgZW1vdGlvbmFsX2luZm9ybWF0aW9uYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdF9tb3NfdGFuU3VwID0gdGFuZ2libGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdF9tb3NfYWZmU3VwID0gYWZmZWN0aW9uYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdF9tb3NfcG9zU3VwID0gcG9zX3NvY2lhbF9pbnRlcmFjdGlvbikKbW9zIDwtIG1vcyAlPiUgbXV0YXRlKHNvdXJjZT0ic2FyZW4iKQoKCm1vczEgPC0gbW9zICU+JSBzZWxlY3QoYygicmVjb3JkX2lkIiwgc3RhcnRzX3dpdGgoInRvdCIpLCAic291cmNlIikgJiAhInRvdF9tb3NfbkNsb3NlIikgJT4lIHNlbGVjdChzb3J0KG5hbWVzKC4pKSkgJT4lIAogIG11dGF0ZSh0b3RfbW9zX292ZXJhbGxTdXAgPSByb3VuZCh0b3RfbW9zX292ZXJhbGxTdXAsMCksCiAgICAgICAgIHRvdF9tb3NfZW1vU3VwID0gcm91bmQodG90X21vc19lbW9TdXAsMCksCiAgICAgICAgIHRvdF9tb3NfdGFuU3VwID0gcm91bmQodG90X21vc190YW5TdXAsMCksCiAgICAgICAgIHRvdF9tb3NfYWZmU3VwID0gcm91bmQodG90X21vc19hZmZTdXAsMCksCiAgICAgICAgIHRvdF9tb3NfcG9zU3VwID0gcm91bmQodG90X21vc19wb3NTdXAsMCkpCiAgICAgICAgICAgICAgICAgICAgICAgIAoKbW9zX2RheWxlMSA8LSBtb3NfZGF5bGUgJT4lIHNlbGVjdChjKCJyZWNvcmRfaWQiLCBzdGFydHNfd2l0aCgidG90IiksICJzb3VyY2UiKSkgJT4lIHNlbGVjdChzb3J0KG5hbWVzKC4pKSkKCm1vc19jaGVjayA8LSBiaW5kX3Jvd3MobW9zMSxtb3NfZGF5bGUxKSAlPiUgZmlsdGVyKCFyZWNvcmRfaWQgJWluJSBjKCJOV1RDLTAyMyIsIk5XVEMtMDI1IiwiTldUQy0wMzIiLCJOV1RDLTAzNiIsIk5XVEMtMDc5IikpCm1vc19jaGVjayA8LSBwaXZvdF93aWRlcihtb3NfY2hlY2ssIGlkX2NvbHMgPSAicmVjb3JkX2lkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX2Zyb20gPSBzdGFydHNfd2l0aCgic291cmNlIiksCiAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9IHN0YXJ0c193aXRoKCJ0b3RfbW9zIikpIAoKbW9zX2NoZWNrIDwtIG1vc19jaGVjayAlPiUgZmlsdGVyKCFpcy5uYSh0b3RfbW9zX2Vtb1N1cF9zYXJlbikgJiAhaXMubmEodG90X21vc19lbW9TdXBfZGF5bGUpKSAlPiUKIG11dGF0ZShlbW9fbWF0Y2ggPSBhcy5mYWN0b3IoaWZlbHNlKHRvdF9tb3NfZW1vU3VwX3NhcmVuID09IHRvdF9tb3NfZW1vU3VwX2RheWxlLCAxLCAwKSksCiAgICAgICAgYWZmX21hdGNoID0gYXMuZmFjdG9yKGlmZWxzZSh0b3RfbW9zX2FmZlN1cF9zYXJlbiA9PSB0b3RfbW9zX2FmZlN1cF9kYXlsZSwgMSwgMCkpLAogICAgICAgIHRhbl9tYXRjaCA9IGFzLmZhY3RvcihpZmVsc2UodG90X21vc190YW5TdXBfc2FyZW4gPT0gdG90X21vc190YW5TdXBfZGF5bGUsIDEsIDApKSwKICAgICAgICBwb3NfbWF0Y2ggPSBhcy5mYWN0b3IoaWZlbHNlKHRvdF9tb3NfcG9zU3VwX3NhcmVuID09IHRvdF9tb3NfcG9zU3VwX2RheWxlLCAxLCAwKSksCiAgICAgICAgb3ZlcmFsbF9tYXRjaCA9IGFzLmZhY3RvcihpZmVsc2UodG90X21vc19vdmVyYWxsU3VwX3NhcmVuID09IHRvdF9tb3Nfb3ZlcmFsbFN1cF9kYXlsZSwgMSwgMCkpKQoKICAgICAgICAKd3JpdGUuY3N2KG1vc19jaGVjaywiL1VzZXJzL3NhcmVuc2VlbGV5L0Ryb3Bib3gvUG9zdGRvYy9ud3RjX3N0dWR5L21lZXRpbmdzL21vc19zY29yaW5nX2NvbXBhcmlzb24uY3N2IikKCgpgYGAKCgojIyBTY2F0dGVycGxvdHM6IE1lYW4gUlQgcmVsYXRpb25zaGlwIHdpdGggTU9TIHNjb3JlcwpgYGB7cn0KcDQgPC0gZ2dwbG90KHJtZXREYXQsIGFlcyh0b3RfbW9zX2Vtb1N1cCwgbWVhblJUKSwgYnk9Z3JvdXBfM2xvdywgZmlsbD1ncm91cF8zbG93KSArIAogICAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBncm91cF8zbG93KSkgKwogICAgc3RhdF9zbW9vdGgobWV0aG9kID0gImxtIiwKICAgICAgICBjb2wgPSAiI0M0MjEyNiIsCiAgICAgICAgc2UgPSBGQUxTRSwKICAgICAgICBzaXplID0gMSwgKSAgKyB0aGVtZV9idygpICsgZmFjZXRfd3JhcCh2YXJzKGdyb3VwXzNsb3csdHJpYWx0eXBlKSxuY29sPTQpCnA0CgpwNSA8LSBnZ3Bsb3Qocm1ldERhdCwgYWVzKHRvdF9tb3NfdGFuU3VwLCBtZWFuUlQpLCBieT1ncm91cF8zbG93LCBmaWxsPWdyb3VwXzNsb3cpICsgCiAgICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGdyb3VwXzNsb3cpKSArCiAgICBzdGF0X3Ntb290aChtZXRob2QgPSAibG0iLAogICAgICAgIGNvbCA9ICIjQzQyMTI2IiwKICAgICAgICBzZSA9IEZBTFNFLAogICAgICAgIHNpemUgPSAxKSAgKyB0aGVtZV9idygpICsgZmFjZXRfd3JhcCh2YXJzKGdyb3VwXzNsb3csdHJpYWx0eXBlKSxuY29sPTQpCnA1CgpwNiA8LSBnZ3Bsb3Qocm1ldERhdCwgYWVzKHRvdF9tb3NfYWZmU3VwLCBtZWFuUlQpLCBieT1ncm91cF8zbG93LCBmaWxsPWdyb3VwXzNsb3cpICsgCiAgICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGdyb3VwXzNsb3cpKSArCiAgICBzdGF0X3Ntb290aChtZXRob2QgPSAibG0iLAogICAgICAgIGNvbCA9ICIjQzQyMTI2IiwKICAgICAgICBzZSA9IEZBTFNFLAogICAgICAgIHNpemUgPSAxKSAgKyB0aGVtZV9idygpICsgZmFjZXRfd3JhcCh2YXJzKGdyb3VwXzNsb3csdHJpYWx0eXBlKSxuY29sPTQpCnA2CgpwNyA8LSBnZ3Bsb3Qocm1ldERhdCwgYWVzKHRvdF9tb3NfcG9zU3VwLCBtZWFuUlQpLCBieT1ncm91cF8zbG93LCBmaWxsPWdyb3VwXzNsb3cpICsgCiAgICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGdyb3VwXzNsb3cpKSArCiAgICBzdGF0X3Ntb290aChtZXRob2QgPSAibG0iLAogICAgICAgIGNvbCA9ICIjQzQyMTI2IiwKICAgICAgICBzZSA9IEZBTFNFLAogICAgICAgIHNpemUgPSAxKSAgKyB0aGVtZV9idygpICsgZmFjZXRfd3JhcCh2YXJzKGdyb3VwXzNsb3csdHJpYWx0eXBlKSxuY29sPTQpCnA3CgpwOCA8LSBnZ3Bsb3Qocm1ldERhdCwgYWVzKHRvdF9tb3Nfb3ZlcmFsbFN1cCwgbWVhblJUKSwgYnk9Z3JvdXBfM2xvdywgZmlsbD1ncm91cF8zbG93KSArIAogICAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBncm91cF8zbG93KSkgKwogICAgc3RhdF9zbW9vdGgobWV0aG9kID0gImxtIiwKICAgICAgICBjb2wgPSAiI0M0MjEyNiIsCiAgICAgICAgc2UgPSBGQUxTRSwKICAgICAgICBzaXplID0gMSkgICsgdGhlbWVfYncoKSArIGZhY2V0X3dyYXAodmFycyhncm91cF8zbG93LHRyaWFsdHlwZSksbmNvbD00KQpwOAoKCnA5IDwtIGdncGxvdChybWV0RGF0LCBhZXModG90X21vc19uQ2xvc2UsIG1lYW5SVCksIGJ5PWdyb3VwXzNsb3csIGZpbGw9Z3JvdXBfM2xvdykgKyAKICAgIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gZ3JvdXBfM2xvdykpICsKICAgIHN0YXRfc21vb3RoKG1ldGhvZCA9ICJsbSIsCiAgICAgICAgY29sID0gIiNDNDIxMjYiLAogICAgICAgIHNlID0gRkFMU0UsCiAgICAgICAgc2l6ZSA9IDEpICArIHRoZW1lX2J3KCkgKyBmYWNldF93cmFwKHZhcnMoZ3JvdXBfM2xvdyx0cmlhbHR5cGUpLG5jb2w9NCkKcDkKCmBgYAoKIyMgU2NhdHRlcnBsb3RzOiBBY2N1cmFjeSByZWxhdGlvbnNoaXAgd2l0aCBNT1Mgc2NvcmVzCmBgYHtyfQpwNCA8LSBnZ3Bsb3Qocm1ldERhdCwgYWVzKHRvdF9tb3NfZW1vU3VwLCBhY2N1cmFjeSksIGJ5PWdyb3VwXzNsb3csIGZpbGw9Z3JvdXBfM2xvdykgKyAKICAgIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gZ3JvdXBfM2xvdykpICsKICAgIHN0YXRfc21vb3RoKG1ldGhvZCA9ICJsbSIsCiAgICAgICAgY29sID0gIiNDNDIxMjYiLAogICAgICAgIHNlID0gRkFMU0UsCiAgICAgICAgc2l6ZSA9IDEsICkgICsgdGhlbWVfYncoKSArIGZhY2V0X3dyYXAodmFycyhncm91cF8zbG93LHRyaWFsdHlwZSksbmNvbD00KQpwNAoKcDUgPC0gZ2dwbG90KHJtZXREYXQsIGFlcyh0b3RfbW9zX3RhblN1cCwgYWNjdXJhY3kpLCBieT1ncm91cF8zbG93LCBmaWxsPWdyb3VwXzNsb3cpICsgCiAgICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGdyb3VwXzNsb3cpKSArCiAgICBzdGF0X3Ntb290aChtZXRob2QgPSAibG0iLAogICAgICAgIGNvbCA9ICIjQzQyMTI2IiwKICAgICAgICBzZSA9IEZBTFNFLAogICAgICAgIHNpemUgPSAxKSAgKyB0aGVtZV9idygpICsgZmFjZXRfd3JhcCh2YXJzKGdyb3VwXzNsb3csdHJpYWx0eXBlKSxuY29sPTQpCnA1CgpwNiA8LSBnZ3Bsb3Qocm1ldERhdCwgYWVzKHRvdF9tb3NfYWZmU3VwLCBhY2N1cmFjeSksIGJ5PWdyb3VwXzNsb3csIGZpbGw9Z3JvdXBfM2xvdykgKyAKICAgIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gZ3JvdXBfM2xvdykpICsKICAgIHN0YXRfc21vb3RoKG1ldGhvZCA9ICJsbSIsCiAgICAgICAgY29sID0gIiNDNDIxMjYiLAogICAgICAgIHNlID0gRkFMU0UsCiAgICAgICAgc2l6ZSA9IDEpICArIHRoZW1lX2J3KCkgKyBmYWNldF93cmFwKHZhcnMoZ3JvdXBfM2xvdyx0cmlhbHR5cGUpLG5jb2w9NCkKcDYKCnA3IDwtIGdncGxvdChybWV0RGF0LCBhZXModG90X21vc19wb3NTdXAsIGFjY3VyYWN5KSwgYnk9Z3JvdXBfM2xvdywgZmlsbD1ncm91cF8zbG93KSArIAogICAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBncm91cF8zbG93KSkgKwogICAgc3RhdF9zbW9vdGgobWV0aG9kID0gImxtIiwKICAgICAgICBjb2wgPSAiI0M0MjEyNiIsCiAgICAgICAgc2UgPSBGQUxTRSwKICAgICAgICBzaXplID0gMSkgICsgdGhlbWVfYncoKSArIGZhY2V0X3dyYXAodmFycyhncm91cF8zbG93LHRyaWFsdHlwZSksbmNvbD00KQpwNwoKcDggPC0gZ2dwbG90KHJtZXREYXQsIGFlcyh0b3RfbW9zX292ZXJhbGxTdXAsIGFjY3VyYWN5KSwgYnk9Z3JvdXBfM2xvdywgZmlsbD1ncm91cF8zbG93KSArIAogICAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBncm91cF8zbG93KSkgKwogICAgc3RhdF9zbW9vdGgobWV0aG9kID0gImxtIiwKICAgICAgICBjb2wgPSAiI0M0MjEyNiIsCiAgICAgICAgc2UgPSBGQUxTRSwKICAgICAgICBzaXplID0gMSkgICsgdGhlbWVfYncoKSArIGZhY2V0X3dyYXAodmFycyhncm91cF8zbG93LHRyaWFsdHlwZSksbmNvbD00KQpwOAoKCnA5IDwtIGdncGxvdChybWV0RGF0LCBhZXModG90X21vc19uQ2xvc2UsIGFjY3VyYWN5KSwgYnk9Z3JvdXBfM2xvdywgZmlsbD1ncm91cF8zbG93KSArIAogICAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBncm91cF8zbG93KSkgKwogICAgc3RhdF9zbW9vdGgobWV0aG9kID0gImxtIiwKICAgICAgICBjb2wgPSAiI0M0MjEyNiIsCiAgICAgICAgc2UgPSBGQUxTRSwKICAgICAgICBzaXplID0gMSkgICsgdGhlbWVfYncoKSArIGZhY2V0X3dyYXAodmFycyhncm91cF8zbG93LHRyaWFsdHlwZSksbmNvbD00KQpwOQoKCmBgYAoKCiMjIEJveHBsb3RzOiBHcm91cCBkaWZmZXJlbmNlcyBpbiBNT1Mgc29jaWFsIHN1cHBvcnQKCmBgYHtyfQoKbW9zIDwtIGxlZnRfam9pbihtb3MsZ3JwLCBieSA9ICJiaWRzX2lkIikKCgpteV9jb21wYXJpc29ucyA8LSBsaXN0KCBjKCJMb3ctZXhwb3NlZCIsICJQVFNEIiksIGMoIkxvdy1leHBvc2VkIiwgIlJlc2lsaWVudCIpLCBjKCJQVFNEIiwgIlJlc2lsaWVudCIpKQoKZ2dwbG90KG1vcywgYWVzKGdyb3VwXzNsb3csIHRvdF9tb3NfZW1vU3VwKSwgYnk9Z3JvdXBfM2xvdywgZmlsbD1ncm91cF8zbG93KSArIAogICAgICAgZ2VvbV9ib3hwbG90KGFlcyhmaWxsPWdyb3VwXzNsb3cpKSArIHRoZW1lX2J3KCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArIAogIHN0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IG15X2NvbXBhcmlzb25zLCBsYWJlbCA9ICJwLnNpZ25pZiIsIG1ldGhvZD0idC50ZXN0IikKCmdncGxvdChtb3MsIGFlcyhncm91cF8zbG93LCB0b3RfbW9zX3RhblN1cCksIGJ5PWdyb3VwXzNsb3csIGZpbGw9Z3JvdXBfM2xvdykgKyAKICAgICAgIGdlb21fYm94cGxvdChhZXMoZmlsbD1ncm91cF8zbG93KSkgKyB0aGVtZV9idygpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKyAKICBzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBteV9jb21wYXJpc29ucywgbGFiZWwgPSAicC5zaWduaWYiLCBtZXRob2Q9InQudGVzdCIpCgpnZ3Bsb3QobW9zLCBhZXMoZ3JvdXBfM2xvdywgdG90X21vc19hZmZTdXApLCBieT1ncm91cF8zbG93LCBmaWxsPWdyb3VwXzNsb3cpICsgCiAgICAgICBnZW9tX2JveHBsb3QoYWVzKGZpbGw9Z3JvdXBfM2xvdykpICsgdGhlbWVfYncoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsgCiAgc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbXlfY29tcGFyaXNvbnMsIGxhYmVsID0gInAuc2lnbmlmIiwgbWV0aG9kPSJ0LnRlc3QiKQoKZ2dwbG90KG1vcywgYWVzKGdyb3VwXzNsb3csIHRvdF9tb3NfcG9zU3VwKSwgYnk9Z3JvdXBfM2xvdywgZmlsbD1ncm91cF8zbG93KSArIAogICAgICAgZ2VvbV9ib3hwbG90KGFlcyhmaWxsPWdyb3VwXzNsb3cpKSArIHRoZW1lX2J3KCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArIAogIHN0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IG15X2NvbXBhcmlzb25zLCBsYWJlbCA9ICJwLnNpZ25pZiIsIG1ldGhvZD0idC50ZXN0IikKCmdncGxvdChtb3MsIGFlcyhncm91cF8zbG93LCB0b3RfbW9zX292ZXJhbGxTdXApLCBieT1ncm91cF8zbG93LCBmaWxsPWdyb3VwXzNsb3cpICsgCiAgICAgICBnZW9tX2JveHBsb3QoYWVzKGZpbGw9Z3JvdXBfM2xvdykpICsgdGhlbWVfYncoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsgCiAgc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbXlfY29tcGFyaXNvbnMsIGxhYmVsID0gInAuc2lnbmlmIiwgbWV0aG9kPSJ0LnRlc3QiKQoKZ2dwbG90KG1vcywgYWVzKGdyb3VwXzNsb3csIHRvdF9tb3NfbkNsb3NlKSwgYnk9Z3JvdXBfM2xvdywgZmlsbD1ncm91cF8zbG93KSArIAogICAgICAgZ2VvbV9ib3hwbG90KGFlcyhmaWxsPWdyb3VwXzNsb3cpKSArIHRoZW1lX2J3KCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArIAogIHN0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IG15X2NvbXBhcmlzb25zLCBsYWJlbCA9ICJwLnNpZ25pZiIsIG1ldGhvZD0idC50ZXN0IikKCgpgYGAKCgpgYGB7ciwgZXZhbD1GQUxTRSwgZWNobz1GQUxTRX0KCgoKIyBtYWtlIGJpbmFyeSB2YXJzIGZvciBzb2NpYWwgdHJpYWxzLCBQVFNEIGdyb3VwCiNybWV0RGF0IDwtIHJtZXREYXQgJT4lIAojICBtdXRhdGUoc29jaWFsX3RyaWFsID0gKHRyaWFsdHlwZSA9PSAic29jaWFsIikqMSwKIyAgICAgICAgIHB0c2QgPSAoZ3JvdXBfM2xvdyA9PSAiUFRTRCIpKjEpCgoKCm0xPC1sbShtZWFuUlQgfiBncm91cF8zbG93KnRyaWFsdHlwZSp0b3RfbW9zX2Vtb1N1cCwgcm1ldERhdCkKc3VtbWFyeShtMSkKCm0xPC1sbShhY2N1cmFjeSB+IGdyb3VwXzNsb3cqdHJpYWx0eXBlKnRvdF9tb3NfZW1vU3VwLCBybWV0RGF0KQpzdW1tYXJ5KG0xKQoKbTE8LWxtKG1lYW5SVCB+IGdyb3VwXzNsb3cqdHJpYWx0eXBlKnRvdF9tb3NfdGFuU3VwLCBybWV0RGF0KQpzdW1tYXJ5KG0xKQoKbTE8LWxtKGFjY3VyYWN5IH4gZ3JvdXBfM2xvdyp0cmlhbHR5cGUqdG90X21vc190YW5TdXAsIHJtZXREYXQpCnN1bW1hcnkobTEpCgptMTwtbG0obWVhblJUIH4gZ3JvdXBfM2xvdyp0cmlhbHR5cGUqdG90X21vc19hZmZTdXAsIHJtZXREYXQpCnN1bW1hcnkobTEpCgptMTwtbG0oYWNjdXJhY3kgfiBncm91cF8zbG93KnRyaWFsdHlwZSp0b3RfbW9zX2FmZlN1cCwgcm1ldERhdCkKc3VtbWFyeShtMSkKCm0xPC1sbShtZWFuUlQgfiBncm91cF8zbG93KnRyaWFsdHlwZSp0b3RfbW9zX2FmZlN1cCwgcm1ldERhdCkKc3VtbWFyeShtMSkKCm0xPC1sbShhY2N1cmFjeSB+IGdyb3VwXzNsb3cqdHJpYWx0eXBlKnRvdF9tb3NfYWZmU3VwLCBybWV0RGF0KQpzdW1tYXJ5KG0xKQoKCm0xPC1sbShtZWFuUlQgfiBncm91cF8zbG93KnRyaWFsdHlwZSp0b3RfbW9zX292ZXJhbGxTdXAsIHJtZXREYXQpCnN1bW1hcnkobTEpCgptMTwtbG0oYWNjdXJhY3kgfiBncm91cF8zbG93KnRyaWFsdHlwZSp0b3RfbW9zX292ZXJhbGxTdXAsIHJtZXREYXQpCnN1bW1hcnkobTEpCgoKCm0xPC1sbShtZWFuUlQgfiBncm91cF8zbG93KnRyaWFsdHlwZSp0b3RfbW9zX25DbG9zZSwgcm1ldERhdCkKc3VtbWFyeShtMSkKCm0xPC1sbShhY2N1cmFjeSB+IGdyb3VwXzNsb3cqdHJpYWx0eXBlKnRvdF9tb3NfbkNsb3NlLCBybWV0RGF0KQpzdW1tYXJ5KG0xKQpgYGAKCiMjIEZyZXF1ZW5jaWVzIG9mIHdvcmRzIGluY29ycmVjdC9taXNzZWQKYGBge3J9CgoKIyBUTyBMT09LIEFUIFdPUkRTIFdST05HL01JU1NFRC4uLgoKcm1ldFdvcmRzRXJyIDwtICBkYXQxPC1iaW5kX3Jvd3MobmV3MSxuZXcyKSAlPiUgbXV0YXRlKHRyaWFsdHlwZSA9IGFzLmZhY3RvcihpZmVsc2UoIUF3b3JkcyAlaW4lIHNvY2lhbCwgIm5vbi1zb2NpYWwiLCAic29jaWFsIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NlZCA9IGFzLmZhY3RvcihpZmVsc2UoaXMubmEocmVzcF9zcGVlZCksMSwwKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcF9SVCA9IHJlc3Bfc3BlZWQqMTAwMCkgJT4lCiAgc2VsZWN0KGMoImJpZHNfaWQiLCJydW4iLCJBd29yZHMiLCJyZXNwX1JUIiwicmVzcF9hY2N1cmFjeSIsIm1pc3NlZCIsInRyaWFsdHlwZSIpKSAlPiUgZmlsdGVyKG1pc3NlZD09MCAmIHJlc3BfYWNjdXJhY3kgPT0gMCAmIHRyaWFsdHlwZT09InNvY2lhbCIpICNlcnJvcnMgb25seQoKcm1ldFdvcmRzTWlzc2VkIDwtICBkYXQxPC1iaW5kX3Jvd3MobmV3MSxuZXcyKSAlPiUgbXV0YXRlKHRyaWFsdHlwZSA9IGFzLmZhY3RvcihpZmVsc2UoIUF3b3JkcyAlaW4lIHNvY2lhbCwgIm5vbi1zb2NpYWwiLCAic29jaWFsIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NlZCA9IGFzLmZhY3RvcihpZmVsc2UoaXMubmEocmVzcF9zcGVlZCksMSwwKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcF9SVCA9IHJlc3Bfc3BlZWQqMTAwMCkgJT4lCiAgc2VsZWN0KGMoImJpZHNfaWQiLCJydW4iLCJBd29yZHMiLCJyZXNwX1JUIiwicmVzcF9hY2N1cmFjeSIsIm1pc3NlZCIsInRyaWFsdHlwZSIpKSAlPiUgZmlsdGVyKG1pc3NlZD09MSAmIHRyaWFsdHlwZT09InNvY2lhbCIpICNtaXNzZWQgb25seQoKCiMgd2FzIEVuZ2xpc2ggdGhlaXIgZmlyc3QgbGFuZ3VhZ2U/CmVmbCA8LSByZWFkLmNzdigiL1VzZXJzL3NhcmVuc2VlbGV5L0Ryb3Bib3gvUG9zdGRvYy9ud3RjX3N0dWR5L21lZXRpbmdzL253dGNfZW5nbGlzaF9maXJzdF9sYW5ndWFnZS5jc3YiLCBzdHJpcC53aGl0ZT1GQUxTRSwgbmEuc3RyaW5ncz0iTkEiKSAjIDAgPSAib3RoZXIgbGFuZ3VhZ2UgMXN0IiwgMSA9ICJlbmdsaXNoIDFzdCIKCmVmbCA8LSBlZmwgJT4lIG11dGF0ZShlZmwgPSBmYWN0b3IoZW5nbGlzaF9maXJzdF9sYW5nLCBsZXZlbHM9YygwLDEpLCBsYWJlbHM9Yygib3RoZXIgbGFuZ3VhZ2UgMXN0IiwiZW5nbGlzaCAxc3QiKSkpICU+JQogIHNlbGVjdCgicmVjb3JkX2lkIiwiZWZsIikKCmVmbDwtbGVmdF9qb2luKGJpZHNfa2V5LGVmbCxieT0icmVjb3JkX2lkIikgJT4lIHNlbGVjdCghcmVjb3JkX2lkKQoKcm1ldFdvcmRzRXJyIDwtIGxlZnRfam9pbihybWV0V29yZHNFcnIsZWZsLCBieSA9ICJiaWRzX2lkIikKcm1ldFdvcmRzTWlzc2VkIDwtIGxlZnRfam9pbihybWV0V29yZHNNaXNzZWQsZWZsLCBieSA9ICJiaWRzX2lkIikKICAKcm1ldFdvcmRzRXJyMSA8LSBybWV0V29yZHNFcnIgJT4lIGNvdW50KEF3b3JkcywgbmFtZT0ibiIpICU+JQogICAgdW5ncm91cCgpCgpybWV0V29yZHNNaXNzZWQxIDwtIHJtZXRXb3Jkc01pc3NlZCAlPiUgY291bnQoQXdvcmRzLCBuYW1lPSJuIikgJT4lCiAgICB1bmdyb3VwKCkKCnJtZXRXb3Jkc0VycjIgPC0gcm1ldFdvcmRzRXJyICU+JSBjb3VudChlZmwsQXdvcmRzLCBuYW1lPSJuIikgJT4lCiAgICB1bmdyb3VwKCkKCnJtZXRXb3Jkc01pc3NlZDIgPC0gcm1ldFdvcmRzTWlzc2VkICU+JSBjb3VudChlZmwsQXdvcmRzLCBuYW1lPSJuIikgJT4lCiAgICB1bmdyb3VwKCkKCmdncGxvdChybWV0V29yZHNFcnIxLCBhZXMoeCA9IHJlb3JkZXIoQXdvcmRzLCgtbikpLCB5ID0gbiwgZmlsbD1Bd29yZHMpKSArCiAgIGdlb21fYmFyKHBvc2l0aW9uPSJzdGFjayIsIHN0YXQ9ImlkZW50aXR5IiwgY29sb3I9ImJsYWNrIikrCiBjb29yZF9mbGlwKCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSAreGxhYigic29jaWFsIHdvcmRzIChlcnJvciB0cmlhbHMpIikgKyB5bGFiKCJmcmVxdWVuY3kiKQoKZ2dwbG90KHJtZXRXb3Jkc01pc3NlZDEsIGFlcyh4ID0gcmVvcmRlcihBd29yZHMsKC1uKSksIHkgPSBuLCBmaWxsPUF3b3JkcykpICsKICAgZ2VvbV9iYXIocG9zaXRpb249InN0YWNrIiwgc3RhdD0iaWRlbnRpdHkiLCBjb2xvcj0iYmxhY2siKSsKIGNvb3JkX2ZsaXAoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICt4bGFiKCJzb2NpYWwgd29yZHMgKG1pc3NlZCB0cmlhbHMpIikgKyB5bGFiKCJmcmVxdWVuY3kiKQogCgpnZ3Bsb3Qocm1ldFdvcmRzRXJyMiwgYWVzKHggPSByZW9yZGVyKEF3b3JkcywoLW4pKSwgeSA9IG4sIGZpbGw9QXdvcmRzKSkgKwogICBnZW9tX2Jhcihwb3NpdGlvbj0ic3RhY2siLCBzdGF0PSJpZGVudGl0eSIsIGNvbG9yPSJibGFjayIpKwogY29vcmRfZmxpcCgpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgK3hsYWIoInNvY2lhbCB3b3JkcyAoZXJyb3IgdHJpYWxzKSIpICsgeWxhYigiZnJlcXVlbmN5IikgKyBmYWNldF93cmFwKCJlZmwiKQoKZ2dwbG90KHJtZXRXb3Jkc01pc3NlZDIsIGFlcyh4ID0gcmVvcmRlcihBd29yZHMsKC1uKSksIHkgPSBuLCBmaWxsPUF3b3JkcykpICsKICAgZ2VvbV9iYXIocG9zaXRpb249InN0YWNrIiwgc3RhdD0iaWRlbnRpdHkiLCBjb2xvcj0iYmxhY2siKSsKIGNvb3JkX2ZsaXAoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICt4bGFiKCJzb2NpYWwgd29yZHMgKG1pc3NlZCB0cmlhbHMpIikgKyB5bGFiKCJmcmVxdWVuY3kiKSAgKyBmYWNldF93cmFwKCJlZmwiKQogCgpgYGAKCg==