1 Assignment Preparation

All assignments must be prepared in R Markdown. The dataset used for your project must be read directly from a URL in RMarkdown so that I can run your source file on my machine without making any modifications. If your dataset is not available on a website, you may upload the file to your GitHub repository and read it directly from there. We will outline the steps to configure your GitHub repository and locate the correct URL for your dataset in a subsequent section.

A well-structured statistical or data science report ensures clarity, reproducibility, and actionable insights. Below is a standard structure, adaptable based on the audience (technical vs. non-technical) and project scope

  • Introduction
    • Problem statement: What question(s) are you addressing?
    • Objectives: Goals of the analysis (e.g., prediction, inference, exploration).
    • Background: Context (industry, prior work, why the problem matters).
    • Data source(s): How/where was data collected?
  • Data Description
    • Dataset overview: Size (rows, columns), variables, time range.
    • Variables: List with descriptions (include units, measurement scales).
    • Data collection methods: Sampling, biases, limitations.
    • Ethical considerations: Privacy, anonymization, biases.
  • Data Processing
    • Handling missing values, outliers, and duplicates.
    • Transformations, scaling, etc.
  • Exploratory Data Analysis (EDA)
    • Visualizations (distributions, correlations, trends).
    • Summary statistics.
  • Modeling approach
    • Algorithms chosen (e.g., linear regression, random forest) and why.
    • Validation strategy (train-test split, cross-validation).
    • Performance metrics (e.g., RMSE, accuracy, AUC-ROC).
  • Results
    • Key findings: Supported by visuals (tables, graphs).
    • Model performance: Metrics compared to benchmarks/baselines.
    • Statistical significance: p-values, confidence intervals (if applicable).
    • Limitations: Assumptions, caveats, or unexpected results.
  • Discussion
    • Interpretation: What do the results mean in context?
    • Comparison to expectations: Hypotheses confirmed/rejected?
    • Broader implications: Business, scientific, or policy recommendations.
    • Failures/unanswered questions: What didn’t work? Why?
  • Conclusion & Recommendations
    • Summary: Reiterate key takeaways.
  • References
    • Citations for papers (if any).

2 Assignment Submission

First of all, all assignments must be submitted to the D2L dropbox. Please don’t send your report via email. To submit your report to D2L dropbox, go to D2L to submit your work: Assessment => Assignments.

  • Two required files
    • upload the RMarkdown source file to Dropbox, and
    • Copy the URL of your published report and paste it into the D2L dropbox as required for all assignments throughout the semester.

