Resets Environment

rm(list=ls())

Loaded in dplyr, ggplot2, and kableExtra

data <- read.csv("http://tinyurl.com/dida325midtermdata", stringsAsFactors = F, fileEncoding="UTF-8-BOM")
library(dplyr)
library(ggplot2)
library(kableExtra)


#Add the other libraries that you would like to load

The the data was visualized in order to see the number of NAs

summary(data)
   job_type         description             year           All               Women           Black       
 Length:70          Length:70          Min.   :2005   Min.   :     3.0   Min.   : 9.30   Min.   : 3.000  
 Class :character   Class :character   1st Qu.:2010   1st Qu.:    83.0   1st Qu.:21.05   1st Qu.: 6.450  
 Mode  :character   Mode  :character   Median :2015   Median :   223.5   Median :27.60   Median : 9.100  
                                       Mean   :2014   Mean   : 10589.8   Mean   :31.18   Mean   : 8.997  
                                       3rd Qu.:2020   3rd Qu.:   774.2   3rd Qu.:43.85   3rd Qu.:11.600  
                                       Max.   :2020   Max.   :148834.0   Max.   :57.40   Max.   :15.300  
                                                                         NA's   :11      NA's   :11      
     Asian       Hispanic.Latino 
 Min.   : 3.40   Min.   : 2.000  
 1st Qu.: 8.65   1st Qu.: 5.550  
 Median :11.80   Median : 6.900  
 Mean   :14.69   Mean   : 7.853  
 3rd Qu.:19.75   3rd Qu.: 9.350  
 Max.   :34.10   Max.   :17.600  
 NA's   :11      NA's   :11      

Remove NAs and storing it as data.

data <- na.omit(data)

Check to make sure the NAs were removed

summary(data)
   job_type         description             year           All             Women           Black       
 Length:59          Length:59          Min.   :2005   Min.   :    61   Min.   : 9.30   Min.   : 3.000  
 Class :character   Class :character   1st Qu.:2010   1st Qu.:   107   1st Qu.:21.05   1st Qu.: 6.450  
 Mode  :character   Mode  :character   Median :2015   Median :   366   Median :27.60   Median : 9.100  
                                       Mean   :2013   Mean   : 12561   Mean   :31.18   Mean   : 8.997  
                                       3rd Qu.:2020   3rd Qu.:   929   3rd Qu.:43.85   3rd Qu.:11.600  
                                       Max.   :2020   Max.   :148834   Max.   :57.40   Max.   :15.300  
     Asian       Hispanic.Latino 
 Min.   : 3.40   Min.   : 2.000  
 1st Qu.: 8.65   1st Qu.: 5.550  
 Median :11.80   Median : 6.900  
 Mean   :14.69   Mean   : 7.853  
 3rd Qu.:19.75   3rd Qu.: 9.350  
 Max.   :34.10   Max.   :17.600  

Visualize data to see data in table format

View(data)

Created data sets that filters for job_type that is equal to computer all and selected for year, Women, Black, Asian, and Hispanic Latino

variables_comp<- data %>% filter(job_type == "computer_all") %>%  select(c(year, Women, Black, Asian, Hispanic.Latino))

Created dataframes that store the mean, standard deviation, minimum and maximum of each df

mean1 <- variables_comp %>% summarise(across(everything(), mean))
sd1 <- variables_comp %>% summarise(across(everything(), sd))
min1 <- variables_comp %>% summarise(across(everything(), min))
max1 <- variables_comp %>% summarise(across(everything(), max))

merge dfs into a table

table_comp <- rbind(mean1, sd1, min1, max1)

Renamed the rows to be equal to be mean, standard deviation, minimum and maximum Rounded to the nearing two decimals

rownames(table_comp) <- c("Mean", "Standard Deviation", "Minimum", "Maximum")
table_comp <- table_comp %>% 
  as.data.frame %>% 
  mutate_if(is.numeric, round, digits=2)

Renamed year column

colnames(table_comp)[colnames(table_comp) == "year"] = "Year"

  #“How to Relabel Rows and Columns in an R Table.” Displayr Help, https://help.displayr.com/hc/en-us/articles/360002876876-How-to-Relabel-Rows-and-Columns-in-an-R-Table. Accessed 22 Feb. 2024.

Made a table and formatted it in html

table_comp %>%
  kbl(caption = "<center><strong>Table 1: Computer and Mathematical Occupations Data</strong></center>",
    format = "html") %>%
  kable_classic_2("striped", full_width = F)
Table 1: Computer and Mathematical Occupations Data
Year Women Black Asian Hispanic.Latino
Mean 2012.50 25.68 7.82 18.42 6.50
Standard Deviation 6.45 0.99 1.20 3.76 1.43
Minimum 2005.00 24.70 6.70 14.70 5.30
Maximum 2020.00 27.00 9.10 23.00 8.40

