About this Notebook



Analytics Toolkit: Require Packages


# Here we are checking if the package is installed
if(!require("tidyverse")){
  install.packages("tidyverse", dependencies = TRUE)
  library("tidyverse")
}
if(!require("syuzhet")){
  install.packages("syuzhet", dependencies = TRUE)
  library("syuzhet")
}
if(!require("cleanNLP")){
  install.packages("cleanNLP", dependencies = TRUE)
  library("cleanNLP")
}
if(!require("magrittr")){
  install.packages("magrittr", dependencies = TRUE)
  library("magrittr")
}
if(!require("wordcloud")){
  install.packages("wordcloud", dependencies = TRUE)
  library("wordcloud")
}

Data Preparation: Cleaning tweets using regular expressions


Reading and inspecting the dataset

tweets <- read_csv("data/march_madness.csv")
# Change the tweets IDs from longe integer to characters
tweets$tweet_id <- as.character(tweets$tweet_id)
# Extract and delete the links variable to add it at the end
links <- tweets$links
tweets$links <- NULL
# Inspects the first 10 rows
head(tweets)

Now first we need to extract the text from the raw tweets and clean it using regular expressions

replace_reg <- 'https://t.co/[A-Za-z\\d]+|http://[A-Za-z\\d]+|(pic.twitter.com/[A-Za-z\\d]+)|&amp;|&lt;|&gt;|RT|(.*.)\\.com(.*.)\\S+\\s|[^[:alnum:]]|(http|https)\\S+\\s*|(#|@)\\S+\\s*|\\n|\\"'
tweets <- tweets %>% 
  mutate(text = str_replace_all(text, replace_reg, " ")) %>% 
  mutate(text = iconv(text, from = "ASCII", to = "UTF-8", sub = " "))
Error in mutate_impl(.data, dots) : 
  Evaluation error: embedded nul in string: 'How to draw  kawaii  step by step leassons on Google Play   animejapan  KAWAIIcollection  FinalFour  SisterJean  ORLvUTA  c\003\tc\003)c\0024c\0033c\003\034c\003<c\003+h6\005  nitiasa  precure  d;.i\035"c\003)c\002$c\003\0c\003<c\003\023c\003+c\003\t  c\0025c\0033c\003\ac\003<c\003"c\003<c\003\vc\0033c\0020  CBX SomeoneLikeYou  l\v m\031\024l\025< l\n$k,4l\0024l\035\004 l6\025m\025\030m\0254 l5\034j0\025l0=k/< '.

Here we are going to use the Saif Mohammad’s NRC Emotion lexicon toextract the sentiment of the tweet. The NRC emotion lexicon is a list of words and their associations with eight emotions (anger, fear, anticipation, trust, surprise, sadness, joy, and disgust) and two sentiments (negative and positive).

Here we are going to merge the NRC Emotion results with the original data to create a complete dataset.

To have another metrics for semtiment we are going to use another lexicon developed by Professor Minqing Hu and Professor Bing Liu, from University of Illinois at Chicago.

Sentiment Analysis: Natural Language Processing


First lets read the dataset and inspect the first 10 rows

For sentiment analysis we are going to use the cleanNLP package that uses Stanford CoreNLP – Natural language software int he backend. First we need to initialize the CoreNLP engine and create an annotation object using the text column, tweet_id and the other columns are given as metadata

Distribution of tweet/sentence length, max number of works in a tweet 280

Here we can see the change of sentiment in the tweets

Here we can find the most used entities from the tweets entity table. The document corpus yields an alternative way to see the underlying topics.

Here we creating a high-level summary of the tweets text by extracting all direct object object-dependencies.

Look at the tweets with negative sentiment

Look a tweets with positive sentiment

Lets explore the emotions in the tweets more in-depth. Here we are going to extract the variables regarding emotions and create a subset.

Now we can create a plot of the emotions in the march madness tweets


Reporting: A Wordcloud from March Madness Tweets


Wordclouds are always a fun and engaging way to display data. Here we are going to set some stop words that we dont want in the plot.

Now lets create a dataframe of words and filter using predefined stop words

Set a threshold for the min/max frequency of words and scale of the wordcloud

The last step is to create the wordcloud by counting the frequency of the words


Task 1: Data Exploration - Tableau


1A) Generally describe the data (summary)

The data we are using has columns such as date, verified, reply, text, links etc. which are all features of the Twitter application.

mydata <- read.csv("C:\\Users\\hp\\Documents\\Spring 2018\\BSAD 343H\\Labs\\Lab 9\\09-notebook-lab\\data\\march_madness.csv")
summary(mydata)
    tweet_id        
 Min.   :3.542e+16  
 1st Qu.:9.774e+17  
 Median :9.777e+17  
 Mean   :9.753e+17  
 3rd Qu.:9.777e+17  
 Max.   :9.824e+17  
                    
                                                                                                                                                                                                                                                                                             text      
 Yes! My favorite sports city has a team in the #FinalFour of #MarchMadness! The Loyola-Chicago Ramblers are in the final 4 for the 1st time since 1963! They’ve been underdogs this whole tournament & still keep winning! Go @RamblersMBB! Win for #SisterJean! #OnwardLU #NoFinishLine:    8  
 Congrats @RamblersMBB                                                                                                                                                                                                                                                                         :    7  
 Let’s go @RamblersMBB                                                                                                                                                                                                                                                                    :    4  
 Congrats @RamblersMBB.                                                                                                                                                                                                                                                                        :    3  
 Congratulations @RamblersMBB                                                                                                                                                                                                                                                                  :    3  
 I love #SisterJean                                                                                                                                                                                                                                                                            :    3  
 (Other)                                                                                                                                                                                                                                                                                       :20159  
             username                  fullname             date                       datetime        verified           reply             retweets       
 @LALATE         :   81   LALATE           :   81   2018-03-25:10708   2018-03-25T00:21:10Z:   16   Min.   :0.00000   Min.   :  0.0000   Min.   :   0.000  
 @RamblersMBB    :   30   Loyola Basketball:   31   2018-03-23: 2976   2018-03-25T00:21:31Z:   16   1st Qu.:0.00000   1st Qu.:  0.0000   1st Qu.:   0.000  
 @SkywayChicago  :   27   Steve Timble     :   27   2018-03-24: 2274   2018-03-25T00:21:09Z:   15   Median :0.00000   Median :  0.0000   Median :   0.000  
 @chicagomargaret:   21   Margaret Holt    :   21   2018-03-26: 1504   2018-03-25T00:21:35Z:   15   Mean   :0.06192   Mean   :  0.3467   Mean   :   3.146  
 @sschrimp       :   18   Mark             :   21   2018-03-18: 1099   2018-03-25T00:21:08Z:   14   3rd Qu.:0.00000   3rd Qu.:  0.0000   3rd Qu.:   0.000  
 @loyolaforus    :   16   Steve            :   19   2018-03-27:  241   2018-03-25T00:21:11Z:   14   Max.   :1.00000   Max.   :591.0000   Max.   :5143.000  
 (Other)         :19994   (Other)          :19987   (Other)   : 1385   (Other)             :20097                                                          
    favorite                                  links      
 Min.   :    0.0   @RamblersMBB                  : 1139  
 1st Qu.:    0.0   #LoyolaChicago                : 1027  
 Median :    1.0   #SisterJean                   :  778  
 Mean   :   15.8   https://twitter.com#SisterJean:  231  
 3rd Qu.:    3.0   #LoyolaChicago; #MarchMadness :  208  
 Max.   :32180.0   (Other)                       :16117  
                   NA's                          :  687  

