library(ggplot2)
cyl.am <- ggplot(mtcars, aes(x = factor(cyl), fill = factor(am)))
#position = "stack" is default
cyl.am + geom_bar()

cyl.am + 
  geom_bar(position = "fill") 

# Dodging - principles of similarity and proximity
cyl.am +
  geom_bar(position = "dodge")

val = c("#E41A1C", "#377EB8")
lab = c("Manual", "Automatic")
cyl.am +
  geom_bar(position = "dodge") +
  scale_x_discrete("Cylinders") + 
  scale_y_continuous("Numbers") +
  scale_fill_manual("Transmission", 
                    values = val,
                    labels = lab) 

mtcars$group <- 0
ggplot(mtcars, aes(x = mpg, y = group)) + geom_point()

# Change the y aesthetic limits
ggplot(mtcars, aes(x = mpg, y = group)) + geom_point() + geom_jitter() + scale_y_continuous(limits = c(-2,2))

# Basic scatter plot: wt on x-axis and mpg on y-axis; map cyl to col
ggplot(mtcars, aes(x = wt, y = mpg, col = cyl)) + geom_point(size = 4)

# Hollow circles - an improvement
ggplot(mtcars, aes(x = wt, y = mpg, col = cyl)) + geom_point(shape = 1, size = 4 )

# Add transparency - very nice
ggplot(mtcars, aes(x = wt, y = mpg, col = cyl)) + geom_point( size = 4, alpha = 0.6)

head(iris)
ggplot(iris, aes(x = Sepal.Width, fill = Species)) + geom_histogram(aes(binwidth = 0.2))
Ignoring unknown aesthetics: binwidth

  
ggplot(iris, aes(x = Sepal.Width, fill = Species)) + geom_histogram(aes(y = ..density..), binwidth = 0.1)

ggplot(iris, aes(x = Sepal.Width, fill = Species)) + geom_histogram(binwidth = 0.1, position = "fill") 

ggplot(iris, aes(x = Sepal.Width, fill = Species)) + geom_histogram(binwidth = 0.1, position = "dodge")

# Make a univariate histogram
ggplot(mtcars, aes(mpg)) +
  geom_histogram()

# Change the bin width to 1
ggplot(mtcars, aes(mpg)) +
  geom_histogram(binwidth = 1)

# Change the y aesthetic to density
ggplot(mtcars, aes(mpg)) +
  geom_histogram(aes(y=..density..), binwidth = 1)

# Custom color code
myBlue <- "#377EB8"
# Change the fill color to myBlue
ggplot(mtcars, aes(mpg)) +
  geom_histogram(aes(y = ..density..),
                 binwidth = 1, fill = myBlue)

# Draw a bar plot of cyl, filled according to am
ggplot(mtcars, aes(x= cyl, fill = factor(am))) + geom_bar()

# Change the position argument to stack
ggplot(mtcars, aes(x= cyl, fill = factor(am))) + geom_bar(position = "stack")

# Change the position argument to fill
ggplot(mtcars, aes(x= cyl, fill = factor(am))) + geom_bar(position = "fill")

# Change the position argument to dodge
ggplot(mtcars, aes(x= cyl, fill = factor(am))) + geom_bar(position = "dodge")

# Draw a bar plot of cyl, filled according to am
ggplot(mtcars, aes(x = cyl, fill = factor(am))) + geom_bar()

# Change the position argument to "dodge"
ggplot(mtcars, aes(x = cyl, fill = factor(am))) + geom_bar(position = "dodge")

# Define posn_d with position_dodge()
posn_d <- position_dodge(width = 0.2)
# Change the position argument to posn_d
ggplot(mtcars, aes(x = cyl, fill = factor(am))) + geom_bar(position = posn_d)

# Use posn_d as position and adjust alpha to 0.6
ggplot(mtcars, aes(x = cyl, fill = factor(am))) + geom_bar(position = posn_d, alpha = 0.6)

#API key
saved_cfg <- data.world::save_config("eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJwcm9kLXVzZXItY2xpZW50OmNocmlzaXllciIsImlzcyI6ImFnZW50OmNocmlzaXllcjo6Zjk1YzVlYTEtZTBiZS00NTU5LTg5MjItYWVkODg4Nzc3NjBkIiwiaWF0IjoxNDk1ODQ2MDQ1LCJyb2xlIjpbInVzZXJfYXBpX3dyaXRlIiwidXNlcl9hcGlfcmVhZCJdLCJnZW5lcmFsLXB1cnBvc2UiOnRydWV9.hMhCmAcXhD3DqJbp5L0JJF9xRfJsMZf-oPSkyxmC5D07tJhNAn-mzPPa4kSVKD65mUuktHwglgUGkJPZoNORVg")
library(data.world)
library(tidyverse)
# Datasets are identified by their URL
df <- read.csv("https://query.data.world/s/5s3rdju1vng0j5ij7675hcpto",header=T);
head(df)
# List tables
data_list <- data.world::query(
  qry_sql("SELECT * FROM Tables"),
  dataset = drugs_ds)
