1 Introduction

For this assignment, we will be looking at a data set for a survey done on student experience and satisfaction. This survey asks students questions regarding their experience in college. These questions include gathering information on a student’s academic background, their year level and credit status, along with their engagement in learning their class material both inside and outside of school. This survey also asks students about which campus resources they have used throughout their time in college. The survey looks at the satisfaction rating students have regarding the college, along with their information to gather data about the students at the college and their opinions regarding their experience and their satisfaction level regarding their college.

For this project, we will take a look at this survey data and begin with analyzing the data set along with conducting some exploratory data analysis steps to start. Then, we will perform internal reliability analysis of the subscales in the survey. We will consider some potential consulting questions which could be drawn from this survey data for future projects on this survey data set.

1.1 Data Description

Let’s read in the survey data set from GitHub. We will call the data set as “survey”.

survey <- read.csv("https://raw.githubusercontent.com/JosieGallop/STA490/refs/heads/main/student-satisfaction-survey.csv")

As we can see, the survey data set contains 332 observations of 121 variables. The variables represent the different questions within the survey.

2 Exploratory Data Analysis

We will perform some exploratory data analysis to gain a better understanding of the survey data set, and to further prepare the data for additional analysis related to reliability and validation of the survey data.

2.1 Dealing with the Missing Values

For the first step of our exploratory data analysis, we will check for and fix any missing value concerns within our data set. First, let’s check to see if there indeed are some missing values which we will need to fix.

colSums(is.na(survey))
     q1      q2      q3     q41     q42     q43     q44     q45     q46     q47 
      0       0       0       0       0       0       0       0       0       0 
    q48     q49    q410    q411    q412    q413    q414    q415    q416    q417 
      0       0       0       0       0       0       0       0       0       0 
   q418    q419    q420    q421     q51     q52     q53     q54     q55     q56 
      0       0       0       0       0       0       0       0       0       0 
    q61     q62     q63      q7     q81     q82     q83     q84     q85     q86 
      0       0       0       0       0       0       0       0       0       0 
    q87     q88     q89     q91     q92     q93     q94     q95     q96     q97 
      0       0       0       0       0       0       0       0       0       0 
   q101    q102    q103    q104    q105    q106    q107    q108    q109   q1010 
      0       0       0       0       0       0       0       0       0       0 
  q1011   q1012   q1013   q1014   q1015  q111.1  q111.2  q111.3  q112.1  q112.2 
      0       0       0       0       0       0       0       0       0       0 
 q112.3  q113.1  q113.2  q113.3  q114.1  q114.2  q114.3  q115.1  q115.2  q115.3 
      0       0       0       0       0       0       0       0       0       0 
 q116.1  q116.2  q116.3  q117.1  q117.2  q117.3  q118.1  q118.2  q118.3  q119.1 
      0       0       0       0       0       0       0       0       0       0 
 q119.2  q119.3 q1110.1 q1110.2 q1110.3 q1111.1 q1111.2 q1111.3    q121    q122 
      0       0       0       0       0       0       0       0       0       0 
   q123    q124    q125    q131    q132    q133    q134    q135    q136     q14 
      0       0       0       0       0       0       0       0       0       0 
    q15     q16     q17     q18     q19     q20     q21     q22     q23     q24 
      0       0       0       0       0       0       0       0       0       0 
    q25 
      0 

It turns out that there are exactly zero missing values in this survey data set, meaning that we do not have any missing values to worry about. So, we do not have to do any imputation to fix any missing values, because we do not have any missing values in the survey data set.

3 Splitting the Survey Data Set

We have two main components of our survey, the student experience portion and the student satisfaction portion. We will split these apart for our further analysis of the survey data set.

3.1 Student Experience Portion

First, let’s separate the student experience portion of the survey data set. The student experience portion looks at the personal and academic background of students at the college. This information gives some background details about the student along with their experience at the college. The goal of this survey is to see how these experience factors may affect a student’s college satisfaction.

The student experience portion takes up majority of the survey questionarre. So, this student experience portion will contain the majority of the questions within the survey data set.

experience = survey[, 1:112]

Now we have created the experience subset of our survey data.

3.2 Student Satisfaction Portion

The second portion of the survey data set is the student satisfaction questions. These questions look at a student’s overall satisfaction and feelings towards their college. There are only two questions within the survey questionarre which ask about student satisfaction related topics, so this subset portion of the data set will be much smaller than the student experience portion of the data set.

satisfaction = survey[, 113:114]

Now we have created the satisfaction subset of our survey data.

4 Reliability Analysis

Now that we have prepared the data set, we will perform internal reliability and validity assessments in order to further investigate the survey data set.

4.1 Student Experience Reliability Analysis

First, let’s look at the correlation plots for the student experience subset of our survey data set.

The experience portion of the survey is incredibly large, so let’s take a smaller subset of this portion in order to make our correlation plot easier to interpret. We will look at questions 5, 6, and 7 for this subset. We will call this subset “experience.1”.

experience.1 = survey[, 25:34]

Now, let’s look at the correlation plot for this subset of the student experience portion of the survey.

M=cor(experience.1)
corrplot.mixed(M, lower.col = "purple", upper = "ellipse", number.cex = .7, tl.cex = 0.7)

We can see some moderate correlation between the student experience survey datafrom how some of the ellipses do appear to be moderately long and stretched in their shape.

4.2 Student Satisfaction Reliability Analysis

Next, let’s look at the correlation plots for the student satisfaction subset of the survey data set.

M=cor(satisfaction)
corrplot.mixed(M, lower.col = "purple", upper = "ellipse", number.cex = .7, tl.cex = 0.7)

The satisfaction portion of the survey was so short compared to the student experience portion, that it is quite hard to judge the correlation due to the lack of entries on our plot. The ellipse does appear to be noticeably streched and long, indicating some moderate correlation does indeed exist.

