Part1 - US Presidential Speeches
mycorpus1 <- corpus_subset(data_corpus_inaugural,Year > 1856 & Year < 1870)
myDfm1 <- dfm(mycorpus1 , remove = stopwords("english"), tolower = TRUE, stem = TRUE,
remove_punct = TRUE, remove_numbers=TRUE)
Construct the frequency graph
americanFreq1 <- data.frame(
list(
document = rownames(myDfm1 [, 'constitut']),
frequency1 = unname(as.matrix(myDfm1 [, 'constitut'])),
frequency2 = unname(as.matrix(myDfm1 [, 'slave'])),
frequency3 = unname(as.matrix(myDfm1 [, 'state'])),
frequency4 = unname(as.matrix(myDfm1 [, 'govern']))
))
ggplot(americanFreq1) +
geom_point(aes(x=document,y=frequency1,colour = "constitut*")) +
geom_point(aes(x=document,y=frequency2,colour = "slave")) +
geom_point(aes(x=document,y=frequency3,colour = "state")) +
geom_point(aes(x=document,y=frequency4,colour = "govern")) +
theme(axis.text.x = element_text(angle=90, hjust=1))

Based on the topfeatures of the document-term matrix, I chose to graph the frequency of [constitut*], [state], [govern]. On the other hand, Based on the history of USA in that time period, I also graphed the frequency of the word - slave.
As the graph above, the frequency of the term [slave] was high especially in Lincoln’s speech in 1861. However, the word [constitut*] was in fact the most frequent term among those words I chose in Lincoln’s speech in 1861. Since the length of speech was different, I constructed the relative frequency of those words as well.
Construct the relative frequency graph
relDfm1 <- dfm_weight(myDfm1 , scheme = c("prop"))*100
relamericanFreq1 <- data.frame(
list(
document = rownames(relDfm1 [, 'constitut']),
frequency1 = unname(as.matrix(relDfm1 [, 'constitut'])),
frequency2 = unname(as.matrix(relDfm1 [, 'slave'])),
frequency3 = unname(as.matrix(relDfm1 [, 'state'])),
frequency4 = unname(as.matrix(relDfm1 [, 'govern']))
))
ggplot(relamericanFreq1) +
geom_point(aes(x=document,y=frequency1,colour = "constitut*")) +
geom_point(aes(x=document,y=frequency2,colour = "slave")) +
geom_point(aes(x=document,y=frequency3,colour = "state")) +
geom_point(aes(x=document,y=frequency4,colour = "govern")) +
theme(axis.text.x = element_text(angle=90, hjust=1))

The relative frequency graph is slightly different with the previous graph. We could see now the term [slave] was highly used in the speech in 1865, which was during the wartime. The word [govern] was the only consistently used word in those speeches.
This graph also showed that the word choices were influenced by the length of speech. The most used words of all corpus were not so frequently used in two short speeches (1865 and 1869).
Construct the wordcloud
textplot_wordcloud(myDfm1 , min_termfreq = 30,
colors=brewer.pal(10,"Set1"),
title.size=1,
comparison = TRUE)

After the graph of frequency, I also tried to graph the wordcloud of those speeches. The words in red were based on the Buchnan’s speech in 1857, which is the title next to those red words on the graph, the following 3 speeches were graphed in blue, green, purple in order.
In this graph, we can see the word [war] was highly used in the 1865 Lincoln’s speech.
Part2 (1) - Irish Party Manifestoes
setwd("~/Desktop/r/polimetrics/IE")
myText2 <- readtext("~/Desktop/r/polimetrics/IE/*.txt",
docvarsfrom = "filenames", dvsep = " ", docvarnames = c("Year", "Party"))
testCorpus2 <- corpus(myText2)
testCorpus2 <- corpus(myText2, docid_field = "doc_id")
docnames(testCorpus2) <- gsub(".txt", "", docnames(testCorpus2 ))
myDfm2 <- dfm(testCorpus2 , remove = stopwords("english"), tolower = TRUE, stem = TRUE,
remove_punct = TRUE, remove_numbers=TRUE)
ws2 <- textmodel_wordscores(myDfm2, c(4.5,13.13,15,6.88,17.63,rep(NA,5)))
Predict
pr_raw2 <- predict(ws2, newdata = myDfm2[c(6,7,8,9,10), ])
pr_lbg2_2 <- predict(ws2, rescaling = "lbg", newdata = myDfm2[c(6,7,8,9,10), ], interval = "confidence")
Graph of raw score
df1 <- as.data.frame(pr_raw2)
colnames(df1) <- c("V1")
df1$party <- myText2$Party[1:5]
df1$title <- rownames(df1)
df1$order <- c(1:5)
df1$title <- with(df1, reorder(title,order))
ggplot(df1,aes(title,V1,color = party)) +
geom_point() +
xlab("Title")+
ylab("Score")

