# Summary of code -----------------------------------------------------------------

# Extract Flu vaccination indicators from Fingertips API.
# Summarise data deprivation decile and sort by low > high while highlighting Enfield LA.
# Benchmark and RAG rate against vaccination targets.
# Include horizontal bar for England and London average.
# Export Bar charts as PDF and publish as HTML.


# Set up  -----------------------------------------------------------------

setwd("G:/My Drive/Work/R")

getwd()

#RTools setup instructions
write('PATH="${RTOOLS40_HOME}\\usr\\bin;${PATH}"', file = "~/.Renviron", append = TRUE)


# Enable repository from ropensci
options(repos = c(
  ropensci = 'https://ropensci.r-universe.dev',
  CRAN = 'https://cloud.r-project.org'))

# Download and install fingertipsR in R
install.packages('fingertipsR')



# Packages ----------------------------------------------------------------


library(fingertipsR)
library(dplyr)
library(ggplot2)



# Misc ------------------------------------------------------------


categories <- category_types()

respiratory_areas <- area_types(402)

area_types <- area_types()



# Data extract ------------------------------------------------------------

# find domain ID codes
prof <- profiles()

# find indicator ID codes
indicators(DomainID = 1938133210)

# Flu indicator vector
flu_indicators <- c(30314, 30315, 92325, 93691)

# Extract dataframe of flu indicators by County and UA area type.
respiratory <- fingertips_data(
  IndicatorID = flu_indicators,
  AreaTypeID = 402,
  ParentAreaTypeID = 10146)

# Extract and append IMD2019 Deciles rates to end of dataset


#IMD scores by LA code
IMD2019 <- deprivation_decile(AreaTypeID = 402,
                           Year = 2019)

# Data format -------------------------------------------------------------

#Join IMD scores to dataset
respiratory2 <- respiratory %>%
  left_join(IMD2019)


#Sum counts and denominators by indicator and decile and calculate decile rates

respiratory_deciles_count <- respiratory2 %>%
  group_by(IndicatorName) %>%
  filter(TimeperiodSortable == max(TimeperiodSortable)) %>%
  group_by(decile, IndicatorName)%>%
  summarise(Count = sum(Count, na.rm = T))

respiratory_deciles_denominator <- respiratory2 %>%
  group_by(IndicatorName) %>%
  filter(TimeperiodSortable == max(TimeperiodSortable)) %>%
  group_by(decile, IndicatorName)%>%
  summarise(Denominator = sum(Denominator))

respiratory_deciles_rate <- left_join(respiratory_deciles_count,
                                    respiratory_deciles_denominator,
                                    by = c("decile", "IndicatorName"))

respiratory_deciles_rate <- respiratory_deciles_rate%>%
  mutate(Value = Count/Denominator)
 
# Join decile names and bind rows so decile names fall under $AreaNames and decile rates under $Value

AreaName <- c("Most deprived decile", 
              "Second most deprived decile",
              "Third more deprived decile",
              "Fourth more deprived decile",
              "Fifth more deprived decile",
              "Fifth less deprived decile",
              "Fourth less deprived decile",
              "Third less deprived decile",
              "Second least deprived decile",
              "Least deprived deprived decile")

decile <- c(1,2,3,4,5,6,7,8,9,10)

decile_lookup <- data.frame(AreaName,decile)

respiratory_deciles_rate <- respiratory_deciles_rate%>%
  left_join(decile_lookup)

respiratory3 <- respiratory2 %>%
  bind_rows(respiratory2,
            respiratory_deciles_rate[,c("AreaName")])


# Charts ------------------------------------------------------------------

# horizontal bar data frames

yintercept75 <- data.frame(yi = 75)
yintercept55 <- data.frame(yi = 55)
yintercept65 <- data.frame(yi = 65)



# Over 65 Flu

# filter data frame for ggplot
Over65 <- 
  respiratory2 %>%
  filter(IndicatorID == 30314)%>%
  filter(decile == 4)%>%
  filter(TimeperiodSortable == max(TimeperiodSortable))%>%
  arrange(.,desc(Value))

#sort Area names based on value
Over65$AreaName <- 
  factor(Over65$AreaName,
         levels=Over65$AreaName[order(Over65$Value,
                                        decreasing=TRUE)])
 
