Óbitos novos por dia - Brasil - Regiões
covidsaude %>% group_by(data,regiao) %>% summarise(obitos_novos=sum(obitosNovos))%>% mutate(Tot_perc=(obitos_novos/sum(obitos_novos))) %>%
ggplot(aes(as.numeric(data),obitos_novos)) +
theme_bw(base_size = 16)+ theme(axis.text.x = element_text(angle=90)) +
ylab("covid19 - Óbitos") + xlab("dia")+
theme(legend.position = "bottom") +
geom_point(aes(data, y = obitos_novos), size=4, color="red")+
geom_smooth(method="auto", se=TRUE, fullrange=FALSE, level=0.99)+
facet_grid(regiao~.)

NA
NA
Tendência de óbitos por dia BRASIL
método: LOESS (locally estimated scatterplot smoothing) [https://en.wikipedia.org/wiki/Local_regression]
# Tendência Brasil
prev<-covidsaude %>% group_by(data) %>% summarise(obitos_novos=sum(obitosNovos))%>%mutate(Tot_perc=(obitos_novos/sum(obitos_novos)))
# to allow extrapolation
model <- loess(obitos_novos ~ as.numeric(data), data = prev, control = loess.control(surface = "direct"))
#Tendência para 7 dias
prev_7<-predict(model, data.frame(data = seq(length(model$x)+1,length(model$x)+7, 1)), se = TRUE)
xvalues=seq(1:length(model$x))
yfit=model$fitted
yvalues=model$y
data=prev$data
dados <- data.frame(data,xvalues,yfit,yvalues)
prev_7<-round(prev_7$fit,0)
ggplot(aes(data,yfit),data=dados)+
theme_bw(base_size = 16) +
theme(axis.text.x = element_text(angle=90)) +
ylab("covid19 - Observados e ajustados --> Óbitos") + xlab("dia")+
theme(legend.position = "bottom") +
geom_point(aes(y = yfit, color = "yfit"), size=4) +
geom_point(aes(y = yvalues, color = "yvalues"), size=4)+
geom_text(aes(label = " Tendência de óbitos ", x=13, y=235), color="red", size=10)+
geom_text(aes(label = "para os próximos 7 dias:", x=15, y=200), color="red", size=10)+
geom_text(aes(label = prev_7[1], x=33, y=200), color="black", size=10)+
geom_text(aes(label = prev_7[2], x=38, y=200), color="black", size=10)+
geom_text(aes(label = prev_7[3], x=43, y=200), color="black", size=10)+
geom_text(aes(label = prev_7[4], x=48, y=200), color="black", size=10)+
geom_text(aes(label = prev_7[5], x=53, y=200), color="black", size=10)+
geom_text(aes(label = prev_7[6], x=58, y=200), color="black", size=10)+
geom_text(aes(label = prev_7[7], x=63, y=200), color="black", size=10)

Tendência de óbitos por região - SUDESTE
método: LOESS (locally estimated scatterplot smoothing) [https://en.wikipedia.org/wiki/Local_regression]
# Tendência SP e RJ
prev<-covidsaude %>% filter(regiao=="Sudeste") %>% group_by(data) %>% summarise(obitos_novos=sum(obitosNovos))%>%mutate(Tot_perc=(obitos_novos/sum(obitos_novos)))
# to allow extrapolation
model <- loess(obitos_novos ~ as.numeric(data), data = prev, control = loess.control(surface = "direct"))
#Tendência para 7 dias
prev_7<-predict(model, data.frame(data = seq(length(model$x)+1,length(model$x)+7, 1)), se = TRUE)
xvalues=seq(1:length(model$x))
yfit=model$fitted
yvalues=model$y
data=prev$data
dados <- data.frame(data,xvalues,yfit,yvalues)
prev_7<-round(prev_7$fit,0)
y=model$fitted[length(model$fitted)] # maiorvalor
ggplot(aes(data,yfit),data=dados)+
theme_bw(base_size = 16) +
theme(axis.text.x = element_text(angle=90)) +
ylab("covid19 - Observados e ajustados --> Óbitos") + xlab("dia")+
theme(legend.position = "bottom") +
geom_point(aes(y = yfit, color = "yfit"), size=4) +
geom_point(aes(y = yvalues, color = "yvalues"), size=4)+
geom_text(aes(label = "Tendência de óbitos", x=13, y=y+.3*y), color="red", size=10)+
geom_text(aes(label = "região SUDESTE para", x=14, y=y+.15*y), color="red", size=10)+
geom_text(aes(label = "os próximos 7 dias:", x=13, y=y), color="red", size=10)+
geom_text(aes(label = prev_7[1], x=28, y=y+.3*y), color="black", size=10)+
geom_text(aes(label = prev_7[2], x=33, y=y+.3*y), color="black", size=10)+
geom_text(aes(label = prev_7[3], x=38, y=y+.3*y), color="black", size=10)+
geom_text(aes(label = prev_7[4], x=43, y=y+.3*y), color="black", size=10)+
geom_text(aes(label = prev_7[5], x=48, y=y+.3*y), color="black", size=10)+
geom_text(aes(label = prev_7[6], x=53, y=y+.3*y), color="black", size=10)+
geom_text(aes(label = prev_7[7], x=58, y=y+.3*y), color="black", size=10)

Tendência de óbitos por região - NORTE
método: LOESS (locally estimated scatterplot smoothing) [https://en.wikipedia.org/wiki/Local_regression]
# Tendência SP e RJ
prev<-covidsaude %>% filter(regiao=="Norte") %>% group_by(data) %>% summarise(obitos_novos=sum(obitosNovos))%>%mutate(Tot_perc=(obitos_novos/sum(obitos_novos)))
# to allow extrapolation
model <- loess(obitos_novos ~ as.numeric(data), data = prev, control = loess.control(surface = "direct"))
#Tendência para 7 dias
prev_7<-predict(model, data.frame(data = seq(length(model$x)+1,length(model$x)+7, 1)), se = TRUE)
xvalues=seq(1:length(model$x))
yfit=model$fitted
yvalues=model$y
data=prev$data
dados <- data.frame(data,xvalues,yfit,yvalues)
prev_7<-round(prev_7$fit,0)
y=model$fitted[length(model$fitted)] # maiorvalor
ggplot(aes(data,yfit),data=dados)+
theme_bw(base_size = 16) +
theme(axis.text.x = element_text(angle=90)) +
ylab("covid19 - Observados e ajustados --> Óbitos") + xlab("dia")+
theme(legend.position = "bottom") +
geom_point(aes(y = yfit, color = "yfit"), size=4) +
geom_point(aes(y = yvalues, color = "yvalues"), size=4)+
geom_text(aes(label = "Tendência de óbitos", x=13, y=y+.4*y), color="red", size=10)+
geom_text(aes(label = "região NORTE para", x=13, y=y+.2*y), color="red", size=10)+
geom_text(aes(label = "os próximos 7 dias:", x=13, y=y), color="red", size=10)+
geom_text(aes(label = prev_7[1], x=28, y=y+.2*y), color="black", size=10)+
geom_text(aes(label = prev_7[2], x=33, y=y+.2*y), color="black", size=10)+
geom_text(aes(label = prev_7[3], x=38, y=y+.2*y), color="black", size=10)+
geom_text(aes(label = prev_7[4], x=43, y=y+.2*y), color="black", size=10)+
geom_text(aes(label = prev_7[5], x=48, y=y+.2*y), color="black", size=10)+
geom_text(aes(label = prev_7[6], x=53, y=y+.2*y), color="black", size=10)+
geom_text(aes(label = prev_7[7], x=58, y=y+.2*y), color="black", size=10)

Tendência de óbitos por região - NORDESTE
método: LOESS (locally estimated scatterplot smoothing) [https://en.wikipedia.org/wiki/Local_regression]
# Tendência SP e RJ
prev<-covidsaude %>% filter(regiao=="Nordeste") %>% group_by(data) %>% summarise(obitos_novos=sum(obitosNovos))%>%mutate(Tot_perc=(obitos_novos/sum(obitos_novos)))
# to allow extrapolation
model <- loess(obitos_novos ~ as.numeric(data), data = prev, control = loess.control(surface = "direct"))
#Tendência para 7 dias
prev_7<-predict(model, data.frame(data = seq(length(model$x)+1,length(model$x)+7, 1)), se = TRUE)
xvalues=seq(1:length(model$x))
yfit=model$fitted
yvalues=model$y
data=prev$data
dados <- data.frame(data,xvalues,yfit,yvalues)
prev_7<-round(prev_7$fit,0)
y=model$fitted[length(model$fitted)] # maiorvalor
ggplot(aes(data,yfit),data=dados)+
theme_bw(base_size = 16) +
theme(axis.text.x = element_text(angle=90)) +
ylab("covid19 - Observados e ajustados --> Óbitos") + xlab("dia")+
theme(legend.position = "bottom") +
geom_point(aes(y = yfit, color = "yfit"), size=4) +
geom_point(aes(y = yvalues, color = "yvalues"), size=4)+
geom_text(aes(label = "Tendência de óbitos", x=13, y=y+.2*y), color="red", size=10)+
geom_text(aes(label = "região NORDESTE para", x=14, y=y+.1*y), color="red", size=10)+
geom_text(aes(label = "os próximos 7 dias:", x=13, y=y), color="red", size=10)+
geom_text(aes(label = prev_7[1], x=28, y=y+.2*y), color="black", size=10)+
geom_text(aes(label = prev_7[2], x=33, y=y+.2*y), color="black", size=10)+
geom_text(aes(label = prev_7[3], x=38, y=y+.2*y), color="black", size=10)+
geom_text(aes(label = prev_7[4], x=43, y=y+.2*y), color="black", size=10)+
geom_text(aes(label = prev_7[5], x=48, y=y+.2*y), color="black", size=10)+
geom_text(aes(label = prev_7[6], x=53, y=y+.2*y), color="black", size=10)+
geom_text(aes(label = prev_7[7], x=58, y=y+.2*y), color="black", size=10)

Tendência de óbitos por região - SUL
método: LOESS (locally estimated scatterplot smoothing) [https://en.wikipedia.org/wiki/Local_regression]
# Tendência SP e RJ
prev<-covidsaude %>% filter(regiao=="Sul") %>% group_by(data) %>% summarise(obitos_novos=sum(obitosNovos))%>%mutate(Tot_perc=(obitos_novos/sum(obitos_novos)))
# to allow extrapolation
model <- loess(obitos_novos ~ as.numeric(data), data = prev, control = loess.control(surface = "direct"))
#Tendência para 7 dias
prev_7<-predict(model, data.frame(data = seq(length(model$x)+1,length(model$x)+7, 1)), se = TRUE)
xvalues=seq(1:length(model$x))
yfit=model$fitted
yvalues=model$y
data=prev$data
dados <- data.frame(data,xvalues,yfit,yvalues)
prev_7<-round(prev_7$fit,0)
y=model$fitted[length(model$fitted)] # maiorvalor
ggplot(aes(data,yfit),data=dados)+
theme_bw(base_size = 16) +
theme(axis.text.x = element_text(angle=90)) +
ylab("covid19 - Observados e ajustados --> Óbitos") + xlab("dia")+
theme(legend.position = "bottom") +
geom_point(aes(y = yfit, color = "yfit"), size=4) +
geom_point(aes(y = yvalues, color = "yvalues"), size=4)+
geom_text(aes(label = "Tendência de óbitos", x=13, y=y+.4*y), color="red", size=10)+
geom_text(aes(label = "região SUL para", x=13, y=y+.2*y), color="red", size=10)+
geom_text(aes(label = "os próximos 7 dias:", x=13, y=y), color="red", size=10)+
geom_text(aes(label = prev_7[1], x=28, y=y+.2*y), color="black", size=10)+
geom_text(aes(label = prev_7[2], x=33, y=y+.2*y), color="black", size=10)+
geom_text(aes(label = prev_7[3], x=38, y=y+.2*y), color="black", size=10)+
geom_text(aes(label = prev_7[4], x=43, y=y+.2*y), color="black", size=10)+
geom_text(aes(label = prev_7[5], x=48, y=y+.2*y), color="black", size=10)+
geom_text(aes(label = prev_7[6], x=53, y=y+.2*y), color="black", size=10)+
geom_text(aes(label = prev_7[7], x=58, y=y+.2*y), color="black", size=10)

Tendência de óbitos por região - CENTRO-OESTE
método: LOESS (locally estimated scatterplot smoothing) [https://en.wikipedia.org/wiki/Local_regression]
# Tendência SP e RJ
prev<-covidsaude %>% filter(regiao=="Centro-Oeste") %>% group_by(data) %>% summarise(obitos_novos=sum(obitosNovos))%>%mutate(Tot_perc=(obitos_novos/sum(obitos_novos)))
# to allow extrapolation
model <- loess(obitos_novos ~ as.numeric(data), data = prev, control = loess.control(surface = "direct"))
#Tendência para 7 dias
prev_7<-predict(model, data.frame(data = seq(length(model$x)+1,length(model$x)+7, 1)), se = TRUE)
xvalues=seq(1:length(model$x))
yfit=model$fitted
yvalues=model$y
data=prev$data
dados <- data.frame(data,xvalues,yfit,yvalues)
prev_7<-round(prev_7$fit,0)
y=model$fitted[length(model$fitted)] # maiorvalor
ggplot(aes(data,yfit),data=dados)+
theme_bw(base_size = 16) +
theme(axis.text.x = element_text(angle=90)) +
ylab("covid19 - Observados e ajustados --> Óbitos") + xlab("dia")+
theme(legend.position = "bottom") +
geom_point(aes(y = yfit, color = "yfit"), size=4) +
geom_point(aes(y = yvalues, color = "yvalues"), size=4)+
geom_text(aes(label = "Tendência de óbitos", x=15, y=y+.4*y), color="red", size=10)+
geom_text(aes(label = "região CENTRO-OESTE", x=15, y=y+.2*y), color="red", size=10)+
geom_text(aes(label = "para os próximos 7 dias:", x=15, y=y), color="red", size=10)+
geom_text(aes(label = prev_7[1], x=30, y=y+.2*y), color="black", size=10)+
geom_text(aes(label = prev_7[2], x=38, y=y+.2*y), color="black", size=10)+
geom_text(aes(label = prev_7[3], x=43, y=y+.2*y), color="black", size=10)+
geom_text(aes(label = prev_7[4], x=48, y=y+.2*y), color="black", size=10)+
geom_text(aes(label = prev_7[5], x=53, y=y+.2*y), color="black", size=10)+
geom_text(aes(label = prev_7[6], x=58, y=y+.2*y), color="black", size=10)+
geom_text(aes(label = prev_7[7], x=63, y=y+.2*y), color="black", size=10)

Tendência de óbitos por região - SUDESTE - RJ
método: LOESS (locally estimated scatterplot smoothing) [https://en.wikipedia.org/wiki/Local_regression]
# Tendência RJ
prev<-covidsaude %>% filter(estado=="RJ") %>% group_by(data) %>% summarise(obitos_novos=sum(obitosNovos))%>%mutate(Tot_perc=(obitos_novos/sum(obitos_novos)))
# to allow extrapolation
model <- loess(obitos_novos ~ as.numeric(data), data = prev, control = loess.control(surface = "direct"))
#Tendência para 7 dias
prev_7<-predict(model, data.frame(data = seq(length(model$x)+1,length(model$x)+7, 1)), se = TRUE)
xvalues=seq(1:length(model$x))
yfit=model$fitted
yvalues=model$y
data=prev$data
dados <- data.frame(data,xvalues,yfit,yvalues)
prev_7<-round(prev_7$fit,0)
y=model$fitted[length(model$fitted)] # maiorvalor
ggplot(aes(data,yfit),data=dados)+
theme_bw(base_size = 16) +
theme(axis.text.x = element_text(angle=90)) +
ylab("covid19 - Observados e ajustados --> Óbitos") + xlab("dia")+
theme(legend.position = "bottom") +
geom_point(aes(y = yfit, color = "yfit"), size=4) +
geom_point(aes(y = yvalues, color = "yvalues"), size=4)+
geom_text(aes(label = " Tendência de óbitos RJ ", x=15, y=y+.1*y), color="red", size=10)+
geom_text(aes(label = "para os próximos 7 dias:", x=15, y=y), color="red", size=10)+
geom_text(aes(label = prev_7[1], x=33, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[2], x=38, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[3], x=43, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[4], x=48, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[5], x=53, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[6], x=58, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[7], x=63, y=y+.1*y), color="black", size=10)

Tendência de óbitos por região - SUDESTE - SP
método: LOESS (locally estimated scatterplot smoothing) [https://en.wikipedia.org/wiki/Local_regression]
# Tendência SP e RJ
prev<-covidsaude %>% filter(estado=="SP") %>% group_by(data) %>% summarise(obitos_novos=sum(obitosNovos))%>%mutate(Tot_perc=(obitos_novos/sum(obitos_novos)))
# to allow extrapolation
model <- loess(obitos_novos ~ as.numeric(data), data = prev, control = loess.control(surface = "direct"))
#Tendência para 7 dias
prev_7<-predict(model, data.frame(data = seq(length(model$x)+1,length(model$x)+7, 1)), se = TRUE)
xvalues=seq(1:length(model$x))
yfit=model$fitted
yvalues=model$y
data=prev$data
dados <- data.frame(data,xvalues,yfit,yvalues)
prev_7<-round(prev_7$fit,0)
y=model$fitted[length(model$fitted)] # maiorvalor
ggplot(aes(data,yfit),data=dados)+
theme_bw(base_size = 16) +
theme(axis.text.x = element_text(angle=90)) +
ylab("covid19 - Observados e ajustados --> Óbitos") + xlab("dia")+
theme(legend.position = "bottom") +
geom_point(aes(y = yfit, color = "yfit"), size=4) +
geom_point(aes(y = yvalues, color = "yvalues"), size=4)+
geom_text(aes(label = " Tendência de óbitos SP ", x=15, y=y+.1*y), color="red", size=10)+
geom_text(aes(label = "para os próximos 7 dias:", x=15, y=y), color="red", size=10)+
geom_text(aes(label = prev_7[1], x=33, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[2], x=38, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[3], x=43, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[4], x=48, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[5], x=53, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[6], x=58, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[7], x=63, y=y+.1*y), color="black", size=10)

NA
NA
Tendência de óbitos por região - SUDESTE - MG
método: LOESS (locally estimated scatterplot smoothing) [https://en.wikipedia.org/wiki/Local_regression]
# Tendência SP e RJ
prev<-covidsaude %>% filter(estado=="MG") %>% group_by(data) %>% summarise(obitos_novos=sum(obitosNovos))%>%mutate(Tot_perc=(obitos_novos/sum(obitos_novos)))
# to allow extrapolation
model <- loess(obitos_novos ~ as.numeric(data), data = prev, control = loess.control(surface = "direct"))
#Tendência para 7 dias
prev_7<-predict(model, data.frame(data = seq(length(model$x)+1,length(model$x)+7, 1)), se = TRUE)
xvalues=seq(1:length(model$x))
yfit=model$fitted
yvalues=model$y
data=prev$data
dados <- data.frame(data,xvalues,yfit,yvalues)
prev_7<-round(prev_7$fit,0)
y=model$fitted[length(model$fitted)] # maiorvalor
ggplot(aes(data,yfit),data=dados)+
theme_bw(base_size = 16) +
theme(axis.text.x = element_text(angle=90)) +
ylab("covid19 - Observados e ajustados --> Óbitos") + xlab("dia")+
theme(legend.position = "bottom") +
geom_point(aes(y = yfit, color = "yfit"), size=4) +
geom_point(aes(y = yvalues, color = "yvalues"), size=4)+
geom_text(aes(label = " Tendência de óbitos MG ", x=15, y=y+.2*y), color="red", size=10)+
geom_text(aes(label = "para os próximos 7 dias:", x=15, y=y), color="red", size=10)+
geom_text(aes(label = prev_7[1], x=33, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[2], x=38, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[3], x=43, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[4], x=48, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[5], x=53, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[6], x=58, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[7], x=62, y=y+.1*y), color="black", size=10)

Tendência de óbitos por região - SUDESTE - ES
método: LOESS (locally estimated scatterplot smoothing) [https://en.wikipedia.org/wiki/Local_regression]
# Tendência SP e RJ
prev<-covidsaude %>% filter(estado=="ES") %>% group_by(data) %>% summarise(obitos_novos=sum(obitosNovos))%>%mutate(Tot_perc=(obitos_novos/sum(obitos_novos)))
# to allow extrapolation
model <- loess(obitos_novos ~ as.numeric(data), data = prev, control = loess.control(surface = "direct"))
#Tendência para 7 dias
prev_7<-predict(model, data.frame(data = seq(length(model$x)+1,length(model$x)+7, 1)), se = TRUE)
xvalues=seq(1:length(model$x))
yfit=model$fitted
yvalues=model$y
data=prev$data
dados <- data.frame(data,xvalues,yfit,yvalues)
prev_7<-round(prev_7$fit,0)
y=model$fitted[length(model$fitted)] # maiorvalor
ggplot(aes(data,yfit),data=dados)+
theme_bw(base_size = 16) +
theme(axis.text.x = element_text(angle=90)) +
ylab("covid19 - Observados e ajustados --> Óbitos") + xlab("dia")+
theme(legend.position = "bottom") +
geom_point(aes(y = yfit, color = "yfit"), size=4) +
geom_point(aes(y = yvalues, color = "yvalues"), size=4)+
geom_text(aes(label = " Tendência de óbitos ES ", x=15, y=y+.1*y), color="red", size=10)+
geom_text(aes(label = "para os próximos 7 dias:", x=15, y=y), color="red", size=10)+
geom_text(aes(label = prev_7[1], x=33, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[2], x=38, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[3], x=43, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[4], x=48, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[5], x=53, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[6], x=58, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[7], x=62, y=y+.1*y), color="black", size=10)

Tendência de óbitos por região - NORDESTE - PE
método: LOESS (locally estimated scatterplot smoothing) [https://en.wikipedia.org/wiki/Local_regression]
# Tendência PE
prev<-covidsaude %>% filter(estado=="PE") %>% group_by(data) %>% summarise(obitos_novos=sum(obitosNovos))%>%mutate(Tot_perc=(obitos_novos/sum(obitos_novos)))
# to allow extrapolation
model <- loess(obitos_novos ~ as.numeric(data), data = prev, control = loess.control(surface = "direct"))
#Tendência para 7 dias
prev_7<-predict(model, data.frame(data = seq(length(model$x)+1,length(model$x)+7, 1)), se = TRUE)
xvalues=seq(1:length(model$x))
yfit=model$fitted
yvalues=model$y
data=prev$data
dados <- data.frame(data,xvalues,yfit,yvalues)
prev_7<-round(prev_7$fit,0)
y=model$fitted[length(model$fitted)] # maiorvalor
ggplot(aes(data,yfit),data=dados)+
theme_bw(base_size = 16) +
theme(axis.text.x = element_text(angle=90)) +
ylab("covid19 - Observados e ajustados --> Óbitos") + xlab("dia")+
theme(legend.position = "bottom") +
geom_point(aes(y = yfit, color = "yfit"), size=4) +
geom_point(aes(y = yvalues, color = "yvalues"), size=4)+
geom_text(aes(label = " Tendência de óbitos PE ", x=15, y=y+.1*y), color="red", size=10)+
geom_text(aes(label = "para os próximos 7 dias:", x=15, y=y), color="red", size=10)+
geom_text(aes(label = prev_7[1], x=33, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[2], x=38, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[3], x=43, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[4], x=48, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[5], x=53, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[6], x=58, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[7], x=62, y=y+.1*y), color="black", size=10)

Tendência de óbitos por região - NORDESTE - CE
método: LOESS (locally estimated scatterplot smoothing) [https://en.wikipedia.org/wiki/Local_regression]
# Tendência SP e RJ
prev<-covidsaude %>% filter(estado=="CE") %>% group_by(data) %>% summarise(obitos_novos=sum(obitosNovos))%>%mutate(Tot_perc=(obitos_novos/sum(obitos_novos)))
# to allow extrapolation
model <- loess(obitos_novos ~ as.numeric(data), data = prev, control = loess.control(surface = "direct"))
#Tendência para 7 dias
prev_7<-predict(model, data.frame(data = seq(length(model$x)+1,length(model$x)+7, 1)), se = TRUE)
xvalues=seq(1:length(model$x))
yfit=model$fitted
yvalues=model$y
data=prev$data
dados <- data.frame(data,xvalues,yfit,yvalues)
prev_7<-round(prev_7$fit,0)
y=model$fitted[length(model$fitted)] # maiorvalor
ggplot(aes(data,yfit),data=dados)+
theme_bw(base_size = 16) +
theme(axis.text.x = element_text(angle=90)) +
ylab("covid19 - Observados e ajustados --> Óbitos") + xlab("dia")+
theme(legend.position = "bottom") +
geom_point(aes(y = yfit, color = "yfit"), size=4) +
geom_point(aes(y = yvalues, color = "yvalues"), size=4)+
geom_text(aes(label = " Tendência de óbitos CE ", x=15, y=y+.2*y), color="red", size=10)+
geom_text(aes(label = "para os próximos 7 dias:", x=15, y=y), color="red", size=10)+
geom_text(aes(label = prev_7[1], x=33, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[2], x=38, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[3], x=43, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[4], x=48, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[5], x=53, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[6], x=58, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[7], x=62, y=y+.1*y), color="black", size=10)

Tendência de óbitos por região - NORTE - AM
método: LOESS (locally estimated scatterplot smoothing) [https://en.wikipedia.org/wiki/Local_regression]
# Tendência SP e RJ
prev<-covidsaude %>% filter(estado=="AM") %>% group_by(data) %>% summarise(obitos_novos=sum(obitosNovos))%>%mutate(Tot_perc=(obitos_novos/sum(obitos_novos)))
# to allow extrapolation
model <- loess(obitos_novos ~ as.numeric(data), data = prev, control = loess.control(surface = "direct"))
#Tendência para 7 dias
prev_7<-predict(model, data.frame(data = seq(length(model$x)+1,length(model$x)+7, 1)), se = TRUE)
xvalues=seq(1:length(model$x))
yfit=model$fitted
yvalues=model$y
data=prev$data
dados <- data.frame(data,xvalues,yfit,yvalues)
prev_7<-round(prev_7$fit,0)
y=model$fitted[length(model$fitted)] # maiorvalor
ggplot(aes(data,yfit),data=dados)+
theme_bw(base_size = 16) +
theme(axis.text.x = element_text(angle=90)) +
ylab("covid19 - Observados e ajustados --> Óbitos") + xlab("dia")+
theme(legend.position = "bottom") +
geom_point(aes(y = yfit, color = "yfit"), size=4) +
geom_point(aes(y = yvalues, color = "yvalues"), size=4)+
geom_text(aes(label = " Tendência de óbitos AM ", x=15, y=y+.1*y), color="red", size=10)+
geom_text(aes(label = "para os próximos 7 dias:", x=15, y=y), color="red", size=10)+
geom_text(aes(label = prev_7[1], x=33, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[2], x=38, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[3], x=43, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[4], x=48, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[5], x=53, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[6], x=58, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[7], x=62, y=y+.1*y), color="black", size=10)

Tendência de óbitos por região - SUL- PR
método: LOESS (locally estimated scatterplot smoothing) [https://en.wikipedia.org/wiki/Local_regression]
# Tendência SP e RJ
prev<-covidsaude %>% filter(estado=="PR") %>% group_by(data) %>% summarise(obitos_novos=sum(obitosNovos))%>%mutate(Tot_perc=(obitos_novos/sum(obitos_novos)))
# to allow extrapolation
model <- loess(obitos_novos ~ as.numeric(data), data = prev, control = loess.control(surface = "direct"))
#Tendência para 7 dias
prev_7<-predict(model, data.frame(data = seq(length(model$x)+1,length(model$x)+7, 1)), se = TRUE)
xvalues=seq(1:length(model$x))
yfit=model$fitted
yvalues=model$y
data=prev$data
dados <- data.frame(data,xvalues,yfit,yvalues)
prev_7<-round(prev_7$fit,0)
y=model$fitted[length(model$fitted)] # maiorvalor
ggplot(aes(data,yfit),data=dados)+
theme_bw(base_size = 16) +
theme(axis.text.x = element_text(angle=90)) +
ylab("covid19 - Observados e ajustados --> Óbitos") + xlab("dia")+
theme(legend.position = "bottom") +
geom_point(aes(y = yfit, color = "yfit"), size=4) +
geom_point(aes(y = yvalues, color = "yvalues"), size=4)+
geom_text(aes(label = " Tendência de óbitos PR ", x=15, y=y+.2*y), color="red", size=10)+
geom_text(aes(label = "para os próximos 7 dias:", x=15, y=y), color="red", size=10)+
geom_text(aes(label = prev_7[1], x=33, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[2], x=38, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[3], x=43, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[4], x=48, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[5], x=53, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[6], x=58, y=y+.1*y), color="black", size=10)+
geom_text(aes(label = prev_7[7], x=62, y=y+.1*y), color="black", size=10)

LS0tDQp0aXRsZTogIkNvdmlkLTE5IC0gUGFub3JhbWEgQnJhc2lsIg0KYXV0aG9yOiAiUHJvZmVzc29yIERyLiBMZW9uaSwgUi4gQy4gLSBBTUFOIC0gUmVzZW5kZSAtIFJKLiINCmRhdGU6ICdSZWxhdMOzcmlvIGdlcmFkbyBlbTogYHIgZm9ybWF0KFN5cy50aW1lKCksICIlZCBkZSAlQiBkZSAlWSIpYCcNCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazogDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIHRoZW1lOiBzcGFjZWxhYg0KICAgIHRvYzogeWVzDQogIHdvcmRfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCmVtYWlsOiBsZW9uaS5yb2JlcnRvQGFtYW4uZWIubWlsLmJyDQotLS0NCg0KDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkoZ2d0aGVtZXMpDQpsaWJyYXJ5KHJlc2hhcGUyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkodmlyaWRpcykgIA0KbGlicmFyeShSU2VsZW5pdW0pDQpgYGANCg0KYGBge3J9DQojIHJhc3BhciBkYWRvcyBkbyBzYXVkZS5nb3YuYnINCg0KI2RpcmV0b3JpbyA8LSAiRDovcHJvamV0b3MgZ2l0aHViL2NvdmlkIiAgI3ByZWNpc28gYWNlcnRhciBvIGRpcmV0w7NyaW8NCiMgZGlyZXRvcmlvIDwtIHBhc3RlKFN5cy5nZXRlbnYoIlVTRVJQUk9GSUxFIiksIkRvd25sb2FkcyIsIHNlcCA9ICJcXCIpDQoNCiNmcHJvZiA9IG1ha2VGaXJlZm94UHJvZmlsZSgNCiMgIGxpc3QoDQojICAgICMgIm1vejpmaXJlZm94T3B0aW9ucyIgPSBsaXN0KGFyZ3MgPSBsaXN0KCctLWhlYWRsZXNzJykpLA0KIyAgICBicm93c2VyLmRvd25sb2FkLm1hbmFnZXIuc2hvd1doZW5TdGFydGluZyA9IEYsDQojICAgIGJyb3dzZXIuZG93bmxvYWQuZGlyID0gZGlyZXRvcmlvLA0KIyAgICBicm93c2VyLmRvd25sb2FkLmZvbGRlckxpc3QgPSAyTCwNCiMgICAgcGRmanMuZGlzYWJsZWQgPSBULA0KIyAgICBicm93c2VyLmhlbHBlckFwcHMubmV2ZXJBc2suc2F2ZVRvRGlzayA9ICJ0ZXh0L2NzdiIsDQojICAgIHBsdWdpbi5kaXNhYmxlX2Z1bGxfcGFnZV9wbHVnaW5fZm9yX3R5cGVzID0gInRleHQvY3N2Ig0KIyAgKSkNCiNyRCA9IHJzRHJpdmVyKGJyb3dzZXIgPSAiZmlyZWZveCIsIGNoZWNrID0gRiwgdmVyYm9zZSA9IEYsIGV4dHJhQ2FwYWJpbGl0aWVzID0gZnByb2YpDQojcmVtRHIgPSByRFtbImNsaWVudCJdXQ0KDQojcmVtRHIkbmF2aWdhdGUoImh0dHBzOi8vY292aWQuc2F1ZGUuZ292LmJyLyIpDQojU3lzLnNsZWVwKDIpDQoNCiN3ZWJFbGVtID0gcmVtRHIkZmluZEVsZW1lbnQodXNpbmcgPSAneHBhdGgnLCAiLy9pb24tYnV0dG9uW0BjbGFzcz0nYnRuLW91dGxpbmUgbWQgYnV0dG9uIGJ1dHRvbi1zb2xpZCBidXR0b24taGFzLWljb24tb25seSBpb24tYWN0aXZhdGFibGUgaW9uLWZvY3VzYWJsZSB5ZHJhdGVkJ10iKQ0KI3dlYkVsZW0kY2xpY2tFbGVtZW50KCkNCg0KI3JlbURyJGNsb3NlKCkNCiNyRFtbInNlcnZlciJdXSRzdG9wKCkNCmBgYA0KDQoNCg0KIyBCYXNlIGRlIGRhZG9zIA0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmNvdmlkc2F1ZGUgPC0gcmVhZC5jc3YoIkQ6L3Byb2pldG9zIGdpdGh1Yi9jb3ZpZC9jb3ZpZHNhdWRlLmNzdiIsIHNlcD0iOyIpDQpjb3ZpZHNhdWRlDQoNCg0KI2Nvdmlkc2F1ZGUgPC0gZGF0YS5mcmFtZShyZWdpYW89Y292aWRzYXVkZSRyZWdpYW8sZXN0YWRvPWNvdmlkc2F1ZGUkZXN0YWRvLGRhdGE9Y292aWRzYXVkZSRkYXRhLGNhc29zTm92b3M9YXMubnVtZXJpYyhjb3ZpZHNhdWRlJGNhc29zTm92b3MpLGNhc29zQWN1bXVsYWRvcz1hcy5udW1lcmljKGNvdmlkc2F1ZGUkY2Fzb3NBY3VtdWxhZG9zKSxvYml0b3NOb3Zvcz1jb3ZpZHNhdWRlJG9iaXRvc05vdm9zLG9iaXRvc0FjdW11bGFkb3M9Y292aWRzYXVkZSRvYml0b3NBY3VtdWxhZG9zKQ0KDQojY292aWRzYXVkZSA8LSBhcy50aWJibGUoY292aWRzYXVkZSkNCg0KYGBgDQpbQmFzZSBkZSBkYWRvcyBodHRwczovL2NvdmlkLnNhdWRlLmdvdi5ici9dDQoNCg0KDQojIFNpdHVhw6fDo28gQnJhc2lsDQoNCmBgYHtyIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTE2fQ0KDQpjb3ZpZHNhdWRlICU+JSBzdW1tYXJpc2UoY2Fzb3Nfbm92b3M9c3VtKGNhc29zTm92b3MpLG9iaXRvcyA9IHN1bShvYml0b3NOb3ZvcykpICU+JQ0KICBtdXRhdGUoTGV0YWxpZGFkZT1vYml0b3MvY2Fzb3Nfbm92b3MpICU+JSBtdXRhdGUoTGV0YWxpZGFkZT1yb3VuZChMZXRhbGlkYWRlLDQpKSAgIA0KDQpgYGANCg0KICANCiMgQ2Fzb3Mgbm92b3MgcG9yIGRpYQ0KYGBge3IgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MTZ9DQpjb3ZpZHNhdWRlICU+JSBncm91cF9ieShkYXRhKSAlPiUgc3VtbWFyaXNlKGNhc29zX25vdm9zPXN1bShjYXNvc05vdm9zKSklPiUgbXV0YXRlKFRvdF9wZXJjPShjYXNvc19ub3Zvcy9zdW0oY2Fzb3Nfbm92b3MpKSkgJT4lIG11dGF0ZShUb3RfcGVyYz1yb3VuZChUb3RfcGVyYyw0KSkNCg0KY292aWRzYXVkZSAlPiUgZ3JvdXBfYnkoZGF0YSkgJT4lIHN1bW1hcmlzZShjYXNvc19ub3Zvcz1zdW0oY2Fzb3NOb3ZvcykpJT4lIG11dGF0ZShUb3RfcGVyYz0oY2Fzb3Nfbm92b3Mvc3VtKGNhc29zX25vdm9zKSkpICU+JQ0KICBnZ3Bsb3QoYWVzKGRhdGEpKSArICAgdGhlbWVfYncoYmFzZV9zaXplID0gMTYpKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT05MCkpICsNCiAgeWxhYigiY292aWQxOSAtIE5vdm9zIENhc29zIikgKyB4bGFiKCJkaWEiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsNCiAgZ2VvbV9wb2ludChhZXMoeSA9IGNhc29zX25vdm9zKSwgc2l6ZT00LCBjb2xvcj0icmVkIikNCg0KDQpgYGANCg0KIyBDYXNvcyBub3ZvcyBwb3IgcmVnacOjbw0KDQpgYGB7cn0NCg0KYTwtY292aWRzYXVkZSAlPiUgZ3JvdXBfYnkocmVnaWFvKSAlPiUgc3VtbWFyaXNlKENhc29zX25vdm9zPXN1bShjYXNvc05vdm9zKSkgJT4lIG11dGF0ZShDYXNvc19ub3Zvc19wZXJjPShDYXNvc19ub3Zvcy9zdW0oQ2Fzb3Nfbm92b3MpKSklPiUgYXJyYW5nZShkZXNjKChDYXNvc19ub3Zvc19wZXJjKSkpJT4lIG11dGF0ZShDYXNvc19ub3Zvc19wZXJjPXJvdW5kKENhc29zX25vdm9zX3BlcmMsMikpDQoNCmENCiNjb3ZpZHNhdWRlICU+JSBncm91cF9ieShyZWdpYW8pICU+JSBzdW1tYXJpc2UodG90YWw9c3VtKGNhc29zTm92b3MpKSAlPiUgbXV0YXRlKFRvdF9wZXJjPSh0b3RhbC9zdW0odG90YWwpKSklPiUgYXJyYW5nZShkZXNjKChUb3RfcGVyYykpKSAgJT4lIA0KIyBnZ3Bsb3QoYWVzKHg9IlJlZ2nDo28iLCB5PVRvdF9wZXJjLCBmaWxsPXJlZ2lhbykpICsNCiMgIGdlb21fYmFyKGNvbG91cj0iYmxhY2siLCBzdGF0PSJpZGVudGl0eSIpKw0KIyAgdGhlbWVfbWluaW1hbCgpDQoNCmdncGxvdChhLCBhZXMoeCA9IHJlb3JkZXIocmVnaWFvLENhc29zX25vdm9zKSwgeT0gQ2Fzb3Nfbm92b3MsIGZpbGwgPSBhcy5mYWN0b3IocmVnaWFvKSkpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLHNob3cubGVnZW5kID0gRikgKyB0aGVtZV9idyhiYXNlX3NpemUgPSAxNikgKyB5bGFiICgiQ2Fzb3MiKSAreGxhYiAoIlJlZ2nDo28iKSArDQogIGdlb21fdGV4dChhZXMobGFiZWw9Q2Fzb3Nfbm92b3MpLHZqdXN0PS0wLjIsIGNvbG9yPSJibGFjayIsIHNpemU9NSkNCg0KYGBgDQoNCiMgQ2Fzb3Mgbm92b3MgcG9yIGVzdGFkbw0KYGBge3IgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MTZ9DQpiPC1jb3ZpZHNhdWRlICU+JSBncm91cF9ieShlc3RhZG8pICU+JSBzdW1tYXJpc2UoQ2Fzb3Nfbm92b3M9c3VtKGNhc29zTm92b3MpKSAlPiUgbXV0YXRlKENhc29zX25vdm9zX3BlcmM9KENhc29zX25vdm9zL3N1bShDYXNvc19ub3ZvcykpKSU+JSBhcnJhbmdlKGRlc2MoKENhc29zX25vdm9zX3BlcmMpKSkNCmINCg0KDQojZ2dwbG90KGIsIGFlcyh4ID0gcmVvcmRlcihlc3RhZG8sQ2Fzb3Nfbm92b3MpLCB5PSBDYXNvc19ub3ZvcywgZmlsbCA9IGFzLmZhY3Rvcihlc3RhZG8pKSkgKyANCiMgIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLHNob3cubGVnZW5kID0gRikgKw0KIyAgbGFicyhmaWxsID0gImVzdGFkbyIpICArICAgdGhlbWVfYncoYmFzZV9zaXplID0gMTYpICsgeWxhYiAoIkNhc29zIE5vdm9zIikgK3hsYWIgKCJFc3RhZG8iKSsNCiMgIGdlb21fdGV4dChhZXMobGFiZWw9Q2Fzb3Nfbm92b3MpLHZqdXN0PS0wLjUsIGNvbG9yPSJibGFjayIsIHNpemU9NSkNCg0KeCA8LSBjb3ZpZHNhdWRlICU+JSBncm91cF9ieShyZWdpYW8sZXN0YWRvKSAlPiUgc3VtbWFyaXNlKGNhc29zX25vdm9zPXN1bShjYXNvc05vdm9zKSkgJT4lIG11dGF0ZShjYXNvc19ub3Zvc19wZXJjPShjYXNvc19ub3Zvcy9zdW0oY2Fzb3Nfbm92b3MpKSkgJT4lIG11dGF0ZShjYXNvc19ub3Zvc19wZXJjPXJvdW5kKGNhc29zX25vdm9zX3BlcmMsMikpICU+JSBhcnJhbmdlKGRlc2MoKGNhc29zX25vdm9zX3BlcmMpKSkNCiN4DQoNCmdncGxvdCh4LGFlcyh4ID0gcmVvcmRlcihlc3RhZG8sY2Fzb3Nfbm92b3MpLCB5PSBjYXNvc19ub3ZvcywgZmlsbCA9IHJlZ2lhbykpICsNCiAgbGFicyhmaWxsID0gIlJlZ2nDo28iKSsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCAgc2hvdy5sZWdlbmQgPSBUKSArIA0KICB0aGVtZV9idyhiYXNlX3NpemUgPSAxNikgKyB5bGFiICgiQ2Fzb3MiKSAreGxhYiAoIkVzdGFkbyIpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1jYXNvc19ub3Zvcyksdmp1c3Q9LTAuMiwgY29sb3I9ImJsYWNrIiwgc2l6ZT01KQ0KDQpgYGANCg0KIyDDk2JpdG9zIG5vdm9zIHBvciBkaWEgQnJhc2lsDQoNCmBgYHtyIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTE2fQ0KY292aWRzYXVkZSAlPiUgZ3JvdXBfYnkoZGF0YSkgJT4lIHN1bW1hcmlzZShvYml0b3Nfbm92b3M9c3VtKG9iaXRvc05vdm9zKSklPiUgbXV0YXRlKFRvdF9wZXJjPShvYml0b3Nfbm92b3Mvc3VtKG9iaXRvc19ub3ZvcykpKSAlPiUgbXV0YXRlKFRvdF9wZXJjPXJvdW5kKFRvdF9wZXJjLDQpKSANCg0KY292aWRzYXVkZSAlPiUgZ3JvdXBfYnkoZGF0YSkgJT4lIHN1bW1hcmlzZShvYml0b3Nfbm92b3M9c3VtKG9iaXRvc05vdm9zKSklPiUgbXV0YXRlKFRvdF9wZXJjPShvYml0b3Nfbm92b3Mvc3VtKG9iaXRvc19ub3ZvcykpKSAlPiUgDQogIGdncGxvdChhZXMoYXMubnVtZXJpYyhkYXRhKSxvYml0b3Nfbm92b3MpKSArDQogIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE2KSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9OTApKSArDQogIHlsYWIoImNvdmlkMTkgLSDDk2JpdG9zIikgKyB4bGFiKCJkaWEiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsNCiAgZ2VvbV9wb2ludChhZXMoZGF0YSx5ID0gb2JpdG9zX25vdm9zKSwgc2l6ZT00LCBjb2xvcj0icmVkIikrDQogIGdlb21fc21vb3RoKG1ldGhvZD0iYXV0byIsIHNlPUYsIGZ1bGxyYW5nZT1GQUxTRSwgbGV2ZWw9MC45NSkNCg0KYGBgDQoNCg0KDQojIMOTYml0b3Mgbm92b3MgcG9yIGRpYSAtIEJyYXNpbCAtIFJlZ2nDtWVzDQoNCmBgYHtyIGZpZy5oZWlnaHQ9MTIsIGZpZy53aWR0aD0xNn0NCmNvdmlkc2F1ZGUgJT4lIGdyb3VwX2J5KGRhdGEscmVnaWFvKSAlPiUgc3VtbWFyaXNlKG9iaXRvc19ub3Zvcz1zdW0ob2JpdG9zTm92b3MpKSU+JSBtdXRhdGUoVG90X3BlcmM9KG9iaXRvc19ub3Zvcy9zdW0ob2JpdG9zX25vdm9zKSkpICU+JQ0KICBnZ3Bsb3QoYWVzKGFzLm51bWVyaWMoZGF0YSksb2JpdG9zX25vdm9zKSkgKw0KICB0aGVtZV9idyhiYXNlX3NpemUgPSAxNikrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkgKw0KICB5bGFiKCJjb3ZpZDE5IC0gw5NiaXRvcyIpICsgeGxhYigiZGlhIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArDQogIGdlb21fcG9pbnQoYWVzKGRhdGEsIHkgPSBvYml0b3Nfbm92b3MpLCBzaXplPTQsIGNvbG9yPSJyZWQiKSsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJhdXRvIiwgc2U9VFJVRSwgZnVsbHJhbmdlPUZBTFNFLCBsZXZlbD0wLjk5KSsNCiAgZmFjZXRfZ3JpZChyZWdpYW9+LikNCg0KDQpgYGANCg0KIyMgVGVuZMOqbmNpYSBkZSDDs2JpdG9zIHBvciBkaWEgQlJBU0lMDQptw6l0b2RvOiBMT0VTUyAobG9jYWxseSBlc3RpbWF0ZWQgc2NhdHRlcnBsb3Qgc21vb3RoaW5nKSANCltodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Mb2NhbF9yZWdyZXNzaW9uXQ0KDQpgYGB7ciBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xNn0NCg0KIyBUZW5kw6puY2lhIEJyYXNpbA0KDQpwcmV2PC1jb3ZpZHNhdWRlICU+JSBncm91cF9ieShkYXRhKSAlPiUgc3VtbWFyaXNlKG9iaXRvc19ub3Zvcz1zdW0ob2JpdG9zTm92b3MpKSU+JW11dGF0ZShUb3RfcGVyYz0ob2JpdG9zX25vdm9zL3N1bShvYml0b3Nfbm92b3MpKSkNCg0KIyB0byBhbGxvdyBleHRyYXBvbGF0aW9uDQptb2RlbCA8LSBsb2VzcyhvYml0b3Nfbm92b3MgfiBhcy5udW1lcmljKGRhdGEpLCBkYXRhID0gcHJldiwgY29udHJvbCA9IGxvZXNzLmNvbnRyb2woc3VyZmFjZSA9ICJkaXJlY3QiKSkNCg0KI1RlbmTDqm5jaWEgcGFyYSA3IGRpYXMNCnByZXZfNzwtcHJlZGljdChtb2RlbCwgZGF0YS5mcmFtZShkYXRhID0gc2VxKGxlbmd0aChtb2RlbCR4KSsxLGxlbmd0aChtb2RlbCR4KSs3LCAxKSksIHNlID0gVFJVRSkNCg0KICB4dmFsdWVzPXNlcSgxOmxlbmd0aChtb2RlbCR4KSkNCiAgeWZpdD1tb2RlbCRmaXR0ZWQNCiAgeXZhbHVlcz1tb2RlbCR5DQogIGRhdGE9cHJldiRkYXRhDQoNCiAgZGFkb3MgPC0gZGF0YS5mcmFtZShkYXRhLHh2YWx1ZXMseWZpdCx5dmFsdWVzKQ0KIA0KcHJldl83PC1yb3VuZChwcmV2XzckZml0LDApDQogIA0KICBnZ3Bsb3QoYWVzKGRhdGEseWZpdCksZGF0YT1kYWRvcykrDQogICAgdGhlbWVfYncoYmFzZV9zaXplID0gMTYpICsNCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT05MCkpICsNCiAgICB5bGFiKCJjb3ZpZDE5IC0gT2JzZXJ2YWRvcyBlIGFqdXN0YWRvcyAtLT4gw5NiaXRvcyIpICsgeGxhYigiZGlhIikrDQogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsNCiAgICBnZW9tX3BvaW50KGFlcyh5ID0geWZpdCwgY29sb3IgPSAieWZpdCIpLCBzaXplPTQpICsNCiAgICBnZW9tX3BvaW50KGFlcyh5ID0geXZhbHVlcywgY29sb3IgPSAieXZhbHVlcyIpLCBzaXplPTQpKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSAiICBUZW5kw6puY2lhIGRlIMOzYml0b3MgIiwgeD0xMywgeT0yMzUpLCBjb2xvcj0icmVkIiwgc2l6ZT0xMCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9ICJwYXJhIG9zIHByw7N4aW1vcyA3IGRpYXM6IiwgeD0xNSwgeT0yMDApLCBjb2xvcj0icmVkIiwgc2l6ZT0xMCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHByZXZfN1sxXSwgeD0zMywgeT0yMDApLCBjb2xvcj0iYmxhY2siLCBzaXplPTEwKSsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcHJldl83WzJdLCB4PTM4LCB5PTIwMCksIGNvbG9yPSJibGFjayIsIHNpemU9MTApKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwcmV2XzdbM10sIHg9NDMsIHk9MjAwKSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0xMCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHByZXZfN1s0XSwgeD00OCwgeT0yMDApLCBjb2xvcj0iYmxhY2siLCBzaXplPTEwKSsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcHJldl83WzVdLCB4PTUzLCB5PTIwMCksIGNvbG9yPSJibGFjayIsIHNpemU9MTApKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwcmV2XzdbNl0sIHg9NTgsIHk9MjAwKSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0xMCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHByZXZfN1s3XSwgeD02MywgeT0yMDApLCBjb2xvcj0iYmxhY2siLCBzaXplPTEwKQ0KDQpgYGANCg0KDQojIyBUZW5kw6puY2lhIGRlIMOzYml0b3MgcG9yIHJlZ2nDo28gLSBTVURFU1RFIA0KbcOpdG9kbzogTE9FU1MgKGxvY2FsbHkgZXN0aW1hdGVkIHNjYXR0ZXJwbG90IHNtb290aGluZykgDQpbaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTG9jYWxfcmVncmVzc2lvbl0NCmBgYHtyIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTE2fQ0KDQojIFRlbmTDqm5jaWEgU1AgZSBSSg0KDQpwcmV2PC1jb3ZpZHNhdWRlICU+JSBmaWx0ZXIocmVnaWFvPT0iU3VkZXN0ZSIpICU+JSBncm91cF9ieShkYXRhKSAlPiUgc3VtbWFyaXNlKG9iaXRvc19ub3Zvcz1zdW0ob2JpdG9zTm92b3MpKSU+JW11dGF0ZShUb3RfcGVyYz0ob2JpdG9zX25vdm9zL3N1bShvYml0b3Nfbm92b3MpKSkNCg0KIyB0byBhbGxvdyBleHRyYXBvbGF0aW9uDQptb2RlbCA8LSBsb2VzcyhvYml0b3Nfbm92b3MgfiBhcy5udW1lcmljKGRhdGEpLCBkYXRhID0gcHJldiwgY29udHJvbCA9IGxvZXNzLmNvbnRyb2woc3VyZmFjZSA9ICJkaXJlY3QiKSkNCg0KI1RlbmTDqm5jaWEgcGFyYSA3IGRpYXMNCnByZXZfNzwtcHJlZGljdChtb2RlbCwgZGF0YS5mcmFtZShkYXRhID0gc2VxKGxlbmd0aChtb2RlbCR4KSsxLGxlbmd0aChtb2RlbCR4KSs3LCAxKSksIHNlID0gVFJVRSkNCg0KICB4dmFsdWVzPXNlcSgxOmxlbmd0aChtb2RlbCR4KSkNCiAgeWZpdD1tb2RlbCRmaXR0ZWQNCiAgeXZhbHVlcz1tb2RlbCR5DQogIGRhdGE9cHJldiRkYXRhDQoNCiAgZGFkb3MgPC0gZGF0YS5mcmFtZShkYXRhLHh2YWx1ZXMseWZpdCx5dmFsdWVzKQ0KIA0KcHJldl83PC1yb3VuZChwcmV2XzckZml0LDApDQogIA0KICB5PW1vZGVsJGZpdHRlZFtsZW5ndGgobW9kZWwkZml0dGVkKV0gIyBtYWlvcnZhbG9yDQoNCiAgZ2dwbG90KGFlcyhkYXRhLHlmaXQpLGRhdGE9ZGFkb3MpKw0KICAgIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE2KSArDQogICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9OTApKSArDQogICAgeWxhYigiY292aWQxOSAtIE9ic2VydmFkb3MgZSBhanVzdGFkb3MgLS0+IMOTYml0b3MiKSArIHhsYWIoImRpYSIpKw0KICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArDQogICAgZ2VvbV9wb2ludChhZXMoeSA9IHlmaXQsIGNvbG9yID0gInlmaXQiKSwgc2l6ZT00KSArDQogICAgZ2VvbV9wb2ludChhZXMoeSA9IHl2YWx1ZXMsIGNvbG9yID0gInl2YWx1ZXMiKSwgc2l6ZT00KSsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gIlRlbmTDqm5jaWEgZGUgw7NiaXRvcyIsICB4PTEzLCB5PXkrLjMqeSksIGNvbG9yPSJyZWQiLCBzaXplPTEwKSsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gInJlZ2nDo28gU1VERVNURSBwYXJhIiwgeD0xNCwgeT15Ky4xNSp5KSwgY29sb3I9InJlZCIsIHNpemU9MTApKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSAib3MgcHLDs3hpbW9zIDcgZGlhczoiLCB4PTEzLCB5PXkpLCBjb2xvcj0icmVkIiwgc2l6ZT0xMCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHByZXZfN1sxXSwgeD0yOCwgeT15Ky4zKnkpLCBjb2xvcj0iYmxhY2siLCBzaXplPTEwKSsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcHJldl83WzJdLCB4PTMzLCB5PXkrLjMqeSksIGNvbG9yPSJibGFjayIsIHNpemU9MTApKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwcmV2XzdbM10sIHg9MzgsIHk9eSsuMyp5KSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0xMCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHByZXZfN1s0XSwgeD00MywgeT15Ky4zKnkpLCBjb2xvcj0iYmxhY2siLCBzaXplPTEwKSsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcHJldl83WzVdLCB4PTQ4LCB5PXkrLjMqeSksIGNvbG9yPSJibGFjayIsIHNpemU9MTApKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwcmV2XzdbNl0sIHg9NTMsIHk9eSsuMyp5KSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0xMCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHByZXZfN1s3XSwgeD01OCwgeT15Ky4zKnkpLCBjb2xvcj0iYmxhY2siLCBzaXplPTEwKQ0KDQpgYGANCg0KIyMgVGVuZMOqbmNpYSBkZSDDs2JpdG9zIHBvciByZWdpw6NvIC0gTk9SVEUgDQptw6l0b2RvOiBMT0VTUyAobG9jYWxseSBlc3RpbWF0ZWQgc2NhdHRlcnBsb3Qgc21vb3RoaW5nKSANCltodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Mb2NhbF9yZWdyZXNzaW9uXQ0KYGBge3IgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MTZ9DQoNCiMgVGVuZMOqbmNpYSBTUCBlIFJKDQoNCnByZXY8LWNvdmlkc2F1ZGUgJT4lIGZpbHRlcihyZWdpYW89PSJOb3J0ZSIpICU+JSBncm91cF9ieShkYXRhKSAlPiUgc3VtbWFyaXNlKG9iaXRvc19ub3Zvcz1zdW0ob2JpdG9zTm92b3MpKSU+JW11dGF0ZShUb3RfcGVyYz0ob2JpdG9zX25vdm9zL3N1bShvYml0b3Nfbm92b3MpKSkNCg0KIyB0byBhbGxvdyBleHRyYXBvbGF0aW9uDQptb2RlbCA8LSBsb2VzcyhvYml0b3Nfbm92b3MgfiBhcy5udW1lcmljKGRhdGEpLCBkYXRhID0gcHJldiwgY29udHJvbCA9IGxvZXNzLmNvbnRyb2woc3VyZmFjZSA9ICJkaXJlY3QiKSkNCg0KI1RlbmTDqm5jaWEgcGFyYSA3IGRpYXMNCnByZXZfNzwtcHJlZGljdChtb2RlbCwgZGF0YS5mcmFtZShkYXRhID0gc2VxKGxlbmd0aChtb2RlbCR4KSsxLGxlbmd0aChtb2RlbCR4KSs3LCAxKSksIHNlID0gVFJVRSkNCg0KICB4dmFsdWVzPXNlcSgxOmxlbmd0aChtb2RlbCR4KSkNCiAgeWZpdD1tb2RlbCRmaXR0ZWQNCiAgeXZhbHVlcz1tb2RlbCR5DQogIGRhdGE9cHJldiRkYXRhDQoNCiAgZGFkb3MgPC0gZGF0YS5mcmFtZShkYXRhLHh2YWx1ZXMseWZpdCx5dmFsdWVzKQ0KIA0KcHJldl83PC1yb3VuZChwcmV2XzckZml0LDApDQogIA0KIHk9bW9kZWwkZml0dGVkW2xlbmd0aChtb2RlbCRmaXR0ZWQpXSAjIG1haW9ydmFsb3INCg0KICBnZ3Bsb3QoYWVzKGRhdGEseWZpdCksZGF0YT1kYWRvcykrDQogICAgdGhlbWVfYncoYmFzZV9zaXplID0gMTYpICsNCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT05MCkpICsNCiAgICB5bGFiKCJjb3ZpZDE5IC0gT2JzZXJ2YWRvcyBlIGFqdXN0YWRvcyAtLT4gw5NiaXRvcyIpICsgeGxhYigiZGlhIikrDQogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsNCiAgICBnZW9tX3BvaW50KGFlcyh5ID0geWZpdCwgY29sb3IgPSAieWZpdCIpLCBzaXplPTQpICsNCiAgICBnZW9tX3BvaW50KGFlcyh5ID0geXZhbHVlcywgY29sb3IgPSAieXZhbHVlcyIpLCBzaXplPTQpKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSAiVGVuZMOqbmNpYSBkZSDDs2JpdG9zIiwgIHg9MTMsIHk9eSsuNCp5KSwgY29sb3I9InJlZCIsIHNpemU9MTApKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSAicmVnacOjbyBOT1JURSBwYXJhIiwgeD0xMywgeT15Ky4yKnkpLCBjb2xvcj0icmVkIiwgc2l6ZT0xMCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9ICJvcyBwcsOzeGltb3MgNyBkaWFzOiIsIHg9MTMsIHk9eSksIGNvbG9yPSJyZWQiLCBzaXplPTEwKSsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcHJldl83WzFdLCB4PTI4LCB5PXkrLjIqeSksIGNvbG9yPSJibGFjayIsIHNpemU9MTApKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwcmV2XzdbMl0sIHg9MzMsIHk9eSsuMip5KSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0xMCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHByZXZfN1szXSwgeD0zOCwgeT15Ky4yKnkpLCBjb2xvcj0iYmxhY2siLCBzaXplPTEwKSsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcHJldl83WzRdLCB4PTQzLCB5PXkrLjIqeSksIGNvbG9yPSJibGFjayIsIHNpemU9MTApKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwcmV2XzdbNV0sIHg9NDgsIHk9eSsuMip5KSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0xMCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHByZXZfN1s2XSwgeD01MywgeT15Ky4yKnkpLCBjb2xvcj0iYmxhY2siLCBzaXplPTEwKSsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcHJldl83WzddLCB4PTU4LCB5PXkrLjIqeSksIGNvbG9yPSJibGFjayIsIHNpemU9MTApDQoNCmBgYA0KDQoNCg0KIyMgVGVuZMOqbmNpYSBkZSDDs2JpdG9zIHBvciByZWdpw6NvIC0gTk9SREVTVEUgDQptw6l0b2RvOiBMT0VTUyAobG9jYWxseSBlc3RpbWF0ZWQgc2NhdHRlcnBsb3Qgc21vb3RoaW5nKSANCltodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Mb2NhbF9yZWdyZXNzaW9uXQ0KYGBge3IgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MTZ9DQoNCiMgVGVuZMOqbmNpYSBTUCBlIFJKDQoNCnByZXY8LWNvdmlkc2F1ZGUgJT4lIGZpbHRlcihyZWdpYW89PSJOb3JkZXN0ZSIpICU+JSBncm91cF9ieShkYXRhKSAlPiUgc3VtbWFyaXNlKG9iaXRvc19ub3Zvcz1zdW0ob2JpdG9zTm92b3MpKSU+JW11dGF0ZShUb3RfcGVyYz0ob2JpdG9zX25vdm9zL3N1bShvYml0b3Nfbm92b3MpKSkNCg0KIyB0byBhbGxvdyBleHRyYXBvbGF0aW9uDQptb2RlbCA8LSBsb2VzcyhvYml0b3Nfbm92b3MgfiBhcy5udW1lcmljKGRhdGEpLCBkYXRhID0gcHJldiwgY29udHJvbCA9IGxvZXNzLmNvbnRyb2woc3VyZmFjZSA9ICJkaXJlY3QiKSkNCg0KI1RlbmTDqm5jaWEgcGFyYSA3IGRpYXMNCnByZXZfNzwtcHJlZGljdChtb2RlbCwgZGF0YS5mcmFtZShkYXRhID0gc2VxKGxlbmd0aChtb2RlbCR4KSsxLGxlbmd0aChtb2RlbCR4KSs3LCAxKSksIHNlID0gVFJVRSkNCg0KICB4dmFsdWVzPXNlcSgxOmxlbmd0aChtb2RlbCR4KSkNCiAgeWZpdD1tb2RlbCRmaXR0ZWQNCiAgeXZhbHVlcz1tb2RlbCR5DQogIGRhdGE9cHJldiRkYXRhDQoNCiAgZGFkb3MgPC0gZGF0YS5mcmFtZShkYXRhLHh2YWx1ZXMseWZpdCx5dmFsdWVzKQ0KIA0KcHJldl83PC1yb3VuZChwcmV2XzckZml0LDApDQogIA0KICB5PW1vZGVsJGZpdHRlZFtsZW5ndGgobW9kZWwkZml0dGVkKV0gIyBtYWlvcnZhbG9yDQoNCiAgZ2dwbG90KGFlcyhkYXRhLHlmaXQpLGRhdGE9ZGFkb3MpKw0KICAgIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE2KSArDQogICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9OTApKSArDQogICAgeWxhYigiY292aWQxOSAtIE9ic2VydmFkb3MgZSBhanVzdGFkb3MgLS0+IMOTYml0b3MiKSArIHhsYWIoImRpYSIpKw0KICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArDQogICAgZ2VvbV9wb2ludChhZXMoeSA9IHlmaXQsIGNvbG9yID0gInlmaXQiKSwgc2l6ZT00KSArDQogICAgZ2VvbV9wb2ludChhZXMoeSA9IHl2YWx1ZXMsIGNvbG9yID0gInl2YWx1ZXMiKSwgc2l6ZT00KSsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gIlRlbmTDqm5jaWEgZGUgw7NiaXRvcyIsICB4PTEzLCB5PXkrLjIqeSksIGNvbG9yPSJyZWQiLCBzaXplPTEwKSsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gInJlZ2nDo28gTk9SREVTVEUgcGFyYSIsIHg9MTQsIHk9eSsuMSp5KSwgY29sb3I9InJlZCIsIHNpemU9MTApKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSAib3MgcHLDs3hpbW9zIDcgZGlhczoiLCB4PTEzLCB5PXkpLCBjb2xvcj0icmVkIiwgc2l6ZT0xMCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHByZXZfN1sxXSwgeD0yOCwgeT15Ky4yKnkpLCBjb2xvcj0iYmxhY2siLCBzaXplPTEwKSsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcHJldl83WzJdLCB4PTMzLCB5PXkrLjIqeSksIGNvbG9yPSJibGFjayIsIHNpemU9MTApKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwcmV2XzdbM10sIHg9MzgsIHk9eSsuMip5KSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0xMCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHByZXZfN1s0XSwgeD00MywgeT15Ky4yKnkpLCBjb2xvcj0iYmxhY2siLCBzaXplPTEwKSsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcHJldl83WzVdLCB4PTQ4LCB5PXkrLjIqeSksIGNvbG9yPSJibGFjayIsIHNpemU9MTApKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwcmV2XzdbNl0sIHg9NTMsIHk9eSsuMip5KSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0xMCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHByZXZfN1s3XSwgeD01OCwgeT15Ky4yKnkpLCBjb2xvcj0iYmxhY2siLCBzaXplPTEwKQ0KDQpgYGANCg0KDQojIyBUZW5kw6puY2lhIGRlIMOzYml0b3MgcG9yIHJlZ2nDo28gLSBTVUwgDQptw6l0b2RvOiBMT0VTUyAobG9jYWxseSBlc3RpbWF0ZWQgc2NhdHRlcnBsb3Qgc21vb3RoaW5nKSANCltodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Mb2NhbF9yZWdyZXNzaW9uXQ0KYGBge3IgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MTZ9DQoNCiMgVGVuZMOqbmNpYSBTUCBlIFJKDQoNCnByZXY8LWNvdmlkc2F1ZGUgJT4lIGZpbHRlcihyZWdpYW89PSJTdWwiKSAlPiUgZ3JvdXBfYnkoZGF0YSkgJT4lIHN1bW1hcmlzZShvYml0b3Nfbm92b3M9c3VtKG9iaXRvc05vdm9zKSklPiVtdXRhdGUoVG90X3BlcmM9KG9iaXRvc19ub3Zvcy9zdW0ob2JpdG9zX25vdm9zKSkpDQoNCiMgdG8gYWxsb3cgZXh0cmFwb2xhdGlvbg0KbW9kZWwgPC0gbG9lc3Mob2JpdG9zX25vdm9zIH4gYXMubnVtZXJpYyhkYXRhKSwgZGF0YSA9IHByZXYsIGNvbnRyb2wgPSBsb2Vzcy5jb250cm9sKHN1cmZhY2UgPSAiZGlyZWN0IikpDQoNCiNUZW5kw6puY2lhIHBhcmEgNyBkaWFzDQpwcmV2Xzc8LXByZWRpY3QobW9kZWwsIGRhdGEuZnJhbWUoZGF0YSA9IHNlcShsZW5ndGgobW9kZWwkeCkrMSxsZW5ndGgobW9kZWwkeCkrNywgMSkpLCBzZSA9IFRSVUUpDQoNCiAgeHZhbHVlcz1zZXEoMTpsZW5ndGgobW9kZWwkeCkpDQogIHlmaXQ9bW9kZWwkZml0dGVkDQogIHl2YWx1ZXM9bW9kZWwkeQ0KICBkYXRhPXByZXYkZGF0YQ0KDQogIGRhZG9zIDwtIGRhdGEuZnJhbWUoZGF0YSx4dmFsdWVzLHlmaXQseXZhbHVlcykNCiANCnByZXZfNzwtcm91bmQocHJldl83JGZpdCwwKQ0KICANCiB5PW1vZGVsJGZpdHRlZFtsZW5ndGgobW9kZWwkZml0dGVkKV0gIyBtYWlvcnZhbG9yDQoNCiAgZ2dwbG90KGFlcyhkYXRhLHlmaXQpLGRhdGE9ZGFkb3MpKw0KICAgIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE2KSArDQogICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9OTApKSArDQogICAgeWxhYigiY292aWQxOSAtIE9ic2VydmFkb3MgZSBhanVzdGFkb3MgLS0+IMOTYml0b3MiKSArIHhsYWIoImRpYSIpKw0KICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArDQogICAgZ2VvbV9wb2ludChhZXMoeSA9IHlmaXQsIGNvbG9yID0gInlmaXQiKSwgc2l6ZT00KSArDQogICAgZ2VvbV9wb2ludChhZXMoeSA9IHl2YWx1ZXMsIGNvbG9yID0gInl2YWx1ZXMiKSwgc2l6ZT00KSsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gIlRlbmTDqm5jaWEgZGUgw7NiaXRvcyIsICB4PTEzLCB5PXkrLjQqeSksIGNvbG9yPSJyZWQiLCBzaXplPTEwKSsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gInJlZ2nDo28gU1VMIHBhcmEiLCB4PTEzLCB5PXkrLjIqeSksIGNvbG9yPSJyZWQiLCBzaXplPTEwKSsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gIm9zIHByw7N4aW1vcyA3IGRpYXM6IiwgeD0xMywgeT15KSwgY29sb3I9InJlZCIsIHNpemU9MTApKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwcmV2XzdbMV0sIHg9MjgsIHk9eSsuMip5KSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0xMCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHByZXZfN1syXSwgeD0zMywgeT15Ky4yKnkpLCBjb2xvcj0iYmxhY2siLCBzaXplPTEwKSsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcHJldl83WzNdLCB4PTM4LCB5PXkrLjIqeSksIGNvbG9yPSJibGFjayIsIHNpemU9MTApKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwcmV2XzdbNF0sIHg9NDMsIHk9eSsuMip5KSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0xMCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHByZXZfN1s1XSwgeD00OCwgeT15Ky4yKnkpLCBjb2xvcj0iYmxhY2siLCBzaXplPTEwKSsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcHJldl83WzZdLCB4PTUzLCB5PXkrLjIqeSksIGNvbG9yPSJibGFjayIsIHNpemU9MTApKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwcmV2XzdbN10sIHg9NTgsIHk9eSsuMip5KSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0xMCkNCg0KYGBgDQoNCg0KDQoNCiMjIFRlbmTDqm5jaWEgZGUgw7NiaXRvcyBwb3IgcmVnacOjbyAtIENFTlRSTy1PRVNURSANCm3DqXRvZG86IExPRVNTIChsb2NhbGx5IGVzdGltYXRlZCBzY2F0dGVycGxvdCBzbW9vdGhpbmcpIA0KW2h0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xvY2FsX3JlZ3Jlc3Npb25dDQpgYGB7ciBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xNn0NCg0KIyBUZW5kw6puY2lhIFNQIGUgUkoNCg0KcHJldjwtY292aWRzYXVkZSAlPiUgZmlsdGVyKHJlZ2lhbz09IkNlbnRyby1PZXN0ZSIpICU+JSBncm91cF9ieShkYXRhKSAlPiUgc3VtbWFyaXNlKG9iaXRvc19ub3Zvcz1zdW0ob2JpdG9zTm92b3MpKSU+JW11dGF0ZShUb3RfcGVyYz0ob2JpdG9zX25vdm9zL3N1bShvYml0b3Nfbm92b3MpKSkNCg0KIyB0byBhbGxvdyBleHRyYXBvbGF0aW9uDQptb2RlbCA8LSBsb2VzcyhvYml0b3Nfbm92b3MgfiBhcy5udW1lcmljKGRhdGEpLCBkYXRhID0gcHJldiwgY29udHJvbCA9IGxvZXNzLmNvbnRyb2woc3VyZmFjZSA9ICJkaXJlY3QiKSkNCg0KI1RlbmTDqm5jaWEgcGFyYSA3IGRpYXMNCnByZXZfNzwtcHJlZGljdChtb2RlbCwgZGF0YS5mcmFtZShkYXRhID0gc2VxKGxlbmd0aChtb2RlbCR4KSsxLGxlbmd0aChtb2RlbCR4KSs3LCAxKSksIHNlID0gVFJVRSkNCg0KICB4dmFsdWVzPXNlcSgxOmxlbmd0aChtb2RlbCR4KSkNCiAgeWZpdD1tb2RlbCRmaXR0ZWQNCiAgeXZhbHVlcz1tb2RlbCR5DQogIGRhdGE9cHJldiRkYXRhDQoNCiAgZGFkb3MgPC0gZGF0YS5mcmFtZShkYXRhLHh2YWx1ZXMseWZpdCx5dmFsdWVzKQ0KIA0KcHJldl83PC1yb3VuZChwcmV2XzckZml0LDApDQogIA0KIHk9bW9kZWwkZml0dGVkW2xlbmd0aChtb2RlbCRmaXR0ZWQpXSAjIG1haW9ydmFsb3INCg0KICBnZ3Bsb3QoYWVzKGRhdGEseWZpdCksZGF0YT1kYWRvcykrDQogICAgdGhlbWVfYncoYmFzZV9zaXplID0gMTYpICsNCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT05MCkpICsNCiAgICB5bGFiKCJjb3ZpZDE5IC0gT2JzZXJ2YWRvcyBlIGFqdXN0YWRvcyAtLT4gw5NiaXRvcyIpICsgeGxhYigiZGlhIikrDQogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsNCiAgICBnZW9tX3BvaW50KGFlcyh5ID0geWZpdCwgY29sb3IgPSAieWZpdCIpLCBzaXplPTQpICsNCiAgICBnZW9tX3BvaW50KGFlcyh5ID0geXZhbHVlcywgY29sb3IgPSAieXZhbHVlcyIpLCBzaXplPTQpKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSAiVGVuZMOqbmNpYSBkZSDDs2JpdG9zIiwgIHg9MTUsIHk9eSsuNCp5KSwgY29sb3I9InJlZCIsIHNpemU9MTApKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSAicmVnacOjbyBDRU5UUk8tT0VTVEUiLCB4PTE1LCB5PXkrLjIqeSksIGNvbG9yPSJyZWQiLCBzaXplPTEwKSsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gInBhcmEgb3MgcHLDs3hpbW9zIDcgZGlhczoiLCB4PTE1LCB5PXkpLCBjb2xvcj0icmVkIiwgc2l6ZT0xMCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHByZXZfN1sxXSwgeD0zMCwgeT15Ky4yKnkpLCBjb2xvcj0iYmxhY2siLCBzaXplPTEwKSsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcHJldl83WzJdLCB4PTM4LCB5PXkrLjIqeSksIGNvbG9yPSJibGFjayIsIHNpemU9MTApKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwcmV2XzdbM10sIHg9NDMsIHk9eSsuMip5KSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0xMCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHByZXZfN1s0XSwgeD00OCwgeT15Ky4yKnkpLCBjb2xvcj0iYmxhY2siLCBzaXplPTEwKSsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcHJldl83WzVdLCB4PTUzLCB5PXkrLjIqeSksIGNvbG9yPSJibGFjayIsIHNpemU9MTApKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwcmV2XzdbNl0sIHg9NTgsIHk9eSsuMip5KSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0xMCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHByZXZfN1s3XSwgeD02MywgeT15Ky4yKnkpLCBjb2xvcj0iYmxhY2siLCBzaXplPTEwKQ0KDQpgYGANCg0KDQoNCiMjIFRlbmTDqm5jaWEgZGUgw7NiaXRvcyBwb3IgcmVnacOjbyAtIFNVREVTVEUgLSBSSg0KbcOpdG9kbzogTE9FU1MgKGxvY2FsbHkgZXN0aW1hdGVkIHNjYXR0ZXJwbG90IHNtb290aGluZykgDQpbaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTG9jYWxfcmVncmVzc2lvbl0NCmBgYHtyIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTE2fQ0KDQojIFRlbmTDqm5jaWEgUkoNCg0KcHJldjwtY292aWRzYXVkZSAlPiUgZmlsdGVyKGVzdGFkbz09IlJKIikgJT4lIGdyb3VwX2J5KGRhdGEpICU+JSBzdW1tYXJpc2Uob2JpdG9zX25vdm9zPXN1bShvYml0b3NOb3ZvcykpJT4lbXV0YXRlKFRvdF9wZXJjPShvYml0b3Nfbm92b3Mvc3VtKG9iaXRvc19ub3ZvcykpKQ0KDQojIHRvIGFsbG93IGV4dHJhcG9sYXRpb24NCm1vZGVsIDwtIGxvZXNzKG9iaXRvc19ub3ZvcyB+IGFzLm51bWVyaWMoZGF0YSksIGRhdGEgPSBwcmV2LCBjb250cm9sID0gbG9lc3MuY29udHJvbChzdXJmYWNlID0gImRpcmVjdCIpKQ0KDQojVGVuZMOqbmNpYSBwYXJhIDcgZGlhcw0KcHJldl83PC1wcmVkaWN0KG1vZGVsLCBkYXRhLmZyYW1lKGRhdGEgPSBzZXEobGVuZ3RoKG1vZGVsJHgpKzEsbGVuZ3RoKG1vZGVsJHgpKzcsIDEpKSwgc2UgPSBUUlVFKQ0KDQogIHh2YWx1ZXM9c2VxKDE6bGVuZ3RoKG1vZGVsJHgpKQ0KICB5Zml0PW1vZGVsJGZpdHRlZA0KICB5dmFsdWVzPW1vZGVsJHkNCiAgZGF0YT1wcmV2JGRhdGENCg0KICBkYWRvcyA8LSBkYXRhLmZyYW1lKGRhdGEseHZhbHVlcyx5Zml0LHl2YWx1ZXMpDQogDQpwcmV2Xzc8LXJvdW5kKHByZXZfNyRmaXQsMCkNCiAgDQogIHk9bW9kZWwkZml0dGVkW2xlbmd0aChtb2RlbCRmaXR0ZWQpXSAjIG1haW9ydmFsb3INCg0KICBnZ3Bsb3QoYWVzKGRhdGEseWZpdCksZGF0YT1kYWRvcykrDQogICAgdGhlbWVfYncoYmFzZV9zaXplID0gMTYpICsNCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT05MCkpICsNCiAgICB5bGFiKCJjb3ZpZDE5IC0gT2JzZXJ2YWRvcyBlIGFqdXN0YWRvcyAtLT4gw5NiaXRvcyIpICsgeGxhYigiZGlhIikrDQogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsNCiAgICBnZW9tX3BvaW50KGFlcyh5ID0geWZpdCwgY29sb3IgPSAieWZpdCIpLCBzaXplPTQpICsNCiAgICBnZW9tX3BvaW50KGFlcyh5ID0geXZhbHVlcywgY29sb3IgPSAieXZhbHVlcyIpLCBzaXplPTQpKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSAiICBUZW5kw6puY2lhIGRlIMOzYml0b3MgUkogIiwgeD0xNSwgeT15Ky4xKnkpLCBjb2xvcj0icmVkIiwgc2l6ZT0xMCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9ICJwYXJhIG9zIHByw7N4aW1vcyA3IGRpYXM6IiwgeD0xNSwgeT15KSwgY29sb3I9InJlZCIsIHNpemU9MTApKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwcmV2XzdbMV0sIHg9MzMsIHk9eSsuMSp5KSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0xMCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHByZXZfN1syXSwgeD0zOCwgeT15Ky4xKnkpLCBjb2xvcj0iYmxhY2siLCBzaXplPTEwKSsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcHJldl83WzNdLCB4PTQzLCB5PXkrLjEqeSksIGNvbG9yPSJibGFjayIsIHNpemU9MTApKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwcmV2XzdbNF0sIHg9NDgsIHk9eSsuMSp5KSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0xMCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHByZXZfN1s1XSwgeD01MywgeT15Ky4xKnkpLCBjb2xvcj0iYmxhY2siLCBzaXplPTEwKSsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcHJldl83WzZdLCB4PTU4LCB5PXkrLjEqeSksIGNvbG9yPSJibGFjayIsIHNpemU9MTApKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwcmV2XzdbN10sIHg9NjMsIHk9eSsuMSp5KSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0xMCkNCg0KYGBgDQoNCg0KIyMgVGVuZMOqbmNpYSBkZSDDs2JpdG9zIHBvciByZWdpw6NvIC0gU1VERVNURSAtIFNQDQptw6l0b2RvOiBMT0VTUyAobG9jYWxseSBlc3RpbWF0ZWQgc2NhdHRlcnBsb3Qgc21vb3RoaW5nKSANCltodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Mb2NhbF9yZWdyZXNzaW9uXQ0KYGBge3IgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MTZ9DQoNCiMgVGVuZMOqbmNpYSBTUCBlIFJKDQoNCnByZXY8LWNvdmlkc2F1ZGUgJT4lIGZpbHRlcihlc3RhZG89PSJTUCIpICU+JSBncm91cF9ieShkYXRhKSAlPiUgc3VtbWFyaXNlKG9iaXRvc19ub3Zvcz1zdW0ob2JpdG9zTm92b3MpKSU+JW11dGF0ZShUb3RfcGVyYz0ob2JpdG9zX25vdm9zL3N1bShvYml0b3Nfbm92b3MpKSkNCg0KIyB0byBhbGxvdyBleHRyYXBvbGF0aW9uDQptb2RlbCA8LSBsb2VzcyhvYml0b3Nfbm92b3MgfiBhcy5udW1lcmljKGRhdGEpLCBkYXRhID0gcHJldiwgY29udHJvbCA9IGxvZXNzLmNvbnRyb2woc3VyZmFjZSA9ICJkaXJlY3QiKSkNCg0KI1RlbmTDqm5jaWEgcGFyYSA3IGRpYXMNCnByZXZfNzwtcHJlZGljdChtb2RlbCwgZGF0YS5mcmFtZShkYXRhID0gc2VxKGxlbmd0aChtb2RlbCR4KSsxLGxlbmd0aChtb2RlbCR4KSs3LCAxKSksIHNlID0gVFJVRSkNCg0KICB4dmFsdWVzPXNlcSgxOmxlbmd0aChtb2RlbCR4KSkNCiAgeWZpdD1tb2RlbCRmaXR0ZWQNCiAgeXZhbHVlcz1tb2RlbCR5DQogIGRhdGE9cHJldiRkYXRhDQoNCiAgZGFkb3MgPC0gZGF0YS5mcmFtZShkYXRhLHh2YWx1ZXMseWZpdCx5dmFsdWVzKQ0KIA0KcHJldl83PC1yb3VuZChwcmV2XzckZml0LDApDQogIA0KICAgeT1tb2RlbCRmaXR0ZWRbbGVuZ3RoKG1vZGVsJGZpdHRlZCldICMgbWFpb3J2YWxvcg0KDQogIGdncGxvdChhZXMoZGF0YSx5Zml0KSxkYXRhPWRhZG9zKSsNCiAgICB0aGVtZV9idyhiYXNlX3NpemUgPSAxNikgKw0KICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkgKw0KICAgIHlsYWIoImNvdmlkMTkgLSBPYnNlcnZhZG9zIGUgYWp1c3RhZG9zIC0tPiDDk2JpdG9zIikgKyB4bGFiKCJkaWEiKSsNCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKw0KICAgIGdlb21fcG9pbnQoYWVzKHkgPSB5Zml0LCBjb2xvciA9ICJ5Zml0IiksIHNpemU9NCkgKw0KICAgIGdlb21fcG9pbnQoYWVzKHkgPSB5dmFsdWVzLCBjb2xvciA9ICJ5dmFsdWVzIiksIHNpemU9NCkrDQogICAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gIiAgVGVuZMOqbmNpYSBkZSDDs2JpdG9zIFNQICIsIHg9MTUsIHk9eSsuMSp5KSwgY29sb3I9InJlZCIsIHNpemU9MTApKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSAicGFyYSBvcyBwcsOzeGltb3MgNyBkaWFzOiIsIHg9MTUsIHk9eSksIGNvbG9yPSJyZWQiLCBzaXplPTEwKSsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcHJldl83WzFdLCB4PTMzLCB5PXkrLjEqeSksIGNvbG9yPSJibGFjayIsIHNpemU9MTApKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwcmV2XzdbMl0sIHg9MzgsIHk9eSsuMSp5KSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0xMCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHByZXZfN1szXSwgeD00MywgeT15Ky4xKnkpLCBjb2xvcj0iYmxhY2siLCBzaXplPTEwKSsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcHJldl83WzRdLCB4PTQ4LCB5PXkrLjEqeSksIGNvbG9yPSJibGFjayIsIHNpemU9MTApKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwcmV2XzdbNV0sIHg9NTMsIHk9eSsuMSp5KSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0xMCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHByZXZfN1s2XSwgeD01OCwgeT15Ky4xKnkpLCBjb2xvcj0iYmxhY2siLCBzaXplPTEwKSsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcHJldl83WzddLCB4PTYzLCB5PXkrLjEqeSksIGNvbG9yPSJibGFjayIsIHNpemU9MTApDQoNCg0KYGBgDQoNCiMjIFRlbmTDqm5jaWEgZGUgw7NiaXRvcyBwb3IgcmVnacOjbyAtIFNVREVTVEUgLSBNRw0KbcOpdG9kbzogTE9FU1MgKGxvY2FsbHkgZXN0aW1hdGVkIHNjYXR0ZXJwbG90IHNtb290aGluZykgDQpbaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTG9jYWxfcmVncmVzc2lvbl0NCmBgYHtyIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTE2fQ0KDQojIFRlbmTDqm5jaWEgU1AgZSBSSg0KDQpwcmV2PC1jb3ZpZHNhdWRlICU+JSBmaWx0ZXIoZXN0YWRvPT0iTUciKSAlPiUgZ3JvdXBfYnkoZGF0YSkgJT4lIHN1bW1hcmlzZShvYml0b3Nfbm92b3M9c3VtKG9iaXRvc05vdm9zKSklPiVtdXRhdGUoVG90X3BlcmM9KG9iaXRvc19ub3Zvcy9zdW0ob2JpdG9zX25vdm9zKSkpDQoNCiMgdG8gYWxsb3cgZXh0cmFwb2xhdGlvbg0KbW9kZWwgPC0gbG9lc3Mob2JpdG9zX25vdm9zIH4gYXMubnVtZXJpYyhkYXRhKSwgZGF0YSA9IHByZXYsIGNvbnRyb2wgPSBsb2Vzcy5jb250cm9sKHN1cmZhY2UgPSAiZGlyZWN0IikpDQoNCiNUZW5kw6puY2lhIHBhcmEgNyBkaWFzDQpwcmV2Xzc8LXByZWRpY3QobW9kZWwsIGRhdGEuZnJhbWUoZGF0YSA9IHNlcShsZW5ndGgobW9kZWwkeCkrMSxsZW5ndGgobW9kZWwkeCkrNywgMSkpLCBzZSA9IFRSVUUpDQoNCiAgeHZhbHVlcz1zZXEoMTpsZW5ndGgobW9kZWwkeCkpDQogIHlmaXQ9bW9kZWwkZml0dGVkDQogIHl2YWx1ZXM9bW9kZWwkeQ0KICBkYXRhPXByZXYkZGF0YQ0KDQogIGRhZG9zIDwtIGRhdGEuZnJhbWUoZGF0YSx4dmFsdWVzLHlmaXQseXZhbHVlcykNCiANCnByZXZfNzwtcm91bmQocHJldl83JGZpdCwwKQ0KICANCiAgeT1tb2RlbCRmaXR0ZWRbbGVuZ3RoKG1vZGVsJGZpdHRlZCldICMgbWFpb3J2YWxvcg0KDQogIGdncGxvdChhZXMoZGF0YSx5Zml0KSxkYXRhPWRhZG9zKSsNCiAgICB0aGVtZV9idyhiYXNlX3NpemUgPSAxNikgKw0KICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkgKw0KICAgIHlsYWIoImNvdmlkMTkgLSBPYnNlcnZhZG9zIGUgYWp1c3RhZG9zIC0tPiDDk2JpdG9zIikgKyB4bGFiKCJkaWEiKSsNCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKw0KICAgIGdlb21fcG9pbnQoYWVzKHkgPSB5Zml0LCBjb2xvciA9ICJ5Zml0IiksIHNpemU9NCkgKw0KICAgIGdlb21fcG9pbnQoYWVzKHkgPSB5dmFsdWVzLCBjb2xvciA9ICJ5dmFsdWVzIiksIHNpemU9NCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9ICIgIFRlbmTDqm5jaWEgZGUgw7NiaXRvcyBNRyAiLCB4PTE1LCB5PXkrLjIqeSksIGNvbG9yPSJyZWQiLCBzaXplPTEwKSsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gInBhcmEgb3MgcHLDs3hpbW9zIDcgZGlhczoiLCB4PTE1LCB5PXkpLCBjb2xvcj0icmVkIiwgc2l6ZT0xMCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHByZXZfN1sxXSwgeD0zMywgeT15Ky4xKnkpLCBjb2xvcj0iYmxhY2siLCBzaXplPTEwKSsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcHJldl83WzJdLCB4PTM4LCB5PXkrLjEqeSksIGNvbG9yPSJibGFjayIsIHNpemU9MTApKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwcmV2XzdbM10sIHg9NDMsIHk9eSsuMSp5KSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0xMCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHByZXZfN1s0XSwgeD00OCwgeT15Ky4xKnkpLCBjb2xvcj0iYmxhY2siLCBzaXplPTEwKSsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcHJldl83WzVdLCB4PTUzLCB5PXkrLjEqeSksIGNvbG9yPSJibGFjayIsIHNpemU9MTApKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwcmV2XzdbNl0sIHg9NTgsIHk9eSsuMSp5KSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0xMCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHByZXZfN1s3XSwgeD02MiwgeT15Ky4xKnkpLCBjb2xvcj0iYmxhY2siLCBzaXplPTEwKQ0KDQpgYGANCg0KDQoNCg0KIyMgVGVuZMOqbmNpYSBkZSDDs2JpdG9zIHBvciByZWdpw6NvIC0gU1VERVNURSAtIEVTDQptw6l0b2RvOiBMT0VTUyAobG9jYWxseSBlc3RpbWF0ZWQgc2NhdHRlcnBsb3Qgc21vb3RoaW5nKSANCltodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Mb2NhbF9yZWdyZXNzaW9uXQ0KYGBge3IgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MTZ9DQoNCiMgVGVuZMOqbmNpYSBTUCBlIFJKDQoNCnByZXY8LWNvdmlkc2F1ZGUgJT4lIGZpbHRlcihlc3RhZG89PSJFUyIpICU+JSBncm91cF9ieShkYXRhKSAlPiUgc3VtbWFyaXNlKG9iaXRvc19ub3Zvcz1zdW0ob2JpdG9zTm92b3MpKSU+JW11dGF0ZShUb3RfcGVyYz0ob2JpdG9zX25vdm9zL3N1bShvYml0b3Nfbm92b3MpKSkNCg0KIyB0byBhbGxvdyBleHRyYXBvbGF0aW9uDQptb2RlbCA8LSBsb2VzcyhvYml0b3Nfbm92b3MgfiBhcy5udW1lcmljKGRhdGEpLCBkYXRhID0gcHJldiwgY29udHJvbCA9IGxvZXNzLmNvbnRyb2woc3VyZmFjZSA9ICJkaXJlY3QiKSkNCg0KI1RlbmTDqm5jaWEgcGFyYSA3IGRpYXMNCnByZXZfNzwtcHJlZGljdChtb2RlbCwgZGF0YS5mcmFtZShkYXRhID0gc2VxKGxlbmd0aChtb2RlbCR4KSsxLGxlbmd0aChtb2RlbCR4KSs3LCAxKSksIHNlID0gVFJVRSkNCg0KICB4dmFsdWVzPXNlcSgxOmxlbmd0aChtb2RlbCR4KSkNCiAgeWZpdD1tb2RlbCRmaXR0ZWQNCiAgeXZhbHVlcz1tb2RlbCR5DQogIGRhdGE9cHJldiRkYXRhDQoNCiAgZGFkb3MgPC0gZGF0YS5mcmFtZShkYXRhLHh2YWx1ZXMseWZpdCx5dmFsdWVzKQ0KIA0KcHJldl83PC1yb3VuZChwcmV2XzckZml0LDApDQogIA0KIHk9bW9kZWwkZml0dGVkW2xlbmd0aChtb2RlbCRmaXR0ZWQpXSAjIG1haW9ydmFsb3INCg0KICBnZ3Bsb3QoYWVzKGRhdGEseWZpdCksZGF0YT1kYWRvcykrDQogICAgdGhlbWVfYncoYmFzZV9zaXplID0gMTYpICsNCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT05MCkpICsNCiAgICB5bGFiKCJjb3ZpZDE5IC0gT2JzZXJ2YWRvcyBlIGFqdXN0YWRvcyAtLT4gw5NiaXRvcyIpICsgeGxhYigiZGlhIikrDQogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsNCiAgICBnZW9tX3BvaW50KGFlcyh5ID0geWZpdCwgY29sb3IgPSAieWZpdCIpLCBzaXplPTQpICsNCiAgICBnZW9tX3BvaW50KGFlcyh5ID0geXZhbHVlcywgY29sb3IgPSAieXZhbHVlcyIpLCBzaXplPTQpKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSAiICBUZW5kw6puY2lhIGRlIMOzYml0b3MgRVMgIiwgeD0xNSwgeT15Ky4xKnkpLCBjb2xvcj0icmVkIiwgc2l6ZT0xMCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9ICJwYXJhIG9zIHByw7N4aW1vcyA3IGRpYXM6IiwgeD0xNSwgeT15KSwgY29sb3I9InJlZCIsIHNpemU9MTApKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwcmV2XzdbMV0sIHg9MzMsIHk9eSsuMSp5KSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0xMCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHByZXZfN1syXSwgeD0zOCwgeT15Ky4xKnkpLCBjb2xvcj0iYmxhY2siLCBzaXplPTEwKSsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcHJldl83WzNdLCB4PTQzLCB5PXkrLjEqeSksIGNvbG9yPSJibGFjayIsIHNpemU9MTApKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwcmV2XzdbNF0sIHg9NDgsIHk9eSsuMSp5KSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0xMCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHByZXZfN1s1XSwgeD01MywgeT15Ky4xKnkpLCBjb2xvcj0iYmxhY2siLCBzaXplPTEwKSsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcHJldl83WzZdLCB4PTU4LCB5PXkrLjEqeSksIGNvbG9yPSJibGFjayIsIHNpemU9MTApKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwcmV2XzdbN10sIHg9NjIsIHk9eSsuMSp5KSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0xMCkNCg0KYGBgDQoNCg0KIyMgVGVuZMOqbmNpYSBkZSDDs2JpdG9zIHBvciByZWdpw6NvIC0gTk9SREVTVEUgLSBQRQ0KbcOpdG9kbzogTE9FU1MgKGxvY2FsbHkgZXN0aW1hdGVkIHNjYXR0ZXJwbG90IHNtb290aGluZykgDQpbaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTG9jYWxfcmVncmVzc2lvbl0NCmBgYHtyIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTE2fQ0KDQojIFRlbmTDqm5jaWEgUEUNCg0KcHJldjwtY292aWRzYXVkZSAlPiUgZmlsdGVyKGVzdGFkbz09IlBFIikgJT4lIGdyb3VwX2J5KGRhdGEpICU+JSBzdW1tYXJpc2Uob2JpdG9zX25vdm9zPXN1bShvYml0b3NOb3ZvcykpJT4lbXV0YXRlKFRvdF9wZXJjPShvYml0b3Nfbm92b3Mvc3VtKG9iaXRvc19ub3ZvcykpKQ0KDQojIHRvIGFsbG93IGV4dHJhcG9sYXRpb24NCm1vZGVsIDwtIGxvZXNzKG9iaXRvc19ub3ZvcyB+IGFzLm51bWVyaWMoZGF0YSksIGRhdGEgPSBwcmV2LCBjb250cm9sID0gbG9lc3MuY29udHJvbChzdXJmYWNlID0gImRpcmVjdCIpKQ0KDQojVGVuZMOqbmNpYSBwYXJhIDcgZGlhcw0KcHJldl83PC1wcmVkaWN0KG1vZGVsLCBkYXRhLmZyYW1lKGRhdGEgPSBzZXEobGVuZ3RoKG1vZGVsJHgpKzEsbGVuZ3RoKG1vZGVsJHgpKzcsIDEpKSwgc2UgPSBUUlVFKQ0KDQogIHh2YWx1ZXM9c2VxKDE6bGVuZ3RoKG1vZGVsJHgpKQ0KICB5Zml0PW1vZGVsJGZpdHRlZA0KICB5dmFsdWVzPW1vZGVsJHkNCiAgZGF0YT1wcmV2JGRhdGENCg0KICBkYWRvcyA8LSBkYXRhLmZyYW1lKGRhdGEseHZhbHVlcyx5Zml0LHl2YWx1ZXMpDQogDQpwcmV2Xzc8LXJvdW5kKHByZXZfNyRmaXQsMCkNCiAgDQogIHk9bW9kZWwkZml0dGVkW2xlbmd0aChtb2RlbCRmaXR0ZWQpXSAjIG1haW9ydmFsb3INCg0KICBnZ3Bsb3QoYWVzKGRhdGEseWZpdCksZGF0YT1kYWRvcykrDQogICAgdGhlbWVfYncoYmFzZV9zaXplID0gMTYpICsNCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT05MCkpICsNCiAgICB5bGFiKCJjb3ZpZDE5IC0gT2JzZXJ2YWRvcyBlIGFqdXN0YWRvcyAtLT4gw5NiaXRvcyIpICsgeGxhYigiZGlhIikrDQogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsNCiAgICBnZW9tX3BvaW50KGFlcyh5ID0geWZpdCwgY29sb3IgPSAieWZpdCIpLCBzaXplPTQpICsNCiAgICBnZW9tX3BvaW50KGFlcyh5ID0geXZhbHVlcywgY29sb3IgPSAieXZhbHVlcyIpLCBzaXplPTQpKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSAiICBUZW5kw6puY2lhIGRlIMOzYml0b3MgUEUgIiwgeD0xNSwgeT15Ky4xKnkpLCBjb2xvcj0icmVkIiwgc2l6ZT0xMCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9ICJwYXJhIG9zIHByw7N4aW1vcyA3IGRpYXM6IiwgeD0xNSwgeT15KSwgY29sb3I9InJlZCIsIHNpemU9MTApKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwcmV2XzdbMV0sIHg9MzMsIHk9eSsuMSp5KSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0xMCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHByZXZfN1syXSwgeD0zOCwgeT15Ky4xKnkpLCBjb2xvcj0iYmxhY2siLCBzaXplPTEwKSsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcHJldl83WzNdLCB4PTQzLCB5PXkrLjEqeSksIGNvbG9yPSJibGFjayIsIHNpemU9MTApKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwcmV2XzdbNF0sIHg9NDgsIHk9eSsuMSp5KSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0xMCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHByZXZfN1s1XSwgeD01MywgeT15Ky4xKnkpLCBjb2xvcj0iYmxhY2siLCBzaXplPTEwKSsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcHJldl83WzZdLCB4PTU4LCB5PXkrLjEqeSksIGNvbG9yPSJibGFjayIsIHNpemU9MTApKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwcmV2XzdbN10sIHg9NjIsIHk9eSsuMSp5KSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0xMCkNCmBgYA0KDQoNCg0KDQojIyBUZW5kw6puY2lhIGRlIMOzYml0b3MgcG9yIHJlZ2nDo28gLSBOT1JERVNURSAtIENFDQptw6l0b2RvOiBMT0VTUyAobG9jYWxseSBlc3RpbWF0ZWQgc2NhdHRlcnBsb3Qgc21vb3RoaW5nKSANCltodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Mb2NhbF9yZWdyZXNzaW9uXQ0KYGBge3IgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MTZ9DQoNCiMgVGVuZMOqbmNpYSBTUCBlIFJKDQoNCnByZXY8LWNvdmlkc2F1ZGUgJT4lIGZpbHRlcihlc3RhZG89PSJDRSIpICU+JSBncm91cF9ieShkYXRhKSAlPiUgc3VtbWFyaXNlKG9iaXRvc19ub3Zvcz1zdW0ob2JpdG9zTm92b3MpKSU+JW11dGF0ZShUb3RfcGVyYz0ob2JpdG9zX25vdm9zL3N1bShvYml0b3Nfbm92b3MpKSkNCg0KIyB0byBhbGxvdyBleHRyYXBvbGF0aW9uDQptb2RlbCA8LSBsb2VzcyhvYml0b3Nfbm92b3MgfiBhcy5udW1lcmljKGRhdGEpLCBkYXRhID0gcHJldiwgY29udHJvbCA9IGxvZXNzLmNvbnRyb2woc3VyZmFjZSA9ICJkaXJlY3QiKSkNCg0KI1RlbmTDqm5jaWEgcGFyYSA3IGRpYXMNCnByZXZfNzwtcHJlZGljdChtb2RlbCwgZGF0YS5mcmFtZShkYXRhID0gc2VxKGxlbmd0aChtb2RlbCR4KSsxLGxlbmd0aChtb2RlbCR4KSs3LCAxKSksIHNlID0gVFJVRSkNCg0KICB4dmFsdWVzPXNlcSgxOmxlbmd0aChtb2RlbCR4KSkNCiAgeWZpdD1tb2RlbCRmaXR0ZWQNCiAgeXZhbHVlcz1tb2RlbCR5DQogIGRhdGE9cHJldiRkYXRhDQoNCiAgZGFkb3MgPC0gZGF0YS5mcmFtZShkYXRhLHh2YWx1ZXMseWZpdCx5dmFsdWVzKQ0KIA0KcHJldl83PC1yb3VuZChwcmV2XzckZml0LDApDQogIA0KIHk9bW9kZWwkZml0dGVkW2xlbmd0aChtb2RlbCRmaXR0ZWQpXSAjIG1haW9ydmFsb3INCg0KICBnZ3Bsb3QoYWVzKGRhdGEseWZpdCksZGF0YT1kYWRvcykrDQogICAgdGhlbWVfYncoYmFzZV9zaXplID0gMTYpICsNCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT05MCkpICsNCiAgICB5bGFiKCJjb3ZpZDE5IC0gT2JzZXJ2YWRvcyBlIGFqdXN0YWRvcyAtLT4gw5NiaXRvcyIpICsgeGxhYigiZGlhIikrDQogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsNCiAgICBnZW9tX3BvaW50KGFlcyh5ID0geWZpdCwgY29sb3IgPSAieWZpdCIpLCBzaXplPTQpICsNCiAgICBnZW9tX3BvaW50KGFlcyh5ID0geXZhbHVlcywgY29sb3IgPSAieXZhbHVlcyIpLCBzaXplPTQpKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSAiICBUZW5kw6puY2lhIGRlIMOzYml0b3MgQ0UgIiwgeD0xNSwgeT15Ky4yKnkpLCBjb2xvcj0icmVkIiwgc2l6ZT0xMCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9ICJwYXJhIG9zIHByw7N4aW1vcyA3IGRpYXM6IiwgeD0xNSwgeT15KSwgY29sb3I9InJlZCIsIHNpemU9MTApKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwcmV2XzdbMV0sIHg9MzMsIHk9eSsuMSp5KSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0xMCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHByZXZfN1syXSwgeD0zOCwgeT15Ky4xKnkpLCBjb2xvcj0iYmxhY2siLCBzaXplPTEwKSsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcHJldl83WzNdLCB4PTQzLCB5PXkrLjEqeSksIGNvbG9yPSJibGFjayIsIHNpemU9MTApKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwcmV2XzdbNF0sIHg9NDgsIHk9eSsuMSp5KSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0xMCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHByZXZfN1s1XSwgeD01MywgeT15Ky4xKnkpLCBjb2xvcj0iYmxhY2siLCBzaXplPTEwKSsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcHJldl83WzZdLCB4PTU4LCB5PXkrLjEqeSksIGNvbG9yPSJibGFjayIsIHNpemU9MTApKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwcmV2XzdbN10sIHg9NjIsIHk9eSsuMSp5KSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0xMCkNCmBgYA0KDQojIyBUZW5kw6puY2lhIGRlIMOzYml0b3MgcG9yIHJlZ2nDo28gLSBOT1JURSAtIEFNDQptw6l0b2RvOiBMT0VTUyAobG9jYWxseSBlc3RpbWF0ZWQgc2NhdHRlcnBsb3Qgc21vb3RoaW5nKSANCltodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Mb2NhbF9yZWdyZXNzaW9uXQ0KYGBge3IgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MTZ9DQoNCiMgVGVuZMOqbmNpYSBTUCBlIFJKDQoNCnByZXY8LWNvdmlkc2F1ZGUgJT4lIGZpbHRlcihlc3RhZG89PSJBTSIpICU+JSBncm91cF9ieShkYXRhKSAlPiUgc3VtbWFyaXNlKG9iaXRvc19ub3Zvcz1zdW0ob2JpdG9zTm92b3MpKSU+JW11dGF0ZShUb3RfcGVyYz0ob2JpdG9zX25vdm9zL3N1bShvYml0b3Nfbm92b3MpKSkNCg0KIyB0byBhbGxvdyBleHRyYXBvbGF0aW9uDQptb2RlbCA8LSBsb2VzcyhvYml0b3Nfbm92b3MgfiBhcy5udW1lcmljKGRhdGEpLCBkYXRhID0gcHJldiwgY29udHJvbCA9IGxvZXNzLmNvbnRyb2woc3VyZmFjZSA9ICJkaXJlY3QiKSkNCg0KI1RlbmTDqm5jaWEgcGFyYSA3IGRpYXMNCnByZXZfNzwtcHJlZGljdChtb2RlbCwgZGF0YS5mcmFtZShkYXRhID0gc2VxKGxlbmd0aChtb2RlbCR4KSsxLGxlbmd0aChtb2RlbCR4KSs3LCAxKSksIHNlID0gVFJVRSkNCg0KICB4dmFsdWVzPXNlcSgxOmxlbmd0aChtb2RlbCR4KSkNCiAgeWZpdD1tb2RlbCRmaXR0ZWQNCiAgeXZhbHVlcz1tb2RlbCR5DQogIGRhdGE9cHJldiRkYXRhDQoNCiAgZGFkb3MgPC0gZGF0YS5mcmFtZShkYXRhLHh2YWx1ZXMseWZpdCx5dmFsdWVzKQ0KIA0KcHJldl83PC1yb3VuZChwcmV2XzckZml0LDApDQogIA0KIHk9bW9kZWwkZml0dGVkW2xlbmd0aChtb2RlbCRmaXR0ZWQpXSAjIG1haW9ydmFsb3INCg0KICBnZ3Bsb3QoYWVzKGRhdGEseWZpdCksZGF0YT1kYWRvcykrDQogICAgdGhlbWVfYncoYmFzZV9zaXplID0gMTYpICsNCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT05MCkpICsNCiAgICB5bGFiKCJjb3ZpZDE5IC0gT2JzZXJ2YWRvcyBlIGFqdXN0YWRvcyAtLT4gw5NiaXRvcyIpICsgeGxhYigiZGlhIikrDQogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsNCiAgICBnZW9tX3BvaW50KGFlcyh5ID0geWZpdCwgY29sb3IgPSAieWZpdCIpLCBzaXplPTQpICsNCiAgICBnZW9tX3BvaW50KGFlcyh5ID0geXZhbHVlcywgY29sb3IgPSAieXZhbHVlcyIpLCBzaXplPTQpKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSAiICBUZW5kw6puY2lhIGRlIMOzYml0b3MgQU0gIiwgeD0xNSwgeT15Ky4xKnkpLCBjb2xvcj0icmVkIiwgc2l6ZT0xMCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9ICJwYXJhIG9zIHByw7N4aW1vcyA3IGRpYXM6IiwgeD0xNSwgeT15KSwgY29sb3I9InJlZCIsIHNpemU9MTApKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwcmV2XzdbMV0sIHg9MzMsIHk9eSsuMSp5KSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0xMCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHByZXZfN1syXSwgeD0zOCwgeT15Ky4xKnkpLCBjb2xvcj0iYmxhY2siLCBzaXplPTEwKSsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcHJldl83WzNdLCB4PTQzLCB5PXkrLjEqeSksIGNvbG9yPSJibGFjayIsIHNpemU9MTApKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwcmV2XzdbNF0sIHg9NDgsIHk9eSsuMSp5KSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0xMCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHByZXZfN1s1XSwgeD01MywgeT15Ky4xKnkpLCBjb2xvcj0iYmxhY2siLCBzaXplPTEwKSsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcHJldl83WzZdLCB4PTU4LCB5PXkrLjEqeSksIGNvbG9yPSJibGFjayIsIHNpemU9MTApKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwcmV2XzdbN10sIHg9NjIsIHk9eSsuMSp5KSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0xMCkNCg0KYGBgDQoNCiMjIFRlbmTDqm5jaWEgZGUgw7NiaXRvcyBwb3IgcmVnacOjbyAtIFNVTC0gUFINCm3DqXRvZG86IExPRVNTIChsb2NhbGx5IGVzdGltYXRlZCBzY2F0dGVycGxvdCBzbW9vdGhpbmcpIA0KW2h0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xvY2FsX3JlZ3Jlc3Npb25dDQpgYGB7ciBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xNn0NCg0KIyBUZW5kw6puY2lhIFNQIGUgUkoNCg0KcHJldjwtY292aWRzYXVkZSAlPiUgZmlsdGVyKGVzdGFkbz09IlBSIikgJT4lIGdyb3VwX2J5KGRhdGEpICU+JSBzdW1tYXJpc2Uob2JpdG9zX25vdm9zPXN1bShvYml0b3NOb3ZvcykpJT4lbXV0YXRlKFRvdF9wZXJjPShvYml0b3Nfbm92b3Mvc3VtKG9iaXRvc19ub3ZvcykpKQ0KDQojIHRvIGFsbG93IGV4dHJhcG9sYXRpb24NCm1vZGVsIDwtIGxvZXNzKG9iaXRvc19ub3ZvcyB+IGFzLm51bWVyaWMoZGF0YSksIGRhdGEgPSBwcmV2LCBjb250cm9sID0gbG9lc3MuY29udHJvbChzdXJmYWNlID0gImRpcmVjdCIpKQ0KDQojVGVuZMOqbmNpYSBwYXJhIDcgZGlhcw0KcHJldl83PC1wcmVkaWN0KG1vZGVsLCBkYXRhLmZyYW1lKGRhdGEgPSBzZXEobGVuZ3RoKG1vZGVsJHgpKzEsbGVuZ3RoKG1vZGVsJHgpKzcsIDEpKSwgc2UgPSBUUlVFKQ0KDQogIHh2YWx1ZXM9c2VxKDE6bGVuZ3RoKG1vZGVsJHgpKQ0KICB5Zml0PW1vZGVsJGZpdHRlZA0KICB5dmFsdWVzPW1vZGVsJHkNCiAgZGF0YT1wcmV2JGRhdGENCg0KICBkYWRvcyA8LSBkYXRhLmZyYW1lKGRhdGEseHZhbHVlcyx5Zml0LHl2YWx1ZXMpDQogDQpwcmV2Xzc8LXJvdW5kKHByZXZfNyRmaXQsMCkNCiAgDQogeT1tb2RlbCRmaXR0ZWRbbGVuZ3RoKG1vZGVsJGZpdHRlZCldICMgbWFpb3J2YWxvcg0KDQogIGdncGxvdChhZXMoZGF0YSx5Zml0KSxkYXRhPWRhZG9zKSsNCiAgICB0aGVtZV9idyhiYXNlX3NpemUgPSAxNikgKw0KICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkgKw0KICAgIHlsYWIoImNvdmlkMTkgLSBPYnNlcnZhZG9zIGUgYWp1c3RhZG9zIC0tPiDDk2JpdG9zIikgKyB4bGFiKCJkaWEiKSsNCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKw0KICAgIGdlb21fcG9pbnQoYWVzKHkgPSB5Zml0LCBjb2xvciA9ICJ5Zml0IiksIHNpemU9NCkgKw0KICAgIGdlb21fcG9pbnQoYWVzKHkgPSB5dmFsdWVzLCBjb2xvciA9ICJ5dmFsdWVzIiksIHNpemU9NCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9ICIgIFRlbmTDqm5jaWEgZGUgw7NiaXRvcyBQUiAiLCB4PTE1LCB5PXkrLjIqeSksIGNvbG9yPSJyZWQiLCBzaXplPTEwKSsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gInBhcmEgb3MgcHLDs3hpbW9zIDcgZGlhczoiLCB4PTE1LCB5PXkpLCBjb2xvcj0icmVkIiwgc2l6ZT0xMCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHByZXZfN1sxXSwgeD0zMywgeT15Ky4xKnkpLCBjb2xvcj0iYmxhY2siLCBzaXplPTEwKSsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcHJldl83WzJdLCB4PTM4LCB5PXkrLjEqeSksIGNvbG9yPSJibGFjayIsIHNpemU9MTApKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwcmV2XzdbM10sIHg9NDMsIHk9eSsuMSp5KSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0xMCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHByZXZfN1s0XSwgeD00OCwgeT15Ky4xKnkpLCBjb2xvcj0iYmxhY2siLCBzaXplPTEwKSsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcHJldl83WzVdLCB4PTUzLCB5PXkrLjEqeSksIGNvbG9yPSJibGFjayIsIHNpemU9MTApKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwcmV2XzdbNl0sIHg9NTgsIHk9eSsuMSp5KSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0xMCkrDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHByZXZfN1s3XSwgeD02MiwgeT15Ky4xKnkpLCBjb2xvcj0iYmxhY2siLCBzaXplPTEwKQ0KDQpgYGANCg0KDQoNCiMgQ2Fzb3Mgbm92b3MgZSDDs2JpdG9zIG5vdm9zIHBvciBkaWENCg0KYGBge3IgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MTZ9DQpjb3ZpZHNhdWRlICU+JSBncm91cF9ieShkYXRhKSAlPiUgc3VtbWFyaXNlKG9iaXRvc19ub3Zvcz1zdW0ob2JpdG9zTm92b3MpLGNhc29zX25vdm9zPXN1bShjYXNvc05vdm9zKSkgJT4lDQogIGdncGxvdChhZXMoZGF0YSkpICsgICB0aGVtZV9idyhiYXNlX3NpemUgPSAxNikrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkgKw0KICB5bGFiKCJjb3ZpZDE5IC0gQ2Fzb3MgZSDDk2JpdG9zIikgKyB4bGFiKCJkaWEiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsNCiAgZ2VvbV9wb2ludChhZXMoeSA9IG9iaXRvc19ub3ZvcywgY29sb3IgPSAib2JpdG9zX25vdm9zIiksIHNpemU9NCkgKw0KICBnZW9tX3BvaW50KGFlcyh5ID0gY2Fzb3Nfbm92b3MsIGNvbG9yID0gImNhc29zX25vdm9zIiksIHNpemU9NCkNCg0KIyDDs2JpdG9zID4wDQpjb3ZpZHNhdWRlICU+JSBncm91cF9ieShkYXRhKSAlPiUgc3VtbWFyaXNlKG9iaXRvc19ub3Zvcz1zdW0ob2JpdG9zTm92b3MpLGNhc29zX25vdm9zPXN1bShjYXNvc05vdm9zKSkgICU+JSBmaWx0ZXIob2JpdG9zX25vdm9zPjApICU+JQ0KICBnZ3Bsb3QoYWVzKGRhdGEpKSArICAgdGhlbWVfYncoYmFzZV9zaXplID0gMTYpKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT05MCkpICsNCiAgeWxhYigiY292aWQxOSAtIENhc29zIGUgw5NiaXRvcyIpICsgeGxhYigiZGlhIC0gYSBwYXJ0aXIgZG8gcHJpbWVpcm8gw7NiaXRvIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArDQogIGdlb21fcG9pbnQoYWVzKHkgPSBvYml0b3Nfbm92b3MsIGNvbG9yID0gIm9iaXRvc19ub3ZvcyIpLCBzaXplPTQpICsNCiAgZ2VvbV9wb2ludChhZXMoeSA9IGNhc29zX25vdm9zLCBjb2xvciA9ICJjYXNvc19ub3ZvcyIpLCBzaXplPTQpDQoNCmBgYA0KDQoNCg0KDQojIMOTYml0b3Mgbm92b3MgcG9yIHJlZ2nDo28NCg0KYGBge3J9DQpjIDwtIGNvdmlkc2F1ZGUgJT4lIGdyb3VwX2J5KHJlZ2lhbykgJT4lIHN1bW1hcmlzZShvYml0b3NfTm92b3M9c3VtKG9iaXRvc05vdm9zKSklPiUgbXV0YXRlKFRvdF9wZXJjPShvYml0b3NfTm92b3Mvc3VtKG9iaXRvc19Ob3ZvcykpKSU+JSBhcnJhbmdlKGRlc2MoKFRvdF9wZXJjKSkpICAlPiUgbXV0YXRlKFRvdF9wZXJjPXJvdW5kKFRvdF9wZXJjLDQpKSANCmMNCg0KZ2dwbG90KGMsIGFlcyh4ID0gcmVvcmRlcihyZWdpYW8sb2JpdG9zX05vdm9zKSwgeT0gb2JpdG9zX05vdm9zLCBmaWxsID0gYXMuZmFjdG9yKHJlZ2lhbykpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IixzaG93LmxlZ2VuZCA9IEYpICsNCiAgbGFicyhmaWxsID0gInJlZ2lhbyIpICArICAgdGhlbWVfYncoYmFzZV9zaXplID0gMTYpICsgeWxhYiAoIsOTYml0b3MiKSAreGxhYiAoIlJlZ2nDo28iKSsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1vYml0b3NfTm92b3MpLHZqdXN0PS0wLjIsIGNvbG9yPSJibGFjayIsIHNpemU9NSkNCg0KYGBgDQoNCiMgw5NiaXRvcyBub3ZvcyBwb3IgZXN0YWRvDQoNCg0KYGBge3IgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MTZ9DQpkIDwtIGNvdmlkc2F1ZGUgJT4lIGdyb3VwX2J5KHJlZ2lhbyxlc3RhZG8pICU+JSBzdW1tYXJpc2Uob2JpdG9zX05vdm9zPXN1bShvYml0b3NOb3ZvcykpJT4lIG11dGF0ZShUb3RfcGVyYz0ob2JpdG9zX05vdm9zL3N1bShvYml0b3NfTm92b3MpKSkgJT4lIGFycmFuZ2UoZGVzYygoVG90X3BlcmMpKSkgICU+JSBtdXRhdGUoVG90X3BlcmM9cm91bmQoVG90X3BlcmMsNCkpIA0KZA0KDQoNCmdncGxvdChkLCBhZXMoeCA9IHJlb3JkZXIoZXN0YWRvLG9iaXRvc19Ob3ZvcyksIHk9IG9iaXRvc19Ob3ZvcywgZmlsbCA9IHJlZ2lhbykpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLHNob3cubGVnZW5kID0gVCkgKw0KICBsYWJzKGZpbGwgPSAiUmVnacOjbyIpKw0KICAgdGhlbWVfYncoYmFzZV9zaXplID0gMTgpICsgeWxhYiAoIsOTYml0b3MiKSArIHhsYWIgKCJFc3RhZG8iKSsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1vYml0b3NfTm92b3MpLHZqdXN0PS0wLjIsIGNvbG9yPSJibGFjayIsIHNpemU9NSkNCg0KDQoNCg0KDQpgYGANCg0KIyBMZXRhbGlkYWRlIHBvciBlc3RhZG8gKMOzYml0b3MvY29uZmlybWFkb3MpDQoNCmBgYHtyIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTE2fQ0KZSA8LSBjb3ZpZHNhdWRlICU+JSBncm91cF9ieShyZWdpYW8sZXN0YWRvKSAlPiUgc3VtbWFyaXNlKHRvdGFsX29iPXN1bShvYml0b3NOb3ZvcyksdG90YWxfY2Fzb3M9c3VtKGNhc29zTm92b3MpKSAlPiUNCiAgbXV0YXRlKExldGFsaWRhZGU9KHRvdGFsX29iL3RvdGFsX2Nhc29zKSkgJT4lIGFycmFuZ2UoZGVzYygoTGV0YWxpZGFkZSkpKSAlPiUgbXV0YXRlKExldGFsaWRhZGU9cm91bmQoTGV0YWxpZGFkZSwyKSkNCg0KZ2dwbG90KGUsIGFlcyh4ID0gcmVvcmRlcihlc3RhZG8sTGV0YWxpZGFkZSksIHk9IExldGFsaWRhZGUsIGZpbGwgPSBhcy5mYWN0b3IocmVnaWFvKSkpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLHNob3cubGVnZW5kID0gVCkgKw0KICBsYWJzKGZpbGwgPSAiUmVnacOjbyIpICArICAgdGhlbWVfYncoYmFzZV9zaXplID0gMTYpICsgeWxhYiAoIkxldGFsaWRhZGUiKSArIHhsYWIoIkVzdGFkbyIpKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsPUxldGFsaWRhZGUpLHZqdXN0PS0wLjUsIGNvbG9yPSJibGFjayIsIHNpemU9NSkNCg0KDQpgYGANCg0KIyBDYXNvcyBhY3VtdWxhZG9zIHBvciBkaWENCg0KYGBge3J9DQpjb3ZpZHNhdWRlICU+JSBncm91cF9ieShkYXRhKSAlPiUgc3VtbWFyaXNlKHRvdGFsPXN1bShjYXNvc0FjdW11bGFkb3MpKQ0KYGBgDQojIMOTYml0b3MgYWN1bXVsYWRvcyBwb3IgZGlhDQoNCmBgYHtyfQ0KY292aWRzYXVkZSAlPiUgZ3JvdXBfYnkoZGF0YSkgJT4lIHN1bW1hcmlzZSh0b3RhbD1zdW0ob2JpdG9zQWN1bXVsYWRvcykpDQoNCg0KDQpgYGANCg0KDQoNCg0KDQojIENhc29zIGFjdW11bGFkb3MgZSDDs2JpdG9zIGFjdW11bGFkb3MgcG9yIGRpYQ0KYGBge3IgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MTZ9DQoNCmNvdmlkc2F1ZGUgJT4lIGdyb3VwX2J5KGRhdGEpICU+JSBzdW1tYXJpc2Uob2JpdG9zX25vdm9zX2FjdW09c3VtKG9iaXRvc0FjdW11bGFkb3MpLGNhc29zX25vdm9zX2FjdW09c3VtKGNhc29zQWN1bXVsYWRvcykpICU+JQ0KICBnZ3Bsb3QoYWVzKGRhdGEpKSArICAgdGhlbWVfYncoYmFzZV9zaXplID0gMTYpKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT05MCkpICsNCiAgeWxhYigiY292aWQxOSAtIENhc29zIGUgw5NiaXRvcyBhY3VtdWxhZG9zIikgKyB4bGFiKCJkaWEiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsNCiAgZ2VvbV9wb2ludChhZXMoeSA9IG9iaXRvc19ub3Zvc19hY3VtLCBjb2xvciA9ICJvYml0b3Nfbm92b3MiKSwgc2l6ZT00KSArDQogIGdlb21fcG9pbnQoYWVzKHkgPSBjYXNvc19ub3Zvc19hY3VtLCBjb2xvciA9ICJjYXNvc19ub3ZvcyIpLCBzaXplPTQpDQoNCg0KYGBgDQojIENhc29zIGFjdW11bGFkb3MgZSDDs2JpdG9zIGFjdW11bGFkb3MgcG9yIGRpYSAoYSBwYXJ0aXIgZG8gMcK6IMOzYml0bykNCmBgYHtyIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTE2fQ0KDQojIMOzYml0b3MgPjANCmNvdmlkc2F1ZGUgJT4lIGdyb3VwX2J5KGRhdGEpICU+JSBzdW1tYXJpc2Uob2JpdG9zX25vdm9zX2FjdW09c3VtKG9iaXRvc0FjdW11bGFkb3MpLGNhc29zX25vdm9zX2FjdW09c3VtKGNhc29zQWN1bXVsYWRvcykpICAlPiUgZmlsdGVyKG9iaXRvc19ub3Zvc19hY3VtPjApICU+JQ0KICBnZ3Bsb3QoYWVzKGRhdGEpKSArICAgdGhlbWVfYncoYmFzZV9zaXplID0gMTYpKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT05MCkpICsNCiAgeWxhYigiY292aWQxOSAtIENhc29zIGUgw5NiaXRvcyBhY3VtdWxhZG9zIikgKyB4bGFiKCJkaWEgLSBhIHBhcnRpciBkbyBwcmltZWlybyDDs2JpdG8gIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArDQogIGdlb21fcG9pbnQoYWVzKHkgPSBvYml0b3Nfbm92b3NfYWN1bSwgY29sb3IgPSAib2JpdG9zX25vdm9zX2FjdW0iKSwgc2l6ZT00KSArIA0KICBnZW9tX3BvaW50KGFlcyh5ID0gY2Fzb3Nfbm92b3NfYWN1bSwgY29sb3IgPSAiY2Fzb3Nfbm92b3NfYWN1bSIpLCBzaXplPTQpIA0KDQpgYGANCg0KDQoNCiMgQ2Fzb3MgZSDDs2JpdG9zIG5vdm9zIHBvciByZWdpw6NvDQoNCmBgYHtyIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTEyLCB3YXJuaW5nPUZBTFNFfQ0KDQphIDwtY292aWRzYXVkZSAlPiUgZ3JvdXBfYnkocmVnaWFvKSAlPiUgc3VtbWFyaXNlKGNhc29zX25vdm9zPXN1bShjYXNvc05vdm9zKSxvYml0b3NfTm92b3M9c3VtKG9iaXRvc05vdm9zKSkNCmEgPC0gc3RhY2soYSkNCmE8LSBjYmluZChhLCBSZWdpYW89YygiQ2VudHJvLU9lc3RlIiwiTm9yZGVzdGUiLCJOb3J0ZSIsICJTdWRlc3RlIiwiU3VsIiwiQ2VudHJvLU9lc3RlIiwiTm9yZGVzdGUiLCJOb3J0ZSIsICJTdWRlc3RlIiwiU3VsIikpDQpjb2xuYW1lcyhhKSA8LSBjKCJmcmVxdcOqbmNpYSIsIkNhc29zX8OzYml0b3MiLCJSZWdpw6NvIikNCiNhIDwtIGFycmFuZ2UoYSxmcmVxdcOqbmNpYSkNCiNhDQoNCmdncGxvdChkYXRhPWEsIGFlcyh4PXJlb3JkZXIoUmVnacOjbyxmcmVxdcOqbmNpYSksIHk9ZnJlcXXDqm5jaWEsIGZpbGw9Q2Fzb3Nfw7NiaXRvcykpICsNCmdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgpKSsNCmdlb21fdGV4dChhZXMobGFiZWwgPSBmcmVxdcOqbmNpYSksIHZqdXN0ID0gLS41LCBjb2xvciA9ICJibGFjayIsDQpwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDEpLCBzaXplID0gNSkrIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE2KSArIHlsYWIgKCJGcmVxdcOqbmNpYSIpICt4bGFiICgiUmVnacOjbyIpDQoNCg0KDQpgYGANCg0KDQoNCg0KDQoNCg0KDQogIA0KICANCiAgDQogIA0KICANCg0KICANCmBgYHtyIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTE2fQ0KIyBjYXNvcyBub3ZvcyBwb3IgUmVnacOjbyBlIEVzdGFkbyAgDQoNCiNjb3ZpZHNhdWRlICU+JSANCiMgIGdncGxvdChhZXMoeCA9IHJlZ2lhbywgeSA9IGNhc29zTm92b3MpKSArIGdlb21fYm94cGxvdChhZXMoZmlsbCA9IHJlZ2lhbyksIHNob3cubGVnZW5kID0gRkFMU0UpKyB0aGVtZV9idygpKyB5bGFiKCJjb3ZpZDE5IC0gQnJhc2lsIC0gQ2Fzb3NfTm92b3MiKSArIHhsYWIoIkVzdGFkbyIpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9OTApKSAjKyBmYWNldF93cmFwKH4gcmVnaWFvKSMrIGZhY2V0X2dyaWQoLn5lc3RhZG8pDQoNCiNjb3ZpZHNhdWRlICU+JSBhcnJhbmdlKGRlc2MoKGNhc29zTm92b3MpKSkgJT4lDQojICBnZ3Bsb3QoYWVzKHggPSBlc3RhZG8sIHkgPSBjYXNvc05vdm9zKSkgKyBnZW9tX2JveHBsb3QoYWVzKGZpbGwgPSByZWdpYW8pLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSsgdGhlbWVfYncoKSsgeWxhYigiY292aWQxOSAtIEJyYXNpbCAtIENhc29zX05vdm9zIikgKyB4bGFiKCJFc3RhZG8iKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkgIysgZmFjZXRfd3JhcCh+IHJlZ2lhbykjKyBmYWNldF9ncmlkKC5+ZXN0YWRvKQ0KDQpgYGANCiAgDQogIA0KICANCmBgYHtyIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTE2fQ0KIyDDs2JpdG9zIG5vdm9zIHBvciBSZWdpw6NvIGUgRXN0YWRvICANCg0KI2Nvdmlkc2F1ZGUgPC0gYXJyYW5nZShjb3ZpZHNhdWRlLGRlc2MoY2Fzb3NOb3ZvcykpDQoNCiNnZ3Bsb3QoY292aWRzYXVkZSwgYWVzKHggPSByZWdpYW8sIHkgPSBvYml0b3NOb3ZvcyApKSArIGdlb21fYm94cGxvdChhZXMoZmlsbCA9IHJlZ2lhbyksIHNob3cubGVnZW5kID0gRkFMU0UpKyB0aGVtZV9idygpKw0KIyAgeWxhYigiY292aWQxOSAtIEJyYXNpbCAtIMOTYml0b3NfTm92b3MiKSArIHhsYWIoIkVzdGFkbyIpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9OTApKSANCiAgDQojZ2dwbG90KGNvdmlkc2F1ZGUsIGFlcyh4ID0gZXN0YWRvLCB5ID0gb2JpdG9zTm92b3MgKSkgKyBnZW9tX2JveHBsb3QoYWVzKGZpbGwgPSByZWdpYW8pLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSsgdGhlbWVfYncoKSsNCiMgIHlsYWIoImNvdmlkMTkgLSBCcmFzaWwgLSDDk2JpdG9zX05vdm9zIikgKyB4bGFiKCJFc3RhZG8iKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkgDQoNCg0KYGBgDQogIA==