16 December, 2025


Brief Introduction

Reaction time measurements are commonly used to explore cognitive processing in language. Countless research has proven concrete words (e.g., table, apple) are processed more quickly and more accurately than abstract words (e.g., justice, hope). However, there is limited research that takes into account potential influential lexical factors. In the present analysis, word length and frequency are controlled for when examining reaction times of concrete and abstract words.



Data

Three data sets were used in the present analysis. Only SimLex and SUBTLEX were directly imported into R, while the third data set was used for reference purpose:



SimLex: Provides concreteness ratings for a wide range of English words, which are used to classify words as abstract or concrete. Concreteness categories are determined using a median split of the ratings, with words below the median classified as abstract and words above the median classified as concrete.

SUBTLEX: Provides frequency ratings for 74,286 English words based on a large corpus. These frequency measures are used to limit the analysis to words within a comparable frequency range to reduce frequency related effects on reaction time.

English Lexicon Project: Provides reaction time measures for approximately 40,481 English words






SIMLEX DATA


Code used to load in SimLex:
setwd(“~/Desktop”)
SimLex <- read.delim(“SimLex-999.txt”, header = TRUE)


Orignal Imported Data Set:

head(SimLex)

From the SimLex data set, the only data of interest for this analysis are the concreteness ratings of words. SimLex contains two word columns and two corresponding concreteness columns. To create a clean data set, the two word columns were combined into a single word column, and the two concreteness columns were combined into a single concreteness column. Any duplicate words were then removed so that each word only appears once.

A median split of the concreteness ratings was performed, with words below the median classified as Abstract and words above the median classified as Concrete. Words equal to the median were removed and concreteness rating was kept between 3.43 and 4.03.




Code Used:
To extract the information and then merge it:
SimLex1 <- data.frame(Word = SimLex\(word1, Conc.Rating = SimLex\)conc.w1.)
SimLex2 <- data.frame(Word = SimLex\(word2, Conc.Rating = SimLex\)conc.w2.)
SimLex_CombinedWords <- rbind(SimLex1, SimLex2)

To create a median split and a categorization column:
median_value <- median(SimLex_CombinedWords$Conc.Rating)
SimLex_NoMedian <- SimLex_CombinedWords %>%
filter(Conc.Rating != median_value)
SimLex_FinalDataset <- SimLex_NoMedian %>%
mutate(Conc.Type = case_when(Conc.Rating > median_value ~ “Concrete”, Conc.Rating < median_value ~ “Abstract”))

To remove duplicates:
SimLex_FinalDataset <- SimLex_FinalDataset[!duplicated(SimLex_CombinedWords$Word), ]

To keep concreteness rating within a range:
median_adjacent <- SimLex_FinalDataset %>%
filter(Conc.Rating >= 3.43 & Conc.Rating <= 4.03)

Split by concreteness type and then merge:
abstract_median_adjacent <- median_adjacent %>% filter(Conc.Type == “Abstract”)
concrete_median_adjacent <- median_adjacent %>% filter(Conc.Type == “Concrete”)
SimLex_FinalDataset <- median_adjacent


This is the resulting data set now containing 77 words:

head(SimLex_FinalDataset)





SUBTLEX DATA:


Code used to load in SUBTLEX:
install.packages(“readxl”)
library(readxl)
SUBTLEX <- read_excel(“SUBTLEXusExcel2007.xlsx”)


Original Imported Data Set:

head(SUBTLEX)

From the SUBTLEX data set, the only data of interest for this analysis are the words and their frequency counts. A new column to indicate the number of characters in each word was added. Words shorter than 3 letters or longer than 7 letters were removed to reduce potential effects.

A median split of the FREQcount column was then performed. Words with frequency counts above the median were labeled high frequency, and words below the median were labeled low frequency. Frequencies equal to the median were not considered. Any duplicate words were removed. The resulting data set contains only the necessary columns for analysis.




Code Used:
To add word length column:
SUBLTEX <- SUBTLEX %>%
mutate(Word_Length = nchar(Word))

To remove irrelevant columns of data:
SUBTLEX_Clean <- SUBTLEX %>%
select(Word, Length, FREQcount)

To filter word length:
SUBTLEX_Clean <- SUBTLEX_Clean %>%
filter(Length >= 3 & Length <= 7)

To median split word frequency and add frequency type:
Median_Freq <- median(SUBTLEX_Clean$FREQcount)
SUBTLEX_FinalDataset <- SUBTLEX_Clean %>%
mutate(freq.type = ifelse(FREQcount > Median_Freq, “High”, “Low”))

To remove duplicates:
SUBTLEX_FinalDataset <- SUBTLEX_FinalDataset[!duplicated(SUBTLEX_FinalDataset$Word), ]