1B) Use tableau to create at least 5 plots

knitr::include_graphics("C:\\Users\\hp\\Documents\\Spring 2018\\BSAD 343H\\Labs\\Lab 9\\img1.png")

knitr::include_graphics("C:\\Users\\hp\\Documents\\Spring 2018\\BSAD 343H\\Labs\\Lab 9\\img2.png")

knitr::include_graphics("C:\\Users\\hp\\Documents\\Spring 2018\\BSAD 343H\\Labs\\Lab 9\\img3.png")

1C) Explain each plot make a relation to date of the tweets/time

The first figure illustrates the number of records graphically and in a table. It appears March had the most amount of tweets from this set of data. The second figure illustrates how many of those tweets were either verified, retweeted, or favorited, and the time of day tweets were most active. The third figure further distinguishes the tweet features in terms of number of tweets, and the spherical figure shows the frequency of links whereby the more a hashtag was tweeted, the bigger the circle. ————-

Task 3: Data Analysis


2A)Based on your plots and data description make give a general narrative for the image of loyola in twitter

Upon looking at the most frequent links/hashtags, it appears #loyolachicago,#sisterjean and @RamblerMBB are the most tweeted hashtags, giving Loyola a positive image. ### 2B) Use descriptive statistics to backup your arguments

summary(mydata)
    tweet_id        
 Min.   :3.542e+16  
 1st Qu.:9.774e+17  
 Median :9.777e+17  
 Mean   :9.753e+17  
 3rd Qu.:9.777e+17  
 Max.   :9.824e+17  
                    
                                                                                                                                                                                                                                                                                             text      
 Yes! My favorite sports city has a team in the #FinalFour of #MarchMadness! The Loyola-Chicago Ramblers are in the final 4 for the 1st time since 1963! They’ve been underdogs this whole tournament & still keep winning! Go @RamblersMBB! Win for #SisterJean! #OnwardLU #NoFinishLine:    8  
 Congrats @RamblersMBB                                                                                                                                                                                                                                                                         :    7  
 Let’s go @RamblersMBB                                                                                                                                                                                                                                                                    :    4  
 Congrats @RamblersMBB.                                                                                                                                                                                                                                                                        :    3  
 Congratulations @RamblersMBB                                                                                                                                                                                                                                                                  :    3  
 I love #SisterJean                                                                                                                                                                                                                                                                            :    3  
 (Other)                                                                                                                                                                                                                                                                                       :20159  
             username                  fullname             date                       datetime        verified           reply             retweets       
 @LALATE         :   81   LALATE           :   81   2018-03-25:10708   2018-03-25T00:21:10Z:   16   Min.   :0.00000   Min.   :  0.0000   Min.   :   0.000  
 @RamblersMBB    :   30   Loyola Basketball:   31   2018-03-23: 2976   2018-03-25T00:21:31Z:   16   1st Qu.:0.00000   1st Qu.:  0.0000   1st Qu.:   0.000  
 @SkywayChicago  :   27   Steve Timble     :   27   2018-03-24: 2274   2018-03-25T00:21:09Z:   15   Median :0.00000   Median :  0.0000   Median :   0.000  
 @chicagomargaret:   21   Margaret Holt    :   21   2018-03-26: 1504   2018-03-25T00:21:35Z:   15   Mean   :0.06192   Mean   :  0.3467   Mean   :   3.146  
 @sschrimp       :   18   Mark             :   21   2018-03-18: 1099   2018-03-25T00:21:08Z:   14   3rd Qu.:0.00000   3rd Qu.:  0.0000   3rd Qu.:   0.000  
 @loyolaforus    :   16   Steve            :   19   2018-03-27:  241   2018-03-25T00:21:11Z:   14   Max.   :1.00000   Max.   :591.0000   Max.   :5143.000  
 (Other)         :19994   (Other)          :19987   (Other)   : 1385   (Other)             :20097                                                          
    favorite                                  links      
 Min.   :    0.0   @RamblersMBB                  : 1139  
 1st Qu.:    0.0   #LoyolaChicago                : 1027  
 Median :    1.0   #SisterJean                   :  778  
 Mean   :   15.8   https://twitter.com#SisterJean:  231  
 3rd Qu.:    3.0   #LoyolaChicago; #MarchMadness :  208  
 Max.   :32180.0   (Other)                       :16117  
                   NA's                          :  687  

According the summary, the hashtags that were previously mentioned appear to be the most frequently tweeted. @RamblersMBB = 1139, #LoyolaChicago = 1027, and #SisterJean = 778

2C)Any recommendations to Loyola’s marketing team

Task 3: Watson Analysis


3A)Use watson analytics to explore the data

knitr::include_graphics("C:\\Users\\hp\\Documents\\Spring 2018\\BSAD 343H\\Labs\\Lab 9\\explore.png")

3B)Give at least 3 plots or discoveries using watson. Explain your findings.

knitr::include_graphics("C:\\Users\\hp\\Documents\\Spring 2018\\BSAD 343H\\Labs\\Lab 9\\img4.png")

knitr::include_graphics("C:\\Users\\hp\\Documents\\Spring 2018\\BSAD 343H\\Labs\\Lab 9\\img5.png")

knitr::include_graphics("C:\\Users\\hp\\Documents\\Spring 2018\\BSAD 343H\\Labs\\Lab 9\\img6.png")

