library(dplyr)

Section-1 Loading and Summarizing the Dataset

§ 1.1 How many interviewees are in the dataset?

CPS = read.csv("data/CPSData.csv")
nrow(CPS)
[1] 131302

§ 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.

sort(table(CPS$Industry)) %>% tail  # Educational and health services

                      Construction            Leisure and hospitality 
                              4387                               6364 
                     Manufacturing Professional and business services 
                              6791                               7519 
                             Trade    Educational and health services 
                              8933                              15017 

§ 1.3 Which state has the fewest interviewees?

head(sort(table(CPS$State)))  # New Mexico

   New Mexico       Montana   Mississippi       Alabama West Virginia 
         1102          1214          1230          1376          1409 
     Arkansas 
         1421 

Which state has the largest number of interviewees?

tail(sort(table(CPS$State))) # California

    Illinois Pennsylvania      Florida     New York        Texas   California 
        3912         3930         5149         5595         7077        11570 

§ 1.4 What proportion of interviewees are citizens of the United States?

table(CPS$Citizenship) %>% prop.table

     Citizen, Native Citizen, Naturalized          Non-Citizen 
            0.888326             0.053868             0.057806 
table(CPS$Citizenship == "Non-Citizen") %>% prop.table  # 0.942194

   FALSE     TRUE 
0.942194 0.057806 

§ 1.5 For which races are there at least 250 interviewees in the CPS dataset of Hispanic ethnicity? (Select all that apply.)

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




Section-2 Evaluating Missing Values

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

colSums(is.na(CPS)) 
 PeopleInHousehold             Region              State      MetroAreaCode 
                 0                  0                  0              34238 
               Age            Married                Sex          Education 
                 0              25338                  0              25338 
              Race           Hispanic CountryOfBirthCode        Citizenship 
                 0                  0                  0                  0 
  EmploymentStatus           Industry 
             25789              65060 

§ 2.2 Which is the most accurate:

lapply(CPS[c('Region','Sex','Age','Citizenship')], 
       function(x) table(is.na(CPS$Married), x))
$`Region`
       x
        Midwest Northeast South  West
  FALSE   24609     21432 33535 26388
  TRUE     6075      4507  7967  6789

$Sex
       x
        Female  Male
  FALSE  55264 50700
  TRUE   12217 13121

$Age
       x
           0    1    2    3    4    5    6    7    8    9   10   11   12   13   14
  FALSE    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
  TRUE  1283 1559 1574 1693 1695 1795 1721 1681 1729 1748 1750 1721 1797 1802 1790
       x
          15   16   17   18   19   20   21   22   23   24   25   26   27   28   29
  FALSE 1795 1751 1764 1596 1517 1398 1525 1536 1638 1627 1604 1643 1657 1736 1645
  TRUE     0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
       x
          30   31   32   33   34   35   36   37   38   39   40   41   42   43   44
  FALSE 1854 1762 1790 1804 1653 1716 1663 1531 1530 1542 1571 1673 1711 1819 1764
  TRUE     0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
       x
          45   46   47   48   49   50   51   52   53   54   55   56   57   58   59
  FALSE 1749 1665 1647 1791 1989 1966 1931 1935 1994 1912 1895 1935 1827 1874 1758
  TRUE     0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
       x
          60   61   62   63   64   65   66   67   68   69   70   71   72   73   74
  FALSE 1746 1735 1595 1596 1519 1569 1577 1227 1130 1062 1195 1031  941  896  842
  TRUE     0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
       x
          75   76   77   78   79   80   85
  FALSE  763  729  698  659  661 2664 2446
  TRUE     0    0    0    0    0    0    0

$Citizenship
       x
        Citizen, Native Citizen, Naturalized Non-Citizen
  FALSE           91956                 6910        7098
  TRUE            24683                  163         492

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

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

# 3

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

tapply(is.na(CPS$MetroAreaCode), CPS$Region, mean) %>% sort
Northeast     South      West   Midwest 
  0.21624   0.23784   0.24366   0.34787 

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