Repeated the process for statistical table for total CS jobs

tot<- data %>% filter(job_type == "total") %>%  select(c(year, Women, Black, Asian, Hispanic.Latino))
meantot <- tot %>% summarise(across(everything(), mean))
sdtot <- tot %>% summarise(across(everything(), sd))
mintot <- tot %>% summarise(across(everything(), min))
maxtot <- tot %>% summarise(across(everything(), max))
table_tot <- rbind(meantot, sdtot, mintot, maxtot)
rownames(table_tot) <- c("Mean", "Standard Deviation", "Minimum", "Maximum")
table_tot <- table_tot %>% 
  as.data.frame %>% 
  mutate_if(is.numeric, round, digits=2)

colnames(table_tot)[colnames(table_tot) == "year"] = "Year"

table_tot %>%
  kbl(caption = "<center><strong>Table 2: Total CS Data</strong></center>",
    format = "html") %>%
  kable_classic_2("striped", full_width = F)
Table 2: Total CS Data
Year Women Black Asian Hispanic.Latino
Mean 2012.50 46.80 11.35 5.35 15.35
Standard Deviation 6.45 0.33 0.66 0.91 2.03
Minimum 2005.00 46.40 10.80 4.40 13.10
Maximum 2020.00 47.20 12.10 6.40 17.60

Repeated the process for statistical table for Web Developers

web<- data %>% filter(description == "Web developers") %>%  select(c(year, Women, Black, Asian, Hispanic.Latino))

mean_web <- web %>% summarise(across(everything(), mean))
sd_web <- web %>% summarise(across(everything(), sd))
min_web <- web %>% summarise(across(everything(), min))
max_web <- web %>% summarise(across(everything(), max))
table_web <- rbind(mean_web, sd_web, min_web, max_web)
rownames(table_web) <- c("Mean", "Standard Deviation", "Minimum", "Maximum")
table_web <- table_web %>% 
  as.data.frame %>% 
  mutate_if(is.numeric, round, digits=2)

colnames(table_web)[colnames(table_web) == "year"] = "Year"


table_web %>%
  kbl(caption = "<center><strong>Table 3: Web Developer Data</strong></center>",
    format = "html") %>%
  kable_classic_2("striped", full_width = F)
Table 3: Web Developer Data
Year Women Black Asian Hispanic.Latino
Mean 2017.50 31.05 6.40 12.90 6.05
Standard Deviation 3.54 4.60 3.82 4.67 0.21
Minimum 2015.00 27.80 3.70 9.60 5.90
Maximum 2020.00 34.30 9.10 16.20 6.20

(1)Created a copy of data and stored it as comp_data. (2) Filtered to include only information whose job type was equal to computer_all. Computer_all were jobs that that were computer and mathematical occupations. (3)Created a graph that shows the percentage of minority groups with Computer and Mathematical Occupations over time - The minority groups were African, Asian, and LatinX

This was done to investigate the amount of minority groups in stem over time. It shows that all percentages increased over time. Africans and LatinX are still underrepresented in the workplace.

comp_data <- data %>% filter(job_type == "computer_all") 
ggplot(comp_data)+
  geom_line(aes(y= Black, x= year, color=" African"))+
  geom_line(aes(y= Asian, x= year, color= "Asian"))+
  geom_line(aes(y= Hispanic.Latino, x= year, color= "LatinX"))+
  labs(y="Percentage of Workers", x="Year", title= "Percentage of Minority Groups within Computer and Mathematical Occupations", color = "Minority Groups")+
  scale_color_manual(labels = c("African","Asian","LatinX"),values = c("red","orange","blue")) #creates colored index

Create new data frame that stores the the percentage of Workplace per Race in the Year 2020

comp_2020 <- comp_data %>% filter(year == 2020)

comp_2020_new <- data.frame(
  Race = c("Black","Asian","Hispanic"),
  Percentage = c(comp_2020$Black, comp_2020$Asian, comp_2020$Hispanic.Latino)
)

Views the new df

View(comp_2020_new)

Creates a Bargraph that shows the percentage of minority groups in the workplace in the year 2020. Asian minority groups have the highest percentage of people in the workplace at 23%. African/Black people make up 9.1% of the workplace in computational and mathematical fields. Hispanic/LatinX people make up 8.4% of the workplace in computational and mathematical fields.

ggplot(comp_2020_new, aes(x = Race, y = Percentage, fill=Race)) +
  geom_bar(stat="Identity") +
  labs(y = "Percentage of Workplace", x = "Minority Groups", 
       title = "Percentage of Minority Groups within \nComputer and Mathematical Occupations in the US, 2020") 

#\n works in python so I just used in the text to indent for the title 
#https://www.datanovia.com/en/blog/ggplot-title-subtitle-and-caption/
# Alboukadel. “GGPlot Title, Subtitle and Caption: The Ultimate Guide.” Datanovia, 11 Nov. 2018, https://www.datanovia.com/en/blog/ggplot-title-subtitle-and-caption/. Accessed 22 Feb. 2024.