5 Cronbach Alpha Levels

Next, we will calculate the Cronbach alpha levels for each of our two subsets, along with their 95% confidence intervals. This will allow us to assess the reliability of the two subsets.

5.1 Student Experience

First, let’s calculate the Cronbach alpha level for the student experience portion of the survey data set.

cronbach.e = as.numeric(alpha(experience.1)$total[1])
Some items ( q61 q62 q63 q7 ) were negatively correlated with the first principal component and 
probably should be reversed.  
To do this, run the function again with the 'check.keys=TRUE' option
CI.e = cronbach.alpha.CI(alpha=cronbach.e, n=332, items=10, conf.level = 0.95)
CI.comp = cbind(LCI = CI.e[1], alpha = cronbach.e, UCI =CI.e[2])
row.names(CI.comp) = ""
pander(CI.comp, caption="Confidence Interval of Cronbach Alpha")
Confidence Interval of Cronbach Alpha
LCI alpha UCI
0.4298 0.5119 0.5866

The Cronbach alpha level for the student experience portion of the survey data set is 0.5119, 95% CI [0.4298, 0.5866]. This value of 0.5119 is not that high, but it is not incredibly low either. This indicates that their is moderate, but not great, reliability.

5.2 Student Satisfaction

Next, let’s calculate the Cronbach alpha level for the student satisfaction portion of the survey data set.

cronbach.s = as.numeric(alpha(satisfaction)$total[1])
CI.s = cronbach.alpha.CI(alpha=cronbach.s, n=332, items=2, conf.level = 0.95)
CI.comp = cbind(LCI = CI.s[1], alpha = cronbach.s, UCI =CI.s[2])
row.names(CI.comp) = ""
pander(CI.comp, caption="Confidence Interval of Cronbach Alpha")
Confidence Interval of Cronbach Alpha
LCI alpha UCI
0.4854 0.5853 0.6658

The Cronbach alpha level for the student experience portion of the survey data set is 0.5853, 95% CI [0.4298, 0.6658]. TOnce again, this value of 0.5853 is not that high, but it is not incredibly low either. This indicates that their is moderate, but not great, reliability. This value is slightly higher than that of the student experience subset, indicating the student satisfaction subset has slightly better reliability of the two.

6 Project Questions

Lastly, we will now look at some potential project questions based upon the analysis of the survey data set and the results that were found.

Some potential questions include:

  • Which factors of student experience showed the strongest influence on student satisfaction?

  • Did these particular factors with the strongest influence on satisfaction show stronger reliability when compared to the others?

  • Do students appear to be mostly satisfied with their school experience?

For this project, I would be interesting in looking into particuarly the topic of which student experience factors have the greatest significance or effect on a student’s satisfaction with their college experience. This would be helpful because it would give specific factors for college faculty or advisors to look out for in their students in order to help them have a more positive and satisfactory experience during their time in college.

I think it would be interesing to see if these particular factors with stronger influence on a student’s satisfaction have stronger reliability. It would be interesting to compare the reliability results of these particular factors to see if their appears stronger or weaker than the average. This would help to see if these findings truly are reliable or not.