abs(0.3 - tapply(is.na(CPS$MetroAreaCode), CPS$State, mean)) %>% 
  sort %>% head  # Wisconsin
     Wisconsin        Indiana South Carolina      Minnesota       Oklahoma 
    0.00067014     0.00858283     0.01302774     0.01506849     0.02764281 
      Missouri 
    0.02867133 

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

tapply(is.na(CPS$MetroAreaCode), CPS$State, mean) %>% 
  sort %>% tail  # Montana
 South Dakota  North Dakota West Virginia       Montana        Alaska 
      0.70250       0.73739       0.75586       0.83608       1.00000 
      Wyoming 
      1.00000 




Section-3 Integrating Metropolitan Area Data

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

Metro = read.csv("data/MetroAreaCodes.csv")
nrow(Metro)
[1] 271

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

Country = read.csv("data/CountryCodes.csv")
nrow(Country)
[1] 149

§ 3.2 What is the name of the variable that was added to the data frame by the merge() operation?

CPS = merge(CPS, Metro, by.x="MetroAreaCode", by.y="Code", all.x=TRUE)
# MetroArea

How many interviewees have a missing value for the new metropolitan area variable?

sum(is.na(CPS$MetroArea))
[1] 34238

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

table(CPS$MetroArea) %>% sort %>% tail(10)  # Boston-Cambridge-Quincy

                    Houston-Baytown-Sugar Land, TX 
                                              1649 
                   Dallas-Fort Worth-Arlington, TX 
                                              1863 
            Minneapolis-St Paul-Bloomington, MN-WI 
                                              1942 
                    Boston-Cambridge-Quincy, MA-NH 
                                              2229 
              Providence-Fall River-Warwick, MA-RI 
                                              2284 
               Chicago-Naperville-Joliet, IN-IN-WI 
                                              2772 
          Philadelphia-Camden-Wilmington, PA-NJ-DE 
                                              2855 
              Los Angeles-Long Beach-Santa Ana, CA 
                                              4102 
      Washington-Arlington-Alexandria, DC-VA-MD-WV 
                                              4177 
New York-Northern New Jersey-Long Island, NY-NJ-PA 
                                              5409 

§ 3.4 Which metropolitan area has the highest proportion of interviewees of Hispanic ethnicity?

tapply(CPS$Hispanic, CPS$MetroArea, mean) %>% sort %>% tail  # Laredo, TX
           San Antonio, TX              El Centro, CA                El Paso, TX 
                   0.64415                    0.68687                    0.79098 
 Brownsville-Harlingen, TX McAllen-Edinburg-Pharr, TX                 Laredo, TX 
                   0.79747                    0.94872                    0.96629 

§ 3.5 Determine the number of metropolitan areas in the United States from which at least 20% of interviewees are Asian.

tapply(CPS$Race == "Asian", CPS$MetroArea, mean) %>% sort %>% tail  # 4
                 Warner Robins, GA                         Fresno, CA 
                           0.16667                            0.18482 
             Vallejo-Fairfield, CA San Jose-Sunnyvale-Santa Clara, CA 
                           0.20301                            0.24179 
 San Francisco-Oakland-Fremont, CA                       Honolulu, HI 
                           0.24675                            0.50190 

§ 3.6 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.

tapply(CPS$Education == "No high school diploma", CPS$MetroArea, mean, na.rm=T) %>% 
  sort %>% head  # Iowa City, IA
           Iowa City, IA        Bowling Green, KY    Kalamazoo-Portage, MI 
                0.029126                 0.037037                 0.050505 
    Champaign-Urbana, IL Bremerton-Silverdale, WA             Lawrence, KS 
                0.051546                 0.054054                 0.059524 




Section-4 Integrating Country of Birth Data

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

CPS = merge(CPS, Country, by.x="CountryOfBirthCode", by.y="Code", all.x=TRUE)
# Country

