Clearing environment

rm(list = ls())

Loading necessary package

require(deSolve)

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
dE.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-lambda*E.h
dI.h<-lambda*E.h-b*g*I.h-aH*h*(1-g)*I.h-gammah*(1-h)*(1-g)*I.h
dS.l<--(1-p)*q*beta*(I.h+I.l)*S.l/(S.h+E.h+I.h+S.l+E.l+I.l+Q+R)-(1-p)*c*(1-exp((-1/K)*V))*S.l
dE.l<-(1-p)*q*beta*(I.h+I.l)/(S.h+E.h+I.h+S.l+E.l+I.l+Q+R)+(1-p)*c*(1-exp((-1/K)*V))*S.l-lambda*E.l
dI.l<-lambda*E.l-b*I.l
dQ<-b*I.l+g*b*I.h-aQ*h*Q-gammaQ*(1-h)*Q
dR<-gammah*(1-h)*(1-g)*I.h+gammaQ*(1-h)*Q
dV<-omega*I.h+(1-p)*omega*I.l-delta*V
  dy<-c(dS.h,dE.h,dI.h,dS.l,dE.l,dI.l,dQ,dR,dV) #combine results into one vector dy
list(dy)
  }
)
}

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))

Changing K to 1000, 10000, 100000, & 1000000

covid.params.k1 <- c(q=0.5,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=1000)
covid.params.k2 <- c(q=0.5,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)
covid.params.k3 <- c(q=0.5,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=100000)
covid.params.k4 <- c(q=0.5,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=1000000)

Creating data frame for each value of k

covid.out.k1 <- as.data.frame(lsoda(ystart,times,SARSCOV2Model,covid.params.k1))
covid.out.k2 <- as.data.frame(lsoda(ystart,times,SARSCOV2Model,covid.params.k2))
covid.out.k3 <- as.data.frame(lsoda(ystart,times,SARSCOV2Model,covid.params.k3))
covid.out.k4 <- as.data.frame(lsoda(ystart,times,SARSCOV2Model,covid.params.k4))

Plotting S.h, S.l, E.h, & E.l

## SUSCEPTIBLES ##
op1 <- par(fig=c(0,0.5,0,1), mar=c(4,4,1,1))
plot(covid.out.k1$S.h~covid.out.k1$time,type="l", col="blue", xlab="Days", ylab = "Susceptible (High)")
lines(covid.out.k2$S.h~covid.out.k2$time, col="red")
lines(covid.out.k3$S.h~covid.out.k3$time, col="purple")
lines(covid.out.k4$S.h~covid.out.k4$time, col="green")
legend(80, 17500,legend = c("K = 1,000","K = 10,000","K = 100,000","K = 1,000,000"), col = c("blue", "red", "purple", "green"), lty=1, cex=0.8)

par(fig=c(0.5,1,0,1), mar=c(4,4,1,1), new=T)
plot(covid.out.k1$S.l~covid.out.k1$time,type="l", col="blue", xlab="Days", ylab = "Susceptible (Low)")
lines(covid.out.k2$S.l~covid.out.k2$time, col="red")
lines(covid.out.k3$S.l~covid.out.k3$time, col="purple")
lines(covid.out.k4$S.l~covid.out.k4$time, col="green")
legend(80, 70000,legend = c("K = 1,000","K = 10,000","K = 100,000","K = 1,000,000"), col = c("blue", "red", "purple", "green"), lty=1, cex=0.8)
par(op1)

## EXPOSED ##
op2 <- par(fig=c(0,0.5,0,1), mar=c(4,4,1,1))

plot(covid.out.k1$E.h~covid.out.k1$time,type="l", col="blue", xlab="Days", ylab = "Exposed (High)", ylim=c(0,7100))
lines(covid.out.k2$E.h~covid.out.k2$time, col="red")
lines(covid.out.k3$E.h~covid.out.k3$time, col="purple")
lines(covid.out.k4$E.h~covid.out.k4$time, col="green")
legend(80, 6000,legend = c("K = 1,000","K = 10,000","K = 100,000","K = 1,000,000"), col = c("blue", "red", "purple", "green"), lty=1, cex=0.8)

par(fig=c(0.5,1,0,1), mar=c(4,4,1,1), new=T)
plot(covid.out.k1$E.l~covid.out.k1$time,type="l", col="blue", xlab="Days", ylab = "Exposed (Low)", ylim=c(0,3))
lines(covid.out.k2$E.l~covid.out.k2$time, col="red")
lines(covid.out.k3$E.l~covid.out.k3$time, col="purple")
lines(covid.out.k4$E.l~covid.out.k4$time, col="green")
legend(80, 2.5,legend = c("K = 1,000","K = 10,000","K = 100,000","K = 1,000,000"), col = c("blue", "red", "purple", "green"), lty=1, cex=0.8)
par(op2)

## INFECTED ##
op3 <- par(fig=c(0,0.5,0,1), mar=c(4,4,1,1))

plot(covid.out.k1$I.h~covid.out.k1$time,type="l", col="blue", xlab="Days", ylab = "Infected (High)")
lines(covid.out.k2$I.h~covid.out.k2$time, col="red")
lines(covid.out.k3$I.h~covid.out.k3$time, col="purple")
lines(covid.out.k4$I.h~covid.out.k4$time, col="green")
legend(80, 3000,legend = c("K = 1,000","K = 10,000","K = 100,000","K = 1,000,000"), col = c("blue", "red", "purple", "green"), lty=1, cex=0.8)

par(fig=c(0.5,1,0,1), mar=c(4,4,1,1), new=T)
plot(covid.out.k1$I.l~covid.out.k1$time,type="l", col="blue", xlab="Days", ylab = "Infected (Low)")
lines(covid.out.k2$I.l~covid.out.k2$time, col="red")
lines(covid.out.k3$I.l~covid.out.k3$time, col="purple")
lines(covid.out.k4$I.l~covid.out.k4$time, col="green")
legend(80, 0.4,legend = c("K = 1,000","K = 10,000","K = 100,000","K = 1,000,000"), col = c("blue", "red", "purple", "green"), lty=1, cex=0.8)
par(op3)

## SELF-ISOLATING ##
op4 <- par(mar=c(6,6,2,2))

plot(covid.out.k1$Q~covid.out.k1$time,type="l", col="blue", xlab="Days", ylab = "Self-Isolating")
lines(covid.out.k2$Q~covid.out.k2$time, col="red")
lines(covid.out.k3$Q~covid.out.k3$time, col="purple")
lines(covid.out.k4$Q~covid.out.k4$time, col="green")
legend(125, 3,legend = c("K = 1,000","K = 10,000","K = 100,000","K = 1,000,000"), col = c("blue", "red", "purple", "green"), lty=1, cex=0.8)
par(op4)

## RECOVERED ##
op5 <- par(mar=c(6,6,2,2))

plot(covid.out.k1$R~covid.out.k1$time,type="l", col="blue", xlab="Days", ylab = "Recovered")
lines(covid.out.k2$R~covid.out.k2$time, col="red")
lines(covid.out.k3$R~covid.out.k3$time, col="purple")
lines(covid.out.k4$R~covid.out.k4$time, col="green")
legend(100, 15000,legend = c("K = 1,000","K = 10,000","K = 100,000","K = 1,000,000"), col = c("blue", "red", "purple", "green"), lty=1, cex=0.8)
par(op5)

