Study Guide: Data Mining and Data Types


1. Introduction to Data Mining

2. Data Mining Process

3. Data Mining Tasks

a. Classification

  • Definition: Predicting the class of unseen records based on known attributes.
  • Example: Predicting whether a consumer will buy a product based on demographic information.
  • Applications: Marketing, astronomy (e.g., classifying galaxies).

b. Regression

  • Definition: Predicting a continuous value rather than a class.
  • Example: Predicting deep adipose tissue based on height and weight.

c. Clustering

  • Definition: Grouping similar data points into clusters, separating distinct clusters.
  • Example: Document clustering, such as categorizing news articles by topic.

d. Association Rule Discovery

  • Definition: Discovering rules that show relationships between items in a dataset.
  • Example: Identifying that customers who buy diapers and milk are also likely to buy beer.

4. Understanding Data and Attributes

5. Types of Attributes

6. Types of Data Sets


Self-Test Questions

  1. Who is considered the founder of modern data mining?
  2. What distinguishes data mining from machine learning?
  3. Describe the difference between classification and regression tasks.
  4. What is the significance of clustering in data mining?
  5. Give an example of an association rule that might be discovered in a grocery store data set.
  6. Define what constitutes an object and an attribute in a data set.
  7. Differentiate between nominal and ordinal attributes.
  8. Explain the difference between interval and ratio attributes.
  9. What is transaction data and how does it differ from record data?
  10. Why is ordered data important in the context of sensor data?

Self - Test Answers:

  1. Founder of Modern Data Mining: Gregory Piatetsky-Shapiro He is a well-known data scientist and the founder of KDnuggets, a popular website and newsletter on data science and machine learning. Conduscted first workshops in 1980’s and 90’s.

    1. Piatetsky-Shapiro has made significant contributions to the field of data mining, including:

      1. Co-founding the KDD (Knowledge Discovery and Data Mining) conference series: This conference series is one of the most prestigious and influential in the field of data mining and knowledge discovery.

      2. Developing the concept of knowledge discovery in databases (KDD): Piatetsky-Shapiro’s work on KDD helped establish data mining as a distinct field of research and practice.

      3. Publishing numerous papers and books on data mining: His publications have helped shape the field of data mining and have been widely cited and influential.

  2. What distinguishes data mining from machine learning?

    • Data Mining: Focuses on discovering patterns, relationships, and insights from large datasets, often using automated methods. Data mining aims to extract valuable information or knowledge from data, usually without a specific prediction or decision-making goal in mind; It’s the process of discovering patterns and knowledge from large amounts of data. The data sources can include databases, data warehouses, the internet, etc
    • Machine Learning: Focuses on developing algorithms and models that enable computers to learn from data and make predictions or decisions. Machine learning is a key aspect of data mining, as it provides the tools and techniques for analyzing and interpreting data. Machine learning is a subset of artificial intelligence that involves the development of algorithms that allow computers to learn from and make predictions or decisions based on data.
    • While data mining is concerned with extracting patterns & insights from data, machine learning is concerned with using those insights to make predictions and/or decisions
  3. Classification vs. Regression Tasks:

    • Classification: Involves predicting a categorical label or class that an instance belongs to, based on its features. Classification tasks typically involve a fixed set of classes, and the goal is to assign each instance to one of those classes. Examples include spam vs. non-spam emails, cancer diagnosis (malignant vs. benign), and product recommendation (e.g., recommending a product based on user behavior).
    • Regression: Involves predicting a continuous value or numerical outcome based on the input features. Regression tasks aim to predict a specific value, such as a house price, stock price, or energy consumption.

    To illustrate the difference:

    • Classification: “Is this email spam or not?” ( categorical label)
    • Regression: “What is the predicted house price based on its features?” (continuous value)

    3. What is the significance of clustering in data mining?

    Clustering is a type of unsupervised learning technique in data mining that involves grouping similar instances or data points into clusters, based on their features. The significance of clustering lies in its ability to:

    • Identify patterns and structures: Clustering helps reveal hidden patterns and relationships in the data, which can be useful for understanding the underlying structure of the data.
    • Segment data: Clustering enables the segmentation of data into distinct groups, which can be useful for targeted marketing, customer profiling, or identifying outliers.
    • Anomaly detection: Clustering can help identify unusual or anomalous data points that do not fit into any cluster, which can be useful for detecting errors, fraud, or unusual behavior.
    • Data reduction: Clustering can reduce the dimensionality of the data by representing each cluster with a single point or centroid, making it easier to analyze and visualize the data.

    Overall, clustering is a powerful technique in data mining that can help uncover insights, identify patterns, and support decision-making.

  4. Significance of Clustering in Data Mining: Clustering is significant because it helps in identifying natural groupings within data. It is used to discover structure in data without having prior labels. This can be useful in market segmentation, social network analysis, organization of computing clusters, etc.

  5. Example of an Association Rule: In a grocery store dataset, an example of an association rule might be: “If a customer buys bread, they are 70% likely to also buy butter.” This rule helps in understanding customer buying patterns.

  6. Object and Attribute in a Data Set:

    • Object: An object is an entity that contains data. In a dataset, each row typically represents an object. For example, in a dataset of students, each student is an object.
    • Attribute: An attribute is a property, feature or characteristic of an object. In the student dataset, attributes might include name, age, grade, etc.
  7. Nominal vs. Ordinal Attributes:

    • Nominal Attributes: These are categorical attributes without any order. For example, colors like red, blue, green.
    • Ordinal Attributes: These are categorical attributes with a meaningful order but no fixed interval between them. For example, rankings like first, second, third.
  8. Interval vs. Ratio Attributes:

    • Interval Attributes: These have meaningful intervals between values but no true zero point. For example, temperature in Celsius.
    • Ratio Attributes: These have both meaningful intervals and a true zero point, allowing for the calculation of ratios. For example, weight or height.
  9. Transaction Data vs. Record Data:

    • Transaction Data: This refers to data that captures transactions, typically involving a time component and multiple items. For example, a sales transaction in a store.
    • Record Data: This is structured data where each record is a fixed set of fields. For example, a database table where each row is a record.
  10. Importance of Ordered Data in Sensor Data: Ordered data is crucial in sensor data because it often involves time-series data where the sequence of data points is important. This order can reveal trends, patterns, and anomalies over time, which are essential for monitoring and analysis in applications like weather forecasting, health monitoring, and industrial automation.

Version 2

Study Guide: Understanding Data Mining and Data Concepts

1. Introduction to Data Mining

  • Definition: Data mining is the non-trivial extraction of implicit, previously unknown, or useful information from large data sets.
  • Historical Background:
    • Foundations: Data mining is built upon three disciplines: Statistics, Artificial Intelligence (AI), and Machine Learning (ML).
    • Key Figure: John Tukey, considered a founder of modern data mining, contributed to data exploration, visualization, and pre-processing techniques.
    • Evolution: The term “data mining” emerged in the 1990s, and the field has grown with the rise of “data science,” a term coined to differentiate between research-focused roles and practical data analysis roles in companies.

2. Data Mining Processes and Tasks

  • Pipeline:
    1. Data Selection: Choosing relevant data for analysis.
    2. Pre-processing: Cleaning and preparing the data.
    3. Transformation: Converting data into a suitable format.
    4. Data Mining: Applying algorithms to extract patterns.
    5. Interpretation & Evaluation: Making the results understandable and actionable for humans.
  • Key Distinctions:
    • Data Mining vs. Machine Learning: Data mining focuses on making patterns interpretable by humans, while ML is more about automated analysis.
  • Categories of Data Mining Tasks:
    1. Prediction Tasks: Involves predicting unknown or future values (e.g., classification, regression).
    2. Descriptive Tasks: Focuses on making data human-interpretable (e.g., clustering, association rule discovery).

3. Examples of Data Mining Techniques

  • Classification:
    • Purpose: Predicting the class of previously unseen records.
    • Example: Predicting consumer behavior based on demographics or classifying galaxies by their formation stage.
  • Regression:
    • Purpose: Predicting a continuous value rather than a class.
    • Example: Estimating deep adipose tissue based on height and weight.
  • Clustering:
    • Purpose: Grouping similar data points into clusters.
    • Example: Document clustering for categorizing news articles into genres.
  • Association Rule Discovery:
    • Purpose: Finding rules that associate different attributes in a data set.
    • Example: Market basket analysis, like discovering that buying diapers is often associated with buying beer.

4. Understanding Data

  • Data Structure:
    • Objects and Attributes:
      • An object is a collection of attributes (e.g., a row in a table).
      • Attributes (also known as variables, fields, features) represent the properties of the data (e.g., columns in a table).
  • Terminology:
    • Object Synonyms: Records, points, samples, instances, cases, entities.
    • Attribute Synonyms: Variables, fields, characteristics, features.

5. Types of Attributes

  • Discrete Attributes:
    • Nominal: Distinct categories without order (e.g., eye color).
    • Ordinal: Categories with a specific order (e.g., movie ratings).
  • Continuous Attributes:
    • Interval: Ordered with equal intervals, no true zero (e.g., temperature in Celsius).
    • Ratio: Ordered with a true zero, supports multiplication (e.g., height).

6. Types of Data Sets

  • Record Data:
    • Structure: Data organized in rows and columns, similar to relational databases.
    • Transaction Data: A subset where not every column needs a value, akin to document-style databases.
  • Graph Data:
    • Structure: Data represented as nodes and edges, often used for relationships (e.g., hyperlinks on the web).
  • Sequential Data:
    • Structure: Data with a preserved order, often including timestamps (e.g., sensor data).

7. Self-Test Questions

  • Reflect on the differences between data mining tasks (e.g., classification vs. clustering) and the types of attributes (e.g., nominal vs. interval).
  • Consider examples of different data set types and how they are structured.

Self-Test Answers:

Reflecting on the differences between data mining tasks and types of attributes involves understanding how each task utilizes data attributes and how datasets are structured to facilitate these tasks.

Data Mining Tasks

  1. Classification:
    • Purpose: Assigns items to predefined categories or classes.
    • Attributes: Often involves nominal or ordinal attributes as the target variable (e.g., class labels like ‘spam’ or ‘not spam’).
    • Example: Email classification where the dataset includes attributes like email content, sender, and time, with the target attribute being the class label (spam/not spam).
  2. Clustering:
    • Purpose: Groups similar items together without predefined labels.
    • Attributes: Can involve any type of attribute, but often uses numerical (interval or ratio) attributes for calculating distances or similarities.
    • Example: Customer segmentation where the dataset includes attributes like purchase history, age, and location, and the goal is to group customers into segments based on similarity.

Types of Attributes

  1. Nominal Attributes:
    • Characteristics: Categorical with no inherent order.
    • Example: Colors (red, blue, green) or product categories (electronics, clothing, groceries).
  2. Ordinal Attributes:
    • Characteristics: Categorical with a meaningful order but no fixed interval.
    • Example: Customer satisfaction ratings (poor, fair, good, excellent).
  3. Interval Attributes:
    • Characteristics: Numerical with meaningful intervals but no true zero.
    • Example: Temperature in Celsius or Fahrenheit.
  4. Ratio Attributes:
    • Characteristics: Numerical with meaningful intervals and a true zero.
    • Example: Height, weight, or age.

Examples of Different Data Set Types

  1. Transactional Data Set:
    • Structure: Each record represents a transaction, often with a timestamp and multiple items.
    • Example: A retail sales dataset where each row includes transaction ID, date, items purchased, and total amount.
  2. Time-Series Data Set:
    • Structure: Ordered data points indexed by time.
    • Example: Stock prices dataset where each row includes date, opening price, closing price, and volume.
  3. Spatial Data Set:
    • Structure: Data with spatial attributes, often including coordinates.
    • Example: Geographic information system (GIS) data where each record includes location coordinates and attributes like elevation or land use type.
  4. Textual Data Set:
    • Structure: Unstructured or semi-structured data, often requiring preprocessing.
    • Example: A collection of documents or social media posts where each entry includes text content and metadata like author and timestamp.