How many interviewees have a missing value for the new metropolitan area variable?

sum(is.na(CPS$Country))
[1] 176

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

table(CPS$Country) %>% sort %>% tail  # Philippines

  Puerto Rico         China         India   Philippines        Mexico 
          518           581           770           839          3921 
United States 
       115063 

§ 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?

area = "New York-Northern New Jersey-Long Island, NY-NJ-PA"
mean(CPS$Country[CPS$MetroArea==area] != "United States", na.rm=T)
[1] 0.30866

§ 4.4 Which metropolitan area has the largest number (note – not proportion) of interviewees with a country of birth in India?

tapply(CPS$Country == 'India', CPS$MetroArea, sum, na.rm=T) %>% 
  sort %>% tail  
                 San Francisco-Oakland-Fremont, CA 
                                                27 
                        Detroit-Warren-Livonia, MI 
                                                30 
               Chicago-Naperville-Joliet, IN-IN-WI 
                                                31 
          Philadelphia-Camden-Wilmington, PA-NJ-DE 
                                                32 
      Washington-Arlington-Alexandria, DC-VA-MD-WV 
                                                50 
New York-Northern New Jersey-Long Island, NY-NJ-PA 
                                                96 
# New York-Northern New Jersey-Long Island, NY-NJ-PA

In Brazil?

tapply(CPS$Country == 'Brazil', CPS$MetroArea, sum, na.rm=T) %>% sort %>% tail  
                   Bridgeport-Stamford-Norwalk, CT 
                                                 7 
New York-Northern New Jersey-Long Island, NY-NJ-PA 
                                                 7 
      Washington-Arlington-Alexandria, DC-VA-MD-WV 
                                                 8 
              Los Angeles-Long Beach-Santa Ana, CA 
                                                 9 
             Miami-Fort Lauderdale-Miami Beach, FL 
                                                16 
                    Boston-Cambridge-Quincy, MA-NH 
                                                18 
# Boston-Cambridge-Quincy, MA-NH 

In Somalia?

tapply(CPS$Country == 'Somalia', CPS$MetroArea, sum, na.rm=T) %>% sort %>% tail 
                          Columbus, OH                           Fargo, ND-MN 
                                     5                                      5 
           Phoenix-Mesa-Scottsdale, AZ            Seattle-Tacoma-Bellevue, WA 
                                     7                                      7 
                         St. Cloud, MN Minneapolis-St Paul-Bloomington, MN-WI 
                                     7                                     17 