Created a bar chart that showed the percentage of women in the workplace for Computer and Mathematical Occupations in the years 2005, 2010, 2015, 2020. This was done to investigate the percentage of women in stem over time similar to minority groups. The Color is based on a gradient with the lighter colors having the highest percentage of women. It shows that the percent of women within computer and mathematical occupations has gone down since 2005.

ggplot(comp_data, aes(x = as.character(year), y = Women, fill = Women)) +
  geom_bar(stat="Identity") +
  labs(y = "Percentage of Workplace", x = "Year", 
       title = "Percentage of Women within \nComputer and Mathematical Occupations in the US ") 

The key finds from the analysis are: (1)Black/African people are underrepresented in Computer and Mathematical Occupations since in 2020. Only 9.1% of the workplace was black. (2) Hispanic and Latino workers are also underrepresented in Computer and Mathematical Occupations since in 2020. 8.4% of the workplace was Hispanic.

  1. The Percentage workers that are Asian, Black/African, and Hispanic/Latino has increased since 2005

  2. Women are underrepresented in Computer and Mathematical Occupations since they make up only 26.5% of the workplace since 2020

  3. The percentage of women in the workplace has decreased since 2005; this is surprising since you would expect the position to get more diverse over time

There is a severe amount of underrepresented of both women and minority groups within Computer and Mathematical Occupations. Based on the results of this data analysis, it was found that women make up 26.5 percent of the workplace in Computer and Mathematical based fields. Besides being underrepresented, there has been a decrease in percentage of women working in those fields since 2005. Hispanic/Latino workers make approximately 8.4% of the workplace in Computer and Mathematical based fields making them underrepresented compared the demographics of the United States. Black/African workers are also underrepresented making up 9.1% of the workforce in Computer and Mathematical based occupations. However, since 2005 there has been shown to be an increase of minority workers in these occupations.

