Fact 1

Hầu hết các nhà máy điện hạt nhân nằm ở các quốc gia phát triển:

Fact 2

Hoa Kì là quốc gia có sản lượng điện từ năng lượng hạt nhân lớn nhất thế giới (hình 1):

Fact 3

Các quốc gia công nghiệp phát triển có tỉ trọng điện từ năng lượng hạt nhân là lớn nhất (hình 2):

Fact 4

Số lò phản ứng hạt nhân cho sản xuất điện nhiều nhất vẫn là ở các quốc gia công nghiệp phát triển (hình 3):

R Codes for Collecting Data and Visualization

R codes để thu thập dữ liệu và hình ảnh hóa:

rm(list = ls())
library(rvest)
library(tidyverse)
library(stringi)
library(see)
library(extrafont)

# Font selected: 
my_font <- "Roboto Condensed"

# Colors selected: 
my_colors <- c("#3E606F", "#8C3F4D")



link1 <- "https://en.wikipedia.org/wiki/Nuclear_power_by_country?fbclid=IwAR137hPOmbEvbVH1Acp1FlypUmaNdS2ht1jVi9NfuIxlcIg5X-Dd3T_vSVg"


link1 %>% 
  read_html() %>% 
  html_table(fill = TRUE, header = FALSE) %>% 
  .[[2]] -> df_cap


df_cap <- df_cap[-c(1:2), ]
names(df_cap) <- c("Country", "Reactors", "U_C", "Capacity", "Total_Cap", "Shares", "Notes")

df_cap <- df_cap %>% 
  filter(Capacity != "N/A", Country != "World total") %>% 
  select(-Notes, -U_C)

df_cap_clearned <- df_cap %>% 
  mutate_all(function(x) {as.numeric(x)}) %>% 
  mutate(Country = df_cap$Country) %>% 
  mutate(Country = case_when(str_detect(Country, "Korea") ~ "Korea", str_detect(Country, "Slove") ~ "Slovenia", TRUE ~ Country)) %>% 
  mutate(Share_num = str_replace_all(df_cap$Shares, "%", "") %>% as.numeric(), Share_cha = df_cap$Shares, Shares = NULL)





my_theme <- function(...) {
  theme_abyss() + 
    theme(plot.margin = unit(c(1, 2, 1, 1), "cm")) + 
    theme(plot.title = element_text(size = 22, family = my_font)) + 
    theme(plot.subtitle = element_text(size = 13, family = my_font)) + 
    theme(plot.caption  = element_text(size = 12, family = my_font)) + 
    theme(axis.text = element_text(family = my_font, size = 13)) + 
    theme(panel.grid.major.y = element_blank())
}




df_cap_clearned %>% 
  ggplot(aes(reorder(Country, Total_Cap), Total_Cap)) + 
  geom_col(fill = my_colors[2]) + 
  coord_flip() + 
  my_theme() + 
  scale_y_continuous(labels = c("0", "200,000", "400,000", "600,000", "800,000"), expand = c(0.01, 0)) + 
  labs(x = NULL, y = NULL, title = "Figure 1: Nuclear Electricity Power in GWh by Country, 2017",
       subtitle = "Nuclear power plants currently operate in 31 countries. The United States is the largest producer of\nnuclear power, while France has the largest share of electricity generated by nuclear power.",
       caption = "Data Source: International Atomic Energy Agency (IAEA)") 




df_cap_clearned %>% 
  ggplot(aes(reorder(Country, Share_num), Share_num)) + 
  geom_col(fill = my_colors[2]) + 
  coord_flip() + 
  my_theme() + 
  scale_y_continuous(breaks = seq(0, 80, 10), expand = c(0.01, 0), labels = paste0(seq(0, 80, 10), "%")) + 
  labs(x = NULL, y = NULL, 
       title = "Figure 2: Share of Electricity Production (% of Total)",
       subtitle = "Of the 31 countries in which nuclear power plants operate, only France, Slovakia, Ukraine, Belgium,\nand Hungary use them as the source for a majority of the country's electricity supply.\nOther countries have significant amounts of nuclear power generation capacity.",
       caption = "Data Source: International Atomic Energy Agency (IAEA)")