3 Publishing Report on RPubs

  • Steps for publishing your HTML format report on RPubs
    • Register an RPubs account (https://rpubs.com/)
    • Stay singed in to your account
    • Knit you RMarkdown report to HTML format
    • Click the RPubs publish icon on the top-right of your HTML document.
    • Select RPubs
    • Click Publish
    • Add a title of your report in the title field (this helps others find your report via search)
    • (Optional but recommended) Add a brief description summarizing your report.
    • Enter a descriptive filename to complete your report’s URL.
    • Click Continue
    • Your report will now be published in RPubs
    • Copy the URL of your published report and paste it into the D2L dropbox as required for all assignments throughout the semester.

4 Publishing Report on GitHub Repository

The following is a step-by-step guide to setting up a GitHub repository for a webpage and finding its accessible URL

  • Sign in to your GitHub account
    • Use my GitHub account pengdsci as an example.
  • Create a New Repository
    • Click the + icon in the top-right corner and select New repository.
    • Name your repository: for example, STA888.
    • Choose Public (Private repos require a paid plan for GitHub Pages).
    • Check: Add a README file (optional but recommended).
    • Click Create repository.
  • Upload Data and Report Files
    • To upload your first file to the repository,
      • Go to Quick setup, click uploading an existing file
      • Drag and drop your files for batch uploading
    • To upload subsequent files
      • Click + next to the green button <>Code and select Upload files
      • Drag and drop the files you want to upload.
  • Create a Folder with a Repository: Creating folders and sub-folders within a repository helps organize different types of files, such as images, data, and notes. To create a folder in a repository:
    • Click + next to the green button <>Code and select Create new files
    • In the Name your file... field, enter your folder name followed by / (e.g., project/) and hit Enter.
    • Add a keyword describing the folder’s purpose (e.g., project-files) in the field Name your file...
    • Click the green button labeled with Commit change… to finalize the folder creation.
    • Repeat these steps to create additional folders or sub-folders as needed.
  • Enable/Configure GitHub Pages
    • Go to your repository’s Settings tab.
    • In the left sidebar, click Pages.
    • Under Build and deployment
      • Branch: click None drop down, select main
      • Folder: select the default / (root).
    • Click Save.
  • Find Your Accessible URL of the Repository:
    • Wait a few moments after you save the configurations in the above step, refresh the page, and you will see the URL of your repository under GitHub Pages:
    • If your repository has a file named index.html, this file will be displayed when visiting the URL. Otherwise, you will see a 404 error page. This does not mean that you set up the page incorrectly. It simply means that you don’t have an HTML file named index.html in your repository.
  • Once your repository is enabled/configured, you can locate the URLs of specific files. For illustration, we assume the repository is named STA888 and your GitHub account is pengdsci.
    • Example 1: If a PDF file named guidelines.pdf is in the repository STA888, its URL would be: https://pengdsci.github.io/STA888/guidelines.pdf.[this is only a hypothetical URL].
    • Example 2: If an HTML report named report01.html is in a folder called project, its URL would be: https://pengdsci.github.io/STA888/project/report01.html. [this is only a hypothetical URL].
    • If you have created subfolders or nested subfolders, you can use the same pattern to locate the URL of a file within any specific folder or subfolder.
    Best Practices for Folder Structure: Create a directory on your machine using the same repository name and mirror the folder structure from your GitHub repository. This will simplify future updates and new file creation.
LS0tDQp0aXRsZTogJ0d1aWRlbGluZXMgZm9yIEFzc2lnbm1lbnQgUHJlcGFyYXRpb24gYW5kIFN1Ym1pc3Npb24nDQphdXRob3I6ICcnDQpkYXRlOiAiIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiAgICAgICAgICAgIyBvdXRwdXQgZG9jdW1lbnQgZm9ybWF0DQogICAgdG9jOiB5ZXMgICAgICAgICAgICAgICAjIGFkZCB0YWJsZSBjb250ZW50cw0KICAgIHRvY19mbG9hdDogeWVzICAgICAgICAgIyB0b2NfcHJvcGVydHk6IGZsb2F0aW5nDQogICAgdG9jX2RlcHRoOiA0ICAgICAgICAgICAjIGRlcHRoIG9mIFRPQyBoZWFkaW5ncw0KICAgIGZpZ193aWR0aDogNiAgICAgICAgICAgIyBnbG9iYWwgZmlndXJlIHdpZHRoDQogICAgZmlnX2hlaWdodDogNCAgICAgICAgICAjIGdsb2JhbCBmaWd1cmUgaGVpZ2h0DQogICAgZmlnX2NhcHRpb246IHllcyAgICAgICAjIGFkZCBmaWd1cmUgY2FwdGlvbg0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzICAgIyBudW1iZXJpbmcgc2VjdGlvbiBoZWFkaW5ncw0KICAgIHRvY19jb2xsYXBzZWQ6IHllcyAgICAgIyBUT0Mgc3ViaGVhZGluZyBjbGFwc2luZw0KICAgIGNvZGVfZm9sZGluZzogaGlkZSAgICAgIyBmb2xkaW5nL3Nob3dpbmcgY29kZSANCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMgICAgICMgYWxsb3cgdG8gZG93bmxvYWQgY29tcGxldGUgUk1hcmtkb3duIHNvdXJjZSBjb2RlDQogICAgc21vb3RoX3Njcm9sbDogeWVzICAgICAjIHNjcm9sbGluZyB0ZXh0IG9mIHRoZSBkb2N1bWVudA0KICAgIHRoZW1lOiBsdW1lbiAgICAgICAgICAgIyB2aXN1YWwgdGhlbWUgZm9yIEhUTUwgZG9jdW1lbnQgb25seQ0KICAgIGhpZ2hsaWdodDogdGFuZ28gICAgICAgIyBjb2RlIHN5bnRheCBoaWdodGxpZ2h0aW5nIHN0eWxlcw0KICBwZGZfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogIHdvcmRfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6ICc0Jw0KLS0tDQoNCmBgYHtjc3MsIGVjaG8gPSBGQUxTRX0NCmRpdiNUT0MgbGkgeyAgICAgLyogdGFibGUgb2YgY29udGVudCAgKi8NCiAgICBsaXN0LXN0eWxlOnVwcGVyLXJvbWFuOw0KICAgIGJhY2tncm91bmQtaW1hZ2U6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXJlcGVhdDpub25lOw0KICAgIGJhY2tncm91bmQtcG9zaXRpb246MDsNCn0NCg0KaDEudGl0bGUgeyAgICAvKiBsZXZlbCAxIGhlYWRlciBvZiB0aXRsZSAgKi8NCiAgZm9udC1zaXplOiAyNHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgY29sb3I6IERhcmtSZWQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDQuYXV0aG9yIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmg0LmRhdGUgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgY29sb3I6IERhcmtCbHVlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmgxIHsgLyogSGVhZGVyIDEgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDIwcHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoMiB7IC8qIEhlYWRlciAyIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsgLyogSGVhZGVyIDMgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE2cHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDQgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KLyogQWRkIGRvdHMgYWZ0ZXIgbnVtYmVyZWQgaGVhZGVycyAqLw0KLmhlYWRlci1zZWN0aW9uLW51bWJlcjo6YWZ0ZXIgew0KICBjb250ZW50OiAiLiI7DQp9DQpgYGANCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQojIGNvZGUgY2h1bmsgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIFIgY29kZSwgd2FybmluZ3MsIGFuZCBvdXRwdXQgDQojIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBmaWxlcy4NCg0KaWYgKCFyZXF1aXJlKCJrbml0ciIpKSB7ICAgICAgICAgICAgICAgICAgICAgICMgdXNlIGNvbmRpdGlvbmFsIHN0YXRlbWVudCB0byBkZXRlY3QNCiAgIGluc3RhbGwucGFja2FnZXMoImtuaXRyIikgICAgICAgICAgICAgICAgICAjIHdoZXRoZXIgYSBwYWNrYWdlIHdhcyBpbnN0YWxsZWQgaW4NCiAgIGxpYnJhcnkoa25pdHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHlvdXIgbWFjaGluZS4gSWYgbm90LCBpbnN0YWxsIGl0IGFuZA0KfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbG9hZCBpdCB0byB0aGUgd29ya2luZyBkaXJlY3RvcnkuDQojDQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsICAgICAgICAgICAgIyBpbmNsdWRlIGNvZGUgY2h1bmsgaW4gdGhlIG91dHB1dCBmaWxlDQogICAgICAgICAgICAgICAgICAgICAgd2FybmluZyA9IEZBTFNFLCAgICAgICAgIyBzb21ldGltZXMsIHlvdSBjb2RlIG1heSBwcm9kdWNlIHdhcm5pbmcgbWVzc2FnZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB5b3UgY2FuIGNob29zZSB0byBpbmNsdWRlIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIGluDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgb3V0cHV0IGZpbGUuIA0KICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBUUlVFLCAgICAgICAgICMgeW91IGNhbiBhbHNvIGRlY2lkZSB3aGV0aGVyIHRvIGluY2x1ZGUgdGhlIG91dHB1dA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaW4gdGhlIG91dHB1dCBmaWxlLg0KICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBGQUxTRSwgICAgICAgICMgc3VwcHJlc3MgbWVzc2FnZXMgDQogICAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IE5BICAgICAgICAgICAgIyByZW1vdmUgdGhlIGRlZmF1bHQgbGVhZGluZyBoYXNoIHRhZ3MgaW4gdGhlIG91dHB1dA0KICAgICAgICAgICAgICAgICAgICAgICkgICANCmBgYA0KDQpcDQoNClwNCg0KIyBBc3NpZ25tZW50IFByZXBhcmF0aW9uDQoNCkFsbCBhc3NpZ25tZW50cyBtdXN0IGJlIHByZXBhcmVkIGluIFIgTWFya2Rvd24uIFRoZSBkYXRhc2V0IHVzZWQgZm9yIHlvdXIgcHJvamVjdCBtdXN0IGJlIHJlYWQgZGlyZWN0bHkgZnJvbSBhIFVSTCBpbiBSTWFya2Rvd24gc28gdGhhdCBJIGNhbiBydW4geW91ciBzb3VyY2UgZmlsZSBvbiBteSBtYWNoaW5lIHdpdGhvdXQgbWFraW5nIGFueSBtb2RpZmljYXRpb25zLiBJZiB5b3VyIGRhdGFzZXQgaXMgbm90IGF2YWlsYWJsZSBvbiBhIHdlYnNpdGUsIHlvdSBtYXkgdXBsb2FkIHRoZSBmaWxlIHRvIHlvdXIgR2l0SHViIHJlcG9zaXRvcnkgYW5kIHJlYWQgaXQgZGlyZWN0bHkgZnJvbSB0aGVyZS4gV2Ugd2lsbCBvdXRsaW5lIHRoZSBzdGVwcyB0byBjb25maWd1cmUgeW91ciBHaXRIdWIgcmVwb3NpdG9yeSBhbmQgbG9jYXRlIHRoZSBjb3JyZWN0IFVSTCBmb3IgeW91ciBkYXRhc2V0IGluIGEgc3Vic2VxdWVudCBzZWN0aW9uLg0KDQpBIHdlbGwtc3RydWN0dXJlZCBzdGF0aXN0aWNhbCBvciBkYXRhIHNjaWVuY2UgcmVwb3J0IGVuc3VyZXMgY2xhcml0eSwgcmVwcm9kdWNpYmlsaXR5LCBhbmQgYWN0aW9uYWJsZSBpbnNpZ2h0cy4gQmVsb3cgaXMgYSBzdGFuZGFyZCBzdHJ1Y3R1cmUsIGFkYXB0YWJsZSBiYXNlZCBvbiB0aGUgYXVkaWVuY2UgKHRlY2huaWNhbCB2cy4gbm9uLXRlY2huaWNhbCkgYW5kIHByb2plY3Qgc2NvcGUNCg0KKiAqKkludHJvZHVjdGlvbioqDQogICsgKipQcm9ibGVtIHN0YXRlbWVudCoqOiBXaGF0IHF1ZXN0aW9uKHMpIGFyZSB5b3UgYWRkcmVzc2luZz8NCiAgKyAqKk9iamVjdGl2ZXMqKjogR29hbHMgb2YgdGhlIGFuYWx5c2lzIChlLmcuLCBwcmVkaWN0aW9uLCBpbmZlcmVuY2UsIGV4cGxvcmF0aW9uKS4NCiAgKyAqKkJhY2tncm91bmQqKjogQ29udGV4dCAoaW5kdXN0cnksIHByaW9yIHdvcmssIHdoeSB0aGUgcHJvYmxlbSBtYXR0ZXJzKS4NCiAgKyAqKkRhdGEgc291cmNlKHMpKio6IEhvdy93aGVyZSB3YXMgZGF0YSBjb2xsZWN0ZWQ/DQoNCiogKipEYXRhIERlc2NyaXB0aW9uKioNCiAgKyAqKkRhdGFzZXQgb3ZlcnZpZXcqKjogU2l6ZSAocm93cywgY29sdW1ucyksIHZhcmlhYmxlcywgdGltZSByYW5nZS4NCiAgKyAqKlZhcmlhYmxlcyoqOiBMaXN0IHdpdGggZGVzY3JpcHRpb25zIChpbmNsdWRlIHVuaXRzLCBtZWFzdXJlbWVudCBzY2FsZXMpLg0KICArICoqRGF0YSBjb2xsZWN0aW9uIG1ldGhvZHMqKjogU2FtcGxpbmcsIGJpYXNlcywgbGltaXRhdGlvbnMuDQogICsgKipFdGhpY2FsIGNvbnNpZGVyYXRpb25zKio6IFByaXZhY3ksIGFub255bWl6YXRpb24sIGJpYXNlcy4NCg0KKiAqKkRhdGEgUHJvY2Vzc2luZyoqDQogICsgSGFuZGxpbmcgbWlzc2luZyB2YWx1ZXMsIG91dGxpZXJzLCBhbmQgZHVwbGljYXRlcy4NCiAgKyBUcmFuc2Zvcm1hdGlvbnMsIHNjYWxpbmcsIGV0Yy4NCg0KKiAqKkV4cGxvcmF0b3J5IERhdGEgQW5hbHlzaXMgKEVEQSkqKg0KICArIFZpc3VhbGl6YXRpb25zIChkaXN0cmlidXRpb25zLCBjb3JyZWxhdGlvbnMsIHRyZW5kcykuDQogICsgU3VtbWFyeSBzdGF0aXN0aWNzLg0KDQoqICoqTW9kZWxpbmcgYXBwcm9hY2gqKg0KICArIEFsZ29yaXRobXMgY2hvc2VuIChlLmcuLCBsaW5lYXIgcmVncmVzc2lvbiwgcmFuZG9tIGZvcmVzdCkgYW5kIHdoeS4NCiAgKyBWYWxpZGF0aW9uIHN0cmF0ZWd5ICh0cmFpbi10ZXN0IHNwbGl0LCBjcm9zcy12YWxpZGF0aW9uKS4NCiAgKyBQZXJmb3JtYW5jZSBtZXRyaWNzIChlLmcuLCBSTVNFLCBhY2N1cmFjeSwgQVVDLVJPQykuDQoNCiogKipSZXN1bHRzKioNCiAgKyBLZXkgZmluZGluZ3M6IFN1cHBvcnRlZCBieSB2aXN1YWxzICh0YWJsZXMsIGdyYXBocykuDQogICsgTW9kZWwgcGVyZm9ybWFuY2U6IE1ldHJpY3MgY29tcGFyZWQgdG8gYmVuY2htYXJrcy9iYXNlbGluZXMuDQogICsgU3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlOiBwLXZhbHVlcywgY29uZmlkZW5jZSBpbnRlcnZhbHMgKGlmIGFwcGxpY2FibGUpLg0KICArIExpbWl0YXRpb25zOiBBc3N1bXB0aW9ucywgY2F2ZWF0cywgb3IgdW5leHBlY3RlZCByZXN1bHRzLg0KDQoqICoqRGlzY3Vzc2lvbioqDQogICsgSW50ZXJwcmV0YXRpb246IFdoYXQgZG8gdGhlIHJlc3VsdHMgbWVhbiBpbiBjb250ZXh0Pw0KICArIENvbXBhcmlzb24gdG8gZXhwZWN0YXRpb25zOiBIeXBvdGhlc2VzIGNvbmZpcm1lZC9yZWplY3RlZD8NCiAgKyBCcm9hZGVyIGltcGxpY2F0aW9uczogQnVzaW5lc3MsIHNjaWVudGlmaWMsIG9yIHBvbGljeSByZWNvbW1lbmRhdGlvbnMuDQogICsgRmFpbHVyZXMvdW5hbnN3ZXJlZCBxdWVzdGlvbnM6IFdoYXQgZGlkbuKAmXQgd29yaz8gV2h5Pw0KDQoqICoqQ29uY2x1c2lvbiAmIFJlY29tbWVuZGF0aW9ucyoqDQogICsgU3VtbWFyeTogUmVpdGVyYXRlIGtleSB0YWtlYXdheXMuDQoNCiogKipSZWZlcmVuY2VzKioNCiAgKyBDaXRhdGlvbnMgZm9yIHBhcGVycyAoaWYgYW55KS4NCg0KDQoNCg0KIyBBc3NpZ25tZW50IFN1Ym1pc3Npb24NCg0KRmlyc3Qgb2YgYWxsLCBhbGwgYXNzaWdubWVudHMgbXVzdCBiZSBzdWJtaXR0ZWQgdG8gdGhlIEQyTCBkcm9wYm94LiBQbGVhc2UgZG9uJ3Qgc2VuZCB5b3VyIHJlcG9ydCB2aWEgZW1haWwuIFRvIHN1Ym1pdCB5b3VyIHJlcG9ydCB0byBEMkwgZHJvcGJveCwgZ28gdG8gRDJMIHRvIHN1Ym1pdCB5b3VyIHdvcms6ICoqQXNzZXNzbWVudCA9PiBBc3NpZ25tZW50cyoqLg0KDQoqIFR3byByZXF1aXJlZCBmaWxlcw0KICArICoqdXBsb2FkKiogdGhlIFJNYXJrZG93biBzb3VyY2UgZmlsZSB0byBEcm9wYm94LCBhbmQNCiAgKyAqKkNvcHkgdGhlIFVSTCoqIG9mIHlvdXIgcHVibGlzaGVkIHJlcG9ydCBhbmQgKipwYXN0ZSBpdCBpbnRvIHRoZSBEMkwgZHJvcGJveCoqIGFzIDxmb250IGNvbG9yID0gInJlZCI+KipcY29sb3J7cmVkfXJlcXVpcmVkIGZvciBhbGwgYXNzaWdubWVudHMgdGhyb3VnaG91dCB0aGUgc2VtZXN0ZXIqKi48L2ZvbnQ+IA0KDQoNCg0KDQojIFB1Ymxpc2hpbmcgUmVwb3J0IG9uIFJQdWJzDQoNCg0KKiBTdGVwcyBmb3IgcHVibGlzaGluZyB5b3VyIEhUTUwgZm9ybWF0IHJlcG9ydCBvbiBSUHVicw0KICArICoqUmVnaXN0ZXIgYW4gUlB1YnMgYWNjb3VudCoqICg8aHR0cHM6Ly9ycHVicy5jb20vPikNCiAgKyAqKlN0YXkgc2luZ2VkIGluKiogdG8geW91ciBhY2NvdW50DQogICsgKipLbml0IHlvdSBSTWFya2Rvd24gcmVwb3J0KiogdG8gSFRNTCBmb3JtYXQNCiAgKyAqKkNsaWNrIHRoZSBSUHVicyBwdWJsaXNoIGljb24qKiA8aW1nIHNyYz0iUlB1YnNJY29uLnBuZyIgd2lkdGg9IjkwIiBoZWlnaHQ9IjIwIj4gb24gdGhlIHRvcC1yaWdodCBvZiB5b3VyIEhUTUwgZG9jdW1lbnQuDQogICsgU2VsZWN0ICoqUlB1YnMqKg0KICArIENsaWNrICoqUHVibGlzaCoqDQogICsgKipBZGQgYSB0aXRsZSoqIG9mIHlvdXIgcmVwb3J0IGluIHRoZSAqKnRpdGxlKiogZmllbGQgKHRoaXMgaGVscHMgb3RoZXJzIGZpbmQgeW91ciByZXBvcnQgdmlhIHNlYXJjaCkNCiAgKyAoT3B0aW9uYWwgYnV0IHJlY29tbWVuZGVkKSAqKkFkZCBhIGJyaWVmIGRlc2NyaXB0aW9uKiogc3VtbWFyaXppbmcgeW91ciByZXBvcnQuDQogICsgKipFbnRlciBhIGRlc2NyaXB0aXZlIGZpbGVuYW1lKiogdG8gY29tcGxldGUgeW91ciByZXBvcnTigJlzIFVSTC4NCiAgKyBDbGljayAqKkNvbnRpbnVlKioNCiAgKyBZb3VyIHJlcG9ydCB3aWxsIG5vdyBiZSBwdWJsaXNoZWQgaW4gKipSUHVicyoqDQogICsgKipDb3B5IHRoZSBVUkwqKiBvZiB5b3VyIHB1Ymxpc2hlZCByZXBvcnQgYW5kICoqcGFzdGUgaXQgaW50byB0aGUgRDJMIGRyb3Bib3gqKiBhcyA8Zm9udCBjb2xvciA9ICJyZWQiPioqXGNvbG9ye3JlZH1yZXF1aXJlZCBmb3IgYWxsIGFzc2lnbm1lbnRzIHRocm91Z2hvdXQgdGhlIHNlbWVzdGVyKiouPC9mb250Pg0KICANCiAgDQojIFB1Ymxpc2hpbmcgUmVwb3J0IG9uIEdpdEh1YiBSZXBvc2l0b3J5DQoNCg0KVGhlIGZvbGxvd2luZyBpcyBhIHN0ZXAtYnktc3RlcCBndWlkZSB0byBzZXR0aW5nIHVwIGEgR2l0SHViIHJlcG9zaXRvcnkgZm9yIGEgd2VicGFnZSBhbmQgZmluZGluZyBpdHMgYWNjZXNzaWJsZSBVUkwNCg0KKiAqKlNpZ24gaW4gdG8geW91ciBHaXRIdWIgYWNjb3VudCoqIA0KICArIFVzZSBteSBHaXRIdWIgYWNjb3VudCBgcGVuZ2RzY2lgIGFzIGFuIGV4YW1wbGUuDQoNCiogKipDcmVhdGUgYSA8Zm9udCBjb2xvciA9ICJyZWQiPk5ldyBSZXBvc2l0b3J5PC9mb250PioqDQogICsgQ2xpY2sgdGhlIGArYCBpY29uIGluIHRoZSB0b3AtcmlnaHQgY29ybmVyIGFuZCBzZWxlY3QgKipOZXcgcmVwb3NpdG9yeSoqLg0KICArIE5hbWUgeW91ciByZXBvc2l0b3J5OiBmb3IgZXhhbXBsZSwgYFNUQTg4OGAuDQogICsgQ2hvb3NlIFB1YmxpYyAoUHJpdmF0ZSByZXBvcyByZXF1aXJlIGEgcGFpZCBwbGFuIGZvciBHaXRIdWIgUGFnZXMpLg0KICArIENoZWNrOiBBZGQgYSBSRUFETUUgZmlsZSAob3B0aW9uYWwgYnV0IHJlY29tbWVuZGVkKS4NCiAgKyBDbGljayBDcmVhdGUgcmVwb3NpdG9yeS4NCiAgDQoNCiogKipVcGxvYWQgRGF0YSBhbmQgUmVwb3J0IEZpbGVzKioNCiAgKyBUbyB1cGxvYWQgeW91ciBmaXJzdCBmaWxlIHRvIHRoZSByZXBvc2l0b3J5LCANCiAgICAtIEdvIHRvICoqUXVpY2sgc2V0dXAqKiwgY2xpY2sgYHVwbG9hZGluZyBhbiBleGlzdGluZyBmaWxlYA0KICAgIC0gRHJhZyBhbmQgZHJvcCB5b3VyIGZpbGVzIGZvciBiYXRjaCB1cGxvYWRpbmcNCiAgKyBUbyB1cGxvYWQgc3Vic2VxdWVudCBmaWxlcw0KICAgIC0gQ2xpY2sgYCtgIG5leHQgdG8gdGhlIGdyZWVuIGJ1dHRvbiAqKjw+Q29kZSoqIGFuZCBzZWxlY3QgYFVwbG9hZCBmaWxlc2ANCiAgICAtIERyYWcgYW5kIGRyb3AgdGhlIGZpbGVzIHlvdSB3YW50IHRvIHVwbG9hZC4NCg0KKiAqKkNyZWF0ZSBhIEZvbGRlciB3aXRoIGEgUmVwb3NpdG9yeSoqOiBDcmVhdGluZyBmb2xkZXJzIGFuZCBzdWItZm9sZGVycyB3aXRoaW4gYSByZXBvc2l0b3J5IGhlbHBzIG9yZ2FuaXplIGRpZmZlcmVudCB0eXBlcyBvZiBmaWxlcywgc3VjaCBhcyBpbWFnZXMsIGRhdGEsIGFuZCBub3Rlcy4gVG8gY3JlYXRlIGEgZm9sZGVyIGluIGEgcmVwb3NpdG9yeToNCiAgKyBDbGljayBgK2AgbmV4dCB0byB0aGUgZ3JlZW4gYnV0dG9uICoqPD5Db2RlKiogYW5kIHNlbGVjdCBgQ3JlYXRlIG5ldyBmaWxlc2ANCiAgKyBJbiB0aGUgYE5hbWUgeW91ciBmaWxlLi4uYCBmaWVsZCwgZW50ZXIgeW91ciBmb2xkZXIgbmFtZSBmb2xsb3dlZCBieSAqKi8qKiAoZS5nLiwgYHByb2plY3QvYCkgYW5kIGhpdCAqKkVudGVyKiouDQogICsgQWRkIGEga2V5d29yZCBkZXNjcmliaW5nIHRoZSBmb2xkZXLigJlzIHB1cnBvc2UgKGUuZy4sIGBwcm9qZWN0LWZpbGVzYCkgaW4gdGhlIGZpZWxkIGBOYW1lIHlvdXIgZmlsZS4uLmANCiAgKyBDbGljayB0aGUgZ3JlZW4gYnV0dG9uIGxhYmVsZWQgd2l0aCAqKkNvbW1pdCBjaGFuZ2UuLi4qKiB0byBmaW5hbGl6ZSB0aGUgZm9sZGVyIGNyZWF0aW9uLg0KICArIFJlcGVhdCB0aGVzZSBzdGVwcyB0byBjcmVhdGUgYWRkaXRpb25hbCBmb2xkZXJzIG9yIHN1Yi1mb2xkZXJzIGFzIG5lZWRlZC4NCg0KKiAqKkVuYWJsZS9Db25maWd1cmUgR2l0SHViIFBhZ2VzKioNCiAgKyBHbyB0byB5b3VyIHJlcG9zaXRvcnnigJlzICoqU2V0dGluZ3MqKiB0YWIuDQogICsgSW4gdGhlIGxlZnQgc2lkZWJhciwgY2xpY2sgKipQYWdlcyoqLg0KICArIFVuZGVyICoqQnVpbGQgYW5kIGRlcGxveW1lbnQqKg0KICAgIC0gQnJhbmNoOiBjbGljayBgTm9uZWAgZHJvcCBkb3duLCBzZWxlY3QgICoqbWFpbioqIA0KICAgIC0gRm9sZGVyOiBzZWxlY3QgdGhlIGRlZmF1bHQgYC8gKHJvb3QpYC4NCiAgKyBDbGljayBTYXZlLg0KDQoqICoqRmluZCBZb3VyIEFjY2Vzc2libGUgVVJMIG9mIHRoZSBSZXBvc2l0b3J5Kio6IA0KICArIFdhaXQgYSBmZXcgbW9tZW50cyBhZnRlciB5b3Ugc2F2ZSB0aGUgY29uZmlndXJhdGlvbnMgaW4gdGhlIGFib3ZlIHN0ZXAsIHJlZnJlc2ggdGhlIHBhZ2UsIGFuZCB5b3Ugd2lsbCBzZWUgdGhlIFVSTCBvZiB5b3VyIHJlcG9zaXRvcnkgdW5kZXIgKipHaXRIdWIgUGFnZXMqKjogDQogICAgLSBZb3VyIHNpdGUgaXMgbGl2ZSBhdCA8Zm9udCBjb2xvciA9ICJibHVlIj5odHRwczovL3Blbmdkc2NpLmdpdGh1Yi5pby9TVEE4ODgvPC9mb250Pi4NCiAgKyBJZiB5b3VyIHJlcG9zaXRvcnkgaGFzIGEgZmlsZSBuYW1lZCBgaW5kZXguaHRtbGAsIHRoaXMgZmlsZSB3aWxsIGJlIGRpc3BsYXllZCB3aGVuIHZpc2l0aW5nIHRoZSBVUkwuIE90aGVyd2lzZSwgeW91IHdpbGwgc2VlIGEgKio0MDQgZXJyb3IgcGFnZSoqLiBUaGlzIGRvZXMgbm90IG1lYW4gdGhhdCB5b3UgKipzZXQgdXAqKiB0aGUgcGFnZSBpbmNvcnJlY3RseS4gSXQgc2ltcGx5IG1lYW5zIHRoYXQgeW91IGRvbuKAmXQgaGF2ZSBhbiBIVE1MIGZpbGUgbmFtZWQgYGluZGV4Lmh0bWxgIGluIHlvdXIgcmVwb3NpdG9yeS4NCiAgDQogIA0KKiBPbmNlIHlvdXIgcmVwb3NpdG9yeSBpcyBlbmFibGVkL2NvbmZpZ3VyZWQsIHlvdSBjYW4gbG9jYXRlIHRoZSBVUkxzIG9mIHNwZWNpZmljIGZpbGVzLiBGb3IgaWxsdXN0cmF0aW9uLCB3ZSBhc3N1bWUgdGhlIHJlcG9zaXRvcnkgaXMgbmFtZWQgKipTVEE4ODgqKiBhbmQgeW91ciBHaXRIdWIgYWNjb3VudCBpcyAqKnBlbmdkc2NpKiouDQogICsgKipFeGFtcGxlIDEqKjogSWYgYSBQREYgZmlsZSBuYW1lZCBgZ3VpZGVsaW5lcy5wZGZgIGlzIGluIHRoZSByZXBvc2l0b3J5ICoqU1RBODg4KiosIGl0cyBVUkwgd291bGQgYmU6DQo8Zm9udCBjb2xvcj0iYmx1ZSI+KipodHRwczovL3Blbmdkc2NpLmdpdGh1Yi5pby9TVEE4ODgvZ3VpZGVsaW5lcy5wZGYqKjwvZm9udD4uPGZvbnQgY29sb3I9InJlZCI+W3RoaXMgaXMgb25seSBhIGh5cG90aGV0aWNhbCBVUkxdLjwvZm9udD4NCiAgKyAqKkV4YW1wbGUgMioqOiBJZiBhbiBIVE1MIHJlcG9ydCBuYW1lZCBgcmVwb3J0MDEuaHRtbGAgaXMgaW4gYSBmb2xkZXIgY2FsbGVkIGBwcm9qZWN0YCwgaXRzIFVSTCB3b3VsZCBiZToNCjxmb250IGNvbG9yPSJibHVlIj4qKmh0dHBzOi8vcGVuZ2RzY2kuZ2l0aHViLmlvL1NUQTg4OC9wcm9qZWN0L3JlcG9ydDAxLmh0bWwqKjwvZm9udD4uIDxmb250IGNvbG9yPSJyZWQiPlt0aGlzIGlzIG9ubHkgYSBoeXBvdGhldGljYWwgVVJMXS48L2ZvbnQ+DQogICsgSWYgeW91IGhhdmUgY3JlYXRlZCBzdWJmb2xkZXJzIG9yIG5lc3RlZCBzdWJmb2xkZXJzLCB5b3UgY2FuIHVzZSB0aGUgc2FtZSBwYXR0ZXJuIHRvIGxvY2F0ZSB0aGUgVVJMIG9mIGEgZmlsZSB3aXRoaW4gYW55IHNwZWNpZmljIGZvbGRlciBvciBzdWJmb2xkZXIuDQoNCjx1bD4NCjxmb250IGNvbG9yPSJyZWQiPkJlc3QgUHJhY3RpY2VzIGZvciBGb2xkZXIgU3RydWN0dXJlPC9mb250PjogQ3JlYXRlIGEgZGlyZWN0b3J5IG9uIHlvdXIgbWFjaGluZSB1c2luZyB0aGUgc2FtZSAqKnJlcG9zaXRvcnkgbmFtZSoqIGFuZCAqKm1pcnJvcioqIHRoZSBmb2xkZXIgc3RydWN0dXJlIGZyb20geW91ciBHaXRIdWIgcmVwb3NpdG9yeS4gVGhpcyB3aWxsIHNpbXBsaWZ5IGZ1dHVyZSB1cGRhdGVzIGFuZCBuZXcgZmlsZSBjcmVhdGlvbi4NCjwvdWw+ICANCiAgDQogIA0KDQogIA0KICANCiAgDQogIA0KICANCiAgDQogIA0KICANCiAgDQogIA0KICANCiAgDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0K