1 Introduction

We are doing this research project to look at the level of student engagement and the overall academic experience with undergraduate students enrolled at two business schools in the US.

We will look at the relationship between some of these variables. The goal is to find areas that support or hurt student success and satisfaction at these universities.

The survey given includes the following sections:

  • Students’ Engagement in Learning

  • Student Learning Styles

  • Writing and Reading Load

  • Remedial Experience

  • Encouragement and Support

  • Growth and Development

  • Campus Resource Utilization

  • Retention

  • How Students Pay for College

The purpose of our analysis is to find patterns in student responses and examine how these factors correlate with a student’s sense of academic belonging, satisfaction, and potential persistence to graduation.

2 Data Management

This section will prepare the survey data for analysis by handling missing values across multiple sections of the questionnaire.

2.1 Students’ Engagement in Learning

2.2 Student Learning Styles

2.3 Writing and Reading Load

2.4 Remedial Experience

2.5 Encouragement and Support

2.6 Growth and Development

2.7 Campus Resource Utilization

2.8 Retention

2.9 How Students Pay for College

3 Reliability of the Analysis

We will now get an initial correlation matrix and make a decision on whether to scale our values if we have a variety of negatively correlated values or to compute our cronbachs alpha if our values are all positively correlated.

3.1 Students’ Engagement in Learning

From the correlation matrix we can see that we have a multitude of negatively correlated values. Due to this we will have to scale our values into different sub sections.

3.2 Student Learning Styles

We see from our correlation matrix of student learning styles section that we have high correlation between our questions.

Confidence Interval of Cronbach’s Alpha
LCI alpha UCI
0.8325 0.8508 0.8677

Looking at this, it shows we had a strong positive correlation matrix so, we decided to do a cronbachs alpha calculation. We got an alpha level of .8508 and a CI of (.8325, .8677). These values are very high which means we have a high level of internal consistency.

3.3 Writing and Reading Load

We see from our correlation matrix we have positive correlation. Since these are all positive we go ahead and perform a cronbachs alpha calculation.

Confidence Interval of Cronbach’s Alpha
LCI alpha UCI
0.3965 0.4703 0.5365

In the correlation matrix got a lower cronbachs alpha value of .4703 and CI of (.3965, .5365). With this value we cannot accept this section.

3.4 Remedial Experience

We see from this correlation matrix we have an all positive matrix. Since our values are positive we can go ahead and do a cronbachs alpha calculation.

Confidence Interval of Cronbach’s Alpha
LCI alpha UCI
0.8347 0.8521 0.8684

We got an alpha level of .8521 and a CI of (.8347, .8684). These values are very high which means we have a high level of internal consistency.

3.5 Encouragement and Support

The correlation matrix shows we have all positive values. Since our values are positive we can go ahead and do a cronbachs alpha calculation.

Confidence Interval of Cronbach’s Alpha
LCI alpha UCI
0.7851 0.8083 0.8298

We got a higher cronbachs value of .8083 and CI of (.7851, .8298). We can go ahead and say that we have high internal consistency between our questions.

3.6 Campus Resource Utilization

We see from the correlation matrix above that we have differing almost equal levels of positive and negative values so we will have to make some subsections of our observations for this section.

With this matrix we separated it into the 3 different scales. This did not help us at all in noticing any trends, instead we still see a lot of negative and positive correlation values. Since we cannot get these negative values out of the matrix we will not proceed with a cronbachs alpha calculation and assume that we cannot use this section.

3.7 Retention

This correlation matrix having every value positively correlated. So we can go ahead and calculate our cronbachs alpha.

Confidence Interval of Cronbach’s Alpha
LCI alpha UCI
0.8589 0.8747 0.8891

We got a high cronbachs alpha of .8747 and a CI of (.8589, .8891). So we can say that this section has high internal consistency.

3.8 How Students Pay for College

The matrix for this has a mix of both negative and positively correlated values so we cannot do a cronbachs alpha calculation. We now have to go ahead and sub section our How Students Pay for College section by personal income/savings and outside assistance.

The new matrix of just outside assistance has improved from the last matrix. All the values are positively correlated so, we can go ahead and perform a cronbachs alpha calculation.

Confidence Interval of Cronbach’s Alpha
LCI alpha UCI
0.5828 0.6309 0.6747

This has a smaller cronbach value of .6309 and CI of (.5828, .6747). Since our value is at .63 we are questionable on whether to use this questionnaire due to it being low.

4 PCA

This section presents the results of the PCA (principal component analysis). The significant principal components identified will be used in the analytic data set for use in regression modeling.

4.1 Students’ Engagement in Learning PCA

We first generate a plot to visually and statistically help us decide how many underlying dimensions are in our data for engagement. We do this before running PCA or using PCs in regression.

Our plot above shows that the appropriate amount of components will be around 2 so we go ahead and perform principle component analysis.

Factor loadings of the first few PCAs and the cumulative the proportion of variation explained by the corresponding PCAs in the Engagement Questionaire Survey.
PC1 PC2
q41 -0.241 0.202
q42 -0.280 0.050
q43 -0.229 -0.039
q44 -0.215 -0.184
q45 -0.074 -0.082
q46 -0.168 -0.284
q47 -0.265 0.030
q48 -0.204 0.220
q49 -0.254 0.163
q410 -0.018 -0.462
q411 -0.074 -0.470
q412 -0.285 0.047
q413 -0.273 -0.078
q414 -0.257 -0.130
q415 -0.187 -0.347
q416 -0.165 -0.278
q417 -0.278 0.164
q418 -0.286 0.105
q419 -0.222 0.134
q420 -0.237 0.144
q421 0.008 -0.156
Cumulative and proportion of variances explained by each the principal component in the engagement survey.
PC1 PC2
Standard deviation 2.487 1.701
Proportion of Variance 0.294 0.138
Cumulative Proportion 0.294 0.432

After looking at the PCA both show were little proportion with PC1 being 29.4% and PC2 being 13.8.

We see here that our graph appears to be skewed to the right. Further analysis will be need on whether to do a box cox transformation to fix the distributional issue in the regression residuals.

4.2 Student Learning Styles PCA

We see from the above plot that it suggests to use one principal component.

Factor loadings of the first few PCAs and the cumulative the proportion of variation explained by the corresponding PCAs in the Learning Style Questionaire Survey.
x
q51 0.279
q52 0.420
q53 0.454
q54 0.413
q55 0.453
q56 0.405
Cumulative and proportion of variances explained by each the principal component in the Learning Style survey.
x
Standard deviation 1.877
Proportion of Variance 0.587
Cumulative Proportion 0.587

The PCA has a larger amount of proportion of variance at around 59%.

The plot above shows that our distribution appears to be skewed to the right. We will need further analysis to see if we need to perform a box cox transformation to fix the distributional issue in the regression residuals.

4.3 Writing and Reading Load PCA

We see from the above plot that it suggests to use one principal component.

Factor loadings of the first few PCAs and the cumulative the proportion of variation explained by the corresponding PCAs in the Writing and Reading Questionaire Survey.
x
q61 0.676
q62 0.307
q63 0.670
Cumulative and proportion of variances explained by each the principal component in the writing and reading survey.
x
Standard deviation 1.216
Proportion of Variance 0.493
Cumulative Proportion 0.493

The PCA gives us around 49%.

We see from the distribution plot it is skewed to the right. We will need further analysis to see if we need to perform a box cox transformation.

4.4 Remedial Experience PCA

We see from the above plot that it suggests to use 2 principle components in our component analysis.

Factor loadings of the first few PCAs and the cumulative the proportion of variation explained by the corresponding PCAs in the Remedial Questionaire Survey.
PC1 PC2
q81 0.127 0.625
q82 0.318 -0.134
q83 0.394 -0.266
q84 0.395 -0.303
q85 0.363 -0.359
q86 0.354 0.035
q87 0.316 0.287
q88 0.321 0.299
q89 0.334 0.356
Cumulative and proportion of variances explained by each the principal component in the remedial survey.
PC1 PC2
Standard deviation 2.067 1.075
Proportion of Variance 0.475 0.128
Cumulative Proportion 0.475 0.603

PCA 1 has 47.5% of proportion of variance compared to our second component which only has 12.8%. We will only be using the first principle component.

The distribution in the table above is skewed to the left. So we will have to perform a box cox transformation to fix the distributional issue.

4.5 Encouragement and Support PCA

We see from the above table that it suggests us to use the first two principle components.

Factor loadings of the first few PCAs and the cumulative the proportion of variation explained by the corresponding PCAs in the Encouragement and Support Questionaire Survey.
PC1 PC2
q91 0.297 -0.378
q92 0.426 -0.162
q93 0.416 -0.178
q94 0.435 0.347
q95 0.430 0.331
q96 0.376 0.278
q97 0.203 -0.701
Cumulative and proportion of variances explained by each the principal component in the Encouragement and Support survey.
PC1 PC2
Standard deviation 1.832 1.102
Proportion of Variance 0.480 0.173
Cumulative Proportion 0.480 0.653

Our first component explains 48% of the total variance and the second component only explains 17% of the total variance. We will only be using the first component in our analysis.

We see from the above table that our distribution table is approximately normal.

4.6 Retention PCA

We see from the above table that it suggests for us to use one component.

Factor loadings of the first few PCAs and the cumulative the proportion of variation explained by the corresponding PCAs in the Retention Questionaire Survey.
x
q121 -0.458
q122 -0.461
q123 -0.439
q124 -0.455
q125 -0.422
Cumulative and proportion of variances explained by each the principal component in the Retention survey.
x
Standard deviation 1.835
Proportion of Variance 0.673
Cumulative Proportion 0.673

The first PC explains 67% of our total variance.

We see can see that our plot is skewed to the right so we might need to perform a box cox transformation. Also, further analysis is needed.

4.7 How Students Pay for College PCA

We see from the plot above that it suggests to use on PC.

Factor loadings of the first few PCAs and the cumulative the proportion of variation explained by the corresponding PCAs in the Pay Questionaire Survey.
x
q133 -0.418
q134 -0.586
q135 -0.528
q136 -0.451
Cumulative and proportion of variances explained by each the principal component in the pay survey.
x
Standard deviation 1.391
Proportion of Variance 0.484
Cumulative Proportion 0.484

The PC is 48.4% of the proportion of variance.

We see from the graph above that it is skewed to the right. We will need to perform a box cox transformation to fix the distributional issue.

5 Project Questions

  1. How well does student engagement in inside and outside the classroom predict their overall satisfaction with their college experience?

  2. Does how the student pays for school correlate with the students engagement in school?

My first question looks at the idea that students who are more actively engaged in their learning may feel more affiliated in their academic experience. The survey data that was provided to us shows a lot of detail on student engagement through the 21 questions (Section 4) given, making it a strong candidate for giving us enough variables representing engagement.

The second question is from the assumption if the student pays for their college than they would be more likely to be more engaged in their learning. Looking at these two together can offer meaningful insight into how much a student will be engaged based off if they payed for their school or if someone else did.

