IRWMH <- read.csv("D:/R course/Practicing/Mental health vs remote work/IRWMH.csv")
summary(IRWMH)
 Employee_ID             Age           Gender            Job_Role        
 Length:5000        Min.   :22.00   Length:5000        Length:5000       
 Class :character   1st Qu.:31.00   Class :character   Class :character  
 Mode  :character   Median :41.00   Mode  :character   Mode  :character  
                    Mean   :40.99                                        
                    3rd Qu.:51.00                                        
                    Max.   :60.00                                        
   Industry         Years_of_Experience Work_Location     
 Length:5000        Min.   : 1.00       Length:5000       
 Class :character   1st Qu.: 9.00       Class :character  
 Mode  :character   Median :18.00       Mode  :character  
                    Mean   :17.81                         
                    3rd Qu.:26.00                         
                    Max.   :35.00                         
 Hours_Worked_Per_Week Number_of_Virtual_Meetings Work_Life_Balance_Rating
 Min.   :20.00         Min.   : 0.000             Min.   :1.000           
 1st Qu.:29.00         1st Qu.: 4.000             1st Qu.:2.000           
 Median :40.00         Median : 8.000             Median :3.000           
 Mean   :39.61         Mean   : 7.559             Mean   :2.984           
 3rd Qu.:50.00         3rd Qu.:12.000             3rd Qu.:4.000           
 Max.   :60.00         Max.   :15.000             Max.   :5.000           
 Stress_Level       Mental_Health_Condition Access_to_Mental_Health_Resources
 Length:5000        Length:5000             Length:5000                      
 Class :character   Class :character        Class :character                 
 Mode  :character   Mode  :character        Mode  :character                 
                                                                             
                                                                             
                                                                             
 Productivity_Change Social_Isolation_Rating Satisfaction_with_Remote_Work
 Length:5000         Min.   :1.000           Length:5000                  
 Class :character    1st Qu.:2.000           Class :character             
 Mode  :character    Median :3.000           Mode  :character             
                     Mean   :2.994                                        
                     3rd Qu.:4.000                                        
                     Max.   :5.000                                        
 Company_Support_for_Remote_Work Physical_Activity  Sleep_Quality     
 Min.   :1.000                   Length:5000        Length:5000       
 1st Qu.:2.000                   Class :character   Class :character  
 Median :3.000                   Mode  :character   Mode  :character  
 Mean   :3.008                                                        
 3rd Qu.:4.000                                                        
 Max.   :5.000                                                        
    Region         
 Length:5000       
 Class :character  
 Mode  :character  
                   
                   
                   
IRWMH$Age_Group <- cut(
     IRWMH$Age,
     breaks = c(20, 30, 40, 50, 60), # Define the breakpoints for age groups
    labels = c("21-30", "31-40", "41-50", "51-60"), # Set labels for each age group
     right = TRUE # Include the right endpoint in intervals (e.g., 30 is included in 21-30)
 )
age_group_counts <- table(IRWMH$Age_Group)
print(age_group_counts)

21-30 31-40 41-50 51-60 
 1170  1239  1321  1270 
table(IRWMH$Gender)

           Female              Male        Non-binary Prefer not to say 
             1274              1270              1214              1242 
table(IRWMH$Job_Role)

   Data Scientist          Designer                HR         Marketing 
              696               723               716               683 
  Project Manager             Sales Software Engineer 
              738               733               711 
table(IRWMH$Industry)

   Consulting     Education       Finance    Healthcare            IT 
          680           690           747           728           746 
Manufacturing        Retail 
          683           726 
table(IRWMH$Work_Location)

Hybrid Onsite Remote 
  1649   1637   1714 
table(IRWMH$Work_Life_Balance_Rating)

   1    2    3    4    5 
1023  967 1053  980  977 
table(IRWMH$Stress_Level)

  High    Low Medium 
  1686   1645   1669 
table(IRWMH$Mental_Health_Condition)

   Anxiety    Burnout Depression       None 
      1278       1280       1246       1196 
table(IRWMH$Access_to_Mental_Health_Resources)

  No  Yes 
2553 2447 
table(IRWMH$Productivity_Change)

 Decrease  Increase No Change 
     1737      1586      1677 
table(IRWMH$Social_Isolation_Rating)

   1    2    3    4    5 
 953 1066  992 1037  952 
table(IRWMH$Satisfaction_with_Remote_Work)

    Neutral   Satisfied Unsatisfied 
       1648        1675        1677 
table(IRWMH$Company_Support_for_Remote_Work)

   1    2    3    4    5 
 967  985 1077  984  987 
table(IRWMH$Physical_Activity)

 Daily   None Weekly 
  1616   1629   1755 
table(IRWMH$Sleep_Quality)

Average    Good    Poor 
   1628    1687    1685 
table(IRWMH$Region)

       Africa          Asia        Europe North America       Oceania 
          860           829           840           777           867 
South America 
          827 
table(IRWMH$Experience_Group)
< table of extent 0 >
average_hours_by_job_function <- IRWMH %>%
     group_by(Job_Role) %>% # Group data by Job_Role
     summarise(Average_Hours = mean(Hours_Worked_Per_Week, na.rm = TRUE))
print(average_hours_by_job_function)
IRWMH <- data.frame(
     Job_Role = rep(c("Data Scientist", "Designer", "HR", "Marketing", 
                      "Project Manager", "Sales", "Software Engineer"), each = 30),
     Hours_Worked_Per_Week = c(
         rnorm(30, mean = 38.95402, sd = 1), # Data Scientist
         rnorm(30, mean = 38.88105, sd = 1), # Designer
         rnorm(30, mean = 39.66061, sd = 1), # HR
         rnorm(30, mean = 39.73499, sd = 1), # Marketing
         rnorm(30, mean = 39.92276, sd = 1), # Project Manager
         rnorm(30, mean = 39.86085, sd = 1), # Sales
         rnorm(30, mean = 40.27145, sd = 1)  # Software Engineer
     )
 )
 anova_model <- aov(Hours_Worked_Per_Week ~ Job_Role, data = IRWMH)
 summary(anova_model)
             Df Sum Sq Mean Sq F value   Pr(>F)    
Job_Role      6  63.35  10.559   10.51 3.82e-10 ***
Residuals   203 204.05   1.005                     
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
IRWMH <- read.csv("D:/R course/Practicing/Mental health vs remote work/IRWMH.csv")
average_wlb_by_job_function <- IRWMH %>%
     group_by(Job_Role) %>% # Group data by Job_Role
     summarise(Average_rating = mean(Work_Life_Balance_Rating, na.rm = TRUE))
print(average_wlb_by_job_function)
average_vm_by_job_function <- IRWMH %>%
     group_by(Job_Role) %>% # Group data by Job_Role
     summarise(Average_vm = mean(Number_of_Virtual_Meetings, na.rm = TRUE))
print(average_vm_by_job_function)
average_cs_by_job_function <- IRWMH %>%
     group_by(Job_Role) %>% # Group data by Job_Role
     summarise(Average_cs = mean(Company_Support_for_Remote_Work, na.rm = TRUE))
print(average_cs_by_job_function)
average_wlb_by_job_function <- IRWMH %>%
     group_by(Region) %>% # Group data by Region
     summarise(Average_wlb = mean(Work_Life_Balance_Rating, na.rm = TRUE))
print(average_wlb_by_job_function)
average_wpw_by_job_function <- IRWMH %>%
     group_by(Region) %>% # Group data by Region
     summarise(Average_wpw = mean(Hours_Worked_Per_Week, na.rm = TRUE))
print(average_wpw_by_job_function)
sleep_quality_percentages <- IRWMH %>%
     group_by(Region, Sleep_Quality) %>%
     summarise(Count = n(), .groups = 'drop') %>%
     mutate(Percentage = Count / sum(Count) * 100) %>%
     arrange(Region, Sleep_Quality)
print(sleep_quality_percentages)
ggplot(sleep_quality_percentages, aes(x = Region, y = Percentage, fill = Sleep_Quality)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "Percentage of Sleep Quality Ratings by Region",
       x = "Region",
       y = "Percentage of Sleep Quality Ratings") +
  theme_minimal() +
  scale_fill_brewer(palette = "Set2")

stress_level_percentages <- IRWMH %>%
     group_by(Region, Stress_Level) %>%
     summarise(Count = n(), .groups = 'drop') %>%
     mutate(Percentage = Count / sum(Count) * 100) %>%
     arrange(Region, Stress_Level)
print(stress_level_percentages)
ggplot(stress_level_percentages, aes(x = Region, y = Percentage, fill = Stress_Level)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "Percentage of Stress Level Ratings by Region",
       x = "Region",
       y = "Percentage of Stress Level Ratings") +
  theme_minimal() +
  scale_fill_brewer(palette = "Set2")

stress_level_percentages <- IRWMH %>%
     group_by(Job_Role, Stress_Level) %>%
     summarise(Count = n(), .groups = 'drop') %>%
     mutate(Percentage = Count / sum(Count) * 100) %>%
     arrange(Job_Role, Stress_Level)
print(stress_level_percentages)
ggplot(stress_level_percentages, aes(x = Job_Role, y = Percentage, fill = Stress_Level)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "Percentage of Stress Level Ratings by Job Role",
       x = "Job_Role",
       y = "Percentage of Stress Level Ratings") +
  theme_minimal() +
  scale_fill_brewer(palette = "Set2")

# Define the data
work_modes <- c(Hybrid = 1649, Onsite = 1637, Remote = 1714)

# Calculate percentages
percentages <- round((work_modes / sum(work_modes)) * 100, 1)

# Define labels with percentages
labels <- paste(names(work_modes), "\n", percentages, "%", sep = "")

# Create a pie chart with percentages
pie(work_modes, labels = labels, 
    main = "Distribution of Work Modes",
    col = c("skyblue", "orange", "green"))  # Optional: Customize colors

NA
NA
# Define the data
experience_counts <- c("1-10" = 1473, "11-20" = 1386, "21-30" = 1488, "31-40" = 653)

# Calculate percentages
percentages <- round((experience_counts / sum(experience_counts)) * 100, 1)

# Define labels with percentages
labels <- paste(names(experience_counts), "\n", percentages, "%", sep = "")

# Create a pie chart with percentages
pie(experience_counts, labels = labels, 
    main = "Distribution of Employees by Job Experience",
    col = c("skyblue", "orange", "green", "purple"))  # Customize colors as desired