# data_list is a tbl_df with two columns: tableID and tableName.
data_list$tableName
 [1] "FDA_NDC_Product"             "Data"                        "Methods"                    
 [4] "Variables"                   "Pharma_Lobby"                "atc-codes"                  
 [7] "companies_drugs_keyed"       "drug_list"                   "drug_uses"                  
[10] "drugdata_clean"              "drugnames_withclasses"       "lobbying_keyed"             
[13] "manufacturers_drugs_cleaned" "meps_full_2014"              "spending-2011"              
[16] "spending-2012"               "spending-2013"               "spending-2014"              
[19] "spending-2015"               "spending_all_top100"         "usp_drug_classification"    
data_list$tableId
 [1] "FDA_NDC_Product.csv/FDA_NDC_Product"                                      
 [2] "Medicare_Drug_Spending_PartD_All_Drugs_YTD_2015_12_06_2016.xlsx/Data"     
 [3] "Medicare_Drug_Spending_PartD_All_Drugs_YTD_2015_12_06_2016.xlsx/Methods"  
 [4] "Medicare_Drug_Spending_PartD_All_Drugs_YTD_2015_12_06_2016.xlsx/Variables"
 [5] "Pharma_Lobby.csv/Pharma_Lobby"                                            
 [6] "atc-codes.csv/atc-codes"                                                  
 [7] "companies_drugs_keyed.csv/companies_drugs_keyed"                          
 [8] "drug_list.json/drug_list"                                                 
 [9] "drug_uses.csv/drug_uses"                                                  
[10] "drugdata_clean.csv/drugdata_clean"                                        
[11] "drugnames_withclasses.csv/drugnames_withclasses"                          
[12] "lobbying_keyed.csv/lobbying_keyed"                                        
[13] "manufacturers_drugs_cleaned.csv/manufacturers_drugs_cleaned"              
[14] "meps_full_2014.zip/meps_full_2014/meps_full_2014.csv/meps_full_2014"      
[15] "spending-2011.csv/spending-2011"                                          
[16] "spending-2012.csv/spending-2012"                                          
[17] "spending-2013.csv/spending-2013"                                          
[18] "spending-2014.csv/spending-2014"                                          
[19] "spending-2015.csv/spending-2015"                                          
[20] "spending_all_top100.csv/spending_all_top100"                              
[21] "usp_drug_classification.csv/usp_drug_classification"                      
get_year <- function(yr) {
  data.world::query(qry_sql(paste0("SELECT * FROM `spending-", yr, "`")),
                    dataset = drugs_ds)[,-1] %>%
    ## First column is a row number; don"t need that
    mutate(year = yr)
}
# Read in and combine all years' data
spend <- map_df(2011:2015, get_year)
head(spend)
# Add a row for each generic with overall summaries of each variable ----------
spend_overall <- spend %>%
  group_by(drugname_generic, year) %>%
  summarise(
    claim_count = sum(claim_count, na.rm = TRUE),
    total_spending = sum(total_spending, na.rm = TRUE),
    user_count = sum(user_count, na.rm = TRUE),
    unit_count = sum(unit_count, na.rm = TRUE),
    user_count_non_lowincome = sum(user_count_non_lowincome, na.rm = TRUE),
    user_count_lowincome = sum(user_count_lowincome, na.rm = TRUE)
  ) %>%
  mutate(
    total_spending_per_user = total_spending / user_count,
    drugname_brand = "ALL BRAND NAMES",
    ## Add NA values for variables that are brand-specific
    unit_cost_wavg = NA,
    out_of_pocket_avg_lowincome = NA,
    out_of_pocket_avg_non_lowincome = NA
  ) %>%
  ungroup()
# Select top 100 generics by number of users across all five years ------------
by_user_top100 <- group_by(spend_overall, drugname_generic) %>%
  summarise(total_users = sum(user_count, na.rm = TRUE)) %>%
  arrange(desc(total_users)) %>%
  slice(1:100)
# For top 100 generics, add ALL BRAND NAMES rows to by-brand-name rows --------
spend_all_top100 <- bind_rows(spend, spend_overall) %>%
  filter(drugname_generic %in% by_user_top100$drugname_generic) %>%
  arrange(drugname_generic)
