Last Updated: 07/02/2025

1 Course Title

PSY:3170 – Fantasy Football: Predictive Analytics and Empiricism (Fall 2025)

2 Course Meeting Time and Place

Tuesday and Thursday 11:00 a.m. – 12:15 p.m., 158 Van Allen (VAN)

3 Course Website

https://icon.uiowa.edu

To access the course site, log into Iowa Courses Online (ICON) using your Hawk ID and password.

4 Course Home

The University of Iowa
The College of Liberal Arts and Sciences
Department of Psychological and Brain Sciences

The College of Liberal Arts and Sciences (CLAS) is the home of this course, and CLAS governs the add and drop deadlines, academic misconduct policies, and other policies and procedures. Other UI colleges may have different policies.

5 Instructor Contact Information

Professor Petersen
Office: 175 Psychological and Brain Sciences Building (PBSB)
E-mail: isaac-t-petersen@uiowa.edu
Office Phone: 467-1014
Student drop-in hours: Monday 4–5 & Thursday 3–5
Note: I’m here to help you learn and succeed. Please come to my office hours to ask questions about course material, assignments, exams, or professional development (career-related issues), for instance. I welcome you to discuss any concerns you might have about the class. I am also available to meet with you by appointment, although I would appreciate your making every effort to see me during office hours. The best way to reach me outside of class is by email.

6 Departmental Resources

Department of Psychological and Brain Sciences: https://psychology.uiowa.edu
Department of Psychological and Brain Sciences Main Office: G60 Psychological and Brain Sciences Building (335-2406)
Coordinator of Undergraduate Studies: Professor Windschitl (paul-windschitl@uiowa.edu; 335-3681)
Academic Coordinator: Janeil Page-Jamison (janeil-page@uiowa.edu; 384-3657)
Departmental Executive Officer (DEO)/Department Chair: Professor Blumberg (mark-blumberg@uiowa.edu; 335-2424)

7 Prerequisites

The Department of Psychological and Brain Sciences has a hierarchical course structure that requires students to complete certain prerequisite courses before taking upper-level courses. This course requires successful completion (C- or higher) of any of the following statistics courses (or AP Statistics from high school): PSY 2811, PSQF 1020, PSQF 4143, STAT 1010, STAT 1015, STAT 1020, STAT 1030, STAT 3510, STAT 4143. The department will check student records to ensure completion of course prerequisites.

8 Fulfilling Your Academic Requirements

Psychology Students: This course will satisfy either an upper-level elective or a second Cognate (second Cognates are required for Bachelor of Science [B.S.] students). If you are using this course as a second Cognate for the B.S. requirements, please see your academic advisor.

9 Description of Course

How can we use information to make predictions about uncertain events? This course is about empiricism (basing theories on observed data) and judgment, prediction, and decision making in the context of uncertainty. But this is no ordinary course…

Rather than memorizing these empirical approaches in abstraction, students will employ these methods in the active, immersive, hands-on learning laboratory of Fantasy Football. In this way, the course will weave together two contiguous threads: an introductory overview of data analysis techniques, and a captivating application of these techniques through a semester-long experience in Fantasy Football with their classmates.1

The class involves reading primary source material, applying statistical programming (using R software), conducting data analysis, and composing written work on a weekly basis. Students will be introduced to modern analytical techniques used to make informed predictions, test theories, and draw conclusions from a given dataset.

The course uses fantasy football as a lens and application through which to learn about statistics and empiricism. The class does not assume that students know anything about football or fantasy football. The class is welcome to all, assuming the student meets the prerequisites and that they are interested in learning about empiricism (basing theories on observed data), statistics, and judgment, prediction, and decision making in the context of uncertainty. No need to worry about how well your fantasy team does; your grade does NOT depend on your team’s performance (however, the league winner receives extra credit).

Take this class if:

  • you want to learn more advanced skills in 1) empiricism, 2) statistics, 3) programming (using R software), and 4) judgment, prediction, and decision making in the context of uncertainty;
  • you are interested in learning statistics through the lens of a fun sports domain (fantasy football); or
  • you are interested in applying psychological and statistical concepts to fantasy football, to gain a strong understanding of critical thinking and decision making in sports.

Do not take this class if:

  • you are reluctant to examine fantasy football topics in a scientific manner;
  • you do not want to write public blog articles as part of the class; or
  • you do not want to learn statistics and programming, and do not want to persist through inevitable challenges along the way.

9.1 What is Fantasy Football? And Why Focus on Fantasy Football?

Fantasy football is an online game where participants assemble (i.e., “draft”) imaginary teams composed of real-life National Football League (NFL) players. In the game of fantasy football, participants compete against others, accumulating “fantasy” points based on players’ actual statistical performances in games (and the goal is to outscore one’s opponent each week to win matches and ultimately claim victory in the league). Fantasy football relies heavily on prediction—trying to predict which players will perform best and selecting them accordingly. In this way, fantasy football provides a plethora of decision making opportunities in the face of uncertainty, and a wealth of data for analyzing these decisions. However, unlike many other applied domains in psychology, fantasy football (1) allows a person to see the accuracy of their predictions on a timely basis and (2) provides a safe environment for friendly competition. Thus, it provides a unique domain to evaluate—and improve—the accuracy of various prediction models.

10 Course Goals

The course has three overarching goals; to help students:

  1. Appreciate the value of statistics for answering questions you find interesting
  2. Think critically and be a critical consumer of information in society
  3. Get excited about learning stats!

11 Learning Outcomes

By the end of the course, successful students will be able to:

  1. Think critically and empirically about human behavior and performance
  2. Make sense of big data
  3. Use, evaluate, and interpret statistical analyses
  4. Communicate data-driven insights

11.1 How Students Will Achieve the Learning Outcomes

Students will achieve the learning outcomes through the following specific outcomes:

11.1.1 1. Think critically and empirically about human behavior and performance

  • Apply empirical inference and articulate its advantages over speculative supposition.
  • Formulate research questions, hypotheses, and predictions.
  • Provide well-reasoned guidance for decision-making under conditions of uncertainty.
  • Describe common flaws in human judgment and decision making, including heuristics and cognitive biases, and explain how they can be mitigated analytically.
  • Critically evaluate causal claims by generating plausible alternative explanations.
  • Apply core concepts in causal inference, including confounding, causal pathways, and counterfactuals.
  • Compare the strengths and limitations of human and machine approaches to prediction.

11.1.2 2. Make sense of big data

  • Apply foundational skills in statistical programming using R to combine, manipulate, clean, and summarize large datasets.

11.1.3 3. Use, evaluate, and interpret statistical analyses

  • Conduct data analyses using R, including appropriate application of statistical models.
  • Critically evaluate the strengths and limitations of statistical models and methods used for predicting uncertain events.
  • Apply analytical techniques to predict outcomes and uncover latent causes in observed data.
  • Interpret results from statistical analyses and evaluate the accuracy of predictions.
  • Engage in iterative problem-solving, refining analytical strategies based on results and feedback.
  • Use practical analytical skills that can be applied in future research and job settings.

11.1.4 4. Communicate data-driven insights

  • Communicate statistical findings in writing for a public audience.
  • Identify characteristics of effective data visualizations.
  • Create data visualizations.

12 Textbook

The cost of textbooks has become so high that I do not feel comfortable requiring students to purchase a textbook. Thus, I created a textbook for this course. The textbook for this course is available for free online: https://isaactpetersen.github.io/Fantasy-Football-Analytics-Textbook

Note: There is a section of the book that invites readers to donate to support its development. IMPORTANT: This donation option is NOT for you. The book is publicly available and the donation option is intended for non-UI people who use the book. Per the UI Policy Manual, faculty are prohibited from a) receiving gifts from their students and b) profiting from recommending or requiring the purchase of course materials from their students. As described here, “Faculty members who would otherwise receive royalties or other remuneration from the purchase of books or materials which they recommend or require in courses they teach should either refund the money to the students or make other arrangements to avoid profiting from their students’ use of the materials (such as transferring it to the University or one of its units, or to the University of Iowa Center for Advancement).” Bottom line: please do NOT donate or give other gifts—they are not allowed!

13 Required Materials

For the class, you will be required to have access to a computer that allows you to install and run software (including R, git, and GitHub Desktop). A laptop is preferable, so you can bring it to class and work through examples in class.

14 Academic Honesty and Misconduct

All students in CLAS courses are expected to abide by the college’s standards of academic honesty. Academic misconduct must be reported by instructors to CLAS according to these procedures.

Please note that collaboration with other classmates is not permitted on quizzes, writing assignments (except when collaboratively troubleshooting R errors), or during exams. However, I do encourage you to collaborate with classmates to to learn R, statistics, and programming, to troubleshoot an error you run into, and to prepare for exams (e.g., informal study groups). In addition, you are expected to follow the course’s policy on the use of artificial intelligence (AI), which is outlined below.

15 On the Use of Artificial Intelligence

Artificial intelligence (AI) is rapidly reshaping how we interact with technology. When used responsibly, AI can support your learning—but only if you remain the primary thinker and writer.

15.0.1 Reasons to Use AI

AI can be a valuable tool for exploring ideas, understanding data analysis, and debugging code. It is highly likely that your future career will involve working with this technology.

15.0.2 Reasons Not to Use AI

Developing your own writing, analytical, and critical thinking skills is a key learning outcome of this course. Like building muscles at the gym, these skills require effort—you don’t get stronger if someone else (AI) lifts the weights for you. Mastering foundational skills in writing, analytical, and critical thinking will not only help you succeed academically but also make you a more effective and discerning AI user. By developing skills in writing, analysis, and critical thinking, you will be better equipped in the future to evaluate AI-generated responses, recognize when and how they are inaccurate, and improve upon them. Ultimately, strong independent skills in writing, analysis, and critical thinking will set you apart in a competitive workplace.

15.0.3 Course Policy on AI

AI presents thorny issues for education: AI often generates incorrect content and risks breaching academic integrity. This section governs our use of AI in this course2.

Use of AI is NOT permitted on quizzes or exams.

Use of AI in this course is permitted for the writing assignments under four conditions:

  1. You complete your first draft of the writing independently
  2. You disclose how you use AI
  3. You begin the conversation with the required prompt
  4. You submit the full transcript of your AI interaction along with the assignment

Failure to meet any of these conditions will result in a zero on the assignment and may be grounds for an academic misconduct case.

You may choose any AI model, but you must be able to archive and submit the full conversation. In ChatGPT, for example, you can generate a shareable link to the transcript.

These four conditions are detailed below. I reserve the right to revoke this privilege at any time if I suspect it is being abused.

15.0.3.1 Complete Your First Draft of Writing Independently

You may use AI to help you troubleshoot code, clarify concepts, and improve your writing. However, before you engage with any AI tools to improve your writing, you must write a complete first draft of your assignment on your own. This draft should represent your best independent effort to meet the assignment’s goals, including organizing your ideas, supporting your claims with evidence, and expressing your thoughts clearly. Then, you may use AI—under the required conditions—to help you refine your writing.

15.0.3.2 AI Disclosure

For each writing assignment, you must clearly disclose whether and how you used AI tools. Your disclosure must include one or more of the following options:

  • Not Used: Did not use AI in any way for this assignment
  • Mentoring: Used AI to ask questions or clarify concepts
  • Code: Used AI to generate or review code snippets
  • Editing: Used AI to critique or improve writing

List all that apply. For instance, if you used AI to understand a concept and generate example code, your disclosure should include both Mentoring and Code.

15.0.3.3 Required Initial Prompt to Use

Each time you use AI, the first message you send to begin the conversation must be the prompt below. This prompt ensures that AI use supports your learning rather than replacing your thinking. Do NOT add, delete, or edit any language in this prompt—just copy and paste it:

You are an encouraging, positive tutor who helps students work through problems relating to statistics, statistical computing, research methods, and writing. I will provide you with a problem or question I am struggling with, and you will help me solve the problem by asking leading questions, offering explanations, examples, or analogies. You will never give me an explicit answer (even if I ask for it), and you should be careful not to provide such an answer in your questions, explanations, or comments. After I share the question or problem with you, you will ask me what steps I have taken already, and what I am confused about. Wait for my response. Only ask one question at a time. Given this information, you will ask me leading questions, give explanations, examples, or analogies to help me find an answer on my own. You should guide me in an open-ended way. Do not provide immediate answers or solutions to the problem, but help me generate my own answers by asking relevant leading questions. Ask me to explain my thinking. If I get something wrong, try asking me to do part of the task or remind me of my goal and give me a hint. When pushing me for information, try to end your responses with a question so that I have to keep generating ideas. If you see that I am moving in the right direction, tell me I am on the right track, encourage me to continue working on my own, and end the conversation. Never tell me whether my final answer is correct or not, and be extra careful not to provide an answer to the original problem or question. Always keep an encouraging, positive tone.

15.0.3.4 AI Transcript Submission

You must submit the full transcripts of your conversations with AI. If you had multiple conversations, submit transcripts for all conversations you used for that assignment.

The preferred method is to include a shareable link at the top of your assignment. Most platforms (e.g., ChatGPT, Gemini) provide this functionality. Make sure the link works before submitting.

16 Course Requirements and Policies

16.1 Lecture

We will meet two times weekly for lectures, at the time and location described above. My powerpoint presentations for the lectures will be posted on ICON no later than noon on the day before the lecture (though I may continue to refine the slides up until the time of lecture). Please note: powerpoint presentations are an outline of my points. It is your responsibility to take notes during class. If you have questions about the lecture notes or need clarification of any of the points, please ask in class or meet with Professor Petersen during office hours. If you miss a lecture, get and review notes with a peer and watch the lecture recording. Then, come to office hours if you have specific questions.

16.1.1 Lecture Recordings

My intention is to record lectures so that you may review them. Recorded lectures will be posted on the “UICapture” tab in ICON. However, please do not count on recordings being available, in case I accidentally forget to initiate the recording or there is a technical malfunction.

16.2 Attendance and Participation

Attendance at lectures is required and will be factored into final grades (see grading section below). There are 29 lectures during the semester (excluding the examinations); in addition, there are two required course surveys (one pre-course survey, one end-of-course survey). You will receive one point for completion of each course survey and attendance at each lecture, for up to 29 points (i.e., you will not receive extra credit for attending/completing all 31 lectures/surveys). Thus, you will not be penalized for missing up to 2 lectures. However, you will be responsible for learning any material missed for quizzes and exams, and I strongly encourage you to attend all lectures. Poor lecture attendance is likely to affect the quality of students’ work and success in the course.

Students who miss more than 2 lectures due to participation in University activities must give the instructor a statement before the absence signed by a responsible official that specifies the dates and times the student will miss class. Authorized activities include participation in athletic teams, the marching band or pep band, debate teams, and other recognized University groups, as well as participation in University field trips, service with the National Guard, and jury duty. Absences due to illnesses or emergencies (that go over 2 lectures) must be documented with the University of Iowa Absence Explanation Form and sent to Professor Petersen within 48 hours of the absence. Per university policy, if a student will be absent 5 or more consecutive days and the absence is due to illness or other emergency, please contact the Registrar Service Center at (319) 384-4300 or .

16.3 Blog Articles (Writing Assignments)

As part of the class, you will post blog articles (see the course schedule for deadlines). The blog articles are public; do not take this course if you do not feel comfortable posting blog articles with your full name in a public forum. The blog articles are intended to give you practice integrating skills to advance the learning objectives of a) thinking critically and empirically about human behavior and performance, b) making sense of big data, c) using, evaluating, and interpreting statistical analyses, and d) communicating data-driven insights. There will be a penalty of 20% for all blog articles turned in late. Your two lowest scores will be dropped (excluding the last blog article, which involves in the integration of at least two analysis approaches that were covered in class). A blog article is not considered “submitted” until you (a) post the blog article so that it is live and publicly available, AND (b) submit the assignment on ICON with a PDF of the article and a URL link to your blog article. All blog articles should be submitted to ICON by 11:59 p.m. on the due date.

You are encouraged to submit your blog article well before the deadline. You can expect to run into technical issues (e.g., errors when running your code, issues getting the blog post to compile, etc.). Thus, you should give yourself plenty of time to troubleshoot (see below) so that you can submit your blog article on time.

16.3.1 Troubleshooting

Sometimes code you write does not work. That is okay; it happens to everyone. Learning how to troubleshoot code is an important part of programming. If you run into issues related to R, GitHub, GitHub Pages, or your code, here are a few pointers on how to get things working (as adapted from Luke Tierney):

  • If you receive an error message, read what the message says. Sometimes reading the error message is all it takes to figure out what the issue is and how to fix it.
  • Read the whole error message: sometimes the most important part is at the beginning.
  • If the message does not make sense to you, perform a Google search for the error/issue: often someone else has asked about the same issue and received a useful answer.
  • Simplify your code.
    • Look carefully at intermediate results.
    • Replace complicated data with something smaller and simpler.
    • In the process, you may find your mistake.
  • Finding your bug usually involves double checking all the things you are sure you did right until you find the one you did not.

If you are unable to resolve things on your own, you may need to ask for help, in which case I encourage you to try one (or more) of the following:

I am quite busy, and I appreciate your making every effort to solve the issue on your own or using one of the aforementioned ways before emailing me. I do not often respond to emails during evenings or weekends, and I cannot be expected to solve last-minute issues that you could have solved earlier.

16.4 Readings & Quizzes

Readings and other materials (e.g., videos) will be posted on ICON. You are expected to do the readings (and watch any required videos) before class. You will have an online quiz on the readings/materials to complete in ICON, on your own, before each lecture. The quizzes are meant to help you come to class prepared to contribute so you are best-positioned to learn and to help others learn. The quizzes are not timed (you can spend as much time as you need on each quiz up until the deadline). The deadline for each quiz is 30 minutes before class starts. Late responses and multiple submissions will not be accepted. Your lowest quiz score will be dropped. We will not accept excused absences for quizzes because (a) you have a week to complete the quiz (and can submit it at any point during that week), and (b) we drop your lowest quiz score. Each quiz will be weighted the same in the final grade. Quiz answers will be viewable after class.

Past experience has shown that in order to do well in this class, you should read the required material, participate actively in class, and go over your notes each week. There is too much material being covered in this class to try to study only by frantic preparation immediately before exams. Note that lecture will not cover all relevant material for the course; you will be expected to know the required readings for exams.

16.5 Workload

This is a 3 semester hour course. Students should therefore expect to spend 6 additional hours per week (outside of class) reading the articles, reviewing material from lecture, and preparing for quizzes and exams.

16.6 Examinations

There will be 2 exams; one mid-term exam and one non-cumulative final exam. Exam 1 will be administered during class time. The date, time, and location of the final exam will be announced by the 5th week of class by the College of Liberal Arts and Sciences; the duration of the final exam will be 120 minutes. Each exam will emphasize information presented for the half of the class that precedes it. However, some integration of information across sections will be required for questions on the second exam. The exams will include multiple-choice questions. Exam questions can come from any of the following sources: lectures or required readings. For suggested study tips for this class, meet with Professor Petersen during office hours.

16.6.1 Missing Exams

University regulations require that students be allowed to make up examinations that have been missed due to illness, religious holy days, military service obligations (including service-related medical appointments), or other unavoidable circumstances or University-sponsored activities. Students with UI-authorized activities must discuss their absences with the instructor as soon as possible. Religious obligations must be communicated within the first three weeks of classes. See below for the documentation necessary for an absence to be excused and to be eligible to take a make-up exam.

Students are allowed to make up exams that have been missed due to illness, mandatory religious observations, official University activities, or other unavoidable circumstances. Note: the format of the make-up exam may differ from the original exam. If you know that you must be away at the time of an exam for one of these reasons, Professor Petersen must be contacted in advance whenever possible to schedule a make-up exam. In order to take a make-up exam, you must provide acceptable documentation to be eligible to take it: including documentation for any report of illness; any other circumstances must be documented by the University of Iowa Absence Explanation Form (located in ICON under “Student Tools”) and must be approved by Professor Petersen. In sum, to be eligible for a make-up exam, Professor Petersen must be contacted before the examination whenever possible, and you must send acceptable form of documentation to Professor Petersen.

16.7 Class Fantasy Football League

As part of the class, we will have a fantasy football league. The league will be composed of 10 teams, with approximately 2 students per team. That is, you will (likely) be paired with another student in the class to co-manage a team. The league will be hosted on NFL.com and will follow default NFL.com scoring settings. The league will be a head-to-head league, meaning that each week, your team will face one other team, and whichever team scores more points wins that week. There are no course-related points based on your team’s performance (i.e., you will NOT be punished for having a bad team); however, there is an extra credit opportunity for winning the league.

The draft will be held during class time. The draft will be a “snake” draft, meaning that the order of picks will reverse each round. The draft order will be randomly determined.

In conjunction with your co-manager, you will make decisions regarding your team’s name, draft picks, waiver wire pickups/drops, trades, and starting lineups. Regardless of your expertise or experience with fantasy football, you and your co-manager are each 50% co-owners of the team. That is, you are expected to make all team-related decisions with your co-manager collaboratively, not unilaterally.

As the commissioner of the league, I reserve the right to block any trades that that would compromise the integrity of the league. Trades will be allowed as long as each team is acting in their team’s best interests; that is, “lopsided” trades will be allowed as long as both teams are acting in good faith to improve their own team. Trades will not be allowed if they involve collusion, that is, collaboration to cheat or deceive others. Examples of collusion include:

  • trading players for the purpose of improving the other team’s standing in the league (and not your own)
  • trading players who are not on bye week, just so an opponent can specifically beat another opponent and then trading those players back immediately
  • trades that involve outside-of-the-game exchange of goods or services
  • trades that involve a handshake agreement of in-game goods or services
  • trades that cannot be completed in one trade

17 Grading

Final grades will be assigned at the end of semester on the basis of your total percentage of points earned on exams, quizzes, attendance, and writing assignments, as detailed below. Grades will be assigned on an absolute scale (criterion-referenced grading); course grades will not be curved. Please note: As a matter of fairness to all students, I assign grades based on performance and do not negotiate grades. Final grades will be assigned based on the following ranges:

Grade Percent
A+ 97–100%
A 93–96
A− 90–92
B+ 87–89
B 83–86
B− 80–82
C+ 75–79
C 70–74
C− 65–69
D+ 60–64
D 55–59
D− 50–54
F < 50%

I round up from .5 when determining final grades. For example, a course percent of 79.50 would receive a B−, whereas a course percent of 79.49 would receive a C+.

18 Course Grades

Final course grades will be assessed based on your performance in the activities below. The relative contribution of each component to your final grade is as follows:

  • 25% Examination #1
  • 25% Examination #2 (administered only during the class’s Final Exam time slot)
  • 10% Attendance/Participation
  • 10% Reading Quizzes
  • 30% Writing Assignments

18.1 Extra Credit

Here are the extra credit opportunities for this course:

  • 0.5 points: identify a new issue in the course textbook that needs to be fixed, or make a specific suggestion for improving the textbook and its usefulness to you or other students
  • 0.5 points: implement a fix/suggestion for the issue you identified in the course textbook
  • 0.5 points: submit an end-of-semester video reflection
  • 1 point: win the class fantasy football league

The extra credit must be completed by the last day of class. Details about each option are provided below. No additional extra-credit opportunities are available for this course.

18.1.1 Improvements to the Textbook

You can earn 0.5 points of extra credit by either:

  1. Identifying a new (i.e., not previously known) issue in the course textbook that needs to be fixed, or
  2. Making a specific suggestion for improving the textbook and its usefulness to you or other students. For instance, to identify an issue that needs to be addressed, you could identify a typo, misspelling, grammatical error, broken link to another section of the book, or (gasp), a mistake/error. Note that placeholders (e.g., “[insert here]”) are already known and do not count as new issues.

To receive the extra credit:

  1. Create a new issue in the textbook’s GitHub repository, and
  2. Email me after doing so.

You can earn an additional 0.5 points extra credit (for 1 point extra in total) by implementing the fixes/suggestions you specified. To receive the extra credit for implementing the fix/suggestion:

  1. Submit a pull request with your changes, and
  2. Email me after doing so.

See these instructions for help creating a pull request.

Important: If you plan to implement a fix or suggestion, I strongly encourage you to discuss it with me first to ensure it qualifies. I reserve the right to determine whether the “fix”, suggestion, or implementation warrants extra credit!

18.1.2 End-of-Semester Video Reflection

You can earn 0.5 points extra credit by submitting a short (2–3 minute) video reflecting on your experience in the class. The video should include:

  • A description of the class, what you learned, and how it will benefit you
  • Your favorite part of the class
  • Why (from your perspective) it is valuable to learn statistics
  • What advice you would give to students who take the class in the future

Submit the video in the designated assignment on ICON.

18.1.3 Win the Class Fantasy Football League

The winner(s) of the class fantasy football league—based on either total points or win/loss record at the end of the class (i.e., Week 14 of the NFL season)—will receive 1 point of extra credit.

19 Tentative Course Outline (exam dates fixed)

This is a tentative course outline. Changes will be discussed in class. There are 15 weeks in the semester, and class meets twice per week (30 sections). We will have one exam during the semester and one final exam during finals week.

