In the wake of the Great Recession of 2009, there has been a good deal of focus on employment statistics, one of the most important metrics policymakers use to gauge the overall strength of the economy. In the United States, the government measures unemployment using the Current Population Survey (CPS), which collects demographic and employment information from a wide range of Americans each month. In this exercise, we will employ the topics reviewed in the lectures as well as a few new techniques using the September 2013 version of this rich, nationally representative dataset (available online).

The observations in the dataset represent people surveyed in the September 2013 CPS who actually completed a survey. While the full dataset has 385 variables, in this exercise we will use a more compact version of the dataset, CPSData.csv, which has the following variables:

PeopleInHousehold: The number of people in the interviewee’s household.

Region: The census region where the interviewee lives.

State: The state where the interviewee lives.

MetroAreaCode: A code that identifies the metropolitan area in which the interviewee lives (missing if the interviewee does not live in a metropolitan area). The mapping from codes to names of metropolitan areas is provided in the file MetroAreaCodes.csv.

Age: The age, in years, of the interviewee. 80 represents people aged 80-84, and 85 represents people aged 85 and higher.

Married: The marriage status of the interviewee.

Sex: The sex of the interviewee.

Education: The maximum level of education obtained by the interviewee.

Race: The race of the interviewee.

Hispanic: Whether the interviewee is of Hispanic ethnicity.

CountryOfBirthCode: A code identifying the country of birth of the interviewee. The mapping from codes to names of countries is provided in the file CountryCodes.csv.

Citizenship: The United States citizenship status of the interviewee.

EmploymentStatus: The status of employment of the interviewee.

Industry: The industry of employment of the interviewee (only available if they are employed).

Section 1 - Loading and Summarizing the Dataset

1.1

Load the dataset from CPSData.csv into a data frame called CPS, and view the dataset with the summary() and str() commands.

summary(CPS)
 PeopleInHousehold       Region               State       MetroAreaCode  
 Min.   : 1.000    Midwest  :30684   California  :11570   Min.   :10420  
 1st Qu.: 2.000    Northeast:25939   Texas       : 7077   1st Qu.:21780  
 Median : 3.000    South    :41502   New York    : 5595   Median :34740  
 Mean   : 3.284    West     :33177   Florida     : 5149   Mean   :35075  
 3rd Qu.: 4.000                      Pennsylvania: 3930   3rd Qu.:41860  
 Max.   :15.000                      Illinois    : 3912   Max.   :79600  
                                     (Other)     :94069   NA's   :34238  
      Age                 Married          Sex                          Education    
 Min.   : 0.00   Divorced     :11151   Female:67481   High school            :30906  
 1st Qu.:19.00   Married      :55509   Male  :63821   Bachelor's degree      :19443  
 Median :39.00   Never Married:30772                  Some college, no degree:18863  
 Mean   :38.83   Separated    : 2027                  No high school diploma :16095  
 3rd Qu.:57.00   Widowed      : 6505                  Associate degree       : 9913  
 Max.   :85.00   NA's         :25338                  (Other)                :10744  
                                                      NA's                   :25338  
               Race           Hispanic      CountryOfBirthCode
 American Indian :  1433   Min.   :0.0000   Min.   : 57.00    
 Asian           :  6520   1st Qu.:0.0000   1st Qu.: 57.00    
 Black           : 13913   Median :0.0000   Median : 57.00    
 Multiracial     :  2897   Mean   :0.1393   Mean   : 82.68    
 Pacific Islander:   618   3rd Qu.:0.0000   3rd Qu.: 57.00    
 White           :105921   Max.   :1.0000   Max.   :555.00    
                                                              
               Citizenship               EmploymentStatus
 Citizen, Native     :116639   Disabled          : 5712  
 Citizen, Naturalized:  7073   Employed          :61733  
 Non-Citizen         :  7590   Not in Labor Force:15246  
                               Retired           :18619  
                               Unemployed        : 4203  
                               NA's              :25789  
                                                         
                               Industry    
 Educational and health services   :15017  
 Trade                             : 8933  
 Professional and business services: 7519  
 Manufacturing                     : 6791  
 Leisure and hospitality           : 6364  
 (Other)                           :21618  
 NA's                              :65060  

1.2

Among the interviewees with a value reported for the Industry variable, what is the most common industry of employment? Please enter the name exactly how you see it.

#ans: Educational and health services

1.3

Recall from the homework assignment “The Analytical Detective” that you can call the sort() function on the output of the table() function to obtain a sorted breakdown of a variable. For instance, sort(table(CPS$Region)) sorts the regions by the number of interviewees from that region.

Which state has the fewest interviewees?

sort(table(CPS$State)) #ans:New Mexico

          New Mexico              Montana          Mississippi              Alabama 
                1102                 1214                 1230                 1376 
       West Virginia             Arkansas            Louisiana                Idaho 
                1409                 1421                 1450                 1518 
            Oklahoma              Arizona               Alaska              Wyoming 
                1523                 1528                 1590                 1624 
        North Dakota       South Carolina            Tennessee District of Columbia 
                1645                 1658                 1784                 1791 
            Kentucky                 Utah               Nevada              Vermont 
                1841                 1842                 1856                 1890 
              Kansas               Oregon             Nebraska        Massachusetts 
                1935                 1943                 1949                 1987 
        South Dakota              Indiana               Hawaii             Missouri 
                2000                 2004                 2099                 2145 
        Rhode Island             Delaware                Maine           Washington 
                2209                 2214                 2263                 2366 
                Iowa           New Jersey       North Carolina        New Hampshire 
                2528                 2567                 2619                 2662 
           Wisconsin              Georgia          Connecticut             Colorado 
                2686                 2807                 2836                 2925 
            Virginia             Michigan            Minnesota             Maryland 
                2953                 3063                 3139                 3200 
                Ohio             Illinois         Pennsylvania              Florida 
                3678                 3912                 3930                 5149 
            New York                Texas           California 
                5595                 7077                11570 

Which state has the largest number of interviewees?

#ans: California

1.4

What proportion of interviewees are citizens of the United States?

summary(CPS$Citizenship == "Citizen, Native" | CPS$Citizenship == "Citizen, Naturalized")
   Mode   FALSE    TRUE 
logical    7590  123712 
123712/nrow(CPS)
[1] 0.9421943

1.5

The CPS differentiates between race (with possible values American Indian, Asian, Black, Pacific Islander, White, or Multiracial) and ethnicity. A number of interviewees are of Hispanic ethnicity, as captured by the Hispanic variable. For which races are there at least 250 interviewees in the CPS dataset of Hispanic ethnicity? (Select all that apply.)

  • American Indian
  • Asian
  • Black
  • Multiracial
  • Pacific Islander
  • White
table(CPS$Race,CPS$Hispanic)
                  
                       0     1
  American Indian   1129   304
  Asian             6407   113
  Black            13292   621
  Multiracial       2449   448
  Pacific Islander   541    77
  White            89190 16731
#ans: American Indian,Black,Multiracial, White

Section 2 - Evaluating Missing Values

2.1

Which variables have at least one interviewee with a missing (NA) value? (Select all that apply.)

  • PeopleInHousehold
  • Region
  • State
  • MetroAreaCode
  • Age
  • Married
  • Sex
  • Education
  • Race
  • Hispanic
  • CountryOfBirthCode
  • Citizenship
  • EmploymentStatus
  • Industry
#ans: MetroAreaCode,Married,Education,EmploymentStatus,Industry

2.2

Often when evaluating a new dataset, we try to identify if there is a pattern in the missing values in the dataset. We will try to determine if there is a pattern in the missing values of the Married variable. The function

is.na(CPS$Married) 

returns a vector of TRUE/FALSE values for whether the Married variable is missing. We can see the breakdown of whether Married is missing based on the reported value of the Region variable with the function

table(CPS$Region, is.na(CPS$Married))

Which is the most accurate:

  • The Married variable being missing is related to the Region value for the interviewee.
  • The Married variable being missing is related to the Sex value for the interviewee.
  • The Married variable being missing is related to the Age value for the interviewee.
  • The Married variable being missing is related to the Citizenship value for the interviewee.
  • The Married variable being missing is not related to the Region, Sex, Age, or Citizenship value for the interviewee.
table(CPS$Region, is.na(CPS$Married))
           
            FALSE  TRUE
  Midwest   24609  6075
  Northeast 21432  4507
  South     33535  7967
  West      26388  6789
