Author: Olivia Sochan


1. Initiate the Project


1.1. Dependencies

ggplot2 is already installed

#This command loads required packages
library(ggplot2)

2. The Cave Molly and its Ancestors

To wrap our head around some of the basic observations that led Darwin to infer natural selection, we will spend a little bit of time with the cave molly. The cave molly (Poecilia mexicana) is a small species of livebearing fish that occurs in a couple of small caves in Southern Mexico. One of the caves, the Cueva Luna Azufre, has a wetted area of only 39 square-meters. Even though the available habitat is really small, there has been an isolated population of cave mollies in this cave for several thousand years. Interestingly, mollies also occur in adjacent surface habitats. In the picture below, you can see the a male and a female of the surface (top two pictures) and the cave form (bottom two pictures) side by side.


3. The Struggle for Existence

The first set of observations that led Darwin to infer the process of natural selection related to the imbalance of organisms’ reproductive power and limitations of resource availability. Quantifying the effective reproductive output and resource availability in nature can be difficult. However, what we can do is to measure proxies for these traits and then use simple mathematical models to test whether our predictions and inferences are valid. Here, we use exponential and logistic population growth models to explore whether there is really a struggle for existence in cave mollies.


3.1. Observation 1: Populations Have a Huge Reproductive Potential

Even large animals with long generation times have an incredible reproductive potential. Cave mollies—as many other cave organisms—have a comparatively low fecundity, and females only give birth to one or two fully developed young at a time. Life history analyses based on female longevity and fecundity have revealed that the average female gives birth to about 3 offspring over her life; not exactly what you would call huge reproductive potential, right? But in reality, it is not the reproductive potential of individuals that counts, but the reproductive potential of populations. To illustrate this point, we want you to model population growth for a hypothetical population of cave mollies. Specifically, use the code below to simulate and graph the population growth of an initial cave molly population of 2 individuals (the initial colonizers of the cave).

How many generations would it take for the population to grow to a million? Under what circumstances might you see population growth like this? Do you think Darwin’s observation that “species have great potential fertility” holds true for cave mollies?

#Choose an initial population size
N0 = 2

#Choose the average number of offspring
b = 3

#Choose a range of generations you want to estimate population size for; default is generation 0 to 15
t = 0:15

#Calculate the population size for each generation
N = N0*b^t

#Merge the results of the simulation into a single table
final.results <- as.data.frame(cbind(t,N))

#You can view the results by just calling the data frame
print(final.results)

#Plot the results, make sure you properly label the axes
ggplot(final.results, aes(x=t, y=N)) + 
  geom_point() + 
  xlab("Generation") + 
  ylab("Population size") +
  theme_classic()

It will take about 14 generations to get to a population of 1 million. We see a population grow like this when theres unlimited resources. There is great potential for fertility.


3.2. Observation 2: Natural Resources are Limited

Exponential growth only occurs in very specific circumstances. In a cave that is only the fraction of the size of a football field, you would obviously never find a cave molly population of a million. The logistic model more accurately describes population growth in nature. Based on our past analyses, we estimate the population growth coefficient (lambda) to be around 1.3 and the carrying capacity (K) of the cave around 360 individuals.

How long would it take for the population to reach the carrying capacity if there were two initial colonizers? What do you think determines K for the population of cave mollies in the Cueva Luna Azufre?

#Choose an initial population size
N0 = 2
#Choose population growth rate
lamda = 1.3
#Choose a range of generations you want to estimate population size for
t = 0:15
#Choose a carrying capacity
K = 360
#Calculate the population size for each generation
N = (N0*K)/(N0+(K-N0)*exp(-lamda*t))
#Merge the results of the simulation into a single table
final.results <- as.data.frame(cbind(t,N))
#Use the ggplot function to plot the results, make sure you properly label the axes
ggplot(final.results, aes(x=t, y=N)) + 
  geom_point() + 
  xlab("Generation") + 
  ylab("Population size") +
  theme_classic()

It will take about 7 generations to reach carrying capacity.The resources available will determine K.


3.3. Where Do All the Missing Offspring Go?

Compare the two models (exponential and logistic) that were ran with the same initial parameters. What do the different outcomes mean for individual offspring that are born in any given generation? How might this discrepancy important in the context of evolution?

The two graphs represent the difference in available resources, the different outcomes for the offspring means that population sizes will be limited based on available resources. This is important to the context of evolution because the more offspring in populations casues more chances for evolution.


4. Individuals Vary in Their Traits

Another of Darwin’s key observations was just how variable individuals of the same species are. Let’s explore some of that variation in cave mollies. To do that, we first need to load some data into R. These data were collected as part of my dissertation and include the following variables: habitat (cave or surface), sex (male or female), standard length (in mm, from the snout to the caudal fin base), eye diameter (in mm), head length (in mm), head width (in mm), predorsal length (in mm, from the snout to the insertion of the dorsal fin), and gape width (in mm, from one corner of the mouth to the other).

#Use the read.csv function to import a dataset; take a look at the data structure once you imported the file!
morph.data <- read.csv("morphological_variation.csv", fileEncoding = 'UTF-8-BOM')

4.1. Comparing Body Size Variation Within and Between Populations

A simple way to compare variation within and between populations is to plot a frequency histogram (which represents the raw counts) along with a density plot (which represents the approximated statistical distribution). You can generate a histogram with the geom_histogram() function and designate any trait you may want as the x axis. You can calculate the density with aes(y=..density..) within geom_histogram() and then plot it with geom_density(). Note that when you have more than two groups (in our case we have samples from a cave and a surface population), you can visualize them separately by designating a different color for each group in the aesthetics (fill=Habitat).

When you visualize body size variation in this manner what do you observe? Is there more variation within or between populations?

#Use the ggplot function to graph the histogram (see: http://www.sthda.com/english/wiki/ggplot2-histogram-plot-quick-start-guide-r-software-and-data-visualization)
ggplot(morph.data, aes(x=Standard.length, fill=Habitat)) + 
  geom_histogram(aes(y=..density..)) +
  geom_density(alpha=0.5)+
  xlab("Standard length (mm)") + 
  ylab("frequency") +
  theme_classic()

There is a slight difference in standard length, there is more variation within the populations because the averages and peaks are very similar.


4.2. Comparing Predorsal Length Variation Within and Between Populations

Let’s also compare a second trait, predorsal length. With the previous graph you hopefully saw how variable overall body size is within populations. If we want to compare other traits, we have to account for that. We want to know whether variation in predorsal length is due to variation in size (small fish have small predorsal lengths) or whether other patterns might be at play. To do so, we can calculate the residual predorsal length as from a regression between predorsal and standard length using the lm(y ~ x, data) and residuals() functions:

#Calculating regression line
fit1 <- lm(Predorsal.length ~ Standard.length, data = morph.data)

#Extract residuals and create a new variable res.predorsal in the morph.data data frame
morph.data$res.predorsal <- residuals(fit1)

You can then use the new variable to plot the residual predorsal length, which is corrected for body size:

##Use the ggplot function to graph the histogram and color data based on habitat
ggplot(morph.data, aes(x=res.predorsal, fill=Habitat)) +
  geom_histogram(aes(y=..density..)) +
  geom_density(alpha=0.5)+
  xlab("realative predorsal length") + 
  ylab("frequency") +
  theme_classic()

When you plot relative predorsal length, what do you observe? How does variation in predorsal length vary within and between populations, and how does it compare to variation in standard length?