# create plot
plot_over65 <- 
  ggplot(Over65,
       aes(x=AreaName,
           y=Value))+
  geom_bar(stat = "identity")+ 
  scale_x_discrete(limits = rev(levels(Over65$AreaName))) +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))+
  labs(x = "County and UA's (Fourth more deprived decile)", 
       y = "Proportion (%)", 
       title = "Flu Vaccination Coverage, Ages 65+, 2021/22")+
  geom_hline(data = yintercept75, aes(yintercept = yi, linetype = factor(yi)), show_guide = TRUE, size = 1.5) +
  scale_linetype_manual(name = "Goal >= 75%", values = "solid", labels = "")+
  theme(axis.text.x = element_text(face = c('plain', 'plain', 'bold', 'plain', 'plain', "plain","plain",'plain', "plain",'plain', "plain",'plain', "plain",'plain', "plain")))





# At risk Individuals Flu


at_risk <- 
  respiratory2 %>%
  filter(IndicatorID == 30315)%>%
  filter(decile == 4)%>%
  filter(TimeperiodSortable == max(TimeperiodSortable))%>%
  arrange(.,desc(Value))

at_risk$AreaName <- 
  factor(at_risk$AreaName,
         levels=at_risk$AreaName[order(at_risk$Value,
                                      decreasing=TRUE)])


plot_at_risk <-
  ggplot(at_risk,
       aes(x=AreaName,
           y=Value))+
  geom_bar(stat = "identity")+ 
  scale_x_discrete(limits = rev(levels(at_risk$AreaName))) +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))+
  labs(x = "County and UA's (Fourth more deprived decile)", 
       y = "Proportion (%)", 
       title = "Flu Vaccination Coverage,At Risk Individuals, 2021/22")+
  geom_hline(data = yintercept55, aes(yintercept = yi, linetype = factor(yi)), show_guide = TRUE, size = 1.5) +
  scale_linetype_manual(name = "Goal >= 55%", values = "solid", labels = "")+
  theme(axis.text.x = element_text(face = c('plain', 'bold', 'plain', 'plain', 'plain', "plain","plain",'plain', "plain",'plain', "plain",'plain', "plain",'plain', "plain")))

        



# Primary School Ages Children


primary_school_aged <- 
  respiratory2 %>%
  filter(IndicatorID == 93691)%>%
  filter(decile == 4)%>%
  filter(TimeperiodSortable == max(TimeperiodSortable))%>%
  arrange(.,desc(Value))

primary_school_aged$AreaName <- 
  factor(primary_school_aged$AreaName,
         levels=primary_school_aged$AreaName[order(primary_school_aged$Value,
                                       decreasing=TRUE)])


plot_primary <- 
  ggplot(primary_school_aged,
       aes(x=AreaName,
           y=Value))+
  geom_bar(stat = "identity")+ 
  scale_x_discrete(limits = rev(levels(primary_school_aged$AreaName))) +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))+
  labs(x = "County and UA's (Fourth more deprived decile)", 
       y = "Proportion (%)", 
       title = "Flu Vaccination Coverage, Ages 4 - 11 years, 2021")+
  geom_hline(data = yintercept65, aes(yintercept = yi, linetype = factor(yi)), show_guide = TRUE, size = 1.5) +
  scale_linetype_manual(name = "Goal >= 65%", values = "solid", labels = "")+
  theme(axis.text.x = element_text(face = c('bold', 'plain', 'plain', 'plain', 'plain', "plain","plain",'plain', "plain",'plain', "plain",'plain', "plain",'plain', "plain")))