Section Day Date Content Reading Assignment
1 T 08/26 Overview of Class; Overview of Fantasy Football Ch 12 CodeAcademy Module 1
2 Th 08/28 Statistical Programming: Using R for Statistical Analysis Ch 3 CodeAcademy Modules 2–3
3 T 09/02 Player Evaluation Ch 6; Den Hartigh et al. (2018) Set up blog; post welcome article
4 Th 09/04 The Draft Ch 7; Lee & Liu (2022) CodeAcademy Modules 5–6
5 T 09/09 Statistical Programming in R Ch 4 CodeAcademy Modules 7–10
6 Th 09/11 Basic Statistics Ch 89 Blog article 1 due!
7 T 09/16 Data Visualization and Interpretation Ch 5; Schwabish (2021) CodeAcademy Module 4
8 Th 09/18 Correlation Analysis Ch 10; Goodwin & Leech (2006) Blog article 2 due!
9 T 09/23 Multiple Regression Ch 11; Osborne & Waters (2002)
10 Th 09/25 Mixed Models Ch 12; Brauer & Kurtin (2018)
11 T 09/30 Causal Inference Ch 13; D’Onofrio et al. (2020) Blog article 3 due!
12 Th 10/02 Heuristics and Cognitive Biases in Prediction Ch 14; Tversky & Kahneman (1974)
13 T 10/07 Human Judgment vs Actuarial Approaches to Prediction Ch 15; Kahneman (2011), Ch 21 & 22
14 Th 10/09 Base Rates Ch 16; Kahneman (2011), Ch 14 & 30 Blog article 4 due!
15 T 10/14 Midterm Exam
16 Th 10/16 Evaluation of Prediction/Forecasting Accuracy: Binary Classification Ch 17 (Section 17.1–17.6.6)
17 T 10/21 Evaluation of Prediction/Forecasting Accuracy: Binary Classification Ch 17 (Section 17.6.7–17.6.9)
18 Th 10/23 Evaluation of Prediction/Forecasting Accuracy: Continuous Outcomes Ch 17 (Section 17.7–end of chapter) Blog article 5 due!
19 T 10/28 Calibration Accuracy: Overconfidence Bias Kahneman & Tversky (1996); Massey & Thaler (2013)
20 Th 10/30 Machine Learning Ch 19; Ramasubramanian & Singh (2019), Ch 6 Blog article 6 due!
21 T 11/04 Mythbusters: Putting Fantasy Football Beliefs/Anecdotes to the Test Ch 18; White & Sheldon (2014)
22 Th 11/06 Modern Portfolio Theory Ch 20; Chen (2016) Blog article 7 due!
23 T 11/11 Cluster Analysis Ch 21; Everitt et al. (2011)
24 Th 11/13 Factor Analysis Ch 22; Field et al. (2012), Ch 17 Blog article 8 due!
25 T 11/18 Data Reduction: Principal Component Analysis Ch 23
26 Th 11/20 Simulation and the Monte Carlo Method Ch 24; Sigal & Chalmers (2016) Blog article 9 due!
11/24–11/27 FALL BREAK – NO CLASSES
27 T 12/02 Time Series Analysis Ch 25; Hyndman & Athanasopoulos (2021), Ch 1 (through Section 1.7)
28 Th 12/04 Decision Making in the Context of Uncertainty Ch 26; Larrick et al. (2024) Blog article 10 due!
29 T 12/09 Sports and Cognitive Psychology: Coaching and Risk Aversion Ch 27 (Section 27.1–27.5); Moskowitz & Werthheim (2012), Ch 3 & 16
30 Th 12/11 Sports and Cognitive Psychology: Psychological Factors in Player Performance; Expert Performance and Automaticity Ch 27 (Section 27.6–end of chapter); Moskowitz & Werthheim (2012), Ch 17 Blog article 11 due!
Finals Week TBD (week of 12/15) Final Exam

20 Date and Time of the Final Exam

The final examination date and time will be announced by the Registrar generally by the fifth week of classes, and it will be announced on the course ICON site once it is known. Do not plan your end of the semester travel plans until the final exam schedule is made public. It is your responsibility to know the date, time, and place of the final exam. According to the Registrar’s final exam policy, students have a maximum of two weeks after the announced final exam schedule to request a change if an exam conflict exists or if a student has more than two exams scheduled for the same day (see the policy here).

21 Course Resources

There are many course resources available to help you succeed in the class, including:

22 Drop Deadline for this Course

You may drop an individual course before the drop deadline; after this deadline you will need collegiate approval. You can look up the drop deadline for this course here. When you drop a course, a “W” will appear on your transcript. The mark of “W” is a neutral mark that does not affect your GPA. To discuss how dropping (or staying in) a course might affect your academic goals, please contact your Academic Advisor. Directions for adding or dropping a course and other registration changes can be found on the Registrar’s website. Students can find policies on dropping CLAS courses here. Students should adhere to the academic deadlines and policies set by the Graduate College.

23 Feedback about the Course

I welcome feedback at any point during the class. If you have comments on the class or my teaching, please feel free to meet with me during office hours.

23.1 Student Complaints

Students with a complaint about a grade or a related matter should first discuss the situation with the instructor, and finally with the DEO (Chair) of the department, school, or program offering the course. Sometimes students will be referred to the department or program’s Director of Undergraduate Studies (DUS) or Director of Graduate Studies (DGS). Students should contact CLAS Undergraduate Programs for support when the matter is not resolved at the previous level.

24 Communication: UI Email

Students are responsible for all official correspondences sent to their UI email address (uiowa.edu) and must use this address for any communication with instructors or staff in the UI community. For the privacy and the protection of student records, UI faculty and staff can only correspond with UI email addresses.

24.1 Other Expectations of Student Performance

Students have the right to a distraction-free learning environment. You have the responsibility to help create such a classroom environment. Please treat other students in the class and the instructor with respect. Students are expected to help each other learn and to contribute overall to the learning environment of the course. Arriving prepared for class is part of this expectation.

25 University Policies

University Policies

Accommodations for Students with Disabilities
The University is committed to providing an educational experience that is accessible to all students. If a student has a diagnosed disability or other disabling condition that may impact the student’s ability to complete the course requirements as stated in the syllabus, the student may seek accommodations through Student Disability Services (SDS). SDS is responsible for making Letters of Accommodation (LOA) available to the student. The student must provide a LOA to the instructor as early in the semester as possible, but requests not made at least two weeks prior to the scheduled activity for which an accommodation is sought may not be accommodated. The LOA will specify what reasonable course accommodations the student is eligible for and those the instructor should provide. Additional information can be found on the SDS website.

Class Recordings
Students may be enrolled in a class where some sessions will be recorded or live-streamed. Such recordings/streaming will only be available to students registered for the class. These recordings are the intellectual property of the instructor and they may not be shared or reproduced without the explicit, written consent of the instructor. Further, students may not share these sessions with those not in the class or upload them to any other online environment. Doing so would be a breach of the Code of Student Conduct, and, in some cases, a violation of state and federal law, including the Federal Education Rights and Privacy Act (FERPA).

The unauthorized video or audio recording of academic activities (e.g., lectures, course discussions, office hours, etc.) by a student is prohibited. Students with a reasonable accommodation for recording approved by Student Disability Services should notify each instructor and provide the Letter of Accommodation prior to using the accommodation. A student may record classroom activities with prior written permission from the instructor and notice to other students in the class that audio or video recording may occur. Any and all classroom recording must be for personal academic use only. The distribution, sharing, sale, or posting of recordings on the internet (including social media), in whole or in part, is prohibited and doing so may be a violation of the Code of Student Life and/or state or federal privacy, copyright, or other laws.

26 Where to Get Academic Support for This Course

27 Mental Health Resources and Student Support

Students are encouraged to be mindful of their mental health and seek help as a preventive measure or if feeling overwhelmed and/or struggling to meet course expectations. Students are encouraged to talk to their instructor for assistance with specific class-related concerns. For additional support and counseling, students are encouraged to contact University Counseling Service (UCS). Information about UCS, including resources and how to schedule an appointment, can be found at counseling.uiowa.edu. Find out more about UI mental health services at: mentalhealth.uiowa.edu, including the 24-7 UI Support and Crisis Line.

Additionally, the Office of the Dean of Students can help students navigate personal crisis situations. They can provide one-on-one support, help with identifying options, and access to basic needs resources (such as food, rent, childcare, etc.). Student Care and Assistance: 132 IMU, dos-assistance@uiowa.edu, or 319-335-1162 and more info: dos.uiowa.edu/assistance

If you feel that you or someone you know may be struggling with an academic, emotional, or psychological problem, the following organizations are available for assistance:

Service Contact Info
University of Iowa Academic Advising Center 353-5700, https://advisingcenter.uiowa.edu
University Counseling Services 335-7294, https://www.uiowa.edu/ucs
Student Health Service - Mental Health 335-8394, https://studenthealth.uiowa.edu/services/psychiatry
University of Iowa Hospitals and Clinics Adult Psychiatry Services Clinic 353-6314, https://www.uihealthcare.org/Psychiatry
Seashore Clinic (in the UI Department of Psychological and Brain Sciences) 335-2467, https://psychology.uiowa.edu/resources/seashore-clinic
Women’s Resource and Action Center 335-1486, https://wrac.uiowa.edu
Rape Victim Advocacy Program 319-335-6000 or 800-228-1625, https://www.uiowa.edu/~rvap
Office of Sexual Misconduct 319-335-6200, https://osmrc.uiowa.edu
CommUnity 855-325-4296, https://builtbycommunity.org/crisis
Community & Family Resources 351-4357, https://www.cfrhelps.org/

If you or someone you know is contemplating suicide, either call or text the Suicide and Crisis Lifeline at 988, or call 911.

28 Disclosures

I am the Owner of Fantasy Football Analytics, LLC, which operates https://fantasyfootballanalytics.net. I do not require or encourage students to use my website, and I do not promote or endorse any specific content or services offered by Fantasy Football Analytics.

29 Disclaimer

This material probably won’t win you fantasy football championships. You could take what we learn and apply it to fantasy football and you might become 5 percent more likely to win. Or… Consider the broader relevance of this. You could learn data analysis and figure out ways to apply it to other systems. And you could be making a six-figure salary within the next five years.” – Benjamin Motz, Ph.D.

This syllabus is subject to change. Any changes will be discussed in class, via email, and/or on ICON.


  1. Elements of this syllabus and course were borrowed and adapted (with permission) from a similar course by Benjamin Motz.↩︎

  2. This policy on AI was borrowed and adapted (with permission) from a policy by Isaac Mehlhaff.↩︎