table(CPS$Sex, is.na(CPS$Married))
        
         FALSE  TRUE
  Female 55264 12217
  Male   50700 13121
table(CPS$Age, is.na(CPS$Married))
    
     FALSE TRUE
  0      0 1283
  1      0 1559
  2      0 1574
  3      0 1693
  4      0 1695
  5      0 1795
  6      0 1721
  7      0 1681
  8      0 1729
  9      0 1748
  10     0 1750
  11     0 1721
  12     0 1797
  13     0 1802
  14     0 1790
  15  1795    0
  16  1751    0
  17  1764    0
  18  1596    0
  19  1517    0
  20  1398    0
  21  1525    0
  22  1536    0
  23  1638    0
  24  1627    0
  25  1604    0
  26  1643    0
  27  1657    0
  28  1736    0
  29  1645    0
  30  1854    0
  31  1762    0
  32  1790    0
  33  1804    0
  34  1653    0
  35  1716    0
  36  1663    0
  37  1531    0
  38  1530    0
  39  1542    0
  40  1571    0
  41  1673    0
  42  1711    0
  43  1819    0
  44  1764    0
  45  1749    0
  46  1665    0
  47  1647    0
  48  1791    0
  49  1989    0
  50  1966    0
  51  1931    0
  52  1935    0
  53  1994    0
  54  1912    0
  55  1895    0
  56  1935    0
  57  1827    0
  58  1874    0
  59  1758    0
  60  1746    0
  61  1735    0
  62  1595    0
  63  1596    0
  64  1519    0
  65  1569    0
  66  1577    0
  67  1227    0
  68  1130    0
  69  1062    0
  70  1195    0
  71  1031    0
  72   941    0
  73   896    0
  74   842    0
  75   763    0
  76   729    0
  77   698    0
  78   659    0
  79   661    0
  80  2664    0
  85  2446    0
table(CPS$Citizenship, is.na(CPS$Married))
                      
                       FALSE  TRUE
  Citizen, Native      91956 24683
  Citizen, Naturalized  6910   163
  Non-Citizen           7098   492
#ans: The Married variable being missing is related to the Age value for the interviewee.

2.3

As mentioned in the variable descriptions, MetroAreaCode is missing if an interviewee does not live in a metropolitan area. Using the same technique as in the previous question, answer the following questions about people who live in non-metropolitan areas.

How many states had all interviewees living in a non-metropolitan area (aka they have a missing MetroAreaCode value)? For this question, treat the District of Columbia as a state (even though it is not technically a state).

table(CPS$State,is.na(CPS$MetroAreaCode)) #ans: Alaska,Wyoming
                      
                       FALSE  TRUE
  Alabama               1020   356
  Alaska                   0  1590
  Arizona               1327   201
  Arkansas               724   697
  California           11333   237
  Colorado              2545   380
  Connecticut           2593   243
  Delaware              1696   518
  District of Columbia  1791     0
  Florida               4947   202
  Georgia               2250   557
  Hawaii                1576   523
  Idaho                  761   757
  Illinois              3473   439
  Indiana               1420   584
  Iowa                  1297  1231
  Kansas                1234   701
  Kentucky               908   933
  Louisiana             1216   234
  Maine                  909  1354
  Maryland              2978   222
  Massachusetts         1858   129
  Michigan              2517   546
  Minnesota             2150   989
  Mississippi            376   854
  Missouri              1440   705
  Montana                199  1015
  Nebraska               816  1133
  Nevada                1609   247
  New Hampshire         1148  1514
  New Jersey            2567     0
  New Mexico             832   270
  New York              5144   451
  North Carolina        1642   977
  North Dakota           432  1213
  Ohio                  2754   924
  Oklahoma              1024   499
  Oregon                1519   424
  Pennsylvania          3245   685
  Rhode Island          2209     0
  South Carolina        1139   519
  South Dakota           595  1405
  Tennessee             1149   635
  Texas                 6060  1017
  Utah                  1455   387
  Vermont                657  1233
  Virginia              2367   586
  Washington            1937   429
  West Virginia          344  1065
  Wisconsin             1882   804
  Wyoming                  0  1624

How many states had all interviewees living in a metropolitan area? Again, treat the District of Columbia as a state.

#ans: District of Columbia,New Jersey,Rhode Island

2.4

Which region of the United States has the largest proportion of interviewees living in a non-metropolitan area?

  • Midwest
  • Northeast
  • South
  • West
table(CPS$Region,is.na(CPS$MetroAreaCode)) #ans: Midwest 近二分之一
           
            FALSE  TRUE
  Midwest   20010 10674
  Northeast 20330  5609
  South     31631  9871
  West      25093  8084

2.5

While we were able to use the table() command to compute the proportion of interviewees from each region not living in a metropolitan area, it was somewhat tedious (it involved manually computing the proportion for each region) and isn’t something you would want to do if there were a larger number of options. It turns out there is a less tedious way to compute the proportion of values that are TRUE. The mean() function, which takes the average of the values passed to it, will treat TRUE as 1 and FALSE as 0, meaning it returns the proportion of values that are true. For instance, mean(c(TRUE, FALSE, TRUE, TRUE)) returns 0.75. Knowing this, use tapply() with the mean function to answer the following questions:

Which state has a proportion of interviewees living in a non-metropolitan area closest to 30%?

sort(tapply(is.na(CPS$MetroAreaCode),CPS$State,mean)) #ans: Wisconsin 0.29932986
District of Columbia           New Jersey         Rhode Island           California 
          0.00000000           0.00000000           0.00000000           0.02048401 
             Florida        Massachusetts             Maryland             New York 
          0.03923092           0.06492199           0.06937500           0.08060769 
         Connecticut             Illinois             Colorado              Arizona 
          0.08568406           0.11221881           0.12991453           0.13154450 
              Nevada                Texas            Louisiana         Pennsylvania 
          0.13308190           0.14370496           0.16137931           0.17430025 
            Michigan           Washington              Georgia             Virginia 
          0.17825661           0.18131868           0.19843249           0.19844226 
                Utah               Oregon             Delaware           New Mexico 
          0.21009772           0.21821925           0.23396567           0.24500907 
              Hawaii                 Ohio              Alabama              Indiana 
          0.24916627           0.25122349           0.25872093           0.29141717 
           Wisconsin       South Carolina            Minnesota             Oklahoma 
          0.29932986           0.31302774           0.31506849           0.32764281 
            Missouri            Tennessee               Kansas       North Carolina 
          0.32867133           0.35594170           0.36227390           0.37304315 
                Iowa             Arkansas                Idaho             Kentucky 
          0.48694620           0.49049965           0.49868248           0.50678979 
       New Hampshire             Nebraska                Maine              Vermont 
          0.56874530           0.58132376           0.59832081           0.65238095 
         Mississippi         South Dakota         North Dakota        West Virginia 
          0.69430894           0.70250000           0.73738602           0.75585522 
             Montana               Alaska              Wyoming 
          0.83607908           1.00000000           1.00000000 

Which state has the largest proportion of non-metropolitan interviewees, ignoring states where all interviewees were non-metropolitan?

#ans: Montana

Section 3 - Integrating Metropolitan Area Data

Codes like MetroAreaCode and CountryOfBirthCode are a compact way to encode factor variables with text as their possible values, and they are therefore quite common in survey datasets. In fact, all but one of the variables in this dataset were actually stored by a numeric code in the original CPS datafile.

When analyzing a variable stored by a numeric code, we will often want to convert it into the values the codes represent. To do this, we will use a dictionary, which maps the the code to the actual value of the variable. We have provided dictionaries MetroAreaCodes.csv and CountryCodes.csv, which respectively map MetroAreaCode and CountryOfBirthCode into their true values. Read these two dictionaries into data frames MetroAreaMap and CountryMap.

MetroAreaMap = read.csv("data/MetroAreaCodes.csv")
CountryMap = read.csv("data/CountryCodes.csv")

3.1

How many observations (codes for metropolitan areas) are there in MetroAreaMap?

str(MetroAreaMap) #271
'data.frame':   271 obs. of  2 variables:
 $ Code     : int  460 3000 3160 3610 3720 6450 10420 10500 10580 10740 ...
 $ MetroArea: Factor w/ 271 levels "Akron, OH","Albany, GA",..: 12 92 98 117 122 194 1 2 3 4 ...

How many observations (codes for countries) are there in CountryMap?

