Introduction

An advocacy group hired us to investigate how different social media platforms influence users’ emotions while on the app. Incorporating other factors, such as time spent on the app, interaction with other users, and post engagements, will be a focus in determining overall usage. Other possible factors to consider include gender and age. The overall goal is to understand how different social media platforms and usage patterns influence users’ dominant emotional state throughout the day and to predict how users’ emotional well-being is influenced by their social media use.

library(dplyr)
library(rpart)
library(rpart.plot)
library(caret)
library(fastDummies)
library(ggplot2)
data<-read.csv("/Users/vanessaveretelnikov/Desktop/DiDa_325/train.csv")
val_data<-read.csv("/Users/vanessaveretelnikov/Desktop/DiDa_325/val.csv")
test_data<-read.csv("/Users/vanessaveretelnikov/Desktop/DiDa_325/test.csv")

Origin of the dataset

Emirhan Bulut created the data set through meticulous research and preparation. He has over 10+ years in the industry and is the founder of Quantum PIYA. This data was gathered through a “hypothetical survey”. Our approach to analyzing the data will be to determine the factors that are found to be significant in impacting emotional state, how emotional states vary across different media, and how they are used.

link to download data: https://www.kaggle.com/datasets/emirhanai/social-media-usage-and-emotional-well-being

Dataset

Age (text, chr): Age of the user [Needs to be changed to numerical]

Gender (categorical, chr): Gender of the user

Platform (categorical, chr): Social media platform used

Daily_Usage_Time..minutes. (numerical, int): Daily time spent on the platform in minutes

Posts_Per_Day (numerical, int): Number of posts made per day by user

Likes_Received_Per_Day (numerical, int): Number of likes received per day by user

Comments_Received_Per_Day (numerical, int): Number of comments received per day by user

Messages_Sent_Per_Day (numerical, int): Number of messages sent per day by user

Dominant_Emotion (categorical, chr): User’s dominant emotional state during the day

Cleaning the Data

We dropped 77 rows that had some of the columns flipped or missing data. We also dropped the UserID column, which gave each data point a unique number.

data_2<-data %>% 
  filter(Age<=90) %>% 
  na.omit(data_2) %>% 
  select(-User_ID)

data_2  %>% head()

Questions To Investigate

  1. Based on your social media usage, what is the dominant emotional state during the day?

     _Method: Decision tree model, predictor based on usage_
  2. Based on the decision tree model, what factor influences that emotional state the most?

     _Method: Bar Graph, take the points from the decision tree model and quantify the data set visually_ 
  3. What is the dominant emotional state during the day for each social media app?

     _Method: Bar Graph, quantify the emotional state for each social media app (doge)_
  4. Is there a difference in which dominant emotional state a user feels based on their interaction with other users and the engagement they receive?

     _Method: Bar Graph, manipulate the data to see the dominant emotions for high vs low engagement (rescuing and interacting)_

Analysis

Question 1: Based on your social media usage, what is the dominant emotional state during the day?

We can examine the results of the decision tree that we made to better understand how a user’s emotions are dictated by the specifics of their social media usage. All measures mentioned are based on usage per day.

data_3<-data_2 %>% 
  select(-Age,-Gender)
data_3_numeric<-data_3 %>% 
  mutate(Dominant_Emotion_Anger=as.numeric(Dominant_Emotion=="Anger"),Dominant_Emotion_Happiness=as.numeric(Dominant_Emotion=="Happiness"),Dominant_Emotion_Neutral=as.numeric(Dominant_Emotion=="Neutral"),Dominant_Emotion_Sadness=as.numeric(Dominant_Emotion=="Sadness"),Dominant_Emotion_Boredom=as.numeric(Dominant_Emotion=="Boredom"),Dominant_Emotion_Anxiety=as.numeric(Dominant_Emotion=="Anxiety")) %>% 
  select(-Dominant_Emotion) %>% 
  mutate(Platform_Facebook=as.numeric(Platform=="Facebook"),Platform_Instagram=as.numeric(Platform=="Instagram"),Platform_LinkedIn=as.numeric(Platform=="LinkedIn"),Platform_Snapchat=as.numeric(Platform=="Snapchat"),Platform_Telegram=as.numeric(Platform=="Telegram"),Platform_Twitter=as.numeric(Platform=="Twitter"),Platform_Whatsapp=as.numeric(Platform=="Whatsapp")) %>% 
  select(-Platform)
happiness_model_data <-data_3_numeric %>% 
  select(-Dominant_Emotion_Anxiety,-Dominant_Emotion_Boredom,-Dominant_Emotion_Neutral,-Dominant_Emotion_Sadness,-Dominant_Emotion_Anger)

set.seed(314159)

h_data_split <- createDataPartition(happiness_model_data$Dominant_Emotion_Happiness, p = 0.75, list = FALSE)

h_train_data <- happiness_model_data[h_data_split, ]

h_test_data <- happiness_model_data[-h_data_split, ]


h_tree_model <- rpart(Dominant_Emotion_Happiness ~ .,
                    data = h_train_data,
                    method = "class")

rpart.plot(
  h_tree_model,
  type = 2, 
  extra = 106, 
  box.palette = "RdBu",
  shadow.col = "gray",
  nn = TRUE
)

Happiness: The best chance of a user feeling happy (14%) as a result of their time spent online is to spend more than 135 minutes on social media and receive at least 71 likes. A user is likely (67%) to experience an emotion other than happiness if they use social media for less than 135 minutes and receive fewer than 20 comments.

neutral_model_data <-data_3_numeric %>% 
  select(-Dominant_Emotion_Anxiety,-Dominant_Emotion_Boredom,-Dominant_Emotion_Happiness,-Dominant_Emotion_Sadness,-Dominant_Emotion_Anger)

set.seed(314159)

n_data_split <- createDataPartition(neutral_model_data$Dominant_Emotion_Neutral, p = 0.75, list = FALSE)

n_train_data <- neutral_model_data[n_data_split, ]

n_test_data <- neutral_model_data[-n_data_split, ]


n_tree_model <- rpart(Dominant_Emotion_Neutral ~ .,
                    data = n_train_data,
                    method = "class")

rpart.plot(
  n_tree_model,
  type = 2, 
  extra = 106, 
  box.palette = "RdBu",
  shadow.col = "gray",
  nn = TRUE
)

Neutral: Receiving 18 comments is a dividing factor in whether a user feels neutral as a result of their usage. Getting less than 18 comments while spending less than 43 minutes on social media provides the best chance at a user feeling neutral (7%). Having at least 18 comments received and sending fewer than 31 messages gives the best chance (30%) of a user feeling an emotion other than neutral.

anxiety_model_data <-data_3_numeric %>% 
  select(-Dominant_Emotion_Happiness,-Dominant_Emotion_Boredom,-Dominant_Emotion_Neutral,-Dominant_Emotion_Sadness,-Dominant_Emotion_Anger)

set.seed(314159)

x_data_split <- createDataPartition(anxiety_model_data$Dominant_Emotion_Anxiety, p = 0.75, list = FALSE)

x_train_data <- anxiety_model_data[x_data_split, ]

x_test_data <- anxiety_model_data[-x_data_split, ]


x_tree_model <- rpart(Dominant_Emotion_Anxiety ~ .,
                    data = x_train_data,
                    method = "class")

rpart.plot(
  x_tree_model,
  type = 2, 
  extra = 106, 
  box.palette = "RdBu",
  shadow.col = "gray",
  nn = TRUE
)

Anxiety: As for anxiety, Facebook may play a significant role. Users not on Facebook who receive less than 20 likes are reportedly not anxious as a result of their usage (28%). The best chance of a user feeling anxious (5%) is produced when they are on Facebook, receive at least 11 comments, and create fewer than 3 posts.

boredom_model_data <-data_3_numeric %>% 
  select(-Dominant_Emotion_Anxiety,-Dominant_Emotion_Neutral,-Dominant_Emotion_Happiness,-Dominant_Emotion_Sadness,-Dominant_Emotion_Anger)

set.seed(314159)

b_data_split <- createDataPartition(boredom_model_data$Dominant_Emotion_Boredom, p = 0.75, list = FALSE)

b_train_data <- boredom_model_data[b_data_split, ]

b_test_data <- boredom_model_data[-b_data_split, ]


b_tree_model <- rpart(Dominant_Emotion_Boredom ~ .,
                    data = b_train_data,
                    method = "class")

rpart.plot(
  b_tree_model,
  type = 2, 
  extra = 106, 
  box.palette = "RdBu",
  shadow.col = "gray",
  nn = TRUE
)

Boredom: Users who receive at least 23 likes and send at least 19 messages are most likely (57%) to not experience boredom. On the other hand, those who get less than 18 likes and spend more than 58 minutes on a platform other than Facebook have the highest chance (7%) of being bored.

sadness_model_data <-data_3_numeric %>% 
  select(-Dominant_Emotion_Anxiety,-Dominant_Emotion_Boredom,-Dominant_Emotion_Happiness,-Dominant_Emotion_Neutral,-Dominant_Emotion_Anger)

set.seed(314159)

s_data_split <- createDataPartition(sadness_model_data$Dominant_Emotion_Sadness, p = 0.75, list = FALSE)

s_train_data <- sadness_model_data[s_data_split, ]

s_test_data <- sadness_model_data[-s_data_split, ]


s_tree_model <- rpart(Dominant_Emotion_Sadness ~ .,
                    data = s_train_data,
                    method = "class")

rpart.plot(
  s_tree_model,
  type = 2, 
  extra = 106, 
  box.palette = "RdBu",
  shadow.col = "gray",
  nn = TRUE
)

Sadness: As for sadness, there was not any significant chain that lends itself to a user being sad (<5%), however, those who receive at least 19 likes, are not on Snapchat, and receive fewer than 10 comments have the best chance (24%) of experiencing an emotion other than sadness.