This is the resulting data set:

head(SUBTLEX_FinalDataset)



Sample Selection

To analyze reaction times for concrete and abstract words while also controlling for word length and frequency, a subset of words was selected from the cleaned SimLex and SUBTLEX data sets. 28 abstract words of high frequency were selected while only 24 concrete words of high frequency were selected. Note that only high frequency words were considered. The relevant data from SimLex and SUBTLEX were then compiled into separate tables containing only the columns needed for analysis (word, concreteness type, concreteness rating, and reaction time). Reaction time was added in manually from the English Lexicon Project data set.




Here is the resulting data table:

head(final_sample)


Results

ggplot(final_sample, aes(x = Conc.Type, y = ReactionTime, fill = Conc.Type)) +
geom_boxplot(alpha = 0.7) +
geom_jitter(width = 0.2, alpha = 0.5, color = "black") +
labs(x = "Word Type", y = "Reaction Time (ms)", title = "Reaction Times for Abstract vs. Concrete Words") + coord_flip()

The box plot compares reaction times (in milliseconds) for abstract and concrete words. Overall, reaction times for abstract and concrete words are fairly similar, however a smaller sample size was used which could be an explanation for the similarities. Results may vary with a larger sample size. The median reaction time for abstract words is slightly higher (~620ms) than that of concrete words (~600ms), indicating faster processing of concrete words on average. Abstract words also display a more narrow interquartile range which suggests more consistent reaction times across the abstract sample. In contrast, concrete words show a slightly wider range and this is evident with the extreme outliers seen in the visualization.


ggplot(final_sample, aes(x = Conc.Rating, y = ReactionTime, color = Conc.Type)) +
  geom_point(size = 3) +
  geom_smooth(method = "lm", color = "black") +
  labs(x = "Concreteness Rating", y = "Reaction Time (ms)", color = " Word Type", title = "Concreteness and Reaction Time")

This scatter plot illustrates the relationship between concreteness rating and reaction time, with abstract words shown in pink and concrete words shown in blue. Overall, there is a slight negative trend suggesting that higher concreteness ratings are associated with faster reaction times.The spread of points and overlap show that this relationship is relatively weak given the smaller sample size used.


Conclusion

The present analysis explored the relationship between word concreteness and reaction time while controlling for word length and word frequency. Overall, the results suggest that concrete words tend to be processed slightly faster than abstract words which is consistent with prior findings. This may indicate that other lexical factors have a smaller influence on reaction time than initially expected, or that prior research has already accounted for these factors. The small sample size used limits the results. Future studies using a larger sample would help to clarify the effect of concreteness on reaction times. Additionally, this analysis focused only on high frequency words. The inclusion of lower frequency words might yield different patterns.








