This analysis looks at data from all recorded attacks which took place in Iraq during the years 2000 - 2015.
#install.packages("grid")
There were 12 warnings (use warnings() to see them)
#install.packages("ggmap")
#install.packages("mapproj")
#install.packages("viridis")
#install.packages("RColorBrewer")
Load libraries:
library(readr)
library(stringr)
library(ggplot2)
library(dplyr)
library(purrr)
library(tidyr)
library(magrittr)
library(ggmap)
library(mapproj)
library(viridis)
library(RColorBrewer)
library(grid)
setwd("C:/Users/Ana/Desktop/Data Analytics/CSV Files")
raw_data <- read_csv("Iraq_attacks_csv.csv")
Parsed with column specification:
cols(
.default = col_double(),
approxdate = [31mcol_character()[39m,
resolution = [31mcol_character()[39m,
country_txt = [31mcol_character()[39m,
region_txt = [31mcol_character()[39m,
provstate = [31mcol_character()[39m,
city = [31mcol_character()[39m,
location = [31mcol_character()[39m,
summary = [31mcol_character()[39m,
alternative_txt = [31mcol_character()[39m,
attacktype1_txt = [31mcol_character()[39m,
attacktype2_txt = [31mcol_character()[39m,
attacktype3_txt = [31mcol_character()[39m,
targtype1_txt = [31mcol_character()[39m,
targsubtype1_txt = [31mcol_character()[39m,
corp1 = [31mcol_character()[39m,
target1 = [31mcol_character()[39m,
natlty1_txt = [31mcol_character()[39m,
targtype2_txt = [31mcol_character()[39m,
targsubtype2_txt = [31mcol_character()[39m,
corp2 = [31mcol_character()[39m
# ... with 40 more columns
)
See spec(...) for full column specifications.
11 parsing failures.
row col expected actual file
4577 gsubname2 1/0/T/F/TRUE/FALSE Islamic Shiite Resistance in Iraq 'Iraq_attacks_csv.csv'
14853 gsubname2 1/0/T/F/TRUE/FALSE Intifadat Ahrar al-Iraq 'Iraq_attacks_csv.csv'
15018 gsubname2 1/0/T/F/TRUE/FALSE Intifadat Ahrar al-Iraq 'Iraq_attacks_csv.csv'
15414 gsubname2 1/0/T/F/TRUE/FALSE Intifadat Ahrar al-Iraq 'Iraq_attacks_csv.csv'
15609 gsubname2 1/0/T/F/TRUE/FALSE Intifadat Ahrar al-Iraq 'Iraq_attacks_csv.csv'
..... ......... .................. ................................. ......................
See problems(...) for more details.
#raw_data_syria <- read_csv("Syria_attacks_csv.csv")
Data Cleaning
The first 10 rows of the raw data is shown below.
attack_data <- raw_data
head(attack_data, 10)
NA
The data will cleaned by carriying out the following:
1 - Count how many NA values are in each column. If a column consists mainly of over 90% NA values, consideration should be made for removing it from the dataset.
2 - From looking at the first 10 rows, the author of the dataset sometimes puts a full stop ‘.’ in a column where an NA value should be. Before checking the number of NA values, I will just run through the dataframe replacing the cells with ‘.’ with NA.
3 - Some columns contain codes for the text which is provided in a separate column. For example, the columns region and region_txt contain the same information, only region is the code for the full name provided in region_txt. Therefore, all columns which are number codes for adjacent text columns will be removed as these columns double count information provided elsewhere.
4 - All columns which contain descriptions of items that are covered by data in other columns will be removed.Examples include Location - the long and lat are provided in separate columns.
5- String/Text analsis will not be carried out in this piece of work so columns containing descriptions i.e. summary or scite will be removed. Also columns relating to the media references have been deleted as this does not form part of the required analysis.
6 - By this point there are 50 columns remaining so now it’s ime to look at each one individually. Looking through these columns, most of them look like useful data. But there are a few columns which have ambiguous titles such as crit1. I need to check with the data owner what data these columns contain and see if they are necessary for the analysis.
Ambiguous Columns: -specificity -vicinity -crit1 -crit2 -crit3 -doubtterr -alternative_txt -multiple -success (I presume this is if the attack achieved the terrorists’ aims) -corp1 -ingroup -guncertain1 -nperps -nperpcap -nkillus (US specific deaths?) -nkillter -property -propextent_txt -propvalue -ishostkid -INT_LOG -INT_IDEO -INT_MISC -INT_ANY -related
Having spoken to the data owner,it has been confirmed that these columns do not hold information relevant to the key questions and therefore they will be removed from the dataframe.
7 - By now the dataframe contains 25 columns. I will now look at these columns and check that all of them are necessary and if there are any more that are superfuous to the analysis we want to carry out.
These columns potentially could be removed: -extended (contains 1 if the attack lasted more than 1 day, usually indicates hostage situation) -claimmode_txt (method of notification of claim of attack) -nwoundus (unsure) -nwoundte (unsure)
I don’t think that, for now, the analysis will focus on extended or not extended attacks, although this is something that could be reviewed later. For now, I’ll remove the column. Approxdate will also be removed as the year, month and day columns are populated. nwoundus and nwoundte - unsure but we have the data for total wounded so, for now at least, remove these columns.
8 - Finally, we are left with 21 columns of data relevant to this analysis. Last step is to rename the columns to make them clearer.
All of these data cleaning steps are detailed in the code. The cleaned data set is provided below.
#replace '.' values with NA
attack_data[attack_data == "."] <- NA
#head(attack_data, 10)
#count the number of NA values in each row
logic_na <- as.logical(rowSums(is.na(attack_data)))
#count the number of NA values in each column and output as dataframe
no_nas <- as.data.frame(colSums(is.na(attack_data)))
#rename the columns of the no_nas dataframe
na_values <- as.data.frame(cbind(colnames(attack_data), no_nas[,1]))
colnames(na_values)<- c("column_titles", "No. NA Values")
#na_values
#change values to integer
na_values[2] <- lapply(na_values[2], as.integer)
#calculate 90% of total number of rows
pc_90 <- length(attack_data$eventid)*0.9
#pc_90
#filter the dataframe so that it only contains column names with over 90% NA values
na_values_90pc <- na_values %>%
filter(`No. NA Values` > pc_90)
#na_values_90pc
#create a vector containing the names of the columns which contain over 90% NA values
na_columns <- na_values_90pc$column_titles
#na_columns
#All columns which contain over 90% NA values will be removed from the dataframe for analysis. This corresponds to 66 columns in the `na_columns` vector. Next to remove these columns.
reduced_data_1 <- attack_data %>%
select(-all_of(na_columns))
#head(reduced_data_1, 10)
#Some columns contain codes for the text which is provided in a separate column. For example, the columns `region` and `region_txt` contain the same information, only `region` is the code for the full name provided in `region_txt`. Therefore, all columns which are number codes for adjacent text columns will be removed as these columns double cont information provided elsewhere.
column_names <- colnames(reduced_data_1)
#column_names
reduced_data_2 <- reduced_data_1 %>%
select(-country, -region, -alternative, -attacktype1, -targtype1, -targsubtype1, -natlty1, -weaptype1, -weapsubtype1, -propextent)
#reduced_data_2
#All columns which contain descriptions of items that are covered by data in other columns will be removed.Examples include `Location` - the long and lat are provided in separate columns.
#Additionally, string/Text analsis will not be carried out in this piece of work so columns containing descriptions i.e. `summary` or `scite` will be removed. Also columns relating to the media references have been deleted as well.
column_names_2 <- colnames(reduced_data_2)
#column_names_2
reduced_data_3 <- reduced_data_2 %>%
select(-location, -summary, -target1, -motive, -weapdetail, -propcomment, -addnotes, -scite1, -scite2, -scite3, -dbsource)
#head(reduced_data_3, 10)
#Getting there, but there are still 50 columns. Looking through these columns, most of them look like useful data. But there are a few columns which have ambiguous titles such as `crit1`. I need to check with the data owner what data these columns contain and see if they are necessary for the analysis. Data owner confirmed removal.
reduced_data_4 <- reduced_data_3 %>%
select(-specificity, -vicinity, -crit1, -crit2, -crit3, -doubtterr, -alternative_txt, -multiple, -success, -corp1, -ingroup, -guncertain1, -nperps, -nperpcap, -nkillus, -nkillter, -property, -propextent_txt, -propvalue, -ishostkid, -INT_LOG, -INT_IDEO, -INT_MISC, -INT_ANY, -related)
#head(reduced_data_4, 10)
#remove further columns which arenot perinent to analysis.
reduced_data_5 <- reduced_data_4 %>%
select(-extended, -approxdate, -nwoundus, -nwoundte)
#head(reduced_data_5, 10)
#We are left with 21 columns of data relevant to this analysis. Next, rename the columns to make them more logical.
new_names <- c("eventid", "iyear", "imonth", "iday", "country", "region", "provstate", "city", "latitude", "longitude", "suicide", "attack_type_1", "target_type_1", "target_sub_type_1", "nationality", "group_name", "claimed", "weapon", "weapon_sub_type", "n_kill", "n_wounded")
colnames(reduced_data_5) <- new_names
head(reduced_data_5, 10)
Next, let’s look at the number of NA entires in the dataframe.
logic_na <- as.logical(rowSums(is.na(reduced_data_5)))
na_rows <- reduced_data_5[logic_na,]
df_na <- map_df(na_rows, function(x) as.numeric(is.na(x)))
df_na_heat <- df_na %>%
pivot_longer(cols = everything(),
names_to = "x") %>%
group_by(x) %>%
mutate(y = row_number())
plot_na_matrix <- function(df_na) {
# Preparing the dataframe for heatmaps
df_heat <- df_na %>%
pivot_longer(cols = everything(),
names_to = "x") %>%
group_by(x) %>%
mutate(y = row_number())
# Ensuring the order of columns is kept as it is
df_heat <- df_heat %>%
ungroup() %>%
mutate(x = factor(x,levels = colnames(df_na)))
# Plotting data
g <- ggplot(data = df_heat, aes(x=x, y=y, fill=value)) +
geom_tile() +
theme(legend.position = "none",
axis.title.y=element_blank(),
axis.text.y =element_blank(),
axis.ticks.y=element_blank(),
axis.title.x=element_blank(),
axis.text.x = element_text(angle = 90, hjust = 1))
# Returning the plot
g
}
plot_na_matrix(df_na)

From this plot, you can see that the cleaned dataset still contains some NA values. This is because only columns with over 90% NA values were removed. There are very few NA values in the city column and long and lat columns. The column target_sub_type_1 has quite a few NA values, presumably because there was only one target. The column weapon_sub_type has a number of NA values presumably relating to attacks that only used one weapon i.e. they didn’t have a sub-weapon. Then for n_kill and n_wounded there are a number of NA values. It would be good to know whether these NA values should be 0 values or whether it should be ‘unknown’.
no_nas <- as.data.frame(colSums(is.na(na_rows)))
colnames(no_nas) <- "No. of NA Values"
#no_nas
#length(reduced_data_5$eventid)
Data Analysis Questions
From looking at the data, the following analysis will be carried out:
- Analysis of Type of Attack
1a - Number of attacks per year
1b - Analyse trends in types of attacks
1c - Analyse the number of suicide attacks per year.
- Analysis of Attack Organisation
2a - Number of attacks per group, per year
2b - Plot number of attacks for each groups based on geography? Are some groups spreading geographically? Are some groups condensing geographically?
Analysis of Type of Target
Analysis of Weapon Usage
Analysis of Geography of attacks
Question 1a: Number of Attacks Vs Year
Track the number of attacks over the years 2000 - 2015.
attack_data_2 <- reduced_data_5
q1a_data <- attack_data_2 %>%
group_by(iyear) %>%
summarise(no_attacks = n())
#q1a_data
ggplot(data = q1a_data,
aes(x = iyear, y = no_attacks))+
geom_line(lwd = 1.5, color = "blue4") +
labs(title = "No. of Attacks vs Year in Iraq", x = "Year", y = "No. of Attacks") +
theme(panel.background = element_rect(fill = "white"))

#Filter the data so that it contains only 2015 attacks and check that all months are present in the data.
q1a_data_checkmonth <- attack_data_2 %>%
group_by(iyear, imonth) %>%
summarise(no_attacks = n()) %>%
filter(iyear == 2015)
#q1a_data_checkmonth
Attacks in Iraq increased between 2000 and 2014 with a very large increase in attacks between 2012 - 2014. However the number of attacks in 2015 dropped from the level in 2014. The data has been checked to ensure that it covers all months of 2015, which it does, so this decrease reflects a genuine reduction in attacks in the year 2015, compared to 2014.
Question 1b: Analyse trends in types of attacks
q1b_data <- attack_data_2 %>%
group_by(iyear, attack_type_1) %>%
summarise(no_attacks = n())
#q1b_data
ggplot(data = q1b_data,
aes(x = iyear, y = no_attacks, color = attack_type_1)) +
facet_wrap(~attack_type_1) +
geom_line(lwd = 1, color = "blue4") +
labs(title = "No. of Attacks vs Year in Iraq, per Attack Type", x = "Year", y = "No. of Attacks") +
theme(panel.background = element_rect(fill = "white"))

From these line graphs, you can see that there has been a vast increase in bombing/explosion attacks between 2000 and 2015. Additionally, there has been an increase (albeit smaller) in armed assault. Assassination attacks have remained constant. It appears there has been a small increase in hostage taking in 2014 and 2015.
#This next section was looking at whether there was any seasonal trend. There was sufficient evidence for this, so it has been left out of the analysis.
q1c_data <- attack_data_2 %>%
group_by(imonth) %>%
summarise(no_attacks = n())
#q1c_data
#ggplot(data = q1c_data,
# aes(x = imonth, y = no_attacks)) +
# geom_line(lwd = 1.5, color = "blue") +
# labs(title = "No. of Attacks vs Month in Iraq", x = "Month", y = "No. of Attacks") +
# theme(panel.background = element_rect(fill = "white")) +
# scale_x_discrete(limits=month.abb)
#This data is taken across all years. Overall, September is the month with the lowest average number of attacks, whereas November has the highest average number of attacks. Let's repeat this graph and plot the years out individually and see whether the trends are seen in each year.
q1ci_data <- attack_data_2 %>%
mutate(iyear = as.character(iyear)) %>%
group_by(iyear, imonth) %>%
summarise(no_attacks = n())
year_check <- q1ci_data %>%
group_by(iyear) %>%
summarise(no_months_in_year_active = n())
#year_check
q1ci_data <- q1ci_data %>%
filter(iyear > 2003)
#q1ci_data
#ggplot(data = q1ci_data,
# aes(x = imonth, y = no_attacks, color = iyear, lty = iyear)) +
# geom_line() +
# labs(title = "No. of Attacks vs Month in Iraq", x = "Month", y = "No. of Attacks") +
# theme(panel.background = element_rect(fill = "white")) +
# scale_x_discrete(limits=month.abb) +
# geom_text(data = subset(q1ci_data, imonth == 12), aes(label = iyear, colour = iyear, x = 12, y = no_attacks), hjust = -.1) +
# theme(legend.position="none")
#From plotting the monthly number of attacks for each year, you can see that the main trends seen in the previous graph are actually down to the years 2013 and 2014 which have a large number of attacks and variation. Therefore, overall it does not seem likely that there is a monthly pattern of attacks.
Question 1c: Analyse the number of suicide attacks
q1d_data <- attack_data_2 %>%
group_by(iyear, suicide) %>%
summarise(no_attacks = n())
#q1d_data
ggplot(data = q1d_data,
aes(x = iyear, y = no_attacks, color = as.character(suicide), lty = as.character(suicide))) +
geom_line(lwd = 1) +
labs(title = "Attacks and Suicide Attacks per Year in Iraq", x = "Year", y = "No. of Attacks") +
theme(panel.background = element_rect(fill = "white")) +
#theme(legend.title = element_blank()) +
scale_color_discrete(name ="Attack Type",
breaks=c("0", "1"),
labels=c("Not Suicide", "Suicide")) +
scale_linetype_discrete(name ="Attack Type",
breaks=c("0", "1"),
labels=c("Not Suicide", "Suicide"))

#q1d2_data <- q1d_data %>%
# pivot_wider(names_from = suicide, values_from = no_attacks)
#q1d2_data[is.na(q1d2_data)] = 0
The graph above shows that while there has been a large increase in the number of attacks from 2000 to 2015, the number of suicide attacks has not increased to the same extent. In fact, between 2008 and 2012, suicide attacks decreased whilst the overall number of attacks increased.
Question 2a: Analysis of Attack Organisation
q2ai_data <- attack_data_2 %>%
group_by(iyear, group_name) %>%
summarise(no_attack = n()) %>%
pivot_wider(names_from = iyear, values_from = no_attack) %>%
#replace_na(list(`2000` = 0)) %>%
replace_na(list(`2000` = 0, `2001` = 0, `2002` = 0, `2003` = 0, `2004` = 0, `2005` = 0, `2006` = 0, `2007` = 0, `2008` = 0, `2009` = 0, `2010` = 0, `2011` = 0, `2012` = 0, `2013` = 0, `2014` = 0, `2015` = 0)) %>%
mutate(total_all_yrs = rowSums(select(., 2:17))) %>%
mutate(sum_2015 = rowSums(select(., 17)))
q2ai_data
NA
This table shows the different terrorist groups in Iraq and the corresponding number of (known) attacks carried out between 2000 and 2015. There are 69 different terrorist groups in Iraq. For the purpose of this analysis, we will interrogate the data of groups which meet this criteria:
[1] Have carried out more than 20 attacks in total (across all years)
This removes small perpetrator groups from the analysis.
q2ai_data <- q2ai_data %>%
filter(total_all_yrs > 20)
#q2ai_data[,1]
By filtering out groups which have carried out less than 20 attacks in total, 10 groups are left. Unfortunately one of these groups is ‘unknown’. As can be seen from the data, for the large marjority of attacks, the perpetrators are not identified and these attacks are recorded as ‘Unknown’. There are also 2 other ambiguous group names - “Other” and “Gunmen”. Both of these groups have been allocated more than 20 attacks, however the attacks do not occur in the last 3 years. Given that these groups are not likely to be legitimate terrorist group names, they will be removed from the data set for analysis.
After this, there are 8 groups of interest for analysis. The activities of these groups will be analysed in more detail.
q2ai_data <- q2ai_data %>%
filter(group_name != "Other", group_name != "Gunmen")
#q2ai_data
#The 8 remaining groups of interest will be assigned to a vector `key_groups`
key_groups <- q2ai_data$group_name
#key_groups
q2a_data <- attack_data_2 %>%
filter(group_name %in% key_groups) %>%
group_by(iyear, group_name) %>%
summarise(no_attacks = n())
#q2a_data
g <- ggplot(data = q2a_data,
aes(x = iyear, y = no_attacks, color = group_name)) +
geom_line(lwd = 1.5) +
labs(title = "No. of Attacks per Group per year", x = "Year", y = "No. of Attacks") +
theme(panel.background = element_rect(fill = "white"))
#geom_text(data = subset(q2a_data_iraq, iyear == 2013), aes(label = group_name, colour = group_name, x = 2013, y = no_attacks), hjust = -.1) +
#theme(legend.position="none")
gt <- ggplotGrob(g)
gt$layout$clip[gt$layout$name == "panel"] <- "off"
grid.draw(gt)
q2a_data_2 <- q2a_data %>%
group_by(group_name) %>%
summarise(no_attacks = sum(no_attacks))
#q2a_data_2
ggplot(data = q2a_data_2,
aes(x = group_name, y = no_attacks, fill = group_name)) +
geom_bar(stat = 'identity') +
labs(title = "No. of Attacks per Group", x = "Group Name", y = "No. of Attacks") +
theme(panel.background = element_rect(fill = "white")) +
theme(axis.text.x = element_text(angle=60, hjust=1))+
geom_text(aes(label = no_attacks, y = no_attacks+1000)) +
theme(legend.position="none")


NA
NA
The bar chart shows the terrorist groups and the number of attacks committed by each in total from 2000-2015. It is worth noting that the group_name for the vast majoirty of attacks is unknown. This could be because there are unknown groups active who do not claim attacks, or perhaps more likely is that the attacks are carried out by known groups, but they are not claimed/cannot be identified.
Of the groups that are identified, ISIL has by far carried out the most attacks, followed by Al-Qaida in Iraq, then ISI.
However, when looking at the line graph of number of attacks per year by different groups, it shows that the organisations are not consistent throughout the years. ISI is active between the years 2007 and 2010, Al-Qaida in Iraq is most active between 2011 and 2013 and after that, ISIL is by far the dominant organisation.
Do members of these groups switch alegiance depending on which group is most ‘popular’ at the time? i.e. are the attacks caried out by largely the same population of people regardless of the group name?
Or are these groups made up of categorically different people with different beliefs and motivations?
i.e. is Al Quaida largely defeated or have the perpetrators simply jumped ship to ISIL?
Further work: Look at how many of the attacks are ‘claimed’ and is that the main way that groups are identified or is the group_name identified by other means?
Question 3a: Analysis of Target Type
The following graphs show the number of attacks on each type of target. The first set of graphs show attacks by all terrorist groups. The second shows just the attacks by ISIL as the data shows that this is the most active, current group.
q3a_data <- attack_data_2 %>%
group_by(iyear, target_type_1) %>%
summarise(no_attacks = n())
#q3a_data
ggplot(data = q3a_data,
aes(x = iyear, y = no_attacks))+
facet_wrap(~target_type_1)+
geom_line(lwd = 1, color = "blue4") +
labs(title = "No. of Attacks per Group per year in Iraq, split by Target", x = "Year", y = "No. of Attacks") +
theme(panel.background = element_rect(fill = "white"))

q3a_data <- attack_data_2 %>%
filter(group_name == "Islamic State of Iraq and the Levant (ISIL)") %>%
group_by(iyear, target_type_1) %>%
summarise(no_attacks = n())
ggplot(data = q3a_data,
aes(x = iyear, y = no_attacks))+
facet_wrap(~target_type_1)+
geom_line(lwd = 1, color = "blue4") +
labs(title = "No. of Attacks by ISIL per year in Iraq, split by Target", x = "Year", y = "No. of Attacks") +
theme(panel.background = element_rect(fill = "white"))

The number of attacks generally has increased from 2000 to 2015 in Iraq. This is driven largely by attacks on private citizens and property although there has also been an increase in attacks on the miliary and police. Attacks on businesses has seen an increase too. The data shows that ISIL tends to attack Private Citizens & Property, Military and Police. The attacks on the Military by ISIL has increased year on year which would suggest that this was a partcular focus of the group.
#This next section of code looked at the nationality of victims. The vast majority of victimes were Iraqi nationals. No further investigation will be done on victim nationality.
q3b_data <- attack_data_2 %>%
group_by(nationality) %>%
summarise(no_attacks = n()) %>%
filter(no_attacks > 5)
#q3b_data
#ggplot(data = q3b_data,
# aes(x = nationality, y = no_attacks, fill = nationality))+
# geom_bar(stat = 'identity') +
# theme(axis.text.x = element_text(angle=90, hjust=1)) +
# labs(title = "Nationality of Attack Victims in Iraq - All Yrs (no. attacks > 5)", x = "Nationality", y = "No. of Attacks") +
# theme(panel.background = element_rect(fill = "white"))
Question 4: Analysis on Weapon Use
q4a_data <- attack_data_2 %>%
group_by(weapon) %>%
summarise(no_attacks = n(), no_killed_real = sum(n_kill)) %>%
#summarise(no_killed = mean(claimed))
mutate(weapon = str_replace(weapon, "Explosives/Bombs/Dynamite", "Explosives")) %>%
mutate(weapon = str_replace(weapon, "not to include vehicle-borne explosives, i.e., car or truck bombs", "excl explosives"))
#q4a_data
pct<- round(100*q4a_data$no_attacks/sum(q4a_data$no_attacks), 1)
ggplot(data = q4a_data,
aes(x = weapon, y = no_attacks, fill = weapon))+
geom_bar(stat = 'identity') +
theme(axis.text.x = element_text(angle=50, hjust=1)) +
labs(title = "No of Attacks by Weapon Type - All Years", x = "Weapon", y = "No. Killed") +
theme(panel.background = element_rect(fill = "white")) +
theme(legend.position = "none") +
geom_text(aes(label = no_attacks, y = no_attacks+500))

NA
NA
NA
NA
NA
The vast majority of attacks are carried out using explosives. This accounts for 76% of all attacks (across all years). Attacks using firearms then accounts for 20%.
As these are by far the methods used most for carrying out attacks, these two weapon types will be explored in more detail. Firstly how are the numbers of these attack types changing over the years?
q4b_data <- attack_data_2 %>%
group_by(iyear, weapon) %>%
summarise(no_attacks = n()) %>%
filter(weapon == "Explosives/Bombs/Dynamite" | weapon == "Firearms") %>%
pivot_wider(names_from = weapon, values_from = no_attacks) %>%
replace_na(list(Firearms = 0)) %>%
mutate(total = `Explosives/Bombs/Dynamite` + `Firearms`) %>%
mutate(expl_pct = round(`Explosives/Bombs/Dynamite`/total*100, 0)) %>%
pivot_longer(cols = c(`Explosives/Bombs/Dynamite`, `Firearms`), names_to = "weapon", values_to = "no_attacks")
#q4b_data
#ggplot(data = q4b_data,
# aes(x = iyear, y = no_attacks, fill = weapon))+
# geom_bar(stat = 'identity')+
# labs(title = "No. of Explosives and Firearms Attacks per Year (% = Explosive Attacks)", x = "Year", y = "No. of Attacks") +
# theme(panel.background = element_rect(fill = "white")) +
# geom_text(aes(label = paste(expl_pct,"%"), y = total+0.5))
ggplot(data = q4b_data, aes(x=iyear)) +
geom_line( aes(y=no_attacks, color = weapon), size=2) +
# geom_line( aes(y=expl_pct*40), lty = 2, size=0.5) +
#scale_y_continuous(name = "No. of attacks", sec.axis = sec_axis(~ . /40, name="% of Attacks that use Explosives")
#) +
#ggtitle("No. of Explosive and Firearms attacks per Year - Iraq")+
labs(title = "No. of Explosive and Firearms attacks per Year - Iraq", x = "Year", y = "No. of Attacks") +
theme(panel.background = element_rect(fill = "white"))

As Explosives/Bombs/Dynamite account for such a large proportion of all attacks, it will be useful to understand more about the sub-type of weapon and if there are any trends in what attackers are using.
q4c_data <- attack_data_2 %>%
filter(weapon == "Explosives/Bombs/Dynamite") %>%
group_by(iyear, weapon_sub_type) %>%
summarise(no_attacks = n()) %>%
filter(weapon_sub_type != "Unknown Explosive Type") %>%
filter(weapon_sub_type != "Other Explosive Device")
#q4c_data
ggplot(data = q4c_data,
aes(x = iyear, y = no_attacks, lty = weapon_sub_type, color = weapon_sub_type), size = 2)+
geom_line(lwd = 1.25)+
# scale_colour_brewer("Weapon Sub-Type", palette="Set1") +
labs(title = "Types of Explosives Attacks - 2000 to 2015", x = "Year", y = "No. of Attacks") +
theme(panel.background = element_rect(fill = "white"))

NA
There has been a large increase in explosives - ‘vehicle’ i.e car bombs. In fact, in recent years, this accounts for the majority of explosives attacks. Additionally, projectiles have been used more in recent years. Sticky bombs were used more around 2010-2011 but incidents using sticky bombs have declined in recent years. Overall, the two main explosives used are vehicle bombs and projectiles.
Question 5: Analysis on Geography of Attacks
q5a_data <- attack_data_2 %>%
select(iyear, latitude, longitude, group_name) %>%
filter(group_name %in% key_groups) %>%
filter(longitude < 50 & latitude < 39) %>% #removing 3no rogue locations outside of Iraq
mutate(iyear = as.integer(iyear)) %>%
mutate(group_name = str_replace(group_name, "Islamic State of Iraq \\(ISI\\)", "ISI")) %>%
mutate(group_name = str_replace(group_name, "Islamic State of Iraq and the Levant \\(ISIL\\)", "ISIL"))
q5a_data
fileName <- 'google_api.txt'
code <- readChar(fileName, file.info(fileName)$size)
#register_google(key = "XXX")
register_google(key = code)
#get_map("Iraq", zoom = 6) %>% ggmap()
#iraq <- c(left = 38.5, bottom = 29, right = 48.5, top = 37.5)
#get_stamenmap(iraq, zoom = 6) %>% ggmap()
qmplot(longitude, latitude, data = q5a_data, maptype = "toner-lite", darken = 0, color = group_name) + scale_colour_brewer("Group Name", palette="Set1")+
labs(title = "Attack Locations from 2000 to 2015")
Using zoom = 7...

#qmplot(longitude, latitude, data = q5a_data, maptype = "toner-lite", darken = 0, color = group_name) + scale_colour_brewer("Group Name", palette="Set1")+
# facet_wrap(~group_name)
This plot shows the locations of all attacks carried out my the 8 key groups, across all years.
qmplot(longitude, latitude, data = q5a_data, maptype = "toner-lite", darken = 0, color = -iyear) +
scale_color_viridis(option = "C")+
facet_wrap(~group_name) +
#scale_color_manual(values = brewer.pal(n=16, name = "RdBu"))+
labs(title = "Attack Locations by Group, 2000 to 2015") +
theme(legend.title = element_blank())
Using zoom = 7...

#ggsave("mapiraq.png")
This plot shows the attacks per group, colour coded for year. Yellow markers show attacks that occurred in the early 2000s. Dark blue attacks are recent.
From this you can see that the group Tawhid and Jihad is no longer active in carrying out attacks. ISI attacks were carried out predominatly between the years 2005 and 2010 whilst ISIL attacks are shown to be from 2010 onwards. This makes sense because ISI largely became ISIL.
The Al-Naqshabandiya Army appears to be a group carrying out attacks in Central Iraq, since 2010. This is therefore a relativley new group. Al-Qaida in Iraq are a long standing group which has carried out attacks in Iraq from the year 2000 and still carry out attacks in 2015. Ansar al-Islam is another long standing group carrying out attacks across all years, however it has carried out far few attacks than Al-Qaida in Iraq. The group Muslim Fundamentalists have carried out attacks in recent years mostly in central Iraq.
Unfortunately, the great majority of the attacks do not have a identified group.
LS0tDQp0aXRsZTogIkFuYWx5c2lzIG9mIFRlcnJvcmlzdCBBdHRhY2tzIGluIElyYXEsIDIwMDAgLSAyMDE1Ig0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NClRoaXMgYW5hbHlzaXMgbG9va3MgYXQgZGF0YSBmcm9tIGFsbCByZWNvcmRlZCBhdHRhY2tzIHdoaWNoIHRvb2sgcGxhY2UgaW4gSXJhcSBkdXJpbmcgdGhlIHllYXJzIDIwMDAgLSAyMDE1Lg0KDQpgYGB7cn0NCiNpbnN0YWxsLnBhY2thZ2VzKCJncmlkIikNCiNpbnN0YWxsLnBhY2thZ2VzKCJnZ21hcCIpDQojaW5zdGFsbC5wYWNrYWdlcygibWFwcHJvaiIpDQojaW5zdGFsbC5wYWNrYWdlcygidmlyaWRpcyIpDQojaW5zdGFsbC5wYWNrYWdlcygiUkNvbG9yQnJld2VyIikNCmBgYA0KDQpMb2FkIGxpYnJhcmllczoNCmBgYHtyfQ0KbGlicmFyeShyZWFkcikNCmxpYnJhcnkoc3RyaW5ncikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHB1cnJyKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkobWFncml0dHIpDQpsaWJyYXJ5KGdnbWFwKQ0KbGlicmFyeShtYXBwcm9qKQ0KbGlicmFyeSh2aXJpZGlzKQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQpsaWJyYXJ5KGdyaWQpDQoNCnNldHdkKCJDOi9Vc2Vycy9BbmEvRGVza3RvcC9EYXRhIEFuYWx5dGljcy9DU1YgRmlsZXMiKQ0KcmF3X2RhdGEgPC0gcmVhZF9jc3YoIklyYXFfYXR0YWNrc19jc3YuY3N2IikNCiNyYXdfZGF0YV9zeXJpYSA8LSByZWFkX2NzdigiU3lyaWFfYXR0YWNrc19jc3YuY3N2IikNCmBgYA0KYGBge3J9DQogDQpgYGANCjxmb250IHNpemU9IjUiPiBEYXRhIENsZWFuaW5nIDwvZm9udD4NCg0KVGhlIGZpcnN0IDEwIHJvd3Mgb2YgdGhlIHJhdyBkYXRhIGlzIHNob3duIGJlbG93LiANCg0KYGBge3J9DQphdHRhY2tfZGF0YSA8LSByYXdfZGF0YQ0KaGVhZChhdHRhY2tfZGF0YSwgMTApDQoNCmBgYA0KVGhlIGRhdGEgd2lsbCBjbGVhbmVkIGJ5IGNhcnJpeWluZyBvdXQgdGhlIGZvbGxvd2luZzoNCg0KMSAtIENvdW50IGhvdyBtYW55IE5BIHZhbHVlcyBhcmUgaW4gZWFjaCBjb2x1bW4uIElmIGEgY29sdW1uIGNvbnNpc3RzIG1haW5seSBvZiBvdmVyIDkwJSBOQSB2YWx1ZXMsIGNvbnNpZGVyYXRpb24gc2hvdWxkIGJlIG1hZGUgZm9yIHJlbW92aW5nIGl0IGZyb20gdGhlIGRhdGFzZXQuDQoNCjIgLSBGcm9tIGxvb2tpbmcgYXQgdGhlIGZpcnN0IDEwIHJvd3MsIHRoZSBhdXRob3Igb2YgdGhlIGRhdGFzZXQgc29tZXRpbWVzIHB1dHMgYSBmdWxsIHN0b3AgJy4nIGluIGEgY29sdW1uIHdoZXJlIGFuIE5BIHZhbHVlIHNob3VsZCBiZS4gQmVmb3JlIGNoZWNraW5nIHRoZSBudW1iZXIgb2YgTkEgdmFsdWVzLCBJIHdpbGwganVzdCBydW4gdGhyb3VnaCB0aGUgZGF0YWZyYW1lIHJlcGxhY2luZyB0aGUgY2VsbHMgd2l0aCAnLicgd2l0aCBOQS4NCg0KMyAtIFNvbWUgY29sdW1ucyBjb250YWluIGNvZGVzIGZvciB0aGUgdGV4dCB3aGljaCBpcyBwcm92aWRlZCBpbiBhIHNlcGFyYXRlIGNvbHVtbi4gRm9yIGV4YW1wbGUsIHRoZSBjb2x1bW5zIGByZWdpb25gIGFuZCBgcmVnaW9uX3R4dGAgY29udGFpbiB0aGUgc2FtZSBpbmZvcm1hdGlvbiwgb25seSBgcmVnaW9uYCBpcyB0aGUgY29kZSBmb3IgdGhlIGZ1bGwgbmFtZSBwcm92aWRlZCBpbiBgcmVnaW9uX3R4dGAuIFRoZXJlZm9yZSwgYWxsIGNvbHVtbnMgd2hpY2ggYXJlIG51bWJlciBjb2RlcyBmb3IgYWRqYWNlbnQgdGV4dCBjb2x1bW5zIHdpbGwgYmUgcmVtb3ZlZCBhcyB0aGVzZSBjb2x1bW5zIGRvdWJsZSBjb3VudCBpbmZvcm1hdGlvbiBwcm92aWRlZCBlbHNld2hlcmUuIA0KDQo0IC0gQWxsIGNvbHVtbnMgd2hpY2ggY29udGFpbiBkZXNjcmlwdGlvbnMgb2YgaXRlbXMgdGhhdCBhcmUgY292ZXJlZCBieSBkYXRhIGluIG90aGVyIGNvbHVtbnMgd2lsbCBiZSByZW1vdmVkLkV4YW1wbGVzIGluY2x1ZGUgYExvY2F0aW9uYCAtIHRoZSBsb25nIGFuZCBsYXQgYXJlIHByb3ZpZGVkIGluIHNlcGFyYXRlIGNvbHVtbnMuDQoNCjUtIFN0cmluZy9UZXh0IGFuYWxzaXMgd2lsbCBub3QgYmUgY2FycmllZCBvdXQgaW4gdGhpcyBwaWVjZSBvZiB3b3JrIHNvIGNvbHVtbnMgY29udGFpbmluZyBkZXNjcmlwdGlvbnMgaS5lLiBgc3VtbWFyeWAgb3IgYHNjaXRlYCB3aWxsIGJlIHJlbW92ZWQuIEFsc28gY29sdW1ucyByZWxhdGluZyB0byB0aGUgbWVkaWEgcmVmZXJlbmNlcyBoYXZlIGJlZW4gZGVsZXRlZCBhcyB0aGlzIGRvZXMgbm90IGZvcm0gcGFydCBvZiB0aGUgcmVxdWlyZWQgYW5hbHlzaXMuDQoNCjYgLSBCeSB0aGlzIHBvaW50IHRoZXJlIGFyZSA1MCBjb2x1bW5zIHJlbWFpbmluZyBzbyBub3cgaXQncyBpbWUgdG8gbG9vayBhdCBlYWNoIG9uZSBpbmRpdmlkdWFsbHkuIExvb2tpbmcgdGhyb3VnaCB0aGVzZSBjb2x1bW5zLCBtb3N0IG9mIHRoZW0gbG9vayBsaWtlIHVzZWZ1bCBkYXRhLiBCdXQgdGhlcmUgYXJlIGEgZmV3IGNvbHVtbnMgd2hpY2ggaGF2ZSBhbWJpZ3VvdXMgdGl0bGVzIHN1Y2ggYXMgYGNyaXQxYC4gSSBuZWVkIHRvIGNoZWNrIHdpdGggdGhlIGRhdGEgb3duZXIgd2hhdCBkYXRhIHRoZXNlIGNvbHVtbnMgY29udGFpbiBhbmQgc2VlIGlmIHRoZXkgYXJlIG5lY2Vzc2FyeSBmb3IgdGhlIGFuYWx5c2lzLg0KDQpBbWJpZ3VvdXMgQ29sdW1uczoNCi1zcGVjaWZpY2l0eQ0KLXZpY2luaXR5DQotY3JpdDENCi1jcml0Mg0KLWNyaXQzDQotZG91YnR0ZXJyDQotYWx0ZXJuYXRpdmVfdHh0DQotbXVsdGlwbGUNCi1zdWNjZXNzIChJIHByZXN1bWUgdGhpcyBpcyBpZiB0aGUgYXR0YWNrIGFjaGlldmVkIHRoZSB0ZXJyb3Jpc3RzJyBhaW1zKQ0KLWNvcnAxDQotaW5ncm91cA0KLWd1bmNlcnRhaW4xDQotbnBlcnBzDQotbnBlcnBjYXANCi1ua2lsbHVzIChVUyBzcGVjaWZpYyBkZWF0aHM/KQ0KLW5raWxsdGVyDQotcHJvcGVydHkNCi1wcm9wZXh0ZW50X3R4dA0KLXByb3B2YWx1ZQ0KLWlzaG9zdGtpZA0KLUlOVF9MT0cNCi1JTlRfSURFTw0KLUlOVF9NSVNDDQotSU5UX0FOWQ0KLXJlbGF0ZWQNCg0KSGF2aW5nIHNwb2tlbiB0byB0aGUgZGF0YSBvd25lcixpdCBoYXMgYmVlbiBjb25maXJtZWQgdGhhdCB0aGVzZSBjb2x1bW5zIGRvIG5vdCBob2xkIGluZm9ybWF0aW9uIHJlbGV2YW50IHRvIHRoZSBrZXkgcXVlc3Rpb25zIGFuZCB0aGVyZWZvcmUgdGhleSB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgZGF0YWZyYW1lLg0KDQo3IC0gQnkgbm93IHRoZSBkYXRhZnJhbWUgY29udGFpbnMgMjUgY29sdW1ucy4gSSB3aWxsIG5vdyBsb29rIGF0IHRoZXNlIGNvbHVtbnMgYW5kIGNoZWNrIHRoYXQgYWxsIG9mIHRoZW0gYXJlIG5lY2Vzc2FyeSBhbmQgaWYgdGhlcmUgYXJlIGFueSBtb3JlIHRoYXQgYXJlIHN1cGVyZnVvdXMgdG8gdGhlIGFuYWx5c2lzIHdlIHdhbnQgdG8gY2Fycnkgb3V0Lg0KDQpUaGVzZSBjb2x1bW5zIHBvdGVudGlhbGx5IGNvdWxkIGJlIHJlbW92ZWQ6DQotZXh0ZW5kZWQgKGNvbnRhaW5zIDEgaWYgdGhlIGF0dGFjayBsYXN0ZWQgbW9yZSB0aGFuIDEgZGF5LCB1c3VhbGx5IGluZGljYXRlcyBob3N0YWdlIHNpdHVhdGlvbikNCi1jbGFpbW1vZGVfdHh0IChtZXRob2Qgb2Ygbm90aWZpY2F0aW9uIG9mIGNsYWltIG9mIGF0dGFjaykNCi1ud291bmR1cyAodW5zdXJlKQ0KLW53b3VuZHRlICh1bnN1cmUpDQoNCkkgZG9uJ3QgdGhpbmsgdGhhdCwgZm9yIG5vdywgdGhlIGFuYWx5c2lzIHdpbGwgZm9jdXMgb24gZXh0ZW5kZWQgb3Igbm90IGV4dGVuZGVkIGF0dGFja3MsIGFsdGhvdWdoIHRoaXMgaXMgc29tZXRoaW5nIHRoYXQgY291bGQgYmUgcmV2aWV3ZWQgbGF0ZXIuIEZvciBub3csIEknbGwgcmVtb3ZlIHRoZSBjb2x1bW4uDQpBcHByb3hkYXRlIHdpbGwgYWxzbyBiZSByZW1vdmVkIGFzIHRoZSB5ZWFyLCBtb250aCBhbmQgZGF5IGNvbHVtbnMgYXJlIHBvcHVsYXRlZC4NCm53b3VuZHVzIGFuZCBud291bmR0ZSAtIHVuc3VyZSBidXQgd2UgaGF2ZSB0aGUgZGF0YSBmb3IgdG90YWwgd291bmRlZCBzbywgZm9yIG5vdyBhdCBsZWFzdCwgcmVtb3ZlIHRoZXNlIGNvbHVtbnMuDQoNCjggLSBGaW5hbGx5LCB3ZSBhcmUgbGVmdCB3aXRoIDIxIGNvbHVtbnMgb2YgZGF0YSByZWxldmFudCB0byB0aGlzIGFuYWx5c2lzLiBMYXN0IHN0ZXAgaXMgdG8gcmVuYW1lIHRoZSBjb2x1bW5zIHRvIG1ha2UgdGhlbSBjbGVhcmVyLg0KDQpBbGwgb2YgdGhlc2UgZGF0YSBjbGVhbmluZyBzdGVwcyBhcmUgZGV0YWlsZWQgaW4gdGhlIGNvZGUuIFRoZSBjbGVhbmVkIGRhdGEgc2V0IGlzIHByb3ZpZGVkIGJlbG93LiANCg0KDQpgYGB7cn0NCg0KI3JlcGxhY2UgJy4nIHZhbHVlcyB3aXRoIE5BDQoNCmF0dGFja19kYXRhW2F0dGFja19kYXRhID09ICIuIl0gPC0gTkENCiNoZWFkKGF0dGFja19kYXRhLCAxMCkNCg0KI2NvdW50IHRoZSBudW1iZXIgb2YgTkEgdmFsdWVzIGluIGVhY2ggcm93DQoNCmxvZ2ljX25hIDwtIGFzLmxvZ2ljYWwocm93U3Vtcyhpcy5uYShhdHRhY2tfZGF0YSkpKQ0KDQojY291bnQgdGhlIG51bWJlciBvZiBOQSB2YWx1ZXMgaW4gZWFjaCBjb2x1bW4gYW5kIG91dHB1dCBhcyBkYXRhZnJhbWUNCg0Kbm9fbmFzIDwtIGFzLmRhdGEuZnJhbWUoY29sU3Vtcyhpcy5uYShhdHRhY2tfZGF0YSkpKQ0KDQojcmVuYW1lIHRoZSBjb2x1bW5zIG9mIHRoZSBub19uYXMgZGF0YWZyYW1lDQoNCm5hX3ZhbHVlcyA8LSBhcy5kYXRhLmZyYW1lKGNiaW5kKGNvbG5hbWVzKGF0dGFja19kYXRhKSwgbm9fbmFzWywxXSkpDQpjb2xuYW1lcyhuYV92YWx1ZXMpPC0gYygiY29sdW1uX3RpdGxlcyIsICJOby4gTkEgVmFsdWVzIikNCiNuYV92YWx1ZXMNCg0KI2NoYW5nZSB2YWx1ZXMgdG8gaW50ZWdlcg0KDQpuYV92YWx1ZXNbMl0gPC0gbGFwcGx5KG5hX3ZhbHVlc1syXSwgYXMuaW50ZWdlcikNCg0KI2NhbGN1bGF0ZSA5MCUgb2YgdG90YWwgbnVtYmVyIG9mIHJvd3MNCg0KcGNfOTAgPC0gbGVuZ3RoKGF0dGFja19kYXRhJGV2ZW50aWQpKjAuOQ0KI3BjXzkwDQoNCiNmaWx0ZXIgdGhlIGRhdGFmcmFtZSBzbyB0aGF0IGl0IG9ubHkgY29udGFpbnMgY29sdW1uIG5hbWVzIHdpdGggb3ZlciA5MCUgTkEgdmFsdWVzDQoNCm5hX3ZhbHVlc185MHBjIDwtIG5hX3ZhbHVlcyAlPiUNCiAgZmlsdGVyKGBOby4gTkEgVmFsdWVzYCA+IHBjXzkwKQ0KI25hX3ZhbHVlc185MHBjDQoNCiNjcmVhdGUgYSB2ZWN0b3IgY29udGFpbmluZyB0aGUgbmFtZXMgb2YgdGhlIGNvbHVtbnMgd2hpY2ggY29udGFpbiBvdmVyIDkwJSBOQSB2YWx1ZXMNCg0KbmFfY29sdW1ucyA8LSBuYV92YWx1ZXNfOTBwYyRjb2x1bW5fdGl0bGVzDQojbmFfY29sdW1ucw0KYGBgDQoNCmBgYHtyfQ0KI0FsbCBjb2x1bW5zIHdoaWNoIGNvbnRhaW4gb3ZlciA5MCUgTkEgdmFsdWVzIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBkYXRhZnJhbWUgZm9yIGFuYWx5c2lzLiBUaGlzIGNvcnJlc3BvbmRzIHRvIDY2IGNvbHVtbnMgaW4gdGhlIGBuYV9jb2x1bW5zYCB2ZWN0b3IuIE5leHQgdG8gcmVtb3ZlIHRoZXNlIGNvbHVtbnMuDQoNCnJlZHVjZWRfZGF0YV8xIDwtIGF0dGFja19kYXRhICU+JQ0KICBzZWxlY3QoLWFsbF9vZihuYV9jb2x1bW5zKSkNCg0KI2hlYWQocmVkdWNlZF9kYXRhXzEsIDEwKQ0KYGBgDQoNCg0KYGBge3J9DQojU29tZSBjb2x1bW5zIGNvbnRhaW4gY29kZXMgZm9yIHRoZSB0ZXh0IHdoaWNoIGlzIHByb3ZpZGVkIGluIGEgc2VwYXJhdGUgY29sdW1uLiBGb3IgZXhhbXBsZSwgdGhlIGNvbHVtbnMgYHJlZ2lvbmAgYW5kIGByZWdpb25fdHh0YCBjb250YWluIHRoZSBzYW1lIGluZm9ybWF0aW9uLCBvbmx5IGByZWdpb25gIGlzIHRoZSBjb2RlIGZvciB0aGUgZnVsbCBuYW1lIHByb3ZpZGVkIGluIGByZWdpb25fdHh0YC4gVGhlcmVmb3JlLCBhbGwgY29sdW1ucyB3aGljaCBhcmUgbnVtYmVyIGNvZGVzIGZvciBhZGphY2VudCB0ZXh0IGNvbHVtbnMgd2lsbCBiZSByZW1vdmVkIGFzIHRoZXNlIGNvbHVtbnMgZG91YmxlIGNvbnQgaW5mb3JtYXRpb24gcHJvdmlkZWQgZWxzZXdoZXJlLiANCg0KY29sdW1uX25hbWVzIDwtIGNvbG5hbWVzKHJlZHVjZWRfZGF0YV8xKQ0KI2NvbHVtbl9uYW1lcw0KDQpyZWR1Y2VkX2RhdGFfMiA8LSByZWR1Y2VkX2RhdGFfMSAlPiUNCiAgc2VsZWN0KC1jb3VudHJ5LCAtcmVnaW9uLCAtYWx0ZXJuYXRpdmUsIC1hdHRhY2t0eXBlMSwgLXRhcmd0eXBlMSwgLXRhcmdzdWJ0eXBlMSwgLW5hdGx0eTEsIC13ZWFwdHlwZTEsIC13ZWFwc3VidHlwZTEsIC1wcm9wZXh0ZW50KQ0KDQojcmVkdWNlZF9kYXRhXzINCmBgYA0KDQoNCmBgYHtyfQ0KI0FsbCBjb2x1bW5zIHdoaWNoIGNvbnRhaW4gZGVzY3JpcHRpb25zIG9mIGl0ZW1zIHRoYXQgYXJlIGNvdmVyZWQgYnkgZGF0YSBpbiBvdGhlciBjb2x1bW5zIHdpbGwgYmUgcmVtb3ZlZC5FeGFtcGxlcyBpbmNsdWRlIGBMb2NhdGlvbmAgLSB0aGUgbG9uZyBhbmQgbGF0IGFyZSBwcm92aWRlZCBpbiBzZXBhcmF0ZSBjb2x1bW5zLg0KDQojQWRkaXRpb25hbGx5LCBzdHJpbmcvVGV4dCBhbmFsc2lzIHdpbGwgbm90IGJlIGNhcnJpZWQgb3V0IGluIHRoaXMgcGllY2Ugb2Ygd29yayBzbyBjb2x1bW5zIGNvbnRhaW5pbmcgZGVzY3JpcHRpb25zIGkuZS4gYHN1bW1hcnlgIG9yIGBzY2l0ZWAgd2lsbCBiZSByZW1vdmVkLiBBbHNvIGNvbHVtbnMgcmVsYXRpbmcgdG8gdGhlIG1lZGlhIHJlZmVyZW5jZXMgaGF2ZSBiZWVuIGRlbGV0ZWQgYXMgd2VsbC4NCg0KY29sdW1uX25hbWVzXzIgPC0gY29sbmFtZXMocmVkdWNlZF9kYXRhXzIpDQojY29sdW1uX25hbWVzXzINCg0KcmVkdWNlZF9kYXRhXzMgPC0gcmVkdWNlZF9kYXRhXzIgJT4lDQogIHNlbGVjdCgtbG9jYXRpb24sIC1zdW1tYXJ5LCAtdGFyZ2V0MSwgLW1vdGl2ZSwgLXdlYXBkZXRhaWwsIC1wcm9wY29tbWVudCwgLWFkZG5vdGVzLCAtc2NpdGUxLCAtc2NpdGUyLCAtc2NpdGUzLCAtZGJzb3VyY2UpDQoNCiNoZWFkKHJlZHVjZWRfZGF0YV8zLCAxMCkNCmBgYA0KDQoNCmBgYHtyfQ0KI0dldHRpbmcgdGhlcmUsIGJ1dCB0aGVyZSBhcmUgc3RpbGwgNTAgY29sdW1ucy4gTG9va2luZyB0aHJvdWdoIHRoZXNlIGNvbHVtbnMsIG1vc3Qgb2YgdGhlbSBsb29rIGxpa2UgdXNlZnVsIGRhdGEuIEJ1dCB0aGVyZSBhcmUgYSBmZXcgY29sdW1ucyB3aGljaCBoYXZlIGFtYmlndW91cyB0aXRsZXMgc3VjaCBhcyBgY3JpdDFgLiBJIG5lZWQgdG8gY2hlY2sgd2l0aCB0aGUgZGF0YSBvd25lciB3aGF0IGRhdGEgdGhlc2UgY29sdW1ucyBjb250YWluIGFuZCBzZWUgaWYgdGhleSBhcmUgbmVjZXNzYXJ5IGZvciB0aGUgYW5hbHlzaXMuIERhdGEgb3duZXIgY29uZmlybWVkIHJlbW92YWwuDQoNCnJlZHVjZWRfZGF0YV80IDwtIHJlZHVjZWRfZGF0YV8zICU+JQ0KICBzZWxlY3QoLXNwZWNpZmljaXR5LCAtdmljaW5pdHksIC1jcml0MSwgLWNyaXQyLCAtY3JpdDMsIC1kb3VidHRlcnIsIC1hbHRlcm5hdGl2ZV90eHQsIC1tdWx0aXBsZSwgLXN1Y2Nlc3MsIC1jb3JwMSwgLWluZ3JvdXAsIC1ndW5jZXJ0YWluMSwgLW5wZXJwcywgLW5wZXJwY2FwLCAtbmtpbGx1cywgLW5raWxsdGVyLCAtcHJvcGVydHksIC1wcm9wZXh0ZW50X3R4dCwgLXByb3B2YWx1ZSwgLWlzaG9zdGtpZCwgLUlOVF9MT0csIC1JTlRfSURFTywgLUlOVF9NSVNDLCAtSU5UX0FOWSwgLXJlbGF0ZWQpDQoNCiNoZWFkKHJlZHVjZWRfZGF0YV80LCAxMCkNCmBgYA0KDQoNCmBgYHtyfQ0KI3JlbW92ZSBmdXJ0aGVyIGNvbHVtbnMgd2hpY2ggYXJlbm90IHBlcmluZW50IHRvIGFuYWx5c2lzLg0KDQpyZWR1Y2VkX2RhdGFfNSA8LSByZWR1Y2VkX2RhdGFfNCAlPiUNCiAgc2VsZWN0KC1leHRlbmRlZCwgLWFwcHJveGRhdGUsIC1ud291bmR1cywgLW53b3VuZHRlKQ0KDQojaGVhZChyZWR1Y2VkX2RhdGFfNSwgMTApDQpgYGANCg0KDQpgYGB7cn0NCiNXZSBhcmUgbGVmdCB3aXRoIDIxIGNvbHVtbnMgb2YgZGF0YSByZWxldmFudCB0byB0aGlzIGFuYWx5c2lzLiBOZXh0LCByZW5hbWUgdGhlIGNvbHVtbnMgdG8gbWFrZSB0aGVtIG1vcmUgbG9naWNhbC4NCg0KbmV3X25hbWVzIDwtIGMoImV2ZW50aWQiLCAiaXllYXIiLCAiaW1vbnRoIiwgImlkYXkiLCAiY291bnRyeSIsICJyZWdpb24iLCAicHJvdnN0YXRlIiwgImNpdHkiLCAibGF0aXR1ZGUiLCAibG9uZ2l0dWRlIiwgInN1aWNpZGUiLCAiYXR0YWNrX3R5cGVfMSIsICJ0YXJnZXRfdHlwZV8xIiwgInRhcmdldF9zdWJfdHlwZV8xIiwgIm5hdGlvbmFsaXR5IiwgImdyb3VwX25hbWUiLCAiY2xhaW1lZCIsICJ3ZWFwb24iLCAid2VhcG9uX3N1Yl90eXBlIiwgIm5fa2lsbCIsICJuX3dvdW5kZWQiKQ0KDQpjb2xuYW1lcyhyZWR1Y2VkX2RhdGFfNSkgPC0gbmV3X25hbWVzDQoNCmhlYWQocmVkdWNlZF9kYXRhXzUsIDEwKQ0KYGBgDQpOZXh0LCBsZXQncyBsb29rIGF0IHRoZSBudW1iZXIgb2YgTkEgZW50aXJlcyBpbiB0aGUgZGF0YWZyYW1lLg0KDQpgYGB7cn0NCmxvZ2ljX25hIDwtIGFzLmxvZ2ljYWwocm93U3Vtcyhpcy5uYShyZWR1Y2VkX2RhdGFfNSkpKQ0KDQpuYV9yb3dzIDwtIHJlZHVjZWRfZGF0YV81W2xvZ2ljX25hLF0NCg0KZGZfbmEgPC0gbWFwX2RmKG5hX3Jvd3MsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoaXMubmEoeCkpKQ0KIGRmX25hX2hlYXQgPC0gZGZfbmEgJT4lDQogICAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBldmVyeXRoaW5nKCksDQogICAgICAgICAgIG5hbWVzX3RvID0gIngiKSAlPiUNCiAgICBncm91cF9ieSh4KSAlPiUNCiAgICBtdXRhdGUoeSA9IHJvd19udW1iZXIoKSkNCg0KcGxvdF9uYV9tYXRyaXggPC0gZnVuY3Rpb24oZGZfbmEpIHsNCiAgICAgIyBQcmVwYXJpbmcgdGhlIGRhdGFmcmFtZSBmb3IgaGVhdG1hcHMgDQogICAgZGZfaGVhdCA8LSBkZl9uYSAlPiUNCiAgICAgICAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBldmVyeXRoaW5nKCksDQogICAgICAgICAgIG5hbWVzX3RvID0gIngiKSAlPiUNCiAgICAgICAgZ3JvdXBfYnkoeCkgJT4lDQogICAgICAgIG11dGF0ZSh5ID0gcm93X251bWJlcigpKQ0KICAgICAjIEVuc3VyaW5nIHRoZSBvcmRlciBvZiBjb2x1bW5zIGlzIGtlcHQgYXMgaXQgaXMNCiAgICBkZl9oZWF0IDwtIGRmX2hlYXQgJT4lDQogICAgICAgIHVuZ3JvdXAoKSAlPiUNCiAgICAgICAgbXV0YXRlKHggPSBmYWN0b3IoeCxsZXZlbHMgPSBjb2xuYW1lcyhkZl9uYSkpKQ0KICAgICAjIFBsb3R0aW5nIGRhdGENCiAgICBnIDwtIGdncGxvdChkYXRhID0gZGZfaGVhdCwgYWVzKHg9eCwgeT15LCBmaWxsPXZhbHVlKSkgKyANCiAgICAgICAgZ2VvbV90aWxlKCkgKyANCiAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICAgICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICBheGlzLnRleHQueSA9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICBheGlzLnRpY2tzLnk9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKQ0KICAgICAjIFJldHVybmluZyB0aGUgcGxvdA0KICAgIGcNCiB9IA0KIA0KcGxvdF9uYV9tYXRyaXgoZGZfbmEpDQpgYGANCkZyb20gdGhpcyBwbG90LCB5b3UgY2FuIHNlZSB0aGF0IHRoZSBjbGVhbmVkIGRhdGFzZXQgc3RpbGwgY29udGFpbnMgc29tZSBOQSB2YWx1ZXMuIFRoaXMgaXMgYmVjYXVzZSBvbmx5IGNvbHVtbnMgd2l0aCBvdmVyIDkwJSBOQSB2YWx1ZXMgd2VyZSByZW1vdmVkLiBUaGVyZSBhcmUgdmVyeSBmZXcgTkEgdmFsdWVzIGluIHRoZSBjaXR5IGNvbHVtbiBhbmQgbG9uZyBhbmQgbGF0IGNvbHVtbnMuIFRoZSBjb2x1bW4gYHRhcmdldF9zdWJfdHlwZV8xYCBoYXMgcXVpdGUgYSBmZXcgTkEgdmFsdWVzLCBwcmVzdW1hYmx5IGJlY2F1c2UgdGhlcmUgd2FzIG9ubHkgb25lIHRhcmdldC4NClRoZSBjb2x1bW4gYHdlYXBvbl9zdWJfdHlwZWAgaGFzIGEgbnVtYmVyIG9mIE5BIHZhbHVlcyBwcmVzdW1hYmx5IHJlbGF0aW5nIHRvIGF0dGFja3MgdGhhdCBvbmx5IHVzZWQgb25lIHdlYXBvbiBpLmUuIHRoZXkgZGlkbid0IGhhdmUgYSBzdWItd2VhcG9uLg0KVGhlbiBmb3Igbl9raWxsIGFuZCBuX3dvdW5kZWQgdGhlcmUgYXJlIGEgbnVtYmVyIG9mIE5BIHZhbHVlcy4gSXQgd291bGQgYmUgZ29vZCB0byBrbm93IHdoZXRoZXIgdGhlc2UgTkEgdmFsdWVzIHNob3VsZCBiZSAwIHZhbHVlcyBvciB3aGV0aGVyIGl0IHNob3VsZCBiZSAndW5rbm93bicuIA0KDQpgYGB7cn0NCm5vX25hcyA8LSBhcy5kYXRhLmZyYW1lKGNvbFN1bXMoaXMubmEobmFfcm93cykpKQ0KY29sbmFtZXMobm9fbmFzKSA8LSAiTm8uIG9mIE5BIFZhbHVlcyINCiNub19uYXMNCg0KI2xlbmd0aChyZWR1Y2VkX2RhdGFfNSRldmVudGlkKQ0KYGBgDQo8Zm9udCBzaXplPSI1Ij4gRGF0YSBBbmFseXNpcyBRdWVzdGlvbnMgPC9mb250Pg0KDQpGcm9tIGxvb2tpbmcgYXQgdGhlIGRhdGEsIHRoZSBmb2xsb3dpbmcgYW5hbHlzaXMgd2lsbCBiZSBjYXJyaWVkIG91dDoNCg0KMS4gQW5hbHlzaXMgb2YgVHlwZSBvZiBBdHRhY2sgDQoNCjFhIC0gTnVtYmVyIG9mIGF0dGFja3MgcGVyIHllYXINCiAgDQoxYiAtIEFuYWx5c2UgdHJlbmRzIGluIHR5cGVzIG9mIGF0dGFja3MNCiAgDQoxYyAtIEFuYWx5c2UgdGhlIG51bWJlciBvZiBzdWljaWRlIGF0dGFja3MgcGVyIHllYXIuIA0KICAgIA0KMi4gQW5hbHlzaXMgb2YgQXR0YWNrIE9yZ2FuaXNhdGlvbg0KDQoyYSAtIE51bWJlciBvZiBhdHRhY2tzIHBlciBncm91cCwgcGVyIHllYXINCiAgDQoyYiAtIFBsb3QgbnVtYmVyIG9mIGF0dGFja3MgZm9yIGVhY2ggZ3JvdXBzIGJhc2VkIG9uIGdlb2dyYXBoeT8gQXJlIHNvbWUgZ3JvdXBzIHNwcmVhZGluZyBnZW9ncmFwaGljYWxseT8gQXJlIHNvbWUgZ3JvdXBzIGNvbmRlbnNpbmcgZ2VvZ3JhcGhpY2FsbHk/DQoNCjMuIEFuYWx5c2lzIG9mIFR5cGUgb2YgVGFyZ2V0DQoNCjQuIEFuYWx5c2lzIG9mIFdlYXBvbiBVc2FnZQ0KDQo1LiBBbmFseXNpcyBvZiBHZW9ncmFwaHkgb2YgYXR0YWNrcw0KDQo8Zm9udCBzaXplPSI1Ij4gUXVlc3Rpb24gMWE6IE51bWJlciBvZiBBdHRhY2tzIFZzIFllYXIgPC9mb250Pg0KDQpUcmFjayB0aGUgbnVtYmVyIG9mIGF0dGFja3Mgb3ZlciB0aGUgeWVhcnMgMjAwMCAtIDIwMTUuDQoNCmBgYHtyfQ0KYXR0YWNrX2RhdGFfMiA8LSByZWR1Y2VkX2RhdGFfNQ0KDQpxMWFfZGF0YSA8LSBhdHRhY2tfZGF0YV8yICU+JQ0KICBncm91cF9ieShpeWVhcikgJT4lDQogIHN1bW1hcmlzZShub19hdHRhY2tzID0gbigpKQ0KDQojcTFhX2RhdGENCg0KZ2dwbG90KGRhdGEgPSBxMWFfZGF0YSwNCiAgICAgICBhZXMoeCA9IGl5ZWFyLCB5ID0gbm9fYXR0YWNrcykpKw0KICAgICAgZ2VvbV9saW5lKGx3ZCA9IDEuNSwgY29sb3IgPSAiYmx1ZTQiKSArDQogICAgICBsYWJzKHRpdGxlID0gIk5vLiBvZiBBdHRhY2tzIHZzIFllYXIgaW4gSXJhcSIsIHggPSAiWWVhciIsIHkgPSAiTm8uIG9mIEF0dGFja3MiKSArDQogICAgICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiKSkNCg0KI0ZpbHRlciB0aGUgZGF0YSBzbyB0aGF0IGl0IGNvbnRhaW5zIG9ubHkgMjAxNSBhdHRhY2tzIGFuZCBjaGVjayB0aGF0IGFsbCBtb250aHMgYXJlIHByZXNlbnQgaW4gdGhlIGRhdGEuDQoNCnExYV9kYXRhX2NoZWNrbW9udGggPC0gYXR0YWNrX2RhdGFfMiAlPiUNCiAgZ3JvdXBfYnkoaXllYXIsIGltb250aCkgJT4lDQogIHN1bW1hcmlzZShub19hdHRhY2tzID0gbigpKSAlPiUNCiAgZmlsdGVyKGl5ZWFyID09IDIwMTUpDQoNCiNxMWFfZGF0YV9jaGVja21vbnRoDQogIA0KYGBgDQpBdHRhY2tzIGluIElyYXEgaW5jcmVhc2VkIGJldHdlZW4gMjAwMCBhbmQgMjAxNCB3aXRoIGEgdmVyeSBsYXJnZSBpbmNyZWFzZSBpbiBhdHRhY2tzIGJldHdlZW4gMjAxMiAtIDIwMTQuIEhvd2V2ZXIgdGhlIG51bWJlciBvZiBhdHRhY2tzIGluIDIwMTUgZHJvcHBlZCBmcm9tIHRoZSBsZXZlbCBpbiAyMDE0LiBUaGUgZGF0YSBoYXMgYmVlbiBjaGVja2VkIHRvIGVuc3VyZSB0aGF0IGl0IGNvdmVycyBhbGwgbW9udGhzIG9mIDIwMTUsIHdoaWNoIGl0IGRvZXMsIHNvIHRoaXMgZGVjcmVhc2UgcmVmbGVjdHMgYSBnZW51aW5lIHJlZHVjdGlvbiBpbiBhdHRhY2tzIGluIHRoZSB5ZWFyIDIwMTUsIGNvbXBhcmVkIHRvIDIwMTQuIA0KDQo8Zm9udCBzaXplPSI1Ij4gUXVlc3Rpb24gMWI6IEFuYWx5c2UgdHJlbmRzIGluIHR5cGVzIG9mIGF0dGFja3MgPC9mb250Pg0KDQoNCmBgYHtyfQ0KcTFiX2RhdGEgPC0gYXR0YWNrX2RhdGFfMiAlPiUNCiAgICBncm91cF9ieShpeWVhciwgYXR0YWNrX3R5cGVfMSkgJT4lDQogICAgc3VtbWFyaXNlKG5vX2F0dGFja3MgPSBuKCkpDQoNCiNxMWJfZGF0YQ0KDQpnZ3Bsb3QoZGF0YSA9IHExYl9kYXRhLA0KICAgICAgIGFlcyh4ID0gaXllYXIsIHkgPSBub19hdHRhY2tzLCBjb2xvciA9IGF0dGFja190eXBlXzEpKSArDQogICAgICBmYWNldF93cmFwKH5hdHRhY2tfdHlwZV8xKSArDQogICAgICBnZW9tX2xpbmUobHdkID0gMSwgY29sb3IgPSAiYmx1ZTQiKSArDQogICAgICBsYWJzKHRpdGxlID0gIk5vLiBvZiBBdHRhY2tzIHZzIFllYXIgaW4gSXJhcSwgcGVyIEF0dGFjayBUeXBlIiwgeCA9ICJZZWFyIiwgeSA9ICJOby4gb2YgQXR0YWNrcyIpICsNCiAgICAgIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIpKQ0KDQpgYGANCg0KRnJvbSB0aGVzZSBsaW5lIGdyYXBocywgeW91IGNhbiBzZWUgdGhhdCB0aGVyZSBoYXMgYmVlbiBhIHZhc3QgaW5jcmVhc2UgaW4gYm9tYmluZy9leHBsb3Npb24gYXR0YWNrcyBiZXR3ZWVuIDIwMDAgYW5kIDIwMTUuIEFkZGl0aW9uYWxseSwgdGhlcmUgaGFzIGJlZW4gYW4gaW5jcmVhc2UgKGFsYmVpdCBzbWFsbGVyKSBpbiBhcm1lZCBhc3NhdWx0LiBBc3Nhc3NpbmF0aW9uIGF0dGFja3MgaGF2ZSByZW1haW5lZCBjb25zdGFudC4gSXQgYXBwZWFycyB0aGVyZSBoYXMgYmVlbiBhIHNtYWxsIGluY3JlYXNlIGluIGhvc3RhZ2UgdGFraW5nIGluIDIwMTQgYW5kIDIwMTUuIA0KDQpgYGB7cn0NCiNUaGlzIG5leHQgc2VjdGlvbiB3YXMgbG9va2luZyBhdCB3aGV0aGVyIHRoZXJlIHdhcyBhbnkgc2Vhc29uYWwgdHJlbmQuIFRoZXJlIHdhcyBzdWZmaWNpZW50IGV2aWRlbmNlIGZvciB0aGlzLCBzbyBpdCBoYXMgYmVlbiBsZWZ0IG91dCBvZiB0aGUgYW5hbHlzaXMuIA0KDQpxMWNfZGF0YSA8LSBhdHRhY2tfZGF0YV8yICU+JQ0KICAgIGdyb3VwX2J5KGltb250aCkgJT4lDQogICAgc3VtbWFyaXNlKG5vX2F0dGFja3MgPSBuKCkpDQoNCiNxMWNfZGF0YQ0KDQojZ2dwbG90KGRhdGEgPSBxMWNfZGF0YSwNCiMgICAgICAgYWVzKHggPSBpbW9udGgsIHkgPSBub19hdHRhY2tzKSkgKw0KIyAgICAgIGdlb21fbGluZShsd2QgPSAxLjUsIGNvbG9yID0gImJsdWUiKSArDQojICAgICAgbGFicyh0aXRsZSA9ICJOby4gb2YgQXR0YWNrcyB2cyBNb250aCBpbiBJcmFxIiwgeCA9ICJNb250aCIsIHkgPSAiTm8uIG9mIEF0dGFja3MiKSArDQojICAgICAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIikpICsNCiMgICAgICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cz1tb250aC5hYmIpIA0KDQojVGhpcyBkYXRhIGlzIHRha2VuIGFjcm9zcyBhbGwgeWVhcnMuIE92ZXJhbGwsIFNlcHRlbWJlciBpcyB0aGUgbW9udGggd2l0aCB0aGUgbG93ZXN0IGF2ZXJhZ2UgbnVtYmVyIG9mIGF0dGFja3MsIHdoZXJlYXMgTm92ZW1iZXIgaGFzIHRoZSBoaWdoZXN0IGF2ZXJhZ2UgbnVtYmVyIG9mIGF0dGFja3MuIExldCdzIHJlcGVhdCB0aGlzIGdyYXBoIGFuZCBwbG90IHRoZSB5ZWFycyBvdXQgaW5kaXZpZHVhbGx5IGFuZCBzZWUgd2hldGhlciB0aGUgdHJlbmRzIGFyZSBzZWVuIGluIGVhY2ggeWVhci4NCmBgYA0KDQpgYGB7cn0NCnExY2lfZGF0YSA8LSBhdHRhY2tfZGF0YV8yICU+JQ0KICAgIG11dGF0ZShpeWVhciA9IGFzLmNoYXJhY3RlcihpeWVhcikpICU+JQ0KICAgIGdyb3VwX2J5KGl5ZWFyLCBpbW9udGgpICU+JQ0KICAgIHN1bW1hcmlzZShub19hdHRhY2tzID0gbigpKSANCg0KeWVhcl9jaGVjayA8LSBxMWNpX2RhdGEgJT4lDQogIGdyb3VwX2J5KGl5ZWFyKSAlPiUNCiAgc3VtbWFyaXNlKG5vX21vbnRoc19pbl95ZWFyX2FjdGl2ZSA9IG4oKSkNCg0KI3llYXJfY2hlY2sNCg0KcTFjaV9kYXRhIDwtIHExY2lfZGF0YSAlPiUNCiAgZmlsdGVyKGl5ZWFyID4gMjAwMykgDQoNCiNxMWNpX2RhdGENCg0KI2dncGxvdChkYXRhID0gcTFjaV9kYXRhLA0KIyAgICAgICBhZXMoeCA9IGltb250aCwgeSA9IG5vX2F0dGFja3MsIGNvbG9yID0gaXllYXIsIGx0eSA9IGl5ZWFyKSkgKw0KIyAgICAgIGdlb21fbGluZSgpICsNCiMgICAgICBsYWJzKHRpdGxlID0gIk5vLiBvZiBBdHRhY2tzIHZzIE1vbnRoIGluIElyYXEiLCB4ID0gIk1vbnRoIiwgeSA9ICJOby4gb2YgQXR0YWNrcyIpICsNCiMgICAgICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiKSkgKw0KIyAgICAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzPW1vbnRoLmFiYikgKw0KIyAgICAgIGdlb21fdGV4dChkYXRhID0gc3Vic2V0KHExY2lfZGF0YSwgaW1vbnRoID09IDEyKSwgYWVzKGxhYmVsID0gaXllYXIsIGNvbG91ciA9IGl5ZWFyLCB4ID0gMTIsIHkgPSBub19hdHRhY2tzKSwgaGp1c3QgPSAtLjEpICsNCiMgICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKQ0KDQojRnJvbSBwbG90dGluZyB0aGUgbW9udGhseSBudW1iZXIgb2YgYXR0YWNrcyBmb3IgZWFjaCB5ZWFyLCB5b3UgY2FuIHNlZSB0aGF0IHRoZSBtYWluIHRyZW5kcyBzZWVuIGluIHRoZSBwcmV2aW91cyBncmFwaCBhcmUgYWN0dWFsbHkgZG93biB0byB0aGUgeWVhcnMgMjAxMyBhbmQgMjAxNCB3aGljaCBoYXZlIGEgbGFyZ2UgbnVtYmVyIG9mIGF0dGFja3MgYW5kIHZhcmlhdGlvbi4gVGhlcmVmb3JlLCBvdmVyYWxsIGl0IGRvZXMgbm90IHNlZW0gbGlrZWx5IHRoYXQgdGhlcmUgaXMgYSBtb250aGx5IHBhdHRlcm4gb2YgYXR0YWNrcy4NCmBgYA0KDQo8Zm9udCBzaXplPSI1Ij4gUXVlc3Rpb24gMWM6IEFuYWx5c2UgdGhlIG51bWJlciBvZiBzdWljaWRlIGF0dGFja3MgPC9mb250Pg0KDQoNCmBgYHtyfQ0KcTFkX2RhdGEgPC0gYXR0YWNrX2RhdGFfMiAlPiUNCiAgICBncm91cF9ieShpeWVhciwgc3VpY2lkZSkgJT4lDQogICAgc3VtbWFyaXNlKG5vX2F0dGFja3MgPSBuKCkpDQoNCiNxMWRfZGF0YQ0KDQpnZ3Bsb3QoZGF0YSA9IHExZF9kYXRhLA0KICAgICAgIGFlcyh4ID0gaXllYXIsIHkgPSBub19hdHRhY2tzLCBjb2xvciA9IGFzLmNoYXJhY3RlcihzdWljaWRlKSwgbHR5ID0gYXMuY2hhcmFjdGVyKHN1aWNpZGUpKSkgKw0KICANCiAgICAgIGdlb21fbGluZShsd2QgPSAxKSArDQogICAgICBsYWJzKHRpdGxlID0gIkF0dGFja3MgYW5kIFN1aWNpZGUgQXR0YWNrcyBwZXIgWWVhciBpbiBJcmFxIiwgeCA9ICJZZWFyIiwgeSA9ICJOby4gb2YgQXR0YWNrcyIpICsNCiAgICAgIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIpKSArDQogICAgICAjdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKSArDQogICBzY2FsZV9jb2xvcl9kaXNjcmV0ZShuYW1lICA9IkF0dGFjayBUeXBlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzPWMoIjAiLCAiMSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiTm90IFN1aWNpZGUiLCAiU3VpY2lkZSIpKSArDQogICAgICAgc2NhbGVfbGluZXR5cGVfZGlzY3JldGUobmFtZSAgPSJBdHRhY2sgVHlwZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcz1jKCIwIiwgIjEiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoIk5vdCBTdWljaWRlIiwgIlN1aWNpZGUiKSkNCg0KI3ExZDJfZGF0YSA8LSBxMWRfZGF0YSAlPiUNCiMgIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBzdWljaWRlLCB2YWx1ZXNfZnJvbSA9IG5vX2F0dGFja3MpDQoNCiNxMWQyX2RhdGFbaXMubmEocTFkMl9kYXRhKV0gPSAwDQoNCg0KDQpgYGANClRoZSBncmFwaCBhYm92ZSBzaG93cyB0aGF0IHdoaWxlIHRoZXJlIGhhcyBiZWVuIGEgbGFyZ2UgaW5jcmVhc2UgaW4gdGhlIG51bWJlciBvZiBhdHRhY2tzIGZyb20gMjAwMCB0byAyMDE1LCB0aGUgbnVtYmVyIG9mIHN1aWNpZGUgYXR0YWNrcyBoYXMgbm90IGluY3JlYXNlZCB0byB0aGUgc2FtZSBleHRlbnQuIEluIGZhY3QsIGJldHdlZW4gMjAwOCBhbmQgMjAxMiwgc3VpY2lkZSBhdHRhY2tzIGRlY3JlYXNlZCB3aGlsc3QgdGhlIG92ZXJhbGwgbnVtYmVyIG9mIGF0dGFja3MgaW5jcmVhc2VkLiANCg0KPGZvbnQgc2l6ZT0iNSI+IFF1ZXN0aW9uIDJhOiBBbmFseXNpcyBvZiBBdHRhY2sgT3JnYW5pc2F0aW9uIDwvZm9udD4NCg0KYGBge3J9DQpxMmFpX2RhdGEgPC0gYXR0YWNrX2RhdGFfMiAlPiUNCiAgZ3JvdXBfYnkoaXllYXIsIGdyb3VwX25hbWUpICU+JQ0KICBzdW1tYXJpc2Uobm9fYXR0YWNrID0gbigpKSAlPiUNCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGl5ZWFyLCB2YWx1ZXNfZnJvbSA9IG5vX2F0dGFjaykgJT4lDQogICNyZXBsYWNlX25hKGxpc3QoYDIwMDBgID0gMCkpICU+JQ0KICByZXBsYWNlX25hKGxpc3QoYDIwMDBgID0gMCwgYDIwMDFgID0gMCwgYDIwMDJgID0gMCwgYDIwMDNgID0gMCwgYDIwMDRgID0gMCwgYDIwMDVgID0gMCwgYDIwMDZgID0gMCwgYDIwMDdgID0gMCwgYDIwMDhgID0gMCwgYDIwMDlgID0gMCwgYDIwMTBgID0gMCwgYDIwMTFgID0gMCwgYDIwMTJgID0gMCwgYDIwMTNgID0gMCwgYDIwMTRgID0gMCwgYDIwMTVgID0gMCkpICU+JQ0KICAgbXV0YXRlKHRvdGFsX2FsbF95cnMgPSByb3dTdW1zKHNlbGVjdCguLCAyOjE3KSkpICU+JQ0KICAgbXV0YXRlKHN1bV8yMDE1ID0gcm93U3VtcyhzZWxlY3QoLiwgMTcpKSkNCg0KcTJhaV9kYXRhDQoNCmBgYA0KVGhpcyB0YWJsZSBzaG93cyB0aGUgZGlmZmVyZW50IHRlcnJvcmlzdCBncm91cHMgaW4gSXJhcSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgbnVtYmVyIG9mIChrbm93bikgYXR0YWNrcyBjYXJyaWVkIG91dCBiZXR3ZWVuIDIwMDAgYW5kIDIwMTUuIFRoZXJlIGFyZSA2OSBkaWZmZXJlbnQgdGVycm9yaXN0IGdyb3VwcyBpbiBJcmFxLiBGb3IgdGhlIHB1cnBvc2Ugb2YgdGhpcyBhbmFseXNpcywgd2Ugd2lsbCBpbnRlcnJvZ2F0ZSB0aGUgZGF0YSBvZiBncm91cHMgd2hpY2ggbWVldCB0aGlzIGNyaXRlcmlhOg0KDQpbMV0gSGF2ZSBjYXJyaWVkIG91dCBtb3JlIHRoYW4gMjAgYXR0YWNrcyBpbiB0b3RhbCAoYWNyb3NzIGFsbCB5ZWFycykgDQoNClRoaXMgcmVtb3ZlcyBzbWFsbCBwZXJwZXRyYXRvciBncm91cHMgZnJvbSB0aGUgYW5hbHlzaXMuDQoNCmBgYHtyfQ0KcTJhaV9kYXRhIDwtIHEyYWlfZGF0YSAlPiUNCiAgZmlsdGVyKHRvdGFsX2FsbF95cnMgPiAyMCkNCg0KI3EyYWlfZGF0YVssMV0NCg0KYGBgDQpCeSBmaWx0ZXJpbmcgb3V0IGdyb3VwcyB3aGljaCBoYXZlIGNhcnJpZWQgb3V0IGxlc3MgdGhhbiAyMCBhdHRhY2tzIGluIHRvdGFsLCAxMCBncm91cHMgYXJlIGxlZnQuIFVuZm9ydHVuYXRlbHkgb25lIG9mIHRoZXNlIGdyb3VwcyBpcyAndW5rbm93bicuIEFzIGNhbiBiZSBzZWVuIGZyb20gdGhlIGRhdGEsIGZvciB0aGUgbGFyZ2UgbWFyam9yaXR5IG9mIGF0dGFja3MsIHRoZSBwZXJwZXRyYXRvcnMgYXJlIG5vdCBpZGVudGlmaWVkIGFuZCB0aGVzZSBhdHRhY2tzIGFyZSByZWNvcmRlZCBhcyAnVW5rbm93bicuDQpUaGVyZSBhcmUgYWxzbyAyIG90aGVyIGFtYmlndW91cyBncm91cCBuYW1lcyAtICJPdGhlciIgYW5kICJHdW5tZW4iLiBCb3RoIG9mIHRoZXNlIGdyb3VwcyBoYXZlIGJlZW4gYWxsb2NhdGVkIG1vcmUgdGhhbiAyMCBhdHRhY2tzLCBob3dldmVyIHRoZSBhdHRhY2tzIGRvIG5vdCBvY2N1ciBpbiB0aGUgbGFzdCAzIHllYXJzLiBHaXZlbiB0aGF0IHRoZXNlIGdyb3VwcyBhcmUgbm90IGxpa2VseSB0byBiZSBsZWdpdGltYXRlIHRlcnJvcmlzdCBncm91cCBuYW1lcywgdGhleSB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgZGF0YSBzZXQgZm9yIGFuYWx5c2lzLg0KDQpBZnRlciB0aGlzLCB0aGVyZSBhcmUgOCBncm91cHMgb2YgaW50ZXJlc3QgZm9yIGFuYWx5c2lzLiBUaGUgYWN0aXZpdGllcyBvZiB0aGVzZSBncm91cHMgd2lsbCBiZSBhbmFseXNlZCBpbiBtb3JlIGRldGFpbC4NCg0KYGBge3J9DQpxMmFpX2RhdGEgPC0gIHEyYWlfZGF0YSAlPiUNCiAgZmlsdGVyKGdyb3VwX25hbWUgIT0gIk90aGVyIiwgZ3JvdXBfbmFtZSAhPSAiR3VubWVuIikNCg0KI3EyYWlfZGF0YQ0KDQojVGhlIDggcmVtYWluaW5nIGdyb3VwcyBvZiBpbnRlcmVzdCB3aWxsIGJlIGFzc2lnbmVkIHRvIGEgdmVjdG9yIGBrZXlfZ3JvdXBzYA0KDQprZXlfZ3JvdXBzIDwtIHEyYWlfZGF0YSRncm91cF9uYW1lDQoja2V5X2dyb3Vwcw0KDQoNCiAgDQpgYGANCg0KDQpgYGB7cn0NCnEyYV9kYXRhIDwtIGF0dGFja19kYXRhXzIgJT4lDQogICAgZmlsdGVyKGdyb3VwX25hbWUgJWluJSBrZXlfZ3JvdXBzKSAlPiUNCiAgICBncm91cF9ieShpeWVhciwgZ3JvdXBfbmFtZSkgJT4lDQogICAgc3VtbWFyaXNlKG5vX2F0dGFja3MgPSBuKCkpIA0KDQojcTJhX2RhdGENCg0KZyA8LSBnZ3Bsb3QoZGF0YSA9IHEyYV9kYXRhLA0KICAgICAgIGFlcyh4ID0gaXllYXIsIHkgPSBub19hdHRhY2tzLCBjb2xvciA9IGdyb3VwX25hbWUpKSArDQogICAgICBnZW9tX2xpbmUobHdkID0gMS41KSArDQogICAgICBsYWJzKHRpdGxlID0gIk5vLiBvZiBBdHRhY2tzIHBlciBHcm91cCBwZXIgeWVhciIsIHggPSAiWWVhciIsIHkgPSAiTm8uIG9mIEF0dGFja3MiKSArDQogICAgICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiKSkgDQogICAgICAjZ2VvbV90ZXh0KGRhdGEgPSBzdWJzZXQocTJhX2RhdGFfaXJhcSwgaXllYXIgPT0gMjAxMyksIGFlcyhsYWJlbCA9IGdyb3VwX25hbWUsIGNvbG91ciA9IGdyb3VwX25hbWUsIHggPSAyMDEzLCB5ID0gbm9fYXR0YWNrcyksIGhqdXN0ID0gLS4xKSArDQogICAjdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikNCg0KZ3QgPC0gZ2dwbG90R3JvYihnKQ0KZ3QkbGF5b3V0JGNsaXBbZ3QkbGF5b3V0JG5hbWUgPT0gInBhbmVsIl0gPC0gIm9mZiINCmdyaWQuZHJhdyhndCkNCg0KcTJhX2RhdGFfMiA8LSBxMmFfZGF0YSAlPiUNCiAgICBncm91cF9ieShncm91cF9uYW1lKSAlPiUNCiAgICBzdW1tYXJpc2Uobm9fYXR0YWNrcyA9IHN1bShub19hdHRhY2tzKSkNCiAgICANCiNxMmFfZGF0YV8yDQoNCmdncGxvdChkYXRhID0gcTJhX2RhdGFfMiwNCiAgICAgICBhZXMoeCA9IGdyb3VwX25hbWUsIHkgPSBub19hdHRhY2tzLCBmaWxsID0gZ3JvdXBfbmFtZSkpICsNCiAgICAgIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknKSArDQogICAgICBsYWJzKHRpdGxlID0gIk5vLiBvZiBBdHRhY2tzIHBlciBHcm91cCIsIHggPSAiR3JvdXAgTmFtZSIsIHkgPSAiTm8uIG9mIEF0dGFja3MiKSArDQogICAgICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiKSkgKw0KICAgICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9NjAsIGhqdXN0PTEpKSsNCiAgICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBub19hdHRhY2tzLCB5ID0gbm9fYXR0YWNrcysxMDAwKSkgKw0KICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikNCg0KDQpgYGANClRoZSBiYXIgY2hhcnQgc2hvd3MgdGhlIHRlcnJvcmlzdCBncm91cHMgYW5kIHRoZSBudW1iZXIgb2YgYXR0YWNrcyBjb21taXR0ZWQgYnkgZWFjaCBpbiB0b3RhbCBmcm9tIDIwMDAtMjAxNS4gSXQgaXMgd29ydGggbm90aW5nIHRoYXQgdGhlIGBncm91cF9uYW1lYCBmb3IgdGhlIHZhc3QgbWFqb2lydHkgb2YgYXR0YWNrcyBpcyB1bmtub3duLiBUaGlzIGNvdWxkIGJlIGJlY2F1c2UgdGhlcmUgYXJlIHVua25vd24gZ3JvdXBzIGFjdGl2ZSB3aG8gZG8gbm90IGNsYWltIGF0dGFja3MsIG9yIHBlcmhhcHMgbW9yZSBsaWtlbHkgaXMgdGhhdCB0aGUgYXR0YWNrcyBhcmUgY2FycmllZCBvdXQgYnkga25vd24gZ3JvdXBzLCBidXQgdGhleSBhcmUgbm90IGNsYWltZWQvY2Fubm90IGJlIGlkZW50aWZpZWQuICAgDQoNCk9mIHRoZSBncm91cHMgdGhhdCBhcmUgaWRlbnRpZmllZCwgSVNJTCBoYXMgYnkgZmFyIGNhcnJpZWQgb3V0IHRoZSBtb3N0IGF0dGFja3MsIGZvbGxvd2VkIGJ5IEFsLVFhaWRhIGluIElyYXEsIHRoZW4gSVNJLiANCg0KSG93ZXZlciwgd2hlbiBsb29raW5nIGF0IHRoZSBsaW5lIGdyYXBoIG9mIG51bWJlciBvZiBhdHRhY2tzIHBlciB5ZWFyIGJ5IGRpZmZlcmVudCBncm91cHMsIGl0IHNob3dzIHRoYXQgdGhlIG9yZ2FuaXNhdGlvbnMgYXJlIG5vdCBjb25zaXN0ZW50IHRocm91Z2hvdXQgdGhlIHllYXJzLiBJU0kgaXMgYWN0aXZlIGJldHdlZW4gdGhlIHllYXJzIDIwMDcgYW5kIDIwMTAsIEFsLVFhaWRhIGluIElyYXEgaXMgbW9zdCBhY3RpdmUgYmV0d2VlbiAyMDExIGFuZCAyMDEzIGFuZCBhZnRlciB0aGF0LCBJU0lMIGlzIGJ5IGZhciB0aGUgZG9taW5hbnQgb3JnYW5pc2F0aW9uLg0KDQotIERvIG1lbWJlcnMgb2YgdGhlc2UgZ3JvdXBzIHN3aXRjaCBhbGVnaWFuY2UgZGVwZW5kaW5nIG9uIHdoaWNoIGdyb3VwIGlzIG1vc3QgJ3BvcHVsYXInIGF0IHRoZSB0aW1lPyBpLmUuIGFyZSB0aGUgYXR0YWNrcyBjYXJpZWQgb3V0IGJ5IGxhcmdlbHkgdGhlIHNhbWUgcG9wdWxhdGlvbiBvZiBwZW9wbGUgcmVnYXJkbGVzcyBvZiB0aGUgZ3JvdXAgbmFtZT8NCg0KLSBPciBhcmUgdGhlc2UgZ3JvdXBzIG1hZGUgdXAgb2YgY2F0ZWdvcmljYWxseSBkaWZmZXJlbnQgcGVvcGxlIHdpdGggZGlmZmVyZW50IGJlbGllZnMgYW5kIG1vdGl2YXRpb25zPw0KDQotIGkuZS4gaXMgQWwgUXVhaWRhIGxhcmdlbHkgZGVmZWF0ZWQgb3IgaGF2ZSB0aGUgcGVycGV0cmF0b3JzIHNpbXBseSBqdW1wZWQgc2hpcCB0byBJU0lMPw0KDQpGdXJ0aGVyIHdvcms6IExvb2sgYXQgaG93IG1hbnkgb2YgdGhlIGF0dGFja3MgYXJlICdjbGFpbWVkJyBhbmQgaXMgdGhhdCB0aGUgbWFpbiB3YXkgdGhhdCBncm91cHMgYXJlIGlkZW50aWZpZWQgb3IgaXMgdGhlIGdyb3VwX25hbWUgaWRlbnRpZmllZCBieSBvdGhlciBtZWFucz8NCg0KDQo8Zm9udCBzaXplPSI1Ij4gUXVlc3Rpb24gM2E6IEFuYWx5c2lzIG9mIFRhcmdldCBUeXBlIDwvZm9udD4NCg0KVGhlIGZvbGxvd2luZyBncmFwaHMgc2hvdyB0aGUgbnVtYmVyIG9mIGF0dGFja3Mgb24gZWFjaCB0eXBlIG9mIHRhcmdldC4gVGhlIGZpcnN0IHNldCBvZiBncmFwaHMgc2hvdyBhdHRhY2tzIGJ5IGFsbCB0ZXJyb3Jpc3QgZ3JvdXBzLiBUaGUgc2Vjb25kIHNob3dzIGp1c3QgdGhlIGF0dGFja3MgYnkgSVNJTCBhcyB0aGUgZGF0YSBzaG93cyB0aGF0IHRoaXMgaXMgdGhlIG1vc3QgYWN0aXZlLCBjdXJyZW50IGdyb3VwLg0KDQpgYGB7cn0NCnEzYV9kYXRhIDwtIGF0dGFja19kYXRhXzIgJT4lDQogIGdyb3VwX2J5KGl5ZWFyLCB0YXJnZXRfdHlwZV8xKSAlPiUNCiAgc3VtbWFyaXNlKG5vX2F0dGFja3MgPSBuKCkpDQoNCiNxM2FfZGF0YQ0KDQpnZ3Bsb3QoZGF0YSA9IHEzYV9kYXRhLA0KICAgICAgIGFlcyh4ID0gaXllYXIsIHkgPSBub19hdHRhY2tzKSkrDQogICAgICBmYWNldF93cmFwKH50YXJnZXRfdHlwZV8xKSsNCiAgICAgIGdlb21fbGluZShsd2QgPSAxLCBjb2xvciA9ICJibHVlNCIpICsNCiAgICAgIGxhYnModGl0bGUgPSAiTm8uIG9mIEF0dGFja3MgcGVyIEdyb3VwIHBlciB5ZWFyIGluIElyYXEsIHNwbGl0IGJ5IFRhcmdldCIsIHggPSAiWWVhciIsIHkgPSAiTm8uIG9mIEF0dGFja3MiKSArDQogICAgICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiKSkgDQoNCnEzYV9kYXRhIDwtIGF0dGFja19kYXRhXzIgJT4lDQogIGZpbHRlcihncm91cF9uYW1lID09ICJJc2xhbWljIFN0YXRlIG9mIElyYXEgYW5kIHRoZSBMZXZhbnQgKElTSUwpIikgJT4lDQogIGdyb3VwX2J5KGl5ZWFyLCB0YXJnZXRfdHlwZV8xKSAlPiUNCiAgc3VtbWFyaXNlKG5vX2F0dGFja3MgPSBuKCkpIA0KICANCmdncGxvdChkYXRhID0gcTNhX2RhdGEsDQogICAgICBhZXMoeCA9IGl5ZWFyLCB5ID0gbm9fYXR0YWNrcykpKw0KICAgICAgZmFjZXRfd3JhcCh+dGFyZ2V0X3R5cGVfMSkrDQogICAgICBnZW9tX2xpbmUobHdkID0gMSwgY29sb3IgPSAiYmx1ZTQiKSArDQogICAgICBsYWJzKHRpdGxlID0gIk5vLiBvZiBBdHRhY2tzIGJ5IElTSUwgcGVyIHllYXIgaW4gSXJhcSwgc3BsaXQgYnkgVGFyZ2V0IiwgeCA9ICJZZWFyIiwgeSA9ICJOby4gb2YgQXR0YWNrcyIpICsNCiAgICAgIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIpKSANCmBgYA0KVGhlIG51bWJlciBvZiBhdHRhY2tzIGdlbmVyYWxseSBoYXMgaW5jcmVhc2VkIGZyb20gMjAwMCB0byAyMDE1IGluIElyYXEuIFRoaXMgaXMgZHJpdmVuIGxhcmdlbHkgYnkgYXR0YWNrcyBvbiBwcml2YXRlIGNpdGl6ZW5zIGFuZCBwcm9wZXJ0eSBhbHRob3VnaCB0aGVyZSBoYXMgYWxzbyBiZWVuIGFuIGluY3JlYXNlIGluIGF0dGFja3Mgb24gdGhlIG1pbGlhcnkgYW5kIHBvbGljZS4gQXR0YWNrcyBvbiBidXNpbmVzc2VzIGhhcyBzZWVuIGFuIGluY3JlYXNlIHRvby4gVGhlIGRhdGEgc2hvd3MgdGhhdCBJU0lMIHRlbmRzIHRvIGF0dGFjayBQcml2YXRlIENpdGl6ZW5zICYgUHJvcGVydHksIE1pbGl0YXJ5IGFuZCBQb2xpY2UuIFRoZSBhdHRhY2tzIG9uIHRoZSBNaWxpdGFyeSBieSBJU0lMIGhhcyBpbmNyZWFzZWQgeWVhciBvbiB5ZWFyIHdoaWNoIHdvdWxkIHN1Z2dlc3QgdGhhdCB0aGlzIHdhcyBhIHBhcnRjdWxhciBmb2N1cyBvZiB0aGUgZ3JvdXAuIA0KDQoNCg0KYGBge3J9DQojVGhpcyBuZXh0IHNlY3Rpb24gb2YgY29kZSBsb29rZWQgYXQgdGhlIG5hdGlvbmFsaXR5IG9mIHZpY3RpbXMuIFRoZSB2YXN0IG1ham9yaXR5IG9mIHZpY3RpbWVzIHdlcmUgSXJhcWkgbmF0aW9uYWxzLiBObyBmdXJ0aGVyIGludmVzdGlnYXRpb24gd2lsbCBiZSBkb25lIG9uIHZpY3RpbSBuYXRpb25hbGl0eS4gDQoNCnEzYl9kYXRhIDwtIGF0dGFja19kYXRhXzIgJT4lDQogIGdyb3VwX2J5KG5hdGlvbmFsaXR5KSAlPiUNCiAgc3VtbWFyaXNlKG5vX2F0dGFja3MgPSBuKCkpICU+JQ0KICBmaWx0ZXIobm9fYXR0YWNrcyA+IDUpDQoNCiNxM2JfZGF0YQ0KDQojZ2dwbG90KGRhdGEgPSBxM2JfZGF0YSwNCiMgICAgICAgYWVzKHggPSBuYXRpb25hbGl0eSwgeSA9IG5vX2F0dGFja3MsIGZpbGwgPSBuYXRpb25hbGl0eSkpKw0KIyAgICAgIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknKSArDQojICAgICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9OTAsIGhqdXN0PTEpKSArDQojICAgICAgbGFicyh0aXRsZSA9ICJOYXRpb25hbGl0eSBvZiBBdHRhY2sgVmljdGltcyBpbiBJcmFxIC0gQWxsIFlycyAobm8uIGF0dGFja3MgPiA1KSIsIHggPSAiTmF0aW9uYWxpdHkiLCB5ID0gIk5vLiBvZiBBdHRhY2tzIikgKw0KIyAgICAgIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIpKSANCmBgYA0KDQo8Zm9udCBzaXplPSI1Ij4gUXVlc3Rpb24gNDogQW5hbHlzaXMgb24gV2VhcG9uIFVzZSA8L2ZvbnQ+DQoNCmBgYHtyfQ0KcTRhX2RhdGEgPC0gYXR0YWNrX2RhdGFfMiAlPiUNCiAgZ3JvdXBfYnkod2VhcG9uKSAlPiUNCiAgc3VtbWFyaXNlKG5vX2F0dGFja3MgPSBuKCksIG5vX2tpbGxlZF9yZWFsID0gc3VtKG5fa2lsbCkpICU+JQ0KICAjc3VtbWFyaXNlKG5vX2tpbGxlZCA9IG1lYW4oY2xhaW1lZCkpDQogIG11dGF0ZSh3ZWFwb24gPSBzdHJfcmVwbGFjZSh3ZWFwb24sICJFeHBsb3NpdmVzL0JvbWJzL0R5bmFtaXRlIiwgIkV4cGxvc2l2ZXMiKSkgJT4lDQogIG11dGF0ZSh3ZWFwb24gPSBzdHJfcmVwbGFjZSh3ZWFwb24sICJub3QgdG8gaW5jbHVkZSB2ZWhpY2xlLWJvcm5lIGV4cGxvc2l2ZXMsIGkuZS4sIGNhciBvciB0cnVjayBib21icyIsICJleGNsIGV4cGxvc2l2ZXMiKSkgDQoNCiNxNGFfZGF0YQ0KDQpwY3Q8LSByb3VuZCgxMDAqcTRhX2RhdGEkbm9fYXR0YWNrcy9zdW0ocTRhX2RhdGEkbm9fYXR0YWNrcyksIDEpDQoNCmdncGxvdChkYXRhID0gcTRhX2RhdGEsDQogICAgICAgYWVzKHggPSB3ZWFwb24sIHkgPSBub19hdHRhY2tzLCBmaWxsID0gd2VhcG9uKSkrDQogICAgICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKw0KICAgICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9NTAsIGhqdXN0PTEpKSArDQogICAgICBsYWJzKHRpdGxlID0gIk5vIG9mIEF0dGFja3MgYnkgV2VhcG9uIFR5cGUgLSBBbGwgWWVhcnMiLCB4ID0gIldlYXBvbiIsIHkgPSAiTm8uIEtpbGxlZCIpICsNCiAgICAgIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIpKSArDQogICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBub19hdHRhY2tzLCB5ID0gbm9fYXR0YWNrcys1MDApKQ0KDQoNCg0KDQoNCmBgYA0KVGhlIHZhc3QgbWFqb3JpdHkgb2YgYXR0YWNrcyBhcmUgY2FycmllZCBvdXQgdXNpbmcgZXhwbG9zaXZlcy4gVGhpcyBhY2NvdW50cyBmb3IgNzYlIG9mIGFsbCBhdHRhY2tzIChhY3Jvc3MgYWxsIHllYXJzKS4gQXR0YWNrcyB1c2luZyBmaXJlYXJtcyB0aGVuIGFjY291bnRzIGZvciAyMCUuIA0KDQpBcyB0aGVzZSBhcmUgYnkgZmFyIHRoZSBtZXRob2RzIHVzZWQgbW9zdCBmb3IgY2Fycnlpbmcgb3V0IGF0dGFja3MsIHRoZXNlIHR3byB3ZWFwb24gdHlwZXMgd2lsbCBiZSBleHBsb3JlZCBpbiBtb3JlIGRldGFpbC4gRmlyc3RseSBob3cgYXJlIHRoZSBudW1iZXJzIG9mIHRoZXNlIGF0dGFjayB0eXBlcyBjaGFuZ2luZyBvdmVyIHRoZSB5ZWFycz8NCg0KYGBge3J9DQpxNGJfZGF0YSA8LSBhdHRhY2tfZGF0YV8yICU+JQ0KICBncm91cF9ieShpeWVhciwgd2VhcG9uKSAlPiUNCiAgc3VtbWFyaXNlKG5vX2F0dGFja3MgPSBuKCkpICU+JQ0KICBmaWx0ZXIod2VhcG9uID09ICJFeHBsb3NpdmVzL0JvbWJzL0R5bmFtaXRlIiB8IHdlYXBvbiA9PSAiRmlyZWFybXMiKSAlPiUNCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IHdlYXBvbiwgdmFsdWVzX2Zyb20gPSBub19hdHRhY2tzKSAlPiUNCiAgcmVwbGFjZV9uYShsaXN0KEZpcmVhcm1zID0gMCkpICU+JQ0KICBtdXRhdGUodG90YWwgPSBgRXhwbG9zaXZlcy9Cb21icy9EeW5hbWl0ZWAgKyBgRmlyZWFybXNgKSAlPiUNCiAgbXV0YXRlKGV4cGxfcGN0ID0gcm91bmQoYEV4cGxvc2l2ZXMvQm9tYnMvRHluYW1pdGVgL3RvdGFsKjEwMCwgMCkpICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IGMoYEV4cGxvc2l2ZXMvQm9tYnMvRHluYW1pdGVgLCBgRmlyZWFybXNgKSwgIG5hbWVzX3RvID0gIndlYXBvbiIsIHZhbHVlc190byA9ICJub19hdHRhY2tzIikgDQogIA0KI3E0Yl9kYXRhDQoNCiNnZ3Bsb3QoZGF0YSA9IHE0Yl9kYXRhLA0KIyAgICAgIGFlcyh4ID0gaXllYXIsIHkgPSBub19hdHRhY2tzLCBmaWxsID0gd2VhcG9uKSkrDQojICAgICAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScpKw0KIyAgICAgIGxhYnModGl0bGUgPSAiTm8uIG9mIEV4cGxvc2l2ZXMgYW5kIEZpcmVhcm1zIEF0dGFja3MgcGVyIFllYXIgKCUgPSBFeHBsb3NpdmUgQXR0YWNrcykiLCB4ID0gIlllYXIiLCB5ID0gIk5vLiBvZiBBdHRhY2tzIikgKw0KIyAgICAgIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIpKSArDQojICAgICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBhc3RlKGV4cGxfcGN0LCIlIiksIHkgPSB0b3RhbCswLjUpKQ0KDQoNCg0KYGBgDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGEgPSBxNGJfZGF0YSwgYWVzKHg9aXllYXIpKSArDQogIA0KICBnZW9tX2xpbmUoIGFlcyh5PW5vX2F0dGFja3MsIGNvbG9yID0gd2VhcG9uKSwgc2l6ZT0yKSArIA0KICMgZ2VvbV9saW5lKCBhZXMoeT1leHBsX3BjdCo0MCksIGx0eSA9IDIsIHNpemU9MC41KSArDQogIA0KICAjc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiTm8uIG9mIGF0dGFja3MiLCBzZWMuYXhpcyA9IHNlY19heGlzKH4gLiAvNDAsIG5hbWU9IiUgb2YgQXR0YWNrcyB0aGF0IHVzZSBFeHBsb3NpdmVzIikNCiAgIykgKyANCiAgDQogICNnZ3RpdGxlKCJOby4gb2YgRXhwbG9zaXZlIGFuZCBGaXJlYXJtcyBhdHRhY2tzIHBlciBZZWFyIC0gSXJhcSIpKw0KICBsYWJzKHRpdGxlID0gIk5vLiBvZiBFeHBsb3NpdmUgYW5kIEZpcmVhcm1zIGF0dGFja3MgcGVyIFllYXIgLSBJcmFxIiwgeCA9ICJZZWFyIiwgeSA9ICJOby4gb2YgQXR0YWNrcyIpICsNCiAgICAgIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIpKSANCmBgYA0KDQpBcyBFeHBsb3NpdmVzL0JvbWJzL0R5bmFtaXRlIGFjY291bnQgZm9yIHN1Y2ggYSBsYXJnZSBwcm9wb3J0aW9uIG9mIGFsbCBhdHRhY2tzLCBpdCB3aWxsIGJlIHVzZWZ1bCB0byB1bmRlcnN0YW5kIG1vcmUgYWJvdXQgdGhlIHN1Yi10eXBlIG9mIHdlYXBvbiBhbmQgaWYgdGhlcmUgYXJlIGFueSB0cmVuZHMgaW4gd2hhdCBhdHRhY2tlcnMgYXJlIHVzaW5nLg0KDQoNCmBgYHtyfQ0KcTRjX2RhdGEgPC0gYXR0YWNrX2RhdGFfMiAlPiUNCiAgZmlsdGVyKHdlYXBvbiA9PSAiRXhwbG9zaXZlcy9Cb21icy9EeW5hbWl0ZSIpICU+JQ0KICBncm91cF9ieShpeWVhciwgd2VhcG9uX3N1Yl90eXBlKSAlPiUNCiAgc3VtbWFyaXNlKG5vX2F0dGFja3MgPSBuKCkpICU+JQ0KICBmaWx0ZXIod2VhcG9uX3N1Yl90eXBlICE9ICJVbmtub3duIEV4cGxvc2l2ZSBUeXBlIikgJT4lDQogIGZpbHRlcih3ZWFwb25fc3ViX3R5cGUgIT0gIk90aGVyIEV4cGxvc2l2ZSBEZXZpY2UiKQ0KDQojcTRjX2RhdGENCg0KZ2dwbG90KGRhdGEgPSBxNGNfZGF0YSwNCiAgICAgICBhZXMoeCA9IGl5ZWFyLCB5ID0gbm9fYXR0YWNrcywgbHR5ID0gd2VhcG9uX3N1Yl90eXBlLCBjb2xvciA9IHdlYXBvbl9zdWJfdHlwZSksIHNpemUgPSAyKSsNCiAgICAgIGdlb21fbGluZShsd2QgPSAxLjI1KSsNCiAgICAgIyBzY2FsZV9jb2xvdXJfYnJld2VyKCJXZWFwb24gU3ViLVR5cGUiLCBwYWxldHRlPSJTZXQxIikgKw0KICAgICAgbGFicyh0aXRsZSA9ICJUeXBlcyBvZiBFeHBsb3NpdmVzIEF0dGFja3MgLSAyMDAwIHRvIDIwMTUiLCB4ID0gIlllYXIiLCB5ID0gIk5vLiBvZiBBdHRhY2tzIikgKw0KICAgICAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIikpIA0KICANCmBgYA0KVGhlcmUgaGFzIGJlZW4gYSBsYXJnZSBpbmNyZWFzZSBpbiBleHBsb3NpdmVzIC0gJ3ZlaGljbGUnIGkuZSBjYXIgYm9tYnMuIEluIGZhY3QsIGluIHJlY2VudCB5ZWFycywgdGhpcyBhY2NvdW50cyBmb3IgdGhlIG1ham9yaXR5IG9mIGV4cGxvc2l2ZXMgYXR0YWNrcy4gQWRkaXRpb25hbGx5LCBwcm9qZWN0aWxlcyBoYXZlIGJlZW4gdXNlZCBtb3JlIGluIHJlY2VudCB5ZWFycy4gU3RpY2t5IGJvbWJzIHdlcmUgdXNlZCBtb3JlIGFyb3VuZCAyMDEwLTIwMTEgYnV0IGluY2lkZW50cyB1c2luZyBzdGlja3kgYm9tYnMgaGF2ZSBkZWNsaW5lZCBpbiByZWNlbnQgeWVhcnMuIA0KT3ZlcmFsbCwgdGhlIHR3byBtYWluIGV4cGxvc2l2ZXMgdXNlZCBhcmUgdmVoaWNsZSBib21icyBhbmQgcHJvamVjdGlsZXMuDQoNCjxmb250IHNpemU9IjUiPiBRdWVzdGlvbiA1OiBBbmFseXNpcyBvbiBHZW9ncmFwaHkgb2YgQXR0YWNrcyA8L2ZvbnQ+DQoNCmBgYHtyfQ0KcTVhX2RhdGEgPC0gYXR0YWNrX2RhdGFfMiAlPiUNCiAgc2VsZWN0KGl5ZWFyLCBsYXRpdHVkZSwgbG9uZ2l0dWRlLCBncm91cF9uYW1lKSAlPiUNCiAgZmlsdGVyKGdyb3VwX25hbWUgJWluJSBrZXlfZ3JvdXBzKSAlPiUNCiAgZmlsdGVyKGxvbmdpdHVkZSA8IDUwICYgbGF0aXR1ZGUgPCAzOSkgJT4lICNyZW1vdmluZyAzbm8gcm9ndWUgbG9jYXRpb25zIG91dHNpZGUgb2YgSXJhcQ0KICBtdXRhdGUoaXllYXIgPSBhcy5pbnRlZ2VyKGl5ZWFyKSkgJT4lDQogIG11dGF0ZShncm91cF9uYW1lID0gc3RyX3JlcGxhY2UoZ3JvdXBfbmFtZSwgIklzbGFtaWMgU3RhdGUgb2YgSXJhcSBcXChJU0lcXCkiLCAiSVNJIikpICU+JQ0KICBtdXRhdGUoZ3JvdXBfbmFtZSA9IHN0cl9yZXBsYWNlKGdyb3VwX25hbWUsICJJc2xhbWljIFN0YXRlIG9mIElyYXEgYW5kIHRoZSBMZXZhbnQgXFwoSVNJTFxcKSIsICJJU0lMIikpDQoNCnE1YV9kYXRhDQoNCmZpbGVOYW1lIDwtICdnb29nbGVfYXBpLnR4dCcNCmNvZGUgPC0gcmVhZENoYXIoZmlsZU5hbWUsIGZpbGUuaW5mbyhmaWxlTmFtZSkkc2l6ZSkNCg0KI3JlZ2lzdGVyX2dvb2dsZShrZXkgPSAiWFhYIikNCnJlZ2lzdGVyX2dvb2dsZShrZXkgPSBjb2RlKQ0KDQojZ2V0X21hcCgiSXJhcSIsIHpvb20gPSA2KSAlPiUgZ2dtYXAoKQ0KDQojaXJhcSA8LSBjKGxlZnQgPSAzOC41LCBib3R0b20gPSAyOSwgcmlnaHQgPSA0OC41LCB0b3AgPSAzNy41KQ0KI2dldF9zdGFtZW5tYXAoaXJhcSwgem9vbSA9IDYpICU+JSBnZ21hcCgpIA0KDQpxbXBsb3QobG9uZ2l0dWRlLCBsYXRpdHVkZSwgZGF0YSA9IHE1YV9kYXRhLCBtYXB0eXBlID0gInRvbmVyLWxpdGUiLCBkYXJrZW4gPSAwLCBjb2xvciA9IGdyb3VwX25hbWUpICsgc2NhbGVfY29sb3VyX2JyZXdlcigiR3JvdXAgTmFtZSIsIHBhbGV0dGU9IlNldDEiKSsNCiAgbGFicyh0aXRsZSA9ICJBdHRhY2sgTG9jYXRpb25zIGZyb20gMjAwMCB0byAyMDE1IikNCg0KI3FtcGxvdChsb25naXR1ZGUsIGxhdGl0dWRlLCBkYXRhID0gcTVhX2RhdGEsIG1hcHR5cGUgPSAidG9uZXItbGl0ZSIsIGRhcmtlbiA9IDAsIGNvbG9yID0gZ3JvdXBfbmFtZSkgKyBzY2FsZV9jb2xvdXJfYnJld2VyKCJHcm91cCBOYW1lIiwgcGFsZXR0ZT0iU2V0MSIpKw0KIyAgZmFjZXRfd3JhcCh+Z3JvdXBfbmFtZSkNCg0KYGBgDQpUaGlzIHBsb3Qgc2hvd3MgdGhlIGxvY2F0aW9ucyBvZiBhbGwgYXR0YWNrcyBjYXJyaWVkIG91dCBteSB0aGUgOCBrZXkgZ3JvdXBzLCBhY3Jvc3MgYWxsIHllYXJzLiANCg0KYGBge3J9DQpxbXBsb3QobG9uZ2l0dWRlLCBsYXRpdHVkZSwgZGF0YSA9IHE1YV9kYXRhLCBtYXB0eXBlID0gInRvbmVyLWxpdGUiLCBkYXJrZW4gPSAwLCBjb2xvciA9IC1peWVhcikgKyANCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAiQyIpKw0KICBmYWNldF93cmFwKH5ncm91cF9uYW1lKSArDQogICNzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYnJld2VyLnBhbChuPTE2LCBuYW1lID0gIlJkQnUiKSkrDQogIGxhYnModGl0bGUgPSAiQXR0YWNrIExvY2F0aW9ucyBieSBHcm91cCwgMjAwMCB0byAyMDE1IikgKw0KICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpIA0KDQojZ2dzYXZlKCJtYXBpcmFxLnBuZyIpDQpgYGANClRoaXMgcGxvdCBzaG93cyB0aGUgYXR0YWNrcyBwZXIgZ3JvdXAsIGNvbG91ciBjb2RlZCBmb3IgeWVhci4gWWVsbG93IG1hcmtlcnMgc2hvdyBhdHRhY2tzIHRoYXQgb2NjdXJyZWQgaW4gdGhlIGVhcmx5IDIwMDBzLiBEYXJrIGJsdWUgYXR0YWNrcyBhcmUgcmVjZW50LiANCg0KRnJvbSB0aGlzIHlvdSBjYW4gc2VlIHRoYXQgdGhlIGdyb3VwIFRhd2hpZCBhbmQgSmloYWQgaXMgbm8gbG9uZ2VyIGFjdGl2ZSBpbiBjYXJyeWluZyBvdXQgYXR0YWNrcy4gSVNJIGF0dGFja3Mgd2VyZSBjYXJyaWVkIG91dCBwcmVkb21pbmF0bHkgYmV0d2VlbiB0aGUgeWVhcnMgMjAwNSBhbmQgMjAxMCB3aGlsc3QgSVNJTCBhdHRhY2tzIGFyZSBzaG93biB0byBiZSBmcm9tIDIwMTAgb253YXJkcy4gVGhpcyBtYWtlcyBzZW5zZSBiZWNhdXNlIElTSSBsYXJnZWx5IGJlY2FtZSBJU0lMLiANCg0KVGhlIEFsLU5hcXNoYWJhbmRpeWEgQXJteSBhcHBlYXJzIHRvIGJlIGEgZ3JvdXAgY2Fycnlpbmcgb3V0IGF0dGFja3MgaW4gQ2VudHJhbCBJcmFxLCBzaW5jZSAyMDEwLiBUaGlzIGlzIHRoZXJlZm9yZSBhIHJlbGF0aXZsZXkgbmV3IGdyb3VwLiBBbC1RYWlkYSBpbiBJcmFxIGFyZSBhIGxvbmcgc3RhbmRpbmcgZ3JvdXAgd2hpY2ggaGFzIGNhcnJpZWQgb3V0IGF0dGFja3MgaW4gSXJhcSBmcm9tIHRoZSB5ZWFyIDIwMDAgYW5kIHN0aWxsIGNhcnJ5IG91dCBhdHRhY2tzIGluIDIwMTUuIEFuc2FyIGFsLUlzbGFtIGlzIGFub3RoZXIgbG9uZyBzdGFuZGluZyBncm91cCBjYXJyeWluZyBvdXQgYXR0YWNrcyBhY3Jvc3MgYWxsIHllYXJzLCBob3dldmVyIGl0IGhhcyBjYXJyaWVkIG91dCBmYXIgZmV3IGF0dGFja3MgdGhhbiBBbC1RYWlkYSBpbiBJcmFxLiBUaGUgZ3JvdXAgTXVzbGltIEZ1bmRhbWVudGFsaXN0cyBoYXZlIGNhcnJpZWQgb3V0IGF0dGFja3MgaW4gcmVjZW50IHllYXJzIG1vc3RseSBpbiBjZW50cmFsIElyYXEuIA0KDQpVbmZvcnR1bmF0ZWx5LCB0aGUgZ3JlYXQgbWFqb3JpdHkgb2YgdGhlIGF0dGFja3MgZG8gbm90IGhhdmUgYSBpZGVudGlmaWVkIGdyb3VwLg0KDQoNCg0KDQoNCg0KDQoNCg==