anger_model_data <-data_3_numeric %>% 
  select(-Dominant_Emotion_Happiness,-Dominant_Emotion_Boredom,-Dominant_Emotion_Neutral,-Dominant_Emotion_Sadness,-Dominant_Emotion_Anxiety)

set.seed(314159)

g_data_split <- createDataPartition(anger_model_data$Dominant_Emotion_Anger, p = 0.75, list = FALSE)

g_train_data <- anger_model_data[g_data_split, ]

g_test_data <- anger_model_data[-g_data_split, ]


g_tree_model <- rpart(Dominant_Emotion_Anger ~ .,
                    data = g_train_data,
                    method = "class")

rpart.plot(
  g_tree_model,
  type = 2, 
  extra = 106, 
  box.palette = "RdBu",
  shadow.col = "gray",
  nn = TRUE
)

Anger: Unlike the other emotions, the factors that lead to a user not being angry due to their media usage are most dependent on the platforms being used. From this model, users who are not on Twitter, WhatsApp, or Telegram are likely (65%) not to be angry. Those who do report anger have the best chance (7%) of following a specific path. This path is as follows: being on Twitter, receiving at least 17 comments, and sending between 19 and 24 messages.

Question 2: Based on the decision tree model, what factor influences that emotional state the most?

To figure out which part of social media use had the biggest impact on a user’s dominant emotion, we looked at the variable importance scores from a larger decision tree and graphed them. These scores tell us which predictors the model relied on the most when deciding how to classify people’s emotions.


model_data <-data_2 %>% 
  select(Daily_Usage_Time..minutes., Platform, Dominant_Emotion, Posts_Per_Day, Messages_Sent_Per_Day, Comments_Received_Per_Day, Likes_Received_Per_Day )

set.seed(314159)

data_split <- createDataPartition(model_data$Dominant_Emotion, p = 0.75, list = FALSE)

train_data <- model_data[data_split, ]

test_data <- model_data[-data_split, ]


tree_model <- rpart(Dominant_Emotion ~ ., 
                    data = train_data,
                    method = "class")

rpart.plot(
  tree_model,
  type = 2,
  extra = 106,
  box.palette = "RdBu",
  shadow.col = "gray",
  nn = TRUE
)

#Factor Importance

imp <- tree_model$variable.importance
imp_df <- data.frame(
predictor = names(imp),
importance = as.numeric(imp)
) %>%
arrange(desc(importance))
Importance_Palette<-c("#29374d", "#314a70", "#305ea6", "#4fb3ff", "#7cc5fc", "#6ff7f7")

imp_df
ggplot(imp_df, aes(x = reorder(predictor, importance), y = importance)) +
geom_bar(stat = "identity", fill=Importance_Palette) +
  scale_x_discrete(labels=c("Platform"="Platform","Posts_Per_Day"="Posts per Day","Comments_Received_Per_Day"="Comments Received per Day","Messages_Sent_Per_Day"="Messages Sent per Day","Daily_Usage_Time..minutes."="Daily Usage","Likes_Received_Per_Day"="Likes Received"))+
labs(title = "Top Predictors of Dominant Emotion",x = "Predictor",y = "Importance Score") +
scale_fill_manual(values=Importance_Palette) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1),legend.position="none")

From the bar graph, “Likes Received per Day” stands out as the strongest predictor. This means that how many likes a user gets plays a bigger role in shaping their emotional state than anything else measured. In other words, the amount of positive feedback people receive seems to matter more than simply how long they use the app or which platform they’re on. Likes can act as a form of social validation, so higher or lower engagement could influence how someone ends up feeling.

Right behind likes were “Daily Usage Time”, “Messages Sent per Day”, and “Comments Received per Day.” These are all interaction related measures, suggesting that emotions are more influenced by how long users spend on a platform, how much users engage with others, and how much people engage back with them. On the other hand, “Platform” and “Posts per Day” were the least important predictors. That means the specific app someone uses or how often they post didn’t matter nearly as much as the amount of feedback and interaction they received.

Overall, the model shows a clear pattern; Emotions are shaped more by engagement than by simple activity. It isn’t the app you use, rather it’s the feedback and attention you get while using it. This aligns with the idea that social interaction and perceived social approval play a major role in how we feel after being online.

Question 3: What is the dominant emotional state during the day for each social media app?

graph3 <- data_2 %>% 
  select(Platform, Dominant_Emotion)

ggplot(graph3,aes(x=Platform, fill=Dominant_Emotion)) +
  geom_bar(position = "dodge") +
  labs(x="Platform",y="Count of Felt Dominant Emotion", title="Dominant Emotion Felt on each Social Media Platform") +
  scale_fill_manual(name="Dominant Emotion",values=c("red","purple","grey","yellow","lightblue","darkblue"))

The dominant emotional state across the platforms greatly differed. From this data set, users on Instagram predominantly reported feeling happy, far more than any other emotion, and boredom was not reported. Users on LinkedIn were predominantly bored, and no one was happy. Users on Twitter felt predominantly angry; however, sadness was also up there. Facebook, Snapchat, Telegram, and WhatsApp had more variability in which emotions were predominantly felt. However, no happiness or anger was present in this Facebook data set, and neutrality + anxiety was the most common. No anger was found in Snapchat, but sadness was the dominant emotion. Sadness was also the top emotion on Telegram, and no happiness counts were present. As for WhatsApp, anger was the dominant emotion, with no counts of sadness or boredom.

This demonstrates how the media is consumed and how the structure of each unique platform influences which dominant emotion is felt. This data can be used to spread awareness of which platforms to limit use on because they may be generating negative emotions, and which can potentially be used to promote positive emotions.

Question 4: Is there a difference in which dominant emotional state a user feels based on their interaction with other users and the engagement they receive?

graph4 <- data_2 %>% 
  select(Posts_Per_Day, Likes_Received_Per_Day, Comments_Received_Per_Day, Messages_Sent_Per_Day,  Dominant_Emotion) 
graph4 <- graph4 %>% 
 mutate(interaction = Posts_Per_Day + Messages_Sent_Per_Day)
  
graph4 <- graph4 %>% 
  mutate(engagement = Likes_Received_Per_Day + Comments_Received_Per_Day)
graph4 <- graph4 %>% 
  select(interaction, engagement, Dominant_Emotion)

ggplot(graph4,aes(x=engagement,y=interaction, fill=Dominant_Emotion))+
  geom_point(shape=21,size=3,color="black",stroke=.5)+
  xlim(0,160)+
  ylim(0,60)+
  labs(x="Engagement (Likes + Comments Received / Day) ",y="Interaction (Posts + Messsages Sent / Day)", title="Dominant Emotion Felt Based on Usage")  +
  scale_fill_manual(name="Dominant Emotion",values=c("red","purple","grey","yellow","lightblue","darkblue"))

The graph shows a positive correlation between emotion, engagement, and interaction. The more you receive engagement from other users via likes and comments, and the more you interact by posting and messaging other users, you generally feel happier. There are two high data points that some may feel anxious about at the maximum end of engagement and interaction. On the other hand, if a user has low interaction and engagement, they are more likely to feel bored. If you are bored, spending time on social media might be a good way to make you feel better, as it provides a way to interact with others and alleviate boredom.

Anger, anxiety, sadness, and neutral had a larger spread; however, most do not overlap with the happiness data points. This may indicate that the users and media people they interact with may contribute to the emotions they feel, and that this is not a one-to-one reflection of the quantity of their interaction and engagement.

Conclusions

Based on our analysis, we found that users are more likely to feel happiness when they spend more than 135 minutes on social media and receive 71 likes. This trend of higher engagement and interaction leading to happiness is visualized in the scatter plot. Also, it demonstrates that a user was likely to experience an emotion other than happiness if they had less engagement and interaction on the platform. By increasing engagement and interaction, it was also found that a user is less likely to become bored. Likes received per day, daily usage time, messages sent per day, and comments received per day were found to be the top predictors of which emotion was dominantly felt. However, other emotions beyond happiness and boredom were found to be less influenced by social media usage and more by the platform used. For example, Twitter users were predominantly angry or sad, while Facebook users were neutral or anxious.

