Objectives

By the end of this assignment, you should:

This assignment is due Thursday, September 16th at noon. You should complete the assignment in the .Rmd template. Please turn your .html AND .Rmd files into Canvas. Your .Rmd file should knit without an error before turning in the assignment. If you need help, there a lot of resources available to you. Please reach out if you’re stuck.


To get started, you’ll need to download and open up the Rmarkdown template in RStudio. The first few exercises focus on data from the Lewis & Frank (2018) replication of the Xu and Tenenbaum (2007) experiment (that we talked about in lecture). We’ll be working with data from the first experiment only. For reference, the journal paper write up of this study can be found here, and you can see the actual experiment that participants saw here.

The data are in a file called lewis_2018_exp1.csv that lives on the internet. We can load the data into R by passing the online filepath to the read_csv() function. Once we read it into R, we can save it to a variable called lf_data:

lf_data <- read_csv("https://raw.githubusercontent.com/mllewis/cumulative-science/master/static/data/lewis_2018_exp1.csv")

There are six variables in the data and each variable is described below. The first six rows of the data frame are also displayed below.

exp subids trial_num category condition proportion_basic_level_responses
1 1 9 vehicles three_subordinate 0
1 2 9 animals three_basic 1
1 3 9 animals three_superordinate 1
1 4 9 vehicles three_superordinate 1
1 5 9 animals three_superordinate 1
1 6 9 vegetables three_subordinate 0


  1. Is this dataset tidy? Describe the smallest unit of observation in this dataset.

Yes. Smallest observation is subjids/category/condition. Would also accept subids/trial_num.


  1. Select the columns subids, category, proportion_basic_level_responses from the data. Print the first six rows of this data frame.
lf_data %>%
  select(subids, category, proportion_basic_level_responses) %>%
  head()
## # A tibble: 6 × 3
##   subids category   proportion_basic_level_responses
##    <dbl> <chr>                                 <dbl>
## 1      1 vehicles                                  0
## 2      2 animals                                   1
## 3      3 animals                                   1
## 4      4 vehicles                                  1
## 5      5 animals                                   1
## 6      6 vegetables                                0


  1. Print the first six rows of a data frame excluding the category column.
lf_data %>%
  select(-category) %>%
  head()
## # A tibble: 6 × 5
##     exp subids trial_num condition           proportion_basic_level_responses
##   <dbl>  <dbl>     <dbl> <chr>                                          <dbl>
## 1     1      1         9 three_subordinate                                  0
## 2     1      2         9 three_basic                                        1
## 3     1      3         9 three_superordinate                                1
## 4     1      4         9 three_superordinate                                1
## 5     1      5         9 three_superordinate                                1
## 6     1      6         9 three_subordinate                                  0

OR

lf_data %>%
    select(exp, subids, trial_num, condition,
           proportion_basic_level_responses) %>%
  head() 
## # A tibble: 6 × 5
##     exp subids trial_num condition           proportion_basic_level_responses
##   <dbl>  <dbl>     <dbl> <chr>                                          <dbl>
## 1     1      1         9 three_subordinate                                  0
## 2     1      2         9 three_basic                                        1
## 3     1      3         9 three_superordinate                                1
## 4     1      4         9 three_superordinate                                1
## 5     1      5         9 three_superordinate                                1
## 6     1      6         9 three_subordinate                                  0


  1. Use logical tests and Boolean operators to return only the rows that contain trials (rows): a) with category as vegetables, b) with category as vehicles and a trial greater than 3, c) with category as vegetables or animals, d) with at least one basic level response in the “one” condition.

a

lf_data %>%
  filter(category == "vegetables") 

b

lf_data %>%
  filter(category == "animals", trial_num < 7) 

c

lf_data %>%
  filter(category == "animals" | category == "vegetables") 

OR

filter(lf_data, category %in% c("animals", "vegetables"))

d

lf_data %>%
  filter(proportion_basic_level_responses > 0, condition == "one") 

OR

lf_data %>%
  filter(proportion_basic_level_responses >= 0.5, condition == "one")


  1. The following code selects all trials (rows) where the condition was either “three_subordinate” or “one.” Rewrite this code in a way that uses the %in% operator.
filter(lf_data, condition == "three_subordinate" | condition == "one")
filter(lf_data, condition %in%  c("three_subordinate", "one"))


  1. How many trials are there where the category is either vegetables or animals? Use nrow().
lf_data %>%
  filter(category == "vegetables"| category == "animals") %>%
  nrow()

OR

lf_data %>%
  filter(category %in% c("vegetables", "animals")) %>%
  nrow()


  1. The three following sets of commands are written without the pipe operator (%>%). Rewrite each one to include the pipe.

a

var1 <- mutate(lf_data, category)

b

var1 <- select(lf_data, category)
var2 <- nrow(var1)

c

var1 <- filter(lf_data, trial_num == 1)
var2 <- filter(var1, category == "animals")
var3 <- select(var2, trial_num, category)

a

var1 <- lf_data %>%
  mutate(category)

b

var1 <- lf_data %>% 
  select(category) %>%
  nrow()

c

var1 <- lf_data %>%
  filter(trial_num == 1,
        category == "animals") %>%
  select(trial_num, category)


  1. The two following sets of commands are written with the pipe operator. Rewrite each one to exclude the pipe.

a

lf_data %>%
  filter(trial_num < 6) %>%
  nrow()

b

lf_data %>%
  select(subids, category, proportion_basic_level_responses) %>%
  filter(subids == 1) %>%
  arrange(category)


  1. The two following sets of commands are written with the pipe operator. Rewrite each one to exclude the pipe.

a

var1 <- filter(lf_data, trial_num < 6) 
var2 <- nrow(var1)

OR

nrow(filter(lf_data,trial_num < 6))

b

var1 <- select(lf_data, subids, category, proportion_basic_level_responses) 
var2 <- filter(var1, subids == 1)
var3 <- arrange(var2, category)

OR

arrange(filter(select(lf_data,subids, category, proportion_basic_level_responses), subids == 1), category)


  1. Look at the code below. Describe in full sentences what this code does.
lf_data %>%
  select(subids, category, condition) %>%
  filter(category == "vehicles" & condition != "one") %>%
  arrange(-subids)


  1. On the first day of class, we talked about the “Sally Anne Task” that measures children’s understanding of theory of mind (example videos). Describe four variables that you could measure in this task to assess children’s theory of mind performance. Specifically, describe (1) one qualitative variable, (2) one quantitative - binary variable, (3) one quantitative - numeric, and (4) one quantitative - real variable. For each variable, give a one sentence description of the variable, AND one example value of that variable with units.

Nora: qualitative: We could measure how engaged the chid was with the task: whether the child seemed to be paying attention, was distracted, seemed confused, or was fussy.

Victoria: Qualitative: location of child’s gaze. This variable would be an observation of where the child is looking after the researcher demonstrates the task. Examples would include: basket, box, or the table (in between the basket and the box).

Jonathan: Qualitative variable: A variable that measure the child’s facial expression during the experiment. Possible values could be “interested”, “bored”, “puzzled”, etc.

Raina: Qualitative variable: This could be a type of variable that records the type of attention exhibited/displayed by each child who participated in the Sally Anne Task. Example value: A child could have an attention type of ‘attentive’, ‘fidgety’, ‘sleepy’, ‘bored’, etc.


  1. Describe the ways in which the scientific process could be described as a “social endeavor”. Your answer should make reference to the concepts of “replication” and “reproducibility”. Please respond with a short paragraph.

