The data was downloaded from CORGIS Dataset Project: Original Dataset

This dataset is all about flights in the united states, including information about the number, length, and type of delays between 2003-2016. The data is reported for individual months at every major airport for every carrier. Additional information is available: http://www.rita.dot.gov/bts/help/aviation/html/understanding.html

Attributes:

library(tidyverse)
library(ggplot2)
library(gghighlight)

#Importing the csv file to a books DataFrame
delays <- read.csv("airlines.csv")

#Viewing the DataFrame
head(delays)

Missing Values

#Identifying total number of missing values
sum(is.na(delays))
[1] 0

There are no missing values in the data.

#Identifying the column names
colnames(delays)
 [1] "Airport.Code"                                        "Airport.Name"                                       
 [3] "Time.Label"                                          "Time.Month"                                         
 [5] "Time.Month.Name"                                     "Time.Year"                                          
 [7] "Statistics...of.Delays.Carrier"                      "Statistics...of.Delays.Late.Aircraft"               
 [9] "Statistics...of.Delays.National.Aviation.System"     "Statistics...of.Delays.Security"                    
[11] "Statistics...of.Delays.Weather"                      "Statistics.Carriers.Names"                          
[13] "Statistics.Carriers.Total"                           "Statistics.Flights.Cancelled"                       
[15] "Statistics.Flights.Delayed"                          "Statistics.Flights.Diverted"                        
[17] "Statistics.Flights.On.Time"                          "Statistics.Flights.Total"                           
[19] "Statistics.Minutes.Delayed.Carrier"                  "Statistics.Minutes.Delayed.Late.Aircraft"           
[21] "Statistics.Minutes.Delayed.National.Aviation.System" "Statistics.Minutes.Delayed.Security"                
[23] "Statistics.Minutes.Delayed.Total"                    "Statistics.Minutes.Delayed.Weather"                 

As there are quite a few columns it might be helpful to look at a some some subsets of the data.

We can look at three subsets specifically:

  • Number of Flights Delayed Overall
  • Number of Flights Delayed by Reason
  • Duration of Flight Delay
#Creating a character vector named flights in which we are storing column names
flights <- c("Airport.Code","Airport.Name","Time.Month","Time.Month.Name","Time.Year","Statistics.Flights.Cancelled","Statistics.Flights.Delayed","Statistics.Flights.Diverted","Statistics.Flights.On.Time","Statistics.Flights.Total")

#Creating a dataframe with information on number of delays
delays_flights <-delays[flights]

#Creating a character vector named flights in which we are storing column names
reason <- c("Airport.Code","Airport.Name","Time.Month","Time.Month.Name","Time.Year", "Statistics...of.Delays.Carrier","Statistics...of.Delays.Late.Aircraft", "Statistics...of.Delays.National.Aviation.System","Statistics...of.Delays.Security","Statistics...of.Delays.Weather")

#Creating a dataframe with information on number of delays due to different reasons
delays_reason <-delays[reason]

#Creating a character vector named duration in which we are storing column names
duration <- c("Airport.Code","Airport.Name","Time.Month","Time.Month.Name","Time.Year","Statistics.Minutes.Delayed.Carrier","Statistics.Minutes.Delayed.Late.Aircraft","Statistics.Minutes.Delayed.National.Aviation.System","Statistics.Minutes.Delayed.Security","Statistics.Minutes.Delayed.Total","Statistics.Minutes.Delayed.Weather")

#Creating a dataframe with information on duration of delays
delays_duration <-delays[duration]

Flight Data: Number of Flights Delayed Overall

Average Flights per Month

The average percentage of flights cancelled, delayed, diverted and on time between 2003-2016.

#Average number of delayed flights per month since 2003
avg_flights_cancelled <- sum(delays_flights$Statistics.Flights.Cancelled)

#Average number of delayed flights per month since 2003
avg_flights_delayed <- sum(delays_flights$Statistics.Flights.Delayed)

#Average number of diverted flights per month since 2003
avg_flights_diverted <- sum(delays_flights$Statistics.Flights.Diverted)

#Average number of flights on time per month since 2003
avg_flights_on_time <- sum(delays_flights$Statistics.Flights.On.Time)

#Creating a Pie Chart 
flights_values = c(avg_flights_cancelled,avg_flights_delayed,avg_flights_diverted,avg_flights_on_time )
flights_labels = c("Cancelled","Delayed","Diverted","On Time")

#Calculating the percent each will be of the total
piepercent<- round(100*flights_values/sum(flights_values), 1)

# Plot the chart.
pie(flights_values, labels = piepercent, main = "Distribution of Flights per Month between 2003-2016",col = rainbow(length(flights_values)))
legend("topright", flights_labels, cex = 0.8,fill = rainbow(length(flights_values)))

On average, 77.8% of flights were On Time each month and 20.2% of flights were Delayed.

Average Flights per Month by Month of Year

The average percentage of flights cancelled, delayed, diverted and on time per month between 2003-2016.

 
#Grouping by month
month <- delays_flights %>% group_by(Time.Month)

#Creating a dataframe to store the summarized values of flights cancelled each year
delays_flights_month <- month %>% summarise(Statistics.Flights.Cancelled = mean(Statistics.Flights.Cancelled))

#Renaming the columns
colnames(delays_flights_month)[which(names(delays_flights_month) == "Time.Month")] <- "Month"
colnames(delays_flights_month)[which(names(delays_flights_month) == "Statistics.Flights.Cancelled")] <- "Cancelled"

#Summarizing by number of flights delayed each year
month_delayed <- month %>% summarise(Statistics.Flights.Delayed = mean(Statistics.Flights.Delayed))

#Adding the column to delays_flights_month
delays_flights_month$Delayed <-month_delayed$Statistics.Flights.Delayed

#Summarizing by number of flights delayed
month_delayed <- month %>% summarise(Statistics.Flights.Delayed = mean(Statistics.Flights.Delayed))
delays_flights_month$Delayed <-month_delayed$Statistics.Flights.Delayed

#Summarizing by number of flights diverted
month_diverted <- month %>% summarise(Statistics.Flights.Diverted = mean(Statistics.Flights.Diverted))
delays_flights_month$Diverted <-month_diverted$Statistics.Flights.Diverted

#Summarizing by number of flights on time
month_on_time <- month %>% summarise(Statistics.Flights.On.Time = mean(Statistics.Flights.On.Time))
delays_flights_month$On_Time <-month_on_time$Statistics.Flights.On.Time

#Creating a column to display percentage of flights that were on time, on average
delays_flights_month$Percent_On_Time <-100*delays_flights_month$On_Time/(delays_flights_month$On_Time+delays_flights_month$Diverted+delays_flights_month$Delayed+delays_flights_month$Cancelled)

#Display averages for numbers of flights cancelled, delayed, diverted and on time
round(delays_flights_month) 
#Identifying month with the greatest percent of flights on time, on overage
round(delays_flights_month[which.max(delays_flights_month$Percent_On_Time),])
#Identifying year with the least percent of flights on time, on overage
round(delays_flights_month[which.min(delays_flights_month$Percent_On_Time),])

On average, flights were on time each month the most in September and they were on time the least in December.

Average Flights per Month by Year

The average number of flights cancelled, delayed, diverted and on time per month, each year between 2003-2016.

 
#Grouping by year
year <- delays_flights %>% group_by(Time.Year)

#Creating a dataframe to store the summarized values of flights cancelled each year
delays_flights_year <- year %>% summarise(Statistics.Flights.Cancelled = mean(Statistics.Flights.Cancelled))

#Renaming the columns
colnames(delays_flights_year)[which(names(delays_flights_year) == "Time.Year")] <- "Year"
colnames(delays_flights_year)[which(names(delays_flights_year) == "Statistics.Flights.Cancelled")] <- "Cancelled"

#Summarizing by number of flights delayed each year
year_delayed <- year %>% summarise(Statistics.Flights.Delayed = mean(Statistics.Flights.Delayed))

#Adding the column to delays_flights_year
delays_flights_year$Delayed <-year_delayed$Statistics.Flights.Delayed

#Summarizing by number of flights delayed each year
year_delayed <- year %>% summarise(Statistics.Flights.Delayed = mean(Statistics.Flights.Delayed))
delays_flights_year$Delayed <-year_delayed$Statistics.Flights.Delayed

#Summarizing by number of flights diverted each year
year_diverted <- year %>% summarise(Statistics.Flights.Diverted = mean(Statistics.Flights.Diverted))
delays_flights_year$Diverted <-year_diverted$Statistics.Flights.Diverted

#Summarizing by number of flights on time each year
year_on_time <- year %>% summarise(Statistics.Flights.On.Time = mean(Statistics.Flights.On.Time))
delays_flights_year$On_Time <-year_on_time$Statistics.Flights.On.Time

#Creating a column to display percentage of flights that were on time each year, on average
delays_flights_year$Percent_On_Time <-100*delays_flights_year$On_Time/(delays_flights_year$On_Time+delays_flights_year$Diverted+delays_flights_year$Delayed+delays_flights_year$Cancelled)

#Display yearly averages for numbers of flights cancelled, delayed, diverted and on time
round(delays_flights_year) 
#Identifying year with the greatest percent of flights on time, on overage
round(delays_flights_year[which.max(delays_flights_year$Percent_On_Time),])
#Identifying year with the least percent of flights on time, on overage
round(delays_flights_year[which.min(delays_flights_year$Percent_On_Time),])

On average, flights were on time each month the most in 2012 and they were on time the least in 2007.

Delay Reason

Average Number Flights Delayed per Month by Reason

The average percentage of flights delayed because of carrier, aircraft, national aviation system, security and weather delays between 2003-2016.


#Average number of flights per month since 2003 delayed because of carriers
avg_flights_carriers <- sum(delays_reason$Statistics...of.Delays.Carrier)

#Average number of flights per month since 2003 delayed because of late arriving aircraft
avg_flights_aircraft <- sum(delays_reason$Statistics...of.Delays.Late.Aircraft)

#Average number of flights per month since 2003 delayed because of national aviation system
avg_flights_nas <- sum(delays_reason$Statistics...of.Delays.National.Aviation.System)

#Average number of flights per month since 2003 delayed because of security delays
avg_flights_security <- sum(delays_reason$Statistics...of.Delays.Security)

#Average number of flights per month since 2003 delayed because of weather
avg_flights_weather <- sum(delays_reason$Statistics...of.Delays.Weather)

#Creating a Pie Chart  
reason_values = c(avg_flights_carriers,avg_flights_aircraft,avg_flights_nas, avg_flights_security, avg_flights_weather)
reason_labels = c("Carrier","Late Aircraft","National Aviation System","Security","Weather")

#Calculating the percent each will be of the total
piepercent<- round(100*reason_values/sum(reason_values), 1)

# Plot the chart.
pie(reason_values, labels = piepercent, main = "Reasons for Flight Delay between 2003-2016",col = rainbow(length(reason_values)))
legend("topright", reason_labels, cex = 0.7,fill = rainbow(length(reason_values)))

The three biggest reasons for flight delays are

  • National Aviation System: 39.7%
  • Late Aircraft: 32.8%
  • Carrier: 23.9%

Delay Reason by Month of Year

#Grouping by month
month <- delays_reason %>% group_by(Time.Month)

#Creating a dataframe to store the summarized values of flight delayed because of carriers
delays_reason_month <- month %>% summarise(Statistics...of.Delays.Carrier = mean(Statistics...of.Delays.Carrier))

#Renaming the columns
colnames(delays_reason_month)[which(names(delays_reason_month) == "Time.Month")] <- "Month"
colnames(delays_reason_month)[which(names(delays_reason_month) == "Statistics...of.Delays.Carrier")] <- "Carrier"

#Summarizing by flights delayed because of late aircraft
month_aircraft <- month %>% summarise(Statistics...of.Delays.Late.Aircraft = mean(Statistics...of.Delays.Late.Aircraft))

#Adding the column to delays_flights_year
delays_reason_month$Aircraft <-month_aircraft$Statistics...of.Delays.Late.Aircraft

#Summarizing by flights delayed because of national aviation system
month_nas <- month %>% summarise(Statistics...of.Delays.National.Aviation.System = mean(Statistics...of.Delays.National.Aviation.System))
delays_reason_month$National_Aviation_System<-month_nas$Statistics...of.Delays.National.Aviation.System

#Summarizing by flights delayed because of security
month_security <- month %>% summarise(Statistics...of.Delays.Security = mean(Statistics...of.Delays.Security))
delays_reason_month$Security<-month_security$Statistics...of.Delays.Security

#Summarizing by flights delayed because of weather
month_weather <- month %>% summarise(Statistics...of.Delays.Weather = mean(Statistics...of.Delays.Weather))
delays_reason_month$Weather<-month_weather$Statistics...of.Delays.Weather

#Display yearly averages for numbers of flights cancelled, delayed, diverted and on time
round(delays_reason_month) 
#Identifying month with the greatest number of delays due to each reasons for delay
round(delays_reason_month[which.max(delays_reason_month$National_Aviation_System),])
round(delays_reason_month[which.max(delays_reason_month$Aircraft),])
round(delays_reason_month[which.max(delays_reason_month$Carrier),])
round(delays_reason_month[which.max(delays_reason_month$Weather),])
round(delays_reason_month[which.max(delays_reason_month$Security),])
  • December has the most delays happen due to the National Aviation System, Carrier and Security.
  • July has the most delays due to Aircraft.
  • June has the most delays due to Weather.

Delay Reason by Year

#Grouping by year
year <- delays_reason %>% group_by(Time.Year)

#Creating a dataframe to store the summarized values of flight delayed because of carriers
delays_reason_year <- year %>% summarise(Statistics...of.Delays.Carrier = mean(Statistics...of.Delays.Carrier))

#Renaming the columns
colnames(delays_reason_year)[which(names(delays_reason_year) == "Time.Year")] <- "Year"
colnames(delays_reason_year)[which(names(delays_reason_year) == "Statistics...of.Delays.Carrier")] <- "Carrier"

