library(mbtools)
theme_set(theme_minimal())
cohort <- rbind(
    fread("no_weight_loss.csv", colClasses=c(public_client_id="character")),
    fread("successful_weight_loss.csv", colClasses=c(public_client_id="character"))
)[since_baseline == 0]
cohort[, "subset" := "no weight loss"]
cohort[weight_change_relative < 0, "subset" := "weight loss"]
cohort[, subset := factor(subset)]
library(arivale.data.interface)
chem <- get_snapshot("chemistries", clean=T)
chem <- chem[cohort, on=c("public_client_id", "days_in_program"), roll="nearest"]
ggplot(cohort, aes(x=subset, y=bmi, color=subset)) + 
    geom_jitter(width=0.2) +
    labs(x="", y=expression(paste("BMI [", kg/m^2, "]"))) +
    stat_summary(fun = median, geom = "point", size = 2, 
                 stroke=1, fill="white", shape = 23) +
    guides(color=F) + theme(axis.text.x = element_text(angle=30, hjust=1, vjust=1))

t.test(bmi ~ subset, data=cohort)

    Welch Two Sample t-test

data:  bmi by subset
t = -5.1857, df = 99.887, p-value = 1.128e-06
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -8.541508 -3.814299
sample estimates:
mean in group no weight loss    mean in group weight loss 
                    26.86594                     33.04384 
ggsave("figures/bmi.svg", width=2, height=3)
ggplot(cohort, aes(x=subset, y=age, color=subset)) + 
    geom_jitter(width=0.2) +
    stat_summary(fun = median, geom = "point", size = 2, 
                 stroke=1, fill="white", shape = 23) +
    labs(x="", y="age [years]") +
    guides(color=F) + theme(axis.text.x = element_text(angle=30, hjust=1, vjust=1))

t.test(age ~ subset, data=cohort)

    Welch Two Sample t-test

data:  age by subset
t = -0.29805, df = 94.603, p-value = 0.7663
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -4.427005  3.271303
sample estimates:
mean in group no weight loss    mean in group weight loss 
                    45.85965                     46.43750 
ggsave("figures/age.svg", width=2, height=3)
ggplot(cohort, aes(x=subset, y=weight_change_relative, color=subset)) + 
    geom_jitter(width=0.2) +
    stat_summary(fun = median, geom = "point", size = 2, 
                 stroke=1, fill="white", shape = 23) +
    labs(x="", y="rel. Δweight [%/month]") +
    guides(color=F) + theme(axis.text.x = element_text(angle=30, hjust=1, vjust=1))

t.test(weight_change_relative ~ subset, data=cohort)

    Welch Two Sample t-test

data:  weight_change_relative by subset
t = 21.727, df = 78.732, p-value < 2.2e-16
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.01780301 0.02139410
sample estimates:
mean in group no weight loss    mean in group weight loss 
                 0.003835098                 -0.015763459 
ggsave("figures/weight_change.svg", width=2, height=3)
ggplot(chem, aes(x=subset, y=ADIPONECTIN__SERUM, color=subset)) + 
    geom_jitter(width=0.2) +
    stat_summary(fun = median, geom = "point", size = 2, 
                 stroke=1, fill="white", shape = 23) +
    labs(x="", y="serum adiponectin [mg/L]") +
    guides(color=F) + theme(axis.text.x = element_text(angle=30, hjust=1, vjust=1))

t.test(ADIPONECTIN__SERUM ~ subset, data=chem)

    Welch Two Sample t-test

data:  ADIPONECTIN__SERUM by subset
t = 3.0276, df = 102.89, p-value = 0.003116
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 1.08811 5.22110
sample estimates:
mean in group no weight loss    mean in group weight loss 
                    9.508772                     6.354167 
ggsave("figures/adiponectin.svg", width=2, height=3)
ggplot(chem, aes(x=subset, y=HDL_CHOL_DIRECT, color=subset)) + 
    geom_jitter(width=0.2) +
    stat_summary(fun = median, geom = "point", size = 2, 
                 stroke=1, fill="white", shape = 23) +
    labs(x="", y="serum HDL [mg/L]") +
    guides(color=F) + theme(axis.text.x = element_text(angle=30, hjust=1, vjust=1))