We dont see a lot of variation within the population, length doesnt really matter.


4.3. Comparing Eye Size Variation Within and Between Populations

Using the same approach as for predorsal variation, compare variation in relative eye diameter:

#Your code goes here
fit2 <- lm(Eye.diameter ~ Standard.length, data = morph.data)

#Extract residuals and create a new variable Eye.diameter in the morph.data data frame
morph.data$res.eye.size <- residuals(fit2)

##Use the ggplot function to graph the histogram and color data based on habitat
ggplot(morph.data, aes(x=res.eye.size, fill=Habitat)) +
  geom_histogram(aes(y=..density..)) +
  geom_density(alpha=0.5)+
  xlab("realative eye size") + 
  ylab("frequency") +
  theme_classic()

What do you observe? How does variation in eye diameter vary within and between populations, and how does it compare to variation in the other traits?

I see that relative eye size is larger for the surface population. Eye diameter vary s with there being larger eye sizes for the surface population rather than the cave population because they don’t necessarily need to see since it is so dark. it compares to variation of other traits since the change in the environment leads to different needs of different evolutionary traits.


5. Variation in Traits is Heritable

An avid breeder of fancy pigeons, Darwin observed that specific traits are passed from parents to offspring, even though he had no clue how this might actually work (genetics was not really a thing yet). Even without an ability to conduct molecular genetic analyses, we can estimate heritability of traits by comparing the traits of offspring to the traits of the parents.

Let’s load some data that compares parent and offspring traits in cave mollies. To do this, we brought cave mollies into the lab and bred them under standardized conditions. Data represent the average trait values of the mother and father and of all offspring from a specific brood. The easiest way to compare parent and offspring traits is through a scatter plot, which we already used in Exercise 1. If a trait is heritable, we would expect to see a correlation between parent and offspring traits (e.g., parents with small eyes should have offspring with small eyes).

The following dataset includes measurements of parental and offspring standard length as well as eye size.

#Use the read.csv function to import a dataset; take a look at the data structure once you imported the file!
heritability <- read.csv("heritability.csv", fileEncoding = 'UTF-8-BOM')

5.1. Heritability of Standard Length

First, let us explore whether there is evidence for heritability in standard length.

What do you observe? Is standard length a heritable trait?

ggplot(heritability, aes(x=parent.standard.length, y=offspring.standard.length)) + 
  geom_point() + 
  geom_smooth(method = "lm") +
  xlab("realative heritability") + 
  ylab("frequency") +
  theme_classic()

The graph is very scattered, so no herritability is not a heritable trait..


5.2. Heritability of Eye Size

Now let us explore whether there is any heritability in eye size. Remember, there is substantial variation in body size, and in such cases, we want to control for body size by calculating residual eye size first.

##Calculate residual eye sizes for the parents and the offspring
#Your code goes here:
fit3 <- lm(parent.eye.size ~ parent.standard.length, data = heritability)

fit4 <- lm(offspring.eye.size ~ offspring.standard.length, data = heritability)

heritability$res.offspring.eye <- residuals(fit4)
#Plot the results
ggplot(morph.data, aes(x=Standard.length, y=Eye.diameter)) +
  geom_point() +
  geom_smooth(method = "lm") +
  xlab("Eye diameter") + 
  ylab("Standard length") +
  theme_classic()

What do you observe? Is eye size a heritable trait?

The graph shows a more linear look, this means eye size is heritable.


6. What Would Happen If…?

Imagine for a moment that smaller fish have a higher likelihood of survival in the cave. Would you expect evolution of body size upon cave colonization?

Imagine for a moment that fish with smaller eyes have a higher likelihood of survival in the cave. Would you expect evolution of eye size upon cave colonization? Justify your response.

Yes evolution of body size will be expected. secondly, yes you would expect the evolution of smaller eyes upon cave colonization, the scenario described where smaller eyed fish have a higher likelihood of survival is the driving force of natural selection


7. Resources


7.1. Data References

The eye size data was published in the following paper. Other measurements are unpublished data by M. Tobler.


7.2 Resources You Consulted

Consulting additional resources to solve this assignment is absolutely allowed, but failure to disclose those resources is plagiarism. Please list any collaborators you worked with and resources you used below or state that you have not used any.

Dr. Bonner.