#Summarizing by flights delayed because of late aircraft
year_aircraft <- year %>% summarise(Statistics...of.Delays.Late.Aircraft = mean(Statistics...of.Delays.Late.Aircraft))

#Adding the column to delays_flights_year
delays_reason_year$Aircraft <-year_aircraft$Statistics...of.Delays.Late.Aircraft

#Summarizing by flights delayed because of national aviation system
year_nas <- year %>% summarise(Statistics...of.Delays.National.Aviation.System = mean(Statistics...of.Delays.National.Aviation.System))
delays_reason_year$National_Aviation_System<-year_nas$Statistics...of.Delays.National.Aviation.System

#Summarizing by flights delayed because of security
year_security <- year %>% summarise(Statistics...of.Delays.Security = mean(Statistics...of.Delays.Security))
delays_reason_year$Security<-year_security$Statistics...of.Delays.Security

#Summarizing by flights delayed because of weather
year_weather <- year %>% summarise(Statistics...of.Delays.Weather = mean(Statistics...of.Delays.Weather))
delays_reason_year$Weather<-year_weather$Statistics...of.Delays.Weather

#Display yearly averages for numbers of flights cancelled, delayed, diverted and on time
round(delays_reason_year) 
#Identifying year with the greatest number of delays due to each reasons for delay
round(delays_reason_year[which.max(delays_reason_month$National_Aviation_System),])
round(delays_reason_year[which.max(delays_reason_month$Aircraft),])
round(delays_reason_year[which.max(delays_reason_month$Carrier),])
round(delays_reason_year[which.max(delays_reason_month$Weather),])
round(delays_reason_year[which.max(delays_reason_month$Security),])
  • 2014 has the most delays happen due to the National Aviation System, Carrier and Security.
  • 2009 has the most delays due to Aircraft.
  • 2008 has the most delays due to Weather.

Delay Duration

Average Duration of Delay per Month by Reason

The average duration of delay because of carrier, aircraft, national aviation system, security and weather delays between 2003-2016.


#Average duration of delay per month since 2003 delayed because of carriers
avg_flights_carriers <- mean(delays_duration$Statistics.Minutes.Delayed.Carrier)

#Average duration of delay per month since 2003 delayed because of late arriving aircraft
avg_flights_aircraft <- mean(delays_duration$Statistics.Minutes.Delayed.Late.Aircraft)

#Average duration of delay per month since 2003 delayed because of national aviation system
avg_flights_nas <- mean(delays_duration$Statistics.Minutes.Delayed.National.Aviation.System)

#Average duration of delay per month since 2003 delayed because of security delays
avg_flights_security <- mean(delays_duration$Statistics.Minutes.Delayed.Security)

#Average duration of delay per month since 2003 delayed because of weather
avg_flights_weather <- mean(delays_duration$Statistics.Minutes.Delayed.Weather)

#Creating a Bar Plot with values displayed on top of bars
duration_values = c(avg_flights_carriers,avg_flights_aircraft,avg_flights_nas, avg_flights_security, avg_flights_weather)
duration_values = round(duration_values)
duration_labels = c("Carrier","Late Aircraft","National Aviation System","Security","Weather")

## Make the duration values numbers (rather than factors)
duration_values <- as.numeric(as.character(duration_values))

## Find a range of y's that'll leave sufficient space above the tallest bar
ylim <- c(0, 1.1*max(duration_values))

## Plot, and store x-coordinates of bars in xx
xx <- barplot(duration_values,main ="Average Duration of Delay per Month by Reason", col=rainbow(length(duration_values)), ylim = ylim)

## Add text at top of bars
text(x = xx, y = duration_values, label = duration_values, pos = 3, cex = 0.8, col = "red")

## Add x-axis labels 
axis(1, at=xx, labels=duration_labels, tick=FALSE, las=2, line=-0.5, cex.axis=0.5)

The longest delays were from three main sources:

  • Late Aircraft resulted in the longest delays, averaging a total of 49,410 minutes each month.
  • National Aviation System resulted in delays averaging a total of 45,077 minutes each month.
  • Carriers resulted in delays averaging a total of 35,021 minutes each month.

Delay Duration by Month of Year

#Grouping by month
month <- delays_duration %>% group_by(Time.Month)

#Creating a dataframe to store the summarized values of flight delayed because of carriers
delays_duration_month <- month %>% summarise(Statistics.Minutes.Delayed.Carrier = mean(Statistics.Minutes.Delayed.Carrier))

#Renaming the columns
colnames(delays_duration_month)[which(names(delays_duration_month) == "Time.Month")] <- "Month"
colnames(delays_duration_month)[which(names(delays_duration_month) == "Statistics.Minutes.Delayed.Carrier")] <- "Carrier"

#Summarizing by flights delayed because of late aircraft
month_aircraft <- month %>% summarise(Statistics.Minutes.Delayed.Late.Aircraft = mean(Statistics.Minutes.Delayed.Late.Aircraft))

#Adding the column to delays_flights_year
delays_duration_month$Aircraft <-month_aircraft$Statistics.Minutes.Delayed.Late.Aircraft

#Summarizing by flights delayed because of national aviation system
month_nas <- month %>% summarise(Statistics.Minutes.Delayed.National.Aviation.System=mean(Statistics.Minutes.Delayed.National.Aviation.System))
delays_duration_month$National_Aviation_System<-month_nas$Statistics.Minutes.Delayed.National.Aviation.System

#Summarizing by flights delayed because of security
month_security <- month %>% summarise(Statistics.Minutes.Delayed.Security = mean(Statistics.Minutes.Delayed.Security))
delays_duration_month$Security<-month_security$Statistics.Minutes.Delayed.Security

#Summarizing by flights delayed because of weather
month_weather <- month %>% summarise(Statistics.Minutes.Delayed.Weather = mean(Statistics.Minutes.Delayed.Weather))
delays_duration_month$Weather<-month_weather$Statistics.Minutes.Delayed.Weather

#Summarizing by total delay
month_total <- month %>% summarise(Statistics.Minutes.Delayed.Total = mean(Statistics.Minutes.Delayed.Total))
delays_duration_month$Total<-month_total$Statistics.Minutes.Delayed.Total

#Display yearly averages for numbers of flights cancelled, delayed, diverted and on time
round(delays_duration_month) 
#Identifying month with the greatest duration of delays due to each reason
round(delays_duration_month[which.max(delays_duration_month$Total),])
round(delays_duration_month[which.max(delays_duration_month$National_Aviation_System),])
round(delays_duration_month[which.max(delays_duration_month$Aircraft),])
round(delays_duration_month[which.max(delays_duration_month$Carrier),])
round(delays_duration_month[which.max(delays_duration_month$Weather),])
round(delays_duration_month[which.max(delays_duration_month$Security),])

Overall, July has the longest delays.

  • June has the longest delays due to the National Aviation System and Weather.
  • July has the longest delays due to Aircraft and Carrier.
  • August has the longest delays due to Security.

Delay Duration by Year

#Grouping by year
year <- delays_duration %>% group_by(Time.Year)

#Creating a dataframe to store the summarized values of flight delayed because of carriers
delays_duration_year <- year %>% summarise(Statistics.Minutes.Delayed.Carrier = mean(Statistics.Minutes.Delayed.Carrier))

#Renaming the columns
colnames(delays_duration_year)[which(names(delays_duration_year) == "Time.Year")] <- "Year"
colnames(delays_duration_year)[which(names(delays_duration_year) == "Statistics.Minutes.Delayed.Carrier")] <- "Carrier"

#Summarizing by flights delayed because of late aircraft
year_aircraft <- year%>% summarise(Statistics.Minutes.Delayed.Late.Aircraft = mean(Statistics.Minutes.Delayed.Late.Aircraft))
delays_duration_year$Aircraft <-year_aircraft$Statistics.Minutes.Delayed.Late.Aircraft

#Summarizing by flights delayed because of national aviation system
year_nas <- year %>% summarise(Statistics.Minutes.Delayed.National.Aviation.System=mean(Statistics.Minutes.Delayed.National.Aviation.System))
delays_duration_year$National_Aviation_System<-year_nas$Statistics.Minutes.Delayed.National.Aviation.System

#Summarizing by flights delayed because of security
year_security <- year %>% summarise(Statistics.Minutes.Delayed.Security = mean(Statistics.Minutes.Delayed.Security))
delays_duration_year$Security<-year_security$Statistics.Minutes.Delayed.Security

#Summarizing by flights delayed because of weather
year_weather <- year %>% summarise(Statistics.Minutes.Delayed.Weather = mean(Statistics.Minutes.Delayed.Weather))
delays_duration_year$Weather<-year_weather$Statistics.Minutes.Delayed.Weather

#Summarizing by total delay
year_total <- year %>% summarise(Statistics.Minutes.Delayed.Total = mean(Statistics.Minutes.Delayed.Total))
delays_duration_year$Total<-year_total$Statistics.Minutes.Delayed.Total

#Display yearly averages for numbers of flights cancelled, delayed, diverted and on time
round(delays_duration_year) 
#Identifying year with the greatest duration of delays due to each reason
round(delays_duration_year[which.max(delays_duration_year$Total),])
round(delays_duration_year[which.max(delays_duration_year$National_Aviation_System),])
round(delays_duration_year[which.max(delays_duration_year$Aircraft),])
round(delays_duration_year[which.max(delays_duration_year$Carrier),])
round(delays_duration_year[which.max(delays_duration_year$Weather),])
round(delays_duration_year[which.max(delays_duration_year$Security),])

Overall, 2007 has the longest delays.

  • 2007 has the longest delays due to the National Aviation System, Aircraft, Carrier and Weather.
  • 2006 has the longest delays due to Security.

Summary of Data Analysis

On average, 77.8% of flights were On Time each month and 20.2% of flights were Delayed.

The three biggest reasons for flight delays are:

The most delays occur in the month of December, which can be accounted towards the National Aviation System, Carrier and Security.

The longest delays occur in the month of July, which can be accounted towards the Aircraft and Carrier.

The most delays occur in the year 2007.