Questions from Module 1 Asynch:

  1. If predicting from other customers, dividing up customers by potential profitability is:
    • Classification and regression (Correct)
    • Dividing up customers by potential profitability is Classification because it involves categorizing customers into groups based on their potential profitability and predicting categorical (classification) or continuous (regression) outcomes.
  2. Extracting frequency of sound is:
    • Not data mining (Correct)
    • Extracting frequency of sound is Not data mining because it is a signal processing task, not a data mining task.
  3. Finding someone’s adipose tissue measure from waist circumference is:
    • Regression (Correct)
    • Finding someone’s adipose tissue measure from waist circumference is Regression because it involves predicting a continuous value (adipose tissue measure) based on a single input (another variable) variable (waist circumference).
  4. Deciding if a person has diabetes based upon his or her history and diet is:
    • Classification (Correct)
    • Classification Task because it involves categorizing a person as either having diabetes or not. (presence or absence of).
  5. Depending on the methods used, deciding if someone will like a movie on Netflix given ratings of other users is:
    • Answers A through D (Correct)

      Deciding if someone will like a movie on Netflix given ratings of other users is Answers A through D because it can be approached using various methods, including Association (e.g., collaborative filtering), Classification (e.g., predicting a user’s rating), Clustering (e.g., grouping similar users), or Regression (e.g., predicting a user’s rating).

  6. Depending on the methods used, finding the genre of an online article based on the words in it is:
    • Classification or clustering (Correct)
    • Finding the genre of an online article based on the words in it is Classification or Clustering because it can be approached using either Classification (e.g., predicting a specific genre) or Clustering (e.g., grouping similar articles).
  7. Depending on the methods used, finding which Google searches are likely to follow one another is:
    • Classification or clustering (Correct)
    • It could involve classification (predicting the next search) or clustering (grouping similar searches).
  8. Is the brightness from a light meter interval or ratio?
    • Ratio (Correct)
    • Brightness from a light meter is Ratio because it has a true zero point (i.e., complete darkness) and can be measured in a continuous range.
  9. Is an angle measured from 0–360 degrees interval or ratio?
    • Could be either interval or ratio (Correct)
    • Depending on context, angles could be treated as interval (if there’s no meaningful zero) or ratio (if 0 degrees is absolute).
    • It can be treated as either an interval scale (e.g., when measuring angles between 0 and 360 degrees) or a ratio scale (e.g., when measuring angles in radians).
  10. Is the height above sea level interval or ratio?
    • Ratio (Correct)
    • Height above sea level has an absolute zero (sea level), and can be measured in a continuous range, making it a Ratio Measurement.
  11. Is military ranking ordinal, nominal, or binary?
    • Ordinal (Correct)
    • Military ranking is Ordinal because it represents a ranked /specific order (e.g., private, sergeant, lieutenant), but the differences between ranks are not necessarily equal.
  12. Is a coat check number ordinal, nominal, or binary?
    • Nominal (Correct)
    • A coat check number is a label with no inherent order or numerical value, making it nominal.
  13. Is time as a.m. or p.m. ordinal, nominal, or binary?
    • Binary (Correct)
    • Time as a.m. or p.m. is Binary because it represents a simple dichotomy (2 categories, i.e., morning or afternoon).
  14. Is the brightness, as given by a human, ordinal, nominal, or binary?
    • Ordinal (Correct)
    • Human-perceived brightness is Ordinal because it represents a subjective ranking (e.g., dim, medium, bright), but the differences between ranks are not necessarily equal.
  15. What best describes a database of movies and actors who played in them?
    • Either transaction or graph (Correct)
    • A database of movies and actors who played in them is Either transaction or graph because it can be represented as either a set of transactions (e.g., actor X played in movie Y) or a graph (e.g., actors connected to movies).
  16. What best describes a database of someone’s Amazon purchase history?
    • Either transaction or graph (Correct)
    • A database of someone’s Amazon purchase history is Either transaction or sequential because it can be represented as either a set of transactions (e.g., purchase X on date Y) or a sequence of purchases over time.
  17. What best describes a data set of people’s attributes with diabetes?
    • Record (Correct)
    • A data set of people’s attributes with diabetes is Record because it represents a collection of individual records or cases, each with various attributes (e.g., age, blood pressure, etc.).
  18. What best describes a database of your movements while sleeping, recorded each minute?
    • Sequential (Correct)
    • The data has a temporal sequence, making it sequential.
    • Sequential because it represents a sequence of measurements over time.

Think I’m good here. Set alert for weekly review and homework check every Wednesday at noon.