LS0tCnRpdGxlOiAiSW50cm9kdWN0aW9uIHRvIFIgTm90ZWJvb2sgYW5kIERhcndpbidzIExvZ2ljIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIGZpZ19jYXB0aW9uOiB5ZXMKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDMKICAgIHRvY19mbG9hdDogeWVzCiAgcGRmX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogJzMnCiAgaHRtbF9kb2N1bWVudDoKICAgIGtlZXBfbWQ6IFRSVUUKLS0tCgojIyBBdXRob3I6IE9saXZpYSBTb2NoYW4gCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMgMS4gSW5pdGlhdGUgdGhlIFByb2plY3QKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgMS4xLiBEZXBlbmRlbmNpZXMKCmdncGxvdDIgaXMgYWxyZWFkeSBpbnN0YWxsZWQKCmBgYHtyIG1lc3NhZ2U9RkFMU0V9CiNUaGlzIGNvbW1hbmQgbG9hZHMgcmVxdWlyZWQgcGFja2FnZXMKbGlicmFyeShnZ3Bsb3QyKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyAyLiBUaGUgQ2F2ZSBNb2xseSBhbmQgaXRzIEFuY2VzdG9ycwoKVG8gd3JhcCBvdXIgaGVhZCBhcm91bmQgc29tZSBvZiB0aGUgYmFzaWMgb2JzZXJ2YXRpb25zIHRoYXQgbGVkIERhcndpbiB0byBpbmZlciBuYXR1cmFsIHNlbGVjdGlvbiwgd2Ugd2lsbCBzcGVuZCBhIGxpdHRsZSBiaXQgb2YgdGltZSB3aXRoIHRoZSBjYXZlIG1vbGx5LiBUaGUgY2F2ZSBtb2xseSAoKlBvZWNpbGlhIG1leGljYW5hKikgaXMgYSBzbWFsbCBzcGVjaWVzIG9mIGxpdmViZWFyaW5nIGZpc2ggdGhhdCBvY2N1cnMgaW4gYSBjb3VwbGUgb2Ygc21hbGwgY2F2ZXMgaW4gU291dGhlcm4gTWV4aWNvLiBPbmUgb2YgdGhlIGNhdmVzLCB0aGUgQ3VldmEgTHVuYSBBenVmcmUsIGhhcyBhIHdldHRlZCBhcmVhIG9mIG9ubHkgMzkgc3F1YXJlLW1ldGVycy4gRXZlbiB0aG91Z2ggdGhlIGF2YWlsYWJsZSBoYWJpdGF0IGlzIHJlYWxseSBzbWFsbCwgdGhlcmUgaGFzIGJlZW4gYW4gaXNvbGF0ZWQgcG9wdWxhdGlvbiBvZiBjYXZlIG1vbGxpZXMgaW4gdGhpcyBjYXZlIGZvciBzZXZlcmFsIHRob3VzYW5kIHllYXJzLiBJbnRlcmVzdGluZ2x5LCBtb2xsaWVzIGFsc28gb2NjdXIgaW4gYWRqYWNlbnQgc3VyZmFjZSBoYWJpdGF0cy4gSW4gdGhlIHBpY3R1cmUgYmVsb3csIHlvdSBjYW4gc2VlIHRoZSBhIG1hbGUgYW5kIGEgZmVtYWxlIG9mIHRoZSBzdXJmYWNlICh0b3AgdHdvIHBpY3R1cmVzKSBhbmQgdGhlIGNhdmUgZm9ybSAoYm90dG9tIHR3byBwaWN0dXJlcykgc2lkZSBieSBzaWRlLgoKIVtdKG1vbGxpZXMucG5nKQoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIDMuIFRoZSBTdHJ1Z2dsZSBmb3IgRXhpc3RlbmNlCgpUaGUgZmlyc3Qgc2V0IG9mIG9ic2VydmF0aW9ucyB0aGF0IGxlZCBEYXJ3aW4gdG8gaW5mZXIgdGhlIHByb2Nlc3Mgb2YgbmF0dXJhbCBzZWxlY3Rpb24gcmVsYXRlZCB0byB0aGUgaW1iYWxhbmNlIG9mIG9yZ2FuaXNtcycgcmVwcm9kdWN0aXZlIHBvd2VyIGFuZCBsaW1pdGF0aW9ucyBvZiByZXNvdXJjZSBhdmFpbGFiaWxpdHkuIFF1YW50aWZ5aW5nIHRoZSBlZmZlY3RpdmUgcmVwcm9kdWN0aXZlIG91dHB1dCBhbmQgcmVzb3VyY2UgYXZhaWxhYmlsaXR5IGluIG5hdHVyZSBjYW4gYmUgZGlmZmljdWx0LiBIb3dldmVyLCB3aGF0IHdlIGNhbiBkbyBpcyB0byBtZWFzdXJlIHByb3hpZXMgZm9yIHRoZXNlIHRyYWl0cyBhbmQgdGhlbiB1c2Ugc2ltcGxlIG1hdGhlbWF0aWNhbCBtb2RlbHMgdG8gdGVzdCB3aGV0aGVyIG91ciBwcmVkaWN0aW9ucyBhbmQgaW5mZXJlbmNlcyBhcmUgdmFsaWQuIEhlcmUsIHdlIHVzZSBleHBvbmVudGlhbCBhbmQgbG9naXN0aWMgcG9wdWxhdGlvbiBncm93dGggbW9kZWxzIHRvIGV4cGxvcmUgd2hldGhlciB0aGVyZSBpcyByZWFsbHkgYSBzdHJ1Z2dsZSBmb3IgZXhpc3RlbmNlIGluIGNhdmUgbW9sbGllcy4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgMy4xLiBPYnNlcnZhdGlvbiAxOiBQb3B1bGF0aW9ucyBIYXZlIGEgSHVnZSBSZXByb2R1Y3RpdmUgUG90ZW50aWFsCgpFdmVuIGxhcmdlIGFuaW1hbHMgd2l0aCBsb25nIGdlbmVyYXRpb24gdGltZXMgaGF2ZSBhbiBpbmNyZWRpYmxlIHJlcHJvZHVjdGl2ZSBwb3RlbnRpYWwuIENhdmUgbW9sbGllcy0tLWFzIG1hbnkgb3RoZXIgY2F2ZSBvcmdhbmlzbXMtLS1oYXZlIGEgY29tcGFyYXRpdmVseSBsb3cgZmVjdW5kaXR5LCBhbmQgZmVtYWxlcyBvbmx5IGdpdmUgYmlydGggdG8gb25lIG9yIHR3byBmdWxseSBkZXZlbG9wZWQgeW91bmcgYXQgYSB0aW1lLiBMaWZlIGhpc3RvcnkgYW5hbHlzZXMgYmFzZWQgb24gZmVtYWxlIGxvbmdldml0eSBhbmQgZmVjdW5kaXR5IGhhdmUgcmV2ZWFsZWQgdGhhdCB0aGUgYXZlcmFnZSBmZW1hbGUgZ2l2ZXMgYmlydGggdG8gYWJvdXQgMyBvZmZzcHJpbmcgb3ZlciBoZXIgbGlmZTsgbm90IGV4YWN0bHkgd2hhdCB5b3Ugd291bGQgY2FsbCBodWdlIHJlcHJvZHVjdGl2ZSBwb3RlbnRpYWwsIHJpZ2h0PyBCdXQgaW4gcmVhbGl0eSwgaXQgaXMgbm90IHRoZSByZXByb2R1Y3RpdmUgcG90ZW50aWFsIG9mIGluZGl2aWR1YWxzIHRoYXQgY291bnRzLCBidXQgdGhlIHJlcHJvZHVjdGl2ZSBwb3RlbnRpYWwgb2YgcG9wdWxhdGlvbnMuIFRvIGlsbHVzdHJhdGUgdGhpcyBwb2ludCwgd2Ugd2FudCB5b3UgdG8gbW9kZWwgcG9wdWxhdGlvbiBncm93dGggZm9yIGEgaHlwb3RoZXRpY2FsIHBvcHVsYXRpb24gb2YgY2F2ZSBtb2xsaWVzLiBTcGVjaWZpY2FsbHksIHVzZSB0aGUgY29kZSBiZWxvdyB0byBzaW11bGF0ZSBhbmQgZ3JhcGggdGhlIHBvcHVsYXRpb24gZ3Jvd3RoIG9mIGFuIGluaXRpYWwgY2F2ZSBtb2xseSBwb3B1bGF0aW9uIG9mIDIgaW5kaXZpZHVhbHMgKHRoZSBpbml0aWFsIGNvbG9uaXplcnMgb2YgdGhlIGNhdmUpLgoKSG93IG1hbnkgZ2VuZXJhdGlvbnMgd291bGQgaXQgdGFrZSBmb3IgdGhlIHBvcHVsYXRpb24gdG8gZ3JvdyB0byBhIG1pbGxpb24/IFVuZGVyIHdoYXQgY2lyY3Vtc3RhbmNlcyBtaWdodCB5b3Ugc2VlIHBvcHVsYXRpb24gZ3Jvd3RoIGxpa2UgdGhpcz8gRG8geW91IHRoaW5rIERhcndpbidzIG9ic2VydmF0aW9uIHRoYXQgInNwZWNpZXMgaGF2ZSBncmVhdCBwb3RlbnRpYWwgZmVydGlsaXR5IiBob2xkcyB0cnVlIGZvciBjYXZlIG1vbGxpZXM/CgpgYGB7cn0KI0Nob29zZSBhbiBpbml0aWFsIHBvcHVsYXRpb24gc2l6ZQpOMCA9IDIKCiNDaG9vc2UgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIG9mZnNwcmluZwpiID0gMwoKI0Nob29zZSBhIHJhbmdlIG9mIGdlbmVyYXRpb25zIHlvdSB3YW50IHRvIGVzdGltYXRlIHBvcHVsYXRpb24gc2l6ZSBmb3I7IGRlZmF1bHQgaXMgZ2VuZXJhdGlvbiAwIHRvIDE1CnQgPSAwOjE1CgojQ2FsY3VsYXRlIHRoZSBwb3B1bGF0aW9uIHNpemUgZm9yIGVhY2ggZ2VuZXJhdGlvbgpOID0gTjAqYl50CgojTWVyZ2UgdGhlIHJlc3VsdHMgb2YgdGhlIHNpbXVsYXRpb24gaW50byBhIHNpbmdsZSB0YWJsZQpmaW5hbC5yZXN1bHRzIDwtIGFzLmRhdGEuZnJhbWUoY2JpbmQodCxOKSkKCiNZb3UgY2FuIHZpZXcgdGhlIHJlc3VsdHMgYnkganVzdCBjYWxsaW5nIHRoZSBkYXRhIGZyYW1lCnByaW50KGZpbmFsLnJlc3VsdHMpCgojUGxvdCB0aGUgcmVzdWx0cywgbWFrZSBzdXJlIHlvdSBwcm9wZXJseSBsYWJlbCB0aGUgYXhlcwpnZ3Bsb3QoZmluYWwucmVzdWx0cywgYWVzKHg9dCwgeT1OKSkgKyAKICBnZW9tX3BvaW50KCkgKyAKICB4bGFiKCJHZW5lcmF0aW9uIikgKyAKICB5bGFiKCJQb3B1bGF0aW9uIHNpemUiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCipJdCB3aWxsIHRha2UgYWJvdXQgMTQgZ2VuZXJhdGlvbnMgdG8gZ2V0IHRvIGEgcG9wdWxhdGlvbiBvZiAxIG1pbGxpb24uIFdlIHNlZSBhIHBvcHVsYXRpb24gZ3JvdyBsaWtlIHRoaXMgd2hlbiB0aGVyZXMgdW5saW1pdGVkIHJlc291cmNlcy4gVGhlcmUgaXMgZ3JlYXQgcG90ZW50aWFsIGZvciBmZXJ0aWxpdHkuKgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyAzLjIuIE9ic2VydmF0aW9uIDI6IE5hdHVyYWwgUmVzb3VyY2VzIGFyZSBMaW1pdGVkCgpFeHBvbmVudGlhbCBncm93dGggb25seSBvY2N1cnMgaW4gdmVyeSBzcGVjaWZpYyBjaXJjdW1zdGFuY2VzLiBJbiBhIGNhdmUgdGhhdCBpcyBvbmx5IHRoZSBmcmFjdGlvbiBvZiB0aGUgc2l6ZSBvZiBhIGZvb3RiYWxsIGZpZWxkLCB5b3Ugd291bGQgb2J2aW91c2x5IG5ldmVyIGZpbmQgYSBjYXZlIG1vbGx5IHBvcHVsYXRpb24gb2YgYSBtaWxsaW9uLiBUaGUgbG9naXN0aWMgbW9kZWwgbW9yZSBhY2N1cmF0ZWx5IGRlc2NyaWJlcyBwb3B1bGF0aW9uIGdyb3d0aCBpbiBuYXR1cmUuIEJhc2VkIG9uIG91ciBwYXN0IGFuYWx5c2VzLCB3ZSBlc3RpbWF0ZSB0aGUgcG9wdWxhdGlvbiBncm93dGggY29lZmZpY2llbnQgKGxhbWJkYSkgdG8gYmUgYXJvdW5kIDEuMyBhbmQgdGhlIGNhcnJ5aW5nIGNhcGFjaXR5ICgqSyopIG9mIHRoZSBjYXZlIGFyb3VuZCAzNjAgaW5kaXZpZHVhbHMuCgpIb3cgbG9uZyB3b3VsZCBpdCB0YWtlIGZvciB0aGUgcG9wdWxhdGlvbiB0byByZWFjaCB0aGUgY2FycnlpbmcgY2FwYWNpdHkgaWYgdGhlcmUgd2VyZSB0d28gaW5pdGlhbCBjb2xvbml6ZXJzPyBXaGF0IGRvIHlvdSB0aGluayBkZXRlcm1pbmVzICpLKiBmb3IgdGhlIHBvcHVsYXRpb24gb2YgY2F2ZSBtb2xsaWVzIGluIHRoZSBDdWV2YSBMdW5hIEF6dWZyZT8KCmBgYHtyfQojQ2hvb3NlIGFuIGluaXRpYWwgcG9wdWxhdGlvbiBzaXplCk4wID0gMgojQ2hvb3NlIHBvcHVsYXRpb24gZ3Jvd3RoIHJhdGUKbGFtZGEgPSAxLjMKI0Nob29zZSBhIHJhbmdlIG9mIGdlbmVyYXRpb25zIHlvdSB3YW50IHRvIGVzdGltYXRlIHBvcHVsYXRpb24gc2l6ZSBmb3IKdCA9IDA6MTUKI0Nob29zZSBhIGNhcnJ5aW5nIGNhcGFjaXR5CksgPSAzNjAKI0NhbGN1bGF0ZSB0aGUgcG9wdWxhdGlvbiBzaXplIGZvciBlYWNoIGdlbmVyYXRpb24KTiA9IChOMCpLKS8oTjArKEstTjApKmV4cCgtbGFtZGEqdCkpCiNNZXJnZSB0aGUgcmVzdWx0cyBvZiB0aGUgc2ltdWxhdGlvbiBpbnRvIGEgc2luZ2xlIHRhYmxlCmZpbmFsLnJlc3VsdHMgPC0gYXMuZGF0YS5mcmFtZShjYmluZCh0LE4pKQojVXNlIHRoZSBnZ3Bsb3QgZnVuY3Rpb24gdG8gcGxvdCB0aGUgcmVzdWx0cywgbWFrZSBzdXJlIHlvdSBwcm9wZXJseSBsYWJlbCB0aGUgYXhlcwpnZ3Bsb3QoZmluYWwucmVzdWx0cywgYWVzKHg9dCwgeT1OKSkgKyAKICBnZW9tX3BvaW50KCkgKyAKICB4bGFiKCJHZW5lcmF0aW9uIikgKyAKICB5bGFiKCJQb3B1bGF0aW9uIHNpemUiKSArCiAgdGhlbWVfY2xhc3NpYygpCmBgYAoKKkl0IHdpbGwgdGFrZSBhYm91dCA3IGdlbmVyYXRpb25zIHRvIHJlYWNoIGNhcnJ5aW5nIGNhcGFjaXR5LlRoZSByZXNvdXJjZXMgYXZhaWxhYmxlIHdpbGwgZGV0ZXJtaW5lIEsuKgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyAzLjMuIFdoZXJlIERvIEFsbCB0aGUgTWlzc2luZyBPZmZzcHJpbmcgR28/CgpDb21wYXJlIHRoZSB0d28gbW9kZWxzIChleHBvbmVudGlhbCBhbmQgbG9naXN0aWMpIHRoYXQgd2VyZSByYW4gd2l0aCB0aGUgc2FtZSBpbml0aWFsIHBhcmFtZXRlcnMuIFdoYXQgZG8gdGhlIGRpZmZlcmVudCBvdXRjb21lcyBtZWFuIGZvciBpbmRpdmlkdWFsIG9mZnNwcmluZyB0aGF0IGFyZSBib3JuIGluIGFueSBnaXZlbiBnZW5lcmF0aW9uPyBIb3cgbWlnaHQgdGhpcyBkaXNjcmVwYW5jeSBpbXBvcnRhbnQgaW4gdGhlIGNvbnRleHQgb2YgZXZvbHV0aW9uPwoKKlRoZSB0d28gZ3JhcGhzIHJlcHJlc2VudCB0aGUgZGlmZmVyZW5jZSBpbiBhdmFpbGFibGUgcmVzb3VyY2VzLCB0aGUgZGlmZmVyZW50IG91dGNvbWVzIGZvciB0aGUgb2Zmc3ByaW5nIG1lYW5zIHRoYXQgcG9wdWxhdGlvbiBzaXplcyB3aWxsIGJlIGxpbWl0ZWQgYmFzZWQgb24gYXZhaWxhYmxlIHJlc291cmNlcy4gVGhpcyBpcyBpbXBvcnRhbnQgdG8gdGhlIGNvbnRleHQgb2YgZXZvbHV0aW9uIGJlY2F1c2UgdGhlIG1vcmUgb2Zmc3ByaW5nIGluIHBvcHVsYXRpb25zIGNhc3VlcyBtb3JlIGNoYW5jZXMgZm9yIGV2b2x1dGlvbi4qCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMgNC4gSW5kaXZpZHVhbHMgVmFyeSBpbiBUaGVpciBUcmFpdHMKCkFub3RoZXIgb2YgRGFyd2luJ3Mga2V5IG9ic2VydmF0aW9ucyB3YXMganVzdCBob3cgdmFyaWFibGUgaW5kaXZpZHVhbHMgb2YgdGhlIHNhbWUgc3BlY2llcyBhcmUuIExldCdzIGV4cGxvcmUgc29tZSBvZiB0aGF0IHZhcmlhdGlvbiBpbiBjYXZlIG1vbGxpZXMuIFRvIGRvIHRoYXQsIHdlIGZpcnN0IG5lZWQgdG8gbG9hZCBzb21lIGRhdGEgaW50byBSLiBUaGVzZSBkYXRhIHdlcmUgY29sbGVjdGVkIGFzIHBhcnQgb2YgbXkgZGlzc2VydGF0aW9uIGFuZCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzOiBoYWJpdGF0IChjYXZlIG9yIHN1cmZhY2UpLCBzZXggKG1hbGUgb3IgZmVtYWxlKSwgc3RhbmRhcmQgbGVuZ3RoIChpbiBtbSwgZnJvbSB0aGUgc25vdXQgdG8gdGhlIGNhdWRhbCBmaW4gYmFzZSksIGV5ZSBkaWFtZXRlciAoaW4gbW0pLCBoZWFkIGxlbmd0aCAoaW4gbW0pLCBoZWFkIHdpZHRoIChpbiBtbSksIHByZWRvcnNhbCBsZW5ndGggKGluIG1tLCBmcm9tIHRoZSBzbm91dCB0byB0aGUgaW5zZXJ0aW9uIG9mIHRoZSBkb3JzYWwgZmluKSwgYW5kIGdhcGUgd2lkdGggKGluIG1tLCBmcm9tIG9uZSBjb3JuZXIgb2YgdGhlIG1vdXRoIHRvIHRoZSBvdGhlcikuCgpgYGB7cn0KI1VzZSB0aGUgcmVhZC5jc3YgZnVuY3Rpb24gdG8gaW1wb3J0IGEgZGF0YXNldDsgdGFrZSBhIGxvb2sgYXQgdGhlIGRhdGEgc3RydWN0dXJlIG9uY2UgeW91IGltcG9ydGVkIHRoZSBmaWxlIQptb3JwaC5kYXRhIDwtIHJlYWQuY3N2KCJtb3JwaG9sb2dpY2FsX3ZhcmlhdGlvbi5jc3YiLCBmaWxlRW5jb2RpbmcgPSAnVVRGLTgtQk9NJykKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIDQuMS4gQ29tcGFyaW5nIEJvZHkgU2l6ZSBWYXJpYXRpb24gV2l0aGluIGFuZCBCZXR3ZWVuIFBvcHVsYXRpb25zCgpBIHNpbXBsZSB3YXkgdG8gY29tcGFyZSB2YXJpYXRpb24gd2l0aGluIGFuZCBiZXR3ZWVuIHBvcHVsYXRpb25zIGlzIHRvIHBsb3QgYSBmcmVxdWVuY3kgaGlzdG9ncmFtICh3aGljaCByZXByZXNlbnRzIHRoZSByYXcgY291bnRzKSBhbG9uZyB3aXRoIGEgZGVuc2l0eSBwbG90ICh3aGljaCByZXByZXNlbnRzIHRoZSBhcHByb3hpbWF0ZWQgc3RhdGlzdGljYWwgZGlzdHJpYnV0aW9uKS4gWW91IGNhbiBnZW5lcmF0ZSBhIGhpc3RvZ3JhbSB3aXRoIHRoZSBgZ2VvbV9oaXN0b2dyYW0oKWAgZnVuY3Rpb24gYW5kIGRlc2lnbmF0ZSBhbnkgdHJhaXQgeW91IG1heSB3YW50IGFzIHRoZSB4IGF4aXMuIFlvdSBjYW4gY2FsY3VsYXRlIHRoZSBkZW5zaXR5IHdpdGggYGFlcyh5PS4uZGVuc2l0eS4uKWAgd2l0aGluIGBnZW9tX2hpc3RvZ3JhbSgpYCBhbmQgdGhlbiBwbG90IGl0IHdpdGggYGdlb21fZGVuc2l0eSgpYC4gTm90ZSB0aGF0IHdoZW4geW91IGhhdmUgbW9yZSB0aGFuIHR3byBncm91cHMgKGluIG91ciBjYXNlIHdlIGhhdmUgc2FtcGxlcyBmcm9tIGEgY2F2ZSBhbmQgYSBzdXJmYWNlIHBvcHVsYXRpb24pLCB5b3UgY2FuIHZpc3VhbGl6ZSB0aGVtIHNlcGFyYXRlbHkgYnkgZGVzaWduYXRpbmcgYSBkaWZmZXJlbnQgY29sb3IgZm9yIGVhY2ggZ3JvdXAgaW4gdGhlIGFlc3RoZXRpY3MgKGBmaWxsPUhhYml0YXRgKS4KCldoZW4geW91IHZpc3VhbGl6ZSBib2R5IHNpemUgdmFyaWF0aW9uIGluIHRoaXMgbWFubmVyIHdoYXQgZG8geW91IG9ic2VydmU/IElzIHRoZXJlIG1vcmUgdmFyaWF0aW9uIHdpdGhpbiBvciBiZXR3ZWVuIHBvcHVsYXRpb25zPwoKYGBge3IgbWVzc2FnZT1GQUxTRX0KI1VzZSB0aGUgZ2dwbG90IGZ1bmN0aW9uIHRvIGdyYXBoIHRoZSBoaXN0b2dyYW0gKHNlZTogaHR0cDovL3d3dy5zdGhkYS5jb20vZW5nbGlzaC93aWtpL2dncGxvdDItaGlzdG9ncmFtLXBsb3QtcXVpY2stc3RhcnQtZ3VpZGUtci1zb2Z0d2FyZS1hbmQtZGF0YS12aXN1YWxpemF0aW9uKQpnZ3Bsb3QobW9ycGguZGF0YSwgYWVzKHg9U3RhbmRhcmQubGVuZ3RoLCBmaWxsPUhhYml0YXQpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5PS4uZGVuc2l0eS4uKSkgKwogIGdlb21fZGVuc2l0eShhbHBoYT0wLjUpKwogIHhsYWIoIlN0YW5kYXJkIGxlbmd0aCAobW0pIikgKyAKICB5bGFiKCJmcmVxdWVuY3kiKSArCiAgdGhlbWVfY2xhc3NpYygpCmBgYAoKKlRoZXJlIGlzIGEgc2xpZ2h0IGRpZmZlcmVuY2UgaW4gc3RhbmRhcmQgbGVuZ3RoLCB0aGVyZSBpcyBtb3JlIHZhcmlhdGlvbiB3aXRoaW4gdGhlIHBvcHVsYXRpb25zIGJlY2F1c2UgdGhlIGF2ZXJhZ2VzIGFuZCBwZWFrcyBhcmUgdmVyeSBzaW1pbGFyLioKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgNC4yLiBDb21wYXJpbmcgUHJlZG9yc2FsIExlbmd0aCBWYXJpYXRpb24gV2l0aGluIGFuZCBCZXR3ZWVuIFBvcHVsYXRpb25zCgpMZXQncyBhbHNvIGNvbXBhcmUgYSBzZWNvbmQgdHJhaXQsIHByZWRvcnNhbCBsZW5ndGguIFdpdGggdGhlIHByZXZpb3VzIGdyYXBoIHlvdSBob3BlZnVsbHkgc2F3IGhvdyB2YXJpYWJsZSBvdmVyYWxsIGJvZHkgc2l6ZSBpcyB3aXRoaW4gcG9wdWxhdGlvbnMuIElmIHdlIHdhbnQgdG8gY29tcGFyZSBvdGhlciB0cmFpdHMsIHdlIGhhdmUgdG8gYWNjb3VudCBmb3IgdGhhdC4gV2Ugd2FudCB0byBrbm93IHdoZXRoZXIgdmFyaWF0aW9uIGluIHByZWRvcnNhbCBsZW5ndGggaXMgZHVlIHRvIHZhcmlhdGlvbiBpbiBzaXplIChzbWFsbCBmaXNoIGhhdmUgc21hbGwgcHJlZG9yc2FsIGxlbmd0aHMpIG9yIHdoZXRoZXIgb3RoZXIgcGF0dGVybnMgbWlnaHQgYmUgYXQgcGxheS4gVG8gZG8gc28sIHdlIGNhbiBjYWxjdWxhdGUgdGhlIHJlc2lkdWFsIHByZWRvcnNhbCBsZW5ndGggYXMgZnJvbSBhIHJlZ3Jlc3Npb24gYmV0d2VlbiBwcmVkb3JzYWwgYW5kIHN0YW5kYXJkIGxlbmd0aCB1c2luZyB0aGUgYGxtKHkgfiB4LCBkYXRhKWAgYW5kIGByZXNpZHVhbHMoKWAgZnVuY3Rpb25zOgoKYGBge3J9CiNDYWxjdWxhdGluZyByZWdyZXNzaW9uIGxpbmUKZml0MSA8LSBsbShQcmVkb3JzYWwubGVuZ3RoIH4gU3RhbmRhcmQubGVuZ3RoLCBkYXRhID0gbW9ycGguZGF0YSkKCiNFeHRyYWN0IHJlc2lkdWFscyBhbmQgY3JlYXRlIGEgbmV3IHZhcmlhYmxlIHJlcy5wcmVkb3JzYWwgaW4gdGhlIG1vcnBoLmRhdGEgZGF0YSBmcmFtZQptb3JwaC5kYXRhJHJlcy5wcmVkb3JzYWwgPC0gcmVzaWR1YWxzKGZpdDEpCmBgYAoKWW91IGNhbiB0aGVuIHVzZSB0aGUgbmV3IHZhcmlhYmxlIHRvIHBsb3QgdGhlIHJlc2lkdWFsIHByZWRvcnNhbCBsZW5ndGgsIHdoaWNoIGlzIGNvcnJlY3RlZCBmb3IgYm9keSBzaXplOgoKYGBge3IgbWVzc2FnZT1GQUxTRX0KIyNVc2UgdGhlIGdncGxvdCBmdW5jdGlvbiB0byBncmFwaCB0aGUgaGlzdG9ncmFtIGFuZCBjb2xvciBkYXRhIGJhc2VkIG9uIGhhYml0YXQKZ2dwbG90KG1vcnBoLmRhdGEsIGFlcyh4PXJlcy5wcmVkb3JzYWwsIGZpbGw9SGFiaXRhdCkpICsKICBnZW9tX2hpc3RvZ3JhbShhZXMoeT0uLmRlbnNpdHkuLikpICsKICBnZW9tX2RlbnNpdHkoYWxwaGE9MC41KSsKICB4bGFiKCJyZWFsYXRpdmUgcHJlZG9yc2FsIGxlbmd0aCIpICsgCiAgeWxhYigiZnJlcXVlbmN5IikgKwogIHRoZW1lX2NsYXNzaWMoKQpgYGAKCldoZW4geW91IHBsb3QgcmVsYXRpdmUgcHJlZG9yc2FsIGxlbmd0aCwgd2hhdCBkbyB5b3Ugb2JzZXJ2ZT8gSG93IGRvZXMgdmFyaWF0aW9uIGluIHByZWRvcnNhbCBsZW5ndGggdmFyeSB3aXRoaW4gYW5kIGJldHdlZW4gcG9wdWxhdGlvbnMsIGFuZCBob3cgZG9lcyBpdCBjb21wYXJlIHRvIHZhcmlhdGlvbiBpbiBzdGFuZGFyZCBsZW5ndGg/CgoqV2UgZG9udCBzZWUgYSBsb3Qgb2YgdmFyaWF0aW9uIHdpdGhpbiB0aGUgcG9wdWxhdGlvbiwgbGVuZ3RoIGRvZXNudCByZWFsbHkgbWF0dGVyLioKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgNC4zLiBDb21wYXJpbmcgRXllIFNpemUgVmFyaWF0aW9uIFdpdGhpbiBhbmQgQmV0d2VlbiBQb3B1bGF0aW9ucwoKVXNpbmcgdGhlIHNhbWUgYXBwcm9hY2ggYXMgZm9yIHByZWRvcnNhbCB2YXJpYXRpb24sIGNvbXBhcmUgdmFyaWF0aW9uIGluIHJlbGF0aXZlIGV5ZSBkaWFtZXRlcjoKCmBgYHtyIG1lc3NhZ2U9RkFMU0V9CiNZb3VyIGNvZGUgZ29lcyBoZXJlCmZpdDIgPC0gbG0oRXllLmRpYW1ldGVyIH4gU3RhbmRhcmQubGVuZ3RoLCBkYXRhID0gbW9ycGguZGF0YSkKCiNFeHRyYWN0IHJlc2lkdWFscyBhbmQgY3JlYXRlIGEgbmV3IHZhcmlhYmxlIEV5ZS5kaWFtZXRlciBpbiB0aGUgbW9ycGguZGF0YSBkYXRhIGZyYW1lCm1vcnBoLmRhdGEkcmVzLmV5ZS5zaXplIDwtIHJlc2lkdWFscyhmaXQyKQoKIyNVc2UgdGhlIGdncGxvdCBmdW5jdGlvbiB0byBncmFwaCB0aGUgaGlzdG9ncmFtIGFuZCBjb2xvciBkYXRhIGJhc2VkIG9uIGhhYml0YXQKZ2dwbG90KG1vcnBoLmRhdGEsIGFlcyh4PXJlcy5leWUuc2l6ZSwgZmlsbD1IYWJpdGF0KSkgKwogIGdlb21faGlzdG9ncmFtKGFlcyh5PS4uZGVuc2l0eS4uKSkgKwogIGdlb21fZGVuc2l0eShhbHBoYT0wLjUpKwogIHhsYWIoInJlYWxhdGl2ZSBleWUgc2l6ZSIpICsgCiAgeWxhYigiZnJlcXVlbmN5IikgKwogIHRoZW1lX2NsYXNzaWMoKQpgYGAKCldoYXQgZG8geW91IG9ic2VydmU/IEhvdyBkb2VzIHZhcmlhdGlvbiBpbiBleWUgZGlhbWV0ZXIgdmFyeSB3aXRoaW4gYW5kIGJldHdlZW4gcG9wdWxhdGlvbnMsIGFuZCBob3cgZG9lcyBpdCBjb21wYXJlIHRvIHZhcmlhdGlvbiBpbiB0aGUgb3RoZXIgdHJhaXRzPwoKKkkgc2VlIHRoYXQgcmVsYXRpdmUgZXllIHNpemUgaXMgbGFyZ2VyIGZvciB0aGUgc3VyZmFjZSBwb3B1bGF0aW9uLiBFeWUgZGlhbWV0ZXIgdmFyeSBzIHdpdGggdGhlcmUgYmVpbmcgbGFyZ2VyIGV5ZSBzaXplcyBmb3IgdGhlIHN1cmZhY2UgcG9wdWxhdGlvbiByYXRoZXIgdGhhbiB0aGUgY2F2ZSBwb3B1bGF0aW9uIGJlY2F1c2UgdGhleSBkb24ndCBuZWNlc3NhcmlseSBuZWVkIHRvIHNlZSBzaW5jZSBpdCBpcyBzbyBkYXJrLiBpdCBjb21wYXJlcyB0byB2YXJpYXRpb24gb2Ygb3RoZXIgdHJhaXRzIHNpbmNlIHRoZSBjaGFuZ2UgaW4gdGhlIGVudmlyb25tZW50IGxlYWRzIHRvIGRpZmZlcmVudCBuZWVkcyBvZiBkaWZmZXJlbnQgZXZvbHV0aW9uYXJ5IHRyYWl0cy4qCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMgNS4gVmFyaWF0aW9uIGluIFRyYWl0cyBpcyBIZXJpdGFibGUKCkFuIGF2aWQgYnJlZWRlciBvZiBmYW5jeSBwaWdlb25zLCBEYXJ3aW4gb2JzZXJ2ZWQgdGhhdCBzcGVjaWZpYyB0cmFpdHMgYXJlIHBhc3NlZCBmcm9tIHBhcmVudHMgdG8gb2Zmc3ByaW5nLCBldmVuIHRob3VnaCBoZSBoYWQgbm8gY2x1ZSBob3cgdGhpcyBtaWdodCBhY3R1YWxseSB3b3JrIChnZW5ldGljcyB3YXMgbm90IHJlYWxseSBhIHRoaW5nIHlldCkuIEV2ZW4gd2l0aG91dCBhbiBhYmlsaXR5IHRvIGNvbmR1Y3QgbW9sZWN1bGFyIGdlbmV0aWMgYW5hbHlzZXMsIHdlIGNhbiBlc3RpbWF0ZSBoZXJpdGFiaWxpdHkgb2YgdHJhaXRzIGJ5IGNvbXBhcmluZyB0aGUgdHJhaXRzIG9mIG9mZnNwcmluZyB0byB0aGUgdHJhaXRzIG9mIHRoZSBwYXJlbnRzLgoKTGV0J3MgbG9hZCBzb21lIGRhdGEgdGhhdCBjb21wYXJlcyBwYXJlbnQgYW5kIG9mZnNwcmluZyB0cmFpdHMgaW4gY2F2ZSBtb2xsaWVzLiBUbyBkbyB0aGlzLCB3ZSBicm91Z2h0IGNhdmUgbW9sbGllcyBpbnRvIHRoZSBsYWIgYW5kIGJyZWQgdGhlbSB1bmRlciBzdGFuZGFyZGl6ZWQgY29uZGl0aW9ucy4gRGF0YSByZXByZXNlbnQgdGhlIGF2ZXJhZ2UgdHJhaXQgdmFsdWVzIG9mIHRoZSBtb3RoZXIgYW5kIGZhdGhlciBhbmQgb2YgYWxsIG9mZnNwcmluZyBmcm9tIGEgc3BlY2lmaWMgYnJvb2QuIFRoZSBlYXNpZXN0IHdheSB0byBjb21wYXJlIHBhcmVudCBhbmQgb2Zmc3ByaW5nIHRyYWl0cyBpcyB0aHJvdWdoIGEgc2NhdHRlciBwbG90LCB3aGljaCB3ZSBhbHJlYWR5IHVzZWQgaW4gRXhlcmNpc2UgMS4gSWYgYSB0cmFpdCBpcyBoZXJpdGFibGUsIHdlIHdvdWxkIGV4cGVjdCB0byBzZWUgYSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHBhcmVudCBhbmQgb2Zmc3ByaW5nIHRyYWl0cyAoZS5nLiwgcGFyZW50cyB3aXRoIHNtYWxsIGV5ZXMgc2hvdWxkIGhhdmUgb2Zmc3ByaW5nIHdpdGggc21hbGwgZXllcykuCgpUaGUgZm9sbG93aW5nIGRhdGFzZXQgaW5jbHVkZXMgbWVhc3VyZW1lbnRzIG9mIHBhcmVudGFsIGFuZCBvZmZzcHJpbmcgc3RhbmRhcmQgbGVuZ3RoIGFzIHdlbGwgYXMgZXllIHNpemUuCgpgYGB7cn0KI1VzZSB0aGUgcmVhZC5jc3YgZnVuY3Rpb24gdG8gaW1wb3J0IGEgZGF0YXNldDsgdGFrZSBhIGxvb2sgYXQgdGhlIGRhdGEgc3RydWN0dXJlIG9uY2UgeW91IGltcG9ydGVkIHRoZSBmaWxlIQpoZXJpdGFiaWxpdHkgPC0gcmVhZC5jc3YoImhlcml0YWJpbGl0eS5jc3YiLCBmaWxlRW5jb2RpbmcgPSAnVVRGLTgtQk9NJykKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIDUuMS4gSGVyaXRhYmlsaXR5IG9mIFN0YW5kYXJkIExlbmd0aAoKRmlyc3QsIGxldCB1cyBleHBsb3JlIHdoZXRoZXIgdGhlcmUgaXMgZXZpZGVuY2UgZm9yIGhlcml0YWJpbGl0eSBpbiBzdGFuZGFyZCBsZW5ndGguCgpXaGF0IGRvIHlvdSBvYnNlcnZlPyBJcyBzdGFuZGFyZCBsZW5ndGggYSBoZXJpdGFibGUgdHJhaXQ/CgpgYGB7ciBtZXNzYWdlPUZBTFNFfQpnZ3Bsb3QoaGVyaXRhYmlsaXR5LCBhZXMoeD1wYXJlbnQuc3RhbmRhcmQubGVuZ3RoLCB5PW9mZnNwcmluZy5zdGFuZGFyZC5sZW5ndGgpKSArIAogIGdlb21fcG9pbnQoKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsKICB4bGFiKCJyZWFsYXRpdmUgaGVyaXRhYmlsaXR5IikgKyAKICB5bGFiKCJmcmVxdWVuY3kiKSArCiAgdGhlbWVfY2xhc3NpYygpCmBgYAoKKlRoZSBncmFwaCBpcyB2ZXJ5IHNjYXR0ZXJlZCwgc28gbm8gaGVycml0YWJpbGl0eSBpcyBub3QgYSBoZXJpdGFibGUgdHJhaXQuLioKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgNS4yLiBIZXJpdGFiaWxpdHkgb2YgRXllIFNpemUKCk5vdyBsZXQgdXMgZXhwbG9yZSB3aGV0aGVyIHRoZXJlIGlzIGFueSBoZXJpdGFiaWxpdHkgaW4gZXllIHNpemUuIFJlbWVtYmVyLCB0aGVyZSBpcyBzdWJzdGFudGlhbCB2YXJpYXRpb24gaW4gYm9keSBzaXplLCBhbmQgaW4gc3VjaCBjYXNlcywgd2Ugd2FudCB0byBjb250cm9sIGZvciBib2R5IHNpemUgYnkgY2FsY3VsYXRpbmcgcmVzaWR1YWwgZXllIHNpemUgZmlyc3QuCgpgYGB7ciBtZXNzYWdlPUZBTFNFfQojI0NhbGN1bGF0ZSByZXNpZHVhbCBleWUgc2l6ZXMgZm9yIHRoZSBwYXJlbnRzIGFuZCB0aGUgb2Zmc3ByaW5nCiNZb3VyIGNvZGUgZ29lcyBoZXJlOgpmaXQzIDwtIGxtKHBhcmVudC5leWUuc2l6ZSB+IHBhcmVudC5zdGFuZGFyZC5sZW5ndGgsIGRhdGEgPSBoZXJpdGFiaWxpdHkpCgpmaXQ0IDwtIGxtKG9mZnNwcmluZy5leWUuc2l6ZSB+IG9mZnNwcmluZy5zdGFuZGFyZC5sZW5ndGgsIGRhdGEgPSBoZXJpdGFiaWxpdHkpCgpoZXJpdGFiaWxpdHkkcmVzLm9mZnNwcmluZy5leWUgPC0gcmVzaWR1YWxzKGZpdDQpCiNQbG90IHRoZSByZXN1bHRzCmdncGxvdChtb3JwaC5kYXRhLCBhZXMoeD1TdGFuZGFyZC5sZW5ndGgsIHk9RXllLmRpYW1ldGVyKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikgKwogIHhsYWIoIkV5ZSBkaWFtZXRlciIpICsgCiAgeWxhYigiU3RhbmRhcmQgbGVuZ3RoIikgKwogIHRoZW1lX2NsYXNzaWMoKQpgYGAKCldoYXQgZG8geW91IG9ic2VydmU/IElzIGV5ZSBzaXplIGEgaGVyaXRhYmxlIHRyYWl0PwoKKlRoZSBncmFwaCBzaG93cyBhIG1vcmUgbGluZWFyIGxvb2ssIHRoaXMgbWVhbnMgZXllIHNpemUgaXMgaGVyaXRhYmxlLioKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyA2LiBXaGF0IFdvdWxkIEhhcHBlbiBJZi4uLj8KCkltYWdpbmUgZm9yIGEgbW9tZW50IHRoYXQgc21hbGxlciBmaXNoIGhhdmUgYSBoaWdoZXIgbGlrZWxpaG9vZCBvZiBzdXJ2aXZhbCBpbiB0aGUgY2F2ZS4gV291bGQgeW91IGV4cGVjdCBldm9sdXRpb24gb2YgYm9keSBzaXplIHVwb24gY2F2ZSBjb2xvbml6YXRpb24/CgpJbWFnaW5lIGZvciBhIG1vbWVudCB0aGF0IGZpc2ggd2l0aCBzbWFsbGVyIGV5ZXMgaGF2ZSBhIGhpZ2hlciBsaWtlbGlob29kIG9mIHN1cnZpdmFsIGluIHRoZSBjYXZlLiBXb3VsZCB5b3UgZXhwZWN0IGV2b2x1dGlvbiBvZiBleWUgc2l6ZSB1cG9uIGNhdmUgY29sb25pemF0aW9uPyBKdXN0aWZ5IHlvdXIgcmVzcG9uc2UuCgoqWWVzIGV2b2x1dGlvbiBvZiBib2R5IHNpemUgd2lsbCBiZSBleHBlY3RlZC4gc2Vjb25kbHksIHllcyB5b3Ugd291bGQgZXhwZWN0IHRoZSBldm9sdXRpb24gb2Ygc21hbGxlciBleWVzIHVwb24gY2F2ZSBjb2xvbml6YXRpb24sIHRoZSBzY2VuYXJpbyBkZXNjcmliZWQgd2hlcmUgc21hbGxlciBleWVkIGZpc2ggaGF2ZSBhIGhpZ2hlciBsaWtlbGlob29kIG9mIHN1cnZpdmFsIGlzIHRoZSBkcml2aW5nIGZvcmNlIG9mIG5hdHVyYWwgc2VsZWN0aW9uICAqCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMgNy4gUmVzb3VyY2VzCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIDcuMS4gRGF0YSBSZWZlcmVuY2VzCgpUaGUgZXllIHNpemUgZGF0YSB3YXMgcHVibGlzaGVkIGluIHRoZSBmb2xsb3dpbmcgcGFwZXIuIE90aGVyIG1lYXN1cmVtZW50cyBhcmUgdW5wdWJsaXNoZWQgZGF0YSBieSBNLiBUb2JsZXIuCgotICAgTWNHb3dhbiwgSy4gTC4sIEMuIE4uIFBhc3NvdywgTC4gQXJpYXMgUm9kcmlndWV6LCBNLiBUb2JsZXIgJiBKLiBMLiBLZWxsZXkgKDIwMTkpOiBbRXhwcmVzc2lvbiBhbmFseXNlcyBvZiBjYXZlIG1vbGxpZXMgKCpQb2VjaWxpYSBtZXhpY2FuYSopIHJldmVhbCBrZXkgZ2VuZXMgaW52b2x2ZWQgaW4gdGhlIGVhcmx5IGV2b2x1dGlvbiBvZiBleWUgcmVncmVzc2lvbl0oaHR0cHM6Ly9yb3lhbHNvY2lldHlwdWJsaXNoaW5nLm9yZy9kb2kvMTAuMTA5OC9yc2JsLjIwMTkuMDU1NCkuICpCaW9sb2d5IExldHRlcnMqIDE1ICgxMCk6IDIwMTkwNTU0LgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyA3LjIgUmVzb3VyY2VzIFlvdSBDb25zdWx0ZWQKCkNvbnN1bHRpbmcgYWRkaXRpb25hbCByZXNvdXJjZXMgdG8gc29sdmUgdGhpcyBhc3NpZ25tZW50IGlzIGFic29sdXRlbHkgYWxsb3dlZCwgYnV0IGZhaWx1cmUgdG8gZGlzY2xvc2UgdGhvc2UgcmVzb3VyY2VzIGlzIHBsYWdpYXJpc20uIFBsZWFzZSBsaXN0IGFueSBjb2xsYWJvcmF0b3JzIHlvdSB3b3JrZWQgd2l0aCBhbmQgcmVzb3VyY2VzIHlvdSB1c2VkIGJlbG93IG9yIHN0YXRlIHRoYXQgeW91IGhhdmUgbm90IHVzZWQgYW55LgoKKkRyLiBCb25uZXIuKgo=