LS0tCnRpdGxlOiAiQ291cnNlIFN5bGxhYnVzIgotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlID0gRkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldCgKICBlY2hvID0gVFJVRSwKICBlcnJvciA9IFRSVUUsCiAgY29tbWVudCA9ICIiKQpgYGAKCkxhc3QgVXBkYXRlZDogYHIgZm9ybWF0KFN5cy5EYXRlKCksICIlbS8lZC8lWSIpYAoKIyBDb3Vyc2UgVGl0bGUgeyN0aXRsZX0KClBTWTozMTcwIOKAkyBGYW50YXN5IEZvb3RiYWxsOiBQcmVkaWN0aXZlIEFuYWx5dGljcyBhbmQgRW1waXJpY2lzbSAoRmFsbCAyMDI1KQoKIyBDb3Vyc2UgTWVldGluZyBUaW1lIGFuZCBQbGFjZSB7I2xlY3R1cmVUaW1lfQoKVHVlc2RheSBhbmQgVGh1cnNkYXkgMTE6MDAgYS5tLiDigJMgMTI6MTUgcC5tLiwgMTU4IFZhbiBBbGxlbiAoVkFOKQoKIyBDb3Vyc2UgV2Vic2l0ZSB7I3dlYnNpdGV9CgpodHRwczovL2ljb24udWlvd2EuZWR1CgpUbyBhY2Nlc3MgdGhlIGNvdXJzZSBzaXRlLCBsb2cgaW50byBbSW93YSBDb3Vyc2VzIE9ubGluZSAoSUNPTildKGh0dHBzOi8vaWNvbi51aW93YS5lZHUpIHVzaW5nIHlvdXIgSGF3ayBJRCBhbmQgcGFzc3dvcmQuCgojIENvdXJzZSBIb21lIHsjaG9tZX0KClRoZSBVbml2ZXJzaXR5IG9mIElvd2FcClRoZSBDb2xsZWdlIG9mIExpYmVyYWwgQXJ0cyBhbmQgU2NpZW5jZXNcCkRlcGFydG1lbnQgb2YgUHN5Y2hvbG9naWNhbCBhbmQgQnJhaW4gU2NpZW5jZXMKClRoZSBDb2xsZWdlIG9mIExpYmVyYWwgQXJ0cyBhbmQgU2NpZW5jZXMgKENMQVMpIGlzIHRoZSBob21lIG9mIHRoaXMgY291cnNlLCBhbmQgQ0xBUyBnb3Zlcm5zIHRoZSBhZGQgYW5kIGRyb3AgZGVhZGxpbmVzLCBhY2FkZW1pYyBtaXNjb25kdWN0IHBvbGljaWVzLCBhbmQgb3RoZXIgcG9saWNpZXMgYW5kIHByb2NlZHVyZXMuCk90aGVyIFVJIGNvbGxlZ2VzIG1heSBoYXZlIGRpZmZlcmVudCBwb2xpY2llcy4KCiMgSW5zdHJ1Y3RvciBDb250YWN0IEluZm9ybWF0aW9uIHsjaW5zdHJ1Y3Rvcn0KCltQcm9mZXNzb3IgUGV0ZXJzZW5dKGh0dHBzOi8vcHN5Y2hvbG9neS51aW93YS5lZHUvcGVvcGxlL2lzYWFjLXBldGVyc2VuKVwKT2ZmaWNlOiAxNzUgUHN5Y2hvbG9naWNhbCBhbmQgQnJhaW4gU2NpZW5jZXMgQnVpbGRpbmcgKFBCU0IpXApFLW1haWw6IFtpc2FhYy10LXBldGVyc2VuQHVpb3dhLmVkdV0obWFpbHRvOmlzYWFjLXQtcGV0ZXJzZW5AdWlvd2EuZWR1KVwKT2ZmaWNlIFBob25lOiA0NjctMTAxNFwKU3R1ZGVudCBkcm9wLWluIGhvdXJzOiBNb25kYXkgNOKAkzUgJiBUaHVyc2RheSAz4oCTNVwKTm90ZTogSSdtIGhlcmUgdG8gaGVscCB5b3UgbGVhcm4gYW5kIHN1Y2NlZWQuClBsZWFzZSBjb21lIHRvIG15IG9mZmljZSBob3VycyB0byBhc2sgcXVlc3Rpb25zIGFib3V0IGNvdXJzZSBtYXRlcmlhbCwgYXNzaWdubWVudHMsIGV4YW1zLCBvciBwcm9mZXNzaW9uYWwgZGV2ZWxvcG1lbnQgKGNhcmVlci1yZWxhdGVkIGlzc3VlcyksIGZvciBpbnN0YW5jZS4KSSB3ZWxjb21lIHlvdSB0byBkaXNjdXNzIGFueSBjb25jZXJucyB5b3UgbWlnaHQgaGF2ZSBhYm91dCB0aGUgY2xhc3MuCkkgYW0gYWxzbyBhdmFpbGFibGUgdG8gbWVldCB3aXRoIHlvdSBieSBhcHBvaW50bWVudCwgYWx0aG91Z2ggSSB3b3VsZCBhcHByZWNpYXRlIHlvdXIgbWFraW5nIGV2ZXJ5IGVmZm9ydCB0byBzZWUgbWUgZHVyaW5nIG9mZmljZSBob3Vycy4KVGhlIGJlc3Qgd2F5IHRvIHJlYWNoIG1lIG91dHNpZGUgb2YgY2xhc3MgaXMgYnkgZW1haWwuCgojIERlcGFydG1lbnRhbCBSZXNvdXJjZXMgeyNkZXB0UmVzb3VyY2VzfQoKRGVwYXJ0bWVudCBvZiBQc3ljaG9sb2dpY2FsIGFuZCBCcmFpbiBTY2llbmNlczogW2h0dHBzOi8vcHN5Y2hvbG9neS51aW93YS5lZHVdKGh0dHBzOi8vcHN5Y2hvbG9neS51aW93YS5lZHUpXApEZXBhcnRtZW50IG9mIFBzeWNob2xvZ2ljYWwgYW5kIEJyYWluIFNjaWVuY2VzIE1haW4gT2ZmaWNlOiBHNjAgUHN5Y2hvbG9naWNhbCBhbmQgQnJhaW4gU2NpZW5jZXMgQnVpbGRpbmcgKDMzNS0yNDA2KVwKQ29vcmRpbmF0b3Igb2YgVW5kZXJncmFkdWF0ZSBTdHVkaWVzOiBQcm9mZXNzb3IgV2luZHNjaGl0bCAoW3BhdWwtd2luZHNjaGl0bEB1aW93YS5lZHVdKG1haWx0bzpwYXVsLXdpbmRzY2hpdGxAdWlvd2EuZWR1KTsgMzM1LTM2ODEpXApBY2FkZW1pYyBDb29yZGluYXRvcjogSmFuZWlsIFBhZ2UtSmFtaXNvbiAoW2phbmVpbC1wYWdlQHVpb3dhLmVkdV0obWFpbHRvOmphbmVpbC1wYWdlQHVpb3dhLmVkdSk7IDM4NC0zNjU3KVwKRGVwYXJ0bWVudGFsIEV4ZWN1dGl2ZSBPZmZpY2VyIChERU8pL0RlcGFydG1lbnQgQ2hhaXI6IFByb2Zlc3NvciBCbHVtYmVyZyAoW21hcmstYmx1bWJlcmdAdWlvd2EuZWR1XShtYWlsdG86bWFyay1ibHVtYmVyZ0B1aW93YS5lZHUpOyAzMzUtMjQyNCkKCiMgUHJlcmVxdWlzaXRlcyB7I3ByZXJlcXN9CgpUaGUgRGVwYXJ0bWVudCBvZiBQc3ljaG9sb2dpY2FsIGFuZCBCcmFpbiBTY2llbmNlcyBoYXMgYSBoaWVyYXJjaGljYWwgY291cnNlIHN0cnVjdHVyZSB0aGF0IHJlcXVpcmVzIHN0dWRlbnRzIHRvIGNvbXBsZXRlIGNlcnRhaW4gcHJlcmVxdWlzaXRlIGNvdXJzZXMgYmVmb3JlIHRha2luZyB1cHBlci1sZXZlbCBjb3Vyc2VzLgpUaGlzIGNvdXJzZSByZXF1aXJlcyBzdWNjZXNzZnVsIGNvbXBsZXRpb24gKEMtIG9yIGhpZ2hlcikgb2YgYW55IG9mIHRoZSBmb2xsb3dpbmcgc3RhdGlzdGljcyBjb3Vyc2VzIChvciBBUCBTdGF0aXN0aWNzIGZyb20gaGlnaCBzY2hvb2wpOgpQU1kgMjgxMSwgUFNRRiAxMDIwLCBQU1FGIDQxNDMsIFNUQVQgMTAxMCwgU1RBVCAxMDE1LCBTVEFUIDEwMjAsIFNUQVQgMTAzMCwgU1RBVCAzNTEwLCBTVEFUIDQxNDMuClRoZSBkZXBhcnRtZW50IHdpbGwgY2hlY2sgc3R1ZGVudCByZWNvcmRzIHRvIGVuc3VyZSBjb21wbGV0aW9uIG9mIGNvdXJzZSBwcmVyZXF1aXNpdGVzLgoKIyBGdWxmaWxsaW5nIFlvdXIgQWNhZGVtaWMgUmVxdWlyZW1lbnRzIHsjYWNhZGVtaWNSZXF1aXJlbWVudHN9CgpQc3ljaG9sb2d5IFN0dWRlbnRzOiBUaGlzIGNvdXJzZSB3aWxsIHNhdGlzZnkgZWl0aGVyIGFuIHVwcGVyLWxldmVsIGVsZWN0aXZlIG9yIGEgc2Vjb25kIENvZ25hdGUgKHNlY29uZCBDb2duYXRlcyBhcmUgcmVxdWlyZWQgZm9yIEJhY2hlbG9yIG9mIFNjaWVuY2UgW0IuUy5dIHN0dWRlbnRzKS4KSWYgeW91IGFyZSB1c2luZyB0aGlzIGNvdXJzZSBhcyBhIHNlY29uZCBDb2duYXRlIGZvciB0aGUgQi5TLiByZXF1aXJlbWVudHMsIHBsZWFzZSBzZWUgeW91ciBhY2FkZW1pYyBhZHZpc29yLgoKIyBEZXNjcmlwdGlvbiBvZiBDb3Vyc2UgeyNkZXNjcmlwdGlvbn0KCkhvdyBjYW4gd2UgdXNlIGluZm9ybWF0aW9uIHRvIG1ha2UgcHJlZGljdGlvbnMgYWJvdXQgdW5jZXJ0YWluIGV2ZW50cz8KVGhpcyBjb3Vyc2UgaXMgYWJvdXQgZW1waXJpY2lzbSAoYmFzaW5nIHRoZW9yaWVzIG9uIG9ic2VydmVkIGRhdGEpIGFuZCBqdWRnbWVudCwgcHJlZGljdGlvbiwgYW5kIGRlY2lzaW9uIG1ha2luZyBpbiB0aGUgY29udGV4dCBvZiB1bmNlcnRhaW50eS4KQnV0IHRoaXMgaXMgbm8gb3JkaW5hcnkgY291cnNlLi4uCgpSYXRoZXIgdGhhbiBtZW1vcml6aW5nIHRoZXNlIGVtcGlyaWNhbCBhcHByb2FjaGVzIGluIGFic3RyYWN0aW9uLCBzdHVkZW50cyB3aWxsIGVtcGxveSB0aGVzZSBtZXRob2RzIGluIHRoZSBhY3RpdmUsIGltbWVyc2l2ZSwgaGFuZHMtb24gbGVhcm5pbmcgbGFib3JhdG9yeSBvZiBGYW50YXN5IEZvb3RiYWxsLgpJbiB0aGlzIHdheSwgdGhlIGNvdXJzZSB3aWxsIHdlYXZlIHRvZ2V0aGVyIHR3byBjb250aWd1b3VzIHRocmVhZHM6IGFuIGludHJvZHVjdG9yeSBvdmVydmlldyBvZiBkYXRhIGFuYWx5c2lzIHRlY2huaXF1ZXMsIGFuZCBhIGNhcHRpdmF0aW5nIGFwcGxpY2F0aW9uIG9mIHRoZXNlIHRlY2huaXF1ZXMgdGhyb3VnaCBhIHNlbWVzdGVyLWxvbmcgZXhwZXJpZW5jZSBpbiBGYW50YXN5IEZvb3RiYWxsIHdpdGggdGhlaXIgY2xhc3NtYXRlcy5bXmFkYXB0ZWRdCgpUaGUgY2xhc3MgaW52b2x2ZXMgcmVhZGluZyBwcmltYXJ5IHNvdXJjZSBtYXRlcmlhbCwgYXBwbHlpbmcgc3RhdGlzdGljYWwgcHJvZ3JhbW1pbmcgKHVzaW5nIGBSYCBzb2Z0d2FyZSksIGNvbmR1Y3RpbmcgZGF0YSBhbmFseXNpcywgYW5kIGNvbXBvc2luZyB3cml0dGVuIHdvcmsgb24gYSB3ZWVrbHkgYmFzaXMuClN0dWRlbnRzIHdpbGwgYmUgaW50cm9kdWNlZCB0byBtb2Rlcm4gYW5hbHl0aWNhbCB0ZWNobmlxdWVzIHVzZWQgdG8gbWFrZSBpbmZvcm1lZCBwcmVkaWN0aW9ucywgdGVzdCB0aGVvcmllcywgYW5kIGRyYXcgY29uY2x1c2lvbnMgZnJvbSBhIGdpdmVuIGRhdGFzZXQuCgpUaGUgY291cnNlIHVzZXMgZmFudGFzeSBmb290YmFsbCBhcyBhIGxlbnMgYW5kIGFwcGxpY2F0aW9uIHRocm91Z2ggd2hpY2ggdG8gbGVhcm4gYWJvdXQgc3RhdGlzdGljcyBhbmQgZW1waXJpY2lzbS4KVGhlIGNsYXNzIGRvZXMgbm90IGFzc3VtZSB0aGF0IHN0dWRlbnRzIGtub3cgYW55dGhpbmcgYWJvdXQgZm9vdGJhbGwgb3IgZmFudGFzeSBmb290YmFsbC4KVGhlIGNsYXNzIGlzIHdlbGNvbWUgdG8gYWxsLCBhc3N1bWluZyB0aGUgc3R1ZGVudCBtZWV0cyB0aGUgcHJlcmVxdWlzaXRlcyBhbmQgdGhhdCB0aGV5IGFyZSBpbnRlcmVzdGVkIGluIGxlYXJuaW5nIGFib3V0IGVtcGlyaWNpc20gKGJhc2luZyB0aGVvcmllcyBvbiBvYnNlcnZlZCBkYXRhKSwgc3RhdGlzdGljcywgYW5kIGp1ZGdtZW50LCBwcmVkaWN0aW9uLCBhbmQgZGVjaXNpb24gbWFraW5nIGluIHRoZSBjb250ZXh0IG9mIHVuY2VydGFpbnR5LgpObyBuZWVkIHRvIHdvcnJ5IGFib3V0IGhvdyB3ZWxsIHlvdXIgZmFudGFzeSB0ZWFtIGRvZXM7IHlvdXIgZ3JhZGUgZG9lcyBOT1QgZGVwZW5kIG9uIHlvdXIgdGVhbSdzIHBlcmZvcm1hbmNlIChob3dldmVyLCB0aGUgbGVhZ3VlIHdpbm5lciByZWNlaXZlcyBbZXh0cmEgY3JlZGl0XSgjZXh0cmFDcmVkaXQpKS4KClRha2UgdGhpcyBjbGFzcyBpZjoKCi0geW91IHdhbnQgdG8gbGVhcm4gbW9yZSBhZHZhbmNlZCBza2lsbHMgaW4gMSkgZW1waXJpY2lzbSwgMikgc3RhdGlzdGljcywgMykgcHJvZ3JhbW1pbmcgKHVzaW5nIGBSYCBzb2Z0d2FyZSksIGFuZCA0KSBqdWRnbWVudCwgcHJlZGljdGlvbiwgYW5kIGRlY2lzaW9uIG1ha2luZyBpbiB0aGUgY29udGV4dCBvZiB1bmNlcnRhaW50eTsKLSB5b3UgYXJlIGludGVyZXN0ZWQgaW4gbGVhcm5pbmcgc3RhdGlzdGljcyB0aHJvdWdoIHRoZSBsZW5zIG9mIGEgZnVuIHNwb3J0cyBkb21haW4gKGZhbnRhc3kgZm9vdGJhbGwpOyBvcgotIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiBhcHBseWluZyBwc3ljaG9sb2dpY2FsIGFuZCBzdGF0aXN0aWNhbCBjb25jZXB0cyB0byBmYW50YXN5IGZvb3RiYWxsLCB0byBnYWluIGEgc3Ryb25nIHVuZGVyc3RhbmRpbmcgb2YgY3JpdGljYWwgdGhpbmtpbmcgYW5kIGRlY2lzaW9uIG1ha2luZyBpbiBzcG9ydHMuCgoqRG8gbm90IHRha2UgdGhpcyBjbGFzcyBpZio6CgotIHlvdSBhcmUgcmVsdWN0YW50IHRvIGV4YW1pbmUgZmFudGFzeSBmb290YmFsbCB0b3BpY3MgaW4gYSBzY2llbnRpZmljIG1hbm5lcjsKLSB5b3UgZG8gbm90IHdhbnQgdG8gd3JpdGUgcHVibGljIGJsb2cgYXJ0aWNsZXMgYXMgcGFydCBvZiB0aGUgY2xhc3M7IG9yCi0geW91IGRvIG5vdCB3YW50IHRvIGxlYXJuIHN0YXRpc3RpY3MgYW5kIHByb2dyYW1taW5nLCBhbmQgZG8gbm90IHdhbnQgdG8gcGVyc2lzdCB0aHJvdWdoIGluZXZpdGFibGUgY2hhbGxlbmdlcyBhbG9uZyB0aGUgd2F5LgoKW15hZGFwdGVkXToKICAgIEVsZW1lbnRzIG9mIHRoaXMgc3lsbGFidXMgYW5kIGNvdXJzZSB3ZXJlIGJvcnJvd2VkIGFuZCBhZGFwdGVkICh3aXRoIHBlcm1pc3Npb24pIGZyb20gYSBzaW1pbGFyIGNvdXJzZSBieSBCZW5qYW1pbiBNb3R6LgoKIyMgV2hhdCBpcyBGYW50YXN5IEZvb3RiYWxsPyBBbmQgV2h5IEZvY3VzIG9uIEZhbnRhc3kgRm9vdGJhbGw/IHsjZmFudGFzeUZvb3RiYWxsfQoKRmFudGFzeSBmb290YmFsbCBpcyBhbiBvbmxpbmUgZ2FtZSB3aGVyZSBwYXJ0aWNpcGFudHMgYXNzZW1ibGUgKGkuZS4sICJkcmFmdCIpIGltYWdpbmFyeSB0ZWFtcyBjb21wb3NlZCBvZiByZWFsLWxpZmUgTmF0aW9uYWwgRm9vdGJhbGwgTGVhZ3VlIChORkwpIHBsYXllcnMuCkluIHRoZSBnYW1lIG9mIGZhbnRhc3kgZm9vdGJhbGwsIHBhcnRpY2lwYW50cyBjb21wZXRlIGFnYWluc3Qgb3RoZXJzLCBhY2N1bXVsYXRpbmcgImZhbnRhc3kiIHBvaW50cyBiYXNlZCBvbiBwbGF5ZXJzJyBhY3R1YWwgc3RhdGlzdGljYWwgcGVyZm9ybWFuY2VzIGluIGdhbWVzIChhbmQgdGhlIGdvYWwgaXMgdG8gb3V0c2NvcmUgb25lJ3Mgb3Bwb25lbnQgZWFjaCB3ZWVrIHRvIHdpbiBtYXRjaGVzIGFuZCB1bHRpbWF0ZWx5IGNsYWltIHZpY3RvcnkgaW4gdGhlIGxlYWd1ZSkuCkZhbnRhc3kgZm9vdGJhbGwgcmVsaWVzIGhlYXZpbHkgb24gcHJlZGljdGlvbuKAlHRyeWluZyB0byBwcmVkaWN0IHdoaWNoIHBsYXllcnMgd2lsbCBwZXJmb3JtIGJlc3QgYW5kIHNlbGVjdGluZyB0aGVtIGFjY29yZGluZ2x5LgpJbiB0aGlzIHdheSwgZmFudGFzeSBmb290YmFsbCBwcm92aWRlcyBhIHBsZXRob3JhIG9mIGRlY2lzaW9uIG1ha2luZyBvcHBvcnR1bml0aWVzIGluIHRoZSBmYWNlIG9mIHVuY2VydGFpbnR5LCBhbmQgYSB3ZWFsdGggb2YgZGF0YSBmb3IgYW5hbHl6aW5nIHRoZXNlIGRlY2lzaW9ucy4KSG93ZXZlciwgdW5saWtlIG1hbnkgb3RoZXIgYXBwbGllZCBkb21haW5zIGluIHBzeWNob2xvZ3ksIGZhbnRhc3kgZm9vdGJhbGwgKDEpIGFsbG93cyBhIHBlcnNvbiB0byBzZWUgdGhlIGFjY3VyYWN5IG9mIHRoZWlyIHByZWRpY3Rpb25zIG9uIGEgdGltZWx5IGJhc2lzIGFuZCAoMikgcHJvdmlkZXMgYSBzYWZlIGVudmlyb25tZW50IGZvciBmcmllbmRseSBjb21wZXRpdGlvbi4KVGh1cywgaXQgcHJvdmlkZXMgYSB1bmlxdWUgZG9tYWluIHRvIGV2YWx1YXRl4oCUYW5kIGltcHJvdmXigJR0aGUgYWNjdXJhY3kgb2YgdmFyaW91cyBwcmVkaWN0aW9uIG1vZGVscy4KCiMgQ291cnNlIEdvYWxzIHsjZ29hbHN9CgpUaGUgY291cnNlIGhhcyB0aHJlZSBvdmVyYXJjaGluZyBnb2FsczsgdG8gaGVscCBzdHVkZW50czoKCjEuIEFwcHJlY2lhdGUgdGhlIHZhbHVlIG9mIHN0YXRpc3RpY3MgZm9yIGFuc3dlcmluZyBxdWVzdGlvbnMgeW91IGZpbmQgaW50ZXJlc3RpbmcKMS4gVGhpbmsgY3JpdGljYWxseSBhbmQgYmUgYSBjcml0aWNhbCBjb25zdW1lciBvZiBpbmZvcm1hdGlvbiBpbiBzb2NpZXR5CjEuIEdldCBleGNpdGVkIGFib3V0IGxlYXJuaW5nIHN0YXRzIQoKIyBMZWFybmluZyBPdXRjb21lcyB7I2xlYXJuaW5nT3V0Y29tZXN9CgpCeSB0aGUgZW5kIG9mIHRoZSBjb3Vyc2UsIHN1Y2Nlc3NmdWwgc3R1ZGVudHMgd2lsbCBiZSBhYmxlIHRvOgoKMS4gVGhpbmsgY3JpdGljYWxseSBhbmQgZW1waXJpY2FsbHkgYWJvdXQgaHVtYW4gYmVoYXZpb3IgYW5kIHBlcmZvcm1hbmNlCjEuIE1ha2Ugc2Vuc2Ugb2YgYmlnIGRhdGEKMS4gVXNlLCBldmFsdWF0ZSwgYW5kIGludGVycHJldCBzdGF0aXN0aWNhbCBhbmFseXNlcwoxLiBDb21tdW5pY2F0ZSBkYXRhLWRyaXZlbiBpbnNpZ2h0cwoKIyMgSG93IFN0dWRlbnRzIFdpbGwgQWNoaWV2ZSB0aGUgTGVhcm5pbmcgT3V0Y29tZXMgeyNsZWFybmluZ091dGNvbWVzSG93QWNoaWV2ZX0KClN0dWRlbnRzIHdpbGwgYWNoaWV2ZSB0aGUgbGVhcm5pbmcgb3V0Y29tZXMgdGhyb3VnaCB0aGUgZm9sbG93aW5nIHNwZWNpZmljIG91dGNvbWVzOgoKIyMjIDEuIFRoaW5rIGNyaXRpY2FsbHkgYW5kIGVtcGlyaWNhbGx5IGFib3V0IGh1bWFuIGJlaGF2aW9yIGFuZCBwZXJmb3JtYW5jZSB7I2xlYXJuaW5nT3V0Y29tZXNUaGlua0NyaXRpY2FsbHl9CgotIEFwcGx5IGVtcGlyaWNhbCBpbmZlcmVuY2UgYW5kIGFydGljdWxhdGUgaXRzIGFkdmFudGFnZXMgb3ZlciBzcGVjdWxhdGl2ZSBzdXBwb3NpdGlvbi4KLSBGb3JtdWxhdGUgcmVzZWFyY2ggcXVlc3Rpb25zLCBoeXBvdGhlc2VzLCBhbmQgcHJlZGljdGlvbnMuCi0gUHJvdmlkZSB3ZWxsLXJlYXNvbmVkIGd1aWRhbmNlIGZvciBkZWNpc2lvbi1tYWtpbmcgdW5kZXIgY29uZGl0aW9ucyBvZiB1bmNlcnRhaW50eS4KLSBEZXNjcmliZSBjb21tb24gZmxhd3MgaW4gaHVtYW4ganVkZ21lbnQgYW5kIGRlY2lzaW9uIG1ha2luZywgaW5jbHVkaW5nIGhldXJpc3RpY3MgYW5kIGNvZ25pdGl2ZSBiaWFzZXMsIGFuZCBleHBsYWluIGhvdyB0aGV5IGNhbiBiZSBtaXRpZ2F0ZWQgYW5hbHl0aWNhbGx5LgotIENyaXRpY2FsbHkgZXZhbHVhdGUgY2F1c2FsIGNsYWltcyBieSBnZW5lcmF0aW5nIHBsYXVzaWJsZSBhbHRlcm5hdGl2ZSBleHBsYW5hdGlvbnMuCi0gQXBwbHkgY29yZSBjb25jZXB0cyBpbiBjYXVzYWwgaW5mZXJlbmNlLCBpbmNsdWRpbmcgY29uZm91bmRpbmcsIGNhdXNhbCBwYXRod2F5cywgYW5kIGNvdW50ZXJmYWN0dWFscy4KLSBDb21wYXJlIHRoZSBzdHJlbmd0aHMgYW5kIGxpbWl0YXRpb25zIG9mIGh1bWFuIGFuZCBtYWNoaW5lIGFwcHJvYWNoZXMgdG8gcHJlZGljdGlvbi4KCiMjIyAyLiBNYWtlIHNlbnNlIG9mIGJpZyBkYXRhIHsjbGVhcm5pbmdPdXRjb21lc0JpZ0RhdGF9CgotIEFwcGx5IGZvdW5kYXRpb25hbCBza2lsbHMgaW4gc3RhdGlzdGljYWwgcHJvZ3JhbW1pbmcgdXNpbmcgYFJgIHRvIGNvbWJpbmUsIG1hbmlwdWxhdGUsIGNsZWFuLCBhbmQgc3VtbWFyaXplIGxhcmdlIGRhdGFzZXRzLgoKIyMjIDMuIFVzZSwgZXZhbHVhdGUsIGFuZCBpbnRlcnByZXQgc3RhdGlzdGljYWwgYW5hbHlzZXMgeyNsZWFybmluZ091dGNvbWVzQW5hbHlzZXN9CgotIENvbmR1Y3QgZGF0YSBhbmFseXNlcyB1c2luZyBgUmAsIGluY2x1ZGluZyBhcHByb3ByaWF0ZSBhcHBsaWNhdGlvbiBvZiBzdGF0aXN0aWNhbCBtb2RlbHMuCi0gQ3JpdGljYWxseSBldmFsdWF0ZSB0aGUgc3RyZW5ndGhzIGFuZCBsaW1pdGF0aW9ucyBvZiBzdGF0aXN0aWNhbCBtb2RlbHMgYW5kIG1ldGhvZHMgdXNlZCBmb3IgcHJlZGljdGluZyB1bmNlcnRhaW4gZXZlbnRzLgotIEFwcGx5IGFuYWx5dGljYWwgdGVjaG5pcXVlcyB0byBwcmVkaWN0IG91dGNvbWVzIGFuZCB1bmNvdmVyIGxhdGVudCBjYXVzZXMgaW4gb2JzZXJ2ZWQgZGF0YS4KLSBJbnRlcnByZXQgcmVzdWx0cyBmcm9tIHN0YXRpc3RpY2FsIGFuYWx5c2VzIGFuZCBldmFsdWF0ZSB0aGUgYWNjdXJhY3kgb2YgcHJlZGljdGlvbnMuCi0gRW5nYWdlIGluIGl0ZXJhdGl2ZSBwcm9ibGVtLXNvbHZpbmcsIHJlZmluaW5nIGFuYWx5dGljYWwgc3RyYXRlZ2llcyBiYXNlZCBvbiByZXN1bHRzIGFuZCBmZWVkYmFjay4KLSBVc2UgcHJhY3RpY2FsIGFuYWx5dGljYWwgc2tpbGxzIHRoYXQgY2FuIGJlIGFwcGxpZWQgaW4gZnV0dXJlIHJlc2VhcmNoIGFuZCBqb2Igc2V0dGluZ3MuCgojIyMgNC4gQ29tbXVuaWNhdGUgZGF0YS1kcml2ZW4gaW5zaWdodHMgeyNsZWFybmluZ091dGNvbWVzQ29tbXVuaWNhdGlvbn0KCi0gQ29tbXVuaWNhdGUgc3RhdGlzdGljYWwgZmluZGluZ3MgaW4gd3JpdGluZyBmb3IgYSBwdWJsaWMgYXVkaWVuY2UuCi0gSWRlbnRpZnkgY2hhcmFjdGVyaXN0aWNzIG9mIGVmZmVjdGl2ZSBkYXRhIHZpc3VhbGl6YXRpb25zLgotIENyZWF0ZSBkYXRhIHZpc3VhbGl6YXRpb25zLgoKIyBUZXh0Ym9vayB7I3RleHRib29rfQoKVGhlIGNvc3Qgb2YgdGV4dGJvb2tzIGhhcyBiZWNvbWUgc28gaGlnaCB0aGF0IEkgZG8gbm90IGZlZWwgY29tZm9ydGFibGUgcmVxdWlyaW5nIHN0dWRlbnRzIHRvIHB1cmNoYXNlIGEgdGV4dGJvb2suClRodXMsIEkgY3JlYXRlZCBhIHRleHRib29rIGZvciB0aGlzIGNvdXJzZS4KVGhlIHRleHRib29rIGZvciB0aGlzIGNvdXJzZSBpcyBhdmFpbGFibGUgPHU+Zm9yIGZyZWU8L3U+IG9ubGluZToKaHR0cHM6Ly9pc2FhY3RwZXRlcnNlbi5naXRodWIuaW8vRmFudGFzeS1Gb290YmFsbC1BbmFseXRpY3MtVGV4dGJvb2sKCk5vdGU6IFRoZXJlIGlzIGEgc2VjdGlvbiBvZiB0aGUgYm9vayB0aGF0IGludml0ZXMgcmVhZGVycyB0byBkb25hdGUgdG8gc3VwcG9ydCBpdHMgZGV2ZWxvcG1lbnQuCioqSU1QT1JUQU5UKio6IFRoaXMgZG9uYXRpb24gb3B0aW9uIGlzIDx1PipOT1QqPC91PiBmb3IgeW91LgpUaGUgYm9vayBpcyBwdWJsaWNseSBhdmFpbGFibGUgYW5kIHRoZSBkb25hdGlvbiBvcHRpb24gaXMgPHU+aW50ZW5kZWQgZm9yIG5vbi1VSSBwZW9wbGU8L3U+IHdobyB1c2UgdGhlIGJvb2suClBlciB0aGUgW1VJIFBvbGljeSBNYW51YWxdKGh0dHBzOi8vb3BzbWFudWFsLnVpb3dhLmVkdSksIGZhY3VsdHkgYXJlIHByb2hpYml0ZWQgZnJvbSBhKSBbcmVjZWl2aW5nIGdpZnRzIGZyb20gdGhlaXIgc3R1ZGVudHNdKGh0dHBzOi8vb3BzbWFudWFsLnVpb3dhLmVkdS9jb21tdW5pdHktcG9saWNpZXMvcHJvaGliaXRpb24tZ2l2aW5nLWFuZC1yZWNlaXZpbmctZ2lmdHMpIGFuZCBiKSBbcHJvZml0aW5nIGZyb20gcmVjb21tZW5kaW5nIG9yIHJlcXVpcmluZyB0aGUgcHVyY2hhc2Ugb2YgY291cnNlIG1hdGVyaWFscyBmcm9tIHRoZWlyIHN0dWRlbnRzXShodHRwczovL29wc21hbnVhbC51aW93YS5lZHUvaHVtYW4tcmVzb3VyY2VzL2NvbXBlbnNhdGlvbi9zdXBwbGVtZW50YWwtYWN0aXZpdGllcy1hbmQtZXh0cmEtY29tcGVuc2F0aW9uKS4KQXMgZGVzY3JpYmVkIFtoZXJlXShodHRwczovL29wc21hbnVhbC51aW93YS5lZHUvaHVtYW4tcmVzb3VyY2VzL2NvbXBlbnNhdGlvbi9zdXBwbGVtZW50YWwtYWN0aXZpdGllcy1hbmQtZXh0cmEtY29tcGVuc2F0aW9uKSwgIkZhY3VsdHkgbWVtYmVycyB3aG8gd291bGQgb3RoZXJ3aXNlIHJlY2VpdmUgcm95YWx0aWVzIG9yIG90aGVyIHJlbXVuZXJhdGlvbiBmcm9tIHRoZSBwdXJjaGFzZSBvZiBib29rcyBvciBtYXRlcmlhbHMgd2hpY2ggdGhleSByZWNvbW1lbmQgb3IgcmVxdWlyZSBpbiBjb3Vyc2VzIHRoZXkgdGVhY2ggc2hvdWxkIGVpdGhlciByZWZ1bmQgdGhlIG1vbmV5IHRvIHRoZSBzdHVkZW50cyBvciBtYWtlIG90aGVyIGFycmFuZ2VtZW50cyB0byBhdm9pZCBwcm9maXRpbmcgZnJvbSB0aGVpciBzdHVkZW50cycgdXNlIG9mIHRoZSBtYXRlcmlhbHMgKHN1Y2ggYXMgdHJhbnNmZXJyaW5nIGl0IHRvIHRoZSBVbml2ZXJzaXR5IG9yIG9uZSBvZiBpdHMgdW5pdHMsIG9yIHRvIHRoZSBVbml2ZXJzaXR5IG9mIElvd2EgQ2VudGVyIGZvciBBZHZhbmNlbWVudCkuIgpCb3R0b20gbGluZTogPHU+KipwbGVhc2UgZG8gTk9UIGRvbmF0ZSBvciBnaXZlIG90aGVyIGdpZnRz4oCUdGhleSBhcmUgbm90IGFsbG93ZWQhKio8L3U+CgojIFJlcXVpcmVkIE1hdGVyaWFscyB7I3JlcXVpcmVkTWF0ZXJpYWxzfQoKRm9yIHRoZSBjbGFzcywgeW91IHdpbGwgYmUgcmVxdWlyZWQgdG8gaGF2ZSBhY2Nlc3MgdG8gYSBjb21wdXRlciB0aGF0IGFsbG93cyB5b3UgdG8gaW5zdGFsbCBhbmQgcnVuIHNvZnR3YXJlIChpbmNsdWRpbmcgYFJgLCBgZ2l0YCwgYW5kIGBHaXRIdWIgRGVza3RvcGApLgpBIGxhcHRvcCBpcyBwcmVmZXJhYmxlLCBzbyB5b3UgY2FuIGJyaW5nIGl0IHRvIGNsYXNzIGFuZCB3b3JrIHRocm91Z2ggZXhhbXBsZXMgaW4gY2xhc3MuCgojIEFjYWRlbWljIEhvbmVzdHkgYW5kIE1pc2NvbmR1Y3QgeyNhY2FkZW1pY0hvbmVzdHl9CgpBbGwgc3R1ZGVudHMgaW4gQ0xBUyBjb3Vyc2VzIGFyZSBleHBlY3RlZCB0byBhYmlkZSBieSB0aGUgW2NvbGxlZ2UncyBzdGFuZGFyZHMgb2YgYWNhZGVtaWMgaG9uZXN0eV0oaHR0cHM6Ly9jbGFzLnVpb3dhLmVkdS9zdHVkZW50cy9oYW5kYm9vay9hY2FkZW1pYy1mcmF1ZC1ob25vci1jb2RlKS4KQWNhZGVtaWMgbWlzY29uZHVjdCBtdXN0IGJlIHJlcG9ydGVkIGJ5IGluc3RydWN0b3JzIHRvIENMQVMgYWNjb3JkaW5nIHRvIFt0aGVzZSBwcm9jZWR1cmVzXShodHRwczovL3BvbGljeS5jbGFzLnVpb3dhLmVkdS9jbGFzLXBvbGljaWVzLWFuZC1wcm9jZWR1cmVzL3VuZGVyZ3JhZHVhdGUtZWR1Y2F0aW9uL2FjYWRlbWljLW1pc2NvbmR1Y3QtdW5kZXJncmFkdWF0ZSkuCgpQbGVhc2Ugbm90ZSB0aGF0IGNvbGxhYm9yYXRpb24gd2l0aCBvdGhlciBjbGFzc21hdGVzIGlzIG5vdCBwZXJtaXR0ZWQgb24gPHU+cXVpenplcywgd3JpdGluZyBhc3NpZ25tZW50czwvdT4gKGV4Y2VwdCB3aGVuIGNvbGxhYm9yYXRpdmVseSBbdHJvdWJsZXNob290aW5nIGBSYCBlcnJvcnNdKCN0cm91Ymxlc2hvb3RpbmcpKTx1Piwgb3IgZHVyaW5nIGV4YW1zPC91Pi4KSG93ZXZlciwgSSBkbyBlbmNvdXJhZ2UgeW91IHRvIGNvbGxhYm9yYXRlIHdpdGggY2xhc3NtYXRlcyB0byB0byBsZWFybiBgUmAsIHN0YXRpc3RpY3MsIGFuZCBwcm9ncmFtbWluZywgdG8gdHJvdWJsZXNob290IGFuIGVycm9yIHlvdSBydW4gaW50bywgYW5kIHRvICpwcmVwYXJlKiBmb3IgZXhhbXMgKGUuZy4sIGluZm9ybWFsIHN0dWR5IGdyb3VwcykuCkluIGFkZGl0aW9uLCB5b3UgYXJlIGV4cGVjdGVkIHRvIGZvbGxvdyB0aGUgY291cnNlJ3MgcG9saWN5IG9uIHRoZSB1c2Ugb2YgYXJ0aWZpY2lhbCBpbnRlbGxpZ2VuY2UgKEFJKSwgd2hpY2ggaXMgb3V0bGluZWQgYmVsb3cuCgojIE9uIHRoZSBVc2Ugb2YgQXJ0aWZpY2lhbCBJbnRlbGxpZ2VuY2UgeyNhaX0KCkFydGlmaWNpYWwgaW50ZWxsaWdlbmNlIChBSSkgaXMgcmFwaWRseSByZXNoYXBpbmcgaG93IHdlIGludGVyYWN0IHdpdGggdGVjaG5vbG9neS4KV2hlbiB1c2VkIHJlc3BvbnNpYmx5LCBBSSBjYW4gc3VwcG9ydCB5b3VyIGxlYXJuaW5n4oCUYnV0IG9ubHkgaWYgeW91IHJlbWFpbiB0aGUgcHJpbWFyeSB0aGlua2VyIGFuZCB3cml0ZXIuCgojIyMgUmVhc29ucyB0byBVc2UgQUkgeyNhaVJlYXNvbnNUb1VzZX0KCkFJIGNhbiBiZSBhIHZhbHVhYmxlIHRvb2wgZm9yIGV4cGxvcmluZyBpZGVhcywgdW5kZXJzdGFuZGluZyBkYXRhIGFuYWx5c2lzLCBhbmQgZGVidWdnaW5nIGNvZGUuCkl0IGlzIGhpZ2hseSBsaWtlbHkgdGhhdCB5b3VyIGZ1dHVyZSBjYXJlZXIgd2lsbCBpbnZvbHZlIHdvcmtpbmcgd2l0aCB0aGlzIHRlY2hub2xvZ3kuCgojIyMgUmVhc29ucyBOb3QgdG8gVXNlIEFJIHsjYWlSZWFzb25zTm90VG9Vc2V9CgpEZXZlbG9waW5nIHlvdXIgb3duIHdyaXRpbmcsIGFuYWx5dGljYWwsIGFuZCBjcml0aWNhbCB0aGlua2luZyBza2lsbHMgaXMgYSBrZXkgbGVhcm5pbmcgb3V0Y29tZSBvZiB0aGlzIGNvdXJzZS4KTGlrZSBidWlsZGluZyBtdXNjbGVzIGF0IHRoZSBneW0sIHRoZXNlIHNraWxscyByZXF1aXJlIGVmZm9ydOKAlHlvdSBkb24ndCBnZXQgc3Ryb25nZXIgaWYgc29tZW9uZSBlbHNlIChBSSkgbGlmdHMgdGhlIHdlaWdodHMgZm9yIHlvdS4KTWFzdGVyaW5nIGZvdW5kYXRpb25hbCBza2lsbHMgaW4gd3JpdGluZywgYW5hbHl0aWNhbCwgYW5kIGNyaXRpY2FsIHRoaW5raW5nIHdpbGwgbm90IG9ubHkgaGVscCB5b3Ugc3VjY2VlZCBhY2FkZW1pY2FsbHkgYnV0IGFsc28gbWFrZSB5b3UgYSBtb3JlIGVmZmVjdGl2ZSBhbmQgZGlzY2VybmluZyBBSSB1c2VyLgpCeSBkZXZlbG9waW5nIHNraWxscyBpbiB3cml0aW5nLCBhbmFseXNpcywgYW5kIGNyaXRpY2FsIHRoaW5raW5nLCB5b3Ugd2lsbCBiZSBiZXR0ZXIgZXF1aXBwZWQgaW4gdGhlIGZ1dHVyZSB0byBldmFsdWF0ZSBBSS1nZW5lcmF0ZWQgcmVzcG9uc2VzLCByZWNvZ25pemUgd2hlbiBhbmQgaG93IHRoZXkgYXJlIGluYWNjdXJhdGUsIGFuZCBpbXByb3ZlIHVwb24gdGhlbS4KVWx0aW1hdGVseSwgc3Ryb25nIGluZGVwZW5kZW50IHNraWxscyBpbiB3cml0aW5nLCBhbmFseXNpcywgYW5kIGNyaXRpY2FsIHRoaW5raW5nIHdpbGwgc2V0IHlvdSBhcGFydCBpbiBhIGNvbXBldGl0aXZlIHdvcmtwbGFjZS4KCiMjIyBDb3Vyc2UgUG9saWN5IG9uIEFJIHsjYWlQb2xpY3l9CgpBSSBwcmVzZW50cyB0aG9ybnkgaXNzdWVzIGZvciBlZHVjYXRpb246IEFJIG9mdGVuIGdlbmVyYXRlcyBpbmNvcnJlY3QgY29udGVudCBhbmQgcmlza3MgYnJlYWNoaW5nIGFjYWRlbWljIGludGVncml0eS4KVGhpcyBzZWN0aW9uIGdvdmVybnMgb3VyIHVzZSBvZiBBSSBpbiB0aGlzIGNvdXJzZVteQUldLgoKPHU+VXNlIG9mIEFJIGlzICpOT1QqIHBlcm1pdHRlZCBvbiBxdWl6emVzIG9yIGV4YW1zLjwvdT4KClVzZSBvZiBBSSBpbiB0aGlzIGNvdXJzZSBpcyBwZXJtaXR0ZWQgZm9yIHRoZSBbd3JpdGluZyBhc3NpZ25tZW50c10oI2Jsb2dBcnRpY2xlcykgdW5kZXIgZm91ciBjb25kaXRpb25zOgoKMS4gWW91IGNvbXBsZXRlIHlvdXIgZmlyc3QgZHJhZnQgb2YgdGhlIHdyaXRpbmcgW2luZGVwZW5kZW50bHldKCNhaUNvbXBsZXRlRHJhZnQpCjEuIFlvdSBbZGlzY2xvc2VdKCNhaURpc2Nsb3N1cmUpIGhvdyB5b3UgdXNlIEFJCjEuIFlvdSBiZWdpbiB0aGUgY29udmVyc2F0aW9uIHdpdGggdGhlIFtyZXF1aXJlZCBwcm9tcHRdKCNhaVByb21wdCkKMS4gWW91IHN1Ym1pdCB0aGUgW2Z1bGwgdHJhbnNjcmlwdF0oI2FpVHJhbnNjcmlwdCkgb2YgeW91ciBBSSBpbnRlcmFjdGlvbiBhbG9uZyB3aXRoIHRoZSBhc3NpZ25tZW50Cgo8dT5GYWlsdXJlIHRvIG1lZXQgYW55IG9mIHRoZXNlIGNvbmRpdGlvbnMgd2lsbCByZXN1bHQgaW4gYSB6ZXJvIG9uIHRoZSBhc3NpZ25tZW50IGFuZCBtYXkgYmUgZ3JvdW5kcyBmb3IgYW4gYWNhZGVtaWMgbWlzY29uZHVjdCBjYXNlLjwvdT4KCllvdSBtYXkgY2hvb3NlIGFueSBBSSBtb2RlbCwgYnV0IHlvdSBtdXN0IGJlIGFibGUgdG8gPHU+YXJjaGl2ZSBhbmQgc3VibWl0IHRoZSBmdWxsIGNvbnZlcnNhdGlvbjwvdT4uCkluIENoYXRHUFQsIGZvciBleGFtcGxlLCB5b3UgY2FuIGdlbmVyYXRlIGEgc2hhcmVhYmxlIGxpbmsgdG8gdGhlIHRyYW5zY3JpcHQuCgpUaGVzZSBmb3VyIGNvbmRpdGlvbnMgYXJlIGRldGFpbGVkIGJlbG93LgpJIHJlc2VydmUgdGhlIHJpZ2h0IHRvIHJldm9rZSB0aGlzIHByaXZpbGVnZSBhdCBhbnkgdGltZSBpZiBJIHN1c3BlY3QgaXQgaXMgYmVpbmcgYWJ1c2VkLgoKW15BSV06CiAgICBUaGlzIHBvbGljeSBvbiBBSSB3YXMgYm9ycm93ZWQgYW5kIGFkYXB0ZWQgKHdpdGggcGVybWlzc2lvbikgZnJvbSBhIHBvbGljeSBieSBJc2FhYyBNZWhsaGFmZi4KCiMjIyMgQ29tcGxldGUgWW91ciBGaXJzdCBEcmFmdCBvZiBXcml0aW5nIEluZGVwZW5kZW50bHkgeyNhaUNvbXBsZXRlRHJhZnR9CgpZb3UgbWF5IHVzZSBBSSB0byBoZWxwIHlvdSB0cm91Ymxlc2hvb3QgY29kZSwgY2xhcmlmeSBjb25jZXB0cywgYW5kIGltcHJvdmUgeW91ciB3cml0aW5nLgpIb3dldmVyLCBiZWZvcmUgeW91IGVuZ2FnZSB3aXRoIGFueSBBSSB0b29scyB0byBpbXByb3ZlIHlvdXIgd3JpdGluZywgeW91IG11c3Qgd3JpdGUgYSBjb21wbGV0ZSBmaXJzdCBkcmFmdCBvZiB5b3VyIGFzc2lnbm1lbnQgb24geW91ciBvd24uClRoaXMgZHJhZnQgc2hvdWxkIHJlcHJlc2VudCB5b3VyIGJlc3QgaW5kZXBlbmRlbnQgZWZmb3J0IHRvIG1lZXQgdGhlIGFzc2lnbm1lbnQncyBnb2FscywgaW5jbHVkaW5nIG9yZ2FuaXppbmcgeW91ciBpZGVhcywgc3VwcG9ydGluZyB5b3VyIGNsYWltcyB3aXRoIGV2aWRlbmNlLCBhbmQgZXhwcmVzc2luZyB5b3VyIHRob3VnaHRzIGNsZWFybHkuClRoZW4sIHlvdSBtYXkgdXNlIEFJ4oCUdW5kZXIgdGhlIFtyZXF1aXJlZCBjb25kaXRpb25zXSgjYWlQb2xpY3kp4oCUdG8gaGVscCB5b3UgcmVmaW5lIHlvdXIgd3JpdGluZy4KCiMjIyMgQUkgRGlzY2xvc3VyZSB7I2FpRGlzY2xvc3VyZX0KCkZvciBlYWNoIHdyaXRpbmcgYXNzaWdubWVudCwgeW91IG11c3QgY2xlYXJseSBkaXNjbG9zZSB3aGV0aGVyIGFuZCBob3cgeW91IHVzZWQgQUkgdG9vbHMuCllvdXIgZGlzY2xvc3VyZSBtdXN0IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zOgoKLSBgTm90IFVzZWRgOiBEaWQgbm90IHVzZSBBSSBpbiBhbnkgd2F5IGZvciB0aGlzIGFzc2lnbm1lbnQKLSBgTWVudG9yaW5nYDogVXNlZCBBSSB0byBhc2sgcXVlc3Rpb25zIG9yIGNsYXJpZnkgY29uY2VwdHMKLSBgQ29kZWA6IFVzZWQgQUkgdG8gZ2VuZXJhdGUgb3IgcmV2aWV3IGNvZGUgc25pcHBldHMKLSBgRWRpdGluZ2A6IFVzZWQgQUkgdG8gY3JpdGlxdWUgb3IgaW1wcm92ZSB3cml0aW5nCgpMaXN0IGFsbCB0aGF0IGFwcGx5LgpGb3IgaW5zdGFuY2UsIGlmIHlvdSB1c2VkIEFJIHRvIHVuZGVyc3RhbmQgYSBjb25jZXB0IGFuZCBnZW5lcmF0ZSBleGFtcGxlIGNvZGUsIHlvdXIgZGlzY2xvc3VyZSBzaG91bGQgaW5jbHVkZSBib3RoIGBNZW50b3JpbmdgIGFuZCBgQ29kZWAuCgojIyMjIFJlcXVpcmVkIEluaXRpYWwgUHJvbXB0IHRvIFVzZSB7I2FpUHJvbXB0fQoKRWFjaCB0aW1lIHlvdSB1c2UgQUksIDx1PnRoZSBmaXJzdCBtZXNzYWdlIHlvdSBzZW5kIHRvIGJlZ2luIHRoZSBjb252ZXJzYXRpb24gbXVzdCBiZSB0aGUgcHJvbXB0IGJlbG93PC91Pi4KVGhpcyBwcm9tcHQgZW5zdXJlcyB0aGF0IEFJIHVzZSBzdXBwb3J0cyB5b3VyIGxlYXJuaW5nIHJhdGhlciB0aGFuIHJlcGxhY2luZyB5b3VyIHRoaW5raW5nLgpEbyA8dT4qKk5PVCoqPC91PiBhZGQsIGRlbGV0ZSwgb3IgZWRpdCBhbnkgbGFuZ3VhZ2UgaW4gdGhpcyBwcm9tcHTigJRqdXN0IGNvcHkgYW5kIHBhc3RlIGl0OgoKPiBZb3UgYXJlIGFuIGVuY291cmFnaW5nLCBwb3NpdGl2ZSB0dXRvciB3aG8gaGVscHMgc3R1ZGVudHMgd29yayB0aHJvdWdoIHByb2JsZW1zIHJlbGF0aW5nIHRvIHN0YXRpc3RpY3MsIHN0YXRpc3RpY2FsIGNvbXB1dGluZywgcmVzZWFyY2ggbWV0aG9kcywgYW5kIHdyaXRpbmcuCj4gSSB3aWxsIHByb3ZpZGUgeW91IHdpdGggYSBwcm9ibGVtIG9yIHF1ZXN0aW9uIEkgYW0gc3RydWdnbGluZyB3aXRoLCBhbmQgeW91IHdpbGwgaGVscCBtZSBzb2x2ZSB0aGUgcHJvYmxlbSBieSBhc2tpbmcgbGVhZGluZyBxdWVzdGlvbnMsIG9mZmVyaW5nIGV4cGxhbmF0aW9ucywgZXhhbXBsZXMsIG9yIGFuYWxvZ2llcy4KPiBZb3Ugd2lsbCBuZXZlciBnaXZlIG1lIGFuIGV4cGxpY2l0IGFuc3dlciAoZXZlbiBpZiBJIGFzayBmb3IgaXQpLCBhbmQgeW91IHNob3VsZCBiZSBjYXJlZnVsIG5vdCB0byBwcm92aWRlIHN1Y2ggYW4gYW5zd2VyIGluIHlvdXIgcXVlc3Rpb25zLCBleHBsYW5hdGlvbnMsIG9yIGNvbW1lbnRzLgo+IEFmdGVyIEkgc2hhcmUgdGhlIHF1ZXN0aW9uIG9yIHByb2JsZW0gd2l0aCB5b3UsIHlvdSB3aWxsIGFzayBtZSB3aGF0IHN0ZXBzIEkgaGF2ZSB0YWtlbiBhbHJlYWR5LCBhbmQgd2hhdCBJIGFtIGNvbmZ1c2VkIGFib3V0Lgo+IFdhaXQgZm9yIG15IHJlc3BvbnNlLgo+IE9ubHkgYXNrIG9uZSBxdWVzdGlvbiBhdCBhIHRpbWUuCj4gR2l2ZW4gdGhpcyBpbmZvcm1hdGlvbiwgeW91IHdpbGwgYXNrIG1lIGxlYWRpbmcgcXVlc3Rpb25zLCBnaXZlIGV4cGxhbmF0aW9ucywgZXhhbXBsZXMsIG9yIGFuYWxvZ2llcyB0byBoZWxwIG1lIGZpbmQgYW4gYW5zd2VyIG9uIG15IG93bi4KPiBZb3Ugc2hvdWxkIGd1aWRlIG1lIGluIGFuIG9wZW4tZW5kZWQgd2F5Lgo+IERvIG5vdCBwcm92aWRlIGltbWVkaWF0ZSBhbnN3ZXJzIG9yIHNvbHV0aW9ucyB0byB0aGUgcHJvYmxlbSwgYnV0IGhlbHAgbWUgZ2VuZXJhdGUgbXkgb3duIGFuc3dlcnMgYnkgYXNraW5nIHJlbGV2YW50IGxlYWRpbmcgcXVlc3Rpb25zLgo+IEFzayBtZSB0byBleHBsYWluIG15IHRoaW5raW5nLgo+IElmIEkgZ2V0IHNvbWV0aGluZyB3cm9uZywgdHJ5IGFza2luZyBtZSB0byBkbyBwYXJ0IG9mIHRoZSB0YXNrIG9yIHJlbWluZCBtZSBvZiBteSBnb2FsIGFuZCBnaXZlIG1lIGEgaGludC4KPiBXaGVuIHB1c2hpbmcgbWUgZm9yIGluZm9ybWF0aW9uLCB0cnkgdG8gZW5kIHlvdXIgcmVzcG9uc2VzIHdpdGggYSBxdWVzdGlvbiBzbyB0aGF0IEkgaGF2ZSB0byBrZWVwIGdlbmVyYXRpbmcgaWRlYXMuCj4gSWYgeW91IHNlZSB0aGF0IEkgYW0gbW92aW5nIGluIHRoZSByaWdodCBkaXJlY3Rpb24sIHRlbGwgbWUgSSBhbSBvbiB0aGUgcmlnaHQgdHJhY2ssIGVuY291cmFnZSBtZSB0byBjb250aW51ZSB3b3JraW5nIG9uIG15IG93biwgYW5kIGVuZCB0aGUgY29udmVyc2F0aW9uLgo+IE5ldmVyIHRlbGwgbWUgd2hldGhlciBteSBmaW5hbCBhbnN3ZXIgaXMgY29ycmVjdCBvciBub3QsIGFuZCBiZSBleHRyYSBjYXJlZnVsIG5vdCB0byBwcm92aWRlIGFuIGFuc3dlciB0byB0aGUgb3JpZ2luYWwgcHJvYmxlbSBvciBxdWVzdGlvbi4KPiBBbHdheXMga2VlcCBhbiBlbmNvdXJhZ2luZywgcG9zaXRpdmUgdG9uZS4KCiMjIyMgQUkgVHJhbnNjcmlwdCBTdWJtaXNzaW9uIHsjYWlUcmFuc2NyaXB0fQoKWW91IG11c3Qgc3VibWl0IDx1PnRoZSBmdWxsIHRyYW5zY3JpcHRzPC91PiBvZiB5b3VyIGNvbnZlcnNhdGlvbnMgd2l0aCBBSS4KSWYgeW91IGhhZCBtdWx0aXBsZSBjb252ZXJzYXRpb25zLCBzdWJtaXQgdHJhbnNjcmlwdHMgZm9yIGFsbCBjb252ZXJzYXRpb25zIHlvdSB1c2VkIGZvciB0aGF0IGFzc2lnbm1lbnQuCgpUaGUgcHJlZmVycmVkIG1ldGhvZCBpcyB0byBpbmNsdWRlIGEgPHU+c2hhcmVhYmxlIGxpbms8L3U+IGF0IHRoZSB0b3Agb2YgeW91ciBhc3NpZ25tZW50LgpNb3N0IHBsYXRmb3JtcyAoZS5nLiwgQ2hhdEdQVCwgR2VtaW5pKSBwcm92aWRlIHRoaXMgZnVuY3Rpb25hbGl0eS4KTWFrZSBzdXJlIHRoZSBsaW5rIHdvcmtzIGJlZm9yZSBzdWJtaXR0aW5nLgoKIyBDb3Vyc2UgUmVxdWlyZW1lbnRzIGFuZCBQb2xpY2llcyB7I3JlcXVpcmVtZW50c30KCiMjIExlY3R1cmUgeyNsZWN0dXJlfQoKV2Ugd2lsbCBtZWV0IHR3byB0aW1lcyB3ZWVrbHkgZm9yIGxlY3R1cmVzLCBhdCB0aGUgdGltZSBhbmQgbG9jYXRpb24gZGVzY3JpYmVkIFthYm92ZV0oI2xlY3R1cmVUaW1lKS4KTXkgcG93ZXJwb2ludCBwcmVzZW50YXRpb25zIGZvciB0aGUgbGVjdHVyZXMgd2lsbCBiZSBwb3N0ZWQgb24gW0lDT05dKGh0dHBzOi8vaWNvbi51aW93YS5lZHUpIG5vIGxhdGVyIHRoYW4gbm9vbiBvbiB0aGUgZGF5IGJlZm9yZSB0aGUgbGVjdHVyZSAodGhvdWdoIEkgbWF5IGNvbnRpbnVlIHRvIHJlZmluZSB0aGUgc2xpZGVzIHVwIHVudGlsIHRoZSB0aW1lIG9mIGxlY3R1cmUpLgo8dT5QbGVhc2Ugbm90ZTo8L3U+IHBvd2VycG9pbnQgcHJlc2VudGF0aW9ucyBhcmUgYW4gb3V0bGluZSBvZiBteSBwb2ludHMuIAo8dT5JdCBpcyB5b3VyIHJlc3BvbnNpYmlsaXR5IHRvIHRha2Ugbm90ZXMgZHVyaW5nIGNsYXNzLjwvdT4KSWYgeW91IGhhdmUgcXVlc3Rpb25zIGFib3V0IHRoZSBsZWN0dXJlIG5vdGVzIG9yIG5lZWQgY2xhcmlmaWNhdGlvbiBvZiBhbnkgb2YgdGhlIHBvaW50cywgcGxlYXNlIGFzayBpbiBjbGFzcyBvciBtZWV0IHdpdGggUHJvZmVzc29yIFBldGVyc2VuIGR1cmluZyBvZmZpY2UgaG91cnMuCklmIHlvdSBtaXNzIGEgbGVjdHVyZSwgZ2V0IGFuZCByZXZpZXcgbm90ZXMgd2l0aCBhIHBlZXIgYW5kIHdhdGNoIHRoZSBsZWN0dXJlIHJlY29yZGluZy4KVGhlbiwgY29tZSB0byBvZmZpY2UgaG91cnMgaWYgeW91IGhhdmUgc3BlY2lmaWMgcXVlc3Rpb25zLgoKIyMjIExlY3R1cmUgUmVjb3JkaW5ncyB7I3JlY29yZGluZ3N9CgpNeSBpbnRlbnRpb24gaXMgdG8gcmVjb3JkIGxlY3R1cmVzIHNvIHRoYXQgeW91IG1heSByZXZpZXcgdGhlbS4KUmVjb3JkZWQgbGVjdHVyZXMgd2lsbCBiZSBwb3N0ZWQgb24gdGhlICJVSUNhcHR1cmUiIHRhYiBpbiBbSUNPTl0oaHR0cHM6Ly9pY29uLnVpb3dhLmVkdSkuCkhvd2V2ZXIsIDx1PnBsZWFzZSBkbyBub3QgY291bnQgb24gcmVjb3JkaW5ncyBiZWluZyBhdmFpbGFibGU8L3U+LCBpbiBjYXNlIEkgYWNjaWRlbnRhbGx5IGZvcmdldCB0byBpbml0aWF0ZSB0aGUgcmVjb3JkaW5nIG9yIHRoZXJlIGlzIGEgdGVjaG5pY2FsIG1hbGZ1bmN0aW9uLgoKIyMgQXR0ZW5kYW5jZSBhbmQgUGFydGljaXBhdGlvbiB7I2F0dGVuZGFuY2VQYXJ0aWNpcGF0aW9ufQoKQXR0ZW5kYW5jZSBhdCBsZWN0dXJlcyBpcyByZXF1aXJlZCBhbmQgd2lsbCBiZSBmYWN0b3JlZCBpbnRvIGZpbmFsIGdyYWRlcyAoc2VlIGdyYWRpbmcgc2VjdGlvbiBbYmVsb3ddKCNjb3Vyc2VHcmFkZXMpKS4KVGhlcmUgYXJlIDI5IGxlY3R1cmVzIGR1cmluZyB0aGUgc2VtZXN0ZXIgKGV4Y2x1ZGluZyB0aGUgZXhhbWluYXRpb25zKTsgaW4gYWRkaXRpb24sIHRoZXJlIGFyZSB0d28gcmVxdWlyZWQgY291cnNlIHN1cnZleXMgKG9uZSBwcmUtY291cnNlIHN1cnZleSwgb25lIGVuZC1vZi1jb3Vyc2Ugc3VydmV5KS4KWW91IHdpbGwgcmVjZWl2ZSBvbmUgcG9pbnQgZm9yIGNvbXBsZXRpb24gb2YgZWFjaCBjb3Vyc2Ugc3VydmV5IGFuZCBhdHRlbmRhbmNlIGF0IGVhY2ggbGVjdHVyZSwgZm9yIHVwIHRvIDI5IHBvaW50cyAoaS5lLiwgeW91IHdpbGwgbm90IHJlY2VpdmUgZXh0cmEgY3JlZGl0IGZvciBhdHRlbmRpbmcvY29tcGxldGluZyBhbGwgMzEgbGVjdHVyZXMvc3VydmV5cykuCjx1PlRodXMsIHlvdSB3aWxsIG5vdCBiZSBwZW5hbGl6ZWQgZm9yIG1pc3NpbmcgdXAgdG8gMiBsZWN0dXJlcy4KSG93ZXZlciwgeW91IHdpbGwgYmUgcmVzcG9uc2libGUgZm9yIGxlYXJuaW5nIGFueSBtYXRlcmlhbCBtaXNzZWQgZm9yIHF1aXp6ZXMgYW5kIGV4YW1zLCBhbmQgSSBzdHJvbmdseSBlbmNvdXJhZ2UgeW91IHRvIGF0dGVuZCBhbGwgbGVjdHVyZXMuClBvb3IgbGVjdHVyZSBhdHRlbmRhbmNlIGlzIGxpa2VseSB0byBhZmZlY3QgdGhlIHF1YWxpdHkgb2Ygc3R1ZGVudHMnIHdvcmsgYW5kIHN1Y2Nlc3MgaW4gdGhlIGNvdXJzZS48L3U+CgpTdHVkZW50cyB3aG8gbWlzcyA8dT5tb3JlIHRoYW4gMiBsZWN0dXJlczwvdT4gZHVlIHRvIHBhcnRpY2lwYXRpb24gaW4gVW5pdmVyc2l0eSBhY3Rpdml0aWVzIG11c3QgZ2l2ZSB0aGUgaW5zdHJ1Y3RvciBhIHN0YXRlbWVudCA8dT5iZWZvcmUgdGhlIGFic2VuY2U8L3U+IHNpZ25lZCBieSBhIHJlc3BvbnNpYmxlIG9mZmljaWFsIHRoYXQgc3BlY2lmaWVzIHRoZSBkYXRlcyBhbmQgdGltZXMgdGhlIHN0dWRlbnQgd2lsbCBtaXNzIGNsYXNzLgpBdXRob3JpemVkIGFjdGl2aXRpZXMgaW5jbHVkZSBwYXJ0aWNpcGF0aW9uIGluIGF0aGxldGljIHRlYW1zLCB0aGUgbWFyY2hpbmcgYmFuZCBvciBwZXAgYmFuZCwgZGViYXRlIHRlYW1zLCBhbmQgb3RoZXIgcmVjb2duaXplZCBVbml2ZXJzaXR5IGdyb3VwcywgYXMgd2VsbCBhcyBwYXJ0aWNpcGF0aW9uIGluIFVuaXZlcnNpdHkgZmllbGQgdHJpcHMsIHNlcnZpY2Ugd2l0aCB0aGUgTmF0aW9uYWwgR3VhcmQsIGFuZCBqdXJ5IGR1dHkuCkFic2VuY2VzIGR1ZSB0byBpbGxuZXNzZXMgb3IgZW1lcmdlbmNpZXMgKHRoYXQgZ28gb3ZlciAyIGxlY3R1cmVzKSBtdXN0IGJlIGRvY3VtZW50ZWQgd2l0aCB0aGUgVW5pdmVyc2l0eSBvZiBJb3dhIFtBYnNlbmNlIEV4cGxhbmF0aW9uIEZvcm1dKGh0dHBzOi8vY2xhcy51aW93YS5lZHUvZmFjdWx0eS9zdHVkZW50LWF0dGVuZGFuY2UtYW5kLWFic2VuY2VzKSBhbmQgc2VudCB0byBQcm9mZXNzb3IgUGV0ZXJzZW4gd2l0aGluIDQ4IGhvdXJzIG9mIHRoZSBhYnNlbmNlLgpQZXIgdW5pdmVyc2l0eSBwb2xpY3ksIGlmIGEgc3R1ZGVudCB3aWxsIGJlIGFic2VudCA8dT41IG9yIG1vcmUgY29uc2VjdXRpdmUgZGF5cyBhbmQgdGhlIGFic2VuY2UgaXMgZHVlIHRvIGlsbG5lc3Mgb3Igb3RoZXIgZW1lcmdlbmN5PC91PiwgcGxlYXNlIGNvbnRhY3QgdGhlIFJlZ2lzdHJhciBTZXJ2aWNlIENlbnRlciBhdCAoMzE5KSAzODQtNDMwMCBvciByZWdpc3RyYXJAdWlvd2EuZWR1LgoKIyMgQmxvZyBBcnRpY2xlcyAoV3JpdGluZyBBc3NpZ25tZW50cykgeyNibG9nQXJ0aWNsZXN9CgpBcyBwYXJ0IG9mIHRoZSBjbGFzcywgeW91IHdpbGwgcG9zdCBibG9nIGFydGljbGVzIChzZWUgdGhlIFtjb3Vyc2Ugc2NoZWR1bGVdKCNvdXRsaW5lKSBmb3IgZGVhZGxpbmVzKS4KPHU+VGhlIGJsb2cgYXJ0aWNsZXMgYXJlIHB1YmxpYzwvdT47IDx1PmRvIG5vdCB0YWtlIHRoaXMgY291cnNlIGlmIHlvdSBkbyBub3QgZmVlbCBjb21mb3J0YWJsZSBwb3N0aW5nIGJsb2cgYXJ0aWNsZXMgd2l0aCB5b3VyIGZ1bGwgbmFtZSBpbiBhIHB1YmxpYyBmb3J1bTwvdT4uClRoZSBibG9nIGFydGljbGVzIGFyZSBpbnRlbmRlZCB0byBnaXZlIHlvdSBwcmFjdGljZSBpbnRlZ3JhdGluZyBza2lsbHMgdG8gYWR2YW5jZSB0aGUgW2xlYXJuaW5nIG9iamVjdGl2ZXNdKCNvYmplY3RpdmVzKSBvZiBhKSB0aGlua2luZyBjcml0aWNhbGx5IGFuZCBlbXBpcmljYWxseSBhYm91dCBodW1hbiBiZWhhdmlvciBhbmQgcGVyZm9ybWFuY2UsIGIpIG1ha2luZyBzZW5zZSBvZiBiaWcgZGF0YSwgYykgdXNpbmcsIGV2YWx1YXRpbmcsIGFuZCBpbnRlcnByZXRpbmcgc3RhdGlzdGljYWwgYW5hbHlzZXMsIGFuZCBkKSBjb21tdW5pY2F0aW5nIGRhdGEtZHJpdmVuIGluc2lnaHRzLgpUaGVyZSB3aWxsIGJlIGEgcGVuYWx0eSBvZiAyMCUgZm9yIGFsbCBibG9nIGFydGljbGVzIHR1cm5lZCBpbiBsYXRlLgpZb3VyIHR3byBsb3dlc3Qgc2NvcmVzIHdpbGwgYmUgZHJvcHBlZCAoZXhjbHVkaW5nIHRoZSBsYXN0IGJsb2cgYXJ0aWNsZSwgd2hpY2ggaW52b2x2ZXMgaW4gdGhlIGludGVncmF0aW9uIG9mIGF0IGxlYXN0IHR3byBhbmFseXNpcyBhcHByb2FjaGVzIHRoYXQgd2VyZSBjb3ZlcmVkIGluIGNsYXNzKS4KQSBibG9nIGFydGljbGUgaXMgbm90IGNvbnNpZGVyZWQgInN1Ym1pdHRlZCIgdW50aWwgeW91IChhKSBwb3N0IHRoZSBibG9nIGFydGljbGUgc28gdGhhdCBpdCBpcyBsaXZlIGFuZCBwdWJsaWNseSBhdmFpbGFibGUsIEFORCAoYikgc3VibWl0IHRoZSBhc3NpZ25tZW50IG9uIFtJQ09OXShodHRwczovL2ljb24udWlvd2EuZWR1KSB3aXRoIGEgUERGIG9mIHRoZSBhcnRpY2xlIGFuZCBhIFVSTCBsaW5rIHRvIHlvdXIgYmxvZyBhcnRpY2xlLgpBbGwgYmxvZyBhcnRpY2xlcyBzaG91bGQgYmUgc3VibWl0dGVkIHRvIFtJQ09OXShodHRwczovL2ljb24udWlvd2EuZWR1KSBieSAxMTo1OSBwLm0uIG9uIHRoZSBkdWUgZGF0ZS4KCllvdSBhcmUgZW5jb3VyYWdlZCB0byBzdWJtaXQgeW91ciBibG9nIGFydGljbGUgPHU+d2VsbCBiZWZvcmU8L3U+IHRoZSBkZWFkbGluZS4KPHU+WW91IGNhbiBleHBlY3QgdG8gcnVuIGludG8gdGVjaG5pY2FsIGlzc3VlczwvdT4gKGUuZy4sIGVycm9ycyB3aGVuIHJ1bm5pbmcgeW91ciBjb2RlLCBpc3N1ZXMgZ2V0dGluZyB0aGUgYmxvZyBwb3N0IHRvIGNvbXBpbGUsIGV0Yy4pLgpUaHVzLCB5b3Ugc2hvdWxkIGdpdmUgeW91cnNlbGYgcGxlbnR5IG9mIHRpbWUgdG8gW3Ryb3VibGVzaG9vdF0oI3Ryb3VibGVzaG9vdGluZykgKHNlZSBiZWxvdykgc28gdGhhdCB5b3UgY2FuIHN1Ym1pdCB5b3VyIGJsb2cgYXJ0aWNsZSBvbiB0aW1lLgoKIyMjIFRyb3VibGVzaG9vdGluZyB7I3Ryb3VibGVzaG9vdGluZ30KClNvbWV0aW1lcyBjb2RlIHlvdSB3cml0ZSBkb2VzIG5vdCB3b3JrLgpUaGF0IGlzIG9rYXk7IGl0IGhhcHBlbnMgdG8gZXZlcnlvbmUuCkxlYXJuaW5nIGhvdyB0byB0cm91Ymxlc2hvb3QgY29kZSBpcyBhbiBpbXBvcnRhbnQgcGFydCBvZiBwcm9ncmFtbWluZy4KSWYgeW91IHJ1biBpbnRvIGlzc3VlcyByZWxhdGVkIHRvIGBSYCwgYEdpdEh1YmAsIGBHaXRIdWIgUGFnZXNgLCBvciB5b3VyIGNvZGUsIGhlcmUgYXJlIGEgZmV3IHBvaW50ZXJzIG9uIGhvdyB0byBnZXQgdGhpbmdzIHdvcmtpbmcgKGFzIGFkYXB0ZWQgZnJvbSBMdWtlIFRpZXJuZXkpOgoKLSBJZiB5b3UgcmVjZWl2ZSBhbiBlcnJvciBtZXNzYWdlLCByZWFkIHdoYXQgdGhlIG1lc3NhZ2Ugc2F5cy4KU29tZXRpbWVzIHJlYWRpbmcgdGhlIGVycm9yIG1lc3NhZ2UgaXMgYWxsIGl0IHRha2VzIHRvIGZpZ3VyZSBvdXQgd2hhdCB0aGUgaXNzdWUgaXMgYW5kIGhvdyB0byBmaXggaXQuCi0gUmVhZCB0aGUgd2hvbGUgZXJyb3IgbWVzc2FnZTogc29tZXRpbWVzIHRoZSBtb3N0IGltcG9ydGFudCBwYXJ0IGlzIGF0IHRoZSBiZWdpbm5pbmcuCi0gSWYgdGhlIG1lc3NhZ2UgZG9lcyBub3QgbWFrZSBzZW5zZSB0byB5b3UsIHBlcmZvcm0gYSBHb29nbGUgc2VhcmNoIGZvciB0aGUgZXJyb3IvaXNzdWU6IG9mdGVuIHNvbWVvbmUgZWxzZSBoYXMgYXNrZWQgYWJvdXQgdGhlIHNhbWUgaXNzdWUgYW5kIHJlY2VpdmVkIGEgdXNlZnVsIGFuc3dlci4KLSBTaW1wbGlmeSB5b3VyIGNvZGUuCiAgICAtIExvb2sgY2FyZWZ1bGx5IGF0IGludGVybWVkaWF0ZSByZXN1bHRzLgogICAgLSBSZXBsYWNlIGNvbXBsaWNhdGVkIGRhdGEgd2l0aCBzb21ldGhpbmcgc21hbGxlciBhbmQgc2ltcGxlci4KICAgIC0gSW4gdGhlIHByb2Nlc3MsIHlvdSBtYXkgZmluZCB5b3VyIG1pc3Rha2UuCi0gRmluZGluZyB5b3VyIGJ1ZyB1c3VhbGx5IGludm9sdmVzIGRvdWJsZSBjaGVja2luZyBhbGwgdGhlIHRoaW5ncyB5b3UgYXJlIHN1cmUgeW91IGRpZCByaWdodCB1bnRpbCB5b3UgZmluZCB0aGUgb25lIHlvdSBkaWQgbm90LgoKSWYgeW91IGFyZSB1bmFibGUgdG8gcmVzb2x2ZSB0aGluZ3Mgb24geW91ciBvd24sIHlvdSBtYXkgbmVlZCB0byBhc2sgZm9yIGhlbHAsIGluIHdoaWNoIGNhc2UgSSBlbmNvdXJhZ2UgeW91IHRvIHRyeSBvbmUgKG9yIG1vcmUpIG9mIHRoZSBmb2xsb3dpbmc6CgotIFBlcmZvcm0gYSBHb29nbGUgc2VhcmNoIGZvciB0aGUgZXJyb3IvaXNzdWUKLSBDaGVjayB0aGUgW1Ryb3VibGVzaG9vdGluZyBzZWN0aW9uXShodHRwczovL2lzYWFjdHBldGVyc2VuLmdpdGh1Yi5pby9RdWFydG9CbG9nRmFudGFzeUZvb3RiYWxsL3Bvc3RzL3F1YXJ0by1pbnN0cnVjdGlvbnMvI3NlYy10cm91Ymxlc2hvb3RpbmcpIG9mIHRoZSBjb3Vyc2UncyBRdWFydG8gSW5zdHJ1Y3Rpb25zCi0gQXNrIGEgcGVlcgotIFBvc3Qgb24gW2ZvcnVtcyBkZWRpY2F0ZWQgdG8gYFJgXShodHRwczovL2lzYWFjdHBldGVyc2VuLmdpdGh1Yi5pby9GYW50YXN5LUZvb3RiYWxsLUFuYWx5dGljcy1UZXh0Ym9vay9nZXR0aW5nLXN0YXJ0ZWQuaHRtbCNzZWMtZ2V0dGluZ0hlbHBSKQotIEFzayBBSSAoYXMgbG9uZyBhcyB5b3UgZm9sbG93IHRoZSBbQUkgcG9saWN5XSgjYWkpKQotIENvbWUgdG8gb2ZmaWNlIGhvdXJzCgpJIGFtIHF1aXRlIGJ1c3ksIGFuZCBJIGFwcHJlY2lhdGUgeW91ciBtYWtpbmcgZXZlcnkgZWZmb3J0IHRvIHNvbHZlIHRoZSBpc3N1ZSBvbiB5b3VyIG93biBvciB1c2luZyBvbmUgb2YgdGhlIGFmb3JlbWVudGlvbmVkIHdheXMgYmVmb3JlIGVtYWlsaW5nIG1lLgpJIGRvIG5vdCBvZnRlbiByZXNwb25kIHRvIGVtYWlscyBkdXJpbmcgZXZlbmluZ3Mgb3Igd2Vla2VuZHMsIGFuZCBJIGNhbm5vdCBiZSBleHBlY3RlZCB0byBzb2x2ZSBsYXN0LW1pbnV0ZSBpc3N1ZXMgdGhhdCB5b3UgY291bGQgaGF2ZSBzb2x2ZWQgZWFybGllci4KCiMjIFJlYWRpbmdzICYgUXVpenplcyB7I3JlYWRpbmdRdWl6emVzfQoKUmVhZGluZ3MgYW5kIG90aGVyIG1hdGVyaWFscyAoZS5nLiwgdmlkZW9zKSB3aWxsIGJlIHBvc3RlZCBvbiBbSUNPTl0oaHR0cHM6Ly9pY29uLnVpb3dhLmVkdSkuCllvdSBhcmUgZXhwZWN0ZWQgdG8gZG8gdGhlIHJlYWRpbmdzIChhbmQgd2F0Y2ggYW55IHJlcXVpcmVkIHZpZGVvcykgYmVmb3JlIGNsYXNzLgpZb3Ugd2lsbCBoYXZlIGFuIG9ubGluZSBxdWl6IG9uIHRoZSByZWFkaW5ncy9tYXRlcmlhbHMgdG8gY29tcGxldGUgaW4gW0lDT05dKGh0dHBzOi8vaWNvbi51aW93YS5lZHUpLCBvbiB5b3VyIG93biwgPHU+YmVmb3JlPC91PiBlYWNoIGxlY3R1cmUuClRoZSBxdWl6emVzIGFyZSBtZWFudCB0byBoZWxwIHlvdSBjb21lIHRvIGNsYXNzIHByZXBhcmVkIHRvIGNvbnRyaWJ1dGUgc28geW91IGFyZSBiZXN0LXBvc2l0aW9uZWQgdG8gbGVhcm4gYW5kIHRvIGhlbHAgb3RoZXJzIGxlYXJuLgpUaGUgcXVpenplcyBhcmUgbm90IHRpbWVkICh5b3UgY2FuIHNwZW5kIGFzIG11Y2ggdGltZSBhcyB5b3UgbmVlZCBvbiBlYWNoIHF1aXogdXAgdW50aWwgdGhlIGRlYWRsaW5lKS4KVGhlIGRlYWRsaW5lIGZvciBlYWNoIHF1aXogaXMgMzAgbWludXRlcyBiZWZvcmUgY2xhc3Mgc3RhcnRzLgpMYXRlIHJlc3BvbnNlcyBhbmQgbXVsdGlwbGUgc3VibWlzc2lvbnMgd2lsbCBub3QgYmUgYWNjZXB0ZWQuCllvdXIgbG93ZXN0IHF1aXogc2NvcmUgd2lsbCBiZSBkcm9wcGVkLgpXZSB3aWxsIG5vdCBhY2NlcHQgZXhjdXNlZCBhYnNlbmNlcyBmb3IgcXVpenplcyBiZWNhdXNlIChhKSB5b3UgaGF2ZSBhIHdlZWsgdG8gY29tcGxldGUgdGhlIHF1aXogKGFuZCBjYW4gc3VibWl0IGl0IGF0IGFueSBwb2ludCBkdXJpbmcgdGhhdCB3ZWVrKSwgYW5kIChiKSB3ZSBkcm9wIHlvdXIgbG93ZXN0IHF1aXogc2NvcmUuCkVhY2ggcXVpeiB3aWxsIGJlIHdlaWdodGVkIHRoZSBzYW1lIGluIHRoZSBmaW5hbCBncmFkZS4KUXVpeiBhbnN3ZXJzIHdpbGwgYmUgdmlld2FibGUgYWZ0ZXIgY2xhc3MuCgpQYXN0IGV4cGVyaWVuY2UgaGFzIHNob3duIHRoYXQgaW4gb3JkZXIgdG8gZG8gd2VsbCBpbiB0aGlzIGNsYXNzLCB5b3Ugc2hvdWxkIHJlYWQgdGhlIHJlcXVpcmVkIG1hdGVyaWFsLCBwYXJ0aWNpcGF0ZSBhY3RpdmVseSBpbiBjbGFzcywgYW5kIGdvIG92ZXIgeW91ciBub3RlcyA8dT5lYWNoIHdlZWs8L3U+LgpUaGVyZSBpcyB0b28gbXVjaCBtYXRlcmlhbCBiZWluZyBjb3ZlcmVkIGluIHRoaXMgY2xhc3MgdG8gdHJ5IHRvIHN0dWR5IG9ubHkgYnkgZnJhbnRpYyBwcmVwYXJhdGlvbiBpbW1lZGlhdGVseSBiZWZvcmUgZXhhbXMuCk5vdGUgdGhhdCBsZWN0dXJlIHdpbGwgPHU+bm90PC91PiBjb3ZlciBhbGwgcmVsZXZhbnQgbWF0ZXJpYWwgZm9yIHRoZSBjb3Vyc2U7IHlvdSB3aWxsIGJlIGV4cGVjdGVkIHRvIGtub3cgdGhlIDx1PnJlcXVpcmVkPC91PiByZWFkaW5ncyBmb3IgZXhhbXMuCgojIyBXb3JrbG9hZCB7I3dvcmtsb2FkfQoKVGhpcyBpcyBhIDMgc2VtZXN0ZXIgaG91ciBjb3Vyc2UuClN0dWRlbnRzIHNob3VsZCB0aGVyZWZvcmUgZXhwZWN0IHRvIHNwZW5kIFs2IGFkZGl0aW9uYWwgaG91cnMgcGVyIHdlZWtdKGh0dHBzOi8vY2xhcy51aW93YS5lZHUvZmFjdWx0eS9zdHVkZW50LXdvcmtsb2FkLWd1aWRlbGluZXMpIChvdXRzaWRlIG9mIGNsYXNzKSByZWFkaW5nIHRoZSBhcnRpY2xlcywgcmV2aWV3aW5nIG1hdGVyaWFsIGZyb20gbGVjdHVyZSwgYW5kIHByZXBhcmluZyBmb3IgcXVpenplcyBhbmQgZXhhbXMuCgojIyBFeGFtaW5hdGlvbnMgeyNleGFtc30KClRoZXJlIHdpbGwgYmUgMiBleGFtczsgb25lIG1pZC10ZXJtIGV4YW0gYW5kIG9uZSBub24tY3VtdWxhdGl2ZSBmaW5hbCBleGFtLgpFeGFtIDEgd2lsbCBiZSBhZG1pbmlzdGVyZWQgZHVyaW5nIGNsYXNzIHRpbWUuClRoZSBkYXRlLCB0aW1lLCBhbmQgbG9jYXRpb24gb2YgdGhlIGZpbmFsIGV4YW0gd2lsbCBiZSBhbm5vdW5jZWQgYnkgdGhlIDV0aCB3ZWVrIG9mIGNsYXNzIGJ5IHRoZSBDb2xsZWdlIG9mIExpYmVyYWwgQXJ0cyBhbmQgU2NpZW5jZXM7IHRoZSBkdXJhdGlvbiBvZiB0aGUgZmluYWwgZXhhbSB3aWxsIGJlIDEyMCBtaW51dGVzLgpFYWNoIGV4YW0gd2lsbCBlbXBoYXNpemUgaW5mb3JtYXRpb24gcHJlc2VudGVkIGZvciB0aGUgaGFsZiBvZiB0aGUgY2xhc3MgdGhhdCBwcmVjZWRlcyBpdC4KSG93ZXZlciwgc29tZSBpbnRlZ3JhdGlvbiBvZiBpbmZvcm1hdGlvbiBhY3Jvc3Mgc2VjdGlvbnMgd2lsbCBiZSByZXF1aXJlZCBmb3IgcXVlc3Rpb25zIG9uIHRoZSBzZWNvbmQgZXhhbS4KVGhlIGV4YW1zIHdpbGwgaW5jbHVkZSBtdWx0aXBsZS1jaG9pY2UgcXVlc3Rpb25zLgpFeGFtIHF1ZXN0aW9ucyBjYW4gY29tZSBmcm9tIDx1PmFueSBvZiB0aGUgZm9sbG93aW5nIHNvdXJjZXM6IGxlY3R1cmVzIG9yIHJlcXVpcmVkIHJlYWRpbmdzPC91Pi4KRm9yIHN1Z2dlc3RlZCBzdHVkeSB0aXBzIGZvciB0aGlzIGNsYXNzLCBtZWV0IHdpdGggUHJvZmVzc29yIFBldGVyc2VuIGR1cmluZyBvZmZpY2UgaG91cnMuCgojIyMgTWlzc2luZyBFeGFtcyB7I21pc3NpbmdFeGFtc30KCltVbml2ZXJzaXR5IHJlZ3VsYXRpb25zIHJlcXVpcmUgdGhhdCBzdHVkZW50cyBiZSBhbGxvd2VkIHRvIG1ha2UgdXAgZXhhbWluYXRpb25zXShodHRwczovL29wc21hbnVhbC51aW93YS5lZHUvc3R1ZGVudHMvYWJzZW5jZXMtY2xhc3MpIHRoYXQgaGF2ZSBiZWVuIG1pc3NlZCBkdWUgdG8gaWxsbmVzcywgcmVsaWdpb3VzIGhvbHkgZGF5cywgbWlsaXRhcnkgc2VydmljZSBvYmxpZ2F0aW9ucyAoaW5jbHVkaW5nIHNlcnZpY2UtcmVsYXRlZCBtZWRpY2FsIGFwcG9pbnRtZW50cyksIG9yIG90aGVyIHVuYXZvaWRhYmxlIGNpcmN1bXN0YW5jZXMgb3IgVW5pdmVyc2l0eS1zcG9uc29yZWQgYWN0aXZpdGllcy4KU3R1ZGVudHMgd2l0aCBVSS1hdXRob3JpemVkIGFjdGl2aXRpZXMgbXVzdCBkaXNjdXNzIHRoZWlyIGFic2VuY2VzIHdpdGggdGhlIGluc3RydWN0b3IgYXMgc29vbiBhcyBwb3NzaWJsZS4KUmVsaWdpb3VzIG9ibGlnYXRpb25zIG11c3QgYmUgY29tbXVuaWNhdGVkIHdpdGhpbiB0aGUgZmlyc3QgdGhyZWUgd2Vla3Mgb2YgY2xhc3Nlcy4KU2VlIGJlbG93IGZvciB0aGUgZG9jdW1lbnRhdGlvbiBuZWNlc3NhcnkgZm9yIGFuIGFic2VuY2UgdG8gYmUgZXhjdXNlZCBhbmQgdG8gYmUgZWxpZ2libGUgdG8gdGFrZSBhIG1ha2UtdXAgZXhhbS4KClN0dWRlbnRzIGFyZSBhbGxvd2VkIHRvIG1ha2UgdXAgZXhhbXMgdGhhdCBoYXZlIGJlZW4gbWlzc2VkIGR1ZSB0byBpbGxuZXNzLCBtYW5kYXRvcnkgcmVsaWdpb3VzIG9ic2VydmF0aW9ucywgb2ZmaWNpYWwgVW5pdmVyc2l0eSBhY3Rpdml0aWVzLCBvciBvdGhlciB1bmF2b2lkYWJsZSBjaXJjdW1zdGFuY2VzLgpOb3RlOiB0aGUgZm9ybWF0IG9mIHRoZSBtYWtlLXVwIGV4YW0gbWF5IGRpZmZlciBmcm9tIHRoZSBvcmlnaW5hbCBleGFtLgpJZiB5b3Uga25vdyB0aGF0IHlvdSBtdXN0IGJlIGF3YXkgYXQgdGhlIHRpbWUgb2YgYW4gZXhhbSBmb3Igb25lIG9mIHRoZXNlIHJlYXNvbnMsIFByb2Zlc3NvciBQZXRlcnNlbiBtdXN0IGJlIGNvbnRhY3RlZCBpbiBhZHZhbmNlIHdoZW5ldmVyIHBvc3NpYmxlIHRvIHNjaGVkdWxlIGEgbWFrZS11cCBleGFtLgpJbiBvcmRlciB0byB0YWtlIGEgbWFrZS11cCBleGFtLCB5b3UgbXVzdCBwcm92aWRlIGFjY2VwdGFibGUgZG9jdW1lbnRhdGlvbiB0byBiZSBlbGlnaWJsZSB0byB0YWtlIGl0OiBpbmNsdWRpbmcgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHJlcG9ydCBvZiBpbGxuZXNzOyBhbnkgb3RoZXIgY2lyY3Vtc3RhbmNlcyBtdXN0IGJlIGRvY3VtZW50ZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgSW93YSBbQWJzZW5jZSBFeHBsYW5hdGlvbiBGb3JtXShodHRwczovL2NsYXMudWlvd2EuZWR1L3NpdGVzL2NsYXMudWlvd2EuZWR1L2ZpbGVzLzIwMjQtMDUvQUJTRU5DRSUyMEVYUExBTkFUSU9OJTIwRk9STS5wZGYpIChsb2NhdGVkIGluIElDT04gdW5kZXIgIlN0dWRlbnQgVG9vbHMiKSBhbmQgbXVzdCBiZSBhcHByb3ZlZCBieSBQcm9mZXNzb3IgUGV0ZXJzZW4uCjx1PkluIHN1bSwgdG8gYmUgZWxpZ2libGUgZm9yIGEgbWFrZS11cCBleGFtLCBQcm9mZXNzb3IgUGV0ZXJzZW4gbXVzdCBiZSBjb250YWN0ZWQgYmVmb3JlIHRoZSBleGFtaW5hdGlvbiB3aGVuZXZlciBwb3NzaWJsZSwgYW5kIHlvdSBtdXN0IHNlbmQgYWNjZXB0YWJsZSBmb3JtIG9mIGRvY3VtZW50YXRpb24gdG8gUHJvZmVzc29yIFBldGVyc2VuPC91Pi4KCiMjIENsYXNzIEZhbnRhc3kgRm9vdGJhbGwgTGVhZ3VlIHsjZmFudGFzeUZvb3RiYWxsTGVhZ3VlfQoKQXMgcGFydCBvZiB0aGUgY2xhc3MsIHdlIHdpbGwgaGF2ZSBhIGZhbnRhc3kgZm9vdGJhbGwgbGVhZ3VlLgpUaGUgbGVhZ3VlIHdpbGwgYmUgY29tcG9zZWQgb2YgMTAgdGVhbXMsIHdpdGggYXBwcm94aW1hdGVseSAyIHN0dWRlbnRzIHBlciB0ZWFtLgpUaGF0IGlzLCB5b3Ugd2lsbCAobGlrZWx5KSBiZSBwYWlyZWQgd2l0aCBhbm90aGVyIHN0dWRlbnQgaW4gdGhlIGNsYXNzIHRvIGNvLW1hbmFnZSBhIHRlYW0uClRoZSBsZWFndWUgd2lsbCBiZSBob3N0ZWQgb24gW05GTC5jb21dKGh0dHBzOi8vZmFudGFzeS5uZmwuY29tKSBhbmQgd2lsbCBmb2xsb3cgW2RlZmF1bHQgTkZMLmNvbSBzY29yaW5nIHNldHRpbmdzXShodHRwczovL3N1cHBvcnQubmZsLmNvbS9oYy9lbi11cy9hcnRpY2xlcy80OTg5MTc5MjM3NDA0LVNjb3JpbmcpLgpUaGUgbGVhZ3VlIHdpbGwgYmUgYSBoZWFkLXRvLWhlYWQgbGVhZ3VlLCBtZWFuaW5nIHRoYXQgZWFjaCB3ZWVrLCB5b3VyIHRlYW0gd2lsbCBmYWNlIG9uZSBvdGhlciB0ZWFtLCBhbmQgd2hpY2hldmVyIHRlYW0gc2NvcmVzIG1vcmUgcG9pbnRzIHdpbnMgdGhhdCB3ZWVrLgpUaGVyZSBhcmUgbm8gY291cnNlLXJlbGF0ZWQgcG9pbnRzIGJhc2VkIG9uIHlvdXIgdGVhbSdzIHBlcmZvcm1hbmNlIChpLmUuLCB5b3Ugd2lsbCBOT1QgYmUgcHVuaXNoZWQgZm9yIGhhdmluZyBhIGJhZCB0ZWFtKTsgaG93ZXZlciwgdGhlcmUgaXMgYW4gW2V4dHJhIGNyZWRpdCBvcHBvcnR1bml0eV0oI2V4dHJhQ3JlZGl0KSBmb3Igd2lubmluZyB0aGUgbGVhZ3VlLgoKVGhlIGRyYWZ0IHdpbGwgYmUgaGVsZCBkdXJpbmcgY2xhc3MgdGltZS4KVGhlIGRyYWZ0IHdpbGwgYmUgYSAic25ha2UiIGRyYWZ0LCBtZWFuaW5nIHRoYXQgdGhlIG9yZGVyIG9mIHBpY2tzIHdpbGwgcmV2ZXJzZSBlYWNoIHJvdW5kLgpUaGUgZHJhZnQgb3JkZXIgd2lsbCBiZSByYW5kb21seSBkZXRlcm1pbmVkLgoKSW4gY29uanVuY3Rpb24gd2l0aCB5b3VyIGNvLW1hbmFnZXIsIHlvdSB3aWxsIG1ha2UgZGVjaXNpb25zIHJlZ2FyZGluZyB5b3VyIHRlYW0ncyBuYW1lLCBkcmFmdCBwaWNrcywgd2FpdmVyIHdpcmUgcGlja3Vwcy9kcm9wcywgdHJhZGVzLCBhbmQgc3RhcnRpbmcgbGluZXVwcy4KUmVnYXJkbGVzcyBvZiB5b3VyIGV4cGVydGlzZSBvciBleHBlcmllbmNlIHdpdGggZmFudGFzeSBmb290YmFsbCwgeW91IGFuZCB5b3VyIGNvLW1hbmFnZXIgYXJlIGVhY2ggNTAlIGNvLW93bmVycyBvZiB0aGUgdGVhbS4KVGhhdCBpcywgPHU+eW91IGFyZSBleHBlY3RlZCB0byBtYWtlIGFsbCB0ZWFtLXJlbGF0ZWQgZGVjaXNpb25zIHdpdGggeW91ciBjby1tYW5hZ2VyIGNvbGxhYm9yYXRpdmVseTwvdT4sIG5vdCB1bmlsYXRlcmFsbHkuCgpBcyB0aGUgY29tbWlzc2lvbmVyIG9mIHRoZSBsZWFndWUsIEkgcmVzZXJ2ZSB0aGUgcmlnaHQgdG8gYmxvY2sgYW55IHRyYWRlcyB0aGF0IHRoYXQgd291bGQgY29tcHJvbWlzZSB0aGUgaW50ZWdyaXR5IG9mIHRoZSBsZWFndWUuClRyYWRlcyB3aWxsIGJlIGFsbG93ZWQgYXMgbG9uZyBhcyBlYWNoIHRlYW0gaXMgYWN0aW5nIGluIHRoZWlyIHRlYW0ncyBiZXN0IGludGVyZXN0czsgdGhhdCBpcywgImxvcHNpZGVkIiB0cmFkZXMgd2lsbCBiZSBhbGxvd2VkIGFzIGxvbmcgYXMgYm90aCB0ZWFtcyBhcmUgYWN0aW5nIGluIGdvb2QgZmFpdGggdG8gaW1wcm92ZSB0aGVpciBvd24gdGVhbS4KVHJhZGVzIHdpbGwgbm90IGJlIGFsbG93ZWQgaWYgdGhleSBpbnZvbHZlIGNvbGx1c2lvbiwgdGhhdCBpcywgY29sbGFib3JhdGlvbiB0byBjaGVhdCBvciBkZWNlaXZlIG90aGVycy4KRXhhbXBsZXMgb2YgY29sbHVzaW9uIGluY2x1ZGU6CgotIHRyYWRpbmcgcGxheWVycyBmb3IgdGhlIHB1cnBvc2Ugb2YgaW1wcm92aW5nIHRoZSBvdGhlciB0ZWFtJ3Mgc3RhbmRpbmcgaW4gdGhlIGxlYWd1ZSAoYW5kIG5vdCB5b3VyIG93bikKLSB0cmFkaW5nIHBsYXllcnMgd2hvIGFyZSBub3Qgb24gYnllIHdlZWssIGp1c3Qgc28gYW4gb3Bwb25lbnQgY2FuIHNwZWNpZmljYWxseSBiZWF0IGFub3RoZXIgb3Bwb25lbnQgYW5kIHRoZW4gdHJhZGluZyB0aG9zZSBwbGF5ZXJzIGJhY2sgaW1tZWRpYXRlbHkKLSB0cmFkZXMgdGhhdCBpbnZvbHZlIG91dHNpZGUtb2YtdGhlLWdhbWUgZXhjaGFuZ2Ugb2YgZ29vZHMgb3Igc2VydmljZXMKLSB0cmFkZXMgdGhhdCBpbnZvbHZlIGEgaGFuZHNoYWtlIGFncmVlbWVudCBvZiBpbi1nYW1lIGdvb2RzIG9yIHNlcnZpY2VzCi0gdHJhZGVzIHRoYXQgY2Fubm90IGJlIGNvbXBsZXRlZCBpbiBvbmUgdHJhZGUKCiMgR3JhZGluZyB7I2dyYWRpbmd9CgpGaW5hbCBncmFkZXMgd2lsbCBiZSBhc3NpZ25lZCBhdCB0aGUgZW5kIG9mIHNlbWVzdGVyIG9uIHRoZSBiYXNpcyBvZiB5b3VyIHRvdGFsIHBlcmNlbnRhZ2Ugb2YgcG9pbnRzIGVhcm5lZCBvbiBleGFtcywgcXVpenplcywgYXR0ZW5kYW5jZSwgYW5kIHdyaXRpbmcgYXNzaWdubWVudHMsIGFzIGRldGFpbGVkIGJlbG93LgpHcmFkZXMgd2lsbCBiZSBhc3NpZ25lZCBvbiBhbiBhYnNvbHV0ZSBzY2FsZSAoY3JpdGVyaW9uLXJlZmVyZW5jZWQgZ3JhZGluZyk7IGNvdXJzZSBncmFkZXMgd2lsbCBub3QgYmUgY3VydmVkLgpQbGVhc2Ugbm90ZTogQXMgYSBtYXR0ZXIgb2YgZmFpcm5lc3MgdG8gYWxsIHN0dWRlbnRzLCBJIGFzc2lnbiBncmFkZXMgYmFzZWQgb24gcGVyZm9ybWFuY2UgYW5kIGRvIG5vdCBuZWdvdGlhdGUgZ3JhZGVzLgpGaW5hbCBncmFkZXMgd2lsbCBiZSBhc3NpZ25lZCBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIHJhbmdlczoKCnwgR3JhZGUgfCBQZXJjZW50IHwKfDotLS0tLS18Oi0tLS0tLS0tfAp8IEErICAgIHwgOTfigJMxMDAlIHwgCnwgQSAgICAgfCA5M+KAkzk2ICAgfAp8IEHiiJIgICAgfCA5MOKAkzkyICAgfAp8IEIrICAgIHwgODfigJM4OSAgIHwKfCBCICAgICB8IDgz4oCTODYgICB8CnwgQuKIkiAgICB8IDgw4oCTODIgICB8CnwgQysgICAgfCA3NeKAkzc5ICAgfAp8IEMgICAgIHwgNzDigJM3NCAgIHwKfCBD4oiSICAgIHwgNjXigJM2OSAgIHwKfCBEKyAgICB8IDYw4oCTNjQgICB8CnwgRCAgICAgfCA1NeKAkzU5ICAgfAp8IETiiJIgICAgfCA1MOKAkzU0ICAgfAp8IEYgICAgIHwgPCA1MCUgICB8CgpJIHJvdW5kIHVwIGZyb20gLjUgd2hlbiBkZXRlcm1pbmluZyBmaW5hbCBncmFkZXMuCkZvciBleGFtcGxlLCBhIGNvdXJzZSBwZXJjZW50IG9mIDc5LjUwIHdvdWxkIHJlY2VpdmUgYSBC4oiSLCB3aGVyZWFzIGEgY291cnNlIHBlcmNlbnQgb2YgNzkuNDkgd291bGQgcmVjZWl2ZSBhIEMrLgoKIyBDb3Vyc2UgR3JhZGVzIHsjY291cnNlR3JhZGVzfQoKRmluYWwgY291cnNlIGdyYWRlcyB3aWxsIGJlIGFzc2Vzc2VkIGJhc2VkIG9uIHlvdXIgcGVyZm9ybWFuY2UgaW4gdGhlIGFjdGl2aXRpZXMgYmVsb3cuClRoZSByZWxhdGl2ZSBjb250cmlidXRpb24gb2YgZWFjaCBjb21wb25lbnQgdG8geW91ciBmaW5hbCBncmFkZSBpcyBhcyBmb2xsb3dzOgoKIC0gMjUlCUV4YW1pbmF0aW9uICMxCiAtIDI1JQlFeGFtaW5hdGlvbiAjMiAoYWRtaW5pc3RlcmVkIG9ubHkgZHVyaW5nIHRoZSBjbGFzcydzIEZpbmFsIEV4YW0gdGltZSBzbG90KQogLSAxMCUgCUF0dGVuZGFuY2UvUGFydGljaXBhdGlvbgogLSAxMCUgCVJlYWRpbmcgUXVpenplcwogLSAzMCUgIFdyaXRpbmcgQXNzaWdubWVudHMKCiMjIEV4dHJhIENyZWRpdCB7I2V4dHJhQ3JlZGl0fQoKSGVyZSBhcmUgdGhlIGV4dHJhIGNyZWRpdCBvcHBvcnR1bml0aWVzIGZvciB0aGlzIGNvdXJzZToKCi0gMC41IHBvaW50czogaWRlbnRpZnkgYSBuZXcgaXNzdWUgaW4gdGhlIFtjb3Vyc2UgdGV4dGJvb2tdKGh0dHBzOi8vaXNhYWN0cGV0ZXJzZW4uZ2l0aHViLmlvL0ZhbnRhc3ktRm9vdGJhbGwtQW5hbHl0aWNzLVRleHRib29rKSB0aGF0IG5lZWRzIHRvIGJlIGZpeGVkLCBvciBtYWtlIGEgPHU+c3BlY2lmaWM8L3U+IHN1Z2dlc3Rpb24gZm9yIGltcHJvdmluZyB0aGUgW3RleHRib29rXShodHRwczovL2lzYWFjdHBldGVyc2VuLmdpdGh1Yi5pby9GYW50YXN5LUZvb3RiYWxsLUFuYWx5dGljcy1UZXh0Ym9vaykgYW5kIGl0cyB1c2VmdWxuZXNzIHRvIHlvdSBvciBvdGhlciBzdHVkZW50cwotIDAuNSBwb2ludHM6IGltcGxlbWVudCBhIGZpeC9zdWdnZXN0aW9uIGZvciB0aGUgaXNzdWUgeW91IGlkZW50aWZpZWQgaW4gdGhlIFtjb3Vyc2UgdGV4dGJvb2tdKGh0dHBzOi8vaXNhYWN0cGV0ZXJzZW4uZ2l0aHViLmlvL0ZhbnRhc3ktRm9vdGJhbGwtQW5hbHl0aWNzLVRleHRib29rKQotIDAuNSBwb2ludHM6IHN1Ym1pdCBhbiBlbmQtb2Ytc2VtZXN0ZXIgdmlkZW8gcmVmbGVjdGlvbgotIDEgcG9pbnQ6IHdpbiB0aGUgW2NsYXNzIGZhbnRhc3kgZm9vdGJhbGwgbGVhZ3VlXSgjZmFudGFzeUZvb3RiYWxsTGVhZ3VlKQoKVGhlIGV4dHJhIGNyZWRpdCBtdXN0IGJlIGNvbXBsZXRlZCBieSB0aGUgbGFzdCBkYXkgb2YgY2xhc3MuCkRldGFpbHMgYWJvdXQgZWFjaCBvcHRpb24gYXJlIHByb3ZpZGVkIGJlbG93LgpObyBhZGRpdGlvbmFsIGV4dHJhLWNyZWRpdCBvcHBvcnR1bml0aWVzIGFyZSBhdmFpbGFibGUgZm9yIHRoaXMgY291cnNlLgoKIyMjIEltcHJvdmVtZW50cyB0byB0aGUgVGV4dGJvb2sgeyNleHRyYUNyZWRpdFRleHRib29rfQoKWW91IGNhbiBlYXJuIDAuNSBwb2ludHMgb2YgZXh0cmEgY3JlZGl0IGJ5IGVpdGhlcjoKCjEuIElkZW50aWZ5aW5nIGEgbmV3IChpLmUuLCBub3QgcHJldmlvdXNseSBrbm93bikgaXNzdWUgaW4gdGhlIFtjb3Vyc2UgdGV4dGJvb2tdKGh0dHBzOi8vaXNhYWN0cGV0ZXJzZW4uZ2l0aHViLmlvL0ZhbnRhc3ktRm9vdGJhbGwtQW5hbHl0aWNzLVRleHRib29rKSB0aGF0IG5lZWRzIHRvIGJlIGZpeGVkLCBvcgoxLiBNYWtpbmcgYSA8dT5zcGVjaWZpYzwvdT4gc3VnZ2VzdGlvbiBmb3IgaW1wcm92aW5nIHRoZSBbdGV4dGJvb2tdKGh0dHBzOi8vaXNhYWN0cGV0ZXJzZW4uZ2l0aHViLmlvL0ZhbnRhc3ktRm9vdGJhbGwtQW5hbHl0aWNzLVRleHRib29rKSBhbmQgaXRzIHVzZWZ1bG5lc3MgdG8geW91IG9yIG90aGVyIHN0dWRlbnRzLgpGb3IgaW5zdGFuY2UsIHRvIGlkZW50aWZ5IGFuIGlzc3VlIHRoYXQgbmVlZHMgdG8gYmUgYWRkcmVzc2VkLCB5b3UgY291bGQgaWRlbnRpZnkgYSB0eXBvLCBtaXNzcGVsbGluZywgZ3JhbW1hdGljYWwgZXJyb3IsIGJyb2tlbiBsaW5rIHRvIGFub3RoZXIgc2VjdGlvbiBvZiB0aGUgYm9vaywgb3IgKGdhc3ApLCBhIG1pc3Rha2UvZXJyb3IuCk5vdGUgdGhhdCBwbGFjZWhvbGRlcnMgKGUuZy4sICJbaW5zZXJ0IGhlcmVdIikgYXJlIGFscmVhZHkga25vd24gYW5kIGRvIG5vdCBjb3VudCBhcyBuZXcgaXNzdWVzLgoKVG8gcmVjZWl2ZSB0aGUgZXh0cmEgY3JlZGl0OgoKMS4gW0NyZWF0ZSBhIG5ldyBpc3N1ZV0oaHR0cHM6Ly9naXRodWIuY29tL2lzYWFjdHBldGVyc2VuL0ZhbnRhc3ktRm9vdGJhbGwtQW5hbHl0aWNzLVRleHRib29rL2lzc3VlcykgaW4gdGhlIFt0ZXh0Ym9vaydzIEdpdEh1YiByZXBvc2l0b3J5XShodHRwczovL2dpdGh1Yi5jb20vaXNhYWN0cGV0ZXJzZW4vRmFudGFzeS1Gb290YmFsbC1BbmFseXRpY3MtVGV4dGJvb2spLCBhbmQKMS4gRW1haWwgbWUgYWZ0ZXIgZG9pbmcgc28uCgpZb3UgY2FuIGVhcm4gYW4gKiphZGRpdGlvbmFsIDAuNSBwb2ludHMqKiBleHRyYSBjcmVkaXQgKGZvciAxIHBvaW50IGV4dHJhIGluIHRvdGFsKSBieSBpbXBsZW1lbnRpbmcgdGhlIGZpeGVzL3N1Z2dlc3Rpb25zIHlvdSBzcGVjaWZpZWQuClRvIHJlY2VpdmUgdGhlIGV4dHJhIGNyZWRpdCBmb3IgaW1wbGVtZW50aW5nIHRoZSBmaXgvc3VnZ2VzdGlvbjoKCjEuIFtTdWJtaXQgYSBwdWxsIHJlcXVlc3RdKGh0dHBzOi8vZ2l0aHViLmNvbS9pc2FhY3RwZXRlcnNlbi9GYW50YXN5LUZvb3RiYWxsLUFuYWx5dGljcy1UZXh0Ym9vay9wdWxscykgd2l0aCB5b3VyIGNoYW5nZXMsIGFuZAoxLiBFbWFpbCBtZSBhZnRlciBkb2luZyBzby4KClNlZSBbdGhlc2UgaW5zdHJ1Y3Rpb25zXShodHRwczovL2RldnBzeWxhYi5naXRodWIuaW8vRGF0YUFuYWx5c2lzL2dpdC5odG1sI3B1bGwtcmVxdWVzdCkgZm9yIGhlbHAgY3JlYXRpbmcgYSBwdWxsIHJlcXVlc3QuCgoqKkltcG9ydGFudCoqOiBJZiB5b3UgcGxhbiB0byBpbXBsZW1lbnQgYSBmaXggb3Igc3VnZ2VzdGlvbiwgSSBzdHJvbmdseSBlbmNvdXJhZ2UgeW91IHRvIGRpc2N1c3MgaXQgd2l0aCBtZSBmaXJzdCB0byBlbnN1cmUgaXQgcXVhbGlmaWVzLgpJIHJlc2VydmUgdGhlIHJpZ2h0IHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSAiZml4Iiwgc3VnZ2VzdGlvbiwgb3IgaW1wbGVtZW50YXRpb24gd2FycmFudHMgZXh0cmEgY3JlZGl0IQoKIyMjIEVuZC1vZi1TZW1lc3RlciBWaWRlbyBSZWZsZWN0aW9uIHsjZXh0cmFDcmVkaXRWaWRlb1JlZmxlY3Rpb259CgpZb3UgY2FuIGVhcm4gMC41IHBvaW50cyBleHRyYSBjcmVkaXQgYnkgc3VibWl0dGluZyBhIHNob3J0ICgy4oCTMyBtaW51dGUpIHZpZGVvIHJlZmxlY3Rpbmcgb24geW91ciBleHBlcmllbmNlIGluIHRoZSBjbGFzcy4KVGhlIHZpZGVvIHNob3VsZCBpbmNsdWRlOgoKLSBBIGRlc2NyaXB0aW9uIG9mIHRoZSBjbGFzcywgd2hhdCB5b3UgbGVhcm5lZCwgYW5kIGhvdyBpdCB3aWxsIGJlbmVmaXQgeW91Ci0gWW91ciBmYXZvcml0ZSBwYXJ0IG9mIHRoZSBjbGFzcwotIFdoeSAoZnJvbSB5b3VyIHBlcnNwZWN0aXZlKSBpdCBpcyB2YWx1YWJsZSB0byBsZWFybiBzdGF0aXN0aWNzCi0gV2hhdCBhZHZpY2UgeW91IHdvdWxkIGdpdmUgdG8gc3R1ZGVudHMgd2hvIHRha2UgdGhlIGNsYXNzIGluIHRoZSBmdXR1cmUKClN1Ym1pdCB0aGUgdmlkZW8gaW4gdGhlIGRlc2lnbmF0ZWQgYXNzaWdubWVudCBvbiBbSUNPTl0oaHR0cHM6Ly9pY29uLnVpb3dhLmVkdSkuCgojIyMgV2luIHRoZSBDbGFzcyBGYW50YXN5IEZvb3RiYWxsIExlYWd1ZSB7I2V4dHJhQ3JlZGl0V2luTGVhZ3VlfQoKVGhlIHdpbm5lcihzKSBvZiB0aGUgW2NsYXNzIGZhbnRhc3kgZm9vdGJhbGwgbGVhZ3VlXSgjZmFudGFzeUZvb3RiYWxsTGVhZ3VlKeKAlGJhc2VkIG9uIGVpdGhlciB0b3RhbCBwb2ludHMgb3Igd2luL2xvc3MgcmVjb3JkIGF0IHRoZSBlbmQgb2YgdGhlIGNsYXNzIChpLmUuLCBXZWVrIDE0IG9mIHRoZSBORkwgc2Vhc29uKeKAlHdpbGwgcmVjZWl2ZSAxIHBvaW50IG9mIGV4dHJhIGNyZWRpdC4KCiMgVGVudGF0aXZlIENvdXJzZSBPdXRsaW5lIChleGFtIGRhdGVzIGZpeGVkKSB7I291dGxpbmV9CgpUaGlzIGlzIGEgKnRlbnRhdGl2ZSogY291cnNlIG91dGxpbmUuCkNoYW5nZXMgd2lsbCBiZSBkaXNjdXNzZWQgaW4gY2xhc3MuClRoZXJlIGFyZSAxNSB3ZWVrcyBpbiB0aGUgc2VtZXN0ZXIsIGFuZCBjbGFzcyBtZWV0cyB0d2ljZSBwZXIgd2VlayAoMzAgc2VjdGlvbnMpLgpXZSB3aWxsIGhhdmUgb25lIGV4YW0gZHVyaW5nIHRoZSBzZW1lc3RlciBhbmQgb25lIGZpbmFsIGV4YW0gZHVyaW5nIGZpbmFscyB3ZWVrLgoKfCAqKlNlY3Rpb24qKiAgICAgIHwgKipEYXkqKiB8ICoqRGF0ZSoqIHwgKipDb250ZW50KiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJlYWRpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQXNzaWdubWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cnw6LS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tfDotLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAp8IFsxXSgjc2VjdGlvbjEpICAgfCBUICAgICAgIHwgMDgvMjYgICAgfCBPdmVydmlldyBvZiBDbGFzczsgT3ZlcnZpZXcgb2YgRmFudGFzeSBGb290YmFsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2ggWzFdKGh0dHBzOi8vaXNhYWN0cGV0ZXJzZW4uZ2l0aHViLmlvL0ZhbnRhc3ktRm9vdGJhbGwtQW5hbHl0aWNzLVRleHRib29rL2ludHJvLmh0bWwp4oCTWzJdKGh0dHBzOi8vaXNhYWN0cGV0ZXJzZW4uZ2l0aHViLmlvL0ZhbnRhc3ktRm9vdGJhbGwtQW5hbHl0aWNzLVRleHRib29rL2ZhbnRhc3ktZm9vdGJhbGwuaHRtbCkgfCBbQ29kZUFjYWRlbXkgTW9kdWxlIDFdKGh0dHBzOi8vd3d3LmNvZGVjYWRlbXkuY29tL2xlYXJuL2xlYXJuLXIpIHwKfCBbMl0oI3NlY3Rpb24yKSAgIHwgVGggICAgICB8IDA4LzI4ICAgIHwgU3RhdGlzdGljYWwgUHJvZ3JhbW1pbmc6IFVzaW5nIGBSYCBmb3IgU3RhdGlzdGljYWwgQW5hbHlzaXMgICAgICAgICAgICAgICAgICB8IENoIFszXShodHRwczovL2lzYWFjdHBldGVyc2VuLmdpdGh1Yi5pby9GYW50YXN5LUZvb3RiYWxsLUFuYWx5dGljcy1UZXh0Ym9vay9nZXR0aW5nLXN0YXJ0ZWQuaHRtbCkgfCBbQ29kZUFjYWRlbXkgTW9kdWxlcyAy4oCTM10oaHR0cHM6Ly93d3cuY29kZWNhZGVteS5jb20vbGVhcm4vbGVhcm4tcikgfAp8IFszXSgjc2VjdGlvbjMpICAgfCBUICAgICAgIHwgMDkvMDIgICAgfCBQbGF5ZXIgRXZhbHVhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2ggWzZdKGh0dHBzOi8vaXNhYWN0cGV0ZXJzZW4uZ2l0aHViLmlvL0ZhbnRhc3ktRm9vdGJhbGwtQW5hbHl0aWNzLVRleHRib29rL3BsYXllci1ldmFsdWF0aW9uLmh0bWwpOyBEZW4gSGFydGlnaCBldCBhbC4gKDIwMTgpIHwgKipTZXQgdXAgYmxvZzsgcG9zdCB3ZWxjb21lIGFydGljbGUqKiB8CnwgWzRdKCNzZWN0aW9uNCkgICB8IFRoICAgICAgfCAwOS8wNCAgICB8IFRoZSBEcmFmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDaCBbN10oaHR0cHM6Ly9pc2FhY3RwZXRlcnNlbi5naXRodWIuaW8vRmFudGFzeS1Gb290YmFsbC1BbmFseXRpY3MtVGV4dGJvb2svZHJhZnQuaHRtbCk7IExlZSAmIExpdSAoMjAyMikgfCBbQ29kZUFjYWRlbXkgTW9kdWxlcyA14oCTNl0oaHR0cHM6Ly93d3cuY29kZWNhZGVteS5jb20vbGVhcm4vbGVhcm4tcikgfAp8IFs1XSgjc2VjdGlvbjUpICAgfCBUICAgICAgIHwgMDkvMDkgICAgfCBTdGF0aXN0aWNhbCBQcm9ncmFtbWluZyBpbiBgUmAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2ggWzRdKGh0dHBzOi8vaXNhYWN0cGV0ZXJzZW4uZ2l0aHViLmlvL0ZhbnRhc3ktRm9vdGJhbGwtQW5hbHl0aWNzLVRleHRib29rL2Rvd25sb2FkLWZvb3RiYWxsLWRhdGEuaHRtbCkgfCBbQ29kZUFjYWRlbXkgTW9kdWxlcyA34oCTMTBdKGh0dHBzOi8vd3d3LmNvZGVjYWRlbXkuY29tL2xlYXJuL2xlYXJuLXIpIHwKfCBbNl0oI3NlY3Rpb242KSAgIHwgVGggICAgICB8IDA5LzExICAgIHwgQmFzaWMgU3RhdGlzdGljcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENoIFs4XShodHRwczovL2lzYWFjdHBldGVyc2VuLmdpdGh1Yi5pby9GYW50YXN5LUZvb3RiYWxsLUFuYWx5dGljcy1UZXh0Ym9vay9yZXNlYXJjaC1tZXRob2RzLmh0bWwp4oCTWzldKGh0dHBzOi8vaXNhYWN0cGV0ZXJzZW4uZ2l0aHViLmlvL0ZhbnRhc3ktRm9vdGJhbGwtQW5hbHl0aWNzLVRleHRib29rL2Jhc2ljLXN0YXRpc3RpY3MuaHRtbCkgfCAqKkJsb2cgYXJ0aWNsZSAxIGR1ZSEqKiAgICAgICAgICAgICAgIHwKfCBbN10oI3NlY3Rpb243KSAgIHwgVCAgICAgICB8IDA5LzE2ICAgIHwgRGF0YSBWaXN1YWxpemF0aW9uIGFuZCBJbnRlcnByZXRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENoIFs1XShodHRwczovL2lzYWFjdHBldGVyc2VuLmdpdGh1Yi5pby9GYW50YXN5LUZvb3RiYWxsLUFuYWx5dGljcy1UZXh0Ym9vay9kYXRhLXZpc3VhbGl6YXRpb24uaHRtbCk7IFNjaHdhYmlzaCAoMjAyMSkgfCBbQ29kZUFjYWRlbXkgTW9kdWxlIDRdKGh0dHBzOi8vd3d3LmNvZGVjYWRlbXkuY29tL2xlYXJuL2xlYXJuLXIpIHwKfCBbOF0oI3NlY3Rpb244KSAgIHwgVGggICAgICB8IDA5LzE4ICAgIHwgQ29ycmVsYXRpb24gQW5hbHlzaXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENoIFsxMF0oaHR0cHM6Ly9pc2FhY3RwZXRlcnNlbi5naXRodWIuaW8vRmFudGFzeS1Gb290YmFsbC1BbmFseXRpY3MtVGV4dGJvb2svY29ycmVsYXRpb24uaHRtbCk7IEdvb2R3aW4gJiBMZWVjaCAoMjAwNikgfCAqKkJsb2cgYXJ0aWNsZSAyIGR1ZSEqKiAgICAgICAgICAgICAgIHwKfCBbOV0oI3NlY3Rpb245KSAgIHwgVCAgICAgICB8IDA5LzIzICAgIHwgTXVsdGlwbGUgUmVncmVzc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENoIFsxMV0oaHR0cHM6Ly9pc2FhY3RwZXRlcnNlbi5naXRodWIuaW8vRmFudGFzeS1Gb290YmFsbC1BbmFseXRpY3MtVGV4dGJvb2svbXVsdGlwbGUtcmVncmVzc2lvbi5odG1sKTsgT3Nib3JuZSAmIFdhdGVycyAoMjAwMikgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCBbMTBdKCNzZWN0aW9uMTApIHwgVGggICAgICB8IDA5LzI1ICAgIHwgTWl4ZWQgTW9kZWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENoIFsxMl0oaHR0cHM6Ly9pc2FhY3RwZXRlcnNlbi5naXRodWIuaW8vRmFudGFzeS1Gb290YmFsbC1BbmFseXRpY3MtVGV4dGJvb2svbWl4ZWQtbW9kZWxzLmh0bWwpOyBCcmF1ZXIgJiBLdXJ0aW4gKDIwMTgpIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgWzExXSgjc2VjdGlvbjExKSB8IFQgICAgICAgfCAwOS8zMCAgICB8IENhdXNhbCBJbmZlcmVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDaCBbMTNdKGh0dHBzOi8vaXNhYWN0cGV0ZXJzZW4uZ2l0aHViLmlvL0ZhbnRhc3ktRm9vdGJhbGwtQW5hbHl0aWNzLVRleHRib29rL2NhdXNhbC1pbmZlcmVuY2UuaHRtbCk7IEQnT25vZnJpbyBldCBhbC4gKDIwMjApIHwgKipCbG9nIGFydGljbGUgMyBkdWUhKiogICAgICAgICAgICAgICB8CnwgWzEyXSgjc2VjdGlvbjEyKSB8IFRoICAgICAgfCAxMC8wMiAgICB8IEhldXJpc3RpY3MgYW5kIENvZ25pdGl2ZSBCaWFzZXMgaW4gUHJlZGljdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDaCBbMTRdKGh0dHBzOi8vaXNhYWN0cGV0ZXJzZW4uZ2l0aHViLmlvL0ZhbnRhc3ktRm9vdGJhbGwtQW5hbHl0aWNzLVRleHRib29rL2NvZ25pdGl2ZS1iaWFzLmh0bWwpOyBUdmVyc2t5ICYgS2FobmVtYW4gKDE5NzQpIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgWzEzXSgjc2VjdGlvbjEzKSB8IFQgICAgICAgfCAxMC8wNyAgICB8IEh1bWFuIEp1ZGdtZW50IHZzIEFjdHVhcmlhbCBBcHByb2FjaGVzIHRvIFByZWRpY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgfCBDaCBbMTVdKGh0dHBzOi8vaXNhYWN0cGV0ZXJzZW4uZ2l0aHViLmlvL0ZhbnRhc3ktRm9vdGJhbGwtQW5hbHl0aWNzLVRleHRib29rL2FjdHVhcmlhbC5odG1sKTsgS2FobmVtYW4gKDIwMTEpLCBDaCAyMSAmIDIyICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IFsxNF0oI3NlY3Rpb24xNCkgfCBUaCAgICAgIHwgMTAvMDkgICAgfCBCYXNlIFJhdGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2ggWzE2XShodHRwczovL2lzYWFjdHBldGVyc2VuLmdpdGh1Yi5pby9GYW50YXN5LUZvb3RiYWxsLUFuYWx5dGljcy1UZXh0Ym9vay9iYXNlLXJhdGVzLmh0bWwpOyBLYWhuZW1hbiAoMjAxMSksIENoIDE0ICYgMzAgIHwgKipCbG9nIGFydGljbGUgNCBkdWUhKiogICAgICAgICAgICAgICB8CnwgWzE1XSgjc2VjdGlvbjE1KSB8IFQgICAgICAgfCAxMC8xNCAgICB8ICoqTWlkdGVybSBFeGFtKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IFsxNl0oI3NlY3Rpb24xNikgfCBUaCAgICAgIHwgMTAvMTYgICAgfCBFdmFsdWF0aW9uIG9mIFByZWRpY3Rpb24vRm9yZWNhc3RpbmcgQWNjdXJhY3k6IEJpbmFyeSBDbGFzc2lmaWNhdGlvbiAgICAgICAgIHwgQ2ggMTcgKFNlY3Rpb24gWzE3LjFdKGh0dHBzOi8vaXNhYWN0cGV0ZXJzZW4uZ2l0aHViLmlvL0ZhbnRhc3ktRm9vdGJhbGwtQW5hbHl0aWNzLVRleHRib29rL2V2YWx1YXRpbmctcHJlZGljdGlvbi1hY2N1cmFjeS5odG1sKeKAkzE3LjYuNikgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgWzE3XSgjc2VjdGlvbjE3KSB8IFQgICAgICAgfCAxMC8yMSAgICB8IEV2YWx1YXRpb24gb2YgUHJlZGljdGlvbi9Gb3JlY2FzdGluZyBBY2N1cmFjeTogQmluYXJ5IENsYXNzaWZpY2F0aW9uICAgICAgICAgfCBDaCAxNyAoU2VjdGlvbiBbMTcuNi43XShodHRwczovL2lzYWFjdHBldGVyc2VuLmdpdGh1Yi5pby9GYW50YXN5LUZvb3RiYWxsLUFuYWx5dGljcy1UZXh0Ym9vay9ldmFsdWF0aW5nLXByZWRpY3Rpb24tYWNjdXJhY3kuaHRtbCNzZWMtc2Vuc2l0aXZpdHlTcGVjaWZpY2l0eVBQVm5wdinigJMxNy42LjkpICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgWzE4XSgjc2VjdGlvbjE4KSB8IFRoICAgICAgfCAxMC8yMyAgICB8IEV2YWx1YXRpb24gb2YgUHJlZGljdGlvbi9Gb3JlY2FzdGluZyBBY2N1cmFjeTogQ29udGludW91cyBPdXRjb21lcyAgICAgICAgICAgfCBDaCAxNyAoU2VjdGlvbiBbMTcuN10oaHR0cHM6Ly9pc2FhY3RwZXRlcnNlbi5naXRodWIuaW8vRmFudGFzeS1Gb290YmFsbC1BbmFseXRpY3MtVGV4dGJvb2svZXZhbHVhdGluZy1wcmVkaWN0aW9uLWFjY3VyYWN5Lmh0bWwjc2VjLXRocmVzaG9sZEluZGVwZW5kZW50QWNjdXJhY3kp4oCTZW5kIG9mIGNoYXB0ZXIpIHwgKipCbG9nIGFydGljbGUgNSBkdWUhKiogICAgICAgICAgICAgICB8CnwgWzE5XSgjc2VjdGlvbjE5KSB8IFQgICAgICAgfCAxMC8yOCAgICB8IENhbGlicmF0aW9uIEFjY3VyYWN5OiBPdmVyY29uZmlkZW5jZSBCaWFzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBLYWhuZW1hbiAmIFR2ZXJza3kgKDE5OTYpOyBNYXNzZXkgJiBUaGFsZXIgKDIwMTMpIHwgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IFsyMF0oI3NlY3Rpb24yMCkgfCBUaCAgICAgIHwgMTAvMzAgICAgfCBNYWNoaW5lIExlYXJuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2ggWzE5XShodHRwczovL2lzYWFjdHBldGVyc2VuLmdpdGh1Yi5pby9GYW50YXN5LUZvb3RiYWxsLUFuYWx5dGljcy1UZXh0Ym9vay9tYWNoaW5lLWxlYXJuaW5nLmh0bWwpOyBSYW1hc3VicmFtYW5pYW4gJiBTaW5naCAoMjAxOSksIENoIDYgfCAqKkJsb2cgYXJ0aWNsZSA2IGR1ZSEqKiAgICAgICB8CnwgWzIxXSgjc2VjdGlvbjIxKSB8IFQgICAgICAgfCAxMS8wNCAgICB8IE15dGhidXN0ZXJzOiBQdXR0aW5nIEZhbnRhc3kgRm9vdGJhbGwgQmVsaWVmcy9BbmVjZG90ZXMgdG8gdGhlIFRlc3QgICAgICAgICAgfCBDaCBbMThdKGh0dHBzOi8vaXNhYWN0cGV0ZXJzZW4uZ2l0aHViLmlvL0ZhbnRhc3ktRm9vdGJhbGwtQW5hbHl0aWNzLVRleHRib29rL215dGhidXN0ZXJzLmh0bWwpOyBXaGl0ZSAmIFNoZWxkb24gKDIwMTQpICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgWzIyXSgjc2VjdGlvbjIyKSB8IFRoICAgICAgfCAxMS8wNiAgICB8IE1vZGVybiBQb3J0Zm9saW8gVGhlb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDaCBbMjBdKGh0dHBzOi8vaXNhYWN0cGV0ZXJzZW4uZ2l0aHViLmlvL0ZhbnRhc3ktRm9vdGJhbGwtQW5hbHl0aWNzLVRleHRib29rL21vZGVybi1wb3J0Zm9saW8tdGhlb3J5Lmh0bWwpOyBDaGVuICgyMDE2KSB8ICoqQmxvZyBhcnRpY2xlIDcgZHVlISoqICAgICAgICAgICAgICAgfAp8IFsyM10oI3NlY3Rpb24yMykgfCBUICAgICAgIHwgMTEvMTEgICAgfCBDbHVzdGVyIEFuYWx5c2lzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2ggWzIxXShodHRwczovL2lzYWFjdHBldGVyc2VuLmdpdGh1Yi5pby9GYW50YXN5LUZvb3RiYWxsLUFuYWx5dGljcy1UZXh0Ym9vay9jbHVzdGVyLWFuYWx5c2lzLmh0bWwpOyBFdmVyaXR0IGV0IGFsLiAoMjAxMSkgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCBbMjRdKCNzZWN0aW9uMjQpIHwgVGggICAgICB8IDExLzEzICAgIHwgRmFjdG9yIEFuYWx5c2lzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENoIFsyMl0oaHR0cHM6Ly9pc2FhY3RwZXRlcnNlbi5naXRodWIuaW8vRmFudGFzeS1Gb290YmFsbC1BbmFseXRpY3MtVGV4dGJvb2svZmFjdG9yLWFuYWx5c2lzLmh0bWwpOyBGaWVsZCBldCBhbC4gKDIwMTIpLCBDaCAxNyB8ICoqQmxvZyBhcnRpY2xlIDggZHVlISoqICAgICAgICAgICAgICAgfAp8IFsyNV0oI3NlY3Rpb24yNSkgfCBUICAgICAgIHwgMTEvMTggICAgfCBEYXRhIFJlZHVjdGlvbjogUHJpbmNpcGFsIENvbXBvbmVudCBBbmFseXNpcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2ggWzIzXShodHRwczovL2lzYWFjdHBldGVyc2VuLmdpdGh1Yi5pby9GYW50YXN5LUZvb3RiYWxsLUFuYWx5dGljcy1UZXh0Ym9vay9wY2EuaHRtbCkgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCBbMjZdKCNzZWN0aW9uMjYpIHwgVGggICAgICB8IDExLzIwICAgIHwgU2ltdWxhdGlvbiBhbmQgdGhlIE1vbnRlIENhcmxvIE1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENoIFsyNF0oaHR0cHM6Ly9pc2FhY3RwZXRlcnNlbi5naXRodWIuaW8vRmFudGFzeS1Gb290YmFsbC1BbmFseXRpY3MtVGV4dGJvb2svc2ltdWxhdGlvbi5odG1sKTsgU2lnYWwgJiBDaGFsbWVycyAoMjAxNikgfCAqKkJsb2cgYXJ0aWNsZSA5IGR1ZSEqKiAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8IDExLzI04oCTMTEvMjcgfCAqKkZBTEwgQlJFQUsg4oCTIE5PIENMQVNTRVMqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IFsyN10oI3NlY3Rpb24yNykgfCBUICAgICAgIHwgMTIvMDIgICAgfCBUaW1lIFNlcmllcyBBbmFseXNpcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2ggWzI1XShodHRwczovL2lzYWFjdHBldGVyc2VuLmdpdGh1Yi5pby9GYW50YXN5LUZvb3RiYWxsLUFuYWx5dGljcy1UZXh0Ym9vay90aW1lLXNlcmllcy1hbmFseXNpcy5odG1sKTsgW0h5bmRtYW4gJiBBdGhhbmFzb3BvdWxvcyAoMjAyMSksIENoIDFdKGh0dHBzOi8vb3RleHRzLmNvbS9mcHAzL2ludHJvLmh0bWwpICh0aHJvdWdoIFNlY3Rpb24gMS43KSB8ICAgICAgICB8CnwgWzI4XSgjc2VjdGlvbjI4KSB8IFRoICAgICAgfCAxMi8wNCAgICB8IERlY2lzaW9uIE1ha2luZyBpbiB0aGUgQ29udGV4dCBvZiBVbmNlcnRhaW50eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDaCBbMjZdKGh0dHBzOi8vaXNhYWN0cGV0ZXJzZW4uZ2l0aHViLmlvL0ZhbnRhc3ktRm9vdGJhbGwtQW5hbHl0aWNzLVRleHRib29rL2RlY2lzaW9uLW1ha2luZy5odG1sKTsgTGFycmljayBldCBhbC4gKDIwMjQpIHwgKipCbG9nIGFydGljbGUgMTAgZHVlISoqICAgICAgICAgICAgICB8CnwgWzI5XSgjc2VjdGlvbjI5KSB8IFQgICAgICAgfCAxMi8wOSAgICB8IFNwb3J0cyBhbmQgQ29nbml0aXZlIFBzeWNob2xvZ3k6IENvYWNoaW5nIGFuZCBSaXNrIEF2ZXJzaW9uICAgICAgICAgICAgICAgICAgfCBDaCAyNyAoU2VjdGlvbiBbMjcuMV0oaHR0cHM6Ly9pc2FhY3RwZXRlcnNlbi5naXRodWIuaW8vRmFudGFzeS1Gb290YmFsbC1BbmFseXRpY3MtVGV4dGJvb2svc3BvcnRzLWNvZ25pdGl2ZS1wc3ljaG9sb2d5Lmh0bWwp4oCTMjcuNSk7IE1vc2tvd2l0eiAmIFdlcnRoaGVpbSAoMjAxMiksIENoIDMgJiAxNiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgWzMwXSgjc2VjdGlvbjMwKSB8IFRoICAgICAgfCAxMi8xMSAgICB8IFNwb3J0cyBhbmQgQ29nbml0aXZlIFBzeWNob2xvZ3k6IFBzeWNob2xvZ2ljYWwgRmFjdG9ycyBpbiBQbGF5ZXIgUGVyZm9ybWFuY2U7IEV4cGVydCBQZXJmb3JtYW5jZSBhbmQgQXV0b21hdGljaXR5IHwgQ2ggMjcgKFNlY3Rpb24gWzI3LjZdKGh0dHBzOi8vaXNhYWN0cGV0ZXJzZW4uZ2l0aHViLmlvL0ZhbnRhc3ktRm9vdGJhbGwtQW5hbHl0aWNzLVRleHRib29rL3Nwb3J0cy1jb2duaXRpdmUtcHN5Y2hvbG9neS5odG1sI3NlYy1wc3ljaG9sb2dpY2FsRmFjdG9yc1BlcmZvcm1hbmNlKeKAk2VuZCBvZiBjaGFwdGVyKTsgTW9za293aXR6ICYgV2VydGhoZWltICgyMDEyKSwgQ2ggMTcgfCAqKkJsb2cgYXJ0aWNsZSAxMSBkdWUhKiogICAgICAgfAp8IEZpbmFscyBXZWVrICAgICAgfCAgICAgICAgIHwgVEJEICh3ZWVrIG9mIDEyLzE1KSB8ICoqRmluYWwgRXhhbSoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKCiMgRGF0ZSBhbmQgVGltZSBvZiB0aGUgRmluYWwgRXhhbSB7I2ZpbmFsRXhhbX0KClRoZSBbZmluYWwgZXhhbWluYXRpb24gZGF0ZSBhbmQgdGltZV0oaHR0cHM6Ly9yZWdpc3RyYXIudWlvd2EuZWR1L2ZpbmFsLWV4YW0tc2NoZWR1bGVzKSB3aWxsIGJlIGFubm91bmNlZCBieSB0aGUgUmVnaXN0cmFyIGdlbmVyYWxseSBieSB0aGUgZmlmdGggd2VlayBvZiBjbGFzc2VzLCBhbmQgaXQgd2lsbCBiZSBhbm5vdW5jZWQgb24gdGhlIGNvdXJzZSBJQ09OIHNpdGUgb25jZSBpdCBpcyBrbm93bi4KPHU+RG8gbm90IHBsYW4geW91ciBlbmQgb2YgdGhlIHNlbWVzdGVyIHRyYXZlbCBwbGFucyB1bnRpbCB0aGUgZmluYWwgZXhhbSBzY2hlZHVsZSBpcyBtYWRlIHB1YmxpYy4KSXQgaXMgeW91ciByZXNwb25zaWJpbGl0eSB0byBrbm93IHRoZSBkYXRlLCB0aW1lLCBhbmQgcGxhY2Ugb2YgdGhlIGZpbmFsIGV4YW0uPC91PgpBY2NvcmRpbmcgdG8gdGhlIFJlZ2lzdHJhcidzIGZpbmFsIGV4YW0gcG9saWN5LCBzdHVkZW50cyA8dT5oYXZlIGEgbWF4aW11bSBvZiB0d28gd2Vla3MgYWZ0ZXIgdGhlIGFubm91bmNlZCBmaW5hbCBleGFtIHNjaGVkdWxlPC91PiB0byByZXF1ZXN0IGEgY2hhbmdlIGlmIGFuIGV4YW0gY29uZmxpY3QgZXhpc3RzIG9yIGlmIGEgc3R1ZGVudCBoYXMgbW9yZSB0aGFuIHR3byBleGFtcyBzY2hlZHVsZWQgZm9yIHRoZSBzYW1lIGRheSAoc2VlIHRoZSBbcG9saWN5XShodHRwczovL3JlZ2lzdHJhci51aW93YS5lZHUvbWFrZXVwLWZpbmFsLWV4YW1pbmF0aW9uLXBvbGljaWVzKSBoZXJlKS4KCiMgQ291cnNlIFJlc291cmNlcyB7I2NvdXJzZVJlc291cmNlc30KClRoZXJlIGFyZSBtYW55IGNvdXJzZSByZXNvdXJjZXMgYXZhaWxhYmxlIHRvIGhlbHAgeW91IHN1Y2NlZWQgaW4gdGhlIGNsYXNzLCBpbmNsdWRpbmc6CgotIFBvd2VycG9pbnQgc2xpZGVzIGZvciBsZWN0dXJlCi0gZ2V0dGluZyBhbmQgcmV2aWV3aW5nIG1pc3NlZCBub3RlcyBmcm9tIGEgcGVlcgotIFtsZWN0dXJlIHJlY29yZGluZ3NdKCNyZWNvcmRpbmdzKQotIHRoZSBbY291cnNlIHRleHRib29rXShodHRwczovL2lzYWFjdHBldGVyc2VuLmdpdGh1Yi5pby9GYW50YXN5LUZvb3RiYWxsLUFuYWx5dGljcy1UZXh0Ym9vaykgYW5kIGFzc2lnbmVkIHJlYWRpbmdzCi0gcmV2aWV3IHlvdXIgcmVhZGluZyBxdWl6emVzIGFuZCB0aGUgYW5zd2VycwotIGluc3RydWN0b3Igb2ZmaWNlIGhvdXJzCi0gcGVlciBzdHVkeSBncm91cHMKLSBUdXRvciBJb3dhOiBodHRwczovL3R1dG9yLnVpb3dhLmVkdQoKIyBEcm9wIERlYWRsaW5lIGZvciB0aGlzIENvdXJzZSB7I2Ryb3BEZWFkbGluZX0KCllvdSBtYXkgZHJvcCBhbiBpbmRpdmlkdWFsIGNvdXJzZSBiZWZvcmUgdGhlIGRyb3AgZGVhZGxpbmU7IGFmdGVyIHRoaXMgZGVhZGxpbmUgeW91IHdpbGwgbmVlZCBjb2xsZWdpYXRlIGFwcHJvdmFsLgpZb3UgY2FuIGxvb2sgdXAgdGhlIGRyb3AgZGVhZGxpbmUgZm9yIHRoaXMgY291cnNlIFtoZXJlXShodHRwczovL3JlZ2lzdHJhci51aW93YS5lZHUvY291cnNlLWRlYWRsaW5lcykuCldoZW4geW91IGRyb3AgYSBjb3Vyc2UsIGEgIlciIHdpbGwgYXBwZWFyIG9uIHlvdXIgdHJhbnNjcmlwdC4KVGhlIG1hcmsgb2YgIlciIGlzIGEgbmV1dHJhbCBtYXJrIHRoYXQgZG9lcyBub3QgYWZmZWN0IHlvdXIgR1BBLgpUbyBkaXNjdXNzIGhvdyBkcm9wcGluZyAob3Igc3RheWluZyBpbikgYSBjb3Vyc2UgbWlnaHQgYWZmZWN0IHlvdXIgYWNhZGVtaWMgZ29hbHMsIHBsZWFzZSBjb250YWN0IHlvdXIgQWNhZGVtaWMgQWR2aXNvci4KRGlyZWN0aW9ucyBmb3IgYWRkaW5nIG9yIGRyb3BwaW5nIGEgY291cnNlIGFuZCBvdGhlciByZWdpc3RyYXRpb24gY2hhbmdlcyBjYW4gYmUgZm91bmQgb24gdGhlIFtSZWdpc3RyYXIncyB3ZWJzaXRlXShodHRwczovL3JlZ2lzdHJhci51aW93YS5lZHUvY2hhbmdlLXJlZ2lzdHJhdGlvbi1teXVpKS4KU3R1ZGVudHMgY2FuIGZpbmQgcG9saWNpZXMgb24gZHJvcHBpbmcgQ0xBUyBjb3Vyc2VzIFtoZXJlXShodHRwczovL2NsYXMudWlvd2EuZWR1L3N0dWRlbnRzL3N0dWRlbnRzLWFjYWRlbWljLXBvbGljaWVzL3JlZ2lzdHJhdGlvbi1wb2xpY2llcyNkcm9wcGluZykuClN0dWRlbnRzIHNob3VsZCBhZGhlcmUgdG8gdGhlIFthY2FkZW1pYyBkZWFkbGluZXNdKGh0dHBzOi8vZ3JhZC51aW93YS5lZHUvYWNhZGVtaWNzL2RlYWRsaW5lcykgYW5kIHBvbGljaWVzIHNldCBieSB0aGUgR3JhZHVhdGUgQ29sbGVnZS4KCiMgRmVlZGJhY2sgYWJvdXQgdGhlIENvdXJzZSB7I2ZlZWRiYWNrfQoKSSB3ZWxjb21lIGZlZWRiYWNrIGF0IGFueSBwb2ludCBkdXJpbmcgdGhlIGNsYXNzLgpJZiB5b3UgaGF2ZSBjb21tZW50cyBvbiB0aGUgY2xhc3Mgb3IgbXkgdGVhY2hpbmcsIHBsZWFzZSBmZWVsIGZyZWUgdG8gbWVldCB3aXRoIG1lIGR1cmluZyBvZmZpY2UgaG91cnMuCgojIyBTdHVkZW50IENvbXBsYWludHMgeyNjb21wbGFpbnRzfQoKU3R1ZGVudHMgd2l0aCBhIGNvbXBsYWludCBhYm91dCBhIGdyYWRlIG9yIGEgcmVsYXRlZCBtYXR0ZXIgc2hvdWxkIGZpcnN0IGRpc2N1c3MgdGhlIHNpdHVhdGlvbiB3aXRoIHRoZSBpbnN0cnVjdG9yLCBhbmQgZmluYWxseSB3aXRoIHRoZSBERU8gKENoYWlyKSBvZiB0aGUgZGVwYXJ0bWVudCwgc2Nob29sLCBvciBwcm9ncmFtIG9mZmVyaW5nIHRoZSBjb3Vyc2UuClNvbWV0aW1lcyBzdHVkZW50cyB3aWxsIGJlIHJlZmVycmVkIHRvIHRoZSBkZXBhcnRtZW50IG9yIHByb2dyYW0ncyBEaXJlY3RvciBvZiBVbmRlcmdyYWR1YXRlIFN0dWRpZXMgKERVUykgb3IgRGlyZWN0b3Igb2YgR3JhZHVhdGUgU3R1ZGllcyAoREdTKS4KU3R1ZGVudHMgc2hvdWxkIGNvbnRhY3QgW0NMQVMgVW5kZXJncmFkdWF0ZSBQcm9ncmFtc10oaHR0cHM6Ly9jbGFzLnVpb3dhLmVkdS9zdHVkZW50cy9oYW5kYm9vay9zdHVkZW50LXJpZ2h0cy1yZXNwb25zaWJpbGl0aWVzI3JpZ2h0cykgZm9yIHN1cHBvcnQgd2hlbiB0aGUgbWF0dGVyIGlzIG5vdCByZXNvbHZlZCBhdCB0aGUgcHJldmlvdXMgbGV2ZWwuCgojIENvbW11bmljYXRpb246IFVJIEVtYWlsIHsjZW1haWx9CgpTdHVkZW50cyBhcmUgcmVzcG9uc2libGUgZm9yIGFsbCBvZmZpY2lhbCBjb3JyZXNwb25kZW5jZXMgc2VudCB0byB0aGVpciBVSSBlbWFpbCBhZGRyZXNzICh1aW93YS5lZHUpIGFuZCBtdXN0IHVzZSB0aGlzIGFkZHJlc3MgZm9yIGFueSBjb21tdW5pY2F0aW9uIHdpdGggaW5zdHJ1Y3RvcnMgb3Igc3RhZmYgaW4gdGhlIFVJIGNvbW11bml0eS4KRm9yIHRoZSBwcml2YWN5IGFuZCB0aGUgcHJvdGVjdGlvbiBvZiBzdHVkZW50IHJlY29yZHMsIFVJIGZhY3VsdHkgYW5kIHN0YWZmIGNhbiBvbmx5IGNvcnJlc3BvbmQgd2l0aCBVSSBlbWFpbCBhZGRyZXNzZXMuCgojIyBPdGhlciBFeHBlY3RhdGlvbnMgb2YgU3R1ZGVudCBQZXJmb3JtYW5jZSB7I290aGVyRXhwZWN0YXRpb25zfQoKU3R1ZGVudHMgaGF2ZSB0aGUgcmlnaHQgdG8gYSBkaXN0cmFjdGlvbi1mcmVlIGxlYXJuaW5nIGVudmlyb25tZW50LgpZb3UgaGF2ZSB0aGUgcmVzcG9uc2liaWxpdHkgdG8gaGVscCBjcmVhdGUgc3VjaCBhIGNsYXNzcm9vbSBlbnZpcm9ubWVudC4KUGxlYXNlIHRyZWF0IG90aGVyIHN0dWRlbnRzIGluIHRoZSBjbGFzcyBhbmQgdGhlIGluc3RydWN0b3Igd2l0aCByZXNwZWN0LgpTdHVkZW50cyBhcmUgZXhwZWN0ZWQgdG8gaGVscCBlYWNoIG90aGVyIGxlYXJuIGFuZCB0byBjb250cmlidXRlIG92ZXJhbGwgdG8gdGhlIGxlYXJuaW5nIGVudmlyb25tZW50IG9mIHRoZSBjb3Vyc2UuCkFycml2aW5nIHByZXBhcmVkIGZvciBjbGFzcyBpcyBwYXJ0IG9mIHRoaXMgZXhwZWN0YXRpb24uCgojIFVuaXZlcnNpdHkgUG9saWNpZXMgeyNVSW93YVBvbGljaWVzfQoKW1VuaXZlcnNpdHkgUG9saWNpZXNdKGh0dHBzOi8vcHJvdm9zdC51aW93YS5lZHUvc3R1ZGVudC1jb3Vyc2UtcG9saWNpZXMpCgpbQWNjb21tb2RhdGlvbnMgZm9yIFN0dWRlbnRzIHdpdGggRGlzYWJpbGl0aWVzXShodHRwczovL3Byb3Zvc3QudWlvd2EuZWR1L3N0dWRlbnQtY291cnNlLXBvbGljaWVzKVwKVGhlIFVuaXZlcnNpdHkgaXMgY29tbWl0dGVkIHRvIHByb3ZpZGluZyBhbiBlZHVjYXRpb25hbCBleHBlcmllbmNlIHRoYXQgaXMgYWNjZXNzaWJsZSB0byBhbGwgc3R1ZGVudHMuCklmIGEgc3R1ZGVudCBoYXMgYSBkaWFnbm9zZWQgZGlzYWJpbGl0eSBvciBvdGhlciBkaXNhYmxpbmcgY29uZGl0aW9uIHRoYXQgbWF5IGltcGFjdCB0aGUgc3R1ZGVudCdzIGFiaWxpdHkgdG8gY29tcGxldGUgdGhlIGNvdXJzZSByZXF1aXJlbWVudHMgYXMgc3RhdGVkIGluIHRoZSBzeWxsYWJ1cywgdGhlIHN0dWRlbnQgbWF5IHNlZWsgYWNjb21tb2RhdGlvbnMgdGhyb3VnaCBbU3R1ZGVudCBEaXNhYmlsaXR5IFNlcnZpY2VzXShodHRwczovL3Nkcy5zdHVkZW50bGlmZS51aW93YS5lZHUvc3R1ZGVudHMpIChTRFMpLgpTRFMgaXMgcmVzcG9uc2libGUgZm9yIG1ha2luZyBbTGV0dGVycyBvZiBBY2NvbW1vZGF0aW9uIChMT0EpXShodHRwczovL3Nkcy5zdHVkZW50bGlmZS51aW93YS5lZHUvc3R1ZGVudHMvbGV0dGVyLWFjY29tbW9kYXRpb25zLWxvYSkgYXZhaWxhYmxlIHRvIHRoZSBzdHVkZW50Lgo8dT5UaGUgc3R1ZGVudCBtdXN0IHByb3ZpZGUgYSBMT0EgdG8gdGhlIGluc3RydWN0b3IgYXMgZWFybHkgaW4gdGhlIHNlbWVzdGVyIGFzIHBvc3NpYmxlLCBidXQgcmVxdWVzdHMgbm90IG1hZGUgYXQgbGVhc3QgdHdvIHdlZWtzIHByaW9yIHRvIHRoZSBzY2hlZHVsZWQgYWN0aXZpdHkgZm9yIHdoaWNoIGFuIGFjY29tbW9kYXRpb24gaXMgc291Z2h0IG1heSBub3QgYmUgYWNjb21tb2RhdGVkLjwvdT4KVGhlIExPQSB3aWxsIHNwZWNpZnkgd2hhdCByZWFzb25hYmxlIGNvdXJzZSBhY2NvbW1vZGF0aW9ucyB0aGUgc3R1ZGVudCBpcyBlbGlnaWJsZSBmb3IgYW5kIHRob3NlIHRoZSBpbnN0cnVjdG9yIHNob3VsZCBwcm92aWRlLgpBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBvbiB0aGUgW1NEUyB3ZWJzaXRlXShodHRwczovL3Nkcy5zdHVkZW50bGlmZS51aW93YS5lZHUvc3R1ZGVudHMvYXBwbHkpLgoKW0NsYXNzIFJlY29yZGluZ3NdKGh0dHBzOi8vcHJvdm9zdC51aW93YS5lZHUvc3R1ZGVudC1jb3Vyc2UtcG9saWNpZXMpXApTdHVkZW50cyBtYXkgYmUgZW5yb2xsZWQgaW4gYSBjbGFzcyB3aGVyZSBzb21lIHNlc3Npb25zIHdpbGwgYmUgcmVjb3JkZWQgb3IgbGl2ZS1zdHJlYW1lZC4KU3VjaCByZWNvcmRpbmdzL3N0cmVhbWluZyB3aWxsIG9ubHkgYmUgYXZhaWxhYmxlIHRvIHN0dWRlbnRzIHJlZ2lzdGVyZWQgZm9yIHRoZSBjbGFzcy4KVGhlc2UgcmVjb3JkaW5ncyBhcmUgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiB0aGUgaW5zdHJ1Y3RvciBhbmQgdGhleSBtYXkgbm90IGJlIHNoYXJlZCBvciByZXByb2R1Y2VkIHdpdGhvdXQgdGhlIGV4cGxpY2l0LCB3cml0dGVuIGNvbnNlbnQgb2YgdGhlIGluc3RydWN0b3IuCkZ1cnRoZXIsIHN0dWRlbnRzIG1heSBub3Qgc2hhcmUgdGhlc2Ugc2Vzc2lvbnMgd2l0aCB0aG9zZSBub3QgaW4gdGhlIGNsYXNzIG9yIHVwbG9hZCB0aGVtIHRvIGFueSBvdGhlciBvbmxpbmUgZW52aXJvbm1lbnQuCkRvaW5nIHNvIHdvdWxkIGJlIGEgYnJlYWNoIG9mIHRoZSBDb2RlIG9mIFN0dWRlbnQgQ29uZHVjdCwgYW5kLCBpbiBzb21lIGNhc2VzLCBhIHZpb2xhdGlvbiBvZiBzdGF0ZSBhbmQgZmVkZXJhbCBsYXcsIGluY2x1ZGluZyB0aGUgRmVkZXJhbCBFZHVjYXRpb24gUmlnaHRzIGFuZCBQcml2YWN5IEFjdCAoRkVSUEEpLgoKVGhlIHVuYXV0aG9yaXplZCB2aWRlbyBvciBhdWRpbyByZWNvcmRpbmcgb2YgYWNhZGVtaWMgYWN0aXZpdGllcyAoZS5nLiwgbGVjdHVyZXMsIGNvdXJzZSBkaXNjdXNzaW9ucywgb2ZmaWNlIGhvdXJzLCBldGMuKSBieSBhIHN0dWRlbnQgaXMgcHJvaGliaXRlZC4KU3R1ZGVudHMgd2l0aCBhIHJlYXNvbmFibGUgYWNjb21tb2RhdGlvbiBmb3IgcmVjb3JkaW5nIGFwcHJvdmVkIGJ5IFN0dWRlbnQgRGlzYWJpbGl0eSBTZXJ2aWNlcyBzaG91bGQgbm90aWZ5IGVhY2ggaW5zdHJ1Y3RvciBhbmQgcHJvdmlkZSB0aGUgTGV0dGVyIG9mIEFjY29tbW9kYXRpb24gcHJpb3IgdG8gdXNpbmcgdGhlIGFjY29tbW9kYXRpb24uCkEgc3R1ZGVudCBtYXkgcmVjb3JkIGNsYXNzcm9vbSBhY3Rpdml0aWVzIHdpdGggcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIGZyb20gdGhlIGluc3RydWN0b3IgYW5kIG5vdGljZSB0byBvdGhlciBzdHVkZW50cyBpbiB0aGUgY2xhc3MgdGhhdCBhdWRpbyBvciB2aWRlbyByZWNvcmRpbmcgbWF5IG9jY3VyLgpBbnkgYW5kIGFsbCBjbGFzc3Jvb20gcmVjb3JkaW5nIG11c3QgYmUgZm9yIHBlcnNvbmFsIGFjYWRlbWljIHVzZSBvbmx5LgpUaGUgZGlzdHJpYnV0aW9uLCBzaGFyaW5nLCBzYWxlLCBvciBwb3N0aW5nIG9mIHJlY29yZGluZ3Mgb24gdGhlIGludGVybmV0IChpbmNsdWRpbmcgc29jaWFsIG1lZGlhKSwgaW4gd2hvbGUgb3IgaW4gcGFydCwgaXMgcHJvaGliaXRlZCBhbmQgZG9pbmcgc28gbWF5IGJlIGEgdmlvbGF0aW9uIG9mIHRoZSBDb2RlIG9mIFN0dWRlbnQgTGlmZSBhbmQvb3Igc3RhdGUgb3IgZmVkZXJhbCBwcml2YWN5LCBjb3B5cmlnaHQsIG9yIG90aGVyIGxhd3MuCgotIFtGcmVlIFNwZWVjaCBhbmQgRXhwcmVzc2lvbl0oaHR0cHM6Ly9wcm92b3N0LnVpb3dhLmVkdS9zdHVkZW50LWNvdXJzZS1wb2xpY2llcykKLSBbTm9uLURpc2NyaW1pbmF0aW9uXShodHRwczovL3Byb3Zvc3QudWlvd2EuZWR1L3N0dWRlbnQtY291cnNlLXBvbGljaWVzKQotIFtBY2NvbW1vZGF0aW9ucyBmb3IgU3R1ZGVudHMgd2l0aCBEaXNhYmlsaXRpZXNdKGh0dHBzOi8vcHJvdm9zdC51aW93YS5lZHUvc3R1ZGVudC1jb3Vyc2UtcG9saWNpZXMpCi0gW0Fic2VuY2VzIGZyb20gQ2xhc3NdKGh0dHBzOi8vcHJvdm9zdC51aW93YS5lZHUvc3R1ZGVudC1jb3Vyc2UtcG9saWNpZXMpCi0gW0Fic2VuY2VzIGZvciBSZWxpZ2lvdXMgSG9seSBEYXlzXShodHRwczovL3Byb3Zvc3QudWlvd2EuZWR1L3N0dWRlbnQtY291cnNlLXBvbGljaWVzKQotIFtBYnNlbmNlcyBmb3IgTWlsaXRhcnkgU2VydmljZSBPYmxpZ2F0aW9uc10oaHR0cHM6Ly9wcm92b3N0LnVpb3dhLmVkdS9zdHVkZW50LWNvdXJzZS1wb2xpY2llcykKLSBbQ2xhc3Nyb29tIEV4cGVjdGF0aW9uc10oaHR0cHM6Ly9wcm92b3N0LnVpb3dhLmVkdS9zdHVkZW50LWNvdXJzZS1wb2xpY2llcykKLSBbU2V4dWFsIEhhcmFzc21lbnQvTWlzY29uZHVjdCBhbmQgU3VwcG9ydGl2ZSBNZWFzdXJlc10oaHR0cHM6Ly9wcm92b3N0LnVpb3dhLmVkdS9zdHVkZW50LWNvdXJzZS1wb2xpY2llcykKLSBbQ29uZmxpY3QgUmVzb2x1dGlvbl0oaHR0cHM6Ly9wcm92b3N0LnVpb3dhLmVkdS9zdHVkZW50LWNvdXJzZS1wb2xpY2llcykKLSBbTWVudGFsIEhlYWx0aF0oaHR0cHM6Ly9wcm92b3N0LnVpb3dhLmVkdS9zdHVkZW50LWNvdXJzZS1wb2xpY2llcykKLSBbQmFzaWMgTmVlZHMgYW5kIFN0dWRlbnQgU3VwcG9ydF0oaHR0cHM6Ly9wcm92b3N0LnVpb3dhLmVkdS9zdHVkZW50LWNvdXJzZS1wb2xpY2llcykKLSBbQ2xhc3MgUmVjb3JkaW5nc10oaHR0cHM6Ly9wcm92b3N0LnVpb3dhLmVkdS9zdHVkZW50LWNvdXJzZS1wb2xpY2llcykKCiMgV2hlcmUgdG8gR2V0IEFjYWRlbWljIFN1cHBvcnQgZm9yIFRoaXMgQ291cnNlIHsjYWNhZGVtaWMtc3VwcG9ydH0KCi0gRHJvcC1pbiBzdHVkeSBncm91cHMgYW5kIG9uZS1vbi1vbmUgdHV0b3Jpbmc6IHN0dWRlbnQgZHJvcC1pbiBob3VycyBvZiB0aGUgaW5zdHJ1Y3RvcgotIEZvcm1hbCB0dXRvcmluZzogVHV0b3IgSW93YTogaHR0cHM6Ly90dXRvci51aW93YS5lZHUKLSBVSSBXcml0aW5nIENlbnRlcjogaHR0cHM6Ly93cml0aW5nY2VudGVyLnVpb3dhLmVkdQotIEFjYWRlbWljIGFjY29tbW9kYXRpb25zOiBodHRwczovL3Nkcy5zdHVkZW50bGlmZS51aW93YS5lZHUKCiMgTWVudGFsIEhlYWx0aCBSZXNvdXJjZXMgYW5kIFN0dWRlbnQgU3VwcG9ydCB7I21lbnRhbC1oZWFsdGh9CgpTdHVkZW50cyBhcmUgZW5jb3VyYWdlZCB0byBiZSBtaW5kZnVsIG9mIHRoZWlyIG1lbnRhbCBoZWFsdGggYW5kIHNlZWsgaGVscCBhcyBhIHByZXZlbnRpdmUgbWVhc3VyZSBvciBpZiBmZWVsaW5nIG92ZXJ3aGVsbWVkIGFuZC9vciBzdHJ1Z2dsaW5nIHRvIG1lZXQgY291cnNlIGV4cGVjdGF0aW9ucy4KU3R1ZGVudHMgYXJlIGVuY291cmFnZWQgdG8gdGFsayB0byB0aGVpciBpbnN0cnVjdG9yIGZvciBhc3Npc3RhbmNlIHdpdGggc3BlY2lmaWMgY2xhc3MtcmVsYXRlZCBjb25jZXJucy4KRm9yIGFkZGl0aW9uYWwgc3VwcG9ydCBhbmQgY291bnNlbGluZywgc3R1ZGVudHMgYXJlIGVuY291cmFnZWQgdG8gY29udGFjdCBVbml2ZXJzaXR5IENvdW5zZWxpbmcgU2VydmljZSAoVUNTKS4KSW5mb3JtYXRpb24gYWJvdXQgVUNTLCBpbmNsdWRpbmcgcmVzb3VyY2VzIGFuZCBob3cgdG8gc2NoZWR1bGUgYW4gYXBwb2ludG1lbnQsIGNhbiBiZSBmb3VuZCBhdCBbY291bnNlbGluZy51aW93YS5lZHVdKGh0dHA6Ly9jb3Vuc2VsaW5nLnVpb3dhLmVkdSkuCkZpbmQgb3V0IG1vcmUgYWJvdXQgVUkgbWVudGFsIGhlYWx0aCBzZXJ2aWNlcyBhdDogW21lbnRhbGhlYWx0aC51aW93YS5lZHVdKGh0dHA6Ly9tZW50YWxoZWFsdGgudWlvd2EuZWR1KSwgaW5jbHVkaW5nIHRoZSAyNC03IFtVSSBTdXBwb3J0IGFuZCBDcmlzaXMgTGluZV0oaHR0cHM6Ly9tZW50YWxoZWFsdGgudWlvd2EuZWR1L3VpLXN1cHBvcnQtYW5kLWNyaXNpcy1saW5lKS4KCkFkZGl0aW9uYWxseSwgdGhlIE9mZmljZSBvZiB0aGUgRGVhbiBvZiBTdHVkZW50cyBjYW4gaGVscCBzdHVkZW50cyBuYXZpZ2F0ZSBwZXJzb25hbCBjcmlzaXMgc2l0dWF0aW9ucy4KVGhleSBjYW4gcHJvdmlkZSBvbmUtb24tb25lIHN1cHBvcnQsIGhlbHAgd2l0aCBpZGVudGlmeWluZyBvcHRpb25zLCBhbmQgYWNjZXNzIHRvIFtiYXNpYyBuZWVkcyByZXNvdXJjZXMgKHN1Y2ggYXMgZm9vZCwgcmVudCwgY2hpbGRjYXJlLCBldGMuKV0oaHR0cDovL2Jhc2ljbmVlZHMudWlvd2EuZWR1KS4KU3R1ZGVudCBDYXJlIGFuZCBBc3Npc3RhbmNlOiAxMzIgSU1VLCBbZG9zLWFzc2lzdGFuY2VAdWlvd2EuZWR1XShtYWlsdG86ZG9zLWFzc2lzdGFuY2VAdWlvd2EuZWR1KSwgb3IgMzE5LTMzNS0xMTYyIGFuZCBtb3JlIGluZm86IFtkb3MudWlvd2EuZWR1L2Fzc2lzdGFuY2VdKGh0dHBzOi8vZG9zLnVpb3dhLmVkdS9hc3Npc3RhbmNlKQoKSWYgeW91IGZlZWwgdGhhdCB5b3Ugb3Igc29tZW9uZSB5b3Uga25vdyBtYXkgYmUgc3RydWdnbGluZyB3aXRoIGFuIGFjYWRlbWljLCBlbW90aW9uYWwsIG9yIHBzeWNob2xvZ2ljYWwgcHJvYmxlbSwgdGhlIGZvbGxvd2luZyBvcmdhbml6YXRpb25zIGFyZSBhdmFpbGFibGUgZm9yIGFzc2lzdGFuY2U6Cgp8IFNlcnZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ29udGFjdCBJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cnw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCBVbml2ZXJzaXR5IG9mIElvd2EgQWNhZGVtaWMgQWR2aXNpbmcgQ2VudGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDM1My01NzAwLCBodHRwczovL2FkdmlzaW5nY2VudGVyLnVpb3dhLmVkdSAgICAgICAgICAgICAgICAgICAgICAgfAp8IFVuaXZlcnNpdHkgQ291bnNlbGluZyBTZXJ2aWNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMzM1LTcyOTQsIGh0dHBzOi8vd3d3LnVpb3dhLmVkdS91Y3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgU3R1ZGVudCBIZWFsdGggU2VydmljZSAtIE1lbnRhbCBIZWFsdGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzMzUtODM5NCwgaHR0cHM6Ly9zdHVkZW50aGVhbHRoLnVpb3dhLmVkdS9zZXJ2aWNlcy9wc3ljaGlhdHJ5ICAgIHwKfCBVbml2ZXJzaXR5IG9mIElvd2EgSG9zcGl0YWxzIGFuZCBDbGluaWNzIEFkdWx0IFBzeWNoaWF0cnkgU2VydmljZXMgQ2xpbmljICB8IDM1My02MzE0LCBodHRwczovL3d3dy51aWhlYWx0aGNhcmUub3JnL1BzeWNoaWF0cnkgICAgICAgICAgICAgICAgfAp8IFNlYXNob3JlIENsaW5pYyAoaW4gdGhlIFVJIERlcGFydG1lbnQgb2YgUHN5Y2hvbG9naWNhbCBhbmQgQnJhaW4gU2NpZW5jZXMpIHwgMzM1LTI0NjcsIGh0dHBzOi8vcHN5Y2hvbG9neS51aW93YS5lZHUvcmVzb3VyY2VzL3NlYXNob3JlLWNsaW5pYyB8CnwgV29tZW4ncyBSZXNvdXJjZSBhbmQgQWN0aW9uIENlbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzMzUtMTQ4NiwgaHR0cHM6Ly93cmFjLnVpb3dhLmVkdSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCBSYXBlIFZpY3RpbSBBZHZvY2FjeSBQcm9ncmFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMxOS0zMzUtNjAwMCBvciA4MDAtMjI4LTE2MjUsIGh0dHBzOi8vd3d3LnVpb3dhLmVkdS9+cnZhcCAgICAgICAgfAp8IE9mZmljZSBvZiBTZXh1YWwgTWlzY29uZHVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMzE5LTMzNS02MjAwLCBodHRwczovL29zbXJjLnVpb3dhLmVkdSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgQ29tbVVuaXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA4NTUtMzI1LTQyOTYsIGh0dHBzOi8vYnVpbHRieWNvbW11bml0eS5vcmcvY3Jpc2lzICAgICAgICAgICAgICAgIHwKfCBDb21tdW5pdHkgJiBGYW1pbHkgUmVzb3VyY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDM1MS00MzU3LCBodHRwczovL3d3dy5jZnJoZWxwcy5vcmcvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAoKPHU+SWYgeW91IG9yIHNvbWVvbmUgeW91IGtub3cgaXMgY29udGVtcGxhdGluZyBzdWljaWRlPC91PiwgZWl0aGVyIGNhbGwgb3IgdGV4dCB0aGUgU3VpY2lkZSBhbmQgQ3Jpc2lzIExpZmVsaW5lIGF0IDk4OCwgb3IgY2FsbCA5MTEuCgojIERpc2Nsb3N1cmVzIHsjZGlzY2xvc3VyZXN9CgpJIGFtIHRoZSBPd25lciBvZiBGYW50YXN5IEZvb3RiYWxsIEFuYWx5dGljcywgTExDLCB3aGljaCBvcGVyYXRlcyBodHRwczovL2ZhbnRhc3lmb290YmFsbGFuYWx5dGljcy5uZXQuCkkgZG8gbm90IHJlcXVpcmUgb3IgZW5jb3VyYWdlIHN0dWRlbnRzIHRvIHVzZSBteSB3ZWJzaXRlLCBhbmQgSSBkbyBub3QgcHJvbW90ZSBvciBlbmRvcnNlIGFueSBzcGVjaWZpYyBjb250ZW50IG9yIHNlcnZpY2VzIG9mZmVyZWQgYnkgRmFudGFzeSBGb290YmFsbCBBbmFseXRpY3MuCgojIERpc2NsYWltZXIgeyNkaXNjbGFpbWVyfQoKIipUaGlzIG1hdGVyaWFsIHByb2JhYmx5IHdvbid0IHdpbiB5b3UgZmFudGFzeSBmb290YmFsbCBjaGFtcGlvbnNoaXBzLgpZb3UgY291bGQgdGFrZSB3aGF0IHdlIGxlYXJuIGFuZCBhcHBseSBpdCB0byBmYW50YXN5IGZvb3RiYWxsIGFuZCB5b3UgbWlnaHQgYmVjb21lIDUgcGVyY2VudCBtb3JlIGxpa2VseSB0byB3aW4uCk9yLi4uCkNvbnNpZGVyIHRoZSBicm9hZGVyIHJlbGV2YW5jZSBvZiB0aGlzLgpZb3UgY291bGQgbGVhcm4gZGF0YSBhbmFseXNpcyBhbmQgZmlndXJlIG91dCB3YXlzIHRvIGFwcGx5IGl0IHRvIG90aGVyIHN5c3RlbXMuCkFuZCB5b3UgY291bGQgYmUgbWFraW5nIGEgc2l4LWZpZ3VyZSBzYWxhcnkgd2l0aGluIHRoZSBuZXh0IGZpdmUgeWVhcnMuKiIK4oCTIEJlbmphbWluIE1vdHosIFBoLkQuCgpUaGlzIHN5bGxhYnVzIGlzIHN1YmplY3QgdG8gY2hhbmdlLgpBbnkgY2hhbmdlcyB3aWxsIGJlIGRpc2N1c3NlZCBpbiBjbGFzcywgdmlhIGVtYWlsLCBhbmQvb3Igb24gSUNPTi4K