LS0tDQp0aXRsZTogIlN1cnZleSBBbmFseXNpczogSW50ZXJuYWwgUmVsaWFiaWxpdHkiDQphdXRob3I6ICJKb3NpZSBHYWxsb3AiDQpkYXRlOiAiMjAyNS0wNC0wOCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIGZpZ193aWR0aDogNg0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvY19jb2xsYXBzZWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHNtb290aF9zY3JvbGw6IHllcw0KICAgIHRoZW1lOiBsdW1lbg0KICB3b3JkX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBrZWVwX21kOiB5ZXMNCiAgcGRmX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogY29uc29sZQ0KLS0tDQoNCmBgYHs9aHRtbH0NCg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCg0KLyogQ2FzY2FkaW5nIFN0eWxlIFNoZWV0cyAoQ1NTKSBpcyBhIHN0eWxlc2hlZXQgbGFuZ3VhZ2UgdXNlZCB0byBkZXNjcmliZSB0aGUgcHJlc2VudGF0aW9uIG9mIGEgZG9jdW1lbnQgd3JpdHRlbiBpbiBIVE1MIG9yIFhNTC4gaXQgaXMgYSBzaW1wbGUgbWVjaGFuaXNtIGZvciBhZGRpbmcgc3R5bGUgKGUuZy4sIGZvbnRzLCBjb2xvcnMsIHNwYWNpbmcpIHRvIFdlYiBkb2N1bWVudHMuICovDQoNCmgxLnRpdGxlIHsgIC8qIFRpdGxlIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBvZiB0aGUgcmVwb3J0IHRpdGxlICovDQogIGZvbnQtc2l6ZTogMjRweDsNCiAgY29sb3I6IERhcmtSZWQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOw0KfQ0KaDQuYXV0aG9yIHsgLyogSGVhZGVyIDQgLSBmb250IHNwZWNpZmljYXRpb25zIGZvciBhdXRob3JzICAqLw0KICBmb250LXNpemU6IDIwcHg7DQogIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWk7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBmb250IHNwZWNpZmljYXRpb25zIGZvciB0aGUgZGF0ZSAgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LWZhbWlseTogc3lzdGVtLXVpOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmgxIHsgLyogSGVhZGVyIDEgLSBmb250IHNwZWNpZmljYXRpb25zIGZvciBsZXZlbCAxIHNlY3Rpb24gdGl0bGUgICovDQogICAgZm9udC1zaXplOiAyMnB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmgyIHsgLyogSGVhZGVyIDIgLSBmb250IHNwZWNpZmljYXRpb25zIGZvciBsZXZlbCAyIHNlY3Rpb24gdGl0bGUgKi8NCiAgICBmb250LXNpemU6IDIwcHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDMgeyAvKiBIZWFkZXIgMyAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgb2YgbGV2ZWwgMyBzZWN0aW9uIHRpdGxlICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoNCB7IC8qIEhlYWRlciA0IC0gZm9udCBzcGVjaWZpY2F0aW9ucyBvZiBsZXZlbCA0IHNlY3Rpb24gdGl0bGUgICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmJvZHkgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCi5oaWdobGlnaHRtZSB7IGJhY2tncm91bmQtY29sb3I6eWVsbG93OyB9DQoNCnAgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCjwvc3R5bGU+DQpgYGANCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KIyBEZXRlY3QsIGluc3RhbGwsIGFuZCBsb2FkIHBhY2thZ2VzIGlmIG5lZWRlZC4NCmlmICghcmVxdWlyZSgia25pdHIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKQ0KICAgbGlicmFyeShrbml0cikNCn0NCmlmICghcmVxdWlyZSgibGVhZmxldCIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJsZWFmbGV0IikNCiAgIGxpYnJhcnkobGVhZmxldCkNCn0NCmlmICghcmVxdWlyZSgiRW52U3RhdHMiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiRW52U3RhdHMiKQ0KICAgbGlicmFyeShFbnZTdGF0cykNCn0NCmlmICghcmVxdWlyZSgiTUFTUyIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJNQVNTIikNCiAgIGxpYnJhcnkoTUFTUykNCn0NCmlmICghcmVxdWlyZSgicGh5dG9vbHMiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygicGh5dG9vbHMiKQ0KICAgbGlicmFyeShwaHl0b29scykNCn0NCmlmKCFyZXF1aXJlKCJkcGx5ciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJkcGx5ciIpDQogICBsaWJyYXJ5KGRwbHlyKQ0KfQ0KaWYoIXJlcXVpcmUoInRpZHl2ZXJzZSIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKQ0KICAgbGlicmFyeSh0aWR5dmVyc2UpDQp9DQppZighcmVxdWlyZSgiR0dhbGx5IikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoIkdHYWxseSIpDQogICBsaWJyYXJ5KEdHYWxseSkNCn0NCmlmICghcmVxdWlyZSgiR1BBcm90YXRpb24iKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiR1BBcm90YXRpb24iKQ0KICAgbGlicmFyeShHUEFyb3RhdGlvbikNCn0NCmlmICghcmVxdWlyZSgibkZhY3RvcnMiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygibkZhY3RvcnMiKQ0KICAgbGlicmFyeShuRmFjdG9ycykNCn0NCmlmICghcmVxdWlyZSgicGFyYW1ldGVycyIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJwYXJhbWV0ZXJzIikNCiAgIGxpYnJhcnkocGFyYW1ldGVycykNCn0NCmlmICghcmVxdWlyZSgiY29ycnBsb3QiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiY29ycnBsb3QiKQ0KICAgbGlicmFyeShjb3JycGxvdCkNCn0NCmlmICghcmVxdWlyZSgiZ2djb3JycGxvdCIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJnZ2NvcnJwbG90IikNCiAgIGxpYnJhcnkoZ2djb3JycGxvdCkNCn0NCmlmICghcmVxdWlyZSgiZ2dmb3J0aWZ5IikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImdnZm9ydGlmeSIpDQogICBsaWJyYXJ5KGdnZm9ydGlmeSkNCn0NCmlmICghcmVxdWlyZSgiZ2dwbG90MiIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikNCiAgIGxpYnJhcnkoZ2dwbG90MikNCn0NCmlmICghcmVxdWlyZSgiQ0NBIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoIkNDQSIpDQogICBsaWJyYXJ5KENDQSkNCn0NCmlmICghcmVxdWlyZSgib2xzcnIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygib2xzcnIiKQ0KICAgbGlicmFyeShvbHNycikNCn0NCmlmICghcmVxdWlyZSgiY29jcm9uIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImNvY3JvbiIpDQogICBsaWJyYXJ5KGNvY3JvbikNCn0NCmlmKCFyZXF1aXJlKCJwYW5kZXIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygicGFuZGVyIikNCiAgIGxpYnJhcnkocGFuZGVyKQ0KfQ0KaWYoIXJlcXVpcmUoIm1pY2UiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygibWljZSIpDQogICBsaWJyYXJ5KG1pY2UpDQp9DQppZighcmVxdWlyZSgibWxiZW5jaCIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJtbGJlbmNoIikNCiAgIGxpYnJhcnkobWxiZW5jaCkNCn0NCmlmKCFyZXF1aXJlKCJwc3ljaCIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJwc3ljaCIpDQogICBsaWJyYXJ5KHBzeWNoKQ0KfQ0KaWYoIXJlcXVpcmUoImJyb29tLm1peGVkIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImJyb29tLm1peGVkIikNCiAgIGxpYnJhcnkoYnJvb20ubWl4ZWQpDQp9DQppZighcmVxdWlyZSgiR0dhbGx5IikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoIkdHYWxseSIpDQogICBsaWJyYXJ5KEdHYWxseSkNCn0NCmlmKCFyZXF1aXJlKCJjYXJldCIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJjYXJldCIpDQogICBsaWJyYXJ5KGNhcmV0KQ0KfQ0KaWYgKCFyZXF1aXJlKCJwUk9DIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInBST0MiKQ0KICAgbGlicmFyeShwUk9DKQ0KfQ0KIyBTcGVjaWZpY2F0aW9ucyBvZiBvdXRwdXRzIG9mIGNvZGUgaW4gY29kZSBjaHVua3MNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgICMgaW5jbHVkZSBjb2RlIGNodW5rIGluIHRoZSBvdXRwdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZQ0KICAgICAgICAgICAgICAgICAgIHdhcm5pbmcgPSBGQUxTRSwgICMgU29tZXRpbWVzLCB5b3VyIGNvZGUgbWF5IHByb2R1Y2UgYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbWVzc2FnZXMsIHlvdSBjYW4gY2hvb3NlIHRvIGluY2x1ZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3YXJuaW5nIG1lc3NhZ2VzIGluIHRoZSBvdXRwdXQgZmlsZS4gDQogICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLCAgDQogICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IFRSVUUsICAgIyB5b3UgY2FuIGFsc28gZGVjaWRlIHdoZXRoZXIgdG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGhlIG91dHB1dCBpbiB0aGUgb3V0cHV0IGZpbGUuDQogICAgICAgICAgICAgICAgICAgY29tbWVudCA9IE5BLCAgICAgIyBTdXBwcmVzcyBoYXNoLXRhZ3MgaW4gdGhlIG91dHB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLg0KICAgICAgICAgICAgICAgICAgIGZpZy5hbGlnbj0nY2VudGVyJywgDQogICAgICAgICAgICAgICAgICAgZmlnLnBvcyA9ICdodCcNCiAgICAgICAgICAgICAgICAgICAgICApICAgDQpgYGANCg0KIyBJbnRyb2R1Y3Rpb24NCg0KRm9yIHRoaXMgYXNzaWdubWVudCwgd2Ugd2lsbCBiZSBsb29raW5nIGF0IGEgZGF0YSBzZXQgZm9yIGEgc3VydmV5IGRvbmUgb24gc3R1ZGVudCBleHBlcmllbmNlIGFuZCBzYXRpc2ZhY3Rpb24uIFRoaXMgc3VydmV5IGFza3Mgc3R1ZGVudHMgcXVlc3Rpb25zIHJlZ2FyZGluZyB0aGVpciBleHBlcmllbmNlIGluIGNvbGxlZ2UuIFRoZXNlIHF1ZXN0aW9ucyBpbmNsdWRlIGdhdGhlcmluZyBpbmZvcm1hdGlvbiBvbiBhIHN0dWRlbnQncyBhY2FkZW1pYyBiYWNrZ3JvdW5kLCB0aGVpciB5ZWFyIGxldmVsIGFuZCBjcmVkaXQgc3RhdHVzLCBhbG9uZyB3aXRoIHRoZWlyIGVuZ2FnZW1lbnQgaW4gbGVhcm5pbmcgdGhlaXIgY2xhc3MgbWF0ZXJpYWwgYm90aCBpbnNpZGUgYW5kIG91dHNpZGUgb2Ygc2Nob29sLiBUaGlzIHN1cnZleSBhbHNvIGFza3Mgc3R1ZGVudHMgYWJvdXQgd2hpY2ggY2FtcHVzIHJlc291cmNlcyB0aGV5IGhhdmUgdXNlZCB0aHJvdWdob3V0IHRoZWlyIHRpbWUgaW4gY29sbGVnZS4gVGhlIHN1cnZleSBsb29rcyBhdCB0aGUgc2F0aXNmYWN0aW9uIHJhdGluZyBzdHVkZW50cyBoYXZlIHJlZ2FyZGluZyB0aGUgY29sbGVnZSwgYWxvbmcgd2l0aCB0aGVpciBpbmZvcm1hdGlvbiB0byBnYXRoZXIgZGF0YSBhYm91dCB0aGUgc3R1ZGVudHMgYXQgdGhlIGNvbGxlZ2UgYW5kIHRoZWlyIG9waW5pb25zIHJlZ2FyZGluZyB0aGVpciBleHBlcmllbmNlIGFuZCB0aGVpciBzYXRpc2ZhY3Rpb24gbGV2ZWwgcmVnYXJkaW5nIHRoZWlyIGNvbGxlZ2UuIA0KDQpGb3IgdGhpcyBwcm9qZWN0LCB3ZSB3aWxsIHRha2UgYSBsb29rIGF0IHRoaXMgc3VydmV5IGRhdGEgYW5kIGJlZ2luIHdpdGggYW5hbHl6aW5nIHRoZSBkYXRhIHNldCBhbG9uZyB3aXRoIGNvbmR1Y3Rpbmcgc29tZSBleHBsb3JhdG9yeSBkYXRhIGFuYWx5c2lzIHN0ZXBzIHRvIHN0YXJ0LiBUaGVuLCB3ZSB3aWxsIHBlcmZvcm0gaW50ZXJuYWwgcmVsaWFiaWxpdHkgYW5hbHlzaXMgb2YgdGhlIHN1YnNjYWxlcyBpbiB0aGUgc3VydmV5LiBXZSB3aWxsIGNvbnNpZGVyIHNvbWUgcG90ZW50aWFsIGNvbnN1bHRpbmcgcXVlc3Rpb25zIHdoaWNoIGNvdWxkIGJlIGRyYXduIGZyb20gdGhpcyBzdXJ2ZXkgZGF0YSBmb3IgZnV0dXJlIHByb2plY3RzIG9uIHRoaXMgc3VydmV5IGRhdGEgc2V0LiANCg0KDQojIyBEYXRhIERlc2NyaXB0aW9uDQoNCkxldCdzIHJlYWQgaW4gdGhlIHN1cnZleSBkYXRhIHNldCBmcm9tIEdpdEh1Yi4gV2Ugd2lsbCBjYWxsIHRoZSBkYXRhIHNldCBhcyAic3VydmV5Ii4gDQoNCmBgYHtyfQ0Kc3VydmV5IDwtIHJlYWQuY3N2KCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vSm9zaWVHYWxsb3AvU1RBNDkwL3JlZnMvaGVhZHMvbWFpbi9zdHVkZW50LXNhdGlzZmFjdGlvbi1zdXJ2ZXkuY3N2IikNCmBgYA0KDQpBcyB3ZSBjYW4gc2VlLCB0aGUgc3VydmV5IGRhdGEgc2V0IGNvbnRhaW5zIDMzMiBvYnNlcnZhdGlvbnMgb2YgMTIxIHZhcmlhYmxlcy4gVGhlIHZhcmlhYmxlcyByZXByZXNlbnQgdGhlIGRpZmZlcmVudCBxdWVzdGlvbnMgd2l0aGluIHRoZSBzdXJ2ZXkuIA0KDQoNCg0KDQojIEV4cGxvcmF0b3J5IERhdGEgQW5hbHlzaXMNCg0KV2Ugd2lsbCBwZXJmb3JtIHNvbWUgZXhwbG9yYXRvcnkgZGF0YSBhbmFseXNpcyB0byBnYWluIGEgYmV0dGVyIHVuZGVyc3RhbmRpbmcgb2YgdGhlIHN1cnZleSBkYXRhIHNldCwgYW5kIHRvIGZ1cnRoZXIgcHJlcGFyZSB0aGUgZGF0YSBmb3IgYWRkaXRpb25hbCBhbmFseXNpcyByZWxhdGVkIHRvIHJlbGlhYmlsaXR5IGFuZCB2YWxpZGF0aW9uIG9mIHRoZSBzdXJ2ZXkgZGF0YS4gDQoNCg0KIyMgRGVhbGluZyB3aXRoIHRoZSBNaXNzaW5nIFZhbHVlcw0KDQpGb3IgdGhlIGZpcnN0IHN0ZXAgb2Ygb3VyIGV4cGxvcmF0b3J5IGRhdGEgYW5hbHlzaXMsIHdlIHdpbGwgY2hlY2sgZm9yIGFuZCBmaXggYW55IG1pc3NpbmcgdmFsdWUgY29uY2VybnMgd2l0aGluIG91ciBkYXRhIHNldC4gRmlyc3QsIGxldCdzIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSBpbmRlZWQgYXJlIHNvbWUgbWlzc2luZyB2YWx1ZXMgd2hpY2ggd2Ugd2lsbCBuZWVkIHRvIGZpeC4NCg0KYGBge3J9DQpjb2xTdW1zKGlzLm5hKHN1cnZleSkpDQpgYGANCg0KSXQgdHVybnMgb3V0IHRoYXQgdGhlcmUgYXJlIGV4YWN0bHkgemVybyBtaXNzaW5nIHZhbHVlcyBpbiB0aGlzIHN1cnZleSBkYXRhIHNldCwgbWVhbmluZyB0aGF0IHdlIGRvIG5vdCBoYXZlIGFueSBtaXNzaW5nIHZhbHVlcyB0byB3b3JyeSBhYm91dC4gU28sIHdlIGRvIG5vdCBoYXZlIHRvIGRvIGFueSBpbXB1dGF0aW9uIHRvIGZpeCBhbnkgbWlzc2luZyB2YWx1ZXMsIGJlY2F1c2Ugd2UgZG8gbm90IGhhdmUgYW55IG1pc3NpbmcgdmFsdWVzIGluIHRoZSBzdXJ2ZXkgZGF0YSBzZXQuDQoNCg0KDQoNCiMgU3BsaXR0aW5nIHRoZSBTdXJ2ZXkgRGF0YSBTZXQNCg0KV2UgaGF2ZSB0d28gbWFpbiBjb21wb25lbnRzIG9mIG91ciBzdXJ2ZXksIHRoZSBzdHVkZW50IGV4cGVyaWVuY2UgcG9ydGlvbiBhbmQgdGhlIHN0dWRlbnQgc2F0aXNmYWN0aW9uIHBvcnRpb24uIFdlIHdpbGwgc3BsaXQgdGhlc2UgYXBhcnQgZm9yIG91ciBmdXJ0aGVyIGFuYWx5c2lzIG9mIHRoZSBzdXJ2ZXkgZGF0YSBzZXQuDQoNCg0KIyMgU3R1ZGVudCBFeHBlcmllbmNlIFBvcnRpb24NCg0KRmlyc3QsIGxldCdzIHNlcGFyYXRlIHRoZSBzdHVkZW50IGV4cGVyaWVuY2UgcG9ydGlvbiBvZiB0aGUgc3VydmV5IGRhdGEgc2V0LiBUaGUgc3R1ZGVudCBleHBlcmllbmNlIHBvcnRpb24gbG9va3MgYXQgdGhlIHBlcnNvbmFsIGFuZCBhY2FkZW1pYyBiYWNrZ3JvdW5kIG9mIHN0dWRlbnRzIGF0IHRoZSBjb2xsZWdlLiBUaGlzIGluZm9ybWF0aW9uIGdpdmVzIHNvbWUgYmFja2dyb3VuZCBkZXRhaWxzIGFib3V0IHRoZSBzdHVkZW50IGFsb25nIHdpdGggdGhlaXIgZXhwZXJpZW5jZSBhdCB0aGUgY29sbGVnZS4gVGhlIGdvYWwgb2YgdGhpcyBzdXJ2ZXkgaXMgdG8gc2VlIGhvdyB0aGVzZSBleHBlcmllbmNlIGZhY3RvcnMgbWF5IGFmZmVjdCBhIHN0dWRlbnQncyBjb2xsZWdlIHNhdGlzZmFjdGlvbi4gDQoNClRoZSBzdHVkZW50IGV4cGVyaWVuY2UgcG9ydGlvbiB0YWtlcyB1cCBtYWpvcml0eSBvZiB0aGUgc3VydmV5IHF1ZXN0aW9uYXJyZS4gU28sIHRoaXMgc3R1ZGVudCBleHBlcmllbmNlIHBvcnRpb24gd2lsbCBjb250YWluIHRoZSBtYWpvcml0eSBvZiB0aGUgcXVlc3Rpb25zIHdpdGhpbiB0aGUgc3VydmV5IGRhdGEgc2V0Lg0KDQpgYGB7cn0NCmV4cGVyaWVuY2UgPSBzdXJ2ZXlbLCAxOjExMl0NCmBgYA0KDQpOb3cgd2UgaGF2ZSBjcmVhdGVkIHRoZSBleHBlcmllbmNlIHN1YnNldCBvZiBvdXIgc3VydmV5IGRhdGEuIA0KDQoNCg0KIyMgU3R1ZGVudCBTYXRpc2ZhY3Rpb24gUG9ydGlvbg0KDQpUaGUgc2Vjb25kIHBvcnRpb24gb2YgdGhlIHN1cnZleSBkYXRhIHNldCBpcyB0aGUgc3R1ZGVudCBzYXRpc2ZhY3Rpb24gcXVlc3Rpb25zLiBUaGVzZSBxdWVzdGlvbnMgbG9vayBhdCBhIHN0dWRlbnQncyBvdmVyYWxsIHNhdGlzZmFjdGlvbiBhbmQgZmVlbGluZ3MgdG93YXJkcyB0aGVpciBjb2xsZWdlLiBUaGVyZSBhcmUgb25seSB0d28gcXVlc3Rpb25zIHdpdGhpbiB0aGUgc3VydmV5IHF1ZXN0aW9uYXJyZSB3aGljaCBhc2sgYWJvdXQgc3R1ZGVudCBzYXRpc2ZhY3Rpb24gcmVsYXRlZCB0b3BpY3MsIHNvIHRoaXMgc3Vic2V0IHBvcnRpb24gb2YgdGhlIGRhdGEgc2V0IHdpbGwgYmUgbXVjaCBzbWFsbGVyIHRoYW4gdGhlIHN0dWRlbnQgZXhwZXJpZW5jZSBwb3J0aW9uIG9mIHRoZSBkYXRhIHNldC4NCg0KYGBge3J9DQpzYXRpc2ZhY3Rpb24gPSBzdXJ2ZXlbLCAxMTM6MTE0XQ0KYGBgDQoNCk5vdyB3ZSBoYXZlIGNyZWF0ZWQgdGhlIHNhdGlzZmFjdGlvbiBzdWJzZXQgb2Ygb3VyIHN1cnZleSBkYXRhLiANCg0KDQoNCiMgUmVsaWFiaWxpdHkgQW5hbHlzaXMNCg0KTm93IHRoYXQgd2UgaGF2ZSBwcmVwYXJlZCB0aGUgZGF0YSBzZXQsIHdlIHdpbGwgcGVyZm9ybSBpbnRlcm5hbCByZWxpYWJpbGl0eSBhbmQgdmFsaWRpdHkgYXNzZXNzbWVudHMgaW4gb3JkZXIgdG8gZnVydGhlciBpbnZlc3RpZ2F0ZSB0aGUgc3VydmV5IGRhdGEgc2V0Lg0KDQoNCiMjIFN0dWRlbnQgRXhwZXJpZW5jZSBSZWxpYWJpbGl0eSBBbmFseXNpcw0KDQpGaXJzdCwgbGV0J3MgbG9vayBhdCB0aGUgY29ycmVsYXRpb24gcGxvdHMgZm9yIHRoZSBzdHVkZW50IGV4cGVyaWVuY2Ugc3Vic2V0IG9mIG91ciBzdXJ2ZXkgZGF0YSBzZXQuDQoNClRoZSBleHBlcmllbmNlIHBvcnRpb24gb2YgdGhlIHN1cnZleSBpcyBpbmNyZWRpYmx5IGxhcmdlLCBzbyBsZXQncyB0YWtlIGEgc21hbGxlciBzdWJzZXQgb2YgdGhpcyBwb3J0aW9uIGluIG9yZGVyIHRvIG1ha2Ugb3VyIGNvcnJlbGF0aW9uIHBsb3QgZWFzaWVyIHRvIGludGVycHJldC4gV2Ugd2lsbCBsb29rIGF0IHF1ZXN0aW9ucyA1LCA2LCBhbmQgNyBmb3IgdGhpcyBzdWJzZXQuIFdlIHdpbGwgY2FsbCB0aGlzIHN1YnNldCAiZXhwZXJpZW5jZS4xIi4NCg0KDQpgYGB7cn0NCmV4cGVyaWVuY2UuMSA9IHN1cnZleVssIDI1OjM0XQ0KYGBgDQoNCk5vdywgbGV0J3MgbG9vayBhdCB0aGUgY29ycmVsYXRpb24gcGxvdCBmb3IgdGhpcyBzdWJzZXQgb2YgdGhlIHN0dWRlbnQgZXhwZXJpZW5jZSBwb3J0aW9uIG9mIHRoZSBzdXJ2ZXkuDQoNCmBgYHtyfQ0KTT1jb3IoZXhwZXJpZW5jZS4xKQ0KY29ycnBsb3QubWl4ZWQoTSwgbG93ZXIuY29sID0gInB1cnBsZSIsIHVwcGVyID0gImVsbGlwc2UiLCBudW1iZXIuY2V4ID0gLjcsIHRsLmNleCA9IDAuNykNCmBgYA0KDQpXZSBjYW4gc2VlIHNvbWUgbW9kZXJhdGUgY29ycmVsYXRpb24gYmV0d2VlbiB0aGUgc3R1ZGVudCBleHBlcmllbmNlIHN1cnZleSBkYXRhZnJvbSBob3cgc29tZSBvZiB0aGUgZWxsaXBzZXMgZG8gYXBwZWFyIHRvIGJlIG1vZGVyYXRlbHkgbG9uZyBhbmQgc3RyZXRjaGVkIGluIHRoZWlyIHNoYXBlLg0KDQoNCg0KIyMgU3R1ZGVudCBTYXRpc2ZhY3Rpb24gUmVsaWFiaWxpdHkgQW5hbHlzaXMNCg0KTmV4dCwgbGV0J3MgbG9vayBhdCB0aGUgY29ycmVsYXRpb24gcGxvdHMgZm9yIHRoZSBzdHVkZW50IHNhdGlzZmFjdGlvbiBzdWJzZXQgb2YgdGhlIHN1cnZleSBkYXRhIHNldC4NCg0KYGBge3J9DQpNPWNvcihzYXRpc2ZhY3Rpb24pDQpjb3JycGxvdC5taXhlZChNLCBsb3dlci5jb2wgPSAicHVycGxlIiwgdXBwZXIgPSAiZWxsaXBzZSIsIG51bWJlci5jZXggPSAuNywgdGwuY2V4ID0gMC43KQ0KYGBgDQoNClRoZSBzYXRpc2ZhY3Rpb24gcG9ydGlvbiBvZiB0aGUgc3VydmV5IHdhcyBzbyBzaG9ydCBjb21wYXJlZCB0byB0aGUgc3R1ZGVudCBleHBlcmllbmNlIHBvcnRpb24sIHRoYXQgaXQgaXMgcXVpdGUgaGFyZCB0byBqdWRnZSB0aGUgY29ycmVsYXRpb24gZHVlIHRvIHRoZSBsYWNrIG9mIGVudHJpZXMgb24gb3VyIHBsb3QuIFRoZSBlbGxpcHNlIGRvZXMgYXBwZWFyIHRvIGJlIG5vdGljZWFibHkgc3RyZWNoZWQgYW5kIGxvbmcsIGluZGljYXRpbmcgc29tZSBtb2RlcmF0ZSBjb3JyZWxhdGlvbiBkb2VzIGluZGVlZCBleGlzdC4gDQoNCg0KDQojIENyb25iYWNoIEFscGhhIExldmVscw0KDQpOZXh0LCB3ZSB3aWxsIGNhbGN1bGF0ZSB0aGUgQ3JvbmJhY2ggYWxwaGEgbGV2ZWxzIGZvciBlYWNoIG9mIG91ciB0d28gc3Vic2V0cywgYWxvbmcgd2l0aCB0aGVpciA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbHMuIFRoaXMgd2lsbCBhbGxvdyB1cyB0byBhc3Nlc3MgdGhlIHJlbGlhYmlsaXR5IG9mIHRoZSB0d28gc3Vic2V0cy4NCg0KIyMgU3R1ZGVudCBFeHBlcmllbmNlDQoNCkZpcnN0LCBsZXQncyBjYWxjdWxhdGUgdGhlIENyb25iYWNoIGFscGhhIGxldmVsIGZvciB0aGUgc3R1ZGVudCBleHBlcmllbmNlIHBvcnRpb24gb2YgdGhlIHN1cnZleSBkYXRhIHNldC4NCg0KYGBge3J9DQpjcm9uYmFjaC5lID0gYXMubnVtZXJpYyhhbHBoYShleHBlcmllbmNlLjEpJHRvdGFsWzFdKQ0KQ0kuZSA9IGNyb25iYWNoLmFscGhhLkNJKGFscGhhPWNyb25iYWNoLmUsIG49MzMyLCBpdGVtcz0xMCwgY29uZi5sZXZlbCA9IDAuOTUpDQpDSS5jb21wID0gY2JpbmQoTENJID0gQ0kuZVsxXSwgYWxwaGEgPSBjcm9uYmFjaC5lLCBVQ0kgPUNJLmVbMl0pDQpyb3cubmFtZXMoQ0kuY29tcCkgPSAiIg0KcGFuZGVyKENJLmNvbXAsIGNhcHRpb249IkNvbmZpZGVuY2UgSW50ZXJ2YWwgb2YgQ3JvbmJhY2ggQWxwaGEiKQ0KYGBgDQoNClRoZSBDcm9uYmFjaCBhbHBoYSBsZXZlbCBmb3IgdGhlIHN0dWRlbnQgZXhwZXJpZW5jZSBwb3J0aW9uIG9mIHRoZSBzdXJ2ZXkgZGF0YSBzZXQgaXMgMC41MTE5LCA5NSUgQ0kgWzAuNDI5OCwgMC41ODY2XS4gVGhpcyB2YWx1ZSBvZiAwLjUxMTkgaXMgbm90IHRoYXQgaGlnaCwgYnV0IGl0IGlzIG5vdCBpbmNyZWRpYmx5IGxvdyBlaXRoZXIuIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlaXIgaXMgbW9kZXJhdGUsIGJ1dCBub3QgZ3JlYXQsIHJlbGlhYmlsaXR5LiANCg0KDQoNCiMjIFN0dWRlbnQgU2F0aXNmYWN0aW9uDQoNCk5leHQsIGxldCdzIGNhbGN1bGF0ZSB0aGUgQ3JvbmJhY2ggYWxwaGEgbGV2ZWwgZm9yIHRoZSBzdHVkZW50IHNhdGlzZmFjdGlvbiBwb3J0aW9uIG9mIHRoZSBzdXJ2ZXkgZGF0YSBzZXQuDQoNCmBgYHtyfQ0KY3JvbmJhY2gucyA9IGFzLm51bWVyaWMoYWxwaGEoc2F0aXNmYWN0aW9uKSR0b3RhbFsxXSkNCkNJLnMgPSBjcm9uYmFjaC5hbHBoYS5DSShhbHBoYT1jcm9uYmFjaC5zLCBuPTMzMiwgaXRlbXM9MiwgY29uZi5sZXZlbCA9IDAuOTUpDQpDSS5jb21wID0gY2JpbmQoTENJID0gQ0kuc1sxXSwgYWxwaGEgPSBjcm9uYmFjaC5zLCBVQ0kgPUNJLnNbMl0pDQpyb3cubmFtZXMoQ0kuY29tcCkgPSAiIg0KcGFuZGVyKENJLmNvbXAsIGNhcHRpb249IkNvbmZpZGVuY2UgSW50ZXJ2YWwgb2YgQ3JvbmJhY2ggQWxwaGEiKQ0KYGBgDQoNClRoZSBDcm9uYmFjaCBhbHBoYSBsZXZlbCBmb3IgdGhlIHN0dWRlbnQgZXhwZXJpZW5jZSBwb3J0aW9uIG9mIHRoZSBzdXJ2ZXkgZGF0YSBzZXQgaXMgMC41ODUzLCA5NSUgQ0kgWzAuNDI5OCwgMC42NjU4XS4gVE9uY2UgYWdhaW4sIHRoaXMgdmFsdWUgb2YgMC41ODUzIGlzIG5vdCB0aGF0IGhpZ2gsIGJ1dCBpdCBpcyBub3QgaW5jcmVkaWJseSBsb3cgZWl0aGVyLiBUaGlzIGluZGljYXRlcyB0aGF0IHRoZWlyIGlzIG1vZGVyYXRlLCBidXQgbm90IGdyZWF0LCByZWxpYWJpbGl0eS4gVGhpcyB2YWx1ZSBpcyBzbGlnaHRseSBoaWdoZXIgdGhhbiB0aGF0IG9mIHRoZSBzdHVkZW50IGV4cGVyaWVuY2Ugc3Vic2V0LCBpbmRpY2F0aW5nIHRoZSBzdHVkZW50IHNhdGlzZmFjdGlvbiBzdWJzZXQgaGFzIHNsaWdodGx5IGJldHRlciByZWxpYWJpbGl0eSBvZiB0aGUgdHdvLg0KDQoNCg0KDQojIFByb2plY3QgUXVlc3Rpb25zDQoNCkxhc3RseSwgd2Ugd2lsbCBub3cgbG9vayBhdCBzb21lIHBvdGVudGlhbCBwcm9qZWN0IHF1ZXN0aW9ucyBiYXNlZCB1cG9uIHRoZSBhbmFseXNpcyBvZiB0aGUgc3VydmV5IGRhdGEgc2V0IGFuZCB0aGUgcmVzdWx0cyB0aGF0IHdlcmUgZm91bmQuDQoNClNvbWUgcG90ZW50aWFsIHF1ZXN0aW9ucyBpbmNsdWRlOg0KDQoqIFdoaWNoIGZhY3RvcnMgb2Ygc3R1ZGVudCBleHBlcmllbmNlIHNob3dlZCB0aGUgc3Ryb25nZXN0IGluZmx1ZW5jZSBvbiBzdHVkZW50IHNhdGlzZmFjdGlvbj8gDQoNCiogRGlkIHRoZXNlIHBhcnRpY3VsYXIgZmFjdG9ycyB3aXRoIHRoZSBzdHJvbmdlc3QgaW5mbHVlbmNlIG9uIHNhdGlzZmFjdGlvbiBzaG93IHN0cm9uZ2VyIHJlbGlhYmlsaXR5IHdoZW4gY29tcGFyZWQgdG8gdGhlIG90aGVycz8NCg0KKiBEbyBzdHVkZW50cyBhcHBlYXIgdG8gYmUgbW9zdGx5IHNhdGlzZmllZCB3aXRoIHRoZWlyIHNjaG9vbCBleHBlcmllbmNlPw0KDQoNCkZvciB0aGlzIHByb2plY3QsIEkgd291bGQgYmUgaW50ZXJlc3RpbmcgaW4gbG9va2luZyBpbnRvIHBhcnRpY3Vhcmx5IHRoZSB0b3BpYyBvZiB3aGljaCBzdHVkZW50IGV4cGVyaWVuY2UgZmFjdG9ycyBoYXZlIHRoZSBncmVhdGVzdCBzaWduaWZpY2FuY2Ugb3IgZWZmZWN0IG9uIGEgc3R1ZGVudCdzIHNhdGlzZmFjdGlvbiB3aXRoIHRoZWlyIGNvbGxlZ2UgZXhwZXJpZW5jZS4gVGhpcyB3b3VsZCBiZSBoZWxwZnVsIGJlY2F1c2UgaXQgd291bGQgZ2l2ZSBzcGVjaWZpYyBmYWN0b3JzIGZvciBjb2xsZWdlIGZhY3VsdHkgb3IgYWR2aXNvcnMgdG8gbG9vayBvdXQgZm9yIGluIHRoZWlyIHN0dWRlbnRzIGluIG9yZGVyIHRvIGhlbHAgdGhlbSBoYXZlIGEgbW9yZSBwb3NpdGl2ZSBhbmQgc2F0aXNmYWN0b3J5IGV4cGVyaWVuY2UgZHVyaW5nIHRoZWlyIHRpbWUgaW4gY29sbGVnZS4NCg0KSSB0aGluayBpdCB3b3VsZCBiZSBpbnRlcmVzaW5nIHRvIHNlZSBpZiB0aGVzZSBwYXJ0aWN1bGFyIGZhY3RvcnMgd2l0aCBzdHJvbmdlciBpbmZsdWVuY2Ugb24gYSBzdHVkZW50J3Mgc2F0aXNmYWN0aW9uIGhhdmUgc3Ryb25nZXIgcmVsaWFiaWxpdHkuIEl0IHdvdWxkIGJlIGludGVyZXN0aW5nIHRvIGNvbXBhcmUgdGhlIHJlbGlhYmlsaXR5IHJlc3VsdHMgb2YgdGhlc2UgcGFydGljdWxhciBmYWN0b3JzIHRvIHNlZSBpZiB0aGVpciBhcHBlYXJzIHN0cm9uZ2VyIG9yIHdlYWtlciB0aGFuIHRoZSBhdmVyYWdlLiBUaGlzIHdvdWxkIGhlbHAgdG8gc2VlIGlmIHRoZXNlIGZpbmRpbmdzIHRydWx5IGFyZSByZWxpYWJsZSBvciBub3QuIA0K