LS0tCnRpdGxlOiAiTGV4aWNhbCBJbmZsdWVuY2VzIG9mIFJlYWN0aW9uIFRpbWU6IEEgQ29tcGFyaXNvbiBvZiBDb25jcmV0ZSBhbmQgQWJzdHJhY3QgV29yZHMiCmF1dGhvcjogIkdhYnJpZWxsYSBDb29nYW4iCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KMTYgRGVjZW1iZXIsIDIwMjUgPGJyPiAKPGRpdiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyI+Cjxicj4gKipCcmllZiBJbnRyb2R1Y3Rpb24qKiA8YnI+Cgo8ZGl2IHN0eWxlPSJsaW5lLWhlaWdodDogMjsiPgpSZWFjdGlvbiB0aW1lIG1lYXN1cmVtZW50cyBhcmUgY29tbW9ubHkgdXNlZCB0byBleHBsb3JlIGNvZ25pdGl2ZSBwcm9jZXNzaW5nIGluIGxhbmd1YWdlLiBDb3VudGxlc3MgcmVzZWFyY2ggaGFzIHByb3ZlbiBjb25jcmV0ZSB3b3JkcyAoZS5nLiwgdGFibGUsIGFwcGxlKSBhcmUgcHJvY2Vzc2VkIG1vcmUgcXVpY2tseSBhbmQgbW9yZSBhY2N1cmF0ZWx5IHRoYW4gYWJzdHJhY3Qgd29yZHMgKGUuZy4sIGp1c3RpY2UsIGhvcGUpLiBIb3dldmVyLCB0aGVyZSBpcyBsaW1pdGVkIHJlc2VhcmNoIHRoYXQgdGFrZXMgaW50byBhY2NvdW50IHBvdGVudGlhbCBpbmZsdWVudGlhbCBsZXhpY2FsIGZhY3RvcnMuIEluIHRoZSBwcmVzZW50IGFuYWx5c2lzLCB3b3JkIGxlbmd0aCBhbmQgZnJlcXVlbmN5IGFyZSBjb250cm9sbGVkIGZvciB3aGVuIGV4YW1pbmluZyByZWFjdGlvbiB0aW1lcyBvZiBjb25jcmV0ZSBhbmQgYWJzdHJhY3Qgd29yZHMuPC9kaXY+IDwvZGl2PiA8YnI+IDxicj4KCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPgoqKkRhdGEqKiA8YnI+Cgo8ZGl2IHN0eWxlPSJsaW5lLWhlaWdodDogMjsiPgoqVGhyZWUgZGF0YSBzZXRzIHdlcmUgdXNlZCBpbiB0aGUgcHJlc2VudCBhbmFseXNpcy4gT25seSBTaW1MZXggYW5kIFNVQlRMRVggd2VyZSBkaXJlY3RseSBpbXBvcnRlZCBpbnRvIFIsIHdoaWxlIHRoZSB0aGlyZCBkYXRhIHNldCB3YXMgdXNlZCBmb3IgcmVmZXJlbmNlIHB1cnBvc2U6KiA8L2Rpdj4gPC9kaXY+IDxicj4gPGJyPgoKPGRpdiBzdHlsZT0ibGluZS1oZWlnaHQ6IDI7Ij4KPHU+KipTaW1MZXg6Kio8L3U+IFByb3ZpZGVzIGNvbmNyZXRlbmVzcyByYXRpbmdzIGZvciBhIHdpZGUgcmFuZ2Ugb2YgRW5nbGlzaCB3b3Jkcywgd2hpY2ggYXJlIHVzZWQgdG8gY2xhc3NpZnkgd29yZHMgYXMgYWJzdHJhY3Qgb3IgY29uY3JldGUuIENvbmNyZXRlbmVzcyBjYXRlZ29yaWVzIGFyZSBkZXRlcm1pbmVkIHVzaW5nIGEgbWVkaWFuIHNwbGl0IG9mIHRoZSByYXRpbmdzLCB3aXRoIHdvcmRzIGJlbG93IHRoZSBtZWRpYW4gY2xhc3NpZmllZCBhcyBhYnN0cmFjdCBhbmQgd29yZHMgYWJvdmUgdGhlIG1lZGlhbiBjbGFzc2lmaWVkIGFzIGNvbmNyZXRlLgoKPHU+KipTVUJUTEVYOioqPC91PiBQcm92aWRlcyBmcmVxdWVuY3kgcmF0aW5ncyBmb3IgNzQsMjg2IEVuZ2xpc2ggd29yZHMgYmFzZWQgb24gYSBsYXJnZSBjb3JwdXMuIFRoZXNlIGZyZXF1ZW5jeSBtZWFzdXJlcyBhcmUgdXNlZCB0byBsaW1pdCB0aGUgYW5hbHlzaXMgdG8gd29yZHMgd2l0aGluIGEgY29tcGFyYWJsZSBmcmVxdWVuY3kgcmFuZ2UgdG8gcmVkdWNlIGZyZXF1ZW5jeSByZWxhdGVkIGVmZmVjdHMgb24gcmVhY3Rpb24gdGltZS4KCjx1PioqRW5nbGlzaCBMZXhpY29uIFByb2plY3Q6Kio8L3U+IFByb3ZpZGVzIHJlYWN0aW9uIHRpbWUgbWVhc3VyZXMgZm9yIGFwcHJveGltYXRlbHkgNDAsNDgxIEVuZ2xpc2ggd29yZHMgPC9kaXY+IDxicj4gPGJyPiA8YnI+IDxicj4KCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlciI+Cjxicj4gKipTSU1MRVggREFUQSoqCjwvZGl2PiA8YnI+CioqQ29kZSB1c2VkIHRvIGxvYWQgaW4gU2ltTGV4OioqPGJyPgpzZXR3ZCgifi9EZXNrdG9wIik8YnI+ClNpbUxleCA8LSByZWFkLmRlbGltKCJTaW1MZXgtOTk5LnR4dCIsIGhlYWRlciA9IFRSVUUpIDxicj4gPGJyPiA8YnI+Cjx1Pk9yaWduYWwgSW1wb3J0ZWQgRGF0YSBTZXQ6PC91PgpgYGB7cn0KaGVhZChTaW1MZXgpCmBgYAoKPGRpdiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyO2xpbmUtaGVpZ2h0OiAyOyI8YnI+PGJyPkZyb20gdGhlIFNpbUxleCBkYXRhIHNldCwgdGhlIG9ubHkgZGF0YSBvZiBpbnRlcmVzdCBmb3IgdGhpcyBhbmFseXNpcyBhcmUgdGhlIGNvbmNyZXRlbmVzcyByYXRpbmdzIG9mIHdvcmRzLiBTaW1MZXggY29udGFpbnMgdHdvIHdvcmQgY29sdW1ucyBhbmQgdHdvIGNvcnJlc3BvbmRpbmcgY29uY3JldGVuZXNzIGNvbHVtbnMuIFRvIGNyZWF0ZSBhIGNsZWFuIGRhdGEgc2V0LCB0aGUgdHdvIHdvcmQgY29sdW1ucyB3ZXJlIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgd29yZCBjb2x1bW4sIGFuZCB0aGUgdHdvIGNvbmNyZXRlbmVzcyBjb2x1bW5zIHdlcmUgY29tYmluZWQgaW50byBhIHNpbmdsZSBjb25jcmV0ZW5lc3MgY29sdW1uLiBBbnkgZHVwbGljYXRlIHdvcmRzIHdlcmUgdGhlbiByZW1vdmVkIHNvIHRoYXQgZWFjaCB3b3JkIG9ubHkgYXBwZWFycyBvbmNlLjxicj4gPGJyPgoKQSBtZWRpYW4gc3BsaXQgb2YgdGhlIGNvbmNyZXRlbmVzcyByYXRpbmdzIHdhcyBwZXJmb3JtZWQsIHdpdGggd29yZHMgYmVsb3cgdGhlIG1lZGlhbiBjbGFzc2lmaWVkIGFzIEFic3RyYWN0IGFuZCB3b3JkcyBhYm92ZSB0aGUgbWVkaWFuIGNsYXNzaWZpZWQgYXMgQ29uY3JldGUuIFdvcmRzIGVxdWFsIHRvIHRoZSBtZWRpYW4gd2VyZSByZW1vdmVkIGFuZCBjb25jcmV0ZW5lc3MgcmF0aW5nIHdhcyBrZXB0IGJldHdlZW4gMy40MyBhbmQgNC4wMy4KPC9kaXY+IDxicj4gPGJyPiA8YnI+CgoqKkNvZGUgVXNlZDoqKjxicj4KPHU+VG8gZXh0cmFjdCB0aGUgaW5mb3JtYXRpb24gYW5kIHRoZW4gbWVyZ2UgaXQ6PC91PiA8YnI+ClNpbUxleDEgPC0gZGF0YS5mcmFtZShXb3JkID0gU2ltTGV4JHdvcmQxLCBDb25jLlJhdGluZyA9IFNpbUxleCRjb25jLncxLikgPGJyPgpTaW1MZXgyIDwtIGRhdGEuZnJhbWUoV29yZCA9IFNpbUxleCR3b3JkMiwgQ29uYy5SYXRpbmcgPSBTaW1MZXgkY29uYy53Mi4pIDxicj4KU2ltTGV4X0NvbWJpbmVkV29yZHMgPC0gcmJpbmQoU2ltTGV4MSwgU2ltTGV4MikgPGJyPiA8YnI+Cgo8dT5UbyBjcmVhdGUgYSBtZWRpYW4gc3BsaXQgYW5kIGEgY2F0ZWdvcml6YXRpb24gY29sdW1uOjwvdT4gPGJyPgptZWRpYW5fdmFsdWUgPC0gbWVkaWFuKFNpbUxleF9Db21iaW5lZFdvcmRzJENvbmMuUmF0aW5nKTxicj4gClNpbUxleF9Ob01lZGlhbiA8LSBTaW1MZXhfQ29tYmluZWRXb3JkcyAlPiUgPGJyPgogIGZpbHRlcihDb25jLlJhdGluZyAhPSBtZWRpYW5fdmFsdWUpIDxicj4gClNpbUxleF9GaW5hbERhdGFzZXQgPC0gU2ltTGV4X05vTWVkaWFuICU+JSA8YnI+CiAgbXV0YXRlKENvbmMuVHlwZSA9IGNhc2Vfd2hlbihDb25jLlJhdGluZyA+IG1lZGlhbl92YWx1ZSB+ICJDb25jcmV0ZSIsIENvbmMuUmF0aW5nIDwgbWVkaWFuX3ZhbHVlIH4gIkFic3RyYWN0IikpIDxicj4gPGJyPgogIAo8dT5UbyByZW1vdmUgZHVwbGljYXRlczo8L3U+IDxicj4KU2ltTGV4X0ZpbmFsRGF0YXNldCA8LSBTaW1MZXhfRmluYWxEYXRhc2V0WyFkdXBsaWNhdGVkKFNpbUxleF9Db21iaW5lZFdvcmRzJFdvcmQpLCBdPGJyPgoKPHU+VG8ga2VlcCBjb25jcmV0ZW5lc3MgcmF0aW5nIHdpdGhpbiBhIHJhbmdlOjwvdT4gPGJyPgptZWRpYW5fYWRqYWNlbnQgPC0gU2ltTGV4X0ZpbmFsRGF0YXNldCAlPiUgPGJyPgogIGZpbHRlcihDb25jLlJhdGluZyA+PSAzLjQzICYgQ29uYy5SYXRpbmcgPD0gNC4wMykgPGJyPgoKPHU+U3BsaXQgYnkgY29uY3JldGVuZXNzIHR5cGUgYW5kIHRoZW4gbWVyZ2U6PC91PiA8YnI+CmFic3RyYWN0X21lZGlhbl9hZGphY2VudCA8LSBtZWRpYW5fYWRqYWNlbnQgJT4lIGZpbHRlcihDb25jLlR5cGUgPT0gIkFic3RyYWN0IikgPGJyPgpjb25jcmV0ZV9tZWRpYW5fYWRqYWNlbnQgPC0gbWVkaWFuX2FkamFjZW50ICU+JSBmaWx0ZXIoQ29uYy5UeXBlID09ICJDb25jcmV0ZSIpIDxicj4KU2ltTGV4X0ZpbmFsRGF0YXNldCA8LSBtZWRpYW5fYWRqYWNlbnQgPGJyPiA8YnI+IDxicj4KCgoKCjx1PlRoaXMgaXMgdGhlIHJlc3VsdGluZyBkYXRhIHNldCBub3cgY29udGFpbmluZyA3NyB3b3Jkczo8L3U+CmBgYHtyfQpoZWFkKFNpbUxleF9GaW5hbERhdGFzZXQpCmBgYAo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiPgo8YnI+IDxicj4gPGJyPiA8YnI+ICoqU1VCVExFWCBEQVRBOioqCjwvZGl2PiA8YnI+CgoqKkNvZGUgdXNlZCB0byBsb2FkIGluIFNVQlRMRVg6KiogPGJyPgppbnN0YWxsLnBhY2thZ2VzKCJyZWFkeGwiKSA8YnI+CmxpYnJhcnkocmVhZHhsKSA8YnI+ClNVQlRMRVggPC0gcmVhZF9leGNlbCgiU1VCVExFWHVzRXhjZWwyMDA3Lnhsc3giKSA8YnI+IDxicj4gPGJyPgoKPHU+T3JpZ2luYWwgSW1wb3J0ZWQgRGF0YSBTZXQ6PC91PgpgYGB7cn0KaGVhZChTVUJUTEVYKQpgYGAKCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjtsaW5lLWhlaWdodDogMjsiPGJyPjxicj5Gcm9tIHRoZSBTVUJUTEVYIGRhdGEgc2V0LCB0aGUgb25seSBkYXRhIG9mIGludGVyZXN0IGZvciB0aGlzIGFuYWx5c2lzIGFyZSB0aGUgd29yZHMgYW5kIHRoZWlyIGZyZXF1ZW5jeSBjb3VudHMuIEEgbmV3IGNvbHVtbiB0byBpbmRpY2F0ZSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gZWFjaCB3b3JkIHdhcyBhZGRlZC4gV29yZHMgc2hvcnRlciB0aGFuIDMgbGV0dGVycyBvciBsb25nZXIgdGhhbiA3IGxldHRlcnMgd2VyZSByZW1vdmVkIHRvIHJlZHVjZSBwb3RlbnRpYWwgZWZmZWN0cy4gPGJyPiA8YnI+CgpBIG1lZGlhbiBzcGxpdCBvZiB0aGUgRlJFUWNvdW50IGNvbHVtbiB3YXMgdGhlbiBwZXJmb3JtZWQuIFdvcmRzIHdpdGggZnJlcXVlbmN5IGNvdW50cyBhYm92ZSB0aGUgbWVkaWFuIHdlcmUgbGFiZWxlZCBoaWdoIGZyZXF1ZW5jeSwgYW5kIHdvcmRzIGJlbG93IHRoZSBtZWRpYW4gd2VyZSBsYWJlbGVkIGxvdyBmcmVxdWVuY3kuIEZyZXF1ZW5jaWVzIGVxdWFsIHRvIHRoZSBtZWRpYW4gd2VyZSBub3QgY29uc2lkZXJlZC4gQW55IGR1cGxpY2F0ZSB3b3JkcyB3ZXJlIHJlbW92ZWQuIFRoZSByZXN1bHRpbmcgZGF0YSBzZXQgY29udGFpbnMgb25seSB0aGUgbmVjZXNzYXJ5IGNvbHVtbnMgZm9yIGFuYWx5c2lzLiA8L2Rpdj4gPGJyPiA8YnI+IDxicj4KCgoqKkNvZGUgVXNlZDoqKiA8YnI+Cjx1PlRvIGFkZCB3b3JkIGxlbmd0aCBjb2x1bW46PC91PiA8YnI+ClNVQkxURVggPC0gU1VCVExFWCAlPiUgPGJyPgogIG11dGF0ZShXb3JkX0xlbmd0aCA9IG5jaGFyKFdvcmQpKSA8YnI+IDxicj4KPHU+VG8gcmVtb3ZlIGlycmVsZXZhbnQgY29sdW1ucyBvZiBkYXRhOjwvdT4gPGJyPgpTVUJUTEVYX0NsZWFuIDwtIFNVQlRMRVggJT4lIDxicj4KICBzZWxlY3QoV29yZCwgTGVuZ3RoLCBGUkVRY291bnQpIDxicj4gPGJyPgo8dT5UbyBmaWx0ZXIgd29yZCBsZW5ndGg6PC91PiA8YnI+ClNVQlRMRVhfQ2xlYW4gPC0gU1VCVExFWF9DbGVhbiAlPiUgPGJyPgogIGZpbHRlcihMZW5ndGggPj0gMyAmIExlbmd0aCA8PSA3KSA8YnI+IDxicj4KICAKPHU+VG8gbWVkaWFuIHNwbGl0IHdvcmQgZnJlcXVlbmN5IGFuZCBhZGQgZnJlcXVlbmN5IHR5cGU6PC91PiA8YnI+Ck1lZGlhbl9GcmVxIDwtIG1lZGlhbihTVUJUTEVYX0NsZWFuJEZSRVFjb3VudCkgPGJyPgpTVUJUTEVYX0ZpbmFsRGF0YXNldCA8LSBTVUJUTEVYX0NsZWFuICU+JSA8YnI+CiAgbXV0YXRlKGZyZXEudHlwZSA9IGlmZWxzZShGUkVRY291bnQgPiBNZWRpYW5fRnJlcSwgIkhpZ2giLCAiTG93IikpIDxicj4gPGJyPgogIAo8dT5UbyByZW1vdmUgZHVwbGljYXRlczo8L3U+IDxicj4KU1VCVExFWF9GaW5hbERhdGFzZXQgPC0gU1VCVExFWF9GaW5hbERhdGFzZXRbIWR1cGxpY2F0ZWQoU1VCVExFWF9GaW5hbERhdGFzZXQkV29yZCksIF0gPGJyPiA8YnI+IDxicj4KCjx1PlRoaXMgaXMgdGhlIHJlc3VsdGluZyBkYXRhIHNldDo8L3U+CmBgYHtyfQpoZWFkKFNVQlRMRVhfRmluYWxEYXRhc2V0KQpgYGAKPGRpdiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyBsaW5lLWhlaWdodDogMjsgIj4gPGJyPiA8YnI+ICoqU2FtcGxlIFNlbGVjdGlvbioqCgpUbyBhbmFseXplIHJlYWN0aW9uIHRpbWVzIGZvciBjb25jcmV0ZSBhbmQgYWJzdHJhY3Qgd29yZHMgd2hpbGUgYWxzbyBjb250cm9sbGluZyBmb3Igd29yZCBsZW5ndGggYW5kIGZyZXF1ZW5jeSwgYSBzdWJzZXQgb2Ygd29yZHMgd2FzIHNlbGVjdGVkIGZyb20gdGhlIGNsZWFuZWQgU2ltTGV4IGFuZCBTVUJUTEVYIGRhdGEgc2V0cy4KMjggYWJzdHJhY3Qgd29yZHMgb2YgaGlnaCBmcmVxdWVuY3kgd2VyZSBzZWxlY3RlZCB3aGlsZSBvbmx5IDI0IGNvbmNyZXRlIHdvcmRzIG9mIGhpZ2ggZnJlcXVlbmN5IHdlcmUgc2VsZWN0ZWQuIE5vdGUgdGhhdCBvbmx5IGhpZ2ggZnJlcXVlbmN5IHdvcmRzIHdlcmUgY29uc2lkZXJlZC4KVGhlIHJlbGV2YW50IGRhdGEgZnJvbSBTaW1MZXggYW5kIFNVQlRMRVggd2VyZSB0aGVuIGNvbXBpbGVkIGludG8gc2VwYXJhdGUgdGFibGVzIGNvbnRhaW5pbmcgb25seSB0aGUgY29sdW1ucyBuZWVkZWQgZm9yIGFuYWx5c2lzICood29yZCwgY29uY3JldGVuZXNzIHR5cGUsIGNvbmNyZXRlbmVzcyByYXRpbmcsIGFuZCByZWFjdGlvbiB0aW1lKS4qIFJlYWN0aW9uIHRpbWUgd2FzIGFkZGVkIGluIG1hbnVhbGx5IGZyb20gdGhlIEVuZ2xpc2ggTGV4aWNvbiBQcm9qZWN0IGRhdGEgc2V0LiA8L2Rpdj4gPGJyPiA8YnI+IDxicj4KCjx1PkhlcmUgaXMgdGhlIHJlc3VsdGluZyBkYXRhIHRhYmxlOjwvdT4KYGBge3J9CmhlYWQoZmluYWxfc2FtcGxlKQpgYGAKPGRpdiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyAiPiA8YnI+ICoqUmVzdWx0cyoqIDxicj4KCmBgYHtyfQpnZ3Bsb3QoZmluYWxfc2FtcGxlLCBhZXMoeCA9IENvbmMuVHlwZSwgeSA9IFJlYWN0aW9uVGltZSwgZmlsbCA9IENvbmMuVHlwZSkpICsKZ2VvbV9ib3hwbG90KGFscGhhID0gMC43KSArCmdlb21faml0dGVyKHdpZHRoID0gMC4yLCBhbHBoYSA9IDAuNSwgY29sb3IgPSAiYmxhY2siKSArCmxhYnMoeCA9ICJXb3JkIFR5cGUiLCB5ID0gIlJlYWN0aW9uIFRpbWUgKG1zKSIsIHRpdGxlID0gIlJlYWN0aW9uIFRpbWVzIGZvciBBYnN0cmFjdCB2cy4gQ29uY3JldGUgV29yZHMiKSArIGNvb3JkX2ZsaXAoKQpgYGAKPGRpdiBzdHlsZSA9ICJsaW5lLWhlaWdodDogMjsgIj4gVGhlIGJveCBwbG90IGNvbXBhcmVzIHJlYWN0aW9uIHRpbWVzIChpbiBtaWxsaXNlY29uZHMpIGZvciBhYnN0cmFjdCBhbmQgY29uY3JldGUgd29yZHMuIE92ZXJhbGwsIHJlYWN0aW9uIHRpbWVzIGZvciBhYnN0cmFjdCBhbmQgY29uY3JldGUgd29yZHMgYXJlIGZhaXJseSBzaW1pbGFyLCBob3dldmVyIGEgc21hbGxlciBzYW1wbGUgc2l6ZSB3YXMgdXNlZCB3aGljaCBjb3VsZCBiZSBhbiBleHBsYW5hdGlvbiBmb3IgdGhlIHNpbWlsYXJpdGllcy4gUmVzdWx0cyBtYXkgdmFyeSB3aXRoIGEgbGFyZ2VyIHNhbXBsZSBzaXplLiBUaGUgbWVkaWFuIHJlYWN0aW9uIHRpbWUgZm9yIGFic3RyYWN0IHdvcmRzIGlzIHNsaWdodGx5IGhpZ2hlciAofjYyMG1zKSB0aGFuIHRoYXQgb2YgY29uY3JldGUgd29yZHMgKH42MDBtcyksIGluZGljYXRpbmcgZmFzdGVyIHByb2Nlc3Npbmcgb2YgY29uY3JldGUgd29yZHMgb24gYXZlcmFnZS4gQWJzdHJhY3Qgd29yZHMgYWxzbyBkaXNwbGF5IGEgbW9yZSBuYXJyb3cgaW50ZXJxdWFydGlsZSByYW5nZSB3aGljaCBzdWdnZXN0cyBtb3JlIGNvbnNpc3RlbnQgcmVhY3Rpb24gdGltZXMgYWNyb3NzIHRoZSBhYnN0cmFjdCBzYW1wbGUuIEluIGNvbnRyYXN0LCBjb25jcmV0ZSB3b3JkcyBzaG93IGEgc2xpZ2h0bHkgd2lkZXIgcmFuZ2UgYW5kIHRoaXMgaXMgZXZpZGVudCB3aXRoIHRoZSBleHRyZW1lIG91dGxpZXJzIHNlZW4gaW4gdGhlIHZpc3VhbGl6YXRpb24uPC9kaXY+IDwvZGl2PiA8YnI+CgpgYGB7cn0KZ2dwbG90KGZpbmFsX3NhbXBsZSwgYWVzKHggPSBDb25jLlJhdGluZywgeSA9IFJlYWN0aW9uVGltZSwgY29sb3IgPSBDb25jLlR5cGUpKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gImJsYWNrIikgKwogIGxhYnMoeCA9ICJDb25jcmV0ZW5lc3MgUmF0aW5nIiwgeSA9ICJSZWFjdGlvbiBUaW1lIChtcykiLCBjb2xvciA9ICIgV29yZCBUeXBlIiwgdGl0bGUgPSAiQ29uY3JldGVuZXNzIGFuZCBSZWFjdGlvbiBUaW1lIikKYGBgCjxkaXYgc3R5bGUgPSAibGluZS1oZWlnaHQ6IDI7IHRleHQtYWxpZ246IGNlbnRlcjsgIj4gVGhpcyBzY2F0dGVyIHBsb3QgaWxsdXN0cmF0ZXMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvbmNyZXRlbmVzcyByYXRpbmcgYW5kIHJlYWN0aW9uIHRpbWUsIHdpdGggYWJzdHJhY3Qgd29yZHMgc2hvd24gaW4gcGluayBhbmQgY29uY3JldGUgd29yZHMgc2hvd24gaW4gYmx1ZS4gT3ZlcmFsbCwgdGhlcmUgaXMgYSBzbGlnaHQgbmVnYXRpdmUgdHJlbmQgc3VnZ2VzdGluZyB0aGF0IGhpZ2hlciBjb25jcmV0ZW5lc3MgcmF0aW5ncyBhcmUgYXNzb2NpYXRlZCB3aXRoIGZhc3RlciByZWFjdGlvbiB0aW1lcy5UaGUgc3ByZWFkIG9mIHBvaW50cyBhbmQgb3ZlcmxhcCBzaG93IHRoYXQgdGhpcyByZWxhdGlvbnNoaXAgaXMgcmVsYXRpdmVseSB3ZWFrIGdpdmVuIHRoZSBzbWFsbGVyIHNhbXBsZSBzaXplIHVzZWQuPGJyPiA8YnI+IDxicj4KCioqQ29uY2x1c2lvbioqIDxicj4gPGJyPgpUaGUgcHJlc2VudCBhbmFseXNpcyBleHBsb3JlZCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gd29yZCBjb25jcmV0ZW5lc3MgYW5kIHJlYWN0aW9uIHRpbWUgd2hpbGUgY29udHJvbGxpbmcgZm9yIHdvcmQgbGVuZ3RoIGFuZCB3b3JkIGZyZXF1ZW5jeS4gT3ZlcmFsbCwgdGhlIHJlc3VsdHMgc3VnZ2VzdCB0aGF0IGNvbmNyZXRlIHdvcmRzIHRlbmQgdG8gYmUgcHJvY2Vzc2VkIHNsaWdodGx5IGZhc3RlciB0aGFuIGFic3RyYWN0IHdvcmRzIHdoaWNoIGlzIGNvbnNpc3RlbnQgd2l0aCBwcmlvciBmaW5kaW5ncy4gVGhpcyBtYXkgaW5kaWNhdGUgdGhhdCBvdGhlciBsZXhpY2FsIGZhY3RvcnMgaGF2ZSBhIHNtYWxsZXIgaW5mbHVlbmNlIG9uIHJlYWN0aW9uIHRpbWUgdGhhbiBpbml0aWFsbHkgZXhwZWN0ZWQsIG9yIHRoYXQgcHJpb3IgcmVzZWFyY2ggaGFzIGFscmVhZHkgYWNjb3VudGVkIGZvciB0aGVzZSBmYWN0b3JzLiAKVGhlIHNtYWxsIHNhbXBsZSBzaXplIHVzZWQgbGltaXRzIHRoZSByZXN1bHRzLiBGdXR1cmUgc3R1ZGllcyB1c2luZyBhIGxhcmdlciBzYW1wbGUgd291bGQgaGVscCB0byBjbGFyaWZ5IHRoZSBlZmZlY3Qgb2YgY29uY3JldGVuZXNzIG9uIHJlYWN0aW9uIHRpbWVzLiBBZGRpdGlvbmFsbHksIHRoaXMgYW5hbHlzaXMgZm9jdXNlZCBvbmx5IG9uIGhpZ2ggZnJlcXVlbmN5IHdvcmRzLiBUaGUgaW5jbHVzaW9uIG9mIGxvd2VyIGZyZXF1ZW5jeSB3b3JkcyBtaWdodCB5aWVsZCBkaWZmZXJlbnQgcGF0dGVybnMuIDwvZGl2PiA8YnI+IDxicj4gPGJyPiA8YnI+IDxicj4gPGJyPiA8YnI+