Part I: EDA and Feature Engineering (for week #5)


1 Data Set

Choose a data set that has at least four categorical variables and four numerical variables. The sample size should be at least 200. You can find a data set either from my teaching data repository or other data sources. The data set should be cross-sectional (i.e., each of the data points must be observed/collected/generated at the same time).

2 Description of Data

The following information of the data should be provided in the report:

  • A brief description of the data source.

  • How the data set is generated or collected.

  • Number of variables and their type (categorical or numerical) and size of the data set.

  • List the variable names and their description/definitions.

3 Exploratory Data Analysis and Feature

Perform the standard EDA such as distribution for categorical and numerical variables respectively, the relationship between two variables (combinations of categorical and numerical variables), and pairwise relationship. Keep in mind that the pairwise scatter plot is only meaning for numerical variables.

For each EDA and associated representation, you should

  • interpret what you observed and the implication of potential feature engineering

  • perform feature engineering based on EDA by writing an R/Python function.

  • Write a main function to wrap individual feature engineering functions.

  • Test the main function with different patterns in the components and sure it produces the expected result.


Part II: Regression Analysis (for week #6)


4 Statistical Regression Modeling

Linear and logistic regression models are the most commonly used models in classical statistics. This part of the assignment uses the traditional statistical approaches to modeling building and implementation.

4.1 Linear Regression Models

Choose a continuous variable as a response to perform a linear regression analysis. Please use several subsections to organize your analysis that contain the following components.

  • Statement of the question(s), the purpose of this analysis: association analysis or predictive analysis?

  • Justify whether the data set has sufficient information to address the question(s)

  • Model building process: initial model, diagnostics, further transformations (in addition to the one in the EDA), key performance metrics of model assessment, and final model selection (based on appropriate performance metrics). You are expected to

    • create a model that contains a few practically important variables
    • create a model that includes additional variables that potentially influence the response
    • use certain variable selection methods to identify the optimal model (i.e., the final model)
  • Interpretation of regression coefficients. If you transformed your response variable, you need to do some algebra to convert the transformed response variable back to the original scale before you interpret the regression coefficient.

  • Summary/discussion/recommendation

You could open a subsection for each bullet point.

4.2 Logistic Regression Analysis

Choose a binary variable as a response to perform a logistic regression analysis. If your data set does not have a binary categorical variable that can be used for the logistic regression model, you can dichotomize a continuous response in a meaningful way and then build a logistic regression model with the dichotomized variable.

Please use several subsections to organize your analysis that contain the following components.

  • Statement of the question(s), the purpose of this analysis: association analysis or predictive analysis?

  • Justify whether the data set has sufficient information to address the question(s)

  • Model building process: initial model, diagnostics, transformation and scaling (in addition to the one in the EDA), key performance metrics of model assessment, and final model selection (based on certain performance metrics). For practice, you are expected to

    • create a model that contains a few practically important variables
    • create a model that includes additional variables that potentially influence the response
    • use certain variable selection methods to identify the optimal model (i.e., the final model)
  • The interpretation of the final model: interpret the regression coefficient and applications of the model.

  • Summary/discussion/recommendation

You could open a subsection for each bullet point.


Part III: Report Revision- Including Cross Validation (for week #7)


5 Predictive Modeling

The idea is to use data-driven approaches to data splitting and then apply cross-validation methods to select the final model from a pool of candidate models based on predictive performance metric such as MSE for linear regression models and accuracy, sensitivity, or specificity for logistic regression models.

Suggested Components in the Predictive Analysis

  • random splitting - using random splitting for all data partitions.

  • Two-way data splitting - data split into 75% for training and validation and 25% for testing.

  • 5-fold cross-validation - using a 5-fold cross-validation algorithm on the training data


5.1 Prediction Linear Regression

The primary predictive performance metric for linear regression modeling is the mean square error (the average squared error between predicted and the observed values of the response variable in its original scale).

Other predictive performance metrics that can also be used are \(R^2\) or \(R^2_{adj}\).

Likelihood-based metrics such as AIC and SBC can be used if the likelihood functions of all candidate models are at the same scale. These measures are not as intuitive as the MSE since MSE is a squared ‘distance’ in the Euclidean space.

If the response variables in all candidate models are at the same scale, the MSE is expected to be used in the cross-validation for model selection.

5.2 Logistic Predictive Modeling

The primary tool for assessing the global predictive performance of logistic models is ROC curve analysis (this includes the area under the ROC curve - AUC). ROC curve suggested for this assignment.

Other predictive performance measures that can be considered are accuracy, sensitivity, and specificity.

Reporting ROC and AUC is required when comparing candidate models.

5.3 Testing Performance

After the final model is identified, you need to use the 25% testing data set to report the performance of the corresponding models on the new data.

LS0tDQp0aXRsZTogJ1JlZ3Jlc3Npb24gQW5hbHlzaXMnDQphdXRob3I6ICIgKFlvdSBhcmUgZXhwZWN0ZWQgdG8gZ2l2ZSBhIGRlc2NyaXB0aXZlIHRpdGxlKSINCmRhdGU6ICIgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIHRvY19mbG9hdDogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2NfY29sbGFwc2VkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMNCiAgICB0aGVtZTogbHVtZW4NCiAgd29yZF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAga2VlcF9tZDogeWVzDQogIHBkZl9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICBmaWdfd2lkdGg6IDMNCiAgICBmaWdfaGVpZ2h0OiAzDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUNCi0tLQ0KDQpgYGB7PWh0bWx9DQoNCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoNCi8qIENhc2NhZGluZyBTdHlsZSBTaGVldHMgKENTUykgaXMgYSBzdHlsZXNoZWV0IGxhbmd1YWdlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHByZXNlbnRhdGlvbiBvZiBhIGRvY3VtZW50IHdyaXR0ZW4gaW4gSFRNTCBvciBYTUwuIGl0IGlzIGEgc2ltcGxlIG1lY2hhbmlzbSBmb3IgYWRkaW5nIHN0eWxlIChlLmcuLCBmb250cywgY29sb3JzLCBzcGFjaW5nKSB0byBXZWIgZG9jdW1lbnRzLiAqLw0KDQpoMS50aXRsZSB7ICAvKiBUaXRsZSAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgb2YgdGhlIHJlcG9ydCB0aXRsZSAqLw0KICBmb250LXNpemU6IDI0cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KICBmb250LWZhbWlseTogIkdpbGwgU2FucyIsIHNhbnMtc2VyaWY7DQp9DQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIGF1dGhvcnMgICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsNCiAgY29sb3I6IHJlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgdGhlIGRhdGUgICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsNCiAgY29sb3I6IERhcmtCbHVlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KfQ0KaDEgeyAvKiBIZWFkZXIgMSAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIGxldmVsIDEgc2VjdGlvbiB0aXRsZSAgKi8NCiAgICBmb250LXNpemU6IDIycHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogY2VudGVyOw0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KfQ0KaDIgeyAvKiBIZWFkZXIgMiAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIGxldmVsIDIgc2VjdGlvbiB0aXRsZSAqLw0KICAgIGZvbnQtc2l6ZTogMjBweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KfQ0KDQpoMyB7IC8qIEhlYWRlciAzIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBvZiBsZXZlbCAzIHNlY3Rpb24gdGl0bGUgICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmg0IHsgLyogSGVhZGVyIDQgLSBmb250IHNwZWNpZmljYXRpb25zIG9mIGxldmVsIDQgc2VjdGlvbiB0aXRsZSAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KYm9keSB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0NCg0KLmhpZ2hsaWdodG1lIHsgYmFja2dyb3VuZC1jb2xvcjp5ZWxsb3c7IH0NCg0KcCB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0NCg0KPC9zdHlsZT4NCmBgYA0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCiMgY29kZSBjaHVuayBzcGVjaWZpZXMgd2hldGhlciB0aGUgUiBjb2RlLCB3YXJuaW5ncywgYW5kIG91dHB1dCANCiMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGVzLg0KaWYgKCFyZXF1aXJlKCJrbml0ciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJrbml0ciIpDQogICBsaWJyYXJ5KGtuaXRyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJ0aWR5dmVyc2UiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KfQ0KaWYgKCFyZXF1aXJlKCJHR2FsbHkiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiR0dhbGx5IikNCmxpYnJhcnkoR0dhbGx5KQ0KfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCAgICAgICAjIGluY2x1ZGUgY29kZSBjaHVuayBpbiB0aGUgb3V0cHV0IGZpbGUNCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsICAgIyBzb21ldGltZXMsIHlvdSBjb2RlIG1heSBwcm9kdWNlIHdhcm5pbmcgbWVzc2FnZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgeW91IGNhbiBjaG9vc2UgdG8gaW5jbHVkZSB0aGUgd2FybmluZyBtZXNzYWdlcyBpbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBvdXRwdXQgZmlsZS4gDQogICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IFRSVUUsICAgICMgeW91IGNhbiBhbHNvIGRlY2lkZSB3aGV0aGVyIHRvIGluY2x1ZGUgdGhlIG91dHB1dA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGluIHRoZSBvdXRwdXQgZmlsZS4NCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IE5BDQogICAgICAgICAgICAgICAgICAgICAgKSAgDQpgYGANClwNCg0KPGNlbnRlcj48Zm9udCBzdHlsZT0iZm9udC1zaXplOiAyMnB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgY29sb3I6IERhcmtncmVlbjsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KICBmb250LWZhbWlseTogc2Fucy1zZXJpZjsiPiBQYXJ0IEk6IEVEQSBhbmQgRmVhdHVyZSBFbmdpbmVlcmluZyA8L2ZvbnQ+DQogIChmb3Igd2VlayAjNSkNCiAgPC9jZW50ZXI+DQoNClwNCg0KDQojIERhdGEgU2V0DQoNCg0KQ2hvb3NlIGEgZGF0YSBzZXQgdGhhdCBoYXMgYXQgbGVhc3QgZm91ciBjYXRlZ29yaWNhbCB2YXJpYWJsZXMgYW5kIGZvdXIgbnVtZXJpY2FsIHZhcmlhYmxlcy4gVGhlIHNhbXBsZSBzaXplIHNob3VsZCBiZSBhdCBsZWFzdCAyMDAuIFlvdSBjYW4gZmluZCBhIGRhdGEgc2V0IGVpdGhlciBmcm9tIG15IHRlYWNoaW5nIGRhdGEgcmVwb3NpdG9yeSBvciBvdGhlciBkYXRhIHNvdXJjZXMuIFRoZSBkYXRhIHNldCBzaG91bGQgYmUgY3Jvc3Mtc2VjdGlvbmFsIChpLmUuLCBlYWNoIG9mIHRoZSBkYXRhIHBvaW50cyBtdXN0IGJlIG9ic2VydmVkL2NvbGxlY3RlZC9nZW5lcmF0ZWQgYXQgdGhlIHNhbWUgdGltZSkuDQoNCiMgRGVzY3JpcHRpb24gb2YgRGF0YQ0KDQpUaGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIG9mIHRoZSBkYXRhIHNob3VsZCBiZSBwcm92aWRlZCBpbiB0aGUgcmVwb3J0Og0KDQoqIEEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGRhdGEgc291cmNlLg0KDQoqIEhvdyB0aGUgZGF0YSBzZXQgaXMgZ2VuZXJhdGVkIG9yIGNvbGxlY3RlZC4NCg0KKiBOdW1iZXIgb2YgdmFyaWFibGVzIGFuZCB0aGVpciB0eXBlIChjYXRlZ29yaWNhbCBvciBudW1lcmljYWwpIGFuZCBzaXplIG9mIHRoZSBkYXRhIHNldC4NCg0KKiBMaXN0IHRoZSB2YXJpYWJsZSBuYW1lcyBhbmQgdGhlaXIgZGVzY3JpcHRpb24vZGVmaW5pdGlvbnMuDQoNCiMgRXhwbG9yYXRvcnkgRGF0YSBBbmFseXNpcyBhbmQgRmVhdHVyZQ0KDQpQZXJmb3JtIHRoZSBzdGFuZGFyZCBFREEgc3VjaCBhcyBkaXN0cmlidXRpb24gZm9yIGNhdGVnb3JpY2FsIGFuZCBudW1lcmljYWwgdmFyaWFibGVzIHJlc3BlY3RpdmVseSwgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byB2YXJpYWJsZXMgKGNvbWJpbmF0aW9ucyBvZiBjYXRlZ29yaWNhbCBhbmQgbnVtZXJpY2FsIHZhcmlhYmxlcyksIGFuZCBwYWlyd2lzZSByZWxhdGlvbnNoaXAuIEtlZXAgaW4gbWluZCB0aGF0IHRoZSBwYWlyd2lzZSBzY2F0dGVyIHBsb3QgaXMgb25seSBtZWFuaW5nIGZvciBudW1lcmljYWwgdmFyaWFibGVzLg0KDQpGb3IgZWFjaCBFREEgYW5kIGFzc29jaWF0ZWQgcmVwcmVzZW50YXRpb24sIHlvdSBzaG91bGQgDQoNCiogaW50ZXJwcmV0IHdoYXQgeW91IG9ic2VydmVkIGFuZCB0aGUgaW1wbGljYXRpb24gb2YgcG90ZW50aWFsIGZlYXR1cmUgZW5naW5lZXJpbmcNCg0KKiBwZXJmb3JtIGZlYXR1cmUgZW5naW5lZXJpbmcgYmFzZWQgb24gRURBIGJ5IHdyaXRpbmcgYW4gUi9QeXRob24gZnVuY3Rpb24uDQoNCiogV3JpdGUgYSBtYWluIGZ1bmN0aW9uIHRvIHdyYXAgaW5kaXZpZHVhbCBmZWF0dXJlIGVuZ2luZWVyaW5nIGZ1bmN0aW9ucy4NCg0KKiBUZXN0IHRoZSBtYWluIGZ1bmN0aW9uIHdpdGggZGlmZmVyZW50IHBhdHRlcm5zIGluIHRoZSBjb21wb25lbnRzIGFuZCBzdXJlIGl0IHByb2R1Y2VzIHRoZSBleHBlY3RlZCByZXN1bHQuDQoNCg0KXA0KDQo8Y2VudGVyPjxmb250IHN0eWxlPSJmb250LXNpemU6IDIycHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBjb2xvcjogRGFya2dyZWVuOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOyI+IFBhcnQgSUk6IFJlZ3Jlc3Npb24gQW5hbHlzaXM8L2ZvbnQ+DQogIChmb3Igd2VlayAjNikNCiAgPC9jZW50ZXI+DQoNCg0KXA0KDQojIFN0YXRpc3RpY2FsIFJlZ3Jlc3Npb24gTW9kZWxpbmcNCg0KTGluZWFyIGFuZCBsb2dpc3RpYyByZWdyZXNzaW9uIG1vZGVscyBhcmUgdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBtb2RlbHMgaW4gY2xhc3NpY2FsIHN0YXRpc3RpY3MuIFRoaXMgcGFydCBvZiB0aGUgYXNzaWdubWVudCB1c2VzIHRoZSB0cmFkaXRpb25hbCBzdGF0aXN0aWNhbCBhcHByb2FjaGVzIHRvIG1vZGVsaW5nIGJ1aWxkaW5nIGFuZCBpbXBsZW1lbnRhdGlvbi4NCg0KIyMgTGluZWFyIFJlZ3Jlc3Npb24gTW9kZWxzDQoNCkNob29zZSBhIGNvbnRpbnVvdXMgdmFyaWFibGUgYXMgYSByZXNwb25zZSB0byBwZXJmb3JtIGEgbGluZWFyIHJlZ3Jlc3Npb24gYW5hbHlzaXMuIFBsZWFzZSB1c2Ugc2V2ZXJhbCBzdWJzZWN0aW9ucyB0byBvcmdhbml6ZSB5b3VyIGFuYWx5c2lzIHRoYXQgY29udGFpbiB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHMuDQoNCiogU3RhdGVtZW50IG9mIHRoZSBxdWVzdGlvbihzKSwgdGhlIHB1cnBvc2Ugb2YgdGhpcyBhbmFseXNpczogYXNzb2NpYXRpb24gYW5hbHlzaXMgb3IgcHJlZGljdGl2ZSBhbmFseXNpcz8NCg0KKiBKdXN0aWZ5IHdoZXRoZXIgdGhlIGRhdGEgc2V0IGhhcyBzdWZmaWNpZW50IGluZm9ybWF0aW9uIHRvIGFkZHJlc3MgdGhlIHF1ZXN0aW9uKHMpDQoNCiogTW9kZWwgYnVpbGRpbmcgcHJvY2VzczogaW5pdGlhbCBtb2RlbCwgZGlhZ25vc3RpY3MsIGZ1cnRoZXIgdHJhbnNmb3JtYXRpb25zIChpbiBhZGRpdGlvbiB0byB0aGUgb25lIGluIHRoZSBFREEpLCBrZXkgcGVyZm9ybWFuY2UgbWV0cmljcyBvZiBtb2RlbCBhc3Nlc3NtZW50LCBhbmQgZmluYWwgbW9kZWwgc2VsZWN0aW9uIChiYXNlZCBvbiBhcHByb3ByaWF0ZSBwZXJmb3JtYW5jZSBtZXRyaWNzKS4gWW91IGFyZSBleHBlY3RlZCB0bw0KICArIGNyZWF0ZSBhIG1vZGVsIHRoYXQgY29udGFpbnMgYSBmZXcgcHJhY3RpY2FsbHkgaW1wb3J0YW50IHZhcmlhYmxlcw0KICArIGNyZWF0ZSBhIG1vZGVsIHRoYXQgaW5jbHVkZXMgYWRkaXRpb25hbCB2YXJpYWJsZXMgdGhhdCBwb3RlbnRpYWxseSBpbmZsdWVuY2UgdGhlIHJlc3BvbnNlDQogICsgdXNlIGNlcnRhaW4gdmFyaWFibGUgc2VsZWN0aW9uIG1ldGhvZHMgdG8gaWRlbnRpZnkgdGhlIG9wdGltYWwgbW9kZWwgKGkuZS4sIHRoZSBmaW5hbCBtb2RlbCkNCiAgDQoqIEludGVycHJldGF0aW9uIG9mIHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzLiBJZiB5b3UgdHJhbnNmb3JtZWQgeW91ciByZXNwb25zZSB2YXJpYWJsZSwgeW91IG5lZWQgdG8gZG8gc29tZSBhbGdlYnJhIHRvIGNvbnZlcnQgdGhlIHRyYW5zZm9ybWVkIHJlc3BvbnNlIHZhcmlhYmxlIGJhY2sgdG8gdGhlIG9yaWdpbmFsIHNjYWxlIGJlZm9yZSB5b3UgaW50ZXJwcmV0IHRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50Lg0KDQoqIFN1bW1hcnkvZGlzY3Vzc2lvbi9yZWNvbW1lbmRhdGlvbg0KDQpZb3UgY291bGQgb3BlbiBhIHN1YnNlY3Rpb24gZm9yIGVhY2ggYnVsbGV0IHBvaW50LiANCg0KDQojIyBMb2dpc3RpYyBSZWdyZXNzaW9uIEFuYWx5c2lzDQoNCkNob29zZSBhIGJpbmFyeSB2YXJpYWJsZSBhcyBhIHJlc3BvbnNlIHRvIHBlcmZvcm0gYSBsb2dpc3RpYyByZWdyZXNzaW9uIGFuYWx5c2lzLiBJZiB5b3VyIGRhdGEgc2V0IGRvZXMgbm90IGhhdmUgYSBiaW5hcnkgY2F0ZWdvcmljYWwgdmFyaWFibGUgdGhhdCBjYW4gYmUgdXNlZCBmb3IgdGhlIGxvZ2lzdGljIHJlZ3Jlc3Npb24gbW9kZWwsIHlvdSBjYW4gZGljaG90b21pemUgYSBjb250aW51b3VzIHJlc3BvbnNlICoqaW4gYSBtZWFuaW5nZnVsIHdheSoqIGFuZCB0aGVuIGJ1aWxkIGEgbG9naXN0aWMgcmVncmVzc2lvbiBtb2RlbCB3aXRoIHRoZSBkaWNob3RvbWl6ZWQgdmFyaWFibGUuDQoNCg0KUGxlYXNlIHVzZSBzZXZlcmFsIHN1YnNlY3Rpb25zIHRvIG9yZ2FuaXplIHlvdXIgYW5hbHlzaXMgdGhhdCBjb250YWluIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50cy4NCg0KKiBTdGF0ZW1lbnQgb2YgdGhlIHF1ZXN0aW9uKHMpLCB0aGUgcHVycG9zZSBvZiB0aGlzIGFuYWx5c2lzOiBhc3NvY2lhdGlvbiBhbmFseXNpcyBvciBwcmVkaWN0aXZlIGFuYWx5c2lzPw0KDQoqIEp1c3RpZnkgd2hldGhlciB0aGUgZGF0YSBzZXQgaGFzIHN1ZmZpY2llbnQgaW5mb3JtYXRpb24gdG8gYWRkcmVzcyB0aGUgcXVlc3Rpb24ocykNCg0KKiBNb2RlbCBidWlsZGluZyBwcm9jZXNzOiBpbml0aWFsIG1vZGVsLCBkaWFnbm9zdGljcywgdHJhbnNmb3JtYXRpb24gYW5kIHNjYWxpbmcgKGluIGFkZGl0aW9uIHRvIHRoZSBvbmUgaW4gdGhlIEVEQSksIGtleSBwZXJmb3JtYW5jZSBtZXRyaWNzIG9mIG1vZGVsIGFzc2Vzc21lbnQsIGFuZCBmaW5hbCBtb2RlbCBzZWxlY3Rpb24gKGJhc2VkIG9uIGNlcnRhaW4gcGVyZm9ybWFuY2UgbWV0cmljcykuIEZvciBwcmFjdGljZSwgeW91IGFyZSBleHBlY3RlZCB0bw0KICArIGNyZWF0ZSBhIG1vZGVsIHRoYXQgY29udGFpbnMgYSBmZXcgcHJhY3RpY2FsbHkgaW1wb3J0YW50IHZhcmlhYmxlcw0KICArIGNyZWF0ZSBhIG1vZGVsIHRoYXQgaW5jbHVkZXMgYWRkaXRpb25hbCB2YXJpYWJsZXMgdGhhdCBwb3RlbnRpYWxseSBpbmZsdWVuY2UgdGhlIHJlc3BvbnNlDQogICsgdXNlIGNlcnRhaW4gdmFyaWFibGUgc2VsZWN0aW9uIG1ldGhvZHMgdG8gaWRlbnRpZnkgdGhlIG9wdGltYWwgbW9kZWwgKGkuZS4sIHRoZSBmaW5hbCBtb2RlbCkNCiAgDQoqIFRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgZmluYWwgbW9kZWw6IGludGVycHJldCB0aGUgcmVncmVzc2lvbiBjb2VmZmljaWVudCBhbmQgYXBwbGljYXRpb25zIG9mIHRoZSBtb2RlbC4NCg0KKiBTdW1tYXJ5L2Rpc2N1c3Npb24vcmVjb21tZW5kYXRpb24NCg0KDQpZb3UgY291bGQgb3BlbiBhIHN1YnNlY3Rpb24gZm9yIGVhY2ggYnVsbGV0IHBvaW50LiANCg0KDQpcDQoNCjxjZW50ZXI+PGZvbnQgc3R5bGU9ImZvbnQtc2l6ZTogMjJweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGNvbG9yOiBEYXJrZ3JlZW47DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7Ij4gUGFydCBJSUk6IFJlcG9ydCBSZXZpc2lvbi0gSW5jbHVkaW5nIENyb3NzIFZhbGlkYXRpb248L2ZvbnQ+DQogIChmb3Igd2VlayAjNykNCiAgPC9jZW50ZXI+DQoNClwNCg0KIyBQcmVkaWN0aXZlIE1vZGVsaW5nIA0KDQpUaGUgaWRlYSBpcyB0byB1c2UgKipkYXRhLWRyaXZlbiBhcHByb2FjaGVzKiogdG8gZGF0YSBzcGxpdHRpbmcgYW5kIHRoZW4gYXBwbHkgY3Jvc3MtdmFsaWRhdGlvbiBtZXRob2RzIHRvIHNlbGVjdCB0aGUgZmluYWwgbW9kZWwgZnJvbSBhIHBvb2wgb2YgY2FuZGlkYXRlIG1vZGVscyBiYXNlZCBvbiAqKnByZWRpY3RpdmUgcGVyZm9ybWFuY2UgbWV0cmljKiogc3VjaCBhcyAqKk1TRSoqIGZvciBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbHMgYW5kICoqYWNjdXJhY3kqKiwgKipzZW5zaXRpdml0eSoqLCBvciAqKnNwZWNpZmljaXR5KiogZm9yIGxvZ2lzdGljIHJlZ3Jlc3Npb24gbW9kZWxzLg0KDQoqKlN1Z2dlc3RlZCBDb21wb25lbnRzIGluIHRoZSBQcmVkaWN0aXZlIEFuYWx5c2lzKioNCg0KKiAqcmFuZG9tIHNwbGl0dGluZyogLSB1c2luZyByYW5kb20gc3BsaXR0aW5nIGZvciBhbGwgZGF0YSBwYXJ0aXRpb25zLg0KDQoqICpUd28td2F5IGRhdGEgc3BsaXR0aW5nKiAtIGRhdGEgc3BsaXQgaW50byA3NSUgZm9yIHRyYWluaW5nIGFuZCB2YWxpZGF0aW9uIGFuZCAyNSUgZm9yIHRlc3RpbmcuIA0KDQoqICo1LWZvbGQgY3Jvc3MtdmFsaWRhdGlvbiogLSB1c2luZyBhIDUtZm9sZCBjcm9zcy12YWxpZGF0aW9uIGFsZ29yaXRobSBvbiB0aGUgdHJhaW5pbmcgZGF0YQ0KDQpcDQoNCiMjIFByZWRpY3Rpb24gTGluZWFyIFJlZ3Jlc3Npb24NCg0KVGhlIHByaW1hcnkgcHJlZGljdGl2ZSBwZXJmb3JtYW5jZSBtZXRyaWMgZm9yIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsaW5nIGlzIHRoZSBtZWFuIHNxdWFyZSBlcnJvciA8Zm9udCBjb2xvciA9ICJyZWQiPiAodGhlIGF2ZXJhZ2Ugc3F1YXJlZCBlcnJvciBiZXR3ZWVuIHByZWRpY3RlZCBhbmQgdGhlIG9ic2VydmVkIHZhbHVlcyBvZiB0aGUgcmVzcG9uc2UgdmFyaWFibGUgPGI+aW4gaXRzIG9yaWdpbmFsIHNjYWxlKTwvYj48L2ZvbnQ+LiANCg0KT3RoZXIgcHJlZGljdGl2ZSBwZXJmb3JtYW5jZSBtZXRyaWNzIHRoYXQgY2FuIGFsc28gYmUgdXNlZCBhcmUgJFJeMiQgb3IgJFJeMl97YWRqfSQuIA0KDQpMaWtlbGlob29kLWJhc2VkIG1ldHJpY3Mgc3VjaCBhcyBBSUMgYW5kIFNCQyBjYW4gYmUgdXNlZCBpZiB0aGUgbGlrZWxpaG9vZCBmdW5jdGlvbnMgb2YgYWxsIGNhbmRpZGF0ZSBtb2RlbHMgYXJlIGF0IHRoZSBzYW1lIHNjYWxlLiBUaGVzZSBtZWFzdXJlcyBhcmUgbm90IGFzIGludHVpdGl2ZSBhcyB0aGUgTVNFIHNpbmNlIE1TRSBpcyBhIHNxdWFyZWQgJyoqZGlzdGFuY2UqKicgaW4gdGhlIEV1Y2xpZGVhbiBzcGFjZS4NCg0KPGZvbnQgY29sb3IgPSAicmVkIj4qXGNvbG9ye3JlZH1JZiB0aGUgcmVzcG9uc2UgdmFyaWFibGVzIGluIGFsbCBjYW5kaWRhdGUgbW9kZWxzIGFyZSBhdCB0aGUgc2FtZSBzY2FsZSwgdGhlIE1TRSBpcyBleHBlY3RlZCB0byBiZSB1c2VkIGluIHRoZSBjcm9zcy12YWxpZGF0aW9uIGZvciBtb2RlbCBzZWxlY3Rpb24uKjwvZm9udD4NCg0KDQojIyBMb2dpc3RpYyBQcmVkaWN0aXZlIE1vZGVsaW5nDQoNClRoZSBwcmltYXJ5IHRvb2wgZm9yIGFzc2Vzc2luZyB0aGUgZ2xvYmFsIHByZWRpY3RpdmUgcGVyZm9ybWFuY2Ugb2YgbG9naXN0aWMgbW9kZWxzIGlzIFJPQyBjdXJ2ZSBhbmFseXNpcyAodGhpcyBpbmNsdWRlcyB0aGUgYXJlYSB1bmRlciB0aGUgUk9DIGN1cnZlIC0gQVVDKS4gUk9DIGN1cnZlIHN1Z2dlc3RlZCBmb3IgdGhpcyBhc3NpZ25tZW50Lg0KDQpPdGhlciBwcmVkaWN0aXZlIHBlcmZvcm1hbmNlIG1lYXN1cmVzIHRoYXQgY2FuIGJlIGNvbnNpZGVyZWQgYXJlICoqYWNjdXJhY3kqKiwgKipzZW5zaXRpdml0eSoqLCBhbmQgKipzcGVjaWZpY2l0eSoqLg0KDQo8Zm9udCBjb2xvciA9ICJyZWQiPipcY29sb3J7cmVkfVJlcG9ydGluZyBST0MgYW5kIEFVQyBpcyByZXF1aXJlZCB3aGVuIGNvbXBhcmluZyBjYW5kaWRhdGUgbW9kZWxzLio8L2ZvbnQ+DQoNCg0KIyMgVGVzdGluZyBQZXJmb3JtYW5jZSANCg0KQWZ0ZXIgdGhlIGZpbmFsIG1vZGVsIGlzIGlkZW50aWZpZWQsIHlvdSBuZWVkIHRvIHVzZSB0aGUgMjUlIHRlc3RpbmcgZGF0YSBzZXQgdG8gcmVwb3J0IHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgY29ycmVzcG9uZGluZyBtb2RlbHMgb24gdGhlICoqbmV3IGRhdGEqKi4gDQoNCg==