## VIRUS IN ENVIRONMENT ##
op6 <- par(mar=c(6,6,2,2))

plot(covid.out.k1$V~covid.out.k1$time,type="l", col="blue", xlab="Days", ylab = "Virus in Environment")
lines(covid.out.k2$V~covid.out.k2$time, col="red")
lines(covid.out.k3$V~covid.out.k3$time, col="purple")
lines(covid.out.k4$V~covid.out.k4$time, col="green")
legend(100, 15000,legend = c("K = 1,000","K = 10,000","K = 100,000","K = 1,000,000"), col = c("blue", "red", "purple", "green"), lty=1, cex=0.8)
par(op6)

Results of Plots

# first dataframe lists highest values
# second dataframe lists lowest values
# third dataframe lists ending values

results.k1 <- data.frame(
  S.h = c(max(covid.out.k1[ ,2]), max(covid.out.k2[ ,2]), max(covid.out.k3[ ,2]), max(covid.out.k4[ ,2])),
  E.h = c(max(covid.out.k1[ ,3]), max(covid.out.k2[ ,3]), max(covid.out.k3[ ,3]), max(covid.out.k4[ ,3])),
  I.h = c(max(covid.out.k1[ ,4]), max(covid.out.k2[ ,4]), max(covid.out.k3[ ,4]), max(covid.out.k4[ ,4])),
  S.l = c(max(covid.out.k1[ ,5]), max(covid.out.k2[ ,5]), max(covid.out.k3[ ,5]), max(covid.out.k4[ ,5])),
  E.l = c(max(covid.out.k1[ ,6]), max(covid.out.k2[ ,6]), max(covid.out.k3[ ,6]), max(covid.out.k4[ ,6])),
  I.l = c(max(covid.out.k1[ ,7]), max(covid.out.k2[ ,7]), max(covid.out.k3[ ,7]), max(covid.out.k4[ ,7])),
  Q = c(max(covid.out.k1[ ,8]), max(covid.out.k2[ ,8]), max(covid.out.k3[ ,8]), max(covid.out.k4[ ,8])),
  R = c(max(covid.out.k1[ ,9]), max(covid.out.k2[ ,9]), max(covid.out.k3[ ,9]), max(covid.out.k4[ ,9])),
  V = c(max(covid.out.k1[ ,10]), max(covid.out.k2[ ,10]), max(covid.out.k3[ ,10]), max(covid.out.k4[ ,10]))
)

results.k2 <- data.frame(
  S.h = c(min(covid.out.k1[ ,2]), min(covid.out.k2[ ,2]), min(covid.out.k3[ ,2]), min(covid.out.k4[ ,2])),
  E.h = c(min(covid.out.k1[ ,3]), min(covid.out.k2[ ,3]), min(covid.out.k3[ ,3]), min(covid.out.k4[ ,3])),
  I.h = c(min(covid.out.k1[ ,4]), min(covid.out.k2[ ,4]), min(covid.out.k3[ ,4]), min(covid.out.k4[ ,4])),
  S.l = c(min(covid.out.k1[ ,5]), min(covid.out.k2[ ,5]), min(covid.out.k3[ ,5]), min(covid.out.k4[ ,5])),
  E.l = c(min(covid.out.k1[ ,6]), min(covid.out.k2[ ,6]), min(covid.out.k3[ ,6]), min(covid.out.k4[ ,6])),
  I.l = c(min(covid.out.k1[ ,7]), min(covid.out.k2[ ,7]), min(covid.out.k3[ ,7]), min(covid.out.k4[ ,7])),
  Q = c(min(covid.out.k1[ ,8]), min(covid.out.k2[ ,8]), min(covid.out.k3[ ,8]), min(covid.out.k4[ ,8])),
  R = c(min(covid.out.k1[ ,9]), min(covid.out.k2[ ,9]), min(covid.out.k3[ ,9]), min(covid.out.k4[ ,9])),
  V = c(min(covid.out.k1[ ,10]), min(covid.out.k2[ ,10]), min(covid.out.k3[ ,10]), min(covid.out.k4[ ,10]))
)

results.k3 <- data.frame(
  S.h = c(tail(covid.out.k1[ ,2],n=1), tail(covid.out.k2[ ,2],n=1), tail(covid.out.k3[ ,2],n=1), tail(covid.out.k4[ ,2],n=1)), 
  E.h = c(tail(covid.out.k1[ ,3],n=1), tail(covid.out.k2[ ,3],n=1), tail(covid.out.k3[ ,3],n=1), tail(covid.out.k4[ ,3],n=1)),
  I.h = c(tail(covid.out.k1[ ,4],n=1), tail(covid.out.k2[ ,4],n=1), tail(covid.out.k3[ ,4],n=1), tail(covid.out.k4[ ,4],n=1)),
  S.l = c(tail(covid.out.k1[ ,5],n=1), tail(covid.out.k2[ ,5],n=1), tail(covid.out.k3[ ,5],n=1), tail(covid.out.k4[ ,5],n=1)),
  E.l = c(tail(covid.out.k1[ ,6],n=1), tail(covid.out.k2[ ,6],n=1), tail(covid.out.k3[ ,6],n=1), tail(covid.out.k4[ ,6],n=1)), 
  I.l = c(tail(covid.out.k1[ ,7],n=1), tail(covid.out.k2[ ,7],n=1), tail(covid.out.k3[ ,7],n=1), tail(covid.out.k4[ ,7],n=1)),
  Q = c(tail(covid.out.k1[ ,8],n=1), tail(covid.out.k2[ ,8],n=1), tail(covid.out.k3[ ,8],n=1), tail(covid.out.k4[ ,8],n=1)),
  R = c(tail(covid.out.k1[ ,9],n=1), tail(covid.out.k2[ ,9],n=1), tail(covid.out.k3[ ,9],n=1), tail(covid.out.k4[ ,9],n=1)),
  V = c(tail(covid.out.k1[ ,10],n=1), tail(covid.out.k2[ ,10],n=1), tail(covid.out.k3[ ,10],n=1), tail(covid.out.k4[ ,10],n=1))
)

`.rowNamesDF<-`(results.k1,make.names=FALSE,c('K = 1,000','K = 10,000','K = 100,000','K = 1,000,000'))
`.rowNamesDF<-`(results.k2,make.names=FALSE,c('K = 1,000','K = 10,000','K = 100,000','K = 1,000,000'))
`.rowNamesDF<-`(results.k3,make.names=FALSE,c('K = 1,000','K = 10,000','K = 100,000','K = 1,000,000'))

Plotting highest, lowest, and ending values of classes

## HIGHEST ##
op7 <- par(mar=c(6,6,2,2))
plot(results.k1$S.h,type="b", col="blue", xlab="q values", ylab = "Individuals", main="Highest", ylim=c(0,80000))
lines(results.k1$E.h, type = "b", col="red")
lines(results.k1$I.h, type = "b", col="green")
lines(results.k1$S.l, type = "b", col="purple")
lines(results.k1$E.l, type = "b", col="orange")
lines(results.k1$I.l, type = "b", col="forestgreen")
lines(results.k1$Q, type = "b", col="darkturquoise")
lines(results.k1$R, type = "b", col="pink2")
lines(results.k1$V, type = "b", col="yellow")