df_cap_clearned %>% 
  ggplot(aes(reorder(Country, Reactors), Reactors)) + 
  geom_col(fill = my_colors[2]) + 
  coord_flip() + 
  my_theme() + 
  scale_y_continuous(expand = c(0.01, 0), limits = c(0, 100)) + 
  labs(x = NULL, y = NULL, 
       title = "Figure 3: Number of Nuclear Reactors by Country, 2018",
       subtitle = "As of April 2018, there are 449 operable power reactors in the world, with a combined capacity of 394 GW.\nAdditionally, there are 58 reactors under construction and 154 reactors planned, with a combined capacity of\n63 GW and 157 GW, respectively.",
       caption = "Data Source: International Atomic Energy Agency (IAEA)")




link2 <- "https://en.wikipedia.org/wiki/List_of_nuclear_power_stations?fbclid=IwAR0CpWyQi51x2ULBn4FIcF9WDoY77cUkd_4T1pJcIGOjGD_C3dFmIAo1NPM"


link2 %>% 
  read_html() %>% 
  html_table(fill = TRUE, header = FALSE) %>% 
  .[[2]] %>% 
  slice(-1) %>% 
  mutate_all(function(x) {as.character(x)}) %>% 
  mutate_all(function(x) {stri_trans_general(x, "Latin-ASCII")}) -> df_loc


loc <- df_loc$X5

str_split(loc, ";", simplify = TRUE) %>% 
  as.data.frame() %>% 
  mutate_all(function(x) {as.character(x)}) %>% 
  mutate_all(function(x) {stri_trans_general(x, "Latin-ASCII")}) -> m



# Lấy ra dữ liệu Long: 

m %>% 
  mutate(long = str_sub(V1, start = str_count(V1) - 7, end = str_count(V1)) %>% as.numeric()) %>% 
  mutate(long = case_when(str_detect(V1, "-") ~ -1*long, TRUE ~ long)) -> m_trung_gian



str_sub(m$V2, start = 1, end = 12) %>% 
  str_replace_all("[a-z|A-Z]", "") %>% 
  str_replace_all("\\(", "") %>% 
  stri_trans_general("Latin-ASCII") %>% 
  str_squish() %>% 
  str_split("\\.", simplify = TRUE) %>% 
  as.data.frame() -> n


m_trung_gian %>% 
  mutate(lat1 = n$V1 %>% as.character() %>% as.numeric()) %>% 
  mutate(lat2 = n$V2 %>% as.character() %>% str_sub(1, 5) %>% as.numeric() / 100000) %>% 
  mutate(lat2 = case_when(lat1 < 0 ~ -1*lat2, TRUE ~ lat2)) %>% 
  mutate(lat = lat1 + lat2, lat1 = NULL, lat2 = NULL) %>% 
  mutate(Plant_Name = str_replace_all(V2, "[^a-z|A-Z| ]", "")) -> long_lat_full


long_lat_full %>% select(Plant_Name, long, lat) -> df_long_lat

world <- map_data("world")


ggplot() + 
  geom_map(data = world, map = world, aes(x = long, y = lat, map_id = region, group = group), fill = "white", colour = "#7f7f7f", size = 0.2) +
  geom_point(data = df_long_lat, aes(x = lat, y = long), color = "red", alpha = 0.6) + 
  theme_abyss() +
  theme(plot.margin = unit(c(1, 2, 1, 1), "cm")) +
  theme(plot.title = element_text(size = 22, family = my_font)) +
  theme(plot.subtitle = element_text(size = 13, family = my_font)) +
  theme(plot.caption  = element_text(size = 12, family = my_font)) +
  theme(axis.text = element_blank()) +
  theme(axis.line = element_blank()) + 
  theme(panel.grid.major = element_blank()) +
  labs(x = NULL, y = NULL, 
       title = "Figure 4: All Currently Operational Power Nuclear Stations",
       subtitle = "The following map lists all nuclear power stations that are larger than 1,000 MW in current net capacity.",
       caption = "Data Source: International Atomic Energy Agency (IAEA).")
