library(dplyr)
# Family 1
family1 <- data.frame(
no.up = c(4, 2), # Number of up values for family 1
no.down = c(1, 3) # Number of down values for family 1
)
family1$is.DE <- case_when(
family1$no.up >= 3 & family1$no.up - family1$no.down >= 2 ~ 1,
family1$no.down >= 3 & family1$no.down - family1$no.up >= 2 ~ -1,
TRUE ~ 0
)
family1$no.effective <- (family1$no.up - family1$no.down) * family1$is.DE
# Family 2
family2 <- data.frame(
no.up = c(3, 1), # Number of up values for family 2
no.down = c(2, 4) # Number of down values for family 2
)
family2$is.DE <- case_when(
family2$no.up >= 3 & family2$no.up - family2$no.down >= 2 ~ 1,
family2$no.down >= 3 & family2$no.down - family2$no.up >= 2 ~ -1,
TRUE ~ 0
)
family2$no.effective <- (family2$no.up - family2$no.down) * family2$is.DE
# Print the results
print(family1)
print(family2)
# Create a bar plot
barplot(de_counts, col = c("green", "blue", "white", "orange", "red"),
main = "DEG Categories",
xlab = "Categories",
ylab = "Count",
legend = TRUE,
names.arg = c("Up", "Up (not significant)", "Non-DEG", "Down (not significant)", "Down"),
ylim = c(0, max(de_counts) * 1.1)
)
##script to plot DEG across celltypes based on avg_log2FC
x %>%
ggplot(aes(x = name, y = cell.type)) +
geom_tile(aes(fill = avg_log2FC)) +
scale_fill_gradient2(low = "blue", high = "red") +
geom_text(aes(label = ifelse(name == cell.type, "x", "")), color = "white") +
theme_minimal() +
coord_flip() +
theme(
axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5),
panel.grid = element_blank()
) +
scale_color_manual(values = c("white", "black")) +
guides(color = "none")
### Remove rows with NaN values in avg_log2FC column
cleaned_data <- x[!is.nan(as.numeric(as.character(x$avg_log2FC))), ]
# Your gene list
gene_list <- c("gene1", "gene2", "gene3")
# Intersect the gene list with the 'name' column in 'x'
intersected_data <- x[x$name %in% gene_list, ]
# Use the intersected data for further processing or visualization
intersected_data %>%
ggplot(aes(x = name, y = cell.type)) +
geom_tile(aes(fill = avg_log2FC)) +
scale_fill_gradient2(low = "blue", high = "red") +
geom_text(aes(label = ifelse(name == cell.type, "x", "")), color = "white") +
theme_minimal() +
coord_flip() +
theme(
axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5),
panel.grid = element_blank()
) +
scale_color_manual(values = c("white", "black")) +
guides(color = "none") + ggtitle('dM_TD0')
##set diffexpressed column
# Set "NO" as the default value for diffexpressed column
resDF <- intersected_data
resDF$diffexpressed <- "NO"
resDF$diffexpressed[resDF$lfc > 0.25 & resDF$adj_pval < 0.01] <- "UP"
resDF$diffexpressed[resDF$lfc < -0.25 & resDF$adj_pval < 0.01] <- "DOWN"
table(resDF$diffexpressed)
x %>% filter(avg_adj_pval < 0.01) %>% arrange(avg_log2FC) %>% ggplot(aes(x= name, y= cell.type)) + geom_tile(aes(fill= avg_log2FC, color = cell.type), size=.5) + scale_fill_gradient2(low="blue", high = "red") + geom_text(aes(label=ifelse(name==cell.type, "x", "")), color= "white") + coord_flip() + theme_minimal() + theme(axis.text.x = element_text(angle = 90, hjust=1, vjust = 0.5)) + facet_wrap(~ sample.group)
>
library(ggplot2)
library(dplyr)
##dot plot codes
data %>%
filter(avg_adj_pval < 0.01) %>%
arrange(avg_log2FC) %>%
ggplot(aes(x = name, y = cell.type)) +
geom_point(aes(fill = avg_log2FC, color = sample.group), shape = 23, size = 4) +
scale_fill_gradient2(low = "blue", high = "red") +
geom_text(aes(label = ifelse(name == cell.type, "x", "")), color = "white") +
coord_flip() +
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
facet_wrap(~ sample.group) +
scale_color_manual(values = c("white", "black")) +
guides(fill = "none", color = "none")
## Heatmap plot code without scale bar
library(dplyr)
library(ggplot2)
#note x <- subset(intersected_data, grepl('_TD0', sample.group))
data %>%
filter(avg_adj_pval < 0.01) %>%
arrange(avg_log2FC) %>%
ggplot(aes(x = name, y = cell.type)) +
geom_tile(aes(fill = avg_log2FC)) +
geom_text(aes(label = ifelse(name == cell.type, "x", "")), color = "white") +
scale_fill_gradient2(low = "blue", high = "red") +
coord_flip() +
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
facet_wrap(~ sample.group) +
guides(fill = "none") +
labs(color = NULL) +
scale_color_manual(values = c("white", "black"))
library(dplyr)
library(ggplot2)
## Heatmap plot code with scale bar of avg_log2FC
data %>%
filter(avg_adj_pval < 0.01) %>%
arrange(avg_log2FC) %>%
ggplot(aes(x = name, y = cell.type)) +
geom_tile(aes(fill = avg_log2FC)) +
geom_text(aes(label = ifelse(name == cell.type, "x", "")), color = "white", size = 3) +
scale_fill_gradient2(low = "blue", high = "red") +
coord_flip() +
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5, size = 9),
axis.text.y = element_text(size = 7)) +
facet_wrap(~ sample.group) +
guides(fill = guide_colorbar(title = "avg_log2FC")) +
labs(color = NULL) +
scale_color_manual(values = c("white", "black"))
##Dot plot final
data %>%
filter(avg_adj_pval < 0.01) %>%
arrange(avg_log2FC) %>%
ggplot(aes(x = name, y = cell.type)) +
geom_point(aes(color = avg_log2FC), size = 3) +
geom_text(aes(label = ifelse(name == cell.type, "x", "")), color = "white", size = 3) +
scale_color_gradient2(low = "#000080", high = "#8B0000") + # Adjusted color palette to darker shades of blue and red
coord_flip() +
theme_minimal() +
theme(
axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5, size = 9),
axis.text.y = element_text(size = 7)
) +
facet_wrap(~ sample.group) +
labs(color = "avg_log2FC") +
guides(color = guide_colorbar(title = "avg_log2FC")) +
scale_fill_manual(values = "black") # Set text color to black
LS0tCnRpdGxlOiAic2NyaXB0IGZvciBERUcgaGVhdG1hcCBhY3Jvc3MgY2VsbHR5cGUiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQoKIyBGYW1pbHkgMQpmYW1pbHkxIDwtIGRhdGEuZnJhbWUoCiAgbm8udXAgPSBjKDQsIDIpLCAgICMgTnVtYmVyIG9mIHVwIHZhbHVlcyBmb3IgZmFtaWx5IDEKICBuby5kb3duID0gYygxLCAzKSAgIyBOdW1iZXIgb2YgZG93biB2YWx1ZXMgZm9yIGZhbWlseSAxCikKCmZhbWlseTEkaXMuREUgPC0gY2FzZV93aGVuKAogIGZhbWlseTEkbm8udXAgPj0gMyAmIGZhbWlseTEkbm8udXAgLSBmYW1pbHkxJG5vLmRvd24gPj0gMiB+IDEsCiAgZmFtaWx5MSRuby5kb3duID49IDMgJiBmYW1pbHkxJG5vLmRvd24gLSBmYW1pbHkxJG5vLnVwID49IDIgfiAtMSwKICBUUlVFIH4gMAopCgpmYW1pbHkxJG5vLmVmZmVjdGl2ZSA8LSAoZmFtaWx5MSRuby51cCAtIGZhbWlseTEkbm8uZG93bikgKiBmYW1pbHkxJGlzLkRFCgojIEZhbWlseSAyCmZhbWlseTIgPC0gZGF0YS5mcmFtZSgKICBuby51cCA9IGMoMywgMSksICAgIyBOdW1iZXIgb2YgdXAgdmFsdWVzIGZvciBmYW1pbHkgMgogIG5vLmRvd24gPSBjKDIsIDQpICAjIE51bWJlciBvZiBkb3duIHZhbHVlcyBmb3IgZmFtaWx5IDIKKQoKZmFtaWx5MiRpcy5ERSA8LSBjYXNlX3doZW4oCiAgZmFtaWx5MiRuby51cCA+PSAzICYgZmFtaWx5MiRuby51cCAtIGZhbWlseTIkbm8uZG93biA+PSAyIH4gMSwKICBmYW1pbHkyJG5vLmRvd24gPj0gMyAmIGZhbWlseTIkbm8uZG93biAtIGZhbWlseTIkbm8udXAgPj0gMiB+IC0xLAogIFRSVUUgfiAwCikKCmZhbWlseTIkbm8uZWZmZWN0aXZlIDwtIChmYW1pbHkyJG5vLnVwIC0gZmFtaWx5MiRuby5kb3duKSAqIGZhbWlseTIkaXMuREUKCiMgUHJpbnQgdGhlIHJlc3VsdHMKcHJpbnQoZmFtaWx5MSkKcHJpbnQoZmFtaWx5MikKCmBgYAoKYGBge3J9CiMgQ3JlYXRlIGEgYmFyIHBsb3QKYmFycGxvdChkZV9jb3VudHMsIGNvbCA9IGMoImdyZWVuIiwgImJsdWUiLCAid2hpdGUiLCAib3JhbmdlIiwgInJlZCIpLAogICAgICAgIG1haW4gPSAiREVHIENhdGVnb3JpZXMiLAogICAgICAgIHhsYWIgPSAiQ2F0ZWdvcmllcyIsCiAgICAgICAgeWxhYiA9ICJDb3VudCIsCiAgICAgICAgbGVnZW5kID0gVFJVRSwKICAgICAgICBuYW1lcy5hcmcgPSBjKCJVcCIsICJVcCAobm90IHNpZ25pZmljYW50KSIsICJOb24tREVHIiwgIkRvd24gKG5vdCBzaWduaWZpY2FudCkiLCAiRG93biIpLAogICAgICAgIHlsaW0gPSBjKDAsIG1heChkZV9jb3VudHMpICogMS4xKQopCmBgYAoKYGBge3J9CiMjc2NyaXB0IHRvIHBsb3QgREVHIGFjcm9zcyBjZWxsdHlwZXMgYmFzZWQgb24gYXZnX2xvZzJGQwp4ICU+JSAKICAgIGdncGxvdChhZXMoeCA9IG5hbWUsIHkgPSBjZWxsLnR5cGUpKSArCiAgICBnZW9tX3RpbGUoYWVzKGZpbGwgPSBhdmdfbG9nMkZDKSkgKwogICAgc2NhbGVfZmlsbF9ncmFkaWVudDIobG93ID0gImJsdWUiLCBoaWdoID0gInJlZCIpICsKICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBpZmVsc2UobmFtZSA9PSBjZWxsLnR5cGUsICJ4IiwgIiIpKSwgY29sb3IgPSAid2hpdGUiKSArCiAgICB0aGVtZV9taW5pbWFsKCkgKwogICAgY29vcmRfZmxpcCgpICsgIAogICAgdGhlbWUoCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxLCB2anVzdCA9IDAuNSksCiAgICAgICAgcGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKQogICAgKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygid2hpdGUiLCAiYmxhY2siKSkgKwogICAgZ3VpZGVzKGNvbG9yID0gIm5vbmUiKQojIyMgUmVtb3ZlIHJvd3Mgd2l0aCBOYU4gdmFsdWVzIGluIGF2Z19sb2cyRkMgY29sdW1uCmNsZWFuZWRfZGF0YSA8LSB4WyFpcy5uYW4oYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoeCRhdmdfbG9nMkZDKSkpLCBdCiMgWW91ciBnZW5lIGxpc3QKZ2VuZV9saXN0IDwtIGMoImdlbmUxIiwgImdlbmUyIiwgImdlbmUzIikKCiMgSW50ZXJzZWN0IHRoZSBnZW5lIGxpc3Qgd2l0aCB0aGUgJ25hbWUnIGNvbHVtbiBpbiAneCcKaW50ZXJzZWN0ZWRfZGF0YSA8LSB4W3gkbmFtZSAlaW4lIGdlbmVfbGlzdCwgXQoKIyBVc2UgdGhlIGludGVyc2VjdGVkIGRhdGEgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZyBvciB2aXN1YWxpemF0aW9uCmludGVyc2VjdGVkX2RhdGEgJT4lIAogICAgZ2dwbG90KGFlcyh4ID0gbmFtZSwgeSA9IGNlbGwudHlwZSkpICsKICAgIGdlb21fdGlsZShhZXMoZmlsbCA9IGF2Z19sb2cyRkMpKSArCiAgICBzY2FsZV9maWxsX2dyYWRpZW50Mihsb3cgPSAiYmx1ZSIsIGhpZ2ggPSAicmVkIikgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGlmZWxzZShuYW1lID09IGNlbGwudHlwZSwgIngiLCAiIikpLCBjb2xvciA9ICJ3aGl0ZSIpICsKICAgIHRoZW1lX21pbmltYWwoKSArCiAgICBjb29yZF9mbGlwKCkgKwogICAgdGhlbWUoCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxLCB2anVzdCA9IDAuNSksCiAgICAgICAgcGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKQogICAgKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygid2hpdGUiLCAiYmxhY2siKSkgKwogICAgZ3VpZGVzKGNvbG9yID0gIm5vbmUiKSArIGdndGl0bGUoJ2RNX1REMCcpCmBgYAoKYGBge3J9CiMjc2V0IGRpZmZleHByZXNzZWQgY29sdW1uCiMgU2V0ICJOTyIgYXMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGRpZmZleHByZXNzZWQgY29sdW1uCnJlc0RGIDwtIGludGVyc2VjdGVkX2RhdGEgCnJlc0RGJGRpZmZleHByZXNzZWQgPC0gIk5PIgpyZXNERiRkaWZmZXhwcmVzc2VkW3Jlc0RGJGxmYyA+IDAuMjUgJiByZXNERiRhZGpfcHZhbCA8IDAuMDFdIDwtICJVUCIKcmVzREYkZGlmZmV4cHJlc3NlZFtyZXNERiRsZmMgPCAtMC4yNSAmIHJlc0RGJGFkal9wdmFsIDwgMC4wMV0gPC0gIkRPV04iCnRhYmxlKHJlc0RGJGRpZmZleHByZXNzZWQpCgpgYGAKCmBgYHtyfQp4ICU+JSBmaWx0ZXIoYXZnX2Fkal9wdmFsIDwgMC4wMSkgJT4lIGFycmFuZ2UoYXZnX2xvZzJGQykgJT4lIGdncGxvdChhZXMoeD0gbmFtZSwgeT0gY2VsbC50eXBlKSkgKyBnZW9tX3RpbGUoYWVzKGZpbGw9IGF2Z19sb2cyRkMsIGNvbG9yID0gY2VsbC50eXBlKSwgc2l6ZT0uNSkgKyBzY2FsZV9maWxsX2dyYWRpZW50Mihsb3c9ImJsdWUiLCBoaWdoID0gInJlZCIpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbD1pZmVsc2UobmFtZT09Y2VsbC50eXBlLCAieCIsICIiKSksIGNvbG9yPSAid2hpdGUiKSArIGNvb3JkX2ZsaXAoKSArIHRoZW1lX21pbmltYWwoKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0PTEsIHZqdXN0ID0gMC41KSkgKyBmYWNldF93cmFwKH4gc2FtcGxlLmdyb3VwKSAKPiAKYGBgCgpgYGB7cn0KbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGRwbHlyKQojI2RvdCBwbG90IGNvZGVzCmRhdGEgJT4lCiAgICBmaWx0ZXIoYXZnX2Fkal9wdmFsIDwgMC4wMSkgJT4lCiAgICBhcnJhbmdlKGF2Z19sb2cyRkMpICU+JQogICAgZ2dwbG90KGFlcyh4ID0gbmFtZSwgeSA9IGNlbGwudHlwZSkpICsKICAgIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBhdmdfbG9nMkZDLCBjb2xvciA9IHNhbXBsZS5ncm91cCksIHNoYXBlID0gMjMsIHNpemUgPSA0KSArCiAgICBzY2FsZV9maWxsX2dyYWRpZW50Mihsb3cgPSAiYmx1ZSIsIGhpZ2ggPSAicmVkIikgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGlmZWxzZShuYW1lID09IGNlbGwudHlwZSwgIngiLCAiIikpLCBjb2xvciA9ICJ3aGl0ZSIpICsKICAgIGNvb3JkX2ZsaXAoKSArCiAgICB0aGVtZV9taW5pbWFsKCkgKwogICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxLCB2anVzdCA9IDAuNSkpICsKICAgIGZhY2V0X3dyYXAofiBzYW1wbGUuZ3JvdXApICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJ3aGl0ZSIsICJibGFjayIpKSArCiAgICBndWlkZXMoZmlsbCA9ICJub25lIiwgY29sb3IgPSAibm9uZSIpCgpgYGAKCmBgYHtyfQojIyBIZWF0bWFwIHBsb3QgY29kZSB3aXRob3V0IHNjYWxlIGJhciAKbGlicmFyeShkcGx5cikKbGlicmFyeShnZ3Bsb3QyKQojbm90ZSB4IDwtIHN1YnNldChpbnRlcnNlY3RlZF9kYXRhLCBncmVwbCgnX1REMCcsIHNhbXBsZS5ncm91cCkpCmRhdGEgJT4lCiAgICBmaWx0ZXIoYXZnX2Fkal9wdmFsIDwgMC4wMSkgJT4lCiAgICBhcnJhbmdlKGF2Z19sb2cyRkMpICU+JQogICAgZ2dwbG90KGFlcyh4ID0gbmFtZSwgeSA9IGNlbGwudHlwZSkpICsKICAgIGdlb21fdGlsZShhZXMoZmlsbCA9IGF2Z19sb2cyRkMpKSArCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gaWZlbHNlKG5hbWUgPT0gY2VsbC50eXBlLCAieCIsICIiKSksIGNvbG9yID0gIndoaXRlIikgKwogICAgc2NhbGVfZmlsbF9ncmFkaWVudDIobG93ID0gImJsdWUiLCBoaWdoID0gInJlZCIpICsKICAgIGNvb3JkX2ZsaXAoKSArCiAgICB0aGVtZV9taW5pbWFsKCkgKwogICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxLCB2anVzdCA9IDAuNSkpICsKICAgIGZhY2V0X3dyYXAofiBzYW1wbGUuZ3JvdXApICsKICAgIGd1aWRlcyhmaWxsID0gIm5vbmUiKSArCiAgICBsYWJzKGNvbG9yID0gTlVMTCkgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIndoaXRlIiwgImJsYWNrIikpCmBgYAoKYGBge3J9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZ2dwbG90MikKIyMgSGVhdG1hcCBwbG90IGNvZGUgd2l0aCBzY2FsZSBiYXIgb2YgYXZnX2xvZzJGQwpkYXRhICU+JQogICAgZmlsdGVyKGF2Z19hZGpfcHZhbCA8IDAuMDEpICU+JQogICAgYXJyYW5nZShhdmdfbG9nMkZDKSAlPiUKICAgIGdncGxvdChhZXMoeCA9IG5hbWUsIHkgPSBjZWxsLnR5cGUpKSArCiAgICBnZW9tX3RpbGUoYWVzKGZpbGwgPSBhdmdfbG9nMkZDKSkgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGlmZWxzZShuYW1lID09IGNlbGwudHlwZSwgIngiLCAiIikpLCBjb2xvciA9ICJ3aGl0ZSIsIHNpemUgPSAzKSArCiAgICBzY2FsZV9maWxsX2dyYWRpZW50Mihsb3cgPSAiYmx1ZSIsIGhpZ2ggPSAicmVkIikgKwogICAgY29vcmRfZmxpcCgpICsKICAgIHRoZW1lX21pbmltYWwoKSArCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMC41LCBzaXplID0gOSksCiAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpICsKICAgIGZhY2V0X3dyYXAofiBzYW1wbGUuZ3JvdXApICsKICAgIGd1aWRlcyhmaWxsID0gZ3VpZGVfY29sb3JiYXIodGl0bGUgPSAiYXZnX2xvZzJGQyIpKSArCiAgICBsYWJzKGNvbG9yID0gTlVMTCkgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIndoaXRlIiwgImJsYWNrIikpCmBgYAoKYGBge3J9CiMjRG90IHBsb3QgZmluYWwKZGF0YSAlPiUKICAgIGZpbHRlcihhdmdfYWRqX3B2YWwgPCAwLjAxKSAlPiUKICAgIGFycmFuZ2UoYXZnX2xvZzJGQykgJT4lCiAgICBnZ3Bsb3QoYWVzKHggPSBuYW1lLCB5ID0gY2VsbC50eXBlKSkgKwogICAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBhdmdfbG9nMkZDKSwgc2l6ZSA9IDMpICsKICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBpZmVsc2UobmFtZSA9PSBjZWxsLnR5cGUsICJ4IiwgIiIpKSwgY29sb3IgPSAid2hpdGUiLCBzaXplID0gMykgKwogICAgc2NhbGVfY29sb3JfZ3JhZGllbnQyKGxvdyA9ICIjMDAwMDgwIiwgaGlnaCA9ICIjOEIwMDAwIikgKyAgIyBBZGp1c3RlZCBjb2xvciBwYWxldHRlIHRvIGRhcmtlciBzaGFkZXMgb2YgYmx1ZSBhbmQgcmVkCiAgICBjb29yZF9mbGlwKCkgKwogICAgdGhlbWVfbWluaW1hbCgpICsKICAgIHRoZW1lKAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSwgdmp1c3QgPSAwLjUsIHNpemUgPSA5KSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gNykKICAgICkgKwogICAgZmFjZXRfd3JhcCh+IHNhbXBsZS5ncm91cCkgKwogICAgbGFicyhjb2xvciA9ICJhdmdfbG9nMkZDIikgKwogICAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfY29sb3JiYXIodGl0bGUgPSAiYXZnX2xvZzJGQyIpKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSAiYmxhY2siKSAgIyBTZXQgdGV4dCBjb2xvciB0byBibGFjawpgYGAKCgo=