LS0tCnRpdGxlOiAiSGFycCAzMjUgTWlkdGVybSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQpSZXNldHMgRW52aXJvbm1lbnQKYGBge3J9CnJtKGxpc3Q9bHMoKSkKCmBgYApMb2FkZWQgaW4gZHBseXIsIGdncGxvdDIsIGFuZCBrYWJsZUV4dHJhCmBgYHtyfQpkYXRhIDwtIHJlYWQuY3N2KCJodHRwOi8vdGlueXVybC5jb20vZGlkYTMyNW1pZHRlcm1kYXRhIiwgc3RyaW5nc0FzRmFjdG9ycyA9IEYsIGZpbGVFbmNvZGluZz0iVVRGLTgtQk9NIikKbGlicmFyeShkcGx5cikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCgoKI0FkZCB0aGUgb3RoZXIgbGlicmFyaWVzIHRoYXQgeW91IHdvdWxkIGxpa2UgdG8gbG9hZApgYGAKVGhlIHRoZSBkYXRhIHdhcyB2aXN1YWxpemVkIGluIG9yZGVyIHRvIHNlZSB0aGUgbnVtYmVyIG9mIE5BcwpgYGB7cn0Kc3VtbWFyeShkYXRhKQpgYGAKUmVtb3ZlIE5BcyBhbmQgc3RvcmluZyBpdCBhcyBkYXRhLgpgYGB7cn0KZGF0YSA8LSBuYS5vbWl0KGRhdGEpCmBgYApDaGVjayB0byBtYWtlIHN1cmUgdGhlIE5BcyB3ZXJlIHJlbW92ZWQKYGBge3J9CnN1bW1hcnkoZGF0YSkKYGBgClZpc3VhbGl6ZSBkYXRhIHRvIHNlZSBkYXRhIGluIHRhYmxlIGZvcm1hdApgYGB7cn0KVmlldyhkYXRhKQpgYGAKCkNyZWF0ZWQgZGF0YSBzZXRzIHRoYXQgZmlsdGVycyBmb3Igam9iX3R5cGUgdGhhdCBpcyBlcXVhbCB0byBjb21wdXRlciBhbGwgYW5kIHNlbGVjdGVkIGZvciB5ZWFyLCBXb21lbiwgQmxhY2ssIEFzaWFuLCBhbmQgSGlzcGFuaWMgTGF0aW5vCmBgYHtyfQp2YXJpYWJsZXNfY29tcDwtIGRhdGEgJT4lIGZpbHRlcihqb2JfdHlwZSA9PSAiY29tcHV0ZXJfYWxsIikgJT4lICBzZWxlY3QoYyh5ZWFyLCBXb21lbiwgQmxhY2ssIEFzaWFuLCBIaXNwYW5pYy5MYXRpbm8pKQpgYGAKCkNyZWF0ZWQgZGF0YWZyYW1lcyB0aGF0IHN0b3JlIHRoZSBtZWFuLCBzdGFuZGFyZCBkZXZpYXRpb24sIG1pbmltdW0gYW5kIG1heGltdW0gb2YgZWFjaCBkZgpgYGB7cn0KbWVhbjEgPC0gdmFyaWFibGVzX2NvbXAgJT4lIHN1bW1hcmlzZShhY3Jvc3MoZXZlcnl0aGluZygpLCBtZWFuKSkKc2QxIDwtIHZhcmlhYmxlc19jb21wICU+JSBzdW1tYXJpc2UoYWNyb3NzKGV2ZXJ5dGhpbmcoKSwgc2QpKQptaW4xIDwtIHZhcmlhYmxlc19jb21wICU+JSBzdW1tYXJpc2UoYWNyb3NzKGV2ZXJ5dGhpbmcoKSwgbWluKSkKbWF4MSA8LSB2YXJpYWJsZXNfY29tcCAlPiUgc3VtbWFyaXNlKGFjcm9zcyhldmVyeXRoaW5nKCksIG1heCkpCgpgYGAKbWVyZ2UgZGZzIGludG8gYSB0YWJsZSAKYGBge3J9CnRhYmxlX2NvbXAgPC0gcmJpbmQobWVhbjEsIHNkMSwgbWluMSwgbWF4MSkKYGBgClJlbmFtZWQgdGhlIHJvd3MgdG8gYmUgZXF1YWwgdG8gYmUgbWVhbiwgc3RhbmRhcmQgZGV2aWF0aW9uLCBtaW5pbXVtIGFuZCBtYXhpbXVtClJvdW5kZWQgdG8gdGhlIG5lYXJpbmcgdHdvIGRlY2ltYWxzCmBgYHtyfQpyb3duYW1lcyh0YWJsZV9jb21wKSA8LSBjKCJNZWFuIiwgIlN0YW5kYXJkIERldmlhdGlvbiIsICJNaW5pbXVtIiwgIk1heGltdW0iKQp0YWJsZV9jb21wIDwtIHRhYmxlX2NvbXAgJT4lIAogIGFzLmRhdGEuZnJhbWUgJT4lIAogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgZGlnaXRzPTIpCmBgYApSZW5hbWVkIHllYXIgY29sdW1uIApgYGB7cn0KY29sbmFtZXModGFibGVfY29tcClbY29sbmFtZXModGFibGVfY29tcCkgPT0gInllYXIiXSA9ICJZZWFyIgoKICAj4oCcSG93IHRvIFJlbGFiZWwgUm93cyBhbmQgQ29sdW1ucyBpbiBhbiBSIFRhYmxlLuKAnSBEaXNwbGF5ciBIZWxwLCBodHRwczovL2hlbHAuZGlzcGxheXIuY29tL2hjL2VuLXVzL2FydGljbGVzLzM2MDAwMjg3Njg3Ni1Ib3ctdG8tUmVsYWJlbC1Sb3dzLWFuZC1Db2x1bW5zLWluLWFuLVItVGFibGUuIEFjY2Vzc2VkIDIyIEZlYi4gMjAyNC4KCmBgYAoKCk1hZGUgYSB0YWJsZSBhbmQgZm9ybWF0dGVkIGl0IGluIGh0bWwKYGBge3J9CnRhYmxlX2NvbXAgJT4lCiAga2JsKGNhcHRpb24gPSAiPGNlbnRlcj48c3Ryb25nPlRhYmxlIDE6IENvbXB1dGVyIGFuZCBNYXRoZW1hdGljYWwgT2NjdXBhdGlvbnMgRGF0YTwvc3Ryb25nPjwvY2VudGVyPiIsCiAgICBmb3JtYXQgPSAiaHRtbCIpICU+JQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGKQpgYGAKClJlcGVhdGVkIHRoZSBwcm9jZXNzIGZvciBzdGF0aXN0aWNhbCB0YWJsZSBmb3IgdG90YWwgQ1Mgam9icyAKYGBge3J9CnRvdDwtIGRhdGEgJT4lIGZpbHRlcihqb2JfdHlwZSA9PSAidG90YWwiKSAlPiUgIHNlbGVjdChjKHllYXIsIFdvbWVuLCBCbGFjaywgQXNpYW4sIEhpc3BhbmljLkxhdGlubykpCm1lYW50b3QgPC0gdG90ICU+JSBzdW1tYXJpc2UoYWNyb3NzKGV2ZXJ5dGhpbmcoKSwgbWVhbikpCnNkdG90IDwtIHRvdCAlPiUgc3VtbWFyaXNlKGFjcm9zcyhldmVyeXRoaW5nKCksIHNkKSkKbWludG90IDwtIHRvdCAlPiUgc3VtbWFyaXNlKGFjcm9zcyhldmVyeXRoaW5nKCksIG1pbikpCm1heHRvdCA8LSB0b3QgJT4lIHN1bW1hcmlzZShhY3Jvc3MoZXZlcnl0aGluZygpLCBtYXgpKQp0YWJsZV90b3QgPC0gcmJpbmQobWVhbnRvdCwgc2R0b3QsIG1pbnRvdCwgbWF4dG90KQpyb3duYW1lcyh0YWJsZV90b3QpIDwtIGMoIk1lYW4iLCAiU3RhbmRhcmQgRGV2aWF0aW9uIiwgIk1pbmltdW0iLCAiTWF4aW11bSIpCnRhYmxlX3RvdCA8LSB0YWJsZV90b3QgJT4lIAogIGFzLmRhdGEuZnJhbWUgJT4lIAogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgZGlnaXRzPTIpCgpjb2xuYW1lcyh0YWJsZV90b3QpW2NvbG5hbWVzKHRhYmxlX3RvdCkgPT0gInllYXIiXSA9ICJZZWFyIgoKdGFibGVfdG90ICU+JQogIGtibChjYXB0aW9uID0gIjxjZW50ZXI+PHN0cm9uZz5UYWJsZSAyOiBUb3RhbCBDUyBEYXRhPC9zdHJvbmc+PC9jZW50ZXI+IiwKICAgIGZvcm1hdCA9ICJodG1sIikgJT4lCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IEYpCmBgYApSZXBlYXRlZCB0aGUgcHJvY2VzcyBmb3Igc3RhdGlzdGljYWwgdGFibGUgZm9yIFdlYiBEZXZlbG9wZXJzCmBgYHtyfQp3ZWI8LSBkYXRhICU+JSBmaWx0ZXIoZGVzY3JpcHRpb24gPT0gIldlYiBkZXZlbG9wZXJzIikgJT4lICBzZWxlY3QoYyh5ZWFyLCBXb21lbiwgQmxhY2ssIEFzaWFuLCBIaXNwYW5pYy5MYXRpbm8pKQoKbWVhbl93ZWIgPC0gd2ViICU+JSBzdW1tYXJpc2UoYWNyb3NzKGV2ZXJ5dGhpbmcoKSwgbWVhbikpCnNkX3dlYiA8LSB3ZWIgJT4lIHN1bW1hcmlzZShhY3Jvc3MoZXZlcnl0aGluZygpLCBzZCkpCm1pbl93ZWIgPC0gd2ViICU+JSBzdW1tYXJpc2UoYWNyb3NzKGV2ZXJ5dGhpbmcoKSwgbWluKSkKbWF4X3dlYiA8LSB3ZWIgJT4lIHN1bW1hcmlzZShhY3Jvc3MoZXZlcnl0aGluZygpLCBtYXgpKQp0YWJsZV93ZWIgPC0gcmJpbmQobWVhbl93ZWIsIHNkX3dlYiwgbWluX3dlYiwgbWF4X3dlYikKcm93bmFtZXModGFibGVfd2ViKSA8LSBjKCJNZWFuIiwgIlN0YW5kYXJkIERldmlhdGlvbiIsICJNaW5pbXVtIiwgIk1heGltdW0iKQp0YWJsZV93ZWIgPC0gdGFibGVfd2ViICU+JSAKICBhcy5kYXRhLmZyYW1lICU+JSAKICBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsIGRpZ2l0cz0yKQoKY29sbmFtZXModGFibGVfd2ViKVtjb2xuYW1lcyh0YWJsZV93ZWIpID09ICJ5ZWFyIl0gPSAiWWVhciIKCgp0YWJsZV93ZWIgJT4lCiAga2JsKGNhcHRpb24gPSAiPGNlbnRlcj48c3Ryb25nPlRhYmxlIDM6IFdlYiBEZXZlbG9wZXIgRGF0YTwvc3Ryb25nPjwvY2VudGVyPiIsCiAgICBmb3JtYXQgPSAiaHRtbCIpICU+JQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGKQpgYGAKCigxKUNyZWF0ZWQgYSBjb3B5IG9mIGRhdGEgYW5kIHN0b3JlZCBpdCBhcyBjb21wX2RhdGEuCigyKSBGaWx0ZXJlZCB0byBpbmNsdWRlIG9ubHkgaW5mb3JtYXRpb24gd2hvc2Ugam9iIHR5cGUgd2FzIGVxdWFsIHRvIGNvbXB1dGVyX2FsbC4gQ29tcHV0ZXJfYWxsIHdlcmUgam9icyB0aGF0IHRoYXQgd2VyZSBjb21wdXRlciBhbmQgbWF0aGVtYXRpY2FsIG9jY3VwYXRpb25zLiAKKDMpQ3JlYXRlZCBhIGdyYXBoIHRoYXQgc2hvd3MgdGhlIHBlcmNlbnRhZ2Ugb2YgbWlub3JpdHkgZ3JvdXBzIHdpdGggQ29tcHV0ZXIgYW5kIE1hdGhlbWF0aWNhbCBPY2N1cGF0aW9ucyBvdmVyIHRpbWUKICAtIFRoZSBtaW5vcml0eSBncm91cHMgd2VyZSBBZnJpY2FuLCBBc2lhbiwgYW5kIExhdGluWAogIApUaGlzIHdhcyBkb25lIHRvIGludmVzdGlnYXRlIHRoZSBhbW91bnQgb2YgbWlub3JpdHkgZ3JvdXBzIGluIHN0ZW0gb3ZlciB0aW1lLiBJdCBzaG93cyB0aGF0IGFsbCBwZXJjZW50YWdlcyBpbmNyZWFzZWQgb3ZlciB0aW1lLiBBZnJpY2FucyBhbmQgTGF0aW5YIGFyZSBzdGlsbCB1bmRlcnJlcHJlc2VudGVkIGluIHRoZSB3b3JrcGxhY2UuCgpgYGB7cn0KY29tcF9kYXRhIDwtIGRhdGEgJT4lIGZpbHRlcihqb2JfdHlwZSA9PSAiY29tcHV0ZXJfYWxsIikgCmdncGxvdChjb21wX2RhdGEpKwogIGdlb21fbGluZShhZXMoeT0gQmxhY2ssIHg9IHllYXIsIGNvbG9yPSIgQWZyaWNhbiIpKSsKICBnZW9tX2xpbmUoYWVzKHk9IEFzaWFuLCB4PSB5ZWFyLCBjb2xvcj0gIkFzaWFuIikpKwogIGdlb21fbGluZShhZXMoeT0gSGlzcGFuaWMuTGF0aW5vLCB4PSB5ZWFyLCBjb2xvcj0gIkxhdGluWCIpKSsKICBsYWJzKHk9IlBlcmNlbnRhZ2Ugb2YgV29ya2VycyIsIHg9IlllYXIiLCB0aXRsZT0gIlBlcmNlbnRhZ2Ugb2YgTWlub3JpdHkgR3JvdXBzIHdpdGhpbiBDb21wdXRlciBhbmQgTWF0aGVtYXRpY2FsIE9jY3VwYXRpb25zIiwgY29sb3IgPSAiTWlub3JpdHkgR3JvdXBzIikrCiAgc2NhbGVfY29sb3JfbWFudWFsKGxhYmVscyA9IGMoIkFmcmljYW4iLCJBc2lhbiIsIkxhdGluWCIpLHZhbHVlcyA9IGMoInJlZCIsIm9yYW5nZSIsImJsdWUiKSkgI2NyZWF0ZXMgY29sb3JlZCBpbmRleApgYGAKCkNyZWF0ZSBuZXcgZGF0YSBmcmFtZSB0aGF0IHN0b3JlcyB0aGUgdGhlIHBlcmNlbnRhZ2Ugb2YgV29ya3BsYWNlIHBlciBSYWNlIGluIHRoZSBZZWFyIDIwMjAKYGBge3J9CmNvbXBfMjAyMCA8LSBjb21wX2RhdGEgJT4lIGZpbHRlcih5ZWFyID09IDIwMjApCgpjb21wXzIwMjBfbmV3IDwtIGRhdGEuZnJhbWUoCiAgUmFjZSA9IGMoIkJsYWNrIiwiQXNpYW4iLCJIaXNwYW5pYyIpLAogIFBlcmNlbnRhZ2UgPSBjKGNvbXBfMjAyMCRCbGFjaywgY29tcF8yMDIwJEFzaWFuLCBjb21wXzIwMjAkSGlzcGFuaWMuTGF0aW5vKQopCmBgYApWaWV3cyB0aGUgbmV3IGRmCmBgYHtyfQpWaWV3KGNvbXBfMjAyMF9uZXcpCmBgYAoKCkNyZWF0ZXMgYSBCYXJncmFwaCB0aGF0IHNob3dzIHRoZSBwZXJjZW50YWdlIG9mIG1pbm9yaXR5IGdyb3VwcyBpbiB0aGUgd29ya3BsYWNlIGluIHRoZSB5ZWFyIDIwMjAuIEFzaWFuIG1pbm9yaXR5IGdyb3VwcyBoYXZlIHRoZSBoaWdoZXN0IHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIGluIHRoZSB3b3JrcGxhY2UgYXQgMjMlLiBBZnJpY2FuL0JsYWNrIHBlb3BsZSBtYWtlIHVwIDkuMSUgb2YgdGhlIHdvcmtwbGFjZSBpbiBjb21wdXRhdGlvbmFsIGFuZCBtYXRoZW1hdGljYWwgZmllbGRzLiBIaXNwYW5pYy9MYXRpblggcGVvcGxlIG1ha2UgdXAgOC40JSBvZiB0aGUgd29ya3BsYWNlIGluIGNvbXB1dGF0aW9uYWwgYW5kIG1hdGhlbWF0aWNhbCBmaWVsZHMuIApgYGB7cn0KZ2dwbG90KGNvbXBfMjAyMF9uZXcsIGFlcyh4ID0gUmFjZSwgeSA9IFBlcmNlbnRhZ2UsIGZpbGw9UmFjZSkpICsKICBnZW9tX2JhcihzdGF0PSJJZGVudGl0eSIpICsKICBsYWJzKHkgPSAiUGVyY2VudGFnZSBvZiBXb3JrcGxhY2UiLCB4ID0gIk1pbm9yaXR5IEdyb3VwcyIsIAogICAgICAgdGl0bGUgPSAiUGVyY2VudGFnZSBvZiBNaW5vcml0eSBHcm91cHMgd2l0aGluIFxuQ29tcHV0ZXIgYW5kIE1hdGhlbWF0aWNhbCBPY2N1cGF0aW9ucyBpbiB0aGUgVVMsIDIwMjAiKSAKI1xuIHdvcmtzIGluIHB5dGhvbiBzbyBJIGp1c3QgdXNlZCBpbiB0aGUgdGV4dCB0byBpbmRlbnQgZm9yIHRoZSB0aXRsZSAKI2h0dHBzOi8vd3d3LmRhdGFub3ZpYS5jb20vZW4vYmxvZy9nZ3Bsb3QtdGl0bGUtc3VidGl0bGUtYW5kLWNhcHRpb24vCiMgQWxib3VrYWRlbC4g4oCcR0dQbG90IFRpdGxlLCBTdWJ0aXRsZSBhbmQgQ2FwdGlvbjogVGhlIFVsdGltYXRlIEd1aWRlLuKAnSBEYXRhbm92aWEsIDExIE5vdi4gMjAxOCwgaHR0cHM6Ly93d3cuZGF0YW5vdmlhLmNvbS9lbi9ibG9nL2dncGxvdC10aXRsZS1zdWJ0aXRsZS1hbmQtY2FwdGlvbi8uIEFjY2Vzc2VkIDIyIEZlYi4gMjAyNC4KYGBgCkNyZWF0ZWQgYSBiYXIgY2hhcnQgdGhhdCBzaG93ZWQgdGhlIHBlcmNlbnRhZ2Ugb2Ygd29tZW4gaW4gdGhlIHdvcmtwbGFjZSBmb3IgQ29tcHV0ZXIgYW5kIE1hdGhlbWF0aWNhbCBPY2N1cGF0aW9ucyBpbiB0aGUgeWVhcnMgMjAwNSwgMjAxMCwgMjAxNSwgMjAyMC4gVGhpcyB3YXMgZG9uZSB0byBpbnZlc3RpZ2F0ZSB0aGUgcGVyY2VudGFnZSBvZiB3b21lbiBpbiBzdGVtIG92ZXIgdGltZSBzaW1pbGFyIHRvIG1pbm9yaXR5IGdyb3Vwcy4KVGhlIENvbG9yIGlzIGJhc2VkIG9uIGEgZ3JhZGllbnQgd2l0aCB0aGUgbGlnaHRlciBjb2xvcnMgaGF2aW5nIHRoZSBoaWdoZXN0IHBlcmNlbnRhZ2Ugb2Ygd29tZW4uIEl0IHNob3dzIHRoYXQgdGhlIHBlcmNlbnQgb2Ygd29tZW4gd2l0aGluIGNvbXB1dGVyIGFuZCBtYXRoZW1hdGljYWwgb2NjdXBhdGlvbnMgaGFzIGdvbmUgZG93biBzaW5jZSAyMDA1LiAKYGBge3J9CmdncGxvdChjb21wX2RhdGEsIGFlcyh4ID0gYXMuY2hhcmFjdGVyKHllYXIpLCB5ID0gV29tZW4sIGZpbGwgPSBXb21lbikpICsKICBnZW9tX2JhcihzdGF0PSJJZGVudGl0eSIpICsKICBsYWJzKHkgPSAiUGVyY2VudGFnZSBvZiBXb3JrcGxhY2UiLCB4ID0gIlllYXIiLCAKICAgICAgIHRpdGxlID0gIlBlcmNlbnRhZ2Ugb2YgV29tZW4gd2l0aGluIFxuQ29tcHV0ZXIgYW5kIE1hdGhlbWF0aWNhbCBPY2N1cGF0aW9ucyBpbiB0aGUgVVMgIikgCmBgYApUaGUga2V5IGZpbmRzIGZyb20gdGhlIGFuYWx5c2lzIGFyZTogCigxKUJsYWNrL0FmcmljYW4gcGVvcGxlIGFyZSB1bmRlcnJlcHJlc2VudGVkIGluIENvbXB1dGVyIGFuZCBNYXRoZW1hdGljYWwgT2NjdXBhdGlvbnMgc2luY2UgaW4gMjAyMC4gT25seSA5LjElIG9mIHRoZSB3b3JrcGxhY2Ugd2FzIGJsYWNrLiAKKDIpIEhpc3BhbmljIGFuZCBMYXRpbm8gd29ya2VycyBhcmUgYWxzbyB1bmRlcnJlcHJlc2VudGVkIGluIENvbXB1dGVyIGFuZCBNYXRoZW1hdGljYWwgT2NjdXBhdGlvbnMgc2luY2UgaW4gMjAyMC4gOC40JSBvZiB0aGUgd29ya3BsYWNlIHdhcyBIaXNwYW5pYy4KCigzKSBUaGUgUGVyY2VudGFnZSB3b3JrZXJzIHRoYXQgYXJlIEFzaWFuLCBCbGFjay9BZnJpY2FuLCBhbmQgSGlzcGFuaWMvTGF0aW5vIGhhcyBpbmNyZWFzZWQgc2luY2UgMjAwNQoKKDQpIFdvbWVuIGFyZSB1bmRlcnJlcHJlc2VudGVkIGluIENvbXB1dGVyIGFuZCBNYXRoZW1hdGljYWwgT2NjdXBhdGlvbnMgc2luY2UgdGhleSBtYWtlIHVwIG9ubHkgMjYuNSUgb2YgdGhlIHdvcmtwbGFjZSBzaW5jZSAyMDIwCgooNSkgVGhlIHBlcmNlbnRhZ2Ugb2Ygd29tZW4gaW4gdGhlIHdvcmtwbGFjZSBoYXMgZGVjcmVhc2VkIHNpbmNlIDIwMDU7IHRoaXMgaXMgc3VycHJpc2luZyBzaW5jZSB5b3Ugd291bGQgZXhwZWN0IHRoZSBwb3NpdGlvbiB0byBnZXQgbW9yZSBkaXZlcnNlIG92ZXIgdGltZQoKVGhlcmUgaXMgYSBzZXZlcmUgYW1vdW50IG9mIHVuZGVycmVwcmVzZW50ZWQgb2YgYm90aCB3b21lbiBhbmQgbWlub3JpdHkgZ3JvdXBzIHdpdGhpbiBDb21wdXRlciBhbmQgTWF0aGVtYXRpY2FsIE9jY3VwYXRpb25zLiBCYXNlZCBvbiB0aGUgcmVzdWx0cyBvZiB0aGlzIGRhdGEgYW5hbHlzaXMsIGl0IHdhcyBmb3VuZCB0aGF0IHdvbWVuIG1ha2UgdXAgMjYuNSBwZXJjZW50IG9mIHRoZSB3b3JrcGxhY2UgaW4gQ29tcHV0ZXIgYW5kIE1hdGhlbWF0aWNhbCBiYXNlZCBmaWVsZHMuIEJlc2lkZXMgYmVpbmcgdW5kZXJyZXByZXNlbnRlZCwgdGhlcmUgaGFzIGJlZW4gYSBkZWNyZWFzZSBpbiBwZXJjZW50YWdlIG9mIHdvbWVuIHdvcmtpbmcgaW4gdGhvc2UgZmllbGRzIHNpbmNlIDIwMDUuIEhpc3BhbmljL0xhdGlubyB3b3JrZXJzIG1ha2UgYXBwcm94aW1hdGVseSA4LjQlIG9mIHRoZSB3b3JrcGxhY2UgaW4gQ29tcHV0ZXIgYW5kIE1hdGhlbWF0aWNhbCBiYXNlZCBmaWVsZHMgbWFraW5nIHRoZW0gdW5kZXJyZXByZXNlbnRlZCBjb21wYXJlZCB0aGUgZGVtb2dyYXBoaWNzIG9mIHRoZSBVbml0ZWQgU3RhdGVzLiBCbGFjay9BZnJpY2FuIHdvcmtlcnMgYXJlIGFsc28gdW5kZXJyZXByZXNlbnRlZCBtYWtpbmcgdXAgOS4xJSBvZiB0aGUgd29ya2ZvcmNlIGluIENvbXB1dGVyIGFuZCBNYXRoZW1hdGljYWwgYmFzZWQgb2NjdXBhdGlvbnMuIEhvd2V2ZXIsIHNpbmNlIDIwMDUgdGhlcmUgaGFzIGJlZW4gc2hvd24gdG8gYmUgYW4gaW5jcmVhc2Ugb2YgbWlub3JpdHkgd29ya2VycyBpbiB0aGVzZSBvY2N1cGF0aW9ucy4K