head(spend_all_top100)
library(dplyr)
df <- read.csv("https://query.data.world/s/7ezifc8eqig9vdazaoa1noecv",header=T)
df$arrival_date <- as.Date(df$arrival_date, format = "%m/%d/%Y")
df$departure_date <- as.Date(df$departure_date, format = "%m/%d/%Y")
df$ArrivalYear <- format(as.Date(df$arrival_date, format="%Y/%m/%d"),"%Y")
df$ArrivalYear <- as.integer(df$ArrivalYear)
head(df)
dim(df)
[1] 48237     8
whowentwhere <- df  %>% filter(grepl("Russia", country)) %>% select(name, country, ArrivalYear) %>% arrange(desc(name)) 
head(whowentwhere)
dim(whowentwhere)
[1] 673   3
whowentwhere1 <-  whowentwhere %>% filter(ArrivalYear >= 2012) %>% 
 group_by(name,country, ArrivalYear) %>% 
 summarise(n= n()) %>% arrange(desc(name))
whowentwhere1
ggplot(whowentwhere1, aes(ArrivalYear, fill = factor(name))) + geom_bar()

whowentwhere2 <-  whowentwhere %>% 
 group_by(name) %>% 
 summarise(n= n()) %>% arrange(desc(n))
whowentwhere2
PanAm <- df %>%  filter(grepl("Weldon",name)) %>% filter(grepl("Russia", country)) %>% arrange(desc(departure_date))
dim(PanAm)
[1] 22  8
PanAm
PanAm$ArrivalYear <- format(as.Date(PanAm$arrival_date, format="%Y/%m/%d"),"%Y")
head(PanAm)
xyz <- ggplot(PanAm, aes(x = ArrivalYear, fill = factor(country))) + geom_bar() + theme(legend.position='null') + ggtitle("Weldon in Russia")
xyz

abc <- df %>%  filter(grepl("Weldon",name))  %>% arrange(desc(departure_date))
ggplot(abc, aes(x = ArrivalYear, fill = factor(country))) + geom_bar() + ggtitle("Weldon")

Legend Issues

Weldon

yz <- ggplot(PanAm, aes(x = ArrivalYear, fill = factor(country))) + geom_bar() + theme(legend.position='bottom') +
  theme(legend.title=element_blank())
yz 

library(gridExtra)
g_legend<-function(a.gplot){
    tmp <- ggplot_gtable(ggplot_build(a.gplot))
    leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box")
    legend <- tmp$grobs[[leg]]
    legend
}
legend <- g_legend(yz)
grid.arrange(legend, yz+ theme(legend.position = 'none'), 
    ncol=2, nrow=1, widths=c(1/6,5/6))

Nunes

PanAm <- df %>%  filter(grepl("nunes",name)) %>% filter(grepl("Russia", country))%>% arrange(desc(departure_date))
PanAm$ArrivalYear <- format(as.Date(PanAm$arrival_date, format="%Y/%m/%d"),"%Y")
PanAm

Dana Rohrabacher