str(CountryMap) #149
'data.frame':   149 obs. of  2 variables:
 $ Code   : int  57 66 73 78 96 100 102 103 104 105 ...
 $ Country: Factor w/ 149 levels "Afghanistan",..: 138 57 105 141 97 3 11 18 24 36 ...

3.2

To merge in the metropolitan areas, we want to connect the field MetroAreaCode from the CPS data frame with the field Code in MetroAreaMap. The following command merges the two data frames on these columns, overwriting the CPS data frame with the result:

CPS = merge(CPS, MetroAreaMap, by.x="MetroAreaCode", by.y="Code", all.x=TRUE)

The first two arguments determine the data frames to be merged (they are called “x” and “y”, respectively, in the subsequent parameters to the merge function). by.x=“MetroAreaCode” means we’re matching on the MetroAreaCode variable from the “x” data frame (CPS), while by.y=“Code” means we’re matching on the Code variable from the “y” data frame (MetroAreaMap). Finally, all.x=TRUE means we want to keep all rows from the “x” data frame (CPS), even if some of the rows’ MetroAreaCode doesn’t match any codes in MetroAreaMap (for those familiar with database terminology, this parameter makes the operation a left outer join instead of an inner join).

Review the new version of the CPS data frame with the summary() and str() functions. What is the name of the variable that was added to the data frame by the merge() operation?

summary(CPS)
 MetroAreaCode   PeopleInHousehold       Region               State      
 Min.   :10420   Min.   : 1.000    Midwest  :30684   California  :11570  
 1st Qu.:21780   1st Qu.: 2.000    Northeast:25939   Texas       : 7077  
 Median :34740   Median : 3.000    South    :41502   New York    : 5595  
 Mean   :35075   Mean   : 3.284    West     :33177   Florida     : 5149  
 3rd Qu.:41860   3rd Qu.: 4.000                      Pennsylvania: 3930  
 Max.   :79600   Max.   :15.000                      Illinois    : 3912  
 NA's   :34238                                       (Other)     :94069  
      Age                 Married          Sex                          Education    
 Min.   : 0.00   Divorced     :11151   Female:67481   High school            :30906  
 1st Qu.:19.00   Married      :55509   Male  :63821   Bachelor's degree      :19443  
 Median :39.00   Never Married:30772                  Some college, no degree:18863  
 Mean   :38.83   Separated    : 2027                  No high school diploma :16095  
 3rd Qu.:57.00   Widowed      : 6505                  Associate degree       : 9913  
 Max.   :85.00   NA's         :25338                  (Other)                :10744  
                                                      NA's                   :25338  
               Race           Hispanic      CountryOfBirthCode
 American Indian :  1433   Min.   :0.0000   Min.   : 57.00    
 Asian           :  6520   1st Qu.:0.0000   1st Qu.: 57.00    
 Black           : 13913   Median :0.0000   Median : 57.00    
 Multiracial     :  2897   Mean   :0.1393   Mean   : 82.68    
 Pacific Islander:   618   3rd Qu.:0.0000   3rd Qu.: 57.00    
 White           :105921   Max.   :1.0000   Max.   :555.00    
                                                              
               Citizenship               EmploymentStatus
 Citizen, Native     :116639   Disabled          : 5712  
 Citizen, Naturalized:  7073   Employed          :61733  
 Non-Citizen         :  7590   Not in Labor Force:15246  
                               Retired           :18619  
                               Unemployed        : 4203  
                               NA's              :25789  
                                                         
                               Industry    
 Educational and health services   :15017  
 Trade                             : 8933  
 Professional and business services: 7519  
 Manufacturing                     : 6791  
 Leisure and hospitality           : 6364  
 (Other)                           :21618  
 NA's                              :65060  
                                              MetroArea    
 New York-Northern New Jersey-Long Island, NY-NJ-PA: 5409  
 Washington-Arlington-Alexandria, DC-VA-MD-WV      : 4177  
 Los Angeles-Long Beach-Santa Ana, CA              : 4102  
 Philadelphia-Camden-Wilmington, PA-NJ-DE          : 2855  
 Chicago-Naperville-Joliet, IN-IN-WI               : 2772  
 (Other)                                           :77749  
 NA's                                              :34238  

How many interviewees have a missing value for the new metropolitan area variable? Note that all of these interviewees would have been removed from the merged data frame if we did not include the all.x=TRUE parameter.

3.3

Which of the following metropolitan areas has the largest number of interviewees?

  • Atlanta-Sandy Springs-Marietta, GA
  • Baltimore-Towson, MD
  • Boston-Cambridge-Quincy, MA-NH
  • San Francisco-Oakland-Fremont, CA

3.4

Which metropolitan area has the highest proportion of interviewees of Hispanic ethnicity? Hint: Use tapply() with mean, as in the previous subproblem. Calling sort() on the output of tapply() could also be helpful here.

3.5

Remembering that CPS$Race == “Asian” returns a TRUE/FALSE vector of whether an interviewee is Asian, determine the number of metropolitan areas in the United States from which at least 20% of interviewees are Asian.

3.6

Normally, we would look at the sorted proportion of interviewees from each metropolitan area who have not received a high school diploma with the command:

sort(tapply(CPS$Education == "No high school diploma", CPS$MetroArea, mean))

However, none of the interviewees aged 14 and younger have an education value reported, so the mean value is reported as NA for each metropolitan area. To get mean (and related functions, like sum) to ignore missing values, you can pass the parameter na.rm=TRUE. Passing na.rm=TRUE to the tapply function, determine which metropolitan area has the smallest proportion of interviewees who have received no high school diploma.

Section 4 - Integrating Country of Birth Data

Just as we did with the metropolitan area information, merge in the country of birth information from the CountryMap data frame, replacing the CPS data frame with the result. If you accidentally overwrite CPS with the wrong values, remember that you can restore it by re-loading the data frame from CPSData.csv and then merging in the metropolitan area information using the command provided in the previous subproblem.

4.1

What is the name of the variable added to the CPS data frame by this merge operation?

How many interviewees have a missing value for the new country of birth variable?

4.2

Among all interviewees born outside of North America, which country was the most common place of birth?

4.3

What proportion of the interviewees from the “New York-Northern New Jersey-Long Island, NY-NJ-PA” metropolitan area have a country of birth that is not the United States? For this computation, don’t include people from this metropolitan area who have a missing country of birth.

4.4

Which metropolitan area has the largest number (note – not proportion) of interviewees with a country of birth in India? Hint – remember to include na.rm=TRUE if you are using tapply() to answer this question.

  • Boston-Cambridge-Quincy, MA-NH
  • Minneapolis-St Paul-Bloomington, MN-WI
  • New York-Northern New Jersey-Long Island, NY-NJ-PA
  • Washington-Arlington-Alexandria, DC-VA-MD-WV

In Brazil?

  • Boston-Cambridge-Quincy, MA-NH
  • Minneapolis-St Paul-Bloomington, MN-WI
  • New York-Northern New Jersey-Long Island, NY-NJ-PA
  • Washington-Arlington-Alexandria, DC-VA-MD-WV

In Somalia?

  • Boston-Cambridge-Quincy, MA-NH
  • Minneapolis-St Paul-Bloomington, MN-WI
  • New York-Northern New Jersey-Long Island, NY-NJ-PA
  • Washington-Arlington-Alexandria, DC-VA-MD-WV