# Minneapolis-St Paul-Bloomington, MN-WI
LS0tDQp0aXRsZTogIkFTMS0zIERlbW9ncmFwaGljcyBhbmQgRW1wbG95bWVudCBpbiB0aGUgVW5pdGVkIFN0YXRlcyINCmF1dGhvcjogIuWNk+mbjeeEtiBBMTA0MDIzMCAyMDE4LzA3LzAzIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KYGBge3IgZWNobz1ULCB3YXJuaW5nPUYsIG1lc3NhZ2U9RiwgY2FjaGU9Rn0NCmxpYnJhcnkoZHBseXIpDQpgYGANCg0KLSAtIC0NCg0KIyMjIyAgU2VjdGlvbi0xIExvYWRpbmcgYW5kIFN1bW1hcml6aW5nIHRoZSBEYXRhc2V0DQoNCl9fwqcgMS4xX18gSG93IG1hbnkgaW50ZXJ2aWV3ZWVzIGFyZSBpbiB0aGUgZGF0YXNldD8NCmBgYHtyfQ0KQ1BTID0gcmVhZC5jc3YoImRhdGEvQ1BTRGF0YS5jc3YiKQ0KbnJvdyhDUFMpDQpgYGANCg0KX1/CpyAxLjJfXyBBbW9uZyB0aGUgaW50ZXJ2aWV3ZWVzIHdpdGggYSB2YWx1ZSByZXBvcnRlZCBmb3IgdGhlIEluZHVzdHJ5IHZhcmlhYmxlLCB3aGF0IGlzIHRoZSBtb3N0IGNvbW1vbiBpbmR1c3RyeSBvZiBlbXBsb3ltZW50PyBQbGVhc2UgZW50ZXIgdGhlIG5hbWUgZXhhY3RseSBob3cgeW91IHNlZSBpdC4NCmBgYHtyfQ0Kc29ydCh0YWJsZShDUFMkSW5kdXN0cnkpKSAlPiUgdGFpbCAgIyBFZHVjYXRpb25hbCBhbmQgaGVhbHRoIHNlcnZpY2VzDQpgYGANCg0KX1/CpyAxLjNfXyBXaGljaCBzdGF0ZSBoYXMgdGhlIGZld2VzdCBpbnRlcnZpZXdlZXM/DQpgYGB7cn0NCmhlYWQoc29ydCh0YWJsZShDUFMkU3RhdGUpKSkgICMgTmV3IE1leGljbw0KYGBgDQoNCldoaWNoIHN0YXRlIGhhcyB0aGUgbGFyZ2VzdCBudW1iZXIgb2YgaW50ZXJ2aWV3ZWVzPw0KYGBge3J9DQp0YWlsKHNvcnQodGFibGUoQ1BTJFN0YXRlKSkpICMgQ2FsaWZvcm5pYQ0KYGBgDQoNCl9fwqcgMS40X18gV2hhdCBwcm9wb3J0aW9uIG9mIGludGVydmlld2VlcyBhcmUgY2l0aXplbnMgb2YgdGhlIFVuaXRlZCBTdGF0ZXM/DQpgYGB7cn0NCnRhYmxlKENQUyRDaXRpemVuc2hpcCkgJT4lIHByb3AudGFibGUNCnRhYmxlKENQUyRDaXRpemVuc2hpcCA9PSAiTm9uLUNpdGl6ZW4iKSAlPiUgcHJvcC50YWJsZSAgIyAwLjk0MjE5NA0KYGBgDQoNCl9fwqcgMS41X18gRm9yIHdoaWNoIHJhY2VzIGFyZSB0aGVyZSBhdCBsZWFzdCAyNTAgaW50ZXJ2aWV3ZWVzIGluIHRoZSBDUFMgZGF0YXNldCBvZiBIaXNwYW5pYyBldGhuaWNpdHk/IChTZWxlY3QgYWxsIHRoYXQgYXBwbHkuKSANCg0KKyBBbWVyaWNhbiBJbmRpYW4NCisgQXNpYW4NCisgY0JsYWNrDQorIE11bHRpcmFjaWFsDQorIFBhY2lmaWMgSXNsYW5kZXINCisgV2hpdGUNCg0KYGBge3J9DQp0YWJsZShDUFMkUmFjZSwgQ1BTJEhpc3BhbmljKQ0KYGBgDQoNCjxicj48YnI+IA0KDQotIC0gLQ0KDQojIyMjICBTZWN0aW9uLTIgRXZhbHVhdGluZyBNaXNzaW5nIFZhbHVlcw0KDQpfX8KnIDIuMV9fIFdoaWNoIHZhcmlhYmxlcyBoYXZlIGF0IGxlYXN0IG9uZSBpbnRlcnZpZXdlZSB3aXRoIGEgbWlzc2luZyAoTkEpIHZhbHVlPyAoU2VsZWN0IGFsbCB0aGF0IGFwcGx5LikNCg0KKyBQZW9wbGVJbkhvdXNlaG9sZA0KKyBSZWdpb24NCisgU3RhdGUNCisgTWV0cm9BcmVhQ29kZQ0KKyBBZ2UNCisgTWFycmllZA0KKyBTZXgNCisgRWR1Y2F0aW9uDQorIFJhY2UNCisgSGlzcGFuaWMNCisgQ291bnRyeU9mQmlydGhDb2RlDQorIENpdGl6ZW5zaGlwDQorIEVtcGxveW1lbnRTdGF0dXMNCisgSW5kdXN0cnkNCg0KYGBge3J9DQpjb2xTdW1zKGlzLm5hKENQUykpIA0KYGBgDQoNCl9fwqcgMi4yX18gIFdoaWNoIGlzIHRoZSBtb3N0IGFjY3VyYXRlOg0KDQorIFRoZSBNYXJyaWVkIHZhcmlhYmxlIGJlaW5nIG1pc3NpbmcgaXMgcmVsYXRlZCB0byB0aGUgUmVnaW9uIHZhbHVlIGZvciB0aGUgaW50ZXJ2aWV3ZWUuDQorIFRoZSBNYXJyaWVkIHZhcmlhYmxlIGJlaW5nIG1pc3NpbmcgaXMgcmVsYXRlZCB0byB0aGUgU2V4IHZhbHVlIGZvciB0aGUgaW50ZXJ2aWV3ZWUuDQorIFRoZSBNYXJyaWVkIHZhcmlhYmxlIGJlaW5nIG1pc3NpbmcgaXMgcmVsYXRlZCB0byB0aGUgQWdlIHZhbHVlIGZvciB0aGUgaW50ZXJ2aWV3ZWUuIA0KKyBUaGUgTWFycmllZCB2YXJpYWJsZSBiZWluZyBtaXNzaW5nIGlzIHJlbGF0ZWQgdG8gdGhlIENpdGl6ZW5zaGlwIHZhbHVlIGZvciB0aGUgaW50ZXJ2aWV3ZWUuDQorIFRoZSBNYXJyaWVkIHZhcmlhYmxlIGJlaW5nIG1pc3NpbmcgaXMgbm90IHJlbGF0ZWQgdG8gdGhlIFJlZ2lvbiwgU2V4LCBBZ2UsIG9yIENpdGl6ZW5zaGlwIHZhbHVlIGZvciB0aGUgaW50ZXJ2aWV3ZWUuDQoNCmBgYHtyfQ0KbGFwcGx5KENQU1tjKCdSZWdpb24nLCdTZXgnLCdBZ2UnLCdDaXRpemVuc2hpcCcpXSwgDQogICAgICAgZnVuY3Rpb24oeCkgdGFibGUoaXMubmEoQ1BTJE1hcnJpZWQpLCB4KSkNCmBgYA0KDQoNCl9fwqcgMi4zX18gSG93IG1hbnkgc3RhdGVzIGhhZCBhbGwgaW50ZXJ2aWV3ZWVzIGxpdmluZyBpbiBhIG5vbi1tZXRyb3BvbGl0YW4gYXJlYSAoYWthIHRoZXkgaGF2ZSBhIG1pc3NpbmcgTWV0cm9BcmVhQ29kZSB2YWx1ZSk/IEZvciB0aGlzIHF1ZXN0aW9uLCB0cmVhdCB0aGUgRGlzdHJpY3Qgb2YgQ29sdW1iaWEgYXMgYSBzdGF0ZSAoZXZlbiB0aG91Z2ggaXQgaXMgbm90IHRlY2huaWNhbGx5IGEgc3RhdGUpLg0KYGBge3J9DQp0YWJsZShpcy5uYShDUFMkTWV0cm9BcmVhQ29kZSksIENQUyRTdGF0ZSkgIyAyDQpgYGANCg0KSG93IG1hbnkgc3RhdGVzIGhhZCBhbGwgaW50ZXJ2aWV3ZWVzIGxpdmluZyBpbiBhIG1ldHJvcG9saXRhbiBhcmVhPyBBZ2FpbiwgdHJlYXQgdGhlIERpc3RyaWN0IG9mIENvbHVtYmlhIGFzIGEgc3RhdGUuDQpgYGB7cn0NCiMgMw0KYGBgDQoNCl9fwqcgMi40X18gV2hpY2ggcmVnaW9uIG9mIHRoZSBVbml0ZWQgU3RhdGVzIGhhcyB0aGUgbGFyZ2VzdCBwcm9wb3J0aW9uIG9mIGludGVydmlld2VlcyBsaXZpbmcgaW4gYSBub24tbWV0cm9wb2xpdGFuIGFyZWE/DQpgYGB7cn0NCnRhcHBseShpcy5uYShDUFMkTWV0cm9BcmVhQ29kZSksIENQUyRSZWdpb24sIG1lYW4pICU+JSBzb3J0DQpgYGANCg0KX1/CpyAyLjVfXyBXaGljaCBzdGF0ZSBoYXMgYSBwcm9wb3J0aW9uIG9mIGludGVydmlld2VlcyBsaXZpbmcgaW4gYSBub24tbWV0cm9wb2xpdGFuIGFyZWEgY2xvc2VzdCB0byAzMCU/DQpgYGB7cn0NCmFicygwLjMgLSB0YXBwbHkoaXMubmEoQ1BTJE1ldHJvQXJlYUNvZGUpLCBDUFMkU3RhdGUsIG1lYW4pKSAlPiUgDQogIHNvcnQgJT4lIGhlYWQgICMgV2lzY29uc2luDQpgYGANCg0KV2hpY2ggc3RhdGUgaGFzIHRoZSBsYXJnZXN0IHByb3BvcnRpb24gb2Ygbm9uLW1ldHJvcG9saXRhbiBpbnRlcnZpZXdlZXMsIGlnbm9yaW5nIHN0YXRlcyB3aGVyZSBhbGwgaW50ZXJ2aWV3ZWVzIHdlcmUgbm9uLW1ldHJvcG9saXRhbj8NCmBgYHtyfQ0KdGFwcGx5KGlzLm5hKENQUyRNZXRyb0FyZWFDb2RlKSwgQ1BTJFN0YXRlLCBtZWFuKSAlPiUgDQogIHNvcnQgJT4lIHRhaWwgICMgTW9udGFuYQ0KYGBgDQoNCjxicj48YnI+IA0KDQotIC0gLQ0KDQojIyMjICBTZWN0aW9uLTMgSW50ZWdyYXRpbmcgTWV0cm9wb2xpdGFuIEFyZWEgRGF0YQ0KDQpfX8KnIDMuMV9fIEhvdyBtYW55IG9ic2VydmF0aW9ucyAoY29kZXMgZm9yIG1ldHJvcG9saXRhbiBhcmVhcykgYXJlIHRoZXJlIGluIE1ldHJvQXJlYU1hcD8NCmBgYHtyfQ0KTWV0cm8gPSByZWFkLmNzdigiZGF0YS9NZXRyb0FyZWFDb2Rlcy5jc3YiKQ0KbnJvdyhNZXRybykNCmBgYA0KDQpIb3cgbWFueSBvYnNlcnZhdGlvbnMgKGNvZGVzIGZvciBjb3VudHJpZXMpIGFyZSB0aGVyZSBpbiBDb3VudHJ5TWFwPw0KYGBge3J9DQpDb3VudHJ5ID0gcmVhZC5jc3YoImRhdGEvQ291bnRyeUNvZGVzLmNzdiIpDQpucm93KENvdW50cnkpDQpgYGANCg0KX1/CpyAzLjJfXyBXaGF0IGlzIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0aGF0IHdhcyBhZGRlZCB0byB0aGUgZGF0YSBmcmFtZSBieSB0aGUgbWVyZ2UoKSBvcGVyYXRpb24/DQpgYGB7cn0NCkNQUyA9IG1lcmdlKENQUywgTWV0cm8sIGJ5Lng9Ik1ldHJvQXJlYUNvZGUiLCBieS55PSJDb2RlIiwgYWxsLng9VFJVRSkNCiMgTWV0cm9BcmVhDQpgYGANCg0KSG93IG1hbnkgaW50ZXJ2aWV3ZWVzIGhhdmUgYSBtaXNzaW5nIHZhbHVlIGZvciB0aGUgbmV3IG1ldHJvcG9saXRhbiBhcmVhIHZhcmlhYmxlPw0KYGBge3J9DQpzdW0oaXMubmEoQ1BTJE1ldHJvQXJlYSkpDQpgYGANCg0KX1/CpyAzLjNfXyBXaGljaCBvZiB0aGUgZm9sbG93aW5nIG1ldHJvcG9saXRhbiBhcmVhcyBoYXMgdGhlIGxhcmdlc3QgbnVtYmVyIG9mIGludGVydmlld2Vlcz8NCmBgYHtyfQ0KdGFibGUoQ1BTJE1ldHJvQXJlYSkgJT4lIHNvcnQgJT4lIHRhaWwoMTApICAjIEJvc3Rvbi1DYW1icmlkZ2UtUXVpbmN5DQpgYGANCg0KX1/CpyAzLjRfXyBXaGljaCBtZXRyb3BvbGl0YW4gYXJlYSBoYXMgdGhlIGhpZ2hlc3QgcHJvcG9ydGlvbiBvZiBpbnRlcnZpZXdlZXMgb2YgSGlzcGFuaWMgZXRobmljaXR5Pw0KYGBge3J9DQp0YXBwbHkoQ1BTJEhpc3BhbmljLCBDUFMkTWV0cm9BcmVhLCBtZWFuKSAlPiUgc29ydCAlPiUgdGFpbCAgIyBMYXJlZG8sIFRYDQpgYGANCg0KX1/CpyAzLjVfXyBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBtZXRyb3BvbGl0YW4gYXJlYXMgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgZnJvbSB3aGljaCBhdCBsZWFzdCAyMCUgb2YgaW50ZXJ2aWV3ZWVzIGFyZSBBc2lhbi4NCmBgYHtyfQ0KdGFwcGx5KENQUyRSYWNlID09ICJBc2lhbiIsIENQUyRNZXRyb0FyZWEsIG1lYW4pICU+JSBzb3J0ICU+JSB0YWlsICAjIDQNCmBgYA0KDQpfX8KnIDMuNl9fICBQYXNzaW5nIG5hLnJtPVRSVUUgdG8gdGhlIHRhcHBseSBmdW5jdGlvbiwgZGV0ZXJtaW5lIHdoaWNoIG1ldHJvcG9saXRhbiBhcmVhIGhhcyB0aGUgc21hbGxlc3QgcHJvcG9ydGlvbiBvZiBpbnRlcnZpZXdlZXMgd2hvIGhhdmUgcmVjZWl2ZWQgbm8gaGlnaCBzY2hvb2wgZGlwbG9tYS4NCmBgYHtyfQ0KdGFwcGx5KENQUyRFZHVjYXRpb24gPT0gIk5vIGhpZ2ggc2Nob29sIGRpcGxvbWEiLCBDUFMkTWV0cm9BcmVhLCBtZWFuLCBuYS5ybT1UKSAlPiUgDQogIHNvcnQgJT4lIGhlYWQgICMgSW93YSBDaXR5LCBJQQ0KYGBgDQoNCg0KPGJyPjxicj4gDQoNCi0gLSAtDQoNCiMjIyMgIFNlY3Rpb24tNCBJbnRlZ3JhdGluZyBDb3VudHJ5IG9mIEJpcnRoIERhdGENCg0KX1/CpyA0LjFfXyBXaGF0IGlzIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSBhZGRlZCB0byB0aGUgQ1BTIGRhdGEgZnJhbWUgYnkgdGhpcyBtZXJnZSBvcGVyYXRpb24/DQpgYGB7cn0NCkNQUyA9IG1lcmdlKENQUywgQ291bnRyeSwgYnkueD0iQ291bnRyeU9mQmlydGhDb2RlIiwgYnkueT0iQ29kZSIsIGFsbC54PVRSVUUpDQojIENvdW50cnkNCmBgYA0KDQpIb3cgbWFueSBpbnRlcnZpZXdlZXMgaGF2ZSBhIG1pc3NpbmcgdmFsdWUgZm9yIHRoZSBuZXcgbWV0cm9wb2xpdGFuIGFyZWEgdmFyaWFibGU/DQpgYGB7cn0NCnN1bShpcy5uYShDUFMkQ291bnRyeSkpDQoNCmBgYA0KDQpfX8KnIDQuMl9fIEFtb25nIGFsbCBpbnRlcnZpZXdlZXMgYm9ybiBvdXRzaWRlIG9mIE5vcnRoIEFtZXJpY2EsIHdoaWNoIGNvdW50cnkgd2FzIHRoZSBtb3N0IGNvbW1vbiBwbGFjZSBvZiBiaXJ0aD8NCmBgYHtyfQ0KdGFibGUoQ1BTJENvdW50cnkpICU+JSBzb3J0ICU+JSB0YWlsICAjIFBoaWxpcHBpbmVzDQpgYGANCg0KX1/CpyA0LjNfXyBXaGF0IHByb3BvcnRpb24gb2YgdGhlIGludGVydmlld2VlcyBmcm9tIHRoZSAiTmV3IFlvcmstTm9ydGhlcm4gTmV3IEplcnNleS1Mb25nIElzbGFuZCwgTlktTkotUEEiIG1ldHJvcG9saXRhbiBhcmVhIGhhdmUgYSBjb3VudHJ5IG9mIGJpcnRoIHRoYXQgaXMgbm90IHRoZSBVbml0ZWQgU3RhdGVzPyANCmBgYHtyfQ0KYXJlYSA9ICJOZXcgWW9yay1Ob3J0aGVybiBOZXcgSmVyc2V5LUxvbmcgSXNsYW5kLCBOWS1OSi1QQSINCm1lYW4oQ1BTJENvdW50cnlbQ1BTJE1ldHJvQXJlYT09YXJlYV0gIT0gIlVuaXRlZCBTdGF0ZXMiLCBuYS5ybT1UKQ0KDQpgYGANCg0KX1/CpyA0LjRfXyBXaGljaCBtZXRyb3BvbGl0YW4gYXJlYSBoYXMgdGhlIGxhcmdlc3QgbnVtYmVyIChub3RlIC0tIG5vdCBwcm9wb3J0aW9uKSBvZiBpbnRlcnZpZXdlZXMgd2l0aCBhIGNvdW50cnkgb2YgYmlydGggaW4gSW5kaWE/IA0KYGBge3J9DQp0YXBwbHkoQ1BTJENvdW50cnkgPT0gJ0luZGlhJywgQ1BTJE1ldHJvQXJlYSwgc3VtLCBuYS5ybT1UKSAlPiUgDQogIHNvcnQgJT4lIHRhaWwgIA0KIyBOZXcgWW9yay1Ob3J0aGVybiBOZXcgSmVyc2V5LUxvbmcgSXNsYW5kLCBOWS1OSi1QQQ0KYGBgDQoNCkluIEJyYXppbD8NCmBgYHtyfQ0KdGFwcGx5KENQUyRDb3VudHJ5ID09ICdCcmF6aWwnLCBDUFMkTWV0cm9BcmVhLCBzdW0sIG5hLnJtPVQpICU+JSBzb3J0ICU+JSB0YWlsICANCiMgQm9zdG9uLUNhbWJyaWRnZS1RdWluY3ksIE1BLU5IIA0KYGBgDQoNCkluIFNvbWFsaWE/DQpgYGB7cn0NCnRhcHBseShDUFMkQ291bnRyeSA9PSAnU29tYWxpYScsIENQUyRNZXRyb0FyZWEsIHN1bSwgbmEucm09VCkgJT4lIHNvcnQgJT4lIHRhaWwgDQojIE1pbm5lYXBvbGlzLVN0IFBhdWwtQmxvb21pbmd0b24sIE1OLVdJDQpgYGANCg0K