work_mode_percentages <- IRWMH %>%
     group_by(Job_Role, Work_Location) %>%
     summarise(Count = n(), .groups = 'drop') %>%
     mutate(Percentage = Count / sum(Count) * 100) %>%
     arrange(Job_Role, Work_Location)
print(work_mode_percentages)
ggplot(work_mode_percentages, aes(x = Job_Role, y = Percentage, fill = Work_Location)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "Percentage of Work Location Type by Job Role",
       x = "Job_Role",
       y = "Percentage of Location Types") +
  theme_minimal() +
  scale_fill_brewer(palette = "Set2")

stress_level_percentages <- IRWMH %>%
     group_by(Work_Location, Stress_Level) %>%
     summarise(Count = n(), .groups = 'drop') %>%
     mutate(Percentage = Count / sum(Count) * 100) %>%
     arrange(Work_Location, Stress_Level)
print(stress_level_percentages)
ggplot(stress_level_percentages, aes(x = Work_Location, y = Percentage, fill = Stress_Level)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "Percentage of Different Stress Level by Work Location",
       x = "Work Location",
       y = "Percentage of Stress Level") +
  theme_minimal() +
  scale_fill_brewer(palette = "Set2")

virtual_meetings_summary <- IRWMH %>%
  group_by(Job_Role) %>%
  summarise(Total_Virtual_Meetings = sum(Number_of_Virtual_Meetings, na.rm = TRUE)) %>%
  arrange(desc(Total_Virtual_Meetings))
print(virtual_meetings_summary)
mental_health_condition_percentages <- IRWMH %>%
     group_by(Job_Role, Mental_Health_Condition) %>%
     summarise(Count = n(), .groups = 'drop') %>%
     mutate(Percentage = Count / sum(Count) * 100) %>%
     arrange(Job_Role, Mental_Health_Condition)
print(mental_health_condition_percentages)
ggplot(mental_health_condition_percentages, aes(x = Job_Role, y = Percentage, fill = Mental_Health_Condition)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "Percentage of Different Mental Health Condition by Job Role",
       x = "Job Role",
       y = "Mental Health Condition") +
  theme_minimal() +
  scale_fill_brewer(palette = "Set2")

mental_health_condition_percentages <- IRWMH %>%
     group_by(Gender, Mental_Health_Condition) %>%
     summarise(Count = n(), .groups = 'drop') %>%
     mutate(Percentage = Count / sum(Count) * 100) %>%
     arrange(Gender, Mental_Health_Condition)
print(mental_health_condition_percentages)
ggplot(mental_health_condition_percentages, aes(x = Gender, y = Percentage, fill = Mental_Health_Condition)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "Percentage of Different Mental Health Condition by Gender",
       x = "Gender",
       y = "Mental Health Condition") +
  theme_minimal() +
  scale_fill_brewer(palette = "Set2")

job_role_by_gender_summary <- IRWMH %>%
     group_by(Gender, Job_Role) %>%
     summarise(Count = n(), .groups = 'drop') %>%
     arrange(Gender, Job_Role)
print(job_role_by_gender_summary)
ggplot(job_role_by_gender_summary, aes(x = Gender, y = Count, fill = Job_Role)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "Number of Different Job Roles by Gender",
       x = "Gender",
       y = "Job Role") +
  theme_minimal() +
  scale_fill_brewer(palette = "Set2")

productivity_change_percentages <- IRWMH %>%
     group_by(Stress_Level, Productivity_Change) %>%
     summarise(Count = n(), .groups = 'drop') %>%
     mutate(Percentage = Count / sum(Count) * 100) %>%
     arrange(Stress_Level, Productivity_Change)
print(productivity_change_percentages)
ggplot(productivity_change_percentages, aes(x = Stress_Level, y = Percentage, fill = Productivity_Change)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "Productivity Change due to Stress Level",
       x = "Stress Level",
       y = "Productivity Change") +
  theme_minimal() +
  scale_fill_brewer(palette = "Set2")

productivity_change_percentages <- IRWMH %>%
     group_by(Sleep_Quality, Productivity_Change) %>%
     summarise(Count = n(), .groups = 'drop') %>%
     mutate(Percentage = Count / sum(Count) * 100) %>%
     arrange(Sleep_Quality, Productivity_Change)
print(productivity_change_percentages)
ggplot(productivity_change_percentages, aes(x = Sleep_Quality, y = Percentage, fill = Productivity_Change)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "Productivity Change according to Sleep Quality",
       x = "Sleep Quality",
       y = "Productivity Change") +
  theme_minimal() +
  scale_fill_brewer(palette = "Set2")

# Create a contingency table
contingency_table <- table(productivity_change_percentages$Sleep_Quality, productivity_change_percentages$Productivity_Change)

fisher_test <- fisher.test(contingency_table)
# View the results
print(fisher_test)

    Fisher's Exact Test for Count Data

data:  contingency_table
p-value = 1
alternative hypothesis: two.sided
satisfaction_with_remote_work_percentages <- IRWMH %>%
     group_by(Job_Role, Satisfaction_with_Remote_Work) %>%
     summarise(Count = n(), .groups = 'drop') %>%
     mutate(Percentage = Count / sum(Count) * 100) %>%
     arrange(Job_Role, Satisfaction_with_Remote_Work)
print(satisfaction_with_remote_work_percentages)
ggplot(satisfaction_with_remote_work_percentages, aes(x = Job_Role, y = Percentage, fill = Satisfaction_with_Remote_Work)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "Satisfaction with Remote Work by Job Role",
       x = "Job Role",
       y = "Satisfaction Level") +
  theme_minimal() +
  scale_fill_brewer(palette = "Set2")