Erik: The scientific process could certainly be described as a “social endeavor”. When someone designs, executes, and publishes an experiment and their findings, other researchers interested in the same field will often look at these publications. Based on the findings, they may want to replicate the experiment in order to reproduce the findings. This is why, when going through the scientific process, it is important to consider replication, including describing the experiment fully and each step in detail. This will increase the reproducibility for other researchers, who may have good ideas to further the findings of the original experiment. This collaboration helps further the findings to adapt previous theories. So, if the original experiment had some theory as a result of the findings, replication of the experiment by others can prove or adapt the theory. If the experiment has reproducable findings, then a theory can be agreed upon. This shows how the scientific process is social, in that while one person may make a theory, it takes many to prove a theory right (reproducibility), or to adapt a theory after replicating an experiment.

Victoria: The scientific process can be considered a “social endeavor” because scientists and researchers must work together, collaborate, and share data to ensure that experiments are both replicable and reproducible. Replicability refers to repeating a study with the same hypothesis, experimental design, population, and analysis and achieving the same results. Replication involves communicating with other scientists whose experiments you are trying to replicate to ensure that there are no discrepancies and differing variables between your studies. Reproducibility refers to repeated procedures with replicated experiments that achieve the same results; the experimental plan and necessary code should be published online to ensure that other researchers who want to replicate the experiment have the data they need. Achieving reproducibility involves also communicating with scientists who have done previous research in the field to either confirm and build upon proposed theories if you have reproducible results or formulate new theories to reconciles differing results if you or others have different findings. Overall, the scientific process involves collaboration and sharing of data between researchers to reconcile findings and build upon theories.

Jaemin: The scientific process is used to see how the world works by acquiring knowledge in an empirical way by asking a specific question, conducting research in the area, providing a hypothesis, testing the hypothesis, gathering the data, and then report the conclusions. The process as a social endeavor is to solve these kinds of problems in order to complete certain tasks, satisfy needs, and make an advancement in society. However, we must make sure that when we do conduct the process that the results should be replicated, as we can conclude that it is more likely to be valid rather than by chance. The results must also be reproducible, so that we can make sure that we are obtaining consistent results when we use the same kind of input and conduct the same steps. Aiming these kinds of consistent results and being able to replicate these kinds of results is how the scientific process should work so it will be a social endeavor for our society going forward.

Bethany: Part of the scientific process relates to the ability to reproduce results. This is important to ensure that the results, and subsequent conclusions, are due to manipulations in the study rather than confounding factors (e.g., unknown third variables, procedural decisions, sample characteristics). This means that the results from studies must be reproducible by others who re-conduct the experiment, known as replication studies. Therefore, the scientific process could be considered as a social endeavor because the ability to replicate and reproduce results depends on dissemination of research and communication between researchers to uncover what the true relationships are between variables.

Emily: The scientific process could be described as a social endeavor because a proper scientific study should involve the experiment being able to be replicated by other scientists, and it in fact should be replicated or reproduced by other scientists to ensure that the same results can be found when the experiment is repeated by other people. This allows for any biases by the initial experimenters to be eliminated (e.g. if the initial group of experimenters was looking for a specific outcome and allowed their bias to influence the way they performed the experiment), as well as any errors that they may have made in the process. Replication involves repeating a study with the same exact population, hypothesis, experimental design, and analytic plan, and would ideally result in obtaining the same results as the study you’re modeling off of, while reproducing a study involves repeating the same procedure, by not necessarily with the same population, etc., and would also ideally result in obtaining the same results as the initial study. Because replication and reproducibility of studies are vital to showing that the results they obtain are both valid and reliable, the scientific process must be a social endeavor, since generating a standing theory would therefore involve many different groups of scientists testing the same theory individually, and this means that a true theory can’t really be proved by just one person.

