Clearing environment

rm(list = ls())

Loading necessary package

require(deSolve)
Loading required package: deSolve
package 㤼㸱deSolve㤼㸲 was built under R version 3.6.3
require(lhs)
Loading required package: lhs
package 㤼㸱lhs㤼㸲 was built under R version 3.6.3

System of DEs

SARSCOV2Model <- function (t, y, params) {
  
S.h <- y[1] #create local variable S, first element of y
E.h <- y[2] 
I.h <- y[3]
S.l <- y[4]
E.l <- y[5]
I.l <- y[6]
Q <- y[7]
R <- y[8]
V <- y[9]

with(
  as.list(params, y),
  {
dS.h <- -q*beta*(I.h+I.l)*S.h/(S.h+E.h+I.h+S.l+E.l+I.l+Q+R)-c*(1-exp((-1/K)*V))*S.h

Initial Values

times <- seq(0,180,by=1) 
covid.params <- c(q=0.2,beta=13,p=.2,c=0,lambda=1/4.43,b=1/0.77,g=0,gammaQ=0.1,gammaH=1/2.7,aQ=1/1.93,aH=1/2.7,h=0.00082,omega=0,delta=1,K=10000)
ystart <- c(S.h=(.2)*100000,E.h=0,I.h=1,S.l=(1-0.2)*100000,E.l=0,I.l=0,Q=0,R=0,V=0)
covid.out <- as.data.frame(lsoda(ystart,times,SARSCOV2Model,covid.params))

Creating get.size Function

get.size <- function(out) tail(out$R,1)

Latin Hypercube Sampling

h1 <- 100
set.seed(6242015)
lhs <- maximinLHS(h1,16)

Max’s & Min’s for all parameters

b.max <- 1/0.1
b.min <- 1/5
K.max <- 1000000
K.min <- 1
g.max <- 1
g.min <- 0
p.max <- 1
p.min <- 0
q.max <- 1
q.min <- 0
beta.max <- 20
beta.min <- 1
delta.max <- 1/0.1
delta.min <- 1/10
c.max <- 20
c.min <- 1
S0.max <- 100000
S0.min <- 1
omega.max <- 1
omega.min <- 0
aH.max <- 1/0.1
aH.min <- 1/10
aQ.max <- 1/0.1
aQ.min <- 1/10
h.max <- 1
h.min <- 0
gammaH.max <- 1/0.1
gammaH.min <- 1/10
gammaQ.max <- 1/0.1
gammaQ.min <- 1/15
lambda.max <- 1/0.1
lambda.min <- 1/10

Creating Parameter Sets

params.set <- cbind(
  b = lhs[,1]*(b.max-b.min)+b.min,
  K = lhs[,2]*(K.max-K.min)+K.min,
  g = lhs[,3]*(g.max-g.min)+g.min,
  p = lhs[,4]*(p.max-p.min)+p.min,
  q = lhs[,5]*(q.max-q.min)+q.min,
  beta = lhs[,6]*(beta.max-beta.min)+beta.min,
  delta = lhs[,7]*(delta.max-delta.min)+delta.min,
  c = lhs[,8]*(c.max-c.min)+c.min,
  S0 = lhs[,9]*(S0.max-S0.min)+S0.min,
  omega = lhs[,10]*(omega.max-omega.min)+omega.min,
  aH = lhs[,11]*(aH.max-aH.min)+aH.min,
  aQ = lhs[,12]*(aQ.max-aQ.min)+aQ.min,
  h = lhs[,13]*(h.max-h.min)+h.min,
  gammaH = lhs[,14]*(gammaH.max-gammaH.min)+gammaH.min,
  gammaQ = lhs[,15]*(gammaQ.max-gammaQ.min)+gammaQ.min,
  lambda = lhs[,16]*(lambda.max-lambda.min)+lambda.min
)

levels <- 15
h2 <- 25

Cycling through Different Values of T

j <- 1
data <- data.frame(matrix(rep(NA,levels*h2*18),nrow=levels*h2))
for(i in 1:h2){
  for(T in times){
    data[j,1:17] <- covid.params1 <- as.list(c(params.set[i,],T=T))
    covid.out1 <- as.data.frame(lsoda(ystart,times,SARSCOV2Model,covid.params1))
    data[j,18] <- get.size(covid.out1)
    j <- j+1
  }
}
names(data) <- c(names(covid.params1),'outbreak.size')
save(data,file='data.Rdata')

Plotting Data

load('data.Rdata')

## S.h ##
plot(times, covid.out1$S.h,type='l', ylim=c(0,2e6), lwd=3, xlab='Days', main='Susceptibles (High)', ylab='Susceptibles (High)')
points(data$T,data$outbreak.size,pch=19,cex=0.3,col='blue')


## E.h ##
plot(times, covid.out1$E.h,type='l', log = 'y', ylim=c(10,2e6), lwd=3,xlab='Days', main='Exposed (High)', ylab='Exposed (High)')
1 y value <= 0 omitted from logarithmic plot
points(data$T,data$outbreak.size,pch=19,cex=0.3,col='blue')


## I.h ##
plot(times, covid.out1$I.h,type='l', log = 'y', ylim=c(10,2e6), lwd=3,xlab='Days', main='Infected (High)', ylab='Infected (High)')
points(data$T,data$outbreak.size,pch=19,cex=0.3,col='blue')


## S.l ##
plot(times, covid.out1$S.l,type='l', log = 'y', ylim=c(10,2e6), lwd=3,xlab='Days', main='Susceptibles (Low)', ylab='Susceptibles (Low)')
points(data$T,data$outbreak.size,pch=19,cex=0.3,col='blue')


## E.l ##
plot(times, covid.out1$E.l,type='l', log = 'y', ylim=c(10,2e6), lwd=3,xlab='Days', main='Exposed (Low)', ylab='Exposed (Low)')
1 y value <= 0 omitted from logarithmic plot
points(data$T,data$outbreak.size,pch=19,cex=0.3,col='blue')


## I.l ##
plot(times, covid.out1$I.l,type='l', log = 'y', ylim=c(10,2e6), lwd=3,xlab='Days', main='Infected (Low)', ylab='Infected (Low)')
2 y values <= 0 omitted from logarithmic plot
points(data$T,data$outbreak.size,pch=19,cex=0.3,col='blue')


## Q ##
plot(times, covid.out1$Q,type='l', log = 'y', ylim=c(10,2e6), lwd=3,xlab='Days', main='Self-Isolating', ylab='Self-Isolating')
1 y value <= 0 omitted from logarithmic plot
points(data$T,data$outbreak.size,pch=19,cex=0.3,col='blue')


## R ##
plot(times, covid.out1$R,type='l', log = 'y', ylim=c(10,2e6), lwd=3,xlab='Days', main='Recovered', ylab='Recovered')
1 y value <= 0 omitted from logarithmic plot
points(data$T,data$outbreak.size,pch=19,cex=0.3,col='blue')


## V ##
plot(times, covid.out1$V,type='l', log = 'y', ylim=c(10,2e6), lwd=3,xlab='Days', main='Virus in Environment', ylab='Virus in Environment')
1 y value <= 0 omitted from logarithmic plot
points(data$T,data$outbreak.size,pch=19,cex=0.3,col='blue')

Experimenting with Random Uniform and LH Sampling

LS0tDQp0aXRsZTogIlNBUlMtQ29WLTIgTW9kZWwgKFNlbnNpdGl2aXR5IEFuYWx5c2lzKSINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCkNsZWFyaW5nIGVudmlyb25tZW50DQpgYGB7cn0NCnJtKGxpc3QgPSBscygpKQ0KYGBgDQoNCkxvYWRpbmcgbmVjZXNzYXJ5IHBhY2thZ2UNCmBgYHtyfQ0KcmVxdWlyZShkZVNvbHZlKQ0KcmVxdWlyZShsaHMpDQpgYGANCg0KU3lzdGVtIG9mIERFcw0KYGBge3J9DQpTQVJTQ09WMk1vZGVsIDwtIGZ1bmN0aW9uICh0LCB5LCBwYXJhbXMpIHsNCiAgDQpTLmggPC0geVsxXSAjY3JlYXRlIGxvY2FsIHZhcmlhYmxlIFMsIGZpcnN0IGVsZW1lbnQgb2YgeQ0KRS5oIDwtIHlbMl0gDQpJLmggPC0geVszXQ0KUy5sIDwtIHlbNF0NCkUubCA8LSB5WzVdDQpJLmwgPC0geVs2XQ0KUSA8LSB5WzddDQpSIDwtIHlbOF0NClYgPC0geVs5XQ0KDQp3aXRoKA0KICBhcy5saXN0KHBhcmFtcywgeSksDQogIHsNCmRTLmggPC0gLXEqYmV0YSooSS5oK0kubCkqUy5oLyhTLmgrRS5oK0kuaCtTLmwrRS5sK0kubCtRK1IpLWMqKDEtZXhwKCgtMS9LKSpWKSkqUy5oDQpkRS5oIDwtIHEqYmV0YSooSS5oK0kubCkqUy5oLyhTLmgrRS5oK0kuaCtTLmwrRS5sK0kubCtRK1IpK2MqKDEtZXhwKCgtMS9LKSpWKSkqUy5oLWxhbWJkYSpFLmgNCmRJLmggPC0gbGFtYmRhKkUuaC1iKmcqSS5oLWFIKmgqKDEtZykqSS5oLWdhbW1hSCooMS1oKSooMS1nKSpJLmgNCmRTLmwgPC0gLSgxLXApKnEqYmV0YSooSS5oK0kubCkqUy5sLyhTLmgrRS5oK0kuaCtTLmwrRS5sK0kubCtRK1IpLSgxLXApKmMqKDEtZXhwKCgtMS9LKSpWKSkqUy5sDQpkRS5sIDwtICgxLXApKnEqYmV0YSooSS5oK0kubCkvKFMuaCtFLmgrSS5oK1MubCtFLmwrSS5sK1ErUikrKDEtcCkqYyooMS1leHAoKC0xL0spKlYpKSpTLmwtbGFtYmRhKkUubA0KZEkubCA8LSBsYW1iZGEqRS5sLWIqSS5sDQpkUSA8LSBiKkkubCtnKmIqSS5oLWFRKmgqUS1nYW1tYVEqKDEtaCkqUQ0KZFIgPC0gZ2FtbWFIKigxLWgpKigxLWcpKkkuaCtnYW1tYVEqKDEtaCkqUQ0KZFYgPC0gb21lZ2EqSS5oKygxLXApKm9tZWdhKkkubC1kZWx0YSpWDQpkeSA8LSBjKGRTLmgsZEUuaCxkSS5oLGRTLmwsZEUubCxkSS5sLGRRLGRSLGRWKSAjY29tYmluZSByZXN1bHRzIGludG8gb25lIHZlY3RvciBkeQ0KbGlzdChkeSkNCiAgfQ0KKQ0KfQ0KYGBgDQoNCkluaXRpYWwgVmFsdWVzDQpgYGB7cn0NCnRpbWVzIDwtIHNlcSgwLDE4MCxieT0xKSANCmNvdmlkLnBhcmFtcyA8LSBjKHE9MC4yLGJldGE9MTMscD0uMixjPTAsbGFtYmRhPTEvNC40MyxiPTEvMC43NyxnPTAsZ2FtbWFRPTAuMSxnYW1tYUg9MS8yLjcsYVE9MS8xLjkzLGFIPTEvMi43LGg9MC4wMDA4MixvbWVnYT0wLGRlbHRhPTEsSz0xMDAwMCkNCnlzdGFydCA8LSBjKFMuaD0oLjIpKjEwMDAwMCxFLmg9MCxJLmg9MSxTLmw9KDEtMC4yKSoxMDAwMDAsRS5sPTAsSS5sPTAsUT0wLFI9MCxWPTApDQpjb3ZpZC5vdXQgPC0gYXMuZGF0YS5mcmFtZShsc29kYSh5c3RhcnQsdGltZXMsU0FSU0NPVjJNb2RlbCxjb3ZpZC5wYXJhbXMpKQ0KYGBgDQoNCkNyZWF0aW5nIGdldC5zaXplIEZ1bmN0aW9uDQpgYGB7cn0NCmdldC5zaXplIDwtIGZ1bmN0aW9uKG91dCkgdGFpbChvdXQkUiwxKQ0KYGBgDQoNCkxhdGluIEh5cGVyY3ViZSBTYW1wbGluZw0KYGBge3J9DQpoMSA8LSAxMDANCnNldC5zZWVkKDYyNDIwMTUpDQpsaHMgPC0gbWF4aW1pbkxIUyhoMSwxNikNCmBgYA0KDQpNYXgncyAmIE1pbidzIGZvciBhbGwgcGFyYW1ldGVycw0KYGBge3J9DQpiLm1heCA8LSAxLzAuMQ0KYi5taW4gPC0gMS81DQpLLm1heCA8LSAxMDAwMDAwDQpLLm1pbiA8LSAxDQpnLm1heCA8LSAxDQpnLm1pbiA8LSAwDQpwLm1heCA8LSAxDQpwLm1pbiA8LSAwDQpxLm1heCA8LSAxDQpxLm1pbiA8LSAwDQpiZXRhLm1heCA8LSAyMA0KYmV0YS5taW4gPC0gMQ0KZGVsdGEubWF4IDwtIDEvMC4xDQpkZWx0YS5taW4gPC0gMS8xMA0KYy5tYXggPC0gMjANCmMubWluIDwtIDENClMwLm1heCA8LSAxMDAwMDANClMwLm1pbiA8LSAxDQpvbWVnYS5tYXggPC0gMQ0Kb21lZ2EubWluIDwtIDANCmFILm1heCA8LSAxLzAuMQ0KYUgubWluIDwtIDEvMTANCmFRLm1heCA8LSAxLzAuMQ0KYVEubWluIDwtIDEvMTANCmgubWF4IDwtIDENCmgubWluIDwtIDANCmdhbW1hSC5tYXggPC0gMS8wLjENCmdhbW1hSC5taW4gPC0gMS8xMA0KZ2FtbWFRLm1heCA8LSAxLzAuMQ0KZ2FtbWFRLm1pbiA8LSAxLzE1DQpsYW1iZGEubWF4IDwtIDEvMC4xDQpsYW1iZGEubWluIDwtIDEvMTANCmBgYA0KDQpDcmVhdGluZyBQYXJhbWV0ZXIgU2V0cw0KYGBge3J9DQpwYXJhbXMuc2V0IDwtIGNiaW5kKA0KICBiID0gbGhzWywxXSooYi5tYXgtYi5taW4pK2IubWluLA0KICBLID0gbGhzWywyXSooSy5tYXgtSy5taW4pK0subWluLA0KICBnID0gbGhzWywzXSooZy5tYXgtZy5taW4pK2cubWluLA0KICBwID0gbGhzWyw0XSoocC5tYXgtcC5taW4pK3AubWluLA0KICBxID0gbGhzWyw1XSoocS5tYXgtcS5taW4pK3EubWluLA0KICBiZXRhID0gbGhzWyw2XSooYmV0YS5tYXgtYmV0YS5taW4pK2JldGEubWluLA0KICBkZWx0YSA9IGxoc1ssN10qKGRlbHRhLm1heC1kZWx0YS5taW4pK2RlbHRhLm1pbiwNCiAgYyA9IGxoc1ssOF0qKGMubWF4LWMubWluKStjLm1pbiwNCiAgUzAgPSBsaHNbLDldKihTMC5tYXgtUzAubWluKStTMC5taW4sDQogIG9tZWdhID0gbGhzWywxMF0qKG9tZWdhLm1heC1vbWVnYS5taW4pK29tZWdhLm1pbiwNCiAgYUggPSBsaHNbLDExXSooYUgubWF4LWFILm1pbikrYUgubWluLA0KICBhUSA9IGxoc1ssMTJdKihhUS5tYXgtYVEubWluKSthUS5taW4sDQogIGggPSBsaHNbLDEzXSooaC5tYXgtaC5taW4pK2gubWluLA0KICBnYW1tYUggPSBsaHNbLDE0XSooZ2FtbWFILm1heC1nYW1tYUgubWluKStnYW1tYUgubWluLA0KICBnYW1tYVEgPSBsaHNbLDE1XSooZ2FtbWFRLm1heC1nYW1tYVEubWluKStnYW1tYVEubWluLA0KICBsYW1iZGEgPSBsaHNbLDE2XSoobGFtYmRhLm1heC1sYW1iZGEubWluKStsYW1iZGEubWluDQopDQoNCmxldmVscyA8LSAxNQ0KaDIgPC0gMjUNCmBgYA0KDQpDeWNsaW5nIHRocm91Z2ggRGlmZmVyZW50IFZhbHVlcyBvZiBUDQpgYGB7cn0NCmogPC0gMQ0KZGF0YSA8LSBkYXRhLmZyYW1lKG1hdHJpeChyZXAoTkEsbGV2ZWxzKmgyKjE4KSxucm93PWxldmVscypoMikpDQpmb3IoaSBpbiAxOmgyKXsNCiAgZm9yKFQgaW4gdGltZXMpew0KICAgIGRhdGFbaiwxOjE3XSA8LSBjb3ZpZC5wYXJhbXMxIDwtIGFzLmxpc3QoYyhwYXJhbXMuc2V0W2ksXSxUPVQpKQ0KICAgIGNvdmlkLm91dDEgPC0gYXMuZGF0YS5mcmFtZShsc29kYSh5c3RhcnQsdGltZXMsU0FSU0NPVjJNb2RlbCxjb3ZpZC5wYXJhbXMxKSkNCiAgICBkYXRhW2osMThdIDwtIGdldC5zaXplKGNvdmlkLm91dDEpDQogICAgaiA8LSBqKzENCiAgfQ0KfQ0KbmFtZXMoZGF0YSkgPC0gYyhuYW1lcyhjb3ZpZC5wYXJhbXMxKSwnb3V0YnJlYWsuc2l6ZScpDQpzYXZlKGRhdGEsZmlsZT0nZGF0YS5SZGF0YScpDQpgYGANCg0KUGxvdHRpbmcgRGF0YQ0KYGBge3J9DQpsb2FkKCdkYXRhLlJkYXRhJykNCg0KIyMgUy5oICMjDQpwbG90KHRpbWVzLCBjb3ZpZC5vdXQxJFMuaCx0eXBlPSdsJywgbG9nID0gJ3knLCB5bGltPWMoMTAsMmU2KSwgbHdkPTMsIHhsYWI9J0RheXMnLCBtYWluPSdTdXNjZXB0aWJsZXMgKEhpZ2gpJywgeWxhYj0nU3VzY2VwdGlibGVzIChIaWdoKScpDQpwb2ludHMoZGF0YSRULGRhdGEkb3V0YnJlYWsuc2l6ZSxwY2g9MTksY2V4PTAuMyxjb2w9J2JsdWUnKQ0KDQojIyBFLmggIyMNCnBsb3QodGltZXMsIGNvdmlkLm91dDEkRS5oLHR5cGU9J2wnLCBsb2cgPSAneScsIHlsaW09YygxMCwyZTYpLCBsd2Q9Myx4bGFiPSdEYXlzJywgbWFpbj0nRXhwb3NlZCAoSGlnaCknLCB5bGFiPSdFeHBvc2VkIChIaWdoKScpDQpwb2ludHMoZGF0YSRULGRhdGEkb3V0YnJlYWsuc2l6ZSxwY2g9MTksY2V4PTAuMyxjb2w9J2JsdWUnKQ0KDQojIyBJLmggIyMNCnBsb3QodGltZXMsIGNvdmlkLm91dDEkSS5oLHR5cGU9J2wnLCBsb2cgPSAneScsIHlsaW09YygxMCwyZTYpLCBsd2Q9Myx4bGFiPSdEYXlzJywgbWFpbj0nSW5mZWN0ZWQgKEhpZ2gpJywgeWxhYj0nSW5mZWN0ZWQgKEhpZ2gpJykNCnBvaW50cyhkYXRhJFQsZGF0YSRvdXRicmVhay5zaXplLHBjaD0xOSxjZXg9MC4zLGNvbD0nYmx1ZScpDQoNCiMjIFMubCAjIw0KcGxvdCh0aW1lcywgY292aWQub3V0MSRTLmwsdHlwZT0nbCcsIGxvZyA9ICd5JywgeWxpbT1jKDEwLDJlNiksIGx3ZD0zLHhsYWI9J0RheXMnLCBtYWluPSdTdXNjZXB0aWJsZXMgKExvdyknLCB5bGFiPSdTdXNjZXB0aWJsZXMgKExvdyknKQ0KcG9pbnRzKGRhdGEkVCxkYXRhJG91dGJyZWFrLnNpemUscGNoPTE5LGNleD0wLjMsY29sPSdibHVlJykNCg0KIyMgRS5sICMjDQpwbG90KHRpbWVzLCBjb3ZpZC5vdXQxJEUubCx0eXBlPSdsJywgbG9nID0gJ3knLCB5bGltPWMoMTAsMmU2KSwgbHdkPTMseGxhYj0nRGF5cycsIG1haW49J0V4cG9zZWQgKExvdyknLCB5bGFiPSdFeHBvc2VkIChMb3cpJykNCnBvaW50cyhkYXRhJFQsZGF0YSRvdXRicmVhay5zaXplLHBjaD0xOSxjZXg9MC4zLGNvbD0nYmx1ZScpDQoNCiMjIEkubCAjIw0KcGxvdCh0aW1lcywgY292aWQub3V0MSRJLmwsdHlwZT0nbCcsIGxvZyA9ICd5JywgeWxpbT1jKDEwLDJlNiksIGx3ZD0zLHhsYWI9J0RheXMnLCBtYWluPSdJbmZlY3RlZCAoTG93KScsIHlsYWI9J0luZmVjdGVkIChMb3cpJykNCnBvaW50cyhkYXRhJFQsZGF0YSRvdXRicmVhay5zaXplLHBjaD0xOSxjZXg9MC4zLGNvbD0nYmx1ZScpDQoNCiMjIFEgIyMNCnBsb3QodGltZXMsIGNvdmlkLm91dDEkUSx0eXBlPSdsJywgbG9nID0gJ3knLCB5bGltPWMoMTAsMmU2KSwgbHdkPTMseGxhYj0nRGF5cycsIG1haW49J1NlbGYtSXNvbGF0aW5nJywgeWxhYj0nU2VsZi1Jc29sYXRpbmcnKQ0KcG9pbnRzKGRhdGEkVCxkYXRhJG91dGJyZWFrLnNpemUscGNoPTE5LGNleD0wLjMsY29sPSdibHVlJykNCg0KIyMgUiAjIw0KcGxvdCh0aW1lcywgY292aWQub3V0MSRSLHR5cGU9J2wnLCBsb2cgPSAneScsIHlsaW09YygxMCwyZTYpLCBsd2Q9Myx4bGFiPSdEYXlzJywgbWFpbj0nUmVjb3ZlcmVkJywgeWxhYj0nUmVjb3ZlcmVkJykNCnBvaW50cyhkYXRhJFQsZGF0YSRvdXRicmVhay5zaXplLHBjaD0xOSxjZXg9MC4zLGNvbD0nYmx1ZScpDQoNCiMjIFYgIyMNCnBsb3QodGltZXMsIGNvdmlkLm91dDEkVix0eXBlPSdsJywgbG9nID0gJ3knLCB5bGltPWMoMTAsMmU2KSwgbHdkPTMseGxhYj0nRGF5cycsIG1haW49J1ZpcnVzIGluIEVudmlyb25tZW50JywgeWxhYj0nVmlydXMgaW4gRW52aXJvbm1lbnQnKQ0KcG9pbnRzKGRhdGEkVCxkYXRhJG91dGJyZWFrLnNpemUscGNoPTE5LGNleD0wLjMsY29sPSdibHVlJykNCmBgYA0KDQpFeHBlcmltZW50aW5nIHdpdGggUmFuZG9tIFVuaWZvcm0gYW5kIExIIFNhbXBsaW5nDQpgYGB7cn0NCiMjIGIgIyMNCnBhcihtZnJvdz1jKDEsMikpDQpwbG90KHNlcSgxLGxlbmd0aChwYXJhbXMuc2V0WywxXSksYnk9MSkscGFyYW1zLnNldFssMV0sbWFpbj0nUmFuZG9tIFVuaWZvcm0nLHhsYWI9JycseWxhYj0nJykNCnBsb3QobGhzWywxXSx0eXBlPSdwJyxtYWluPSdMSCBTYW1wbGluZycseGxhYj0nJyx5bGFiPScnKQ0KDQojIyBLICMjDQpwYXIobWZyb3c9YygxLDIpKQ0KcGxvdChzZXEoMSxsZW5ndGgocGFyYW1zLnNldFssMl0pLGJ5PTEpLHBhcmFtcy5zZXRbLDJdLG1haW49J1JhbmRvbSBVbmlmb3JtJyx4bGFiPScnLHlsYWI9JycpDQpwbG90KGxoc1ssMl0sdHlwZT0ncCcsbWFpbj0nTEggU2FtcGxpbmcnLHhsYWI9JycseWxhYj0nJykNCg0KIyMgZyAjIw0KcGFyKG1mcm93PWMoMSwyKSkNCnBsb3Qoc2VxKDEsbGVuZ3RoKHBhcmFtcy5zZXRbLDNdKSxieT0xKSxwYXJhbXMuc2V0WywzXSxtYWluPSdSYW5kb20gVW5pZm9ybScseGxhYj0nJyx5bGFiPScnKQ0KcGxvdChsaHNbLDNdLHR5cGU9J3AnLG1haW49J0xIIFNhbXBsaW5nJyx4bGFiPScnLHlsYWI9JycpDQoNCiMjIHAgIyMNCnBhcihtZnJvdz1jKDEsMikpDQpwbG90KHNlcSgxLGxlbmd0aChwYXJhbXMuc2V0Wyw0XSksYnk9MSkscGFyYW1zLnNldFssNF0sbWFpbj0nUmFuZG9tIFVuaWZvcm0nLHhsYWI9JycseWxhYj0nJykNCnBsb3QobGhzWyw0XSx0eXBlPSdwJyxtYWluPSdMSCBTYW1wbGluZycseGxhYj0nJyx5bGFiPScnKQ0KDQojIyBxICMjDQpwYXIobWZyb3c9YygxLDIpKQ0KcGxvdChzZXEoMSxsZW5ndGgocGFyYW1zLnNldFssNV0pLGJ5PTEpLHBhcmFtcy5zZXRbLDVdLG1haW49J1JhbmRvbSBVbmlmb3JtJyx4bGFiPScnLHlsYWI9JycpDQpwbG90KGxoc1ssNV0sdHlwZT0ncCcsbWFpbj0nTEggU2FtcGxpbmcnLHhsYWI9JycseWxhYj0nJykNCg0KIyMgYmV0YSAjIw0KcGFyKG1mcm93PWMoMSwyKSkNCnBsb3Qoc2VxKDEsbGVuZ3RoKHBhcmFtcy5zZXRbLDZdKSxieT0xKSxwYXJhbXMuc2V0Wyw2XSxtYWluPSdSYW5kb20gVW5pZm9ybScseGxhYj0nJyx5bGFiPScnKQ0KcGxvdChsaHNbLDZdLHR5cGU9J3AnLG1haW49J0xIIFNhbXBsaW5nJyx4bGFiPScnLHlsYWI9JycpDQoNCiMjIGRlbHRhICMjDQpwYXIobWZyb3c9YygxLDIpKQ0KcGxvdChzZXEoMSxsZW5ndGgocGFyYW1zLnNldFssN10pLGJ5PTEpLHBhcmFtcy5zZXRbLDddLG1haW49J1JhbmRvbSBVbmlmb3JtJyx4bGFiPScnLHlsYWI9JycpDQpwbG90KGxoc1ssN10sdHlwZT0ncCcsbWFpbj0nTEggU2FtcGxpbmcnLHhsYWI9JycseWxhYj0nJykNCg0KIyMgYyAjIw0KcGFyKG1mcm93PWMoMSwyKSkNCnBsb3Qoc2VxKDEsbGVuZ3RoKHBhcmFtcy5zZXRbLDhdKSxieT0xKSxwYXJhbXMuc2V0Wyw4XSxtYWluPSdSYW5kb20gVW5pZm9ybScseGxhYj0nJyx5bGFiPScnKQ0KcGxvdChsaHNbLDhdLHR5cGU9J3AnLG1haW49J0xIIFNhbXBsaW5nJyx4bGFiPScnLHlsYWI9JycpDQoNCiMjIFMwICMjDQpwYXIobWZyb3c9YygxLDIpKQ0KcGxvdChzZXEoMSxsZW5ndGgocGFyYW1zLnNldFssOV0pLGJ5PTEpLHBhcmFtcy5zZXRbLDldLG1haW49J1JhbmRvbSBVbmlmb3JtJyx4bGFiPScnLHlsYWI9JycpDQpwbG90KGxoc1ssOV0sdHlwZT0ncCcsbWFpbj0nTEggU2FtcGxpbmcnLHhsYWI9JycseWxhYj0nJykNCg0KIyMgb21lZ2EgIyMNCnBhcihtZnJvdz1jKDEsMikpDQpwbG90KHNlcSgxLGxlbmd0aChwYXJhbXMuc2V0WywxMF0pLGJ5PTEpLHBhcmFtcy5zZXRbLDEwXSxtYWluPSdSYW5kb20gVW5pZm9ybScseGxhYj0nJyx5bGFiPScnKQ0KcGxvdChsaHNbLDEwXSx0eXBlPSdwJyxtYWluPSdMSCBTYW1wbGluZycseGxhYj0nJyx5bGFiPScnKQ0KDQojIyBhSCAjIw0KcGFyKG1mcm93PWMoMSwyKSkNCnBsb3Qoc2VxKDEsbGVuZ3RoKHBhcmFtcy5zZXRbLDExXSksYnk9MSkscGFyYW1zLnNldFssMTFdLG1haW49J1JhbmRvbSBVbmlmb3JtJyx4bGFiPScnLHlsYWI9JycpDQpwbG90KGxoc1ssMTFdLHR5cGU9J3AnLG1haW49J0xIIFNhbXBsaW5nJyx4bGFiPScnLHlsYWI9JycpDQoNCiMjIGFRICMjDQpwYXIobWZyb3c9YygxLDIpKQ0KcGxvdChzZXEoMSxsZW5ndGgocGFyYW1zLnNldFssMTJdKSxieT0xKSxwYXJhbXMuc2V0WywxMl0sbWFpbj0nUmFuZG9tIFVuaWZvcm0nLHhsYWI9JycseWxhYj0nJykNCnBsb3QobGhzWywxMl0sdHlwZT0ncCcsbWFpbj0nTEggU2FtcGxpbmcnLHhsYWI9JycseWxhYj0nJykNCg0KIyMgaCAjIw0KcGFyKG1mcm93PWMoMSwyKSkNCnBsb3Qoc2VxKDEsbGVuZ3RoKHBhcmFtcy5zZXRbLDEzXSksYnk9MSkscGFyYW1zLnNldFssMTNdLG1haW49J1JhbmRvbSBVbmlmb3JtJyx4bGFiPScnLHlsYWI9JycpDQpwbG90KGxoc1ssMTNdLHR5cGU9J3AnLG1haW49J0xIIFNhbXBsaW5nJyx4bGFiPScnLHlsYWI9JycpDQoNCiMjIGdhbW1hSCAjIw0KcGFyKG1mcm93PWMoMSwyKSkNCnBsb3Qoc2VxKDEsbGVuZ3RoKHBhcmFtcy5zZXRbLDE0XSksYnk9MSkscGFyYW1zLnNldFssMTRdLG1haW49J1JhbmRvbSBVbmlmb3JtJyx4bGFiPScnLHlsYWI9JycpDQpwbG90KGxoc1ssMTRdLHR5cGU9J3AnLG1haW49J0xIIFNhbXBsaW5nJyx4bGFiPScnLHlsYWI9JycpDQoNCiMjIGdhbW1hUSAjIw0KcGFyKG1mcm93PWMoMSwyKSkNCnBsb3Qoc2VxKDEsbGVuZ3RoKHBhcmFtcy5zZXRbLDE1XSksYnk9MSkscGFyYW1zLnNldFssMTVdLG1haW49J1JhbmRvbSBVbmlmb3JtJyx4bGFiPScnLHlsYWI9JycpDQpwbG90KGxoc1ssMTVdLHR5cGU9J3AnLG1haW49J0xIIFNhbXBsaW5nJyx4bGFiPScnLHlsYWI9JycpDQoNCiMjbGFtYmRhICMjDQpwYXIobWZyb3c9YygxLDIpKQ0KcGxvdChzZXEoMSxsZW5ndGgocGFyYW1zLnNldFssMTZdKSxieT0xKSxwYXJhbXMuc2V0WywxNl0sbWFpbj0nUmFuZG9tIFVuaWZvcm0nLHhsYWI9JycseWxhYj0nJykNCnBsb3QobGhzWywxNl0sdHlwZT0ncCcsbWFpbj0nTEggU2FtcGxpbmcnLHhsYWI9JycseWxhYj0nJykNCmBgYA==