legend(3, 70000,legend = c("Susceptibles (High)","Exposed (High)","Infected (High)","Susceptibles (Low)","Exposed (Low)","Infected (Low)", "Self-Isolating","Recovered","Virus"), col = c("blue", "red", "green","purple","orange","forestgreen","darkturquoise","pink2","yellow"), lty=1, cex=0.6)

par(op7)

## LOWEST
op8 <- par(mar=c(6,6,2,2))

plot(results.k2$S.h,type="b", col="blue", main="Lowest", xlab="q values", ylab = "Individuals", ylim=c(0,80000))
lines(results.k2$E.h, type = "b", col="red")
lines(results.k2$I.h, type = "b", col="green")
lines(results.k2$S.l, type = "b", col="purple")
lines(results.k2$E.l, type = "b", col="orange")
lines(results.k2$I.l, type = "b", col="forestgreen")
lines(results.k2$Q, type = "b", col="darkturquoise")
lines(results.k2$R, type = "b", col="pink2")
lines(results.k2$V, type = "b", col="yellow")

legend(3, 70000,legend = c("Susceptibles (High)","Exposed (High)","Infected (High)","Susceptibles (Low)","Exposed (Low)","Infected (Low)", "Self-Isolating","Recovered","Virus"), col = c("blue", "red", "green","purple","orange","forestgreen","darkturquoise","pink2","yellow"), lty=1, cex=0.6)

par(op8)

## ENDING ##
op9 <- par(mar=c(6,6,2,2))

plot(results.k3$S.h, type="b", col="blue", main="Ending", xlab="q values", ylab = "Individuals", ylim=c(0,80000))
lines(results.k3$E.h, type = "b", col="red")
lines(results.k3$I.h, type = "b", col="green")
lines(results.k3$S.l, type = "b", col="purple")
lines(results.k3$E.l, type = "b", col="orange")
lines(results.k3$I.l, type = "b", col="forestgreen")
lines(results.k3$Q, type = "b", col="darkturquoise")
lines(results.k3$R, type = "b", col="pink2")
lines(results.k3$V, type = "b", col="yellow")

legend(3, 70000,legend = c("Susceptibles (High)","Exposed (High)","Infected (High)","Susceptibles (Low)","Exposed (Low)","Infected (Low)", "Self-Isolating","Recovered","Virus"), col = c("blue", "red", "green","purple","orange","forestgreen","darkturquoise","pink2","yellow"), lty=1, cex=0.6)

par(op9)