LS0tDQp0aXRsZTogIldvcmxkIE51Y2xlYXIgUG93ZXIgU3RhdHVzIFJlcG9ydCAyMDE4IiANCnN1YnRpdGxlOiAiUiBmb3IgUGxlYXN1cmUiDQphdXRob3I6ICJOZ3V5ZW4gQ2hpIER1bmciDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBoaWdobGlnaHQ6IHplbmJ1cm4NCiAgICAjIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdGhlbWU6ICJmbGF0bHkiDQogICAgdG9jOiBUUlVFDQogICAgdG9jX2Zsb2F0OiBUUlVFDQotLS0NCg0KYGBge3Igc2V0dXAsaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGZpZy5yZXRpbmE9MikNCmBgYA0KDQojIEZhY3QgMQ0KDQpI4bqndSBo4bq/dCBjw6FjIG5ow6AgbcOheSDEkWnhu4duIGjhuqF0IG5ow6JuIG7hurFtIOG7nyBjw6FjIHF14buRYyBnaWEgcGjDoXQgdHJp4buDbjogDQoNCiFbXShDOlxcVXNlcnNcXFpib29rXERlc2t0b3BcXHBpY1xccDEuanBnKQ0KDQojIEZhY3QgMg0KDQpIb2EgS8OsIGzDoCBxdeG7kWMgZ2lhIGPDsyBz4bqjbiBsxrDhu6NuZyDEkWnhu4duIHThu6sgbsSDbmcgbMaw4bujbmcgaOG6oXQgbmjDom4gbOG7m24gbmjhuqV0IHRo4bq/IGdp4bubaSAoaMOsbmggMSk6IA0KDQoNCiFbXShDOlxcVXNlcnNcXFpib29rXERlc2t0b3BcXHBpY1xccDIuanBnKQ0KDQojIEZhY3QgMw0KDQpDw6FjIHF14buRYyBnaWEgY8O0bmcgbmdoaeG7h3AgcGjDoXQgdHJp4buDbiBjw7MgdOG7iSB0cuG7jW5nIMSRaeG7h24gdOG7qyBuxINuZyBsxrDhu6NuZyBo4bqhdCBuaMOibiBsw6AgbOG7m24gbmjhuqV0IChow6xuaCAyKToNCg0KDQohW10oQzpcXFVzZXJzXFxaYm9va1xEZXNrdG9wXFxwaWNcXHAzLmpwZykNCg0KDQojIEZhY3QgNA0KDQpT4buRIGzDsiBwaOG6o24g4bupbmcgaOG6oXQgbmjDom4gY2hvIHPhuqNuIHh14bqldCDEkWnhu4duIG5oaeG7gXUgbmjhuqV0IHbhuqtuIGzDoCDhu58gY8OhYyBxdeG7kWMgZ2lhIGPDtG5nIG5naGnhu4dwIHBow6F0IHRyaeG7g24gKGjDrG5oIDMpOg0KDQoNCiFbXShDOlxcVXNlcnNcXFpib29rXERlc2t0b3BcXHBpY1xccDQuanBnKQ0KDQojIFIgQ29kZXMgZm9yIENvbGxlY3RpbmcgRGF0YSBhbmQgVmlzdWFsaXphdGlvbg0KDQpSIGNvZGVzIMSR4buDIHRodSB0aOG6rXAgZOG7ryBsaeG7h3UgdsOgIGjDrG5oIOG6o25oIGjDs2E6IA0KDQpgYGB7ciwgZXZhbD1GQUxTRX0NCnJtKGxpc3QgPSBscygpKQ0KbGlicmFyeShydmVzdCkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShzdHJpbmdpKQ0KbGlicmFyeShzZWUpDQpsaWJyYXJ5KGV4dHJhZm9udCkNCg0KIyBGb250IHNlbGVjdGVkOiANCm15X2ZvbnQgPC0gIlJvYm90byBDb25kZW5zZWQiDQoNCiMgQ29sb3JzIHNlbGVjdGVkOiANCm15X2NvbG9ycyA8LSBjKCIjM0U2MDZGIiwgIiM4QzNGNEQiKQ0KDQoNCg0KbGluazEgPC0gImh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL051Y2xlYXJfcG93ZXJfYnlfY291bnRyeT9mYmNsaWQ9SXdBUjEzN2hQT21iRXZiVkgxQWNwMUZseXBVbWFOZFMyaHQxalZpOU5mdUl4bGNJZzVYLURkM1RfdlNWZyINCg0KDQpsaW5rMSAlPiUgDQogIHJlYWRfaHRtbCgpICU+JSANCiAgaHRtbF90YWJsZShmaWxsID0gVFJVRSwgaGVhZGVyID0gRkFMU0UpICU+JSANCiAgLltbMl1dIC0+IGRmX2NhcA0KDQoNCmRmX2NhcCA8LSBkZl9jYXBbLWMoMToyKSwgXQ0KbmFtZXMoZGZfY2FwKSA8LSBjKCJDb3VudHJ5IiwgIlJlYWN0b3JzIiwgIlVfQyIsICJDYXBhY2l0eSIsICJUb3RhbF9DYXAiLCAiU2hhcmVzIiwgIk5vdGVzIikNCg0KZGZfY2FwIDwtIGRmX2NhcCAlPiUgDQogIGZpbHRlcihDYXBhY2l0eSAhPSAiTi9BIiwgQ291bnRyeSAhPSAiV29ybGQgdG90YWwiKSAlPiUgDQogIHNlbGVjdCgtTm90ZXMsIC1VX0MpDQoNCmRmX2NhcF9jbGVhcm5lZCA8LSBkZl9jYXAgJT4lIA0KICBtdXRhdGVfYWxsKGZ1bmN0aW9uKHgpIHthcy5udW1lcmljKHgpfSkgJT4lIA0KICBtdXRhdGUoQ291bnRyeSA9IGRmX2NhcCRDb3VudHJ5KSAlPiUgDQogIG11dGF0ZShDb3VudHJ5ID0gY2FzZV93aGVuKHN0cl9kZXRlY3QoQ291bnRyeSwgIktvcmVhIikgfiAiS29yZWEiLCBzdHJfZGV0ZWN0KENvdW50cnksICJTbG92ZSIpIH4gIlNsb3ZlbmlhIiwgVFJVRSB+IENvdW50cnkpKSAlPiUgDQogIG11dGF0ZShTaGFyZV9udW0gPSBzdHJfcmVwbGFjZV9hbGwoZGZfY2FwJFNoYXJlcywgIiUiLCAiIikgJT4lIGFzLm51bWVyaWMoKSwgU2hhcmVfY2hhID0gZGZfY2FwJFNoYXJlcywgU2hhcmVzID0gTlVMTCkNCg0KDQoNCg0KDQpteV90aGVtZSA8LSBmdW5jdGlvbiguLi4pIHsNCiAgdGhlbWVfYWJ5c3MoKSArIA0KICAgIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKDEsIDIsIDEsIDEpLCAiY20iKSkgKyANCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMiwgZmFtaWx5ID0gbXlfZm9udCkpICsgDQogICAgdGhlbWUocGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMsIGZhbWlseSA9IG15X2ZvbnQpKSArIA0KICAgIHRoZW1lKHBsb3QuY2FwdGlvbiAgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYW1pbHkgPSBteV9mb250KSkgKyANCiAgICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gbXlfZm9udCwgc2l6ZSA9IDEzKSkgKyANCiAgICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpDQp9DQoNCg0KDQoNCmRmX2NhcF9jbGVhcm5lZCAlPiUgDQogIGdncGxvdChhZXMocmVvcmRlcihDb3VudHJ5LCBUb3RhbF9DYXApLCBUb3RhbF9DYXApKSArIA0KICBnZW9tX2NvbChmaWxsID0gbXlfY29sb3JzWzJdKSArIA0KICBjb29yZF9mbGlwKCkgKyANCiAgbXlfdGhlbWUoKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gYygiMCIsICIyMDAsMDAwIiwgIjQwMCwwMDAiLCAiNjAwLDAwMCIsICI4MDAsMDAwIiksIGV4cGFuZCA9IGMoMC4wMSwgMCkpICsgDQogIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMLCB0aXRsZSA9ICJGaWd1cmUgMTogTnVjbGVhciBFbGVjdHJpY2l0eSBQb3dlciBpbiBHV2ggYnkgQ291bnRyeSwgMjAxNyIsDQogICAgICAgc3VidGl0bGUgPSAiTnVjbGVhciBwb3dlciBwbGFudHMgY3VycmVudGx5IG9wZXJhdGUgaW4gMzEgY291bnRyaWVzLiBUaGUgVW5pdGVkIFN0YXRlcyBpcyB0aGUgbGFyZ2VzdCBwcm9kdWNlciBvZlxubnVjbGVhciBwb3dlciwgd2hpbGUgRnJhbmNlIGhhcyB0aGUgbGFyZ2VzdCBzaGFyZSBvZiBlbGVjdHJpY2l0eSBnZW5lcmF0ZWQgYnkgbnVjbGVhciBwb3dlci4iLA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBTb3VyY2U6IEludGVybmF0aW9uYWwgQXRvbWljIEVuZXJneSBBZ2VuY3kgKElBRUEpIikgDQoNCg0KDQoNCmRmX2NhcF9jbGVhcm5lZCAlPiUgDQogIGdncGxvdChhZXMocmVvcmRlcihDb3VudHJ5LCBTaGFyZV9udW0pLCBTaGFyZV9udW0pKSArIA0KICBnZW9tX2NvbChmaWxsID0gbXlfY29sb3JzWzJdKSArIA0KICBjb29yZF9mbGlwKCkgKyANCiAgbXlfdGhlbWUoKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDgwLCAxMCksIGV4cGFuZCA9IGMoMC4wMSwgMCksIGxhYmVscyA9IHBhc3RlMChzZXEoMCwgODAsIDEwKSwgIiUiKSkgKyANCiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwsIA0KICAgICAgIHRpdGxlID0gIkZpZ3VyZSAyOiBTaGFyZSBvZiBFbGVjdHJpY2l0eSBQcm9kdWN0aW9uICglIG9mIFRvdGFsKSIsDQogICAgICAgc3VidGl0bGUgPSAiT2YgdGhlIDMxIGNvdW50cmllcyBpbiB3aGljaCBudWNsZWFyIHBvd2VyIHBsYW50cyBvcGVyYXRlLCBvbmx5IEZyYW5jZSwgU2xvdmFraWEsIFVrcmFpbmUsIEJlbGdpdW0sXG5hbmQgSHVuZ2FyeSB1c2UgdGhlbSBhcyB0aGUgc291cmNlIGZvciBhIG1ham9yaXR5IG9mIHRoZSBjb3VudHJ5J3MgZWxlY3RyaWNpdHkgc3VwcGx5LlxuT3RoZXIgY291bnRyaWVzIGhhdmUgc2lnbmlmaWNhbnQgYW1vdW50cyBvZiBudWNsZWFyIHBvd2VyIGdlbmVyYXRpb24gY2FwYWNpdHkuIiwNCiAgICAgICBjYXB0aW9uID0gIkRhdGEgU291cmNlOiBJbnRlcm5hdGlvbmFsIEF0b21pYyBFbmVyZ3kgQWdlbmN5IChJQUVBKSIpDQoNCg0KDQoNCmRmX2NhcF9jbGVhcm5lZCAlPiUgDQogIGdncGxvdChhZXMocmVvcmRlcihDb3VudHJ5LCBSZWFjdG9ycyksIFJlYWN0b3JzKSkgKyANCiAgZ2VvbV9jb2woZmlsbCA9IG15X2NvbG9yc1syXSkgKyANCiAgY29vcmRfZmxpcCgpICsgDQogIG15X3RoZW1lKCkgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMC4wMSwgMCksIGxpbWl0cyA9IGMoMCwgMTAwKSkgKyANCiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwsIA0KICAgICAgIHRpdGxlID0gIkZpZ3VyZSAzOiBOdW1iZXIgb2YgTnVjbGVhciBSZWFjdG9ycyBieSBDb3VudHJ5LCAyMDE4IiwNCiAgICAgICBzdWJ0aXRsZSA9ICJBcyBvZiBBcHJpbCAyMDE4LCB0aGVyZSBhcmUgNDQ5IG9wZXJhYmxlIHBvd2VyIHJlYWN0b3JzIGluIHRoZSB3b3JsZCwgd2l0aCBhIGNvbWJpbmVkIGNhcGFjaXR5IG9mIDM5NCBHVy5cbkFkZGl0aW9uYWxseSwgdGhlcmUgYXJlIDU4IHJlYWN0b3JzIHVuZGVyIGNvbnN0cnVjdGlvbiBhbmQgMTU0IHJlYWN0b3JzIHBsYW5uZWQsIHdpdGggYSBjb21iaW5lZCBjYXBhY2l0eSBvZlxuNjMgR1cgYW5kIDE1NyBHVywgcmVzcGVjdGl2ZWx5LiIsDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIFNvdXJjZTogSW50ZXJuYXRpb25hbCBBdG9taWMgRW5lcmd5IEFnZW5jeSAoSUFFQSkiKQ0KDQoNCg0KDQpsaW5rMiA8LSAiaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGlzdF9vZl9udWNsZWFyX3Bvd2VyX3N0YXRpb25zP2ZiY2xpZD1Jd0FSMENwV3lRaTUxeDJVTEJuNEZJY0Y5V0RvWTc3Y1VrZF80VDFwSmNJR09qR0RfQzNkRm1JQW8xTlBNIg0KDQoNCmxpbmsyICU+JSANCiAgcmVhZF9odG1sKCkgJT4lIA0KICBodG1sX3RhYmxlKGZpbGwgPSBUUlVFLCBoZWFkZXIgPSBGQUxTRSkgJT4lIA0KICAuW1syXV0gJT4lIA0KICBzbGljZSgtMSkgJT4lIA0KICBtdXRhdGVfYWxsKGZ1bmN0aW9uKHgpIHthcy5jaGFyYWN0ZXIoeCl9KSAlPiUgDQogIG11dGF0ZV9hbGwoZnVuY3Rpb24oeCkge3N0cmlfdHJhbnNfZ2VuZXJhbCh4LCAiTGF0aW4tQVNDSUkiKX0pIC0+IGRmX2xvYw0KDQoNCmxvYyA8LSBkZl9sb2MkWDUNCg0Kc3RyX3NwbGl0KGxvYywgIjsiLCBzaW1wbGlmeSA9IFRSVUUpICU+JSANCiAgYXMuZGF0YS5mcmFtZSgpICU+JSANCiAgbXV0YXRlX2FsbChmdW5jdGlvbih4KSB7YXMuY2hhcmFjdGVyKHgpfSkgJT4lIA0KICBtdXRhdGVfYWxsKGZ1bmN0aW9uKHgpIHtzdHJpX3RyYW5zX2dlbmVyYWwoeCwgIkxhdGluLUFTQ0lJIil9KSAtPiBtDQoNCg0KDQojIEzhuqV5IHJhIGThu68gbGnhu4d1IExvbmc6IA0KDQptICU+JSANCiAgbXV0YXRlKGxvbmcgPSBzdHJfc3ViKFYxLCBzdGFydCA9IHN0cl9jb3VudChWMSkgLSA3LCBlbmQgPSBzdHJfY291bnQoVjEpKSAlPiUgYXMubnVtZXJpYygpKSAlPiUgDQogIG11dGF0ZShsb25nID0gY2FzZV93aGVuKHN0cl9kZXRlY3QoVjEsICItIikgfiAtMSpsb25nLCBUUlVFIH4gbG9uZykpIC0+IG1fdHJ1bmdfZ2lhbg0KDQoNCg0Kc3RyX3N1YihtJFYyLCBzdGFydCA9IDEsIGVuZCA9IDEyKSAlPiUgDQogIHN0cl9yZXBsYWNlX2FsbCgiW2EtenxBLVpdIiwgIiIpICU+JSANCiAgc3RyX3JlcGxhY2VfYWxsKCJcXCgiLCAiIikgJT4lIA0KICBzdHJpX3RyYW5zX2dlbmVyYWwoIkxhdGluLUFTQ0lJIikgJT4lIA0KICBzdHJfc3F1aXNoKCkgJT4lIA0KICBzdHJfc3BsaXQoIlxcLiIsIHNpbXBsaWZ5ID0gVFJVRSkgJT4lIA0KICBhcy5kYXRhLmZyYW1lKCkgLT4gbg0KDQoNCm1fdHJ1bmdfZ2lhbiAlPiUgDQogIG11dGF0ZShsYXQxID0gbiRWMSAlPiUgYXMuY2hhcmFjdGVyKCkgJT4lIGFzLm51bWVyaWMoKSkgJT4lIA0KICBtdXRhdGUobGF0MiA9IG4kVjIgJT4lIGFzLmNoYXJhY3RlcigpICU+JSBzdHJfc3ViKDEsIDUpICU+JSBhcy5udW1lcmljKCkgLyAxMDAwMDApICU+JSANCiAgbXV0YXRlKGxhdDIgPSBjYXNlX3doZW4obGF0MSA8IDAgfiAtMSpsYXQyLCBUUlVFIH4gbGF0MikpICU+JSANCiAgbXV0YXRlKGxhdCA9IGxhdDEgKyBsYXQyLCBsYXQxID0gTlVMTCwgbGF0MiA9IE5VTEwpICU+JSANCiAgbXV0YXRlKFBsYW50X05hbWUgPSBzdHJfcmVwbGFjZV9hbGwoVjIsICJbXmEtenxBLVp8IF0iLCAiIikpIC0+IGxvbmdfbGF0X2Z1bGwNCg0KDQpsb25nX2xhdF9mdWxsICU+JSBzZWxlY3QoUGxhbnRfTmFtZSwgbG9uZywgbGF0KSAtPiBkZl9sb25nX2xhdA0KDQp3b3JsZCA8LSBtYXBfZGF0YSgid29ybGQiKQ0KDQoNCmdncGxvdCgpICsgDQogIGdlb21fbWFwKGRhdGEgPSB3b3JsZCwgbWFwID0gd29ybGQsIGFlcyh4ID0gbG9uZywgeSA9IGxhdCwgbWFwX2lkID0gcmVnaW9uLCBncm91cCA9IGdyb3VwKSwgZmlsbCA9ICJ3aGl0ZSIsIGNvbG91ciA9ICIjN2Y3ZjdmIiwgc2l6ZSA9IDAuMikgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBkZl9sb25nX2xhdCwgYWVzKHggPSBsYXQsIHkgPSBsb25nKSwgY29sb3IgPSAicmVkIiwgYWxwaGEgPSAwLjYpICsgDQogIHRoZW1lX2FieXNzKCkgKw0KICB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYygxLCAyLCAxLCAxKSwgImNtIikpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjIsIGZhbWlseSA9IG15X2ZvbnQpKSArDQogIHRoZW1lKHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzLCBmYW1pbHkgPSBteV9mb250KSkgKw0KICB0aGVtZShwbG90LmNhcHRpb24gID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFtaWx5ID0gbXlfZm9udCkpICsNCiAgdGhlbWUoYXhpcy50ZXh0ID0gZWxlbWVudF9ibGFuaygpKSArDQogIHRoZW1lKGF4aXMubGluZSA9IGVsZW1lbnRfYmxhbmsoKSkgKyANCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCwgDQogICAgICAgdGl0bGUgPSAiRmlndXJlIDQ6IEFsbCBDdXJyZW50bHkgT3BlcmF0aW9uYWwgUG93ZXIgTnVjbGVhciBTdGF0aW9ucyIsDQogICAgICAgc3VidGl0bGUgPSAiVGhlIGZvbGxvd2luZyBtYXAgbGlzdHMgYWxsIG51Y2xlYXIgcG93ZXIgc3RhdGlvbnMgdGhhdCBhcmUgbGFyZ2VyIHRoYW4gMSwwMDAgTVcgaW4gY3VycmVudCBuZXQgY2FwYWNpdHkuIiwNCiAgICAgICBjYXB0aW9uID0gIkRhdGEgU291cmNlOiBJbnRlcm5hdGlvbmFsIEF0b21pYyBFbmVyZ3kgQWdlbmN5IChJQUVBKS4iKQ0KDQpgYGANCg0K