t.test(HDL_CHOL_DIRECT ~ subset, data=chem)

    Welch Two Sample t-test

data:  HDL_CHOL_DIRECT by subset
t = 3.4008, df = 102.94, p-value = 0.0009576
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
  5.147127 19.550242
sample estimates:
mean in group no weight loss    mean in group weight loss 
                    64.14035                     51.79167 
ggsave("figures/hdl.svg", width=2, height=3)
ggplot(chem, aes(x=subset, y=LDL_CHOL_CALCULATION, color=subset)) + 
    geom_jitter(width=0.2) +
    stat_summary(fun = median, geom = "point", size = 2, 
                 stroke=1, fill="white", shape = 23) +
    labs(x="", y="serum LDL [mg/L]") +
    guides(color=F) + theme(axis.text.x = element_text(angle=30, hjust=1, vjust=1))

t.test(LDL_CHOL_CALCULATION ~ subset, data=chem)

    Welch Two Sample t-test

data:  LDL_CHOL_CALCULATION by subset
t = -2.093, df = 91.69, p-value = 0.03911
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -24.5203475  -0.6419332
sample estimates:
mean in group no weight loss    mean in group weight loss 
                    99.87719                    112.45833 
ggsave("figures/ldl.svg", width=2, height=3)
ggplot(chem, aes(x=subset, y=GLUCOSE, color=subset)) + 
    geom_jitter(width=0.2) +
    stat_summary(fun = median, geom = "point", size = 2, 
                 stroke=1, fill="white", shape = 23) +
    labs(x="", y="serum glucose [mg/L]") +
    guides(color=F) + theme(axis.text.x = element_text(angle=30, hjust=1, vjust=1))

t.test(GLUCOSE ~ subset, data=chem)

    Welch Two Sample t-test

data:  GLUCOSE by subset
t = -1.4173, df = 99.166, p-value = 0.1595
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -8.673514  1.445444
sample estimates:
mean in group no weight loss    mean in group weight loss 
                    92.38596                     96.00000 
ggsave("figures/glucose.svg", width=2, height=3)
ggplot(chem, aes(x=subset, y=HOMA_IR, color=subset)) + 
    geom_jitter(width=0.2) +
    stat_summary(fun = median, geom = "point", size = 2, 
                 stroke=1, fill="white", shape = 23) +
    labs(x="", y="HOMA IR [index]") +
    guides(color=F) + theme(axis.text.x = element_text(angle=30, hjust=1, vjust=1))

t.test(HOMA_IR ~ subset, data=chem)

    Welch Two Sample t-test

data:  HOMA_IR by subset
t = -2.7673, df = 72.981, p-value = 0.007157
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -2.5195805 -0.4098374
sample estimates:
mean in group no weight loss    mean in group weight loss 
                    1.974360                     3.439069 
ggsave("figures/homa_ir.svg", width=2, height=3)
library(pheatmap)

measures <- c("bmi", "age", "weight_change_relative", 
              "HOMA_IR", "GLUCOSE", "LDL_CHOL_CALCULATION", 
              "HDL_CHOL_DIRECT", "ADIPONECTIN__SERUM")

legends <- c("BMI [kg/m²]", "age [years]", "rel. Δweight [%/month]", "HOMA IR [index]", "serum glucose [mg/L]", "serum LDL [mg/L]", "serum HDL [mg/L]", "serum adiponectin [mg/L]")

abundances <- chem[, measures, with = FALSE]
names(abundances) <- legends
tests <- cor.mtest(abundances, conf.level=0.95)
corrs <- cor(abundances)
svglite::svglite("figures/baseline_correlations.svg", width=8, height=6)
corrplot(corrs, p.mat = tests$p, method = 'circle', diag = FALSE,
         sig.level = c(0.001, 0.01, 0.05), pch.cex = 0.75, 
         insig = 'label_sig', order = 'AOE', tl.col = "black", addgrid.col=NA,
         cl.offset=1, cl.cex=1.2)
dev.off()
null device 
          1 