PanAm <- whowentwhere %>%  filter(grepl("Rohr",name)) %>% filter(grepl("Russia", country))%>% arrange(desc(ArrivalYear))
PanAm
#PanAm$ArrivalYear <- format(as.Date(PanAm$arrival_date, format="%Y/%m/%d"),"%Y")
xyz <- ggplot(PanAm, aes(x = ArrivalYear, fill = factor(country))) + geom_bar() 
# + theme(legend.position='null')
xyz

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQogDQogDQogDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpYnJhcnkoZ2dwbG90MikNCmBgYA0KDQpgYGB7cn0NCmN5bC5hbSA8LSBnZ3Bsb3QobXRjYXJzLCBhZXMoeCA9IGZhY3RvcihjeWwpLCBmaWxsID0gZmFjdG9yKGFtKSkpDQpgYGANCg0KYGBge3J9DQojcG9zaXRpb24gPSAic3RhY2siIGlzIGRlZmF1bHQNCmN5bC5hbSArIGdlb21fYmFyKCkNCmBgYA0KDQoNCmBgYHtyfQ0KY3lsLmFtICsgDQogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSANCmBgYA0KDQpgYGB7cn0NCiMgRG9kZ2luZyAtIHByaW5jaXBsZXMgb2Ygc2ltaWxhcml0eSBhbmQgcHJveGltaXR5DQpjeWwuYW0gKw0KICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIpDQpgYGANCg0KYGBge3J9DQp2YWwgPSBjKCIjRTQxQTFDIiwgIiMzNzdFQjgiKQ0KbGFiID0gYygiTWFudWFsIiwgIkF1dG9tYXRpYyIpDQpjeWwuYW0gKw0KICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZSgiQ3lsaW5kZXJzIikgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKCJOdW1iZXJzIikgKw0KICBzY2FsZV9maWxsX21hbnVhbCgiVHJhbnNtaXNzaW9uIiwgDQogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IHZhbCwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gbGFiKSANCmBgYA0KDQpgYGB7cn0NCm10Y2FycyRncm91cCA8LSAwDQpnZ3Bsb3QobXRjYXJzLCBhZXMoeCA9IG1wZywgeSA9IGdyb3VwKSkgKyBnZW9tX3BvaW50KCkNCg0KIyBDaGFuZ2UgdGhlIHkgYWVzdGhldGljIGxpbWl0cw0KZ2dwbG90KG10Y2FycywgYWVzKHggPSBtcGcsIHkgPSBncm91cCkpICsgZ2VvbV9wb2ludCgpICsgZ2VvbV9qaXR0ZXIoKSArIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC0yLDIpKQ0KYGBgDQoNCmBgYHtyfQ0KIyBCYXNpYyBzY2F0dGVyIHBsb3Q6IHd0IG9uIHgtYXhpcyBhbmQgbXBnIG9uIHktYXhpczsgbWFwIGN5bCB0byBjb2wNCmdncGxvdChtdGNhcnMsIGFlcyh4ID0gd3QsIHkgPSBtcGcsIGNvbCA9IGN5bCkpICsgZ2VvbV9wb2ludChzaXplID0gNCkNCg0KDQoNCiMgSG9sbG93IGNpcmNsZXMgLSBhbiBpbXByb3ZlbWVudA0KZ2dwbG90KG10Y2FycywgYWVzKHggPSB3dCwgeSA9IG1wZywgY29sID0gY3lsKSkgKyBnZW9tX3BvaW50KHNoYXBlID0gMSwgc2l6ZSA9IDQgKQ0KDQoNCiMgQWRkIHRyYW5zcGFyZW5jeSAtIHZlcnkgbmljZQ0KZ2dwbG90KG10Y2FycywgYWVzKHggPSB3dCwgeSA9IG1wZywgY29sID0gY3lsKSkgKyBnZW9tX3BvaW50KCBzaXplID0gNCwgYWxwaGEgPSAwLjYpDQoNCmBgYA0KDQpgYGB7cn0NCmhlYWQoaXJpcykNCmdncGxvdChpcmlzLCBhZXMoeCA9IFNlcGFsLldpZHRoLCBmaWxsID0gU3BlY2llcykpICsgZ2VvbV9oaXN0b2dyYW0oYWVzKGJpbndpZHRoID0gMC4yKSkNCiAgDQoNCmdncGxvdChpcmlzLCBhZXMoeCA9IFNlcGFsLldpZHRoLCBmaWxsID0gU3BlY2llcykpICsgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGJpbndpZHRoID0gMC4xKQ0KDQpnZ3Bsb3QoaXJpcywgYWVzKHggPSBTZXBhbC5XaWR0aCwgZmlsbCA9IFNwZWNpZXMpKSArIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMC4xLCBwb3NpdGlvbiA9ICJmaWxsIikgDQoNCmdncGxvdChpcmlzLCBhZXMoeCA9IFNlcGFsLldpZHRoLCBmaWxsID0gU3BlY2llcykpICsgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjEsIHBvc2l0aW9uID0gImRvZGdlIikNCmBgYA0KDQoNCmBgYHtyfQ0KIyBNYWtlIGEgdW5pdmFyaWF0ZSBoaXN0b2dyYW0NCmdncGxvdChtdGNhcnMsIGFlcyhtcGcpKSArDQogIGdlb21faGlzdG9ncmFtKCkNCg0KIyBDaGFuZ2UgdGhlIGJpbiB3aWR0aCB0byAxDQpnZ3Bsb3QobXRjYXJzLCBhZXMobXBnKSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEpDQoNCiMgQ2hhbmdlIHRoZSB5IGFlc3RoZXRpYyB0byBkZW5zaXR5DQpnZ3Bsb3QobXRjYXJzLCBhZXMobXBnKSkgKw0KICBnZW9tX2hpc3RvZ3JhbShhZXMoeT0uLmRlbnNpdHkuLiksIGJpbndpZHRoID0gMSkNCg0KIyBDdXN0b20gY29sb3IgY29kZQ0KbXlCbHVlIDwtICIjMzc3RUI4Ig0KDQojIENoYW5nZSB0aGUgZmlsbCBjb2xvciB0byBteUJsdWUNCmdncGxvdChtdGNhcnMsIGFlcyhtcGcpKSArDQogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLA0KICAgICAgICAgICAgICAgICBiaW53aWR0aCA9IDEsIGZpbGwgPSBteUJsdWUpDQoNCmBgYA0KDQpgYGB7cn0NCiMgRHJhdyBhIGJhciBwbG90IG9mIGN5bCwgZmlsbGVkIGFjY29yZGluZyB0byBhbQ0KZ2dwbG90KG10Y2FycywgYWVzKHg9IGN5bCwgZmlsbCA9IGZhY3RvcihhbSkpKSArIGdlb21fYmFyKCkNCg0KDQojIENoYW5nZSB0aGUgcG9zaXRpb24gYXJndW1lbnQgdG8gc3RhY2sNCmdncGxvdChtdGNhcnMsIGFlcyh4PSBjeWwsIGZpbGwgPSBmYWN0b3IoYW0pKSkgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJzdGFjayIpDQoNCg0KIyBDaGFuZ2UgdGhlIHBvc2l0aW9uIGFyZ3VtZW50IHRvIGZpbGwNCmdncGxvdChtdGNhcnMsIGFlcyh4PSBjeWwsIGZpbGwgPSBmYWN0b3IoYW0pKSkgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikNCg0KDQoNCiMgQ2hhbmdlIHRoZSBwb3NpdGlvbiBhcmd1bWVudCB0byBkb2RnZQ0KZ2dwbG90KG10Y2FycywgYWVzKHg9IGN5bCwgZmlsbCA9IGZhY3RvcihhbSkpKSArIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIikNCg0KYGBgDQoNCmBgYHtyfQ0KIyBEcmF3IGEgYmFyIHBsb3Qgb2YgY3lsLCBmaWxsZWQgYWNjb3JkaW5nIHRvIGFtDQpnZ3Bsb3QobXRjYXJzLCBhZXMoeCA9IGN5bCwgZmlsbCA9IGZhY3RvcihhbSkpKSArIGdlb21fYmFyKCkNCg0KDQojIENoYW5nZSB0aGUgcG9zaXRpb24gYXJndW1lbnQgdG8gImRvZGdlIg0KZ2dwbG90KG10Y2FycywgYWVzKHggPSBjeWwsIGZpbGwgPSBmYWN0b3IoYW0pKSkgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIpDQoNCg0KIyBEZWZpbmUgcG9zbl9kIHdpdGggcG9zaXRpb25fZG9kZ2UoKQ0KcG9zbl9kIDwtIHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC4yKQ0KDQoNCiMgQ2hhbmdlIHRoZSBwb3NpdGlvbiBhcmd1bWVudCB0byBwb3NuX2QNCmdncGxvdChtdGNhcnMsIGFlcyh4ID0gY3lsLCBmaWxsID0gZmFjdG9yKGFtKSkpICsgZ2VvbV9iYXIocG9zaXRpb24gPSBwb3NuX2QpDQoNCg0KIyBVc2UgcG9zbl9kIGFzIHBvc2l0aW9uIGFuZCBhZGp1c3QgYWxwaGEgdG8gMC42DQpnZ3Bsb3QobXRjYXJzLCBhZXMoeCA9IGN5bCwgZmlsbCA9IGZhY3RvcihhbSkpKSArIGdlb21fYmFyKHBvc2l0aW9uID0gcG9zbl9kLCBhbHBoYSA9IDAuNikNCmBgYA0KYGBge3J9DQojQVBJIGtleQ0Kc2F2ZWRfY2ZnIDwtIGRhdGEud29ybGQ6OnNhdmVfY29uZmlnKCJleUpoYkdjaU9pSklVelV4TWlKOS5leUp6ZFdJaU9pSndjbTlrTFhWelpYSXRZMnhwWlc1ME9tTm9jbWx6YVhsbGNpSXNJbWx6Y3lJNkltRm5aVzUwT21Ob2NtbHphWGxsY2pvNlpqazFZelZsWVRFdFpUQmlaUzAwTlRVNUxUZzVNakl0WVdWa09EZzROemMzTmpCa0lpd2lhV0YwSWpveE5EazFPRFEyTURRMUxDSnliMnhsSWpwYkluVnpaWEpmWVhCcFgzZHlhWFJsSWl3aWRYTmxjbDloY0dsZmNtVmhaQ0pkTENKblpXNWxjbUZzTFhCMWNuQnZjMlVpT25SeWRXVjkuaE1oQ21BY1hoRDNEcUpicDVMMEpKRjl4UmZKc01aZi1vUFNreXhtQzVEMDd0SmhOQW4tbXpQUGE0a1NWS0Q2NW1VdWt0SHdnbGdVR2tKUFpvTk9SVmciKQ0KbGlicmFyeShkYXRhLndvcmxkKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQojIERhdGFzZXRzIGFyZSBpZGVudGlmaWVkIGJ5IHRoZWlyIFVSTA0KZGYgPC0gcmVhZC5jc3YoImh0dHBzOi8vcXVlcnkuZGF0YS53b3JsZC9zLzVzM3JkanUxdm5nMGo1aWo3Njc1aGNwdG8iLGhlYWRlcj1UKTsNCmhlYWQoZGYpDQoNCiMgTGlzdCB0YWJsZXMNCmRhdGFfbGlzdCA8LSBkYXRhLndvcmxkOjpxdWVyeSgNCiAgcXJ5X3NxbCgiU0VMRUNUICogRlJPTSBUYWJsZXMiKSwNCiAgZGF0YXNldCA9IGRydWdzX2RzKQ0KDQojIGRhdGFfbGlzdCBpcyBhIHRibF9kZiB3aXRoIHR3byBjb2x1bW5zOiB0YWJsZUlEIGFuZCB0YWJsZU5hbWUuDQpkYXRhX2xpc3QkdGFibGVOYW1lDQpkYXRhX2xpc3QkdGFibGVJZA0KZ2V0X3llYXIgPC0gZnVuY3Rpb24oeXIpIHsNCiAgZGF0YS53b3JsZDo6cXVlcnkocXJ5X3NxbChwYXN0ZTAoIlNFTEVDVCAqIEZST00gYHNwZW5kaW5nLSIsIHlyLCAiYCIpKSwNCiAgICAgICAgICAgICAgICAgICAgZGF0YXNldCA9IGRydWdzX2RzKVssLTFdICU+JQ0KICAgICMjIEZpcnN0IGNvbHVtbiBpcyBhIHJvdyBudW1iZXI7IGRvbiJ0IG5lZWQgdGhhdA0KICAgIG11dGF0ZSh5ZWFyID0geXIpDQp9DQoNCiMgUmVhZCBpbiBhbmQgY29tYmluZSBhbGwgeWVhcnMnIGRhdGENCnNwZW5kIDwtIG1hcF9kZigyMDExOjIwMTUsIGdldF95ZWFyKQ0KaGVhZChzcGVuZCkNCiMgQWRkIGEgcm93IGZvciBlYWNoIGdlbmVyaWMgd2l0aCBvdmVyYWxsIHN1bW1hcmllcyBvZiBlYWNoIHZhcmlhYmxlIC0tLS0tLS0tLS0NCnNwZW5kX292ZXJhbGwgPC0gc3BlbmQgJT4lDQogIGdyb3VwX2J5KGRydWduYW1lX2dlbmVyaWMsIHllYXIpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgY2xhaW1fY291bnQgPSBzdW0oY2xhaW1fY291bnQsIG5hLnJtID0gVFJVRSksDQogICAgdG90YWxfc3BlbmRpbmcgPSBzdW0odG90YWxfc3BlbmRpbmcsIG5hLnJtID0gVFJVRSksDQogICAgdXNlcl9jb3VudCA9IHN1bSh1c2VyX2NvdW50LCBuYS5ybSA9IFRSVUUpLA0KICAgIHVuaXRfY291bnQgPSBzdW0odW5pdF9jb3VudCwgbmEucm0gPSBUUlVFKSwNCiAgICB1c2VyX2NvdW50X25vbl9sb3dpbmNvbWUgPSBzdW0odXNlcl9jb3VudF9ub25fbG93aW5jb21lLCBuYS5ybSA9IFRSVUUpLA0KICAgIHVzZXJfY291bnRfbG93aW5jb21lID0gc3VtKHVzZXJfY291bnRfbG93aW5jb21lLCBuYS5ybSA9IFRSVUUpDQogICkgJT4lDQogIG11dGF0ZSgNCiAgICB0b3RhbF9zcGVuZGluZ19wZXJfdXNlciA9IHRvdGFsX3NwZW5kaW5nIC8gdXNlcl9jb3VudCwNCiAgICBkcnVnbmFtZV9icmFuZCA9ICJBTEwgQlJBTkQgTkFNRVMiLA0KICAgICMjIEFkZCBOQSB2YWx1ZXMgZm9yIHZhcmlhYmxlcyB0aGF0IGFyZSBicmFuZC1zcGVjaWZpYw0KICAgIHVuaXRfY29zdF93YXZnID0gTkEsDQogICAgb3V0X29mX3BvY2tldF9hdmdfbG93aW5jb21lID0gTkEsDQogICAgb3V0X29mX3BvY2tldF9hdmdfbm9uX2xvd2luY29tZSA9IE5BDQogICkgJT4lDQogIHVuZ3JvdXAoKQ0KDQojIFNlbGVjdCB0b3AgMTAwIGdlbmVyaWNzIGJ5IG51bWJlciBvZiB1c2VycyBhY3Jvc3MgYWxsIGZpdmUgeWVhcnMgLS0tLS0tLS0tLS0tDQpieV91c2VyX3RvcDEwMCA8LSBncm91cF9ieShzcGVuZF9vdmVyYWxsLCBkcnVnbmFtZV9nZW5lcmljKSAlPiUNCiAgc3VtbWFyaXNlKHRvdGFsX3VzZXJzID0gc3VtKHVzZXJfY291bnQsIG5hLnJtID0gVFJVRSkpICU+JQ0KICBhcnJhbmdlKGRlc2ModG90YWxfdXNlcnMpKSAlPiUNCiAgc2xpY2UoMToxMDApDQoNCiMgRm9yIHRvcCAxMDAgZ2VuZXJpY3MsIGFkZCBBTEwgQlJBTkQgTkFNRVMgcm93cyB0byBieS1icmFuZC1uYW1lIHJvd3MgLS0tLS0tLS0NCnNwZW5kX2FsbF90b3AxMDAgPC0gYmluZF9yb3dzKHNwZW5kLCBzcGVuZF9vdmVyYWxsKSAlPiUNCiAgZmlsdGVyKGRydWduYW1lX2dlbmVyaWMgJWluJSBieV91c2VyX3RvcDEwMCRkcnVnbmFtZV9nZW5lcmljKSAlPiUNCiAgYXJyYW5nZShkcnVnbmFtZV9nZW5lcmljKQ0KaGVhZChzcGVuZF9hbGxfdG9wMTAwKQ0KDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KGRwbHlyKQ0KZGYgPC0gcmVhZC5jc3YoImh0dHBzOi8vcXVlcnkuZGF0YS53b3JsZC9zLzdlemlmYzhlcWlnOXZkYXphb2Exbm9lY3YiLGhlYWRlcj1UKQ0KZGYkYXJyaXZhbF9kYXRlIDwtIGFzLkRhdGUoZGYkYXJyaXZhbF9kYXRlLCBmb3JtYXQgPSAiJW0vJWQvJVkiKQ0KZGYkZGVwYXJ0dXJlX2RhdGUgPC0gYXMuRGF0ZShkZiRkZXBhcnR1cmVfZGF0ZSwgZm9ybWF0ID0gIiVtLyVkLyVZIikNCmRmJEFycml2YWxZZWFyIDwtIGZvcm1hdChhcy5EYXRlKGRmJGFycml2YWxfZGF0ZSwgZm9ybWF0PSIlWS8lbS8lZCIpLCIlWSIpDQpkZiRBcnJpdmFsWWVhciA8LSBhcy5pbnRlZ2VyKGRmJEFycml2YWxZZWFyKQ0KaGVhZChkZikNCmRpbShkZikNCmBgYA0KDQoNCmBgYHtyfQ0Kd2hvd2VudHdoZXJlIDwtIGRmICAlPiUgZmlsdGVyKGdyZXBsKCJSdXNzaWEiLCBjb3VudHJ5KSkgJT4lIHNlbGVjdChuYW1lLCBjb3VudHJ5LCBBcnJpdmFsWWVhcikgJT4lIGFycmFuZ2UoZGVzYyhuYW1lKSkgDQpoZWFkKHdob3dlbnR3aGVyZSkNCmRpbSh3aG93ZW50d2hlcmUpDQpgYGANCg0KYGBge3J9DQp3aG93ZW50d2hlcmUxIDwtICB3aG93ZW50d2hlcmUgJT4lIGZpbHRlcihBcnJpdmFsWWVhciA+PSAyMDEyKSAlPiUgDQogZ3JvdXBfYnkobmFtZSxjb3VudHJ5LCBBcnJpdmFsWWVhcikgJT4lIA0KIHN1bW1hcmlzZShuPSBuKCkpICU+JSBhcnJhbmdlKGRlc2MobmFtZSkpDQoNCndob3dlbnR3aGVyZTENCmBgYA0KDQoNCmBgYHtyfQ0KZ2dwbG90KHdob3dlbnR3aGVyZTEsIGFlcyhBcnJpdmFsWWVhciwgZmlsbCA9IGZhY3RvcihuYW1lKSkpICsgZ2VvbV9iYXIoKQ0KYGBgDQoNCmBgYHtyfQ0Kd2hvd2VudHdoZXJlMiA8LSAgd2hvd2VudHdoZXJlICU+JSANCiBncm91cF9ieShuYW1lKSAlPiUgDQogc3VtbWFyaXNlKG49IG4oKSkgJT4lIGFycmFuZ2UoZGVzYyhuKSkNCg0Kd2hvd2VudHdoZXJlMg0KYGBgDQoNCmBgYHtyfQ0KUGFuQW0gPC0gZGYgJT4lICBmaWx0ZXIoZ3JlcGwoIldlbGRvbiIsbmFtZSkpICU+JSBmaWx0ZXIoZ3JlcGwoIlJ1c3NpYSIsIGNvdW50cnkpKSAlPiUgYXJyYW5nZShkZXNjKGRlcGFydHVyZV9kYXRlKSkNCmRpbShQYW5BbSkNClBhbkFtDQpgYGANCg0KYGBge3J9DQojV2VsZG9uDQpQYW5BbSRBcnJpdmFsWWVhciA8LSBmb3JtYXQoYXMuRGF0ZShQYW5BbSRhcnJpdmFsX2RhdGUsIGZvcm1hdD0iJVkvJW0vJWQiKSwiJVkiKQ0KYGBgDQoNCmBgYHtyfQ0KeHl6IDwtIGdncGxvdChQYW5BbSwgYWVzKHggPSBBcnJpdmFsWWVhciwgZmlsbCA9IGZhY3Rvcihjb3VudHJ5KSkpICsgZ2VvbV9iYXIoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0nbnVsbCcpICsgZ2d0aXRsZSgiV2VsZG9uIGluIFJ1c3NpYSIpDQp4eXoNCmBgYA0KDQpgYGB7cn0NCmFiYyA8LSBkZiAlPiUgIGZpbHRlcihncmVwbCgiV2VsZG9uIixuYW1lKSkgICU+JSBhcnJhbmdlKGRlc2MoZGVwYXJ0dXJlX2RhdGUpKQ0KZ2dwbG90KGFiYywgYWVzKHggPSBBcnJpdmFsWWVhciwgZmlsbCA9IGZhY3Rvcihjb3VudHJ5KSkpICsgZ2VvbV9iYXIoKSArIGdndGl0bGUoIldlbGRvbiIpDQpgYGANCg0KDQpbTGVnZW5kIElzc3Vlc10oaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDIwNDkyNDMvZ2dwbG90Mi1oaXN0b2dyYW0tbGVnZW5kLXRvby1sYXJnZSkNCg0KV2VsZG9uDQoNCmBgYHtyfQ0KeXogPC0gZ2dwbG90KFBhbkFtLCBhZXMoeCA9IEFycml2YWxZZWFyLCBmaWxsID0gZmFjdG9yKGNvdW50cnkpKSkgKyBnZW9tX2JhcigpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSdib3R0b20nKSArDQogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCkpDQp5eiANCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoZ3JpZEV4dHJhKQ0KZ19sZWdlbmQ8LWZ1bmN0aW9uKGEuZ3Bsb3Qpew0KICAgIHRtcCA8LSBnZ3Bsb3RfZ3RhYmxlKGdncGxvdF9idWlsZChhLmdwbG90KSkNCiAgICBsZWcgPC0gd2hpY2goc2FwcGx5KHRtcCRncm9icywgZnVuY3Rpb24oeCkgeCRuYW1lKSA9PSAiZ3VpZGUtYm94IikNCiAgICBsZWdlbmQgPC0gdG1wJGdyb2JzW1tsZWddXQ0KICAgIGxlZ2VuZA0KfQ0KbGVnZW5kIDwtIGdfbGVnZW5kKHl6KQ0KZ3JpZC5hcnJhbmdlKGxlZ2VuZCwgeXorIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdub25lJyksIA0KICAgIG5jb2w9MiwgbnJvdz0xLCB3aWR0aHM9YygxLzYsNS82KSkNCmBgYA0KTnVuZXMNCg0KYGBge3J9DQpQYW5BbSA8LSBkZiAlPiUgIGZpbHRlcihncmVwbCgibnVuZXMiLG5hbWUpKSAlPiUgZmlsdGVyKGdyZXBsKCJSdXNzaWEiLCBjb3VudHJ5KSklPiUgYXJyYW5nZShkZXNjKGRlcGFydHVyZV9kYXRlKSkNClBhbkFtJEFycml2YWxZZWFyIDwtIGZvcm1hdChhcy5EYXRlKFBhbkFtJGFycml2YWxfZGF0ZSwgZm9ybWF0PSIlWS8lbS8lZCIpLCIlWSIpDQpQYW5BbQ0KYGBgDQoNCkRhbmEgUm9ocmFiYWNoZXINCg0KYGBge3J9DQpQYW5BbSA8LSB3aG93ZW50d2hlcmUgJT4lICBmaWx0ZXIoZ3JlcGwoIlJvaHIiLG5hbWUpKSAlPiUgZmlsdGVyKGdyZXBsKCJSdXNzaWEiLCBjb3VudHJ5KSklPiUgYXJyYW5nZShkZXNjKEFycml2YWxZZWFyKSkNClBhbkFtDQojUGFuQW0kQXJyaXZhbFllYXIgPC0gZm9ybWF0KGFzLkRhdGUoUGFuQW0kYXJyaXZhbF9kYXRlLCBmb3JtYXQ9IiVZLyVtLyVkIiksIiVZIikNCnh5eiA8LSBnZ3Bsb3QoUGFuQW0sIGFlcyh4ID0gQXJyaXZhbFllYXIsIGZpbGwgPSBmYWN0b3IoY291bnRyeSkpKSArIGdlb21fYmFyKCkgDQojICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSdudWxsJykNCnh5eg0KYGBgDQoNCg0KDQo=