Graph of LBG with reference points
df2 <- as.data.frame(pr_lbg2_2$fit)
colnames(df2) <- c("V1","V2","V3")
df2$g <- "pr"
df2$party <- myText2$Party[1:5]
df2_ref <- data.frame(
value1 = c(4.5,13.13,15,6.88,17.63),
value2 = c(4.5,13.13,15,6.88,17.63),
value3 = c(4.5,13.13,15,6.88,17.63)
)
rownames(df2_ref) <- docnames(testCorpus2)[1:5]
colnames(df2_ref) <- c("V1","V2","V3")
df2_ref$g <- "ref"
df2_ref$party <- myText2$Party[1:5]
df2_new <- data.frame(V1=NA,V2=NA,V3=NA,g=NA,party=NA)
for(i in 1:5){
df2_new <- as.data.frame(rbind(df2_new,df2_ref[i,],df2[i,]))
}
df2_new <- as.data.frame(df2_new[2:11,])
df2_new$title <- rownames(df2_new)
df2_new$order <- c(1:10)
df2_new$title <- with(df2_new, reorder(title,order))
ggplot(df2_new,aes(title,V1,color = party)) +
geom_point() +
geom_errorbar(aes(ymin=V2,ymax=V3)) +
xlab("Title")+
ylab("Score")

Comparing the raw scores and the transformed scores, the LBG scores were more convincing, since the reference scores were skewed and the variation was high. In the transformed graph, the shifts on social position of FF party and DL party were revealed.
PS: After the transformation of raw scores, we could see that their positions on the social scale changed.According to the Wikipedia, between the two elections in 1992 and 1997, the coalitions changed. What I found out was the coalitions did not quite depend on the social position. The importance was the majority of coalition.
Part2 (2) - Reagan v.s. Trump
presDfm <- dfm(corpus_subset(data_corpus_inaugural, Year > 1980),
remove = stopwords("english"), stem = TRUE, remove_punct = TRUE)
Original
ws_pres <- textmodel_wordscores(presDfm, c(1, NA, NA, 0, NA, NA, NA, -1, NA, NA))
pr_all_pres <- predict(ws_pres)
New
ws_pres2 <- textmodel_wordscores(presDfm, c(NA, NA, NA, 0, NA, NA, NA, -1, NA, 1))
pr_all_pres2 <- predict(ws_pres2)
Graph the prediction
pr_all <- as.data.frame(cbind(pr_all_pres,pr_all_pres2))
pr_all$title <- rownames(pr_all)
pr_all$order <- c(10:1)
pr_all$title <- with(pr_all,reorder(title,order))
ggplot(pr_all,aes(y=title,x=pr_all_pres)) +
geom_point(aes(pr_all_pres,color="Reagan as 1")) +
geom_point(aes(pr_all_pres2,color="Trump as 1")) +
xlab("Score") +
ylab("Title")

