Serendib 1.0 is the first ever high altitude balloon launched by SEDS Sri Lanka. It was launched from D.S.Senanayaka College Dambulla on 26th December 2020 and the payload was recovered near Rideebendiella area on the same day.
library(leaflet)
leaflet() %>%
addTiles() %>%
setView(lng=80.47522, lat =7.802725, zoom = 10)%>%
addMarkers(lat=7.85772, lng=80.69006,
label = "Launch Site" ,
popup = "Serendib 1.0 Launch Site",
icon= icons(
iconUrl = "balloon launch.png",
iconWidth = 33, iconHeight = 76,
iconAnchorX = 22, iconAnchorY = 94,))%>%
addMarkers(lat=7.74773, lng=80.26038,
label= "Land Site",
popup = "Serendib 1.0 Payload Land Site",
icon= icons(
iconUrl = "balloon land.png",
iconWidth = 33, iconHeight = 76,
iconAnchorX = 22, iconAnchorY = 94,) )
Four different types of atmospheric data were collected continuously during the whole flight period. They are the altitude, pressure, temperature and humidity. The following window shows how we collected a summary of data for analyzing the data we collected.
dataset <- read.csv("data.csv")
df<- data.frame(
dataset$Time..Edited.,
dataset$GPS.altitude..km.,
dataset$iMet.pressure..mb.,
dataset$iMet.air.temperature..corrected...deg.C.,
dataset$iMet.humidity..RH...)
columns = list("Time","Altitude","Pressure","Temperature","Humidity")
for (i in 1:5) {
names(df)[i] <- columns[i]
}
summary(df[,2:5])
Altitude Pressure Temperature Humidity
Min. : 0.335 Min. : 12.51 Min. :-81.500 Min. : 0.30
1st Qu.: 5.439 1st Qu.:186.25 1st Qu.:-49.810 1st Qu.: 4.10
Median : 8.034 Median :370.94 Median :-17.880 Median : 6.30
Mean : 9.703 Mean :370.17 Mean :-24.888 Mean : 20.70
3rd Qu.:12.550 3rd Qu.:521.68 3rd Qu.: -2.167 3rd Qu.: 33.75
Max. :29.649 Max. :987.02 Max. : 23.020 Max. :100.00
NA's :216
It can be seen that the highest altitude achieved is 29.649 km and that was achieved approximately after 1 hour and 20 minutes. The total flight time is 1 hour and 48 minutes, but including the retrieval time, the total mission took approximately 3 hours.
It was planned to have an ascend rate of 5 ms-1 and a descend rate of 6 ms-1. Even though , the achieved ascend rate was 5.74ms-1 and a descend rate was 21.38 ms-1 as shown in the figure below.
alt_max_row<-which.max(df$Altitude)
ascend_rate<-(df[alt_max_row,"Altitude"]-df[1,"Altitude"])/(df[alt_max_row,"Time"]-df[1,"Time"])/18*5
descend_rate<-(df[alt_max_row,"Altitude"]-df[1175,"Altitude"])/(df[alt_max_row,"Time"]-df[1175,"Time"])/18*5
cat("Ascend rate of the balloon is",ascend_rate,"ms−1","\nDescend rate of the balloon is",-descend_rate,"ms−1")
Ascend rate of the balloon is 5.738204 ms-1
Descend rate of the balloon is 21.38147 ms-1
library(ggplot2)
plot_A_vs_T<-ggplot(data=df,aes(x=Time,y=Altitude))+
geom_point(na.rm = TRUE,aes(colour = factor(Time<1.420085)))+
geom_quantile(method = "rqss",quantiles = c(0.5),color="#9573C9",alpha=0.8,size=1,na.rm = TRUE,lambda=5)+
theme(
plot.title = element_text(color="#276BB0",size=14,face="bold.italic",hjust = 0.5),
axis.title.x = element_text(color="#343434",size=12,face="bold"),
axis.title.y = element_text(color="#343434",size=12,face="bold"),
plot.caption = element_text(color="#3A4D5C"),
plot.caption.position = "plot",
legend.position = "right")+
labs(x="Time (h)",y="Altitude(km)",title ="Graph of Altitude vs Time",
caption ="Serendib 1.0 Radiosonde data © SEDS Sri Lanka")+
scale_colour_hue(name = "Legend",labels=c("Descend", "Ascend"))+
annotate(geom = "text", x = 0.6, y = 18, label = "5.74"~ms^-1)+
annotate(geom = "text", x = 1.725, y = 18, label = "21.38"~ms^-1)
plot_A_vs_T

According to the above chart, the balloon passed through three atmospheric layers during its fight time. troposphere (altitude < 11km) tropopause (11km<altitude<20km) :the lower boundary of stratosphere stratopause (20km<altitude<32km):upper boundary of stratosphere.
The International Standard Atmosphere(ISA) model has few equations to calculate the temperature and pressure change with altitude.
For the troposphere: \[T=T_0+L_{Trop.}h\] \[P=P_0\left(1+\frac{L_{Trop}.h}{T_0}\right)^{\frac{-gM}{RL_{Trop.}}}\]
For the tropopause: \[T=216.65\hspace{2pt}K\hspace{4pt}(-56.5^0C)\] \[P=22633.e^{\left(\frac{-gM(h-11000)}{216.65R}\right)}\]
For the stratopause: \[T=216.65+L_{Strat.}(h-20000)\] \[P=5475.2\left(\frac{216.65+L_{Strat.}h}{216.65+20000L_{Strat.}}\right)\] The following graph shows how the temperature varies with the altitude according to our dataset and ISA equations.
#Graph by dataset
plot_T_vs_A = ggplot(data = df,aes(x=Altitude,y=Temperature))+
geom_point(na.rm = TRUE,aes(color=factor(Time<1.420085)),alpha=0.3)+
geom_quantile(method = "rqss",quantiles = c(0.5),color="#9573C9",alpha=0.8,size=1,na.rm = TRUE,lambda = 5)+
theme(
plot.title = element_text(color="#276BB0",size=14,face="bold.italic",hjust = 0.5),
axis.title.x = element_text(color="#343434",size=11,face="bold"),
axis.title.y = element_text(color="#343434",size=11,face="bold"),
plot.caption = element_text(color="#3A4D5C"),
plot.caption.position = "plot",
legend.position = "right")+
labs(x="Altitude (km)",y="Temperature (°C)",title ="Graph of Temperature vs Altitude",
caption ="Serendib 1.0 Radiosonde data © SEDS Sri Lanka")+
scale_colour_hue(name = "Data From\nRadiosond",labels=c("Descend", "Ascend"))+
annotate(geom = "text", x = 1, y = -30, label = "Graph\naccording\nto ISA eqations", hjust = 0)+
annotate(geom = "text", x = 14, y = -5, label = "Graph according\nto dataset", hjust = 1)
#Graph by ISA Equations
T0=15+273.15
Ltrop= -0.0065
Lstat= 0.001
xts <- seq(0,11,by=0.001)
f1 <- function(xts) (T0+Ltrop*xts*1000)-273.15
plot_T_vs_A<-plot_T_vs_A+stat_function(fun=f1, colour="#3366FF",xlim = c(0,11),size=1)
xtp <- seq(11.001,20,by=0.001)
f2 <- function(xtp) -56.5
plot_T_vs_A<-plot_T_vs_A+stat_function(fun=f2, colour="#3366FF",xlim = c(11,20),size=1)
xsp <- seq(20.001,30,by=0.001)
f3 <- function(xsp) -56.5+Lstat*(xsp-20)*1000
plot_T_vs_A<-plot_T_vs_A+stat_function(fun=f3, colour="#3366FF",xlim = c(20,30),size=1)
plot_T_vs_A