LS0tDQp0aXRsZTogIlNBUlMtQ29WLTIgTW9kZWwgKEspIg0KYXV0aG9yOiBTaGVyaWRhbiBQYXluZQ0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCkNsZWFyaW5nIGVudmlyb25tZW50DQpgYGB7cn0NCnJtKGxpc3QgPSBscygpKQ0KYGBgDQoNCkxvYWRpbmcgbmVjZXNzYXJ5IHBhY2thZ2UNCmBgYHtyfQ0KcmVxdWlyZShkZVNvbHZlKQ0KYGBgDQoNClN5c3RlbSBvZiBERXMNCmBgYHtyfQ0KU0FSU0NPVjJNb2RlbCA8LSBmdW5jdGlvbiAodCwgeSwgcGFyYW1zKSB7DQogIA0KUy5oPC15WzFdICNjcmVhdGUgbG9jYWwgdmFyaWFibGUgUywgZmlyc3QgZWxlbWVudCBvZiB5DQpFLmg8LXlbMl0gDQpJLmg8LXlbM10NClMubDwteVs0XQ0KRS5sPC15WzVdDQpJLmw8LXlbNl0NClE8LXlbN10NClI8LXlbOF0NClY8LXlbOV0NCg0Kd2l0aCgNCiAgYXMubGlzdChwYXJhbXMsIHkpLA0KICB7DQpkUy5oPC0tcSpiZXRhKihJLmgrSS5sKSpTLmgvKFMuaCtFLmgrSS5oK1MubCtFLmwrSS5sK1ErUiktYyooMS1leHAoKC0xL0spKlYpKSpTLmgNCmRFLmg8LXEqYmV0YSooSS5oK0kubCkqUy5oLyhTLmgrRS5oK0kuaCtTLmwrRS5sK0kubCtRK1IpK2MqKDEtZXhwKCgtMS9LKSpWKSkqUy5oLWxhbWJkYSpFLmgNCmRJLmg8LWxhbWJkYSpFLmgtYipnKkkuaC1hSCpoKigxLWcpKkkuaC1nYW1tYWgqKDEtaCkqKDEtZykqSS5oDQpkUy5sPC0tKDEtcCkqcSpiZXRhKihJLmgrSS5sKSpTLmwvKFMuaCtFLmgrSS5oK1MubCtFLmwrSS5sK1ErUiktKDEtcCkqYyooMS1leHAoKC0xL0spKlYpKSpTLmwNCmRFLmw8LSgxLXApKnEqYmV0YSooSS5oK0kubCkvKFMuaCtFLmgrSS5oK1MubCtFLmwrSS5sK1ErUikrKDEtcCkqYyooMS1leHAoKC0xL0spKlYpKSpTLmwtbGFtYmRhKkUubA0KZEkubDwtbGFtYmRhKkUubC1iKkkubA0KZFE8LWIqSS5sK2cqYipJLmgtYVEqaCpRLWdhbW1hUSooMS1oKSpRDQpkUjwtZ2FtbWFoKigxLWgpKigxLWcpKkkuaCtnYW1tYVEqKDEtaCkqUQ0KZFY8LW9tZWdhKkkuaCsoMS1wKSpvbWVnYSpJLmwtZGVsdGEqVg0KICBkeTwtYyhkUy5oLGRFLmgsZEkuaCxkUy5sLGRFLmwsZEkubCxkUSxkUixkVikgI2NvbWJpbmUgcmVzdWx0cyBpbnRvIG9uZSB2ZWN0b3IgZHkNCmxpc3QoZHkpDQogIH0NCikNCn0NCmBgYA0KDQpJbml0aWFsIFZhbHVlcw0KYGBge3J9DQp0aW1lczwtc2VxKDAsMTgwLGJ5PTEpIA0KY292aWQucGFyYW1zPC1jKHE9MC4yLGJldGE9MTMscD0uMixjPTAsbGFtYmRhPTEvNC40MyxiPTEvMC43NyxnPTAsZ2FtbWFRPTAuMSxnYW1tYWg9MS8yLjcsYVE9MS8xLjkzLGFIPTEvMi43LGg9MC4wMDA4MixvbWVnYT0wLGRlbHRhPTEsSz0xMDAwMCkNCnlzdGFydDwtYyhTLmg9KC4yKSoxMDAwMDAsRS5oPTAsSS5oPTEsUy5sPSgxLTAuMikqMTAwMDAwLEUubD0wLEkubD0wLFE9MCxSPTAsVj0wKQ0KY292aWQub3V0IDwtIGFzLmRhdGEuZnJhbWUobHNvZGEoeXN0YXJ0LHRpbWVzLFNBUlNDT1YyTW9kZWwsY292aWQucGFyYW1zKSkNCmBgYA0KDQpDaGFuZ2luZyBLIHRvIDEwMDAsIDEwMDAwLCAxMDAwMDAsICYgMTAwMDAwMCANCmBgYHtyfQ0KY292aWQucGFyYW1zLmsxIDwtIGMocT0wLjUsYmV0YT0xMyxwPS4yLGM9MCxsYW1iZGE9MS80LjQzLGI9MS8wLjc3LGc9MCxnYW1tYVE9MC4xLGdhbW1haD0xLzIuNyxhUT0xLzEuOTMsYUg9MS8yLjcsaD0wLjAwMDgyLG9tZWdhPTAsZGVsdGE9MSxLPTEwMDApDQpjb3ZpZC5wYXJhbXMuazIgPC0gYyhxPTAuNSxiZXRhPTEzLHA9LjIsYz0wLGxhbWJkYT0xLzQuNDMsYj0xLzAuNzcsZz0wLGdhbW1hUT0wLjEsZ2FtbWFoPTEvMi43LGFRPTEvMS45MyxhSD0xLzIuNyxoPTAuMDAwODIsb21lZ2E9MCxkZWx0YT0xLEs9MTAwMDApDQpjb3ZpZC5wYXJhbXMuazMgPC0gYyhxPTAuNSxiZXRhPTEzLHA9LjIsYz0wLGxhbWJkYT0xLzQuNDMsYj0xLzAuNzcsZz0wLGdhbW1hUT0wLjEsZ2FtbWFoPTEvMi43LGFRPTEvMS45MyxhSD0xLzIuNyxoPTAuMDAwODIsb21lZ2E9MCxkZWx0YT0xLEs9MTAwMDAwKQ0KY292aWQucGFyYW1zLms0IDwtIGMocT0wLjUsYmV0YT0xMyxwPS4yLGM9MCxsYW1iZGE9MS80LjQzLGI9MS8wLjc3LGc9MCxnYW1tYVE9MC4xLGdhbW1haD0xLzIuNyxhUT0xLzEuOTMsYUg9MS8yLjcsaD0wLjAwMDgyLG9tZWdhPTAsZGVsdGE9MSxLPTEwMDAwMDApDQpgYGANCg0KQ3JlYXRpbmcgZGF0YSBmcmFtZSBmb3IgZWFjaCB2YWx1ZSBvZiBrDQpgYGB7cn0NCmNvdmlkLm91dC5rMSA8LSBhcy5kYXRhLmZyYW1lKGxzb2RhKHlzdGFydCx0aW1lcyxTQVJTQ09WMk1vZGVsLGNvdmlkLnBhcmFtcy5rMSkpDQpjb3ZpZC5vdXQuazIgPC0gYXMuZGF0YS5mcmFtZShsc29kYSh5c3RhcnQsdGltZXMsU0FSU0NPVjJNb2RlbCxjb3ZpZC5wYXJhbXMuazIpKQ0KY292aWQub3V0LmszIDwtIGFzLmRhdGEuZnJhbWUobHNvZGEoeXN0YXJ0LHRpbWVzLFNBUlNDT1YyTW9kZWwsY292aWQucGFyYW1zLmszKSkNCmNvdmlkLm91dC5rNCA8LSBhcy5kYXRhLmZyYW1lKGxzb2RhKHlzdGFydCx0aW1lcyxTQVJTQ09WMk1vZGVsLGNvdmlkLnBhcmFtcy5rNCkpDQpgYGANCg0KUGxvdHRpbmcgUy5oLCBTLmwsIEUuaCwgJiBFLmwNCmBgYHtyfQ0KIyMgU1VTQ0VQVElCTEVTICMjDQpvcDEgPC0gcGFyKGZpZz1jKDAsMC41LDAsMSksIG1hcj1jKDQsNCwxLDEpKQ0KcGxvdChjb3ZpZC5vdXQuazEkUy5ofmNvdmlkLm91dC5rMSR0aW1lLHR5cGU9ImwiLCBjb2w9ImJsdWUiLCB4bGFiPSJEYXlzIiwgeWxhYiA9ICJTdXNjZXB0aWJsZSAoSGlnaCkiKQ0KbGluZXMoY292aWQub3V0LmsyJFMuaH5jb3ZpZC5vdXQuazIkdGltZSwgY29sPSJyZWQiKQ0KbGluZXMoY292aWQub3V0LmszJFMuaH5jb3ZpZC5vdXQuazMkdGltZSwgY29sPSJwdXJwbGUiKQ0KbGluZXMoY292aWQub3V0Lms0JFMuaH5jb3ZpZC5vdXQuazQkdGltZSwgY29sPSJncmVlbiIpDQpsZWdlbmQoODAsIDE3NTAwLGxlZ2VuZCA9IGMoIksgPSAxLDAwMCIsIksgPSAxMCwwMDAiLCJLID0gMTAwLDAwMCIsIksgPSAxLDAwMCwwMDAiKSwgY29sID0gYygiYmx1ZSIsICJyZWQiLCAicHVycGxlIiwgImdyZWVuIiksIGx0eT0xLCBjZXg9MC44KQ0KDQpwYXIoZmlnPWMoMC41LDEsMCwxKSwgbWFyPWMoNCw0LDEsMSksIG5ldz1UKQ0KcGxvdChjb3ZpZC5vdXQuazEkUy5sfmNvdmlkLm91dC5rMSR0aW1lLHR5cGU9ImwiLCBjb2w9ImJsdWUiLCB4bGFiPSJEYXlzIiwgeWxhYiA9ICJTdXNjZXB0aWJsZSAoTG93KSIpDQpsaW5lcyhjb3ZpZC5vdXQuazIkUy5sfmNvdmlkLm91dC5rMiR0aW1lLCBjb2w9InJlZCIpDQpsaW5lcyhjb3ZpZC5vdXQuazMkUy5sfmNvdmlkLm91dC5rMyR0aW1lLCBjb2w9InB1cnBsZSIpDQpsaW5lcyhjb3ZpZC5vdXQuazQkUy5sfmNvdmlkLm91dC5rNCR0aW1lLCBjb2w9ImdyZWVuIikNCmxlZ2VuZCg4MCwgNzAwMDAsbGVnZW5kID0gYygiSyA9IDEsMDAwIiwiSyA9IDEwLDAwMCIsIksgPSAxMDAsMDAwIiwiSyA9IDEsMDAwLDAwMCIpLCBjb2wgPSBjKCJibHVlIiwgInJlZCIsICJwdXJwbGUiLCAiZ3JlZW4iKSwgbHR5PTEsIGNleD0wLjgpDQpwYXIob3AxKQ0KDQojIyBFWFBPU0VEICMjDQpvcDIgPC0gcGFyKGZpZz1jKDAsMC41LDAsMSksIG1hcj1jKDQsNCwxLDEpKQ0KcGxvdChjb3ZpZC5vdXQuazEkRS5ofmNvdmlkLm91dC5rMSR0aW1lLHR5cGU9ImwiLCBjb2w9ImJsdWUiLCB4bGFiPSJEYXlzIiwgeWxhYiA9ICJFeHBvc2VkIChIaWdoKSIsIHlsaW09YygwLDcxMDApKQ0KbGluZXMoY292aWQub3V0LmsyJEUuaH5jb3ZpZC5vdXQuazIkdGltZSwgY29sPSJyZWQiKQ0KbGluZXMoY292aWQub3V0LmszJEUuaH5jb3ZpZC5vdXQuazMkdGltZSwgY29sPSJwdXJwbGUiKQ0KbGluZXMoY292aWQub3V0Lms0JEUuaH5jb3ZpZC5vdXQuazQkdGltZSwgY29sPSJncmVlbiIpDQpsZWdlbmQoODAsIDYwMDAsbGVnZW5kID0gYygiSyA9IDEsMDAwIiwiSyA9IDEwLDAwMCIsIksgPSAxMDAsMDAwIiwiSyA9IDEsMDAwLDAwMCIpLCBjb2wgPSBjKCJibHVlIiwgInJlZCIsICJwdXJwbGUiLCAiZ3JlZW4iKSwgbHR5PTEsIGNleD0wLjgpDQoNCnBhcihmaWc9YygwLjUsMSwwLDEpLCBtYXI9Yyg0LDQsMSwxKSwgbmV3PVQpDQpwbG90KGNvdmlkLm91dC5rMSRFLmx+Y292aWQub3V0LmsxJHRpbWUsdHlwZT0ibCIsIGNvbD0iYmx1ZSIsIHhsYWI9IkRheXMiLCB5bGFiID0gIkV4cG9zZWQgKExvdykiLCB5bGltPWMoMCwzKSkNCmxpbmVzKGNvdmlkLm91dC5rMiRFLmx+Y292aWQub3V0LmsyJHRpbWUsIGNvbD0icmVkIikNCmxpbmVzKGNvdmlkLm91dC5rMyRFLmx+Y292aWQub3V0LmszJHRpbWUsIGNvbD0icHVycGxlIikNCmxpbmVzKGNvdmlkLm91dC5rNCRFLmx+Y292aWQub3V0Lms0JHRpbWUsIGNvbD0iZ3JlZW4iKQ0KbGVnZW5kKDgwLCAyLjUsbGVnZW5kID0gYygiSyA9IDEsMDAwIiwiSyA9IDEwLDAwMCIsIksgPSAxMDAsMDAwIiwiSyA9IDEsMDAwLDAwMCIpLCBjb2wgPSBjKCJibHVlIiwgInJlZCIsICJwdXJwbGUiLCAiZ3JlZW4iKSwgbHR5PTEsIGNleD0wLjgpDQpwYXIob3AyKQ0KDQojIyBJTkZFQ1RFRCAjIw0Kb3AzIDwtIHBhcihmaWc9YygwLDAuNSwwLDEpLCBtYXI9Yyg0LDQsMSwxKSkNCnBsb3QoY292aWQub3V0LmsxJEkuaH5jb3ZpZC5vdXQuazEkdGltZSx0eXBlPSJsIiwgY29sPSJibHVlIiwgeGxhYj0iRGF5cyIsIHlsYWIgPSAiSW5mZWN0ZWQgKEhpZ2gpIikNCmxpbmVzKGNvdmlkLm91dC5rMiRJLmh+Y292aWQub3V0LmsyJHRpbWUsIGNvbD0icmVkIikNCmxpbmVzKGNvdmlkLm91dC5rMyRJLmh+Y292aWQub3V0LmszJHRpbWUsIGNvbD0icHVycGxlIikNCmxpbmVzKGNvdmlkLm91dC5rNCRJLmh+Y292aWQub3V0Lms0JHRpbWUsIGNvbD0iZ3JlZW4iKQ0KbGVnZW5kKDgwLCAzMDAwLGxlZ2VuZCA9IGMoIksgPSAxLDAwMCIsIksgPSAxMCwwMDAiLCJLID0gMTAwLDAwMCIsIksgPSAxLDAwMCwwMDAiKSwgY29sID0gYygiYmx1ZSIsICJyZWQiLCAicHVycGxlIiwgImdyZWVuIiksIGx0eT0xLCBjZXg9MC44KQ0KDQpwYXIoZmlnPWMoMC41LDEsMCwxKSwgbWFyPWMoNCw0LDEsMSksIG5ldz1UKQ0KcGxvdChjb3ZpZC5vdXQuazEkSS5sfmNvdmlkLm91dC5rMSR0aW1lLHR5cGU9ImwiLCBjb2w9ImJsdWUiLCB4bGFiPSJEYXlzIiwgeWxhYiA9ICJJbmZlY3RlZCAoTG93KSIpDQpsaW5lcyhjb3ZpZC5vdXQuazIkSS5sfmNvdmlkLm91dC5rMiR0aW1lLCBjb2w9InJlZCIpDQpsaW5lcyhjb3ZpZC5vdXQuazMkSS5sfmNvdmlkLm91dC5rMyR0aW1lLCBjb2w9InB1cnBsZSIpDQpsaW5lcyhjb3ZpZC5vdXQuazQkSS5sfmNvdmlkLm91dC5rNCR0aW1lLCBjb2w9ImdyZWVuIikNCmxlZ2VuZCg4MCwgMC40LGxlZ2VuZCA9IGMoIksgPSAxLDAwMCIsIksgPSAxMCwwMDAiLCJLID0gMTAwLDAwMCIsIksgPSAxLDAwMCwwMDAiKSwgY29sID0gYygiYmx1ZSIsICJyZWQiLCAicHVycGxlIiwgImdyZWVuIiksIGx0eT0xLCBjZXg9MC44KQ0KcGFyKG9wMykNCg0KIyMgU0VMRi1JU09MQVRJTkcgIyMNCm9wNCA8LSBwYXIobWFyPWMoNiw2LDIsMikpDQpwbG90KGNvdmlkLm91dC5rMSRRfmNvdmlkLm91dC5rMSR0aW1lLHR5cGU9ImwiLCBjb2w9ImJsdWUiLCB4bGFiPSJEYXlzIiwgeWxhYiA9ICJTZWxmLUlzb2xhdGluZyIpDQpsaW5lcyhjb3ZpZC5vdXQuazIkUX5jb3ZpZC5vdXQuazIkdGltZSwgY29sPSJyZWQiKQ0KbGluZXMoY292aWQub3V0LmszJFF+Y292aWQub3V0LmszJHRpbWUsIGNvbD0icHVycGxlIikNCmxpbmVzKGNvdmlkLm91dC5rNCRRfmNvdmlkLm91dC5rNCR0aW1lLCBjb2w9ImdyZWVuIikNCmxlZ2VuZCgxMjUsIDMsbGVnZW5kID0gYygiSyA9IDEsMDAwIiwiSyA9IDEwLDAwMCIsIksgPSAxMDAsMDAwIiwiSyA9IDEsMDAwLDAwMCIpLCBjb2wgPSBjKCJibHVlIiwgInJlZCIsICJwdXJwbGUiLCAiZ3JlZW4iKSwgbHR5PTEsIGNleD0wLjgpDQpwYXIob3A0KQ0KDQojIyBSRUNPVkVSRUQgIyMNCm9wNSA8LSBwYXIobWFyPWMoNiw2LDIsMikpDQpwbG90KGNvdmlkLm91dC5rMSRSfmNvdmlkLm91dC5rMSR0aW1lLHR5cGU9ImwiLCBjb2w9ImJsdWUiLCB4bGFiPSJEYXlzIiwgeWxhYiA9ICJSZWNvdmVyZWQiKQ0KbGluZXMoY292aWQub3V0LmsyJFJ+Y292aWQub3V0LmsyJHRpbWUsIGNvbD0icmVkIikNCmxpbmVzKGNvdmlkLm91dC5rMyRSfmNvdmlkLm91dC5rMyR0aW1lLCBjb2w9InB1cnBsZSIpDQpsaW5lcyhjb3ZpZC5vdXQuazQkUn5jb3ZpZC5vdXQuazQkdGltZSwgY29sPSJncmVlbiIpDQpsZWdlbmQoMTAwLCAxNTAwMCxsZWdlbmQgPSBjKCJLID0gMSwwMDAiLCJLID0gMTAsMDAwIiwiSyA9IDEwMCwwMDAiLCJLID0gMSwwMDAsMDAwIiksIGNvbCA9IGMoImJsdWUiLCAicmVkIiwgInB1cnBsZSIsICJncmVlbiIpLCBsdHk9MSwgY2V4PTAuOCkNCnBhcihvcDUpDQoNCiMjIFZJUlVTIElOIEVOVklST05NRU5UICMjDQpvcDYgPC0gcGFyKG1hcj1jKDYsNiwyLDIpKQ0KcGxvdChjb3ZpZC5vdXQuazEkVn5jb3ZpZC5vdXQuazEkdGltZSx0eXBlPSJsIiwgY29sPSJibHVlIiwgeGxhYj0iRGF5cyIsIHlsYWIgPSAiVmlydXMgaW4gRW52aXJvbm1lbnQiKQ0KbGluZXMoY292aWQub3V0LmsyJFZ+Y292aWQub3V0LmsyJHRpbWUsIGNvbD0icmVkIikNCmxpbmVzKGNvdmlkLm91dC5rMyRWfmNvdmlkLm91dC5rMyR0aW1lLCBjb2w9InB1cnBsZSIpDQpsaW5lcyhjb3ZpZC5vdXQuazQkVn5jb3ZpZC5vdXQuazQkdGltZSwgY29sPSJncmVlbiIpDQpsZWdlbmQoMTAwLCAxNTAwMCxsZWdlbmQgPSBjKCJLID0gMSwwMDAiLCJLID0gMTAsMDAwIiwiSyA9IDEwMCwwMDAiLCJLID0gMSwwMDAsMDAwIiksIGNvbCA9IGMoImJsdWUiLCAicmVkIiwgInB1cnBsZSIsICJncmVlbiIpLCBsdHk9MSwgY2V4PTAuOCkNCnBhcihvcDYpDQpgYGANCg0KUmVzdWx0cyBvZiBQbG90cw0KYGBge3J9DQojIGZpcnN0IGRhdGFmcmFtZSBsaXN0cyBoaWdoZXN0IHZhbHVlcw0KIyBzZWNvbmQgZGF0YWZyYW1lIGxpc3RzIGxvd2VzdCB2YWx1ZXMNCiMgdGhpcmQgZGF0YWZyYW1lIGxpc3RzIGVuZGluZyB2YWx1ZXMNCg0KcmVzdWx0cy5rMSA8LSBkYXRhLmZyYW1lKA0KICBTLmggPSBjKG1heChjb3ZpZC5vdXQuazFbICwyXSksIG1heChjb3ZpZC5vdXQuazJbICwyXSksIG1heChjb3ZpZC5vdXQuazNbICwyXSksIG1heChjb3ZpZC5vdXQuazRbICwyXSkpLA0KICBFLmggPSBjKG1heChjb3ZpZC5vdXQuazFbICwzXSksIG1heChjb3ZpZC5vdXQuazJbICwzXSksIG1heChjb3ZpZC5vdXQuazNbICwzXSksIG1heChjb3ZpZC5vdXQuazRbICwzXSkpLA0KICBJLmggPSBjKG1heChjb3ZpZC5vdXQuazFbICw0XSksIG1heChjb3ZpZC5vdXQuazJbICw0XSksIG1heChjb3ZpZC5vdXQuazNbICw0XSksIG1heChjb3ZpZC5vdXQuazRbICw0XSkpLA0KICBTLmwgPSBjKG1heChjb3ZpZC5vdXQuazFbICw1XSksIG1heChjb3ZpZC5vdXQuazJbICw1XSksIG1heChjb3ZpZC5vdXQuazNbICw1XSksIG1heChjb3ZpZC5vdXQuazRbICw1XSkpLA0KICBFLmwgPSBjKG1heChjb3ZpZC5vdXQuazFbICw2XSksIG1heChjb3ZpZC5vdXQuazJbICw2XSksIG1heChjb3ZpZC5vdXQuazNbICw2XSksIG1heChjb3ZpZC5vdXQuazRbICw2XSkpLA0KICBJLmwgPSBjKG1heChjb3ZpZC5vdXQuazFbICw3XSksIG1heChjb3ZpZC5vdXQuazJbICw3XSksIG1heChjb3ZpZC5vdXQuazNbICw3XSksIG1heChjb3ZpZC5vdXQuazRbICw3XSkpLA0KICBRID0gYyhtYXgoY292aWQub3V0LmsxWyAsOF0pLCBtYXgoY292aWQub3V0LmsyWyAsOF0pLCBtYXgoY292aWQub3V0LmszWyAsOF0pLCBtYXgoY292aWQub3V0Lms0WyAsOF0pKSwNCiAgUiA9IGMobWF4KGNvdmlkLm91dC5rMVsgLDldKSwgbWF4KGNvdmlkLm91dC5rMlsgLDldKSwgbWF4KGNvdmlkLm91dC5rM1sgLDldKSwgbWF4KGNvdmlkLm91dC5rNFsgLDldKSksDQogIFYgPSBjKG1heChjb3ZpZC5vdXQuazFbICwxMF0pLCBtYXgoY292aWQub3V0LmsyWyAsMTBdKSwgbWF4KGNvdmlkLm91dC5rM1sgLDEwXSksIG1heChjb3ZpZC5vdXQuazRbICwxMF0pKQ0KKQ0KDQpyZXN1bHRzLmsyIDwtIGRhdGEuZnJhbWUoDQogIFMuaCA9IGMobWluKGNvdmlkLm91dC5rMVsgLDJdKSwgbWluKGNvdmlkLm91dC5rMlsgLDJdKSwgbWluKGNvdmlkLm91dC5rM1sgLDJdKSwgbWluKGNvdmlkLm91dC5rNFsgLDJdKSksDQogIEUuaCA9IGMobWluKGNvdmlkLm91dC5rMVsgLDNdKSwgbWluKGNvdmlkLm91dC5rMlsgLDNdKSwgbWluKGNvdmlkLm91dC5rM1sgLDNdKSwgbWluKGNvdmlkLm91dC5rNFsgLDNdKSksDQogIEkuaCA9IGMobWluKGNvdmlkLm91dC5rMVsgLDRdKSwgbWluKGNvdmlkLm91dC5rMlsgLDRdKSwgbWluKGNvdmlkLm91dC5rM1sgLDRdKSwgbWluKGNvdmlkLm91dC5rNFsgLDRdKSksDQogIFMubCA9IGMobWluKGNvdmlkLm91dC5rMVsgLDVdKSwgbWluKGNvdmlkLm91dC5rMlsgLDVdKSwgbWluKGNvdmlkLm91dC5rM1sgLDVdKSwgbWluKGNvdmlkLm91dC5rNFsgLDVdKSksDQogIEUubCA9IGMobWluKGNvdmlkLm91dC5rMVsgLDZdKSwgbWluKGNvdmlkLm91dC5rMlsgLDZdKSwgbWluKGNvdmlkLm91dC5rM1sgLDZdKSwgbWluKGNvdmlkLm91dC5rNFsgLDZdKSksDQogIEkubCA9IGMobWluKGNvdmlkLm91dC5rMVsgLDddKSwgbWluKGNvdmlkLm91dC5rMlsgLDddKSwgbWluKGNvdmlkLm91dC5rM1sgLDddKSwgbWluKGNvdmlkLm91dC5rNFsgLDddKSksDQogIFEgPSBjKG1pbihjb3ZpZC5vdXQuazFbICw4XSksIG1pbihjb3ZpZC5vdXQuazJbICw4XSksIG1pbihjb3ZpZC5vdXQuazNbICw4XSksIG1pbihjb3ZpZC5vdXQuazRbICw4XSkpLA0KICBSID0gYyhtaW4oY292aWQub3V0LmsxWyAsOV0pLCBtaW4oY292aWQub3V0LmsyWyAsOV0pLCBtaW4oY292aWQub3V0LmszWyAsOV0pLCBtaW4oY292aWQub3V0Lms0WyAsOV0pKSwNCiAgViA9IGMobWluKGNvdmlkLm91dC5rMVsgLDEwXSksIG1pbihjb3ZpZC5vdXQuazJbICwxMF0pLCBtaW4oY292aWQub3V0LmszWyAsMTBdKSwgbWluKGNvdmlkLm91dC5rNFsgLDEwXSkpDQopDQoNCnJlc3VsdHMuazMgPC0gZGF0YS5mcmFtZSgNCiAgUy5oID0gYyh0YWlsKGNvdmlkLm91dC5rMVsgLDJdLG49MSksIHRhaWwoY292aWQub3V0LmsyWyAsMl0sbj0xKSwgdGFpbChjb3ZpZC5vdXQuazNbICwyXSxuPTEpLCB0YWlsKGNvdmlkLm91dC5rNFsgLDJdLG49MSkpLCANCiAgRS5oID0gYyh0YWlsKGNvdmlkLm91dC5rMVsgLDNdLG49MSksIHRhaWwoY292aWQub3V0LmsyWyAsM10sbj0xKSwgdGFpbChjb3ZpZC5vdXQuazNbICwzXSxuPTEpLCB0YWlsKGNvdmlkLm91dC5rNFsgLDNdLG49MSkpLA0KICBJLmggPSBjKHRhaWwoY292aWQub3V0LmsxWyAsNF0sbj0xKSwgdGFpbChjb3ZpZC5vdXQuazJbICw0XSxuPTEpLCB0YWlsKGNvdmlkLm91dC5rM1sgLDRdLG49MSksIHRhaWwoY292aWQub3V0Lms0WyAsNF0sbj0xKSksDQogIFMubCA9IGModGFpbChjb3ZpZC5vdXQuazFbICw1XSxuPTEpLCB0YWlsKGNvdmlkLm91dC5rMlsgLDVdLG49MSksIHRhaWwoY292aWQub3V0LmszWyAsNV0sbj0xKSwgdGFpbChjb3ZpZC5vdXQuazRbICw1XSxuPTEpKSwNCiAgRS5sID0gYyh0YWlsKGNvdmlkLm91dC5rMVsgLDZdLG49MSksIHRhaWwoY292aWQub3V0LmsyWyAsNl0sbj0xKSwgdGFpbChjb3ZpZC5vdXQuazNbICw2XSxuPTEpLCB0YWlsKGNvdmlkLm91dC5rNFsgLDZdLG49MSkpLCANCiAgSS5sID0gYyh0YWlsKGNvdmlkLm91dC5rMVsgLDddLG49MSksIHRhaWwoY292aWQub3V0LmsyWyAsN10sbj0xKSwgdGFpbChjb3ZpZC5vdXQuazNbICw3XSxuPTEpLCB0YWlsKGNvdmlkLm91dC5rNFsgLDddLG49MSkpLA0KICBRID0gYyh0YWlsKGNvdmlkLm91dC5rMVsgLDhdLG49MSksIHRhaWwoY292aWQub3V0LmsyWyAsOF0sbj0xKSwgdGFpbChjb3ZpZC5vdXQuazNbICw4XSxuPTEpLCB0YWlsKGNvdmlkLm91dC5rNFsgLDhdLG49MSkpLA0KICBSID0gYyh0YWlsKGNvdmlkLm91dC5rMVsgLDldLG49MSksIHRhaWwoY292aWQub3V0LmsyWyAsOV0sbj0xKSwgdGFpbChjb3ZpZC5vdXQuazNbICw5XSxuPTEpLCB0YWlsKGNvdmlkLm91dC5rNFsgLDldLG49MSkpLA0KICBWID0gYyh0YWlsKGNvdmlkLm91dC5rMVsgLDEwXSxuPTEpLCB0YWlsKGNvdmlkLm91dC5rMlsgLDEwXSxuPTEpLCB0YWlsKGNvdmlkLm91dC5rM1sgLDEwXSxuPTEpLCB0YWlsKGNvdmlkLm91dC5rNFsgLDEwXSxuPTEpKQ0KKQ0KDQpgLnJvd05hbWVzREY8LWAocmVzdWx0cy5rMSxtYWtlLm5hbWVzPUZBTFNFLGMoJ0sgPSAxLDAwMCcsJ0sgPSAxMCwwMDAnLCdLID0gMTAwLDAwMCcsJ0sgPSAxLDAwMCwwMDAnKSkNCmAucm93TmFtZXNERjwtYChyZXN1bHRzLmsyLG1ha2UubmFtZXM9RkFMU0UsYygnSyA9IDEsMDAwJywnSyA9IDEwLDAwMCcsJ0sgPSAxMDAsMDAwJywnSyA9IDEsMDAwLDAwMCcpKQ0KYC5yb3dOYW1lc0RGPC1gKHJlc3VsdHMuazMsbWFrZS5uYW1lcz1GQUxTRSxjKCdLID0gMSwwMDAnLCdLID0gMTAsMDAwJywnSyA9IDEwMCwwMDAnLCdLID0gMSwwMDAsMDAwJykpDQpgYGANCg0KUGxvdHRpbmcgaGlnaGVzdCwgbG93ZXN0LCBhbmQgZW5kaW5nIHZhbHVlcyBvZiBjbGFzc2VzDQpgYGB7cn0NCiMjIEhJR0hFU1QgIyMNCm9wNyA8LSBwYXIobWFyPWMoNiw2LDIsMikpDQpwbG90KHJlc3VsdHMuazEkUy5oLHR5cGU9ImIiLCBjb2w9ImJsdWUiLCB4bGFiPSJxIHZhbHVlcyIsIHlsYWIgPSAiSW5kaXZpZHVhbHMiLCBtYWluPSJIaWdoZXN0IiwgeWxpbT1jKDAsODAwMDApKQ0KbGluZXMocmVzdWx0cy5rMSRFLmgsIHR5cGUgPSAiYiIsIGNvbD0icmVkIikNCmxpbmVzKHJlc3VsdHMuazEkSS5oLCB0eXBlID0gImIiLCBjb2w9ImdyZWVuIikNCmxpbmVzKHJlc3VsdHMuazEkUy5sLCB0eXBlID0gImIiLCBjb2w9InB1cnBsZSIpDQpsaW5lcyhyZXN1bHRzLmsxJEUubCwgdHlwZSA9ICJiIiwgY29sPSJvcmFuZ2UiKQ0KbGluZXMocmVzdWx0cy5rMSRJLmwsIHR5cGUgPSAiYiIsIGNvbD0iZm9yZXN0Z3JlZW4iKQ0KbGluZXMocmVzdWx0cy5rMSRRLCB0eXBlID0gImIiLCBjb2w9ImRhcmt0dXJxdW9pc2UiKQ0KbGluZXMocmVzdWx0cy5rMSRSLCB0eXBlID0gImIiLCBjb2w9InBpbmsyIikNCmxpbmVzKHJlc3VsdHMuazEkViwgdHlwZSA9ICJiIiwgY29sPSJ5ZWxsb3ciKQ0KDQpsZWdlbmQoMywgNzAwMDAsbGVnZW5kID0gYygiU3VzY2VwdGlibGVzIChIaWdoKSIsIkV4cG9zZWQgKEhpZ2gpIiwiSW5mZWN0ZWQgKEhpZ2gpIiwiU3VzY2VwdGlibGVzIChMb3cpIiwiRXhwb3NlZCAoTG93KSIsIkluZmVjdGVkIChMb3cpIiwgIlNlbGYtSXNvbGF0aW5nIiwiUmVjb3ZlcmVkIiwiVmlydXMiKSwgY29sID0gYygiYmx1ZSIsICJyZWQiLCAiZ3JlZW4iLCJwdXJwbGUiLCJvcmFuZ2UiLCJmb3Jlc3RncmVlbiIsImRhcmt0dXJxdW9pc2UiLCJwaW5rMiIsInllbGxvdyIpLCBsdHk9MSwgY2V4PTAuNikNCg0KcGFyKG9wNykNCg0KIyMgTE9XRVNUDQpvcDggPC0gcGFyKG1hcj1jKDYsNiwyLDIpKQ0KcGxvdChyZXN1bHRzLmsyJFMuaCx0eXBlPSJiIiwgY29sPSJibHVlIiwgbWFpbj0iTG93ZXN0IiwgeGxhYj0icSB2YWx1ZXMiLCB5bGFiID0gIkluZGl2aWR1YWxzIiwgeWxpbT1jKDAsODAwMDApKQ0KbGluZXMocmVzdWx0cy5rMiRFLmgsIHR5cGUgPSAiYiIsIGNvbD0icmVkIikNCmxpbmVzKHJlc3VsdHMuazIkSS5oLCB0eXBlID0gImIiLCBjb2w9ImdyZWVuIikNCmxpbmVzKHJlc3VsdHMuazIkUy5sLCB0eXBlID0gImIiLCBjb2w9InB1cnBsZSIpDQpsaW5lcyhyZXN1bHRzLmsyJEUubCwgdHlwZSA9ICJiIiwgY29sPSJvcmFuZ2UiKQ0KbGluZXMocmVzdWx0cy5rMiRJLmwsIHR5cGUgPSAiYiIsIGNvbD0iZm9yZXN0Z3JlZW4iKQ0KbGluZXMocmVzdWx0cy5rMiRRLCB0eXBlID0gImIiLCBjb2w9ImRhcmt0dXJxdW9pc2UiKQ0KbGluZXMocmVzdWx0cy5rMiRSLCB0eXBlID0gImIiLCBjb2w9InBpbmsyIikNCmxpbmVzKHJlc3VsdHMuazIkViwgdHlwZSA9ICJiIiwgY29sPSJ5ZWxsb3ciKQ0KDQpsZWdlbmQoMywgNzAwMDAsbGVnZW5kID0gYygiU3VzY2VwdGlibGVzIChIaWdoKSIsIkV4cG9zZWQgKEhpZ2gpIiwiSW5mZWN0ZWQgKEhpZ2gpIiwiU3VzY2VwdGlibGVzIChMb3cpIiwiRXhwb3NlZCAoTG93KSIsIkluZmVjdGVkIChMb3cpIiwgIlNlbGYtSXNvbGF0aW5nIiwiUmVjb3ZlcmVkIiwiVmlydXMiKSwgY29sID0gYygiYmx1ZSIsICJyZWQiLCAiZ3JlZW4iLCJwdXJwbGUiLCJvcmFuZ2UiLCJmb3Jlc3RncmVlbiIsImRhcmt0dXJxdW9pc2UiLCJwaW5rMiIsInllbGxvdyIpLCBsdHk9MSwgY2V4PTAuNikNCg0KcGFyKG9wOCkNCg0KIyMgRU5ESU5HICMjDQpvcDkgPC0gcGFyKG1hcj1jKDYsNiwyLDIpKQ0KcGxvdChyZXN1bHRzLmszJFMuaCwgdHlwZT0iYiIsIGNvbD0iYmx1ZSIsIG1haW49IkVuZGluZyIsIHhsYWI9InEgdmFsdWVzIiwgeWxhYiA9ICJJbmRpdmlkdWFscyIsIHlsaW09YygwLDgwMDAwKSkNCmxpbmVzKHJlc3VsdHMuazMkRS5oLCB0eXBlID0gImIiLCBjb2w9InJlZCIpDQpsaW5lcyhyZXN1bHRzLmszJEkuaCwgdHlwZSA9ICJiIiwgY29sPSJncmVlbiIpDQpsaW5lcyhyZXN1bHRzLmszJFMubCwgdHlwZSA9ICJiIiwgY29sPSJwdXJwbGUiKQ0KbGluZXMocmVzdWx0cy5rMyRFLmwsIHR5cGUgPSAiYiIsIGNvbD0ib3JhbmdlIikNCmxpbmVzKHJlc3VsdHMuazMkSS5sLCB0eXBlID0gImIiLCBjb2w9ImZvcmVzdGdyZWVuIikNCmxpbmVzKHJlc3VsdHMuazMkUSwgdHlwZSA9ICJiIiwgY29sPSJkYXJrdHVycXVvaXNlIikNCmxpbmVzKHJlc3VsdHMuazMkUiwgdHlwZSA9ICJiIiwgY29sPSJwaW5rMiIpDQpsaW5lcyhyZXN1bHRzLmszJFYsIHR5cGUgPSAiYiIsIGNvbD0ieWVsbG93IikNCg0KbGVnZW5kKDMsIDcwMDAwLGxlZ2VuZCA9IGMoIlN1c2NlcHRpYmxlcyAoSGlnaCkiLCJFeHBvc2VkIChIaWdoKSIsIkluZmVjdGVkIChIaWdoKSIsIlN1c2NlcHRpYmxlcyAoTG93KSIsIkV4cG9zZWQgKExvdykiLCJJbmZlY3RlZCAoTG93KSIsICJTZWxmLUlzb2xhdGluZyIsIlJlY292ZXJlZCIsIlZpcnVzIiksIGNvbCA9IGMoImJsdWUiLCAicmVkIiwgImdyZWVuIiwicHVycGxlIiwib3JhbmdlIiwiZm9yZXN0Z3JlZW4iLCJkYXJrdHVycXVvaXNlIiwicGluazIiLCJ5ZWxsb3ciKSwgbHR5PTEsIGNleD0wLjYpDQoNCnBhcihvcDkpDQpgYGA=