As the graph above, the position of 1981-Reagan and 2017-Trump changed due to the change of reference text undoubtedly. However, we could also find out the speech scores of all the other presidents were a little bit higher when we assumed 1981-Reagan as 1 in reference scores. The implication is that the context of Trump’s speech was more different from other’s speeches according to the scores.
LS0tCnRpdGxlOiAiSG9tZSBBc3NpZ25tZW50IDEiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KIyMjTmFtZTogWWVuIENoZW5nIEhzdWFuCiMjI1N0dWRlbnQgSUQ6IDFBMTgyOTAxLTIKI1BhY2thZ2UrU2V0dXAKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnJtKGxpc3Q9bHMoYWxsPVRSVUUpKQpzZXR3ZCgifi9EZXNrdG9wL1IvcG9saW1ldHJpY3MiKQoKbGlicmFyeShSQ29sb3JCcmV3ZXIpCmxpYnJhcnkocmVhZHRleHQpCmxpYnJhcnkocXVhbnRlZGEpCmxpYnJhcnkoZ2dwbG90MikKYGBgCiNQYXJ0MSAtIFVTIFByZXNpZGVudGlhbCBTcGVlY2hlcwpgYGB7ciwgd2FybmluZz1GQUxTRX0KbXljb3JwdXMxIDwtIGNvcnB1c19zdWJzZXQoZGF0YV9jb3JwdXNfaW5hdWd1cmFsLFllYXIgPiAxODU2ICYgWWVhciA8IDE4NzApCgpteURmbTEgPC0gZGZtKG15Y29ycHVzMSAsIHJlbW92ZSA9IHN0b3B3b3JkcygiZW5nbGlzaCIpLCB0b2xvd2VyID0gVFJVRSwgc3RlbSA9IFRSVUUsCiAgICAgICAgICAgICByZW1vdmVfcHVuY3QgPSBUUlVFLCByZW1vdmVfbnVtYmVycz1UUlVFKQoKCmBgYAoKIyMjQ29uc3RydWN0IHRoZSBmcmVxdWVuY3kgZ3JhcGgKYGBge3IsIHdhcm5pbmc9RkFMU0V9CmFtZXJpY2FuRnJlcTEgPC0gZGF0YS5mcmFtZSgKICBsaXN0KAogICAgZG9jdW1lbnQgPSByb3duYW1lcyhteURmbTEgWywgJ2NvbnN0aXR1dCddKSwKICAgIGZyZXF1ZW5jeTEgPSB1bm5hbWUoYXMubWF0cml4KG15RGZtMSBbLCAnY29uc3RpdHV0J10pKSwKICAgIGZyZXF1ZW5jeTIgPSB1bm5hbWUoYXMubWF0cml4KG15RGZtMSBbLCAnc2xhdmUnXSkpLAogICAgZnJlcXVlbmN5MyA9IHVubmFtZShhcy5tYXRyaXgobXlEZm0xIFssICdzdGF0ZSddKSksCiAgICBmcmVxdWVuY3k0ID0gdW5uYW1lKGFzLm1hdHJpeChteURmbTEgWywgJ2dvdmVybiddKSkKICApKQoKZ2dwbG90KGFtZXJpY2FuRnJlcTEpICsKICBnZW9tX3BvaW50KGFlcyh4PWRvY3VtZW50LHk9ZnJlcXVlbmN5MSxjb2xvdXIgPSAiY29uc3RpdHV0KiIpKSArCiAgZ2VvbV9wb2ludChhZXMoeD1kb2N1bWVudCx5PWZyZXF1ZW5jeTIsY29sb3VyID0gInNsYXZlIikpICsKICBnZW9tX3BvaW50KGFlcyh4PWRvY3VtZW50LHk9ZnJlcXVlbmN5Myxjb2xvdXIgPSAic3RhdGUiKSkgKwogIGdlb21fcG9pbnQoYWVzKHg9ZG9jdW1lbnQseT1mcmVxdWVuY3k0LGNvbG91ciA9ICJnb3Zlcm4iKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTkwLCBoanVzdD0xKSkKYGBgCgpCYXNlZCBvbiB0aGUgdG9wZmVhdHVyZXMgb2YgdGhlIGRvY3VtZW50LXRlcm0gbWF0cml4LCBJIGNob3NlIHRvIGdyYXBoIHRoZSBmcmVxdWVuY3kgb2YgW2NvbnN0aXR1dCpdLCBbc3RhdGVdLCBbZ292ZXJuXS4gT24gdGhlIG90aGVyIGhhbmQsIEJhc2VkIG9uIHRoZSBoaXN0b3J5IG9mIFVTQSBpbiB0aGF0IHRpbWUgcGVyaW9kLCBJIGFsc28gZ3JhcGhlZCB0aGUgZnJlcXVlbmN5IG9mIHRoZSB3b3JkIC0gc2xhdmUuCgpBcyB0aGUgZ3JhcGggYWJvdmUsIHRoZSBmcmVxdWVuY3kgb2YgdGhlIHRlcm0gW3NsYXZlXSB3YXMgaGlnaCBlc3BlY2lhbGx5IGluIExpbmNvbG4ncyBzcGVlY2ggaW4gMTg2MS4gSG93ZXZlciwgdGhlIHdvcmQgW2NvbnN0aXR1dCpdIHdhcyBpbiBmYWN0IHRoZSBtb3N0IGZyZXF1ZW50IHRlcm0gYW1vbmcgdGhvc2Ugd29yZHMgSSBjaG9zZSBpbiBMaW5jb2xuJ3Mgc3BlZWNoIGluIDE4NjEuIFNpbmNlIHRoZSBsZW5ndGggb2Ygc3BlZWNoIHdhcyBkaWZmZXJlbnQsIEkgY29uc3RydWN0ZWQgdGhlIHJlbGF0aXZlIGZyZXF1ZW5jeSBvZiB0aG9zZSB3b3JkcyBhcyB3ZWxsLgoKIyMjQ29uc3RydWN0IHRoZSByZWxhdGl2ZSBmcmVxdWVuY3kgZ3JhcGgKYGBge3IsIHdhcm5pbmc9RkFMU0V9CnJlbERmbTEgPC0gZGZtX3dlaWdodChteURmbTEgLCBzY2hlbWUgPSBjKCJwcm9wIikpKjEwMApyZWxhbWVyaWNhbkZyZXExIDwtIGRhdGEuZnJhbWUoCiAgbGlzdCgKICAgIGRvY3VtZW50ID0gcm93bmFtZXMocmVsRGZtMSBbLCAnY29uc3RpdHV0J10pLAogICAgZnJlcXVlbmN5MSA9IHVubmFtZShhcy5tYXRyaXgocmVsRGZtMSBbLCAnY29uc3RpdHV0J10pKSwKICAgIGZyZXF1ZW5jeTIgPSB1bm5hbWUoYXMubWF0cml4KHJlbERmbTEgWywgJ3NsYXZlJ10pKSwKICAgIGZyZXF1ZW5jeTMgPSB1bm5hbWUoYXMubWF0cml4KHJlbERmbTEgWywgJ3N0YXRlJ10pKSwKICAgIGZyZXF1ZW5jeTQgPSB1bm5hbWUoYXMubWF0cml4KHJlbERmbTEgWywgJ2dvdmVybiddKSkKICApKQoKZ2dwbG90KHJlbGFtZXJpY2FuRnJlcTEpICsKICBnZW9tX3BvaW50KGFlcyh4PWRvY3VtZW50LHk9ZnJlcXVlbmN5MSxjb2xvdXIgPSAiY29uc3RpdHV0KiIpKSArCiAgZ2VvbV9wb2ludChhZXMoeD1kb2N1bWVudCx5PWZyZXF1ZW5jeTIsY29sb3VyID0gInNsYXZlIikpICsKICBnZW9tX3BvaW50KGFlcyh4PWRvY3VtZW50LHk9ZnJlcXVlbmN5Myxjb2xvdXIgPSAic3RhdGUiKSkgKwogIGdlb21fcG9pbnQoYWVzKHg9ZG9jdW1lbnQseT1mcmVxdWVuY3k0LGNvbG91ciA9ICJnb3Zlcm4iKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTkwLCBoanVzdD0xKSkKYGBgCgpUaGUgcmVsYXRpdmUgZnJlcXVlbmN5IGdyYXBoIGlzIHNsaWdodGx5IGRpZmZlcmVudCB3aXRoIHRoZSBwcmV2aW91cyBncmFwaC4gV2UgY291bGQgc2VlIG5vdyB0aGUgdGVybSBbc2xhdmVdIHdhcyBoaWdobHkgdXNlZCBpbiB0aGUgc3BlZWNoIGluIDE4NjUsIHdoaWNoIHdhcyBkdXJpbmcgdGhlIHdhcnRpbWUuIFRoZSB3b3JkIFtnb3Zlcm5dIHdhcyB0aGUgb25seSBjb25zaXN0ZW50bHkgdXNlZCB3b3JkIGluIHRob3NlIHNwZWVjaGVzLgoKVGhpcyBncmFwaCBhbHNvIHNob3dlZCB0aGF0IHRoZSB3b3JkIGNob2ljZXMgd2VyZSBpbmZsdWVuY2VkIGJ5IHRoZSBsZW5ndGggb2Ygc3BlZWNoLiBUaGUgbW9zdCB1c2VkIHdvcmRzIG9mIGFsbCBjb3JwdXMgd2VyZSBub3Qgc28gZnJlcXVlbnRseSB1c2VkIGluIHR3byBzaG9ydCBzcGVlY2hlcyAoMTg2NSBhbmQgMTg2OSkuCgojIyNDb25zdHJ1Y3QgdGhlIHdvcmRjbG91ZApgYGB7ciwgd2FybmluZz1GQUxTRX0KdGV4dHBsb3Rfd29yZGNsb3VkKG15RGZtMSAsIG1pbl90ZXJtZnJlcSA9IDMwLAogICAgICAgICAgICAgICAgICAgY29sb3JzPWJyZXdlci5wYWwoMTAsIlNldDEiKSwKICAgICAgICAgICAgICAgICAgIHRpdGxlLnNpemU9MSwKICAgICAgICAgICAgICAgICAgIGNvbXBhcmlzb24gPSBUUlVFKQpgYGAKCkFmdGVyIHRoZSBncmFwaCBvZiBmcmVxdWVuY3ksIEkgYWxzbyB0cmllZCB0byBncmFwaCB0aGUgd29yZGNsb3VkIG9mIHRob3NlIHNwZWVjaGVzLiBUaGUgd29yZHMgaW4gcmVkIHdlcmUgYmFzZWQgb24gdGhlIEJ1Y2huYW4ncyBzcGVlY2ggaW4gMTg1Nywgd2hpY2ggaXMgdGhlIHRpdGxlIG5leHQgdG8gdGhvc2UgcmVkIHdvcmRzIG9uIHRoZSBncmFwaCwgdGhlIGZvbGxvd2luZyAzIHNwZWVjaGVzIHdlcmUgZ3JhcGhlZCBpbiBibHVlLCBncmVlbiwgcHVycGxlIGluIG9yZGVyLgoKSW4gdGhpcyBncmFwaCwgd2UgY2FuIHNlZSB0aGUgd29yZCBbd2FyXSB3YXMgaGlnaGx5IHVzZWQgaW4gdGhlIDE4NjUgTGluY29sbidzIHNwZWVjaC4KCiNQYXJ0MiAoMSkgLSBJcmlzaCBQYXJ0eSBNYW5pZmVzdG9lcwpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0Kc2V0d2QoIn4vRGVza3RvcC9yL3BvbGltZXRyaWNzL0lFIikKbXlUZXh0MiA8LSByZWFkdGV4dCgifi9EZXNrdG9wL3IvcG9saW1ldHJpY3MvSUUvKi50eHQiLAogICAgICAgICAgICAgICAgICAgZG9jdmFyc2Zyb20gPSAiZmlsZW5hbWVzIiwgZHZzZXAgPSAiICIsIGRvY3Zhcm5hbWVzID0gYygiWWVhciIsICJQYXJ0eSIpKQp0ZXN0Q29ycHVzMiA8LSBjb3JwdXMobXlUZXh0MikKdGVzdENvcnB1czIgPC0gY29ycHVzKG15VGV4dDIsIGRvY2lkX2ZpZWxkID0gImRvY19pZCIpCmRvY25hbWVzKHRlc3RDb3JwdXMyKSA8LSBnc3ViKCIudHh0IiwgIiIsIGRvY25hbWVzKHRlc3RDb3JwdXMyICkpCgpteURmbTIgPC0gZGZtKHRlc3RDb3JwdXMyICwgcmVtb3ZlID0gc3RvcHdvcmRzKCJlbmdsaXNoIiksIHRvbG93ZXIgPSBUUlVFLCBzdGVtID0gVFJVRSwKICAgICAgICAgICAgIHJlbW92ZV9wdW5jdCA9IFRSVUUsIHJlbW92ZV9udW1iZXJzPVRSVUUpCndzMiA8LSB0ZXh0bW9kZWxfd29yZHNjb3JlcyhteURmbTIsIGMoNC41LDEzLjEzLDE1LDYuODgsMTcuNjMscmVwKE5BLDUpKSkKCgpgYGAKIyMjUHJlZGljdApgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KcHJfcmF3MiA8LSBwcmVkaWN0KHdzMiwgbmV3ZGF0YSA9IG15RGZtMltjKDYsNyw4LDksMTApLCBdKQpwcl9sYmcyXzIgPC0gcHJlZGljdCh3czIsIHJlc2NhbGluZyA9ICJsYmciLCBuZXdkYXRhID0gbXlEZm0yW2MoNiw3LDgsOSwxMCksIF0sIGludGVydmFsID0gImNvbmZpZGVuY2UiKQpgYGAKCiMjI0dyYXBoIG9mIHJhdyBzY29yZQpgYGB7ciwgd2FybmluZz1GQUxTRX0KCmRmMSA8LSBhcy5kYXRhLmZyYW1lKHByX3JhdzIpCmNvbG5hbWVzKGRmMSkgPC0gYygiVjEiKQpkZjEkcGFydHkgPC0gbXlUZXh0MiRQYXJ0eVsxOjVdCgpkZjEkdGl0bGUgPC0gcm93bmFtZXMoZGYxKQpkZjEkb3JkZXIgPC0gYygxOjUpCmRmMSR0aXRsZSA8LSB3aXRoKGRmMSwgcmVvcmRlcih0aXRsZSxvcmRlcikpCgpnZ3Bsb3QoZGYxLGFlcyh0aXRsZSxWMSxjb2xvciA9IHBhcnR5KSkgKwogIGdlb21fcG9pbnQoKSArCiAgeGxhYigiVGl0bGUiKSsKICB5bGFiKCJTY29yZSIpCmBgYAojIyNHcmFwaCBvZiBMQkcgd2l0aCByZWZlcmVuY2UgcG9pbnRzCmBgYHtyLCB3YXJuaW5nPUZBTFNFfQoKZGYyIDwtIGFzLmRhdGEuZnJhbWUocHJfbGJnMl8yJGZpdCkKY29sbmFtZXMoZGYyKSA8LSBjKCJWMSIsIlYyIiwiVjMiKQpkZjIkZyA8LSAicHIiCmRmMiRwYXJ0eSA8LSBteVRleHQyJFBhcnR5WzE6NV0KZGYyX3JlZiA8LSBkYXRhLmZyYW1lKAogIHZhbHVlMSA9IGMoNC41LDEzLjEzLDE1LDYuODgsMTcuNjMpLAogIHZhbHVlMiA9IGMoNC41LDEzLjEzLDE1LDYuODgsMTcuNjMpLAogIHZhbHVlMyA9IGMoNC41LDEzLjEzLDE1LDYuODgsMTcuNjMpCikKcm93bmFtZXMoZGYyX3JlZikgPC0gZG9jbmFtZXModGVzdENvcnB1czIpWzE6NV0KY29sbmFtZXMoZGYyX3JlZikgPC0gYygiVjEiLCJWMiIsIlYzIikKZGYyX3JlZiRnIDwtICJyZWYiCmRmMl9yZWYkcGFydHkgPC0gbXlUZXh0MiRQYXJ0eVsxOjVdCmRmMl9uZXcgPC0gZGF0YS5mcmFtZShWMT1OQSxWMj1OQSxWMz1OQSxnPU5BLHBhcnR5PU5BKQpmb3IoaSBpbiAxOjUpewogIGRmMl9uZXcgPC0gYXMuZGF0YS5mcmFtZShyYmluZChkZjJfbmV3LGRmMl9yZWZbaSxdLGRmMltpLF0pKQp9CmRmMl9uZXcgPC0gYXMuZGF0YS5mcmFtZShkZjJfbmV3WzI6MTEsXSkKZGYyX25ldyR0aXRsZSA8LSByb3duYW1lcyhkZjJfbmV3KQpkZjJfbmV3JG9yZGVyIDwtIGMoMToxMCkKZGYyX25ldyR0aXRsZSA8LSB3aXRoKGRmMl9uZXcsIHJlb3JkZXIodGl0bGUsb3JkZXIpKQoKZ2dwbG90KGRmMl9uZXcsYWVzKHRpdGxlLFYxLGNvbG9yID0gcGFydHkpKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPVYyLHltYXg9VjMpKSArCiAgeGxhYigiVGl0bGUiKSsKICB5bGFiKCJTY29yZSIpCmBgYAoKQ29tcGFyaW5nIHRoZSByYXcgc2NvcmVzIGFuZCB0aGUgdHJhbnNmb3JtZWQgc2NvcmVzLCB0aGUgTEJHIHNjb3JlcyB3ZXJlIG1vcmUgY29udmluY2luZywgc2luY2UgdGhlIHJlZmVyZW5jZSBzY29yZXMgd2VyZSBza2V3ZWQgYW5kIHRoZSB2YXJpYXRpb24gd2FzIGhpZ2guIEluIHRoZSB0cmFuc2Zvcm1lZCBncmFwaCwgdGhlIHNoaWZ0cyBvbiBzb2NpYWwgcG9zaXRpb24gb2YgRkYgcGFydHkgYW5kIERMIHBhcnR5IHdlcmUgcmV2ZWFsZWQuCgpQUzogIEFmdGVyIHRoZSB0cmFuc2Zvcm1hdGlvbiBvZiByYXcgc2NvcmVzLCB3ZSBjb3VsZCBzZWUgdGhhdCB0aGVpciBwb3NpdGlvbnMgb24gdGhlIHNvY2lhbCBzY2FsZSBjaGFuZ2VkLkFjY29yZGluZyB0byB0aGUgV2lraXBlZGlhLCBiZXR3ZWVuIHRoZSB0d28gZWxlY3Rpb25zIGluIDE5OTIgYW5kIDE5OTcsIHRoZSBjb2FsaXRpb25zIGNoYW5nZWQuIFdoYXQgSSBmb3VuZCBvdXQgd2FzIHRoZSBjb2FsaXRpb25zIGRpZCBub3QgcXVpdGUgZGVwZW5kIG9uIHRoZSBzb2NpYWwgcG9zaXRpb24uIFRoZSBpbXBvcnRhbmNlIHdhcyB0aGUgbWFqb3JpdHkgb2YgY29hbGl0aW9uLgoKI1BhcnQyICgyKSAtIFJlYWdhbiB2LnMuIFRydW1wCmBgYHtyfQpwcmVzRGZtIDwtIGRmbShjb3JwdXNfc3Vic2V0KGRhdGFfY29ycHVzX2luYXVndXJhbCwgWWVhciA+IDE5ODApLCAKICAgICAgICAgICAgICAgcmVtb3ZlID0gc3RvcHdvcmRzKCJlbmdsaXNoIiksIHN0ZW0gPSBUUlVFLCByZW1vdmVfcHVuY3QgPSBUUlVFKQpgYGAKIyMjT3JpZ2luYWwKYGBge3IsIHdhcm5pbmc9RkFMU0V9CndzX3ByZXMgPC0gdGV4dG1vZGVsX3dvcmRzY29yZXMocHJlc0RmbSwgYygxLCBOQSwgTkEsIDAsIE5BLCBOQSwgTkEsIC0xLCBOQSwgTkEpKQpwcl9hbGxfcHJlcyA8LSBwcmVkaWN0KHdzX3ByZXMpCmBgYAojIyNOZXcKYGBge3IsIHdhcm5pbmc9RkFMU0V9CndzX3ByZXMyIDwtIHRleHRtb2RlbF93b3Jkc2NvcmVzKHByZXNEZm0sIGMoTkEsIE5BLCBOQSwgMCwgTkEsIE5BLCBOQSwgLTEsIE5BLCAxKSkKcHJfYWxsX3ByZXMyIDwtIHByZWRpY3Qod3NfcHJlczIpCmBgYAojIyNHcmFwaCB0aGUgcHJlZGljdGlvbgpgYGB7ciwgd2FybmluZz1GQUxTRX0KcHJfYWxsIDwtIGFzLmRhdGEuZnJhbWUoY2JpbmQocHJfYWxsX3ByZXMscHJfYWxsX3ByZXMyKSkKcHJfYWxsJHRpdGxlIDwtIHJvd25hbWVzKHByX2FsbCkKcHJfYWxsJG9yZGVyIDwtIGMoMTA6MSkKcHJfYWxsJHRpdGxlIDwtIHdpdGgocHJfYWxsLHJlb3JkZXIodGl0bGUsb3JkZXIpKQpnZ3Bsb3QocHJfYWxsLGFlcyh5PXRpdGxlLHg9cHJfYWxsX3ByZXMpKSArCiAgZ2VvbV9wb2ludChhZXMocHJfYWxsX3ByZXMsY29sb3I9IlJlYWdhbiBhcyAxIikpICsKICBnZW9tX3BvaW50KGFlcyhwcl9hbGxfcHJlczIsY29sb3I9IlRydW1wIGFzIDEiKSkgKwogIHhsYWIoIlNjb3JlIikgKwogIHlsYWIoIlRpdGxlIikKYGBgCgpBcyB0aGUgZ3JhcGggYWJvdmUsIHRoZSBwb3NpdGlvbiBvZiAxOTgxLVJlYWdhbiBhbmQgMjAxNy1UcnVtcCBjaGFuZ2VkIGR1ZSB0byB0aGUgY2hhbmdlIG9mIHJlZmVyZW5jZSB0ZXh0IHVuZG91YnRlZGx5LiBIb3dldmVyLCB3ZSBjb3VsZCBhbHNvIGZpbmQgb3V0IHRoZSBzcGVlY2ggc2NvcmVzIG9mIGFsbCB0aGUgb3RoZXIgcHJlc2lkZW50cyB3ZXJlIGEgbGl0dGxlIGJpdCBoaWdoZXIgd2hlbiB3ZSBhc3N1bWVkIDE5ODEtUmVhZ2FuIGFzIDEgaW4gcmVmZXJlbmNlIHNjb3Jlcy4gVGhlIGltcGxpY2F0aW9uIGlzIHRoYXQgdGhlIGNvbnRleHQgb2YgVHJ1bXAncyBzcGVlY2ggd2FzIG1vcmUgZGlmZmVyZW50IGZyb20gb3RoZXIncyBzcGVlY2hlcyBhY2NvcmRpbmcgdG8gdGhlIHNjb3Jlcy4KCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQpzZXR3ZCgifi9EZXNrdG9wL1IvcG9saW1ldHJpY3MiKQpgYGAKCg==