corrplot(corrs, p.mat = tests$p, method = 'circle', diag = FALSE,
         sig.level = c(0.001, 0.01, 0.05), pch.cex = 0.75, 
         insig = 'label_sig', order = 'AOE', tl.col = "black", addgrid.col=NA,
         cl.offset=1, cl.cex=1.2)

LS0tCnRpdGxlOiAiQ29ob3J0IGNoYXJhY3RlcmlzdGljcyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CmxpYnJhcnkobWJ0b29scykKdGhlbWVfc2V0KHRoZW1lX21pbmltYWwoKSkKYGBgCgpgYGB7cn0KY29ob3J0IDwtIHJiaW5kKAogICAgZnJlYWQoIm5vX3dlaWdodF9sb3NzLmNzdiIsIGNvbENsYXNzZXM9YyhwdWJsaWNfY2xpZW50X2lkPSJjaGFyYWN0ZXIiKSksCiAgICBmcmVhZCgic3VjY2Vzc2Z1bF93ZWlnaHRfbG9zcy5jc3YiLCBjb2xDbGFzc2VzPWMocHVibGljX2NsaWVudF9pZD0iY2hhcmFjdGVyIikpCilbc2luY2VfYmFzZWxpbmUgPT0gMF0KY29ob3J0WywgInN1YnNldCIgOj0gIm5vIHdlaWdodCBsb3NzIl0KY29ob3J0W3dlaWdodF9jaGFuZ2VfcmVsYXRpdmUgPCAwLCAic3Vic2V0IiA6PSAid2VpZ2h0IGxvc3MiXQpjb2hvcnRbLCBzdWJzZXQgOj0gZmFjdG9yKHN1YnNldCldCmBgYAoKYGBge3J9CmxpYnJhcnkoYXJpdmFsZS5kYXRhLmludGVyZmFjZSkKY2hlbSA8LSBnZXRfc25hcHNob3QoImNoZW1pc3RyaWVzIiwgY2xlYW49VCkKY2hlbSA8LSBjaGVtW2NvaG9ydCwgb249YygicHVibGljX2NsaWVudF9pZCIsICJkYXlzX2luX3Byb2dyYW0iKSwgcm9sbD0ibmVhcmVzdCJdCmBgYAoKYGBge3IsIGZpZy53aWR0aD0yLCBmaWcuaGVpZ2h0PTN9CmdncGxvdChjb2hvcnQsIGFlcyh4PXN1YnNldCwgeT1ibWksIGNvbG9yPXN1YnNldCkpICsgCiAgICBnZW9tX2ppdHRlcih3aWR0aD0wLjIpICsKICAgIGxhYnMoeD0iIiwgeT1leHByZXNzaW9uKHBhc3RlKCJCTUkgWyIsIGtnL21eMiwgIl0iKSkpICsKICAgIHN0YXRfc3VtbWFyeShmdW4gPSBtZWRpYW4sIGdlb20gPSAicG9pbnQiLCBzaXplID0gMiwgCiAgICAgICAgICAgICAgICAgc3Ryb2tlPTEsIGZpbGw9IndoaXRlIiwgc2hhcGUgPSAyMykgKwogICAgZ3VpZGVzKGNvbG9yPUYpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9MzAsIGhqdXN0PTEsIHZqdXN0PTEpKQp0LnRlc3QoYm1pIH4gc3Vic2V0LCBkYXRhPWNvaG9ydCkKZ2dzYXZlKCJmaWd1cmVzL2JtaS5zdmciLCB3aWR0aD0yLCBoZWlnaHQ9MykKYGBgCgpgYGB7ciwgZmlnLndpZHRoPTIsIGZpZy5oZWlnaHQ9M30KZ2dwbG90KGNvaG9ydCwgYWVzKHg9c3Vic2V0LCB5PWFnZSwgY29sb3I9c3Vic2V0KSkgKyAKICAgIGdlb21faml0dGVyKHdpZHRoPTAuMikgKwogICAgc3RhdF9zdW1tYXJ5KGZ1biA9IG1lZGlhbiwgZ2VvbSA9ICJwb2ludCIsIHNpemUgPSAyLCAKICAgICAgICAgICAgICAgICBzdHJva2U9MSwgZmlsbD0id2hpdGUiLCBzaGFwZSA9IDIzKSArCiAgICBsYWJzKHg9IiIsIHk9ImFnZSBbeWVhcnNdIikgKwogICAgZ3VpZGVzKGNvbG9yPUYpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9MzAsIGhqdXN0PTEsIHZqdXN0PTEpKQp0LnRlc3QoYWdlIH4gc3Vic2V0LCBkYXRhPWNvaG9ydCkKZ2dzYXZlKCJmaWd1cmVzL2FnZS5zdmciLCB3aWR0aD0yLCBoZWlnaHQ9MykKYGBgCgpgYGB7ciwgZmlnLndpZHRoPTIsIGZpZy5oZWlnaHQ9M30KZ2dwbG90KGNvaG9ydCwgYWVzKHg9c3Vic2V0LCB5PXdlaWdodF9jaGFuZ2VfcmVsYXRpdmUsIGNvbG9yPXN1YnNldCkpICsgCiAgICBnZW9tX2ppdHRlcih3aWR0aD0wLjIpICsKICAgIHN0YXRfc3VtbWFyeShmdW4gPSBtZWRpYW4sIGdlb20gPSAicG9pbnQiLCBzaXplID0gMiwgCiAgICAgICAgICAgICAgICAgc3Ryb2tlPTEsIGZpbGw9IndoaXRlIiwgc2hhcGUgPSAyMykgKwogICAgbGFicyh4PSIiLCB5PSJyZWwuIM6Ud2VpZ2h0IFslL21vbnRoXSIpICsKICAgIGd1aWRlcyhjb2xvcj1GKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTMwLCBoanVzdD0xLCB2anVzdD0xKSkKdC50ZXN0KHdlaWdodF9jaGFuZ2VfcmVsYXRpdmUgfiBzdWJzZXQsIGRhdGE9Y29ob3J0KQpnZ3NhdmUoImZpZ3VyZXMvd2VpZ2h0X2NoYW5nZS5zdmciLCB3aWR0aD0yLCBoZWlnaHQ9MykKYGBgCgpgYGB7ciwgZmlnLndpZHRoPTIsIGZpZy5oZWlnaHQ9M30KZ2dwbG90KGNoZW0sIGFlcyh4PXN1YnNldCwgeT1BRElQT05FQ1RJTl9fU0VSVU0sIGNvbG9yPXN1YnNldCkpICsgCiAgICBnZW9tX2ppdHRlcih3aWR0aD0wLjIpICsKICAgIHN0YXRfc3VtbWFyeShmdW4gPSBtZWRpYW4sIGdlb20gPSAicG9pbnQiLCBzaXplID0gMiwgCiAgICAgICAgICAgICAgICAgc3Ryb2tlPTEsIGZpbGw9IndoaXRlIiwgc2hhcGUgPSAyMykgKwogICAgbGFicyh4PSIiLCB5PSJzZXJ1bSBhZGlwb25lY3RpbiBbbWcvTF0iKSArCiAgICBndWlkZXMoY29sb3I9RikgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT0zMCwgaGp1c3Q9MSwgdmp1c3Q9MSkpCnQudGVzdChBRElQT05FQ1RJTl9fU0VSVU0gfiBzdWJzZXQsIGRhdGE9Y2hlbSkKZ2dzYXZlKCJmaWd1cmVzL2FkaXBvbmVjdGluLnN2ZyIsIHdpZHRoPTIsIGhlaWdodD0zKQpgYGAKCmBgYHtyLCBmaWcud2lkdGg9MiwgZmlnLmhlaWdodD0zfQpnZ3Bsb3QoY2hlbSwgYWVzKHg9c3Vic2V0LCB5PUhETF9DSE9MX0RJUkVDVCwgY29sb3I9c3Vic2V0KSkgKyAKICAgIGdlb21faml0dGVyKHdpZHRoPTAuMikgKwogICAgc3RhdF9zdW1tYXJ5KGZ1biA9IG1lZGlhbiwgZ2VvbSA9ICJwb2ludCIsIHNpemUgPSAyLCAKICAgICAgICAgICAgICAgICBzdHJva2U9MSwgZmlsbD0id2hpdGUiLCBzaGFwZSA9IDIzKSArCiAgICBsYWJzKHg9IiIsIHk9InNlcnVtIEhETCBbbWcvTF0iKSArCiAgICBndWlkZXMoY29sb3I9RikgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT0zMCwgaGp1c3Q9MSwgdmp1c3Q9MSkpCnQudGVzdChIRExfQ0hPTF9ESVJFQ1QgfiBzdWJzZXQsIGRhdGE9Y2hlbSkKZ2dzYXZlKCJmaWd1cmVzL2hkbC5zdmciLCB3aWR0aD0yLCBoZWlnaHQ9MykKYGBgCgpgYGB7ciwgZmlnLndpZHRoPTIsIGZpZy5oZWlnaHQ9M30KZ2dwbG90KGNoZW0sIGFlcyh4PXN1YnNldCwgeT1MRExfQ0hPTF9DQUxDVUxBVElPTiwgY29sb3I9c3Vic2V0KSkgKyAKICAgIGdlb21faml0dGVyKHdpZHRoPTAuMikgKwogICAgc3RhdF9zdW1tYXJ5KGZ1biA9IG1lZGlhbiwgZ2VvbSA9ICJwb2ludCIsIHNpemUgPSAyLCAKICAgICAgICAgICAgICAgICBzdHJva2U9MSwgZmlsbD0id2hpdGUiLCBzaGFwZSA9IDIzKSArCiAgICBsYWJzKHg9IiIsIHk9InNlcnVtIExETCBbbWcvTF0iKSArCiAgICBndWlkZXMoY29sb3I9RikgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT0zMCwgaGp1c3Q9MSwgdmp1c3Q9MSkpCnQudGVzdChMRExfQ0hPTF9DQUxDVUxBVElPTiB+IHN1YnNldCwgZGF0YT1jaGVtKQpnZ3NhdmUoImZpZ3VyZXMvbGRsLnN2ZyIsIHdpZHRoPTIsIGhlaWdodD0zKQpgYGAKCmBgYHtyLCBmaWcud2lkdGg9MiwgZmlnLmhlaWdodD0zfQpnZ3Bsb3QoY2hlbSwgYWVzKHg9c3Vic2V0LCB5PUdMVUNPU0UsIGNvbG9yPXN1YnNldCkpICsgCiAgICBnZW9tX2ppdHRlcih3aWR0aD0wLjIpICsKICAgIHN0YXRfc3VtbWFyeShmdW4gPSBtZWRpYW4sIGdlb20gPSAicG9pbnQiLCBzaXplID0gMiwgCiAgICAgICAgICAgICAgICAgc3Ryb2tlPTEsIGZpbGw9IndoaXRlIiwgc2hhcGUgPSAyMykgKwogICAgbGFicyh4PSIiLCB5PSJzZXJ1bSBnbHVjb3NlIFttZy9MXSIpICsKICAgIGd1aWRlcyhjb2xvcj1GKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTMwLCBoanVzdD0xLCB2anVzdD0xKSkKdC50ZXN0KEdMVUNPU0UgfiBzdWJzZXQsIGRhdGE9Y2hlbSkKZ2dzYXZlKCJmaWd1cmVzL2dsdWNvc2Uuc3ZnIiwgd2lkdGg9MiwgaGVpZ2h0PTMpCmBgYAoKYGBge3IsIGZpZy53aWR0aD0yLCBmaWcuaGVpZ2h0PTN9CmdncGxvdChjaGVtLCBhZXMoeD1zdWJzZXQsIHk9SE9NQV9JUiwgY29sb3I9c3Vic2V0KSkgKyAKICAgIGdlb21faml0dGVyKHdpZHRoPTAuMikgKwogICAgc3RhdF9zdW1tYXJ5KGZ1biA9IG1lZGlhbiwgZ2VvbSA9ICJwb2ludCIsIHNpemUgPSAyLCAKICAgICAgICAgICAgICAgICBzdHJva2U9MSwgZmlsbD0id2hpdGUiLCBzaGFwZSA9IDIzKSArCiAgICBsYWJzKHg9IiIsIHk9IkhPTUEgSVIgW2luZGV4XSIpICsKICAgIGd1aWRlcyhjb2xvcj1GKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTMwLCBoanVzdD0xLCB2anVzdD0xKSkKdC50ZXN0KEhPTUFfSVIgfiBzdWJzZXQsIGRhdGE9Y2hlbSkKZ2dzYXZlKCJmaWd1cmVzL2hvbWFfaXIuc3ZnIiwgd2lkdGg9MiwgaGVpZ2h0PTMpCmBgYAoKYGBge3IsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTZ9CmxpYnJhcnkocGhlYXRtYXApCgptZWFzdXJlcyA8LSBjKCJibWkiLCAiYWdlIiwgIndlaWdodF9jaGFuZ2VfcmVsYXRpdmUiLCAKICAgICAgICAgICAgICAiSE9NQV9JUiIsICJHTFVDT1NFIiwgIkxETF9DSE9MX0NBTENVTEFUSU9OIiwgCiAgICAgICAgICAgICAgIkhETF9DSE9MX0RJUkVDVCIsICJBRElQT05FQ1RJTl9fU0VSVU0iKQoKbGVnZW5kcyA8LSBjKCJCTUkgW2tnL23Csl0iLCAiYWdlIFt5ZWFyc10iLCAicmVsLiDOlHdlaWdodCBbJS9tb250aF0iLCAiSE9NQSBJUiBbaW5kZXhdIiwgInNlcnVtIGdsdWNvc2UgW21nL0xdIiwgInNlcnVtIExETCBbbWcvTF0iLCAic2VydW0gSERMIFttZy9MXSIsICJzZXJ1bSBhZGlwb25lY3RpbiBbbWcvTF0iKQoKYWJ1bmRhbmNlcyA8LSBjaGVtWywgbWVhc3VyZXMsIHdpdGggPSBGQUxTRV0KbmFtZXMoYWJ1bmRhbmNlcykgPC0gbGVnZW5kcwp0ZXN0cyA8LSBjb3IubXRlc3QoYWJ1bmRhbmNlcywgY29uZi5sZXZlbD0wLjk1KQpjb3JycyA8LSBjb3IoYWJ1bmRhbmNlcykKc3ZnbGl0ZTo6c3ZnbGl0ZSgiZmlndXJlcy9iYXNlbGluZV9jb3JyZWxhdGlvbnMuc3ZnIiwgd2lkdGg9OCwgaGVpZ2h0PTYpCmNvcnJwbG90KGNvcnJzLCBwLm1hdCA9IHRlc3RzJHAsIG1ldGhvZCA9ICdjaXJjbGUnLCBkaWFnID0gRkFMU0UsCiAgICAgICAgIHNpZy5sZXZlbCA9IGMoMC4wMDEsIDAuMDEsIDAuMDUpLCBwY2guY2V4ID0gMC43NSwgCiAgICAgICAgIGluc2lnID0gJ2xhYmVsX3NpZycsIG9yZGVyID0gJ0FPRScsIHRsLmNvbCA9ICJibGFjayIsIGFkZGdyaWQuY29sPU5BLAogICAgICAgICBjbC5vZmZzZXQ9MSwgY2wuY2V4PTEuMikKZGV2Lm9mZigpCmNvcnJwbG90KGNvcnJzLCBwLm1hdCA9IHRlc3RzJHAsIG1ldGhvZCA9ICdjaXJjbGUnLCBkaWFnID0gRkFMU0UsCiAgICAgICAgIHNpZy5sZXZlbCA9IGMoMC4wMDEsIDAuMDEsIDAuMDUpLCBwY2guY2V4ID0gMC43NSwgCiAgICAgICAgIGluc2lnID0gJ2xhYmVsX3NpZycsIG9yZGVyID0gJ0FPRScsIHRsLmNvbCA9ICJibGFjayIsIGFkZGdyaWQuY29sPU5BLAogICAgICAgICBjbC5vZmZzZXQ9MSwgY2wuY2V4PTEuMikKYGBg