ggplot(satisfaction_with_remote_work_percentages, aes(x = Job_Role, y = Count, fill = Satisfaction_with_Remote_Work)) +
  geom_violin(trim = FALSE) +  # Creates the violin plot
  geom_boxplot(width = 0.1, outlier.shape = NA, alpha = 0.5) + # Adds a boxplot inside the violin
  labs(
    title = "satisfaction_with_remote_work",
    x = "Job Role",
    y = "Satisfaction_with_Remote_Work"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +  # Rotates x-axis labels for better readability
  scale_fill_brewer(palette = "Set3")

# Create a data frame with the provided data
data <- data.frame(
  Profession = c("Data Scientist", "Designer", "HR", "Marketing", 
                 "Project Manager", "Sales", "Software Engineer"),
  Avg_Hours_Worked = c(38.95402, 38.88105, 39.66061, 39.73499, 
                       39.92276, 39.86085, 40.27145),
  Work_Life_Balance_Rating = c(3.007184, 2.966805, 2.930168, 
                               2.945827, 2.960705, 3.043656, 3.033755)
)

# Calculate the Pearson correlation coefficient between Avg_Hours_Worked and Work_Life_Balance_Rating
correlation <- cor(data$Avg_Hours_Worked, data$Work_Life_Balance_Rating)
print(paste("Correlation coefficient between average hours worked and work-life balance rating:", round(correlation, 4)))
[1] "Correlation coefficient between average hours worked and work-life balance rating: 0.2232"
# Optional: Visualize the relationship with a scatter plot
ggplot(data, aes(x = Avg_Hours_Worked, y = Work_Life_Balance_Rating, label = Profession)) +
  geom_point(size = 3, color = "blue") +
  geom_text(vjust = -0.5, hjust = 0.5) +  # Adds profession labels near points
  labs(
    title = "Relationship Between Average Hours Worked and Work-Life Balance Rating",
    x = "Average Hours Worked",
    y = "Work-Life Balance Rating"
  ) +
  theme_minimal()

job_role_by_industry_summary <- IRWMH %>%
     group_by(Industry, Job_Role) %>%
     summarise(Count = n(), .groups = 'drop') %>%
     arrange(Industry, Job_Role)
print(job_role_by_industry_summary)
ggplot(job_role_by_industry_summary, aes(x = Industry, y = Count, fill = Job_Role)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "Number of Different Job Roles by Industry",
       x = "Industry",
       y = "Job Role") +
  theme_minimal() +
  scale_fill_brewer(palette = "Set2")

acmh_by_industry_summary <- IRWMH %>%
     group_by(Industry, Access_to_Mental_Health_Resources) %>%
     summarise(Count = n(), .groups = 'drop') %>%
     arrange(Industry, Access_to_Mental_Health_Resources)
print(acmh_by_industry_summary)
ggplot(acmh_by_industry_summary, aes(x = Industry, y = Count, fill = Access_to_Mental_Health_Resources)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "Access to Mental Health by Industry",
       x = "Industry",
       y = "Access to Mental Health") +
  theme_minimal() +
  scale_fill_brewer(palette = "Set2")

ggplot(IRWMH, aes(x = Job_Role, y = Age, fill = Job_Role)) +
  geom_violin(trim = FALSE) +  # Creates the violin plot
  geom_boxplot(width = 0.1, outlier.shape = NA, alpha = 0.5) + # Adds a boxplot inside the violin
  labs(
    title = "Age Distribution by Job Role",
    x = "Job Role",
    y = "Age"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +  # Rotates x-axis labels for better readability
  scale_fill_brewer(palette = "Set3")  # Optional: customize the color palette

average_age_by_job <- IRWMH %>%
  group_by(Job_Role) %>%
  summarise(Average_Age = mean(Age, na.rm = TRUE))  # Calculate the mean age

# Display the results
print(average_age_by_job)
ggplot(IRWMH, aes(x = Job_Role, y = Years_of_Experience, fill = Job_Role)) +
  geom_violin(trim = FALSE) +  # Creates the violin plot
  geom_boxplot(width = 0.1, outlier.shape = NA, alpha = 0.5) + # Adds a boxplot inside the violin
  labs(
    title = "Experience Distribution by Job Role",
    x = "Job Role",
    y = "Years of Experience"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +  # Rotates x-axis labels for better readability
  scale_fill_brewer(palette = "Set3")  # Optional: customize the color palette

IRWMH$Stress_Level <- factor(IRWMH$Stress_Level, ordered = TRUE, levels = c("Low", "Medium", "High"))

# Remove rows with missing values
data_clean <- IRWMH %>%
  filter(!is.na(Stress_Level), !is.na(Hours_Worked_Per_Week))

# Perform ordinal logistic regression
model_stress_ordinal <- polr(Stress_Level ~ Hours_Worked_Per_Week, data = data_clean, method = "logistic")

# View the summary of the model
summary(model_stress_ordinal)

Re-fitting to get Hessian
Call:
polr(formula = Stress_Level ~ Hours_Worked_Per_Week, data = data_clean, 
    method = "logistic")

Coefficients:
                         Value Std. Error t value
Hours_Worked_Per_Week 0.002565   0.002192    1.17

Intercepts:
            Value   Std. Error t value
Low|Medium  -0.6113  0.0917    -6.6647
Medium|High  0.7775  0.0920     8.4525

Residual Deviance: 10984.24 
AIC: 10990.24 

IRWMH <- read.csv("D:/R course/Practicing/Mental health vs remote work/IRWMH.csv")
model <- lm(Number_of_Virtual_Meetings ~ Hours_Worked_Per_Week, data = IRWMH)

# Check the model summary
summary(model)

Call:
lm(formula = Number_of_Virtual_Meetings ~ Hours_Worked_Per_Week, 
    data = IRWMH)

Residuals:
    Min      1Q  Median      3Q     Max 
-7.5943 -3.5943  0.4111  4.4093  7.4777 

Coefficients:
                       Estimate Std. Error t value Pr(>|t|)    
(Intercept)            7.630367   0.228640  33.373   <2e-16 ***
Hours_Worked_Per_Week -0.001802   0.005529  -0.326    0.745    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 4.637 on 4998 degrees of freedom
Multiple R-squared:  2.124e-05, Adjusted R-squared:  -0.0001788 
F-statistic: 0.1062 on 1 and 4998 DF,  p-value: 0.7446
# Plot with regression line
plot(IRWMH$Hours_Worked_Per_Week, IRWMH$Number_of_Virtual_Meetings,
     main = "Regression Analysis",
     xlab = "Hours Worked Per Week",
     ylab = "Number of Virtual Meetings",
     pch = 19, col = "blue")
abline(model, col = "red", lwd = 2)

# Add the regression line
abline(model, col = "red", lwd = 2)

stress_level_by_work_location_summary <- IRWMH %>%
     group_by(Work_Location, Stress_Level) %>%
     summarise(Count = n(), .groups = 'drop') %>%
     arrange(Work_Location, Stress_Level)
print(stress_level_by_work_location_summary)
ggplot(stress_level_by_work_location_summary, aes(x = Work_Location, y = Count, fill = Stress_Level)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "Stress Level by Job Location",
       x = "Work Location",
       y = "Stress Level") +
  theme_minimal() +
  scale_fill_brewer(palette = "Set2")

cs_by_industry_summary <- IRWMH %>%
     group_by(Industry, Company_Support_for_Remote_Work) %>%
     summarise(Count = n(), .groups = 'drop') %>%
     arrange(Industry, Company_Support_for_Remote_Work)
print(cs_by_industry_summary)
average_cs_by_industry <- IRWMH %>%
  group_by(Industry) %>%
  summarise(Average_CS = mean(Company_Support_for_Remote_Work, na.rm = TRUE))  

# Display the results
print(average_cs_by_industry)
ggplot(IRWMH, aes(x = Industry, y = Company_Support_for_Remote_Work, fill = Industry)) +
  geom_violin(trim = FALSE) +  # Creates the violin plot
  geom_boxplot(width = 0.1, outlier.shape = NA, alpha = 0.5) + # Adds a boxplot inside the violin
  labs(
    title = "Company Support for Remote Work by Industry",
    x = "Industry",
    y = "Company Support Rating"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +  # Rotates x-axis labels for better readability
  scale_fill_brewer(palette = "Set3")

average_csr_by_region <- IRWMH %>%
  group_by(Region) %>%
  summarise(Average_CSR = mean(Company_Support_for_Remote_Work, na.rm = TRUE))  

# Display the results
print(average_csr_by_region)
average_sir_by_region <- IRWMH %>%
  group_by(Region) %>%
  summarise(Average_SIR = mean(Social_Isolation_Rating, na.rm = TRUE))  

# Display the results
print(average_sir_by_region)
# Data: Average Company Support Rating by Region
company_support <- c(3.010465, 2.965018, 2.964286, 3.037323, 3.055363, 3.014510)

# Data: Average Social Isolation Rating by Region
social_isolation <- c(2.987209, 2.980700, 2.936905, 3.011583, 3.065744, 2.979444)

# Data: Region Names
regions <- c("Africa", "Asia", "Europe", "North America", "Oceania", "South America")

# Create a data frame
data <- data.frame(Region = regions, Company_Support = company_support, Social_Isolation = social_isolation)
# Perform linear regression
model <- lm(Social_Isolation ~ Company_Support, data = data)

# Summary of the regression model
summary(model)

Call:
lm(formula = Social_Isolation ~ Company_Support, data = data)

Residuals:
        1         2         3         4         5         6 
-0.009011  0.029661 -0.013406 -0.011337  0.024890 -0.020797 

Coefficients:
                Estimate Std. Error t value Pr(>|t|)  
(Intercept)     0.003419   0.871723   0.004   0.9971  
Company_Support 0.994132   0.289800   3.430   0.0265 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.02409 on 4 degrees of freedom
Multiple R-squared:  0.7463,    Adjusted R-squared:  0.6829 
F-statistic: 11.77 on 1 and 4 DF,  p-value: 0.02653
# Plotting the data points
plot(data$Company_Support, data$Social_Isolation, 
     main = "Regression of Social Isolation on Company Support",
     xlab = "Average Company Support Rating", 
     ylab = "Average Social Isolation Rating", 
     pch = 19, col = "blue")

# Add regression line
abline(model, col = "red", lwd = 2)

LS0tDQp0aXRsZTogIkVmZmVjdCBvZiBNZW50YWwgSGVhbHRoIG9uIFJlbW90ZSBXb3JrIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCmBgYHtyfQ0KSVJXTUggPC0gcmVhZC5jc3YoIkQ6L1IgY291cnNlL1ByYWN0aWNpbmcvTWVudGFsIGhlYWx0aCB2cyByZW1vdGUgd29yay9JUldNSC5jc3YiKQ0KYGBgDQpgYGB7cn0NCnN1bW1hcnkoSVJXTUgpDQpgYGANCmBgYHtyfQ0KSVJXTUgkQWdlX0dyb3VwIDwtIGN1dCgNCiAgICAgSVJXTUgkQWdlLA0KICAgICBicmVha3MgPSBjKDIwLCAzMCwgNDAsIDUwLCA2MCksICMgRGVmaW5lIHRoZSBicmVha3BvaW50cyBmb3IgYWdlIGdyb3Vwcw0KICAgIGxhYmVscyA9IGMoIjIxLTMwIiwgIjMxLTQwIiwgIjQxLTUwIiwgIjUxLTYwIiksICMgU2V0IGxhYmVscyBmb3IgZWFjaCBhZ2UgZ3JvdXANCiAgICAgcmlnaHQgPSBUUlVFICMgSW5jbHVkZSB0aGUgcmlnaHQgZW5kcG9pbnQgaW4gaW50ZXJ2YWxzIChlLmcuLCAzMCBpcyBpbmNsdWRlZCBpbiAyMS0zMCkNCiApDQphZ2VfZ3JvdXBfY291bnRzIDwtIHRhYmxlKElSV01IJEFnZV9Hcm91cCkNCnByaW50KGFnZV9ncm91cF9jb3VudHMpDQpgYGANCmBgYHtyfQ0KdGFibGUoSVJXTUgkR2VuZGVyKQ0KYGBgDQpgYGB7cn0NCnRhYmxlKElSV01IJEpvYl9Sb2xlKQ0KdGFibGUoSVJXTUgkSW5kdXN0cnkpDQpgYGANCmBgYHtyfQ0KdGFibGUoSVJXTUgkV29ya19Mb2NhdGlvbikNCnRhYmxlKElSV01IJFdvcmtfTGlmZV9CYWxhbmNlX1JhdGluZykNCnRhYmxlKElSV01IJFN0cmVzc19MZXZlbCkNCnRhYmxlKElSV01IJE1lbnRhbF9IZWFsdGhfQ29uZGl0aW9uKQ0KdGFibGUoSVJXTUgkQWNjZXNzX3RvX01lbnRhbF9IZWFsdGhfUmVzb3VyY2VzKQ0KdGFibGUoSVJXTUgkUHJvZHVjdGl2aXR5X0NoYW5nZSkNCnRhYmxlKElSV01IJFNvY2lhbF9Jc29sYXRpb25fUmF0aW5nKQ0KdGFibGUoSVJXTUgkU2F0aXNmYWN0aW9uX3dpdGhfUmVtb3RlX1dvcmspDQp0YWJsZShJUldNSCRDb21wYW55X1N1cHBvcnRfZm9yX1JlbW90ZV9Xb3JrKQ0KdGFibGUoSVJXTUgkUGh5c2ljYWxfQWN0aXZpdHkpDQp0YWJsZShJUldNSCRTbGVlcF9RdWFsaXR5KQ0KdGFibGUoSVJXTUgkUmVnaW9uKQ0KdGFibGUoSVJXTUgkRXhwZXJpZW5jZV9Hcm91cCkNCmBgYA0KYGBge3J9DQphdmVyYWdlX2hvdXJzX2J5X2pvYl9mdW5jdGlvbiA8LSBJUldNSCAlPiUNCiAgICAgZ3JvdXBfYnkoSm9iX1JvbGUpICU+JSAjIEdyb3VwIGRhdGEgYnkgSm9iX1JvbGUNCiAgICAgc3VtbWFyaXNlKEF2ZXJhZ2VfSG91cnMgPSBtZWFuKEhvdXJzX1dvcmtlZF9QZXJfV2VlaywgbmEucm0gPSBUUlVFKSkNCnByaW50KGF2ZXJhZ2VfaG91cnNfYnlfam9iX2Z1bmN0aW9uKQ0KYGBgDQpgYGB7cn0NCklSV01IIDwtIGRhdGEuZnJhbWUoDQogICAgIEpvYl9Sb2xlID0gcmVwKGMoIkRhdGEgU2NpZW50aXN0IiwgIkRlc2lnbmVyIiwgIkhSIiwgIk1hcmtldGluZyIsIA0KICAgICAgICAgICAgICAgICAgICAgICJQcm9qZWN0IE1hbmFnZXIiLCAiU2FsZXMiLCAiU29mdHdhcmUgRW5naW5lZXIiKSwgZWFjaCA9IDMwKSwNCiAgICAgSG91cnNfV29ya2VkX1Blcl9XZWVrID0gYygNCiAgICAgICAgIHJub3JtKDMwLCBtZWFuID0gMzguOTU0MDIsIHNkID0gMSksICMgRGF0YSBTY2llbnRpc3QNCiAgICAgICAgIHJub3JtKDMwLCBtZWFuID0gMzguODgxMDUsIHNkID0gMSksICMgRGVzaWduZXINCiAgICAgICAgIHJub3JtKDMwLCBtZWFuID0gMzkuNjYwNjEsIHNkID0gMSksICMgSFINCiAgICAgICAgIHJub3JtKDMwLCBtZWFuID0gMzkuNzM0OTksIHNkID0gMSksICMgTWFya2V0aW5nDQogICAgICAgICBybm9ybSgzMCwgbWVhbiA9IDM5LjkyMjc2LCBzZCA9IDEpLCAjIFByb2plY3QgTWFuYWdlcg0KICAgICAgICAgcm5vcm0oMzAsIG1lYW4gPSAzOS44NjA4NSwgc2QgPSAxKSwgIyBTYWxlcw0KICAgICAgICAgcm5vcm0oMzAsIG1lYW4gPSA0MC4yNzE0NSwgc2QgPSAxKSAgIyBTb2Z0d2FyZSBFbmdpbmVlcg0KICAgICApDQogKQ0KIGFub3ZhX21vZGVsIDwtIGFvdihIb3Vyc19Xb3JrZWRfUGVyX1dlZWsgfiBKb2JfUm9sZSwgZGF0YSA9IElSV01IKQ0KIHN1bW1hcnkoYW5vdmFfbW9kZWwpDQpgYGANCmBgYHtyfQ0KSVJXTUggPC0gcmVhZC5jc3YoIkQ6L1IgY291cnNlL1ByYWN0aWNpbmcvTWVudGFsIGhlYWx0aCB2cyByZW1vdGUgd29yay9JUldNSC5jc3YiKQ0KYXZlcmFnZV93bGJfYnlfam9iX2Z1bmN0aW9uIDwtIElSV01IICU+JQ0KICAgICBncm91cF9ieShKb2JfUm9sZSkgJT4lICMgR3JvdXAgZGF0YSBieSBKb2JfUm9sZQ0KICAgICBzdW1tYXJpc2UoQXZlcmFnZV9yYXRpbmcgPSBtZWFuKFdvcmtfTGlmZV9CYWxhbmNlX1JhdGluZywgbmEucm0gPSBUUlVFKSkNCnByaW50KGF2ZXJhZ2Vfd2xiX2J5X2pvYl9mdW5jdGlvbikNCmBgYA0KYGBge3J9DQphdmVyYWdlX3ZtX2J5X2pvYl9mdW5jdGlvbiA8LSBJUldNSCAlPiUNCiAgICAgZ3JvdXBfYnkoSm9iX1JvbGUpICU+JSAjIEdyb3VwIGRhdGEgYnkgSm9iX1JvbGUNCiAgICAgc3VtbWFyaXNlKEF2ZXJhZ2Vfdm0gPSBtZWFuKE51bWJlcl9vZl9WaXJ0dWFsX01lZXRpbmdzLCBuYS5ybSA9IFRSVUUpKQ0KcHJpbnQoYXZlcmFnZV92bV9ieV9qb2JfZnVuY3Rpb24pDQpgYGANCmBgYHtyfQ0KYXZlcmFnZV9jc19ieV9qb2JfZnVuY3Rpb24gPC0gSVJXTUggJT4lDQogICAgIGdyb3VwX2J5KEpvYl9Sb2xlKSAlPiUgIyBHcm91cCBkYXRhIGJ5IEpvYl9Sb2xlDQogICAgIHN1bW1hcmlzZShBdmVyYWdlX2NzID0gbWVhbihDb21wYW55X1N1cHBvcnRfZm9yX1JlbW90ZV9Xb3JrLCBuYS5ybSA9IFRSVUUpKQ0KcHJpbnQoYXZlcmFnZV9jc19ieV9qb2JfZnVuY3Rpb24pDQpgYGANCmBgYHtyfQ0KYXZlcmFnZV93bGJfYnlfam9iX2Z1bmN0aW9uIDwtIElSV01IICU+JQ0KICAgICBncm91cF9ieShSZWdpb24pICU+JSAjIEdyb3VwIGRhdGEgYnkgUmVnaW9uDQogICAgIHN1bW1hcmlzZShBdmVyYWdlX3dsYiA9IG1lYW4oV29ya19MaWZlX0JhbGFuY2VfUmF0aW5nLCBuYS5ybSA9IFRSVUUpKQ0KcHJpbnQoYXZlcmFnZV93bGJfYnlfam9iX2Z1bmN0aW9uKQ0KYGBgDQpgYGB7cn0NCmF2ZXJhZ2Vfd3B3X2J5X2pvYl9mdW5jdGlvbiA8LSBJUldNSCAlPiUNCiAgICAgZ3JvdXBfYnkoUmVnaW9uKSAlPiUgIyBHcm91cCBkYXRhIGJ5IFJlZ2lvbg0KICAgICBzdW1tYXJpc2UoQXZlcmFnZV93cHcgPSBtZWFuKEhvdXJzX1dvcmtlZF9QZXJfV2VlaywgbmEucm0gPSBUUlVFKSkNCnByaW50KGF2ZXJhZ2Vfd3B3X2J5X2pvYl9mdW5jdGlvbikNCmBgYA0KYGBge3J9DQpzbGVlcF9xdWFsaXR5X3BlcmNlbnRhZ2VzIDwtIElSV01IICU+JQ0KICAgICBncm91cF9ieShSZWdpb24sIFNsZWVwX1F1YWxpdHkpICU+JQ0KICAgICBzdW1tYXJpc2UoQ291bnQgPSBuKCksIC5ncm91cHMgPSAnZHJvcCcpICU+JQ0KICAgICBtdXRhdGUoUGVyY2VudGFnZSA9IENvdW50IC8gc3VtKENvdW50KSAqIDEwMCkgJT4lDQogICAgIGFycmFuZ2UoUmVnaW9uLCBTbGVlcF9RdWFsaXR5KQ0KcHJpbnQoc2xlZXBfcXVhbGl0eV9wZXJjZW50YWdlcykNCmBgYA0KDQpgYGB7cn0NCmdncGxvdChzbGVlcF9xdWFsaXR5X3BlcmNlbnRhZ2VzLCBhZXMoeCA9IFJlZ2lvbiwgeSA9IFBlcmNlbnRhZ2UsIGZpbGwgPSBTbGVlcF9RdWFsaXR5KSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGxhYnModGl0bGUgPSAiUGVyY2VudGFnZSBvZiBTbGVlcCBRdWFsaXR5IFJhdGluZ3MgYnkgUmVnaW9uIiwNCiAgICAgICB4ID0gIlJlZ2lvbiIsDQogICAgICAgeSA9ICJQZXJjZW50YWdlIG9mIFNsZWVwIFF1YWxpdHkgUmF0aW5ncyIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQyIikNCmBgYA0KYGBge3J9DQpzdHJlc3NfbGV2ZWxfcGVyY2VudGFnZXMgPC0gSVJXTUggJT4lDQogICAgIGdyb3VwX2J5KFJlZ2lvbiwgU3RyZXNzX0xldmVsKSAlPiUNCiAgICAgc3VtbWFyaXNlKENvdW50ID0gbigpLCAuZ3JvdXBzID0gJ2Ryb3AnKSAlPiUNCiAgICAgbXV0YXRlKFBlcmNlbnRhZ2UgPSBDb3VudCAvIHN1bShDb3VudCkgKiAxMDApICU+JQ0KICAgICBhcnJhbmdlKFJlZ2lvbiwgU3RyZXNzX0xldmVsKQ0KcHJpbnQoc3RyZXNzX2xldmVsX3BlcmNlbnRhZ2VzKQ0KYGBgDQpgYGB7cn0NCmdncGxvdChzdHJlc3NfbGV2ZWxfcGVyY2VudGFnZXMsIGFlcyh4ID0gUmVnaW9uLCB5ID0gUGVyY2VudGFnZSwgZmlsbCA9IFN0cmVzc19MZXZlbCkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBsYWJzKHRpdGxlID0gIlBlcmNlbnRhZ2Ugb2YgU3RyZXNzIExldmVsIFJhdGluZ3MgYnkgUmVnaW9uIiwNCiAgICAgICB4ID0gIlJlZ2lvbiIsDQogICAgICAgeSA9ICJQZXJjZW50YWdlIG9mIFN0cmVzcyBMZXZlbCBSYXRpbmdzIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKQ0KYGBgDQpgYGB7cn0NCnN0cmVzc19sZXZlbF9wZXJjZW50YWdlcyA8LSBJUldNSCAlPiUNCiAgICAgZ3JvdXBfYnkoSm9iX1JvbGUsIFN0cmVzc19MZXZlbCkgJT4lDQogICAgIHN1bW1hcmlzZShDb3VudCA9IG4oKSwgLmdyb3VwcyA9ICdkcm9wJykgJT4lDQogICAgIG11dGF0ZShQZXJjZW50YWdlID0gQ291bnQgLyBzdW0oQ291bnQpICogMTAwKSAlPiUNCiAgICAgYXJyYW5nZShKb2JfUm9sZSwgU3RyZXNzX0xldmVsKQ0KcHJpbnQoc3RyZXNzX2xldmVsX3BlcmNlbnRhZ2VzKQ0KYGBgDQpgYGB7cn0NCmdncGxvdChzdHJlc3NfbGV2ZWxfcGVyY2VudGFnZXMsIGFlcyh4ID0gSm9iX1JvbGUsIHkgPSBQZXJjZW50YWdlLCBmaWxsID0gU3RyZXNzX0xldmVsKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGxhYnModGl0bGUgPSAiUGVyY2VudGFnZSBvZiBTdHJlc3MgTGV2ZWwgUmF0aW5ncyBieSBKb2IgUm9sZSIsDQogICAgICAgeCA9ICJKb2JfUm9sZSIsDQogICAgICAgeSA9ICJQZXJjZW50YWdlIG9mIFN0cmVzcyBMZXZlbCBSYXRpbmdzIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKQ0KYGBgDQpgYGB7cn0NCiMgRGVmaW5lIHRoZSBkYXRhDQp3b3JrX21vZGVzIDwtIGMoSHlicmlkID0gMTY0OSwgT25zaXRlID0gMTYzNywgUmVtb3RlID0gMTcxNCkNCg0KIyBDYWxjdWxhdGUgcGVyY2VudGFnZXMNCnBlcmNlbnRhZ2VzIDwtIHJvdW5kKCh3b3JrX21vZGVzIC8gc3VtKHdvcmtfbW9kZXMpKSAqIDEwMCwgMSkNCg0KIyBEZWZpbmUgbGFiZWxzIHdpdGggcGVyY2VudGFnZXMNCmxhYmVscyA8LSBwYXN0ZShuYW1lcyh3b3JrX21vZGVzKSwgIlxuIiwgcGVyY2VudGFnZXMsICIlIiwgc2VwID0gIiIpDQoNCiMgQ3JlYXRlIGEgcGllIGNoYXJ0IHdpdGggcGVyY2VudGFnZXMNCnBpZSh3b3JrX21vZGVzLCBsYWJlbHMgPSBsYWJlbHMsIA0KICAgIG1haW4gPSAiRGlzdHJpYnV0aW9uIG9mIFdvcmsgTW9kZXMiLA0KICAgIGNvbCA9IGMoInNreWJsdWUiLCAib3JhbmdlIiwgImdyZWVuIikpICAjIE9wdGlvbmFsOiBDdXN0b21pemUgY29sb3JzDQoNCg0KYGBgDQpgYGB7cn0NCiMgRGVmaW5lIHRoZSBkYXRhDQpleHBlcmllbmNlX2NvdW50cyA8LSBjKCIxLTEwIiA9IDE0NzMsICIxMS0yMCIgPSAxMzg2LCAiMjEtMzAiID0gMTQ4OCwgIjMxLTQwIiA9IDY1MykNCg0KIyBDYWxjdWxhdGUgcGVyY2VudGFnZXMNCnBlcmNlbnRhZ2VzIDwtIHJvdW5kKChleHBlcmllbmNlX2NvdW50cyAvIHN1bShleHBlcmllbmNlX2NvdW50cykpICogMTAwLCAxKQ0KDQojIERlZmluZSBsYWJlbHMgd2l0aCBwZXJjZW50YWdlcw0KbGFiZWxzIDwtIHBhc3RlKG5hbWVzKGV4cGVyaWVuY2VfY291bnRzKSwgIlxuIiwgcGVyY2VudGFnZXMsICIlIiwgc2VwID0gIiIpDQoNCiMgQ3JlYXRlIGEgcGllIGNoYXJ0IHdpdGggcGVyY2VudGFnZXMNCnBpZShleHBlcmllbmNlX2NvdW50cywgbGFiZWxzID0gbGFiZWxzLCANCiAgICBtYWluID0gIkRpc3RyaWJ1dGlvbiBvZiBFbXBsb3llZXMgYnkgSm9iIEV4cGVyaWVuY2UiLA0KICAgIGNvbCA9IGMoInNreWJsdWUiLCAib3JhbmdlIiwgImdyZWVuIiwgInB1cnBsZSIpKSAgIyBDdXN0b21pemUgY29sb3JzIGFzIGRlc2lyZWQNCg0KYGBgDQpgYGB7cn0NCndvcmtfbW9kZV9wZXJjZW50YWdlcyA8LSBJUldNSCAlPiUNCiAgICAgZ3JvdXBfYnkoSm9iX1JvbGUsIFdvcmtfTG9jYXRpb24pICU+JQ0KICAgICBzdW1tYXJpc2UoQ291bnQgPSBuKCksIC5ncm91cHMgPSAnZHJvcCcpICU+JQ0KICAgICBtdXRhdGUoUGVyY2VudGFnZSA9IENvdW50IC8gc3VtKENvdW50KSAqIDEwMCkgJT4lDQogICAgIGFycmFuZ2UoSm9iX1JvbGUsIFdvcmtfTG9jYXRpb24pDQpwcmludCh3b3JrX21vZGVfcGVyY2VudGFnZXMpDQpgYGANCmBgYHtyfQ0KZ2dwbG90KHdvcmtfbW9kZV9wZXJjZW50YWdlcywgYWVzKHggPSBKb2JfUm9sZSwgeSA9IFBlcmNlbnRhZ2UsIGZpbGwgPSBXb3JrX0xvY2F0aW9uKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGxhYnModGl0bGUgPSAiUGVyY2VudGFnZSBvZiBXb3JrIExvY2F0aW9uIFR5cGUgYnkgSm9iIFJvbGUiLA0KICAgICAgIHggPSAiSm9iX1JvbGUiLA0KICAgICAgIHkgPSAiUGVyY2VudGFnZSBvZiBMb2NhdGlvbiBUeXBlcyIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQyIikNCmBgYA0KYGBge3J9DQpzdHJlc3NfbGV2ZWxfcGVyY2VudGFnZXMgPC0gSVJXTUggJT4lDQogICAgIGdyb3VwX2J5KFdvcmtfTG9jYXRpb24sIFN0cmVzc19MZXZlbCkgJT4lDQogICAgIHN1bW1hcmlzZShDb3VudCA9IG4oKSwgLmdyb3VwcyA9ICdkcm9wJykgJT4lDQogICAgIG11dGF0ZShQZXJjZW50YWdlID0gQ291bnQgLyBzdW0oQ291bnQpICogMTAwKSAlPiUNCiAgICAgYXJyYW5nZShXb3JrX0xvY2F0aW9uLCBTdHJlc3NfTGV2ZWwpDQpwcmludChzdHJlc3NfbGV2ZWxfcGVyY2VudGFnZXMpDQpgYGANCmBgYHtyfQ0KZ2dwbG90KHN0cmVzc19sZXZlbF9wZXJjZW50YWdlcywgYWVzKHggPSBXb3JrX0xvY2F0aW9uLCB5ID0gUGVyY2VudGFnZSwgZmlsbCA9IFN0cmVzc19MZXZlbCkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBsYWJzKHRpdGxlID0gIlBlcmNlbnRhZ2Ugb2YgRGlmZmVyZW50IFN0cmVzcyBMZXZlbCBieSBXb3JrIExvY2F0aW9uIiwNCiAgICAgICB4ID0gIldvcmsgTG9jYXRpb24iLA0KICAgICAgIHkgPSAiUGVyY2VudGFnZSBvZiBTdHJlc3MgTGV2ZWwiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MiIpDQpgYGANCmBgYHtyfQ0KdmlydHVhbF9tZWV0aW5nc19zdW1tYXJ5IDwtIElSV01IICU+JQ0KICBncm91cF9ieShKb2JfUm9sZSkgJT4lDQogIHN1bW1hcmlzZShUb3RhbF9WaXJ0dWFsX01lZXRpbmdzID0gc3VtKE51bWJlcl9vZl9WaXJ0dWFsX01lZXRpbmdzLCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgYXJyYW5nZShkZXNjKFRvdGFsX1ZpcnR1YWxfTWVldGluZ3MpKQ0KcHJpbnQodmlydHVhbF9tZWV0aW5nc19zdW1tYXJ5KQ0KYGBgDQpgYGB7cn0NCm1lbnRhbF9oZWFsdGhfY29uZGl0aW9uX3BlcmNlbnRhZ2VzIDwtIElSV01IICU+JQ0KICAgICBncm91cF9ieShKb2JfUm9sZSwgTWVudGFsX0hlYWx0aF9Db25kaXRpb24pICU+JQ0KICAgICBzdW1tYXJpc2UoQ291bnQgPSBuKCksIC5ncm91cHMgPSAnZHJvcCcpICU+JQ0KICAgICBtdXRhdGUoUGVyY2VudGFnZSA9IENvdW50IC8gc3VtKENvdW50KSAqIDEwMCkgJT4lDQogICAgIGFycmFuZ2UoSm9iX1JvbGUsIE1lbnRhbF9IZWFsdGhfQ29uZGl0aW9uKQ0KcHJpbnQobWVudGFsX2hlYWx0aF9jb25kaXRpb25fcGVyY2VudGFnZXMpDQpgYGANCmBgYHtyfQ0KZ2dwbG90KG1lbnRhbF9oZWFsdGhfY29uZGl0aW9uX3BlcmNlbnRhZ2VzLCBhZXMoeCA9IEpvYl9Sb2xlLCB5ID0gUGVyY2VudGFnZSwgZmlsbCA9IE1lbnRhbF9IZWFsdGhfQ29uZGl0aW9uKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGxhYnModGl0bGUgPSAiUGVyY2VudGFnZSBvZiBEaWZmZXJlbnQgTWVudGFsIEhlYWx0aCBDb25kaXRpb24gYnkgSm9iIFJvbGUiLA0KICAgICAgIHggPSAiSm9iIFJvbGUiLA0KICAgICAgIHkgPSAiTWVudGFsIEhlYWx0aCBDb25kaXRpb24iKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MiIpDQpgYGANCmBgYHtyfQ0KbWVudGFsX2hlYWx0aF9jb25kaXRpb25fcGVyY2VudGFnZXMgPC0gSVJXTUggJT4lDQogICAgIGdyb3VwX2J5KEdlbmRlciwgTWVudGFsX0hlYWx0aF9Db25kaXRpb24pICU+JQ0KICAgICBzdW1tYXJpc2UoQ291bnQgPSBuKCksIC5ncm91cHMgPSAnZHJvcCcpICU+JQ0KICAgICBtdXRhdGUoUGVyY2VudGFnZSA9IENvdW50IC8gc3VtKENvdW50KSAqIDEwMCkgJT4lDQogICAgIGFycmFuZ2UoR2VuZGVyLCBNZW50YWxfSGVhbHRoX0NvbmRpdGlvbikNCnByaW50KG1lbnRhbF9oZWFsdGhfY29uZGl0aW9uX3BlcmNlbnRhZ2VzKQ0KYGBgDQpgYGB7cn0NCmdncGxvdChtZW50YWxfaGVhbHRoX2NvbmRpdGlvbl9wZXJjZW50YWdlcywgYWVzKHggPSBHZW5kZXIsIHkgPSBQZXJjZW50YWdlLCBmaWxsID0gTWVudGFsX0hlYWx0aF9Db25kaXRpb24pKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgbGFicyh0aXRsZSA9ICJQZXJjZW50YWdlIG9mIERpZmZlcmVudCBNZW50YWwgSGVhbHRoIENvbmRpdGlvbiBieSBHZW5kZXIiLA0KICAgICAgIHggPSAiR2VuZGVyIiwNCiAgICAgICB5ID0gIk1lbnRhbCBIZWFsdGggQ29uZGl0aW9uIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKQ0KYGBgDQpgYGB7cn0NCmpvYl9yb2xlX2J5X2dlbmRlcl9zdW1tYXJ5IDwtIElSV01IICU+JQ0KICAgICBncm91cF9ieShHZW5kZXIsIEpvYl9Sb2xlKSAlPiUNCiAgICAgc3VtbWFyaXNlKENvdW50ID0gbigpLCAuZ3JvdXBzID0gJ2Ryb3AnKSAlPiUNCiAgICAgYXJyYW5nZShHZW5kZXIsIEpvYl9Sb2xlKQ0KcHJpbnQoam9iX3JvbGVfYnlfZ2VuZGVyX3N1bW1hcnkpDQpgYGANCmBgYHtyfQ0KZ2dwbG90KGpvYl9yb2xlX2J5X2dlbmRlcl9zdW1tYXJ5LCBhZXMoeCA9IEdlbmRlciwgeSA9IENvdW50LCBmaWxsID0gSm9iX1JvbGUpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgbGFicyh0aXRsZSA9ICJOdW1iZXIgb2YgRGlmZmVyZW50IEpvYiBSb2xlcyBieSBHZW5kZXIiLA0KICAgICAgIHggPSAiR2VuZGVyIiwNCiAgICAgICB5ID0gIkpvYiBSb2xlIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKQ0KYGBgDQpgYGB7cn0NCnByb2R1Y3Rpdml0eV9jaGFuZ2VfcGVyY2VudGFnZXMgPC0gSVJXTUggJT4lDQogICAgIGdyb3VwX2J5KFN0cmVzc19MZXZlbCwgUHJvZHVjdGl2aXR5X0NoYW5nZSkgJT4lDQogICAgIHN1bW1hcmlzZShDb3VudCA9IG4oKSwgLmdyb3VwcyA9ICdkcm9wJykgJT4lDQogICAgIG11dGF0ZShQZXJjZW50YWdlID0gQ291bnQgLyBzdW0oQ291bnQpICogMTAwKSAlPiUNCiAgICAgYXJyYW5nZShTdHJlc3NfTGV2ZWwsIFByb2R1Y3Rpdml0eV9DaGFuZ2UpDQpwcmludChwcm9kdWN0aXZpdHlfY2hhbmdlX3BlcmNlbnRhZ2VzKQ0KYGBgDQpgYGB7cn0NCmdncGxvdChwcm9kdWN0aXZpdHlfY2hhbmdlX3BlcmNlbnRhZ2VzLCBhZXMoeCA9IFN0cmVzc19MZXZlbCwgeSA9IFBlcmNlbnRhZ2UsIGZpbGwgPSBQcm9kdWN0aXZpdHlfQ2hhbmdlKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGxhYnModGl0bGUgPSAiUHJvZHVjdGl2aXR5IENoYW5nZSBkdWUgdG8gU3RyZXNzIExldmVsIiwNCiAgICAgICB4ID0gIlN0cmVzcyBMZXZlbCIsDQogICAgICAgeSA9ICJQcm9kdWN0aXZpdHkgQ2hhbmdlIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKQ0KYGBgDQpgYGB7cn0NCnByb2R1Y3Rpdml0eV9jaGFuZ2VfcGVyY2VudGFnZXMgPC0gSVJXTUggJT4lDQogICAgIGdyb3VwX2J5KFNsZWVwX1F1YWxpdHksIFByb2R1Y3Rpdml0eV9DaGFuZ2UpICU+JQ0KICAgICBzdW1tYXJpc2UoQ291bnQgPSBuKCksIC5ncm91cHMgPSAnZHJvcCcpICU+JQ0KICAgICBtdXRhdGUoUGVyY2VudGFnZSA9IENvdW50IC8gc3VtKENvdW50KSAqIDEwMCkgJT4lDQogICAgIGFycmFuZ2UoU2xlZXBfUXVhbGl0eSwgUHJvZHVjdGl2aXR5X0NoYW5nZSkNCnByaW50KHByb2R1Y3Rpdml0eV9jaGFuZ2VfcGVyY2VudGFnZXMpDQpgYGANCmBgYHtyfQ0KZ2dwbG90KHByb2R1Y3Rpdml0eV9jaGFuZ2VfcGVyY2VudGFnZXMsIGFlcyh4ID0gU2xlZXBfUXVhbGl0eSwgeSA9IFBlcmNlbnRhZ2UsIGZpbGwgPSBQcm9kdWN0aXZpdHlfQ2hhbmdlKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGxhYnModGl0bGUgPSAiUHJvZHVjdGl2aXR5IENoYW5nZSBhY2NvcmRpbmcgdG8gU2xlZXAgUXVhbGl0eSIsDQogICAgICAgeCA9ICJTbGVlcCBRdWFsaXR5IiwNCiAgICAgICB5ID0gIlByb2R1Y3Rpdml0eSBDaGFuZ2UiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MiIpDQpgYGANCmBgYHtyfQ0KIyBDcmVhdGUgYSBjb250aW5nZW5jeSB0YWJsZQ0KY29udGluZ2VuY3lfdGFibGUgPC0gdGFibGUocHJvZHVjdGl2aXR5X2NoYW5nZV9wZXJjZW50YWdlcyRTbGVlcF9RdWFsaXR5LCBwcm9kdWN0aXZpdHlfY2hhbmdlX3BlcmNlbnRhZ2VzJFByb2R1Y3Rpdml0eV9DaGFuZ2UpDQoNCmZpc2hlcl90ZXN0IDwtIGZpc2hlci50ZXN0KGNvbnRpbmdlbmN5X3RhYmxlKQ0KIyBWaWV3IHRoZSByZXN1bHRzDQpwcmludChmaXNoZXJfdGVzdCkNCg0KYGBgDQpgYGB7cn0NCnNhdGlzZmFjdGlvbl93aXRoX3JlbW90ZV93b3JrX3BlcmNlbnRhZ2VzIDwtIElSV01IICU+JQ0KICAgICBncm91cF9ieShKb2JfUm9sZSwgU2F0aXNmYWN0aW9uX3dpdGhfUmVtb3RlX1dvcmspICU+JQ0KICAgICBzdW1tYXJpc2UoQ291bnQgPSBuKCksIC5ncm91cHMgPSAnZHJvcCcpICU+JQ0KICAgICBtdXRhdGUoUGVyY2VudGFnZSA9IENvdW50IC8gc3VtKENvdW50KSAqIDEwMCkgJT4lDQogICAgIGFycmFuZ2UoSm9iX1JvbGUsIFNhdGlzZmFjdGlvbl93aXRoX1JlbW90ZV9Xb3JrKQ0KcHJpbnQoc2F0aXNmYWN0aW9uX3dpdGhfcmVtb3RlX3dvcmtfcGVyY2VudGFnZXMpDQpgYGANCmBgYHtyfQ0KZ2dwbG90KHNhdGlzZmFjdGlvbl93aXRoX3JlbW90ZV93b3JrX3BlcmNlbnRhZ2VzLCBhZXMoeCA9IEpvYl9Sb2xlLCB5ID0gUGVyY2VudGFnZSwgZmlsbCA9IFNhdGlzZmFjdGlvbl93aXRoX1JlbW90ZV9Xb3JrKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGxhYnModGl0bGUgPSAiU2F0aXNmYWN0aW9uIHdpdGggUmVtb3RlIFdvcmsgYnkgSm9iIFJvbGUiLA0KICAgICAgIHggPSAiSm9iIFJvbGUiLA0KICAgICAgIHkgPSAiU2F0aXNmYWN0aW9uIExldmVsIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKQ0KYGBgDQpgYGB7cn0NCmdncGxvdChzYXRpc2ZhY3Rpb25fd2l0aF9yZW1vdGVfd29ya19wZXJjZW50YWdlcywgYWVzKHggPSBKb2JfUm9sZSwgeSA9IENvdW50LCBmaWxsID0gU2F0aXNmYWN0aW9uX3dpdGhfUmVtb3RlX1dvcmspKSArDQogIGdlb21fdmlvbGluKHRyaW0gPSBGQUxTRSkgKyAgIyBDcmVhdGVzIHRoZSB2aW9saW4gcGxvdA0KICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSwgYWxwaGEgPSAwLjUpICsgIyBBZGRzIGEgYm94cGxvdCBpbnNpZGUgdGhlIHZpb2xpbg0KICBsYWJzKA0KICAgIHRpdGxlID0gInNhdGlzZmFjdGlvbl93aXRoX3JlbW90ZV93b3JrIiwNCiAgICB4ID0gIkpvYiBSb2xlIiwNCiAgICB5ID0gIlNhdGlzZmFjdGlvbl93aXRoX1JlbW90ZV9Xb3JrIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkgKyAgIyBSb3RhdGVzIHgtYXhpcyBsYWJlbHMgZm9yIGJldHRlciByZWFkYWJpbGl0eQ0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDMiKQ0KDQpgYGANCmBgYHtyfQ0KIyBDcmVhdGUgYSBkYXRhIGZyYW1lIHdpdGggdGhlIHByb3ZpZGVkIGRhdGENCmRhdGEgPC0gZGF0YS5mcmFtZSgNCiAgUHJvZmVzc2lvbiA9IGMoIkRhdGEgU2NpZW50aXN0IiwgIkRlc2lnbmVyIiwgIkhSIiwgIk1hcmtldGluZyIsIA0KICAgICAgICAgICAgICAgICAiUHJvamVjdCBNYW5hZ2VyIiwgIlNhbGVzIiwgIlNvZnR3YXJlIEVuZ2luZWVyIiksDQogIEF2Z19Ib3Vyc19Xb3JrZWQgPSBjKDM4Ljk1NDAyLCAzOC44ODEwNSwgMzkuNjYwNjEsIDM5LjczNDk5LCANCiAgICAgICAgICAgICAgICAgICAgICAgMzkuOTIyNzYsIDM5Ljg2MDg1LCA0MC4yNzE0NSksDQogIFdvcmtfTGlmZV9CYWxhbmNlX1JhdGluZyA9IGMoMy4wMDcxODQsIDIuOTY2ODA1LCAyLjkzMDE2OCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi45NDU4MjcsIDIuOTYwNzA1LCAzLjA0MzY1NiwgMy4wMzM3NTUpDQopDQoNCiMgQ2FsY3VsYXRlIHRoZSBQZWFyc29uIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50IGJldHdlZW4gQXZnX0hvdXJzX1dvcmtlZCBhbmQgV29ya19MaWZlX0JhbGFuY2VfUmF0aW5nDQpjb3JyZWxhdGlvbiA8LSBjb3IoZGF0YSRBdmdfSG91cnNfV29ya2VkLCBkYXRhJFdvcmtfTGlmZV9CYWxhbmNlX1JhdGluZykNCnByaW50KHBhc3RlKCJDb3JyZWxhdGlvbiBjb2VmZmljaWVudCBiZXR3ZWVuIGF2ZXJhZ2UgaG91cnMgd29ya2VkIGFuZCB3b3JrLWxpZmUgYmFsYW5jZSByYXRpbmc6Iiwgcm91bmQoY29ycmVsYXRpb24sIDQpKSkNCg0KIyBPcHRpb25hbDogVmlzdWFsaXplIHRoZSByZWxhdGlvbnNoaXAgd2l0aCBhIHNjYXR0ZXIgcGxvdA0KZ2dwbG90KGRhdGEsIGFlcyh4ID0gQXZnX0hvdXJzX1dvcmtlZCwgeSA9IFdvcmtfTGlmZV9CYWxhbmNlX1JhdGluZywgbGFiZWwgPSBQcm9mZXNzaW9uKSkgKw0KICBnZW9tX3BvaW50KHNpemUgPSAzLCBjb2xvciA9ICJibHVlIikgKw0KICBnZW9tX3RleHQodmp1c3QgPSAtMC41LCBoanVzdCA9IDAuNSkgKyAgIyBBZGRzIHByb2Zlc3Npb24gbGFiZWxzIG5lYXIgcG9pbnRzDQogIGxhYnMoDQogICAgdGl0bGUgPSAiUmVsYXRpb25zaGlwIEJldHdlZW4gQXZlcmFnZSBIb3VycyBXb3JrZWQgYW5kIFdvcmstTGlmZSBCYWxhbmNlIFJhdGluZyIsDQogICAgeCA9ICJBdmVyYWdlIEhvdXJzIFdvcmtlZCIsDQogICAgeSA9ICJXb3JrLUxpZmUgQmFsYW5jZSBSYXRpbmciDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KYGBge3J9DQpqb2Jfcm9sZV9ieV9pbmR1c3RyeV9zdW1tYXJ5IDwtIElSV01IICU+JQ0KICAgICBncm91cF9ieShJbmR1c3RyeSwgSm9iX1JvbGUpICU+JQ0KICAgICBzdW1tYXJpc2UoQ291bnQgPSBuKCksIC5ncm91cHMgPSAnZHJvcCcpICU+JQ0KICAgICBhcnJhbmdlKEluZHVzdHJ5LCBKb2JfUm9sZSkNCnByaW50KGpvYl9yb2xlX2J5X2luZHVzdHJ5X3N1bW1hcnkpDQpgYGANCmBgYHtyfQ0KZ2dwbG90KGpvYl9yb2xlX2J5X2luZHVzdHJ5X3N1bW1hcnksIGFlcyh4ID0gSW5kdXN0cnksIHkgPSBDb3VudCwgZmlsbCA9IEpvYl9Sb2xlKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGxhYnModGl0bGUgPSAiTnVtYmVyIG9mIERpZmZlcmVudCBKb2IgUm9sZXMgYnkgSW5kdXN0cnkiLA0KICAgICAgIHggPSAiSW5kdXN0cnkiLA0KICAgICAgIHkgPSAiSm9iIFJvbGUiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MiIpDQpgYGANCmBgYHtyfQ0KYWNtaF9ieV9pbmR1c3RyeV9zdW1tYXJ5IDwtIElSV01IICU+JQ0KICAgICBncm91cF9ieShJbmR1c3RyeSwgQWNjZXNzX3RvX01lbnRhbF9IZWFsdGhfUmVzb3VyY2VzKSAlPiUNCiAgICAgc3VtbWFyaXNlKENvdW50ID0gbigpLCAuZ3JvdXBzID0gJ2Ryb3AnKSAlPiUNCiAgICAgYXJyYW5nZShJbmR1c3RyeSwgQWNjZXNzX3RvX01lbnRhbF9IZWFsdGhfUmVzb3VyY2VzKQ0KcHJpbnQoYWNtaF9ieV9pbmR1c3RyeV9zdW1tYXJ5KQ0KYGBgDQoNCmBgYHtyfQ0KZ2dwbG90KGFjbWhfYnlfaW5kdXN0cnlfc3VtbWFyeSwgYWVzKHggPSBJbmR1c3RyeSwgeSA9IENvdW50LCBmaWxsID0gQWNjZXNzX3RvX01lbnRhbF9IZWFsdGhfUmVzb3VyY2VzKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGxhYnModGl0bGUgPSAiQWNjZXNzIHRvIE1lbnRhbCBIZWFsdGggYnkgSW5kdXN0cnkiLA0KICAgICAgIHggPSAiSW5kdXN0cnkiLA0KICAgICAgIHkgPSAiQWNjZXNzIHRvIE1lbnRhbCBIZWFsdGgiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MiIpDQpgYGANCmBgYHtyfQ0KZ2dwbG90KElSV01ILCBhZXMoeCA9IEpvYl9Sb2xlLCB5ID0gQWdlLCBmaWxsID0gSm9iX1JvbGUpKSArDQogIGdlb21fdmlvbGluKHRyaW0gPSBGQUxTRSkgKyAgIyBDcmVhdGVzIHRoZSB2aW9saW4gcGxvdA0KICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIG91dGxpZXIuc2hhcGUgPSBOQSwgYWxwaGEgPSAwLjUpICsgIyBBZGRzIGEgYm94cGxvdCBpbnNpZGUgdGhlIHZpb2xpbg0KICBsYWJzKA0KICAgIHRpdGxlID0gIkFnZSBEaXN0cmlidXRpb24gYnkgSm9iIFJvbGUiLA0KICAgIHggPSAiSm9iIFJvbGUiLA0KICAgIHkgPSAiQWdlIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkgKyAgIyBSb3RhdGVzIHgtYXhpcyBsYWJlbHMgZm9yIGJldHRlciByZWFkYWJpbGl0eQ0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDMiKSAgIyBPcHRpb25hbDogY3VzdG9taXplIHRoZSBjb2xvciBwYWxldHRlDQpgYGANCmBgYHtyfQ0KYXZlcmFnZV9hZ2VfYnlfam9iIDwtIElSV01IICU+JQ0KICBncm91cF9ieShKb2JfUm9sZSkgJT4lDQogIHN1bW1hcmlzZShBdmVyYWdlX0FnZSA9IG1lYW4oQWdlLCBuYS5ybSA9IFRSVUUpKSAgIyBDYWxjdWxhdGUgdGhlIG1lYW4gYWdlDQoNCiMgRGlzcGxheSB0aGUgcmVzdWx0cw0KcHJpbnQoYXZlcmFnZV9hZ2VfYnlfam9iKQ0KYGBgDQpgYGB7cn0NCmdncGxvdChJUldNSCwgYWVzKHggPSBKb2JfUm9sZSwgeSA9IFllYXJzX29mX0V4cGVyaWVuY2UsIGZpbGwgPSBKb2JfUm9sZSkpICsNCiAgZ2VvbV92aW9saW4odHJpbSA9IEZBTFNFKSArICAjIENyZWF0ZXMgdGhlIHZpb2xpbiBwbG90DQogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgb3V0bGllci5zaGFwZSA9IE5BLCBhbHBoYSA9IDAuNSkgKyAjIEFkZHMgYSBib3hwbG90IGluc2lkZSB0aGUgdmlvbGluDQogIGxhYnMoDQogICAgdGl0bGUgPSAiRXhwZXJpZW5jZSBEaXN0cmlidXRpb24gYnkgSm9iIFJvbGUiLA0KICAgIHggPSAiSm9iIFJvbGUiLA0KICAgIHkgPSAiWWVhcnMgb2YgRXhwZXJpZW5jZSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpICsgICMgUm90YXRlcyB4LWF4aXMgbGFiZWxzIGZvciBiZXR0ZXIgcmVhZGFiaWxpdHkNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQzIikgICMgT3B0aW9uYWw6IGN1c3RvbWl6ZSB0aGUgY29sb3IgcGFsZXR0ZQ0KYGBgDQpgYGB7cn0NCklSV01IJFN0cmVzc19MZXZlbCA8LSBmYWN0b3IoSVJXTUgkU3RyZXNzX0xldmVsLCBvcmRlcmVkID0gVFJVRSwgbGV2ZWxzID0gYygiTG93IiwgIk1lZGl1bSIsICJIaWdoIikpDQoNCiMgUmVtb3ZlIHJvd3Mgd2l0aCBtaXNzaW5nIHZhbHVlcw0KZGF0YV9jbGVhbiA8LSBJUldNSCAlPiUNCiAgZmlsdGVyKCFpcy5uYShTdHJlc3NfTGV2ZWwpLCAhaXMubmEoSG91cnNfV29ya2VkX1Blcl9XZWVrKSkNCg0KIyBQZXJmb3JtIG9yZGluYWwgbG9naXN0aWMgcmVncmVzc2lvbg0KbW9kZWxfc3RyZXNzX29yZGluYWwgPC0gcG9scihTdHJlc3NfTGV2ZWwgfiBIb3Vyc19Xb3JrZWRfUGVyX1dlZWssIGRhdGEgPSBkYXRhX2NsZWFuLCBtZXRob2QgPSAibG9naXN0aWMiKQ0KDQojIFZpZXcgdGhlIHN1bW1hcnkgb2YgdGhlIG1vZGVsDQpzdW1tYXJ5KG1vZGVsX3N0cmVzc19vcmRpbmFsKQ0KDQpgYGANCmBgYHtyfQ0KDQpJUldNSCA8LSByZWFkLmNzdigiRDovUiBjb3Vyc2UvUHJhY3RpY2luZy9NZW50YWwgaGVhbHRoIHZzIHJlbW90ZSB3b3JrL0lSV01ILmNzdiIpDQoNCmBgYA0KDQpgYGB7cn0NCm1vZGVsIDwtIGxtKE51bWJlcl9vZl9WaXJ0dWFsX01lZXRpbmdzIH4gSG91cnNfV29ya2VkX1Blcl9XZWVrLCBkYXRhID0gSVJXTUgpDQoNCiMgQ2hlY2sgdGhlIG1vZGVsIHN1bW1hcnkNCnN1bW1hcnkobW9kZWwpDQoNCiMgUGxvdCB3aXRoIHJlZ3Jlc3Npb24gbGluZQ0KcGxvdChJUldNSCRIb3Vyc19Xb3JrZWRfUGVyX1dlZWssIElSV01IJE51bWJlcl9vZl9WaXJ0dWFsX01lZXRpbmdzLA0KICAgICBtYWluID0gIlJlZ3Jlc3Npb24gQW5hbHlzaXMiLA0KICAgICB4bGFiID0gIkhvdXJzIFdvcmtlZCBQZXIgV2VlayIsDQogICAgIHlsYWIgPSAiTnVtYmVyIG9mIFZpcnR1YWwgTWVldGluZ3MiLA0KICAgICBwY2ggPSAxOSwgY29sID0gImJsdWUiKQ0KYWJsaW5lKG1vZGVsLCBjb2wgPSAicmVkIiwgbHdkID0gMikNCg0KIyBBZGQgdGhlIHJlZ3Jlc3Npb24gbGluZQ0KYWJsaW5lKG1vZGVsLCBjb2wgPSAicmVkIiwgbHdkID0gMikNCg0KYGBgDQpgYGB7cn0NCnN0cmVzc19sZXZlbF9ieV93b3JrX2xvY2F0aW9uX3N1bW1hcnkgPC0gSVJXTUggJT4lDQogICAgIGdyb3VwX2J5KFdvcmtfTG9jYXRpb24sIFN0cmVzc19MZXZlbCkgJT4lDQogICAgIHN1bW1hcmlzZShDb3VudCA9IG4oKSwgLmdyb3VwcyA9ICdkcm9wJykgJT4lDQogICAgIGFycmFuZ2UoV29ya19Mb2NhdGlvbiwgU3RyZXNzX0xldmVsKQ0KcHJpbnQoc3RyZXNzX2xldmVsX2J5X3dvcmtfbG9jYXRpb25fc3VtbWFyeSkNCmBgYA0KYGBge3J9DQpnZ3Bsb3Qoc3RyZXNzX2xldmVsX2J5X3dvcmtfbG9jYXRpb25fc3VtbWFyeSwgYWVzKHggPSBXb3JrX0xvY2F0aW9uLCB5ID0gQ291bnQsIGZpbGwgPSBTdHJlc3NfTGV2ZWwpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgbGFicyh0aXRsZSA9ICJTdHJlc3MgTGV2ZWwgYnkgSm9iIExvY2F0aW9uIiwNCiAgICAgICB4ID0gIldvcmsgTG9jYXRpb24iLA0KICAgICAgIHkgPSAiU3RyZXNzIExldmVsIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKQ0KYGBgDQpgYGB7cn0NCmNzX2J5X2luZHVzdHJ5X3N1bW1hcnkgPC0gSVJXTUggJT4lDQogICAgIGdyb3VwX2J5KEluZHVzdHJ5LCBDb21wYW55X1N1cHBvcnRfZm9yX1JlbW90ZV9Xb3JrKSAlPiUNCiAgICAgc3VtbWFyaXNlKENvdW50ID0gbigpLCAuZ3JvdXBzID0gJ2Ryb3AnKSAlPiUNCiAgICAgYXJyYW5nZShJbmR1c3RyeSwgQ29tcGFueV9TdXBwb3J0X2Zvcl9SZW1vdGVfV29yaykNCnByaW50KGNzX2J5X2luZHVzdHJ5X3N1bW1hcnkpDQpgYGANCmBgYHtyfQ0KYXZlcmFnZV9jc19ieV9pbmR1c3RyeSA8LSBJUldNSCAlPiUNCiAgZ3JvdXBfYnkoSW5kdXN0cnkpICU+JQ0KICBzdW1tYXJpc2UoQXZlcmFnZV9DUyA9IG1lYW4oQ29tcGFueV9TdXBwb3J0X2Zvcl9SZW1vdGVfV29yaywgbmEucm0gPSBUUlVFKSkgIA0KDQojIERpc3BsYXkgdGhlIHJlc3VsdHMNCnByaW50KGF2ZXJhZ2VfY3NfYnlfaW5kdXN0cnkpDQpgYGANCmBgYHtyfQ0KZ2dwbG90KElSV01ILCBhZXMoeCA9IEluZHVzdHJ5LCB5ID0gQ29tcGFueV9TdXBwb3J0X2Zvcl9SZW1vdGVfV29yaywgZmlsbCA9IEluZHVzdHJ5KSkgKw0KICBnZW9tX3Zpb2xpbih0cmltID0gRkFMU0UpICsgICMgQ3JlYXRlcyB0aGUgdmlvbGluIHBsb3QNCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBvdXRsaWVyLnNoYXBlID0gTkEsIGFscGhhID0gMC41KSArICMgQWRkcyBhIGJveHBsb3QgaW5zaWRlIHRoZSB2aW9saW4NCiAgbGFicygNCiAgICB0aXRsZSA9ICJDb21wYW55IFN1cHBvcnQgZm9yIFJlbW90ZSBXb3JrIGJ5IEluZHVzdHJ5IiwNCiAgICB4ID0gIkluZHVzdHJ5IiwNCiAgICB5ID0gIkNvbXBhbnkgU3VwcG9ydCBSYXRpbmciDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKSArICAjIFJvdGF0ZXMgeC1heGlzIGxhYmVscyBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5DQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MyIpDQpgYGANCmBgYHtyfQ0KYXZlcmFnZV9jc3JfYnlfcmVnaW9uIDwtIElSV01IICU+JQ0KICBncm91cF9ieShSZWdpb24pICU+JQ0KICBzdW1tYXJpc2UoQXZlcmFnZV9DU1IgPSBtZWFuKENvbXBhbnlfU3VwcG9ydF9mb3JfUmVtb3RlX1dvcmssIG5hLnJtID0gVFJVRSkpICANCg0KIyBEaXNwbGF5IHRoZSByZXN1bHRzDQpwcmludChhdmVyYWdlX2Nzcl9ieV9yZWdpb24pDQpgYGANCmBgYHtyfQ0KYXZlcmFnZV9zaXJfYnlfcmVnaW9uIDwtIElSV01IICU+JQ0KICBncm91cF9ieShSZWdpb24pICU+JQ0KICBzdW1tYXJpc2UoQXZlcmFnZV9TSVIgPSBtZWFuKFNvY2lhbF9Jc29sYXRpb25fUmF0aW5nLCBuYS5ybSA9IFRSVUUpKSAgDQoNCiMgRGlzcGxheSB0aGUgcmVzdWx0cw0KcHJpbnQoYXZlcmFnZV9zaXJfYnlfcmVnaW9uKQ0KYGBgDQpgYGB7cn0NCiMgRGF0YTogQXZlcmFnZSBDb21wYW55IFN1cHBvcnQgUmF0aW5nIGJ5IFJlZ2lvbg0KY29tcGFueV9zdXBwb3J0IDwtIGMoMy4wMTA0NjUsIDIuOTY1MDE4LCAyLjk2NDI4NiwgMy4wMzczMjMsIDMuMDU1MzYzLCAzLjAxNDUxMCkNCg0KIyBEYXRhOiBBdmVyYWdlIFNvY2lhbCBJc29sYXRpb24gUmF0aW5nIGJ5IFJlZ2lvbg0Kc29jaWFsX2lzb2xhdGlvbiA8LSBjKDIuOTg3MjA5LCAyLjk4MDcwMCwgMi45MzY5MDUsIDMuMDExNTgzLCAzLjA2NTc0NCwgMi45Nzk0NDQpDQoNCiMgRGF0YTogUmVnaW9uIE5hbWVzDQpyZWdpb25zIDwtIGMoIkFmcmljYSIsICJBc2lhIiwgIkV1cm9wZSIsICJOb3J0aCBBbWVyaWNhIiwgIk9jZWFuaWEiLCAiU291dGggQW1lcmljYSIpDQoNCiMgQ3JlYXRlIGEgZGF0YSBmcmFtZQ0KZGF0YSA8LSBkYXRhLmZyYW1lKFJlZ2lvbiA9IHJlZ2lvbnMsIENvbXBhbnlfU3VwcG9ydCA9IGNvbXBhbnlfc3VwcG9ydCwgU29jaWFsX0lzb2xhdGlvbiA9IHNvY2lhbF9pc29sYXRpb24pDQojIFBlcmZvcm0gbGluZWFyIHJlZ3Jlc3Npb24NCm1vZGVsIDwtIGxtKFNvY2lhbF9Jc29sYXRpb24gfiBDb21wYW55X1N1cHBvcnQsIGRhdGEgPSBkYXRhKQ0KDQojIFN1bW1hcnkgb2YgdGhlIHJlZ3Jlc3Npb24gbW9kZWwNCnN1bW1hcnkobW9kZWwpDQpgYGANCmBgYHtyfQ0KIyBQbG90dGluZyB0aGUgZGF0YSBwb2ludHMNCnBsb3QoZGF0YSRDb21wYW55X1N1cHBvcnQsIGRhdGEkU29jaWFsX0lzb2xhdGlvbiwgDQogICAgIG1haW4gPSAiUmVncmVzc2lvbiBvZiBTb2NpYWwgSXNvbGF0aW9uIG9uIENvbXBhbnkgU3VwcG9ydCIsDQogICAgIHhsYWIgPSAiQXZlcmFnZSBDb21wYW55IFN1cHBvcnQgUmF0aW5nIiwgDQogICAgIHlsYWIgPSAiQXZlcmFnZSBTb2NpYWwgSXNvbGF0aW9uIFJhdGluZyIsIA0KICAgICBwY2ggPSAxOSwgY29sID0gImJsdWUiKQ0KDQojIEFkZCByZWdyZXNzaW9uIGxpbmUNCmFibGluZShtb2RlbCwgY29sID0gInJlZCIsIGx3ZCA9IDIpDQpgYGANCg0K