setwd("~/ELLIS Data")
# Load necessary libraries
library(dplyr)
library(ggplot2)

# Create a sample dataset
set.seed(123)  # For reproducibility
data <- data.frame(
  Category = sample(c("A", "B", "C"), size = 100, replace = TRUE),
  Value = rnorm(100, mean = 50, sd = 10))

# Summarize the data
summary_stats <- data %>%
  group_by(Category) %>%
  summarise(
    Count = n(),
    Mean = mean(Value),
    SD = sd(Value)  )

print("Summary statistics:")
print(summary_stats)

# Create a boxplot
ggplot(data, aes(x = Category, y = Value, fill = Category)) +
  geom_boxplot() +
  theme_minimal() +
  labs(title = "Boxplot of Value by Category",
       x = "Category",
       y = "Value")
# Simulate weekly learning hours
set.seed(123)
weeks <- 1:10
hours <- cumsum(rnorm(10, mean = 5, sd = 1))
learning_df <- data.frame(Week = weeks, Hours = hours)

ggplot(learning_df, aes(x = Week, y = Hours)) +
  geom_line(color = "blue", size = 1.2) +
  geom_point(size = 3) +
  labs(title = "My Weekly Learning Hours", y = "Total Hours", x = "Week") +
  theme_minimal()
Error in ggplot(learning_df, aes(x = Week, y = Hours)) : 
  could not find function "ggplot"
# Load necessary libraries
library(ggplot2)

# Example data frame
places <- data.frame(
  City = c("New York", "Los Angeles", "Chicago", "Houston", "Phoenix"),
  Population = c(8419600, 3980400, 2716000, 2328000, 1690000)
)

# Create bar chart
ggplot(places, aes(x = reorder(City, -Population), y = Population)) +
  geom_bar(stat = "identity", fill = "#2C3E50") +
  labs(
    title = "Population of Major U.S. Cities",
    x = "City",
    y = "Population"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5),
    axis.text.x = element_text(angle = 45, hjust = 1)
  )
# Load libraries
library(ggplot2)

# Create place value data
place_value <- data.frame(
  Place = c("Thousands", "Hundreds", "Tens", "Ones"),
  Digit = c(4, 3, 8, 2)
)

# Plot as a bar chart
ggplot(place_value, aes(x = Place, y = Digit, fill = Place)) +
  geom_bar(stat = "identity", width = 0.6) +
  labs(title = "Place Value Chart for 4,382", x = "Place", y = "Digit") +
  theme_minimal(base_size = 14) +
  scale_fill_brewer(palette = "Set2") +
  geom_text(aes(label = Digit), vjust = -0.5) +
  theme(legend.position = "none")
library(esquisse)
library(rio)
SMdata = import("SMdata.csv")


library(ggplot2)

ggplot(SMdata) +
 aes(x = Total, y = Positive) +
 geom_point(colour = "#112446") +
 theme_minimal()

library(esquisse)

#esquisse::esquisser(SMdata)
who_data <- data.frame(
  Indicator = c("Life Expectancy", "Vaccination Rate", "Health Spending"),
  Value = c("68.7 years", "85%", "USD 112 per capita")
)
library(ggplot2)
library(ggtext)
library(showtext)

font_add_google("Roboto", "roboto")
showtext_auto()

# Create label text with WHO data
label_text <- paste0(
  "<b style='font-size:18pt;'>Chuka University – WHO Data Report</b><br><br>",
  "<b>Life Expectancy:</b> 68.7 years<br>",
  "<b>Vaccination Rate:</b> 85%<br>",
  "<b>Health Spending:</b> USD 112 per capita<br><br>",
  "<i>Data Source: WHO Global Health Observatory</i>"
)

# Create the card
ggplot(data.frame(x = 1, y = 1), aes(x, y)) +
  geom_textbox(
    aes(label = label_text),
    width = unit(0.8, "npc"),
    box.color = "#2C6B2F",
    box.fill = "#DFF0D8",
    color = "black",
    size = 5,
    family = "roboto",
    halign = 0.5
  ) +
  theme_void() +
  xlim(0, 2) + ylim(0, 2)
ggsave("chuka_university_card.png", width = 8, height = 5)
library(ggplot2)
library(ggtext)
library(showtext)

# Load a nicer font
font_add_google("Roboto", "roboto")
showtext_auto()

# Create the content for the card
label_text <- paste0(
  "<b style='font-size:28pt;'>Chuka University – WHO Data Report</b><br><br>",
  "<b style='font-size:18pt;'>Life Expectancy:</b> 68.7 years<br>",
  "<b style='font-size:18pt;'>Vaccination Rate:</b> 85%<br>",
  "<b style='font-size:18pt;'>Health Spending:</b> USD 112 per capita<br><br>",
  "<i style='font-size:14pt;'>Data Source: WHO Global Health Observatory</i>"
)