The following graph shows how the pressure varies with the altitude according to our dataset and ISA equations.
#Graph by dataset
plot_P_vs_A = ggplot(data = df,aes(x=Altitude,y=Pressure))+
geom_point(na.rm = TRUE,aes(color=factor(Time<1.420085)),alpha=0.3)+
geom_quantile(method = "rqss",quantiles = c(0.5),color="RED",alpha=0.8,size=1,na.rm = TRUE,lambda = 5)+
theme(
plot.title = element_text(color="#276BB0",size=14,face="bold.italic",hjust = 0.5),
axis.title.x = element_text(color="#343434",size=11,face="bold"),
axis.title.y = element_text(color="#343434",size=11,face="bold"),
plot.caption = element_text(color="#3A4D5C"),
plot.caption.position = "plot",
legend.position = "right")+
labs(x="Altitude (km)",y="Pressure (mbar)",title ="Graph of Pressure vs Altitude",
caption ="Serendib 1.0 Radiosonde data © SEDS Sri Lanka")+
scale_colour_hue(name = "Data From\nRadiosond",labels=c("Descend", "Ascend"))+
annotate(geom = "text", x = 11.5, y = 950, label = "Red line - Graph according to dataset", hjust = 0,size=3.5,color="#5F6062")+
annotate(geom = "text", x = 11.5, y = 880, label = "Blue line - Graph according to ISA equations", hjust = 0,size=3.5,color="#5F6062")
#Graph by ISA Equations
P0=101325
R= 8.31432
g= 9.80665
M=0.0289644
Ltrop= -0.0065
Lstrat= 0.001
T0=273.15+15
xpts <- seq(0,11,by=0.001)
fp1 <- function(xpts) (P0*(1+Ltrop*xpts*1000/T0)^(-g*M/R/Ltrop))/100
pdat <- data.frame(x=xpts,y=(P0*(1+Ltrop*xpts*1000/T0)^(-g*M/R/Ltrop))/100)
plot_P_vs_A<-plot_P_vs_A+stat_function(fun=fp1, colour="#3366FF",xlim = c(0,11),size=1)
xptp <- seq(11.001,20,by=0.001)
fp2 <- function(xptp) (22633*exp(-g*M*(xptp-11)*1000/216.65/R))/100
pdat <- rbind(pdat,data.frame(x=xptp,y=(22633*exp(-g*M*(xptp-11)*1000/216.65/R))/100))
plot_P_vs_A<-plot_P_vs_A+stat_function(fun=fp2, colour="#3366FF",xlim = c(11,20),size=1)
xpsp <- seq(20.001,30,by=0.001)
fp3 <- function(xpsp) (5475.2*((216.65+Lstrat*xpsp*1000)/(216.65+20000*Lstrat)))/100
pdat <- rbind(pdat,data.frame(x=xpsp,y=(5475.2*((216.65+Lstrat*xpsp*1000)/(216.65+20000*Lstrat)))/100))
plot_P_vs_A<-plot_P_vs_A+stat_function(fun=fp3, colour="#3366FF",xlim = c(20,30),size=1)
plot_P_vs_A

The humidity data collected can be plotted as shown below.
plot_H_vs_A = ggplot(data = df,aes(x=Altitude,y=Humidity))+
geom_point(na.rm = TRUE,aes(color=factor(Time<1.420085)),alpha=0.3)+
geom_quantile(method = "rqss",quantiles = c(0.5),color="#663494",alpha=0.8,size=1,na.rm = TRUE,lambda = 5)+
theme(
plot.title = element_text(color="#276BB0",size=14,face="bold.italic",hjust = 0.5),
axis.title.x = element_text(color="#343434",size=11,face="bold"),
axis.title.y = element_text(color="#343434",size=11,face="bold"),
plot.caption = element_text(color="#3A4D5C"),
plot.caption.position = "plot",
legend.position = "right")+
labs(x="Altitude (km)",y="Humidity (%)",title ="Graph of Humidity vs Altitude",
caption ="Serendib 1.0 Radiosonde data © SEDS Sri Lanka")+
scale_colour_hue(name = "Data From\nRadiosond",labels=c("Descend", "Ascend"))
plot_H_vs_A

