Handout 1: RELATIONSHIPS BETWEEN QUANTITATIVE VARIABLES

Excerpted (with permission) from Chapter 5 of Investigating Statistical Concepts, Applications and Methods, 3rd Edition, Beth L. Chance and Allan J. Rossman, 2106.

In these activities you will analyze data sets with two quantitative variables. The goal will be to describe the relationship between the variables. As always, you will start by learning some useful numerical and graphical techniques for summarizing the data. Then you will explore how to use a mathematical model of the relationship to make predictions of one variable from the other. In the next section you will then move on to inferential techniques based on simulated sampling and randomization distributions as well as a mathematical model.

Investigation 1.1: Cat Jumping

Evolutionary biologists are often interested in “form-function relationships” to help explain evolution history of say an animal species. Harris and Steudel (2002) investigated factors that are related to the jumping ability of domestic cats. Because jump ability and height are largely dependent on takeoff velocity, several traits were recorded for 18 healthy adult cats such as relative limb length, relative extensor muscle mass, body mass, fat mass relative to lean body mass, and the percentage of fast-twitch muscle fibers to see which might best explain maximum takeoff velocity (based on high-speed videos). In this investigation, you will examine the following data, also available in the file CatJumping.txt: [link] (http://www.rossmanchance.com/iscam2/data/CatJumping.txt)
(a) Identify the observational units and the primary response variable of interest here. Also classify this variable as quantitative or categorical.

Observational units:

Response variable:

Type:

  1. Open the CatJumping.txt data file in RStuido and produce numerical and graphical summaries of the takeoff velocity variable. Describe the distribution of takeoff velocities in this sample (shape, center, variability, unusual observations). To do this, copy and paste the following commands into the RStudio console window.
    Note - first we will load some packages that contain commands we will use. You may have to load twice.
install.packages("mosaic")
install.packages("mosaicData")
install.packages("ggplot2")
install.packages("lattice")
install.packages("car")
install.packages("manipulate")
load(url("http://www.rossmanchance.com/iscam3/ISCAM.RData"))
require(mosaic)
trellis.par.set(theme=theme.mosaic()) # change default color scheme for lattice

Now copy the following R code and paste it into your Console window. DO NOT hit ENTER yet.

catjumps = read.table("clipboard", header=TRUE)

Now go back to the CatJumpting text file and copy the entire page. That is, CTRL-A, followed by CTRL-C. Then return to the R Console window and Execute the code.

You can check that the data has been put in R in several ways, but the easiest is

View(catjumps)

We will “attach” this data so the R knows what which data we wish to work with.

attach(catjumps)

Now let’s ask R for summary statistics and to make a dotplot of the take-off velocities.

summary(velocity)
dotPlot(velocity, cex=0.4,data = catjumps, xlab="velocity", panel=panel.dotPlot)
  1. Based on your analysis in (b), if you were going to randomly select a domestic cat, what is your best prediction of its takeoff velocity?

  2. Do you think there will be a relationship between a cat’s takeoff velocity and its body mass? If so, do you think heavier cats will tend to have larger or smaller takeoff velocities than lighter cats?

We will need a new graphical summary to visually explore the relationship between two quantitative variables, the scatterplot. The commands below makes a default, scatterplot, but they are not particularly pretty.

plot(bodymass,velocity)
plot(velocity~bodymass)

Are there any differences in the plots created by the previous two commands?

Now try this one:

plotPoints(bodymass~velocity,data = catjumps)
  1. Describe the relationship between a cat’s takeoff velocity and its body mass, as displayed in this scatterplot. Does this pattern confirm your expectation in (d)?

  2. Do any of these cats appear to be outliers in the sense that its pair of values (body mass, takeoff velocity) does not fit the pattern of the majority of cats? If so, identify the ID for that cat and describe what’s different about this cat (in context).

Terminology Detour

Scatterplots are useful for displaying the relationship between two quantitative variables. If one variable has been defined as the response variable and the other as the explanatory variable, we will put the response variable on the vertical axis and the explanatory variable along the horizontal axis.

In describing scatterplots, you will describe the overall pattern between the two variables focusing primarily on three things:

  • Direction: Is there a positive association (small values of \(y\) tend to occur with small values of \(x\) and large values of \(y\) tend to occur with large values of \(x\)) or a negative association (small values of y tend to occur at large values of \(x\) and vice versa)?

  • Linearity: Is the overall pattern in the scatterplot linear or not?

  • Strength: How closely are the observations following the observed pattern?

The above scatterplot reveals a fairly strong, negative association between body mass and takeoff velocity, meaning that heavier cats tend to have a smaller takeoff velocity than larger cats. The relationship is somewhat linear but has a bit of a curved pattern. There is one outlier cat (cat C) with a very high takeoff velocity despite having a very large body mass.

  1. Now produce a scatterplot of takeoff velocity vs. percentage of body fat. Describe the association. Would you say that the association with velocity is stronger than with body mass? More or less linear?

  2. For the other two variables (hind limb length and muscle mass), would you expect to see a positive or negative association with takeoff velocity? Explain. Then look at scatterplots, and comment on whether the association is as you expected.

  3. Now produce a coded scatterplot of takeoff velocity vs. body mass that uses different symbols for male and female cats. Based on this graph, do you notice any differences between male and female cats with regard to these variables? Explain.

plotPoints( velocity ~ bodymass, data=catjumps, groups=Sex, pch=20)

Study Conclusions

These researchers reported that variation in cat maximum takeoff velocity was significantly explained by both hind limb length (cats with longer limbs tended to have higher takeoff velocities) and fat mass relative to lean body mass (cats with lower fat mass tended to have higher takeoff velocities), but not to extensor muscle mass relative to lean mass or fast-twitch fiber content. They explained the “pervasive effect” of body mass by the increase in muscle work invested in increasing the center of mass potential energy as compared with kinetic energy during takeoff.

Later you will learn how they determined the statistical significance of these relationships. First, we will examine a numerical measure of the strength of the association between two variables.

Investigation 1.2: Drive for Show, Putt for Dough

Some have cited “Drive for show, putt for dough” as the oldest clich

LS0tDQp0aXRsZTogIlN0YXQgMzUwIENsYXNzIDEiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCiAgaHRtbF9kb2N1bWVudDogZGVmYXVsdA0KICB3b3JkX2RvY3VtZW50OiBkZWZhdWx0DQotLS0NCg0KDQojSGFuZG91dCAxOiBSRUxBVElPTlNISVBTIEJFVFdFRU4gUVVBTlRJVEFUSVZFIFZBUklBQkxFUw0KDQpFeGNlcnB0ZWQgKHdpdGggcGVybWlzc2lvbikgZnJvbSBDaGFwdGVyIDUgb2YgSW52ZXN0aWdhdGluZyBTdGF0aXN0aWNhbCBDb25jZXB0cywgQXBwbGljYXRpb25zIGFuZCBNZXRob2RzLCAzcmQgRWRpdGlvbiwgQmV0aCBMLiBDaGFuY2UgYW5kIEFsbGFuIEouIFJvc3NtYW4sIDIxMDYuICANCg0KDQoNCg0KSW4gdGhlc2UgYWN0aXZpdGllcyB5b3Ugd2lsbCBhbmFseXplIGRhdGEgc2V0cyB3aXRoIHR3byBxdWFudGl0YXRpdmUgdmFyaWFibGVzLiBUaGUgZ29hbCB3aWxsIGJlIHRvIGRlc2NyaWJlIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgdmFyaWFibGVzLiBBcyBhbHdheXMsIHlvdSB3aWxsIHN0YXJ0IGJ5IGxlYXJuaW5nIHNvbWUgdXNlZnVsIG51bWVyaWNhbCBhbmQgZ3JhcGhpY2FsIHRlY2huaXF1ZXMgZm9yIHN1bW1hcml6aW5nIHRoZSBkYXRhLiBUaGVuIHlvdSB3aWxsIGV4cGxvcmUgaG93IHRvIHVzZSBhIG1hdGhlbWF0aWNhbCBtb2RlbCBvZiB0aGUgcmVsYXRpb25zaGlwIHRvIG1ha2UgcHJlZGljdGlvbnMgb2Ygb25lIHZhcmlhYmxlIGZyb20gdGhlIG90aGVyLiBJbiB0aGUgbmV4dCBzZWN0aW9uIHlvdSB3aWxsIHRoZW4gbW92ZSBvbiB0byBpbmZlcmVudGlhbCB0ZWNobmlxdWVzIGJhc2VkIG9uIHNpbXVsYXRlZCBzYW1wbGluZyBhbmQgcmFuZG9taXphdGlvbiBkaXN0cmlidXRpb25zIGFzIHdlbGwgYXMgYSBtYXRoZW1hdGljYWwgbW9kZWwuDQoNCiMjSW52ZXN0aWdhdGlvbiAxLjE6IENhdCBKdW1waW5nICANCg0KRXZvbHV0aW9uYXJ5IGJpb2xvZ2lzdHMgYXJlIG9mdGVuIGludGVyZXN0ZWQgaW4gImZvcm0tZnVuY3Rpb24gcmVsYXRpb25zaGlwcyIgdG8gaGVscCBleHBsYWluIGV2b2x1dGlvbiBoaXN0b3J5IG9mIHNheSBhbiBhbmltYWwgc3BlY2llcy4gSGFycmlzIGFuZCBTdGV1ZGVsICgyMDAyKSBpbnZlc3RpZ2F0ZWQgZmFjdG9ycyB0aGF0IGFyZSByZWxhdGVkIHRvIHRoZSBqdW1waW5nIGFiaWxpdHkgb2YgZG9tZXN0aWMgY2F0cy4gQmVjYXVzZSBqdW1wIGFiaWxpdHkgYW5kIGhlaWdodCBhcmUgbGFyZ2VseSBkZXBlbmRlbnQgb24gdGFrZW9mZiB2ZWxvY2l0eSwgc2V2ZXJhbCB0cmFpdHMgd2VyZSByZWNvcmRlZCBmb3IgMTggaGVhbHRoeSBhZHVsdCBjYXRzIHN1Y2ggYXMgcmVsYXRpdmUgbGltYiBsZW5ndGgsIHJlbGF0aXZlIGV4dGVuc29yIG11c2NsZSBtYXNzLCBib2R5IG1hc3MsIGZhdCBtYXNzIHJlbGF0aXZlIHRvIGxlYW4gYm9keSBtYXNzLCBhbmQgdGhlIHBlcmNlbnRhZ2Ugb2YgZmFzdC10d2l0Y2ggbXVzY2xlIGZpYmVycyB0byBzZWUgd2hpY2ggbWlnaHQgYmVzdCBleHBsYWluIG1heGltdW0gdGFrZW9mZiB2ZWxvY2l0eSAoYmFzZWQgb24gaGlnaC1zcGVlZCB2aWRlb3MpLiBJbiB0aGlzIGludmVzdGlnYXRpb24sIHlvdSB3aWxsIGV4YW1pbmUgdGhlIGZvbGxvd2luZyBkYXRhLCBhbHNvIGF2YWlsYWJsZSBpbiB0aGUgZmlsZSBDYXRKdW1waW5nLnR4dDoNCltsaW5rXSAoaHR0cDovL3d3dy5yb3NzbWFuY2hhbmNlLmNvbS9pc2NhbTIvZGF0YS9DYXRKdW1waW5nLnR4dCkgIA0KKGEpIElkZW50aWZ5IHRoZSBvYnNlcnZhdGlvbmFsIHVuaXRzIGFuZCB0aGUgcHJpbWFyeSByZXNwb25zZSB2YXJpYWJsZSBvZiBpbnRlcmVzdCBoZXJlLiBBbHNvIGNsYXNzaWZ5IHRoaXMgdmFyaWFibGUgYXMgcXVhbnRpdGF0aXZlIG9yIGNhdGVnb3JpY2FsLg0KDQpPYnNlcnZhdGlvbmFsIHVuaXRzOg0KDQoNClJlc3BvbnNlIHZhcmlhYmxlOiAgDQoNClR5cGU6ICANCg0KKGIpIE9wZW4gdGhlIENhdEp1bXBpbmcudHh0IGRhdGEgZmlsZSBpbiBSU3R1aWRvIGFuZCBwcm9kdWNlIG51bWVyaWNhbCBhbmQgZ3JhcGhpY2FsIHN1bW1hcmllcyBvZiB0aGUgdGFrZW9mZiB2ZWxvY2l0eSB2YXJpYWJsZS4gRGVzY3JpYmUgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0YWtlb2ZmIHZlbG9jaXRpZXMgaW4gdGhpcyBzYW1wbGUgKHNoYXBlLCBjZW50ZXIsIHZhcmlhYmlsaXR5LCB1bnVzdWFsIG9ic2VydmF0aW9ucykuICBUbyBkbyB0aGlzLCBjb3B5IGFuZCBwYXN0ZSB0aGUgZm9sbG93aW5nIGNvbW1hbmRzIGludG8gdGhlIFJTdHVkaW8gY29uc29sZSB3aW5kb3cuICANCk5vdGUgLSBmaXJzdCB3ZSB3aWxsIGxvYWQgc29tZSBwYWNrYWdlcyB0aGF0IGNvbnRhaW4gY29tbWFuZHMgd2Ugd2lsbCB1c2UuICBZb3UgbWF5IGhhdmUgdG8gbG9hZCB0d2ljZS4NCmBgYHtyfQ0KaW5zdGFsbC5wYWNrYWdlcygibW9zYWljIikNCmluc3RhbGwucGFja2FnZXMoIm1vc2FpY0RhdGEiKQ0KaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpDQppbnN0YWxsLnBhY2thZ2VzKCJsYXR0aWNlIikNCmluc3RhbGwucGFja2FnZXMoImNhciIpDQppbnN0YWxsLnBhY2thZ2VzKCJtYW5pcHVsYXRlIikNCmBgYA0KYGBge3J9DQpsb2FkKHVybCgiaHR0cDovL3d3dy5yb3NzbWFuY2hhbmNlLmNvbS9pc2NhbTMvSVNDQU0uUkRhdGEiKSkNCnJlcXVpcmUobW9zYWljKQ0KdHJlbGxpcy5wYXIuc2V0KHRoZW1lPXRoZW1lLm1vc2FpYygpKSAjIGNoYW5nZSBkZWZhdWx0IGNvbG9yIHNjaGVtZSBmb3IgbGF0dGljZQ0KYGBgDQoNCk5vdyBjb3B5IHRoZSBmb2xsb3dpbmcgUiBjb2RlIGFuZCBwYXN0ZSBpdCBpbnRvIHlvdXIgQ29uc29sZSB3aW5kb3cuICBETyBOT1QgaGl0IEVOVEVSIHlldC4NCg0KYGBge3J9DQpjYXRqdW1wcyA9IHJlYWQudGFibGUoImNsaXBib2FyZCIsIGhlYWRlcj1UUlVFKQ0KYGBgDQpOb3cgZ28gYmFjayB0byB0aGUgQ2F0SnVtcHRpbmcgdGV4dCBmaWxlIGFuZCBjb3B5IHRoZSBlbnRpcmUgcGFnZS4gIFRoYXQgaXMsIENUUkwtQSwgZm9sbG93ZWQgYnkgQ1RSTC1DLg0KVGhlbiByZXR1cm4gdG8gdGhlIFIgQ29uc29sZSB3aW5kb3cgYW5kIEV4ZWN1dGUgdGhlIGNvZGUuICANCg0KWW91IGNhbiBjaGVjayB0aGF0IHRoZSBkYXRhIGhhcyBiZWVuIHB1dCBpbiBSIGluIHNldmVyYWwgd2F5cywgYnV0IHRoZSBlYXNpZXN0IGlzDQpgYGB7cn0NClZpZXcoY2F0anVtcHMpDQoNCmBgYA0KV2Ugd2lsbCAiYXR0YWNoIiB0aGlzIGRhdGEgc28gdGhlIFIga25vd3Mgd2hhdCB3aGljaCBkYXRhIHdlIHdpc2ggdG8gd29yayB3aXRoLg0KYGBge3J9DQphdHRhY2goY2F0anVtcHMpDQpgYGANCg0KTm93IGxldCdzIGFzayBSIGZvciBzdW1tYXJ5IHN0YXRpc3RpY3MgYW5kIHRvIG1ha2UgYSBkb3RwbG90IG9mIHRoZSB0YWtlLW9mZiB2ZWxvY2l0aWVzLiAgDQpgYGB7cn0NCnN1bW1hcnkodmVsb2NpdHkpDQpkb3RQbG90KHZlbG9jaXR5LCBjZXg9MC40LGRhdGEgPSBjYXRqdW1wcywgeGxhYj0idmVsb2NpdHkiLCBwYW5lbD1wYW5lbC5kb3RQbG90KQ0KYGBgDQoNCihjKSBCYXNlZCBvbiB5b3VyIGFuYWx5c2lzIGluIChiKSwgaWYgeW91IHdlcmUgZ29pbmcgdG8gcmFuZG9tbHkgc2VsZWN0IGEgZG9tZXN0aWMgY2F0LCB3aGF0IGlzIHlvdXIgYmVzdCBwcmVkaWN0aW9uIG9mIGl0cyB0YWtlb2ZmIHZlbG9jaXR5PyAgDQoNCihkKSBEbyB5b3UgdGhpbmsgdGhlcmUgd2lsbCBiZSBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGEgY2F0J3MgdGFrZW9mZiB2ZWxvY2l0eSBhbmQgaXRzIGJvZHkgbWFzcz8gSWYgc28sIGRvIHlvdSB0aGluayBoZWF2aWVyIGNhdHMgd2lsbCB0ZW5kIHRvIGhhdmUgbGFyZ2VyIG9yIHNtYWxsZXIgdGFrZW9mZiB2ZWxvY2l0aWVzIHRoYW4gbGlnaHRlciBjYXRzPyAgDQoNCg0KV2Ugd2lsbCBuZWVkIGEgbmV3IGdyYXBoaWNhbCBzdW1tYXJ5IHRvIHZpc3VhbGx5IGV4cGxvcmUgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBxdWFudGl0YXRpdmUgdmFyaWFibGVzLCB0aGUgKnNjYXR0ZXJwbG90Ki4gIFRoZSBjb21tYW5kcyBiZWxvdyBtYWtlcyBhIGRlZmF1bHQsIHNjYXR0ZXJwbG90LCBidXQgdGhleSBhcmUgbm90IHBhcnRpY3VsYXJseSBwcmV0dHkuDQoNCmBgYHtyfQ0KcGxvdChib2R5bWFzcyx2ZWxvY2l0eSkNCnBsb3QodmVsb2NpdHl+Ym9keW1hc3MpDQpgYGANCkFyZSB0aGVyZSBhbnkgZGlmZmVyZW5jZXMgaW4gdGhlIHBsb3RzIGNyZWF0ZWQgYnkgdGhlIHByZXZpb3VzIHR3byBjb21tYW5kcz8NCg0KTm93IHRyeSB0aGlzIG9uZToNCmBgYHtyfQ0KcGxvdFBvaW50cyhib2R5bWFzc352ZWxvY2l0eSxkYXRhID0gY2F0anVtcHMpDQpgYGANCihlKSBEZXNjcmliZSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gYSBjYXQncyB0YWtlb2ZmIHZlbG9jaXR5IGFuZCBpdHMgYm9keSBtYXNzLCBhcyBkaXNwbGF5ZWQgaW4gdGhpcyBzY2F0dGVycGxvdC4gRG9lcyB0aGlzIHBhdHRlcm4gY29uZmlybSB5b3VyIGV4cGVjdGF0aW9uIGluIChkKT8gIA0KDQooZikgRG8gYW55IG9mIHRoZXNlIGNhdHMgYXBwZWFyIHRvIGJlIG91dGxpZXJzIGluIHRoZSBzZW5zZSB0aGF0IGl0cyBwYWlyIG9mIHZhbHVlcyAoYm9keSBtYXNzLCB0YWtlb2ZmIHZlbG9jaXR5KSBkb2VzIG5vdCBmaXQgdGhlIHBhdHRlcm4gb2YgdGhlIG1ham9yaXR5IG9mIGNhdHM/IElmIHNvLCBpZGVudGlmeSB0aGUgSUQgZm9yIHRoYXQgY2F0IGFuZCBkZXNjcmliZSB3aGF0J3MgZGlmZmVyZW50IGFib3V0IHRoaXMgY2F0IChpbiBjb250ZXh0KS4gIA0KDQojIyNUZXJtaW5vbG9neSBEZXRvdXIgIA0KDQoqKlNjYXR0ZXJwbG90cyoqIGFyZSB1c2VmdWwgZm9yIGRpc3BsYXlpbmcgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBxdWFudGl0YXRpdmUgdmFyaWFibGVzLiBJZiBvbmUgdmFyaWFibGUgaGFzIGJlZW4gZGVmaW5lZCBhcyB0aGUgcmVzcG9uc2UgdmFyaWFibGUgYW5kIHRoZSBvdGhlciBhcyB0aGUgZXhwbGFuYXRvcnkgdmFyaWFibGUsIHdlIHdpbGwgcHV0IHRoZSByZXNwb25zZSB2YXJpYWJsZSBvbiB0aGUgdmVydGljYWwgYXhpcyBhbmQgdGhlIGV4cGxhbmF0b3J5IHZhcmlhYmxlIGFsb25nIHRoZSBob3Jpem9udGFsIGF4aXMuDQoNCkluIGRlc2NyaWJpbmcgc2NhdHRlcnBsb3RzLCB5b3Ugd2lsbCBkZXNjcmliZSB0aGUgb3ZlcmFsbCBwYXR0ZXJuIGJldHdlZW4gdGhlIHR3byB2YXJpYWJsZXMgZm9jdXNpbmcgcHJpbWFyaWx5IG9uIHRocmVlIHRoaW5nczoNCg0KKiAqRGlyZWN0aW9uKjogSXMgdGhlcmUgYSAqcG9zaXRpdmUgYXNzb2NpYXRpb24qIChzbWFsbCB2YWx1ZXMgb2YgJHkkIHRlbmQgdG8gb2NjdXIgd2l0aCBzbWFsbCB2YWx1ZXMgb2YgJHgkIGFuZCBsYXJnZSB2YWx1ZXMgb2YgJHkkIHRlbmQgdG8gb2NjdXIgd2l0aCBsYXJnZSB2YWx1ZXMgb2YgJHgkKSBvciBhICpuZWdhdGl2ZSBhc3NvY2lhdGlvbiogKHNtYWxsIHZhbHVlcyBvZiB5IHRlbmQgdG8gb2NjdXIgYXQgbGFyZ2UgdmFsdWVzIG9mICR4JCBhbmQgdmljZSB2ZXJzYSk/ICANCg0KKiAqTGluZWFyaXR5KjogSXMgdGhlIG92ZXJhbGwgcGF0dGVybiBpbiB0aGUgc2NhdHRlcnBsb3QgbGluZWFyIG9yIG5vdD8gIA0KDQoqICpTdHJlbmd0aCo6IEhvdyBjbG9zZWx5IGFyZSB0aGUgb2JzZXJ2YXRpb25zIGZvbGxvd2luZyB0aGUgb2JzZXJ2ZWQgcGF0dGVybj8gIA0KDQpUaGUgYWJvdmUgc2NhdHRlcnBsb3QgcmV2ZWFscyBhIGZhaXJseSBzdHJvbmcsIG5lZ2F0aXZlIGFzc29jaWF0aW9uIGJldHdlZW4gYm9keSBtYXNzIGFuZCB0YWtlb2ZmIHZlbG9jaXR5LCBtZWFuaW5nIHRoYXQgaGVhdmllciBjYXRzIHRlbmQgdG8gaGF2ZSBhIHNtYWxsZXIgdGFrZW9mZiB2ZWxvY2l0eSB0aGFuIGxhcmdlciBjYXRzLiBUaGUgcmVsYXRpb25zaGlwIGlzIHNvbWV3aGF0IGxpbmVhciBidXQgaGFzIGEgYml0IG9mIGEgY3VydmVkIHBhdHRlcm4uIFRoZXJlIGlzIG9uZSBvdXRsaWVyIGNhdCAoY2F0IEMpIHdpdGggYSB2ZXJ5IGhpZ2ggdGFrZW9mZiB2ZWxvY2l0eSBkZXNwaXRlIGhhdmluZyBhIHZlcnkgbGFyZ2UgYm9keSBtYXNzLiAgDQoNCihnKSBOb3cgcHJvZHVjZSBhIHNjYXR0ZXJwbG90IG9mIHRha2VvZmYgdmVsb2NpdHkgdnMuIHBlcmNlbnRhZ2Ugb2YgYm9keSBmYXQuIERlc2NyaWJlIHRoZSBhc3NvY2lhdGlvbi4gIFdvdWxkIHlvdSBzYXkgdGhhdCB0aGUgYXNzb2NpYXRpb24gd2l0aCB2ZWxvY2l0eSBpcyBzdHJvbmdlciB0aGFuIHdpdGggYm9keSBtYXNzPyBNb3JlIG9yIGxlc3MgbGluZWFyPyAgDQoNCihoKSBGb3IgdGhlIG90aGVyIHR3byB2YXJpYWJsZXMgKCpoaW5kIGxpbWIgbGVuZ3RoKiBhbmQgKm11c2NsZSBtYXNzKiksIHdvdWxkIHlvdSBleHBlY3QgdG8gc2VlIGEgcG9zaXRpdmUgb3IgbmVnYXRpdmUgYXNzb2NpYXRpb24gd2l0aCB0YWtlb2ZmIHZlbG9jaXR5PyBFeHBsYWluLiBUaGVuIGxvb2sgYXQgc2NhdHRlcnBsb3RzLCBhbmQgY29tbWVudCBvbiB3aGV0aGVyIHRoZSBhc3NvY2lhdGlvbiBpcyBhcyB5b3UgZXhwZWN0ZWQuICANCg0KKGkpIE5vdyBwcm9kdWNlIGEgY29kZWQgc2NhdHRlcnBsb3Qgb2YgdGFrZW9mZiB2ZWxvY2l0eSB2cy4gYm9keSBtYXNzIHRoYXQgdXNlcyBkaWZmZXJlbnQgc3ltYm9scyBmb3IgbWFsZSBhbmQgZmVtYWxlIGNhdHMuIEJhc2VkIG9uIHRoaXMgZ3JhcGgsIGRvIHlvdSBub3RpY2UgYW55DQpkaWZmZXJlbmNlcyBiZXR3ZWVuIG1hbGUgYW5kIGZlbWFsZSBjYXRzIHdpdGggcmVnYXJkIHRvIHRoZXNlIHZhcmlhYmxlcz8gRXhwbGFpbi4gIA0KYGBge3J9DQpwbG90UG9pbnRzKCB2ZWxvY2l0eSB+IGJvZHltYXNzLCBkYXRhPWNhdGp1bXBzLCBncm91cHM9U2V4LCBwY2g9MjApDQpgYGANCg0KIyMjU3R1ZHkgQ29uY2x1c2lvbnMgIA0KDQpUaGVzZSByZXNlYXJjaGVycyByZXBvcnRlZCB0aGF0IHZhcmlhdGlvbiBpbiBjYXQgbWF4aW11bSB0YWtlb2ZmIHZlbG9jaXR5IHdhcyBzaWduaWZpY2FudGx5IGV4cGxhaW5lZCBieSBib3RoIGhpbmQgbGltYiBsZW5ndGggKGNhdHMgd2l0aCBsb25nZXIgbGltYnMgdGVuZGVkIHRvIGhhdmUgaGlnaGVyIHRha2VvZmYgdmVsb2NpdGllcykgYW5kIGZhdCBtYXNzIHJlbGF0aXZlIHRvIGxlYW4gYm9keSBtYXNzIChjYXRzIHdpdGggbG93ZXIgZmF0IG1hc3MgdGVuZGVkIHRvIGhhdmUgaGlnaGVyIHRha2VvZmYgdmVsb2NpdGllcyksIGJ1dCBub3QgdG8gZXh0ZW5zb3IgbXVzY2xlIG1hc3MgcmVsYXRpdmUgdG8gbGVhbiBtYXNzIG9yIGZhc3QtdHdpdGNoIGZpYmVyIGNvbnRlbnQuIFRoZXkgZXhwbGFpbmVkIHRoZSAicGVydmFzaXZlIGVmZmVjdCIgb2YgYm9keSBtYXNzIGJ5IHRoZSBpbmNyZWFzZSBpbiBtdXNjbGUgd29yayBpbnZlc3RlZCBpbiBpbmNyZWFzaW5nIHRoZSBjZW50ZXIgb2YgbWFzcyBwb3RlbnRpYWwgZW5lcmd5IGFzIGNvbXBhcmVkIHdpdGgga2luZXRpYyBlbmVyZ3kgZHVyaW5nIHRha2VvZmYuICANCg0KTGF0ZXIgeW91IHdpbGwgbGVhcm4gaG93IHRoZXkgZGV0ZXJtaW5lZCB0aGUgc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIG9mIHRoZXNlIHJlbGF0aW9uc2hpcHMuIEZpcnN0LCB3ZSB3aWxsIGV4YW1pbmUgYSBudW1lcmljYWwgbWVhc3VyZSBvZiB0aGUgc3RyZW5ndGggb2YgdGhlIGFzc29jaWF0aW9uIGJldHdlZW4gdHdvIHZhcmlhYmxlcy4gIA0KDQojI0ludmVzdGlnYXRpb24gMS4yOiBEcml2ZSBmb3IgU2hvdywgUHV0dCBmb3IgRG91Z2ggIA0KDQpTb21lIGhhdmUgY2l0ZWQgIkRyaXZlIGZvciBzaG93LCBwdXR0IGZvciBkb3VnaCIgYXMgdGhlIG9sZGVzdCBjbGljaOkgaW4gZ29sZi4gVGhlIG1lc3NhZ2UgaXMgdGhhdCB0aGUgYmVzdCB3YXkgdG8gaW1wcm92ZSBvbmUncyBzY29yaW5nIGF2ZXJhZ2UgaW4gZ29sZiBpcyB0byBmb2N1cyBvbiBpbXByb3ZpbmcgcHV0dGluZywgYXMgb3Bwb3NlZCB0bywgc2F5LCBkaXN0YW5jZSBvZmYgdGhlIGluaXRpYWwgZHJpdmUsIGV2ZW4gdGhvdWdoIHRoZSBsYXR0ZXIgdXN1YWxseSBnYXJuZXJzIG1vcmUgb29oJ3MgYW5kIGFhaCdzLiBUbyBzZWUgd2hldGhlciB0aGlzIHBoaWxvc29waHkgaGFzIG1lcml0LCB3ZSBuZWVkIHRvIGV4YW1pbmUgd2hldGhlciB0aGVyZSBpcyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHB1dHRpbmcgYWJpbGl0eSBhbmQgb3ZlcmFsbCBzY29yaW5nLCBhbmQgd2hldGhlciB0aGF0IHJlbGF0aW9uc2hpcCBpcyBzdHJvbmdlciB0aGFuIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBzY29yaW5nIGF2ZXJhZ2UgYW5kIGRyaXZpbmcgZGlzdGFuY2UuIFRoZSBmaWxlIGdvbGZlcnMudHh0IGNvbnRhaW5zIHRoZSAyMDA0IHN0YXRpc3RpY3MgKHRocm91Z2ggdGhlIEhvbmRhIENsYXNzaWMgb24gTWFyY2ggMjApIG9uIHRoZSB0b3AgODAgUEdBIGdvbGZlcnMsIGRvd25sb2FkZWQgZnJvbSBodHRwOi8vd3d3LnBnYXRvdXIuY29tL3N0YXRzLyBvbiBNYXJjaCAyMCwgMjAwNC4gVGhyZWUgb2YgdGhlIHZhcmlhYmxlcyByZWNvcmRlZCBpbmNsdWRlOiAgDQoNCiogKlNjb3JpbmcgYXZlcmFnZSo6IEEgd2VpZ2h0ZWQgYXZlcmFnZSB3aGljaCB0YWtlcyB0aGUgc3Ryb2tlIGF2ZXJhZ2Ugb2YgdGhlIGZpZWxkIGludG8gYWNjb3VudC4gSXQgaXMgY29tcHV0ZWQgYnkgYWRkaW5nIGEgcGxheWVyJ3MgdG90YWwgc3Ryb2tlcyB0byBhbiBhZGp1c3RtZW50LCBhbmQgZGl2aWRpbmcgYnkgdGhlIHRvdGFsIHJvdW5kcyBwbGF5ZWQuIFRoaXMgYXZlcmFnZSBpcyBzdWJ0cmFjdGVkIGZyb20gcGFyIHRvIGNyZWF0ZSBhbiBhZGp1c3RtZW50IGZvciBlYWNoIHJvdW5kLiBLZWVwIGluIG1pbmQgdGhhdCBpbiBnb2xmIGxvdyBzY29yZXMsIGFzIG1lYXN1cmVkIGJ5IG51bWJlciBvZiBzdHJva2VzLCBhcmUgYmV0dGVyIHRoYW4gaGlnaCBzY29yZXMuICANCg0KKgkqRHJpdmluZyBkaXN0YW5jZSo6IEF2ZXJhZ2UgbnVtYmVyIG9mIHlhcmRzIHBlciBtZWFzdXJlZCBkcml2ZS4gVGhlc2UgZHJpdmVzIGFyZSBtZWFzdXJlZCBvbiB0d28gaG9sZXMgcGVyIHJvdW5kLCBjYXJlZnVsbHkgc2VsZWN0ZWQgdG8gZmFjZSBpbiBvcHBvc2l0ZSBkaXJlY3Rpb25zIHRvIGNvdW50ZXJhY3QgdGhlIGVmZmVjdHMgb2Ygd2luZC4gRHJpdmVzIGFyZSBtZWFzdXJlZCB0byB0aGUgcG9pbnQgd2hlcmUgdGhleSBjb21lIHRvIHJlc3QsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBvciBub3QgdGhleSBoaXQgdGhlIGZhaXJ3YXkuICANCg0KKiAqUHV0dGluZyBhdmVyYWdlKjogT24gaG9sZXMgd2hlcmUgdGhlIGdyZWVuIGlzIGhpdCBpbiByZWd1bGF0aW9uLCB0aGUgdG90YWwgbnVtYmVyIG9mIHB1dHRzIGlzIGRpdmlkZWQgYnkgdGhlIHRvdGFsIGhvbGVzIHBsYXllZC4gIA0KDQooYSkgRG8geW91IGV4cGVjdCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gc2NvcmluZyBhdmVyYWdlIGFuZCBkcml2aW5nIGRpc3RhbmNlIHRvIGJlIHBvc2l0aXZlIG9yDQpuZWdhdGl2ZT8gRXhwbGFpbi4gIA0KDQooYikgRG8geW91IGV4cGVjdCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gc2NvcmluZyBhdmVyYWdlIGFuZCBwdXR0aW5nIGF2ZXJhZ2UgdG8gYmUgcG9zaXRpdmUgb3IgbmVnYXRpdmU/IEV4cGxhaW4uICANCg0KDQooYykgT3BlbiB0aGUgZGF0YSBmaWxlIGFuZCBleGFtaW5lIGEgc2NhdHRlcnBsb3Qgb2YgYXZlcmFnZSBzY29yZSB2cy4gZHJpdmluZyBkaXN0YW5jZSBhbmQgYSBzY2F0dGVycGxvdCBvZiBhdmVyYWdlIHNjb3JlIHZzLiBhdmVyYWdlIHB1dHRzLiBEZXNjcmliZSBlYWNoIHNjYXR0ZXJwbG90LiBEbyB0aGUgcmVsYXRpb25zaGlwcyBjb25maXJtIHlvdXIgZXhwZWN0YXRpb25zIGluIChhKSBhbmQgKGIpPyBEb2VzIG9uZSByZWxhdGlvbnNoaXAgYXBwZWFyIHRvIGJlIHN0cm9uZ2VyIHRoYW4gdGhlIG90aGVyPyBJZiBzbywgd2hpY2g/ICANClRvIGZ1cnRoZXIgYW5hbHl6ZSB0aGVzZSBkYXRhLCB3ZSBuZWVkIGEgbnVtZXJpY2FsIHdheSBvZiBtZWFzdXJpbmcgdGhlIHN0cmVuZ3RoIG9mIHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRoZSB0d28gdmFyaWFibGVzLiBXZSB3aWxsIGRvIHRoaXMgd2l0aCB0aGUgKipjb3JyZWxhdGlvbiBjb2VmZmljaWVudCoqLiAgDQoNClRoZSBmb2xsb3dpbmcgYXJlIHRoZSBhYm92ZSBzY2F0dGVycGxvdHMgd2l0aCB0aGUgJHgkIGFuZCAkeSQgbGluZXMgc3VwZXJpbXBvc2VkLiAgDQoNCihkKSBGb3IgdGhlIGF2ZXJhZ2Ugc2NvcmUgdnMuIGF2ZXJhZ2UgcHV0dHMgc2NhdHRlcnBsb3QsIGluIHdoaWNoIHF1YWRyYW50cyBhcmUgbW9zdCBvZiB0aGUgcG9pbnRzDQpsb2NhdGVkPyBGb3IgdGhlIGF2ZXJhZ2Ugc2NvcmUgdnMuIGRyaXZpbmcgc2NhdHRlcnBsb3Q/IFdoaWNoIHNjYXR0ZXJwbG90IHNlZW1zIHRvIGhhdmUgZmV3ZXIgcG9pbnRzIGluIHRoZSAibm9uLWFsaWduZWQiIHF1YWRyYW50cz8gIA0KDQoqKkRlZmluaXRpb24qKg0KQSBudW1lcmljYWwgbWVhc3VyZSAob3Igc3RhdGlzdGljKSBvZiB0aGUgc3RyZW5ndGggb2YgYSBsaW5lYXIgcmVsYXRpb25zaGlwIGJldHdlZW4gcXVhbnRpdGF0aXZlIHZhcmlhYmxlcyAkeCQgYW5kICR5JCBpcyB0aGUgKipjb3JyZWxhdGlvbiBjb2VmZmljaWVudCoqLCAkciQuDQokciA9IFxmcmFjezF9e3tuIC0gMX19XHN1bVxsaW1pdHNfe2kgPSAxfV5uIHtcbGVmdCgge1xmcmFje3t7eF9pfSAtIFxiYXIgeH19e3t7c194fX19fSBccmlnaHQpfSBcbGVmdCgge1xmcmFje3t7eV9pfSAtIFxiYXIgeX19e3t7c195fX19fSBccmlnaHQpJA0Kd2hlcmUgJHtcYmFyIHh9JCBhbmQgJHNfeCQgYXJlIHRoZSBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIGV4cGxhbnRvcnkgdmFyaWFibGUsIGFuZCAkXGJhciB5JCBhbmQgJHNfeSQgYXJlIHRoZSBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIHJlc3BvbnNlIHZhcmlhYmxlLiAgDQoNCk5vdGljZSB0aGF0IHdoZW4gYSBwb2ludCAoJHhfaSQsICR5X2kkKSBpcyBpbiBxdWFkcmFudCBJIG9yIElJSSwgdGhlIHRlcm0gIHdpbGwgYmUgcG9zaXRpdmUuIFdoZW4gYSBwb2ludCBpcyBpbiBxdWFkcmFudCBJSSBvciBJViwgdGhpcyB0ZXJtIGlzIG5lZ2F0aXZlLiBXaGVyZSB0aGVyZSBpcyBhIHBvc2l0aXZlIGFzc29jaWF0aW9uLCBtb3N0IG9mIHRoZSBwb2ludHMgYXJlIGluIHF1YWRyYW50cyBJIGFuZCBJSUksIHNvIHRoZSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCBpcyBwb3NpdGl2ZS4gU2ltaWxhcmx5LCB3aGVuIHRoZXJlIGlzIGEgbmVnYXRpdmUgYXNzb2NpYXRpb24sIG1vc3Qgb2YgdGhlIHBvaW50cyB3aWxsIGJlIGluIHF1YWRyYW50cyBJSSBhbmQgSVYsIHNvIHRoZSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCB0dXJucyBvdXQgdG8gYmUgbmVnYXRpdmUuIFRoZSBtb3JlIG9ic2VydmF0aW9ucyB0aGF0IGFyZSBpbiB0aGUgImFsaWduZWQiIHF1YWRyYW50cywgYW5kIHRoZSBjbG9zZXIgdGhlIHBvaW50cyBmYWxsIHRvIGEgc3RyYWlnaHQgbGluZSwgdGhlIGxhcmdlciB0aGUgdmFsdWUgb2YgdGhlIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50Lg0KDQooZSkgTGV0ICR4JCByZXByZXNlbnQgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIHB1dHRzIGFuZCAkeSQgcmVwcmVzZW50IHRoZSBhdmVyYWdlIG51bWJlciBvZiBzdHJva2VzLiBVc2UgdGhlIGRlZmluaXRpb24gb2YgdGhlIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50IGFib3ZlIHRvIGRldGVybWluZSB0aGUgbWVhc3VyZW1lbnQgdW5pdHMgb2YgdGhlIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50ICRyJCBpbiB0ZXJtcyBvZiBwdXR0cyBhbmQgc3Ryb2tlcy4gIA0KDQooZikgSWYgdGhlIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50IGJldHdlZW4gdHdvIHZhcmlhYmxlcyBlcXVhbHMgemVybywgd2hhdCBkbyB5b3UgdGhpbmsgdGhlIHNjYXR0ZXJwbG90IHdpbGwgbG9vayBsaWtlPyAgDQoNCihnKSBTdXBwb3NlIHdlIGZpbmQgdGhlIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50IG9mIGEgdmFyaWFibGUgd2l0aCBpdHNlbGYuIFN1YnN0aXR1dGUgJHhfaSQgaW4gZm9yICR5X2kkIChhbmQgc28gJFxiYXIgeCQgZm9yICRcYmFyIHkkICBhbmQgJHNfeCQgZm9yICRzX3kkKSBpbiB0aGUgYWJvdmUgZXF1YXRpb24uIFNpbXBsaWZ5LiBXaGF0IGlzIHRoZSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCBlcXVhbCB0bz8gIA0KDQooaCkgRG8geW91IHRoaW5rIHRoZSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCB3aWxsIGJlIGEgcmVzaXN0YW50IG1lYXN1cmUgb2YgYXNzb2NpYXRpb24/IEV4cGxhaW4uICANCg0KKGkpIFRoZSBmb2xsb3dpbmcgc2NhdHRlcnBsb3RzIGRpc3BsYXkgNyBwYWlycyBvZiB2YXJpYWJsZXMgZm9yIHRoZXNlIGdvbGZlcnMuIFJhbmsgdGhlc2UgZ3JhcGhzIGluIG9yZGVyIGZyb20gc3Ryb25nZXN0IG5lZ2F0aXZlIGNvcnJlbGF0aW9uIHRvIHN0cm9uZ2VzdCBwb3NpdGl2ZSBjb3JyZWxhdGlvbi4gIA0KDQooaikgVXNlIHRlY2hub2xvZ3kgdG8gZGV0ZXJtaW5lIHRoZSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCBmb3IgZWFjaCBvZiB0aGUgYWJvdmUgc2NhdHRlcnBsb3RzLiAgDQoNCmBgYHtyfQ0KY29yKEF2Z19zY29yZSB+IGRyaXZpbmcpDQpgYGANCkZpbmQgdGhlIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50cyBmb3IgZWFjaCBwYWlyIG9mIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzOiAgDQpiaXJkaWUgY29udmVyc2lvbiBhbmQgYXZlcmFnZSBwdXR0cyAgICANCg0KbW9uZXkgYW5kIGF2ZXJhZ2Ugc2NvcmUgICAgDQoNCm1vbmV5IGFuZCBhdmVyYWdlIHB1dHRzICAgDQoNCmRyaXZpbmcgZGlzdGFuY2UgYW5kIGF2ZXJhZ2UgcHV0dHMgIA0KDQptb25leSBhbmQgZHJpdmluZyBkaXN0YW5jZSAgIA0KDQptb25leSBhbmQgYmlyZGllIGF2ZXJhZ2UgIA0KDQpiaXJkaWUgYXZlcmFnZSBhbmQgYmlyZGllIGNvbnZlcnNpb24gIA0KDQprKSBCYXNlZCBvbiB0aGVzZSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCB2YWx1ZXMgYW5kL29yIHRoZSBkZWZpbml0aW9uL2Zvcm11bGEsIHdoYXQgZG8geW91IHRoaW5rIGlzIHRoZSBsYXJnZXN0IHZhbHVlIHRoYXQgJHIkIGNhbiBhc3N1bWU/IFdoYXQgaXMgdGhlIHNtYWxsZXN0IHZhbHVlPyBbSGludDogSXQncyBub3QgemVyby5dDQoNClRoZSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCB3aWxsIGFsd2F5cyBiZSBhIG51bWJlciBiZXR3ZWVuIC0tLTEgYW5kIDEsIGluY2x1c2l2ZS4gSXQgd2lsbCBvYnRhaW4gdGhlIHZhbHVlIG9mIC0tLTEgb3IgMSBpZiB0aGUgcG9pbnRzIGZhbGwgYWxvbmcgYSBwZXJmZWN0IGxpbmUgKHdpdGggbmVnYXRpdmUgb3IgcG9zaXRpdmUgc2xvcGUsIHJlc3BlY3RpdmVseSkuICANCg0KKGwpIElmIHRoZSBhc3NvY2lhdGlvbiBpcyBuZWdhdGl2ZSwgd2hhdCB2YWx1ZXMgd2lsbCAkciQgaGF2ZT8gV2hhdCBpZiB0aGUgYXNzb2NpYXRpb24gaXMgcG9zaXRpdmU/ICANCg0KDQoobSkgV2hhdCBkb2VzIGEgY29ycmVsYXRpb24gY29lZmZpY2llbnQgZXF1YWwgdG8gemVybyBzaWduaWZ5PyAgDQoNCg0KKG4pIFdoYXQgZG9lcyBhIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50IGNsb3NlIHRvIDEgb3IgLS0tMSBzaWduaWZ5PyAgDQoNCg0KKG8pIFdoaWNoIGhhcyBhIHN0cm9uZ2VyIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50IHdpdGggc2NvcmluZyBhdmVyYWdlOiBkcml2aW5nIGRpc3RhbmNlIG9yIGF2ZXJhZ2UgcHV0dHM/ICBEb2VzIHRoaXMgc3VwcG9ydCB0aGUgY2xpY2jpPyBFeHBsYWluLiANCg0KIyMjU3R1ZHkgQ29uY2x1c2lvbnMgIA0KDQpUaGUgY29ycmVsYXRpb24gY29lZmZpY2llbnQgZm9yIHNjb3JpbmcgYXZlcmFnZSBhbmQgYXZlcmFnZSBwdXR0cyBpbmRpY2F0ZXMgYSBtb2RlcmF0ZWx5IHN0cm9uZyBwb3NpdGl2ZSBsaW5lYXIgYXNzb2NpYXRpb24gKCRyID0gMC40NDQkKSB3aGVyZWFzIHRoZSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCBmb3Igc2NvcmluZyBhdmVyYWdlIGFuZCBkcml2aW5nIGluZGljYXRlcyBhIHdlYWtlciBuZWdhdGl2ZSBhc3NvY2lhdGlvbiAoJHIgPSAtMC4yNjUkKS4gVGhpcyBhcHBlYXJzIHRvIHN1cHBvcnQgdGhhdCBwdXR0aW5nDQpwZXJmb3JtYW5jZSBpcyBtb3JlIHN0cm9uZ2x5IHJlbGF0ZWQgdG8gYSBQR0EgZ29sZmVyJ3Mgb3ZlcmFsbCBzY29yaW5nIGF2ZXJhZ2UgdGhhbiB0aGUgZ29sZmVyJ3MgZHJpdmluZyBkaXN0YW5jZSwgYXMgdGhlIGNsaWNo6SB3b3VsZCBzdWdnZXN0LiBXZSBtdXN0IGtlZXAgaW4gbWluZCB0aGF0IHRoZXNlIGRhdGEgYXJlIG9ubHkgZm9yIG9ubHkgdGhlIGZpcnN0IDIuNSBtb250aHMgb2YgdGhlIHNlYXNvbiAod2hlbiBtb3N0IGdvbGZlcnMgaGF2ZSBwbGF5ZWQgb25seSBhcm91bmQgNi04IGV2ZW50cykgYW5kIG1heSBub3QgYmUgcmVwcmVzZW50YXRpdmUgb2YgdGhlIHNjb3JlcyBhbmQgbW9uZXkgZWFybmluZ3MgbGF0ZXIgaW4gdGhlIHllYXIuICANCg0KKipEaXNjdXNzaW9uKio6VGhlIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50LCAkciQsIHByb3ZpZGVzIGEgbWVhc3VyZSBvZiB0aGUgc3RyZW5ndGggYW5kIGRpcmVjdGlvbiBvZiB0aGUgbGluZWFyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byB2YXJpYWJsZXMuIFRoaXMgaXMgYSB1bml0bGVzcyBxdWFudGl0eSB3aGljaCBoYXMgdGhlIGFkdmFudGFnZSB0aGF0IGl0IHdpbGwgYmUgaW52YXJpYW50IHRvIGNoYW5nZXMgaW4gc2NhbGUgKGlmIHdlIHN0YXJ0ZWQgbG9va2luZyBhdCBtb25leSBpbiBCcml0aXNoIHBvdW5kcyBpbnN0ZWFkIG9mIEFtZXJpY2FuIGRvbGxhcnMsIG91ciBtZWFzdXJlIG9mIHRoZSBzdHJlbmd0aCBvZiB0aGUgcmVsYXRpb25zaGlwIHdpbGwgbm90IGNoYW5nZSkgb3IgaWYgd2UgcmV2ZXJzZSB3aGljaCB3ZSBjYWxsIHRoZSBleHBsYW5hdG9yeSBhbmQgcmVzcG9uc2UgdmFyaWFibGVzLiBBIHZhbHVlIG9mICRyJCBjbG9zZSB0byB6ZXJvIGluZGljYXRlcyB0aGF0IHRoZSB2YXJpYWJsZXMgZG8gbm90IGhhdmUgYSBzdHJvbmcgbGluZWFyIHJlbGF0aW9uc2hpcC4gSG93ZXZlciwgdGhpcyBkb2VzIG5vdCBwcmVjbHVkZSB0aGVtIGZyb20gaGF2aW5nIGEgdmVyeSBzdHJvbmcgYnV0IG5vbi1saW5lYXIgcmVsYXRpb25zaGlwLiBBIHNjYXR0ZXJwbG90IHNob3VsZCBiZSBleGFtaW5lZCBiZWZvcmUgaW50ZXJwcmV0aW5nIHRoZSB2YWx1ZSBvZiAkciQuIElmIHRoZSByZWxhdGlvbnNoaXAgaXMgbm90IGxpbmVhciwgdGhlcmUgYXJlIGFsdGVybmF0aXZlIG1lYXN1cmVzIG9mIHRoZSBzdHJlbmd0aCBvZiB0aGUgYXNzb2NpYXRpb24gdGhhdCBjYW4gYmUgdXNlZCBvciB0aGUgdmFyaWFibGVzIGNhbiBiZSAqdHJhbnNmb3JtZWQqIGFuZCB0aGUgdHJhbnNmb3JtZWQgdmFyaWFibGVzIGFuYWx5emVkIGluc3RlYWQuIElmIHRoZSByZWxhdGlvbnNoaXAgaXMgbGluZWFyLCBhIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50IGNsb3NlIHRvIDEgb3IgLS0tMSBpbmRpY2F0ZXMgYSB2ZXJ5IHN0cm9uZyByZWxhdGlvbnNoaXAuIFRoZSB2YWx1ZXMgb2YgJHIkIGZvcm0gYSBjb250aW51dW06IGFzIHRoZSBsaW5lYXIgYXNzb2NpYXRpb24gYmVjb21lcyB3ZWFrZXIsIHRoZSB2YWx1ZSBvZiAkciQgYmVjb21lcyBjbG9zZXIgdG8NCnplcm8uICANCg0KIyNBcHBsZXQgRXhwbG9yYXRpb246IENvcnJlbGF0aW9uIEd1ZXNzaW5nIEdhbWUgIA0KDQpPcGVuIHRoZSBHdWVzcyB0aGUgQ29ycmVsYXRpb24gYXBwbGV0LiBbbGlua10oaHR0cDovL3d3dy5yb3NzbWFuY2hhbmNlLmNvbS9hcHBsZXRzL0d1ZXNzQ29ycmVsYXRpb24uaHRtbCkNCg0KKGEpIExlYXZlIHRoZSBudW1iZXIgb2YgcG9pbnRzIHNldCB0byAyNSBhbmQgcHJlc3MgKipOZXcgU2FtcGxlKiouIFRoZSBhcHBsZXQgd2lsbCBkaXNwbGF5IGEgc2NhdHRlcnBsb3QuIEd1ZXNzIHRoZSB2YWx1ZSBvZiB0aGUgY29ycmVsYXRpb24gY29lZmZpY2llbnQgaW4gdGhpcyBzY2F0dGVycGxvdCBhbmQgZW50ZXIgdGhpcyBndWVzcw0KaW50byB0aGUgIkNvcnJlbGF0aW9uIGd1ZXNzIiBib3guIFRoZW4gcHJlc3MgdGhlICoqQ2hlY2sgR3Vlc3MqKiBidXR0b24uICAgDQoNCkhvdyBjbG9zZSB3YXMgeW91ciBndWVzcz8gV2VyZSB5b3Ugc3VycHJpc2VkIGJ5IHRoZSBhY3R1YWwgdmFsdWU/IEluIHdoYXQgd2F5PyBIb3cgbWlnaHQgeW91IGd1ZXNzIGRpZmZlcmVudGx5IHRoZSBuZXh0IHRpbWU/ICANCg0KKGIpIFByZXNzIHRoZSBOZXcgU2FtcGxlIGJ1dHRvbiwgZW50ZXIgeW91ciBndWVzcyBmb3IgdGhlIHZhbHVlIG9mIHRoZSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCBmb3IgdGhpcyBzY2F0dGVycGxvdCwgYW5kIHByZXNzIEVudGVyLiBEZXNjcmliZSBob3cgY2xvc2UgeW91IHdlcmUgYW5kIHdoYXQgYWRqdXN0bWVudHMgeW91IG1pZ2h0IG1ha2UgaW4geW91ciB0aGlua2luZy4NCg0KDQooYykgUmVwZWF0IHRoaXMgcHJvY2VzcyBmb3IgYSB0b3RhbCBvZiAxMCBzY2F0dGVycGxvdHMgKHlvdSBkbyBub3QgbmVlZCB0byByZWNvcmQgeW91ciByZXN1bHRzIGJ1dCB5b3Ugc2hvdWxkIHRyeSB0byBsZWFybiBmcm9tIHRoZSByZXZlYWwgb2YgdGhlIGFjdHVhbCB2YWx1ZXMgYXMgeW91IG1ha2UgeW91ciBndWVzc2VzKS4gRG8geW91IHRoaW5rIHlvdXIgZ3Vlc3NpbmcgYWJpbGl0eSBpbXByb3ZlZCBieSB0aGUgbGFzdCBzY2F0dGVycGxvdD8gRXhwbGFpbi4gIA0KDQooZCkgQ2hlY2sgdGhlICoqVHJhY2sgUGVyZm9ybWFuY2UqKiBib3guIFRoZSBmaXJzdCBncmFwaCBpcyAiR3Vlc3MgdnMuIEFjdHVhbCIgZ3JhcGggd2l0aCB0aGUgKCR5ID0geCQpIGxpbmUgc2hvd24uIERlc2NyaWJlIHRoZSBiZWhhdmlvciBvZiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4geW91ciBndWVzc2VzIGFuZCB0aGUgYWN0dWFsIHZhbHVlcyBvZiB0aGUgY29ycmVsYXRpb24gY29lZmZpY2llbnRzLiBJcyB0aGVyZSBhIHN0cm9uZyBjb3JyZWxhdGlvbiBiZXR3ZWVuIHlvdXIgZ3Vlc3NlcyBhbmQgdGhlIGFjdHVhbCB2YWx1ZXM/IERvZXMgdGhpcyBtZWFuIHlvdSBhcmUgYSBnb29kIGd1ZXNzZXI/IEV4cGxhaW4uDQoNCihlKSBUaGUgbmV4dCBncmFwaCBpcyB0aGUgIkVycm9yIHZzLiBBY3R1YWwiIGdyYXBoLiBEZXNjcmliZSB0aGUgYmVoYXZpb3Igb2YgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHlvdXIgZXJyb3JzIGFuZCB0aGUgYWN0dWFsIHZhbHVlcyBvZiB0aGUgY29ycmVsYXRpb24gY29lZmZpY2llbnRzLiBXZXJlIHNvbWUgY29ycmVsYXRpb24gY29lZmZpY2llbnRzIGVhc2llciBmb3IgeW91IHRvIGd1ZXNzIHRoYW4gb3RoZXJzPyBVc2UgdGhpcyBncmFwaCB0byBqdXN0aWZ5IHlvdXIgYW5zd2VyLiAgDQoNCihmKSBUaGUgbGFzdCBncmFwaCBpcyB0aGUgIkVycm9yIHZzLiBUcmlhbCIgZ3JhcGguIERlc2NyaWJlIHRoZSBiZWhhdmlvciBvZiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4geW91ciBlcnJvcnMgYW5kIHRoZSBvcmRlciBpbiB3aGljaCB5b3Ugc2F3IHRoZSBncmFwaHMuIERpZCB5b3VyIGFiaWxpdHkgc2VlbSB0byBpbXByb3ZlIG92ZXIgdGltZT8gVXNlIHRoaXMgZ3JhcGggdG8ganVzdGlmeSB5b3VyIGFuc3dlci4gIA0KDQooZykgU3VwcG9zZSB5b3UgZ3Vlc3NlZCBldmVyeSB2YWx1ZSBjb3JyZWN0bHk7IHdoYXQgd291bGQgYmUgdGhlIHZhbHVlIG9mIHRoZSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCBiZXR3ZWVuIHlvdXIgZ3Vlc3NlcyBhbmQgdGhlIGFjdHVhbCBjb3JyZWxhdGlvbnM/ICANCg0KKGgpIFN1cHBvc2UgZWFjaCBvZiB5b3VyIGd1ZXNzZXMgd2FzIHRvbyBoaWdoIGJ5IDAuMiBmcm9tIHRoZSBhY3R1YWwgdmFsdWUgb2YgdGhlIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50LiBXaGF0IHdvdWxkIGJlIHRoZSB2YWx1ZSBvZiB0aGUgY29ycmVsYXRpb24gY29lZmZpY2llbnQgYmV0d2VlbiB5b3VyIGd1ZXNzZXMgYW5kIHRoZSBhY3R1YWwgY29ycmVsYXRpb25zPyAgDQoNCihpKSBEb2VzIGEgY29ycmVsYXRpb24gY29lZmZpY2llbnQgZXF1YWwgdG8gMSBuZWNlc3NhcmlseSBpbXBseSB5b3UgYXJlIGEgZ29vZCBndWVzc2VyPyBFeHBsYWluLg0KDQojIyNQcmFjdGljZSBQcm9ibGVtIDFBICANCg0KU3VwcG9zZSB0aGF0IHdlIHJlY29yZCB0aGUgbWlkdGVybSBleGFtIHNjb3JlIGFuZCB0aGUgZmluYWwgZXhhbSBzY29yZSBmb3IgZXZlcnkgc3R1ZGVudCBpbiBhIGNsYXNzLiBXaGF0IHdvdWxkIHRoZSB2YWx1ZSBvZiB0aGUgY29ycmVsYXRpb24gY29lZmZpY2llbnQgYmUgaWYgZXZlcnkgc3R1ZGVudCBpbiB0aGUgY2xhc3Mgc2NvcmVkOiAgDQoNCihhKSBUZW4gcG9pbnRzIGhpZ2hlciBvbiB0aGUgZmluYWwgdGhhbiBvbiB0aGUgbWlkdGVybT8gIA0KDQooYikgRml2ZSBwb2ludHMgbG93ZXIgb24gdGhlIGZpbmFsIHRoYW4gb24gdGhlIG1pZHRlcm0/ICANCg0KKGMpIFR3aWNlIGFzIG1hbnkgcG9pbnRzIG9uIHRoZSBmaW5hbCBleGFtIGFzIG9uIHRoZSBtaWR0ZXJtPw0KRXhwbGFpbiB5b3VyIGFuc3dlciBpbiBlYWNoIHBhcnQuIFtIaW50OiBZb3UgbWlnaHQgZmlyc3Qgd2FudCB0byBkcmF3IHlvdXJzZWxmIGEgc2NhdHRlcnBsb3Qgb2YgaHlwb3RoZXRpY2FsIGRhdGEgdGhhdCBmaXQgdGhlIHN0YXRlZCBjb25kaXRpb25zLl0gIA0KDQoNCiMjI1ByYWN0aWNlIFByb2JsZW0gMUIgIA0KDQooYSkgVGhlIGZvbGxvd2luZyBzY2F0dGVycGxvdHMgbG9vayBhdCB0aGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIGhvdXNlIHByaWNlcyBhbmQgZm91ciBvdGhlciB2YXJpYWJsZXMuICBIb3cgZG9lcyB0aGUgc3RyZW5ndGggb2YgdGhlIGxpbmVhciByZWxhdGlvbnNoaXAgYmV0d2VlbiBwcmljZSBhbmQgc3F1YXJlIGZvb3RhZ2UgY29tcGFyZSB0byB0aGUgc3RyZW5ndGggb2YgdGhlIHJlbGF0aW9uc2hpcHMgaW4gdGhlIGZpcnN0IDMgZ3JhcGhzPyAgDQoNCihiKSBUaGUgY29ycmVsYXRpb25zIGZvciB0aGVzZSBmb3VyIGdyYXBocyBhcmUNCjAuMjg0LCAJMC4zOTQsIAkwLjY0OSwgCTAuNzYwLiAgDQpXaGljaCBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCBkbyB5b3UgdGhpbmsgY29ycmVzcG9uZHMgdG8gd2hpY2ggZ3JhcGg/IEV4cGxhaW4geW91ciByZWFzb25pbmcuICgqTm90ZSo6IEVhY2ggZ3JhcGggaGFzIHRoZSBzYW1lIG51bWJlciBvZiBob3VzZXMsIGJ1dCB5b3UgbWF5IGhhdmUgbXVsdGlwbGUgaG91c2VzIGluZGljYXRlZCBieSBhbiBpbmRpdmlkdWFsIGRvdC4pICANCg0KDQojI0ludmVzdGlnYXRpb24gMS4zOiBIZWlnaHQgYW5kIEZvb3QgU2l6ZSAgDQoNCkNyaW1pbmFsIGludmVzdGlnYXRvcnMgb2Z0ZW4gbmVlZCB0byBwcmVkaWN0IHVub2JzZXJ2ZWQgY2hhcmFjdGVyaXN0aWNzIG9mIGluZGl2aWR1YWxzIGZyb20gb2JzZXJ2ZWQgY2hhcmFjdGVyaXN0aWNzLiBGb3IgZXhhbXBsZSwgaWYgYSBmb290cHJpbnQgaXMgbGVmdCBhdCB0aGUgc2NlbmUgb2YgYSBjcmltZSwgaG93IGFjY3VyYXRlbHkgY2FuIHdlIGVzdGltYXRlIHRoYXQgcGVyc29uJ3MgaGVpZ2h0IGJhc2VkIG9uIHRoZSBsZW5ndGggb2YgdGhlIGZvb3RwcmludD8gVG8gaW52ZXN0aWdhdGUgdGhpcyBwb3NzaWJsZSByZWxhdGlvbnNoaXAsIGRhdGEgd2VyZSBjb2xsZWN0ZWQgb24gYSBzYW1wbGUgb2Ygc3R1ZGVudHMgaW4gYW4gaW50cm9kdWN0b3J5IHN0YXRpc3RpY3MgY2xhc3MuICANCg0KKGEpIElkZW50aWZ5IHRoZSBvYnNlcnZhdGlvbmFsIHVuaXRzLCBleHBsYW5hdG9yeSB2YXJpYWJsZSwgYW5kIHJlc3BvbnNlIHZhcmlhYmxlIGluIHRoaXMgc3R1ZHkuICANCg0KT2JzZXJ2YXRpb25hbCB1bml0czogIA0KDQpFeHBsYW5hdG9yeSB2YXJpYWJsZTogIA0KDQpSZXNwb25zZSB2YXJpYWJsZTogIA0KDQpCZWxvdyBhcmUgdGhlIGhlaWdodHMgKGluIGluY2hlcykgb2YgMjAgc3R1ZGVudHMgaW4gYSBzdGF0aXN0aWNzIGNsYXNzOg0KNzQgICA2NiAgIDc3ICAgNjcgICA1NiAgIDY1ICAgNjQgICA3MCAgIDYyICAgNjcgICA2NiAgIDY0ICAgNiAgICA3MyAgIDc0ICAgNzAgICA2NSAgIDcyICAgNzEgICA2Mw0KDQoqKlByZWRpY3RpbmcgSGVpZ2h0cyoqICANCihiKSBJZiB5b3Ugd2VyZSB0cnlpbmcgdG8gcHJlZGljdCB0aGUgaGVpZ2h0IG9mIGEgc3RhdGlzdGljcyBzdHVkZW50IGJhc2VkIG9uIHRoZXNlIG9ic2VydmF0aW9ucywgd2hhdCB2YWx1ZSB3b3VsZCB5b3UgcmVwb3J0PyAgDQoNCihjKSBVc2luZyB0aGUgbWV0aG9kIGluIChiKSwgd291bGQgeW91IGFsd2F5cyBwcmVkaWN0IGEgc3RhdGlzdGljcyBzdHVkZW50J3MgaGVpZ2h0IGNvcnJlY3RseT8gIA0KDQoqRGVmaW5pdGlvbio6DQpBICpyZXNpZHVhbCogaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcHJlZGljdGVkIHZhbHVlIGFuZCB0aGUgb2JzZXJ2ZWQgdmFsdWUuIElmIHdlIGxldCAkeV9pJCByZXByZXNlbnQgdGhlICppKnRoIG9ic2VydmVkIHZhbHVlIGFuZCAkXGhhdCB5X2kkIHJlcHJlc2VudCB0aGUgcHJlZGljdGVkIG9yICJmaXR0ZWQiIHZhbHVlLCB0aGVuICByZXNpZHVhbCRfaSQgPSAkeV9pIC0gXGhhdCB5X2kkLiAgDQoNCihkKSBUaGUgdGFibGUgYmVsb3cgc2hvd3MgdGhlIHJlc2lkdWFscyBmb3IgZWFjaCBvZiB0aGUgYWJvdmUgaGVpZ2h0cyBpZiB3ZSB1c2UgdGhlIG1lYW4gaGVpZ2h0LCA2Ny43NSBpbmNoZXMsIGFzIHRoZSBwcmVkaWN0ZWQgdmFsdWUgZm9yIGVhY2ggcGVyc29uLiBDYWxjdWxhdGUgdGhlIGxhc3QgdHdvIHJlc2lkdWFscyB0byBjb21wbGV0ZSB0aGUgdGFibGUuICANCg0KSG93IG9mdGVuIGRpZCB3ZSBvdmVyZXN0aW1hdGU/IEhvdyBvZnRlbiBkaWQgd2UgdW5kZXJlc3RpbWF0ZT8gIA0KDQooZSkgSG93IGRvZXMgdGhlIG9ic2VydmVkIHZhbHVlIGNvbXBhcmUgdG8gdGhlIHByZWRpY3RlZCB2YWx1ZSB3aGVuIHRoZSByZXNpZHVhbCBpcyBwb3NpdGl2ZT8gSG93IGFib3V0IHdoZW4gdGhlIHJlc2lkdWFsIGlzIG5lZ2F0aXZlPyAgDQoNCihmKSBIb3cgbWlnaHQgeW91IGNvbWJpbmUgdGhlIHJlc2lkdWFscyB0byBtZWFzdXJlIHRoZSBvdmVyYWxsIHByZWRpY3Rpb24gZXJyb3IgZm9yIHRoZXNlIDIwIHN0dWRlbnRzPyAgDQoNCihnKSBDYWxjdWxhdGUgdGhlIHN1bSBvZiB0aGUgcmVzaWR1YWxzIGZyb20gKGQpLiBFeHBsYWluIHdoeSB0YWtpbmcgdGhlIHN1bSBvZiByZXNpZHVhbHMgaXMgbm90IGEgdXNlZnVsIHdheSB0byBtZWFzdXJlIG92ZXJhbGwgcHJlZGljdGlvbiBlcnJvci4gIA0KDQooaCkgU2hvdyBtYXRoZW1hdGljYWxseSB0aGF0IHRoZSBzdW0gb2YgdGhlIHJlc2lkdWFscyBmcm9tIHRoZSBzYW1wbGUgbWVhbiBmb3IgYW55IGRhdGFzZXQgZXF1YWxzIHplcm8uIEluIG90aGVyIHdvcmRzLCBzaG93IHRoYXQgJFxzdW1cbGltaXRzX3tpID0gMX1ebiB7XGxlZnQoIHt7eV9pfSAtIFxiYXIgeX0gXHJpZ2h0KX0gID0gMCQuDQoNCihpKSBTdWdnZXN0IHR3byB3YXlzIHRvIGdldCBhcm91bmQgdGhlIHByb2JsZW0gcmV2ZWFsZWQgaW4gKGcpIGFuZCAoaCkuIEluIG90aGVyIHdvcmRzLCBzdWdnZXN0DQpzb21ldGhpbmcgcmVsYXRlZCB0byBidXQgZGlmZmVyZW50IGZyb20gc3VtbWluZyByZXNpZHVhbHMgdG8gdXNlIGFzIGEgdXNlZnVsIG1lYXN1cmUgb2Ygb3ZlcmFsbA0KcHJlZGljdGlvbiBlcnJvci4NCg0KKGopIFN1cHBvc2UgdGhhdCB5b3Ugd2FudCB0byB1c2UgYSBzaW5nbGUgbnVtYmVyIChjYWxsIGl0ICRtJCkgZm9yIHByZWRpY3RpbmcgaGVpZ2h0LiBVc2UgY2FsY3VsdXMgdG8gZGV0ZXJtaW5lICRtJCwgYXMgYSBmdW5jdGlvbiBvZiB0aGUgZGF0YSAkeV9pJCdzLCB0byBtaW5pbWl6ZSB0aGUgc3VtIG9mIHNxdWFyZWQgcmVzaWR1YWxzIGZyb20gdGhhdCBwcmVkaWN0aW9uLiBbSGludHM6IFlvdSBhcmUgY2hvb3NpbmcgJG0kIHRvIG1pbmltaXplICRTID0gXHN1bVxsaW1pdHNfe2kgPSAxfV5uIHt7e1xsZWZ0KCB7e3lfaX0gLSBtfSQgICBUYWtlIHRoZSBkZXJpdmF0aXZlIHdpdGggcmVzcGVjdCB0byAkbSQsIHNldCBpdCBlcXVhbCB0byB6ZXJvLCBhbmQgc29sdmUgZm9yIG0uXSBJbnRlcnByZXQgeW91ciBhbnN3ZXIgZm9yICRtJC4gIA0KDQoqKlByZWRpY3RpbmcgSGVpZ2h0cyBmcm9tIEZvb3RsZW5ndGhzKiogIA0KDQpUbyBzZWUgd2hldGhlciB3ZSBjYW4gbWFrZSBiZXR0ZXIgcHJlZGljdGlvbnMgb2YgaGVpZ2h0IGJ5IHRha2luZyBmb290IGxlbmd0aCBpbnRvIGFjY291bnQsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgc2NhdHRlcnBsb3Qgb2YgdGhlIGhlaWdodCAoaW4gaW5jaGVzKSBhbmQgZm9vdCBsZW5ndGggKGluIGNlbnRpbWV0ZXJzKSBmb3IgdGhlIHNhbXBsZSBvZiAyMCBzdGF0aXN0aWNzIHN0dWRlbnRzLg0KDQooaykgRGVzY3JpYmUgdGhlIGFzc29jaWF0aW9uIGJldHdlZW4gaGVpZ2h0IGFuZCBmb290IGxlbmd0aCBleGhpYml0ZWQgaW4gdGhpcyBzY2F0dGVycGxvdC4gSXMgdGhlIGFzc29jaWF0aW9uIHdoYXQgeW91IHdvdWxkIGhhdmUgZXhwZWN0ZWQ/IEV4cGxhaW4uICANCg0KT3BlbiB0aGUgQW5hbHl6aW5nIFR3byBRdWFudGl0YXRpdmUgVmFyaWFibGVzIGFwcGxldCB0byBzZWUgdGhlDQpzY2F0dGVycGxvdCBvZiB0aGUgMjAgc3R1ZGVudHMnIGhlaWdodCBhbmQgZm9vdCBtZWFzdXJlbWVudHMuIENoZWNrIHRoZSAqKlNob3cgTW92YWJsZSBMaW5lKiogYm94IHRvIGFkZCBhIGJsdWUgbGluZSB0byB0aGUgc2NhdHRlcnBsb3QuIFRoZSBlcXVhdGlvbiBmb3IgdGhpcyBpbml0aWFsIGxpbmUse1xtYXRob3Age3tccm17aGVpZ2h0fX19XGxpbWl0c15cXiAgPSA2Ny43NSArIDAgXGNkb3Qge1xybXtmb290LH19DQogfSwgcHJlZGljdHMgdGhlIHNhbWUgaGVpZ2h0IGZvciBhbGwgMjAgc3R1ZGVudHMgYXMgeW91IGRpZCBpbiAoZCkuIChOb3RlOiB0aGUgImhhdCIgb3ZlciBoZWlnaHQgaW5kaWNhdGVzIHRoYXQgdGhlIGVxdWF0aW9uIGdpdmVzIHZhbHVlcyBmb3IgcHJlZGljdGVkIGhlaWdodC4pICAgDQoNCklmIHlvdSBub3cgcGxhY2UgeW91ciBtb3VzZSBvdmVyIHRoZSBncmVlbiBzcXVhcmUgb24gb25lIG9mIHRoZSBlbmRzIG9mIHRoZSBsaW5lIGFuZCBkcmFnLCB5b3UgY2FuIGNoYW5nZSB0aGUgc2xvcGUgb2YgdGhlIGxpbmUuIFlvdSBjYW4gYWxzbyB1c2UgdGhlIG1vdXNlIHRvIG1vdmUgdGhlIGdyZWVuIHNxdWFyZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBsaW5lIHVwIGFuZCBkb3duIHZlcnRpY2FsbHkgdG8gY2hhbmdlIHRoZSBpbnRlcmNlcHQgb2YgdGhlIGxpbmUuDQoNCihsKSBNb3ZlIHRoZSBsaW5lIHVudGlsIHlvdSBmZWVsIHlvdXIgbGluZSAiYmVzdCIgc3VtbWFyaXplcyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gaGVpZ2h0IGFuZCBmb290IGxlbmd0aCBmb3IgdGhlc2UgZGF0YS4gV3JpdGUgZG93biB0aGUgZmluYWwgZXF1YXRpb24gZm9yIHlvdXIgbGluZS4gW0hpbnQ6IFVzZSBnb29kIHN0YXRpc3RpY2FsIG5vdGF0aW9uLCB3aGljaCBtZWFucyB0byB1c2UgdmFyaWFibGVzIG5hbWVzIChub3QgZ2VuZXJpYyAkeCQgYW5kICR5JCkgYW5kIHRvIHB1dCBhICJoYXQiIG92ZXIgdGhlIHJlc3BvbnNlIHZhcmlhYmxlIHRvIGluZGljYXRlIHByZWRpY3Rpb24uXSAgDQoNCihtKSBEaWQgZXZlcnlvbmUgaW4geW91ciBjbGFzcyBvYnRhaW4gdGhlIHNhbWUgbGluZS9lcXVhdGlvbj8gIA0KDQoobikgRG9lcyB5b3VyIGxpbmUgcHJvdmlkZSBhIGJldHRlciBmaXQgdGhhbiB5b3VyIG5laWdoYm9yJ3M/IFN1Z2dlc3QgYSBjcml0ZXJpb24gZm9yIGRlY2lkaW5nIHdoaWNoIGxpbmUgImJlc3QiIHN1bW1hcml6ZXMgdGhlIHJlbGF0aW9uc2hpcC4gIA0KDQoobykgQ2hlY2sgdGhlIFNob3cgUmVzaWR1YWxzIGJveCB0byB2aXN1YWxseSByZXByZXNlbnQgdGhlc2UgcmVzaWR1YWxzIGZvciB5b3VyIGxpbmUgb24gdGhlIHNjYXR0ZXJwbG90LiAgVGhlIGFwcGxldCBhbHNvIHJlcG9ydHMgdGhlIHN1bSBvZiB0aGUgYWJzb2x1dGUgcmVzaWR1YWxzIChvciBTQUUsIHRoZSBzdW0gb2YgYWJzb2x1dGUgZXJyb3JzKS4gUmVjb3JkIHRoaXMgU0FFIHZhbHVlIGZvciB5b3VyIGxpbmUuIFdoYXQgaXMgdGhlIGJlc3QgU0FFIGluIHRoZSBjbGFzcz8gKERvZXMgImJlc3QiIGNvcnJlc3BvbmQgdG8gdGhlIHNtYWxsZXN0IG9yIHRoZSBsYXJnZXN0IHZhbHVlIG9mIFNBRT8pICANCg0KKHApIEEgbW9yZSBjb21tb24gY3JpdGVyaW9uIGZvciBkZXRlcm1pbmluZyB0aGUgImJlc3QiIGxpbmUgaXMgdG8gaW5zdGVhZCBsb29rIGF0IHRoZSBzdW0gb2YgdGhlIHNxdWFyZWQgcmVzaWR1YWxzIChvciBzdW0gb2Ygc3F1YXJlZCBlcnJvcnMsIFNTRSkuIENoZWNrIHRoZSBTaG93IFNxdWFyZWQgUmVzaWR1YWxzIGJveCB0byB2aXN1YWxseSByZXByZXNlbnQgdGhlbSBhbmQgdG8gZGV0ZXJtaW5lIHRoZSBTU0UgdmFsdWUgZm9yIHlvdXIgbGluZS4gV2hhdCBpcyB0aGUgYmVzdCBTU0UgaW4gdGhlIGNsYXNzPyAgDQoNCihxKSBDb250aW51ZSB0byBhZGp1c3QgeW91ciBsaW5lIHVudGlsIHlvdSB0aGluayB5b3UgaGF2ZSBtaW5pbWl6ZWQgdGhlIHN1bSBvZiB0aGUgc3F1YXJlZCByZXNpZHVhbHMuIFJlcG9ydCB5b3VyIG5ldyBlcXVhdGlvbiBhbmQgbmV3IFNTRSB2YWx1ZS4gIA0KDQoNCiMjI0xlYXN0IFNxdWFyZXMgUmVncmVzc2lvbiBMaW5lOiBEZXJpdmF0aW9uIG9mIENvZWZmaWNpZW50cyAgDQoNCg0KDQoodCkgVGFrZSB0aGUgZGVyaXZhdGl2ZSB3aXRoIHJlc3BlY3QgdG8gJGJfMCQgb2YgdGhlIGV4cHJlc3Npb24gb24gdGhlIHJpZ2h0LiBUaGVuIHRha2UgdGhlIGRlcml2YXRpdmUgb2YgdGhlIG9yaWdpbmFsIGV4cHJlc3Npb24gd2l0aCByZXNwZWN0IHRvICRiXzEkLiBbSGludHM6IFVzZSB0aGUgY2hhaW4gcnVsZSwgYW5kIHJlbWVtYmVyIHRvIHRyZWF0IHRoZSBkYXRhIHZhbHVlcyAkeF9pJCdzIGFuZCAkeV9pJCdzIGFzIGNvbnN0YW50cy5dICANCg0KKHUpIFNldCB0aGVzZSAocGFydGlhbCkgZGVyaXZhdGl2ZXMgZXF1YWwgdG8gemVybyBhbmQgc29sdmUgc2ltdWx0YW5lb3VzbHkgZm9yIHRoZSB2YWx1ZXMgb2YgJGJfMCQgYW5kICRiXzEkLiAgW0hpbnRzOiBTb2x2ZSB0aGUgZmlyc3QgZXF1YXRpb24gZm9yICRiXzAkLiBUaGVuIHNvbHZlIHRoZSBzZWNvbmQgZXF1YXRpb24gZm9yICRiXzEkIChzdWJzdGl0dXRpbmcgaW4gdGhlIGV4cHJlc3Npb24gZm9yICRiXzAkIHVzaW5nIHRoZSBzdW1tYXRpb24gbm90YXRpb24pLl0gIA0KDQoNCnYpIEZvciB0aGUgc2FtcGxlIGRhdGEgb24gc3R1ZGVudHMnIGZvb3QgbGVuZ3RocyAoeCkgYW5kIGhlaWdodHMgKHkpLCB3ZSBjYW4gY2FsY3VsYXRlIHRoZXNlIHN1bW1hcnkgc3RhdGlzdGljczogeD8/ID0gMjguNSBjbSwgc3ggPSAzLjQ1IGNtLCB5Pz8gID0gNjcuNzUgaW4gYW5kIHN5ID0gNS4wMCBpbiwgd2l0aCByID0gMC43MTEuIFVzZSB0aGVzZSBzdGF0aXN0aWNzIGFuZCB0aGUgZm9ybXVsYXMgYWJvdmUgdG8gY2FsY3VsYXRlIHRoZSBjb2VmZmljaWVudHMgb2YgdGhlIGxlYXN0LXNxdWFyZXMgcmVncmVzc2lvbiBsaW5lLiBDb25maXJtIHRoYXQgdGhlc2UgYWdyZWUgd2l0aCB3aGF0IHRoZSBhcHBsZXQgcmVwb3J0ZWQgZm9yIHRoZSBlcXVhdGlvbiBvZiB0aGUgbGVhc3Qgc3F1YXJlcyBsaW5lLg0KDQoNCg0KDQoNCg0KKHcpIFVzZSB0aGlzIGxlYXN0LXNxdWFyZXMgcmVncmVzc2lvbiBsaW5lIHRvIHByZWRpY3QgdGhlIGhlaWdodCBvZiBhIHBlcnNvbiB3aXRoIGEgMjggY20gZm9vdCBsZW5ndGguICBUaGVuIHJlcGVhdCBmb3IgYSBwZXJzb24gd2l0aCBhIDI5LWNtIGZvb3QgbGVuZ3RoLiBDYWxjdWxhdGUgdGhlIGRpZmZlcmVuY2UgaW4gdGhlc2UgdHdvIGhlaWdodCBwcmVkaWN0aW9ucy4gRG9lcyB0aGlzIHZhbHVlIGxvb2sgZmFtaWxpYXI/IEV4cGxhaW4uDQoNCg0KDQooeCkgUHJvdmlkZSBhbiBpbnRlcnByZXRhdGlvbiBvZiB0aGUgc2xvcGUgY29lZmZpY2llbnQgKGIxKSBpbiB0aGlzIGNvbnRleHQuDQoNCg0KDQooeSkgUHJvdmlkZSBhbiBpbnRlcnByZXRhdGlvbiBvZiB0aGUgaW50ZXJjZXB0IGNvZWZmaWNpZW50IChiMCkgaW4gdGhpcyBjb250ZXh0LiBJcyBzdWNoIGFuIGludGVycHJldGF0aW9uIG1lYW5pbmdmdWwgZm9yIHRoZXNlIGRhdGE/IEV4cGxhaW4uDQoNCg0KDQoNCg0KDQpEaXNjdXNzaW9uOiBUaGUgc2xvcGUgY29lZmZpY2llbnQgb2YgMS4wMyBpbmRpY2F0ZXMgdGhhdCB0aGUgcHJlZGljdGVkIGhlaWdodCBvZiBhIHBlcnNvbiBpbmNyZWFzZXMgYnkgMS4wMyBpbmNoZXMgZm9yIGVhY2ggYWRkaXRpb25hbCBjZW50aW1ldGVyIG9mIGZvb3QgbGVuZ3RoLiBJbiBvdGhlciB3b3JkcywgaWYgb25lIHBlcnNvbidzIGZvb3QgbGVuZ3RoIGlzIG9uZSBjbSBsb25nZXIgdGhhbiBhbm90aGVyJ3MsIHdlIHByZWRpY3QgdGhpcyBwZXJzb24gdG8gYmUgMS4wMyBpbmNoZXMgdGFsbGVyIHRoYW4gdGhlIG90aGVyIHBlcnNvbi4gTm90aWNlIHdlIGFyZSBiZWluZyBjYXJlZnVsIHRvIHRhbGsgYWJvdXQgdGhlICJwcmVkaWN0ZWQiIGNoYW5nZSBvciAiYXZlcmFnZSIgY2hhbmdlLCBiZWNhdXNlIHRoZXNlIGFyZSBlc3RpbWF0ZXMgYmFzZWQgb24gdGhlIGxlYXN0IHNxdWFyZXMgbGluZSwgbm90IGFuIGV4YWN0IG1hdGhlbWF0aWNhbCByZWxhdGlvbnNoaXAgYmV0d2VlbiBoZWlnaHQgYW5kIGZvb3QgbGVuZ3RoLiBUaGUgaW50ZXJjZXB0IGNvZWZmaWNpZW50IGNhbiBiZSBpbnRlcnByZXRlZCBhcyB0aGUgcHJlZGljdGVkIGhlaWdodCBmb3IgYSBwZXJzb24gd2hvc2UgZm9vdCBsZW5ndGggaXMgemVybyAtIG5vdCBhIHZlcnkgc2Vuc2libGUgcHJlZGljdGlvbiBpbiB0aGlzIGNvbnRleHQuIEluIGZhY3QsIHRoZSBpbnRlcmNlcHQgd2lsbCBvZnRlbiBiZSB0b28gZmFyIG91dHNpZGUgdGhlIHJhbmdlIG9mIHggdmFsdWVzIGZvciB1cyB0byBzZXJpb3VzbHkgY29uc2lkZXIgaXRzIGludGVycHJldGF0aW9uLg0KDQooeikgVXNlIHRoZSBsZWFzdCBzcXVhcmVzIHJlZ3Jlc3Npb24gbGluZSB0byBwcmVkaWN0IHRoZSBoZWlnaHQgb2Ygc29tZW9uZSB3aG9zZSBmb290IGxlbmd0aCBpcyA0NCBjbS4gIEV4cGxhaW4gd2h5IHlvdSBzaG91bGQgbm90IGJlIGFzIGNvbWZvcnRhYmxlIG1ha2luZyB0aGlzIHByZWRpY3Rpb24gYXMgdGhlIG9uZXMgaW4gKHcpLg0KDQpEZWZpbml0aW9uOg0KRXh0cmFwb2xhdGlvbiByZWZlcnMgdG8gbWFraW5nIHByZWRpY3Rpb25zIG91dHNpZGUgdGhlIHJhbmdlIG9mIHRoZSBleHBsYW5hdG9yeSB2YXJpYWJsZSB2YWx1ZXMgaW4gdGhlIGRhdGEgc2V0IHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSByZWdyZXNzaW9uIGxpbmUuIEl0IGlzIGdlbmVyYWxseSBpbGwtYWR2aXNlZC4NCg0KRXZhbHVhdGluZyB0aGUgbW9kZWwNCk9uZSB3YXkgdG8gYXNzZXNzIHRoZSB1c2VmdWxuZXNzIG9mIHRoaXMgbGVhc3Qtc3F1YXJlcyBsaW5lIGlzIHRvIG1lYXN1cmUgdGhlIGltcHJvdmVtZW50IGluIG91cg0KcHJlZGljdGlvbnMgYnkgdXNpbmcgdGhlIGxlYXN0LXNxdWFyZXMgbGluZSBpbnN0ZWFkIG9mIHRoZSB5IGxpbmUgdGhhdCBhc3N1bWVzIG5vIGtub3dsZWRnZSBhYm91dCB0aGUgZXhwbGFuYXRvcnkgdmFyaWFibGUuDQoNCihhYSkgSW4gdGhlIGFwcGxldCwgdW5jaGVjayBhbmQgcmVjaGVjayB0aGUgU2hvdyBNb3ZhYmxlIExpbmUgYm94LiBDaGVjayB0aGUgU2hvdyBTcXVhcmVkDQpSZXNpZHVhbHMgYm94IHRvIGRldGVybWluZSB0aGUgU1NFIGlmIHdlIHdlcmUgdG8gdXNlIHkgYXMgb3VyIHByZWRpY3RlZCB2YWx1ZSBmb3IgZXZlcnkgeCAoZm9vdCBzaXplKS4gIFJlY29yZCB0aGlzIHZhbHVlLg0KDQoNCg0KDQooYmIpIFJlY2FsbCB0aGUgU1NFIHZhbHVlIGZvciB0aGUgcmVncmVzc2lvbiBsaW5lLiBEZXRlcm1pbmUgdGhlIHBlcmNlbnRhZ2UgY2hhbmdlIGluIHRoZSBTU0UgYmV0d2VlbiB0aGUgeSBsaW5lIGFuZCB0aGUgcmVncmVzc2lvbiBsaW5lOg0KDQoxMDAl1yBbKFNTRSh5KSAtIFNTRShsZWFzdC1zcXVhcmVzKSkvU1NFKHkpXSA9DQoNCkRlZmluaXRpb246DQpUaGUgcHJlY2VkaW5nIGV4cHJlc3Npb24gaW5kaWNhdGVzIHRoZSByZWR1Y3Rpb24gaW4gdGhlIHByZWRpY3Rpb24gZXJyb3JzIGZyb20gdXNpbmcgdGhlDQpsZWFzdCBzcXVhcmVzIGxpbmUgaW5zdGVhZCBvZiB0aGUgeSBsaW5lLiBUaGlzIGlzIHJlZmVycmVkIHRvIGFzIHRoZSBjb2VmZmljaWVudCBvZiBkZXRlcm1pbmF0aW9uLA0KaW50ZXJwcmV0ZWQgYXMgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHZhcmlhYmlsaXR5IGluIHRoZSByZXNwb25zZSB2YXJpYWJsZSB0aGF0IGlzIGV4cGxhaW5lZCBieSB0aGUgbGVhc3Qgc3F1YXJlcyByZWdyZXNzaW9uIGxpbmUgd2l0aCB0aGUgZXhwbGFuYXRvcnkgdmFyaWFibGUuIFRoaXMgcHJvdmlkZXMgdXMgd2l0aCBhIG1lYXN1cmUgb2YgaG93IGFjY3VyYXRlIG91ciBwcmVkaWN0aW9ucyB3aWxsIGJlIGFuZCBpcyBtb3N0IHVzZWZ1bCBmb3IgY29tcGFyaW5nIGRpZmZlcmVudCBtb2RlbHMgKGUuZy4sIGRpZmZlcmVudCBjaG9pY2VzIG9mIGV4cGxhbmF0b3J5IHZhcmlhYmxlKS4gVGhlIGNvZWZmaWNpZW50IG9mIGRldGVybWluYXRpb24gaXMgZXF1YWwgdG8gdGhlIHNxdWFyZSBvZiB0aGUgY29ycmVsYXRpb24gY29lZmZpY2llbnQgYW5kIHNvIGlzIGRlbm90ZWQgYnkgcjIgb3IgUjIgKGFuZCBpcyBvZnRlbiBwcm9ub3VuY2VkICJyLXNxdWFyZWQuIikNCg0KQW5vdGhlciBtZWFzdXJlIG9mIHRoZSBxdWFsaXR5IG9mIHRoZSBmaXQgaXMgcywgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgcmVzaWR1YWxzLiBUaGlzIGlzIGEgbWVhc3VyZSBvZiB0aGUgdW5leHBsYWluZWQgdmFyaWFiaWxpdHkgYWJvdXQgdGhlIHJlZ3Jlc3Npb24gbGluZSBhbmQgZ2l2ZXMgdXMgYW4gaWRlYSBvZiBob3cgYWNjdXJhdGUgb3VyIHByZWRpY3Rpb25zIHNob3VsZCBiZSAodGhlIGFjdHVhbCByZXNwb25zZSBzaG91bGQgYmUgd2l0aGluIDJzIG9mIHRoZSBwcmVkaWN0ZWQgcmVzcG9uc2UpLiBJZiBzIGlzIG11Y2ggc21hbGxlciB0aGFuIHRoZSB2YXJpYWJpbGl0eSBpbiB0aGUgcmVzcG9uc2UgdmFyaWFibGUgKHN5KSB0aGVuIHdlIGhhdmUgZXhwbGFpbmVkIGEgZ29vZCBhbW91bnQgb2YgdmFyaWFiaWxpdHkgaW4geS4gTW9zdCBzdGF0aXN0aWNhbCBwYWNrYWdlcyByZXBvcnQgcywgb3IgaXQgY2FuIGJlIGZvdW5kIGZyb20NCg0KY2MpIERldGVybWluZSBhbmQgaW50ZXJwcmV0IHRoZSB2YWx1ZSBvZiBzIGZvciB0aGVzZSBkYXRhLiBbV2hhdCBhcmUgdGhlIHVuaXRzP10NCg0KU3R1ZHkgQ29uY2x1c2lvbnMNCg0KVGhlcmUgaXMgYSBmYWlybHkgc3Ryb25nIHBvc2l0aXZlIGxpbmVhciBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRoZSBmb290IGxlbmd0aCBvZiBzdGF0aXN0aWNzIHN0dWRlbnRzIGFuZCB0aGVpciBoZWlnaHRzIChyID0gMC43MTEpLiBUbyBwcmVkaWN0IGhlaWdodHMgZnJvbSBmb290IGxlbmd0aHMsIHRoZSBsZWFzdC1zcXVhcmVzIHJlZ3Jlc3Npb24gbGluZSBpcyAgICBUaGlzIGluZGljYXRlcyB0aGF0IGlmIG9uZSBwZXJzb24ncyBmb290IGxlbmd0aCBtZWFzdXJlbWVudCBpcyBvbmUgY2VudGltZXRlciBsb25nZXIgdGhhbiBhbm90aGVyLCB3ZSB3aWxsIHByZWRpY3QgdGhhdCBwZXJzb24ncyBoZWlnaHQgdG8gYmUgMS4wMyBpbmNoZXMgdGFsbGVyLiBUaGlzIHJlZ3Jlc3Npb24gbGluZSBoYXMgYSBjb2VmZmljaWVudCBvZiBkZXRlcm1pbmF0aW9uIG9mIDUwLjYlLCBpbmRpY2F0aW5nIHRoYXQgNTAuNiUgb2YgdGhlIHZhcmlhYmlsaXR5IGluIGhlaWdodHMgaXMgZXhwbGFpbmVkIGJ5IHRoaXMgbGVhc3Qgc3F1YXJlcyByZWdyZXNzaW9uIGxpbmUgd2l0aCBmb290IGxlbmd0aC4gVGhlIG90aGVyIDQ5LjQlIG9mIHRoZSB2YXJpYWJpbGl0eSBpbiBoZWlnaHRzIGlzIGV4cGxhaW5lZCBieSBvdGhlciBmYWN0b3JzIChwZXJoYXBzIGluY2x1ZGluZyBnZW5kZXIpIGFuZCBhbHNvIGJ5IG5hdHVyYWwgdmFyaWF0aW9uLiBTbyBhbHRob3VnaCB0aGUgZm9vdCBsZW5ndGhzIGFyZSBpbmZvcm1hdGl2ZSwgdGhleSB3aWxsIG5vdCBhbGxvdyB1cyB0byBwZXJmZWN0bHkgcHJlZGljdCB0aGUgaGVpZ2h0cyBvZiB0aGUgc3R1ZGVudHMgaW4gdGhpcyBzYW1wbGUuIFRoZSB2YWx1ZSBvZiBzIGlzIDMuNjEgaW5jaGVzLCBtZWFuaW5nIHdlIHNob3VsZCBiZSBhYmxlIHRvIHByZWRpY3QgYSBwZXJzb24ncyBoZWlnaHQgd2l0aGluIDMuNjEgaW5jaGVzIGJhc2VkIG9ubHkgb24gdGhlIHNpemUgb2YgaGlzIG9yIGhlciBmb290Lg0KDQpQcmFjdGljZSBQcm9ibGVtIDFDDQpGb3IgdGhlIENhdCBKdW1waW5nIGRhdGEgc2V0IGZyb20gSW52ZXN0aWdhdGlvbiA1LjY6DQooYSkgQ2FsY3VsYXRlIGFuZCBpbnRlcnByZXQgdGhlIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50IGJldHdlZW4gdmVsb2NpdHkgYW5kIGJvZHkgbWFzcy4NCihiKSBTcXVhcmUgdGhlIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50IHRvIG9idGFpbiByMi4gSW50ZXJwcmV0IHRoZSBjb2VmZmljaWVudCBvZiBkZXRlcm1pbmF0aW9uIGluIGNvbnRleHQuDQooYykgRGV0ZXJtaW5lIGFuZCBpbnRlcnByZXQgdGhlIHNsb3BlIG9mIHRoZSBsZWFzdCBzcXVhcmVzIHJlZ3Jlc3Npb24gbGluZS4NCihkKSBEZXRlcm1pbmUgYW5kIGludGVycHJldCB0aGUgaW50ZXJjZXB0IG9mIHRoZSBsZWFzdCBzcXVhcmVzIHJlZ3Jlc3Npb24gbGluZS4gRXhwbGFpbiB3aGF0IHRoaXMgdmFsdWUgbWlnaHQgc2lnbmlmeSBpbiB0aGlzIGNvbnRleHQuDQooZSkgRGV0ZXJtaW5lIGFuZCBpbnRlcnByZXQgdGhlIHZhbHVlIG9mIHMuDQoNCkFwcGxldCBFeHBsb3JhdGlvbjogQmVoYXZpb3Igb2YgUmVncmVzc2lvbiBMaW5lcw0KT3BlbiB0aGUgQW5hbHl6aW5nIFR3byBRdWFudGl0YXRpdmUgVmFyaWFibGVzIGFwcGxldC4gUmVjYWxsIHRoZSAyMCBvYnNlcnZhdGlvbnMgYXJlIGhlaWdodCBhbmQgZm9vdCBsZW5ndGggZm9yIGEgc2FtcGxlIG9mIHN0YXRpc3RpY3Mgc3R1ZGVudHMuDQoNCihhKSBDaGVjayB0aGUgU2hvdyBSZWdyZXNzaW9uIExpbmUgYm94LiBEb2VzIHRoZSByZWdyZXNzaW9uIGxpbmUgYXBwZWFyIHRvIGRvIGEgcmVhc29uYWJsZSBqb2Igb2Ygc3VtbWFyaXppbmcgdGhlIG92ZXJhbGwgbGluZWFyIHJlbGF0aW9uc2hpcCBpbiB0aGVzZSBkYXRhIG9ic2VydmF0aW9ucz8NCg0KDQooYikgSWYgd2Ugd2VyZSB0byBhZGQgYW4gb2JzZXJ2YXRpb24gd2l0aCBoZWlnaHQgNjAgaW4gYW5kIGZvb3QgbGVuZ3RoIDM1IGNtLCBwcmVkaWN0IHdoZXRoZXIsIGFuZCBpZiBzbyBob3csIHRoZSByZWdyZXNzaW9uIGxpbmUgd2lsbCBjaGFuZ2UuDQoNCg0KKGMpIEVudGVyIHRoZXNlIGNvb3JkaW5hdGVzIGluIHRoZSBBZGQvcmVtb3ZlIG9ic2VydmF0aW9ucyBib3ggKHggPSAzNSwgeSA9IDYwKSBhbmQgcHJlc3MgdGhlIEFkZCBidXR0b24uIFJlcG9ydCB0aGUgbmV3IHJlZ3Jlc3Npb24gZXF1YXRpb24uDQoNCg0KKGQpIENoZWNrIHRoZSBNb3ZlIG9ic2VydmF0aW9ucyBib3guIENsaWNrIG9uIHRoaXMgbmV3IG9ic2VydmF0aW9uIChpdCBzaG91bGQgY2hhbmdlIGNvbG9yKSBhbmQgaG9sZCB0aGUgbW91c2UgYnV0dG9uIGRvd24gYW5kIG1vdmUgdGhlIG1vdXNlIHZlcnRpY2FsbHkgaW4gYm90aCBkaXJlY3Rpb25zIHRvIGNoYW5nZSB0aGUgeSB2YWx1ZSBvZiB0aGUgb2JzZXJ2YXRpb24gKHRyeSBoYXJkIG5vdCB0byBjaGFuZ2UgdGhlIHggdmFsdWUpLiBUaGUgYXBwbGV0IGF1dG9tYXRpY2FsbHkgcmVjYWxjdWxhdGVzIHRoZSBuZXcgcmVncmVzc2lvbiBsaW5lIGRlcGVuZGluZyBvbiB0aGUgbmV3IGxvY2F0aW9uIG9mIHRoZSBwb2ludC4gSXMgaXQgcG9zc2libGUgdG8gbWFrZSB0aGUgcmVncmVzc2lvbiBsaW5lIGhhdmUgYSBuZWdhdGl2ZSBzbG9wZT8gRG9lcyB0aGUgcmVncmVzc2lvbiBsaW5lIGFwcGVhciB0byBiZSBhZmZlY3RlZCBieSB0aGUgbG9jYXRpb24gb2YgdGhpcyBwb2ludD8gSXMgdGhlIGltcGFjdCBzdHJvbmcgb3Igd2Vhaz8gRG9lcyB0aGlzIG1hdGNoIHlvdXIgcHJlZGljdGlvbj8NCg0KDQoNCihlKSBEZWxldGUgdGhpcyBuZXcgcG9pbnQgYW5kL29yIHByZXNzIHRoZSBSZXZlcnQgYnV0dG9uIHRvIHJldHVybiB0byB0aGUgb3JpZ2luYWwgZGF0YSBzZXQuIE5vdyBmb2N1cyBvbiB0aGUgcG9pbnQgbG9jYXRlZCBhdCAoMjksIDY1KS4gSWYgd2UgbW92ZSB0aGlzIHBvaW50IHZlcnRpY2FsbHksIHByZWRpY3QgaG93IHRoZSByZWdyZXNzaW9uIGxpbmUgd2lsbCBjaGFuZ2UuIERvIHlvdSB0aGluayB0aGUgY2hhbmdlIHdpbGwgYmUgYXMgZHJhbWF0aWMgYXMgaW4gKGMpPw0KDQoNCg0KKGYpIFJlcGVhdCAoZCkgdXNpbmcgdGhlIHBvaW50IGxvY2F0ZWQgYXQgKDI5LCA2NSkuIERvZXMgdGhlIHJlZ3Jlc3Npb24gbGluZSBhcHBlYXIgdG8gYmUgYWZmZWN0ZWQgYnkgdGhlIGxvY2F0aW9uIG9mIHRoaXMgcG9pbnQ/IElzIHRoZSBpbXBhY3Qgc3Ryb25nIG9yIHdlYWsgKGVzcGVjaWFsbHkgY29tcGFyZWQgdG8gdGhlIGltcGFjdCB5b3Ugd2l0bmVzc2VkIGluIChkKSk/DQoNCg0KDQooZykgV2hpY2ggcG9pbnQgd2FzIG1vcmUgaW5mbHVlbnRpYWwgb24gdGhlIGVxdWF0aW9uIG9mIHRoZSByZWdyZXNzaW9uIGxpbmU6ICgzNSwgNjApIG9yICgyOSwgNjUpPw0KU3VnZ2VzdCBhbiBleHBsYW5hdGlvbiBmb3Igd2h5IHRoZSBwb2ludCB5b3UgaWRlbnRpZmllZCBpcyBtb3JlIGluZmx1ZW50aWFsLCBrZWVwaW5nIGluIG1pbmQgdGhlICJsZWFzdHNxdWFyZXMgY3JpdGVyaW9uLiINCg0KDQo=