LS0tCnRpdGxlOiAiU3R1ZGVudCBTdXJ2ZXkiCmF1dGhvcjogIlJ5YW4gTGVibyIKZGF0ZTogIjIwMjUtMDQtMTkiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDQKICAgIHRvY19mbG9hdDogeWVzCiAgICBmaWdfd2lkdGg6IDQKICAgIGZpZ19jYXB0aW9uOiB5ZXMKICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgICB0b2NfY29sbGFwc2VkOiB5ZXMKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgY29kZV9kb3dubG9hZDogeWVzCiAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMKICAgIHRoZW1lOiBsdW1lbgogIHdvcmRfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiA0CiAgICBmaWdfY2FwdGlvbjogeWVzCiAgICBrZWVwX21kOiB5ZXMKICBwZGZfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiA0CiAgICBmaWdfY2FwdGlvbjogeWVzCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwogICAgZmlnX3dpZHRoOiAzCiAgICBmaWdfaGVpZ2h0OiAzCmVkaXRvcl9vcHRpb25zOgogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUKc2x3YXlzX2FsbG93X2h0bWw6IHRydWUKLS0tCgpgYGB7PWh0bWx9Cgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoKLyogQ2FzY2FkaW5nIFN0eWxlIFNoZWV0cyAoQ1NTKSBpcyBhIHN0eWxlc2hlZXQgbGFuZ3VhZ2UgdXNlZCB0byBkZXNjcmliZSB0aGUgcHJlc2VudGF0aW9uIG9mIGEgZG9jdW1lbnQgd3JpdHRlbiBpbiBIVE1MIG9yIFhNTC4gaXQgaXMgYSBzaW1wbGUgbWVjaGFuaXNtIGZvciBhZGRpbmcgc3R5bGUgKGUuZy4sIGZvbnRzLCBjb2xvcnMsIHNwYWNpbmcpIHRvIFdlYiBkb2N1bWVudHMuICovCgpoMS50aXRsZSB7ICAvKiBUaXRsZSAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgb2YgdGhlIHJlcG9ydCB0aXRsZSAqLwogIGZvbnQtc2l6ZTogMjRweDsKICBjb2xvcjogRGFya1JlZDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOwp9Cmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgYXV0aG9ycyAgKi8KICBmb250LXNpemU6IDIwcHg7CiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsKICBjb2xvcjogRGFya1JlZDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgdGhlIGRhdGUgICovCiAgZm9udC1zaXplOiAxOHB4OwogIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWk7CiAgY29sb3I6IERhcmtCbHVlOwogIHRleHQtYWxpZ246IGNlbnRlcjsKfQpoMSB7IC8qIEhlYWRlciAxIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgbGV2ZWwgMSBzZWN0aW9uIHRpdGxlICAqLwogICAgZm9udC1zaXplOiAyMnB4OwogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7CiAgICBjb2xvcjogbmF2eTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQpoMiB7IC8qIEhlYWRlciAyIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgbGV2ZWwgMiBzZWN0aW9uIHRpdGxlICovCiAgICBmb250LXNpemU6IDIwcHg7CiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsKICAgIGNvbG9yOiBuYXZ5OwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKaDMgeyAvKiBIZWFkZXIgMyAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgb2YgbGV2ZWwgMyBzZWN0aW9uIHRpdGxlICAqLwogICAgZm9udC1zaXplOiAxOHB4OwogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7CiAgICBjb2xvcjogbmF2eTsKICAgIHRleHQtYWxpZ246IGxlZnQ7Cn0KCmg0IHsgLyogSGVhZGVyIDQgLSBmb250IHNwZWNpZmljYXRpb25zIG9mIGxldmVsIDQgc2VjdGlvbiB0aXRsZSAgKi8KICAgIGZvbnQtc2l6ZTogMThweDsKICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOwogICAgY29sb3I6IGRhcmtyZWQ7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9Cgpib2R5IHsgYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsgfQoKLmhpZ2hsaWdodG1lIHsgYmFja2dyb3VuZC1jb2xvcjp5ZWxsb3c7IH0KCnAgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9Cgo8L3N0eWxlPgpgYGAKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CiMgRGV0ZWN0LCBpbnN0YWxsLCBhbmQgbG9hZCBwYWNrYWdlcyBpZiBuZWVkZWQuCmlmICghcmVxdWlyZSgidGlkeXZlcnNlIikpIHsKICAgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikKICAgbGlicmFyeSh0aWR5dmVyc2UpCn0KaWYgKCFyZXF1aXJlKCJHUEFyb3RhdGlvbiIpKSB7CiAgIGluc3RhbGwucGFja2FnZXMoIkdQQXJvdGF0aW9uIikKICAgbGlicmFyeShHUEFyb3RhdGlvbikKfQppZiAoIXJlcXVpcmUoIm5GYWN0b3JzIikpIHsKICAgaW5zdGFsbC5wYWNrYWdlcygibkZhY3RvcnMiKQogICBsaWJyYXJ5KG5GYWN0b3JzKQp9CmlmICghcmVxdWlyZSgicGFyYW1ldGVycyIpKSB7CiAgIGluc3RhbGwucGFja2FnZXMoInBhcmFtZXRlcnMiKQogICBsaWJyYXJ5KHBhcmFtZXRlcnMpCn0KaWYgKCFyZXF1aXJlKCJjb3JycGxvdCIpKSB7CiAgIGluc3RhbGwucGFja2FnZXMoImNvcnJwbG90IikKICAgbGlicmFyeShjb3JycGxvdCkKfQppZiAoIXJlcXVpcmUoImdnY29ycnBsb3QiKSkgewogICBpbnN0YWxsLnBhY2thZ2VzKCJnZ2NvcnJwbG90IikKICAgbGlicmFyeShnZ2NvcnJwbG90KQp9CmlmICghcmVxdWlyZSgiZ2dmb3J0aWZ5IikpIHsKICAgaW5zdGFsbC5wYWNrYWdlcygiZ2dmb3J0aWZ5IikKICAgbGlicmFyeShnZ2ZvcnRpZnkpCn0KaWYgKCFyZXF1aXJlKCJnZ3Bsb3QyIikpIHsKICAgaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpCiAgIGxpYnJhcnkoZ2dwbG90MikKfQppZiAoIXJlcXVpcmUoIkdHYWxseSIpKSB7CiAgIGluc3RhbGwucGFja2FnZXMoIkdHYWxseSIpCiAgIGxpYnJhcnkoR0dhbGx5KQp9CmlmICghcmVxdWlyZSgiR0dhbGx5IikpIHsKICAgaW5zdGFsbC5wYWNrYWdlcygiR0dhbGx5IikKICAgbGlicmFyeShHR2FsbHkpCn0KaWYgKCFyZXF1aXJlKCJDQ0EiKSkgewogICBpbnN0YWxsLnBhY2thZ2VzKCJDQ0EiKQogICBsaWJyYXJ5KENDQSkKfQppZiAoIXJlcXVpcmUoIm9sc3JyIikpIHsKICAgaW5zdGFsbC5wYWNrYWdlcygib2xzcnIiKQogICBsaWJyYXJ5KG9sc3JyKQp9CmlmICghcmVxdWlyZSgicHN5Y2giKSkgewogICBpbnN0YWxsLnBhY2thZ2VzKCJwc3ljaCIpCiAgIGxpYnJhcnkocHN5Y2gpCn0KaWYgKCFyZXF1aXJlKCJjb2Nyb24iKSkgewogICBpbnN0YWxsLnBhY2thZ2VzKCJjb2Nyb24iKQogICBsaWJyYXJ5KGNvY3JvbikKfQppZiAoIXJlcXVpcmUoImtuaXRyIikpIHsKICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKQogICBsaWJyYXJ5KGtuaXRyKQp9CmlmICghcmVxdWlyZSgicGFuZGVyIikpIHsKICAgaW5zdGFsbC5wYWNrYWdlcygicGFuZGVyIikKICAgbGlicmFyeShwYW5kZXIpCn0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgIAogICAgICAgICAgICAgICAgICAgd2FybmluZyA9IEZBTFNFLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBGQUxTRSwgIAogICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IFRSVUUsICAKICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBGQUxTRSAgIAogICAgICAgICAgICAgICAgICAgICAgKSAgIApgYGAKCmBgYHtyfQpkYXRhID0gcmVhZC5jc3YoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9SeWFuTGViby9yeWxlYm8vcmVmcy9oZWFkcy9tYWluL2F0LXJpc2stc3VydmV5LWRhdGEuY3N2IiwgaGVhZGVyID0gVFJVRSkKYGBgCgojIEludHJvZHVjdGlvbgoKV2UgYXJlIGRvaW5nIHRoaXMgcmVzZWFyY2ggcHJvamVjdCB0byBsb29rIGF0IHRoZSBsZXZlbCBvZiBzdHVkZW50IGVuZ2FnZW1lbnQgYW5kIHRoZSBvdmVyYWxsIGFjYWRlbWljIGV4cGVyaWVuY2Ugd2l0aCB1bmRlcmdyYWR1YXRlIHN0dWRlbnRzIGVucm9sbGVkIGF0IHR3byBidXNpbmVzcyBzY2hvb2xzIGluIHRoZSBVUy4KCldlIHdpbGwgbG9vayBhdCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gc29tZSBvZiB0aGVzZSB2YXJpYWJsZXMuIFRoZSBnb2FsIGlzIHRvIGZpbmQgYXJlYXMgdGhhdCBzdXBwb3J0IG9yIGh1cnQgc3R1ZGVudCBzdWNjZXNzIGFuZCBzYXRpc2ZhY3Rpb24gYXQgdGhlc2UgdW5pdmVyc2l0aWVzLgoKVGhlIHN1cnZleSBnaXZlbiBpbmNsdWRlcyB0aGUgZm9sbG93aW5nIHNlY3Rpb25zOgoKLSBTdHVkZW50cycgRW5nYWdlbWVudCBpbiBMZWFybmluZyAKCi0gU3R1ZGVudCBMZWFybmluZyBTdHlsZXMKCi0gV3JpdGluZyBhbmQgUmVhZGluZyBMb2FkIAoKLSBSZW1lZGlhbCBFeHBlcmllbmNlIAoKLSBFbmNvdXJhZ2VtZW50IGFuZCBTdXBwb3J0IAoKLSBHcm93dGggYW5kIERldmVsb3BtZW50IAoKLSBDYW1wdXMgUmVzb3VyY2UgVXRpbGl6YXRpb24KCi0gUmV0ZW50aW9uCgotIEhvdyBTdHVkZW50cyBQYXkgZm9yIENvbGxlZ2UgCgpUaGUgcHVycG9zZSBvZiBvdXIgYW5hbHlzaXMgaXMgdG8gZmluZCBwYXR0ZXJucyBpbiBzdHVkZW50IHJlc3BvbnNlcyBhbmQgZXhhbWluZSBob3cgdGhlc2UgZmFjdG9ycyBjb3JyZWxhdGUgd2l0aCBhIHN0dWRlbnQncyBzZW5zZSBvZiBhY2FkZW1pYyBiZWxvbmdpbmcsIHNhdGlzZmFjdGlvbiwgYW5kIHBvdGVudGlhbCBwZXJzaXN0ZW5jZSB0byBncmFkdWF0aW9uLgoKIyBEYXRhIE1hbmFnZW1lbnQKClRoaXMgc2VjdGlvbiB3aWxsIHByZXBhcmUgdGhlIHN1cnZleSBkYXRhIGZvciBhbmFseXNpcyBieSBoYW5kbGluZyBtaXNzaW5nIHZhbHVlcyBhY3Jvc3MgbXVsdGlwbGUgc2VjdGlvbnMgb2YgdGhlIHF1ZXN0aW9ubmFpcmUuCgpgYGB7cn0KbXkubW9kZSA9IGZ1bmN0aW9uKGRhdGFzZXQpewogIGZyZXEudGJsID0gdGFibGUoZGF0YXNldCkKICBtYXguZnJlcS5pZD13aGljaChmcmVxLnRibD09bWF4KGZyZXEudGJsKSkKICBtb2RlPW5hbWVzKGZyZXEudGJsW21heC5mcmVxLmlkXSkKICBhcy5udW1lcmljKG1vZGUpCn0KCmBgYAoKIyMgU3R1ZGVudHMnIEVuZ2FnZW1lbnQgaW4gTGVhcm5pbmcgCgpgYGB7cn0KZW5nYWdlbWVudCA9IGRhdGFbLCA0OjI0XQojIEltcHV0aW5nIHdpdGggdGhlIG1vZGUgaW4gZWFjaCBzdXJ2ZXkgaXRlbQpmb3IgKGkgaW4gMToyMSkgewogIGVuZ2FnZW1lbnRbLGldW2lzLm5hKGVuZ2FnZW1lbnRbLGldKV09bXkubW9kZShlbmdhZ2VtZW50WyxpXSkKfQoKYGBgCgojIyBTdHVkZW50IExlYXJuaW5nIFN0eWxlcwoKYGBge3J9CkxlYXJuU3R5bGUgPSBkYXRhWywgMjU6MzBdCiMgSW1wdXRpbmcgd2l0aCB0aGUgbW9kZSBpbiBlYWNoIHN1cnZleSBpdGVtCmZvciAoaSBpbiAxOjYpIHsKICBMZWFyblN0eWxlWyxpXVtpcy5uYShMZWFyblN0eWxlWyxpXSldPW15Lm1vZGUoTGVhcm5TdHlsZVssaV0pCn0KCmBgYAoKIyMgV3JpdGluZyBhbmQgUmVhZGluZyBMb2FkIAoKYGBge3J9CldyaVJlYWQgPSBkYXRhWywgMzE6MzNdCiMgSW1wdXRpbmcgd2l0aCB0aGUgbW9kZSBpbiBlYWNoIHN1cnZleSBpdGVtCmZvciAoaSBpbiAxOjMpIHsKICBXcmlSZWFkWyxpXVtpcy5uYShXcmlSZWFkWyxpXSldPW15Lm1vZGUoV3JpUmVhZFssaV0pCn0KCmBgYAoKIyMgUmVtZWRpYWwgRXhwZXJpZW5jZSAKCmBgYHtyfQpSZW1lZCA9IGRhdGFbLCAzNTo0M10KIyBJbXB1dGluZyB3aXRoIHRoZSBtb2RlIGluIGVhY2ggc3VydmV5IGl0ZW0KZm9yIChpIGluIDE6OSkgewogIFJlbWVkWyxpXVtpcy5uYShSZW1lZFssaV0pXT1teS5tb2RlKFJlbWVkWyxpXSkKfQoKYGBgCgojIyBFbmNvdXJhZ2VtZW50IGFuZCBTdXBwb3J0IAoKYGBge3J9CkVuZ2NuU3VwcCA9IGRhdGFbLCA0NDo1MF0KIyBJbXB1dGluZyB3aXRoIHRoZSBtb2RlIGluIGVhY2ggc3VydmV5IGl0ZW0KZm9yIChpIGluIDE6NykgewogIEVuZ2NuU3VwcFssaV1baXMubmEoRW5nY25TdXBwWyxpXSldPW15Lm1vZGUoRW5nY25TdXBwWyxpXSkKfQoKYGBgCgojIyBHcm93dGggYW5kIERldmVsb3BtZW50IAoKCmBgYHtyfQpHcm93bkRldiA9IGRhdGFbLCA1MTo2NV0KIyBJbXB1dGluZyB3aXRoIHRoZSBtb2RlIGluIGVhY2ggc3VydmV5IGl0ZW0KZm9yIChpIGluIDE6MTUpIHsKICBHcm93bkRldlssaV1baXMubmEoR3Jvd25EZXZbLGldKV09bXkubW9kZShHcm93bkRldlssaV0pCn0KCmBgYAoKIyMgQ2FtcHVzIFJlc291cmNlIFV0aWxpemF0aW9uIAoKYGBge3J9ClJlc291cmNlID0gZGF0YVssIDY2Ojk4XQojIEltcHV0aW5nIHdpdGggdGhlIG1vZGUgaW4gZWFjaCBzdXJ2ZXkgaXRlbQpmb3IgKGkgaW4gMTozMykgewogIFJlc291cmNlWyxpXVtpcy5uYShSZXNvdXJjZVssaV0pXT1teS5tb2RlKFJlc291cmNlWyxpXSkKfQoKYGBgCgojIyBSZXRlbnRpb24gCgpgYGB7cn0KUmV0ZW50aW9uID0gZGF0YVssIDk5OjEwM10KIyBJbXB1dGluZyB3aXRoIHRoZSBtb2RlIGluIGVhY2ggc3VydmV5IGl0ZW0KZm9yIChpIGluIDE6NSkgewogIFJldGVudGlvblssaV1baXMubmEoUmV0ZW50aW9uWyxpXSldPW15Lm1vZGUoUmV0ZW50aW9uWyxpXSkKfQoKYGBgCgojIyBIb3cgU3R1ZGVudHMgUGF5IGZvciBDb2xsZWdlIAoKYGBge3J9ClBheSA9IGRhdGFbLCAxMDQ6MTA5XQojIEltcHV0aW5nIHdpdGggdGhlIG1vZGUgaW4gZWFjaCBzdXJ2ZXkgaXRlbQpmb3IgKGkgaW4gMTo2KSB7CiAgUGF5WyxpXVtpcy5uYShQYXlbLGldKV09bXkubW9kZShQYXlbLGldKQp9CgpgYGAKCgojIFJlbGlhYmlsaXR5IG9mIHRoZSBBbmFseXNpcwoKV2Ugd2lsbCBub3cgZ2V0IGFuIGluaXRpYWwgY29ycmVsYXRpb24gbWF0cml4IGFuZCBtYWtlIGEgZGVjaXNpb24gb24gd2hldGhlciB0byBzY2FsZSBvdXIgdmFsdWVzIGlmIHdlIGhhdmUgYSB2YXJpZXR5IG9mIG5lZ2F0aXZlbHkgY29ycmVsYXRlZCB2YWx1ZXMgb3IgdG8gY29tcHV0ZSBvdXIgY3JvbmJhY2hzIGFscGhhIGlmIG91ciB2YWx1ZXMgYXJlIGFsbCBwb3NpdGl2ZWx5IGNvcnJlbGF0ZWQuIAoKCiMjIFN0dWRlbnRzJyBFbmdhZ2VtZW50IGluIExlYXJuaW5nIAoKYGBge3J9Ck09Y29yKGVuZ2FnZW1lbnQpCmNvcnJwbG90Lm1peGVkKE0sIGxvd2VyLmNvbCA9ICJwdXJwbGUiLCB1cHBlciA9ICJlbGxpcHNlIiwgbnVtYmVyLmNleCA9IC43LCB0bC5jZXggPSAwLjcpCgpgYGAKCkZyb20gdGhlIGNvcnJlbGF0aW9uIG1hdHJpeCB3ZSBjYW4gc2VlIHRoYXQgd2UgaGF2ZSBhIG11bHRpdHVkZSBvZiBuZWdhdGl2ZWx5IGNvcnJlbGF0ZWQgdmFsdWVzLiBEdWUgdG8gdGhpcyB3ZSB3aWxsIGhhdmUgdG8gc2NhbGUgb3VyIHZhbHVlcyBpbnRvIGRpZmZlcmVudCBzdWIgc2VjdGlvbnMuIAoKCgojIyBTdHVkZW50IExlYXJuaW5nIFN0eWxlcwoKYGBge3J9Ck09Y29yKExlYXJuU3R5bGUpCmNvcnJwbG90Lm1peGVkKE0sIGxvd2VyLmNvbCA9ICJwdXJwbGUiLCB1cHBlciA9ICJlbGxpcHNlIiwgbnVtYmVyLmNleCA9IC43LCB0bC5jZXggPSAwLjcpCgpgYGAKCldlIHNlZSBmcm9tIG91ciBjb3JyZWxhdGlvbiBtYXRyaXggb2Ygc3R1ZGVudCBsZWFybmluZyBzdHlsZXMgc2VjdGlvbiB0aGF0IHdlIGhhdmUgaGlnaCBjb3JyZWxhdGlvbiBiZXR3ZWVuIG91ciBxdWVzdGlvbnMuIAoKYGBge3J9CmNyb25iYWNoLmxlYSA9IGFzLm51bWVyaWMocHN5Y2g6OmFscGhhKExlYXJuU3R5bGUpJHRvdGFsWzFdKQoKQ0kubGVhID0gY3JvbmJhY2guYWxwaGEuQ0koYWxwaGEgPSBjcm9uYmFjaC5sZWEsIG4gPSA2NjQsIGl0ZW1zID0gNiwgY29uZi5sZXZlbCA9IDAuOTUpCgpDSS5MZWFyblN0eWxlID0gY2JpbmQoTENJID0gQ0kubGVhWzFdLCBhbHBoYSA9IGNyb25iYWNoLmxlYSwgVUNJID0gQ0kubGVhWzJdKQpyb3cubmFtZXMoQ0kuTGVhcm5TdHlsZSkgPSAiIgoKcGFuZGVyKENJLkxlYXJuU3R5bGUsIGNhcHRpb24gPSAiQ29uZmlkZW5jZSBJbnRlcnZhbCBvZiBDcm9uYmFjaCdzIEFscGhhIikKCmBgYAoKTG9va2luZyBhdCB0aGlzLCBpdCBzaG93cyB3ZSBoYWQgYSBzdHJvbmcgcG9zaXRpdmUgY29ycmVsYXRpb24gbWF0cml4IHNvLCB3ZSBkZWNpZGVkIHRvIGRvIGEgY3JvbmJhY2hzIGFscGhhIGNhbGN1bGF0aW9uLiBXZSBnb3QgYW4gYWxwaGEgbGV2ZWwgb2YgLjg1MDggYW5kIGEgQ0kgb2YgKC44MzI1LCAuODY3NykuIFRoZXNlIHZhbHVlcyBhcmUgdmVyeSBoaWdoIHdoaWNoIG1lYW5zIHdlIGhhdmUgYSBoaWdoIGxldmVsIG9mIGludGVybmFsIGNvbnNpc3RlbmN5LgoKIyMgV3JpdGluZyBhbmQgUmVhZGluZyBMb2FkIAoKYGBge3J9CgpNPWNvcihXcmlSZWFkKQpjb3JycGxvdC5taXhlZChNLCBsb3dlci5jb2wgPSAicHVycGxlIiwgdXBwZXIgPSAiZWxsaXBzZSIsIG51bWJlci5jZXggPSAuNywgdGwuY2V4ID0gMC43KQoKYGBgCgpXZSBzZWUgZnJvbSBvdXIgY29ycmVsYXRpb24gbWF0cml4IHdlIGhhdmUgcG9zaXRpdmUgY29ycmVsYXRpb24uIFNpbmNlIHRoZXNlIGFyZSBhbGwgcG9zaXRpdmUgd2UgZ28gYWhlYWQgYW5kIHBlcmZvcm0gYSBjcm9uYmFjaHMgYWxwaGEgY2FsY3VsYXRpb24uIAoKYGBge3J9CmNyb25iYWNoLndyaSA9IGFzLm51bWVyaWMocHN5Y2g6OmFscGhhKFdyaVJlYWQpJHRvdGFsWzFdKQoKQ0kud3JpID0gY3JvbmJhY2guYWxwaGEuQ0koYWxwaGEgPSBjcm9uYmFjaC53cmksIG4gPSA2NjQsIGl0ZW1zID0gMywgY29uZi5sZXZlbCA9IDAuOTUpCgpDSS5XcmlSZWFkID0gY2JpbmQoTENJID0gQ0kud3JpWzFdLCBhbHBoYSA9IGNyb25iYWNoLndyaSwgVUNJID0gQ0kud3JpWzJdKQpyb3cubmFtZXMoQ0kuV3JpUmVhZCkgPSAiIgoKcGFuZGVyKENJLldyaVJlYWQsIGNhcHRpb24gPSAiQ29uZmlkZW5jZSBJbnRlcnZhbCBvZiBDcm9uYmFjaCdzIEFscGhhIikKCmBgYAoKSW4gdGhlIGNvcnJlbGF0aW9uIG1hdHJpeCBnb3QgYSBsb3dlciBjcm9uYmFjaHMgYWxwaGEgdmFsdWUgb2YgLjQ3MDMgYW5kIENJIG9mICguMzk2NSwgLjUzNjUpLiBXaXRoIHRoaXMgdmFsdWUgd2UgY2Fubm90IGFjY2VwdCB0aGlzIHNlY3Rpb24uIAoKIyMgUmVtZWRpYWwgRXhwZXJpZW5jZSAKCmBgYHtyfQpNPWNvcihSZW1lZCkKY29ycnBsb3QubWl4ZWQoTSwgbG93ZXIuY29sID0gInB1cnBsZSIsIHVwcGVyID0gImVsbGlwc2UiLCBudW1iZXIuY2V4ID0gLjcsIHRsLmNleCA9IDAuNykKCmBgYAoKV2Ugc2VlIGZyb20gdGhpcyBjb3JyZWxhdGlvbiBtYXRyaXggd2UgaGF2ZSBhbiBhbGwgcG9zaXRpdmUgbWF0cml4LiBTaW5jZSBvdXIgdmFsdWVzIGFyZSBwb3NpdGl2ZSB3ZSBjYW4gZ28gYWhlYWQgYW5kIGRvIGEgY3JvbmJhY2hzIGFscGhhIGNhbGN1bGF0aW9uLgoKYGBge3J9CmNyb25iYWNoLnJlbSA9IGFzLm51bWVyaWMocHN5Y2g6OmFscGhhKFJlbWVkKSR0b3RhbFsxXSkKCkNJLnJlbSA9IGNyb25iYWNoLmFscGhhLkNJKGFscGhhID0gY3JvbmJhY2gucmVtLCBuID0gNjY0LCBpdGVtcyA9IDksIGNvbmYubGV2ZWwgPSAwLjk1KQoKQ0kucmVtZWRpYWwgPSBjYmluZChMQ0kgPSBDSS5yZW1bMV0sIGFscGhhID0gY3JvbmJhY2gucmVtLCBVQ0kgPSBDSS5yZW1bMl0pCnJvdy5uYW1lcyhDSS5yZW1lZGlhbCkgPSAiIgoKcGFuZGVyKENJLnJlbWVkaWFsLCBjYXB0aW9uID0gIkNvbmZpZGVuY2UgSW50ZXJ2YWwgb2YgQ3JvbmJhY2gncyBBbHBoYSIpCgpgYGAKCldlIGdvdCBhbiBhbHBoYSBsZXZlbCBvZiAuODUyMSBhbmQgYSBDSSBvZiAoLjgzNDcsIC44Njg0KS4gVGhlc2UgdmFsdWVzIGFyZSB2ZXJ5IGhpZ2ggd2hpY2ggbWVhbnMgd2UgaGF2ZSBhIGhpZ2ggbGV2ZWwgb2YgaW50ZXJuYWwgY29uc2lzdGVuY3kuCgojIyBFbmNvdXJhZ2VtZW50IGFuZCBTdXBwb3J0IAoKYGBge3J9Ck09Y29yKEVuZ2NuU3VwcCkKY29ycnBsb3QubWl4ZWQoTSwgbG93ZXIuY29sID0gInB1cnBsZSIsIHVwcGVyID0gImVsbGlwc2UiLCBudW1iZXIuY2V4ID0gLjcsIHRsLmNleCA9IDAuNykKCmBgYAoKVGhlIGNvcnJlbGF0aW9uIG1hdHJpeCBzaG93cyB3ZSBoYXZlIGFsbCBwb3NpdGl2ZSB2YWx1ZXMuIFNpbmNlIG91ciB2YWx1ZXMgYXJlIHBvc2l0aXZlIHdlIGNhbiBnbyBhaGVhZCBhbmQgZG8gYSBjcm9uYmFjaHMgYWxwaGEgY2FsY3VsYXRpb24uCgpgYGB7cn0KY3JvbmJhY2guZW5jID0gYXMubnVtZXJpYyhwc3ljaDo6YWxwaGEoRW5nY25TdXBwKSR0b3RhbFsxXSkKCkNJLmVuYyA9IGNyb25iYWNoLmFscGhhLkNJKGFscGhhID0gY3JvbmJhY2guZW5jLCBuID0gNjY0LCBpdGVtcyA9IDcsIGNvbmYubGV2ZWwgPSAwLjk1KQoKQ0kuRW5nY25TdXBwID0gY2JpbmQoTENJID0gQ0kuZW5jWzFdLCBhbHBoYSA9IGNyb25iYWNoLmVuYywgVUNJID0gQ0kuZW5jWzJdKQpyb3cubmFtZXMoQ0kuRW5nY25TdXBwKSA9ICIiCgpwYW5kZXIoQ0kuRW5nY25TdXBwLCBjYXB0aW9uID0gIkNvbmZpZGVuY2UgSW50ZXJ2YWwgb2YgQ3JvbmJhY2gncyBBbHBoYSIpCgpgYGAKCldlIGdvdCBhIGhpZ2hlciBjcm9uYmFjaHMgdmFsdWUgb2YgLjgwODMgYW5kIENJIG9mICguNzg1MSwgLjgyOTgpLiBXZSBjYW4gZ28gYWhlYWQgYW5kIHNheSB0aGF0IHdlIGhhdmUgaGlnaCBpbnRlcm5hbCBjb25zaXN0ZW5jeSBiZXR3ZWVuIG91ciBxdWVzdGlvbnMuCgojIyBDYW1wdXMgUmVzb3VyY2UgVXRpbGl6YXRpb24KCmBgYHtyfQpNPWNvcihSZXNvdXJjZSkKY29ycnBsb3QubWl4ZWQoTSwgbG93ZXIuY29sID0gInB1cnBsZSIsIHVwcGVyID0gImVsbGlwc2UiLCBudW1iZXIuY2V4ID0gLjcsIHRsLmNleCA9IDAuNykKCmBgYAoKV2Ugc2VlIGZyb20gdGhlIGNvcnJlbGF0aW9uIG1hdHJpeCBhYm92ZSB0aGF0IHdlIGhhdmUgZGlmZmVyaW5nIGFsbW9zdCBlcXVhbCBsZXZlbHMgb2YgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHZhbHVlcyBzbyB3ZSB3aWxsIGhhdmUgdG8gbWFrZSBzb21lIHN1YnNlY3Rpb25zIG9mIG91ciBvYnNlcnZhdGlvbnMgZm9yIHRoaXMgc2VjdGlvbi4gCgoKYGBge3J9CgpSZXNvdXJjZV9GUyA9IGNiaW5kKFJlc291cmNlJHExMTEuMSwgUmVzb3VyY2UkcTExMi4xLCBSZXNvdXJjZSRxMTEzLjEsIAogICAgICAgICAgICAgICAgICAgIFJlc291cmNlJHExMTQuMSwgUmVzb3VyY2UkcTExNS4xLCBSZXNvdXJjZSRxMTE2LjEsIAogICAgICAgICAgICAgICAgICAgIFJlc291cmNlJHExMTcuMSwgUmVzb3VyY2UkcTExOC4xLCBSZXNvdXJjZSRxMTE5LjEsCiAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2UkcTExMTAuMSwgUmVzb3VyY2UkcTExMTEuMSkKCgpSZXNvdXJjZV9TUyA9IGNiaW5kKFJlc291cmNlJHExMTEuMiwgUmVzb3VyY2UkcTExMi4yLCBSZXNvdXJjZSRxMTEzLjIsIAogICAgICAgICAgICAgICAgICAgIFJlc291cmNlJHExMTQuMiwgUmVzb3VyY2UkcTExNS4yLCBSZXNvdXJjZSRxMTE2LjIsIAogICAgICAgICAgICAgICAgICAgIFJlc291cmNlJHExMTcuMiwgUmVzb3VyY2UkcTExOC4yLCBSZXNvdXJjZSRxMTE5LjIsCiAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2UkcTExMTAuMiwgUmVzb3VyY2UkcTExMTEuMikKCgpSZXNvdXJjZV9JUyA9IGNiaW5kKFJlc291cmNlJHExMTEuMywgUmVzb3VyY2UkcTExMi4zLCBSZXNvdXJjZSRxMTEzLjMsIAogICAgICAgICAgICAgICAgICAgIFJlc291cmNlJHExMTQuMywgUmVzb3VyY2UkcTExNS4zLCBSZXNvdXJjZSRxMTE2LjMsIAogICAgICAgICAgICAgICAgICAgIFJlc291cmNlJHExMTcuMywgUmVzb3VyY2UkcTExOC4zLCBSZXNvdXJjZSRxMTE5LjMsCiAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2UkcTExMTAuMywgUmVzb3VyY2UkcTExMTEuMykKCgoKCk0gPSBjb3IoY2JpbmQoUmVzb3VyY2VfRlMsIFJlc291cmNlX1NTLCBSZXNvdXJjZV9JUykpCmNvcnJwbG90Lm1peGVkKE0sIGxvd2VyLmNvbCA9ICJwdXJwbGUiLCB1cHBlciA9ICJlbGxpcHNlIiwgCiAgICAgICAgICAgICAgIG51bWJlci5jZXggPSAwLjcsIHRsLmNleCA9IDAuNykKCgpgYGAKCldpdGggdGhpcyBtYXRyaXggd2Ugc2VwYXJhdGVkIGl0IGludG8gdGhlIDMgZGlmZmVyZW50IHNjYWxlcy4gVGhpcyBkaWQgbm90IGhlbHAgdXMgYXQgYWxsIGluIG5vdGljaW5nIGFueSB0cmVuZHMsIGluc3RlYWQgd2Ugc3RpbGwgc2VlIGEgbG90IG9mIG5lZ2F0aXZlIGFuZCBwb3NpdGl2ZSBjb3JyZWxhdGlvbiB2YWx1ZXMuIFNpbmNlIHdlIGNhbm5vdCBnZXQgdGhlc2UgbmVnYXRpdmUgdmFsdWVzIG91dCBvZiB0aGUgbWF0cml4IHdlIHdpbGwgbm90IHByb2NlZWQgd2l0aCBhIGNyb25iYWNocyBhbHBoYSBjYWxjdWxhdGlvbiBhbmQgYXNzdW1lIHRoYXQgd2UgY2Fubm90IHVzZSB0aGlzIHNlY3Rpb24uIAoKCiMjIFJldGVudGlvbgoKYGBge3J9Ck09Y29yKFJldGVudGlvbikKY29ycnBsb3QubWl4ZWQoTSwgbG93ZXIuY29sID0gInB1cnBsZSIsIHVwcGVyID0gImVsbGlwc2UiLCBudW1iZXIuY2V4ID0gLjcsIHRsLmNleCA9IDAuNykKCgpgYGAKClRoaXMgY29ycmVsYXRpb24gbWF0cml4IGhhdmluZyBldmVyeSB2YWx1ZSBwb3NpdGl2ZWx5IGNvcnJlbGF0ZWQuIFNvIHdlIGNhbiBnbyBhaGVhZCBhbmQgY2FsY3VsYXRlIG91ciBjcm9uYmFjaHMgYWxwaGEuCgpgYGB7cn0KY3JvbmJhY2gucmV0ID0gYXMubnVtZXJpYyhwc3ljaDo6YWxwaGEoUmV0ZW50aW9uKSR0b3RhbFsxXSkKCkNJLnJldCA9IGNyb25iYWNoLmFscGhhLkNJKGFscGhhID0gY3JvbmJhY2gucmV0LCBuID0gNjY0LCBpdGVtcyA9IDUsIGNvbmYubGV2ZWwgPSAwLjk1KQoKQ0kuUmV0ZW50aW9uID0gY2JpbmQoTENJID0gQ0kucmV0WzFdLCBhbHBoYSA9IGNyb25iYWNoLnJldCwgVUNJID0gQ0kucmV0WzJdKQpyb3cubmFtZXMoQ0kuUmV0ZW50aW9uKSA9ICIiCgpwYW5kZXIoQ0kuUmV0ZW50aW9uLCBjYXB0aW9uID0gIkNvbmZpZGVuY2UgSW50ZXJ2YWwgb2YgQ3JvbmJhY2gncyBBbHBoYSIpCgpgYGAKCldlIGdvdCBhIGhpZ2ggY3JvbmJhY2hzIGFscGhhIG9mIC44NzQ3IGFuZCBhIENJIG9mICguODU4OSwgLjg4OTEpLiBTbyB3ZSBjYW4gc2F5IHRoYXQgdGhpcyBzZWN0aW9uIGhhcyBoaWdoIGludGVybmFsIGNvbnNpc3RlbmN5LiAKCiMjIEhvdyBTdHVkZW50cyBQYXkgZm9yIENvbGxlZ2UgCgpgYGB7cn0KTT1jb3IoUGF5KQpjb3JycGxvdC5taXhlZChNLCBsb3dlci5jb2wgPSAicHVycGxlIiwgdXBwZXIgPSAiZWxsaXBzZSIsIG51bWJlci5jZXggPSAuNywgdGwuY2V4ID0gMC43KQoKYGBgCgpUaGUgbWF0cml4IGZvciB0aGlzIGhhcyBhIG1peCBvZiBib3RoIG5lZ2F0aXZlIGFuZCBwb3NpdGl2ZWx5IGNvcnJlbGF0ZWQgdmFsdWVzIHNvIHdlIGNhbm5vdCBkbyBhIGNyb25iYWNocyBhbHBoYSBjYWxjdWxhdGlvbi4gV2Ugbm93IGhhdmUgdG8gZ28gYWhlYWQgYW5kIHN1YiBzZWN0aW9uIG91ciBIb3cgU3R1ZGVudHMgUGF5IGZvciBDb2xsZWdlIHNlY3Rpb24gYnkgcGVyc29uYWwgaW5jb21lL3NhdmluZ3MgYW5kIG91dHNpZGUgYXNzaXN0YW5jZS4gCgpgYGB7cn0KCnBlcnNvbmFsX2luY29tZV9zYXZlID0gY2JpbmQocTQxMzEgPSBQYXkkcTQxMzEsIHExMzIgPSBQYXkkcTEzMikKCm91dHNpZGVfYXNzaXN0YW5jZSA9IGNiaW5kKHExMzM9UGF5JHExMzMsIHExMzQ9UGF5JHExMzQsIHExMzU9UGF5JHExMzUsIHExMzY9UGF5JHExMzYpCgoKcGF5X2l0ZW1zID0gY2JpbmQob3V0c2lkZV9hc3Npc3RhbmNlLCBwZXJzb25hbF9pbmNvbWVfc2F2ZSApCgpNPWNvcihvdXRzaWRlX2Fzc2lzdGFuY2UpCmNvcnJwbG90Lm1peGVkKE0sIGxvd2VyLmNvbCA9ICJwdXJwbGUiLCB1cHBlciA9ICJlbGxpcHNlIiwgbnVtYmVyLmNleCA9IC43LCB0bC5jZXggPSAwLjcpCgpgYGAKVGhlIG5ldyBtYXRyaXggb2YganVzdCBvdXRzaWRlIGFzc2lzdGFuY2UgaGFzIGltcHJvdmVkIGZyb20gdGhlIGxhc3QgbWF0cml4LiBBbGwgdGhlIHZhbHVlcyBhcmUgcG9zaXRpdmVseSBjb3JyZWxhdGVkIHNvLCB3ZSBjYW4gZ28gYWhlYWQgYW5kIHBlcmZvcm0gYSBjcm9uYmFjaHMgYWxwaGEgY2FsY3VsYXRpb24uIAoKYGBge3J9CmNyb25iYWNoLnBheSA9IGFzLm51bWVyaWMocHN5Y2g6OmFscGhhKG91dHNpZGVfYXNzaXN0YW5jZSkkdG90YWxbMV0pCgpDSS5wYXkgPSBjcm9uYmFjaC5hbHBoYS5DSShhbHBoYSA9IGNyb25iYWNoLnBheSwgbiA9IDY2NCwgaXRlbXMgPSA0LCBjb25mLmxldmVsID0gMC45NSkKCkNJLlBheW1lbnQgPSBjYmluZChMQ0kgPSBDSS5wYXlbMV0sIGFscGhhID0gY3JvbmJhY2gucGF5LCBVQ0kgPSBDSS5wYXlbMl0pCnJvdy5uYW1lcyhDSS5QYXltZW50KSA9ICIiCgpwYW5kZXIoQ0kuUGF5bWVudCwgY2FwdGlvbiA9ICJDb25maWRlbmNlIEludGVydmFsIG9mIENyb25iYWNoJ3MgQWxwaGEiKQoKYGBgCgpUaGlzIGhhcyBhIHNtYWxsZXIgY3JvbmJhY2ggdmFsdWUgb2YgLjYzMDkgYW5kIENJIG9mICguNTgyOCwgLjY3NDcpLiBTaW5jZSBvdXIgdmFsdWUgaXMgYXQgLjYzIHdlIGFyZSBxdWVzdGlvbmFibGUgb24gd2hldGhlciB0byB1c2UgdGhpcyBxdWVzdGlvbm5haXJlIGR1ZSB0byBpdCBiZWluZyBsb3cuIAoKCiMgUENBClRoaXMgc2VjdGlvbiBwcmVzZW50cyB0aGUgcmVzdWx0cyBvZiB0aGUgUENBIChwcmluY2lwYWwgY29tcG9uZW50IGFuYWx5c2lzKS4gVGhlIHNpZ25pZmljYW50IHByaW5jaXBhbCBjb21wb25lbnRzIGlkZW50aWZpZWQgd2lsbCBiZSB1c2VkIGluIHRoZSBhbmFseXRpYyBkYXRhIHNldCBmb3IgdXNlIGluIHJlZ3Jlc3Npb24gbW9kZWxpbmcuCgoKYGBge3J9Ck15LnBsb3RuU2NyZWUgPSBmdW5jdGlvbihtYXQsIGxlZ2VuZCA9IFRSVUUsIG1ldGhvZCA9ImZhY3RvcnMiLCBtYWluKXsKCiAgCiAgICBldiA8LSBlaWdlbihjb3IobWF0KSkgICAgIyBnZXQgZWlnZW52YWx1ZXMKICAgIGFwIDwtIHBhcmFsbGVsKHN1YmplY3Q9bnJvdyhtYXQpLHZhcj1uY29sKG1hdCksIHJlcD01MDAwLGNlbnQ9LjA1KQogICAgblNjcmVlID0gblNjcmVlKHg9ZXYkdmFsdWVzLCBhcGFyYWxsZWw9YXAkZWlnZW4kcWV2cGVhLCBtb2RlbD1tZXRob2QpICAKICAgIAogICAgaWYgKCFpbmhlcml0cyhuU2NyZWUsICJuU2NyZWUiKSkgCiAgICAgICAgc3RvcCgiTWV0aG9kIGlzIG9ubHkgZm9yIG5TY3JlZSBvYmplY3RzIikKICAgIGlmIChuU2NyZWUkTW9kZWwgPT0gImNvbXBvbmVudHMiKSAKICAgICAgICBua2Fpc2VyID0gIkVpZ2VudmFsdWVzID4gbWVhbjogbiA9ICIKICAgIGlmIChuU2NyZWUkTW9kZWwgPT0gImZhY3RvcnMiKSAKICAgICAgbmthaXNlciA9ICJFaWdlbnZhbHVlcyA+IHplcm86IG4gPSAiCiAgICAKICAgIHhsYWIgPSBuU2NyZWUkTW9kZWwKICAgIHlsYWIgPSAiRWlnZW52YWx1ZXMiCiAgICAKICAgIHBhcihjb2wgPSAxLCBwY2ggPSAxOCkKICAgIHBhcihtZnJvdyA9IGMoMSwgMSkpCiAgICBlaWcgPC0gblNjcmVlJEFuYWx5c2lzJEVpZ2VudmFsdWVzCiAgICBrIDwtIDE6bGVuZ3RoKGVpZykKICAgIHBsb3QoMTpsZW5ndGgoZWlnKSwgZWlnLCB0eXBlPSJiIiwgbWFpbiA9IG1haW4sIAogICAgICAgIHhsYWIgPSB4bGFiLCB5bGFiID0geWxhYiwgeWxpbT1jKDAsIDEuMiptYXgoZWlnKSkpCiAgICAKICAgIG5rIDwtIGxlbmd0aChlaWcpCiAgICBub2MgPC0gblNjcmVlJENvbXBvbmVudHMkbm9jCiAgICB2cC5wIDwtIGxtKGVpZ1tjKG5vYyArIDEsIG5rKV0gfiBrW2Mobm9jICsgMSwgbmspXSkKICAgIHggPC0gc3VtKGMoMSwgMSkgKiBjb2VmKHZwLnApKQogICAgeSA8LSBzdW0oYygxLCBuaykgKiBjb2VmKHZwLnApKQogICAgcGFyKGNvbCA9IDEwKQogICAgbGluZXMoa1tjKDEsIG5rKV0sIGMoeCwgeSkpCiAgICBwYXIoY29sID0gMTEsIHBjaCA9IDIwKQogICAgbGluZXMoMTpuaywgblNjcmVlJEFuYWx5c2lzJFBhci5BbmFseXNpcywgdHlwZSA9ICJiIikKICAgIGlmIChsZWdlbmQgPT0gVFJVRSkgewogICAgICAgIGxlZy50eHQgPC0gYyhwYXN0ZShua2Fpc2VyLCBuU2NyZWUkQ29tcG9uZW50cyRua2Fpc2VyKSwgCiAgICAgICAgICAgICAgICAgICBjKHBhc3RlKCJQYXJhbGxlbCBBbmFseXNpczogbiA9ICIsIG5TY3JlZSRDb21wb25lbnRzJG5wYXJhbGxlbCkpLCAKICAgICAgICAgICAgICAgICAgIGMocGFzdGUoIk9wdGltYWwgQ29vcmRpbmF0ZXM6IG4gPSAiLCBuU2NyZWUkQ29tcG9uZW50cyRub2MpKSwgCiAgICAgICAgICAgICAgICAgICBjKHBhc3RlKCJBY2NlbGVyYXRpb24gRmFjdG9yOiBuID0gIiwgblNjcmVlJENvbXBvbmVudHMkbmFmKSkKICAgICAgICAgICAgICAgICAgICkKICAgICAgICBsZWdlbmQoInRvcHJpZ2h0IiwgbGVnZW5kID0gbGVnLnR4dCwgcGNoID0gYygxOCwgMjAsIE5BLCBOQSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LmNvbCA9IGMoMSwgMywgMiwgNCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wgPSBjKDEsIDMsIDIsIDQpLCBidHk9Im4iLCBjZXg9MC43KQogICAgfQogICAgbmFmIDwtIG5TY3JlZSRDb21wb25lbnRzJG5hZgogICAgdGV4dCh4ID0gbm9jLCB5ID0gZWlnW25vY10sIGxhYmVsID0gIiAoT0MpIiwgY2V4ID0gMC43LCAKICAgICAgICBhZGogPSBjKDAsIDApLCBjb2wgPSAyKQogICAgdGV4dCh4ID0gbmFmICsgMSwgeSA9IGVpZ1tuYWYgKyAxXSwgbGFiZWwgPSAiIChBRikiLCAKICAgICAgICBjZXggPSAwLjcsIGFkaiA9IGMoMCwgMCksIGNvbCA9IDQpCn0KCmBgYAoKCgpgYGB7cn0KTXkubG9hZGluZ3MudmFyIDwtIGZ1bmN0aW9uKG1hdCwgbmZjdCwgbWV0aG9kPSJmYSIpewogIAogIAogICAgaWYobWV0aG9kID09ICJmYSIpeyAKICAgICBmMSA8LSBmYWN0YW5hbChtYXQsIGZhY3RvcnMgPSBuZmN0LCAgcm90YXRpb24gPSAidmFyaW1heCIpCiAgICAgeCA8LSBsb2FkaW5ncyhmMSkKICAgICB2eCA8LSBjb2xTdW1zKHheMikKICAgICB2YXJTUyA9IHJiaW5kKCdTUyBsb2FkaW5ncycgPSB2eCwKICAgICAgICAgICAgJ1Byb3BvcnRpb24gVmFyJyA9IHZ4L25yb3coeCksCiAgICAgICAgICAgJ0N1bXVsYXRpdmUgVmFyJyA9IGN1bXN1bSh2eC9ucm93KHgpKSkKICAgICB3ZWlnaHQgPSBmMSRsb2FkaW5nc1tdIAogICB9IGVsc2UgaWYgKG1ldGhvZCA9PSAicGNhIil7CiAgICAgcGNhIDwtIHByY29tcChtYXQsIGNlbnRlciA9IFRSVUUsIHNjYWxlID0gVFJVRSkKICAgICB2YXJTUyA9IHN1bW1hcnkocGNhKSRpbXBvcnRhbmNlWywxOm5mY3RdCiAgICAgd2VpZ2h0ID0gcGNhJHJvdGF0aW9uWywxOm5mY3RdCiAgfQogICAgbGlzdChMb2FkaW5ncyA9IHdlaWdodCwgUHJvcC5WYXIgPSB2YXJTUykKfQoKYGBgCgoKIyMgU3R1ZGVudHMnIEVuZ2FnZW1lbnQgaW4gTGVhcm5pbmcgUENBCgpXZSBmaXJzdCBnZW5lcmF0ZSBhIHBsb3QgdG8gdmlzdWFsbHkgYW5kIHN0YXRpc3RpY2FsbHkgaGVscCB1cyBkZWNpZGUgaG93IG1hbnkgdW5kZXJseWluZyBkaW1lbnNpb25zIGFyZSBpbiBvdXIgZGF0YSBmb3IgZW5nYWdlbWVudC4gV2UgZG8gdGhpcyBiZWZvcmUgcnVubmluZyBQQ0Egb3IgdXNpbmcgUENzIGluIHJlZ3Jlc3Npb24uCgpgYGB7cn0KTXkucGxvdG5TY3JlZShtYXQ9ZW5nYWdlbWVudCwgbGVnZW5kID0gVFJVRSwgbWV0aG9kID0iY29tcG9uZW50cyIsIAogICAgICAgICAgICAgIG1haW49IkRldGVybWluYXRpb24gb2YgTnVtYmVyIG9mIENvbXBvbmVudHNcbiBFbmdhZ2VtZW50IChQb3NpdGl2ZSkiKQoKYGBgCgpPdXIgcGxvdCBhYm92ZSBzaG93cyB0aGF0IHRoZSBhcHByb3ByaWF0ZSBhbW91bnQgb2YgY29tcG9uZW50cyB3aWxsIGJlIGFyb3VuZCAyIHNvIHdlIGdvIGFoZWFkIGFuZCBwZXJmb3JtIHByaW5jaXBsZSBjb21wb25lbnQgYW5hbHlzaXMuIAoKCmBgYHtyfQpMb2FkaW5ncyA9IE15LmxvYWRpbmdzLnZhcihtYXQ9ZW5nYWdlbWVudCwgbmZjdD0yLCBtZXRob2Q9InBjYSIpJExvYWRpbmdzCgprYWJsZShyb3VuZChMb2FkaW5ncywzKSwKICAgIGNhcHRpb249IkZhY3RvciBsb2FkaW5ncyBvZiB0aGUgZmlyc3QgZmV3IFBDQXMgYW5kIHRoZSBjdW11bGF0aXZlCiAgICB0aGUgcHJvcG9ydGlvbiBvZiB2YXJpYXRpb24gZXhwbGFpbmVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIFBDQXMgaW4gdGhlIAogICAgRW5nYWdlbWVudCBRdWVzdGlvbmFpcmUgU3VydmV5LiIpCgpgYGAKCgpgYGB7cn0KVmFyUHJvcCA9IE15LmxvYWRpbmdzLnZhcihtYXQ9ZW5nYWdlbWVudCwgbmZjdD0yLCBtZXRob2Q9InBjYSIpJFByb3AuVmFyCgprYWJsZShyb3VuZChWYXJQcm9wLDMpLAogICAgY2FwdGlvbj0iQ3VtdWxhdGl2ZSBhbmQgcHJvcG9ydGlvbiBvZiB2YXJpYW5jZXMgZXhwbGFpbmVkIGJ5IGVhY2ggCiAgICB0aGUgcHJpbmNpcGFsIGNvbXBvbmVudCBpbiB0aGUgZW5nYWdlbWVudCBzdXJ2ZXkuIikKCmBgYAoKQWZ0ZXIgbG9va2luZyBhdCB0aGUgUENBIGJvdGggc2hvdyB3ZXJlIGxpdHRsZSBwcm9wb3J0aW9uIHdpdGggUEMxIGJlaW5nIDI5LjQlIGFuZCBQQzIgYmVpbmcgMTMuOC4KCgoKYGBge3J9CnBjYSA8LSBwcmNvbXAoZW5nYWdlbWVudCwgY2VudGVyID0gVFJVRSwgc2NhbGUgPSBUUlVFKQplbmcuaWR4ID0gcGNhJHhbLDFdCgoKaGlzdChlbmcuaWR4LAptYWluPSJEaXN0cmlidXRpb24gb2YgRW5nYWdlbWVudCBJbmRleCIsCmJyZWFrcyA9IHNlcShtaW4oZW5nLmlkeCksIG1heChlbmcuaWR4KSwgbGVuZ3RoPTkpLAp4bGFiPSJFbmdhZ2VtZW50IEluZGV4IiwKeGxpbT1yYW5nZShlbmcuaWR4KSwKYm9yZGVyPSJyZWQiLApjb2w9ImxpZ2h0Ymx1ZSIsCmZyZXE9RkFMU0UKKQoKYGBgCgpXZSBzZWUgaGVyZSB0aGF0IG91ciBncmFwaCBhcHBlYXJzIHRvIGJlIHNrZXdlZCB0byB0aGUgcmlnaHQuIEZ1cnRoZXIgYW5hbHlzaXMgd2lsbCBiZSBuZWVkIG9uIHdoZXRoZXIgdG8gZG8gYSBib3ggY294IHRyYW5zZm9ybWF0aW9uIHRvIGZpeCB0aGUgZGlzdHJpYnV0aW9uYWwgaXNzdWUgaW4gdGhlIHJlZ3Jlc3Npb24gcmVzaWR1YWxzLgoKIyMgU3R1ZGVudCBMZWFybmluZyBTdHlsZXMgUENBCgpgYGB7cn0KTXkucGxvdG5TY3JlZShtYXQ9TGVhcm5TdHlsZSwgbGVnZW5kID0gVFJVRSwgbWV0aG9kID0iY29tcG9uZW50cyIsIAogICAgICAgICAgICAgIG1haW49IkRldGVybWluYXRpb24gb2YgTnVtYmVyIG9mIENvbXBvbmVudHNcbiBMZWFybmluZyBTdHlsZSAoUG9zaXRpdmUpIikKCmBgYAoKV2Ugc2VlIGZyb20gdGhlIGFib3ZlIHBsb3QgdGhhdCBpdCBzdWdnZXN0cyB0byB1c2Ugb25lIHByaW5jaXBhbCBjb21wb25lbnQuCgpgYGB7cn0KTG9hZGluZ3MgPSBNeS5sb2FkaW5ncy52YXIobWF0PUxlYXJuU3R5bGUsIG5mY3Q9MSwgbWV0aG9kPSJwY2EiKSRMb2FkaW5ncwoKa2FibGUocm91bmQoTG9hZGluZ3MsMyksCiAgICBjYXB0aW9uPSJGYWN0b3IgbG9hZGluZ3Mgb2YgdGhlIGZpcnN0IGZldyBQQ0FzIGFuZCB0aGUgY3VtdWxhdGl2ZQogICAgdGhlIHByb3BvcnRpb24gb2YgdmFyaWF0aW9uIGV4cGxhaW5lZCBieSB0aGUgY29ycmVzcG9uZGluZyBQQ0FzIGluIHRoZSAKICAgIExlYXJuaW5nIFN0eWxlIFF1ZXN0aW9uYWlyZSBTdXJ2ZXkuIikKCmBgYAoKCmBgYHtyfQpWYXJQcm9wID0gTXkubG9hZGluZ3MudmFyKG1hdD1MZWFyblN0eWxlLCBuZmN0PTEsIG1ldGhvZD0icGNhIikkUHJvcC5WYXIKCmthYmxlKHJvdW5kKFZhclByb3AsMyksCiAgICBjYXB0aW9uPSJDdW11bGF0aXZlIGFuZCBwcm9wb3J0aW9uIG9mIHZhcmlhbmNlcyBleHBsYWluZWQgYnkgZWFjaCAKICAgIHRoZSBwcmluY2lwYWwgY29tcG9uZW50IGluIHRoZSBMZWFybmluZyBTdHlsZSBzdXJ2ZXkuIikKCmBgYAoKVGhlIFBDQSBoYXMgYSBsYXJnZXIgYW1vdW50IG9mIHByb3BvcnRpb24gb2YgdmFyaWFuY2UgYXQgYXJvdW5kIDU5JS4KCmBgYHtyfQpwY2EgPC0gcHJjb21wKExlYXJuU3R5bGUsIGNlbnRlciA9IFRSVUUsIHNjYWxlID0gVFJVRSkKbGVhLmlkeCA9IHBjYSR4WywxXQoKCmhpc3QobGVhLmlkeCwKbWFpbj0iRGlzdHJpYnV0aW9uIG9mIExlYXJuaW5nIFN0eWxlIEluZGV4IiwKYnJlYWtzID0gc2VxKG1pbihsZWEuaWR4KSwgbWF4KGxlYS5pZHgpLCBsZW5ndGg9OSksCnhsYWI9IkxlYXJuaW5nIFN0eWxlIEluZGV4IiwKeGxpbT1yYW5nZShsZWEuaWR4KSwKYm9yZGVyPSJyZWQiLApjb2w9ImxpZ2h0Ymx1ZSIsCmZyZXE9RkFMU0UKKQoKYGBgCgpUaGUgcGxvdCBhYm92ZSBzaG93cyB0aGF0IG91ciBkaXN0cmlidXRpb24gYXBwZWFycyB0byBiZSBza2V3ZWQgdG8gdGhlIHJpZ2h0LiBXZSB3aWxsIG5lZWQgZnVydGhlciBhbmFseXNpcyB0byBzZWUgaWYgd2UgbmVlZCB0byBwZXJmb3JtIGEgYm94IGNveCB0cmFuc2Zvcm1hdGlvbiB0byBmaXggdGhlIGRpc3RyaWJ1dGlvbmFsIGlzc3VlIGluIHRoZSByZWdyZXNzaW9uIHJlc2lkdWFscy4KCiMjIFdyaXRpbmcgYW5kIFJlYWRpbmcgTG9hZCBQQ0EKCmBgYHtyfQpNeS5wbG90blNjcmVlKG1hdD1XcmlSZWFkLCBsZWdlbmQgPSBUUlVFLCBtZXRob2QgPSJjb21wb25lbnRzIiwgCiAgICAgICAgICAgICAgbWFpbj0iRGV0ZXJtaW5hdGlvbiBvZiBOdW1iZXIgb2YgQ29tcG9uZW50c1xuIFdyaXRpbmcgYW5kIFJlYWRpbmcgKFBvc2l0aXZlKSIpCgpgYGAKCldlIHNlZSBmcm9tIHRoZSBhYm92ZSBwbG90IHRoYXQgaXQgc3VnZ2VzdHMgdG8gdXNlIG9uZSBwcmluY2lwYWwgY29tcG9uZW50LiAKCmBgYHtyfQpMb2FkaW5ncyA9IE15LmxvYWRpbmdzLnZhcihtYXQ9V3JpUmVhZCwgbmZjdD0xLCBtZXRob2Q9InBjYSIpJExvYWRpbmdzCgprYWJsZShyb3VuZChMb2FkaW5ncywzKSwKICAgIGNhcHRpb249IkZhY3RvciBsb2FkaW5ncyBvZiB0aGUgZmlyc3QgZmV3IFBDQXMgYW5kIHRoZSBjdW11bGF0aXZlCiAgICB0aGUgcHJvcG9ydGlvbiBvZiB2YXJpYXRpb24gZXhwbGFpbmVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIFBDQXMgaW4gdGhlIAogICAgV3JpdGluZyBhbmQgUmVhZGluZyBRdWVzdGlvbmFpcmUgU3VydmV5LiIpCgpgYGAKCgpgYGB7cn0KVmFyUHJvcCA9IE15LmxvYWRpbmdzLnZhcihtYXQ9V3JpUmVhZCwgbmZjdD0xLCBtZXRob2Q9InBjYSIpJFByb3AuVmFyCgprYWJsZShyb3VuZChWYXJQcm9wLDMpLAogICAgY2FwdGlvbj0iQ3VtdWxhdGl2ZSBhbmQgcHJvcG9ydGlvbiBvZiB2YXJpYW5jZXMgZXhwbGFpbmVkIGJ5IGVhY2ggCiAgICB0aGUgcHJpbmNpcGFsIGNvbXBvbmVudCBpbiB0aGUgd3JpdGluZyBhbmQgcmVhZGluZyBzdXJ2ZXkuIikKCmBgYAoKVGhlIFBDQSBnaXZlcyB1cyBhcm91bmQgNDklLgoKYGBge3J9CnBjYSA8LSBwcmNvbXAoV3JpUmVhZCwgY2VudGVyID0gVFJVRSwgc2NhbGUgPSBUUlVFKQp3cmkuaWR4ID0gcGNhJHhbLDFdCiMgaGlzdChzYy5pZHgsIGJyZWFrcz0xMCwgbWFpbj0iRGlzdHJpYnV0aW9uIG9mIFNlbGYtY29tcGFzc2lvbiBJbmRleCIpCiMjCmhpc3Qod3JpLmlkeCwKbWFpbj0iRGlzdHJpYnV0aW9uIG9mIFdyaXRpbmcgYW5kIFJlYWRpbmcgSW5kZXgiLApicmVha3MgPSBzZXEobWluKHdyaS5pZHgpLCBtYXgod3JpLmlkeCksIGxlbmd0aD05KSwKeGxhYj0iV3JpdGluZyBhbmQgUmVhZGluZyBJbmRleCIsCnhsaW09cmFuZ2Uod3JpLmlkeCksCmJvcmRlcj0icmVkIiwKY29sPSJsaWdodGJsdWUiLApmcmVxPUZBTFNFCikKCmBgYAoKV2Ugc2VlIGZyb20gdGhlIGRpc3RyaWJ1dGlvbiBwbG90IGl0IGlzIHNrZXdlZCB0byB0aGUgcmlnaHQuIFdlIHdpbGwgbmVlZCBmdXJ0aGVyIGFuYWx5c2lzIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIHBlcmZvcm0gYSBib3ggY294IHRyYW5zZm9ybWF0aW9uLgoKIyMgUmVtZWRpYWwgRXhwZXJpZW5jZSBQQ0EKCmBgYHtyfQpNeS5wbG90blNjcmVlKG1hdD1SZW1lZCwgbGVnZW5kID0gVFJVRSwgbWV0aG9kID0iY29tcG9uZW50cyIsIAogICAgICAgICAgICAgIG1haW49IkRldGVybWluYXRpb24gb2YgTnVtYmVyIG9mIENvbXBvbmVudHNcbiBSZW1lZGlhbCAoUG9zaXRpdmUpIikKCmBgYAoKV2Ugc2VlIGZyb20gdGhlIGFib3ZlIHBsb3QgdGhhdCBpdCBzdWdnZXN0cyB0byB1c2UgMiBwcmluY2lwbGUgY29tcG9uZW50cyBpbiBvdXIgY29tcG9uZW50IGFuYWx5c2lzLgoKYGBge3J9CkxvYWRpbmdzID0gTXkubG9hZGluZ3MudmFyKG1hdD1SZW1lZCwgbmZjdD0yLCBtZXRob2Q9InBjYSIpJExvYWRpbmdzCiMgcGNhIGxvYWRpbmdzCmthYmxlKHJvdW5kKExvYWRpbmdzLDMpLAogICAgY2FwdGlvbj0iRmFjdG9yIGxvYWRpbmdzIG9mIHRoZSBmaXJzdCBmZXcgUENBcyBhbmQgdGhlIGN1bXVsYXRpdmUKICAgIHRoZSBwcm9wb3J0aW9uIG9mIHZhcmlhdGlvbiBleHBsYWluZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgUENBcyBpbiB0aGUgCiAgICBSZW1lZGlhbCBRdWVzdGlvbmFpcmUgU3VydmV5LiIpCgpgYGAKCgpgYGB7cn0KVmFyUHJvcCA9IE15LmxvYWRpbmdzLnZhcihtYXQ9UmVtZWQsIG5mY3Q9MiwgbWV0aG9kPSJwY2EiKSRQcm9wLlZhcgojIHBjYSBsb2FkaW5ncwprYWJsZShyb3VuZChWYXJQcm9wLDMpLAogICAgY2FwdGlvbj0iQ3VtdWxhdGl2ZSBhbmQgcHJvcG9ydGlvbiBvZiB2YXJpYW5jZXMgZXhwbGFpbmVkIGJ5IGVhY2ggCiAgICB0aGUgcHJpbmNpcGFsIGNvbXBvbmVudCBpbiB0aGUgcmVtZWRpYWwgc3VydmV5LiIpCgpgYGAKClBDQSAxIGhhcyA0Ny41JSBvZiBwcm9wb3J0aW9uIG9mIHZhcmlhbmNlIGNvbXBhcmVkIHRvIG91ciBzZWNvbmQgY29tcG9uZW50IHdoaWNoIG9ubHkgaGFzIDEyLjglLiBXZSB3aWxsIG9ubHkgYmUgdXNpbmcgdGhlIGZpcnN0IHByaW5jaXBsZSBjb21wb25lbnQuIAoKYGBge3J9CnBjYSA8LSBwcmNvbXAoUmVtZWQsIGNlbnRlciA9IFRSVUUsIHNjYWxlID0gVFJVRSkKcmVtLmlkeCA9IHBjYSR4WywxXQojIGhpc3Qoc2MuaWR4LCBicmVha3M9MTAsIG1haW49IkRpc3RyaWJ1dGlvbiBvZiBTZWxmLWNvbXBhc3Npb24gSW5kZXgiKQojIwpoaXN0KHJlbS5pZHgsCm1haW49IkRpc3RyaWJ1dGlvbiBvZiBSZW1lZGlhbCBJbmRleCIsCmJyZWFrcyA9IHNlcShtaW4ocmVtLmlkeCksIG1heChyZW0uaWR4KSwgbGVuZ3RoPTkpLAp4bGFiPSJSZW1lZGlhbCBJbmRleCIsCnhsaW09cmFuZ2UocmVtLmlkeCksCmJvcmRlcj0icmVkIiwKY29sPSJsaWdodGJsdWUiLApmcmVxPUZBTFNFCikKCmBgYAoKVGhlIGRpc3RyaWJ1dGlvbiBpbiB0aGUgdGFibGUgYWJvdmUgaXMgc2tld2VkIHRvIHRoZSBsZWZ0LiBTbyB3ZSB3aWxsIGhhdmUgdG8gcGVyZm9ybSBhIGJveCBjb3ggdHJhbnNmb3JtYXRpb24gdG8gZml4IHRoZSBkaXN0cmlidXRpb25hbCBpc3N1ZS4KCiMjIEVuY291cmFnZW1lbnQgYW5kIFN1cHBvcnQgUENBCgpgYGB7cn0KTXkucGxvdG5TY3JlZShtYXQ9RW5nY25TdXBwLCBsZWdlbmQgPSBUUlVFLCBtZXRob2QgPSJjb21wb25lbnRzIiwgCiAgICAgICAgICAgICAgbWFpbj0iRGV0ZXJtaW5hdGlvbiBvZiBOdW1iZXIgb2YgQ29tcG9uZW50c1xuIEVuY291cmFnZW1lbnQgYW5kIFN1cHBvcnQgKFBvc2l0aXZlKSIpCgpgYGAKCldlIHNlZSBmcm9tIHRoZSBhYm92ZSB0YWJsZSB0aGF0IGl0IHN1Z2dlc3RzIHVzIHRvIHVzZSB0aGUgZmlyc3QgdHdvIHByaW5jaXBsZSBjb21wb25lbnRzLgoKYGBge3J9CkxvYWRpbmdzID0gTXkubG9hZGluZ3MudmFyKG1hdD1FbmdjblN1cHAsIG5mY3Q9MiwgbWV0aG9kPSJwY2EiKSRMb2FkaW5ncwojIHBjYSBsb2FkaW5ncwprYWJsZShyb3VuZChMb2FkaW5ncywzKSwKICAgIGNhcHRpb249IkZhY3RvciBsb2FkaW5ncyBvZiB0aGUgZmlyc3QgZmV3IFBDQXMgYW5kIHRoZSBjdW11bGF0aXZlCiAgICB0aGUgcHJvcG9ydGlvbiBvZiB2YXJpYXRpb24gZXhwbGFpbmVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIFBDQXMgaW4gdGhlIAogICAgRW5jb3VyYWdlbWVudCBhbmQgU3VwcG9ydCBRdWVzdGlvbmFpcmUgU3VydmV5LiIpCgpgYGAKCgpgYGB7cn0KVmFyUHJvcCA9IE15LmxvYWRpbmdzLnZhcihtYXQ9RW5nY25TdXBwLCBuZmN0PTIsIG1ldGhvZD0icGNhIikkUHJvcC5WYXIKIyBwY2EgbG9hZGluZ3MKa2FibGUocm91bmQoVmFyUHJvcCwzKSwKICAgIGNhcHRpb249IkN1bXVsYXRpdmUgYW5kIHByb3BvcnRpb24gb2YgdmFyaWFuY2VzIGV4cGxhaW5lZCBieSBlYWNoIAogICAgdGhlIHByaW5jaXBhbCBjb21wb25lbnQgaW4gdGhlIEVuY291cmFnZW1lbnQgYW5kIFN1cHBvcnQgc3VydmV5LiIpCgpgYGAKCk91ciBmaXJzdCBjb21wb25lbnQgZXhwbGFpbnMgNDglIG9mIHRoZSB0b3RhbCB2YXJpYW5jZSBhbmQgdGhlIHNlY29uZCBjb21wb25lbnQgb25seSBleHBsYWlucyAxNyUgb2YgdGhlIHRvdGFsIHZhcmlhbmNlLiBXZSB3aWxsIG9ubHkgYmUgdXNpbmcgdGhlIGZpcnN0IGNvbXBvbmVudCBpbiBvdXIgYW5hbHlzaXMuCgpgYGB7cn0KcGNhIDwtIHByY29tcChFbmdjblN1cHAsIGNlbnRlciA9IFRSVUUsIHNjYWxlID0gVFJVRSkKZW5jLmlkeCA9IHBjYSR4WywxXQojIGhpc3Qoc2MuaWR4LCBicmVha3M9MTAsIG1haW49IkRpc3RyaWJ1dGlvbiBvZiBTZWxmLWNvbXBhc3Npb24gSW5kZXgiKQojIwpoaXN0KGVuYy5pZHgsCm1haW49IkRpc3RyaWJ1dGlvbiBvZiBFbmNvdXJhZ2VtZW50IGFuZCBTdXBwb3J0IEluZGV4IiwKYnJlYWtzID0gc2VxKG1pbihlbmMuaWR4KSwgbWF4KGVuYy5pZHgpLCBsZW5ndGg9OSksCnhsYWI9IkVuY291cmFnZW1lbnQgYW5kIFN1cHBvcnQgSW5kZXgiLAp4bGltPXJhbmdlKGVuYy5pZHgpLApib3JkZXI9InJlZCIsCmNvbD0ibGlnaHRibHVlIiwKZnJlcT1GQUxTRQopCgpgYGAKCldlIHNlZSBmcm9tIHRoZSBhYm92ZSB0YWJsZSB0aGF0IG91ciBkaXN0cmlidXRpb24gdGFibGUgaXMgYXBwcm94aW1hdGVseSBub3JtYWwuCgojIyBSZXRlbnRpb24gUENBCgpgYGB7cn0KTXkucGxvdG5TY3JlZShtYXQ9UmV0ZW50aW9uLCBsZWdlbmQgPSBUUlVFLCBtZXRob2QgPSJjb21wb25lbnRzIiwgCiAgICAgICAgICAgICAgbWFpbj0iRGV0ZXJtaW5hdGlvbiBvZiBOdW1iZXIgb2YgQ29tcG9uZW50c1xuIFJldGVudGlvbiAoUG9zaXRpdmUpIikKCmBgYAoKV2Ugc2VlIGZyb20gdGhlIGFib3ZlIHRhYmxlIHRoYXQgaXQgc3VnZ2VzdHMgZm9yIHVzIHRvIHVzZSBvbmUgY29tcG9uZW50LgoKYGBge3J9CkxvYWRpbmdzID0gTXkubG9hZGluZ3MudmFyKG1hdD1SZXRlbnRpb24sIG5mY3Q9MSwgbWV0aG9kPSJwY2EiKSRMb2FkaW5ncwojIHBjYSBsb2FkaW5ncwprYWJsZShyb3VuZChMb2FkaW5ncywzKSwKICAgIGNhcHRpb249IkZhY3RvciBsb2FkaW5ncyBvZiB0aGUgZmlyc3QgZmV3IFBDQXMgYW5kIHRoZSBjdW11bGF0aXZlCiAgICB0aGUgcHJvcG9ydGlvbiBvZiB2YXJpYXRpb24gZXhwbGFpbmVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIFBDQXMgaW4gdGhlIAogICAgUmV0ZW50aW9uIFF1ZXN0aW9uYWlyZSBTdXJ2ZXkuIikKCmBgYAoKCmBgYHtyfQpWYXJQcm9wID0gTXkubG9hZGluZ3MudmFyKG1hdD1SZXRlbnRpb24sIG5mY3Q9MSwgbWV0aG9kPSJwY2EiKSRQcm9wLlZhcgojIHBjYSBsb2FkaW5ncwprYWJsZShyb3VuZChWYXJQcm9wLDMpLAogICAgY2FwdGlvbj0iQ3VtdWxhdGl2ZSBhbmQgcHJvcG9ydGlvbiBvZiB2YXJpYW5jZXMgZXhwbGFpbmVkIGJ5IGVhY2ggCiAgICB0aGUgcHJpbmNpcGFsIGNvbXBvbmVudCBpbiB0aGUgUmV0ZW50aW9uIHN1cnZleS4iKQoKYGBgCgpUaGUgZmlyc3QgUEMgZXhwbGFpbnMgNjclIG9mIG91ciB0b3RhbCB2YXJpYW5jZS4KCmBgYHtyfQpwY2EgPC0gcHJjb21wKFJldGVudGlvbiwgY2VudGVyID0gVFJVRSwgc2NhbGUgPSBUUlVFKQpyZXQuaWR4ID0gcGNhJHhbLDFdCiMgaGlzdChzYy5pZHgsIGJyZWFrcz0xMCwgbWFpbj0iRGlzdHJpYnV0aW9uIG9mIFNlbGYtY29tcGFzc2lvbiBJbmRleCIpCiMjCmhpc3QocmV0LmlkeCwKbWFpbj0iRGlzdHJpYnV0aW9uIG9mIFJldGVudGlvbiBJbmRleCIsCmJyZWFrcyA9IHNlcShtaW4ocmV0LmlkeCksIG1heChyZXQuaWR4KSwgbGVuZ3RoPTkpLAp4bGFiPSJSZXRlbnRpb24gSW5kZXgiLAp4bGltPXJhbmdlKHJldC5pZHgpLApib3JkZXI9InJlZCIsCmNvbD0ibGlnaHRibHVlIiwKZnJlcT1GQUxTRQopCgpgYGAKCldlIHNlZSBjYW4gc2VlIHRoYXQgb3VyIHBsb3QgaXMgc2tld2VkIHRvIHRoZSByaWdodCBzbyB3ZSBtaWdodCBuZWVkIHRvIHBlcmZvcm0gYSBib3ggY294IHRyYW5zZm9ybWF0aW9uLiBBbHNvLCBmdXJ0aGVyIGFuYWx5c2lzIGlzIG5lZWRlZC4KCiMjIEhvdyBTdHVkZW50cyBQYXkgZm9yIENvbGxlZ2UgUENBCgpgYGB7cn0KTXkucGxvdG5TY3JlZShtYXQ9b3V0c2lkZV9hc3Npc3RhbmNlLCBsZWdlbmQgPSBUUlVFLCBtZXRob2QgPSJjb21wb25lbnRzIiwgCiAgICAgICAgICAgICAgbWFpbj0iRGV0ZXJtaW5hdGlvbiBvZiBOdW1iZXIgb2YgQ29tcG9uZW50c1xuIFBheSAoUG9zaXRpdmUpIikKCmBgYAoKV2Ugc2VlIGZyb20gdGhlIHBsb3QgYWJvdmUgdGhhdCBpdCBzdWdnZXN0cyB0byB1c2Ugb24gUEMuCgpgYGB7cn0KTG9hZGluZ3MgPSBNeS5sb2FkaW5ncy52YXIobWF0PW91dHNpZGVfYXNzaXN0YW5jZSwgbmZjdD0xLCBtZXRob2Q9InBjYSIpJExvYWRpbmdzCiMgcGNhIGxvYWRpbmdzCmthYmxlKHJvdW5kKExvYWRpbmdzLDMpLAogICAgY2FwdGlvbj0iRmFjdG9yIGxvYWRpbmdzIG9mIHRoZSBmaXJzdCBmZXcgUENBcyBhbmQgdGhlIGN1bXVsYXRpdmUKICAgIHRoZSBwcm9wb3J0aW9uIG9mIHZhcmlhdGlvbiBleHBsYWluZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgUENBcyBpbiB0aGUgCiAgICBQYXkgUXVlc3Rpb25haXJlIFN1cnZleS4iKQoKYGBgCgoKYGBge3J9ClZhclByb3AgPSBNeS5sb2FkaW5ncy52YXIobWF0PW91dHNpZGVfYXNzaXN0YW5jZSwgbmZjdD0xLCBtZXRob2Q9InBjYSIpJFByb3AuVmFyCiMgcGNhIGxvYWRpbmdzCmthYmxlKHJvdW5kKFZhclByb3AsMyksCiAgICBjYXB0aW9uPSJDdW11bGF0aXZlIGFuZCBwcm9wb3J0aW9uIG9mIHZhcmlhbmNlcyBleHBsYWluZWQgYnkgZWFjaCAKICAgIHRoZSBwcmluY2lwYWwgY29tcG9uZW50IGluIHRoZSBwYXkgc3VydmV5LiIpCgpgYGAKClRoZSBQQyBpcyA0OC40JSBvZiB0aGUgcHJvcG9ydGlvbiBvZiB2YXJpYW5jZS4KCmBgYHtyfQpwY2EgPC0gcHJjb21wKG91dHNpZGVfYXNzaXN0YW5jZSwgY2VudGVyID0gVFJVRSwgc2NhbGUgPSBUUlVFKQpwYXkuaWR4ID0gcGNhJHhbLDFdCiMgaGlzdChzYy5pZHgsIGJyZWFrcz0xMCwgbWFpbj0iRGlzdHJpYnV0aW9uIG9mIFNlbGYtY29tcGFzc2lvbiBJbmRleCIpCiMjCmhpc3QocGF5LmlkeCwKbWFpbj0iRGlzdHJpYnV0aW9uIG9mIFBheSBJbmRleCIsCmJyZWFrcyA9IHNlcShtaW4ocGF5LmlkeCksIG1heChwYXkuaWR4KSwgbGVuZ3RoPTkpLAp4bGFiPSJQYXkgSW5kZXgiLAp4bGltPXJhbmdlKHBheS5pZHgpLApib3JkZXI9InJlZCIsCmNvbD0ibGlnaHRibHVlIiwKZnJlcT1GQUxTRQopCgpgYGAKCldlIHNlZSBmcm9tIHRoZSBncmFwaCBhYm92ZSB0aGF0IGl0IGlzIHNrZXdlZCB0byB0aGUgcmlnaHQuIFdlIHdpbGwgbmVlZCB0byBwZXJmb3JtIGEgYm94IGNveCB0cmFuc2Zvcm1hdGlvbiB0byBmaXggdGhlIGRpc3RyaWJ1dGlvbmFsIGlzc3VlLgoKCiMgUHJvamVjdCBRdWVzdGlvbnMKCjEuIEhvdyB3ZWxsIGRvZXMgc3R1ZGVudCBlbmdhZ2VtZW50IGluIGluc2lkZSBhbmQgb3V0c2lkZSB0aGUgY2xhc3Nyb29tIHByZWRpY3QgdGhlaXIgb3ZlcmFsbCBzYXRpc2ZhY3Rpb24gd2l0aCB0aGVpciBjb2xsZWdlIGV4cGVyaWVuY2U/CgoyLiBEb2VzIGhvdyB0aGUgc3R1ZGVudCBwYXlzIGZvciBzY2hvb2wgY29ycmVsYXRlIHdpdGggdGhlIHN0dWRlbnRzIGVuZ2FnZW1lbnQgaW4gc2Nob29sPwoKTXkgZmlyc3QgcXVlc3Rpb24gbG9va3MgYXQgdGhlIGlkZWEgdGhhdCBzdHVkZW50cyB3aG8gYXJlIG1vcmUgYWN0aXZlbHkgZW5nYWdlZCBpbiB0aGVpciBsZWFybmluZyBtYXkgZmVlbCBtb3JlIGFmZmlsaWF0ZWQgaW4gdGhlaXIgYWNhZGVtaWMgZXhwZXJpZW5jZS4gVGhlIHN1cnZleSBkYXRhIHRoYXQgd2FzIHByb3ZpZGVkIHRvIHVzIHNob3dzIGEgbG90IG9mIGRldGFpbCBvbiBzdHVkZW50IGVuZ2FnZW1lbnQgdGhyb3VnaCB0aGUgMjEgcXVlc3Rpb25zIChTZWN0aW9uIDQpIGdpdmVuLCBtYWtpbmcgaXQgYSBzdHJvbmcgY2FuZGlkYXRlIGZvciBnaXZpbmcgdXMgZW5vdWdoIHZhcmlhYmxlcyByZXByZXNlbnRpbmcgZW5nYWdlbWVudC4gCgpUaGUgc2Vjb25kIHF1ZXN0aW9uIGlzIGZyb20gdGhlIGFzc3VtcHRpb24gaWYgdGhlIHN0dWRlbnQgcGF5cyBmb3IgdGhlaXIgY29sbGVnZSB0aGFuIHRoZXkgd291bGQgYmUgbW9yZSBsaWtlbHkgdG8gYmUgbW9yZSBlbmdhZ2VkIGluIHRoZWlyIGxlYXJuaW5nLiBMb29raW5nIGF0IHRoZXNlIHR3byB0b2dldGhlciBjYW4gb2ZmZXIgbWVhbmluZ2Z1bCBpbnNpZ2h0IGludG8gaG93IG11Y2ggYSBzdHVkZW50IHdpbGwgYmUgZW5nYWdlZCBiYXNlZCBvZmYgaWYgdGhleSBwYXllZCBmb3IgdGhlaXIgc2Nob29sIG9yIGlmIHNvbWVvbmUgZWxzZSBkaWQuCgoKCg==