LS0tCnRpdGxlOiAiQVMxLTMgRGVtb2dyYXBoaWNzIGFuZCBFbXBsb3ltZW50IGluIHRoZSBVbml0ZWQgU3RhdGVzIgphdXRob3I6ICLpmbPpn7vljYkgQjAzNDAyMDAyNyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKLSAtIC0KSW4gdGhlIHdha2Ugb2YgdGhlIEdyZWF0IFJlY2Vzc2lvbiBvZiAyMDA5LCB0aGVyZSBoYXMgYmVlbiBhIGdvb2QgZGVhbCBvZiBmb2N1cyBvbiBlbXBsb3ltZW50IHN0YXRpc3RpY3MsIG9uZSBvZiB0aGUgbW9zdCBpbXBvcnRhbnQgbWV0cmljcyBwb2xpY3ltYWtlcnMgdXNlIHRvIGdhdWdlIHRoZSBvdmVyYWxsIHN0cmVuZ3RoIG9mIHRoZSBlY29ub215LiBJbiB0aGUgVW5pdGVkIFN0YXRlcywgdGhlIGdvdmVybm1lbnQgbWVhc3VyZXMgdW5lbXBsb3ltZW50IHVzaW5nIHRoZSBDdXJyZW50IFBvcHVsYXRpb24gU3VydmV5IChDUFMpLCB3aGljaCBjb2xsZWN0cyBkZW1vZ3JhcGhpYyBhbmQgZW1wbG95bWVudCBpbmZvcm1hdGlvbiBmcm9tIGEgd2lkZSByYW5nZSBvZiBBbWVyaWNhbnMgZWFjaCBtb250aC4gSW4gdGhpcyBleGVyY2lzZSwgd2Ugd2lsbCBlbXBsb3kgdGhlIHRvcGljcyByZXZpZXdlZCBpbiB0aGUgbGVjdHVyZXMgYXMgd2VsbCBhcyBhIGZldyBuZXcgdGVjaG5pcXVlcyB1c2luZyB0aGUgU2VwdGVtYmVyIDIwMTMgdmVyc2lvbiBvZiB0aGlzIHJpY2gsIG5hdGlvbmFsbHkgcmVwcmVzZW50YXRpdmUgZGF0YXNldCAoYXZhaWxhYmxlIG9ubGluZSkuCgpUaGUgb2JzZXJ2YXRpb25zIGluIHRoZSBkYXRhc2V0IHJlcHJlc2VudCBwZW9wbGUgc3VydmV5ZWQgaW4gdGhlIFNlcHRlbWJlciAyMDEzIENQUyB3aG8gYWN0dWFsbHkgY29tcGxldGVkIGEgc3VydmV5LiBXaGlsZSB0aGUgZnVsbCBkYXRhc2V0IGhhcyAzODUgdmFyaWFibGVzLCBpbiB0aGlzIGV4ZXJjaXNlIHdlIHdpbGwgdXNlIGEgbW9yZSBjb21wYWN0IHZlcnNpb24gb2YgdGhlIGRhdGFzZXQsIENQU0RhdGEuY3N2LCB3aGljaCBoYXMgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXM6CgpQZW9wbGVJbkhvdXNlaG9sZDogVGhlIG51bWJlciBvZiBwZW9wbGUgaW4gdGhlIGludGVydmlld2VlJ3MgaG91c2Vob2xkLgoKUmVnaW9uOiBUaGUgY2Vuc3VzIHJlZ2lvbiB3aGVyZSB0aGUgaW50ZXJ2aWV3ZWUgbGl2ZXMuCgpTdGF0ZTogVGhlIHN0YXRlIHdoZXJlIHRoZSBpbnRlcnZpZXdlZSBsaXZlcy4KCk1ldHJvQXJlYUNvZGU6IEEgY29kZSB0aGF0IGlkZW50aWZpZXMgdGhlIG1ldHJvcG9saXRhbiBhcmVhIGluIHdoaWNoIHRoZSBpbnRlcnZpZXdlZSBsaXZlcyAobWlzc2luZyBpZiB0aGUgaW50ZXJ2aWV3ZWUgZG9lcyBub3QgbGl2ZSBpbiBhIG1ldHJvcG9saXRhbiBhcmVhKS4gVGhlIG1hcHBpbmcgZnJvbSBjb2RlcyB0byBuYW1lcyBvZiBtZXRyb3BvbGl0YW4gYXJlYXMgaXMgcHJvdmlkZWQgaW4gdGhlIGZpbGUgTWV0cm9BcmVhQ29kZXMuY3N2LgoKQWdlOiBUaGUgYWdlLCBpbiB5ZWFycywgb2YgdGhlIGludGVydmlld2VlLiA4MCByZXByZXNlbnRzIHBlb3BsZSBhZ2VkIDgwLTg0LCBhbmQgODUgcmVwcmVzZW50cyBwZW9wbGUgYWdlZCA4NSBhbmQgaGlnaGVyLgoKTWFycmllZDogVGhlIG1hcnJpYWdlIHN0YXR1cyBvZiB0aGUgaW50ZXJ2aWV3ZWUuCgpTZXg6IFRoZSBzZXggb2YgdGhlIGludGVydmlld2VlLgoKRWR1Y2F0aW9uOiBUaGUgbWF4aW11bSBsZXZlbCBvZiBlZHVjYXRpb24gb2J0YWluZWQgYnkgdGhlIGludGVydmlld2VlLgoKUmFjZTogVGhlIHJhY2Ugb2YgdGhlIGludGVydmlld2VlLgoKSGlzcGFuaWM6IFdoZXRoZXIgdGhlIGludGVydmlld2VlIGlzIG9mIEhpc3BhbmljIGV0aG5pY2l0eS4KCkNvdW50cnlPZkJpcnRoQ29kZTogQSBjb2RlIGlkZW50aWZ5aW5nIHRoZSBjb3VudHJ5IG9mIGJpcnRoIG9mIHRoZSBpbnRlcnZpZXdlZS4gVGhlIG1hcHBpbmcgZnJvbSBjb2RlcyB0byBuYW1lcyBvZiBjb3VudHJpZXMgaXMgcHJvdmlkZWQgaW4gdGhlIGZpbGUgQ291bnRyeUNvZGVzLmNzdi4KCkNpdGl6ZW5zaGlwOiBUaGUgVW5pdGVkIFN0YXRlcyBjaXRpemVuc2hpcCBzdGF0dXMgb2YgdGhlIGludGVydmlld2VlLgoKRW1wbG95bWVudFN0YXR1czogVGhlIHN0YXR1cyBvZiBlbXBsb3ltZW50IG9mIHRoZSBpbnRlcnZpZXdlZS4KCkluZHVzdHJ5OiBUaGUgaW5kdXN0cnkgb2YgZW1wbG95bWVudCBvZiB0aGUgaW50ZXJ2aWV3ZWUgKG9ubHkgYXZhaWxhYmxlIGlmIHRoZXkgYXJlIGVtcGxveWVkKS4KCgojIyMgU2VjdGlvbiAxIC0gTG9hZGluZyBhbmQgU3VtbWFyaXppbmcgdGhlIERhdGFzZXQKCiMjIyMgMS4xIApMb2FkIHRoZSBkYXRhc2V0IGZyb20gQ1BTRGF0YS5jc3YgaW50byBhIGRhdGEgZnJhbWUgY2FsbGVkIENQUywgYW5kIHZpZXcgdGhlIGRhdGFzZXQgd2l0aCB0aGUgc3VtbWFyeSgpIGFuZCBzdHIoKSBjb21tYW5kcy4KCmBgYHtyfQpDUFMgPSByZWFkLmNzdigiZGF0YS9DUFNEYXRhLmNzdiIpCnN1bW1hcnkoQ1BTKQpzdHIoQ1BTKQpgYGAKCgojIyMjIDEuMiAKQW1vbmcgdGhlIGludGVydmlld2VlcyB3aXRoIGEgdmFsdWUgcmVwb3J0ZWQgZm9yIHRoZSBJbmR1c3RyeSB2YXJpYWJsZSwgd2hhdCBpcyB0aGUgbW9zdCBjb21tb24gaW5kdXN0cnkgb2YgZW1wbG95bWVudD8gUGxlYXNlIGVudGVyIHRoZSBuYW1lIGV4YWN0bHkgaG93IHlvdSBzZWUgaXQuCmBgYHtyfQojYW5zOiBFZHVjYXRpb25hbCBhbmQgaGVhbHRoIHNlcnZpY2VzCmBgYAoKCiMjIyMgMS4zIApSZWNhbGwgZnJvbSB0aGUgaG9tZXdvcmsgYXNzaWdubWVudCAiVGhlIEFuYWx5dGljYWwgRGV0ZWN0aXZlIiB0aGF0IHlvdSBjYW4gY2FsbCB0aGUgc29ydCgpIGZ1bmN0aW9uIG9uIHRoZSBvdXRwdXQgb2YgdGhlIHRhYmxlKCkgZnVuY3Rpb24gdG8gb2J0YWluIGEgc29ydGVkIGJyZWFrZG93biBvZiBhIHZhcmlhYmxlLiBGb3IgaW5zdGFuY2UsIHNvcnQodGFibGUoQ1BTJFJlZ2lvbikpIHNvcnRzIHRoZSByZWdpb25zIGJ5IHRoZSBudW1iZXIgb2YgaW50ZXJ2aWV3ZWVzIGZyb20gdGhhdCByZWdpb24uCgpXaGljaCBzdGF0ZSBoYXMgdGhlIGZld2VzdCBpbnRlcnZpZXdlZXM/CgpgYGB7cn0Kc29ydCh0YWJsZShDUFMkU3RhdGUpKSAjYW5zOk5ldyBNZXhpY28KYGBgCgpXaGljaCBzdGF0ZSBoYXMgdGhlIGxhcmdlc3QgbnVtYmVyIG9mIGludGVydmlld2Vlcz8KCmBgYHtyfQojYW5zOiBDYWxpZm9ybmlhCmBgYAoKCiMjIyMgMS40IApXaGF0IHByb3BvcnRpb24gb2YgaW50ZXJ2aWV3ZWVzIGFyZSBjaXRpemVucyBvZiB0aGUgVW5pdGVkIFN0YXRlcz8KYGBge3J9CnN1bW1hcnkoQ1BTJENpdGl6ZW5zaGlwID09ICJDaXRpemVuLCBOYXRpdmUiIHwgQ1BTJENpdGl6ZW5zaGlwID09ICJDaXRpemVuLCBOYXR1cmFsaXplZCIpCjEyMzcxMi9ucm93KENQUykKYGBgCgojIyMjIDEuNSAKVGhlIENQUyBkaWZmZXJlbnRpYXRlcyBiZXR3ZWVuIHJhY2UgKHdpdGggcG9zc2libGUgdmFsdWVzIEFtZXJpY2FuIEluZGlhbiwgQXNpYW4sIEJsYWNrLCBQYWNpZmljIElzbGFuZGVyLCBXaGl0ZSwgb3IgTXVsdGlyYWNpYWwpIGFuZCBldGhuaWNpdHkuIEEgbnVtYmVyIG9mIGludGVydmlld2VlcyBhcmUgb2YgSGlzcGFuaWMgZXRobmljaXR5LCBhcyBjYXB0dXJlZCBieSB0aGUgSGlzcGFuaWMgdmFyaWFibGUuIEZvciB3aGljaCByYWNlcyBhcmUgdGhlcmUgYXQgbGVhc3QgMjUwIGludGVydmlld2VlcyBpbiB0aGUgQ1BTIGRhdGFzZXQgb2YgSGlzcGFuaWMgZXRobmljaXR5PyAoU2VsZWN0IGFsbCB0aGF0IGFwcGx5LikKCisgQW1lcmljYW4gSW5kaWFuCisgQXNpYW4KKyBCbGFjaworIE11bHRpcmFjaWFsCisgUGFjaWZpYyBJc2xhbmRlcgorIFdoaXRlCgpgYGB7cn0KdGFibGUoQ1BTJFJhY2UsQ1BTJEhpc3BhbmljKQojYW5zOiBBbWVyaWNhbiBJbmRpYW4sQmxhY2ssTXVsdGlyYWNpYWwsIFdoaXRlCmBgYAoKCiMjIyBTZWN0aW9uIDIgLSBFdmFsdWF0aW5nIE1pc3NpbmcgVmFsdWVzCgojIyMjIDIuMQoKV2hpY2ggdmFyaWFibGVzIGhhdmUgYXQgbGVhc3Qgb25lIGludGVydmlld2VlIHdpdGggYSBtaXNzaW5nIChOQSkgdmFsdWU/IChTZWxlY3QgYWxsIHRoYXQgYXBwbHkuKQoKKyBQZW9wbGVJbkhvdXNlaG9sZAorIFJlZ2lvbgorIFN0YXRlCisgTWV0cm9BcmVhQ29kZQorIEFnZQorIE1hcnJpZWQKKyBTZXgKKyBFZHVjYXRpb24KKyBSYWNlCisgSGlzcGFuaWMKKyBDb3VudHJ5T2ZCaXJ0aENvZGUKKyBDaXRpemVuc2hpcAorIEVtcGxveW1lbnRTdGF0dXMKKyBJbmR1c3RyeQoKYGBge3J9CiNhbnM6IE1ldHJvQXJlYUNvZGUsTWFycmllZCxFZHVjYXRpb24sRW1wbG95bWVudFN0YXR1cyxJbmR1c3RyeQpgYGAKCgojIyMjIDIuMiAKCk9mdGVuIHdoZW4gZXZhbHVhdGluZyBhIG5ldyBkYXRhc2V0LCB3ZSB0cnkgdG8gaWRlbnRpZnkgaWYgdGhlcmUgaXMgYSBwYXR0ZXJuIGluIHRoZSBtaXNzaW5nIHZhbHVlcyBpbiB0aGUgZGF0YXNldC4gV2Ugd2lsbCB0cnkgdG8gZGV0ZXJtaW5lIGlmIHRoZXJlIGlzIGEgcGF0dGVybiBpbiB0aGUgbWlzc2luZyB2YWx1ZXMgb2YgdGhlIE1hcnJpZWQgdmFyaWFibGUuIFRoZSBmdW5jdGlvbiAgIAoKICAgIGlzLm5hKENQUyRNYXJyaWVkKSAKCnJldHVybnMgYSB2ZWN0b3Igb2YgVFJVRS9GQUxTRSB2YWx1ZXMgZm9yIHdoZXRoZXIgdGhlIE1hcnJpZWQgdmFyaWFibGUgaXMgbWlzc2luZy4gV2UgY2FuIHNlZSB0aGUgYnJlYWtkb3duIG9mIHdoZXRoZXIgTWFycmllZCBpcyBtaXNzaW5nIGJhc2VkIG9uIHRoZSByZXBvcnRlZCB2YWx1ZSBvZiB0aGUgUmVnaW9uIHZhcmlhYmxlIHdpdGggdGhlIGZ1bmN0aW9uIAoKICAgIHRhYmxlKENQUyRSZWdpb24sIGlzLm5hKENQUyRNYXJyaWVkKSkKCldoaWNoIGlzIHRoZSBtb3N0IGFjY3VyYXRlOgoKKyBUaGUgTWFycmllZCB2YXJpYWJsZSBiZWluZyBtaXNzaW5nIGlzIHJlbGF0ZWQgdG8gdGhlIFJlZ2lvbiB2YWx1ZSBmb3IgdGhlIGludGVydmlld2VlLgorIFRoZSBNYXJyaWVkIHZhcmlhYmxlIGJlaW5nIG1pc3NpbmcgaXMgcmVsYXRlZCB0byB0aGUgU2V4IHZhbHVlIGZvciB0aGUgaW50ZXJ2aWV3ZWUuCisgVGhlIE1hcnJpZWQgdmFyaWFibGUgYmVpbmcgbWlzc2luZyBpcyByZWxhdGVkIHRvIHRoZSBBZ2UgdmFsdWUgZm9yIHRoZSBpbnRlcnZpZXdlZS4KKyBUaGUgTWFycmllZCB2YXJpYWJsZSBiZWluZyBtaXNzaW5nIGlzIHJlbGF0ZWQgdG8gdGhlIENpdGl6ZW5zaGlwIHZhbHVlIGZvciB0aGUgaW50ZXJ2aWV3ZWUuCisgVGhlIE1hcnJpZWQgdmFyaWFibGUgYmVpbmcgbWlzc2luZyBpcyBub3QgcmVsYXRlZCB0byB0aGUgUmVnaW9uLCBTZXgsIEFnZSwgb3IgQ2l0aXplbnNoaXAgdmFsdWUgZm9yIHRoZSBpbnRlcnZpZXdlZS4KCmBgYHtyfQp0YWJsZShDUFMkUmVnaW9uLCBpcy5uYShDUFMkTWFycmllZCkpCnRhYmxlKENQUyRTZXgsIGlzLm5hKENQUyRNYXJyaWVkKSkKdGFibGUoQ1BTJEFnZSwgaXMubmEoQ1BTJE1hcnJpZWQpKQp0YWJsZShDUFMkQ2l0aXplbnNoaXAsIGlzLm5hKENQUyRNYXJyaWVkKSkKCiNhbnM6IFRoZSBNYXJyaWVkIHZhcmlhYmxlIGJlaW5nIG1pc3NpbmcgaXMgcmVsYXRlZCB0byB0aGUgQWdlIHZhbHVlIGZvciB0aGUgaW50ZXJ2aWV3ZWUuCmBgYAoKCiMjIyMgMi4zCkFzIG1lbnRpb25lZCBpbiB0aGUgdmFyaWFibGUgZGVzY3JpcHRpb25zLCBNZXRyb0FyZWFDb2RlIGlzIG1pc3NpbmcgaWYgYW4gaW50ZXJ2aWV3ZWUgZG9lcyBub3QgbGl2ZSBpbiBhIG1ldHJvcG9saXRhbiBhcmVhLiBVc2luZyB0aGUgc2FtZSB0ZWNobmlxdWUgYXMgaW4gdGhlIHByZXZpb3VzIHF1ZXN0aW9uLCBhbnN3ZXIgdGhlIGZvbGxvd2luZyBxdWVzdGlvbnMgYWJvdXQgcGVvcGxlIHdobyBsaXZlIGluIG5vbi1tZXRyb3BvbGl0YW4gYXJlYXMuCgpIb3cgbWFueSBzdGF0ZXMgaGFkIGFsbCBpbnRlcnZpZXdlZXMgbGl2aW5nIGluIGEgbm9uLW1ldHJvcG9saXRhbiBhcmVhIChha2EgdGhleSBoYXZlIGEgbWlzc2luZyBNZXRyb0FyZWFDb2RlIHZhbHVlKT8gRm9yIHRoaXMgcXVlc3Rpb24sIHRyZWF0IHRoZSBEaXN0cmljdCBvZiBDb2x1bWJpYSBhcyBhIHN0YXRlIChldmVuIHRob3VnaCBpdCBpcyBub3QgdGVjaG5pY2FsbHkgYSBzdGF0ZSkuCgoKYGBge3J9CnRhYmxlKENQUyRTdGF0ZSxpcy5uYShDUFMkTWV0cm9BcmVhQ29kZSkpICNhbnM6IEFsYXNrYSxXeW9taW5nCmBgYAoKCkhvdyBtYW55IHN0YXRlcyBoYWQgYWxsIGludGVydmlld2VlcyBsaXZpbmcgaW4gYSBtZXRyb3BvbGl0YW4gYXJlYT8gQWdhaW4sIHRyZWF0IHRoZSBEaXN0cmljdCBvZiBDb2x1bWJpYSBhcyBhIHN0YXRlLgoKYGBge3J9CiNhbnM6IERpc3RyaWN0IG9mIENvbHVtYmlhLE5ldyBKZXJzZXksUmhvZGUgSXNsYW5kCmBgYAoKIyMjIyAyLjQgCldoaWNoIHJlZ2lvbiBvZiB0aGUgVW5pdGVkIFN0YXRlcyBoYXMgdGhlIGxhcmdlc3QgcHJvcG9ydGlvbiBvZiBpbnRlcnZpZXdlZXMgbGl2aW5nIGluIGEgbm9uLW1ldHJvcG9saXRhbiBhcmVhPwoKKyBNaWR3ZXN0CisgTm9ydGhlYXN0CisgU291dGgKKyBXZXN0CgpgYGB7cn0KdGFibGUoQ1BTJFJlZ2lvbixpcy5uYShDUFMkTWV0cm9BcmVhQ29kZSkpICNhbnM6IE1pZHdlc3Qg6L+R5LqM5YiG5LmL5LiACmBgYAoKIyMjIyAyLjUgCldoaWxlIHdlIHdlcmUgYWJsZSB0byB1c2UgdGhlIHRhYmxlKCkgY29tbWFuZCB0byBjb21wdXRlIHRoZSBwcm9wb3J0aW9uIG9mIGludGVydmlld2VlcyBmcm9tIGVhY2ggcmVnaW9uIG5vdCBsaXZpbmcgaW4gYSBtZXRyb3BvbGl0YW4gYXJlYSwgaXQgd2FzIHNvbWV3aGF0IHRlZGlvdXMgKGl0IGludm9sdmVkIG1hbnVhbGx5IGNvbXB1dGluZyB0aGUgcHJvcG9ydGlvbiBmb3IgZWFjaCByZWdpb24pIGFuZCBpc24ndCBzb21ldGhpbmcgeW91IHdvdWxkIHdhbnQgdG8gZG8gaWYgdGhlcmUgd2VyZSBhIGxhcmdlciBudW1iZXIgb2Ygb3B0aW9ucy4gSXQgdHVybnMgb3V0IHRoZXJlIGlzIGEgbGVzcyB0ZWRpb3VzIHdheSB0byBjb21wdXRlIHRoZSBwcm9wb3J0aW9uIG9mIHZhbHVlcyB0aGF0IGFyZSBUUlVFLiBUaGUgbWVhbigpIGZ1bmN0aW9uLCB3aGljaCB0YWtlcyB0aGUgYXZlcmFnZSBvZiB0aGUgdmFsdWVzIHBhc3NlZCB0byBpdCwgd2lsbCB0cmVhdCBUUlVFIGFzIDEgYW5kIEZBTFNFIGFzIDAsIG1lYW5pbmcgaXQgcmV0dXJucyB0aGUgcHJvcG9ydGlvbiBvZiB2YWx1ZXMgdGhhdCBhcmUgdHJ1ZS4gRm9yIGluc3RhbmNlLCBtZWFuKGMoVFJVRSwgRkFMU0UsIFRSVUUsIFRSVUUpKSByZXR1cm5zIDAuNzUuIEtub3dpbmcgdGhpcywgdXNlIHRhcHBseSgpIHdpdGggdGhlIG1lYW4gZnVuY3Rpb24gdG8gYW5zd2VyIHRoZSBmb2xsb3dpbmcgcXVlc3Rpb25zOgoKV2hpY2ggc3RhdGUgaGFzIGEgcHJvcG9ydGlvbiBvZiBpbnRlcnZpZXdlZXMgbGl2aW5nIGluIGEgbm9uLW1ldHJvcG9saXRhbiBhcmVhIGNsb3Nlc3QgdG8gMzAlPwoKYGBge3J9CnNvcnQodGFwcGx5KGlzLm5hKENQUyRNZXRyb0FyZWFDb2RlKSxDUFMkU3RhdGUsbWVhbikpICNhbnM6IFdpc2NvbnNpbiAwLjI5OTMyOTg2CmBgYAoKCldoaWNoIHN0YXRlIGhhcyB0aGUgbGFyZ2VzdCBwcm9wb3J0aW9uIG9mIG5vbi1tZXRyb3BvbGl0YW4gaW50ZXJ2aWV3ZWVzLCBpZ25vcmluZyBzdGF0ZXMgd2hlcmUgYWxsIGludGVydmlld2VlcyB3ZXJlIG5vbi1tZXRyb3BvbGl0YW4/CgoKYGBge3J9CiNhbnM6IE1vbnRhbmEKYGBgCgojIyMgU2VjdGlvbiAzIC0gSW50ZWdyYXRpbmcgTWV0cm9wb2xpdGFuIEFyZWEgRGF0YQoKQ29kZXMgbGlrZSBNZXRyb0FyZWFDb2RlIGFuZCBDb3VudHJ5T2ZCaXJ0aENvZGUgYXJlIGEgY29tcGFjdCB3YXkgdG8gZW5jb2RlIGZhY3RvciB2YXJpYWJsZXMgd2l0aCB0ZXh0IGFzIHRoZWlyIHBvc3NpYmxlIHZhbHVlcywgYW5kIHRoZXkgYXJlIHRoZXJlZm9yZSBxdWl0ZSBjb21tb24gaW4gc3VydmV5IGRhdGFzZXRzLiBJbiBmYWN0LCBhbGwgYnV0IG9uZSBvZiB0aGUgdmFyaWFibGVzIGluIHRoaXMgZGF0YXNldCB3ZXJlIGFjdHVhbGx5IHN0b3JlZCBieSBhIG51bWVyaWMgY29kZSBpbiB0aGUgb3JpZ2luYWwgQ1BTIGRhdGFmaWxlLgoKV2hlbiBhbmFseXppbmcgYSB2YXJpYWJsZSBzdG9yZWQgYnkgYSBudW1lcmljIGNvZGUsIHdlIHdpbGwgb2Z0ZW4gd2FudCB0byBjb252ZXJ0IGl0IGludG8gdGhlIHZhbHVlcyB0aGUgY29kZXMgcmVwcmVzZW50LiBUbyBkbyB0aGlzLCB3ZSB3aWxsIHVzZSBhIGRpY3Rpb25hcnksIHdoaWNoIG1hcHMgdGhlIHRoZSBjb2RlIHRvIHRoZSBhY3R1YWwgdmFsdWUgb2YgdGhlIHZhcmlhYmxlLiBXZSBoYXZlIHByb3ZpZGVkIGRpY3Rpb25hcmllcyBNZXRyb0FyZWFDb2Rlcy5jc3YgYW5kIENvdW50cnlDb2Rlcy5jc3YsIHdoaWNoIHJlc3BlY3RpdmVseSBtYXAgTWV0cm9BcmVhQ29kZSBhbmQgQ291bnRyeU9mQmlydGhDb2RlIGludG8gdGhlaXIgdHJ1ZSB2YWx1ZXMuIFJlYWQgdGhlc2UgdHdvIGRpY3Rpb25hcmllcyBpbnRvIGRhdGEgZnJhbWVzIE1ldHJvQXJlYU1hcCBhbmQgQ291bnRyeU1hcC4KCmBgYHtyfQpNZXRyb0FyZWFNYXAgPSByZWFkLmNzdigiZGF0YS9NZXRyb0FyZWFDb2Rlcy5jc3YiKQpDb3VudHJ5TWFwID0gcmVhZC5jc3YoImRhdGEvQ291bnRyeUNvZGVzLmNzdiIpCmBgYAoKCiMjIyMgMy4xCgpIb3cgbWFueSBvYnNlcnZhdGlvbnMgKGNvZGVzIGZvciBtZXRyb3BvbGl0YW4gYXJlYXMpIGFyZSB0aGVyZSBpbiBNZXRyb0FyZWFNYXA/CgpgYGB7cn0Kc3RyKE1ldHJvQXJlYU1hcCkgIzI3MQpgYGAKCkhvdyBtYW55IG9ic2VydmF0aW9ucyAoY29kZXMgZm9yIGNvdW50cmllcykgYXJlIHRoZXJlIGluIENvdW50cnlNYXA/CgpgYGB7cn0Kc3RyKENvdW50cnlNYXApICMxNDkKYGBgCgoKIyMjIyAzLjIKVG8gbWVyZ2UgaW4gdGhlIG1ldHJvcG9saXRhbiBhcmVhcywgd2Ugd2FudCB0byBjb25uZWN0IHRoZSBmaWVsZCBNZXRyb0FyZWFDb2RlIGZyb20gdGhlIENQUyBkYXRhIGZyYW1lIHdpdGggdGhlIGZpZWxkIENvZGUgaW4gTWV0cm9BcmVhTWFwLiBUaGUgZm9sbG93aW5nIGNvbW1hbmQgbWVyZ2VzIHRoZSB0d28gZGF0YSBmcmFtZXMgb24gdGhlc2UgY29sdW1ucywgb3ZlcndyaXRpbmcgdGhlIENQUyBkYXRhIGZyYW1lIHdpdGggdGhlIHJlc3VsdDoKCiAgICBDUFMgPSBtZXJnZShDUFMsIE1ldHJvQXJlYU1hcCwgYnkueD0iTWV0cm9BcmVhQ29kZSIsIGJ5Lnk9IkNvZGUiLCBhbGwueD1UUlVFKQoKVGhlIGZpcnN0IHR3byBhcmd1bWVudHMgZGV0ZXJtaW5lIHRoZSBkYXRhIGZyYW1lcyB0byBiZSBtZXJnZWQgKHRoZXkgYXJlIGNhbGxlZCAieCIgYW5kICJ5IiwgcmVzcGVjdGl2ZWx5LCBpbiB0aGUgc3Vic2VxdWVudCBwYXJhbWV0ZXJzIHRvIHRoZSBtZXJnZSBmdW5jdGlvbikuIGJ5Lng9Ik1ldHJvQXJlYUNvZGUiIG1lYW5zIHdlJ3JlIG1hdGNoaW5nIG9uIHRoZSBNZXRyb0FyZWFDb2RlIHZhcmlhYmxlIGZyb20gdGhlICJ4IiBkYXRhIGZyYW1lIChDUFMpLCB3aGlsZSBieS55PSJDb2RlIiBtZWFucyB3ZSdyZSBtYXRjaGluZyBvbiB0aGUgQ29kZSB2YXJpYWJsZSBmcm9tIHRoZSAieSIgZGF0YSBmcmFtZSAoTWV0cm9BcmVhTWFwKS4gRmluYWxseSwgYWxsLng9VFJVRSBtZWFucyB3ZSB3YW50IHRvIGtlZXAgYWxsIHJvd3MgZnJvbSB0aGUgIngiIGRhdGEgZnJhbWUgKENQUyksIGV2ZW4gaWYgc29tZSBvZiB0aGUgcm93cycgTWV0cm9BcmVhQ29kZSBkb2Vzbid0IG1hdGNoIGFueSBjb2RlcyBpbiBNZXRyb0FyZWFNYXAgKGZvciB0aG9zZSBmYW1pbGlhciB3aXRoIGRhdGFiYXNlIHRlcm1pbm9sb2d5LCB0aGlzIHBhcmFtZXRlciBtYWtlcyB0aGUgb3BlcmF0aW9uIGEgbGVmdCBvdXRlciBqb2luIGluc3RlYWQgb2YgYW4gaW5uZXIgam9pbikuCgpgYGB7cn0KQ1BTID0gbWVyZ2UoQ1BTLCBNZXRyb0FyZWFNYXAsIGJ5Lng9Ik1ldHJvQXJlYUNvZGUiLCBieS55PSJDb2RlIiwgYWxsLng9VFJVRSkKYGBgCgoKUmV2aWV3IHRoZSBuZXcgdmVyc2lvbiBvZiB0aGUgQ1BTIGRhdGEgZnJhbWUgd2l0aCB0aGUgc3VtbWFyeSgpIGFuZCBzdHIoKSBmdW5jdGlvbnMuIFdoYXQgaXMgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRoYXQgd2FzIGFkZGVkIHRvIHRoZSBkYXRhIGZyYW1lIGJ5IHRoZSBtZXJnZSgpIG9wZXJhdGlvbj8KCgpgYGB7cn0Kc3VtbWFyeShDUFMpCmBgYAoKSG93IG1hbnkgaW50ZXJ2aWV3ZWVzIGhhdmUgYSBtaXNzaW5nIHZhbHVlIGZvciB0aGUgbmV3IG1ldHJvcG9saXRhbiBhcmVhIHZhcmlhYmxlPyBOb3RlIHRoYXQgYWxsIG9mIHRoZXNlIGludGVydmlld2VlcyB3b3VsZCBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBtZXJnZWQgZGF0YSBmcmFtZSBpZiB3ZSBkaWQgbm90IGluY2x1ZGUgdGhlIGFsbC54PVRSVUUgcGFyYW1ldGVyLgoKYGBge3J9CgpgYGAKCgojIyMjIDMuMwpXaGljaCBvZiB0aGUgZm9sbG93aW5nIG1ldHJvcG9saXRhbiBhcmVhcyBoYXMgdGhlIGxhcmdlc3QgbnVtYmVyIG9mIGludGVydmlld2Vlcz8KCisgQXRsYW50YS1TYW5keSBTcHJpbmdzLU1hcmlldHRhLCBHQQorIEJhbHRpbW9yZS1Ub3dzb24sIE1ECisgQm9zdG9uLUNhbWJyaWRnZS1RdWluY3ksIE1BLU5ICisgU2FuIEZyYW5jaXNjby1PYWtsYW5kLUZyZW1vbnQsIENBCgpgYGB7cn0KCmBgYAoKIyMjIyAzLjQKV2hpY2ggbWV0cm9wb2xpdGFuIGFyZWEgaGFzIHRoZSBoaWdoZXN0IHByb3BvcnRpb24gb2YgaW50ZXJ2aWV3ZWVzIG9mIEhpc3BhbmljIGV0aG5pY2l0eT8gSGludDogVXNlIHRhcHBseSgpIHdpdGggbWVhbiwgYXMgaW4gdGhlIHByZXZpb3VzIHN1YnByb2JsZW0uIENhbGxpbmcgc29ydCgpIG9uIHRoZSBvdXRwdXQgb2YgdGFwcGx5KCkgY291bGQgYWxzbyBiZSBoZWxwZnVsIGhlcmUuCgoKYGBge3J9CgpgYGAKCgojIyMjIDMuNQpSZW1lbWJlcmluZyB0aGF0IENQUyRSYWNlID09ICJBc2lhbiIgcmV0dXJucyBhIFRSVUUvRkFMU0UgdmVjdG9yIG9mIHdoZXRoZXIgYW4gaW50ZXJ2aWV3ZWUgaXMgQXNpYW4sIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIG1ldHJvcG9saXRhbiBhcmVhcyBpbiB0aGUgVW5pdGVkIFN0YXRlcyBmcm9tIHdoaWNoIGF0IGxlYXN0IDIwJSBvZiBpbnRlcnZpZXdlZXMgYXJlIEFzaWFuLgoKYGBge3J9CgpgYGAKCgojIyMjIDMuNgpOb3JtYWxseSwgd2Ugd291bGQgbG9vayBhdCB0aGUgc29ydGVkIHByb3BvcnRpb24gb2YgaW50ZXJ2aWV3ZWVzIGZyb20gZWFjaCBtZXRyb3BvbGl0YW4gYXJlYSB3aG8gaGF2ZSBub3QgcmVjZWl2ZWQgYSBoaWdoIHNjaG9vbCBkaXBsb21hIHdpdGggdGhlIGNvbW1hbmQ6CgogICAgc29ydCh0YXBwbHkoQ1BTJEVkdWNhdGlvbiA9PSAiTm8gaGlnaCBzY2hvb2wgZGlwbG9tYSIsIENQUyRNZXRyb0FyZWEsIG1lYW4pKQoKSG93ZXZlciwgbm9uZSBvZiB0aGUgaW50ZXJ2aWV3ZWVzIGFnZWQgMTQgYW5kIHlvdW5nZXIgaGF2ZSBhbiBlZHVjYXRpb24gdmFsdWUgcmVwb3J0ZWQsIHNvIHRoZSBtZWFuIHZhbHVlIGlzIHJlcG9ydGVkIGFzIE5BIGZvciBlYWNoIG1ldHJvcG9saXRhbiBhcmVhLiBUbyBnZXQgbWVhbiAoYW5kIHJlbGF0ZWQgZnVuY3Rpb25zLCBsaWtlIHN1bSkgdG8gaWdub3JlIG1pc3NpbmcgdmFsdWVzLCB5b3UgY2FuIHBhc3MgdGhlIHBhcmFtZXRlciBuYS5ybT1UUlVFLiBQYXNzaW5nIG5hLnJtPVRSVUUgdG8gdGhlIHRhcHBseSBmdW5jdGlvbiwgZGV0ZXJtaW5lIHdoaWNoIG1ldHJvcG9saXRhbiBhcmVhIGhhcyB0aGUgc21hbGxlc3QgcHJvcG9ydGlvbiBvZiBpbnRlcnZpZXdlZXMgd2hvIGhhdmUgcmVjZWl2ZWQgbm8gaGlnaCBzY2hvb2wgZGlwbG9tYS4KCiMjIyBTZWN0aW9uIDQgLSBJbnRlZ3JhdGluZyBDb3VudHJ5IG9mIEJpcnRoIERhdGEKCkp1c3QgYXMgd2UgZGlkIHdpdGggdGhlIG1ldHJvcG9saXRhbiBhcmVhIGluZm9ybWF0aW9uLCBtZXJnZSBpbiB0aGUgY291bnRyeSBvZiBiaXJ0aCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBDb3VudHJ5TWFwIGRhdGEgZnJhbWUsIHJlcGxhY2luZyB0aGUgQ1BTIGRhdGEgZnJhbWUgd2l0aCB0aGUgcmVzdWx0LiBJZiB5b3UgYWNjaWRlbnRhbGx5IG92ZXJ3cml0ZSBDUFMgd2l0aCB0aGUgd3JvbmcgdmFsdWVzLCByZW1lbWJlciB0aGF0IHlvdSBjYW4gcmVzdG9yZSBpdCBieSByZS1sb2FkaW5nIHRoZSBkYXRhIGZyYW1lIGZyb20gQ1BTRGF0YS5jc3YgYW5kIHRoZW4gbWVyZ2luZyBpbiB0aGUgbWV0cm9wb2xpdGFuIGFyZWEgaW5mb3JtYXRpb24gdXNpbmcgdGhlIGNvbW1hbmQgcHJvdmlkZWQgaW4gdGhlIHByZXZpb3VzIHN1YnByb2JsZW0uCgojIyMjIDQuMQpXaGF0IGlzIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSBhZGRlZCB0byB0aGUgQ1BTIGRhdGEgZnJhbWUgYnkgdGhpcyBtZXJnZSBvcGVyYXRpb24/CgpgYGB7cn0KCmBgYAoKSG93IG1hbnkgaW50ZXJ2aWV3ZWVzIGhhdmUgYSBtaXNzaW5nIHZhbHVlIGZvciB0aGUgbmV3IGNvdW50cnkgb2YgYmlydGggdmFyaWFibGU/CgpgYGB7cn0KCmBgYAoKIyMjIyA0LjIgCkFtb25nIGFsbCBpbnRlcnZpZXdlZXMgYm9ybiBvdXRzaWRlIG9mIE5vcnRoIEFtZXJpY2EsIHdoaWNoIGNvdW50cnkgd2FzIHRoZSBtb3N0IGNvbW1vbiBwbGFjZSBvZiBiaXJ0aD8KCmBgYHtyfQoKYGBgCgojIyMjIDQuMwpXaGF0IHByb3BvcnRpb24gb2YgdGhlIGludGVydmlld2VlcyBmcm9tIHRoZSAiTmV3IFlvcmstTm9ydGhlcm4gTmV3IEplcnNleS1Mb25nIElzbGFuZCwgTlktTkotUEEiIG1ldHJvcG9saXRhbiBhcmVhIGhhdmUgYSBjb3VudHJ5IG9mIGJpcnRoIHRoYXQgaXMgbm90IHRoZSBVbml0ZWQgU3RhdGVzPyBGb3IgdGhpcyBjb21wdXRhdGlvbiwgZG9uJ3QgaW5jbHVkZSBwZW9wbGUgZnJvbSB0aGlzIG1ldHJvcG9saXRhbiBhcmVhIHdobyBoYXZlIGEgbWlzc2luZyBjb3VudHJ5IG9mIGJpcnRoLgoKCmBgYHtyfQoKYGBgCgoKIyMjIyA0LjQKV2hpY2ggbWV0cm9wb2xpdGFuIGFyZWEgaGFzIHRoZSBsYXJnZXN0IG51bWJlciAobm90ZSAtLSBub3QgcHJvcG9ydGlvbikgb2YgaW50ZXJ2aWV3ZWVzIHdpdGggYSBjb3VudHJ5IG9mIGJpcnRoIGluIEluZGlhPyBIaW50IC0tIHJlbWVtYmVyIHRvIGluY2x1ZGUgbmEucm09VFJVRSBpZiB5b3UgYXJlIHVzaW5nIHRhcHBseSgpIHRvIGFuc3dlciB0aGlzIHF1ZXN0aW9uLgoKKyBCb3N0b24tQ2FtYnJpZGdlLVF1aW5jeSwgTUEtTkgKKyBNaW5uZWFwb2xpcy1TdCBQYXVsLUJsb29taW5ndG9uLCBNTi1XSQorIE5ldyBZb3JrLU5vcnRoZXJuIE5ldyBKZXJzZXktTG9uZyBJc2xhbmQsIE5ZLU5KLVBBCisgV2FzaGluZ3Rvbi1Bcmxpbmd0b24tQWxleGFuZHJpYSwgREMtVkEtTUQtV1YKCmBgYHtyfQoKYGBgCgpJbiBCcmF6aWw/CgorIEJvc3Rvbi1DYW1icmlkZ2UtUXVpbmN5LCBNQS1OSAorIE1pbm5lYXBvbGlzLVN0IFBhdWwtQmxvb21pbmd0b24sIE1OLVdJCisgTmV3IFlvcmstTm9ydGhlcm4gTmV3IEplcnNleS1Mb25nIElzbGFuZCwgTlktTkotUEEKKyBXYXNoaW5ndG9uLUFybGluZ3Rvbi1BbGV4YW5kcmlhLCBEQy1WQS1NRC1XVgoKYGBge3J9CgpgYGAKCkluIFNvbWFsaWE/CgorIEJvc3Rvbi1DYW1icmlkZ2UtUXVpbmN5LCBNQS1OSAorIE1pbm5lYXBvbGlzLVN0IFBhdWwtQmxvb21pbmd0b24sIE1OLVdJCisgTmV3IFlvcmstTm9ydGhlcm4gTmV3IEplcnNleS1Mb25nIElzbGFuZCwgTlktTkotUEEKKyBXYXNoaW5ndG9uLUFybGluZ3Rvbi1BbGV4YW5kcmlhLCBEQy1WQS1NRC1XVgoKYGBge3J9CgpgYGAKCgoKCgoK