LS0tDQp0aXRsZTogIm1sIDczMzEgRmFsbCAyMDI0IFNNVTogTW9kdWxlIDEiDQphdXRob3I6ICJKZXNzaSBNY1BoYXVsOyA4LTI4LTI0Ig0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KIyMjIFN0dWR5IEd1aWRlOiBEYXRhIE1pbmluZyBhbmQgRGF0YSBUeXBlcw0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyMjICoqMS4gSW50cm9kdWN0aW9uIHRvIERhdGEgTWluaW5nKioNCg0KLSAgICoqRGF0YSBNaW5pbmcqKjogVGhlIHByb2Nlc3Mgb2YgZXh0cmFjdGluZyBpbXBsaWNpdCwgcHJldmlvdXNseSB1bmtub3duLCBvciB1c2VmdWwgaW5mb3JtYXRpb24gZnJvbSBsYXJnZSBkYXRhIHNldHMuDQotICAgKipPcmlnaW5zKio6DQogICAgLSAgICoqSm9obiBUdWtleSoqOiBBIGtleSBmaWd1cmUgaW4gZGF0YSBtaW5pbmcsIGZhbW91cyBmb3IgY29pbmluZyB0aGUgdGVybSAiYml0IiBhbmQgY28taW52ZW50aW5nIHRoZSBGYXN0IEZvdXJpZXIgVHJhbnNmb3JtLiBIaXMgd29yayBsYWlkIHRoZSBmb3VuZGF0aW9uIGZvciBtb2Rlcm4gZGF0YSBtaW5pbmcsIHBhcnRpY3VsYXJseSBpbiBkYXRhIGV4cGxvcmF0aW9uIGFuZCB2aXN1YWxpemF0aW9uLg0KICAgIC0gICAqKkdyZWdvcnkgUGlhdGV0c2t5LVNoYXBpcm8qKjogU3RhcnRlZCB0aGUgS25vd2xlZGdlIERpc2NvdmVyeSBpbiBEYXRhYmFzZXMgd29ya3Nob3AgaW4gdGhlIDE5OTBzLCB3aGljaCBiZWNhbWUgZm91bmRhdGlvbmFsIGZvciBtb2Rlcm4gZGF0YSBtaW5pbmcuDQogICAgLSAgICoqRGF0YSBTY2llbmNlKio6IEV2b2x2ZWQgZnJvbSB0aGUgbmVlZCBmb3IgY29tcGFuaWVzIHRvIGhpcmUgcmVzZWFyY2ggc2NpZW50aXN0cyB3aXRob3V0IHRoZSAicmVzZWFyY2giIGJhZ2dhZ2UsIGZvY3VzaW5nIG9uIGFuYWx5emluZyBkYXRhIHJhdGhlciB0aGFuIGFjYWRlbWljIHJlc2VhcmNoLg0KDQojIyMgKioyLiBEYXRhIE1pbmluZyBQcm9jZXNzKioNCg0KLSAgICoqUGlwZWxpbmUqKjoNCiAgICAxLiAgKipEYXRhIFNlbGVjdGlvbioqOiBJZGVudGlmeWluZyB0aGUgcmVsZXZhbnQgZGF0YS4NCiAgICAyLiAgKipEYXRhIFByZXByb2Nlc3NpbmcqKjogQ2xlYW5pbmcgYW5kIG9yZ2FuaXppbmcgdGhlIGRhdGEuDQogICAgMy4gICoqRGF0YSBUcmFuc2Zvcm1hdGlvbioqOiBDb252ZXJ0aW5nIGRhdGEgaW50byBhIHN1aXRhYmxlIGZvcm1hdCBmb3IgbWluaW5nLg0KICAgIDQuICAqKkFwcGxpY2F0aW9uIG9mIEFsZ29yaXRobXMqKjogSW1wbGVtZW50aW5nIGRhdGEgbWluaW5nIHRlY2huaXF1ZXMuDQogICAgNS4gICoqSW50ZXJwcmV0YXRpb24gYW5kIEV2YWx1YXRpb24qKjogQW5hbHl6aW5nIGFuZCBldmFsdWF0aW5nIHRoZSByZXN1bHRzLCBkaWZmZXJlbnRpYXRpbmcgZGF0YSBtaW5pbmcgZnJvbSBtYWNoaW5lIGxlYXJuaW5nIGJ5IG1ha2luZyBkYXRhIGludGVycHJldGFibGUgYnkgaHVtYW5zLg0KDQojIyMgKiozLiBEYXRhIE1pbmluZyBUYXNrcyoqDQoNCi0gICAqKkNhdGVnb3JpZXMqKjoNCiAgICAtICAgKipQcmVkaWN0aW9uIFRhc2tzKio6IFByZWRpY3RpbmcgdW5rbm93biBvciBmdXR1cmUgdmFsdWVzIChlLmcuLCBjbGFzc2lmaWNhdGlvbiwgcmVncmVzc2lvbiwgb3V0bGllciBkZXRlY3Rpb24pLg0KICAgIC0gICAqKkRlc2NyaXB0aXZlIFRhc2tzKio6IE1ha2luZyBkYXRhIGh1bWFuLWludGVycHJldGFibGUgKGUuZy4sIGNsdXN0ZXJpbmcsIGFzc29jaWF0aW9uIHJ1bGUgZGlzY292ZXJ5LCBzZXF1ZW50aWFsIHBhdHRlcm4gZGlzY292ZXJ5KS4NCg0KIyMjIyAqKmEuIENsYXNzaWZpY2F0aW9uKioNCg0KLSAgICoqRGVmaW5pdGlvbioqOiBQcmVkaWN0aW5nIHRoZSBjbGFzcyBvZiB1bnNlZW4gcmVjb3JkcyBiYXNlZCBvbiBrbm93biBhdHRyaWJ1dGVzLg0KLSAgICoqRXhhbXBsZSoqOiBQcmVkaWN0aW5nIHdoZXRoZXIgYSBjb25zdW1lciB3aWxsIGJ1eSBhIHByb2R1Y3QgYmFzZWQgb24gZGVtb2dyYXBoaWMgaW5mb3JtYXRpb24uDQotICAgKipBcHBsaWNhdGlvbnMqKjogTWFya2V0aW5nLCBhc3Ryb25vbXkgKGUuZy4sIGNsYXNzaWZ5aW5nIGdhbGF4aWVzKS4NCg0KIyMjIyAqKmIuIFJlZ3Jlc3Npb24qKg0KDQotICAgKipEZWZpbml0aW9uKio6IFByZWRpY3RpbmcgYSBjb250aW51b3VzIHZhbHVlIHJhdGhlciB0aGFuIGEgY2xhc3MuDQotICAgKipFeGFtcGxlKio6IFByZWRpY3RpbmcgZGVlcCBhZGlwb3NlIHRpc3N1ZSBiYXNlZCBvbiBoZWlnaHQgYW5kIHdlaWdodC4NCg0KIyMjIyAqKmMuIENsdXN0ZXJpbmcqKg0KDQotICAgKipEZWZpbml0aW9uKio6IEdyb3VwaW5nIHNpbWlsYXIgZGF0YSBwb2ludHMgaW50byBjbHVzdGVycywgc2VwYXJhdGluZyBkaXN0aW5jdCBjbHVzdGVycy4NCi0gICAqKkV4YW1wbGUqKjogRG9jdW1lbnQgY2x1c3RlcmluZywgc3VjaCBhcyBjYXRlZ29yaXppbmcgbmV3cyBhcnRpY2xlcyBieSB0b3BpYy4NCg0KIyMjIyAqKmQuIEFzc29jaWF0aW9uIFJ1bGUgRGlzY292ZXJ5KioNCg0KLSAgICoqRGVmaW5pdGlvbioqOiBEaXNjb3ZlcmluZyBydWxlcyB0aGF0IHNob3cgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIGl0ZW1zIGluIGEgZGF0YXNldC4NCi0gICAqKkV4YW1wbGUqKjogSWRlbnRpZnlpbmcgdGhhdCBjdXN0b21lcnMgd2hvIGJ1eSBkaWFwZXJzIGFuZCBtaWxrIGFyZSBhbHNvIGxpa2VseSB0byBidXkgYmVlci4NCg0KIyMjICoqNC4gVW5kZXJzdGFuZGluZyBEYXRhIGFuZCBBdHRyaWJ1dGVzKioNCg0KLSAgICoqRGF0YSBTdHJ1Y3R1cmUqKjoNCiAgICAtICAgKipPYmplY3QqKjogQSBjb2xsZWN0aW9uIG9mIGRhdGEgKHJvd3MgaW4gYSB0YWJsZSkuDQogICAgLSAgICoqQXR0cmlidXRlcyoqOiBQcm9wZXJ0aWVzIG9mIHRoZSBkYXRhIChjb2x1bW5zIGluIGEgdGFibGUpLg0KLSAgICoqQXR0cmlidXRlIFRlcm1pbm9sb2d5Kio6DQogICAgLSAgICoqQXR0cmlidXRlcyoqOiBBbHNvIGtub3duIGFzIHZhcmlhYmxlcywgZmllbGRzLCBjaGFyYWN0ZXJpc3RpY3MsIG9yIGZlYXR1cmVzLg0KICAgIC0gICAqKk9iamVjdHMqKjogQWxzbyByZWZlcnJlZCB0byBhcyByZWNvcmRzLCBwb2ludHMsIHNhbXBsZXMsIGluc3RhbmNlcywgY2FzZXMsIG9yIGVudGl0aWVzLg0KDQojIyMgKio1LiBUeXBlcyBvZiBBdHRyaWJ1dGVzKioNCg0KLSAgICoqQ2F0ZWdvcmllcyoqOg0KICAgIC0gICAqKkRpc2NyZXRlIEF0dHJpYnV0ZXMqKjogTm9taW5hbCBhbmQgb3JkaW5hbC4NCiAgICAgICAgLSAgICoqTm9taW5hbCoqOiBEaXN0aW5jdCBjYXRlZ29yaWVzIHdpdGggbm8gb3JkZXIgKGUuZy4sIGV5ZSBjb2xvcikuDQogICAgICAgIC0gICAqKk9yZGluYWwqKjogT3JkZXJlZCBjYXRlZ29yaWVzIChlLmcuLCBtb3ZpZSByYXRpbmdzKS4NCiAgICAtICAgKipDb250aW51b3VzIEF0dHJpYnV0ZXMqKjogSW50ZXJ2YWwgYW5kIHJhdGlvLg0KICAgICAgICAtICAgKipJbnRlcnZhbCoqOiBPcmRlcmVkIHdpdGggZXF1YWwgaW50ZXJ2YWxzIGJ1dCBubyB0cnVlIHplcm8gKGUuZy4sIHRlbXBlcmF0dXJlIGluIENlbHNpdXMpLg0KICAgICAgICAtICAgKipSYXRpbyoqOiBPcmRlcmVkIHdpdGggYSB0cnVlIHplcm8gKGUuZy4sIHRlbXBlcmF0dXJlIGluIEtlbHZpbikuDQotICAgKipUcmFuc2Zvcm1hdGlvbnMqKjoNCiAgICAtICAgKipOb21pbmFsKio6IEFueSBwZXJtdXRhdGlvbiBpcyB2YWxpZC4NCiAgICAtICAgKipPcmRpbmFsKio6IE1vbm90b25pYyB0cmFuc2Zvcm1hdGlvbnMgYXJlIHZhbGlkLg0KICAgIC0gICAqKkludGVydmFsKio6IExpbmVhciB0cmFuc2Zvcm1hdGlvbnMgYXJlIHZhbGlkIChlLmcuLCBDZWxzaXVzIHRvIEZhaHJlbmhlaXQpLg0KICAgIC0gICAqKlJhdGlvKio6IE9ubHkgbXVsdGlwbGljYXRpb24gYnkgYSBjb25zdGFudCBpcyB2YWxpZC4NCg0KIyMjICoqNi4gVHlwZXMgb2YgRGF0YSBTZXRzKioNCg0KLSAgICoqUmVjb3JkIERhdGEqKjogRGF0YSByZXByZXNlbnRlZCBpbiBhIHRhYmxlIGZvcm1hdCAoZS5nLiwgcmVsYXRpb25hbCBkYXRhYmFzZXMpLg0KLSAgICoqVHJhbnNhY3Rpb24gRGF0YSoqOiBBIHN1YnNldCBvZiByZWNvcmQgZGF0YSB3aGVyZSBub3QgZXZlcnkgY29sdW1uIG5lZWRzIGEgdmFsdWUsIHJlc2VtYmxpbmcgZG9jdW1lbnQtc3R5bGUgZGF0YWJhc2VzLg0KLSAgICoqR3JhcGggRGF0YSoqOiBSZXByZXNlbnRzIGRhdGEgcG9pbnRzIGFuZCB0aGVpciByZWxhdGlvbnNoaXBzIChlLmcuLCBoeXBlcmxpbmtzIG9uIHRoZSB3ZWIpLg0KLSAgICoqT3JkZXJlZCBEYXRhKio6IFByZXNlcnZlcyB0aGUgdGVtcG9yYWwgb3Igc2VxdWVudGlhbCBuYXR1cmUgb2YgZGF0YSAoZS5nLiwgc2Vuc29yIGRhdGEgd2l0aCB0aW1lc3RhbXBzKS4NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMjIyAqKlNlbGYtVGVzdCBRdWVzdGlvbnMqKg0KDQoxLiAgV2hvIGlzIGNvbnNpZGVyZWQgdGhlIGZvdW5kZXIgb2YgbW9kZXJuIGRhdGEgbWluaW5nPw0KMi4gIFdoYXQgZGlzdGluZ3Vpc2hlcyBkYXRhIG1pbmluZyBmcm9tIG1hY2hpbmUgbGVhcm5pbmc/DQozLiAgRGVzY3JpYmUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBjbGFzc2lmaWNhdGlvbiBhbmQgcmVncmVzc2lvbiB0YXNrcy4NCjQuICBXaGF0IGlzIHRoZSBzaWduaWZpY2FuY2Ugb2YgY2x1c3RlcmluZyBpbiBkYXRhIG1pbmluZz8NCjUuICBHaXZlIGFuIGV4YW1wbGUgb2YgYW4gYXNzb2NpYXRpb24gcnVsZSB0aGF0IG1pZ2h0IGJlIGRpc2NvdmVyZWQgaW4gYSBncm9jZXJ5IHN0b3JlIGRhdGEgc2V0Lg0KNi4gIERlZmluZSB3aGF0IGNvbnN0aXR1dGVzIGFuIG9iamVjdCBhbmQgYW4gYXR0cmlidXRlIGluIGEgZGF0YSBzZXQuDQo3LiAgRGlmZmVyZW50aWF0ZSBiZXR3ZWVuIG5vbWluYWwgYW5kIG9yZGluYWwgYXR0cmlidXRlcy4NCjguICBFeHBsYWluIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gaW50ZXJ2YWwgYW5kIHJhdGlvIGF0dHJpYnV0ZXMuDQo5LiAgV2hhdCBpcyB0cmFuc2FjdGlvbiBkYXRhIGFuZCBob3cgZG9lcyBpdCBkaWZmZXIgZnJvbSByZWNvcmQgZGF0YT8NCjEwLiBXaHkgaXMgb3JkZXJlZCBkYXRhIGltcG9ydGFudCBpbiB0aGUgY29udGV4dCBvZiBzZW5zb3IgZGF0YT8NCg0KIyMgU2VsZiAtIFRlc3QgQW5zd2VyczoNCg0KMS4gICoqRm91bmRlciBvZiBNb2Rlcm4gRGF0YSBNaW5pbmcqKjogR3JlZ29yeSBQaWF0ZXRza3ktU2hhcGlybyBIZSBpcyBhIHdlbGwta25vd24gZGF0YSBzY2llbnRpc3QgYW5kIHRoZSBmb3VuZGVyIG9mIEtEbnVnZ2V0cywgYSBwb3B1bGFyIHdlYnNpdGUgYW5kIG5ld3NsZXR0ZXIgb24gZGF0YSBzY2llbmNlIGFuZCBtYWNoaW5lIGxlYXJuaW5nLiBDb25kdXNjdGVkIGZpcnN0IHdvcmtzaG9wcyBpbiAxOTgwJ3MgYW5kIDkwJ3MuDQoNCiAgICAxLiAgUGlhdGV0c2t5LVNoYXBpcm8gaGFzIG1hZGUgc2lnbmlmaWNhbnQgY29udHJpYnV0aW9ucyB0byB0aGUgZmllbGQgb2YgZGF0YSBtaW5pbmcsIGluY2x1ZGluZzoNCg0KICAgICAgICAxLiAgKipDby1mb3VuZGluZyB0aGUgS0REIChLbm93bGVkZ2UgRGlzY292ZXJ5IGFuZCBEYXRhIE1pbmluZykgY29uZmVyZW5jZSBzZXJpZXMqKjogVGhpcyBjb25mZXJlbmNlIHNlcmllcyBpcyBvbmUgb2YgdGhlIG1vc3QgcHJlc3RpZ2lvdXMgYW5kIGluZmx1ZW50aWFsIGluIHRoZSBmaWVsZCBvZiBkYXRhIG1pbmluZyBhbmQga25vd2xlZGdlIGRpc2NvdmVyeS4NCg0KICAgICAgICAyLiAgKipEZXZlbG9waW5nIHRoZSBjb25jZXB0IG9mIGtub3dsZWRnZSBkaXNjb3ZlcnkgaW4gZGF0YWJhc2VzIChLREQpKio6IFBpYXRldHNreS1TaGFwaXJvJ3Mgd29yayBvbiBLREQgaGVscGVkIGVzdGFibGlzaCBkYXRhIG1pbmluZyBhcyBhIGRpc3RpbmN0IGZpZWxkIG9mIHJlc2VhcmNoIGFuZCBwcmFjdGljZS4NCg0KICAgICAgICAzLiAgKipQdWJsaXNoaW5nIG51bWVyb3VzIHBhcGVycyBhbmQgYm9va3Mgb24gZGF0YSBtaW5pbmcqKjogSGlzIHB1YmxpY2F0aW9ucyBoYXZlIGhlbHBlZCBzaGFwZSB0aGUgZmllbGQgb2YgZGF0YSBtaW5pbmcgYW5kIGhhdmUgYmVlbiB3aWRlbHkgY2l0ZWQgYW5kIGluZmx1ZW50aWFsLg0KDQoyLiAgKipXaGF0IGRpc3Rpbmd1aXNoZXMgZGF0YSBtaW5pbmcgZnJvbSBtYWNoaW5lIGxlYXJuaW5nPyoqDQoNCiAgICAtICAgKipEYXRhIE1pbmluZyoqOiBGb2N1c2VzIG9uIGRpc2NvdmVyaW5nIHBhdHRlcm5zLCByZWxhdGlvbnNoaXBzLCBhbmQgaW5zaWdodHMgZnJvbSBsYXJnZSBkYXRhc2V0cywgb2Z0ZW4gdXNpbmcgYXV0b21hdGVkIG1ldGhvZHMuIERhdGEgbWluaW5nIGFpbXMgdG8gZXh0cmFjdCB2YWx1YWJsZSBpbmZvcm1hdGlvbiBvciBrbm93bGVkZ2UgZnJvbSBkYXRhLCB1c3VhbGx5IHdpdGhvdXQgYSBzcGVjaWZpYyBwcmVkaWN0aW9uIG9yIGRlY2lzaW9uLW1ha2luZyBnb2FsIGluIG1pbmQ7IEl0J3MgdGhlIHByb2Nlc3Mgb2YgZGlzY292ZXJpbmcgcGF0dGVybnMgYW5kIGtub3dsZWRnZSBmcm9tIGxhcmdlIGFtb3VudHMgb2YgZGF0YS4gVGhlIGRhdGEgc291cmNlcyBjYW4gaW5jbHVkZSBkYXRhYmFzZXMsIGRhdGEgd2FyZWhvdXNlcywgdGhlIGludGVybmV0LCBldGMNCiAgICAtICAgKipNYWNoaW5lIExlYXJuaW5nKio6IEZvY3VzZXMgb24gZGV2ZWxvcGluZyBhbGdvcml0aG1zIGFuZCBtb2RlbHMgdGhhdCBlbmFibGUgY29tcHV0ZXJzIHRvIGxlYXJuIGZyb20gZGF0YSBhbmQgbWFrZSBwcmVkaWN0aW9ucyBvciBkZWNpc2lvbnMuIE1hY2hpbmUgbGVhcm5pbmcgaXMgYSBrZXkgYXNwZWN0IG9mIGRhdGEgbWluaW5nLCBhcyBpdCBwcm92aWRlcyB0aGUgdG9vbHMgYW5kIHRlY2huaXF1ZXMgZm9yIGFuYWx5emluZyBhbmQgaW50ZXJwcmV0aW5nIGRhdGEuIE1hY2hpbmUgbGVhcm5pbmcgaXMgYSBzdWJzZXQgb2YgYXJ0aWZpY2lhbCBpbnRlbGxpZ2VuY2UgdGhhdCBpbnZvbHZlcyB0aGUgZGV2ZWxvcG1lbnQgb2YgYWxnb3JpdGhtcyB0aGF0IGFsbG93IGNvbXB1dGVycyB0byBsZWFybiBmcm9tIGFuZCBtYWtlIHByZWRpY3Rpb25zIG9yIGRlY2lzaW9ucyBiYXNlZCBvbiBkYXRhLg0KICAgIC0gICBXaGlsZSBkYXRhIG1pbmluZyBpcyBjb25jZXJuZWQgd2l0aCBleHRyYWN0aW5nIHBhdHRlcm5zICYgaW5zaWdodHMgZnJvbSBkYXRhLCBtYWNoaW5lIGxlYXJuaW5nIGlzIGNvbmNlcm5lZCB3aXRoIHVzaW5nIHRob3NlIGluc2lnaHRzIHRvIG1ha2UgcHJlZGljdGlvbnMgYW5kL29yIGRlY2lzaW9ucw0KDQozLiAgKipDbGFzc2lmaWNhdGlvbiB2cy4gUmVncmVzc2lvbiBUYXNrcyoqOg0KDQogICAgLSAgICoqQ2xhc3NpZmljYXRpb24qKjogSW52b2x2ZXMgcHJlZGljdGluZyBhIGNhdGVnb3JpY2FsIGxhYmVsIG9yIGNsYXNzIHRoYXQgYW4gaW5zdGFuY2UgYmVsb25ncyB0bywgYmFzZWQgb24gaXRzIGZlYXR1cmVzLiBDbGFzc2lmaWNhdGlvbiB0YXNrcyB0eXBpY2FsbHkgaW52b2x2ZSBhIGZpeGVkIHNldCBvZiBjbGFzc2VzLCBhbmQgdGhlIGdvYWwgaXMgdG8gYXNzaWduIGVhY2ggaW5zdGFuY2UgdG8gb25lIG9mIHRob3NlIGNsYXNzZXMuIEV4YW1wbGVzIGluY2x1ZGUgc3BhbSB2cy4gbm9uLXNwYW0gZW1haWxzLCBjYW5jZXIgZGlhZ25vc2lzIChtYWxpZ25hbnQgdnMuIGJlbmlnbiksIGFuZCBwcm9kdWN0IHJlY29tbWVuZGF0aW9uIChlLmcuLCByZWNvbW1lbmRpbmcgYSBwcm9kdWN0IGJhc2VkIG9uIHVzZXIgYmVoYXZpb3IpLg0KICAgIC0gICAqKlJlZ3Jlc3Npb24qKjogSW52b2x2ZXMgcHJlZGljdGluZyBhIGNvbnRpbnVvdXMgdmFsdWUgb3IgbnVtZXJpY2FsIG91dGNvbWUgYmFzZWQgb24gdGhlIGlucHV0IGZlYXR1cmVzLiBSZWdyZXNzaW9uIHRhc2tzIGFpbSB0byBwcmVkaWN0IGEgc3BlY2lmaWMgdmFsdWUsIHN1Y2ggYXMgYSBob3VzZSBwcmljZSwgc3RvY2sgcHJpY2UsIG9yIGVuZXJneSBjb25zdW1wdGlvbi4NCg0KICAgIFRvIGlsbHVzdHJhdGUgdGhlIGRpZmZlcmVuY2U6DQoNCiAgICAtICAgQ2xhc3NpZmljYXRpb246ICJJcyB0aGlzIGVtYWlsIHNwYW0gb3Igbm90PyIgKCBjYXRlZ29yaWNhbCBsYWJlbCkNCiAgICAtICAgUmVncmVzc2lvbjogIldoYXQgaXMgdGhlIHByZWRpY3RlZCBob3VzZSBwcmljZSBiYXNlZCBvbiBpdHMgZmVhdHVyZXM/IiAoY29udGludW91cyB2YWx1ZSkNCg0KICAgICoqMy4gV2hhdCBpcyB0aGUgc2lnbmlmaWNhbmNlIG9mIGNsdXN0ZXJpbmcgaW4gZGF0YSBtaW5pbmc/KioNCg0KICAgIENsdXN0ZXJpbmcgaXMgYSB0eXBlIG9mIHVuc3VwZXJ2aXNlZCBsZWFybmluZyB0ZWNobmlxdWUgaW4gZGF0YSBtaW5pbmcgdGhhdCBpbnZvbHZlcyBncm91cGluZyBzaW1pbGFyIGluc3RhbmNlcyBvciBkYXRhIHBvaW50cyBpbnRvIGNsdXN0ZXJzLCBiYXNlZCBvbiB0aGVpciBmZWF0dXJlcy4gVGhlIHNpZ25pZmljYW5jZSBvZiBjbHVzdGVyaW5nIGxpZXMgaW4gaXRzIGFiaWxpdHkgdG86DQoNCiAgICAtICAgKipJZGVudGlmeSBwYXR0ZXJucyBhbmQgc3RydWN0dXJlcyoqOiBDbHVzdGVyaW5nIGhlbHBzIHJldmVhbCBoaWRkZW4gcGF0dGVybnMgYW5kIHJlbGF0aW9uc2hpcHMgaW4gdGhlIGRhdGEsIHdoaWNoIGNhbiBiZSB1c2VmdWwgZm9yIHVuZGVyc3RhbmRpbmcgdGhlIHVuZGVybHlpbmcgc3RydWN0dXJlIG9mIHRoZSBkYXRhLg0KICAgIC0gICAqKlNlZ21lbnQgZGF0YSoqOiBDbHVzdGVyaW5nIGVuYWJsZXMgdGhlIHNlZ21lbnRhdGlvbiBvZiBkYXRhIGludG8gZGlzdGluY3QgZ3JvdXBzLCB3aGljaCBjYW4gYmUgdXNlZnVsIGZvciB0YXJnZXRlZCBtYXJrZXRpbmcsIGN1c3RvbWVyIHByb2ZpbGluZywgb3IgaWRlbnRpZnlpbmcgb3V0bGllcnMuDQogICAgLSAgICoqQW5vbWFseSBkZXRlY3Rpb24qKjogQ2x1c3RlcmluZyBjYW4gaGVscCBpZGVudGlmeSB1bnVzdWFsIG9yIGFub21hbG91cyBkYXRhIHBvaW50cyB0aGF0IGRvIG5vdCBmaXQgaW50byBhbnkgY2x1c3Rlciwgd2hpY2ggY2FuIGJlIHVzZWZ1bCBmb3IgZGV0ZWN0aW5nIGVycm9ycywgZnJhdWQsIG9yIHVudXN1YWwgYmVoYXZpb3IuDQogICAgLSAgICoqRGF0YSByZWR1Y3Rpb24qKjogQ2x1c3RlcmluZyBjYW4gcmVkdWNlIHRoZSBkaW1lbnNpb25hbGl0eSBvZiB0aGUgZGF0YSBieSByZXByZXNlbnRpbmcgZWFjaCBjbHVzdGVyIHdpdGggYSBzaW5nbGUgcG9pbnQgb3IgY2VudHJvaWQsIG1ha2luZyBpdCBlYXNpZXIgdG8gYW5hbHl6ZSBhbmQgdmlzdWFsaXplIHRoZSBkYXRhLg0KDQogICAgT3ZlcmFsbCwgY2x1c3RlcmluZyBpcyBhIHBvd2VyZnVsIHRlY2huaXF1ZSBpbiBkYXRhIG1pbmluZyB0aGF0IGNhbiBoZWxwIHVuY292ZXIgaW5zaWdodHMsIGlkZW50aWZ5IHBhdHRlcm5zLCBhbmQgc3VwcG9ydCBkZWNpc2lvbi1tYWtpbmcuDQoNCjQuICAqKlNpZ25pZmljYW5jZSBvZiBDbHVzdGVyaW5nIGluIERhdGEgTWluaW5nKio6IENsdXN0ZXJpbmcgaXMgc2lnbmlmaWNhbnQgYmVjYXVzZSBpdCBoZWxwcyBpbiBpZGVudGlmeWluZyBuYXR1cmFsIGdyb3VwaW5ncyB3aXRoaW4gZGF0YS4gSXQgaXMgdXNlZCB0byBkaXNjb3ZlciBzdHJ1Y3R1cmUgaW4gZGF0YSB3aXRob3V0IGhhdmluZyBwcmlvciBsYWJlbHMuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpbiBtYXJrZXQgc2VnbWVudGF0aW9uLCBzb2NpYWwgbmV0d29yayBhbmFseXNpcywgb3JnYW5pemF0aW9uIG9mIGNvbXB1dGluZyBjbHVzdGVycywgZXRjLg0KDQo1LiAgKipFeGFtcGxlIG9mIGFuIEFzc29jaWF0aW9uIFJ1bGUqKjogSW4gYSBncm9jZXJ5IHN0b3JlIGRhdGFzZXQsIGFuIGV4YW1wbGUgb2YgYW4gYXNzb2NpYXRpb24gcnVsZSBtaWdodCBiZTogIklmIGEgY3VzdG9tZXIgYnV5cyBicmVhZCwgdGhleSBhcmUgNzAlIGxpa2VseSB0byBhbHNvIGJ1eSBidXR0ZXIuIiBUaGlzIHJ1bGUgaGVscHMgaW4gdW5kZXJzdGFuZGluZyBjdXN0b21lciBidXlpbmcgcGF0dGVybnMuDQoNCjYuICAqKk9iamVjdCBhbmQgQXR0cmlidXRlIGluIGEgRGF0YSBTZXQqKjoNCg0KICAgIC0gICAqKk9iamVjdCoqOiBBbiBvYmplY3QgaXMgYW4gZW50aXR5IHRoYXQgY29udGFpbnMgZGF0YS4gSW4gYSBkYXRhc2V0LCBlYWNoIHJvdyB0eXBpY2FsbHkgcmVwcmVzZW50cyBhbiBvYmplY3QuIEZvciBleGFtcGxlLCBpbiBhIGRhdGFzZXQgb2Ygc3R1ZGVudHMsIGVhY2ggc3R1ZGVudCBpcyBhbiBvYmplY3QuDQogICAgLSAgICoqQXR0cmlidXRlKio6IEFuIGF0dHJpYnV0ZSBpcyBhIHByb3BlcnR5LCBmZWF0dXJlIG9yIGNoYXJhY3RlcmlzdGljIG9mIGFuIG9iamVjdC4gSW4gdGhlIHN0dWRlbnQgZGF0YXNldCwgYXR0cmlidXRlcyBtaWdodCBpbmNsdWRlIG5hbWUsIGFnZSwgZ3JhZGUsIGV0Yy4NCg0KNy4gICoqTm9taW5hbCB2cy4gT3JkaW5hbCBBdHRyaWJ1dGVzKio6DQoNCiAgICAtICAgKipOb21pbmFsIEF0dHJpYnV0ZXMqKjogVGhlc2UgYXJlIGNhdGVnb3JpY2FsIGF0dHJpYnV0ZXMgd2l0aG91dCBhbnkgb3JkZXIuIEZvciBleGFtcGxlLCBjb2xvcnMgbGlrZSByZWQsIGJsdWUsIGdyZWVuLg0KICAgIC0gICAqKk9yZGluYWwgQXR0cmlidXRlcyoqOiBUaGVzZSBhcmUgY2F0ZWdvcmljYWwgYXR0cmlidXRlcyB3aXRoIGEgbWVhbmluZ2Z1bCBvcmRlciBidXQgbm8gZml4ZWQgaW50ZXJ2YWwgYmV0d2VlbiB0aGVtLiBGb3IgZXhhbXBsZSwgcmFua2luZ3MgbGlrZSBmaXJzdCwgc2Vjb25kLCB0aGlyZC4NCg0KOC4gICoqSW50ZXJ2YWwgdnMuIFJhdGlvIEF0dHJpYnV0ZXMqKjoNCg0KICAgIC0gICAqKkludGVydmFsIEF0dHJpYnV0ZXMqKjogVGhlc2UgaGF2ZSBtZWFuaW5nZnVsIGludGVydmFscyBiZXR3ZWVuIHZhbHVlcyBidXQgbm8gdHJ1ZSB6ZXJvIHBvaW50LiBGb3IgZXhhbXBsZSwgdGVtcGVyYXR1cmUgaW4gQ2Vsc2l1cy4NCiAgICAtICAgKipSYXRpbyBBdHRyaWJ1dGVzKio6IFRoZXNlIGhhdmUgYm90aCBtZWFuaW5nZnVsIGludGVydmFscyBhbmQgYSB0cnVlIHplcm8gcG9pbnQsIGFsbG93aW5nIGZvciB0aGUgY2FsY3VsYXRpb24gb2YgcmF0aW9zLiBGb3IgZXhhbXBsZSwgd2VpZ2h0IG9yIGhlaWdodC4NCg0KOS4gICoqVHJhbnNhY3Rpb24gRGF0YSB2cy4gUmVjb3JkIERhdGEqKjoNCg0KICAgIC0gICAqKlRyYW5zYWN0aW9uIERhdGEqKjogVGhpcyByZWZlcnMgdG8gZGF0YSB0aGF0IGNhcHR1cmVzIHRyYW5zYWN0aW9ucywgdHlwaWNhbGx5IGludm9sdmluZyBhIHRpbWUgY29tcG9uZW50IGFuZCBtdWx0aXBsZSBpdGVtcy4gRm9yIGV4YW1wbGUsIGEgc2FsZXMgdHJhbnNhY3Rpb24gaW4gYSBzdG9yZS4NCiAgICAtICAgKipSZWNvcmQgRGF0YSoqOiBUaGlzIGlzIHN0cnVjdHVyZWQgZGF0YSB3aGVyZSBlYWNoIHJlY29yZCBpcyBhIGZpeGVkIHNldCBvZiBmaWVsZHMuIEZvciBleGFtcGxlLCBhIGRhdGFiYXNlIHRhYmxlIHdoZXJlIGVhY2ggcm93IGlzIGEgcmVjb3JkLg0KDQoxMC4gKipJbXBvcnRhbmNlIG9mIE9yZGVyZWQgRGF0YSBpbiBTZW5zb3IgRGF0YSoqOiBPcmRlcmVkIGRhdGEgaXMgY3J1Y2lhbCBpbiBzZW5zb3IgZGF0YSBiZWNhdXNlIGl0IG9mdGVuIGludm9sdmVzIHRpbWUtc2VyaWVzIGRhdGEgd2hlcmUgdGhlIHNlcXVlbmNlIG9mIGRhdGEgcG9pbnRzIGlzIGltcG9ydGFudC4gVGhpcyBvcmRlciBjYW4gcmV2ZWFsIHRyZW5kcywgcGF0dGVybnMsIGFuZCBhbm9tYWxpZXMgb3ZlciB0aW1lLCB3aGljaCBhcmUgZXNzZW50aWFsIGZvciBtb25pdG9yaW5nIGFuZCBhbmFseXNpcyBpbiBhcHBsaWNhdGlvbnMgbGlrZSB3ZWF0aGVyIGZvcmVjYXN0aW5nLCBoZWFsdGggbW9uaXRvcmluZywgYW5kIGluZHVzdHJpYWwgYXV0b21hdGlvbi4NCg0KIyBWZXJzaW9uIDINCg0KIyMjICoqU3R1ZHkgR3VpZGU6IFVuZGVyc3RhbmRpbmcgRGF0YSBNaW5pbmcgYW5kIERhdGEgQ29uY2VwdHMqKg0KDQojIyMjICoqMS4gSW50cm9kdWN0aW9uIHRvIERhdGEgTWluaW5nKioNCg0KLSAgICoqRGVmaW5pdGlvbioqOiBEYXRhIG1pbmluZyBpcyB0aGUgbm9uLXRyaXZpYWwgZXh0cmFjdGlvbiBvZiBpbXBsaWNpdCwgcHJldmlvdXNseSB1bmtub3duLCBvciB1c2VmdWwgaW5mb3JtYXRpb24gZnJvbSBsYXJnZSBkYXRhIHNldHMuDQotICAgKipIaXN0b3JpY2FsIEJhY2tncm91bmQqKjoNCiAgICAtICAgKipGb3VuZGF0aW9ucyoqOiBEYXRhIG1pbmluZyBpcyBidWlsdCB1cG9uIHRocmVlIGRpc2NpcGxpbmVzOiBTdGF0aXN0aWNzLCBBcnRpZmljaWFsIEludGVsbGlnZW5jZSAoQUkpLCBhbmQgTWFjaGluZSBMZWFybmluZyAoTUwpLg0KICAgIC0gICAqKktleSBGaWd1cmUqKjogSm9obiBUdWtleSwgY29uc2lkZXJlZCBhIGZvdW5kZXIgb2YgbW9kZXJuIGRhdGEgbWluaW5nLCBjb250cmlidXRlZCB0byBkYXRhIGV4cGxvcmF0aW9uLCB2aXN1YWxpemF0aW9uLCBhbmQgcHJlLXByb2Nlc3NpbmcgdGVjaG5pcXVlcy4NCiAgICAtICAgKipFdm9sdXRpb24qKjogVGhlIHRlcm0gImRhdGEgbWluaW5nIiBlbWVyZ2VkIGluIHRoZSAxOTkwcywgYW5kIHRoZSBmaWVsZCBoYXMgZ3Jvd24gd2l0aCB0aGUgcmlzZSBvZiAiZGF0YSBzY2llbmNlLCIgYSB0ZXJtIGNvaW5lZCB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gcmVzZWFyY2gtZm9jdXNlZCByb2xlcyBhbmQgcHJhY3RpY2FsIGRhdGEgYW5hbHlzaXMgcm9sZXMgaW4gY29tcGFuaWVzLg0KDQojIyMjICoqMi4gRGF0YSBNaW5pbmcgUHJvY2Vzc2VzIGFuZCBUYXNrcyoqDQoNCi0gICAqKlBpcGVsaW5lKio6DQogICAgMS4gICoqRGF0YSBTZWxlY3Rpb24qKjogQ2hvb3NpbmcgcmVsZXZhbnQgZGF0YSBmb3IgYW5hbHlzaXMuDQogICAgMi4gICoqUHJlLXByb2Nlc3NpbmcqKjogQ2xlYW5pbmcgYW5kIHByZXBhcmluZyB0aGUgZGF0YS4NCiAgICAzLiAgKipUcmFuc2Zvcm1hdGlvbioqOiBDb252ZXJ0aW5nIGRhdGEgaW50byBhIHN1aXRhYmxlIGZvcm1hdC4NCiAgICA0LiAgKipEYXRhIE1pbmluZyoqOiBBcHBseWluZyBhbGdvcml0aG1zIHRvIGV4dHJhY3QgcGF0dGVybnMuDQogICAgNS4gICoqSW50ZXJwcmV0YXRpb24gJiBFdmFsdWF0aW9uKio6IE1ha2luZyB0aGUgcmVzdWx0cyB1bmRlcnN0YW5kYWJsZSBhbmQgYWN0aW9uYWJsZSBmb3IgaHVtYW5zLg0KLSAgICoqS2V5IERpc3RpbmN0aW9ucyoqOg0KICAgIC0gICAqKkRhdGEgTWluaW5nIHZzLiBNYWNoaW5lIExlYXJuaW5nKio6IERhdGEgbWluaW5nIGZvY3VzZXMgb24gbWFraW5nIHBhdHRlcm5zIGludGVycHJldGFibGUgYnkgaHVtYW5zLCB3aGlsZSBNTCBpcyBtb3JlIGFib3V0IGF1dG9tYXRlZCBhbmFseXNpcy4NCi0gICAqKkNhdGVnb3JpZXMgb2YgRGF0YSBNaW5pbmcgVGFza3MqKjoNCiAgICAxLiAgKipQcmVkaWN0aW9uIFRhc2tzKio6IEludm9sdmVzIHByZWRpY3RpbmcgdW5rbm93biBvciBmdXR1cmUgdmFsdWVzIChlLmcuLCBjbGFzc2lmaWNhdGlvbiwgcmVncmVzc2lvbikuDQogICAgMi4gICoqRGVzY3JpcHRpdmUgVGFza3MqKjogRm9jdXNlcyBvbiBtYWtpbmcgZGF0YSBodW1hbi1pbnRlcnByZXRhYmxlIChlLmcuLCBjbHVzdGVyaW5nLCBhc3NvY2lhdGlvbiBydWxlIGRpc2NvdmVyeSkuDQoNCiMjIyMgKiozLiBFeGFtcGxlcyBvZiBEYXRhIE1pbmluZyBUZWNobmlxdWVzKioNCg0KLSAgICoqQ2xhc3NpZmljYXRpb24qKjoNCiAgICAtICAgKipQdXJwb3NlKio6IFByZWRpY3RpbmcgdGhlIGNsYXNzIG9mIHByZXZpb3VzbHkgdW5zZWVuIHJlY29yZHMuDQogICAgLSAgICoqRXhhbXBsZSoqOiBQcmVkaWN0aW5nIGNvbnN1bWVyIGJlaGF2aW9yIGJhc2VkIG9uIGRlbW9ncmFwaGljcyBvciBjbGFzc2lmeWluZyBnYWxheGllcyBieSB0aGVpciBmb3JtYXRpb24gc3RhZ2UuDQotICAgKipSZWdyZXNzaW9uKio6DQogICAgLSAgICoqUHVycG9zZSoqOiBQcmVkaWN0aW5nIGEgY29udGludW91cyB2YWx1ZSByYXRoZXIgdGhhbiBhIGNsYXNzLg0KICAgIC0gICAqKkV4YW1wbGUqKjogRXN0aW1hdGluZyBkZWVwIGFkaXBvc2UgdGlzc3VlIGJhc2VkIG9uIGhlaWdodCBhbmQgd2VpZ2h0Lg0KLSAgICoqQ2x1c3RlcmluZyoqOg0KICAgIC0gICAqKlB1cnBvc2UqKjogR3JvdXBpbmcgc2ltaWxhciBkYXRhIHBvaW50cyBpbnRvIGNsdXN0ZXJzLg0KICAgIC0gICAqKkV4YW1wbGUqKjogRG9jdW1lbnQgY2x1c3RlcmluZyBmb3IgY2F0ZWdvcml6aW5nIG5ld3MgYXJ0aWNsZXMgaW50byBnZW5yZXMuDQotICAgKipBc3NvY2lhdGlvbiBSdWxlIERpc2NvdmVyeSoqOg0KICAgIC0gICAqKlB1cnBvc2UqKjogRmluZGluZyBydWxlcyB0aGF0IGFzc29jaWF0ZSBkaWZmZXJlbnQgYXR0cmlidXRlcyBpbiBhIGRhdGEgc2V0Lg0KICAgIC0gICAqKkV4YW1wbGUqKjogTWFya2V0IGJhc2tldCBhbmFseXNpcywgbGlrZSBkaXNjb3ZlcmluZyB0aGF0IGJ1eWluZyBkaWFwZXJzIGlzIG9mdGVuIGFzc29jaWF0ZWQgd2l0aCBidXlpbmcgYmVlci4NCg0KIyMjIyAqKjQuIFVuZGVyc3RhbmRpbmcgRGF0YSoqDQoNCi0gICAqKkRhdGEgU3RydWN0dXJlKio6DQogICAgLSAgICoqT2JqZWN0cyBhbmQgQXR0cmlidXRlcyoqOg0KICAgICAgICAtICAgQW4gKipvYmplY3QqKiBpcyBhIGNvbGxlY3Rpb24gb2YgYXR0cmlidXRlcyAoZS5nLiwgYSByb3cgaW4gYSB0YWJsZSkuDQogICAgICAgIC0gICAqKkF0dHJpYnV0ZXMqKiAoYWxzbyBrbm93biBhcyB2YXJpYWJsZXMsIGZpZWxkcywgZmVhdHVyZXMpIHJlcHJlc2VudCB0aGUgcHJvcGVydGllcyBvZiB0aGUgZGF0YSAoZS5nLiwgY29sdW1ucyBpbiBhIHRhYmxlKS4NCi0gICAqKlRlcm1pbm9sb2d5Kio6DQogICAgLSAgICoqT2JqZWN0IFN5bm9ueW1zKio6IFJlY29yZHMsIHBvaW50cywgc2FtcGxlcywgaW5zdGFuY2VzLCBjYXNlcywgZW50aXRpZXMuDQogICAgLSAgICoqQXR0cmlidXRlIFN5bm9ueW1zKio6IFZhcmlhYmxlcywgZmllbGRzLCBjaGFyYWN0ZXJpc3RpY3MsIGZlYXR1cmVzLg0KDQojIyMjICoqNS4gVHlwZXMgb2YgQXR0cmlidXRlcyoqDQoNCi0gICAqKkRpc2NyZXRlIEF0dHJpYnV0ZXMqKjoNCiAgICAtICAgKipOb21pbmFsKio6IERpc3RpbmN0IGNhdGVnb3JpZXMgd2l0aG91dCBvcmRlciAoZS5nLiwgZXllIGNvbG9yKS4NCiAgICAtICAgKipPcmRpbmFsKio6IENhdGVnb3JpZXMgd2l0aCBhIHNwZWNpZmljIG9yZGVyIChlLmcuLCBtb3ZpZSByYXRpbmdzKS4NCi0gICAqKkNvbnRpbnVvdXMgQXR0cmlidXRlcyoqOg0KICAgIC0gICAqKkludGVydmFsKio6IE9yZGVyZWQgd2l0aCBlcXVhbCBpbnRlcnZhbHMsIG5vIHRydWUgemVybyAoZS5nLiwgdGVtcGVyYXR1cmUgaW4gQ2Vsc2l1cykuDQogICAgLSAgICoqUmF0aW8qKjogT3JkZXJlZCB3aXRoIGEgdHJ1ZSB6ZXJvLCBzdXBwb3J0cyBtdWx0aXBsaWNhdGlvbiAoZS5nLiwgaGVpZ2h0KS4NCg0KIyMjIyAqKjYuIFR5cGVzIG9mIERhdGEgU2V0cyoqDQoNCi0gICAqKlJlY29yZCBEYXRhKio6DQogICAgLSAgICoqU3RydWN0dXJlKio6IERhdGEgb3JnYW5pemVkIGluIHJvd3MgYW5kIGNvbHVtbnMsIHNpbWlsYXIgdG8gcmVsYXRpb25hbCBkYXRhYmFzZXMuDQogICAgLSAgICoqVHJhbnNhY3Rpb24gRGF0YSoqOiBBIHN1YnNldCB3aGVyZSBub3QgZXZlcnkgY29sdW1uIG5lZWRzIGEgdmFsdWUsIGFraW4gdG8gZG9jdW1lbnQtc3R5bGUgZGF0YWJhc2VzLg0KLSAgICoqR3JhcGggRGF0YSoqOg0KICAgIC0gICAqKlN0cnVjdHVyZSoqOiBEYXRhIHJlcHJlc2VudGVkIGFzIG5vZGVzIGFuZCBlZGdlcywgb2Z0ZW4gdXNlZCBmb3IgcmVsYXRpb25zaGlwcyAoZS5nLiwgaHlwZXJsaW5rcyBvbiB0aGUgd2ViKS4NCi0gICAqKlNlcXVlbnRpYWwgRGF0YSoqOg0KICAgIC0gICAqKlN0cnVjdHVyZSoqOiBEYXRhIHdpdGggYSBwcmVzZXJ2ZWQgb3JkZXIsIG9mdGVuIGluY2x1ZGluZyB0aW1lc3RhbXBzIChlLmcuLCBzZW5zb3IgZGF0YSkuDQoNCiMjIyMgKio3LiBTZWxmLVRlc3QgUXVlc3Rpb25zKioNCg0KLSAgIFJlZmxlY3Qgb24gdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gZGF0YSBtaW5pbmcgdGFza3MgKGUuZy4sIGNsYXNzaWZpY2F0aW9uIHZzLiBjbHVzdGVyaW5nKSBhbmQgdGhlIHR5cGVzIG9mIGF0dHJpYnV0ZXMgKGUuZy4sIG5vbWluYWwgdnMuIGludGVydmFsKS4NCi0gICBDb25zaWRlciBleGFtcGxlcyBvZiBkaWZmZXJlbnQgZGF0YSBzZXQgdHlwZXMgYW5kIGhvdyB0aGV5IGFyZSBzdHJ1Y3R1cmVkLg0KDQojIyBTZWxmLVRlc3QgQW5zd2VyczoNCg0KUmVmbGVjdGluZyBvbiB0aGUgKipkaWZmZXJlbmNlcyBiZXR3ZWVuIGRhdGEgbWluaW5nIHRhc2tzIGFuZCB0eXBlcyBvZiBhdHRyaWJ1dGVzKiogaW52b2x2ZXMgdW5kZXJzdGFuZGluZyBob3cgZWFjaCB0YXNrIHV0aWxpemVzIGRhdGEgYXR0cmlidXRlcyBhbmQgaG93IGRhdGFzZXRzIGFyZSBzdHJ1Y3R1cmVkIHRvIGZhY2lsaXRhdGUgdGhlc2UgdGFza3MuDQoNCiMjIyBEYXRhIE1pbmluZyBUYXNrcw0KDQoxLiAgKipDbGFzc2lmaWNhdGlvbioqOg0KICAgIC0gICAqKlB1cnBvc2UqKjogQXNzaWducyBpdGVtcyB0byBwcmVkZWZpbmVkIGNhdGVnb3JpZXMgb3IgY2xhc3Nlcy4NCiAgICAtICAgKipBdHRyaWJ1dGVzKio6IE9mdGVuIGludm9sdmVzIG5vbWluYWwgb3Igb3JkaW5hbCBhdHRyaWJ1dGVzIGFzIHRoZSB0YXJnZXQgdmFyaWFibGUgKGUuZy4sIGNsYXNzIGxhYmVscyBsaWtlICdzcGFtJyBvciAnbm90IHNwYW0nKS4NCiAgICAtICAgKipFeGFtcGxlKio6IEVtYWlsIGNsYXNzaWZpY2F0aW9uIHdoZXJlIHRoZSBkYXRhc2V0IGluY2x1ZGVzIGF0dHJpYnV0ZXMgbGlrZSBlbWFpbCBjb250ZW50LCBzZW5kZXIsIGFuZCB0aW1lLCB3aXRoIHRoZSB0YXJnZXQgYXR0cmlidXRlIGJlaW5nIHRoZSBjbGFzcyBsYWJlbCAoc3BhbS9ub3Qgc3BhbSkuDQoyLiAgKipDbHVzdGVyaW5nKio6DQogICAgLSAgICoqUHVycG9zZSoqOiBHcm91cHMgc2ltaWxhciBpdGVtcyB0b2dldGhlciB3aXRob3V0IHByZWRlZmluZWQgbGFiZWxzLg0KICAgIC0gICAqKkF0dHJpYnV0ZXMqKjogQ2FuIGludm9sdmUgYW55IHR5cGUgb2YgYXR0cmlidXRlLCBidXQgb2Z0ZW4gdXNlcyBudW1lcmljYWwgKGludGVydmFsIG9yIHJhdGlvKSBhdHRyaWJ1dGVzIGZvciBjYWxjdWxhdGluZyBkaXN0YW5jZXMgb3Igc2ltaWxhcml0aWVzLg0KICAgIC0gICAqKkV4YW1wbGUqKjogQ3VzdG9tZXIgc2VnbWVudGF0aW9uIHdoZXJlIHRoZSBkYXRhc2V0IGluY2x1ZGVzIGF0dHJpYnV0ZXMgbGlrZSBwdXJjaGFzZSBoaXN0b3J5LCBhZ2UsIGFuZCBsb2NhdGlvbiwgYW5kIHRoZSBnb2FsIGlzIHRvIGdyb3VwIGN1c3RvbWVycyBpbnRvIHNlZ21lbnRzIGJhc2VkIG9uIHNpbWlsYXJpdHkuDQoNCiMjIyBUeXBlcyBvZiBBdHRyaWJ1dGVzDQoNCjEuICAqKk5vbWluYWwgQXR0cmlidXRlcyoqOg0KICAgIC0gICAqKkNoYXJhY3RlcmlzdGljcyoqOiBDYXRlZ29yaWNhbCB3aXRoIG5vIGluaGVyZW50IG9yZGVyLg0KICAgIC0gICAqKkV4YW1wbGUqKjogQ29sb3JzIChyZWQsIGJsdWUsIGdyZWVuKSBvciBwcm9kdWN0IGNhdGVnb3JpZXMgKGVsZWN0cm9uaWNzLCBjbG90aGluZywgZ3JvY2VyaWVzKS4NCjIuICAqKk9yZGluYWwgQXR0cmlidXRlcyoqOg0KICAgIC0gICAqKkNoYXJhY3RlcmlzdGljcyoqOiBDYXRlZ29yaWNhbCB3aXRoIGEgbWVhbmluZ2Z1bCBvcmRlciBidXQgbm8gZml4ZWQgaW50ZXJ2YWwuDQogICAgLSAgICoqRXhhbXBsZSoqOiBDdXN0b21lciBzYXRpc2ZhY3Rpb24gcmF0aW5ncyAocG9vciwgZmFpciwgZ29vZCwgZXhjZWxsZW50KS4NCjMuICAqKkludGVydmFsIEF0dHJpYnV0ZXMqKjoNCiAgICAtICAgKipDaGFyYWN0ZXJpc3RpY3MqKjogTnVtZXJpY2FsIHdpdGggbWVhbmluZ2Z1bCBpbnRlcnZhbHMgYnV0IG5vIHRydWUgemVyby4NCiAgICAtICAgKipFeGFtcGxlKio6IFRlbXBlcmF0dXJlIGluIENlbHNpdXMgb3IgRmFocmVuaGVpdC4NCjQuICAqKlJhdGlvIEF0dHJpYnV0ZXMqKjoNCiAgICAtICAgKipDaGFyYWN0ZXJpc3RpY3MqKjogTnVtZXJpY2FsIHdpdGggbWVhbmluZ2Z1bCBpbnRlcnZhbHMgYW5kIGEgdHJ1ZSB6ZXJvLg0KICAgIC0gICAqKkV4YW1wbGUqKjogSGVpZ2h0LCB3ZWlnaHQsIG9yIGFnZS4NCg0KIyMjIEV4YW1wbGVzIG9mIERpZmZlcmVudCBEYXRhIFNldCBUeXBlcw0KDQoxLiAgKipUcmFuc2FjdGlvbmFsIERhdGEgU2V0Kio6DQogICAgLSAgICoqU3RydWN0dXJlKio6IEVhY2ggcmVjb3JkIHJlcHJlc2VudHMgYSB0cmFuc2FjdGlvbiwgb2Z0ZW4gd2l0aCBhIHRpbWVzdGFtcCBhbmQgbXVsdGlwbGUgaXRlbXMuDQogICAgLSAgICoqRXhhbXBsZSoqOiBBIHJldGFpbCBzYWxlcyBkYXRhc2V0IHdoZXJlIGVhY2ggcm93IGluY2x1ZGVzIHRyYW5zYWN0aW9uIElELCBkYXRlLCBpdGVtcyBwdXJjaGFzZWQsIGFuZCB0b3RhbCBhbW91bnQuDQoyLiAgKipUaW1lLVNlcmllcyBEYXRhIFNldCoqOg0KICAgIC0gICAqKlN0cnVjdHVyZSoqOiBPcmRlcmVkIGRhdGEgcG9pbnRzIGluZGV4ZWQgYnkgdGltZS4NCiAgICAtICAgKipFeGFtcGxlKio6IFN0b2NrIHByaWNlcyBkYXRhc2V0IHdoZXJlIGVhY2ggcm93IGluY2x1ZGVzIGRhdGUsIG9wZW5pbmcgcHJpY2UsIGNsb3NpbmcgcHJpY2UsIGFuZCB2b2x1bWUuDQozLiAgKipTcGF0aWFsIERhdGEgU2V0Kio6DQogICAgLSAgICoqU3RydWN0dXJlKio6IERhdGEgd2l0aCBzcGF0aWFsIGF0dHJpYnV0ZXMsIG9mdGVuIGluY2x1ZGluZyBjb29yZGluYXRlcy4NCiAgICAtICAgKipFeGFtcGxlKio6IEdlb2dyYXBoaWMgaW5mb3JtYXRpb24gc3lzdGVtIChHSVMpIGRhdGEgd2hlcmUgZWFjaCByZWNvcmQgaW5jbHVkZXMgbG9jYXRpb24gY29vcmRpbmF0ZXMgYW5kIGF0dHJpYnV0ZXMgbGlrZSBlbGV2YXRpb24gb3IgbGFuZCB1c2UgdHlwZS4NCjQuICAqKlRleHR1YWwgRGF0YSBTZXQqKjoNCiAgICAtICAgKipTdHJ1Y3R1cmUqKjogVW5zdHJ1Y3R1cmVkIG9yIHNlbWktc3RydWN0dXJlZCBkYXRhLCBvZnRlbiByZXF1aXJpbmcgcHJlcHJvY2Vzc2luZy4NCiAgICAtICAgKipFeGFtcGxlKio6IEEgY29sbGVjdGlvbiBvZiBkb2N1bWVudHMgb3Igc29jaWFsIG1lZGlhIHBvc3RzIHdoZXJlIGVhY2ggZW50cnkgaW5jbHVkZXMgdGV4dCBjb250ZW50IGFuZCBtZXRhZGF0YSBsaWtlIGF1dGhvciBhbmQgdGltZXN0YW1wLg0KDQojIFF1ZXN0aW9ucyBmcm9tIE1vZHVsZSAxIEFzeW5jaDogDQoNCjEuICAqKklmIHByZWRpY3RpbmcgZnJvbSBvdGhlciBjdXN0b21lcnMsIGRpdmlkaW5nIHVwIGN1c3RvbWVycyBieSBwb3RlbnRpYWwgcHJvZml0YWJpbGl0eSBpczoqKg0KICAgIC0gICAqKkNsYXNzaWZpY2F0aW9uIGFuZCByZWdyZXNzaW9uKiogKENvcnJlY3QpDQogICAgLSAgIERpdmlkaW5nIHVwIGN1c3RvbWVycyBieSBwb3RlbnRpYWwgcHJvZml0YWJpbGl0eSBpcyAqKkNsYXNzaWZpY2F0aW9uKiogYmVjYXVzZSBpdCBpbnZvbHZlcyBjYXRlZ29yaXppbmcgY3VzdG9tZXJzIGludG8gZ3JvdXBzIGJhc2VkIG9uIHRoZWlyIHBvdGVudGlhbCBwcm9maXRhYmlsaXR5IGFuZCBwcmVkaWN0aW5nIGNhdGVnb3JpY2FsIChjbGFzc2lmaWNhdGlvbikgb3IgY29udGludW91cyAocmVncmVzc2lvbikgb3V0Y29tZXMuDQoyLiAgKipFeHRyYWN0aW5nIGZyZXF1ZW5jeSBvZiBzb3VuZCBpczoqKg0KICAgIC0gICAqKk5vdCBkYXRhIG1pbmluZyoqIChDb3JyZWN0KQ0KICAgIC0gICBFeHRyYWN0aW5nIGZyZXF1ZW5jeSBvZiBzb3VuZCBpcyAqKk5vdCBkYXRhIG1pbmluZyoqIGJlY2F1c2UgaXQgaXMgYSBzaWduYWwgcHJvY2Vzc2luZyB0YXNrLCBub3QgYSBkYXRhIG1pbmluZyB0YXNrLg0KMy4gICoqRmluZGluZyBzb21lb25lJ3MgYWRpcG9zZSB0aXNzdWUgbWVhc3VyZSBmcm9tIHdhaXN0IGNpcmN1bWZlcmVuY2UgaXM6KioNCiAgICAtICAgKipSZWdyZXNzaW9uKiogKENvcnJlY3QpDQogICAgLSAgIEZpbmRpbmcgc29tZW9uZSdzIGFkaXBvc2UgdGlzc3VlIG1lYXN1cmUgZnJvbSB3YWlzdCBjaXJjdW1mZXJlbmNlIGlzICoqUmVncmVzc2lvbioqIGJlY2F1c2UgaXQgaW52b2x2ZXMgcHJlZGljdGluZyBhIGNvbnRpbnVvdXMgdmFsdWUgKGFkaXBvc2UgdGlzc3VlIG1lYXN1cmUpIGJhc2VkIG9uIGEgc2luZ2xlIGlucHV0IChhbm90aGVyIHZhcmlhYmxlKSB2YXJpYWJsZSAod2Fpc3QgY2lyY3VtZmVyZW5jZSkuDQo0LiAgKipEZWNpZGluZyBpZiBhIHBlcnNvbiBoYXMgZGlhYmV0ZXMgYmFzZWQgdXBvbiBoaXMgb3IgaGVyIGhpc3RvcnkgYW5kIGRpZXQgaXM6KioNCiAgICAtICAgKipDbGFzc2lmaWNhdGlvbioqIChDb3JyZWN0KQ0KICAgIC0gICAgKipDbGFzc2lmaWNhdGlvbiBUYXNrKiogYmVjYXVzZSBpdCBpbnZvbHZlcyBjYXRlZ29yaXppbmcgYSBwZXJzb24gYXMgZWl0aGVyIGhhdmluZyBkaWFiZXRlcyBvciBub3QuIChwcmVzZW5jZSBvciBhYnNlbmNlIG9mKS4NCjUuICAqKkRlcGVuZGluZyBvbiB0aGUgbWV0aG9kcyB1c2VkLCBkZWNpZGluZyBpZiBzb21lb25lIHdpbGwgbGlrZSBhIG1vdmllIG9uIE5ldGZsaXggZ2l2ZW4gcmF0aW5ncyBvZiBvdGhlciB1c2VycyBpczoqKg0KICAgIC0gICAqKkFuc3dlcnMgQSB0aHJvdWdoIEQqKiAoQ29ycmVjdCkNCg0KICAgICAgICBEZWNpZGluZyBpZiBzb21lb25lIHdpbGwgbGlrZSBhIG1vdmllIG9uIE5ldGZsaXggZ2l2ZW4gcmF0aW5ncyBvZiBvdGhlciB1c2VycyBpcyAqKkFuc3dlcnMgQSB0aHJvdWdoIEQqKiBiZWNhdXNlIGl0IGNhbiBiZSBhcHByb2FjaGVkIHVzaW5nIHZhcmlvdXMgbWV0aG9kcywgaW5jbHVkaW5nIEFzc29jaWF0aW9uIChlLmcuLCBjb2xsYWJvcmF0aXZlIGZpbHRlcmluZyksIENsYXNzaWZpY2F0aW9uIChlLmcuLCBwcmVkaWN0aW5nIGEgdXNlcidzIHJhdGluZyksIENsdXN0ZXJpbmcgKGUuZy4sIGdyb3VwaW5nIHNpbWlsYXIgdXNlcnMpLCBvciBSZWdyZXNzaW9uIChlLmcuLCBwcmVkaWN0aW5nIGEgdXNlcidzIHJhdGluZykuDQo2LiAgKipEZXBlbmRpbmcgb24gdGhlIG1ldGhvZHMgdXNlZCwgZmluZGluZyB0aGUgZ2VucmUgb2YgYW4gb25saW5lIGFydGljbGUgYmFzZWQgb24gdGhlIHdvcmRzIGluIGl0IGlzOioqDQogICAgLSAgICoqQ2xhc3NpZmljYXRpb24gb3IgY2x1c3RlcmluZyoqIChDb3JyZWN0KQ0KICAgIC0gICBGaW5kaW5nIHRoZSBnZW5yZSBvZiBhbiBvbmxpbmUgYXJ0aWNsZSBiYXNlZCBvbiB0aGUgd29yZHMgaW4gaXQgaXMgKipDbGFzc2lmaWNhdGlvbiBvciBDbHVzdGVyaW5nKiogYmVjYXVzZSBpdCBjYW4gYmUgYXBwcm9hY2hlZCB1c2luZyBlaXRoZXIgQ2xhc3NpZmljYXRpb24gKGUuZy4sIHByZWRpY3RpbmcgYSBzcGVjaWZpYyBnZW5yZSkgb3IgQ2x1c3RlcmluZyAoZS5nLiwgZ3JvdXBpbmcgc2ltaWxhciBhcnRpY2xlcykuDQo3LiAgKipEZXBlbmRpbmcgb24gdGhlIG1ldGhvZHMgdXNlZCwgZmluZGluZyB3aGljaCBHb29nbGUgc2VhcmNoZXMgYXJlIGxpa2VseSB0byBmb2xsb3cgb25lIGFub3RoZXIgaXM6KioNCiAgICAtICAgKipDbGFzc2lmaWNhdGlvbiBvciBjbHVzdGVyaW5nKiogKENvcnJlY3QpDQogICAgLSAgIEl0IGNvdWxkIGludm9sdmUgY2xhc3NpZmljYXRpb24gKHByZWRpY3RpbmcgdGhlIG5leHQgc2VhcmNoKSBvciBjbHVzdGVyaW5nIChncm91cGluZyBzaW1pbGFyIHNlYXJjaGVzKS4NCjguICAqKklzIHRoZSBicmlnaHRuZXNzIGZyb20gYSBsaWdodCBtZXRlciBpbnRlcnZhbCBvciByYXRpbz8qKg0KICAgIC0gICAqKlJhdGlvKiogKENvcnJlY3QpDQogICAgLSAgIEJyaWdodG5lc3MgZnJvbSBhIGxpZ2h0IG1ldGVyIGlzICoqUmF0aW8qKiBiZWNhdXNlIGl0IGhhcyBhIHRydWUgemVybyBwb2ludCAoaS5lLiwgY29tcGxldGUgZGFya25lc3MpIGFuZCBjYW4gYmUgbWVhc3VyZWQgaW4gYSBjb250aW51b3VzIHJhbmdlLg0KOS4gICoqSXMgYW4gYW5nbGUgbWVhc3VyZWQgZnJvbSAw4oCTMzYwIGRlZ3JlZXMgaW50ZXJ2YWwgb3IgcmF0aW8/KioNCiAgICAtICAgKipDb3VsZCBiZSBlaXRoZXIgaW50ZXJ2YWwgb3IgcmF0aW8qKiAoQ29ycmVjdCkNCiAgICAtICAgRGVwZW5kaW5nIG9uIGNvbnRleHQsIGFuZ2xlcyBjb3VsZCBiZSB0cmVhdGVkIGFzIGludGVydmFsIChpZiB0aGVyZSdzIG5vIG1lYW5pbmdmdWwgemVybykgb3IgcmF0aW8gKGlmIDAgZGVncmVlcyBpcyBhYnNvbHV0ZSkuDQogICAgLSAgIEl0IGNhbiBiZSB0cmVhdGVkIGFzIGVpdGhlciBhbiBpbnRlcnZhbCBzY2FsZSAoZS5nLiwgd2hlbiBtZWFzdXJpbmcgYW5nbGVzIGJldHdlZW4gMCBhbmQgMzYwIGRlZ3JlZXMpIG9yIGEgcmF0aW8gc2NhbGUgKGUuZy4sIHdoZW4gbWVhc3VyaW5nIGFuZ2xlcyBpbiByYWRpYW5zKS4NCjEwLiAqKklzIHRoZSBoZWlnaHQgYWJvdmUgc2VhIGxldmVsIGludGVydmFsIG9yIHJhdGlvPyoqDQogICAgLSAgICoqUmF0aW8qKiAoQ29ycmVjdCkNCiAgICAtICAgSGVpZ2h0IGFib3ZlIHNlYSBsZXZlbCBoYXMgYW4gYWJzb2x1dGUgemVybyAoc2VhIGxldmVsKSwgYW5kIGNhbiBiZSBtZWFzdXJlZCBpbiBhIGNvbnRpbnVvdXMgcmFuZ2UsIG1ha2luZyBpdCBhICoqUmF0aW8gTWVhc3VyZW1lbnQqKi4NCjExLiAqKklzIG1pbGl0YXJ5IHJhbmtpbmcgb3JkaW5hbCwgbm9taW5hbCwgb3IgYmluYXJ5PyoqDQogICAgLSAgICoqT3JkaW5hbCoqIChDb3JyZWN0KQ0KICAgIC0gICBNaWxpdGFyeSByYW5raW5nIGlzwqAqKk9yZGluYWwqKsKgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgcmFua2VkIC9zcGVjaWZpYyBvcmRlciAoZS5nLiwgcHJpdmF0ZSwgc2VyZ2VhbnQsIGxpZXV0ZW5hbnQpLCBidXQgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gcmFua3MgYXJlIG5vdCBuZWNlc3NhcmlseSBlcXVhbC4NCjEyLiAqKklzIGEgY29hdCBjaGVjayBudW1iZXIgb3JkaW5hbCwgbm9taW5hbCwgb3IgYmluYXJ5PyoqDQogICAgLSAgICoqTm9taW5hbCoqIChDb3JyZWN0KQ0KICAgIC0gICBBIGNvYXQgY2hlY2sgbnVtYmVyIGlzIGEgbGFiZWwgd2l0aCBubyBpbmhlcmVudCBvcmRlciBvciBudW1lcmljYWwgdmFsdWUsIG1ha2luZyBpdCBub21pbmFsLg0KMTMuICoqSXMgdGltZSBhcyBhLm0uIG9yIHAubS4gb3JkaW5hbCwgbm9taW5hbCwgb3IgYmluYXJ5PyoqDQogICAgLSAgICoqQmluYXJ5KiogKENvcnJlY3QpDQogICAgLSAgIFRpbWUgYXMgYS5tLiBvciBwLm0uIGlzICoqQmluYXJ5KiogYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgc2ltcGxlIGRpY2hvdG9teSAoMiBjYXRlZ29yaWVzLCBpLmUuLCBtb3JuaW5nIG9yIGFmdGVybm9vbikuDQoxNC4gKipJcyB0aGUgYnJpZ2h0bmVzcywgYXMgZ2l2ZW4gYnkgYSBodW1hbiwgb3JkaW5hbCwgbm9taW5hbCwgb3IgYmluYXJ5PyoqDQogICAgLSAgICoqT3JkaW5hbCoqIChDb3JyZWN0KQ0KICAgIC0gICBIdW1hbi1wZXJjZWl2ZWQgYnJpZ2h0bmVzcyBpc8KgKipPcmRpbmFsKiogYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgc3ViamVjdGl2ZSByYW5raW5nIChlLmcuLCBkaW0sIG1lZGl1bSwgYnJpZ2h0KSwgYnV0IHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHJhbmtzIGFyZSBub3QgbmVjZXNzYXJpbHkgZXF1YWwuDQoxNS4gKipXaGF0IGJlc3QgZGVzY3JpYmVzIGEgZGF0YWJhc2Ugb2YgbW92aWVzIGFuZCBhY3RvcnMgd2hvIHBsYXllZCBpbiB0aGVtPyoqDQogICAgLSAgICoqRWl0aGVyIHRyYW5zYWN0aW9uIG9yIGdyYXBoKiogKENvcnJlY3QpDQogICAgLSAgIEEgZGF0YWJhc2Ugb2YgbW92aWVzIGFuZCBhY3RvcnMgd2hvIHBsYXllZCBpbiB0aGVtIGlzICoqRWl0aGVyIHRyYW5zYWN0aW9uIG9yIGdyYXBoKiogYmVjYXVzZSBpdCBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgZWl0aGVyIGEgc2V0IG9mIHRyYW5zYWN0aW9ucyAoZS5nLiwgYWN0b3IgWCBwbGF5ZWQgaW4gbW92aWUgWSkgb3IgYSBncmFwaCAoZS5nLiwgYWN0b3JzIGNvbm5lY3RlZCB0byBtb3ZpZXMpLg0KMTYuICoqV2hhdCBiZXN0IGRlc2NyaWJlcyBhIGRhdGFiYXNlIG9mIHNvbWVvbmUncyBBbWF6b24gcHVyY2hhc2UgaGlzdG9yeT8qKg0KICAgIC0gICAqKkVpdGhlciB0cmFuc2FjdGlvbiBvciBncmFwaCoqIChDb3JyZWN0KQ0KICAgIC0gICBBIGRhdGFiYXNlIG9mIHNvbWVvbmUncyBBbWF6b24gcHVyY2hhc2UgaGlzdG9yeSBpcyAqKkVpdGhlciB0cmFuc2FjdGlvbiBvciBzZXF1ZW50aWFsKiogYmVjYXVzZSBpdCBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgZWl0aGVyIGEgc2V0IG9mIHRyYW5zYWN0aW9ucyAoZS5nLiwgcHVyY2hhc2UgWCBvbiBkYXRlIFkpIG9yIGEgc2VxdWVuY2Ugb2YgcHVyY2hhc2VzIG92ZXIgdGltZS4NCjE3LiAqKldoYXQgYmVzdCBkZXNjcmliZXMgYSBkYXRhIHNldCBvZiBwZW9wbGUncyBhdHRyaWJ1dGVzIHdpdGggZGlhYmV0ZXM/KioNCiAgICAtICAgKipSZWNvcmQqKiAoQ29ycmVjdCkNCiAgICAtICAgQSBkYXRhIHNldCBvZiBwZW9wbGUncyBhdHRyaWJ1dGVzIHdpdGggZGlhYmV0ZXMgaXMgKipSZWNvcmQqKiBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSBjb2xsZWN0aW9uIG9mIGluZGl2aWR1YWwgcmVjb3JkcyBvciBjYXNlcywgZWFjaCB3aXRoIHZhcmlvdXMgYXR0cmlidXRlcyAoZS5nLiwgYWdlLCBibG9vZCBwcmVzc3VyZSwgZXRjLikuDQoxOC4gKipXaGF0IGJlc3QgZGVzY3JpYmVzIGEgZGF0YWJhc2Ugb2YgeW91ciBtb3ZlbWVudHMgd2hpbGUgc2xlZXBpbmcsIHJlY29yZGVkIGVhY2ggbWludXRlPyoqDQogICAgLSAgICoqU2VxdWVudGlhbCoqIChDb3JyZWN0KQ0KICAgIC0gICBUaGUgZGF0YSBoYXMgYSB0ZW1wb3JhbCBzZXF1ZW5jZSwgbWFraW5nIGl0IHNlcXVlbnRpYWwuDQogICAgLSAgICoqU2VxdWVudGlhbCoqwqBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSBzZXF1ZW5jZSBvZiBtZWFzdXJlbWVudHMgb3ZlciB0aW1lLg0KDQpUaGluayBJJ20gZ29vZCBoZXJlLiBTZXQgYWxlcnQgZm9yIHdlZWtseSByZXZpZXcgYW5kIGhvbWV3b3JrIGNoZWNrIGV2ZXJ5IFdlZG5lc2RheSBhdCBub29uLg0K