LS0tCnRpdGxlOiAiQXNzaWdubWVudCAxOiBDdW11bGF0aXZlIFNjaWVuY2UgYW5kIEludHJvIHRvIGRwbHlyIC0gU09MVVRJT05TIgpzdWJ0aXRsZTogIk1vZGVybiBSZXNlYXJjaCBNZXRob2RzIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNzczogbGFiLmNzcwogICAgaGlnaGxpZ2h0OiBrYXRlCiAgICB0aGVtZTogY29zbW8KICAgIHRvYzogZmFsc2UKICAgIHRvY19mbG9hdDogZmFsc2UKLS0tCgpgYGB7ciBnbG9iYWxfb3B0aW9ucywgaW5jbHVkZSA9IEZ9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGtuaXRyKQpgYGAKCgo8YnI+Cjxicj4KPGRpdiBpZD0iYm94ZWR0ZXh0Ij4KCiA8Zm9udCBzaXplPSI0Ij4gKipPYmplY3RpdmVzKiogPC9mb250PiAKIApCeSB0aGUgZW5kIG9mIHRoaXMgYXNzaWdubWVudCwgeW91IHNob3VsZDoKCi0gdW5kZXJzdGFuZCB0aGUgY29uY2VwdCBvZiAiY3VtdWxhdGl2ZSBzY2llbmNlIgotIGJlIGFibGUgdG8gaWRlbnRpZnkgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZQotIHVuZGVyc3RhbmQgdGhlIHByb3BlcnRpZXMgb2YgInRpZHkgZGF0YSIKLSB1bmRlcnN0YW5kIGhvdyB0byBpc29sYXRlIGRhdGEgKCBgc2VsZWN0YCwgYGZpbHRlcmAsIGBhcnJhbmdlYCkKLSB1bmRlcnN0YW5kIGhvdyB0byB1c2UgdGhlIHBpcGUgb3BlcmF0b3IgKGAlPiVgKQo8L2Rpdj4KClRoaXMgYXNzaWdubWVudCBpcyBkdWUgKipUaHVyc2RheSwgU2VwdGVtYmVyIDE2dGggYXQgbm9vbioqLiBZb3Ugc2hvdWxkIGNvbXBsZXRlIHRoZSBhc3NpZ25tZW50IGluIHRoZSAuUm1kIHRlbXBsYXRlLiBQbGVhc2UgdHVybiB5b3VyIC5odG1sIEFORCAuUm1kIGZpbGVzIGludG8gQ2FudmFzLiBZb3VyIC5SbWQgZmlsZSBzaG91bGQga25pdCB3aXRob3V0IGFuIGVycm9yIGJlZm9yZSB0dXJuaW5nIGluIHRoZSBhc3NpZ25tZW50LiBJZiB5b3UgbmVlZCBoZWxwLCB0aGVyZSBbYSBsb3Qgb2YgcmVzb3VyY2VzXSgvcmVzb3VyY2UvZ2V0dGluZ19oZWxwLykgYXZhaWxhYmxlIHRvIHlvdS4gUGxlYXNlIHJlYWNoIG91dCBpZiB5b3UncmUgc3R1Y2suIAoKPGJyPiAKClRvIGdldCBzdGFydGVkLCB5b3UnbGwgbmVlZCB0byBkb3dubG9hZCBhbmQgb3BlbiB1cCB0aGUgPGEgaHJlZj0iL2Fzc2lnbm1lbnQvMDFfTVJNX2Fzc2lnbm1lbnRfdGVtcGxhdGUuUm1kIiBkb3dubG9hZD5SbWFya2Rvd24gdGVtcGxhdGU8L2E+IGluIFJTdHVkaW8uIFRoZSBmaXJzdCBmZXcgZXhlcmNpc2VzICBmb2N1cyBvbiBkYXRhIGZyb20gdGhlIExld2lzICYgRnJhbmsgKDIwMTgpIHJlcGxpY2F0aW9uIG9mIHRoZSBYdSBhbmQgVGVuZW5iYXVtICgyMDA3KSBleHBlcmltZW50ICh0aGF0IHdlIHRhbGtlZCBhYm91dCBpbiBsZWN0dXJlKS4gV2UnbGwgYmUgd29ya2luZyB3aXRoIGRhdGEgZnJvbSB0aGUgZmlyc3QgZXhwZXJpbWVudCBvbmx5LiAgRm9yIHJlZmVyZW5jZSwgdGhlIGpvdXJuYWwgcGFwZXIgd3JpdGUgdXAgb2YgdGhpcyBzdHVkeSBjYW4gYmUgZm91bmQgW2hlcmVdKGh0dHA6Ly93d3cuYW5kcmV3LmNtdS5lZHUvdXNlci9tb2xseWxldy9wYXBlcnMvTEZfMjAxOC5wZGYpLCBhbmQgeW91IGNhbiBzZWUgdGhlIGFjdHVhbCBleHBlcmltZW50IHRoYXQgcGFydGljaXBhbnRzIHNhdyBbaGVyZV0oaHR0cHM6Ly9sYW5nY29nLnN0YW5mb3JkLmVkdS9leHB0cy9NTEwvWFRNRU0vZXhwMS9leHAxLmh0bWwpLgoKVGhlIGRhdGEgYXJlIGluIGEgZmlsZSBjYWxsZWQgYGxld2lzXzIwMThfZXhwMS5jc3ZgIHRoYXQgbGl2ZXMgb24gdGhlIGludGVybmV0LiBXZSBjYW4gbG9hZCB0aGUgZGF0YSBpbnRvIFIgYnkgcGFzc2luZyB0aGUgb25saW5lIGZpbGVwYXRoIHRvIHRoZSBgcmVhZF9jc3YoKWAgZnVuY3Rpb24uIE9uY2Ugd2UgcmVhZCBpdCBpbnRvIFIsIHdlIGNhbiBzYXZlIGl0IHRvIGEgdmFyaWFibGUgY2FsbGVkIGBsZl9kYXRhYDoKYGBge3IsIG1lc3NhZ2UgPSBGfQpsZl9kYXRhIDwtIHJlYWRfY3N2KCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbWxsZXdpcy9jdW11bGF0aXZlLXNjaWVuY2UvbWFzdGVyL3N0YXRpYy9kYXRhL2xld2lzXzIwMThfZXhwMS5jc3YiKQpgYGAKClRoZXJlIGFyZSBzaXggdmFyaWFibGVzIGluIHRoZSBkYXRhIGFuZCBlYWNoIHZhcmlhYmxlIGlzIGRlc2NyaWJlZCBiZWxvdy4gVGhlIGZpcnN0IHNpeCByb3dzIG9mIHRoZSBkYXRhIGZyYW1lIGFyZSBhbHNvIGRpc3BsYXllZCBiZWxvdy4gCgoqICoqZXhwKiogLSBFeHBlcmltZW50IG51bWJlci4gTGV3aXMgJiBGcmFuayAoMjAxNikgaGFkIDEyIGV4cGVyaW1lbnRzIGluIGl0OyB0aGUgcHJlc2VudCBkYXRhc2V0IG9ubHkgaW5jbHVkZXMgdGhlIGRhdGEgZnJvbSB0aGUgZmlyc3QgZXhwZXJpbWVudC4KKiAqKnN1YmlkcyoqIC0gU3ViamVjdCBJRC4gVGhpcyBpcyBhbiBhbm9ueW1vdXMgaWQgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIGV2ZXJ5IHBhcnRpY2lwYW50IGluIHRoZSBzdHVkeS4KKiAqKnRyaWFsX251bSoqIC0gRWFjaCBwYXJ0aWNpcGFudCBjb21wbGV0ZWQgMTIgInRyaWFscy4iIEluIHRoaXMgY2FzZSwgYSB0cmlhbCBpcyBhIHNpbmdsZSBzY3JlZW4gd2hlcmUgdGhlIHBhcnRpY2lwYW50IHNlZXMgYSBub3ZlbCB3b3JkLCBvbmUgb3IgbW9yZSBleGFtcGxlcywgYW5kIHRoZW4gaXMgYXNrZWQgdG8gY2xpY2sgb24gb3RoZXIgZXhhbXBsZXMgb2YgdGhlIG5vdmVsIHdvcmQuCiogKipjYXRlZ29yeSoqIC0gVGhlcmUgd2VyZSB0aHJlZSBkaWZmZXJlbnQgY2F0ZWdvcmllcyBvZiBvYmplY3RzOiB2ZWhpY2xlcywgdmVnZXRhYmxlcywgYW5kIGFuaW1hbHMuIEVhY2ggcGFydGljaXBhbnQgc2F3IHNvbWUgdHJpYWxzIGZyb20gZWFjaCBjYXRlZ29yeS4gCiogKipjb25kaXRpb24qKiAtIFRoaXMgaXMgdGhlIHZhcmlhYmxlIHRoYXQgd2UgbWFuaXB1bGF0ZWQuIEl0IHJlZmVycyB0byB0aGUgbnVtYmVyIG9mIGV4YW1wbGVzIG9mIHRoZSBub3ZlbCB3b3JkIHBhcnRpY2lwYW50cyBzYXcgYXQgdGhlIHRvcCBvZiB0aGUgcGFnZS4gUGFydGljaXBhbnRzIHNhdyBlaXRoZXIgMyBzdWJvcmRpbmF0ZSBleGFtcGxlcyAoInRocmVlX3N1Ym9yZGluYXRlIjsgZS5nLiwgMyBkYWxtYXRpb25zKSwgIDMgYmFzaWMgbGV2ZWwgZXhhbXBsZXMgKCJ0aHJlZV9iYXNpYyI7IGUuZy4gYSBkYWxtYXRpb24sIGEgcG9vZGxlLCBhbmQgYSBiZXJuZXNlIG1vdW50YWluIGRvZyksIDMgc3VwZXJvcmRpbmF0ZSBleGFtcGxlcyAoInRocmVlX3N1cGVyb3JkaW5hdGUiOyBlLmcuIGEgZGFsbWF0aW9uLCBhIHJhYmJpdCwgYW5kIGEgaG9yc2UpLCBvciBqdXN0IGEgc2luZ2xlIGV4YW1wbGUgKCJvbmUiOyBlLmcuIDEgZGFsbWF0aW9uKS4KKiAqKnByb3BvcnRpb25fYmFzaWNfbGV2ZWxfcmVzcG9uc2VzKiogLSBUaGlzIGlzIHRoZSB2YXJpYWJsZSB0aGF0IHdlIG1lYXN1cmVkLiBJdCByZWZlcnMgdG8gdGhlIHByb3BvcnRpb24gKG91dCBvZiAyIHBvc3NpYmxlKSBvZiBiYXNpYyBsZXZlbCBleGFtcGxlcyB0aGF0IGEgcGFydGljaXBhbnQgc2VsZWN0ZWQuIAoKYGBge3IsIGVjaG8gPUZ9CmthYmxlKGhlYWQobGZfZGF0YSkpCmBgYAoKPGJyPiAKCigxKSBJcyB0aGlzIGRhdGFzZXQgdGlkeT8gRGVzY3JpYmUgdGhlIHNtYWxsZXN0IHVuaXQgb2Ygb2JzZXJ2YXRpb24gaW4gdGhpcyBkYXRhc2V0LgoKWWVzLiBTbWFsbGVzdCBvYnNlcnZhdGlvbiBpcyBzdWJqaWRzL2NhdGVnb3J5L2NvbmRpdGlvbi4gV291bGQgYWxzbyBhY2NlcHQgc3ViaWRzL3RyaWFsX251bS4gCgoKPGJyPiAKCigxKSBTZWxlY3QgdGhlIGNvbHVtbnMgYHN1Ymlkc2AsIGBjYXRlZ29yeWAsIGBwcm9wb3J0aW9uX2Jhc2ljX2xldmVsX3Jlc3BvbnNlc2AgZnJvbSB0aGUgZGF0YS4gUHJpbnQgdGhlIGZpcnN0IHNpeCByb3dzIG9mIHRoaXMgZGF0YSBmcmFtZS4gCgpgYGB7cn0KbGZfZGF0YSAlPiUKICBzZWxlY3Qoc3ViaWRzLCBjYXRlZ29yeSwgcHJvcG9ydGlvbl9iYXNpY19sZXZlbF9yZXNwb25zZXMpICU+JQogIGhlYWQoKQpgYGAKCgo8YnI+IAoKKDEpIFByaW50IHRoZSBmaXJzdCBzaXggcm93cyBvZiBhIGRhdGEgZnJhbWUgZXhjbHVkaW5nIHRoZSBgY2F0ZWdvcnlgIGNvbHVtbi4KCmBgYHtyfQpsZl9kYXRhICU+JQogIHNlbGVjdCgtY2F0ZWdvcnkpICU+JQogIGhlYWQoKQpgYGAKCk9SIAoKYGBge3J9CmxmX2RhdGEgJT4lCiAgICBzZWxlY3QoZXhwLCBzdWJpZHMsIHRyaWFsX251bSwgY29uZGl0aW9uLAogICAgICAgICAgIHByb3BvcnRpb25fYmFzaWNfbGV2ZWxfcmVzcG9uc2VzKSAlPiUKICBoZWFkKCkgCmBgYAoKPGJyPiAKCigxKSBVc2UgbG9naWNhbCB0ZXN0cyBhbmQgQm9vbGVhbiBvcGVyYXRvcnMgdG8gcmV0dXJuIG9ubHkgdGhlIHJvd3MgdGhhdCBjb250YWluIHRyaWFscyAocm93cyk6IGEpIHdpdGggY2F0ZWdvcnkgYXMgdmVnZXRhYmxlcywgYikgd2l0aCBjYXRlZ29yeSBhcyB2ZWhpY2xlcyBhbmQgYSB0cmlhbCBncmVhdGVyIHRoYW4gMywgYykgd2l0aCBjYXRlZ29yeSBhcyB2ZWdldGFibGVzIG9yIGFuaW1hbHMsIGQpIHdpdGggYXQgbGVhc3Qgb25lIGJhc2ljIGxldmVsIHJlc3BvbnNlIGluIHRoZSAib25lIiBjb25kaXRpb24uCgoKIyMgYQpgYGB7ciwgIGV2YWwgPSBGfQpsZl9kYXRhICU+JQogIGZpbHRlcihjYXRlZ29yeSA9PSAidmVnZXRhYmxlcyIpIAoKYGBgCgojIyBiCmBgYHtyLCAsIGV2YWwgPSBGfQpsZl9kYXRhICU+JQogIGZpbHRlcihjYXRlZ29yeSA9PSAiYW5pbWFscyIsIHRyaWFsX251bSA8IDcpIApgYGAKCiMjIGMKYGBge3IsIGV2YWwgPSBGfQpsZl9kYXRhICU+JQogIGZpbHRlcihjYXRlZ29yeSA9PSAiYW5pbWFscyIgfCBjYXRlZ29yeSA9PSAidmVnZXRhYmxlcyIpIApgYGAKCk9SIAoKYGBge3IsIGV2YWwgPSBGfQpmaWx0ZXIobGZfZGF0YSwgY2F0ZWdvcnkgJWluJSBjKCJhbmltYWxzIiwgInZlZ2V0YWJsZXMiKSkKYGBgCgojIyBkCmBgYHtyLCAsIGV2YWwgPSBGfQpsZl9kYXRhICU+JQogIGZpbHRlcihwcm9wb3J0aW9uX2Jhc2ljX2xldmVsX3Jlc3BvbnNlcyA+IDAsIGNvbmRpdGlvbiA9PSAib25lIikgCmBgYAoKT1IgCgpgYGB7ciwgZXZhbCA9IEZ9CmxmX2RhdGEgJT4lCiAgZmlsdGVyKHByb3BvcnRpb25fYmFzaWNfbGV2ZWxfcmVzcG9uc2VzID49IDAuNSwgY29uZGl0aW9uID09ICJvbmUiKQpgYGAKCjxicj4gCgooMSkgVGhlIGZvbGxvd2luZyBjb2RlIHNlbGVjdHMgYWxsIHRyaWFscyAocm93cykgd2hlcmUgdGhlIGNvbmRpdGlvbiB3YXMgZWl0aGVyICJ0aHJlZV9zdWJvcmRpbmF0ZSIgb3IgIm9uZS4iIFJld3JpdGUgdGhpcyBjb2RlIGluIGEgd2F5IHRoYXQgdXNlcyB0aGUgYCVpbiVgIG9wZXJhdG9yLiAKCmBgYHtyLCBldmFsID0gRn0KZmlsdGVyKGxmX2RhdGEsIGNvbmRpdGlvbiA9PSAidGhyZWVfc3Vib3JkaW5hdGUiIHwgY29uZGl0aW9uID09ICJvbmUiKQpgYGAKCgpgYGB7ciwgZXZhbCA9IEZ9CmZpbHRlcihsZl9kYXRhLCBjb25kaXRpb24gJWluJSAgYygidGhyZWVfc3Vib3JkaW5hdGUiLCAib25lIikpCmBgYAoKPGJyPiAKCigxKSBIb3cgbWFueSB0cmlhbHMgYXJlIHRoZXJlIHdoZXJlIHRoZSBjYXRlZ29yeSBpcyBlaXRoZXIgdmVnZXRhYmxlcyBvciBhbmltYWxzPyBVc2UgYG5yb3coKWAuCgpgYGB7ciwgLCBldmFsID0gRn0KbGZfZGF0YSAlPiUKICBmaWx0ZXIoY2F0ZWdvcnkgPT0gInZlZ2V0YWJsZXMifCBjYXRlZ29yeSA9PSAiYW5pbWFscyIpICU+JQogIG5yb3coKQpgYGAKCk9SCgpgYGB7ciwgLCBldmFsID0gRn0KbGZfZGF0YSAlPiUKICBmaWx0ZXIoY2F0ZWdvcnkgJWluJSBjKCJ2ZWdldGFibGVzIiwgImFuaW1hbHMiKSkgJT4lCiAgbnJvdygpCmBgYAoKPGJyPiAKCgooMSkgVGhlIHRocmVlIGZvbGxvd2luZyBzZXRzIG9mIGNvbW1hbmRzIGFyZSB3cml0dGVuIHdpdGhvdXQgdGhlIHBpcGUgb3BlcmF0b3IgKGAlPiVgKS4gUmV3cml0ZSBlYWNoIG9uZSB0byBpbmNsdWRlIHRoZSBwaXBlLiAKClthXQpgYGB7cn0KdmFyMSA8LSBtdXRhdGUobGZfZGF0YSwgY2F0ZWdvcnkpCmBgYAoKW2JdCmBgYHtyfQp2YXIxIDwtIHNlbGVjdChsZl9kYXRhLCBjYXRlZ29yeSkKdmFyMiA8LSBucm93KHZhcjEpCmBgYAoKW2NdCmBgYHtyfQp2YXIxIDwtIGZpbHRlcihsZl9kYXRhLCB0cmlhbF9udW0gPT0gMSkKdmFyMiA8LSBmaWx0ZXIodmFyMSwgY2F0ZWdvcnkgPT0gImFuaW1hbHMiKQp2YXIzIDwtIHNlbGVjdCh2YXIyLCB0cmlhbF9udW0sIGNhdGVnb3J5KQpgYGAKCgojIyBhCmBgYHtyfQp2YXIxIDwtIGxmX2RhdGEgJT4lCiAgbXV0YXRlKGNhdGVnb3J5KQpgYGAKCiMjIGIKYGBge3J9CnZhcjEgPC0gbGZfZGF0YSAlPiUgCiAgc2VsZWN0KGNhdGVnb3J5KSAlPiUKICBucm93KCkKYGBgCgoKIyMgYwpgYGB7cn0KdmFyMSA8LSBsZl9kYXRhICU+JQogIGZpbHRlcih0cmlhbF9udW0gPT0gMSwKICAgICAgICBjYXRlZ29yeSA9PSAiYW5pbWFscyIpICU+JQogIHNlbGVjdCh0cmlhbF9udW0sIGNhdGVnb3J5KQpgYGAKCgoKPGJyPiAKCigxKSBUaGUgdHdvIGZvbGxvd2luZyBzZXRzIG9mIGNvbW1hbmRzIGFyZSB3cml0dGVuIHdpdGggdGhlIHBpcGUgb3BlcmF0b3IuIFJld3JpdGUgZWFjaCBvbmUgdG8gZXhjbHVkZSB0aGUgcGlwZS4gCgpbYV0KYGBge3IsIGV2YWwgPSBGfQpsZl9kYXRhICU+JQogIGZpbHRlcih0cmlhbF9udW0gPCA2KSAlPiUKICBucm93KCkKYGBgCgpbYl0KYGBge3IsIGV2YWwgPSBGfQpsZl9kYXRhICU+JQogIHNlbGVjdChzdWJpZHMsIGNhdGVnb3J5LCBwcm9wb3J0aW9uX2Jhc2ljX2xldmVsX3Jlc3BvbnNlcykgJT4lCiAgZmlsdGVyKHN1YmlkcyA9PSAxKSAlPiUKICBhcnJhbmdlKGNhdGVnb3J5KQpgYGAKCjxicj4gCgooMSkgVGhlIHR3byBmb2xsb3dpbmcgc2V0cyBvZiBjb21tYW5kcyBhcmUgd3JpdHRlbiB3aXRoIHRoZSBwaXBlIG9wZXJhdG9yLiBSZXdyaXRlIGVhY2ggb25lIHRvIGV4Y2x1ZGUgdGhlIHBpcGUuIAoKIyMgYQpgYGB7ciwgZXZhbCA9IEZ9CnZhcjEgPC0gZmlsdGVyKGxmX2RhdGEsIHRyaWFsX251bSA8IDYpIAp2YXIyIDwtIG5yb3codmFyMSkKYGBgCgpPUgoKYGBge3IsIGV2YWwgPSBGfQpucm93KGZpbHRlcihsZl9kYXRhLHRyaWFsX251bSA8IDYpKQpgYGAKCgojIyBiCmBgYHtyLCBldmFsID0gRn0KCnZhcjEgPC0gc2VsZWN0KGxmX2RhdGEsIHN1YmlkcywgY2F0ZWdvcnksIHByb3BvcnRpb25fYmFzaWNfbGV2ZWxfcmVzcG9uc2VzKSAKdmFyMiA8LSBmaWx0ZXIodmFyMSwgc3ViaWRzID09IDEpCnZhcjMgPC0gYXJyYW5nZSh2YXIyLCBjYXRlZ29yeSkKYGBgCgpPUgoKYGBge3IsIGV2YWwgPSBGfQphcnJhbmdlKGZpbHRlcihzZWxlY3QobGZfZGF0YSxzdWJpZHMsIGNhdGVnb3J5LCBwcm9wb3J0aW9uX2Jhc2ljX2xldmVsX3Jlc3BvbnNlcyksIHN1YmlkcyA9PSAxKSwgY2F0ZWdvcnkpCmBgYAoKCjxicj4gCgooMSkgTG9vayBhdCB0aGUgY29kZSBiZWxvdy4gRGVzY3JpYmUgaW4gZnVsbCBzZW50ZW5jZXMgd2hhdCB0aGlzIGNvZGUgZG9lcy4KCmBgYHtyLCBldmFsID0gRn0KbGZfZGF0YSAlPiUKICBzZWxlY3Qoc3ViaWRzLCBjYXRlZ29yeSwgY29uZGl0aW9uKSAlPiUKICBmaWx0ZXIoY2F0ZWdvcnkgPT0gInZlaGljbGVzIiAmIGNvbmRpdGlvbiAhPSAib25lIikgJT4lCiAgYXJyYW5nZSgtc3ViaWRzKQpgYGAKCjxicj4gCgooMSkgT24gdGhlIGZpcnN0IGRheSBvZiBjbGFzcywgd2UgdGFsa2VkIGFib3V0IHRoZSAiU2FsbHkgQW5uZSBUYXNrIiB0aGF0IG1lYXN1cmVzIGNoaWxkcmVuJ3MgdW5kZXJzdGFuZGluZyBvZiB0aGVvcnkgb2YgbWluZCAoW2V4YW1wbGUgdmlkZW9zXShodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PW9heksyZmtSVTFBXSkpLiBEZXNjcmliZSBmb3VyIHZhcmlhYmxlcyB0aGF0IHlvdSBjb3VsZCBtZWFzdXJlIGluIHRoaXMgdGFzayB0byBhc3Nlc3MgY2hpbGRyZW4ncyB0aGVvcnkgb2YgbWluZCBwZXJmb3JtYW5jZS4gU3BlY2lmaWNhbGx5LCBkZXNjcmliZSAoMSkgb25lIHF1YWxpdGF0aXZlIHZhcmlhYmxlLCAoMikgb25lIHF1YW50aXRhdGl2ZSAtIGJpbmFyeSB2YXJpYWJsZSwgKDMpIG9uZSBxdWFudGl0YXRpdmUgLSBudW1lcmljLCBhbmQgKDQpIG9uZSBxdWFudGl0YXRpdmUgLSAgcmVhbCB2YXJpYWJsZS4gRm9yIGVhY2ggdmFyaWFibGUsIGdpdmUgYSBvbmUgc2VudGVuY2UgZGVzY3JpcHRpb24gb2YgdGhlIHZhcmlhYmxlLCBBTkQgb25lIGV4YW1wbGUgdmFsdWUgb2YgdGhhdCB2YXJpYWJsZSB3aXRoIHVuaXRzLgoKKipOb3JhKio6IHF1YWxpdGF0aXZlOiBXZSBjb3VsZCBtZWFzdXJlIGhvdyBlbmdhZ2VkIHRoZSBjaGlkIHdhcyB3aXRoIHRoZSB0YXNrOiB3aGV0aGVyIHRoZSBjaGlsZCBzZWVtZWQgdG8gYmUgcGF5aW5nIGF0dGVudGlvbiwgd2FzIGRpc3RyYWN0ZWQsIHNlZW1lZCBjb25mdXNlZCwgb3Igd2FzIGZ1c3N5LgoKKipWaWN0b3JpYSoqOiBRdWFsaXRhdGl2ZTogbG9jYXRpb24gb2YgY2hpbGTigJlzIGdhemUuIFRoaXMgdmFyaWFibGUgd291bGQgYmUgYW4gb2JzZXJ2YXRpb24gb2Ygd2hlcmUgdGhlIGNoaWxkIGlzIGxvb2tpbmcgYWZ0ZXIgdGhlIHJlc2VhcmNoZXIgZGVtb25zdHJhdGVzIHRoZSB0YXNrLiBFeGFtcGxlcyB3b3VsZCBpbmNsdWRlOiBiYXNrZXQsIGJveCwgb3IgdGhlIHRhYmxlIChpbiBiZXR3ZWVuIHRoZSBiYXNrZXQgYW5kIHRoZSBib3gpLgoKKipKb25hdGhhbioqOiBRdWFsaXRhdGl2ZSB2YXJpYWJsZTogQSB2YXJpYWJsZSB0aGF0IG1lYXN1cmUgdGhlIGNoaWxk4oCZcyBmYWNpYWwgZXhwcmVzc2lvbiBkdXJpbmcgdGhlIGV4cGVyaW1lbnQuIFBvc3NpYmxlIHZhbHVlcyBjb3VsZCBiZSDigJxpbnRlcmVzdGVk4oCdLCDigJxib3JlZOKAnSwg4oCccHV6emxlZOKAnSwgZXRjLgoKKipSYWluYSoqOiBRdWFsaXRhdGl2ZSB2YXJpYWJsZTogVGhpcyBjb3VsZCBiZSBhIHR5cGUgb2YgdmFyaWFibGUgdGhhdCByZWNvcmRzIHRoZSB0eXBlIG9mIGF0dGVudGlvbiBleGhpYml0ZWQvZGlzcGxheWVkIGJ5IGVhY2ggY2hpbGQgd2hvIHBhcnRpY2lwYXRlZCBpbiB0aGUgU2FsbHkgQW5uZSBUYXNrLiBFeGFtcGxlIHZhbHVlOiBBIGNoaWxkIGNvdWxkIGhhdmUgYW4gYXR0ZW50aW9uIHR5cGUgb2Yg4oCYYXR0ZW50aXZl4oCZLCDigJhmaWRnZXR54oCZLCDigJhzbGVlcHnigJksIOKAmGJvcmVk4oCZLCBldGMuCgo8YnI+IAoKCigxKSBEZXNjcmliZSB0aGUgd2F5cyBpbiB3aGljaCB0aGUgc2NpZW50aWZpYyBwcm9jZXNzIGNvdWxkIGJlIGRlc2NyaWJlZCBhcyBhICJzb2NpYWwgZW5kZWF2b3IiLiBZb3VyIGFuc3dlciBzaG91bGQgbWFrZSByZWZlcmVuY2UgdG8gdGhlIGNvbmNlcHRzIG9mICJyZXBsaWNhdGlvbiIgYW5kICJyZXByb2R1Y2liaWxpdHkiLiBQbGVhc2UgcmVzcG9uZCB3aXRoIGEgc2hvcnQgcGFyYWdyYXBoLiAKCioqRXJpayoqOiBUaGUgc2NpZW50aWZpYyBwcm9jZXNzIGNvdWxkIGNlcnRhaW5seSBiZSBkZXNjcmliZWQgYXMgYSDigJxzb2NpYWwgZW5kZWF2b3LigJ0uIFdoZW4gc29tZW9uZSBkZXNpZ25zLCBleGVjdXRlcywgYW5kIHB1Ymxpc2hlcyBhbiBleHBlcmltZW50IGFuZCB0aGVpciBmaW5kaW5ncywgb3RoZXIgcmVzZWFyY2hlcnMgaW50ZXJlc3RlZCBpbiB0aGUgc2FtZSBmaWVsZCB3aWxsIG9mdGVuIGxvb2sgYXQgdGhlc2UgcHVibGljYXRpb25zLiBCYXNlZCBvbiB0aGUgZmluZGluZ3MsIHRoZXkgbWF5IHdhbnQgdG8gcmVwbGljYXRlIHRoZSBleHBlcmltZW50IGluIG9yZGVyIHRvIHJlcHJvZHVjZSB0aGUgZmluZGluZ3MuIFRoaXMgaXMgd2h5LCB3aGVuIGdvaW5nIHRocm91Z2ggdGhlIHNjaWVudGlmaWMgcHJvY2VzcywgaXQgaXMgaW1wb3J0YW50IHRvIGNvbnNpZGVyIHJlcGxpY2F0aW9uLCBpbmNsdWRpbmcgZGVzY3JpYmluZyB0aGUgZXhwZXJpbWVudCBmdWxseSBhbmQgZWFjaCBzdGVwIGluIGRldGFpbC4gVGhpcyB3aWxsIGluY3JlYXNlIHRoZSByZXByb2R1Y2liaWxpdHkgZm9yIG90aGVyIHJlc2VhcmNoZXJzLCB3aG8gbWF5IGhhdmUgZ29vZCBpZGVhcyB0byBmdXJ0aGVyIHRoZSBmaW5kaW5ncyBvZiB0aGUgb3JpZ2luYWwgZXhwZXJpbWVudC4gVGhpcyBjb2xsYWJvcmF0aW9uIGhlbHBzIGZ1cnRoZXIgdGhlIGZpbmRpbmdzIHRvIGFkYXB0IHByZXZpb3VzIHRoZW9yaWVzLiBTbywgaWYgdGhlIG9yaWdpbmFsIGV4cGVyaW1lbnQgaGFkIHNvbWUgdGhlb3J5IGFzIGEgcmVzdWx0IG9mIHRoZSBmaW5kaW5ncywgcmVwbGljYXRpb24gb2YgdGhlIGV4cGVyaW1lbnQgYnkgb3RoZXJzIGNhbiBwcm92ZSBvciBhZGFwdCB0aGUgdGhlb3J5LiBJZiB0aGUgZXhwZXJpbWVudCBoYXMgcmVwcm9kdWNhYmxlIGZpbmRpbmdzLCB0aGVuIGEgdGhlb3J5IGNhbiBiZSBhZ3JlZWQgdXBvbi4gVGhpcyBzaG93cyBob3cgdGhlIHNjaWVudGlmaWMgcHJvY2VzcyBpcyBzb2NpYWwsIGluIHRoYXQgd2hpbGUgb25lIHBlcnNvbiBtYXkgbWFrZSBhIHRoZW9yeSwgaXQgdGFrZXMgbWFueSB0byBwcm92ZSBhIHRoZW9yeSByaWdodCAocmVwcm9kdWNpYmlsaXR5KSwgb3IgdG8gYWRhcHQgYSB0aGVvcnkgYWZ0ZXIgcmVwbGljYXRpbmcgYW4gZXhwZXJpbWVudC4KCioqVmljdG9yaWEqKjogVGhlIHNjaWVudGlmaWMgcHJvY2VzcyBjYW4gYmUgY29uc2lkZXJlZCBhIOKAnHNvY2lhbCBlbmRlYXZvcuKAnSBiZWNhdXNlIHNjaWVudGlzdHMgYW5kIHJlc2VhcmNoZXJzIG11c3Qgd29yayB0b2dldGhlciwgY29sbGFib3JhdGUsIGFuZCBzaGFyZSBkYXRhIHRvIGVuc3VyZSB0aGF0IGV4cGVyaW1lbnRzIGFyZSBib3RoIHJlcGxpY2FibGUgYW5kIHJlcHJvZHVjaWJsZS4gUmVwbGljYWJpbGl0eSByZWZlcnMgdG8gcmVwZWF0aW5nIGEgc3R1ZHkgd2l0aCB0aGUgc2FtZSBoeXBvdGhlc2lzLCBleHBlcmltZW50YWwgZGVzaWduLCBwb3B1bGF0aW9uLCBhbmQgYW5hbHlzaXMgYW5kIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzLiBSZXBsaWNhdGlvbiBpbnZvbHZlcyBjb21tdW5pY2F0aW5nIHdpdGggb3RoZXIgc2NpZW50aXN0cyB3aG9zZSBleHBlcmltZW50cyB5b3UgYXJlIHRyeWluZyB0byByZXBsaWNhdGUgdG8gZW5zdXJlIHRoYXQgdGhlcmUgYXJlIG5vIGRpc2NyZXBhbmNpZXMgYW5kIGRpZmZlcmluZyB2YXJpYWJsZXMgYmV0d2VlbiB5b3VyIHN0dWRpZXMuIFJlcHJvZHVjaWJpbGl0eSByZWZlcnMgdG8gcmVwZWF0ZWQgcHJvY2VkdXJlcyB3aXRoIHJlcGxpY2F0ZWQgZXhwZXJpbWVudHMgdGhhdCBhY2hpZXZlIHRoZSBzYW1lIHJlc3VsdHM7IHRoZSBleHBlcmltZW50YWwgcGxhbiBhbmQgbmVjZXNzYXJ5IGNvZGUgc2hvdWxkIGJlIHB1Ymxpc2hlZCBvbmxpbmUgdG8gZW5zdXJlIHRoYXQgb3RoZXIgcmVzZWFyY2hlcnMgd2hvIHdhbnQgdG8gcmVwbGljYXRlIHRoZSBleHBlcmltZW50IGhhdmUgdGhlIGRhdGEgdGhleSBuZWVkLiBBY2hpZXZpbmcgcmVwcm9kdWNpYmlsaXR5IGludm9sdmVzIGFsc28gY29tbXVuaWNhdGluZyB3aXRoIHNjaWVudGlzdHMgd2hvIGhhdmUgZG9uZSBwcmV2aW91cyByZXNlYXJjaCBpbiB0aGUgZmllbGQgdG8gZWl0aGVyIGNvbmZpcm0gYW5kIGJ1aWxkIHVwb24gcHJvcG9zZWQgdGhlb3JpZXMgaWYgeW91IGhhdmUgcmVwcm9kdWNpYmxlIHJlc3VsdHMgb3IgZm9ybXVsYXRlIG5ldyB0aGVvcmllcyB0byByZWNvbmNpbGVzIGRpZmZlcmluZyByZXN1bHRzIGlmIHlvdSBvciBvdGhlcnMgaGF2ZSBkaWZmZXJlbnQgZmluZGluZ3MuIE92ZXJhbGwsIHRoZSBzY2llbnRpZmljIHByb2Nlc3MgaW52b2x2ZXMgY29sbGFib3JhdGlvbiBhbmQgc2hhcmluZyBvZiBkYXRhIGJldHdlZW4gcmVzZWFyY2hlcnMgdG8gcmVjb25jaWxlIGZpbmRpbmdzIGFuZCBidWlsZCB1cG9uIHRoZW9yaWVzLgoKKipKYWVtaW4qKjogVGhlIHNjaWVudGlmaWMgcHJvY2VzcyBpcyB1c2VkIHRvIHNlZSBob3cgdGhlIHdvcmxkIHdvcmtzIGJ5IGFjcXVpcmluZyBrbm93bGVkZ2UgaW4gYW4gZW1waXJpY2FsIHdheSBieSBhc2tpbmcgYSBzcGVjaWZpYyBxdWVzdGlvbiwgY29uZHVjdGluZyByZXNlYXJjaCBpbiB0aGUgYXJlYSwgcHJvdmlkaW5nIGEgaHlwb3RoZXNpcywgdGVzdGluZyB0aGUgaHlwb3RoZXNpcywgZ2F0aGVyaW5nIHRoZSBkYXRhLCBhbmQgdGhlbiByZXBvcnQgdGhlIGNvbmNsdXNpb25zLiBUaGUgcHJvY2VzcyBhcyBhIHNvY2lhbCBlbmRlYXZvciBpcyB0byBzb2x2ZSB0aGVzZSBraW5kcyBvZiBwcm9ibGVtcyBpbiBvcmRlciB0byBjb21wbGV0ZSBjZXJ0YWluIHRhc2tzLCBzYXRpc2Z5IG5lZWRzLCBhbmQgbWFrZSBhbiBhZHZhbmNlbWVudCBpbiBzb2NpZXR5LiBIb3dldmVyLCB3ZSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHdoZW4gd2UgZG8gY29uZHVjdCB0aGUgcHJvY2VzcyB0aGF0IHRoZSByZXN1bHRzIHNob3VsZCBiZSByZXBsaWNhdGVkLCBhcyB3ZSBjYW4gY29uY2x1ZGUgdGhhdCBpdCBpcyBtb3JlIGxpa2VseSB0byBiZSB2YWxpZCByYXRoZXIgdGhhbiBieSBjaGFuY2UuIFRoZSByZXN1bHRzIG11c3QgYWxzbyBiZSByZXByb2R1Y2libGUsIHNvIHRoYXQgd2UgY2FuIG1ha2Ugc3VyZSB0aGF0IHdlIGFyZSBvYnRhaW5pbmcgY29uc2lzdGVudCByZXN1bHRzIHdoZW4gd2UgdXNlIHRoZSBzYW1lIGtpbmQgb2YgaW5wdXQgYW5kIGNvbmR1Y3QgdGhlIHNhbWUgc3RlcHMuIEFpbWluZyB0aGVzZSBraW5kcyBvZiBjb25zaXN0ZW50IHJlc3VsdHMgYW5kIGJlaW5nIGFibGUgdG8gcmVwbGljYXRlIHRoZXNlIGtpbmRzIG9mIHJlc3VsdHMgaXMgaG93IHRoZSBzY2llbnRpZmljIHByb2Nlc3Mgc2hvdWxkIHdvcmsgc28gaXQgd2lsbCBiZSBhIHNvY2lhbCBlbmRlYXZvciBmb3Igb3VyIHNvY2lldHkgZ29pbmcgZm9yd2FyZC4KCioqQmV0aGFueSoqOiBQYXJ0IG9mIHRoZSBzY2llbnRpZmljIHByb2Nlc3MgcmVsYXRlcyB0byB0aGUgYWJpbGl0eSB0byByZXByb2R1Y2UgcmVzdWx0cy4gVGhpcyBpcyBpbXBvcnRhbnQgdG8gZW5zdXJlIHRoYXQgdGhlIHJlc3VsdHMsIGFuZCBzdWJzZXF1ZW50IGNvbmNsdXNpb25zLCBhcmUgZHVlIHRvIG1hbmlwdWxhdGlvbnMgaW4gdGhlIHN0dWR5IHJhdGhlciB0aGFuIGNvbmZvdW5kaW5nIGZhY3RvcnMgKGUuZy4sIHVua25vd24gdGhpcmQgdmFyaWFibGVzLCBwcm9jZWR1cmFsIGRlY2lzaW9ucywgc2FtcGxlIGNoYXJhY3RlcmlzdGljcykuIFRoaXMgbWVhbnMgdGhhdCB0aGUgcmVzdWx0cyBmcm9tIHN0dWRpZXMgbXVzdCBiZSByZXByb2R1Y2libGUgYnkgb3RoZXJzIHdobyByZS1jb25kdWN0IHRoZSBleHBlcmltZW50LCBrbm93biBhcyByZXBsaWNhdGlvbiBzdHVkaWVzLiBUaGVyZWZvcmUsIHRoZSBzY2llbnRpZmljIHByb2Nlc3MgY291bGQgYmUgY29uc2lkZXJlZCBhcyBhIHNvY2lhbCBlbmRlYXZvciBiZWNhdXNlIHRoZSBhYmlsaXR5IHRvIHJlcGxpY2F0ZSBhbmQgcmVwcm9kdWNlIHJlc3VsdHMgZGVwZW5kcyBvbiBkaXNzZW1pbmF0aW9uIG9mIHJlc2VhcmNoIGFuZCBjb21tdW5pY2F0aW9uIGJldHdlZW4gcmVzZWFyY2hlcnMgdG8gdW5jb3ZlciB3aGF0IHRoZSB0cnVlIHJlbGF0aW9uc2hpcHMgYXJlIGJldHdlZW4gdmFyaWFibGVzLgoKKipFbWlseSoqOiBUaGUgc2NpZW50aWZpYyBwcm9jZXNzIGNvdWxkIGJlIGRlc2NyaWJlZCBhcyBhIHNvY2lhbCBlbmRlYXZvciBiZWNhdXNlIGEgcHJvcGVyIHNjaWVudGlmaWMgc3R1ZHkgc2hvdWxkIGludm9sdmUgdGhlIGV4cGVyaW1lbnQgYmVpbmcgYWJsZSB0byBiZSByZXBsaWNhdGVkIGJ5IG90aGVyIHNjaWVudGlzdHMsIGFuZCBpdCBpbiBmYWN0IHNob3VsZCBiZSByZXBsaWNhdGVkIG9yIHJlcHJvZHVjZWQgYnkgb3RoZXIgc2NpZW50aXN0cyB0byBlbnN1cmUgdGhhdCB0aGUgc2FtZSByZXN1bHRzIGNhbiBiZSBmb3VuZCB3aGVuIHRoZSBleHBlcmltZW50IGlzIHJlcGVhdGVkIGJ5IG90aGVyIHBlb3BsZS4gVGhpcyBhbGxvd3MgZm9yIGFueSBiaWFzZXMgYnkgdGhlIGluaXRpYWwgZXhwZXJpbWVudGVycyB0byBiZSBlbGltaW5hdGVkIChlLmcuIGlmIHRoZSBpbml0aWFsIGdyb3VwIG9mIGV4cGVyaW1lbnRlcnMgd2FzIGxvb2tpbmcgZm9yIGEgc3BlY2lmaWMgb3V0Y29tZSBhbmQgYWxsb3dlZCB0aGVpciBiaWFzIHRvIGluZmx1ZW5jZSB0aGUgd2F5IHRoZXkgcGVyZm9ybWVkIHRoZSBleHBlcmltZW50KSwgYXMgd2VsbCBhcyBhbnkgZXJyb3JzIHRoYXQgdGhleSBtYXkgaGF2ZSBtYWRlIGluIHRoZSBwcm9jZXNzLiBSZXBsaWNhdGlvbiBpbnZvbHZlcyByZXBlYXRpbmcgYSBzdHVkeSB3aXRoIHRoZSBzYW1lIGV4YWN0IHBvcHVsYXRpb24sIGh5cG90aGVzaXMsIGV4cGVyaW1lbnRhbCBkZXNpZ24sIGFuZCBhbmFseXRpYyBwbGFuLCBhbmQgd291bGQgaWRlYWxseSByZXN1bHQgaW4gb2J0YWluaW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHN0dWR5IHlvdeKAmXJlIG1vZGVsaW5nIG9mZiBvZiwgd2hpbGUgcmVwcm9kdWNpbmcgYSBzdHVkeSBpbnZvbHZlcyByZXBlYXRpbmcgdGhlIHNhbWUgcHJvY2VkdXJlLCBieSBub3QgbmVjZXNzYXJpbHkgd2l0aCB0aGUgc2FtZSBwb3B1bGF0aW9uLCBldGMuLCBhbmQgd291bGQgYWxzbyBpZGVhbGx5IHJlc3VsdCBpbiBvYnRhaW5pbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgaW5pdGlhbCBzdHVkeS4gQmVjYXVzZSByZXBsaWNhdGlvbiBhbmQgcmVwcm9kdWNpYmlsaXR5IG9mIHN0dWRpZXMgYXJlIHZpdGFsIHRvIHNob3dpbmcgdGhhdCB0aGUgcmVzdWx0cyB0aGV5IG9idGFpbiBhcmUgYm90aCB2YWxpZCBhbmQgcmVsaWFibGUsIHRoZSBzY2llbnRpZmljIHByb2Nlc3MgbXVzdCBiZSBhIHNvY2lhbCBlbmRlYXZvciwgc2luY2UgZ2VuZXJhdGluZyBhIHN0YW5kaW5nIHRoZW9yeSB3b3VsZCB0aGVyZWZvcmUgaW52b2x2ZSBtYW55IGRpZmZlcmVudCBncm91cHMgb2Ygc2NpZW50aXN0cyB0ZXN0aW5nIHRoZSBzYW1lIHRoZW9yeSBpbmRpdmlkdWFsbHksIGFuZCB0aGlzIG1lYW5zIHRoYXQgYSB0cnVlIHRoZW9yeSBjYW7igJl0IHJlYWxseSBiZSBwcm92ZWQgYnkganVzdCBvbmUgcGVyc29uLg==