# Plot the card
ggplot(data.frame(x = 1, y = 1), aes(x, y)) +
  geom_textbox(
    aes(label = label_text),
    width = unit(0.9, "npc"),  # Wider card
    box.color = "#2C6B2F",
    box.fill = "#DFF0D8",
    color = "blue",
    size = 7,                   # Text scale in ggtext
    family = "roboto",
    halign = 0.5
  ) +
  theme_void() +
  xlim(0, 2) + ylim(0, 2)

# To save the bigger card
ggsave("chuka_university_big_card.png", width = 12, height = 8, dpi = 300)
library(ggplot2)
library(ggtext)
library(showtext)

# Load Google Font
font_add_google("Roboto", "roboto")
showtext_auto()

# Longer and richer card content
label_text <- paste0(
  "<b style='font-size:26pt;'>Chuka University – WHO Health Profile</b><br><br>",
  "<b style='font-size:18pt;'>Life Expectancy:</b> 68.7 years<br>",
  "<b style='font-size:18pt;'>Vaccination Rate:</b> 85%<br>",
  "<b style='font-size:18pt;'>Health Spending:</b> USD 112 per capita<br>",
  "<b style='font-size:18pt;'>Infant Mortality:</b> 32 per 1,000 live births<br>",
  "<b style='font-size:18pt;'>Maternal Mortality:</b> 342 per 100,000 births<br>",
  "<b style='font-size:18pt;'>HIV Prevalence (15–49 yrs):</b> 4.9%<br>",
  "<b style='font-size:18pt;'>Access to Basic Sanitation:</b> 65%<br>",
  "<b style='font-size:18pt;'>Health Workforce Density:</b> 1.5 doctors per 1,000 people<br><br>",
  "<i style='font-size:14pt;'>Compiled by Chuka University – School of Public Health<br>",
  "Data Source: WHO Global Health Observatory | Date: May 2025</i>"
)

# Generate the card
ggplot(data.frame(x = 1, y = 1), aes(x, y)) +
  geom_textbox(
    aes(label = label_text),
    width = unit(0.95, "npc"),       # wider card
    box.color = "#2C6B2F",
    box.fill = "#EAF7E7",
    color = "black",
    size = 7,
    family = "roboto",
    halign = 0.5
  ) +
  theme_void() +
  xlim(0, 2) + ylim(0, 2)

# Save the enhanced card (optional)
ggsave("chuka_university_detailed_card.png", width = 13, height = 9, dpi = 300)
library(ggplot2)

# Sample data
df <- expand.grid(x = 1:5, y = 1:5)
df$value <- runif(nrow(df))

# Tile plot
ggplot(df, aes(x, y, fill = value)) +
  geom_tile() +
  scale_fill_gradient(low = "white", high = "blue") +
  theme_minimal()
ggplot(mtcars, aes(mpg, wt)) +
  geom_point() +
  facet_wrap(~cyl)
Error in ggplot(mtcars, aes(mpg, wt)) : could not find function "ggplot"
# Install packages if needed
install.packages(c("ggplot2", "ggfx", "grid", "ggforce"))
Error in install.packages : Updating loaded packages
library(ggplot2)
Warning: package ‘ggplot2’ was built under R version 4.5.1
library(ggfx)
Warning: package ‘ggfx’ was built under R version 4.5.1
library(grid)
library(ggforce)
Warning: package ‘ggforce’ was built under R version 4.5.1
# Create stylized background layers
ggplot() +
  with_blur(
    geom_rect(aes(xmin = -Inf, xmax = Inf, ymin = -Inf, ymax = Inf), fill = "#FDB813"), sigma = 20
  ) +
  annotate("rect", xmin = -10, xmax = 10, ymin = 0, ymax = 2, fill = "#228B22") +  # Meadow
  annotate("polygon", x = c(-3, 0, 3), y = c(2, 6, 2), fill = "#708090") +  # Mountains
  annotate("polygon", x = c(-2.5, 0, 2.5), y = c(2, 5, 2), fill = "#A9A9A9") +  # Snow Caps
  annotate("segment", x = -5, xend = 5, y = 2, yend = 2, size = 1.5, color = "#1E90FF") +  # River
  geom_point(aes(x = runif(100, -8, 8), y = runif(100, 0, 2)), 
             shape = 8, color = "white", size = 1.5, alpha = 0.5) +  # Wildflowers
  annotate("point", x = -7:7, y = rep(1.5, 15), size = runif(15, 3, 6), color = "orange") +  # Trees
  theme_void() +
  coord_fixed() +
  ggtitle("Stylized Mountain Sunset Scene")
Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
Please use `linewidth` instead.
install.packages(c("ggplot2", "ggfx", "grid", "ggforce"))
WARNING: Rtools is required to build R packages but is not currently installed. Please download and install the appropriate version of Rtools before proceeding:

https://cran.rstudio.com/bin/windows/Rtools/
Warning in install.packages :
  packages ‘ggplot2’, ‘ggfx’, ‘grid’, ‘ggforce’ are in use and will not be installed