LS0tCnRpdGxlOiAiQWlycG9ydCBEZWxheXMgRGF0YSBBbmFseXNpcyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKVGhlIGRhdGEgd2FzIGRvd25sb2FkZWQgZnJvbSBDT1JHSVMgRGF0YXNldCBQcm9qZWN0OiA8YSBocmVmPSJodHRwczovL3RoaW5rLmNzLnZ0LmVkdS9jb3JnaXMvY3N2L2FpcmxpbmVzLyI+T3JpZ2luYWwgRGF0YXNldDwvYT4KClRoaXMgZGF0YXNldCBpcyBhbGwgYWJvdXQgZmxpZ2h0cyBpbiB0aGUgdW5pdGVkIHN0YXRlcywgaW5jbHVkaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBudW1iZXIsIGxlbmd0aCwgYW5kIHR5cGUgb2YgZGVsYXlzIGJldHdlZW4gMjAwMy0yMDE2LiBUaGUgZGF0YSBpcyByZXBvcnRlZCBmb3IgaW5kaXZpZHVhbCBtb250aHMgYXQgZXZlcnkgbWFqb3IgYWlycG9ydCBmb3IgZXZlcnkgY2Fycmllci4gQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGU6IGh0dHA6Ly93d3cucml0YS5kb3QuZ292L2J0cy9oZWxwL2F2aWF0aW9uL2h0bWwvdW5kZXJzdGFuZGluZy5odG1sCgojIyBBdHRyaWJ1dGVzOiAKLSBBaXJwb3J0LkNvZGU6IFRoZSAzIGxldHRlciBjb2RlIGZvciB0aGlzIGFpcnBvcnQsIGFzc2lnbmVkIGJ5IElBVEEuIAotIEFpcnBvcnQuTmFtZToJVGhlIGZ1bGwgbmFtZSBvZiB0aGlzIGFpcnBvcnQuCi0gVGltZS5MYWJlbDogVGhlICJ5ZWFyL21vbnRoIiByZXBvcnRlZCBhcyBhIHN0cmluZywgdG8gbWFrZSBpdCBlYXNpZXIgdG8gc29ydCBieSB0aW1lIHBlcmlvZHMuCQotIFRpbWUuTW9udGg6IFRoZSByZXBvcnRlZCBtb250aCBhcyBhIG51bWJlci4gMCBpcyBKYW51YXJ5LCAxIGlzIEZlYnJ1YXJ5LCBldGMuCQotIFRpbWUuTW9udGggTmFtZTogTmFtZSBvZiBNb250aAotIFRpbWUuWWVhcjogVGhlIHJlcG9ydGVkIHllYXIgYXMgYSA0LWRpZ2l0IG51bWJlci4JCi0gU3RhdGlzdGljcy4jIG9mIERlbGF5cy5DYXJyaWVyOiBUaGUgbnVtYmVyIG9mIGRlbGF5cyBhbmQgY2FuY2VsbGF0aW9ucyBkdWUgdG8gY2lyY3Vtc3RhbmNlcyB3aXRoaW4gdGhlIGFpcmxpbmUncyBjb250cm9sIChlLmcuIG1haW50ZW5hbmNlIG9yIGNyZXcgcHJvYmxlbXMsIGFpcmNyYWZ0IGNsZWFuaW5nLCBiYWdnYWdlIGxvYWRpbmcsIGZ1ZWxpbmcsIGV0Yy4pIGluIHRoaXMgbW9udGguCQotIFN0YXRpc3RpY3MuIyBvZiBEZWxheXMuTGF0ZSBBaXJjcmFmdDogVGhlIG51bWJlciBvZiBkZWxheXMgYW5kIGNhbmNlbGxhdGlvbnMgY2F1c2VkIGJ5IGEgcHJldmlvdXMgZmxpZ2h0IHdpdGggdGhlIHNhbWUgYWlyY3JhZnQgYXJyaXZpbmcgbGF0ZSwgY2F1c2luZyB0aGUgcHJlc2VudCBmbGlnaHQgdG8gZGVwYXJ0IGxhdGUgaW4gdGhpcyBtb250aC4JCi0gU3RhdGlzdGljcy4jIG9mIERlbGF5cy5OYXRpb25hbCBBdmlhdGlvbiBTeXN0ZW0JSW50ZWdlcglUaGUgbnVtYmVyIG9mIGRlbGF5cyBhbmQgY2FuY2VsbGF0aW9ucyBhdHRyaWJ1dGFibGUgdG8gdGhlIG5hdGlvbmFsIGF2aWF0aW9uIHN5c3RlbSB0aGF0IHJlZmVyIHRvIGEgYnJvYWQgc2V0IG9mIGNvbmRpdGlvbnMsIHN1Y2ggYXMgbm9uLWV4dHJlbWUgd2VhdGhlciBjb25kaXRpb25zLCBhaXJwb3J0IG9wZXJhdGlvbnMsIGhlYXZ5IHRyYWZmaWMgdm9sdW1lLCBhbmQgYWlyIHRyYWZmaWMgY29udHJvbCBpbiB0aGlzIG1vbnRoLgotIFN0YXRpc3RpY3MuIyBvZiBEZWxheXMuU2VjdXJpdHkJSW50ZWdlcglOdW1iZXIgb2YgZGVsYXlzIG9yIGNhbmNlbGxhdGlvbnMgY2F1c2VkIGJ5IGV2YWN1YXRpb24gb2YgYSB0ZXJtaW5hbCBvciBjb25jb3Vyc2UsIHJlLWJvYXJkaW5nIG9mIGFpcmNyYWZ0IGJlY2F1c2Ugb2Ygc2VjdXJpdHkgYnJlYWNoLCBpbm9wZXJhdGl2ZSBzY3JlZW5pbmcgZXF1aXBtZW50IGFuZC9vciBsb25nIGxpbmVzIGluIGV4Y2VzcyBvZiAyOSBtaW51dGVzIGF0IHNjcmVlbmluZyBhcmVhcyBpbiB0aGlzIG1vbnRoLgkxNwotIFN0YXRpc3RpY3MuIyBvZiBEZWxheXMuV2VhdGhlcglJbnRlZ2VyCU51bWJlciBvZiBkZWxheXMgb3IgY2FuY2VsbGF0aW9ucyBjYXVzZWQgYnkgc2lnbmlmaWNhbnQgbWV0ZW9yb2xvZ2ljYWwgY29uZGl0aW9ucyAoYWN0dWFsIG9yIGZvcmVjYXN0ZWQpIHRoYXQsIGluIHRoZSBqdWRnbWVudCBvZiB0aGUgY2FycmllciwgZGVsYXlzIG9yIHByZXZlbnRzIHRoZSBvcGVyYXRpb24gb2YgYSBmbGlnaHQgc3VjaCBhcyB0b3JuYWRvLCBibGl6emFyZCBvciBodXJyaWNhbmUgaW4gdGhpcyBtb250aC4JMzI4Ci0gU3RhdGlzdGljcy5DYXJyaWVycy5OYW1lczogVGhlIGZ1bGwgbmFtZXMgb2YgdGhlIGNhcnJpZXJzIHRoYXQgcmVwb3J0ZWQgaW4uCQotIFN0YXRpc3RpY3MuQ2FycmllcnMuVG90YWwJSW50ZWdlcglUaGUgbnVtYmVyIG9mIGNhcnJpZXJzIHRoYXQgcmVwb3J0ZWQgZmxpZ2h0IGluZm9ybWF0aW9uIGR1cmluZyB0aGlzIHRpbWUgcGVyaW9kIGFuZCBhdCB0aGlzIGxvY2F0aW9uLgkxMQotIFN0YXRpc3RpY3MuRmxpZ2h0cy5DYW5jZWxsZWQ6CVRoZSBudW1iZXIgb2YgZmxpZ2h0cyB0aGF0IHdlcmUgY2FuY2VsbGVkIGluIHRoaXMgbW9udGguCQotIFN0YXRpc3RpY3MuRmxpZ2h0cy5EZWxheWVkOglUaGUgbnVtYmVyIG9mIGZsaWdodHMgdGhhdCB3ZXJlIGRlbGF5ZWQgaW4gdGhpcyBtb250aC4KLSBTdGF0aXN0aWNzLkZsaWdodHMuRGl2ZXJ0ZWQ6CVRoZSBudW1iZXIgb2YgZmxpZ2h0cyB0aGF0IHdlcmUgZGl2ZXJ0ZWQgaW4gdGhpcyBtb250aC4JCi0gU3RhdGlzdGljcy5GbGlnaHRzLk9uIFRpbWU6CVRoZSBudW1iZXIgb2YgZmxpZ2h0cyB0aGF0IHdlcmUgb24gdGltZSBpbiB0aGlzIG1vbnRoLgkKLSBTdGF0aXN0aWNzLkZsaWdodHMuVG90YWw6IFRoZSB0b3RhbCBudW1iZXIgb2YgZmxpZ2h0cyBpbiB0aGlzIG1vbnRoLgkKLSBTdGF0aXN0aWNzLk1pbnV0ZXMgRGVsYXllZC5DYXJyaWVyOiBUaGUgbnVtYmVyIG9mIG1pbnV0ZXMgZGVsYXllZCBkdWUgdG8gY2lyY3Vtc3RhbmNlcyB3aXRoaW4gdGhlIGFpcmxpbmUncyBjb250cm9sIChlLmcuIG1haW50ZW5hbmNlIG9yIGNyZXcgcHJvYmxlbXMsIGFpcmNyYWZ0IGNsZWFuaW5nLCBiYWdnYWdlIGxvYWRpbmcsIGZ1ZWxpbmcsIGV0Yy4pIGluIHRoaXMgbW9udGguCi0gU3RhdGlzdGljcy5NaW51dGVzIERlbGF5ZWQuTGF0ZSBBaXJjcmFmdAlJbnRlZ2VyCVRoZSBudW1iZXIgb2YgbWludXRlcyBkZWxheWVkIGNhdXNlZCBieSBhIHByZXZpb3VzIGZsaWdodCB3aXRoIHRoZSBzYW1lIGFpcmNyYWZ0IGFycml2aW5nIGxhdGUsIGNhdXNpbmcgdGhlIHByZXNlbnQgZmxpZ2h0IHRvIGRlcGFydCBsYXRlIGluIHRoaXMgbW9udGguClN0YXRpc3RpY3MuTWludXRlcyBEZWxheWVkLk5hdGlvbmFsIEF2aWF0aW9uIFN5c3RlbTogVGhlIG51bWJlciBvZiBtaW51dGVzIGRlbGF5ZWQgYXR0cmlidXRhYmxlIHRvIHRoZSBuYXRpb25hbCBhdmlhdGlvbiBzeXN0ZW0gdGhhdCByZWZlciB0byBhIGJyb2FkIHNldCBvZiBjb25kaXRpb25zLCBzdWNoIGFzIG5vbi1leHRyZW1lIHdlYXRoZXIgY29uZGl0aW9ucywgYWlycG9ydCBvcGVyYXRpb25zLCBoZWF2eSB0cmFmZmljIHZvbHVtZSwgYW5kIGFpciB0cmFmZmljIGNvbnRyb2wgaW4gdGhpcyBtb250aC4KLSBTdGF0aXN0aWNzLk1pbnV0ZXMgRGVsYXllZC5TZWN1cml0eTogTnVtYmVyIG9mIG1pbnV0ZXMgZGVsYXllZCBjYXVzZWQgYnkgZXZhY3VhdGlvbiBvZiBhIHRlcm1pbmFsIG9yIGNvbmNvdXJzZSwgcmUtYm9hcmRpbmcgb2YgYWlyY3JhZnQgYmVjYXVzZSBvZiBzZWN1cml0eSBicmVhY2gsIGlub3BlcmF0aXZlIHNjcmVlbmluZyBlcXVpcG1lbnQgYW5kL29yIGxvbmcgbGluZXMgaW4gZXhjZXNzIG9mIDI5IG1pbnV0ZXMgYXQgc2NyZWVuaW5nIGFyZWFzIGluIHRoaXMgbW9udGguCi0gU3RhdGlzdGljcy5NaW51dGVzIERlbGF5ZWQuVG90YWwKLSBTdGF0aXN0aWNzLk1pbnV0ZXMgRGVsYXllZC5XZWF0aGVyOglOdW1iZXIgb2Ygb2YgbWludXRlcyBkZWxheWVkIGNhdXNlZCBieSBzaWduaWZpY2FudCBtZXRlb3JvbG9naWNhbCBjb25kaXRpb25zIChhY3R1YWwgb3IgZm9yZWNhc3RlZCkgdGhhdCwgaW4gdGhlIGp1ZGdtZW50IG9mIHRoZSBjYXJyaWVyLCBkZWxheXMgb3IgcHJldmVudHMgdGhlIG9wZXJhdGlvbiBvZiBhIGZsaWdodCBzdWNoIGFzIHRvcm5hZG8sIGJsaXp6YXJkIG9yIGh1cnJpY2FuZSBpbiB0aGlzIG1vbnRoLgoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZ2doaWdobGlnaHQpCgojSW1wb3J0aW5nIHRoZSBjc3YgZmlsZSB0byBhIGJvb2tzIERhdGEgRnJhbWUKZGVsYXlzIDwtIHJlYWQuY3N2KCJhaXJsaW5lcy5jc3YiKQoKI1ZpZXdpbmcgdGhlIERhdGEgRnJhbWUKaGVhZChkZWxheXMpCmBgYAojIyMgTWlzc2luZyBWYWx1ZXMKYGBge3J9CiNJZGVudGlmeWluZyB0b3RhbCBudW1iZXIgb2YgbWlzc2luZyB2YWx1ZXMKc3VtKGlzLm5hKGRlbGF5cykpCmBgYApUaGVyZSBhcmUgbm8gbWlzc2luZyB2YWx1ZXMgaW4gdGhlIGRhdGEuCmBgYHtyfQojSWRlbnRpZnlpbmcgdGhlIGNvbHVtbiBuYW1lcwpjb2xuYW1lcyhkZWxheXMpCmBgYApBcyB0aGVyZSBhcmUgcXVpdGUgYSBmZXcgY29sdW1ucyBpdCBtaWdodCBiZSBoZWxwZnVsIHRvIGxvb2sgYXQgYSBzb21lIHNvbWUgc3Vic2V0cyBvZiB0aGUgZGF0YS4KCldlIGNhbiBsb29rIGF0IHRocmVlIHN1YnNldHMgc3BlY2lmaWNhbGx5OgoKLSBOdW1iZXIgb2YgRmxpZ2h0cyBEZWxheWVkIE92ZXJhbGwKLSBOdW1iZXIgb2YgRmxpZ2h0cyBEZWxheWVkIGJ5IFJlYXNvbgotIER1cmF0aW9uIG9mIEZsaWdodCBEZWxheQoKYGBge3J9CiNDcmVhdGluZyBhIGNoYXJhY3RlciB2ZWN0b3IgbmFtZWQgZmxpZ2h0cyBpbiB3aGljaCB3ZSBhcmUgc3RvcmluZyBjb2x1bW4gbmFtZXMKZmxpZ2h0cyA8LSBjKCJBaXJwb3J0LkNvZGUiLCJBaXJwb3J0Lk5hbWUiLCJUaW1lLk1vbnRoIiwiVGltZS5Nb250aC5OYW1lIiwiVGltZS5ZZWFyIiwiU3RhdGlzdGljcy5GbGlnaHRzLkNhbmNlbGxlZCIsIlN0YXRpc3RpY3MuRmxpZ2h0cy5EZWxheWVkIiwiU3RhdGlzdGljcy5GbGlnaHRzLkRpdmVydGVkIiwiU3RhdGlzdGljcy5GbGlnaHRzLk9uLlRpbWUiLCJTdGF0aXN0aWNzLkZsaWdodHMuVG90YWwiKQoKI0NyZWF0aW5nIGEgZGF0YSBmcmFtZSB3aXRoIGluZm9ybWF0aW9uIG9uIG51bWJlciBvZiBkZWxheXMKZGVsYXlzX2ZsaWdodHMgPC1kZWxheXNbZmxpZ2h0c10KCiNDcmVhdGluZyBhIGNoYXJhY3RlciB2ZWN0b3IgbmFtZWQgZmxpZ2h0cyBpbiB3aGljaCB3ZSBhcmUgc3RvcmluZyBjb2x1bW4gbmFtZXMKcmVhc29uIDwtIGMoIkFpcnBvcnQuQ29kZSIsIkFpcnBvcnQuTmFtZSIsIlRpbWUuTW9udGgiLCJUaW1lLk1vbnRoLk5hbWUiLCJUaW1lLlllYXIiLCAiU3RhdGlzdGljcy4uLm9mLkRlbGF5cy5DYXJyaWVyIiwiU3RhdGlzdGljcy4uLm9mLkRlbGF5cy5MYXRlLkFpcmNyYWZ0IiwgIlN0YXRpc3RpY3MuLi5vZi5EZWxheXMuTmF0aW9uYWwuQXZpYXRpb24uU3lzdGVtIiwiU3RhdGlzdGljcy4uLm9mLkRlbGF5cy5TZWN1cml0eSIsIlN0YXRpc3RpY3MuLi5vZi5EZWxheXMuV2VhdGhlciIpCgojQ3JlYXRpbmcgYSBkYXRhIGZyYW1lIHdpdGggaW5mb3JtYXRpb24gb24gbnVtYmVyIG9mIGRlbGF5cyBkdWUgdG8gZGlmZmVyZW50IHJlYXNvbnMKZGVsYXlzX3JlYXNvbiA8LWRlbGF5c1tyZWFzb25dCgojQ3JlYXRpbmcgYSBjaGFyYWN0ZXIgdmVjdG9yIG5hbWVkIGR1cmF0aW9uIGluIHdoaWNoIHdlIGFyZSBzdG9yaW5nIGNvbHVtbiBuYW1lcwpkdXJhdGlvbiA8LSBjKCJBaXJwb3J0LkNvZGUiLCJBaXJwb3J0Lk5hbWUiLCJUaW1lLk1vbnRoIiwiVGltZS5Nb250aC5OYW1lIiwiVGltZS5ZZWFyIiwiU3RhdGlzdGljcy5NaW51dGVzLkRlbGF5ZWQuQ2FycmllciIsIlN0YXRpc3RpY3MuTWludXRlcy5EZWxheWVkLkxhdGUuQWlyY3JhZnQiLCJTdGF0aXN0aWNzLk1pbnV0ZXMuRGVsYXllZC5OYXRpb25hbC5BdmlhdGlvbi5TeXN0ZW0iLCJTdGF0aXN0aWNzLk1pbnV0ZXMuRGVsYXllZC5TZWN1cml0eSIsIlN0YXRpc3RpY3MuTWludXRlcy5EZWxheWVkLlRvdGFsIiwiU3RhdGlzdGljcy5NaW51dGVzLkRlbGF5ZWQuV2VhdGhlciIpCgojQ3JlYXRpbmcgYSBkYXRhIGZyYW1lIHdpdGggaW5mb3JtYXRpb24gb24gZHVyYXRpb24gb2YgZGVsYXlzCmRlbGF5c19kdXJhdGlvbiA8LWRlbGF5c1tkdXJhdGlvbl0KCmBgYAoKIyBGbGlnaHQgRGF0YTogTnVtYmVyIG9mIEZsaWdodHMgRGVsYXllZCBPdmVyYWxsCiMjIEF2ZXJhZ2UgRmxpZ2h0cyBwZXIgTW9udGggClRoZSBhdmVyYWdlIHBlcmNlbnRhZ2Ugb2YgZmxpZ2h0cyBjYW5jZWxsZWQsIGRlbGF5ZWQsIGRpdmVydGVkIGFuZCBvbiB0aW1lIGJldHdlZW4gMjAwMy0yMDE2LgpgYGB7cn0KI0F2ZXJhZ2UgbnVtYmVyIG9mIGRlbGF5ZWQgZmxpZ2h0cyBwZXIgbW9udGggc2luY2UgMjAwMwphdmdfZmxpZ2h0c19jYW5jZWxsZWQgPC0gc3VtKGRlbGF5c19mbGlnaHRzJFN0YXRpc3RpY3MuRmxpZ2h0cy5DYW5jZWxsZWQpCgojQXZlcmFnZSBudW1iZXIgb2YgZGVsYXllZCBmbGlnaHRzIHBlciBtb250aCBzaW5jZSAyMDAzCmF2Z19mbGlnaHRzX2RlbGF5ZWQgPC0gc3VtKGRlbGF5c19mbGlnaHRzJFN0YXRpc3RpY3MuRmxpZ2h0cy5EZWxheWVkKQoKI0F2ZXJhZ2UgbnVtYmVyIG9mIGRpdmVydGVkIGZsaWdodHMgcGVyIG1vbnRoIHNpbmNlIDIwMDMKYXZnX2ZsaWdodHNfZGl2ZXJ0ZWQgPC0gc3VtKGRlbGF5c19mbGlnaHRzJFN0YXRpc3RpY3MuRmxpZ2h0cy5EaXZlcnRlZCkKCiNBdmVyYWdlIG51bWJlciBvZiBmbGlnaHRzIG9uIHRpbWUgcGVyIG1vbnRoIHNpbmNlIDIwMDMKYXZnX2ZsaWdodHNfb25fdGltZSA8LSBzdW0oZGVsYXlzX2ZsaWdodHMkU3RhdGlzdGljcy5GbGlnaHRzLk9uLlRpbWUpCgojQ3JlYXRpbmcgYSBQaWUgQ2hhcnQgCmZsaWdodHNfdmFsdWVzID0gYyhhdmdfZmxpZ2h0c19jYW5jZWxsZWQsYXZnX2ZsaWdodHNfZGVsYXllZCxhdmdfZmxpZ2h0c19kaXZlcnRlZCxhdmdfZmxpZ2h0c19vbl90aW1lICkKZmxpZ2h0c19sYWJlbHMgPSBjKCJDYW5jZWxsZWQiLCJEZWxheWVkIiwiRGl2ZXJ0ZWQiLCJPbiBUaW1lIikKCiNDYWxjdWxhdGluZyB0aGUgcGVyY2VudCBlYWNoIHdpbGwgYmUgb2YgdGhlIHRvdGFsCnBpZXBlcmNlbnQ8LSByb3VuZCgxMDAqZmxpZ2h0c192YWx1ZXMvc3VtKGZsaWdodHNfdmFsdWVzKSwgMSkKCiMgUGxvdCB0aGUgY2hhcnQuCnBpZShmbGlnaHRzX3ZhbHVlcywgbGFiZWxzID0gcGllcGVyY2VudCwgbWFpbiA9ICJEaXN0cmlidXRpb24gb2YgRmxpZ2h0cyBwZXIgTW9udGggYmV0d2VlbiAyMDAzLTIwMTYiLGNvbCA9IHJhaW5ib3cobGVuZ3RoKGZsaWdodHNfdmFsdWVzKSkpCmxlZ2VuZCgidG9wcmlnaHQiLCBmbGlnaHRzX2xhYmVscywgY2V4ID0gMC44LGZpbGwgPSByYWluYm93KGxlbmd0aChmbGlnaHRzX3ZhbHVlcykpKQoKYGBgCk9uIGF2ZXJhZ2UsIDxiPjc3LjglPC9iPiBvZiBmbGlnaHRzIHdlcmUgT24gVGltZSBlYWNoIG1vbnRoIGFuZCA8Yj4yMC4yJTwvYj4gb2YgZmxpZ2h0cyB3ZXJlIERlbGF5ZWQuCgojIyBBdmVyYWdlIEZsaWdodHMgcGVyIE1vbnRoIGJ5IE1vbnRoIG9mIFllYXIKVGhlIGF2ZXJhZ2UgcGVyY2VudGFnZSBvZiBmbGlnaHRzIGNhbmNlbGxlZCwgZGVsYXllZCwgZGl2ZXJ0ZWQgYW5kIG9uIHRpbWUgcGVyIG1vbnRoIGJldHdlZW4gMjAwMy0yMDE2LgpgYGB7cn0KIAojR3JvdXBpbmcgYnkgbW9udGgKbW9udGggPC0gZGVsYXlzX2ZsaWdodHMgJT4lIGdyb3VwX2J5KFRpbWUuTW9udGgpCgojQ3JlYXRpbmcgYSBkYXRhIGZyYW1lIHRvIHN0b3JlIHRoZSBzdW1tYXJpemVkIHZhbHVlcyBvZiBmbGlnaHRzIGNhbmNlbGxlZCBlYWNoIHllYXIKZGVsYXlzX2ZsaWdodHNfbW9udGggPC0gbW9udGggJT4lIHN1bW1hcmlzZShTdGF0aXN0aWNzLkZsaWdodHMuQ2FuY2VsbGVkID0gbWVhbihTdGF0aXN0aWNzLkZsaWdodHMuQ2FuY2VsbGVkKSkKCiNSZW5hbWluZyB0aGUgY29sdW1ucwpjb2xuYW1lcyhkZWxheXNfZmxpZ2h0c19tb250aClbd2hpY2gobmFtZXMoZGVsYXlzX2ZsaWdodHNfbW9udGgpID09ICJUaW1lLk1vbnRoIildIDwtICJNb250aCIKY29sbmFtZXMoZGVsYXlzX2ZsaWdodHNfbW9udGgpW3doaWNoKG5hbWVzKGRlbGF5c19mbGlnaHRzX21vbnRoKSA9PSAiU3RhdGlzdGljcy5GbGlnaHRzLkNhbmNlbGxlZCIpXSA8LSAiQ2FuY2VsbGVkIgoKI1N1bW1hcml6aW5nIGJ5IG51bWJlciBvZiBmbGlnaHRzIGRlbGF5ZWQgZWFjaCB5ZWFyCm1vbnRoX2RlbGF5ZWQgPC0gbW9udGggJT4lIHN1bW1hcmlzZShTdGF0aXN0aWNzLkZsaWdodHMuRGVsYXllZCA9IG1lYW4oU3RhdGlzdGljcy5GbGlnaHRzLkRlbGF5ZWQpKQoKI0FkZGluZyB0aGUgY29sdW1uIHRvIGRlbGF5c19mbGlnaHRzX21vbnRoCmRlbGF5c19mbGlnaHRzX21vbnRoJERlbGF5ZWQgPC1tb250aF9kZWxheWVkJFN0YXRpc3RpY3MuRmxpZ2h0cy5EZWxheWVkCgojU3VtbWFyaXppbmcgYnkgbnVtYmVyIG9mIGZsaWdodHMgZGVsYXllZAptb250aF9kZWxheWVkIDwtIG1vbnRoICU+JSBzdW1tYXJpc2UoU3RhdGlzdGljcy5GbGlnaHRzLkRlbGF5ZWQgPSBtZWFuKFN0YXRpc3RpY3MuRmxpZ2h0cy5EZWxheWVkKSkKZGVsYXlzX2ZsaWdodHNfbW9udGgkRGVsYXllZCA8LW1vbnRoX2RlbGF5ZWQkU3RhdGlzdGljcy5GbGlnaHRzLkRlbGF5ZWQKCiNTdW1tYXJpemluZyBieSBudW1iZXIgb2YgZmxpZ2h0cyBkaXZlcnRlZAptb250aF9kaXZlcnRlZCA8LSBtb250aCAlPiUgc3VtbWFyaXNlKFN0YXRpc3RpY3MuRmxpZ2h0cy5EaXZlcnRlZCA9IG1lYW4oU3RhdGlzdGljcy5GbGlnaHRzLkRpdmVydGVkKSkKZGVsYXlzX2ZsaWdodHNfbW9udGgkRGl2ZXJ0ZWQgPC1tb250aF9kaXZlcnRlZCRTdGF0aXN0aWNzLkZsaWdodHMuRGl2ZXJ0ZWQKCiNTdW1tYXJpemluZyBieSBudW1iZXIgb2YgZmxpZ2h0cyBvbiB0aW1lCm1vbnRoX29uX3RpbWUgPC0gbW9udGggJT4lIHN1bW1hcmlzZShTdGF0aXN0aWNzLkZsaWdodHMuT24uVGltZSA9IG1lYW4oU3RhdGlzdGljcy5GbGlnaHRzLk9uLlRpbWUpKQpkZWxheXNfZmxpZ2h0c19tb250aCRPbl9UaW1lIDwtbW9udGhfb25fdGltZSRTdGF0aXN0aWNzLkZsaWdodHMuT24uVGltZQoKI0NyZWF0aW5nIGEgY29sdW1uIHRvIGRpc3BsYXkgcGVyY2VudGFnZSBvZiBmbGlnaHRzIHRoYXQgd2VyZSBvbiB0aW1lLCBvbiBhdmVyYWdlCmRlbGF5c19mbGlnaHRzX21vbnRoJFBlcmNlbnRfT25fVGltZSA8LTEwMCpkZWxheXNfZmxpZ2h0c19tb250aCRPbl9UaW1lLyhkZWxheXNfZmxpZ2h0c19tb250aCRPbl9UaW1lK2RlbGF5c19mbGlnaHRzX21vbnRoJERpdmVydGVkK2RlbGF5c19mbGlnaHRzX21vbnRoJERlbGF5ZWQrZGVsYXlzX2ZsaWdodHNfbW9udGgkQ2FuY2VsbGVkKQoKI0Rpc3BsYXkgYXZlcmFnZXMgZm9yIG51bWJlcnMgb2YgZmxpZ2h0cyBjYW5jZWxsZWQsIGRlbGF5ZWQsIGRpdmVydGVkIGFuZCBvbiB0aW1lCnJvdW5kKGRlbGF5c19mbGlnaHRzX21vbnRoKSAKYGBgCmBgYHtyfQojSWRlbnRpZnlpbmcgbW9udGggd2l0aCB0aGUgZ3JlYXRlc3QgcGVyY2VudCBvZiBmbGlnaHRzIG9uIHRpbWUsIG9uIG92ZXJhZ2UKcm91bmQoZGVsYXlzX2ZsaWdodHNfbW9udGhbd2hpY2gubWF4KGRlbGF5c19mbGlnaHRzX21vbnRoJFBlcmNlbnRfT25fVGltZSksXSkKYGBgCmBgYHtyfQojSWRlbnRpZnlpbmcgeWVhciB3aXRoIHRoZSBsZWFzdCBwZXJjZW50IG9mIGZsaWdodHMgb24gdGltZSwgb24gb3ZlcmFnZQpyb3VuZChkZWxheXNfZmxpZ2h0c19tb250aFt3aGljaC5taW4oZGVsYXlzX2ZsaWdodHNfbW9udGgkUGVyY2VudF9Pbl9UaW1lKSxdKQpgYGAKT24gYXZlcmFnZSwgZmxpZ2h0cyB3ZXJlIG9uIHRpbWUgZWFjaCBtb250aCB0aGUgbW9zdCBpbiA8Yj5TZXB0ZW1iZXI8L2I+IGFuZCB0aGV5IHdlcmUgb24gdGltZSB0aGUgbGVhc3QgaW4gPGI+RGVjZW1iZXIuPC9iPgoKIyMgQXZlcmFnZSBGbGlnaHRzIHBlciBNb250aCBieSBZZWFyClRoZSBhdmVyYWdlIG51bWJlciBvZiBmbGlnaHRzIGNhbmNlbGxlZCwgZGVsYXllZCwgZGl2ZXJ0ZWQgYW5kIG9uIHRpbWUgcGVyIG1vbnRoLCBlYWNoIHllYXIgYmV0d2VlbiAyMDAzLTIwMTYuCgpgYGB7cn0KIAojR3JvdXBpbmcgYnkgeWVhcgp5ZWFyIDwtIGRlbGF5c19mbGlnaHRzICU+JSBncm91cF9ieShUaW1lLlllYXIpCgojQ3JlYXRpbmcgYSBkYXRhIGZyYW1lIHRvIHN0b3JlIHRoZSBzdW1tYXJpemVkIHZhbHVlcyBvZiBmbGlnaHRzIGNhbmNlbGxlZCBlYWNoIHllYXIKZGVsYXlzX2ZsaWdodHNfeWVhciA8LSB5ZWFyICU+JSBzdW1tYXJpc2UoU3RhdGlzdGljcy5GbGlnaHRzLkNhbmNlbGxlZCA9IG1lYW4oU3RhdGlzdGljcy5GbGlnaHRzLkNhbmNlbGxlZCkpCgojUmVuYW1pbmcgdGhlIGNvbHVtbnMKY29sbmFtZXMoZGVsYXlzX2ZsaWdodHNfeWVhcilbd2hpY2gobmFtZXMoZGVsYXlzX2ZsaWdodHNfeWVhcikgPT0gIlRpbWUuWWVhciIpXSA8LSAiWWVhciIKY29sbmFtZXMoZGVsYXlzX2ZsaWdodHNfeWVhcilbd2hpY2gobmFtZXMoZGVsYXlzX2ZsaWdodHNfeWVhcikgPT0gIlN0YXRpc3RpY3MuRmxpZ2h0cy5DYW5jZWxsZWQiKV0gPC0gIkNhbmNlbGxlZCIKCiNTdW1tYXJpemluZyBieSBudW1iZXIgb2YgZmxpZ2h0cyBkZWxheWVkIGVhY2ggeWVhcgp5ZWFyX2RlbGF5ZWQgPC0geWVhciAlPiUgc3VtbWFyaXNlKFN0YXRpc3RpY3MuRmxpZ2h0cy5EZWxheWVkID0gbWVhbihTdGF0aXN0aWNzLkZsaWdodHMuRGVsYXllZCkpCgojQWRkaW5nIHRoZSBjb2x1bW4gdG8gZGVsYXlzX2ZsaWdodHNfeWVhcgpkZWxheXNfZmxpZ2h0c195ZWFyJERlbGF5ZWQgPC15ZWFyX2RlbGF5ZWQkU3RhdGlzdGljcy5GbGlnaHRzLkRlbGF5ZWQKCiNTdW1tYXJpemluZyBieSBudW1iZXIgb2YgZmxpZ2h0cyBkZWxheWVkIGVhY2ggeWVhcgp5ZWFyX2RlbGF5ZWQgPC0geWVhciAlPiUgc3VtbWFyaXNlKFN0YXRpc3RpY3MuRmxpZ2h0cy5EZWxheWVkID0gbWVhbihTdGF0aXN0aWNzLkZsaWdodHMuRGVsYXllZCkpCmRlbGF5c19mbGlnaHRzX3llYXIkRGVsYXllZCA8LXllYXJfZGVsYXllZCRTdGF0aXN0aWNzLkZsaWdodHMuRGVsYXllZAoKI1N1bW1hcml6aW5nIGJ5IG51bWJlciBvZiBmbGlnaHRzIGRpdmVydGVkIGVhY2ggeWVhcgp5ZWFyX2RpdmVydGVkIDwtIHllYXIgJT4lIHN1bW1hcmlzZShTdGF0aXN0aWNzLkZsaWdodHMuRGl2ZXJ0ZWQgPSBtZWFuKFN0YXRpc3RpY3MuRmxpZ2h0cy5EaXZlcnRlZCkpCmRlbGF5c19mbGlnaHRzX3llYXIkRGl2ZXJ0ZWQgPC15ZWFyX2RpdmVydGVkJFN0YXRpc3RpY3MuRmxpZ2h0cy5EaXZlcnRlZAoKI1N1bW1hcml6aW5nIGJ5IG51bWJlciBvZiBmbGlnaHRzIG9uIHRpbWUgZWFjaCB5ZWFyCnllYXJfb25fdGltZSA8LSB5ZWFyICU+JSBzdW1tYXJpc2UoU3RhdGlzdGljcy5GbGlnaHRzLk9uLlRpbWUgPSBtZWFuKFN0YXRpc3RpY3MuRmxpZ2h0cy5Pbi5UaW1lKSkKZGVsYXlzX2ZsaWdodHNfeWVhciRPbl9UaW1lIDwteWVhcl9vbl90aW1lJFN0YXRpc3RpY3MuRmxpZ2h0cy5Pbi5UaW1lCgojQ3JlYXRpbmcgYSBjb2x1bW4gdG8gZGlzcGxheSBwZXJjZW50YWdlIG9mIGZsaWdodHMgdGhhdCB3ZXJlIG9uIHRpbWUgZWFjaCB5ZWFyLCBvbiBhdmVyYWdlCmRlbGF5c19mbGlnaHRzX3llYXIkUGVyY2VudF9Pbl9UaW1lIDwtMTAwKmRlbGF5c19mbGlnaHRzX3llYXIkT25fVGltZS8oZGVsYXlzX2ZsaWdodHNfeWVhciRPbl9UaW1lK2RlbGF5c19mbGlnaHRzX3llYXIkRGl2ZXJ0ZWQrZGVsYXlzX2ZsaWdodHNfeWVhciREZWxheWVkK2RlbGF5c19mbGlnaHRzX3llYXIkQ2FuY2VsbGVkKQoKI0Rpc3BsYXkgeWVhcmx5IGF2ZXJhZ2VzIGZvciBudW1iZXJzIG9mIGZsaWdodHMgY2FuY2VsbGVkLCBkZWxheWVkLCBkaXZlcnRlZCBhbmQgb24gdGltZQpyb3VuZChkZWxheXNfZmxpZ2h0c195ZWFyKSAKYGBgCgpgYGB7cn0KI0lkZW50aWZ5aW5nIHllYXIgd2l0aCB0aGUgZ3JlYXRlc3QgcGVyY2VudCBvZiBmbGlnaHRzIG9uIHRpbWUsIG9uIG92ZXJhZ2UKcm91bmQoZGVsYXlzX2ZsaWdodHNfeWVhclt3aGljaC5tYXgoZGVsYXlzX2ZsaWdodHNfeWVhciRQZXJjZW50X09uX1RpbWUpLF0pCmBgYAoKYGBge3J9CiNJZGVudGlmeWluZyB5ZWFyIHdpdGggdGhlIGxlYXN0IHBlcmNlbnQgb2YgZmxpZ2h0cyBvbiB0aW1lLCBvbiBvdmVyYWdlCnJvdW5kKGRlbGF5c19mbGlnaHRzX3llYXJbd2hpY2gubWluKGRlbGF5c19mbGlnaHRzX3llYXIkUGVyY2VudF9Pbl9UaW1lKSxdKQpgYGAKCk9uIGF2ZXJhZ2UsIGZsaWdodHMgd2VyZSBvbiB0aW1lIGVhY2ggbW9udGggdGhlIG1vc3QgaW4gPGI+MjAxMjwvYj4gYW5kIHRoZXkgd2VyZSBvbiB0aW1lIHRoZSBsZWFzdCBpbiA8Yj4yMDA3LjwvYj4KCiMgRGVsYXkgUmVhc29uCiMjIEF2ZXJhZ2UgTnVtYmVyIEZsaWdodHMgRGVsYXllZCBwZXIgTW9udGggYnkgUmVhc29uClRoZSBhdmVyYWdlIHBlcmNlbnRhZ2Ugb2YgZmxpZ2h0cyBkZWxheWVkIGJlY2F1c2Ugb2YgY2FycmllciwgYWlyY3JhZnQsIG5hdGlvbmFsIGF2aWF0aW9uIHN5c3RlbSwgc2VjdXJpdHkgYW5kIHdlYXRoZXIgZGVsYXlzIGJldHdlZW4gMjAwMy0yMDE2LgpgYGB7cn0KCiNBdmVyYWdlIG51bWJlciBvZiBmbGlnaHRzIHBlciBtb250aCBzaW5jZSAyMDAzIGRlbGF5ZWQgYmVjYXVzZSBvZiBjYXJyaWVycwphdmdfZmxpZ2h0c19jYXJyaWVycyA8LSBzdW0oZGVsYXlzX3JlYXNvbiRTdGF0aXN0aWNzLi4ub2YuRGVsYXlzLkNhcnJpZXIpCgojQXZlcmFnZSBudW1iZXIgb2YgZmxpZ2h0cyBwZXIgbW9udGggc2luY2UgMjAwMyBkZWxheWVkIGJlY2F1c2Ugb2YgbGF0ZSBhcnJpdmluZyBhaXJjcmFmdAphdmdfZmxpZ2h0c19haXJjcmFmdCA8LSBzdW0oZGVsYXlzX3JlYXNvbiRTdGF0aXN0aWNzLi4ub2YuRGVsYXlzLkxhdGUuQWlyY3JhZnQpCgojQXZlcmFnZSBudW1iZXIgb2YgZmxpZ2h0cyBwZXIgbW9udGggc2luY2UgMjAwMyBkZWxheWVkIGJlY2F1c2Ugb2YgbmF0aW9uYWwgYXZpYXRpb24gc3lzdGVtCmF2Z19mbGlnaHRzX25hcyA8LSBzdW0oZGVsYXlzX3JlYXNvbiRTdGF0aXN0aWNzLi4ub2YuRGVsYXlzLk5hdGlvbmFsLkF2aWF0aW9uLlN5c3RlbSkKCiNBdmVyYWdlIG51bWJlciBvZiBmbGlnaHRzIHBlciBtb250aCBzaW5jZSAyMDAzIGRlbGF5ZWQgYmVjYXVzZSBvZiBzZWN1cml0eSBkZWxheXMKYXZnX2ZsaWdodHNfc2VjdXJpdHkgPC0gc3VtKGRlbGF5c19yZWFzb24kU3RhdGlzdGljcy4uLm9mLkRlbGF5cy5TZWN1cml0eSkKCiNBdmVyYWdlIG51bWJlciBvZiBmbGlnaHRzIHBlciBtb250aCBzaW5jZSAyMDAzIGRlbGF5ZWQgYmVjYXVzZSBvZiB3ZWF0aGVyCmF2Z19mbGlnaHRzX3dlYXRoZXIgPC0gc3VtKGRlbGF5c19yZWFzb24kU3RhdGlzdGljcy4uLm9mLkRlbGF5cy5XZWF0aGVyKQoKI0NyZWF0aW5nIGEgUGllIENoYXJ0ICAKcmVhc29uX3ZhbHVlcyA9IGMoYXZnX2ZsaWdodHNfY2FycmllcnMsYXZnX2ZsaWdodHNfYWlyY3JhZnQsYXZnX2ZsaWdodHNfbmFzLCBhdmdfZmxpZ2h0c19zZWN1cml0eSwgYXZnX2ZsaWdodHNfd2VhdGhlcikKcmVhc29uX2xhYmVscyA9IGMoIkNhcnJpZXIiLCJMYXRlIEFpcmNyYWZ0IiwiTmF0aW9uYWwgQXZpYXRpb24gU3lzdGVtIiwiU2VjdXJpdHkiLCJXZWF0aGVyIikKCiNDYWxjdWxhdGluZyB0aGUgcGVyY2VudCBlYWNoIHdpbGwgYmUgb2YgdGhlIHRvdGFsCnBpZXBlcmNlbnQ8LSByb3VuZCgxMDAqcmVhc29uX3ZhbHVlcy9zdW0ocmVhc29uX3ZhbHVlcyksIDEpCgojIFBsb3QgdGhlIGNoYXJ0LgpwaWUocmVhc29uX3ZhbHVlcywgbGFiZWxzID0gcGllcGVyY2VudCwgbWFpbiA9ICJSZWFzb25zIGZvciBGbGlnaHQgRGVsYXkgYmV0d2VlbiAyMDAzLTIwMTYiLGNvbCA9IHJhaW5ib3cobGVuZ3RoKHJlYXNvbl92YWx1ZXMpKSkKbGVnZW5kKCJ0b3ByaWdodCIsIHJlYXNvbl9sYWJlbHMsIGNleCA9IDAuNyxmaWxsID0gcmFpbmJvdyhsZW5ndGgocmVhc29uX3ZhbHVlcykpKQoKYGBgClRoZSB0aHJlZSBiaWdnZXN0IHJlYXNvbnMgZm9yIGZsaWdodCBkZWxheXMgYXJlIAoKLSBOYXRpb25hbCBBdmlhdGlvbiBTeXN0ZW06IDxiPjM5LjclPC9iPgotIExhdGUgQWlyY3JhZnQ6IDxiPjMyLjglPC9iPgotIENhcnJpZXI6IDxiPjIzLjklPC9iPgoKIyMgRGVsYXkgUmVhc29uIGJ5IE1vbnRoIG9mIFllYXIKYGBge3J9CiNHcm91cGluZyBieSBtb250aAptb250aCA8LSBkZWxheXNfcmVhc29uICU+JSBncm91cF9ieShUaW1lLk1vbnRoKQoKI0NyZWF0aW5nIGEgZGF0YSBmcmFtZSB0byBzdG9yZSB0aGUgc3VtbWFyaXplZCB2YWx1ZXMgb2YgZmxpZ2h0IGRlbGF5ZWQgYmVjYXVzZSBvZiBjYXJyaWVycwpkZWxheXNfcmVhc29uX21vbnRoIDwtIG1vbnRoICU+JSBzdW1tYXJpc2UoU3RhdGlzdGljcy4uLm9mLkRlbGF5cy5DYXJyaWVyID0gbWVhbihTdGF0aXN0aWNzLi4ub2YuRGVsYXlzLkNhcnJpZXIpKQoKI1JlbmFtaW5nIHRoZSBjb2x1bW5zCmNvbG5hbWVzKGRlbGF5c19yZWFzb25fbW9udGgpW3doaWNoKG5hbWVzKGRlbGF5c19yZWFzb25fbW9udGgpID09ICJUaW1lLk1vbnRoIildIDwtICJNb250aCIKY29sbmFtZXMoZGVsYXlzX3JlYXNvbl9tb250aClbd2hpY2gobmFtZXMoZGVsYXlzX3JlYXNvbl9tb250aCkgPT0gIlN0YXRpc3RpY3MuLi5vZi5EZWxheXMuQ2FycmllciIpXSA8LSAiQ2FycmllciIKCiNTdW1tYXJpemluZyBieSBmbGlnaHRzIGRlbGF5ZWQgYmVjYXVzZSBvZiBsYXRlIGFpcmNyYWZ0Cm1vbnRoX2FpcmNyYWZ0IDwtIG1vbnRoICU+JSBzdW1tYXJpc2UoU3RhdGlzdGljcy4uLm9mLkRlbGF5cy5MYXRlLkFpcmNyYWZ0ID0gbWVhbihTdGF0aXN0aWNzLi4ub2YuRGVsYXlzLkxhdGUuQWlyY3JhZnQpKQoKI0FkZGluZyB0aGUgY29sdW1uIHRvIGRlbGF5c19mbGlnaHRzX3llYXIKZGVsYXlzX3JlYXNvbl9tb250aCRBaXJjcmFmdCA8LW1vbnRoX2FpcmNyYWZ0JFN0YXRpc3RpY3MuLi5vZi5EZWxheXMuTGF0ZS5BaXJjcmFmdAoKI1N1bW1hcml6aW5nIGJ5IGZsaWdodHMgZGVsYXllZCBiZWNhdXNlIG9mIG5hdGlvbmFsIGF2aWF0aW9uIHN5c3RlbQptb250aF9uYXMgPC0gbW9udGggJT4lIHN1bW1hcmlzZShTdGF0aXN0aWNzLi4ub2YuRGVsYXlzLk5hdGlvbmFsLkF2aWF0aW9uLlN5c3RlbSA9IG1lYW4oU3RhdGlzdGljcy4uLm9mLkRlbGF5cy5OYXRpb25hbC5BdmlhdGlvbi5TeXN0ZW0pKQpkZWxheXNfcmVhc29uX21vbnRoJE5hdGlvbmFsX0F2aWF0aW9uX1N5c3RlbTwtbW9udGhfbmFzJFN0YXRpc3RpY3MuLi5vZi5EZWxheXMuTmF0aW9uYWwuQXZpYXRpb24uU3lzdGVtCgojU3VtbWFyaXppbmcgYnkgZmxpZ2h0cyBkZWxheWVkIGJlY2F1c2Ugb2Ygc2VjdXJpdHkKbW9udGhfc2VjdXJpdHkgPC0gbW9udGggJT4lIHN1bW1hcmlzZShTdGF0aXN0aWNzLi4ub2YuRGVsYXlzLlNlY3VyaXR5ID0gbWVhbihTdGF0aXN0aWNzLi4ub2YuRGVsYXlzLlNlY3VyaXR5KSkKZGVsYXlzX3JlYXNvbl9tb250aCRTZWN1cml0eTwtbW9udGhfc2VjdXJpdHkkU3RhdGlzdGljcy4uLm9mLkRlbGF5cy5TZWN1cml0eQoKI1N1bW1hcml6aW5nIGJ5IGZsaWdodHMgZGVsYXllZCBiZWNhdXNlIG9mIHdlYXRoZXIKbW9udGhfd2VhdGhlciA8LSBtb250aCAlPiUgc3VtbWFyaXNlKFN0YXRpc3RpY3MuLi5vZi5EZWxheXMuV2VhdGhlciA9IG1lYW4oU3RhdGlzdGljcy4uLm9mLkRlbGF5cy5XZWF0aGVyKSkKZGVsYXlzX3JlYXNvbl9tb250aCRXZWF0aGVyPC1tb250aF93ZWF0aGVyJFN0YXRpc3RpY3MuLi5vZi5EZWxheXMuV2VhdGhlcgoKI0Rpc3BsYXkgeWVhcmx5IGF2ZXJhZ2VzIGZvciBudW1iZXJzIG9mIGZsaWdodHMgY2FuY2VsbGVkLCBkZWxheWVkLCBkaXZlcnRlZCBhbmQgb24gdGltZQpyb3VuZChkZWxheXNfcmVhc29uX21vbnRoKSAKYGBgCgpgYGB7cn0KI0lkZW50aWZ5aW5nIG1vbnRoIHdpdGggdGhlIGdyZWF0ZXN0IG51bWJlciBvZiBkZWxheXMgZHVlIHRvIGVhY2ggcmVhc29ucyBmb3IgZGVsYXkKcm91bmQoZGVsYXlzX3JlYXNvbl9tb250aFt3aGljaC5tYXgoZGVsYXlzX3JlYXNvbl9tb250aCROYXRpb25hbF9BdmlhdGlvbl9TeXN0ZW0pLF0pCnJvdW5kKGRlbGF5c19yZWFzb25fbW9udGhbd2hpY2gubWF4KGRlbGF5c19yZWFzb25fbW9udGgkQWlyY3JhZnQpLF0pCnJvdW5kKGRlbGF5c19yZWFzb25fbW9udGhbd2hpY2gubWF4KGRlbGF5c19yZWFzb25fbW9udGgkQ2FycmllciksXSkKcm91bmQoZGVsYXlzX3JlYXNvbl9tb250aFt3aGljaC5tYXgoZGVsYXlzX3JlYXNvbl9tb250aCRXZWF0aGVyKSxdKQpyb3VuZChkZWxheXNfcmVhc29uX21vbnRoW3doaWNoLm1heChkZWxheXNfcmVhc29uX21vbnRoJFNlY3VyaXR5KSxdKQpgYGAKCi0gPGI+RGVjZW1iZXI8L2I+IGhhcyB0aGUgbW9zdCBkZWxheXMgaGFwcGVuIGR1ZSB0byB0aGUgTmF0aW9uYWwgQXZpYXRpb24gU3lzdGVtLCBDYXJyaWVyIGFuZCBTZWN1cml0eS4KLSA8Yj5KdWx5PC9iPiBoYXMgdGhlIG1vc3QgZGVsYXlzIGR1ZSB0byBBaXJjcmFmdC4KLSA8Yj5KdW5lPC9iPiBoYXMgdGhlIG1vc3QgZGVsYXlzIGR1ZSB0byBXZWF0aGVyLgoKIyMgRGVsYXkgUmVhc29uIGJ5IFllYXIKYGBge3J9CiNHcm91cGluZyBieSB5ZWFyCnllYXIgPC0gZGVsYXlzX3JlYXNvbiAlPiUgZ3JvdXBfYnkoVGltZS5ZZWFyKQoKI0NyZWF0aW5nIGEgZGF0YSBmcmFtZSB0byBzdG9yZSB0aGUgc3VtbWFyaXplZCB2YWx1ZXMgb2YgZmxpZ2h0IGRlbGF5ZWQgYmVjYXVzZSBvZiBjYXJyaWVycwpkZWxheXNfcmVhc29uX3llYXIgPC0geWVhciAlPiUgc3VtbWFyaXNlKFN0YXRpc3RpY3MuLi5vZi5EZWxheXMuQ2FycmllciA9IG1lYW4oU3RhdGlzdGljcy4uLm9mLkRlbGF5cy5DYXJyaWVyKSkKCiNSZW5hbWluZyB0aGUgY29sdW1ucwpjb2xuYW1lcyhkZWxheXNfcmVhc29uX3llYXIpW3doaWNoKG5hbWVzKGRlbGF5c19yZWFzb25feWVhcikgPT0gIlRpbWUuWWVhciIpXSA8LSAiWWVhciIKY29sbmFtZXMoZGVsYXlzX3JlYXNvbl95ZWFyKVt3aGljaChuYW1lcyhkZWxheXNfcmVhc29uX3llYXIpID09ICJTdGF0aXN0aWNzLi4ub2YuRGVsYXlzLkNhcnJpZXIiKV0gPC0gIkNhcnJpZXIiCgojU3VtbWFyaXppbmcgYnkgZmxpZ2h0cyBkZWxheWVkIGJlY2F1c2Ugb2YgbGF0ZSBhaXJjcmFmdAp5ZWFyX2FpcmNyYWZ0IDwtIHllYXIgJT4lIHN1bW1hcmlzZShTdGF0aXN0aWNzLi4ub2YuRGVsYXlzLkxhdGUuQWlyY3JhZnQgPSBtZWFuKFN0YXRpc3RpY3MuLi5vZi5EZWxheXMuTGF0ZS5BaXJjcmFmdCkpCgojQWRkaW5nIHRoZSBjb2x1bW4gdG8gZGVsYXlzX2ZsaWdodHNfeWVhcgpkZWxheXNfcmVhc29uX3llYXIkQWlyY3JhZnQgPC15ZWFyX2FpcmNyYWZ0JFN0YXRpc3RpY3MuLi5vZi5EZWxheXMuTGF0ZS5BaXJjcmFmdAoKI1N1bW1hcml6aW5nIGJ5IGZsaWdodHMgZGVsYXllZCBiZWNhdXNlIG9mIG5hdGlvbmFsIGF2aWF0aW9uIHN5c3RlbQp5ZWFyX25hcyA8LSB5ZWFyICU+JSBzdW1tYXJpc2UoU3RhdGlzdGljcy4uLm9mLkRlbGF5cy5OYXRpb25hbC5BdmlhdGlvbi5TeXN0ZW0gPSBtZWFuKFN0YXRpc3RpY3MuLi5vZi5EZWxheXMuTmF0aW9uYWwuQXZpYXRpb24uU3lzdGVtKSkKZGVsYXlzX3JlYXNvbl95ZWFyJE5hdGlvbmFsX0F2aWF0aW9uX1N5c3RlbTwteWVhcl9uYXMkU3RhdGlzdGljcy4uLm9mLkRlbGF5cy5OYXRpb25hbC5BdmlhdGlvbi5TeXN0ZW0KCiNTdW1tYXJpemluZyBieSBmbGlnaHRzIGRlbGF5ZWQgYmVjYXVzZSBvZiBzZWN1cml0eQp5ZWFyX3NlY3VyaXR5IDwtIHllYXIgJT4lIHN1bW1hcmlzZShTdGF0aXN0aWNzLi4ub2YuRGVsYXlzLlNlY3VyaXR5ID0gbWVhbihTdGF0aXN0aWNzLi4ub2YuRGVsYXlzLlNlY3VyaXR5KSkKZGVsYXlzX3JlYXNvbl95ZWFyJFNlY3VyaXR5PC15ZWFyX3NlY3VyaXR5JFN0YXRpc3RpY3MuLi5vZi5EZWxheXMuU2VjdXJpdHkKCiNTdW1tYXJpemluZyBieSBmbGlnaHRzIGRlbGF5ZWQgYmVjYXVzZSBvZiB3ZWF0aGVyCnllYXJfd2VhdGhlciA8LSB5ZWFyICU+JSBzdW1tYXJpc2UoU3RhdGlzdGljcy4uLm9mLkRlbGF5cy5XZWF0aGVyID0gbWVhbihTdGF0aXN0aWNzLi4ub2YuRGVsYXlzLldlYXRoZXIpKQpkZWxheXNfcmVhc29uX3llYXIkV2VhdGhlcjwteWVhcl93ZWF0aGVyJFN0YXRpc3RpY3MuLi5vZi5EZWxheXMuV2VhdGhlcgoKI0Rpc3BsYXkgeWVhcmx5IGF2ZXJhZ2VzIGZvciBudW1iZXJzIG9mIGZsaWdodHMgY2FuY2VsbGVkLCBkZWxheWVkLCBkaXZlcnRlZCBhbmQgb24gdGltZQpyb3VuZChkZWxheXNfcmVhc29uX3llYXIpIApgYGAKYGBge3J9CiNJZGVudGlmeWluZyB5ZWFyIHdpdGggdGhlIGdyZWF0ZXN0IG51bWJlciBvZiBkZWxheXMgZHVlIHRvIGVhY2ggcmVhc29ucyBmb3IgZGVsYXkKcm91bmQoZGVsYXlzX3JlYXNvbl95ZWFyW3doaWNoLm1heChkZWxheXNfcmVhc29uX21vbnRoJE5hdGlvbmFsX0F2aWF0aW9uX1N5c3RlbSksXSkKcm91bmQoZGVsYXlzX3JlYXNvbl95ZWFyW3doaWNoLm1heChkZWxheXNfcmVhc29uX21vbnRoJEFpcmNyYWZ0KSxdKQpyb3VuZChkZWxheXNfcmVhc29uX3llYXJbd2hpY2gubWF4KGRlbGF5c19yZWFzb25fbW9udGgkQ2FycmllciksXSkKcm91bmQoZGVsYXlzX3JlYXNvbl95ZWFyW3doaWNoLm1heChkZWxheXNfcmVhc29uX21vbnRoJFdlYXRoZXIpLF0pCnJvdW5kKGRlbGF5c19yZWFzb25feWVhclt3aGljaC5tYXgoZGVsYXlzX3JlYXNvbl9tb250aCRTZWN1cml0eSksXSkKYGBgCi0gPGI+MjAxNDwvYj4gaGFzIHRoZSBtb3N0IGRlbGF5cyBoYXBwZW4gZHVlIHRvIHRoZSBOYXRpb25hbCBBdmlhdGlvbiBTeXN0ZW0sIENhcnJpZXIgYW5kIFNlY3VyaXR5LgotIDxiPjIwMDk8L2I+IGhhcyB0aGUgbW9zdCBkZWxheXMgZHVlIHRvIEFpcmNyYWZ0LgotIDxiPjIwMDg8L2I+IGhhcyB0aGUgbW9zdCBkZWxheXMgZHVlIHRvIFdlYXRoZXIuCgojIERlbGF5IER1cmF0aW9uIAojIyBBdmVyYWdlIER1cmF0aW9uIG9mIERlbGF5IHBlciBNb250aCBieSBSZWFzb24KVGhlIGF2ZXJhZ2UgZHVyYXRpb24gb2YgZGVsYXkgYmVjYXVzZSBvZiBjYXJyaWVyLCBhaXJjcmFmdCwgbmF0aW9uYWwgYXZpYXRpb24gc3lzdGVtLCBzZWN1cml0eSBhbmQgd2VhdGhlciBkZWxheXMgYmV0d2VlbiAyMDAzLTIwMTYuCmBgYHtyfQoKI0F2ZXJhZ2UgZHVyYXRpb24gb2YgZGVsYXkgcGVyIG1vbnRoIHNpbmNlIDIwMDMgZGVsYXllZCBiZWNhdXNlIG9mIGNhcnJpZXJzCmF2Z19mbGlnaHRzX2NhcnJpZXJzIDwtIG1lYW4oZGVsYXlzX2R1cmF0aW9uJFN0YXRpc3RpY3MuTWludXRlcy5EZWxheWVkLkNhcnJpZXIpCgojQXZlcmFnZSBkdXJhdGlvbiBvZiBkZWxheSBwZXIgbW9udGggc2luY2UgMjAwMyBkZWxheWVkIGJlY2F1c2Ugb2YgbGF0ZSBhcnJpdmluZyBhaXJjcmFmdAphdmdfZmxpZ2h0c19haXJjcmFmdCA8LSBtZWFuKGRlbGF5c19kdXJhdGlvbiRTdGF0aXN0aWNzLk1pbnV0ZXMuRGVsYXllZC5MYXRlLkFpcmNyYWZ0KQoKI0F2ZXJhZ2UgZHVyYXRpb24gb2YgZGVsYXkgcGVyIG1vbnRoIHNpbmNlIDIwMDMgZGVsYXllZCBiZWNhdXNlIG9mIG5hdGlvbmFsIGF2aWF0aW9uIHN5c3RlbQphdmdfZmxpZ2h0c19uYXMgPC0gbWVhbihkZWxheXNfZHVyYXRpb24kU3RhdGlzdGljcy5NaW51dGVzLkRlbGF5ZWQuTmF0aW9uYWwuQXZpYXRpb24uU3lzdGVtKQoKI0F2ZXJhZ2UgZHVyYXRpb24gb2YgZGVsYXkgcGVyIG1vbnRoIHNpbmNlIDIwMDMgZGVsYXllZCBiZWNhdXNlIG9mIHNlY3VyaXR5IGRlbGF5cwphdmdfZmxpZ2h0c19zZWN1cml0eSA8LSBtZWFuKGRlbGF5c19kdXJhdGlvbiRTdGF0aXN0aWNzLk1pbnV0ZXMuRGVsYXllZC5TZWN1cml0eSkKCiNBdmVyYWdlIGR1cmF0aW9uIG9mIGRlbGF5IHBlciBtb250aCBzaW5jZSAyMDAzIGRlbGF5ZWQgYmVjYXVzZSBvZiB3ZWF0aGVyCmF2Z19mbGlnaHRzX3dlYXRoZXIgPC0gbWVhbihkZWxheXNfZHVyYXRpb24kU3RhdGlzdGljcy5NaW51dGVzLkRlbGF5ZWQuV2VhdGhlcikKCiNDcmVhdGluZyBhIEJhciBQbG90IHdpdGggdmFsdWVzIGRpc3BsYXllZCBvbiB0b3Agb2YgYmFycwpkdXJhdGlvbl92YWx1ZXMgPSBjKGF2Z19mbGlnaHRzX2NhcnJpZXJzLGF2Z19mbGlnaHRzX2FpcmNyYWZ0LGF2Z19mbGlnaHRzX25hcywgYXZnX2ZsaWdodHNfc2VjdXJpdHksIGF2Z19mbGlnaHRzX3dlYXRoZXIpCmR1cmF0aW9uX3ZhbHVlcyA9IHJvdW5kKGR1cmF0aW9uX3ZhbHVlcykKZHVyYXRpb25fbGFiZWxzID0gYygiQ2FycmllciIsIkxhdGUgQWlyY3JhZnQiLCJOYXRpb25hbCBBdmlhdGlvbiBTeXN0ZW0iLCJTZWN1cml0eSIsIldlYXRoZXIiKQoKIyMgTWFrZSB0aGUgZHVyYXRpb24gdmFsdWVzIG51bWJlcnMgKHJhdGhlciB0aGFuIGZhY3RvcnMpCmR1cmF0aW9uX3ZhbHVlcyA8LSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihkdXJhdGlvbl92YWx1ZXMpKQoKIyMgRmluZCBhIHJhbmdlIG9mIHkncyB0aGF0IHdpbGwgbGVhdmUgc3VmZmljaWVudCBzcGFjZSBhYm92ZSB0aGUgdGFsbGVzdCBiYXIKeWxpbSA8LSBjKDAsIDEuMSptYXgoZHVyYXRpb25fdmFsdWVzKSkKCiMjIFBsb3QsIGFuZCBzdG9yZSB4LWNvb3JkaW5hdGVzIG9mIGJhcnMgaW4geHgKeHggPC0gYmFycGxvdChkdXJhdGlvbl92YWx1ZXMsbWFpbiA9IkF2ZXJhZ2UgRHVyYXRpb24gb2YgRGVsYXkgcGVyIE1vbnRoIGJ5IFJlYXNvbiIsIGNvbD1yYWluYm93KGxlbmd0aChkdXJhdGlvbl92YWx1ZXMpKSwgeWxpbSA9IHlsaW0pCgojIyBBZGQgdGV4dCBhdCB0b3Agb2YgYmFycwp0ZXh0KHggPSB4eCwgeSA9IGR1cmF0aW9uX3ZhbHVlcywgbGFiZWwgPSBkdXJhdGlvbl92YWx1ZXMsIHBvcyA9IDMsIGNleCA9IDAuOCwgY29sID0gInJlZCIpCgojIyBBZGQgeC1heGlzIGxhYmVscyAKYXhpcygxLCBhdD14eCwgbGFiZWxzPWR1cmF0aW9uX2xhYmVscywgdGljaz1GQUxTRSwgbGFzPTIsIGxpbmU9LTAuNSwgY2V4LmF4aXM9MC41KQpgYGAKVGhlIGxvbmdlc3QgZGVsYXlzIHdlcmUgZnJvbSB0aHJlZSBtYWluIHNvdXJjZXM6CgotIExhdGUgQWlyY3JhZnQgcmVzdWx0ZWQgaW4gdGhlIGxvbmdlc3QgZGVsYXlzLCBhdmVyYWdpbmcgYSB0b3RhbCBvZiA0OSw0MTAgbWludXRlcyBlYWNoIG1vbnRoLgotIE5hdGlvbmFsIEF2aWF0aW9uIFN5c3RlbSByZXN1bHRlZCBpbiBkZWxheXMgYXZlcmFnaW5nIGEgdG90YWwgb2YgNDUsMDc3IG1pbnV0ZXMgZWFjaCBtb250aC4KLSBDYXJyaWVycyByZXN1bHRlZCBpbiBkZWxheXMgYXZlcmFnaW5nIGEgdG90YWwgb2YgMzUsMDIxIG1pbnV0ZXMgZWFjaCBtb250aC4KCiMjIERlbGF5IER1cmF0aW9uIGJ5IE1vbnRoIG9mIFllYXIKYGBge3J9CiNHcm91cGluZyBieSBtb250aAptb250aCA8LSBkZWxheXNfZHVyYXRpb24gJT4lIGdyb3VwX2J5KFRpbWUuTW9udGgpCgojQ3JlYXRpbmcgYSBkYXRhIGZyYW1lIHRvIHN0b3JlIHRoZSBzdW1tYXJpemVkIHZhbHVlcyBvZiBmbGlnaHQgZGVsYXllZCBiZWNhdXNlIG9mIGNhcnJpZXJzCmRlbGF5c19kdXJhdGlvbl9tb250aCA8LSBtb250aCAlPiUgc3VtbWFyaXNlKFN0YXRpc3RpY3MuTWludXRlcy5EZWxheWVkLkNhcnJpZXIgPSBtZWFuKFN0YXRpc3RpY3MuTWludXRlcy5EZWxheWVkLkNhcnJpZXIpKQoKI1JlbmFtaW5nIHRoZSBjb2x1bW5zCmNvbG5hbWVzKGRlbGF5c19kdXJhdGlvbl9tb250aClbd2hpY2gobmFtZXMoZGVsYXlzX2R1cmF0aW9uX21vbnRoKSA9PSAiVGltZS5Nb250aCIpXSA8LSAiTW9udGgiCmNvbG5hbWVzKGRlbGF5c19kdXJhdGlvbl9tb250aClbd2hpY2gobmFtZXMoZGVsYXlzX2R1cmF0aW9uX21vbnRoKSA9PSAiU3RhdGlzdGljcy5NaW51dGVzLkRlbGF5ZWQuQ2FycmllciIpXSA8LSAiQ2FycmllciIKCiNTdW1tYXJpemluZyBieSBmbGlnaHRzIGRlbGF5ZWQgYmVjYXVzZSBvZiBsYXRlIGFpcmNyYWZ0Cm1vbnRoX2FpcmNyYWZ0IDwtIG1vbnRoICU+JSBzdW1tYXJpc2UoU3RhdGlzdGljcy5NaW51dGVzLkRlbGF5ZWQuTGF0ZS5BaXJjcmFmdCA9IG1lYW4oU3RhdGlzdGljcy5NaW51dGVzLkRlbGF5ZWQuTGF0ZS5BaXJjcmFmdCkpCgojQWRkaW5nIHRoZSBjb2x1bW4gdG8gZGVsYXlzX2ZsaWdodHNfeWVhcgpkZWxheXNfZHVyYXRpb25fbW9udGgkQWlyY3JhZnQgPC1tb250aF9haXJjcmFmdCRTdGF0aXN0aWNzLk1pbnV0ZXMuRGVsYXllZC5MYXRlLkFpcmNyYWZ0CgojU3VtbWFyaXppbmcgYnkgZmxpZ2h0cyBkZWxheWVkIGJlY2F1c2Ugb2YgbmF0aW9uYWwgYXZpYXRpb24gc3lzdGVtCm1vbnRoX25hcyA8LSBtb250aCAlPiUgc3VtbWFyaXNlKFN0YXRpc3RpY3MuTWludXRlcy5EZWxheWVkLk5hdGlvbmFsLkF2aWF0aW9uLlN5c3RlbT1tZWFuKFN0YXRpc3RpY3MuTWludXRlcy5EZWxheWVkLk5hdGlvbmFsLkF2aWF0aW9uLlN5c3RlbSkpCmRlbGF5c19kdXJhdGlvbl9tb250aCROYXRpb25hbF9BdmlhdGlvbl9TeXN0ZW08LW1vbnRoX25hcyRTdGF0aXN0aWNzLk1pbnV0ZXMuRGVsYXllZC5OYXRpb25hbC5BdmlhdGlvbi5TeXN0ZW0KCiNTdW1tYXJpemluZyBieSBmbGlnaHRzIGRlbGF5ZWQgYmVjYXVzZSBvZiBzZWN1cml0eQptb250aF9zZWN1cml0eSA8LSBtb250aCAlPiUgc3VtbWFyaXNlKFN0YXRpc3RpY3MuTWludXRlcy5EZWxheWVkLlNlY3VyaXR5ID0gbWVhbihTdGF0aXN0aWNzLk1pbnV0ZXMuRGVsYXllZC5TZWN1cml0eSkpCmRlbGF5c19kdXJhdGlvbl9tb250aCRTZWN1cml0eTwtbW9udGhfc2VjdXJpdHkkU3RhdGlzdGljcy5NaW51dGVzLkRlbGF5ZWQuU2VjdXJpdHkKCiNTdW1tYXJpemluZyBieSBmbGlnaHRzIGRlbGF5ZWQgYmVjYXVzZSBvZiB3ZWF0aGVyCm1vbnRoX3dlYXRoZXIgPC0gbW9udGggJT4lIHN1bW1hcmlzZShTdGF0aXN0aWNzLk1pbnV0ZXMuRGVsYXllZC5XZWF0aGVyID0gbWVhbihTdGF0aXN0aWNzLk1pbnV0ZXMuRGVsYXllZC5XZWF0aGVyKSkKZGVsYXlzX2R1cmF0aW9uX21vbnRoJFdlYXRoZXI8LW1vbnRoX3dlYXRoZXIkU3RhdGlzdGljcy5NaW51dGVzLkRlbGF5ZWQuV2VhdGhlcgoKI1N1bW1hcml6aW5nIGJ5IHRvdGFsIGRlbGF5Cm1vbnRoX3RvdGFsIDwtIG1vbnRoICU+JSBzdW1tYXJpc2UoU3RhdGlzdGljcy5NaW51dGVzLkRlbGF5ZWQuVG90YWwgPSBtZWFuKFN0YXRpc3RpY3MuTWludXRlcy5EZWxheWVkLlRvdGFsKSkKZGVsYXlzX2R1cmF0aW9uX21vbnRoJFRvdGFsPC1tb250aF90b3RhbCRTdGF0aXN0aWNzLk1pbnV0ZXMuRGVsYXllZC5Ub3RhbAoKI0Rpc3BsYXkgeWVhcmx5IGF2ZXJhZ2VzIGZvciBudW1iZXJzIG9mIGZsaWdodHMgY2FuY2VsbGVkLCBkZWxheWVkLCBkaXZlcnRlZCBhbmQgb24gdGltZQpyb3VuZChkZWxheXNfZHVyYXRpb25fbW9udGgpIApgYGAKYGBge3J9CiNJZGVudGlmeWluZyBtb250aCB3aXRoIHRoZSBncmVhdGVzdCBkdXJhdGlvbiBvZiBkZWxheXMgZHVlIHRvIGVhY2ggcmVhc29uCnJvdW5kKGRlbGF5c19kdXJhdGlvbl9tb250aFt3aGljaC5tYXgoZGVsYXlzX2R1cmF0aW9uX21vbnRoJFRvdGFsKSxdKQpyb3VuZChkZWxheXNfZHVyYXRpb25fbW9udGhbd2hpY2gubWF4KGRlbGF5c19kdXJhdGlvbl9tb250aCROYXRpb25hbF9BdmlhdGlvbl9TeXN0ZW0pLF0pCnJvdW5kKGRlbGF5c19kdXJhdGlvbl9tb250aFt3aGljaC5tYXgoZGVsYXlzX2R1cmF0aW9uX21vbnRoJEFpcmNyYWZ0KSxdKQpyb3VuZChkZWxheXNfZHVyYXRpb25fbW9udGhbd2hpY2gubWF4KGRlbGF5c19kdXJhdGlvbl9tb250aCRDYXJyaWVyKSxdKQpyb3VuZChkZWxheXNfZHVyYXRpb25fbW9udGhbd2hpY2gubWF4KGRlbGF5c19kdXJhdGlvbl9tb250aCRXZWF0aGVyKSxdKQpyb3VuZChkZWxheXNfZHVyYXRpb25fbW9udGhbd2hpY2gubWF4KGRlbGF5c19kdXJhdGlvbl9tb250aCRTZWN1cml0eSksXSkKYGBgCk92ZXJhbGwsIDxiPkp1bHk8L2I+IGhhcyB0aGUgbG9uZ2VzdCBkZWxheXMuCgotIDxiPkp1bmU8L2I+IGhhcyB0aGUgbG9uZ2VzdCBkZWxheXMgZHVlIHRvIHRoZSBOYXRpb25hbCBBdmlhdGlvbiBTeXN0ZW0gYW5kIFdlYXRoZXIuCi0gPGI+SnVseTwvYj4gaGFzIHRoZSBsb25nZXN0IGRlbGF5cyBkdWUgdG8gQWlyY3JhZnQgYW5kIENhcnJpZXIuCi0gPGI+QXVndXN0PC9iPiBoYXMgdGhlIGxvbmdlc3QgZGVsYXlzIGR1ZSB0byBTZWN1cml0eS4KCiMjIERlbGF5IER1cmF0aW9uIGJ5IFllYXIKYGBge3J9CiNHcm91cGluZyBieSB5ZWFyCnllYXIgPC0gZGVsYXlzX2R1cmF0aW9uICU+JSBncm91cF9ieShUaW1lLlllYXIpCgojQ3JlYXRpbmcgYSBkYXRhIGZyYW1lIHRvIHN0b3JlIHRoZSBzdW1tYXJpemVkIHZhbHVlcyBvZiBmbGlnaHQgZGVsYXllZCBiZWNhdXNlIG9mIGNhcnJpZXJzCmRlbGF5c19kdXJhdGlvbl95ZWFyIDwtIHllYXIgJT4lIHN1bW1hcmlzZShTdGF0aXN0aWNzLk1pbnV0ZXMuRGVsYXllZC5DYXJyaWVyID0gbWVhbihTdGF0aXN0aWNzLk1pbnV0ZXMuRGVsYXllZC5DYXJyaWVyKSkKCiNSZW5hbWluZyB0aGUgY29sdW1ucwpjb2xuYW1lcyhkZWxheXNfZHVyYXRpb25feWVhcilbd2hpY2gobmFtZXMoZGVsYXlzX2R1cmF0aW9uX3llYXIpID09ICJUaW1lLlllYXIiKV0gPC0gIlllYXIiCmNvbG5hbWVzKGRlbGF5c19kdXJhdGlvbl95ZWFyKVt3aGljaChuYW1lcyhkZWxheXNfZHVyYXRpb25feWVhcikgPT0gIlN0YXRpc3RpY3MuTWludXRlcy5EZWxheWVkLkNhcnJpZXIiKV0gPC0gIkNhcnJpZXIiCgojU3VtbWFyaXppbmcgYnkgZmxpZ2h0cyBkZWxheWVkIGJlY2F1c2Ugb2YgbGF0ZSBhaXJjcmFmdAp5ZWFyX2FpcmNyYWZ0IDwtIHllYXIlPiUgc3VtbWFyaXNlKFN0YXRpc3RpY3MuTWludXRlcy5EZWxheWVkLkxhdGUuQWlyY3JhZnQgPSBtZWFuKFN0YXRpc3RpY3MuTWludXRlcy5EZWxheWVkLkxhdGUuQWlyY3JhZnQpKQpkZWxheXNfZHVyYXRpb25feWVhciRBaXJjcmFmdCA8LXllYXJfYWlyY3JhZnQkU3RhdGlzdGljcy5NaW51dGVzLkRlbGF5ZWQuTGF0ZS5BaXJjcmFmdAoKI1N1bW1hcml6aW5nIGJ5IGZsaWdodHMgZGVsYXllZCBiZWNhdXNlIG9mIG5hdGlvbmFsIGF2aWF0aW9uIHN5c3RlbQp5ZWFyX25hcyA8LSB5ZWFyICU+JSBzdW1tYXJpc2UoU3RhdGlzdGljcy5NaW51dGVzLkRlbGF5ZWQuTmF0aW9uYWwuQXZpYXRpb24uU3lzdGVtPW1lYW4oU3RhdGlzdGljcy5NaW51dGVzLkRlbGF5ZWQuTmF0aW9uYWwuQXZpYXRpb24uU3lzdGVtKSkKZGVsYXlzX2R1cmF0aW9uX3llYXIkTmF0aW9uYWxfQXZpYXRpb25fU3lzdGVtPC15ZWFyX25hcyRTdGF0aXN0aWNzLk1pbnV0ZXMuRGVsYXllZC5OYXRpb25hbC5BdmlhdGlvbi5TeXN0ZW0KCiNTdW1tYXJpemluZyBieSBmbGlnaHRzIGRlbGF5ZWQgYmVjYXVzZSBvZiBzZWN1cml0eQp5ZWFyX3NlY3VyaXR5IDwtIHllYXIgJT4lIHN1bW1hcmlzZShTdGF0aXN0aWNzLk1pbnV0ZXMuRGVsYXllZC5TZWN1cml0eSA9IG1lYW4oU3RhdGlzdGljcy5NaW51dGVzLkRlbGF5ZWQuU2VjdXJpdHkpKQpkZWxheXNfZHVyYXRpb25feWVhciRTZWN1cml0eTwteWVhcl9zZWN1cml0eSRTdGF0aXN0aWNzLk1pbnV0ZXMuRGVsYXllZC5TZWN1cml0eQoKI1N1bW1hcml6aW5nIGJ5IGZsaWdodHMgZGVsYXllZCBiZWNhdXNlIG9mIHdlYXRoZXIKeWVhcl93ZWF0aGVyIDwtIHllYXIgJT4lIHN1bW1hcmlzZShTdGF0aXN0aWNzLk1pbnV0ZXMuRGVsYXllZC5XZWF0aGVyID0gbWVhbihTdGF0aXN0aWNzLk1pbnV0ZXMuRGVsYXllZC5XZWF0aGVyKSkKZGVsYXlzX2R1cmF0aW9uX3llYXIkV2VhdGhlcjwteWVhcl93ZWF0aGVyJFN0YXRpc3RpY3MuTWludXRlcy5EZWxheWVkLldlYXRoZXIKCiNTdW1tYXJpemluZyBieSB0b3RhbCBkZWxheQp5ZWFyX3RvdGFsIDwtIHllYXIgJT4lIHN1bW1hcmlzZShTdGF0aXN0aWNzLk1pbnV0ZXMuRGVsYXllZC5Ub3RhbCA9IG1lYW4oU3RhdGlzdGljcy5NaW51dGVzLkRlbGF5ZWQuVG90YWwpKQpkZWxheXNfZHVyYXRpb25feWVhciRUb3RhbDwteWVhcl90b3RhbCRTdGF0aXN0aWNzLk1pbnV0ZXMuRGVsYXllZC5Ub3RhbAoKI0Rpc3BsYXkgeWVhcmx5IGF2ZXJhZ2VzIGZvciBudW1iZXJzIG9mIGZsaWdodHMgY2FuY2VsbGVkLCBkZWxheWVkLCBkaXZlcnRlZCBhbmQgb24gdGltZQpyb3VuZChkZWxheXNfZHVyYXRpb25feWVhcikgCmBgYApgYGB7cn0KI0lkZW50aWZ5aW5nIHllYXIgd2l0aCB0aGUgZ3JlYXRlc3QgZHVyYXRpb24gb2YgZGVsYXlzIGR1ZSB0byBlYWNoIHJlYXNvbgpyb3VuZChkZWxheXNfZHVyYXRpb25feWVhclt3aGljaC5tYXgoZGVsYXlzX2R1cmF0aW9uX3llYXIkVG90YWwpLF0pCnJvdW5kKGRlbGF5c19kdXJhdGlvbl95ZWFyW3doaWNoLm1heChkZWxheXNfZHVyYXRpb25feWVhciROYXRpb25hbF9BdmlhdGlvbl9TeXN0ZW0pLF0pCnJvdW5kKGRlbGF5c19kdXJhdGlvbl95ZWFyW3doaWNoLm1heChkZWxheXNfZHVyYXRpb25feWVhciRBaXJjcmFmdCksXSkKcm91bmQoZGVsYXlzX2R1cmF0aW9uX3llYXJbd2hpY2gubWF4KGRlbGF5c19kdXJhdGlvbl95ZWFyJENhcnJpZXIpLF0pCnJvdW5kKGRlbGF5c19kdXJhdGlvbl95ZWFyW3doaWNoLm1heChkZWxheXNfZHVyYXRpb25feWVhciRXZWF0aGVyKSxdKQpyb3VuZChkZWxheXNfZHVyYXRpb25feWVhclt3aGljaC5tYXgoZGVsYXlzX2R1cmF0aW9uX3llYXIkU2VjdXJpdHkpLF0pCmBgYApPdmVyYWxsLCA8Yj4yMDA3PC9iPiBoYXMgdGhlIGxvbmdlc3QgZGVsYXlzLgoKLSA8Yj4yMDA3PC9iPiBoYXMgdGhlIGxvbmdlc3QgZGVsYXlzIGR1ZSB0byB0aGUgTmF0aW9uYWwgQXZpYXRpb24gU3lzdGVtLCBBaXJjcmFmdCwgQ2FycmllciBhbmQgV2VhdGhlci4KLSA8Yj4yMDA2PC9iPiBoYXMgdGhlIGxvbmdlc3QgZGVsYXlzIGR1ZSB0byBTZWN1cml0eS4KCiMgU3VtbWFyeSBvZiBEYXRhIEFuYWx5c2lzCgpPbiBhdmVyYWdlLCA8Yj43Ny44JTwvYj4gb2YgZmxpZ2h0cyB3ZXJlIE9uIFRpbWUgZWFjaCBtb250aCBhbmQgPGI+MjAuMiU8L2I+IG9mIGZsaWdodHMgd2VyZSBEZWxheWVkLgoKVGhlIHRocmVlIGJpZ2dlc3QgcmVhc29ucyBmb3IgZmxpZ2h0IGRlbGF5cyBhcmU6IAoKLSBOYXRpb25hbCBBdmlhdGlvbiBTeXN0ZW0gYWNjb3VudHMgZm9yIDxiPjM5LjclPC9iPiBvZiBhbGwgZGVsYXlzLCBhdmVyYWdpbmcgYSB0b3RhbCBvZiA0NSwwNzcgbWludXRlcyBlYWNoIG1vbnRoLgotIExhdGUgQWlyY3JhZnQgYWNjb3VudHMgZm9yIDxiPjMyLjglPC9iPiBvZiBhbGwgZGVsYXlzLCBhdmVyYWdpbmcgYSB0b3RhbCBvZiA0OSw0MTAgbWludXRlcyBlYWNoIG1vbnRoLCB3aGljaCBpcyB0aGUgPGI+bG9uZ2VzdDwvYj4gZGVsYXkuCi0gQ2FycmllciBhY2NvdW50cyBmb3IgPGI+MjMuOSU8L2I+IG9mIGFsbCBkZWxheXMsIGF2ZXJhZ2luZyBhIHRvdGFsIG9mIDM1LDAyMSBtaW51dGVzIGVhY2ggbW9udGguCgpUaGUgbW9zdCBkZWxheXMgb2NjdXIgaW4gdGhlIG1vbnRoIG9mIDxiPkRlY2VtYmVyPC9iPiwgd2hpY2ggY2FuIGJlIGFjY291bnRlZCB0b3dhcmRzIHRoZSBOYXRpb25hbCBBdmlhdGlvbiBTeXN0ZW0sIENhcnJpZXIgYW5kIFNlY3VyaXR5LiAgIAoKVGhlIGxvbmdlc3QgZGVsYXlzIG9jY3VyIGluIHRoZSBtb250aCBvZiA8Yj5KdWx5PC9iPiwgd2hpY2ggY2FuIGJlIGFjY291bnRlZCB0b3dhcmRzIHRoZSBBaXJjcmFmdCBhbmQgQ2Fycmllci4KClRoZSBtb3N0IGRlbGF5cyBvY2N1ciBpbiB0aGUgeWVhciA8Yj4yMDA3LjwvYj4KCi0gVGhlc2UgZGVsYXlzIGNhbiBiZSBhY2NvdW50ZWQgdG93YXJkcyB0aGUgTmF0aW9uYWwgQXZpYXRpb24gU3lzdGVtLCBBaXJjcmFmdCwgQ2FycmllciBhbmQgV2VhdGhlci4KLSBUaGlzIGlzIGFsc28gdGhlIHllYXIgd2l0aCB0aGUgbG9uZ2VzdCBkZWxheXMgb3ZlcmFsbC4gCgoKCg==