LS0tDQp0aXRsZTogRmx1IFZhY2NpbmNhdGlvbiBDb3ZlcmFnZSAtIEZvdXJ0aCBNb3JlIERlcHJpdmVkIERlY2lsZSAoSU1EIDIwMTkpDQphdXRob3I6DQotIG5hbWU6IEdlb3JnZSBBa29tZnJhaA0KLSBuYW1lOiBodHRwczovL3d3dy5saW5rZWRpbi5jb20vaW4vZ2VvcmdlLWFrb21mcmFoLy8NCmRhdGU6ICIxMS8wOS8yMDIyIg0KYWJzdHJhY3Q6IFRoaXMgcmVwb3J0IHN1bW1hcmlzZXMgZmx1IHZhY2NpbmF0aW9uIGNvdmVyYWdlIGZvciBpbmRpdmlkdWFscyBhZ2VkIDY1IHllYXJzIGFuZCBvdmVyLCBhdC1yaXNrIHBvcHVsYXRpb25zIGFuZCBwcmltYXJ5IHNjaG9vbCBhZ2VkIGNoaWxkcmVuLiBUaGVzZSBkYXRhIGFyZSBleHRyYWN0ZWQgZnJvbSBUaGUgT2ZmaWNlIGZvciBIZWFsdGggSW1wcm92bWVudCBhbmQgRGlzcGFyaXRpZXMgKE9ISUQpIEZpbmdlcnRpcHMgQVBJLiBUaGUgZGF0YSBwcmVzZW50ZWQgY292ZXJzIGxvY2FsIGF1dGhvcml0aWVzIGluIHRoZSBmb3VydGggbW9yZSBkZXByaXZlZCBkZWNpbGUgKElNRCAyMDE5KSBmb3IgdGhlIG1vc3QgcmVjZW50IGRhdGEgYXZhaWxhYmxlIGFzIG9mIDExLzA5LzIwMjIuIFRoaXMgcmVwb3J0IGlzIGZvciBkZW1vbnN0YXRpbmcgdGhlIHVzZSBvZiBmaW5nZXJ0aXBzIEFQSSBvbmx5Lg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQoNCg0KDQoNCg0KDQotLS0NCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgcmVzdWx0cz0naGlkZScsZmlnLmtlZXA9J2FsbCd9DQoNCnByaW50KHBsb3Rfb3ZlcjY1KQ0KYGBgDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCByZXN1bHRzPSdoaWRlJyxmaWcua2VlcD0nYWxsJ30NCg0KcHJpbnQocGxvdF9hdF9yaXNrKQ0KYGBgDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCByZXN1bHRzPSdoaWRlJyxmaWcua2VlcD0nYWxsJ30NCg0KcHJpbnQocGxvdF9wcmltYXJ5KQ0KYGBgDQoNCg0KDQpgYGB7cn0NCg0KIyBTdW1tYXJ5IG9mIGNvZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyBFeHRyYWN0IEZsdSB2YWNjaW5hdGlvbiBpbmRpY2F0b3JzIGZyb20gRmluZ2VydGlwcyBBUEkuDQojIFN1bW1hcmlzZSBkYXRhIGRlcHJpdmF0aW9uIGRlY2lsZSBhbmQgc29ydCBieSBsb3cgPiBoaWdoIHdoaWxlIGhpZ2hsaWdodGluZyBFbmZpZWxkIExBLg0KIyBCZW5jaG1hcmsgYW5kIFJBRyByYXRlIGFnYWluc3QgdmFjY2luYXRpb24gdGFyZ2V0cy4NCiMgSW5jbHVkZSBob3Jpem9udGFsIGJhciBmb3IgRW5nbGFuZCBhbmQgTG9uZG9uIGF2ZXJhZ2UuDQojIEV4cG9ydCBCYXIgY2hhcnRzIGFzIFBERiBhbmQgcHVibGlzaCBhcyBIVE1MLg0KDQoNCiMgU2V0IHVwICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpzZXR3ZCgiRzovTXkgRHJpdmUvV29yay9SIikNCg0KZ2V0d2QoKQ0KDQojUlRvb2xzIHNldHVwIGluc3RydWN0aW9ucw0Kd3JpdGUoJ1BBVEg9IiR7UlRPT0xTNDBfSE9NRX1cXHVzclxcYmluOyR7UEFUSH0iJywgZmlsZSA9ICJ+Ly5SZW52aXJvbiIsIGFwcGVuZCA9IFRSVUUpDQoNCg0KIyBFbmFibGUgcmVwb3NpdG9yeSBmcm9tIHJvcGVuc2NpDQpvcHRpb25zKHJlcG9zID0gYygNCiAgcm9wZW5zY2kgPSAnaHR0cHM6Ly9yb3BlbnNjaS5yLXVuaXZlcnNlLmRldicsDQogIENSQU4gPSAnaHR0cHM6Ly9jbG91ZC5yLXByb2plY3Qub3JnJykpDQoNCiMgRG93bmxvYWQgYW5kIGluc3RhbGwgZmluZ2VydGlwc1IgaW4gUg0KaW5zdGFsbC5wYWNrYWdlcygnZmluZ2VydGlwc1InKQ0KDQoNCg0KIyBQYWNrYWdlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCg0KbGlicmFyeShmaW5nZXJ0aXBzUikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQoNCg0KDQojIE1pc2MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCg0KY2F0ZWdvcmllcyA8LSBjYXRlZ29yeV90eXBlcygpDQoNCnJlc3BpcmF0b3J5X2FyZWFzIDwtIGFyZWFfdHlwZXMoNDAyKQ0KDQphcmVhX3R5cGVzIDwtIGFyZWFfdHlwZXMoKQ0KDQoNCg0KIyBEYXRhIGV4dHJhY3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMgZmluZCBkb21haW4gSUQgY29kZXMNCnByb2YgPC0gcHJvZmlsZXMoKQ0KDQojIGZpbmQgaW5kaWNhdG9yIElEIGNvZGVzDQppbmRpY2F0b3JzKERvbWFpbklEID0gMTkzODEzMzIxMCkNCg0KIyBGbHUgaW5kaWNhdG9yIHZlY3Rvcg0KZmx1X2luZGljYXRvcnMgPC0gYygzMDMxNCwgMzAzMTUsIDkyMzI1LCA5MzY5MSkNCg0KIyBFeHRyYWN0IGRhdGFmcmFtZSBvZiBmbHUgaW5kaWNhdG9ycyBieSBDb3VudHkgYW5kIFVBIGFyZWEgdHlwZS4NCnJlc3BpcmF0b3J5IDwtIGZpbmdlcnRpcHNfZGF0YSgNCiAgSW5kaWNhdG9ySUQgPSBmbHVfaW5kaWNhdG9ycywNCiAgQXJlYVR5cGVJRCA9IDQwMiwNCiAgUGFyZW50QXJlYVR5cGVJRCA9IDEwMTQ2KQ0KDQojIEV4dHJhY3QgYW5kIGFwcGVuZCBJTUQyMDE5IERlY2lsZXMgcmF0ZXMgdG8gZW5kIG9mIGRhdGFzZXQNCg0KDQojSU1EIHNjb3JlcyBieSBMQSBjb2RlDQpJTUQyMDE5IDwtIGRlcHJpdmF0aW9uX2RlY2lsZShBcmVhVHlwZUlEID0gNDAyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgWWVhciA9IDIwMTkpDQoNCiMgRGF0YSBmb3JtYXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojSm9pbiBJTUQgc2NvcmVzIHRvIGRhdGFzZXQNCnJlc3BpcmF0b3J5MiA8LSByZXNwaXJhdG9yeSAlPiUNCiAgbGVmdF9qb2luKElNRDIwMTkpDQoNCg0KI1N1bSBjb3VudHMgYW5kIGRlbm9taW5hdG9ycyBieSBpbmRpY2F0b3IgYW5kIGRlY2lsZSBhbmQgY2FsY3VsYXRlIGRlY2lsZSByYXRlcw0KDQpyZXNwaXJhdG9yeV9kZWNpbGVzX2NvdW50IDwtIHJlc3BpcmF0b3J5MiAlPiUNCiAgZ3JvdXBfYnkoSW5kaWNhdG9yTmFtZSkgJT4lDQogIGZpbHRlcihUaW1lcGVyaW9kU29ydGFibGUgPT0gbWF4KFRpbWVwZXJpb2RTb3J0YWJsZSkpICU+JQ0KICBncm91cF9ieShkZWNpbGUsIEluZGljYXRvck5hbWUpJT4lDQogIHN1bW1hcmlzZShDb3VudCA9IHN1bShDb3VudCwgbmEucm0gPSBUKSkNCg0KcmVzcGlyYXRvcnlfZGVjaWxlc19kZW5vbWluYXRvciA8LSByZXNwaXJhdG9yeTIgJT4lDQogIGdyb3VwX2J5KEluZGljYXRvck5hbWUpICU+JQ0KICBmaWx0ZXIoVGltZXBlcmlvZFNvcnRhYmxlID09IG1heChUaW1lcGVyaW9kU29ydGFibGUpKSAlPiUNCiAgZ3JvdXBfYnkoZGVjaWxlLCBJbmRpY2F0b3JOYW1lKSU+JQ0KICBzdW1tYXJpc2UoRGVub21pbmF0b3IgPSBzdW0oRGVub21pbmF0b3IpKQ0KDQpyZXNwaXJhdG9yeV9kZWNpbGVzX3JhdGUgPC0gbGVmdF9qb2luKHJlc3BpcmF0b3J5X2RlY2lsZXNfY291bnQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwaXJhdG9yeV9kZWNpbGVzX2Rlbm9taW5hdG9yLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJkZWNpbGUiLCAiSW5kaWNhdG9yTmFtZSIpKQ0KDQpyZXNwaXJhdG9yeV9kZWNpbGVzX3JhdGUgPC0gcmVzcGlyYXRvcnlfZGVjaWxlc19yYXRlJT4lDQogIG11dGF0ZShWYWx1ZSA9IENvdW50L0Rlbm9taW5hdG9yKQ0KIA0KIyBKb2luIGRlY2lsZSBuYW1lcyBhbmQgYmluZCByb3dzIHNvIGRlY2lsZSBuYW1lcyBmYWxsIHVuZGVyICRBcmVhTmFtZXMgYW5kIGRlY2lsZSByYXRlcyB1bmRlciAkVmFsdWUNCg0KQXJlYU5hbWUgPC0gYygiTW9zdCBkZXByaXZlZCBkZWNpbGUiLCANCiAgICAgICAgICAgICAgIlNlY29uZCBtb3N0IGRlcHJpdmVkIGRlY2lsZSIsDQogICAgICAgICAgICAgICJUaGlyZCBtb3JlIGRlcHJpdmVkIGRlY2lsZSIsDQogICAgICAgICAgICAgICJGb3VydGggbW9yZSBkZXByaXZlZCBkZWNpbGUiLA0KICAgICAgICAgICAgICAiRmlmdGggbW9yZSBkZXByaXZlZCBkZWNpbGUiLA0KICAgICAgICAgICAgICAiRmlmdGggbGVzcyBkZXByaXZlZCBkZWNpbGUiLA0KICAgICAgICAgICAgICAiRm91cnRoIGxlc3MgZGVwcml2ZWQgZGVjaWxlIiwNCiAgICAgICAgICAgICAgIlRoaXJkIGxlc3MgZGVwcml2ZWQgZGVjaWxlIiwNCiAgICAgICAgICAgICAgIlNlY29uZCBsZWFzdCBkZXByaXZlZCBkZWNpbGUiLA0KICAgICAgICAgICAgICAiTGVhc3QgZGVwcml2ZWQgZGVwcml2ZWQgZGVjaWxlIikNCg0KZGVjaWxlIDwtIGMoMSwyLDMsNCw1LDYsNyw4LDksMTApDQoNCmRlY2lsZV9sb29rdXAgPC0gZGF0YS5mcmFtZShBcmVhTmFtZSxkZWNpbGUpDQoNCnJlc3BpcmF0b3J5X2RlY2lsZXNfcmF0ZSA8LSByZXNwaXJhdG9yeV9kZWNpbGVzX3JhdGUlPiUNCiAgbGVmdF9qb2luKGRlY2lsZV9sb29rdXApDQoNCnJlc3BpcmF0b3J5MyA8LSByZXNwaXJhdG9yeTIgJT4lDQogIGJpbmRfcm93cyhyZXNwaXJhdG9yeTIsDQogICAgICAgICAgICByZXNwaXJhdG9yeV9kZWNpbGVzX3JhdGVbLGMoIkFyZWFOYW1lIildKQ0KDQoNCiMgQ2hhcnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIGhvcml6b250YWwgYmFyIGRhdGEgZnJhbWVzDQoNCnlpbnRlcmNlcHQ3NSA8LSBkYXRhLmZyYW1lKHlpID0gNzUpDQp5aW50ZXJjZXB0NTUgPC0gZGF0YS5mcmFtZSh5aSA9IDU1KQ0KeWludGVyY2VwdDY1IDwtIGRhdGEuZnJhbWUoeWkgPSA2NSkNCg0KDQoNCiMgT3ZlciA2NSBGbHUNCg0KIyBmaWx0ZXIgZGF0YSBmcmFtZSBmb3IgZ2dwbG90DQpPdmVyNjUgPC0gDQogIHJlc3BpcmF0b3J5MiAlPiUNCiAgZmlsdGVyKEluZGljYXRvcklEID09IDMwMzE0KSU+JQ0KICBmaWx0ZXIoZGVjaWxlID09IDQpJT4lDQogIGZpbHRlcihUaW1lcGVyaW9kU29ydGFibGUgPT0gbWF4KFRpbWVwZXJpb2RTb3J0YWJsZSkpJT4lDQogIGFycmFuZ2UoLixkZXNjKFZhbHVlKSkNCg0KI3NvcnQgQXJlYSBuYW1lcyBiYXNlZCBvbiB2YWx1ZQ0KT3ZlcjY1JEFyZWFOYW1lIDwtIA0KICBmYWN0b3IoT3ZlcjY1JEFyZWFOYW1lLA0KICAgICAgICAgbGV2ZWxzPU92ZXI2NSRBcmVhTmFtZVtvcmRlcihPdmVyNjUkVmFsdWUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjcmVhc2luZz1UUlVFKV0pDQogDQojIGNyZWF0ZSBwbG90DQpwbG90X292ZXI2NSA8LSANCiAgZ2dwbG90KE92ZXI2NSwNCiAgICAgICBhZXMoeD1BcmVhTmFtZSwNCiAgICAgICAgICAgeT1WYWx1ZSkpKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikrIA0KICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IHJldihsZXZlbHMoT3ZlcjY1JEFyZWFOYW1lKSkpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKSsNCiAgbGFicyh4ID0gIkNvdW50eSBhbmQgVUEncyAoRm91cnRoIG1vcmUgZGVwcml2ZWQgZGVjaWxlKSIsIA0KICAgICAgIHkgPSAiUHJvcG9ydGlvbiAoJSkiLCANCiAgICAgICB0aXRsZSA9ICJGbHUgVmFjY2luYXRpb24gQ292ZXJhZ2UsIEFnZXMgNjUrLCAyMDIxLzIyIikrDQogIGdlb21faGxpbmUoZGF0YSA9IHlpbnRlcmNlcHQ3NSwgYWVzKHlpbnRlcmNlcHQgPSB5aSwgbGluZXR5cGUgPSBmYWN0b3IoeWkpKSwgc2hvd19ndWlkZSA9IFRSVUUsIHNpemUgPSAxLjUpICsNCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKG5hbWUgPSAiR29hbCA+PSA3NSUiLCB2YWx1ZXMgPSAic29saWQiLCBsYWJlbHMgPSAiIikrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSBjKCdwbGFpbicsICdwbGFpbicsICdib2xkJywgJ3BsYWluJywgJ3BsYWluJywgInBsYWluIiwicGxhaW4iLCdwbGFpbicsICJwbGFpbiIsJ3BsYWluJywgInBsYWluIiwncGxhaW4nLCAicGxhaW4iLCdwbGFpbicsICJwbGFpbiIpKSkNCg0KDQoNCg0KDQojIEF0IHJpc2sgSW5kaXZpZHVhbHMgRmx1DQoNCg0KYXRfcmlzayA8LSANCiAgcmVzcGlyYXRvcnkyICU+JQ0KICBmaWx0ZXIoSW5kaWNhdG9ySUQgPT0gMzAzMTUpJT4lDQogIGZpbHRlcihkZWNpbGUgPT0gNCklPiUNCiAgZmlsdGVyKFRpbWVwZXJpb2RTb3J0YWJsZSA9PSBtYXgoVGltZXBlcmlvZFNvcnRhYmxlKSklPiUNCiAgYXJyYW5nZSguLGRlc2MoVmFsdWUpKQ0KDQphdF9yaXNrJEFyZWFOYW1lIDwtIA0KICBmYWN0b3IoYXRfcmlzayRBcmVhTmFtZSwNCiAgICAgICAgIGxldmVscz1hdF9yaXNrJEFyZWFOYW1lW29yZGVyKGF0X3Jpc2skVmFsdWUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY3JlYXNpbmc9VFJVRSldKQ0KDQoNCnBsb3RfYXRfcmlzayA8LQ0KICBnZ3Bsb3QoYXRfcmlzaywNCiAgICAgICBhZXMoeD1BcmVhTmFtZSwNCiAgICAgICAgICAgeT1WYWx1ZSkpKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikrIA0KICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IHJldihsZXZlbHMoYXRfcmlzayRBcmVhTmFtZSkpKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkrDQogIGxhYnMoeCA9ICJDb3VudHkgYW5kIFVBJ3MgKEZvdXJ0aCBtb3JlIGRlcHJpdmVkIGRlY2lsZSkiLCANCiAgICAgICB5ID0gIlByb3BvcnRpb24gKCUpIiwgDQogICAgICAgdGl0bGUgPSAiRmx1IFZhY2NpbmF0aW9uIENvdmVyYWdlLEF0IFJpc2sgSW5kaXZpZHVhbHMsIDIwMjEvMjIiKSsNCiAgZ2VvbV9obGluZShkYXRhID0geWludGVyY2VwdDU1LCBhZXMoeWludGVyY2VwdCA9IHlpLCBsaW5ldHlwZSA9IGZhY3Rvcih5aSkpLCBzaG93X2d1aWRlID0gVFJVRSwgc2l6ZSA9IDEuNSkgKw0KICBzY2FsZV9saW5ldHlwZV9tYW51YWwobmFtZSA9ICJHb2FsID49IDU1JSIsIHZhbHVlcyA9ICJzb2xpZCIsIGxhYmVscyA9ICIiKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9IGMoJ3BsYWluJywgJ2JvbGQnLCAncGxhaW4nLCAncGxhaW4nLCAncGxhaW4nLCAicGxhaW4iLCJwbGFpbiIsJ3BsYWluJywgInBsYWluIiwncGxhaW4nLCAicGxhaW4iLCdwbGFpbicsICJwbGFpbiIsJ3BsYWluJywgInBsYWluIikpKQ0KDQoNCiAgICAgICAgDQoNCg0KDQojIFByaW1hcnkgU2Nob29sIEFnZXMgQ2hpbGRyZW4NCg0KDQpwcmltYXJ5X3NjaG9vbF9hZ2VkIDwtIA0KICByZXNwaXJhdG9yeTIgJT4lDQogIGZpbHRlcihJbmRpY2F0b3JJRCA9PSA5MzY5MSklPiUNCiAgZmlsdGVyKGRlY2lsZSA9PSA0KSU+JQ0KICBmaWx0ZXIoVGltZXBlcmlvZFNvcnRhYmxlID09IG1heChUaW1lcGVyaW9kU29ydGFibGUpKSU+JQ0KICBhcnJhbmdlKC4sZGVzYyhWYWx1ZSkpDQoNCnByaW1hcnlfc2Nob29sX2FnZWQkQXJlYU5hbWUgPC0gDQogIGZhY3RvcihwcmltYXJ5X3NjaG9vbF9hZ2VkJEFyZWFOYW1lLA0KICAgICAgICAgbGV2ZWxzPXByaW1hcnlfc2Nob29sX2FnZWQkQXJlYU5hbWVbb3JkZXIocHJpbWFyeV9zY2hvb2xfYWdlZCRWYWx1ZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY3JlYXNpbmc9VFJVRSldKQ0KDQoNCnBsb3RfcHJpbWFyeSA8LSANCiAgZ2dwbG90KHByaW1hcnlfc2Nob29sX2FnZWQsDQogICAgICAgYWVzKHg9QXJlYU5hbWUsDQogICAgICAgICAgIHk9VmFsdWUpKSsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpKyANCiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSByZXYobGV2ZWxzKHByaW1hcnlfc2Nob29sX2FnZWQkQXJlYU5hbWUpKSkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpKw0KICBsYWJzKHggPSAiQ291bnR5IGFuZCBVQSdzIChGb3VydGggbW9yZSBkZXByaXZlZCBkZWNpbGUpIiwgDQogICAgICAgeSA9ICJQcm9wb3J0aW9uICglKSIsIA0KICAgICAgIHRpdGxlID0gIkZsdSBWYWNjaW5hdGlvbiBDb3ZlcmFnZSwgQWdlcyA0IC0gMTEgeWVhcnMsIDIwMjEiKSsNCiAgZ2VvbV9obGluZShkYXRhID0geWludGVyY2VwdDY1LCBhZXMoeWludGVyY2VwdCA9IHlpLCBsaW5ldHlwZSA9IGZhY3Rvcih5aSkpLCBzaG93X2d1aWRlID0gVFJVRSwgc2l6ZSA9IDEuNSkgKw0KICBzY2FsZV9saW5ldHlwZV9tYW51YWwobmFtZSA9ICJHb2FsID49IDY1JSIsIHZhbHVlcyA9ICJzb2xpZCIsIGxhYmVscyA9ICIiKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9IGMoJ2JvbGQnLCAncGxhaW4nLCAncGxhaW4nLCAncGxhaW4nLCAncGxhaW4nLCAicGxhaW4iLCJwbGFpbiIsJ3BsYWluJywgInBsYWluIiwncGxhaW4nLCAicGxhaW4iLCdwbGFpbicsICJwbGFpbiIsJ3BsYWluJywgInBsYWluIikpKQ0KDQoNCmBgYA0K