library(magick)
Linking to ImageMagick 6.9.12.98
Enabled features: cairo, freetype, fftw, ghostscript, heic, lcms, pango, raw, rsvg, webp
Disabled features: fontconfig, x11
# Load the image
img <- image_read("714ba8c7-d40a-4969-901f-54032e5887c2.png")
Error: rsession-utf8.exe: UnableToOpenBlob `C:\Users\User\Documents\ELLIS Data\714ba8c7-d40a-4969-901f-54032e5887c2.png': No such file or directory @ error/blob.c/OpenBlob/2964
# Load required libraries
install.packages(c("grid", "gridExtra"))
library(grid)
library(gridExtra)

# Set up content
disease <- "Malaria"
region <- "Africa"
cases <- "247,000,000"
deaths <- "619,000"
r0 <- "10"
fatality <- "0.25%"
updated <- "2025-05-24"

# Title (with icon placeholder)
title_grob <- textGrob("💊 CDAM Disease Summary", gp = gpar(fontsize = 16, fontface = "bold", col = "darkgreen"))

# Key-value layout
info <- list(
  c("Disease:", disease),
  c("Region:", region),
  c("Total Cases:", cases),
  c("Total Deaths:", deaths),
  c("Ro Estimate:", r0),
  c("Case Fatality Rate:", fatality),
  c("Last Updated:", updated)
)

# Create grobs for each row
rows <- lapply(info, function(x) {
  gTree(children = gList(
    textGrob(x[1], x = unit(0.05, "npc"), gp = gpar(fontface = "bold", fontsize = 12), just = "left"),
    textGrob(x[2], x = unit(0.45, "npc"), gp = gpar(fontsize = 12), just = "left")
  ))
})

# Layout the card
grid.newpage()
pushViewport(viewport(layout = grid.layout(nrow = 9, heights = unit(rep(1, 9), "lines"))))

# Title
grid.draw(editGrob(title_grob, vp = viewport(layout.pos.row = 1)))

# Info rows
for (i in seq_along(rows)) {
  pushViewport(viewport(layout.pos.row = i + 2))
  grid.draw(rows[[i]])
  popViewport()
}

# Optional: add border/background
grid.rect(gp = gpar(col = "darkgreen", fill = "#fdf8e6", lwd = 2))

G

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IA0KICBodG1sX25vdGVib29rOiANCiAgICBoaWdobGlnaHQ6IGVzcHJlc3NvDQogICAgdGhlbWU6IHJlYWRhYmxlDQotLS0NCg0KIVtdKHBob3RvRWxsaXMuanBlZykNCg0KDQoNCmBgYHtyfQ0KIHNldHdkKCJ+L0VMTElTIERhdGEiKQ0KYGBgDQoNCg0KYGBge3J9DQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZ2dwbG90MikNCg0KIyBDcmVhdGUgYSBzYW1wbGUgZGF0YXNldA0Kc2V0LnNlZWQoMTIzKSAgIyBGb3IgcmVwcm9kdWNpYmlsaXR5DQpkYXRhIDwtIGRhdGEuZnJhbWUoDQogIENhdGVnb3J5ID0gc2FtcGxlKGMoIkEiLCAiQiIsICJDIiksIHNpemUgPSAxMDAsIHJlcGxhY2UgPSBUUlVFKSwNCiAgVmFsdWUgPSBybm9ybSgxMDAsIG1lYW4gPSA1MCwgc2QgPSAxMCkpDQoNCiMgU3VtbWFyaXplIHRoZSBkYXRhDQpzdW1tYXJ5X3N0YXRzIDwtIGRhdGEgJT4lDQogIGdyb3VwX2J5KENhdGVnb3J5KSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIENvdW50ID0gbigpLA0KICAgIE1lYW4gPSBtZWFuKFZhbHVlKSwNCiAgICBTRCA9IHNkKFZhbHVlKSAgKQ0KDQpwcmludCgiU3VtbWFyeSBzdGF0aXN0aWNzOiIpDQpwcmludChzdW1tYXJ5X3N0YXRzKQ0KDQojIENyZWF0ZSBhIGJveHBsb3QNCmdncGxvdChkYXRhLCBhZXMoeCA9IENhdGVnb3J5LCB5ID0gVmFsdWUsIGZpbGwgPSBDYXRlZ29yeSkpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKHRpdGxlID0gIkJveHBsb3Qgb2YgVmFsdWUgYnkgQ2F0ZWdvcnkiLA0KICAgICAgIHggPSAiQ2F0ZWdvcnkiLA0KICAgICAgIHkgPSAiVmFsdWUiKQ0KDQpgYGANCmBgYHtyfQ0KIyBTaW11bGF0ZSB3ZWVrbHkgbGVhcm5pbmcgaG91cnMNCnNldC5zZWVkKDEyMykNCndlZWtzIDwtIDE6MTANCmhvdXJzIDwtIGN1bXN1bShybm9ybSgxMCwgbWVhbiA9IDUsIHNkID0gMSkpDQpsZWFybmluZ19kZiA8LSBkYXRhLmZyYW1lKFdlZWsgPSB3ZWVrcywgSG91cnMgPSBob3VycykNCg0KZ2dwbG90KGxlYXJuaW5nX2RmLCBhZXMoeCA9IFdlZWssIHkgPSBIb3VycykpICsNCiAgZ2VvbV9saW5lKGNvbG9yID0gImJsdWUiLCBzaXplID0gMS4yKSArDQogIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsNCiAgbGFicyh0aXRsZSA9ICJNeSBXZWVrbHkgTGVhcm5pbmcgSG91cnMiLCB5ID0gIlRvdGFsIEhvdXJzIiwgeCA9ICJXZWVrIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KYGBgDQoNCg0KYGBge3J9DQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KbGlicmFyeShnZ3Bsb3QyKQ0KDQojIEV4YW1wbGUgZGF0YSBmcmFtZQ0KcGxhY2VzIDwtIGRhdGEuZnJhbWUoDQogIENpdHkgPSBjKCJOZXcgWW9yayIsICJMb3MgQW5nZWxlcyIsICJDaGljYWdvIiwgIkhvdXN0b24iLCAiUGhvZW5peCIpLA0KICBQb3B1bGF0aW9uID0gYyg4NDE5NjAwLCAzOTgwNDAwLCAyNzE2MDAwLCAyMzI4MDAwLCAxNjkwMDAwKQ0KKQ0KDQojIENyZWF0ZSBiYXIgY2hhcnQNCmdncGxvdChwbGFjZXMsIGFlcyh4ID0gcmVvcmRlcihDaXR5LCAtUG9wdWxhdGlvbiksIHkgPSBQb3B1bGF0aW9uKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICIjMkMzRTUwIikgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlBvcHVsYXRpb24gb2YgTWFqb3IgVS5TLiBDaXRpZXMiLA0KICAgIHggPSAiQ2l0eSIsDQogICAgeSA9ICJQb3B1bGF0aW9uIg0KICApICsNCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxNCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIGhqdXN0ID0gMC41KSwNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpDQogICkNCg0KDQpgYGANCg0KDQpgYGB7cn0NCiMgTG9hZCBsaWJyYXJpZXMNCmxpYnJhcnkoZ2dwbG90MikNCg0KIyBDcmVhdGUgcGxhY2UgdmFsdWUgZGF0YQ0KcGxhY2VfdmFsdWUgPC0gZGF0YS5mcmFtZSgNCiAgUGxhY2UgPSBjKCJUaG91c2FuZHMiLCAiSHVuZHJlZHMiLCAiVGVucyIsICJPbmVzIiksDQogIERpZ2l0ID0gYyg0LCAzLCA4LCAyKQ0KKQ0KDQojIFBsb3QgYXMgYSBiYXIgY2hhcnQNCmdncGxvdChwbGFjZV92YWx1ZSwgYWVzKHggPSBQbGFjZSwgeSA9IERpZ2l0LCBmaWxsID0gUGxhY2UpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCB3aWR0aCA9IDAuNikgKw0KICBsYWJzKHRpdGxlID0gIlBsYWNlIFZhbHVlIENoYXJ0IGZvciA0LDM4MiIsIHggPSAiUGxhY2UiLCB5ID0gIkRpZ2l0IikgKw0KICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDE0KSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MiIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IERpZ2l0KSwgdmp1c3QgPSAtMC41KSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCg0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShlc3F1aXNzZSkNCmxpYnJhcnkocmlvKQ0KU01kYXRhID0gaW1wb3J0KCJTTWRhdGEuY3N2IikNCmBgYA0KDQoNCg0KYGBge3J9DQoNCg0KbGlicmFyeShnZ3Bsb3QyKQ0KDQpnZ3Bsb3QoU01kYXRhKSArDQogYWVzKHggPSBUb3RhbCwgeSA9IFBvc2l0aXZlKSArDQogZ2VvbV9wb2ludChjb2xvdXIgPSAiIzExMjQ0NiIpICsNCiB0aGVtZV9taW5pbWFsKCkNCg0KbGlicmFyeShlc3F1aXNzZSkNCg0KI2VzcXVpc3NlOjplc3F1aXNzZXIoU01kYXRhKQ0KDQpgYGANCg0KYGBge3J9DQp3aG9fZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBJbmRpY2F0b3IgPSBjKCJMaWZlIEV4cGVjdGFuY3kiLCAiVmFjY2luYXRpb24gUmF0ZSIsICJIZWFsdGggU3BlbmRpbmciKSwNCiAgVmFsdWUgPSBjKCI2OC43IHllYXJzIiwgIjg1JSIsICJVU0QgMTEyIHBlciBjYXBpdGEiKQ0KKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShnZ3RleHQpDQpsaWJyYXJ5KHNob3d0ZXh0KQ0KDQpmb250X2FkZF9nb29nbGUoIlJvYm90byIsICJyb2JvdG8iKQ0Kc2hvd3RleHRfYXV0bygpDQoNCiMgQ3JlYXRlIGxhYmVsIHRleHQgd2l0aCBXSE8gZGF0YQ0KbGFiZWxfdGV4dCA8LSBwYXN0ZTAoDQogICI8YiBzdHlsZT0nZm9udC1zaXplOjE4cHQ7Jz5DaHVrYSBVbml2ZXJzaXR5IOKAkyBXSE8gRGF0YSBSZXBvcnQ8L2I+PGJyPjxicj4iLA0KICAiPGI+TGlmZSBFeHBlY3RhbmN5OjwvYj4gNjguNyB5ZWFyczxicj4iLA0KICAiPGI+VmFjY2luYXRpb24gUmF0ZTo8L2I+IDg1JTxicj4iLA0KICAiPGI+SGVhbHRoIFNwZW5kaW5nOjwvYj4gVVNEIDExMiBwZXIgY2FwaXRhPGJyPjxicj4iLA0KICAiPGk+RGF0YSBTb3VyY2U6IFdITyBHbG9iYWwgSGVhbHRoIE9ic2VydmF0b3J5PC9pPiINCikNCg0KIyBDcmVhdGUgdGhlIGNhcmQNCmdncGxvdChkYXRhLmZyYW1lKHggPSAxLCB5ID0gMSksIGFlcyh4LCB5KSkgKw0KICBnZW9tX3RleHRib3goDQogICAgYWVzKGxhYmVsID0gbGFiZWxfdGV4dCksDQogICAgd2lkdGggPSB1bml0KDAuOCwgIm5wYyIpLA0KICAgIGJveC5jb2xvciA9ICIjMkM2QjJGIiwNCiAgICBib3guZmlsbCA9ICIjREZGMEQ4IiwNCiAgICBjb2xvciA9ICJibGFjayIsDQogICAgc2l6ZSA9IDUsDQogICAgZmFtaWx5ID0gInJvYm90byIsDQogICAgaGFsaWduID0gMC41DQogICkgKw0KICB0aGVtZV92b2lkKCkgKw0KICB4bGltKDAsIDIpICsgeWxpbSgwLCAyKQ0KZ2dzYXZlKCJjaHVrYV91bml2ZXJzaXR5X2NhcmQucG5nIiwgd2lkdGggPSA4LCBoZWlnaHQgPSA1KQ0KDQpgYGANCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShnZ3RleHQpDQpsaWJyYXJ5KHNob3d0ZXh0KQ0KDQojIExvYWQgYSBuaWNlciBmb250DQpmb250X2FkZF9nb29nbGUoIlJvYm90byIsICJyb2JvdG8iKQ0Kc2hvd3RleHRfYXV0bygpDQoNCiMgQ3JlYXRlIHRoZSBjb250ZW50IGZvciB0aGUgY2FyZA0KbGFiZWxfdGV4dCA8LSBwYXN0ZTAoDQogICI8YiBzdHlsZT0nZm9udC1zaXplOjI4cHQ7Jz5DaHVrYSBVbml2ZXJzaXR5IOKAkyBXSE8gRGF0YSBSZXBvcnQ8L2I+PGJyPjxicj4iLA0KICAiPGIgc3R5bGU9J2ZvbnQtc2l6ZToxOHB0Oyc+TGlmZSBFeHBlY3RhbmN5OjwvYj4gNjguNyB5ZWFyczxicj4iLA0KICAiPGIgc3R5bGU9J2ZvbnQtc2l6ZToxOHB0Oyc+VmFjY2luYXRpb24gUmF0ZTo8L2I+IDg1JTxicj4iLA0KICAiPGIgc3R5bGU9J2ZvbnQtc2l6ZToxOHB0Oyc+SGVhbHRoIFNwZW5kaW5nOjwvYj4gVVNEIDExMiBwZXIgY2FwaXRhPGJyPjxicj4iLA0KICAiPGkgc3R5bGU9J2ZvbnQtc2l6ZToxNHB0Oyc+RGF0YSBTb3VyY2U6IFdITyBHbG9iYWwgSGVhbHRoIE9ic2VydmF0b3J5PC9pPiINCikNCg0KIyBQbG90IHRoZSBjYXJkDQpnZ3Bsb3QoZGF0YS5mcmFtZSh4ID0gMSwgeSA9IDEpLCBhZXMoeCwgeSkpICsNCiAgZ2VvbV90ZXh0Ym94KA0KICAgIGFlcyhsYWJlbCA9IGxhYmVsX3RleHQpLA0KICAgIHdpZHRoID0gdW5pdCgwLjksICJucGMiKSwgICMgV2lkZXIgY2FyZA0KICAgIGJveC5jb2xvciA9ICIjMkM2QjJGIiwNCiAgICBib3guZmlsbCA9ICIjREZGMEQ4IiwNCiAgICBjb2xvciA9ICJibHVlIiwNCiAgICBzaXplID0gNywgICAgICAgICAgICAgICAgICAgIyBUZXh0IHNjYWxlIGluIGdndGV4dA0KICAgIGZhbWlseSA9ICJyb2JvdG8iLA0KICAgIGhhbGlnbiA9IDAuNQ0KICApICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgeGxpbSgwLCAyKSArIHlsaW0oMCwgMikNCg0KIyBUbyBzYXZlIHRoZSBiaWdnZXIgY2FyZA0KZ2dzYXZlKCJjaHVrYV91bml2ZXJzaXR5X2JpZ19jYXJkLnBuZyIsIHdpZHRoID0gMTIsIGhlaWdodCA9IDgsIGRwaSA9IDMwMCkNCg0KYGBgDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZ2d0ZXh0KQ0KbGlicmFyeShzaG93dGV4dCkNCg0KIyBMb2FkIEdvb2dsZSBGb250DQpmb250X2FkZF9nb29nbGUoIlJvYm90byIsICJyb2JvdG8iKQ0Kc2hvd3RleHRfYXV0bygpDQoNCiMgTG9uZ2VyIGFuZCByaWNoZXIgY2FyZCBjb250ZW50DQpsYWJlbF90ZXh0IDwtIHBhc3RlMCgNCiAgIjxiIHN0eWxlPSdmb250LXNpemU6MjZwdDsnPkNodWthIFVuaXZlcnNpdHkg4oCTIFdITyBIZWFsdGggUHJvZmlsZTwvYj48YnI+PGJyPiIsDQogICI8YiBzdHlsZT0nZm9udC1zaXplOjE4cHQ7Jz5MaWZlIEV4cGVjdGFuY3k6PC9iPiA2OC43IHllYXJzPGJyPiIsDQogICI8YiBzdHlsZT0nZm9udC1zaXplOjE4cHQ7Jz5WYWNjaW5hdGlvbiBSYXRlOjwvYj4gODUlPGJyPiIsDQogICI8YiBzdHlsZT0nZm9udC1zaXplOjE4cHQ7Jz5IZWFsdGggU3BlbmRpbmc6PC9iPiBVU0QgMTEyIHBlciBjYXBpdGE8YnI+IiwNCiAgIjxiIHN0eWxlPSdmb250LXNpemU6MThwdDsnPkluZmFudCBNb3J0YWxpdHk6PC9iPiAzMiBwZXIgMSwwMDAgbGl2ZSBiaXJ0aHM8YnI+IiwNCiAgIjxiIHN0eWxlPSdmb250LXNpemU6MThwdDsnPk1hdGVybmFsIE1vcnRhbGl0eTo8L2I+IDM0MiBwZXIgMTAwLDAwMCBiaXJ0aHM8YnI+IiwNCiAgIjxiIHN0eWxlPSdmb250LXNpemU6MThwdDsnPkhJViBQcmV2YWxlbmNlICgxNeKAkzQ5IHlycyk6PC9iPiA0LjklPGJyPiIsDQogICI8YiBzdHlsZT0nZm9udC1zaXplOjE4cHQ7Jz5BY2Nlc3MgdG8gQmFzaWMgU2FuaXRhdGlvbjo8L2I+IDY1JTxicj4iLA0KICAiPGIgc3R5bGU9J2ZvbnQtc2l6ZToxOHB0Oyc+SGVhbHRoIFdvcmtmb3JjZSBEZW5zaXR5OjwvYj4gMS41IGRvY3RvcnMgcGVyIDEsMDAwIHBlb3BsZTxicj48YnI+IiwNCiAgIjxpIHN0eWxlPSdmb250LXNpemU6MTRwdDsnPkNvbXBpbGVkIGJ5IENodWthIFVuaXZlcnNpdHkg4oCTIFNjaG9vbCBvZiBQdWJsaWMgSGVhbHRoPGJyPiIsDQogICJEYXRhIFNvdXJjZTogV0hPIEdsb2JhbCBIZWFsdGggT2JzZXJ2YXRvcnkgfCBEYXRlOiBNYXkgMjAyNTwvaT4iDQopDQoNCiMgR2VuZXJhdGUgdGhlIGNhcmQNCmdncGxvdChkYXRhLmZyYW1lKHggPSAxLCB5ID0gMSksIGFlcyh4LCB5KSkgKw0KICBnZW9tX3RleHRib3goDQogICAgYWVzKGxhYmVsID0gbGFiZWxfdGV4dCksDQogICAgd2lkdGggPSB1bml0KDAuOTUsICJucGMiKSwgICAgICAgIyB3aWRlciBjYXJkDQogICAgYm94LmNvbG9yID0gIiMyQzZCMkYiLA0KICAgIGJveC5maWxsID0gIiNFQUY3RTciLA0KICAgIGNvbG9yID0gImJsYWNrIiwNCiAgICBzaXplID0gNywNCiAgICBmYW1pbHkgPSAicm9ib3RvIiwNCiAgICBoYWxpZ24gPSAwLjUNCiAgKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHhsaW0oMCwgMikgKyB5bGltKDAsIDIpDQoNCiMgU2F2ZSB0aGUgZW5oYW5jZWQgY2FyZCAob3B0aW9uYWwpDQpnZ3NhdmUoImNodWthX3VuaXZlcnNpdHlfZGV0YWlsZWRfY2FyZC5wbmciLCB3aWR0aCA9IDEzLCBoZWlnaHQgPSA5LCBkcGkgPSAzMDApDQoNCmBgYA0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQoNCiMgU2FtcGxlIGRhdGENCmRmIDwtIGV4cGFuZC5ncmlkKHggPSAxOjUsIHkgPSAxOjUpDQpkZiR2YWx1ZSA8LSBydW5pZihucm93KGRmKSkNCg0KIyBUaWxlIHBsb3QNCmdncGxvdChkZiwgYWVzKHgsIHksIGZpbGwgPSB2YWx1ZSkpICsNCiAgZ2VvbV90aWxlKCkgKw0KICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9ICJ3aGl0ZSIsIGhpZ2ggPSAiYmx1ZSIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCmBgYA0KYGBge3J9DQpnZ3Bsb3QobXRjYXJzLCBhZXMobXBnLCB3dCkpICsNCiAgZ2VvbV9wb2ludCgpICsNCiAgZmFjZXRfd3JhcCh+Y3lsKQ0KDQpgYGANCmBgYHtyfQ0KIyBJbnN0YWxsIHBhY2thZ2VzIGlmIG5lZWRlZA0KaW5zdGFsbC5wYWNrYWdlcyhjKCJnZ3Bsb3QyIiwgImdnZngiLCAiZ3JpZCIsICJnZ2ZvcmNlIikpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGdnZngpDQpsaWJyYXJ5KGdyaWQpDQpsaWJyYXJ5KGdnZm9yY2UpDQoNCiMgQ3JlYXRlIHN0eWxpemVkIGJhY2tncm91bmQgbGF5ZXJzDQpnZ3Bsb3QoKSArDQogIHdpdGhfYmx1cigNCiAgICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IEluZiksIGZpbGwgPSAiI0ZEQjgxMyIpLCBzaWdtYSA9IDIwDQogICkgKw0KICBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSAtMTAsIHhtYXggPSAxMCwgeW1pbiA9IDAsIHltYXggPSAyLCBmaWxsID0gIiMyMjhCMjIiKSArICAjIE1lYWRvdw0KICBhbm5vdGF0ZSgicG9seWdvbiIsIHggPSBjKC0zLCAwLCAzKSwgeSA9IGMoMiwgNiwgMiksIGZpbGwgPSAiIzcwODA5MCIpICsgICMgTW91bnRhaW5zDQogIGFubm90YXRlKCJwb2x5Z29uIiwgeCA9IGMoLTIuNSwgMCwgMi41KSwgeSA9IGMoMiwgNSwgMiksIGZpbGwgPSAiI0E5QTlBOSIpICsgICMgU25vdyBDYXBzDQogIGFubm90YXRlKCJzZWdtZW50IiwgeCA9IC01LCB4ZW5kID0gNSwgeSA9IDIsIHllbmQgPSAyLCBzaXplID0gMS41LCBjb2xvciA9ICIjMUU5MEZGIikgKyAgIyBSaXZlcg0KICBnZW9tX3BvaW50KGFlcyh4ID0gcnVuaWYoMTAwLCAtOCwgOCksIHkgPSBydW5pZigxMDAsIDAsIDIpKSwgDQogICAgICAgICAgICAgc2hhcGUgPSA4LCBjb2xvciA9ICJ3aGl0ZSIsIHNpemUgPSAxLjUsIGFscGhhID0gMC41KSArICAjIFdpbGRmbG93ZXJzDQogIGFubm90YXRlKCJwb2ludCIsIHggPSAtNzo3LCB5ID0gcmVwKDEuNSwgMTUpLCBzaXplID0gcnVuaWYoMTUsIDMsIDYpLCBjb2xvciA9ICJvcmFuZ2UiKSArICAjIFRyZWVzDQogIHRoZW1lX3ZvaWQoKSArDQogIGNvb3JkX2ZpeGVkKCkgKw0KICBnZ3RpdGxlKCJTdHlsaXplZCBNb3VudGFpbiBTdW5zZXQgU2NlbmUiKQ0KbGlicmFyeShtYWdpY2spDQoNCiMgTG9hZCB0aGUgaW1hZ2UNCmltZyA8LSBpbWFnZV9yZWFkKCI3MTRiYThjNy1kNDBhLTQ5NjktOTAxZi01NDAzMmU1ODg3YzIucG5nIikNCg0KIyBEaXNwbGF5IGl0DQpwbG90KGltZykNCg0KDQpgYGANCmBgYHtyfQ0KIyBMb2FkIHJlcXVpcmVkIGxpYnJhcmllcw0KaW5zdGFsbC5wYWNrYWdlcyhjKCJncmlkIiwgImdyaWRFeHRyYSIpKQ0KbGlicmFyeShncmlkKQ0KbGlicmFyeShncmlkRXh0cmEpDQoNCiMgU2V0IHVwIGNvbnRlbnQNCmRpc2Vhc2UgPC0gIk1hbGFyaWEiDQpyZWdpb24gPC0gIkFmcmljYSINCmNhc2VzIDwtICIyNDcsMDAwLDAwMCINCmRlYXRocyA8LSAiNjE5LDAwMCINCnIwIDwtICIxMCINCmZhdGFsaXR5IDwtICIwLjI1JSINCnVwZGF0ZWQgPC0gIjIwMjUtMDUtMjQiDQoNCiMgVGl0bGUgKHdpdGggaWNvbiBwbGFjZWhvbGRlcikNCnRpdGxlX2dyb2IgPC0gdGV4dEdyb2IoIvCfkoogQ0RBTSBEaXNlYXNlIFN1bW1hcnkiLCBncCA9IGdwYXIoZm9udHNpemUgPSAxNiwgZm9udGZhY2UgPSAiYm9sZCIsIGNvbCA9ICJkYXJrZ3JlZW4iKSkNCg0KIyBLZXktdmFsdWUgbGF5b3V0DQppbmZvIDwtIGxpc3QoDQogIGMoIkRpc2Vhc2U6IiwgZGlzZWFzZSksDQogIGMoIlJlZ2lvbjoiLCByZWdpb24pLA0KICBjKCJUb3RhbCBDYXNlczoiLCBjYXNlcyksDQogIGMoIlRvdGFsIERlYXRoczoiLCBkZWF0aHMpLA0KICBjKCJSbyBFc3RpbWF0ZToiLCByMCksDQogIGMoIkNhc2UgRmF0YWxpdHkgUmF0ZToiLCBmYXRhbGl0eSksDQogIGMoIkxhc3QgVXBkYXRlZDoiLCB1cGRhdGVkKQ0KKQ0KDQojIENyZWF0ZSBncm9icyBmb3IgZWFjaCByb3cNCnJvd3MgPC0gbGFwcGx5KGluZm8sIGZ1bmN0aW9uKHgpIHsNCiAgZ1RyZWUoY2hpbGRyZW4gPSBnTGlzdCgNCiAgICB0ZXh0R3JvYih4WzFdLCB4ID0gdW5pdCgwLjA1LCAibnBjIiksIGdwID0gZ3Bhcihmb250ZmFjZSA9ICJib2xkIiwgZm9udHNpemUgPSAxMiksIGp1c3QgPSAibGVmdCIpLA0KICAgIHRleHRHcm9iKHhbMl0sIHggPSB1bml0KDAuNDUsICJucGMiKSwgZ3AgPSBncGFyKGZvbnRzaXplID0gMTIpLCBqdXN0ID0gImxlZnQiKQ0KICApKQ0KfSkNCg0KIyBMYXlvdXQgdGhlIGNhcmQNCmdyaWQubmV3cGFnZSgpDQpwdXNoVmlld3BvcnQodmlld3BvcnQobGF5b3V0ID0gZ3JpZC5sYXlvdXQobnJvdyA9IDksIGhlaWdodHMgPSB1bml0KHJlcCgxLCA5KSwgImxpbmVzIikpKSkNCg0KIyBUaXRsZQ0KZ3JpZC5kcmF3KGVkaXRHcm9iKHRpdGxlX2dyb2IsIHZwID0gdmlld3BvcnQobGF5b3V0LnBvcy5yb3cgPSAxKSkpDQoNCiMgSW5mbyByb3dzDQpmb3IgKGkgaW4gc2VxX2Fsb25nKHJvd3MpKSB7DQogIHB1c2hWaWV3cG9ydCh2aWV3cG9ydChsYXlvdXQucG9zLnJvdyA9IGkgKyAyKSkNCiAgZ3JpZC5kcmF3KHJvd3NbW2ldXSkNCiAgcG9wVmlld3BvcnQoKQ0KfQ0KDQojIE9wdGlvbmFsOiBhZGQgYm9yZGVyL2JhY2tncm91bmQNCmdyaWQucmVjdChncCA9IGdwYXIoY29sID0gImRhcmtncmVlbiIsIGZpbGwgPSAiI2ZkZjhlNiIsIGx3ZCA9IDIpKQ0KDQpgYGANCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KRw0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg==