library(ggplot2)
library(plotly)
library(rvest)
library(pbapply)
library(TTR)
library(dygraphs)
library(lubridate)
library(tidyquant)
library(timetk)
library(htmlwidgets)
library(kableExtra)
options(dplyr.print_max = 1e9)
pacman::p_load(dygraphs,DT,tidyverse,janitor,ggthemes,scales,ggpubr,viridis)

theme_set(theme_pubclean())

0.0.0.1 Description of A simple Trading Strategy

The simple strategy follows that given a list of stocks, we want download is’s associated data in terms of open and closing prices from an API such as Yahoo Finance. Afterwards we would want to find those stocks has closed at 70 day high (i.e. the last closing price to be the #highest over the past 70 days), and over this period the 50-day MA always #stays above the 100-day MA.

start<-as.Date("2010-01-10")
end<-Sys.Date()




simple_strategy= function(start_date,end_date,tickers){

library(tidyquant) 
library(zoo)  
library(furrr) 
library(tidyverse)  
  


start<-as.Date(start_date)
end <-as.Date(end_date)

p  <- tidyquant::tq_get(tickers , get = "stock.prices", from = start,
           to =end)


p= na.omit(p)
#p <-quantmod:: getSymbols("AMZ", from = start,
#            to = end, warnings = FALSE, src = 'yahoo',
#           auto.assign = TRUE)
#p= get(p)

#p=na.approx(p)



prices <-  p %>%
    tidyquant::tq_mutate(select = close, mutate_fun = SMA, n = 100) %>%
    dplyr::rename(SMA100 = SMA) %>%
    tidyquant::tq_mutate(select = close, mutate_fun = SMA, n = 50) %>%
    dplyr::rename(SMA50 = SMA)


prices<-
   prices%>% dplyr::mutate(rolling70= c(rep(NA,69),rollmax(close, 70)))


df=
prices %>% dplyr::filter(close==rolling70)%>%
      dplyr::filter(SMA50>SMA100)

 
 return(df) 
  
}





# for a single stock ,we can run the strategy function below which returns a dataframe which meets the strategy conditions
tickers <- c("GOOGL")
re=simple_strategy(start,end,tickers)




#For multiple  stocks we can take advantage of functional programming where we can repeat the function for many stock indicators using a parallel version of the map function of the purrr package. The parallel version of the purrr package is the furrr package.
ticker= c("FB", "AAPL", "MSFT","GOOGL","TSLA","AMZ")

result =furrr::future_map_dfr(ticker,
                      function(x) simple_strategy(start_date=start,
                                      end_date=end,
                                      tickers=x))


#Equivalently, uisng a for loop
#result= list()
#for( i in 1:length(ticker)){
#result[[i]]  = simple_strategy(start,end,ticker[i])
#}



result %>%  head()%>%
  kable(escape = F, align = "c") %>%
  kable_styling(c("striped", "condensed"), full_width = F)
symbol date open high low close volume adjusted SMA100 SMA50 rolling70
FB 2012-12-13 27.59 28.75 27.43 28.24 81051600 28.24 21.9831 22.7988 28.24
FB 2013-01-04 28.01 28.93 27.83 28.76 72715400 28.76 22.4882 24.7086 28.76
FB 2013-01-07 28.69 29.79 28.65 29.42 83781800 29.42 22.5643 24.9106 29.42
FB 2013-01-09 29.67 30.60 29.49 30.59 104787700 30.59 22.7410 25.2490 30.59
FB 2013-01-10 30.60 31.45 30.28 31.30 95316400 31.30 22.8420 25.4238 31.30
FB 2013-01-11 31.28 31.96 31.10 31.72 89598000 31.72 22.9605 25.6194 31.72
library(viridis)
library(scales)

#start <- end - weeks(24)


start<-as.Date("2010-01-10")
end<-Sys.Date()


ticker= c("FB", "AAPL", "MSFT","GOOGL")

 p1 <- tidyquant::tq_get(ticker, 
                        get = "stock.prices", 
                        from = start,
                         to =end) %>%
    #filter(date >= start - days(2 * 20)) %>%
    ggplot(aes(x = date, y = close, 
               open = open, high = high, low = low, close = close, 
               group = symbol)) +
    geom_barchart( colour_up = "#FDE725FF",
  colour_down = "#440154FF",
  fill_up = "#FDE725FF",
  fill_down = "#440154FF") +
    geom_bbands(ma_fun = SMA, sd = 2, n = 50, linetype = 5,color_ma = "#55C667FF") +
    labs(title = "50 Day Simple Moving Average of Several Stocks ", 
         subtitle = "BBands with SMA Applied", 
         y = "Closing Price", x = "") + 
   
    coord_x_date(xlim = c(start, end)) +
    facet_wrap(~ symbol, ncol = 2, scales = "free_y") +
  
    #scale_color_viridis_d(option="D") +
  
  scale_x_date(labels = date_format("%d-%m-%Y"),date_breaks = "2 year") +
  theme(axis.text.x=element_text(angle=45, hjust=1)) +
   labs(caption = "www.restsanalytics.com")

    
p1

#(gg <- ggplotly(p1, tooltip = "symbol"))
#gg=highlight(gg, "plotly_hover")
#htmlwidgets::saveWidget(as_widget(gg), "p1.html")
#gg
ticker= c("FB", "AAPL", "MSFT","GOOGL")

p2 <-  tidyquant::tq_get(ticker, 
                        get = "stock.prices", 
                        from = start,
                         to =end) %>%
    #filter(date >= start - days(2 * 20)) %>%
    ggplot(aes(x = date, y = close, 
               open = open, high = high, low = low, close = close, 
               group = symbol)) +
    geom_barchart( colour_up = "#FDE725FF",
  colour_down = "#440154FF",
  fill_up = "#FDE725FF",
  fill_down = "#440154FF") +
    geom_bbands(ma_fun = SMA, sd = 2, n = 100, linetype = 5,color_ma = "#55C667FF") +
    labs(title = "100 Day Simple Moving Average of Several Stocks ", 
         subtitle = "BBands with SMA Applied", 
         y = "Closing Price", x = "") + 
   
    coord_x_date(xlim = c(start, end)) +
    facet_wrap(~ symbol, ncol = 2, scales = "free_y") +
  
    #scale_color_viridis_d(option="D") +
  
  scale_x_date(labels = date_format("%d-%m-%Y"),date_breaks = "2 year") +
  theme(axis.text.x=element_text(angle=45, hjust=1)) +
   labs(caption = "www.restsanalytics.com")

#gg <- ggplotly(p2, tooltip = "symbol")

#gg=highlight(gg, "plotly_hover")

#htmlwidgets::saveWidget(as_widget(gg), "p2.html")

p2

LS0tDQp0aXRsZTogU2ltcGxlIFRyYWRpbmcgU3RyYXRlZ3kNCnN1YnRpdGxlOiANCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBrZWVwX21kOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgI3RoZW1lOiBmbGF0bHkNCiAgICB0b2M6IHRydWUgIyB0YWJsZSBvZiBjb250ZW50IHRydWUNCiAgICB0b2NfZGVwdGg6IDMgICMgdXB0byB0aHJlZSBkZXB0aHMgb2YgaGVhZGluZ3MgKHNwZWNpZmllZCBieSAjLCAjIyBhbmQgIyMjKQ0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZSAgIyMgaWYgeW91IHdhbnQgbnVtYmVyIHNlY3Rpb25zIGF0IGVhY2ggdGFibGUgaGVhZGVyDQogICAgdGhlbWU6IHVuaXRlZCAgIyBtYW55IG9wdGlvbnMgZm9yIHRoZW1lLCB0aGlzIG9uZSBpcyBteSBmYXZvcml0ZS4NCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQphdXRob3I6IE5hbmEgQm9hdGVuZw0KVGltZTogJ2ByIFN5cy50aW1lKClgJw0KZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJUIgJWQsICVZJylgIg0KcGFyYW1zOg0KICBzZXJpZXM6ICcyJw0KdGFnczogVHJhZGluZyBzdHJhdGVneSxTdG9ja3MsIFF1YW50aXRhdGl2ZSBGaW5hbmNlLCBBc3NldCBSZXR1cm4sIHRpZHlxdWFudCxxdWFudG1vZCANCiAgDQotLS0NCg0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KA0KICAgICAgICAgICAgICAgICAgZWNobyAgICAgICA9IFRSVUUsDQogICAgICAgICAgICAgICAgICBldmFsICAgICAgID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgIHdhcm5pbmcgICAgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgICAgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgIGRwaSAgICAgICAgPSAzMDAsDQogICAgICAgICAgICAgICAgICBmaWcuYWxpZ24gID0gImNlbnRlciIpDQpgYGANCg0KDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KHJ2ZXN0KQ0KbGlicmFyeShwYmFwcGx5KQ0KbGlicmFyeShUVFIpDQpsaWJyYXJ5KGR5Z3JhcGhzKQ0KbGlicmFyeShsdWJyaWRhdGUpDQpsaWJyYXJ5KHRpZHlxdWFudCkNCmxpYnJhcnkodGltZXRrKQ0KbGlicmFyeShodG1sd2lkZ2V0cykNCmxpYnJhcnkoa2FibGVFeHRyYSkNCm9wdGlvbnMoZHBseXIucHJpbnRfbWF4ID0gMWU5KQ0KcGFjbWFuOjpwX2xvYWQoZHlncmFwaHMsRFQsdGlkeXZlcnNlLGphbml0b3IsZ2d0aGVtZXMsc2NhbGVzLGdncHVicix2aXJpZGlzKQ0KDQp0aGVtZV9zZXQodGhlbWVfcHViY2xlYW4oKSkNCg0KYGBgDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KIyMjIyBEZXNjcmlwdGlvbiBvZiAgQSBzaW1wbGUgVHJhZGluZyBTdHJhdGVneQ0KDQpUaGUgc2ltcGxlIHN0cmF0ZWd5IGZvbGxvd3MgdGhhdCBnaXZlbiBhIGxpc3Qgb2Ygc3RvY2tzLCB3ZSB3YW50IGRvd25sb2FkIGlzJ3MgYXNzb2NpYXRlZCBkYXRhIGluIHRlcm1zIG9mIG9wZW4gYW5kIGNsb3NpbmcgcHJpY2VzIGZyb20gYW4gQVBJIHN1Y2ggYXMgWWFob28gRmluYW5jZS4gQWZ0ZXJ3YXJkcyB3ZSB3b3VsZCB3YW50IHRvIGZpbmQgdGhvc2Ugc3RvY2tzICBoYXMgY2xvc2VkIGF0IDcwIGRheSBoaWdoIChpLmUuIHRoZSBsYXN0IGNsb3NpbmcgcHJpY2UgdG8gYmUgdGhlICNoaWdoZXN0IG92ZXIgdGhlIHBhc3QgNzAgZGF5cyksIGFuZCBvdmVyIHRoaXMgcGVyaW9kIHRoZSA1MC1kYXkgTUEgYWx3YXlzICNzdGF5cyBhYm92ZSB0aGUgMTAwLWRheSBNQS4NCg0KDQoNCg0KYGBge3J9DQoNCnN0YXJ0PC1hcy5EYXRlKCIyMDEwLTAxLTEwIikNCmVuZDwtU3lzLkRhdGUoKQ0KDQoNCg0KDQpzaW1wbGVfc3RyYXRlZ3k9IGZ1bmN0aW9uKHN0YXJ0X2RhdGUsZW5kX2RhdGUsdGlja2Vycyl7DQoNCmxpYnJhcnkodGlkeXF1YW50KSANCmxpYnJhcnkoem9vKSAgDQpsaWJyYXJ5KGZ1cnJyKSANCmxpYnJhcnkodGlkeXZlcnNlKSAgDQogIA0KDQoNCnN0YXJ0PC1hcy5EYXRlKHN0YXJ0X2RhdGUpDQplbmQgPC1hcy5EYXRlKGVuZF9kYXRlKQ0KDQpwICA8LSB0aWR5cXVhbnQ6OnRxX2dldCh0aWNrZXJzICwgZ2V0ID0gInN0b2NrLnByaWNlcyIsIGZyb20gPSBzdGFydCwNCiAgICAgICAgICAgdG8gPWVuZCkNCg0KDQpwPSBuYS5vbWl0KHApDQojcCA8LXF1YW50bW9kOjogZ2V0U3ltYm9scygiQU1aIiwgZnJvbSA9IHN0YXJ0LA0KIyAgICAgICAgICAgIHRvID0gZW5kLCB3YXJuaW5ncyA9IEZBTFNFLCBzcmMgPSAneWFob28nLA0KIyAgICAgICAgICAgYXV0by5hc3NpZ24gPSBUUlVFKQ0KI3A9IGdldChwKQ0KDQojcD1uYS5hcHByb3gocCkNCg0KDQoNCnByaWNlcyA8LSAgcCAlPiUNCiAgICB0aWR5cXVhbnQ6OnRxX211dGF0ZShzZWxlY3QgPSBjbG9zZSwgbXV0YXRlX2Z1biA9IFNNQSwgbiA9IDEwMCkgJT4lDQogICAgZHBseXI6OnJlbmFtZShTTUExMDAgPSBTTUEpICU+JQ0KICAgIHRpZHlxdWFudDo6dHFfbXV0YXRlKHNlbGVjdCA9IGNsb3NlLCBtdXRhdGVfZnVuID0gU01BLCBuID0gNTApICU+JQ0KICAgIGRwbHlyOjpyZW5hbWUoU01BNTAgPSBTTUEpDQoNCg0KcHJpY2VzPC0NCiAgIHByaWNlcyU+JSBkcGx5cjo6bXV0YXRlKHJvbGxpbmc3MD0gYyhyZXAoTkEsNjkpLHJvbGxtYXgoY2xvc2UsIDcwKSkpDQoNCg0KZGY9DQpwcmljZXMgJT4lIGRwbHlyOjpmaWx0ZXIoY2xvc2U9PXJvbGxpbmc3MCklPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoU01BNTA+U01BMTAwKQ0KDQogDQogcmV0dXJuKGRmKSANCiAgDQp9DQoNCg0KDQoNCg0KIyBmb3IgYSBzaW5nbGUgc3RvY2sgLHdlIGNhbiBydW4gdGhlIHN0cmF0ZWd5IGZ1bmN0aW9uIGJlbG93IHdoaWNoIHJldHVybnMgYSBkYXRhZnJhbWUgd2hpY2ggbWVldHMgdGhlIHN0cmF0ZWd5IGNvbmRpdGlvbnMNCnRpY2tlcnMgPC0gYygiR09PR0wiKQ0KcmU9c2ltcGxlX3N0cmF0ZWd5KHN0YXJ0LGVuZCx0aWNrZXJzKQ0KDQoNCg0KDQojRm9yIG11bHRpcGxlICBzdG9ja3Mgd2UgY2FuIHRha2UgYWR2YW50YWdlIG9mIGZ1bmN0aW9uYWwgcHJvZ3JhbW1pbmcgd2hlcmUgd2UgY2FuIHJlcGVhdCB0aGUgZnVuY3Rpb24gZm9yIG1hbnkgc3RvY2sgaW5kaWNhdG9ycyB1c2luZyBhIHBhcmFsbGVsIHZlcnNpb24gb2YgdGhlIG1hcCBmdW5jdGlvbiBvZiB0aGUgcHVycnIgcGFja2FnZS4gVGhlIHBhcmFsbGVsIHZlcnNpb24gb2YgdGhlIHB1cnJyIHBhY2thZ2UgaXMgdGhlIGZ1cnJyIHBhY2thZ2UuDQp0aWNrZXI9IGMoIkZCIiwgIkFBUEwiLCAiTVNGVCIsIkdPT0dMIiwiVFNMQSIsIkFNWiIpDQoNCnJlc3VsdCA9ZnVycnI6OmZ1dHVyZV9tYXBfZGZyKHRpY2tlciwNCiAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih4KSBzaW1wbGVfc3RyYXRlZ3koc3RhcnRfZGF0ZT1zdGFydCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kX2RhdGU9ZW5kLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWNrZXJzPXgpKQ0KDQoNCiNFcXVpdmFsZW50bHksIHVpc25nIGEgZm9yIGxvb3ANCiNyZXN1bHQ9IGxpc3QoKQ0KI2ZvciggaSBpbiAxOmxlbmd0aCh0aWNrZXIpKXsNCiNyZXN1bHRbW2ldXSAgPSBzaW1wbGVfc3RyYXRlZ3koc3RhcnQsZW5kLHRpY2tlcltpXSkNCiN9DQoNCg0KDQpyZXN1bHQgJT4lICBoZWFkKCklPiUNCiAga2FibGUoZXNjYXBlID0gRiwgYWxpZ24gPSAiYyIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGMoInN0cmlwZWQiLCAiY29uZGVuc2VkIiksIGZ1bGxfd2lkdGggPSBGKQ0KICANCg0KYGBgDQoNCg0KDQoNCmBgYHtyfQ0KbGlicmFyeSh2aXJpZGlzKQ0KbGlicmFyeShzY2FsZXMpDQoNCiNzdGFydCA8LSBlbmQgLSB3ZWVrcygyNCkNCg0KDQpzdGFydDwtYXMuRGF0ZSgiMjAxMC0wMS0xMCIpDQplbmQ8LVN5cy5EYXRlKCkNCg0KDQp0aWNrZXI9IGMoIkZCIiwgIkFBUEwiLCAiTVNGVCIsIkdPT0dMIikNCg0KIHAxIDwtIHRpZHlxdWFudDo6dHFfZ2V0KHRpY2tlciwgDQogICAgICAgICAgICAgICAgICAgICAgICBnZXQgPSAic3RvY2sucHJpY2VzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICBmcm9tID0gc3RhcnQsDQogICAgICAgICAgICAgICAgICAgICAgICAgdG8gPWVuZCkgJT4lDQogICAgI2ZpbHRlcihkYXRlID49IHN0YXJ0IC0gZGF5cygyICogMjApKSAlPiUNCiAgICBnZ3Bsb3QoYWVzKHggPSBkYXRlLCB5ID0gY2xvc2UsIA0KICAgICAgICAgICAgICAgb3BlbiA9IG9wZW4sIGhpZ2ggPSBoaWdoLCBsb3cgPSBsb3csIGNsb3NlID0gY2xvc2UsIA0KICAgICAgICAgICAgICAgZ3JvdXAgPSBzeW1ib2wpKSArDQogICAgZ2VvbV9iYXJjaGFydCggY29sb3VyX3VwID0gIiNGREU3MjVGRiIsDQogIGNvbG91cl9kb3duID0gIiM0NDAxNTRGRiIsDQogIGZpbGxfdXAgPSAiI0ZERTcyNUZGIiwNCiAgZmlsbF9kb3duID0gIiM0NDAxNTRGRiIpICsNCiAgICBnZW9tX2JiYW5kcyhtYV9mdW4gPSBTTUEsIHNkID0gMiwgbiA9IDUwLCBsaW5ldHlwZSA9IDUsY29sb3JfbWEgPSAiIzU1QzY2N0ZGIikgKw0KICAgIGxhYnModGl0bGUgPSAiNTAgRGF5IFNpbXBsZSBNb3ZpbmcgQXZlcmFnZSBvZiBTZXZlcmFsIFN0b2NrcyAiLCANCiAgICAgICAgIHN1YnRpdGxlID0gIkJCYW5kcyB3aXRoIFNNQSBBcHBsaWVkIiwgDQogICAgICAgICB5ID0gIkNsb3NpbmcgUHJpY2UiLCB4ID0gIiIpICsgDQogICANCiAgICBjb29yZF94X2RhdGUoeGxpbSA9IGMoc3RhcnQsIGVuZCkpICsNCiAgICBmYWNldF93cmFwKH4gc3ltYm9sLCBuY29sID0gMiwgc2NhbGVzID0gImZyZWVfeSIpICsNCiAgDQogICAgI3NjYWxlX2NvbG9yX3ZpcmlkaXNfZChvcHRpb249IkQiKSArDQogIA0KICBzY2FsZV94X2RhdGUobGFiZWxzID0gZGF0ZV9mb3JtYXQoIiVkLSVtLSVZIiksZGF0ZV9icmVha3MgPSAiMiB5ZWFyIikgKw0KICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9NDUsIGhqdXN0PTEpKSArDQogICBsYWJzKGNhcHRpb24gPSAid3d3LnJlc3RzYW5hbHl0aWNzLmNvbSIpDQoNCiAgICANCnAxDQojKGdnIDwtIGdncGxvdGx5KHAxLCB0b29sdGlwID0gInN5bWJvbCIpKQ0KI2dnPWhpZ2hsaWdodChnZywgInBsb3RseV9ob3ZlciIpDQojaHRtbHdpZGdldHM6OnNhdmVXaWRnZXQoYXNfd2lkZ2V0KGdnKSwgInAxLmh0bWwiKQ0KI2dnDQoNCmBgYA0KDQoNCg0KDQpgYGB7cn0NCg0KDQp0aWNrZXI9IGMoIkZCIiwgIkFBUEwiLCAiTVNGVCIsIkdPT0dMIikNCg0KcDIgPC0gIHRpZHlxdWFudDo6dHFfZ2V0KHRpY2tlciwgDQogICAgICAgICAgICAgICAgICAgICAgICBnZXQgPSAic3RvY2sucHJpY2VzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICBmcm9tID0gc3RhcnQsDQogICAgICAgICAgICAgICAgICAgICAgICAgdG8gPWVuZCkgJT4lDQogICAgI2ZpbHRlcihkYXRlID49IHN0YXJ0IC0gZGF5cygyICogMjApKSAlPiUNCiAgICBnZ3Bsb3QoYWVzKHggPSBkYXRlLCB5ID0gY2xvc2UsIA0KICAgICAgICAgICAgICAgb3BlbiA9IG9wZW4sIGhpZ2ggPSBoaWdoLCBsb3cgPSBsb3csIGNsb3NlID0gY2xvc2UsIA0KICAgICAgICAgICAgICAgZ3JvdXAgPSBzeW1ib2wpKSArDQogICAgZ2VvbV9iYXJjaGFydCggY29sb3VyX3VwID0gIiNGREU3MjVGRiIsDQogIGNvbG91cl9kb3duID0gIiM0NDAxNTRGRiIsDQogIGZpbGxfdXAgPSAiI0ZERTcyNUZGIiwNCiAgZmlsbF9kb3duID0gIiM0NDAxNTRGRiIpICsNCiAgICBnZW9tX2JiYW5kcyhtYV9mdW4gPSBTTUEsIHNkID0gMiwgbiA9IDEwMCwgbGluZXR5cGUgPSA1LGNvbG9yX21hID0gIiM1NUM2NjdGRiIpICsNCiAgICBsYWJzKHRpdGxlID0gIjEwMCBEYXkgU2ltcGxlIE1vdmluZyBBdmVyYWdlIG9mIFNldmVyYWwgU3RvY2tzICIsIA0KICAgICAgICAgc3VidGl0bGUgPSAiQkJhbmRzIHdpdGggU01BIEFwcGxpZWQiLCANCiAgICAgICAgIHkgPSAiQ2xvc2luZyBQcmljZSIsIHggPSAiIikgKyANCiAgIA0KICAgIGNvb3JkX3hfZGF0ZSh4bGltID0gYyhzdGFydCwgZW5kKSkgKw0KICAgIGZhY2V0X3dyYXAofiBzeW1ib2wsIG5jb2wgPSAyLCBzY2FsZXMgPSAiZnJlZV95IikgKw0KICANCiAgICAjc2NhbGVfY29sb3JfdmlyaWRpc19kKG9wdGlvbj0iRCIpICsNCiAgDQogIHNjYWxlX3hfZGF0ZShsYWJlbHMgPSBkYXRlX2Zvcm1hdCgiJWQtJW0tJVkiKSxkYXRlX2JyZWFrcyA9ICIyIHllYXIiKSArDQogIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT00NSwgaGp1c3Q9MSkpICsNCiAgIGxhYnMoY2FwdGlvbiA9ICJ3d3cucmVzdHNhbmFseXRpY3MuY29tIikNCg0KI2dnIDwtIGdncGxvdGx5KHAyLCB0b29sdGlwID0gInN5bWJvbCIpDQoNCiNnZz1oaWdobGlnaHQoZ2csICJwbG90bHlfaG92ZXIiKQ0KDQojaHRtbHdpZGdldHM6OnNhdmVXaWRnZXQoYXNfd2lkZ2V0KGdnKSwgInAyLmh0bWwiKQ0KDQpwMg0KICAgDQogICANCmBgYA0KDQo=