The first figure identifies the number of retweets over the months in 2017. The graphs shoes that march had the most amount of retweets with a value of nearly 40,000. The second figure idenifies the most number of twitter replies using bubbles, which illustrates the most number of replies by the size of bubbles. The third figure shows another graph, wherein the number of reweets by verified users can be analyzed.

Overall, each figure demonstrates at least one common conclusion that March rendered the most amount of tweets, as suspected due to March Madness.

LS0tDQp0aXRsZTogIk1hcmNoIE1hZG5lc3MgQW5hbHlzaXMiDQphdXRob3I6IA0KLSAiUXVpbmxhbiBTY2hvb2wgb2YgQnVzaW5lc3MgLSBMb3lvbGEgVW5pdmVyc2l0eSBDaGljYWdvIg0KLSAiQ2hleWVubmUgUGVubnkiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCiAgaHRtbF9kb2N1bWVudDogZGVmYXVsdA0KZGF0ZTogIkFwcmlsIDksIDIwMTgiDQpzdWJ0aXRsZTogIkNNRSBHcm91cCBGb3VuZGF0aW9uIEJ1c2luZXNzIEFuYWx5dGljcyBMYWIiDQotLS0NCg0KDQoNCi0tLS0tLS0tLS0tLS0tDQoNCiMjIEFib3V0IHRoaXMgTm90ZWJvb2sNCg0KLS0tLS0tLS0tLS0tLS0NCg0KKiBPbiB0aGlzIG5vdGVib29rIHdlIGFyZSBnb2luZyB0byBhbmFseXNpcyB0d2VldHMgZnJvbSBtYXJjaCBtYWRuZXNzIDIwMTgNCg0KKiBVc2UgcmVndWxhciBleHByZXNzaW9uIHRvIGNsZWFuIHRoZSB0d2VldHMgdGV4dA0KDQoqIEZhbWlsaWFyaXplIHdpdGggc29tZSBuYXR1cmFsIGxhbmd1YWdlIHByb2Nlc3NpbmcgdG9vbHMNCg0KDQoNCi0tLS0tLS0tLS0tLS0tDQoNCiMjIEFuYWx5dGljcyBUb29sa2l0OiBSZXF1aXJlIFBhY2thZ2VzDQoNCi0tLS0tLS0tLS0tLS0tDQoNCg0KDQoqIHRpZHl2ZXJzZTogaHR0cHM6Ly93d3cudGlkeXZlcnNlLm9yZy8NCiogc3l1emhldDogaHR0cHM6Ly9naXRodWIuY29tL21qb2NrZXJzL3N5dXpoZXQNCiogY2xlYW5OTFA6IGh0dHBzOi8vZ2l0aHViLmNvbS9zdGF0c21hdGhzL2NsZWFuTkxQDQoqIHdvcmRjbG91ZDogaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL3dvcmRjbG91ZC93b3JkY2xvdWQucGRmDQoNCmBgYHtyICwgbWVzc2FnZT1GQUxTRX0NCg0KIyBIZXJlIHdlIGFyZSBjaGVja2luZyBpZiB0aGUgcGFja2FnZSBpcyBpbnN0YWxsZWQNCmlmKCFyZXF1aXJlKCJ0aWR5dmVyc2UiKSl7DQogIGluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIsIGRlcGVuZGVuY2llcyA9IFRSVUUpDQogIGxpYnJhcnkoInRpZHl2ZXJzZSIpDQp9DQoNCmlmKCFyZXF1aXJlKCJzeXV6aGV0Iikpew0KICBpbnN0YWxsLnBhY2thZ2VzKCJzeXV6aGV0IiwgZGVwZW5kZW5jaWVzID0gVFJVRSkNCiAgbGlicmFyeSgic3l1emhldCIpDQp9DQoNCmlmKCFyZXF1aXJlKCJjbGVhbk5MUCIpKXsNCiAgaW5zdGFsbC5wYWNrYWdlcygiY2xlYW5OTFAiLCBkZXBlbmRlbmNpZXMgPSBUUlVFKQ0KICBsaWJyYXJ5KCJjbGVhbk5MUCIpDQp9DQoNCmlmKCFyZXF1aXJlKCJtYWdyaXR0ciIpKXsNCiAgaW5zdGFsbC5wYWNrYWdlcygibWFncml0dHIiLCBkZXBlbmRlbmNpZXMgPSBUUlVFKQ0KICBsaWJyYXJ5KCJtYWdyaXR0ciIpDQp9DQoNCmlmKCFyZXF1aXJlKCJ3b3JkY2xvdWQiKSl7DQogIGluc3RhbGwucGFja2FnZXMoIndvcmRjbG91ZCIsIGRlcGVuZGVuY2llcyA9IFRSVUUpDQogIGxpYnJhcnkoIndvcmRjbG91ZCIpDQp9DQoNCmBgYA0KDQoNCg0KLS0tLS0tLS0tLS0tLS0NCg0KIyMgRGF0YSBQcmVwYXJhdGlvbjogQ2xlYW5pbmcgdHdlZXRzIHVzaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbnMNCg0KLS0tLS0tLS0tLS0tLS0NCg0KDQoNCiMjIyMgUmVhZGluZyBhbmQgaW5zcGVjdGluZyB0aGUgZGF0YXNldA0KYGBge3IsIG1lc3NhZ2U9RkFMU0V9DQp0d2VldHMgPC0gcmVhZF9jc3YoImRhdGEvbWFyY2hfbWFkbmVzcy5jc3YiKQ0KDQojIENoYW5nZSB0aGUgdHdlZXRzIElEcyBmcm9tIGxvbmdlIGludGVnZXIgdG8gY2hhcmFjdGVycw0KdHdlZXRzJHR3ZWV0X2lkIDwtIGFzLmNoYXJhY3Rlcih0d2VldHMkdHdlZXRfaWQpDQoNCiMgRXh0cmFjdCBhbmQgZGVsZXRlIHRoZSBsaW5rcyB2YXJpYWJsZSB0byBhZGQgaXQgYXQgdGhlIGVuZA0KbGlua3MgPC0gdHdlZXRzJGxpbmtzDQp0d2VldHMkbGlua3MgPC0gTlVMTA0KDQojIEluc3BlY3RzIHRoZSBmaXJzdCAxMCByb3dzDQpoZWFkKHR3ZWV0cykNCmBgYA0KDQoNCg0KIyMjIyBOb3cgZmlyc3Qgd2UgbmVlZCB0byBleHRyYWN0IHRoZSB0ZXh0IGZyb20gdGhlIHJhdyB0d2VldHMgYW5kIGNsZWFuIGl0IHVzaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbnMNCmBgYHtyfQ0KcmVwbGFjZV9yZWcgPC0gJ2h0dHBzOi8vdC5jby9bQS1aYS16XFxkXSt8aHR0cDovL1tBLVphLXpcXGRdK3wocGljLnR3aXR0ZXIuY29tL1tBLVphLXpcXGRdKyl8JmFtcDt8Jmx0O3wmZ3Q7fFJUfCguKi4pXFwuY29tKC4qLilcXFMrXFxzfFteWzphbG51bTpdXXwoaHR0cHxodHRwcylcXFMrXFxzKnwoI3xAKVxcUytcXHMqfFxcbnxcXCInDQoNCnR3ZWV0cyA8LSB0d2VldHMgJT4lIA0KICBtdXRhdGUodGV4dCA9IHN0cl9yZXBsYWNlX2FsbCh0ZXh0LCByZXBsYWNlX3JlZywgIiAiKSkgJT4lIA0KICBtdXRhdGUodGV4dCA9IGljb252KHRleHQsIGZyb20gPSAiQVNDSUkiLCB0byA9ICJVVEYtOCIsIHN1YiA9ICIgIikpDQoNCmhlYWQodHdlZXRzWyd0ZXh0J10pDQpgYGANCg0KDQoNCiMjIyMgSGVyZSB3ZSBhcmUgZ29pbmcgdG8gdXNlIHRoZSBTYWlmIE1vaGFtbWFk4oCZcyBOUkMgRW1vdGlvbiBsZXhpY29uIHRvZXh0cmFjdCB0aGUgc2VudGltZW50IG9mIHRoZSB0d2VldC4gVGhlIE5SQyBlbW90aW9uIGxleGljb24gaXMgYSBsaXN0IG9mIHdvcmRzIGFuZCB0aGVpciBhc3NvY2lhdGlvbnMgd2l0aCBlaWdodCBlbW90aW9ucyAoYW5nZXIsIGZlYXIsIGFudGljaXBhdGlvbiwgdHJ1c3QsIHN1cnByaXNlLCBzYWRuZXNzLCBqb3ksIGFuZCBkaXNndXN0KSBhbmQgdHdvIHNlbnRpbWVudHMgKG5lZ2F0aXZlIGFuZCBwb3NpdGl2ZSkuDQoNCiogU291cmNlOiBodHRwOi8vc2FpZm1vaGFtbWFkLmNvbS9XZWJQYWdlcy9OUkMtRW1vdGlvbi1MZXhpY29uLmh0bQ0KDQpgYGB7cn0NCm5yY19kYXRhIDwtIGdldF9ucmNfc2VudGltZW50KHR3ZWV0cyR0ZXh0KQ0KbnJjX2RhdGEgPC0gYXNfdGliYmxlKG5yY19kYXRhKQ0KDQpoZWFkKG5yY19kYXRhKQ0KYGBgDQoNCg0KDQojIyMjIEhlcmUgd2UgYXJlIGdvaW5nIHRvIG1lcmdlIHRoZSBOUkMgRW1vdGlvbiByZXN1bHRzIHdpdGggdGhlIG9yaWdpbmFsIGRhdGEgdG8gY3JlYXRlIGEgY29tcGxldGUgZGF0YXNldC4NCmBgYHtyfQ0KdHdlZXRzIDwtIGJpbmRfY29scyh0d2VldHMsIG5yY19kYXRhKQ0KDQpgYGANCg0KDQoNCiMjIyMgVG8gaGF2ZSBhbm90aGVyIG1ldHJpY3MgZm9yIHNlbXRpbWVudCB3ZSBhcmUgZ29pbmcgdG8gdXNlIGFub3RoZXIgbGV4aWNvbiBkZXZlbG9wZWQgYnkgUHJvZmVzc29yIE1pbnFpbmcgSHUgYW5kIFByb2Zlc3NvciBCaW5nIExpdSwgZnJvbSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIGF0IENoaWNhZ28uDQoqIFNvdXJjZTogaHR0cDovL3d3dy5jcy51aWMuZWR1L35saXViL0ZCUy9zZW50aW1lbnQtYW5hbHlzaXMuaHRtbA0KDQpgYGB7cn0NCnR3ZWV0cyRzZW50aW1lbnRfYmluZyA8LSBnZXRfc2VudGltZW50KGNoYXJfdiA9IHR3ZWV0cyR0ZXh0LCBtZXRob2Q9ImJpbmciLCBsYW5ndWFnZSA9ICJlbmdsaXNoIikNCg0KYGBgDQoNCg0KDQojIyMjIEZpbmFsbHkgYWRkIHRoZSBsaW5rcyB2YXJpYWJsZSBhbmQgc2F2ZSB0aGUgbmV3IGNvbXBsZXRlIGRhdGFzZXQgDQpgYGB7cn0NCnR3ZWV0cyRsaW5rcyA8LSBsaW5rcw0KDQp3cml0ZV9jc3YodHdlZXRzLCAiZGF0YS9tYXJjaF9tYWRuZXNzX3NlbnQuY3N2IikNCg0KaGVhZCh0d2VldHNbMzoxMF0pDQpgYGANCg0KDQoNCi0tLS0tLS0tLS0tLS0tDQoNCiMjIFNlbnRpbWVudCBBbmFseXNpczogTmF0dXJhbCBMYW5ndWFnZSBQcm9jZXNzaW5nDQoNCi0tLS0tLS0tLS0tLS0tDQoNCg0KDQojIyMjIEZpcnN0IGxldHMgcmVhZCB0aGUgZGF0YXNldCBhbmQgaW5zcGVjdCB0aGUgZmlyc3QgMTAgcm93cw0KYGBge3IsIG1lc3NhZ2U9RkFMU0V9DQp0d2VldHMgPC0gcmVhZF9jc3YoImRhdGEvc2VudGltZW50X21hcmNoX21hZG5lc3MuY3N2IikNCnR3ZWV0cyR0d2VldF9pZCA8LSBhcy5jaGFyYWN0ZXIodHdlZXRzJHR3ZWV0X2lkKQ0KaGVhZCh0d2VldHNbMTI6MjFdKQ0KYGBgDQoNCg0KDQojIyMjIEZvciBzZW50aW1lbnQgYW5hbHlzaXMgd2UgYXJlIGdvaW5nIHRvIHVzZSB0aGUgY2xlYW5OTFAgcGFja2FnZSB0aGF0IHVzZXMgU3RhbmZvcmQgQ29yZU5MUCDigJMgTmF0dXJhbCBsYW5ndWFnZSBzb2Z0d2FyZSBpbnQgaGUgYmFja2VuZC4gRmlyc3Qgd2UgbmVlZCB0byBpbml0aWFsaXplIHRoZSBDb3JlTkxQIGVuZ2luZSBhbmQgY3JlYXRlIGFuIGFubm90YXRpb24gb2JqZWN0IHVzaW5nIHRoZSB0ZXh0IGNvbHVtbiwgdHdlZXRfaWQgYW5kIHRoZSBvdGhlciBjb2x1bW5zIGFyZSBnaXZlbiBhcyBtZXRhZGF0YQ0KYGBge3J9DQpjbmxwX2luaXRfdWRwaXBlKCkNCg0KZG9jIDwtIGNubHBfYW5ub3RhdGUoaW5wdXQgPSB0d2VldHMkdGV4dCwgYXNfc3RyaW5ncyA9IFRSVUUsIGRvY19pZHMgPSB0d2VldHMkdHdlZXRfaWQsIG1ldGEgPSB0d2VldHNbLWMoMSwyKV0pDQoNCmBgYA0KDQoNCg0KIyMjIyBEaXN0cmlidXRpb24gb2YgdHdlZXQvc2VudGVuY2UgbGVuZ3RoLCBtYXggbnVtYmVyIG9mIHdvcmtzIGluIGEgdHdlZXQgMjgwDQpgYGB7cn0NCnRva2VucyA8LSBjbmxwX2dldF90b2tlbihkb2MpICU+JQ0KICBncm91cF9ieShpZCwgc2lkKSAlPiUNCiAgc3VtbWFyaXplKHNlbnRfbGVuID0gbigpKQ0KDQpxdWFudGlsZSh0b2tlbnMkc2VudF9sZW4sIHNlcSgwLDEsMC4xKSkNCg0KYGBgDQoNCg0KDQojIyMjIEhlcmUgd2UgY2FuIHNlZSB0aGUgY2hhbmdlIG9mIHNlbnRpbWVudCBpbiB0aGUgdHdlZXRzIA0KYGBge3J9DQpxcGxvdCh4ID0gMTpsZW5ndGgodHdlZXRzJHNlbnRpbWVudF9iaW5nKSwgDQogICAgICB5ID0gdHdlZXRzJHNlbnRpbWVudF9iaW5nLCANCiAgICAgIGdlb20gPSAibGluZSIsIA0KICAgICAgeGxhYiA9ICJOYXJyYXRpdmUgVGltZSIsIA0KICAgICAgeWxhYiA9ICJFbW90aW9uYWwgVmFsZW5jZSIsIA0KICAgICAgbWFpbiA9ICJUd2VldHMgU2VudGltZW50IFRyYWplY3RvcnkiKQ0KDQpgYGANCg0KDQoNCiMjIyMgSGVyZSB3ZSBjYW4gZmluZCB0aGUgbW9zdCB1c2VkIGVudGl0aWVzIGZyb20gdGhlIHR3ZWV0cyBlbnRpdHkgdGFibGUuIFRoZSBkb2N1bWVudCBjb3JwdXMgeWllbGRzIGFuIGFsdGVybmF0aXZlIHdheSB0byBzZWUgdGhlIHVuZGVybHlpbmcgdG9waWNzLg0KYGBge3J9DQp0d2VldHNfZW50aXRpZXMgPC0gY25scF9nZXRfdG9rZW4oZG9jKSAlPiUNCiAgZmlsdGVyKHVwb3MgPT0gIk5PVU4iKSAlPiUNCiAgZ3JvdXBfYnkobGVtbWEpICU+JQ0KICBzdW1tYXJpemUoY291bnQgPSBuKCkpICU+JQ0KICB0b3BfbihuID0gODAsIGNvdW50KSAlPiUNCiAgYXJyYW5nZShkZXNjKGNvdW50KSkgJT4lDQogIHVzZV9zZXJpZXMobGVtbWEpDQoNCmRhdGFfZnJhbWUodHdlZXRzX2VudGl0aWVzKQ0KDQpgYGANCg0KDQoNCiMjIyMgSGVyZSB3ZSBjcmVhdGluZyBhIGhpZ2gtbGV2ZWwgc3VtbWFyeSBvZiB0aGUgdHdlZXRzIHRleHQgYnkgZXh0cmFjdGluZyBhbGwgZGlyZWN0IG9iamVjdCBvYmplY3QtZGVwZW5kZW5jaWVzLg0KYGBge3J9DQp0d2VldHNfc3VtbWFyeSA8LSBjbmxwX2dldF9kZXBlbmRlbmN5KGRvYywgZ2V0X3Rva2VuID0gVFJVRSkgJT4lDQogIGxlZnRfam9pbihjbmxwX2dldF9kb2N1bWVudChkb2MpKSAlPiUNCiAgc2VsZWN0KGlkID0gaWQsIHN0YXJ0ID0gd29yZCwgd29yZCA9IGxlbW1hX3RhcmdldCkgJT4lDQogIGxlZnRfam9pbih3b3JkX2ZyZXF1ZW5jeSkgJT4lDQogIGZpbHRlcihmcmVxdWVuY3kgPCAwLjAwMDEpICU+JQ0KICBzZWxlY3QoaWQsIHN0YXJ0LCB3b3JkKSAlJCUNCiAgc3ByaW50ZigiJXMgPT4gJXMiLCBzdGFydCwgd29yZCkNCg0KZGF0YV9mcmFtZSh0d2VldHNfc3VtbWFyeSkNCg0KYGBgDQoNCg0KDQojIyMjIExvb2sgYXQgdGhlIHR3ZWV0cyB3aXRoIG5lZ2F0aXZlIHNlbnRpbWVudCANCmBgYHtyfQ0KDQphbmdyeV90d2VldHMgPC0gd2hpY2godHdlZXRzJGFuZ2VyID4gMCkNCmRhdGFfZnJhbWUodHdlZXQgPSB0d2VldHMkdGV4dFthbmdyeV90d2VldHNdWzE6Ml0pDQoNCmBgYA0KDQoNCg0KIyMjIyBMb29rIGEgdHdlZXRzIHdpdGggcG9zaXRpdmUgc2VudGltZW50DQpgYGB7cn0NCmpveV90d2VldHMgPC0gd2hpY2godHdlZXRzJGpveSA+IDApDQpkYXRhX2ZyYW1lKHR3ZWV0ID0gdHdlZXRzJHRleHRbam95X3R3ZWV0c11bNTo3XSkNCg0KYGBgDQoNCg0KDQojIyMjIExldHMgZXhwbG9yZSB0aGUgZW1vdGlvbnMgaW4gdGhlIHR3ZWV0cyBtb3JlIGluLWRlcHRoLiBIZXJlIHdlIGFyZSBnb2luZyB0byBleHRyYWN0IHRoZSB2YXJpYWJsZXMgcmVnYXJkaW5nIGVtb3Rpb25zIGFuZCBjcmVhdGUgYSBzdWJzZXQuDQpgYGB7cn0NCnZhbHVlIDwtIGFzLmRvdWJsZShjb2xTdW1zKHByb3AudGFibGUodHdlZXRzWywgMTE6MThdKSkpDQplbW90aW9uIDwtIG5hbWVzKHR3ZWV0cylbMTE6MThdDQplbW90aW9uIDwtIGZhY3RvcihlbW90aW9uLCBsZXZlbHMgPSBuYW1lcyh0d2VldHMpWzExOjE4XVtvcmRlcih2YWx1ZSwgZGVjcmVhc2luZyA9IEZBTFNFKV0pDQplbW90aW9ucyA8LSBkYXRhX2ZyYW1lKGVtb3Rpb24sIHBlcmNlbnQgPSB2YWx1ZSAqIDEwMCkNCg0KaGVhZChlbW90aW9ucykNCmBgYA0KDQoNCg0KIyMjIyBOb3cgd2UgY2FuIGNyZWF0ZSBhIHBsb3Qgb2YgdGhlIGVtb3Rpb25zIGluIHRoZSBtYXJjaCBtYWRuZXNzIHR3ZWV0cw0KYGBge3J9DQpnZ3Bsb3QoZGF0YSA9IGVtb3Rpb25zLCBhZXMoeCA9IGVtb3Rpb24sIHkgPSBwZXJjZW50KSkgKyANCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGFlcyhmaWxsID0gZW1vdGlvbikpICsgDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGU9IlJkWWxHbiIpICsgDQogIGNvb3JkX2ZsaXAoKSArDQogIHhsYWIoIkVtb3Rpb24iKSArDQogIHlsYWIoIlBlcmNlbnRhZ2UiKQ0KDQpgYGANCg0KDQoNCi0tLS0tLS0tLS0tLS0tDQoNCiMjIFJlcG9ydGluZzogQSBXb3JkY2xvdWQgZnJvbSBNYXJjaCBNYWRuZXNzIFR3ZWV0cw0KDQotLS0tLS0tLS0tLS0tLQ0KDQoNCg0KIyMjIyBXb3JkY2xvdWRzIGFyZSBhbHdheXMgYSBmdW4gYW5kIGVuZ2FnaW5nIHdheSB0byBkaXNwbGF5IGRhdGEuIEhlcmUgd2UgYXJlIGdvaW5nIHRvIHNldCBzb21lIHN0b3Agd29yZHMgdGhhdCB3ZSBkb250IHdhbnQgaW4gdGhlIHBsb3QuDQpgYGB7cn0NCnJlbW92ZV93b3JkcyA8LSBjKCAidHdpdHRlciIsICJjaGljYWdvIiwgImxveW9sYSIsICJyYW1ibGVycyIsICJsb3lvbGFyYW1ibGVycyIsInNjaG9vbCIsICJnb25uYSIsDQogICAgICAgICAgICAgICAgICAgInVuaXZlcnNpdHkiLCAibHVjIiwgImxveW9sYWNoaWNhZ28iICwgInJhbWJsZXJzbWJiIiwgIm5jYWEiLCJ2ZSIsImJhc2tldGJhbGwiICwNCiAgICAgICAgICAgICAgICAgICAidW1pY2hiYmFsbCIsICJtYXJjaG1hZG5lc3MyMDE4IiwgIm1hcmNobWFkbmVzcyIsICJmaW5hbCIsICJtYXJjaG1hZGRuZXNzIiwNCiAgICAgICAgICAgICAgICAgICAiZ29ibHVlIiwgImZpbmFsZm91ciIsICJzaXN0ZXJqZWFuIiwgIm5jYWF0b3VybmFtZW50IiwgIm5jYWF0b3VybmFtZW50MjAxOCIsDQogICAgICAgICAgICAgICAgICAgImRpZG4iLCJjaXR5IiwgImhleSIsICJkYXkiLCAiY29sbGVnZSIsICJnYW1lcyIsICJ0b3VybmV5IiwgIm1hcmNoIiwgImdhbWUiKQ0KDQpteV9zdG9wX3dvcmRzIDwtIGJpbmRfcm93cyhkYXRhX2ZyYW1lKHdvcmQgPSByZW1vdmVfd29yZHMsIGxleGljb24gPSBjKCJTTUFSVCIpKSwgc3RvcF93b3JkcykNCg0KYGBgDQoNCg0KDQojIyMjIE5vdyBsZXRzIGNyZWF0ZSBhIGRhdGFmcmFtZSBvZiB3b3JkcyBhbmQgZmlsdGVyIHVzaW5nIHByZWRlZmluZWQgc3RvcCB3b3JkcyANCmBgYHtyfQ0KdHd0X3RleHQgPC0gdGliYmxlKHRleHQgPSB0d2VldHMkdGV4dCkgJT4lIA0KICB1bm5lc3RfdG9rZW5zKHdvcmQsIHRleHQpICU+JQ0KICBmaWx0ZXIoIXdvcmQgJWluJSBteV9zdG9wX3dvcmRzJHdvcmQsIHN0cl9kZXRlY3Qod29yZCwgIlthLXpdIikpDQoNCmBgYA0KDQoNCg0KIyMjIyBTZXQgYSB0aHJlc2hvbGQgZm9yIHRoZSBtaW4vbWF4IGZyZXF1ZW5jeSBvZiB3b3JkcyBhbmQgc2NhbGUgb2YgdGhlIHdvcmRjbG91ZA0KYGBge3J9DQptaW5fZnJlcSA9IDgwDQptYXhfd29yZHMgPSAxMDANCmZpZ19zY2FsZSA9IGMoMyAsIDAuNSkNCmBgYA0KDQoNCg0KIyMjIyBUaGUgbGFzdCBzdGVwIGlzIHRvIGNyZWF0ZSB0aGUgd29yZGNsb3VkIGJ5IGNvdW50aW5nIHRoZSBmcmVxdWVuY3kgb2YgdGhlIHdvcmRzDQpgYGB7ciwgbWVzc2FnZT1GQUxTRX0NCnR3dF90ZXh0ICU+JQ0KICBhbnRpX2pvaW4obXlfc3RvcF93b3JkcykgJT4lDQogIGNvdW50KHdvcmQpICU+JQ0KICB3aXRoKHdvcmRjbG91ZCh3b3JkLCBuLCANCiAgICAgICAgICAgICAgICAgc2NhbGUgPSBmaWdfc2NhbGUsDQogICAgICAgICAgICAgICAgIG1pbi5mcmVxID0gbWluX2ZyZXEsDQogICAgICAgICAgICAgICAgIG1heC53b3JkcyA9IG1heF93b3JkcykpDQoNCmBgYA0KDQoNCi0tLS0tLS0tLS0tLS0NCg0KIyMgVGFzayAxOiBEYXRhIEV4cGxvcmF0aW9uIC0gVGFibGVhdQ0KDQotLS0tLS0tLS0tLS0tDQoNCiMjIyAxQSkgR2VuZXJhbGx5IGRlc2NyaWJlIHRoZSBkYXRhIChzdW1tYXJ5KQ0KVGhlIGRhdGEgd2UgYXJlIHVzaW5nIGhhcyBjb2x1bW5zIHN1Y2ggYXMgZGF0ZSwgdmVyaWZpZWQsIHJlcGx5LCB0ZXh0LCBsaW5rcyBldGMuIHdoaWNoIGFyZSBhbGwgZmVhdHVyZXMgb2YgdGhlIFR3aXR0ZXIgYXBwbGljYXRpb24uIA0KDQpgYGB7cn0NCm15ZGF0YSA8LSByZWFkLmNzdigiQzpcXFVzZXJzXFxocFxcRG9jdW1lbnRzXFxTcHJpbmcgMjAxOFxcQlNBRCAzNDNIXFxMYWJzXFxMYWIgOVxcMDktbm90ZWJvb2stbGFiXFxkYXRhXFxtYXJjaF9tYWRuZXNzLmNzdiIpDQpzdW1tYXJ5KG15ZGF0YSkNCmBgYA0KDQoNCiMjIyAxQikgVXNlIHRhYmxlYXUgdG8gY3JlYXRlIGF0IGxlYXN0IDUgcGxvdHMNCg0KYGBge3J9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiQzpcXFVzZXJzXFxocFxcRG9jdW1lbnRzXFxTcHJpbmcgMjAxOFxcQlNBRCAzNDNIXFxMYWJzXFxMYWIgOVxcaW1nMS5wbmciKQ0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIkM6XFxVc2Vyc1xcaHBcXERvY3VtZW50c1xcU3ByaW5nIDIwMThcXEJTQUQgMzQzSFxcTGFic1xcTGFiIDlcXGltZzIucG5nIikNCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJDOlxcVXNlcnNcXGhwXFxEb2N1bWVudHNcXFNwcmluZyAyMDE4XFxCU0FEIDM0M0hcXExhYnNcXExhYiA5XFxpbWczLnBuZyIpDQoNCmBgYA0KDQoNCiMjIyAxQykgRXhwbGFpbiBlYWNoIHBsb3QgbWFrZSBhIHJlbGF0aW9uIHRvIGRhdGUgb2YgdGhlIHR3ZWV0cy90aW1lDQoNClRoZSBmaXJzdCBmaWd1cmUgaWxsdXN0cmF0ZXMgdGhlIG51bWJlciBvZiByZWNvcmRzIGdyYXBoaWNhbGx5IGFuZCBpbiBhIHRhYmxlLiBJdCBhcHBlYXJzIE1hcmNoIGhhZCB0aGUgbW9zdCBhbW91bnQgb2YgdHdlZXRzIGZyb20gdGhpcyBzZXQgb2YgZGF0YS4gDQpUaGUgc2Vjb25kIGZpZ3VyZSBpbGx1c3RyYXRlcyBob3cgbWFueSBvZiB0aG9zZSB0d2VldHMgd2VyZSBlaXRoZXIgdmVyaWZpZWQsIHJldHdlZXRlZCwgb3IgZmF2b3JpdGVkLCBhbmQgdGhlIHRpbWUgb2YgZGF5IHR3ZWV0cyB3ZXJlIG1vc3QgYWN0aXZlLg0KVGhlIHRoaXJkIGZpZ3VyZSBmdXJ0aGVyIGRpc3Rpbmd1aXNoZXMgdGhlIHR3ZWV0IGZlYXR1cmVzIGluIHRlcm1zIG9mIG51bWJlciBvZiB0d2VldHMsIGFuZCB0aGUgc3BoZXJpY2FsIGZpZ3VyZSBzaG93cyB0aGUgZnJlcXVlbmN5IG9mIGxpbmtzIHdoZXJlYnkgdGhlIG1vcmUgYSBoYXNodGFnIHdhcyB0d2VldGVkLCB0aGUgYmlnZ2VyIHRoZSBjaXJjbGUuIA0KLS0tLS0tLS0tLS0tLQ0KDQojIyBUYXNrIDM6IERhdGEgQW5hbHlzaXMNCg0KLS0tLS0tLS0tLS0tLQ0KDQojIyMgMkEpQmFzZWQgb24geW91ciBwbG90cyBhbmQgZGF0YSBkZXNjcmlwdGlvbiBtYWtlIGdpdmUgYSBnZW5lcmFsIG5hcnJhdGl2ZSBmb3IgdGhlIGltYWdlIG9mIGxveW9sYSBpbiB0d2l0dGVyDQoNClVwb24gbG9va2luZyBhdCB0aGUgbW9zdCBmcmVxdWVudCBsaW5rcy9oYXNodGFncywgaXQgYXBwZWFycyAjbG95b2xhY2hpY2Fnbywjc2lzdGVyamVhbiBhbmQgQFJhbWJsZXJNQkIgYXJlIHRoZSBtb3N0IHR3ZWV0ZWQgaGFzaHRhZ3MsIGdpdmluZyBMb3lvbGEgYSBwb3NpdGl2ZSBpbWFnZS4gDQojIyMgMkIpIFVzZSBkZXNjcmlwdGl2ZSBzdGF0aXN0aWNzIHRvIGJhY2t1cCB5b3VyIGFyZ3VtZW50cw0KDQoNCmBgYHtyfQ0Kc3VtbWFyeShteWRhdGEpDQpgYGANCkFjY29yZGluZyB0aGUgc3VtbWFyeSwgdGhlIGhhc2h0YWdzIHRoYXQgd2VyZSBwcmV2aW91c2x5IG1lbnRpb25lZCBhcHBlYXIgdG8gYmUgdGhlIG1vc3QgZnJlcXVlbnRseSB0d2VldGVkLiBAUmFtYmxlcnNNQkIgPSAxMTM5LCAjTG95b2xhQ2hpY2FnbyA9IDEwMjcsIGFuZCAjU2lzdGVySmVhbiA9IDc3OA0KDQojIyMgMkMpQW55IHJlY29tbWVuZGF0aW9ucyB0byBMb3lvbGEncyBtYXJrZXRpbmcgdGVhbQ0KCQ0KU2VlaW5nIGFzIHRoZXNlIGhhc2h0YWdzIHdlcmUgdGhlIG1vc3QgcG9wdWxhciwgSSB3b3VsZCByZWNvbW1lbmQgdGhlIExveW9sYSBtYXJrZXRpbmcgdGVhbSB0byBmaW5kIHdoZXJlIGFuZCB3aG8gcG9zdGVkIHRoZXNlIHR3ZWV0cy4gVGhpcyB3aWxsIGdpdmUgdGhlIHRlYW0gYW4gaWRlYSBvZiBob3cgZmFyIHJlYWNoaW5nIExveW9sYSdzIG5hbWUgaGFzIGV4dGVuZGVkLiBJZiBpdCdzIG1vc3RseSBjZW50ZXJlZCBhcm91bmQgdGhlIExveW9sYSBjYW1wdXNlcywgdGhpcyB3b3VsZCBtZWFuIHRoZXkgc2hvdWxkIHRhcmdldCBtb3JlIGFkdmVydGlzaW5nIHRvd2FyZHMgTG95b2xhIGFuZCBTaXN0ZXIgSmVhbiByZWxhdGVkIG1hcmtldGluZyB0b29scyBmcm9tIGFwcGFyZWwgdG8gYWN0aXZpdGllcy4gSWYgdGhlc2UgaGFzaHRhZ3MgYXJlIHNlZW4gb3V0c2lkZSBvZiB0aGUgYXJlYXMgb2YgTG95b2xhIGNhbXB1cywgdGhlIG1hcmtldGluZyB0ZWFtIGNhbiBmaW5kIHdheXMgb2YgYWR2ZXJ0aXNpbmcgcHJvbW9zIGFib3V0IExveW9sYSBVbml2ZXJzaXR5IHRvIHRoZW0uIA0KLS0tLS0tLS0tLS0tLQ0KDQojIyBUYXNrIDM6IFdhdHNvbiBBbmFseXNpcw0KDQotLS0tLS0tLS0tLS0tDQoNCiMjIyAzQSlVc2Ugd2F0c29uIGFuYWx5dGljcyB0byBleHBsb3JlIHRoZSBkYXRhDQpgYGB7cn0NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJDOlxcVXNlcnNcXGhwXFxEb2N1bWVudHNcXFNwcmluZyAyMDE4XFxCU0FEIDM0M0hcXExhYnNcXExhYiA5XFxleHBsb3JlLnBuZyIpDQoNCmBgYA0KDQoNCg0KIyMjIDNCKUdpdmUgYXQgbGVhc3QgMyBwbG90cyBvciBkaXNjb3ZlcmllcyB1c2luZyB3YXRzb24uIEV4cGxhaW4geW91ciBmaW5kaW5ncy4NCg0KYGBge3J9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiQzpcXFVzZXJzXFxocFxcRG9jdW1lbnRzXFxTcHJpbmcgMjAxOFxcQlNBRCAzNDNIXFxMYWJzXFxMYWIgOVxcaW1nNC5wbmciKQ0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIkM6XFxVc2Vyc1xcaHBcXERvY3VtZW50c1xcU3ByaW5nIDIwMThcXEJTQUQgMzQzSFxcTGFic1xcTGFiIDlcXGltZzUucG5nIikNCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJDOlxcVXNlcnNcXGhwXFxEb2N1bWVudHNcXFNwcmluZyAyMDE4XFxCU0FEIDM0M0hcXExhYnNcXExhYiA5XFxpbWc2LnBuZyIpDQoNCg0KDQpgYGANCg0KDQpUaGUgZmlyc3QgZmlndXJlIGlkZW50aWZpZXMgdGhlIG51bWJlciBvZiByZXR3ZWV0cyBvdmVyIHRoZSBtb250aHMgaW4gMjAxNy4gVGhlIGdyYXBocyBzaG9lcyB0aGF0IG1hcmNoIGhhZCB0aGUgbW9zdCBhbW91bnQgb2YgcmV0d2VldHMgd2l0aCBhIHZhbHVlIG9mIG5lYXJseSA0MCwwMDAuIA0KVGhlIHNlY29uZCBmaWd1cmUgaWRlbmlmaWVzIHRoZSBtb3N0IG51bWJlciBvZiB0d2l0dGVyIHJlcGxpZXMgdXNpbmcgYnViYmxlcywgd2hpY2ggaWxsdXN0cmF0ZXMgdGhlIG1vc3QgbnVtYmVyIG9mIHJlcGxpZXMgYnkgdGhlIHNpemUgb2YgYnViYmxlcy4NClRoZSB0aGlyZCBmaWd1cmUgc2hvd3MgYW5vdGhlciBncmFwaCwgd2hlcmVpbiB0aGUgbnVtYmVyIG9mIHJld2VldHMgYnkgdmVyaWZpZWQgdXNlcnMgY2FuIGJlIGFuYWx5emVkLiANCg0KT3ZlcmFsbCwgZWFjaCBmaWd1cmUgZGVtb25zdHJhdGVzIGF0IGxlYXN0IG9uZSBjb21tb24gY29uY2x1c2lvbiB0aGF0IE1hcmNoIHJlbmRlcmVkIHRoZSBtb3N0IGFtb3VudCBvZiB0d2VldHMsIGFzIHN1c3BlY3RlZCBkdWUgdG8gTWFyY2ggTWFkbmVzcy4NCg==