Overall, our data analysis provided a comprehensive understanding of how usage and the type of platform impact the user’s dominant emotional state throughout the day. However, 77 data points were removed because of formatting issues. Their inclusion may have increased variability in the emotional states felt across platforms and enabled more accurate predictive models. Additionally, for future analysis, it may be worthwhile to investigate the media and interactions on each platform rather than inferring them based on the emotion. This would help determine the direction of causality between media and emotion.

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyBJbnRyb2R1Y3Rpb24KCkFuIGFkdm9jYWN5IGdyb3VwIGhpcmVkIHVzIHRvIGludmVzdGlnYXRlIGhvdyBkaWZmZXJlbnQgc29jaWFsIG1lZGlhIHBsYXRmb3JtcyBpbmZsdWVuY2UgdXNlcnMnIGVtb3Rpb25zIHdoaWxlIG9uIHRoZSBhcHAuIEluY29ycG9yYXRpbmcgb3RoZXIgZmFjdG9ycywgc3VjaCBhcyB0aW1lIHNwZW50IG9uIHRoZSBhcHAsIGludGVyYWN0aW9uIHdpdGggb3RoZXIgdXNlcnMsIGFuZCBwb3N0IGVuZ2FnZW1lbnRzLCB3aWxsIGJlIGEgZm9jdXMgaW4gZGV0ZXJtaW5pbmcgb3ZlcmFsbCB1c2FnZS4gT3RoZXIgcG9zc2libGUgZmFjdG9ycyB0byBjb25zaWRlciBpbmNsdWRlIGdlbmRlciBhbmQgYWdlLiBUaGUgb3ZlcmFsbCBnb2FsIGlzIHRvIHVuZGVyc3RhbmQgaG93IGRpZmZlcmVudCBzb2NpYWwgbWVkaWEgcGxhdGZvcm1zIGFuZCB1c2FnZSBwYXR0ZXJucyBpbmZsdWVuY2UgdXNlcnMnIGRvbWluYW50IGVtb3Rpb25hbCBzdGF0ZSB0aHJvdWdob3V0IHRoZSBkYXkgYW5kIHRvIHByZWRpY3QgaG93IHVzZXJzJyBlbW90aW9uYWwgd2VsbC1iZWluZyBpcyBpbmZsdWVuY2VkIGJ5IHRoZWlyIHNvY2lhbCBtZWRpYSB1c2UuCgpgYGB7cn0KbGlicmFyeShkcGx5cikKbGlicmFyeShycGFydCkKbGlicmFyeShycGFydC5wbG90KQpsaWJyYXJ5KGNhcmV0KQpsaWJyYXJ5KGZhc3REdW1taWVzKQpsaWJyYXJ5KGdncGxvdDIpCmRhdGE8LXJlYWQuY3N2KCIvVXNlcnMvdmFuZXNzYXZlcmV0ZWxuaWtvdi9EZXNrdG9wL0RpRGFfMzI1L3RyYWluLmNzdiIpCnZhbF9kYXRhPC1yZWFkLmNzdigiL1VzZXJzL3ZhbmVzc2F2ZXJldGVsbmlrb3YvRGVza3RvcC9EaURhXzMyNS92YWwuY3N2IikKdGVzdF9kYXRhPC1yZWFkLmNzdigiL1VzZXJzL3ZhbmVzc2F2ZXJldGVsbmlrb3YvRGVza3RvcC9EaURhXzMyNS90ZXN0LmNzdiIpCmBgYAoKIyMjIE9yaWdpbiBvZiB0aGUgZGF0YXNldAoKRW1pcmhhbiBCdWx1dCBjcmVhdGVkIHRoZSBkYXRhIHNldCB0aHJvdWdoIG1ldGljdWxvdXMgcmVzZWFyY2ggYW5kIHByZXBhcmF0aW9uLiBIZSBoYXMgb3ZlciAxMCsgeWVhcnMgaW4gdGhlIGluZHVzdHJ5IGFuZCBpcyB0aGUgZm91bmRlciBvZiBRdWFudHVtIFBJWUEuIFRoaXMgZGF0YSB3YXMgZ2F0aGVyZWQgdGhyb3VnaCBhICJoeXBvdGhldGljYWwgc3VydmV5Ii4gT3VyIGFwcHJvYWNoIHRvIGFuYWx5emluZyB0aGUgZGF0YSB3aWxsIGJlIHRvIGRldGVybWluZSB0aGUgZmFjdG9ycyB0aGF0IGFyZSBmb3VuZCB0byBiZSBzaWduaWZpY2FudCBpbiBpbXBhY3RpbmcgZW1vdGlvbmFsIHN0YXRlLCBob3cgZW1vdGlvbmFsIHN0YXRlcyB2YXJ5IGFjcm9zcyBkaWZmZXJlbnQgbWVkaWEsIGFuZCBob3cgdGhleSBhcmUgdXNlZC4KCmxpbmsgdG8gZG93bmxvYWQgZGF0YTogaHR0cHM6Ly93d3cua2FnZ2xlLmNvbS9kYXRhc2V0cy9lbWlyaGFuYWkvc29jaWFsLW1lZGlhLXVzYWdlLWFuZC1lbW90aW9uYWwtd2VsbC1iZWluZwoKCiMjIyBEYXRhc2V0CgpfX0FnZV9fIF8odGV4dCwgY2hyKV86IEFnZSBvZiB0aGUgdXNlciBbTmVlZHMgdG8gYmUgY2hhbmdlZCB0byBudW1lcmljYWxdCgpfX0dlbmRlcl9fIF8oY2F0ZWdvcmljYWwsIGNocilfOiBHZW5kZXIgb2YgdGhlIHVzZXIKCl9fUGxhdGZvcm1fXyBfKGNhdGVnb3JpY2FsLCBjaHIpXzogU29jaWFsIG1lZGlhIHBsYXRmb3JtIHVzZWQKCl9fRGFpbHlfVXNhZ2VfVGltZS4ubWludXRlcy5fXyBfKG51bWVyaWNhbCwgaW50KV86IERhaWx5IHRpbWUgc3BlbnQgb24gdGhlIHBsYXRmb3JtIGluIG1pbnV0ZXMKCl9fUG9zdHNfUGVyX0RheV9fIF8obnVtZXJpY2FsLCBpbnQpXzogTnVtYmVyIG9mIHBvc3RzIG1hZGUgcGVyIGRheSBieSB1c2VyCgpfX0xpa2VzX1JlY2VpdmVkX1Blcl9EYXlfXyBfKG51bWVyaWNhbCwgaW50KV86IE51bWJlciBvZiBsaWtlcyByZWNlaXZlZCBwZXIgZGF5IGJ5IHVzZXIKCl9fQ29tbWVudHNfUmVjZWl2ZWRfUGVyX0RheV9fIF8obnVtZXJpY2FsLCBpbnQpXzogTnVtYmVyIG9mIGNvbW1lbnRzIHJlY2VpdmVkIHBlciBkYXkgYnkgdXNlcgoKX19NZXNzYWdlc19TZW50X1Blcl9EYXlfXyBfKG51bWVyaWNhbCwgaW50KV86IE51bWJlciBvZiBtZXNzYWdlcyBzZW50IHBlciBkYXkgYnkgdXNlcgoKX19Eb21pbmFudF9FbW90aW9uX18gXyhjYXRlZ29yaWNhbCwgY2hyKV86IFVzZXIncyBkb21pbmFudCBlbW90aW9uYWwgc3RhdGUgZHVyaW5nIHRoZSBkYXkKCiAgCiMjIyBDbGVhbmluZyB0aGUgRGF0YQoKV2UgZHJvcHBlZCA3NyByb3dzIHRoYXQgaGFkIHNvbWUgb2YgdGhlIGNvbHVtbnMgZmxpcHBlZCBvciBtaXNzaW5nIGRhdGEuIFdlIGFsc28gZHJvcHBlZCB0aGUgVXNlcklEIGNvbHVtbiwgd2hpY2ggZ2F2ZSBlYWNoIGRhdGEgcG9pbnQgYSB1bmlxdWUgbnVtYmVyLgoKYGBge3J9CmRhdGFfMjwtZGF0YSAlPiUgCiAgZmlsdGVyKEFnZTw9OTApICU+JSAKICBuYS5vbWl0KGRhdGFfMikgJT4lIAogIHNlbGVjdCgtVXNlcl9JRCkKCmRhdGFfMiAgJT4lIGhlYWQoKQpgYGAKCiMgUXVlc3Rpb25zIFRvIEludmVzdGlnYXRlCgoxLiBCYXNlZCBvbiB5b3VyIHNvY2lhbCBtZWRpYSB1c2FnZSwgd2hhdCBpcyB0aGUgZG9taW5hbnQgZW1vdGlvbmFsIHN0YXRlIGR1cmluZyB0aGUgZGF5PyAKCiAgICAgICAgX01ldGhvZDogRGVjaXNpb24gdHJlZSBtb2RlbCwgcHJlZGljdG9yIGJhc2VkIG9uIHVzYWdlXwoKMi4gQmFzZWQgb24gdGhlIGRlY2lzaW9uIHRyZWUgbW9kZWwsIHdoYXQgZmFjdG9yIGluZmx1ZW5jZXMgdGhhdCBlbW90aW9uYWwgc3RhdGUgdGhlIG1vc3Q/CgogICAgICAgIF9NZXRob2Q6IEJhciBHcmFwaCwgdGFrZSB0aGUgcG9pbnRzIGZyb20gdGhlIGRlY2lzaW9uIHRyZWUgbW9kZWwgYW5kIHF1YW50aWZ5IHRoZSBkYXRhIHNldCB2aXN1YWxseV8gCgozLiBXaGF0IGlzIHRoZSBkb21pbmFudCBlbW90aW9uYWwgc3RhdGUgZHVyaW5nIHRoZSBkYXkgZm9yIGVhY2ggc29jaWFsIG1lZGlhIGFwcD8KCiAgICAgICAgX01ldGhvZDogQmFyIEdyYXBoLCBxdWFudGlmeSB0aGUgZW1vdGlvbmFsIHN0YXRlIGZvciBlYWNoIHNvY2lhbCBtZWRpYSBhcHAgKGRvZ2UpXwoKNC4gSXMgdGhlcmUgYSBkaWZmZXJlbmNlIGluIHdoaWNoIGRvbWluYW50IGVtb3Rpb25hbCBzdGF0ZSBhIHVzZXIgZmVlbHMgYmFzZWQgb24gdGhlaXIgaW50ZXJhY3Rpb24gd2l0aCBvdGhlciB1c2VycyBhbmQgdGhlIGVuZ2FnZW1lbnQgdGhleSByZWNlaXZlPwoKICAgICAgICBfTWV0aG9kOiBCYXIgR3JhcGgsIG1hbmlwdWxhdGUgdGhlIGRhdGEgdG8gc2VlIHRoZSBkb21pbmFudCBlbW90aW9ucyBmb3IgaGlnaCB2cyBsb3cgZW5nYWdlbWVudCAocmVzY3VpbmcgYW5kIGludGVyYWN0aW5nKV8KCiAKIAogCiAKIyMgQW5hbHlzaXMKCiMjIyBRdWVzdGlvbiAxOiBCYXNlZCBvbiB5b3VyIHNvY2lhbCBtZWRpYSB1c2FnZSwgd2hhdCBpcyB0aGUgZG9taW5hbnQgZW1vdGlvbmFsIHN0YXRlIGR1cmluZyB0aGUgZGF5PyAKCldlIGNhbiBleGFtaW5lIHRoZSByZXN1bHRzIG9mIHRoZSBkZWNpc2lvbiB0cmVlIHRoYXQgd2UgbWFkZSB0byBiZXR0ZXIgdW5kZXJzdGFuZCBob3cgYSB1c2VyJ3MgZW1vdGlvbnMgYXJlIGRpY3RhdGVkIGJ5IHRoZSBzcGVjaWZpY3Mgb2YgdGhlaXIgc29jaWFsIG1lZGlhIHVzYWdlLiBBbGwgbWVhc3VyZXMgbWVudGlvbmVkIGFyZSBiYXNlZCBvbiB1c2FnZSBwZXIgZGF5LgoKCmBgYHtyfQpkYXRhXzM8LWRhdGFfMiAlPiUgCiAgc2VsZWN0KC1BZ2UsLUdlbmRlcikKYGBgCgpgYGB7cn0KZGF0YV8zX251bWVyaWM8LWRhdGFfMyAlPiUgCiAgbXV0YXRlKERvbWluYW50X0Vtb3Rpb25fQW5nZXI9YXMubnVtZXJpYyhEb21pbmFudF9FbW90aW9uPT0iQW5nZXIiKSxEb21pbmFudF9FbW90aW9uX0hhcHBpbmVzcz1hcy5udW1lcmljKERvbWluYW50X0Vtb3Rpb249PSJIYXBwaW5lc3MiKSxEb21pbmFudF9FbW90aW9uX05ldXRyYWw9YXMubnVtZXJpYyhEb21pbmFudF9FbW90aW9uPT0iTmV1dHJhbCIpLERvbWluYW50X0Vtb3Rpb25fU2FkbmVzcz1hcy5udW1lcmljKERvbWluYW50X0Vtb3Rpb249PSJTYWRuZXNzIiksRG9taW5hbnRfRW1vdGlvbl9Cb3JlZG9tPWFzLm51bWVyaWMoRG9taW5hbnRfRW1vdGlvbj09IkJvcmVkb20iKSxEb21pbmFudF9FbW90aW9uX0FueGlldHk9YXMubnVtZXJpYyhEb21pbmFudF9FbW90aW9uPT0iQW54aWV0eSIpKSAlPiUgCiAgc2VsZWN0KC1Eb21pbmFudF9FbW90aW9uKSAlPiUgCiAgbXV0YXRlKFBsYXRmb3JtX0ZhY2Vib29rPWFzLm51bWVyaWMoUGxhdGZvcm09PSJGYWNlYm9vayIpLFBsYXRmb3JtX0luc3RhZ3JhbT1hcy5udW1lcmljKFBsYXRmb3JtPT0iSW5zdGFncmFtIiksUGxhdGZvcm1fTGlua2VkSW49YXMubnVtZXJpYyhQbGF0Zm9ybT09IkxpbmtlZEluIiksUGxhdGZvcm1fU25hcGNoYXQ9YXMubnVtZXJpYyhQbGF0Zm9ybT09IlNuYXBjaGF0IiksUGxhdGZvcm1fVGVsZWdyYW09YXMubnVtZXJpYyhQbGF0Zm9ybT09IlRlbGVncmFtIiksUGxhdGZvcm1fVHdpdHRlcj1hcy5udW1lcmljKFBsYXRmb3JtPT0iVHdpdHRlciIpLFBsYXRmb3JtX1doYXRzYXBwPWFzLm51bWVyaWMoUGxhdGZvcm09PSJXaGF0c2FwcCIpKSAlPiUgCiAgc2VsZWN0KC1QbGF0Zm9ybSkKYGBgCgpgYGB7cn0KaGFwcGluZXNzX21vZGVsX2RhdGEgPC1kYXRhXzNfbnVtZXJpYyAlPiUgCiAgc2VsZWN0KC1Eb21pbmFudF9FbW90aW9uX0FueGlldHksLURvbWluYW50X0Vtb3Rpb25fQm9yZWRvbSwtRG9taW5hbnRfRW1vdGlvbl9OZXV0cmFsLC1Eb21pbmFudF9FbW90aW9uX1NhZG5lc3MsLURvbWluYW50X0Vtb3Rpb25fQW5nZXIpCgpzZXQuc2VlZCgzMTQxNTkpCgpoX2RhdGFfc3BsaXQgPC0gY3JlYXRlRGF0YVBhcnRpdGlvbihoYXBwaW5lc3NfbW9kZWxfZGF0YSREb21pbmFudF9FbW90aW9uX0hhcHBpbmVzcywgcCA9IDAuNzUsIGxpc3QgPSBGQUxTRSkKCmhfdHJhaW5fZGF0YSA8LSBoYXBwaW5lc3NfbW9kZWxfZGF0YVtoX2RhdGFfc3BsaXQsIF0KCmhfdGVzdF9kYXRhIDwtIGhhcHBpbmVzc19tb2RlbF9kYXRhWy1oX2RhdGFfc3BsaXQsIF0KCgpoX3RyZWVfbW9kZWwgPC0gcnBhcnQoRG9taW5hbnRfRW1vdGlvbl9IYXBwaW5lc3MgfiAuLAogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBoX3RyYWluX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gImNsYXNzIikKCnJwYXJ0LnBsb3QoCiAgaF90cmVlX21vZGVsLAogIHR5cGUgPSAyLCAKICBleHRyYSA9IDEwNiwgCiAgYm94LnBhbGV0dGUgPSAiUmRCdSIsCiAgc2hhZG93LmNvbCA9ICJncmF5IiwKICBubiA9IFRSVUUKKQpgYGAKCl9IYXBwaW5lc3M6XyBUaGUgYmVzdCBjaGFuY2Ugb2YgYSB1c2VyIGZlZWxpbmcgaGFwcHkgKDE0JSkgYXMgYSByZXN1bHQgb2YgdGhlaXIgdGltZSBzcGVudCBvbmxpbmUgaXMgdG8gc3BlbmQgbW9yZSB0aGFuIDEzNSBtaW51dGVzIG9uIHNvY2lhbCBtZWRpYSBhbmQgcmVjZWl2ZSBhdCBsZWFzdCA3MSBsaWtlcy4gQSB1c2VyIGlzIGxpa2VseSAoNjclKSB0byBleHBlcmllbmNlIGFuIGVtb3Rpb24gb3RoZXIgdGhhbiBoYXBwaW5lc3MgaWYgdGhleSB1c2Ugc29jaWFsIG1lZGlhIGZvciBsZXNzIHRoYW4gMTM1IG1pbnV0ZXMgYW5kIHJlY2VpdmUgZmV3ZXIgdGhhbiAyMCBjb21tZW50cy4KCgoKCgpgYGB7cn0KbmV1dHJhbF9tb2RlbF9kYXRhIDwtZGF0YV8zX251bWVyaWMgJT4lIAogIHNlbGVjdCgtRG9taW5hbnRfRW1vdGlvbl9BbnhpZXR5LC1Eb21pbmFudF9FbW90aW9uX0JvcmVkb20sLURvbWluYW50X0Vtb3Rpb25fSGFwcGluZXNzLC1Eb21pbmFudF9FbW90aW9uX1NhZG5lc3MsLURvbWluYW50X0Vtb3Rpb25fQW5nZXIpCgpzZXQuc2VlZCgzMTQxNTkpCgpuX2RhdGFfc3BsaXQgPC0gY3JlYXRlRGF0YVBhcnRpdGlvbihuZXV0cmFsX21vZGVsX2RhdGEkRG9taW5hbnRfRW1vdGlvbl9OZXV0cmFsLCBwID0gMC43NSwgbGlzdCA9IEZBTFNFKQoKbl90cmFpbl9kYXRhIDwtIG5ldXRyYWxfbW9kZWxfZGF0YVtuX2RhdGFfc3BsaXQsIF0KCm5fdGVzdF9kYXRhIDwtIG5ldXRyYWxfbW9kZWxfZGF0YVstbl9kYXRhX3NwbGl0LCBdCgoKbl90cmVlX21vZGVsIDwtIHJwYXJ0KERvbWluYW50X0Vtb3Rpb25fTmV1dHJhbCB+IC4sCiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG5fdHJhaW5fZGF0YSwKICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSAiY2xhc3MiKQoKcnBhcnQucGxvdCgKICBuX3RyZWVfbW9kZWwsCiAgdHlwZSA9IDIsIAogIGV4dHJhID0gMTA2LCAKICBib3gucGFsZXR0ZSA9ICJSZEJ1IiwKICBzaGFkb3cuY29sID0gImdyYXkiLAogIG5uID0gVFJVRQopCmBgYAoKX05ldXRyYWw6XyBSZWNlaXZpbmcgMTggY29tbWVudHMgaXMgYSBkaXZpZGluZyBmYWN0b3IgaW4gd2hldGhlciBhIHVzZXIgZmVlbHMgbmV1dHJhbCBhcyBhIHJlc3VsdCBvZiB0aGVpciB1c2FnZS4gR2V0dGluZyBsZXNzIHRoYW4gMTggY29tbWVudHMgd2hpbGUgc3BlbmRpbmcgbGVzcyB0aGFuIDQzIG1pbnV0ZXMgb24gc29jaWFsIG1lZGlhIHByb3ZpZGVzIHRoZSBiZXN0IGNoYW5jZSBhdCBhIHVzZXIgZmVlbGluZyBuZXV0cmFsICg3JSkuIEhhdmluZyBhdCBsZWFzdCAxOCBjb21tZW50cyByZWNlaXZlZCBhbmQgc2VuZGluZyBmZXdlciB0aGFuIDMxIG1lc3NhZ2VzIGdpdmVzIHRoZSBiZXN0IGNoYW5jZSAoMzAlKSBvZiBhIHVzZXIgZmVlbGluZyBhbiBlbW90aW9uIG90aGVyIHRoYW4gbmV1dHJhbC4KCgoKYGBge3J9CmFueGlldHlfbW9kZWxfZGF0YSA8LWRhdGFfM19udW1lcmljICU+JSAKICBzZWxlY3QoLURvbWluYW50X0Vtb3Rpb25fSGFwcGluZXNzLC1Eb21pbmFudF9FbW90aW9uX0JvcmVkb20sLURvbWluYW50X0Vtb3Rpb25fTmV1dHJhbCwtRG9taW5hbnRfRW1vdGlvbl9TYWRuZXNzLC1Eb21pbmFudF9FbW90aW9uX0FuZ2VyKQoKc2V0LnNlZWQoMzE0MTU5KQoKeF9kYXRhX3NwbGl0IDwtIGNyZWF0ZURhdGFQYXJ0aXRpb24oYW54aWV0eV9tb2RlbF9kYXRhJERvbWluYW50X0Vtb3Rpb25fQW54aWV0eSwgcCA9IDAuNzUsIGxpc3QgPSBGQUxTRSkKCnhfdHJhaW5fZGF0YSA8LSBhbnhpZXR5X21vZGVsX2RhdGFbeF9kYXRhX3NwbGl0LCBdCgp4X3Rlc3RfZGF0YSA8LSBhbnhpZXR5X21vZGVsX2RhdGFbLXhfZGF0YV9zcGxpdCwgXQoKCnhfdHJlZV9tb2RlbCA8LSBycGFydChEb21pbmFudF9FbW90aW9uX0FueGlldHkgfiAuLAogICAgICAgICAgICAgICAgICAgIGRhdGEgPSB4X3RyYWluX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gImNsYXNzIikKCnJwYXJ0LnBsb3QoCiAgeF90cmVlX21vZGVsLAogIHR5cGUgPSAyLCAKICBleHRyYSA9IDEwNiwgCiAgYm94LnBhbGV0dGUgPSAiUmRCdSIsCiAgc2hhZG93LmNvbCA9ICJncmF5IiwKICBubiA9IFRSVUUKKQpgYGAKCl9BbnhpZXR5Ol8gQXMgZm9yIGFueGlldHksIEZhY2Vib29rIG1heSBwbGF5IGEgc2lnbmlmaWNhbnQgcm9sZS4gVXNlcnMgbm90IG9uIEZhY2Vib29rIHdobyByZWNlaXZlIGxlc3MgdGhhbiAyMCBsaWtlcyBhcmUgcmVwb3J0ZWRseSBub3QgYW54aW91cyBhcyBhIHJlc3VsdCBvZiB0aGVpciB1c2FnZSAoMjglKS4gVGhlIGJlc3QgY2hhbmNlIG9mIGEgdXNlciBmZWVsaW5nIGFueGlvdXMgKDUlKSBpcyBwcm9kdWNlZCB3aGVuIHRoZXkgYXJlIG9uIEZhY2Vib29rLCByZWNlaXZlIGF0IGxlYXN0IDExIGNvbW1lbnRzLCBhbmQgY3JlYXRlIGZld2VyIHRoYW4gMyBwb3N0cy4KCgoKYGBge3J9CmJvcmVkb21fbW9kZWxfZGF0YSA8LWRhdGFfM19udW1lcmljICU+JSAKICBzZWxlY3QoLURvbWluYW50X0Vtb3Rpb25fQW54aWV0eSwtRG9taW5hbnRfRW1vdGlvbl9OZXV0cmFsLC1Eb21pbmFudF9FbW90aW9uX0hhcHBpbmVzcywtRG9taW5hbnRfRW1vdGlvbl9TYWRuZXNzLC1Eb21pbmFudF9FbW90aW9uX0FuZ2VyKQoKc2V0LnNlZWQoMzE0MTU5KQoKYl9kYXRhX3NwbGl0IDwtIGNyZWF0ZURhdGFQYXJ0aXRpb24oYm9yZWRvbV9tb2RlbF9kYXRhJERvbWluYW50X0Vtb3Rpb25fQm9yZWRvbSwgcCA9IDAuNzUsIGxpc3QgPSBGQUxTRSkKCmJfdHJhaW5fZGF0YSA8LSBib3JlZG9tX21vZGVsX2RhdGFbYl9kYXRhX3NwbGl0LCBdCgpiX3Rlc3RfZGF0YSA8LSBib3JlZG9tX21vZGVsX2RhdGFbLWJfZGF0YV9zcGxpdCwgXQoKCmJfdHJlZV9tb2RlbCA8LSBycGFydChEb21pbmFudF9FbW90aW9uX0JvcmVkb20gfiAuLAogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBiX3RyYWluX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gImNsYXNzIikKCnJwYXJ0LnBsb3QoCiAgYl90cmVlX21vZGVsLAogIHR5cGUgPSAyLCAKICBleHRyYSA9IDEwNiwgCiAgYm94LnBhbGV0dGUgPSAiUmRCdSIsCiAgc2hhZG93LmNvbCA9ICJncmF5IiwKICBubiA9IFRSVUUKKQpgYGAKCl9Cb3JlZG9tOl8gVXNlcnMgd2hvIHJlY2VpdmUgYXQgbGVhc3QgMjMgbGlrZXMgYW5kIHNlbmQgYXQgbGVhc3QgMTkgbWVzc2FnZXMgYXJlIG1vc3QgbGlrZWx5ICg1NyUpIHRvIG5vdCBleHBlcmllbmNlIGJvcmVkb20uIE9uIHRoZSBvdGhlciBoYW5kLCB0aG9zZSB3aG8gZ2V0IGxlc3MgdGhhbiAxOCBsaWtlcyBhbmQgc3BlbmQgbW9yZSB0aGFuIDU4IG1pbnV0ZXMgb24gYSBwbGF0Zm9ybSBvdGhlciB0aGFuIEZhY2Vib29rIGhhdmUgdGhlIGhpZ2hlc3QgY2hhbmNlICg3JSkgb2YgYmVpbmcgYm9yZWQuCgoKYGBge3J9CnNhZG5lc3NfbW9kZWxfZGF0YSA8LWRhdGFfM19udW1lcmljICU+JSAKICBzZWxlY3QoLURvbWluYW50X0Vtb3Rpb25fQW54aWV0eSwtRG9taW5hbnRfRW1vdGlvbl9Cb3JlZG9tLC1Eb21pbmFudF9FbW90aW9uX0hhcHBpbmVzcywtRG9taW5hbnRfRW1vdGlvbl9OZXV0cmFsLC1Eb21pbmFudF9FbW90aW9uX0FuZ2VyKQoKc2V0LnNlZWQoMzE0MTU5KQoKc19kYXRhX3NwbGl0IDwtIGNyZWF0ZURhdGFQYXJ0aXRpb24oc2FkbmVzc19tb2RlbF9kYXRhJERvbWluYW50X0Vtb3Rpb25fU2FkbmVzcywgcCA9IDAuNzUsIGxpc3QgPSBGQUxTRSkKCnNfdHJhaW5fZGF0YSA8LSBzYWRuZXNzX21vZGVsX2RhdGFbc19kYXRhX3NwbGl0LCBdCgpzX3Rlc3RfZGF0YSA8LSBzYWRuZXNzX21vZGVsX2RhdGFbLXNfZGF0YV9zcGxpdCwgXQoKCnNfdHJlZV9tb2RlbCA8LSBycGFydChEb21pbmFudF9FbW90aW9uX1NhZG5lc3MgfiAuLAogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBzX3RyYWluX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gImNsYXNzIikKCnJwYXJ0LnBsb3QoCiAgc190cmVlX21vZGVsLAogIHR5cGUgPSAyLCAKICBleHRyYSA9IDEwNiwgCiAgYm94LnBhbGV0dGUgPSAiUmRCdSIsCiAgc2hhZG93LmNvbCA9ICJncmF5IiwKICBubiA9IFRSVUUKKQpgYGAKCl9TYWRuZXNzOl8gQXMgZm9yIHNhZG5lc3MsIHRoZXJlIHdhcyBub3QgYW55IHNpZ25pZmljYW50IGNoYWluIHRoYXQgbGVuZHMgaXRzZWxmIHRvIGEgdXNlciBiZWluZyBzYWQgKDw1JSksIGhvd2V2ZXIsIHRob3NlIHdobyByZWNlaXZlIGF0IGxlYXN0IDE5IGxpa2VzLCBhcmUgbm90IG9uIFNuYXBjaGF0LCBhbmQgcmVjZWl2ZSBmZXdlciB0aGFuIDEwIGNvbW1lbnRzIGhhdmUgdGhlIGJlc3QgY2hhbmNlICgyNCUpIG9mIGV4cGVyaWVuY2luZyBhbiBlbW90aW9uIG90aGVyIHRoYW4gc2FkbmVzcy4KCgoKCmBgYHtyfQphbmdlcl9tb2RlbF9kYXRhIDwtZGF0YV8zX251bWVyaWMgJT4lIAogIHNlbGVjdCgtRG9taW5hbnRfRW1vdGlvbl9IYXBwaW5lc3MsLURvbWluYW50X0Vtb3Rpb25fQm9yZWRvbSwtRG9taW5hbnRfRW1vdGlvbl9OZXV0cmFsLC1Eb21pbmFudF9FbW90aW9uX1NhZG5lc3MsLURvbWluYW50X0Vtb3Rpb25fQW54aWV0eSkKCnNldC5zZWVkKDMxNDE1OSkKCmdfZGF0YV9zcGxpdCA8LSBjcmVhdGVEYXRhUGFydGl0aW9uKGFuZ2VyX21vZGVsX2RhdGEkRG9taW5hbnRfRW1vdGlvbl9BbmdlciwgcCA9IDAuNzUsIGxpc3QgPSBGQUxTRSkKCmdfdHJhaW5fZGF0YSA8LSBhbmdlcl9tb2RlbF9kYXRhW2dfZGF0YV9zcGxpdCwgXQoKZ190ZXN0X2RhdGEgPC0gYW5nZXJfbW9kZWxfZGF0YVstZ19kYXRhX3NwbGl0LCBdCgoKZ190cmVlX21vZGVsIDwtIHJwYXJ0KERvbWluYW50X0Vtb3Rpb25fQW5nZXIgfiAuLAogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBnX3RyYWluX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gImNsYXNzIikKCnJwYXJ0LnBsb3QoCiAgZ190cmVlX21vZGVsLAogIHR5cGUgPSAyLCAKICBleHRyYSA9IDEwNiwgCiAgYm94LnBhbGV0dGUgPSAiUmRCdSIsCiAgc2hhZG93LmNvbCA9ICJncmF5IiwKICBubiA9IFRSVUUKKQpgYGAKCl9BbmdlcjpfIFVubGlrZSB0aGUgb3RoZXIgZW1vdGlvbnMsIHRoZSBmYWN0b3JzIHRoYXQgbGVhZCB0byBhIHVzZXIgbm90IGJlaW5nIGFuZ3J5IGR1ZSB0byB0aGVpciBtZWRpYSB1c2FnZSBhcmUgbW9zdCBkZXBlbmRlbnQgb24gdGhlIHBsYXRmb3JtcyBiZWluZyB1c2VkLiBGcm9tIHRoaXMgbW9kZWwsIHVzZXJzIHdobyBhcmUgbm90IG9uIFR3aXR0ZXIsIFdoYXRzQXBwLCBvciBUZWxlZ3JhbSBhcmUgbGlrZWx5ICg2NSUpIG5vdCB0byBiZSBhbmdyeS4gVGhvc2Ugd2hvIGRvIHJlcG9ydCBhbmdlciBoYXZlIHRoZSBiZXN0IGNoYW5jZSAoNyUpIG9mIGZvbGxvd2luZyBhIHNwZWNpZmljIHBhdGguIFRoaXMgcGF0aCBpcyBhcyBmb2xsb3dzOiBiZWluZyBvbiBUd2l0dGVyLCByZWNlaXZpbmcgYXQgbGVhc3QgMTcgY29tbWVudHMsIGFuZCBzZW5kaW5nIGJldHdlZW4gMTkgYW5kIDI0IG1lc3NhZ2VzLiAKCgoKCgojIyMgUXVlc3Rpb24gMjogQmFzZWQgb24gdGhlIGRlY2lzaW9uIHRyZWUgbW9kZWwsIHdoYXQgZmFjdG9yIGluZmx1ZW5jZXMgdGhhdCBlbW90aW9uYWwgc3RhdGUgdGhlIG1vc3Q/CgpUbyBmaWd1cmUgb3V0IHdoaWNoIHBhcnQgb2Ygc29jaWFsIG1lZGlhIHVzZSBoYWQgdGhlIGJpZ2dlc3QgaW1wYWN0IG9uIGEgdXNlcuKAmXMgZG9taW5hbnQgZW1vdGlvbiwgd2UgbG9va2VkIGF0IHRoZSB2YXJpYWJsZSBpbXBvcnRhbmNlIHNjb3JlcyBmcm9tIGEgbGFyZ2VyIGRlY2lzaW9uIHRyZWUgYW5kIGdyYXBoZWQgdGhlbS4gVGhlc2Ugc2NvcmVzIHRlbGwgdXMgd2hpY2ggcHJlZGljdG9ycyB0aGUgbW9kZWwgcmVsaWVkIG9uIHRoZSBtb3N0IHdoZW4gZGVjaWRpbmcgaG93IHRvIGNsYXNzaWZ5IHBlb3BsZeKAmXMgZW1vdGlvbnMuCiAgCmBgYHtyfQoKbW9kZWxfZGF0YSA8LWRhdGFfMiAlPiUgCiAgc2VsZWN0KERhaWx5X1VzYWdlX1RpbWUuLm1pbnV0ZXMuLCBQbGF0Zm9ybSwgRG9taW5hbnRfRW1vdGlvbiwgUG9zdHNfUGVyX0RheSwgTWVzc2FnZXNfU2VudF9QZXJfRGF5LCBDb21tZW50c19SZWNlaXZlZF9QZXJfRGF5LCBMaWtlc19SZWNlaXZlZF9QZXJfRGF5ICkKCnNldC5zZWVkKDMxNDE1OSkKCmRhdGFfc3BsaXQgPC0gY3JlYXRlRGF0YVBhcnRpdGlvbihtb2RlbF9kYXRhJERvbWluYW50X0Vtb3Rpb24sIHAgPSAwLjc1LCBsaXN0ID0gRkFMU0UpCgp0cmFpbl9kYXRhIDwtIG1vZGVsX2RhdGFbZGF0YV9zcGxpdCwgXQoKdGVzdF9kYXRhIDwtIG1vZGVsX2RhdGFbLWRhdGFfc3BsaXQsIF0KCgp0cmVlX21vZGVsIDwtIHJwYXJ0KERvbWluYW50X0Vtb3Rpb24gfiAuLCAKICAgICAgICAgICAgICAgICAgICBkYXRhID0gdHJhaW5fZGF0YSwKICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSAiY2xhc3MiKQoKcnBhcnQucGxvdCgKICB0cmVlX21vZGVsLAogIHR5cGUgPSAyLAogIGV4dHJhID0gMTA2LAogIGJveC5wYWxldHRlID0gIlJkQnUiLAogIHNoYWRvdy5jb2wgPSAiZ3JheSIsCiAgbm4gPSBUUlVFCikKYGBgCiAgCmBgYHtyfQojRmFjdG9yIEltcG9ydGFuY2UKCmltcCA8LSB0cmVlX21vZGVsJHZhcmlhYmxlLmltcG9ydGFuY2UKaW1wX2RmIDwtIGRhdGEuZnJhbWUoCnByZWRpY3RvciA9IG5hbWVzKGltcCksCmltcG9ydGFuY2UgPSBhcy5udW1lcmljKGltcCkKKSAlPiUKYXJyYW5nZShkZXNjKGltcG9ydGFuY2UpKQpJbXBvcnRhbmNlX1BhbGV0dGU8LWMoIiMyOTM3NGQiLCAiIzMxNGE3MCIsICIjMzA1ZWE2IiwgIiM0ZmIzZmYiLCAiIzdjYzVmYyIsICIjNmZmN2Y3IikKCmltcF9kZgpnZ3Bsb3QoaW1wX2RmLCBhZXMoeCA9IHJlb3JkZXIocHJlZGljdG9yLCBpbXBvcnRhbmNlKSwgeSA9IGltcG9ydGFuY2UpKSArCmdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsPUltcG9ydGFuY2VfUGFsZXR0ZSkgKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIlBsYXRmb3JtIj0iUGxhdGZvcm0iLCJQb3N0c19QZXJfRGF5Ij0iUG9zdHMgcGVyIERheSIsIkNvbW1lbnRzX1JlY2VpdmVkX1Blcl9EYXkiPSJDb21tZW50cyBSZWNlaXZlZCBwZXIgRGF5IiwiTWVzc2FnZXNfU2VudF9QZXJfRGF5Ij0iTWVzc2FnZXMgU2VudCBwZXIgRGF5IiwiRGFpbHlfVXNhZ2VfVGltZS4ubWludXRlcy4iPSJEYWlseSBVc2FnZSIsIkxpa2VzX1JlY2VpdmVkX1Blcl9EYXkiPSJMaWtlcyBSZWNlaXZlZCIpKSsKbGFicyh0aXRsZSA9ICJUb3AgUHJlZGljdG9ycyBvZiBEb21pbmFudCBFbW90aW9uIix4ID0gIlByZWRpY3RvciIseSA9ICJJbXBvcnRhbmNlIFNjb3JlIikgKwpzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9SW1wb3J0YW5jZV9QYWxldHRlKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCmBgYAoKRnJvbSB0aGUgYmFyIGdyYXBoLCDigJxMaWtlcyBSZWNlaXZlZCBwZXIgRGF54oCdIHN0YW5kcyBvdXQgYXMgdGhlIHN0cm9uZ2VzdCBwcmVkaWN0b3IuIFRoaXMgbWVhbnMgdGhhdCBob3cgbWFueSBsaWtlcyBhIHVzZXIgZ2V0cyBwbGF5cyBhIGJpZ2dlciByb2xlIGluIHNoYXBpbmcgdGhlaXIgZW1vdGlvbmFsIHN0YXRlIHRoYW4gYW55dGhpbmcgZWxzZSBtZWFzdXJlZC4gSW4gb3RoZXIgd29yZHMsIHRoZSBhbW91bnQgb2YgcG9zaXRpdmUgZmVlZGJhY2sgcGVvcGxlIHJlY2VpdmUgc2VlbXMgdG8gbWF0dGVyIG1vcmUgdGhhbiBzaW1wbHkgaG93IGxvbmcgdGhleSB1c2UgdGhlIGFwcCBvciB3aGljaCBwbGF0Zm9ybSB0aGV54oCZcmUgb24uIExpa2VzIGNhbiBhY3QgYXMgYSBmb3JtIG9mIHNvY2lhbCB2YWxpZGF0aW9uLCBzbyBoaWdoZXIgb3IgbG93ZXIgZW5nYWdlbWVudCBjb3VsZCBpbmZsdWVuY2UgaG93IHNvbWVvbmUgZW5kcyB1cCBmZWVsaW5nLgoKUmlnaHQgYmVoaW5kIGxpa2VzIHdlcmUg4oCcRGFpbHkgVXNhZ2UgVGltZeKAnSwg4oCcTWVzc2FnZXMgU2VudCBwZXIgRGF54oCdLCBhbmQg4oCcQ29tbWVudHMgUmVjZWl2ZWQgcGVyIERheS7igJ0gVGhlc2UgYXJlIGFsbCBpbnRlcmFjdGlvbiByZWxhdGVkIG1lYXN1cmVzLCBzdWdnZXN0aW5nIHRoYXQgZW1vdGlvbnMgYXJlIG1vcmUgaW5mbHVlbmNlZCBieSBob3cgbG9uZyB1c2VycyBzcGVuZCBvbiBhIHBsYXRmb3JtLCBob3cgbXVjaCB1c2VycyBlbmdhZ2Ugd2l0aCBvdGhlcnMsIGFuZCBob3cgbXVjaCBwZW9wbGUgZW5nYWdlIGJhY2sgd2l0aCB0aGVtLiBPbiB0aGUgb3RoZXIgaGFuZCwg4oCcUGxhdGZvcm3igJ0gYW5kIOKAnFBvc3RzIHBlciBEYXnigJ0gd2VyZSB0aGUgbGVhc3QgaW1wb3J0YW50IHByZWRpY3RvcnMuIFRoYXQgbWVhbnMgdGhlIHNwZWNpZmljIGFwcCBzb21lb25lIHVzZXMgb3IgaG93IG9mdGVuIHRoZXkgcG9zdCBkaWRu4oCZdCBtYXR0ZXIgbmVhcmx5IGFzIG11Y2ggYXMgdGhlIGFtb3VudCBvZiBmZWVkYmFjayBhbmQgaW50ZXJhY3Rpb24gdGhleSByZWNlaXZlZC4KCk92ZXJhbGwsIHRoZSBtb2RlbCBzaG93cyBhIGNsZWFyIHBhdHRlcm47IEVtb3Rpb25zIGFyZSBzaGFwZWQgbW9yZSBieSBlbmdhZ2VtZW50IHRoYW4gYnkgc2ltcGxlIGFjdGl2aXR5LiBJdCBpc27igJl0IHRoZSBhcHAgeW91IHVzZSwgcmF0aGVyIGl04oCZcyB0aGUgZmVlZGJhY2sgYW5kIGF0dGVudGlvbiB5b3UgZ2V0IHdoaWxlIHVzaW5nIGl0LiBUaGlzIGFsaWducyB3aXRoIHRoZSBpZGVhIHRoYXQgc29jaWFsIGludGVyYWN0aW9uIGFuZCBwZXJjZWl2ZWQgc29jaWFsIGFwcHJvdmFsIHBsYXkgYSBtYWpvciByb2xlIGluIGhvdyB3ZSBmZWVsIGFmdGVyIGJlaW5nIG9ubGluZS4KCgojIyMgUXVlc3Rpb24gMzogV2hhdCBpcyB0aGUgZG9taW5hbnQgZW1vdGlvbmFsIHN0YXRlIGR1cmluZyB0aGUgZGF5IGZvciBlYWNoIHNvY2lhbCBtZWRpYSBhcHA/CiAgCmBgYHtyfQpncmFwaDMgPC0gZGF0YV8yICU+JSAKICBzZWxlY3QoUGxhdGZvcm0sIERvbWluYW50X0Vtb3Rpb24pCgpnZ3Bsb3QoZ3JhcGgzLGFlcyh4PVBsYXRmb3JtLCBmaWxsPURvbWluYW50X0Vtb3Rpb24pKSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgbGFicyh4PSJQbGF0Zm9ybSIseT0iQ291bnQgb2YgRmVsdCBEb21pbmFudCBFbW90aW9uIiwgdGl0bGU9IkRvbWluYW50IEVtb3Rpb24gRmVsdCBvbiBlYWNoIFNvY2lhbCBNZWRpYSBQbGF0Zm9ybSIpICsKICBzY2FsZV9maWxsX21hbnVhbChuYW1lPSJEb21pbmFudCBFbW90aW9uIix2YWx1ZXM9YygicmVkIiwicHVycGxlIiwiZ3JleSIsInllbGxvdyIsImxpZ2h0Ymx1ZSIsImRhcmtibHVlIikpCmBgYAoKVGhlIGRvbWluYW50IGVtb3Rpb25hbCBzdGF0ZSBhY3Jvc3MgdGhlIHBsYXRmb3JtcyBncmVhdGx5IGRpZmZlcmVkLiBGcm9tIHRoaXMgZGF0YSBzZXQsIHVzZXJzIG9uIEluc3RhZ3JhbSBwcmVkb21pbmFudGx5IHJlcG9ydGVkIGZlZWxpbmcgaGFwcHksIGZhciBtb3JlIHRoYW4gYW55IG90aGVyIGVtb3Rpb24sIGFuZCBib3JlZG9tIHdhcyBub3QgcmVwb3J0ZWQuIFVzZXJzIG9uIExpbmtlZEluIHdlcmUgcHJlZG9taW5hbnRseSBib3JlZCwgYW5kIG5vIG9uZSB3YXMgaGFwcHkuIFVzZXJzIG9uIFR3aXR0ZXIgZmVsdCBwcmVkb21pbmFudGx5IGFuZ3J5OyBob3dldmVyLCBzYWRuZXNzIHdhcyBhbHNvIHVwIHRoZXJlLiBGYWNlYm9vaywgU25hcGNoYXQsIFRlbGVncmFtLCBhbmQgV2hhdHNBcHAgaGFkIG1vcmUgdmFyaWFiaWxpdHkgaW4gd2hpY2ggZW1vdGlvbnMgd2VyZSBwcmVkb21pbmFudGx5IGZlbHQuIEhvd2V2ZXIsIG5vIGhhcHBpbmVzcyBvciBhbmdlciB3YXMgcHJlc2VudCBpbiB0aGlzIEZhY2Vib29rIGRhdGEgc2V0LCBhbmQgbmV1dHJhbGl0eSArIGFueGlldHkgd2FzIHRoZSBtb3N0IGNvbW1vbi4gTm8gYW5nZXIgd2FzIGZvdW5kIGluIFNuYXBjaGF0LCBidXQgc2FkbmVzcyB3YXMgdGhlIGRvbWluYW50IGVtb3Rpb24uIFNhZG5lc3Mgd2FzIGFsc28gdGhlIHRvcCBlbW90aW9uIG9uIFRlbGVncmFtLCBhbmQgbm8gaGFwcGluZXNzIGNvdW50cyB3ZXJlIHByZXNlbnQuIEFzIGZvciBXaGF0c0FwcCwgYW5nZXIgd2FzIHRoZSBkb21pbmFudCBlbW90aW9uLCB3aXRoIG5vIGNvdW50cyBvZiBzYWRuZXNzIG9yIGJvcmVkb20uCgpUaGlzIGRlbW9uc3RyYXRlcyBob3cgdGhlIG1lZGlhIGlzIGNvbnN1bWVkIGFuZCBob3cgdGhlIHN0cnVjdHVyZSBvZiBlYWNoIHVuaXF1ZSBwbGF0Zm9ybSBpbmZsdWVuY2VzIHdoaWNoIGRvbWluYW50IGVtb3Rpb24gaXMgZmVsdC4gVGhpcyBkYXRhIGNhbiBiZSB1c2VkIHRvIHNwcmVhZCBhd2FyZW5lc3Mgb2Ygd2hpY2ggcGxhdGZvcm1zIHRvIGxpbWl0IHVzZSBvbiBiZWNhdXNlIHRoZXkgbWF5IGJlIGdlbmVyYXRpbmcgbmVnYXRpdmUgZW1vdGlvbnMsIGFuZCB3aGljaCBjYW4gcG90ZW50aWFsbHkgYmUgdXNlZCB0byBwcm9tb3RlIHBvc2l0aXZlIGVtb3Rpb25zLgoKCiMjIyBRdWVzdGlvbiA0OiBJcyB0aGVyZSBhIGRpZmZlcmVuY2UgaW4gd2hpY2ggZG9taW5hbnQgZW1vdGlvbmFsIHN0YXRlIGEgdXNlciBmZWVscyBiYXNlZCBvbiB0aGVpciBpbnRlcmFjdGlvbiB3aXRoIG90aGVyIHVzZXJzIGFuZCB0aGUgZW5nYWdlbWVudCB0aGV5IHJlY2VpdmU/CgpgYGB7cn0KZ3JhcGg0IDwtIGRhdGFfMiAlPiUgCiAgc2VsZWN0KFBvc3RzX1Blcl9EYXksIExpa2VzX1JlY2VpdmVkX1Blcl9EYXksIENvbW1lbnRzX1JlY2VpdmVkX1Blcl9EYXksIE1lc3NhZ2VzX1NlbnRfUGVyX0RheSwgIERvbWluYW50X0Vtb3Rpb24pIApgYGAKCmBgYHtyfQpncmFwaDQgPC0gZ3JhcGg0ICU+JSAKIG11dGF0ZShpbnRlcmFjdGlvbiA9IFBvc3RzX1Blcl9EYXkgKyBNZXNzYWdlc19TZW50X1Blcl9EYXkpCiAgCmdyYXBoNCA8LSBncmFwaDQgJT4lIAogIG11dGF0ZShlbmdhZ2VtZW50ID0gTGlrZXNfUmVjZWl2ZWRfUGVyX0RheSArIENvbW1lbnRzX1JlY2VpdmVkX1Blcl9EYXkpCmBgYAoKYGBge3J9CmdyYXBoNCA8LSBncmFwaDQgJT4lIAogIHNlbGVjdChpbnRlcmFjdGlvbiwgZW5nYWdlbWVudCwgRG9taW5hbnRfRW1vdGlvbikKCmdncGxvdChncmFwaDQsYWVzKHg9ZW5nYWdlbWVudCx5PWludGVyYWN0aW9uLCBmaWxsPURvbWluYW50X0Vtb3Rpb24pKSsKICBnZW9tX3BvaW50KHNoYXBlPTIxLHNpemU9Myxjb2xvcj0iYmxhY2siLHN0cm9rZT0uNSkrCiAgeGxpbSgwLDE2MCkrCiAgeWxpbSgwLDYwKSsKICBsYWJzKHg9IkVuZ2FnZW1lbnQgKExpa2VzICsgQ29tbWVudHMgUmVjZWl2ZWQgLyBEYXkpICIseT0iSW50ZXJhY3Rpb24gKFBvc3RzICsgTWVzc3NhZ2VzIFNlbnQgLyBEYXkpIiwgdGl0bGU9IkRvbWluYW50IEVtb3Rpb24gRmVsdCBCYXNlZCBvbiBVc2FnZSIpICArCiAgc2NhbGVfZmlsbF9tYW51YWwobmFtZT0iRG9taW5hbnQgRW1vdGlvbiIsdmFsdWVzPWMoInJlZCIsInB1cnBsZSIsImdyZXkiLCJ5ZWxsb3ciLCJsaWdodGJsdWUiLCJkYXJrYmx1ZSIpKQpgYGAKClRoZSBncmFwaCBzaG93cyBhIHBvc2l0aXZlIGNvcnJlbGF0aW9uIGJldHdlZW4gZW1vdGlvbiwgZW5nYWdlbWVudCwgYW5kIGludGVyYWN0aW9uLiBUaGUgbW9yZSB5b3UgcmVjZWl2ZSBlbmdhZ2VtZW50IGZyb20gb3RoZXIgdXNlcnMgdmlhIGxpa2VzIGFuZCBjb21tZW50cywgYW5kIHRoZSBtb3JlIHlvdSBpbnRlcmFjdCBieSBwb3N0aW5nIGFuZCBtZXNzYWdpbmcgb3RoZXIgdXNlcnMsIHlvdSBnZW5lcmFsbHkgZmVlbCBoYXBwaWVyLiBUaGVyZSBhcmUgdHdvIGhpZ2ggZGF0YSBwb2ludHMgdGhhdCBzb21lIG1heSBmZWVsIGFueGlvdXMgYWJvdXQgYXQgdGhlIG1heGltdW0gZW5kIG9mIGVuZ2FnZW1lbnQgYW5kIGludGVyYWN0aW9uLiBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgYSB1c2VyIGhhcyBsb3cgaW50ZXJhY3Rpb24gYW5kIGVuZ2FnZW1lbnQsIHRoZXkgYXJlIG1vcmUgbGlrZWx5IHRvIGZlZWwgYm9yZWQuIElmIHlvdSBhcmUgYm9yZWQsIHNwZW5kaW5nIHRpbWUgb24gc29jaWFsIG1lZGlhIG1pZ2h0IGJlIGEgZ29vZCB3YXkgdG8gbWFrZSB5b3UgZmVlbCBiZXR0ZXIsIGFzIGl0IHByb3ZpZGVzIGEgd2F5IHRvIGludGVyYWN0IHdpdGggb3RoZXJzIGFuZCBhbGxldmlhdGUgYm9yZWRvbS4KCkFuZ2VyLCBhbnhpZXR5LCBzYWRuZXNzLCBhbmQgbmV1dHJhbCBoYWQgYSBsYXJnZXIgc3ByZWFkOyBob3dldmVyLCBtb3N0IGRvIG5vdCBvdmVybGFwIHdpdGggdGhlIGhhcHBpbmVzcyBkYXRhIHBvaW50cy4gVGhpcyBtYXkgaW5kaWNhdGUgdGhhdCB0aGUgdXNlcnMgYW5kIG1lZGlhIHBlb3BsZSB0aGV5IGludGVyYWN0IHdpdGggbWF5IGNvbnRyaWJ1dGUgdG8gdGhlIGVtb3Rpb25zIHRoZXkgZmVlbCwgYW5kIHRoYXQgdGhpcyBpcyBub3QgYSBvbmUtdG8tb25lIHJlZmxlY3Rpb24gb2YgdGhlIHF1YW50aXR5IG9mIHRoZWlyIGludGVyYWN0aW9uIGFuZCBlbmdhZ2VtZW50LiAKCgoKIyBDb25jbHVzaW9ucwoKQmFzZWQgb24gb3VyIGFuYWx5c2lzLCB3ZSBmb3VuZCB0aGF0IHVzZXJzIGFyZSBtb3JlIGxpa2VseSB0byBmZWVsIGhhcHBpbmVzcyB3aGVuIHRoZXkgc3BlbmQgbW9yZSB0aGFuIDEzNSBtaW51dGVzIG9uIHNvY2lhbCBtZWRpYSBhbmQgcmVjZWl2ZSA3MSBsaWtlcy4gVGhpcyB0cmVuZCBvZiBoaWdoZXIgZW5nYWdlbWVudCBhbmQgaW50ZXJhY3Rpb24gbGVhZGluZyB0byBoYXBwaW5lc3MgaXMgdmlzdWFsaXplZCBpbiB0aGUgc2NhdHRlciBwbG90LiBBbHNvLCBpdCBkZW1vbnN0cmF0ZXMgdGhhdCBhIHVzZXIgd2FzIGxpa2VseSB0byBleHBlcmllbmNlIGFuIGVtb3Rpb24gb3RoZXIgdGhhbiBoYXBwaW5lc3MgaWYgdGhleSBoYWQgbGVzcyBlbmdhZ2VtZW50IGFuZCBpbnRlcmFjdGlvbiBvbiB0aGUgcGxhdGZvcm0uIEJ5IGluY3JlYXNpbmcgZW5nYWdlbWVudCBhbmQgaW50ZXJhY3Rpb24sIGl0IHdhcyBhbHNvIGZvdW5kIHRoYXQgYSB1c2VyIGlzIGxlc3MgbGlrZWx5IHRvIGJlY29tZSBib3JlZC4gTGlrZXMgcmVjZWl2ZWQgcGVyIGRheSwgZGFpbHkgdXNhZ2UgdGltZSwgbWVzc2FnZXMgc2VudCBwZXIgZGF5LCBhbmQgY29tbWVudHMgcmVjZWl2ZWQgcGVyIGRheSB3ZXJlIGZvdW5kIHRvIGJlIHRoZSB0b3AgcHJlZGljdG9ycyBvZiB3aGljaCBlbW90aW9uIHdhcyBkb21pbmFudGx5IGZlbHQuIEhvd2V2ZXIsIG90aGVyIGVtb3Rpb25zIGJleW9uZCBoYXBwaW5lc3MgYW5kIGJvcmVkb20gd2VyZSBmb3VuZCB0byBiZSBsZXNzIGluZmx1ZW5jZWQgYnkgc29jaWFsIG1lZGlhIHVzYWdlIGFuZCBtb3JlIGJ5IHRoZSBwbGF0Zm9ybSB1c2VkLiBGb3IgZXhhbXBsZSwgVHdpdHRlciB1c2VycyB3ZXJlIHByZWRvbWluYW50bHkgYW5ncnkgb3Igc2FkLCB3aGlsZSBGYWNlYm9vayB1c2VycyB3ZXJlIG5ldXRyYWwgb3IgYW54aW91cy4KCk92ZXJhbGwsIG91ciBkYXRhIGFuYWx5c2lzIHByb3ZpZGVkIGEgY29tcHJlaGVuc2l2ZSB1bmRlcnN0YW5kaW5nIG9mIGhvdyB1c2FnZSBhbmQgdGhlIHR5cGUgb2YgcGxhdGZvcm0gaW1wYWN0IHRoZSB1c2VyJ3MgZG9taW5hbnQgZW1vdGlvbmFsIHN0YXRlIHRocm91Z2hvdXQgdGhlIGRheS4gSG93ZXZlciwgNzcgZGF0YSBwb2ludHMgd2VyZSByZW1vdmVkIGJlY2F1c2Ugb2YgZm9ybWF0dGluZyBpc3N1ZXMuIFRoZWlyIGluY2x1c2lvbiBtYXkgaGF2ZSBpbmNyZWFzZWQgdmFyaWFiaWxpdHkgaW4gdGhlIGVtb3Rpb25hbCBzdGF0ZXMgZmVsdCBhY3Jvc3MgcGxhdGZvcm1zIGFuZCBlbmFibGVkIG1vcmUgYWNjdXJhdGUgcHJlZGljdGl2ZSBtb2RlbHMuIEFkZGl0aW9uYWxseSwgZm9yIGZ1dHVyZSBhbmFseXNpcywgaXQgbWF5IGJlIHdvcnRod2hpbGUgdG8gaW52ZXN0aWdhdGUgdGhlIG1lZGlhIGFuZCBpbnRlcmFjdGlvbnMgb24gZWFjaCBwbGF0Zm9ybSByYXRoZXIgdGhhbiBpbmZlcnJpbmcgdGhlbSBiYXNlZCBvbiB0aGUgZW1vdGlvbi4gVGhpcyB3b3VsZCBoZWxwIGRldGVybWluZSB0aGUgZGlyZWN0aW9uIG9mIGNhdXNhbGl0eSBiZXR3ZWVuIG1lZGlhIGFuZCBlbW90aW9uLiA=