Discussion
The Overall launch was successful even though some of the results obtained varied from the expected results predicted before launch.
The slight variation of the actual ascend rate when compared with the predicted ascend rate may have been due to variation of wind directions and speeds after the launch. It may have also varied slightly due to the amount of gas filled inside the balloon varying slightly than the calculated value in simulations.
The large variation in the descent rate may have been a result of the blasted balloon falling on top of the parachute and the parachute not deploying the correct way which may have caused an increase of speed in the payload. The parachute may also have been pre tangled prior to deploying due to high winds which may have resulted in incorrect deployment of the parachute. Both rise and fall show linear graphs therefore both ascend and descend rates were constant throughout the journey.
The highest altitude achieved was nearly equal to the pre calculated highest altitude and therefore the amount of gas filled to the balloon has been almost exactly the pre calculated amount and the slight variation may have been due to the dew formation on the balloon prior to launch.
The temperature variations have been almost the same in both ascend and descent and have reached a minimum at the same altitude both when rising and falling. The rise in temperature after a certain altitude is due to the Ozone layer existing in that altitude.
Pressure variation is also seen to overlap in ascent as well and in descent. Few sudden variations in humidity can be seen due to the atmospheric conditions on that day of the launch.
A project by SEDS Sri Lanka
Project Managers
Amila Sandun Basnayaka·Thilan Harshana·Thashmila Araliya·Bhanuka Ranaweera·Thilangi Kasthuriarachchi
Organizing Committee
Dasuni Hewawasam·Tharika Dishani·Sharadha Samarakoon·Supeshi Wedagedara·Aseka Warnasooriya·Bhathiya Senevirathna·Matheesha Senanayaka·Michelle Fernando·Subhoda Rathnayaka·Ajan Eshwara
Technical Team
Madhushan Subash·Maneesh Yatiwala·Yasika Gunathilaka·Ushan Sakuntha·Charitha Weerasooriya·Tharindu Kavinda·Vanodya Warnasooriya·Anupa Kulathunga
Financial and Marketing Team
Rashane Pintoe·Pudbudika Wickramasinghe·Ravindu Balasooriya·Raveesha Illesinghe·Tharuni Priyangika·Malsha Rajapaksha
Developed by Anupa Kulathunga
Copyright © 2021 SEDS Sri Lanka. All rights reserved
LS0tDQp0aXRsZTogIlNlcmVuZGliIDEuMCINCmF1dGhvcjogIlNFRFMgU3JpIExhbmthIg0Kc3VidGl0bGU6IEhpZ2ggQWx0aXR1ZGUgQmFsbG9vbg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogIHBkZl9kb2N1bWVudDogZGVmYXVsdA0KICB3b3JkX2RvY3VtZW50OiBkZWZhdWx0DQphbHdheXNfYWxsb3dfaHRtbDogdHJ1ZQ0KLS0tDQoNCg0KKipTZXJlbmRpYiAxLjAqKiBpcyB0aGUgZmlyc3QgZXZlciBoaWdoIGFsdGl0dWRlIGJhbGxvb24gbGF1bmNoZWQgYnkgU0VEUyBTcmkgTGFua2EuIEl0IHdhcyBsYXVuY2hlZCBmcm9tICpELlMuU2VuYW5heWFrYSBDb2xsZWdlIERhbWJ1bGxhKiBvbiAyNnRoIERlY2VtYmVyIDIwMjAgYW5kIHRoZSBwYXlsb2FkIHdhcyByZWNvdmVyZWQgbmVhciAqUmlkZWViZW5kaWVsbGEqIGFyZWEgb24gdGhlIHNhbWUgZGF5Lg0KDQpgYGB7cn0NCmxpYnJhcnkobGVhZmxldCkNCmxlYWZsZXQoKSAlPiUNCiAgYWRkVGlsZXMoKSAlPiUNCiAgc2V0Vmlldyhsbmc9ODAuNDc1MjIsIGxhdCA9Ny44MDI3MjUsICB6b29tID0gMTApJT4lDQogIGFkZE1hcmtlcnMobGF0PTcuODU3NzIsIGxuZz04MC42OTAwNiwgDQogICAgICAgICAgICAgbGFiZWwgPSAiTGF1bmNoIFNpdGUiICwNCiAgICAgICAgICAgICBwb3B1cCA9ICJTZXJlbmRpYiAxLjAgTGF1bmNoIFNpdGUiLA0KICAgICAgICAgICAgIGljb249IGljb25zKA0KICAgICAgICAgICAgICAgaWNvblVybCA9ICJiYWxsb29uIGxhdW5jaC5wbmciLA0KICAgICAgICAgICAgICAgaWNvbldpZHRoID0gMzMsIGljb25IZWlnaHQgPSA3NiwNCiAgICAgICAgICAgICAgIGljb25BbmNob3JYID0gMjIsIGljb25BbmNob3JZID0gOTQsKSklPiUNCiAgYWRkTWFya2VycyhsYXQ9Ny43NDc3MywgbG5nPTgwLjI2MDM4LCANCiAgICAgICAgICAgICBsYWJlbD0gIkxhbmQgU2l0ZSIsIA0KICAgICAgICAgICAgIHBvcHVwID0gIlNlcmVuZGliIDEuMCBQYXlsb2FkIExhbmQgU2l0ZSIsIA0KICAgICAgICAgICAgIGljb249IGljb25zKA0KICAgICAgICAgICAgICAgaWNvblVybCA9ICJiYWxsb29uIGxhbmQucG5nIiwNCiAgICAgICAgICAgICAgIGljb25XaWR0aCA9IDMzLCBpY29uSGVpZ2h0ID0gNzYsDQogICAgICAgICAgICAgICBpY29uQW5jaG9yWCA9IDIyLCBpY29uQW5jaG9yWSA9IDk0LCkgKQ0KYGBgDQoNCkZvdXIgZGlmZmVyZW50IHR5cGVzIG9mIGF0bW9zcGhlcmljIGRhdGEgd2VyZSBjb2xsZWN0ZWQgY29udGludW91c2x5IGR1cmluZyB0aGUgd2hvbGUgZmxpZ2h0IHBlcmlvZC4gVGhleSBhcmUgdGhlIGFsdGl0dWRlLCBwcmVzc3VyZSwgdGVtcGVyYXR1cmUgYW5kIGh1bWlkaXR5LiBUaGUgZm9sbG93aW5nIHdpbmRvdyBzaG93cyBob3cgd2UgY29sbGVjdGVkIGEgc3VtbWFyeSBvZiBkYXRhIGZvciBhbmFseXppbmcgdGhlIGRhdGEgd2UgY29sbGVjdGVkLg0KYGBge3J9DQpkYXRhc2V0IDwtIHJlYWQuY3N2KCJkYXRhLmNzdiIpDQpkZjwtIGRhdGEuZnJhbWUoDQogIGRhdGFzZXQkVGltZS4uRWRpdGVkLiwNCiAgZGF0YXNldCRHUFMuYWx0aXR1ZGUuLmttLiwNCiAgZGF0YXNldCRpTWV0LnByZXNzdXJlLi5tYi4sDQogIGRhdGFzZXQkaU1ldC5haXIudGVtcGVyYXR1cmUuLmNvcnJlY3RlZC4uLmRlZy5DLiwNCiAgZGF0YXNldCRpTWV0Lmh1bWlkaXR5Li5SSC4uLikNCg0KY29sdW1ucyA9IGxpc3QoIlRpbWUiLCJBbHRpdHVkZSIsIlByZXNzdXJlIiwiVGVtcGVyYXR1cmUiLCJIdW1pZGl0eSIpDQpmb3IgKGkgaW4gMTo1KSB7DQogIG5hbWVzKGRmKVtpXSA8LSBjb2x1bW5zW2ldDQp9DQpzdW1tYXJ5KGRmWywyOjVdKQ0KYGBgDQoNCkl0IGNhbiBiZSBzZWVuIHRoYXQgdGhlIGhpZ2hlc3QgYWx0aXR1ZGUgYWNoaWV2ZWQgaXMgICoqMjkuNjQ5IGttKiogYW5kIHRoYXQgd2FzIGFjaGlldmVkIGFwcHJveGltYXRlbHkgYWZ0ZXIgKioxIGhvdXIgYW5kIDIwIG1pbnV0ZXMqKi4gVGhlIHRvdGFsIGZsaWdodCB0aW1lIGlzICoqMSBob3VyIGFuZCA0OCBtaW51dGVzKiosIGJ1dCBpbmNsdWRpbmcgdGhlIHJldHJpZXZhbCB0aW1lLCB0aGUgdG90YWwgbWlzc2lvbiB0b29rIGFwcHJveGltYXRlbHkgKiozIGhvdXJzKiouIA0KDQpJdCB3YXMgcGxhbm5lZCB0byBoYXZlIGFuIGFzY2VuZCByYXRlIG9mICoqNSBtc14tMV4qKiBhbmQgYSBkZXNjZW5kIHJhdGUgb2YgKio2IG1zXi0xXioqLiBFdmVuIHRob3VnaCAsIHRoZSBhY2hpZXZlZCBhc2NlbmQgcmF0ZSB3YXMgKio1Ljc0bXNeLTFeKiogYW5kIGEgZGVzY2VuZCByYXRlIHdhcyAqKjIxLjM4IG1zXi0xXioqIGFzIHNob3duIGluIHRoZSBmaWd1cmUgYmVsb3cuIA0KYGBge3J9DQphbHRfbWF4X3Jvdzwtd2hpY2gubWF4KGRmJEFsdGl0dWRlKQ0KYXNjZW5kX3JhdGU8LShkZlthbHRfbWF4X3JvdywiQWx0aXR1ZGUiXS1kZlsxLCJBbHRpdHVkZSJdKS8oZGZbYWx0X21heF9yb3csIlRpbWUiXS1kZlsxLCJUaW1lIl0pLzE4KjUNCmRlc2NlbmRfcmF0ZTwtKGRmW2FsdF9tYXhfcm93LCJBbHRpdHVkZSJdLWRmWzExNzUsIkFsdGl0dWRlIl0pLyhkZlthbHRfbWF4X3JvdywiVGltZSJdLWRmWzExNzUsIlRpbWUiXSkvMTgqNQ0KY2F0KCJBc2NlbmQgcmF0ZSBvZiB0aGUgYmFsbG9vbiBpcyIsYXNjZW5kX3JhdGUsIm1z4oiSMSIsIlxuRGVzY2VuZCByYXRlIG9mIHRoZSBiYWxsb29uIGlzIiwtZGVzY2VuZF9yYXRlLCJtc+KIkjEiKQ0KDQpgYGANCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KcGxvdF9BX3ZzX1Q8LWdncGxvdChkYXRhPWRmLGFlcyh4PVRpbWUseT1BbHRpdHVkZSkpKw0KICBnZW9tX3BvaW50KG5hLnJtID0gVFJVRSxhZXMoY29sb3VyID0gZmFjdG9yKFRpbWU8MS40MjAwODUpKSkrDQogIGdlb21fcXVhbnRpbGUobWV0aG9kID0gInJxc3MiLHF1YW50aWxlcyA9IGMoMC41KSxjb2xvcj0iIzk1NzNDOSIsYWxwaGE9MC44LHNpemU9MSxuYS5ybSA9IFRSVUUsbGFtYmRhPTUpKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yPSIjMjc2QkIwIixzaXplPTE0LGZhY2U9ImJvbGQuaXRhbGljIixoanVzdCA9IDAuNSksDQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KGNvbG9yPSIjMzQzNDM0IixzaXplPTEyLGZhY2U9ImJvbGQiKSwNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoY29sb3I9IiMzNDM0MzQiLHNpemU9MTIsZmFjZT0iYm9sZCIpLA0KICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChjb2xvcj0iIzNBNEQ1QyIpLA0KICAgIHBsb3QuY2FwdGlvbi5wb3NpdGlvbiA9ICJwbG90IiwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKSsNCiAgbGFicyh4PSJUaW1lIChoKSIseT0iQWx0aXR1ZGUoa20pIix0aXRsZSA9IkdyYXBoIG9mIEFsdGl0dWRlIHZzIFRpbWUiLA0KICAgICAgIGNhcHRpb24gPSJTZXJlbmRpYiAxLjAgUmFkaW9zb25kZSBkYXRhIMKpIFNFRFMgU3JpIExhbmthIikrDQogIHNjYWxlX2NvbG91cl9odWUobmFtZSA9ICJMZWdlbmQiLGxhYmVscz1jKCJEZXNjZW5kIiwgIkFzY2VuZCIpKSsNCiAgYW5ub3RhdGUoZ2VvbSA9ICJ0ZXh0IiwgeCA9IDAuNiwgeSA9IDE4LCBsYWJlbCA9ICI1Ljc0In5tc14tMSkrDQogIGFubm90YXRlKGdlb20gPSAidGV4dCIsIHggPSAxLjcyNSwgeSA9IDE4LCBsYWJlbCA9ICIyMS4zOCJ+bXNeLTEpDQoNCnBsb3RfQV92c19UDQpgYGANCg0KQWNjb3JkaW5nIHRvIHRoZSBhYm92ZSBjaGFydCwgdGhlIGJhbGxvb24gcGFzc2VkIHRocm91Z2ggdGhyZWUgYXRtb3NwaGVyaWMgbGF5ZXJzIGR1cmluZyBpdHMgZmlnaHQgdGltZS4gDQoqKnRyb3Bvc3BoZXJlKiogKihhbHRpdHVkZSA8IDExa20pKg0KKip0cm9wb3BhdXNlKiogKigxMWttPGFsdGl0dWRlPDIwa20pIDp0aGUgbG93ZXIgYm91bmRhcnkgb2Ygc3RyYXRvc3BoZXJlKg0KKipzdHJhdG9wYXVzZSoqICooMjBrbTxhbHRpdHVkZTwzMmttKTp1cHBlciBib3VuZGFyeSBvZiBzdHJhdG9zcGhlcmUuKg0KDQpUaGUgSW50ZXJuYXRpb25hbCBTdGFuZGFyZCBBdG1vc3BoZXJlKElTQSkgbW9kZWwgaGFzIGZldyBlcXVhdGlvbnMgdG8gY2FsY3VsYXRlIHRoZSB0ZW1wZXJhdHVyZSBhbmQgcHJlc3N1cmUgY2hhbmdlIHdpdGggYWx0aXR1ZGUuDQoNCkZvciB0aGUgdHJvcG9zcGhlcmU6DQokJFQ9VF8wK0xfe1Ryb3AufWgkJA0KJCRQPVBfMFxsZWZ0KDErXGZyYWN7TF97VHJvcH0uaH17VF8wfVxyaWdodClee1xmcmFjey1nTX17Ukxfe1Ryb3AufX19JCQNCg0KRm9yIHRoZSB0cm9wb3BhdXNlOg0KJCRUPTIxNi42NVxoc3BhY2V7MnB0fUtcaHNwYWNlezRwdH0oLTU2LjVeMEMpJCQNCiQkUD0yMjYzMy5lXntcbGVmdChcZnJhY3stZ00oaC0xMTAwMCl9ezIxNi42NVJ9XHJpZ2h0KX0kJA0KDQpGb3IgdGhlIHN0cmF0b3BhdXNlOg0KJCRUPTIxNi42NStMX3tTdHJhdC59KGgtMjAwMDApJCQNCiQkUD01NDc1LjJcbGVmdChcZnJhY3syMTYuNjUrTF97U3RyYXQufWh9ezIxNi42NSsyMDAwMExfe1N0cmF0Ln19XHJpZ2h0KSQkDQpUaGUgZm9sbG93aW5nIGdyYXBoIHNob3dzIGhvdyB0aGUgdGVtcGVyYXR1cmUgdmFyaWVzIHdpdGggdGhlIGFsdGl0dWRlIGFjY29yZGluZyB0byBvdXIgZGF0YXNldCBhbmQgSVNBIGVxdWF0aW9ucy4NCmBgYHtyfQ0KI0dyYXBoIGJ5IGRhdGFzZXQNCnBsb3RfVF92c19BID0gZ2dwbG90KGRhdGEgPSBkZixhZXMoeD1BbHRpdHVkZSx5PVRlbXBlcmF0dXJlKSkrDQogIGdlb21fcG9pbnQobmEucm0gPSBUUlVFLGFlcyhjb2xvcj1mYWN0b3IoVGltZTwxLjQyMDA4NSkpLGFscGhhPTAuMykrDQogIGdlb21fcXVhbnRpbGUobWV0aG9kID0gInJxc3MiLHF1YW50aWxlcyA9IGMoMC41KSxjb2xvcj0iIzk1NzNDOSIsYWxwaGE9MC44LHNpemU9MSxuYS5ybSA9IFRSVUUsbGFtYmRhID0gNSkrDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3I9IiMyNzZCQjAiLHNpemU9MTQsZmFjZT0iYm9sZC5pdGFsaWMiLGhqdXN0ID0gMC41KSwNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoY29sb3I9IiMzNDM0MzQiLHNpemU9MTEsZmFjZT0iYm9sZCIpLA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChjb2xvcj0iIzM0MzQzNCIsc2l6ZT0xMSxmYWNlPSJib2xkIiksDQogICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGNvbG9yPSIjM0E0RDVDIiksDQogICAgcGxvdC5jYXB0aW9uLnBvc2l0aW9uID0gInBsb3QiLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpKw0KICBsYWJzKHg9IkFsdGl0dWRlIChrbSkiLHk9IlRlbXBlcmF0dXJlICjCsEMpIix0aXRsZSA9IkdyYXBoIG9mIFRlbXBlcmF0dXJlIHZzIEFsdGl0dWRlIiwNCiAgICAgICBjYXB0aW9uID0iU2VyZW5kaWIgMS4wIFJhZGlvc29uZGUgZGF0YSDCqSBTRURTIFNyaSBMYW5rYSIpKw0KICBzY2FsZV9jb2xvdXJfaHVlKG5hbWUgPSAiRGF0YSBGcm9tXG5SYWRpb3NvbmQiLGxhYmVscz1jKCJEZXNjZW5kIiwgIkFzY2VuZCIpKSsNCiAgYW5ub3RhdGUoZ2VvbSA9ICJ0ZXh0IiwgeCA9IDEsIHkgPSAtMzAsIGxhYmVsID0gIkdyYXBoXG5hY2NvcmRpbmdcbnRvIElTQSBlcWF0aW9ucyIsIGhqdXN0ID0gMCkrDQogIGFubm90YXRlKGdlb20gPSAidGV4dCIsIHggPSAxNCwgeSA9IC01LCBsYWJlbCA9ICJHcmFwaCBhY2NvcmRpbmdcbnRvIGRhdGFzZXQiLCBoanVzdCA9IDEpDQogDQojR3JhcGggYnkgSVNBIEVxdWF0aW9ucw0KVDA9MTUrMjczLjE1DQpMdHJvcD0gLTAuMDA2NQ0KTHN0YXQ9IDAuMDAxDQp4dHMgPC0gc2VxKDAsMTEsYnk9MC4wMDEpDQpmMSA8LSBmdW5jdGlvbih4dHMpIChUMCtMdHJvcCp4dHMqMTAwMCktMjczLjE1DQpwbG90X1RfdnNfQTwtcGxvdF9UX3ZzX0Erc3RhdF9mdW5jdGlvbihmdW49ZjEsIGNvbG91cj0iIzMzNjZGRiIseGxpbSA9IGMoMCwxMSksc2l6ZT0xKQ0KeHRwIDwtIHNlcSgxMS4wMDEsMjAsYnk9MC4wMDEpDQpmMiA8LSBmdW5jdGlvbih4dHApIC01Ni41DQpwbG90X1RfdnNfQTwtcGxvdF9UX3ZzX0Erc3RhdF9mdW5jdGlvbihmdW49ZjIsIGNvbG91cj0iIzMzNjZGRiIseGxpbSA9IGMoMTEsMjApLHNpemU9MSkNCnhzcCA8LSBzZXEoMjAuMDAxLDMwLGJ5PTAuMDAxKQ0KZjMgPC0gZnVuY3Rpb24oeHNwKSAtNTYuNStMc3RhdCooeHNwLTIwKSoxMDAwDQpwbG90X1RfdnNfQTwtcGxvdF9UX3ZzX0Erc3RhdF9mdW5jdGlvbihmdW49ZjMsIGNvbG91cj0iIzMzNjZGRiIseGxpbSA9IGMoMjAsMzApLHNpemU9MSkNCnBsb3RfVF92c19BDQpgYGANCg0KVGhlIGZvbGxvd2luZyBncmFwaCBzaG93cyBob3cgdGhlIHByZXNzdXJlIHZhcmllcyB3aXRoIHRoZSBhbHRpdHVkZSBhY2NvcmRpbmcgdG8gb3VyIGRhdGFzZXQgYW5kIElTQSBlcXVhdGlvbnMuDQpgYGB7cn0NCiNHcmFwaCBieSBkYXRhc2V0DQpwbG90X1BfdnNfQSA9IGdncGxvdChkYXRhID0gZGYsYWVzKHg9QWx0aXR1ZGUseT1QcmVzc3VyZSkpKw0KICBnZW9tX3BvaW50KG5hLnJtID0gVFJVRSxhZXMoY29sb3I9ZmFjdG9yKFRpbWU8MS40MjAwODUpKSxhbHBoYT0wLjMpKw0KICBnZW9tX3F1YW50aWxlKG1ldGhvZCA9ICJycXNzIixxdWFudGlsZXMgPSBjKDAuNSksY29sb3I9IlJFRCIsYWxwaGE9MC44LHNpemU9MSxuYS5ybSA9IFRSVUUsbGFtYmRhID0gNSkrDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3I9IiMyNzZCQjAiLHNpemU9MTQsZmFjZT0iYm9sZC5pdGFsaWMiLGhqdXN0ID0gMC41KSwNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoY29sb3I9IiMzNDM0MzQiLHNpemU9MTEsZmFjZT0iYm9sZCIpLA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChjb2xvcj0iIzM0MzQzNCIsc2l6ZT0xMSxmYWNlPSJib2xkIiksDQogICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGNvbG9yPSIjM0E0RDVDIiksDQogICAgcGxvdC5jYXB0aW9uLnBvc2l0aW9uID0gInBsb3QiLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpKw0KICBsYWJzKHg9IkFsdGl0dWRlIChrbSkiLHk9IlByZXNzdXJlIChtYmFyKSIsdGl0bGUgPSJHcmFwaCBvZiBQcmVzc3VyZSB2cyBBbHRpdHVkZSIsDQogICAgICAgY2FwdGlvbiA9IlNlcmVuZGliIDEuMCBSYWRpb3NvbmRlIGRhdGEgwqkgU0VEUyBTcmkgTGFua2EiKSsNCiAgc2NhbGVfY29sb3VyX2h1ZShuYW1lID0gIkRhdGEgRnJvbVxuUmFkaW9zb25kIixsYWJlbHM9YygiRGVzY2VuZCIsICJBc2NlbmQiKSkrDQogIGFubm90YXRlKGdlb20gPSAidGV4dCIsIHggPSAxMS41LCB5ID0gOTUwLCBsYWJlbCA9ICJSZWQgbGluZSAtIEdyYXBoIGFjY29yZGluZyB0byBkYXRhc2V0IiwgaGp1c3QgPSAwLHNpemU9My41LGNvbG9yPSIjNUY2MDYyIikrDQogIGFubm90YXRlKGdlb20gPSAidGV4dCIsIHggPSAxMS41LCB5ID0gODgwLCBsYWJlbCA9ICJCbHVlIGxpbmUgLSBHcmFwaCBhY2NvcmRpbmcgdG8gSVNBIGVxdWF0aW9ucyIsIGhqdXN0ID0gMCxzaXplPTMuNSxjb2xvcj0iIzVGNjA2MiIpDQoNCg0KI0dyYXBoIGJ5IElTQSBFcXVhdGlvbnMNClAwPTEwMTMyNQ0KUj0gOC4zMTQzMg0KZz0gOS44MDY2NQ0KTT0wLjAyODk2NDQNCkx0cm9wPSAtMC4wMDY1DQpMc3RyYXQ9IDAuMDAxDQpUMD0yNzMuMTUrMTUNCnhwdHMgPC0gc2VxKDAsMTEsYnk9MC4wMDEpDQpmcDEgPC0gZnVuY3Rpb24oeHB0cykgKFAwKigxK0x0cm9wKnhwdHMqMTAwMC9UMCleKC1nKk0vUi9MdHJvcCkpLzEwMA0KcGRhdCA8LSBkYXRhLmZyYW1lKHg9eHB0cyx5PShQMCooMStMdHJvcCp4cHRzKjEwMDAvVDApXigtZypNL1IvTHRyb3ApKS8xMDApDQpwbG90X1BfdnNfQTwtcGxvdF9QX3ZzX0Erc3RhdF9mdW5jdGlvbihmdW49ZnAxLCBjb2xvdXI9IiMzMzY2RkYiLHhsaW0gPSBjKDAsMTEpLHNpemU9MSkNCnhwdHAgPC0gc2VxKDExLjAwMSwyMCxieT0wLjAwMSkNCmZwMiA8LSBmdW5jdGlvbih4cHRwKSAoMjI2MzMqZXhwKC1nKk0qKHhwdHAtMTEpKjEwMDAvMjE2LjY1L1IpKS8xMDANCnBkYXQgPC0gcmJpbmQocGRhdCxkYXRhLmZyYW1lKHg9eHB0cCx5PSgyMjYzMypleHAoLWcqTSooeHB0cC0xMSkqMTAwMC8yMTYuNjUvUikpLzEwMCkpDQpwbG90X1BfdnNfQTwtcGxvdF9QX3ZzX0Erc3RhdF9mdW5jdGlvbihmdW49ZnAyLCBjb2xvdXI9IiMzMzY2RkYiLHhsaW0gPSBjKDExLDIwKSxzaXplPTEpDQp4cHNwIDwtIHNlcSgyMC4wMDEsMzAsYnk9MC4wMDEpDQpmcDMgPC0gZnVuY3Rpb24oeHBzcCkgKDU0NzUuMiooKDIxNi42NStMc3RyYXQqeHBzcCoxMDAwKS8oMjE2LjY1KzIwMDAwKkxzdHJhdCkpKS8xMDANCnBkYXQgPC0gcmJpbmQocGRhdCxkYXRhLmZyYW1lKHg9eHBzcCx5PSg1NDc1LjIqKCgyMTYuNjUrTHN0cmF0Knhwc3AqMTAwMCkvKDIxNi42NSsyMDAwMCpMc3RyYXQpKSkvMTAwKSkNCnBsb3RfUF92c19BPC1wbG90X1BfdnNfQStzdGF0X2Z1bmN0aW9uKGZ1bj1mcDMsIGNvbG91cj0iIzMzNjZGRiIseGxpbSA9IGMoMjAsMzApLHNpemU9MSkNCnBsb3RfUF92c19BDQoNCmBgYA0KDQpUaGUgKipodW1pZGl0eSoqIGRhdGEgY29sbGVjdGVkIGNhbiBiZSBwbG90dGVkIGFzIHNob3duIGJlbG93Lg0KYGBge3J9DQpwbG90X0hfdnNfQSA9IGdncGxvdChkYXRhID0gZGYsYWVzKHg9QWx0aXR1ZGUseT1IdW1pZGl0eSkpKw0KICBnZW9tX3BvaW50KG5hLnJtID0gVFJVRSxhZXMoY29sb3I9ZmFjdG9yKFRpbWU8MS40MjAwODUpKSxhbHBoYT0wLjMpKw0KICBnZW9tX3F1YW50aWxlKG1ldGhvZCA9ICJycXNzIixxdWFudGlsZXMgPSBjKDAuNSksY29sb3I9IiM2NjM0OTQiLGFscGhhPTAuOCxzaXplPTEsbmEucm0gPSBUUlVFLGxhbWJkYSA9IDUpKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yPSIjMjc2QkIwIixzaXplPTE0LGZhY2U9ImJvbGQuaXRhbGljIixoanVzdCA9IDAuNSksDQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KGNvbG9yPSIjMzQzNDM0IixzaXplPTExLGZhY2U9ImJvbGQiKSwNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoY29sb3I9IiMzNDM0MzQiLHNpemU9MTEsZmFjZT0iYm9sZCIpLA0KICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChjb2xvcj0iIzNBNEQ1QyIpLA0KICAgIHBsb3QuY2FwdGlvbi5wb3NpdGlvbiA9ICJwbG90IiwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKSsNCiAgbGFicyh4PSJBbHRpdHVkZSAoa20pIix5PSJIdW1pZGl0eSAoJSkiLHRpdGxlID0iR3JhcGggb2YgSHVtaWRpdHkgdnMgQWx0aXR1ZGUiLA0KICAgICAgIGNhcHRpb24gPSJTZXJlbmRpYiAxLjAgUmFkaW9zb25kZSBkYXRhIMKpIFNFRFMgU3JpIExhbmthIikrDQogIHNjYWxlX2NvbG91cl9odWUobmFtZSA9ICJEYXRhIEZyb21cblJhZGlvc29uZCIsbGFiZWxzPWMoIkRlc2NlbmQiLCAiQXNjZW5kIikpDQpwbG90X0hfdnNfQQ0KYGBgDQoNCiMjIyBEaXNjdXNzaW9uDQoNClRoZSBPdmVyYWxsIGxhdW5jaCB3YXMgc3VjY2Vzc2Z1bCBldmVuIHRob3VnaCBzb21lIG9mIHRoZSByZXN1bHRzIG9idGFpbmVkIHZhcmllZCBmcm9tIHRoZSBleHBlY3RlZCByZXN1bHRzIHByZWRpY3RlZCBiZWZvcmUgbGF1bmNoLg0KDQpUaGUgc2xpZ2h0IHZhcmlhdGlvbiBvZiB0aGUgYWN0dWFsIGFzY2VuZCByYXRlIHdoZW4gY29tcGFyZWQgd2l0aCB0aGUgcHJlZGljdGVkIGFzY2VuZCByYXRlIG1heSBoYXZlIGJlZW4gZHVlIHRvIHZhcmlhdGlvbiBvZiB3aW5kIGRpcmVjdGlvbnMgYW5kIHNwZWVkcyBhZnRlciB0aGUgbGF1bmNoLiBJdCBtYXkgaGF2ZSBhbHNvIHZhcmllZCBzbGlnaHRseSBkdWUgdG8gdGhlIGFtb3VudCBvZiBnYXMgZmlsbGVkIGluc2lkZSB0aGUgYmFsbG9vbiB2YXJ5aW5nIHNsaWdodGx5IHRoYW4gdGhlIGNhbGN1bGF0ZWQgdmFsdWUgaW4gc2ltdWxhdGlvbnMuDQoNClRoZSBsYXJnZSB2YXJpYXRpb24gaW4gdGhlIGRlc2NlbnQgcmF0ZSBtYXkgaGF2ZSBiZWVuIGEgcmVzdWx0IG9mIHRoZSBibGFzdGVkIGJhbGxvb24gZmFsbGluZyBvbiB0b3Agb2YgdGhlIHBhcmFjaHV0ZSBhbmQgdGhlIHBhcmFjaHV0ZSBub3QgZGVwbG95aW5nIHRoZSBjb3JyZWN0IHdheSB3aGljaCBtYXkgaGF2ZSBjYXVzZWQgYW4gaW5jcmVhc2Ugb2Ygc3BlZWQgaW4gdGhlIHBheWxvYWQuIFRoZSBwYXJhY2h1dGUgbWF5IGFsc28gaGF2ZSBiZWVuIHByZSB0YW5nbGVkIHByaW9yIHRvIGRlcGxveWluZyBkdWUgdG8gaGlnaCB3aW5kcyB3aGljaCBtYXkgaGF2ZSByZXN1bHRlZCBpbiBpbmNvcnJlY3QgZGVwbG95bWVudCBvZiB0aGUgcGFyYWNodXRlLg0KQm90aCByaXNlIGFuZCBmYWxsIHNob3cgbGluZWFyIGdyYXBocyB0aGVyZWZvcmUgYm90aCBhc2NlbmQgYW5kIGRlc2NlbmQgcmF0ZXMgd2VyZSBjb25zdGFudCB0aHJvdWdob3V0IHRoZSBqb3VybmV5Lg0KDQpUaGUgaGlnaGVzdCBhbHRpdHVkZSBhY2hpZXZlZCB3YXMgbmVhcmx5IGVxdWFsIHRvIHRoZSBwcmUgY2FsY3VsYXRlZCBoaWdoZXN0IGFsdGl0dWRlIGFuZCB0aGVyZWZvcmUgdGhlIGFtb3VudCBvZiBnYXMgZmlsbGVkIHRvIHRoZSBiYWxsb29uIGhhcyBiZWVuIGFsbW9zdCBleGFjdGx5IHRoZSBwcmUgY2FsY3VsYXRlZCBhbW91bnQgYW5kIHRoZSBzbGlnaHQgdmFyaWF0aW9uIG1heSBoYXZlIGJlZW4gZHVlIHRvIHRoZSBkZXcgZm9ybWF0aW9uIG9uIHRoZSBiYWxsb29uIHByaW9yIHRvIGxhdW5jaC4NCg0KVGhlIHRlbXBlcmF0dXJlIHZhcmlhdGlvbnMgaGF2ZSBiZWVuIGFsbW9zdCB0aGUgc2FtZSBpbiBib3RoIGFzY2VuZCBhbmQgZGVzY2VudCBhbmQgaGF2ZSByZWFjaGVkIGEgbWluaW11bSBhdCB0aGUgc2FtZSBhbHRpdHVkZSBib3RoIHdoZW4gcmlzaW5nIGFuZCBmYWxsaW5nLiBUaGUgcmlzZSBpbiB0ZW1wZXJhdHVyZSBhZnRlciBhIGNlcnRhaW4gYWx0aXR1ZGUgaXMgZHVlIHRvIHRoZSBPem9uZSBsYXllciBleGlzdGluZyBpbiB0aGF0IGFsdGl0dWRlLg0KDQpQcmVzc3VyZSB2YXJpYXRpb24gaXMgYWxzbyBzZWVuIHRvIG92ZXJsYXAgaW4gYXNjZW50IGFzIHdlbGwgYW5kIGluIGRlc2NlbnQuIEZldyBzdWRkZW4gdmFyaWF0aW9ucyBpbiBodW1pZGl0eSBjYW4gYmUgc2VlbiBkdWUgdG8gdGhlIGF0bW9zcGhlcmljIGNvbmRpdGlvbnMgb24gdGhhdCBkYXkgb2YgdGhlIGxhdW5jaC4NCg0KKioqKioqDQo8Y2VudGVyPjxmb250IHNpemU9IjEiIGFsaWduPSJjZW50ZXIiPipBIHByb2plY3QgYnkgU0VEUyBTcmkgTGFua2EqDQoNCipQcm9qZWN0IE1hbmFnZXJzKg0KDQoqQW1pbGEgU2FuZHVuIEJhc25heWFrYcK3VGhpbGFuIEhhcnNoYW5hwrdUaGFzaG1pbGEgQXJhbGl5YcK3QmhhbnVrYSBSYW5hd2VlcmHCt1RoaWxhbmdpIEthc3RodXJpYXJhY2hjaGkqDQoNCipPcmdhbml6aW5nIENvbW1pdHRlZSoNCg0KKkRhc3VuaSBIZXdhd2FzYW3Ct1RoYXJpa2EgRGlzaGFuacK3U2hhcmFkaGEgU2FtYXJha29vbsK3U3VwZXNoaSBXZWRhZ2VkYXJhwrdBc2VrYSBXYXJuYXNvb3JpeWHCt0JoYXRoaXlhIFNlbmV2aXJhdGhuYcK3TWF0aGVlc2hhIFNlbmFuYXlha2HCt01pY2hlbGxlIEZlcm5hbmRvwrdTdWJob2RhIFJhdGhuYXlha2HCt0FqYW4gRXNod2FyYSoNCg0KKlRlY2huaWNhbCBUZWFtKg0KDQoqTWFkaHVzaGFuIFN1YmFzaMK3TWFuZWVzaCBZYXRpd2FsYcK3WWFzaWthIEd1bmF0aGlsYWthwrdVc2hhbiBTYWt1bnRoYcK3Q2hhcml0aGEgV2VlcmFzb29yaXlhwrdUaGFyaW5kdSBLYXZpbmRhwrdWYW5vZHlhIFdhcm5hc29vcml5YcK3QW51cGEgS3VsYXRodW5nYSoNCg0KKkZpbmFuY2lhbCBhbmQgTWFya2V0aW5nIFRlYW0qDQoNCipSYXNoYW5lIFBpbnRvZcK3UHVkYnVkaWthIFdpY2tyYW1hc2luZ2hlwrdSYXZpbmR1IEJhbGFzb29yaXlhwrdSYXZlZXNoYSBJbGxlc2luZ2hlwrdUaGFydW5pIFByaXlhbmdpa2HCt01hbHNoYSBSYWphcGFrc2hhKjwvZm9udD48L2NlbnRlcj4NCg0KLS0tLS0tDQoNCioqKioqKg0KPGNlbnRlcj48Zm9udCBzaXplPSIxIiBhbGlnbj0iY2VudGVyIj4qRGV2ZWxvcGVkIGJ5IEFudXBhIEt1bGF0aHVuZ2EqDQoNCipDb3B5cmlnaHQgwqkgMjAyMSBTRURTIFNyaSBMYW5rYS4gQWxsIHJpZ2h0cyByZXNlcnZlZCo8L2ZvbnQ+PC9jZW50ZXI+DQoNCi0tLS0tLQ0KDQoNCg0K