Practical Data Operations in R: Sorting, Grouping, and Assignment

Summary of Task

Write an R script to perform a practical student project distribution task.

Objectives

  1. Read Student Data from Excel
    • The dataset includes:
      • Student names
      • Exam roll numbers
      • CGPA
  2. Sort Students by CGPA (Descending Order)
    • Students are ranked from highest to lowest academic performance.
  3. Assign Students to Sequential Groups
    • Students are divided into groups where each group size equals the number of teachers (e.g., 23).
    • The final group may contain fewer students if the total number is not divisible by the number of teachers.
  4. Randomly Assign Teachers to Each Student
    • For full-size groups:
      • Each student is randomly assigned a unique teacher.
    • For the last (smaller) group:
      • Only the first m teachers (m < total number of teachers) are considered.
      • Teacher assignments are randomized within this subset.
  5. Create an Output-Ready Dataset
    • The final data frame includes:
      • Student information
      • Merit position (implicitly defined by CGPA sorting)
      • Group number
      • Assigned teacher
  6. Write Output to Excel
    • Export the final project distribution dataset to an Excel file.

Student–Teacher Assignment Flow

             ┌───────────────────────────────┐
             │   12 Students                 │
             │   Sorted by CGPA (High → Low) │
             └───────────────────────────────┘
                               │
                               ▼
             ┌───────────────────────────────┐
             │   Divide into 4 Groups        │
             │   (Each group size = 3)       │
             └───────────────────────────────┘
                               │
                               ▼
    ┌──────────────────┬──────────────────┬──────────────────┬───────────────────┐
    │     Group 1      │     Group 2      │     Group 3      │     Group 4       │
    │   Top 3 Students │  Next 3 Students │  Next 3 Students │ Bottom 3 Students │
    └──────────────────┴──────────────────┴──────────────────┴───────────────────┘
                               │
                               ▼
             ┌───────────────────────────────┐
             │     FOR EACH GROUP            │
             │                               │
             │  • Take 3 students            │
             │  • Shuffle teachers A, B, C   │
             │  • Assign sequentially:       │
             │      Student 1 → Teacher 1    │
             │      Student 2 → Teacher 2    │
             │      Student 3 → Teacher 3    │
             └───────────────────────────────┘
                               │
                               ▼
             ┌───────────────────────────────┐
             │        FINAL RESULT           │
             └───────────────────────────────┘
                               │
                               ▼
    ┌──────────────────┬──────────────────┬──────────────────┐
    │    Teacher A     │    Teacher B     │    Teacher C     │
    │ 1 Top + 1 Good   │ 1 Top + 1 Good   │ 1 Top + 1 Good   │
    │ +1 Avg +1 Weak   │ +1 Avg +1 Weak   │ +1 Avg +1 Weak   │
    └──────────────────┴──────────────────┴──────────────────┘
require(readxl)
library(writexl)
project.df<-read_excel("C:\\Users\\Dell\\OneDrive\\Desktop\\STATISTICS\\2nd Year\\R programming\\varsity\\Project_Distribution_Data.xlsx")

# View data structure
str(project.df)
head(project.df)

Step 1: Sort Data in descending order of CGPA

sorted_df <- project.df[order(project.df$CGPA, decreasing = TRUE), ]
sorted_df

Step 2: Vector of teacher initials (suppose we have currently 23 techers in active service)

teachers <- LETTERS[1:23]
teachers

Step 3: Assign students to groups sequentially, starting from 1, 2, 3… and repeating, based on the number of teachers

n_stu <- nrow(sorted_df)
n_tea <- length(teachers)
n_groups <- ceiling(n_stu / n_tea)
sorted_df$Group <- rep(1:n_groups, each = n_tea, length.out = n_stu)
sorted_df

Step 4: block-wise random assignment of teachers!

set.seed(209)
sorted_df$AssignedT <- NA
groups <- unique(sorted_df$Group)    # Get all unique group numbers


for (g in groups) {
  # Find indices of students in this group
  idx <- which(Group == g)
  n_stu_group <- length(idx)
  
  # Randomly assign teachers to these students
  # Since teachers repeat across groups, we can sample all teachers
  sorted_df$AssignedT[idx] <- sample(teachers)[1:n_stu_group]
}
  

Step 5: Check Results

head(sorted_df, 20)

# Check distribution
table(sorted_df$AssignedT)

# Verify no teacher gets too many students
teacher_counts <- table(sorted_df$AssignedT)
summary(as.numeric(teacher_counts))

Step 6: Save/ Write df to an Excel file

write_xlsx(sorted_df, "Assigned_Projects.xlsx")

R Data Analysis Project: Student Performance Dataset

Project Overview

You are given a dataset containing student information including Exam Roll numbers, Sex, CGPA, Group assignment, and Assigned Teacher. Your task is to prepare this data for analysis and perform a comprehensive statistical investigation using R.


Part 1: Data Preparation & Variable Type Conversion

Instructions

Before conducting any analysis, you must properly convert variable types in R. Explain your reasoning for each conversion in your code comments.

Variables to Convert

  1. ExamRoll
    • Currently: numeric
    • Convert to: character (or factor)
    • Reason: Exam roll numbers are identifiers, not numeric quantities for mathematical operations. Keeping them numeric could cause unintended statistical operations.
  2. Sex
    • Currently: character
    • Convert to: factor
    • Reason: This is a categorical variable with fixed levels (e.g., “M”, “F”).
  3. CGPA
    • Currently: numeric
    • Keep as: numeric
    • Reason: Continuous quantitative variable suitable for mathematical operations.
  4. Group
    • Currently: numeric
    • Convert to: factor
    • Reason: Represents class/section categories (1, 2, 3…), not measurable quantities.
  5. AssignedTeacher
    • Currently: character
    • Convert to: factor
    • Reason: Teacher names or initials represent categorical groups.

Part 2: Statistical Analysis

A. Descriptive Statistics

Perform the following analyses and report your findings:

  1. Univariate Statistics for CGPA
    • Mean
    • Median
    • Standard deviation
  2. Frequency Distributions
    • Sex
    • Group
    • AssignedTeacher
  3. Group Comparisons
    • CGPA by Sex (mean, SD, count)
    • CGPA by Group (mean, SD, count)

B. Data Visualization

Create the following plots with appropriate titles and labels:

  1. Distribution Plots
    • Histogram of CGPA
    • Density plot of CGPA
  2. Categorical Data Plots
    • Bar plot of Sex
    • Bar plot of Group
    • Bar plot of AssignedTeacher
  3. Comparative Plots
    • Boxplot of CGPA by Sex
    • Boxplot of CGPA by Group

C. Inferential Statistics

Perform the following hypothesis tests and interpret the results:

  1. Mean Comparisons
    • Independent samples t-test: CGPA by Sex
    • One-way ANOVA: CGPA by Group
    • One-way ANOVA: CGPA by AssignedTeacher
  2. Association Tests
    • Chi-square test: Sex vs Group
    • Chi-square test: Sex vs AssignedTeacher

D. Regression Analysis

  1. Simple Linear Regression
    • Model 1: CGPA ~ Sex
    • Model 2: CGPA ~ Group
  2. Multiple Regression
    • Full model: CGPA ~ Sex + Group + AssignedTeacher

Part 3: Diagnostic Checks & Assumptions

A. Outlier Detection

  • Detect outliers in CGPA using the IQR rule
  • Visualize outliers using boxplots

B. Regression Diagnostics

For the multiple regression model (CGPA ~ Sex + Group + AssignedTeacher), check:

  1. Linearity
    • Residuals vs Fitted plot
  2. Normality
    • Q–Q plot of residuals
    • Shapiro–Wilk test on residuals
  3. Homoscedasticity
    • Scale–Location plot
  4. Independence
    • Durbin–Watson test (if appropriate)
  5. Multicollinearity
    • Variance Inflation Factor (VIF)

Part 4: Submission Requirements

What to Submit

  1. R Script
    • Contains all code with clear and meaningful comments
  2. Report (R Markdown / Word / PDF)
    • Introduction and objectives
    • Data preparation summary
    • Key findings from each analysis
    • Interpretation of statistical results
    • Visualizations with captions
    • Conclusions and limitations

Code Organization

Your R script should follow this structure:

Code Organization Structure

Part 1: Data Preparation

  • Variable type conversion
  • Data cleaning (if required)

Part 2A: Descriptive Statistics

  • Summary statistics for CGPA
  • Frequency tables for categorical variables
  • Group-wise summaries

Part 2B: Data Visualization

  • Distribution plots (histogram, density plot)
  • Bar plots for categorical variables
  • Boxplots for group comparisons

Remaining Sections

  • Inferential statistics
  • Regression analysis
  • Diagnostic checks and assumption testing

Note: Each section in the R script should be clearly separated using comments and written in a logical, sequential manner for readability and grading.

Student Performance Analysis – Workflow Flowchart

             ┌───────────────────────────────────────────┐
             │            START PROJECT                  │
             │   Student Performance Dataset in R        │
             └───────────────────────────────────────────┘
                               │
                               ▼
             ┌───────────────────────────────────────────┐
             │            LOAD PACKAGES                  │
             │     readxl, dplyr                         │
             └───────────────────────────────────────────┘
                               │
                               ▼
             ┌───────────────────────────────────────────┐
             │              READ DATA                    │
             │  Import Excel Student Dataset             │
             └───────────────────────────────────────────┘
                               │
                               ▼
    ┌────────────────────────────────────────────────────────┐
    │              PART 1: DATA PREPARATION                  │
    └────────────────────────────────────────────────────────┘
                               │
                               ▼
    ┌────────────────────────────────────────────────────────┐
    │ Convert Variable Types                                 │
    │                                                        │
    │ ExamRoll         → character (identifier)              │
    │ Sex              → factor (categorical)                │
    │ CGPA             → numeric (continuous)                │
    │ Group            → factor (category)                   │
    │ AssignedTeacher  → factor (category)                   │
    └────────────────────────────────────────────────────────┘
                               │
                               ▼
             ┌───────────────────────────────────────────┐
             │          VERIFY STRUCTURE                 │
             │               str(data)                   │
             └───────────────────────────────────────────┘
                               │
                               ▼
    ┌────────────────────────────────────────────────────────┐
    │        PART 2A: DESCRIPTIVE STATISTICS                 │
    └────────────────────────────────────────────────────────┘
                               │
                               ▼
    ┌────────────────────────────────────────────────────────┐
    │ Univariate Statistics (CGPA)                           │
    │ Mean • Median • Standard Deviation                     │
    └────────────────────────────────────────────────────────┘
                               │
                               ▼
    ┌────────────────────────────────────────────────────────┐
    │ Frequency Distributions                                │
    │ Sex • Group • AssignedTeacher                          │
    └────────────────────────────────────────────────────────┘
                               │
                               ▼
    ┌────────────────────────────────────────────────────────┐
    │ Group-wise CGPA Comparison                             │
    │ CGPA by Sex  (Mean, SD, Count)                         │
    │ CGPA by Group (Mean, SD, Count)                        │
    └────────────────────────────────────────────────────────┘
                               │
                               ▼
    ┌────────────────────────────────────────────────────────┐
    │        PART 2B: DATA VISUALIZATION                     │
    └────────────────────────────────────────────────────────┘
                               │
                               ▼
    ┌────────────────────────────────────────────────────────┐
    │ Distribution Plots                                     │
    │ Histogram of CGPA                                      │
    │ Density Plot of CGPA                                   │
    └────────────────────────────────────────────────────────┘
                               │
                               ▼
    ┌────────────────────────────────────────────────────────┐
    │ Categorical Bar Plots                                  │
    │ Sex • Group • AssignedTeacher                          │
    └────────────────────────────────────────────────────────┘
                               │
                               ▼
    ┌────────────────────────────────────────────────────────┐
    │ Comparative Boxplots                                   │
    │ CGPA by Sex                                            │
    │ CGPA by Group                                          │
    └────────────────────────────────────────────────────────┘
                               │
                               ▼
    ┌────────────────────────────────────────────────────────┐
    │        PART 2C: INFERENTIAL STATISTICS                 │
    └────────────────────────────────────────────────────────┘
                               │
                               ▼
    ┌────────────────────────────────────────────────────────┐
    │ Mean Comparison Tests                                  │
    │ t-test      : CGPA ~ Sex                               │
    │ ANOVA       : CGPA ~ Group                             │
    │ ANOVA       : CGPA ~ AssignedTeacher                   │
    └────────────────────────────────────────────────────────┘
                               │
                               ▼
    ┌────────────────────────────────────────────────────────┐
    │ Association Tests                                      │
    │ Chi-square: Sex vs Group                               │
    │ Chi-square: Sex vs AssignedTeacher                     │
    └────────────────────────────────────────────────────────┘
                               │
                               ▼
    ┌────────────────────────────────────────────────────────┐
    │        PART 2D: REGRESSION ANALYSIS                    │
    └────────────────────────────────────────────────────────┘
                               │
                               ▼
    ┌────────────────────────────────────────────────────────┐
    │ Simple Regression Models                               │
    │ CGPA ~ Sex                                             │
    │ CGPA ~ Group                                           │
    └────────────────────────────────────────────────────────┘
                               │
                               ▼
    ┌────────────────────────────────────────────────────────┐
    │ Multiple Regression Model                              │
    │ CGPA ~ Sex + Group + AssignedTeacher                   │
    └────────────────────────────────────────────────────────┘
                               │
                               ▼
    ┌────────────────────────────────────────────────────────┐
    │        PART 3A: OUTLIER DETECTION                      │
    └────────────────────────────────────────────────────────┘
                               │
                               ▼
    ┌────────────────────────────────────────────────────────┐
    │ IQR Rule for CGPA                                      │
    │ Identify and Count Outliers                            │
    │ Boxplot Visualization                                  │
    └────────────────────────────────────────────────────────┘
                               │
                               ▼
    ┌────────────────────────────────────────────────────────┐
    │        PART 3B: REGRESSION DIAGNOSTICS                 │
    └────────────────────────────────────────────────────────┘
                               │
                               ▼
    ┌────────────────────────────────────────────────────────┐
    │ Diagnostic Checks                                      │
    │ Residual Plots                                         │
    │ Normality (Q-Q Plot, Shapiro-Wilk Test)                │
    └────────────────────────────────────────────────────────┘
                               │
                               ▼
             ┌───────────────────────────────────────────┐
             │            END OF ANALYSIS                │
             │      Results Ready for Report             │
             └───────────────────────────────────────────┘
# ===================================================================
# Student Performance Analysis - R Script
# ===================================================================

# Load required packages
library(readxl)
library(dplyr)

# Read data
data <- read_excel("C:/Users/Dell/OneDrive/Desktop/STATISTICS/2nd Year/R programming/varsity/Project_Distribution.xlsx")

# Part 1: Data Preparation
# =========================

# Convert variable types
# ExamRoll: Convert to character (identifiers, not for calculations)
data$ExamRoll <- as.character(data$ExamRoll)

# Sex: Convert to factor (categorical variable with fixed levels)
data$Sex <- as.factor(data$Sex)

# CGPA: Keep as numeric (continuous quantitative variable)
# No conversion needed

# Group: Convert to factor (class categories, not measurable quantities)
data$Group <- as.factor(data$Group)

# AssignedTeacher: Convert to factor (teacher names as categorical groups)
data$AssignedTeacher <- as.factor(data$AssignedTeacher)

# Check conversions
str(data)
tibble [80 × 5] (S3: tbl_df/tbl/data.frame)
 $ ExamRoll       : chr [1:80] "2316669" "2316632" "2316615" "2316643" ...
 $ Sex            : Factor w/ 2 levels "F","M": 1 2 2 2 1 1 2 2 2 1 ...
 $ CGPA           : num [1:80] 3.99 3.95 3.94 3.94 3.91 ...
 $ Group          : Factor w/ 4 levels "1","2","3","4": 1 1 1 1 1 1 1 1 1 1 ...
 $ AssignedTeacher: Factor w/ 23 levels "A","B","C","D",..: 2 15 3 6 13 20 11 9 5 7 ...
# Part 2A: Descriptive Statistics
# ===============================

# 1. Univariate Statistics for CGPA
cat("CGPA Statistics:\n")
CGPA Statistics:
cat("Mean:", mean(data$CGPA), "\n")
Mean: 3.415225 
cat("Median:", median(data$CGPA), "\n")
Median: 3.484 
cat("Standard Deviation:", sd(data$CGPA), "\n\n")
Standard Deviation: 0.4411517 
# 2. Frequency Distributions
cat("Frequency Tables:\n")
Frequency Tables:
cat("Sex:\n")
Sex:
print(table(data$Sex))

 F  M 
30 50 
cat("\nGroup:\n")

Group:
print(table(data$Group))

 1  2  3  4 
23 23 23 11 
cat("\nAssignedTeacher:\n")

AssignedTeacher:
print(table(data$AssignedTeacher))

 A  B  C  D  E FT  G  H  I  J  K  L MT  N  O  P  Q  R  S  T  U  V  W 
 4  4  4  4  4  4  4  4  4  4  4  3  3  3  3  3  3  3  3  3  3  3  3 
cat("\n")
# 3. Group Comparisons
cat("CGPA by Sex:\n")
CGPA by Sex:
print(data %>% group_by(Sex) %>% 
      summarise(Mean = mean(CGPA), SD = sd(CGPA), Count = n()))

cat("\nCGPA by Group:\n")

CGPA by Group:
print(data %>% group_by(Group) %>% 
      summarise(Mean = mean(CGPA), SD = sd(CGPA), Count = n()))

# Part 2B: Data Visualization
# ============================

# 1. Distribution Plots
# Histogram of CGPA
hist(data$CGPA, main = "Histogram of CGPA", xlab = "CGPA", ylab = "Frequency")


# Density plot of CGPA
plot(density(data$CGPA), main = "Density Plot of CGPA", xlab = "CGPA", ylab = "Density")


# 2. Categorical Data Plots
# Bar plot of Sex
barplot(table(data$Sex), main = "Count by Sex", xlab = "Sex", ylab = "Count")


# Bar plot of Group
barplot(table(data$Group), main = "Count by Group", xlab = "Group", ylab = "Count")


# Bar plot of AssignedTeacher
barplot(table(data$AssignedTeacher), main = "Count by Assigned Teacher", 
        xlab = "Teacher", ylab = "Count", las = 2)


# 3. Comparative Plots
# Boxplot of CGPA by Sex
boxplot(CGPA ~ Sex, data = data, main = "CGPA by Sex", xlab = "Sex", ylab = "CGPA")


# Boxplot of CGPA by Group
boxplot(CGPA ~ Group, data = data, main = "CGPA by Group", xlab = "Group", ylab = "CGPA")


# Part 2C: Inferential Statistics
# ===============================

# 1. Mean Comparisons
cat("\nT-test: CGPA by Sex\n")

T-test: CGPA by Sex
print(t.test(CGPA ~ Sex, data = data))

    Welch Two Sample t-test

data:  CGPA by Sex
t = 1.7854, df = 70.874, p-value = 0.07848
alternative hypothesis: true difference in means between group F and group M is not equal to 0
95 percent confidence interval:
 -0.01995516  0.36152849
sample estimates:
mean in group F mean in group M 
       3.521967        3.351180 
cat("\nANOVA: CGPA by Group\n")

ANOVA: CGPA by Group
print(summary(aov(CGPA ~ Group, data = data)))
            Df Sum Sq Mean Sq F value Pr(>F)    
Group        3 13.670   4.557   203.1 <2e-16 ***
Residuals   76  1.705   0.022                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
cat("\nANOVA: CGPA by AssignedTeacher\n")

ANOVA: CGPA by AssignedTeacher
print(summary(aov(CGPA ~ AssignedTeacher, data = data)))
                Df Sum Sq Mean Sq F value Pr(>F)
AssignedTeacher 22   1.78 0.08091   0.339  0.997
Residuals       57  13.60 0.23850               
# 2. Association Tests
cat("\nChi-square: Sex vs Group\n")

Chi-square: Sex vs Group
print(chisq.test(table(data$Sex, data$Group)))

    Pearson's Chi-squared test

data:  table(data$Sex, data$Group)
X-squared = 4.0095, df = 3, p-value = 0.2604
cat("\nChi-square: Sex vs AssignedTeacher\n")

Chi-square: Sex vs AssignedTeacher
print(chisq.test(table(data$Sex, data$AssignedTeacher)))

    Pearson's Chi-squared test

data:  table(data$Sex, data$AssignedTeacher)
X-squared = 25.244, df = 22, p-value = 0.2855
# Part 2D: Regression Analysis
# ============================

# Simple Linear Regression
cat("\nRegression: CGPA ~ Sex\n")

Regression: CGPA ~ Sex
print(summary(lm(CGPA ~ Sex, data = data)))

Call:
lm(formula = CGPA ~ Sex, data = data)

Residuals:
     Min       1Q   Median       3Q      Max 
-1.29818 -0.22513  0.09743  0.28478  0.60182 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   3.5220     0.0796  44.244   <2e-16 ***
SexM         -0.1708     0.1007  -1.696   0.0938 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.436 on 78 degrees of freedom
Multiple R-squared:  0.03557,   Adjusted R-squared:  0.02321 
F-statistic: 2.877 on 1 and 78 DF,  p-value: 0.09384
cat("\nRegression: CGPA ~ Group\n")

Regression: CGPA ~ Group
print(summary(lm(CGPA ~ Group, data = data)))

Call:
lm(formula = CGPA ~ Group, data = data)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.48527 -0.07246  0.00333  0.10026  0.44173 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  3.83774    0.03123 122.887  < 2e-16 ***
Group2      -0.26913    0.04417  -6.094 4.23e-08 ***
Group3      -0.57900    0.04417 -13.110  < 2e-16 ***
Group4      -1.29947    0.05491 -23.668  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.1498 on 76 degrees of freedom
Multiple R-squared:  0.8891,    Adjusted R-squared:  0.8847 
F-statistic: 203.1 on 3 and 76 DF,  p-value: < 2.2e-16
# Multiple Regression
cat("\nMultiple Regression: CGPA ~ Sex + Group + AssignedTeacher\n")

Multiple Regression: CGPA ~ Sex + Group + AssignedTeacher
full_model <- lm(CGPA ~ Sex + Group + AssignedTeacher, data = data)
print(summary(full_model))

Call:
lm(formula = CGPA ~ Sex + Group + AssignedTeacher, data = data)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.37629 -0.07189  0.01049  0.06907  0.29031 

Coefficients:
                   Estimate Std. Error t value Pr(>|t|)    
(Intercept)        3.697292   0.079024  46.787  < 2e-16 ***
SexM               0.053618   0.042178   1.271   0.2092    
Group2            -0.278455   0.043500  -6.401 4.14e-08 ***
Group3            -0.588325   0.043500 -13.525  < 2e-16 ***
Group4            -1.321622   0.058344 -22.652  < 2e-16 ***
AssignedTeacherB   0.225250   0.102817   2.191   0.0329 *  
AssignedTeacherC   0.183846   0.103356   1.779   0.0810 .  
AssignedTeacherD   0.066154   0.103356   0.640   0.5249    
AssignedTeacherE   0.093191   0.104957   0.888   0.3786    
AssignedTeacherFT  0.033096   0.103356   0.320   0.7501    
AssignedTeacherG   0.041346   0.103356   0.400   0.6907    
AssignedTeacherH   0.130846   0.103356   1.266   0.2111    
AssignedTeacherI   0.007691   0.104957   0.073   0.9419    
AssignedTeacherJ   0.260404   0.103356   2.519   0.0148 *  
AssignedTeacherK   0.264250   0.102817   2.570   0.0130 *  
AssignedTeacherL   0.005017   0.114247   0.044   0.9651    
AssignedTeacherMT  0.202096   0.111863   1.807   0.0765 .  
AssignedTeacherN  -0.007777   0.112184  -0.069   0.9450    
AssignedTeacherO   0.175557   0.112184   1.565   0.1236    
AssignedTeacherP   0.143302   0.113299   1.265   0.2115    
AssignedTeacherQ   0.021557   0.112184   0.192   0.8484    
AssignedTeacherR   0.193096   0.111863   1.726   0.0901 .  
AssignedTeacherS   0.087351   0.114247   0.765   0.4479    
AssignedTeacherT   0.113557   0.112184   1.012   0.3160    
AssignedTeacherU   0.023890   0.112184   0.213   0.8322    
AssignedTeacherV   0.165351   0.114247   1.447   0.1537    
AssignedTeacherW   0.211429   0.111863   1.890   0.0642 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.1454 on 53 degrees of freedom
Multiple R-squared:  0.9271,    Adjusted R-squared:  0.8914 
F-statistic: 25.93 on 26 and 53 DF,  p-value: < 2.2e-16
# Part 3A: Outlier Detection
# ==========================

# Detect outliers using IQR rule
Q1 <- quantile(data$CGPA, 0.25)
Q3 <- quantile(data$CGPA, 0.75)
IQR_val <- Q3 - Q1
lower <- Q1 - 1.5 * IQR_val
upper <- Q3 + 1.5 * IQR_val

outliers <- data[data$CGPA < lower | data$CGPA > upper, ]
cat("\nOutliers detected:", nrow(outliers), "\n")

Outliers detected: 4 
# Visualize outliers
boxplot(data$CGPA, main = "Boxplot of CGPA", ylab = "CGPA")

# Part 3B: Regression Diagnostics
# ===============================

# Diagnostic plots for full model
par(mfrow = c(2, 2))

plot(full_model)
par(mfrow = c(1, 1))


# Shapiro-Wilk test
cat("\nShapiro-Wilk Test on Residuals:\n")

Shapiro-Wilk Test on Residuals:
print(shapiro.test(residuals(full_model)))

    Shapiro-Wilk normality test

data:  residuals(full_model)
W = 0.97797, p-value = 0.1824
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KIyBQcmFjdGljYWwgRGF0YSBPcGVyYXRpb25zIGluIFI6IFNvcnRpbmcsIEdyb3VwaW5nLCBhbmQgQXNzaWdubWVudA0KDQojIyBTdW1tYXJ5IG9mIFRhc2sNCldyaXRlIGFuIFIgc2NyaXB0IHRvIHBlcmZvcm0gYSBwcmFjdGljYWwgc3R1ZGVudCBwcm9qZWN0IGRpc3RyaWJ1dGlvbiB0YXNrLg0KDQojIyBPYmplY3RpdmVzDQoNCjEuICoqUmVhZCBTdHVkZW50IERhdGEgZnJvbSBFeGNlbCoqICANCiAgIC0gVGhlIGRhdGFzZXQgaW5jbHVkZXM6DQogICAgIC0gU3R1ZGVudCBuYW1lcyAgDQogICAgIC0gRXhhbSByb2xsIG51bWJlcnMgIA0KICAgICAtIENHUEEgIA0KDQoyLiAqKlNvcnQgU3R1ZGVudHMgYnkgQ0dQQSAoRGVzY2VuZGluZyBPcmRlcikqKiAgDQogICAtIFN0dWRlbnRzIGFyZSByYW5rZWQgZnJvbSBoaWdoZXN0IHRvIGxvd2VzdCBhY2FkZW1pYyBwZXJmb3JtYW5jZS4NCg0KMy4gKipBc3NpZ24gU3R1ZGVudHMgdG8gU2VxdWVudGlhbCBHcm91cHMqKiAgDQogICAtIFN0dWRlbnRzIGFyZSBkaXZpZGVkIGludG8gZ3JvdXBzIHdoZXJlIGVhY2ggZ3JvdXAgc2l6ZSBlcXVhbHMgdGhlIG51bWJlciBvZiB0ZWFjaGVycyAoZS5nLiwgMjMpLg0KICAgLSBUaGUgZmluYWwgZ3JvdXAgbWF5IGNvbnRhaW4gZmV3ZXIgc3R1ZGVudHMgaWYgdGhlIHRvdGFsIG51bWJlciBpcyBub3QgZGl2aXNpYmxlIGJ5IHRoZSBudW1iZXIgb2YgdGVhY2hlcnMuDQoNCjQuICoqUmFuZG9tbHkgQXNzaWduIFRlYWNoZXJzIHRvIEVhY2ggU3R1ZGVudCoqDQogICAtICoqRm9yIGZ1bGwtc2l6ZSBncm91cHMqKjogIA0KICAgICAtIEVhY2ggc3R1ZGVudCBpcyByYW5kb21seSBhc3NpZ25lZCBhICoqdW5pcXVlIHRlYWNoZXIqKi4NCiAgIC0gKipGb3IgdGhlIGxhc3QgKHNtYWxsZXIpIGdyb3VwKio6ICANCiAgICAgLSBPbmx5IHRoZSBmaXJzdCAqbSogdGVhY2hlcnMgKCptKiA8IHRvdGFsIG51bWJlciBvZiB0ZWFjaGVycykgYXJlIGNvbnNpZGVyZWQuDQogICAgIC0gVGVhY2hlciBhc3NpZ25tZW50cyBhcmUgcmFuZG9taXplZCB3aXRoaW4gdGhpcyBzdWJzZXQuDQoNCjUuICoqQ3JlYXRlIGFuIE91dHB1dC1SZWFkeSBEYXRhc2V0KioNCiAgIC0gVGhlIGZpbmFsIGRhdGEgZnJhbWUgaW5jbHVkZXM6DQogICAgIC0gU3R1ZGVudCBpbmZvcm1hdGlvbiAgDQogICAgIC0gTWVyaXQgcG9zaXRpb24gKGltcGxpY2l0bHkgZGVmaW5lZCBieSBDR1BBIHNvcnRpbmcpICANCiAgICAgLSBHcm91cCBudW1iZXIgIA0KICAgICAtIEFzc2lnbmVkIHRlYWNoZXIgIA0KDQo2LiAqKldyaXRlIE91dHB1dCB0byBFeGNlbCoqDQogICAtIEV4cG9ydCB0aGUgZmluYWwgcHJvamVjdCBkaXN0cmlidXRpb24gZGF0YXNldCB0byBhbiBFeGNlbCBmaWxlLg0KDQoNCg0KIyMgU3R1ZGVudOKAk1RlYWNoZXIgQXNzaWdubWVudCBGbG93DQoNCiAgICAgICAgICAgICAgICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQDQogICAgICAgICAgICAgICAgIOKUgiAgIDEyIFN0dWRlbnRzICAgICAgICAgICAgICAgICDilIINCiAgICAgICAgICAgICAgICAg4pSCICAgU29ydGVkIGJ5IENHUEEgKEhpZ2gg4oaSIExvdykg4pSCDQogICAgICAgICAgICAgICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pa8DQogICAgICAgICAgICAgICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkA0KICAgICAgICAgICAgICAgICDilIIgICBEaXZpZGUgaW50byA0IEdyb3VwcyAgICAgICAg4pSCDQogICAgICAgICAgICAgICAgIOKUgiAgIChFYWNoIGdyb3VwIHNpemUgPSAzKSAgICAgICDilIINCiAgICAgICAgICAgICAgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUgg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilrwNCiAgICAgICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQDQogICAgICAgIOKUgiAgICAgR3JvdXAgMSAgICAgIOKUgiAgICAgR3JvdXAgMiAgICAgIOKUgiAgICAgR3JvdXAgMyAgICAgIOKUgiAgICAgR3JvdXAgNCAgICAgICDilIINCiAgICAgICAg4pSCICAgVG9wIDMgU3R1ZGVudHMg4pSCICBOZXh0IDMgU3R1ZGVudHMg4pSCICBOZXh0IDMgU3R1ZGVudHMg4pSCIEJvdHRvbSAzIFN0dWRlbnRzIOKUgg0KICAgICAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilLTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilLTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilLTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKWvA0KICAgICAgICAgICAgICAgICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJANCiAgICAgICAgICAgICAgICAg4pSCICAgICBGT1IgRUFDSCBHUk9VUCAgICAgICAgICAgIOKUgg0KICAgICAgICAgICAgICAgICDilIIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCDQogICAgICAgICAgICAgICAgIOKUgiAg4oCiIFRha2UgMyBzdHVkZW50cyAgICAgICAgICAgIOKUgg0KICAgICAgICAgICAgICAgICDilIIgIOKAoiBTaHVmZmxlIHRlYWNoZXJzIEEsIEIsIEMgICDilIINCiAgICAgICAgICAgICAgICAg4pSCICDigKIgQXNzaWduIHNlcXVlbnRpYWxseTogICAgICAg4pSCDQogICAgICAgICAgICAgICAgIOKUgiAgICAgIFN0dWRlbnQgMSDihpIgVGVhY2hlciAxICAgIOKUgg0KICAgICAgICAgICAgICAgICDilIIgICAgICBTdHVkZW50IDIg4oaSIFRlYWNoZXIgMiAgICDilIINCiAgICAgICAgICAgICAgICAg4pSCICAgICAgU3R1ZGVudCAzIOKGkiBUZWFjaGVyIDMgICAg4pSCDQogICAgICAgICAgICAgICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pa8DQogICAgICAgICAgICAgICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkA0KICAgICAgICAgICAgICAgICDilIIgICAgICAgIEZJTkFMIFJFU1VMVCAgICAgICAgICAg4pSCDQogICAgICAgICAgICAgICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pa8DQogICAgICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUrOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUrOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkA0KICAgICAgICDilIIgICAgVGVhY2hlciBBICAgICDilIIgICAgVGVhY2hlciBCICAgICDilIIgICAgVGVhY2hlciBDICAgICDilIINCiAgICAgICAg4pSCIDEgVG9wICsgMSBHb29kICAg4pSCIDEgVG9wICsgMSBHb29kICAg4pSCIDEgVG9wICsgMSBHb29kICAg4pSCDQogICAgICAgIOKUgiArMSBBdmcgKzEgV2VhayAgIOKUgiArMSBBdmcgKzEgV2VhayAgIOKUgiArMSBBdmcgKzEgV2VhayAgIOKUgg0KICAgICAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilLTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilLTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJgNCg0KYGBge3J9DQpyZXF1aXJlKHJlYWR4bCkNCmxpYnJhcnkod3JpdGV4bCkNCnByb2plY3QuZGY8LXJlYWRfZXhjZWwoIkM6XFxVc2Vyc1xcRGVsbFxcT25lRHJpdmVcXERlc2t0b3BcXFNUQVRJU1RJQ1NcXDJuZCBZZWFyXFxSIHByb2dyYW1taW5nXFx2YXJzaXR5XFxQcm9qZWN0X0Rpc3RyaWJ1dGlvbl9EYXRhLnhsc3giKQ0KDQojIFZpZXcgZGF0YSBzdHJ1Y3R1cmUNCnN0cihwcm9qZWN0LmRmKQ0KaGVhZChwcm9qZWN0LmRmKQ0KYGBgDQpTdGVwIDE6IFNvcnQgRGF0YSBpbiBkZXNjZW5kaW5nIG9yZGVyIG9mIENHUEENCmBgYHtyfQ0Kc29ydGVkX2RmIDwtIHByb2plY3QuZGZbb3JkZXIocHJvamVjdC5kZiRDR1BBLCBkZWNyZWFzaW5nID0gVFJVRSksIF0NCnNvcnRlZF9kZg0KYGBgDQpTdGVwIDI6IFZlY3RvciBvZiB0ZWFjaGVyIGluaXRpYWxzIChzdXBwb3NlIHdlIGhhdmUgY3VycmVudGx5IDIzIHRlY2hlcnMgaW4gYWN0aXZlIHNlcnZpY2UpDQpgYGB7cn0NCnRlYWNoZXJzIDwtIExFVFRFUlNbMToyM10NCnRlYWNoZXJzDQpgYGANClN0ZXAgMzogQXNzaWduIHN0dWRlbnRzIHRvIGdyb3VwcyBzZXF1ZW50aWFsbHksIHN0YXJ0aW5nIGZyb20gMSwgMiwgM+KApiBhbmQgcmVwZWF0aW5nLCBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIHRlYWNoZXJzDQpgYGB7cn0NCm5fc3R1IDwtIG5yb3coc29ydGVkX2RmKQ0Kbl90ZWEgPC0gbGVuZ3RoKHRlYWNoZXJzKQ0Kbl9ncm91cHMgPC0gY2VpbGluZyhuX3N0dSAvIG5fdGVhKQ0Kc29ydGVkX2RmJEdyb3VwIDwtIHJlcCgxOm5fZ3JvdXBzLCBlYWNoID0gbl90ZWEsIGxlbmd0aC5vdXQgPSBuX3N0dSkNCnNvcnRlZF9kZg0KYGBgDQpTdGVwIDQ6IGJsb2NrLXdpc2UgcmFuZG9tIGFzc2lnbm1lbnQgb2YgdGVhY2hlcnMhDQpgYGB7cn0NCnNldC5zZWVkKDIwOSkNCnNvcnRlZF9kZiRBc3NpZ25lZFQgPC0gTkENCmdyb3VwcyA8LSB1bmlxdWUoc29ydGVkX2RmJEdyb3VwKSAgICAjIEdldCBhbGwgdW5pcXVlIGdyb3VwIG51bWJlcnMNCg0KDQpmb3IgKGcgaW4gZ3JvdXBzKSB7DQogICMgRmluZCBpbmRpY2VzIG9mIHN0dWRlbnRzIGluIHRoaXMgZ3JvdXANCiAgaWR4IDwtIHdoaWNoKEdyb3VwID09IGcpDQogIG5fc3R1X2dyb3VwIDwtIGxlbmd0aChpZHgpDQogIA0KICAjIFJhbmRvbWx5IGFzc2lnbiB0ZWFjaGVycyB0byB0aGVzZSBzdHVkZW50cw0KICAjIFNpbmNlIHRlYWNoZXJzIHJlcGVhdCBhY3Jvc3MgZ3JvdXBzLCB3ZSBjYW4gc2FtcGxlIGFsbCB0ZWFjaGVycw0KICBzb3J0ZWRfZGYkQXNzaWduZWRUW2lkeF0gPC0gc2FtcGxlKHRlYWNoZXJzKVsxOm5fc3R1X2dyb3VwXQ0KfQ0KICANCg0KYGBgDQpTdGVwIDU6IENoZWNrIFJlc3VsdHMNCmBgYHtyfQ0KaGVhZChzb3J0ZWRfZGYsIDIwKQ0KDQojIENoZWNrIGRpc3RyaWJ1dGlvbg0KdGFibGUoc29ydGVkX2RmJEFzc2lnbmVkVCkNCg0KIyBWZXJpZnkgbm8gdGVhY2hlciBnZXRzIHRvbyBtYW55IHN0dWRlbnRzDQp0ZWFjaGVyX2NvdW50cyA8LSB0YWJsZShzb3J0ZWRfZGYkQXNzaWduZWRUKQ0Kc3VtbWFyeShhcy5udW1lcmljKHRlYWNoZXJfY291bnRzKSkNCmBgYA0KU3RlcCA2OiBTYXZlLyBXcml0ZSBkZiB0byBhbiBFeGNlbCBmaWxlDQpgYGB7cn0NCndyaXRlX3hsc3goc29ydGVkX2RmLCAiQXNzaWduZWRfUHJvamVjdHMueGxzeCIpDQpgYGANCg0KIyBSIERhdGEgQW5hbHlzaXMgUHJvamVjdDogU3R1ZGVudCBQZXJmb3JtYW5jZSBEYXRhc2V0DQoNCiMjIFByb2plY3QgT3ZlcnZpZXcNCllvdSBhcmUgZ2l2ZW4gYSBkYXRhc2V0IGNvbnRhaW5pbmcgc3R1ZGVudCBpbmZvcm1hdGlvbiBpbmNsdWRpbmcgRXhhbSBSb2xsIG51bWJlcnMsIFNleCwgQ0dQQSwgR3JvdXAgYXNzaWdubWVudCwgYW5kIEFzc2lnbmVkIFRlYWNoZXIuIFlvdXIgdGFzayBpcyB0byBwcmVwYXJlIHRoaXMgZGF0YSBmb3IgYW5hbHlzaXMgYW5kIHBlcmZvcm0gYSBjb21wcmVoZW5zaXZlIHN0YXRpc3RpY2FsIGludmVzdGlnYXRpb24gdXNpbmcgUi4NCg0KLS0tDQoNCiMjIFBhcnQgMTogRGF0YSBQcmVwYXJhdGlvbiAmIFZhcmlhYmxlIFR5cGUgQ29udmVyc2lvbg0KDQojIyMgSW5zdHJ1Y3Rpb25zDQpCZWZvcmUgY29uZHVjdGluZyBhbnkgYW5hbHlzaXMsIHlvdSBtdXN0IHByb3Blcmx5IGNvbnZlcnQgdmFyaWFibGUgdHlwZXMgaW4gUi4gKipFeHBsYWluIHlvdXIgcmVhc29uaW5nKiogZm9yIGVhY2ggY29udmVyc2lvbiBpbiB5b3VyIGNvZGUgY29tbWVudHMuDQoNCiMjIyBWYXJpYWJsZXMgdG8gQ29udmVydA0KDQoxLiAqKkV4YW1Sb2xsKioNCiAgIC0gQ3VycmVudGx5OiBgbnVtZXJpY2ANCiAgIC0gQ29udmVydCB0bzogYGNoYXJhY3RlcmAgKG9yIGBmYWN0b3JgKQ0KICAgLSAqKlJlYXNvbioqOiBFeGFtIHJvbGwgbnVtYmVycyBhcmUgaWRlbnRpZmllcnMsIG5vdCBudW1lcmljIHF1YW50aXRpZXMgZm9yIG1hdGhlbWF0aWNhbCBvcGVyYXRpb25zLiBLZWVwaW5nIHRoZW0gbnVtZXJpYyBjb3VsZCBjYXVzZSB1bmludGVuZGVkIHN0YXRpc3RpY2FsIG9wZXJhdGlvbnMuDQoNCjIuICoqU2V4KioNCiAgIC0gQ3VycmVudGx5OiBgY2hhcmFjdGVyYA0KICAgLSBDb252ZXJ0IHRvOiBgZmFjdG9yYA0KICAgLSAqKlJlYXNvbioqOiBUaGlzIGlzIGEgY2F0ZWdvcmljYWwgdmFyaWFibGUgd2l0aCBmaXhlZCBsZXZlbHMgKGUuZy4sICJNIiwgIkYiKS4NCg0KMy4gKipDR1BBKioNCiAgIC0gQ3VycmVudGx5OiBgbnVtZXJpY2ANCiAgIC0gS2VlcCBhczogYG51bWVyaWNgDQogICAtICoqUmVhc29uKio6IENvbnRpbnVvdXMgcXVhbnRpdGF0aXZlIHZhcmlhYmxlIHN1aXRhYmxlIGZvciBtYXRoZW1hdGljYWwgb3BlcmF0aW9ucy4NCg0KNC4gKipHcm91cCoqDQogICAtIEN1cnJlbnRseTogYG51bWVyaWNgDQogICAtIENvbnZlcnQgdG86IGBmYWN0b3JgDQogICAtICoqUmVhc29uKio6IFJlcHJlc2VudHMgY2xhc3Mvc2VjdGlvbiBjYXRlZ29yaWVzICgxLCAyLCAz4oCmKSwgbm90IG1lYXN1cmFibGUgcXVhbnRpdGllcy4NCg0KNS4gKipBc3NpZ25lZFRlYWNoZXIqKg0KICAgLSBDdXJyZW50bHk6IGBjaGFyYWN0ZXJgDQogICAtIENvbnZlcnQgdG86IGBmYWN0b3JgDQogICAtICoqUmVhc29uKio6IFRlYWNoZXIgbmFtZXMgb3IgaW5pdGlhbHMgcmVwcmVzZW50IGNhdGVnb3JpY2FsIGdyb3Vwcy4NCg0KLS0tDQoNCiMjIFBhcnQgMjogU3RhdGlzdGljYWwgQW5hbHlzaXMNCg0KIyMjIEEuIERlc2NyaXB0aXZlIFN0YXRpc3RpY3MNClBlcmZvcm0gdGhlIGZvbGxvd2luZyBhbmFseXNlcyBhbmQgcmVwb3J0IHlvdXIgZmluZGluZ3M6DQoNCjEuICoqVW5pdmFyaWF0ZSBTdGF0aXN0aWNzIGZvciBDR1BBKioNCiAgIC0gTWVhbg0KICAgLSBNZWRpYW4NCiAgIC0gU3RhbmRhcmQgZGV2aWF0aW9uDQoNCjIuICoqRnJlcXVlbmN5IERpc3RyaWJ1dGlvbnMqKg0KICAgLSBTZXgNCiAgIC0gR3JvdXANCiAgIC0gQXNzaWduZWRUZWFjaGVyDQoNCjMuICoqR3JvdXAgQ29tcGFyaXNvbnMqKg0KICAgLSBDR1BBIGJ5IFNleCAobWVhbiwgU0QsIGNvdW50KQ0KICAgLSBDR1BBIGJ5IEdyb3VwIChtZWFuLCBTRCwgY291bnQpDQoNCi0tLQ0KDQojIyMgQi4gRGF0YSBWaXN1YWxpemF0aW9uDQpDcmVhdGUgdGhlIGZvbGxvd2luZyBwbG90cyB3aXRoIGFwcHJvcHJpYXRlIHRpdGxlcyBhbmQgbGFiZWxzOg0KDQoxLiAqKkRpc3RyaWJ1dGlvbiBQbG90cyoqDQogICAtIEhpc3RvZ3JhbSBvZiBDR1BBDQogICAtIERlbnNpdHkgcGxvdCBvZiBDR1BBDQoNCjIuICoqQ2F0ZWdvcmljYWwgRGF0YSBQbG90cyoqDQogICAtIEJhciBwbG90IG9mIFNleA0KICAgLSBCYXIgcGxvdCBvZiBHcm91cA0KICAgLSBCYXIgcGxvdCBvZiBBc3NpZ25lZFRlYWNoZXINCg0KMy4gKipDb21wYXJhdGl2ZSBQbG90cyoqDQogICAtIEJveHBsb3Qgb2YgQ0dQQSBieSBTZXgNCiAgIC0gQm94cGxvdCBvZiBDR1BBIGJ5IEdyb3VwDQoNCi0tLQ0KDQojIyMgQy4gSW5mZXJlbnRpYWwgU3RhdGlzdGljcw0KUGVyZm9ybSB0aGUgZm9sbG93aW5nIGh5cG90aGVzaXMgdGVzdHMgYW5kIGludGVycHJldCB0aGUgcmVzdWx0czoNCg0KMS4gKipNZWFuIENvbXBhcmlzb25zKioNCiAgIC0gSW5kZXBlbmRlbnQgc2FtcGxlcyB0LXRlc3Q6IENHUEEgYnkgU2V4DQogICAtIE9uZS13YXkgQU5PVkE6IENHUEEgYnkgR3JvdXANCiAgIC0gT25lLXdheSBBTk9WQTogQ0dQQSBieSBBc3NpZ25lZFRlYWNoZXINCg0KMi4gKipBc3NvY2lhdGlvbiBUZXN0cyoqDQogICAtIENoaS1zcXVhcmUgdGVzdDogU2V4IHZzIEdyb3VwDQogICAtIENoaS1zcXVhcmUgdGVzdDogU2V4IHZzIEFzc2lnbmVkVGVhY2hlcg0KDQotLS0NCg0KIyMjIEQuIFJlZ3Jlc3Npb24gQW5hbHlzaXMNCg0KMS4gKipTaW1wbGUgTGluZWFyIFJlZ3Jlc3Npb24qKg0KICAgLSBNb2RlbCAxOiBDR1BBIH4gU2V4DQogICAtIE1vZGVsIDI6IENHUEEgfiBHcm91cA0KDQoyLiAqKk11bHRpcGxlIFJlZ3Jlc3Npb24qKg0KICAgLSBGdWxsIG1vZGVsOiBDR1BBIH4gU2V4ICsgR3JvdXAgKyBBc3NpZ25lZFRlYWNoZXINCg0KLS0tDQoNCiMjIFBhcnQgMzogRGlhZ25vc3RpYyBDaGVja3MgJiBBc3N1bXB0aW9ucw0KDQojIyMgQS4gT3V0bGllciBEZXRlY3Rpb24NCi0gRGV0ZWN0IG91dGxpZXJzIGluIENHUEEgdXNpbmcgdGhlIElRUiBydWxlDQotIFZpc3VhbGl6ZSBvdXRsaWVycyB1c2luZyBib3hwbG90cw0KDQojIyMgQi4gUmVncmVzc2lvbiBEaWFnbm9zdGljcw0KRm9yIHRoZSBtdWx0aXBsZSByZWdyZXNzaW9uIG1vZGVsIChgQ0dQQSB+IFNleCArIEdyb3VwICsgQXNzaWduZWRUZWFjaGVyYCksIGNoZWNrOg0KDQoxLiAqKkxpbmVhcml0eSoqDQogICAtIFJlc2lkdWFscyB2cyBGaXR0ZWQgcGxvdA0KDQoyLiAqKk5vcm1hbGl0eSoqDQogICAtIFHigJNRIHBsb3Qgb2YgcmVzaWR1YWxzDQogICAtIFNoYXBpcm/igJNXaWxrIHRlc3Qgb24gcmVzaWR1YWxzDQoNCjMuICoqSG9tb3NjZWRhc3RpY2l0eSoqDQogICAtIFNjYWxl4oCTTG9jYXRpb24gcGxvdA0KDQo0LiAqKkluZGVwZW5kZW5jZSoqDQogICAtIER1cmJpbuKAk1dhdHNvbiB0ZXN0IChpZiBhcHByb3ByaWF0ZSkNCg0KNS4gKipNdWx0aWNvbGxpbmVhcml0eSoqDQogICAtIFZhcmlhbmNlIEluZmxhdGlvbiBGYWN0b3IgKFZJRikNCg0KLS0tDQoNCiMjIFBhcnQgNDogU3VibWlzc2lvbiBSZXF1aXJlbWVudHMNCg0KIyMjIFdoYXQgdG8gU3VibWl0DQoNCjEuICoqUiBTY3JpcHQqKg0KICAgLSBDb250YWlucyBhbGwgY29kZSB3aXRoIGNsZWFyIGFuZCBtZWFuaW5nZnVsIGNvbW1lbnRzDQoNCjIuICoqUmVwb3J0KiogKFIgTWFya2Rvd24gLyBXb3JkIC8gUERGKQ0KICAgLSBJbnRyb2R1Y3Rpb24gYW5kIG9iamVjdGl2ZXMNCiAgIC0gRGF0YSBwcmVwYXJhdGlvbiBzdW1tYXJ5DQogICAtIEtleSBmaW5kaW5ncyBmcm9tIGVhY2ggYW5hbHlzaXMNCiAgIC0gSW50ZXJwcmV0YXRpb24gb2Ygc3RhdGlzdGljYWwgcmVzdWx0cw0KICAgLSBWaXN1YWxpemF0aW9ucyB3aXRoIGNhcHRpb25zDQogICAtIENvbmNsdXNpb25zIGFuZCBsaW1pdGF0aW9ucw0KDQotLS0NCg0KIyMjIENvZGUgT3JnYW5pemF0aW9uDQpZb3VyIFIgc2NyaXB0IHNob3VsZCBmb2xsb3cgdGhpcyBzdHJ1Y3R1cmU6DQoNCg0KIyMgQ29kZSBPcmdhbml6YXRpb24gU3RydWN0dXJlDQoNCiMjIyBQYXJ0IDE6IERhdGEgUHJlcGFyYXRpb24NCi0gVmFyaWFibGUgdHlwZSBjb252ZXJzaW9uICANCi0gRGF0YSBjbGVhbmluZyAoaWYgcmVxdWlyZWQpDQoNCi0tLQ0KDQojIyMgUGFydCAyQTogRGVzY3JpcHRpdmUgU3RhdGlzdGljcw0KLSBTdW1tYXJ5IHN0YXRpc3RpY3MgZm9yIENHUEEgIA0KLSBGcmVxdWVuY3kgdGFibGVzIGZvciBjYXRlZ29yaWNhbCB2YXJpYWJsZXMgIA0KLSBHcm91cC13aXNlIHN1bW1hcmllcw0KDQotLS0NCg0KIyMjIFBhcnQgMkI6IERhdGEgVmlzdWFsaXphdGlvbg0KLSBEaXN0cmlidXRpb24gcGxvdHMgKGhpc3RvZ3JhbSwgZGVuc2l0eSBwbG90KSAgDQotIEJhciBwbG90cyBmb3IgY2F0ZWdvcmljYWwgdmFyaWFibGVzICANCi0gQm94cGxvdHMgZm9yIGdyb3VwIGNvbXBhcmlzb25zDQoNCi0tLQ0KDQojIyMgUmVtYWluaW5nIFNlY3Rpb25zDQotIEluZmVyZW50aWFsIHN0YXRpc3RpY3MgIA0KLSBSZWdyZXNzaW9uIGFuYWx5c2lzICANCi0gRGlhZ25vc3RpYyBjaGVja3MgYW5kIGFzc3VtcHRpb24gdGVzdGluZyAgDQoNCj4gKipOb3RlOioqIEVhY2ggc2VjdGlvbiBpbiB0aGUgUiBzY3JpcHQgc2hvdWxkIGJlIGNsZWFybHkgc2VwYXJhdGVkIHVzaW5nIGNvbW1lbnRzIGFuZCB3cml0dGVuIGluIGEgbG9naWNhbCwgc2VxdWVudGlhbCBtYW5uZXIgZm9yIHJlYWRhYmlsaXR5IGFuZCBncmFkaW5nLg0KDQoNCg0KDQojIyBTdHVkZW50IFBlcmZvcm1hbmNlIEFuYWx5c2lzIOKAkyBXb3JrZmxvdyBGbG93Y2hhcnQNCg0KICAgICAgICAgICAgICAgICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJANCiAgICAgICAgICAgICAgICAg4pSCICAgICAgICAgICAgU1RBUlQgUFJPSkVDVCAgICAgICAgICAgICAgICAgIOKUgg0KICAgICAgICAgICAgICAgICDilIIgICBTdHVkZW50IFBlcmZvcm1hbmNlIERhdGFzZXQgaW4gUiAgICAgICAg4pSCDQogICAgICAgICAgICAgICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pa8DQogICAgICAgICAgICAgICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkA0KICAgICAgICAgICAgICAgICDilIIgICAgICAgICAgICBMT0FEIFBBQ0tBR0VTICAgICAgICAgICAgICAgICAg4pSCDQogICAgICAgICAgICAgICAgIOKUgiAgICAgcmVhZHhsLCBkcGx5ciAgICAgICAgICAgICAgICAgICAgICAgICDilIINCiAgICAgICAgICAgICAgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUgg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilrwNCiAgICAgICAgICAgICAgICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQDQogICAgICAgICAgICAgICAgIOKUgiAgICAgICAgICAgICAgUkVBRCBEQVRBICAgICAgICAgICAgICAgICAgICDilIINCiAgICAgICAgICAgICAgICAg4pSCICBJbXBvcnQgRXhjZWwgU3R1ZGVudCBEYXRhc2V0ICAgICAgICAgICAgIOKUgg0KICAgICAgICAgICAgICAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKWvA0KICAgICAgICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJANCiAgICAgICAg4pSCICAgICAgICAgICAgICBQQVJUIDE6IERBVEEgUFJFUEFSQVRJT04gICAgICAgICAgICAgICAgICDilIINCiAgICAgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUgg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilrwNCiAgICAgICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQDQogICAgICAgIOKUgiBDb252ZXJ0IFZhcmlhYmxlIFR5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCDQogICAgICAgIOKUgiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCDQogICAgICAgIOKUgiBFeGFtUm9sbCAgICAgICAgIOKGkiBjaGFyYWN0ZXIgKGlkZW50aWZpZXIpICAgICAgICAgICAgICDilIINCiAgICAgICAg4pSCIFNleCAgICAgICAgICAgICAg4oaSIGZhY3RvciAoY2F0ZWdvcmljYWwpICAgICAgICAgICAgICAgIOKUgg0KICAgICAgICDilIIgQ0dQQSAgICAgICAgICAgICDihpIgbnVtZXJpYyAoY29udGludW91cykgICAgICAgICAgICAgICAg4pSCDQogICAgICAgIOKUgiBHcm91cCAgICAgICAgICAgIOKGkiBmYWN0b3IgKGNhdGVnb3J5KSAgICAgICAgICAgICAgICAgICDilIINCiAgICAgICAg4pSCIEFzc2lnbmVkVGVhY2hlciAg4oaSIGZhY3RvciAoY2F0ZWdvcnkpICAgICAgICAgICAgICAgICAgIOKUgg0KICAgICAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKWvA0KICAgICAgICAgICAgICAgICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJANCiAgICAgICAgICAgICAgICAg4pSCICAgICAgICAgIFZFUklGWSBTVFJVQ1RVUkUgICAgICAgICAgICAgICAgIOKUgg0KICAgICAgICAgICAgICAgICDilIIgICAgICAgICAgICAgICBzdHIoZGF0YSkgICAgICAgICAgICAgICAgICAg4pSCDQogICAgICAgICAgICAgICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pa8DQogICAgICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkA0KICAgICAgICDilIIgICAgICAgIFBBUlQgMkE6IERFU0NSSVBUSVZFIFNUQVRJU1RJQ1MgICAgICAgICAgICAgICAgIOKUgg0KICAgICAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKWvA0KICAgICAgICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJANCiAgICAgICAg4pSCIFVuaXZhcmlhdGUgU3RhdGlzdGljcyAoQ0dQQSkgICAgICAgICAgICAgICAgICAgICAgICAgICDilIINCiAgICAgICAg4pSCIE1lYW4g4oCiIE1lZGlhbiDigKIgU3RhbmRhcmQgRGV2aWF0aW9uICAgICAgICAgICAgICAgICAgICAg4pSCDQogICAgICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pa8DQogICAgICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkA0KICAgICAgICDilIIgRnJlcXVlbmN5IERpc3RyaWJ1dGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUgg0KICAgICAgICDilIIgU2V4IOKAoiBHcm91cCDigKIgQXNzaWduZWRUZWFjaGVyICAgICAgICAgICAgICAgICAgICAgICAgICDilIINCiAgICAgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUgg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilrwNCiAgICAgICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQDQogICAgICAgIOKUgiBHcm91cC13aXNlIENHUEEgQ29tcGFyaXNvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCDQogICAgICAgIOKUgiBDR1BBIGJ5IFNleCAgKE1lYW4sIFNELCBDb3VudCkgICAgICAgICAgICAgICAgICAgICAgICAg4pSCDQogICAgICAgIOKUgiBDR1BBIGJ5IEdyb3VwIChNZWFuLCBTRCwgQ291bnQpICAgICAgICAgICAgICAgICAgICAgICAg4pSCDQogICAgICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pa8DQogICAgICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkA0KICAgICAgICDilIIgICAgICAgIFBBUlQgMkI6IERBVEEgVklTVUFMSVpBVElPTiAgICAgICAgICAgICAgICAgICAgIOKUgg0KICAgICAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKWvA0KICAgICAgICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJANCiAgICAgICAg4pSCIERpc3RyaWJ1dGlvbiBQbG90cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIINCiAgICAgICAg4pSCIEhpc3RvZ3JhbSBvZiBDR1BBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIINCiAgICAgICAg4pSCIERlbnNpdHkgUGxvdCBvZiBDR1BBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIINCiAgICAgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUgg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilrwNCiAgICAgICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQDQogICAgICAgIOKUgiBDYXRlZ29yaWNhbCBCYXIgUGxvdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCDQogICAgICAgIOKUgiBTZXgg4oCiIEdyb3VwIOKAoiBBc3NpZ25lZFRlYWNoZXIgICAgICAgICAgICAgICAgICAgICAgICAgIOKUgg0KICAgICAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKWvA0KICAgICAgICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJANCiAgICAgICAg4pSCIENvbXBhcmF0aXZlIEJveHBsb3RzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIINCiAgICAgICAg4pSCIENHUEEgYnkgU2V4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIINCiAgICAgICAg4pSCIENHUEEgYnkgR3JvdXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIINCiAgICAgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUgg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilrwNCiAgICAgICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQDQogICAgICAgIOKUgiAgICAgICAgUEFSVCAyQzogSU5GRVJFTlRJQUwgU1RBVElTVElDUyAgICAgICAgICAgICAgICAg4pSCDQogICAgICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pa8DQogICAgICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkA0KICAgICAgICDilIIgTWVhbiBDb21wYXJpc29uIFRlc3RzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUgg0KICAgICAgICDilIIgdC10ZXN0ICAgICAgOiBDR1BBIH4gU2V4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUgg0KICAgICAgICDilIIgQU5PVkEgICAgICAgOiBDR1BBIH4gR3JvdXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUgg0KICAgICAgICDilIIgQU5PVkEgICAgICAgOiBDR1BBIH4gQXNzaWduZWRUZWFjaGVyICAgICAgICAgICAgICAgICAgIOKUgg0KICAgICAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKWvA0KICAgICAgICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJANCiAgICAgICAg4pSCIEFzc29jaWF0aW9uIFRlc3RzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIINCiAgICAgICAg4pSCIENoaS1zcXVhcmU6IFNleCB2cyBHcm91cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIINCiAgICAgICAg4pSCIENoaS1zcXVhcmU6IFNleCB2cyBBc3NpZ25lZFRlYWNoZXIgICAgICAgICAgICAgICAgICAgICDilIINCiAgICAgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUgg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilrwNCiAgICAgICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQDQogICAgICAgIOKUgiAgICAgICAgUEFSVCAyRDogUkVHUkVTU0lPTiBBTkFMWVNJUyAgICAgICAgICAgICAgICAgICAg4pSCDQogICAgICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pa8DQogICAgICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkA0KICAgICAgICDilIIgU2ltcGxlIFJlZ3Jlc3Npb24gTW9kZWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUgg0KICAgICAgICDilIIgQ0dQQSB+IFNleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUgg0KICAgICAgICDilIIgQ0dQQSB+IEdyb3VwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUgg0KICAgICAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKWvA0KICAgICAgICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJANCiAgICAgICAg4pSCIE11bHRpcGxlIFJlZ3Jlc3Npb24gTW9kZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIINCiAgICAgICAg4pSCIENHUEEgfiBTZXggKyBHcm91cCArIEFzc2lnbmVkVGVhY2hlciAgICAgICAgICAgICAgICAgICDilIINCiAgICAgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUgg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilrwNCiAgICAgICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQDQogICAgICAgIOKUgiAgICAgICAgUEFSVCAzQTogT1VUTElFUiBERVRFQ1RJT04gICAgICAgICAgICAgICAgICAgICAg4pSCDQogICAgICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pa8DQogICAgICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkA0KICAgICAgICDilIIgSVFSIFJ1bGUgZm9yIENHUEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUgg0KICAgICAgICDilIIgSWRlbnRpZnkgYW5kIENvdW50IE91dGxpZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUgg0KICAgICAgICDilIIgQm94cGxvdCBWaXN1YWxpemF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUgg0KICAgICAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKWvA0KICAgICAgICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJANCiAgICAgICAg4pSCICAgICAgICBQQVJUIDNCOiBSRUdSRVNTSU9OIERJQUdOT1NUSUNTICAgICAgICAgICAgICAgICDilIINCiAgICAgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUgg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilrwNCiAgICAgICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQDQogICAgICAgIOKUgiBEaWFnbm9zdGljIENoZWNrcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCDQogICAgICAgIOKUgiBSZXNpZHVhbCBQbG90cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCDQogICAgICAgIOKUgiBOb3JtYWxpdHkgKFEtUSBQbG90LCBTaGFwaXJvLVdpbGsgVGVzdCkgICAgICAgICAgICAgICAg4pSCDQogICAgICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pa8DQogICAgICAgICAgICAgICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkA0KICAgICAgICAgICAgICAgICDilIIgICAgICAgICAgICBFTkQgT0YgQU5BTFlTSVMgICAgICAgICAgICAgICAg4pSCDQogICAgICAgICAgICAgICAgIOKUgiAgICAgIFJlc3VsdHMgUmVhZHkgZm9yIFJlcG9ydCAgICAgICAgICAgICDilIINCiAgICAgICAgICAgICAgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYDQoNCg0KDQoNCmBgYHtyfQ0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQojIFN0dWRlbnQgUGVyZm9ybWFuY2UgQW5hbHlzaXMgLSBSIFNjcmlwdA0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCiMgTG9hZCByZXF1aXJlZCBwYWNrYWdlcw0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGRwbHlyKQ0KDQojIFJlYWQgZGF0YQ0KZGF0YSA8LSByZWFkX2V4Y2VsKCJDOi9Vc2Vycy9EZWxsL09uZURyaXZlL0Rlc2t0b3AvU1RBVElTVElDUy8ybmQgWWVhci9SIHByb2dyYW1taW5nL3ZhcnNpdHkvUHJvamVjdF9EaXN0cmlidXRpb24ueGxzeCIpDQoNCiMgUGFydCAxOiBEYXRhIFByZXBhcmF0aW9uDQojID09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KIyBDb252ZXJ0IHZhcmlhYmxlIHR5cGVzDQojIEV4YW1Sb2xsOiBDb252ZXJ0IHRvIGNoYXJhY3RlciAoaWRlbnRpZmllcnMsIG5vdCBmb3IgY2FsY3VsYXRpb25zKQ0KZGF0YSRFeGFtUm9sbCA8LSBhcy5jaGFyYWN0ZXIoZGF0YSRFeGFtUm9sbCkNCg0KIyBTZXg6IENvbnZlcnQgdG8gZmFjdG9yIChjYXRlZ29yaWNhbCB2YXJpYWJsZSB3aXRoIGZpeGVkIGxldmVscykNCmRhdGEkU2V4IDwtIGFzLmZhY3RvcihkYXRhJFNleCkNCg0KIyBDR1BBOiBLZWVwIGFzIG51bWVyaWMgKGNvbnRpbnVvdXMgcXVhbnRpdGF0aXZlIHZhcmlhYmxlKQ0KIyBObyBjb252ZXJzaW9uIG5lZWRlZA0KDQojIEdyb3VwOiBDb252ZXJ0IHRvIGZhY3RvciAoY2xhc3MgY2F0ZWdvcmllcywgbm90IG1lYXN1cmFibGUgcXVhbnRpdGllcykNCmRhdGEkR3JvdXAgPC0gYXMuZmFjdG9yKGRhdGEkR3JvdXApDQoNCiMgQXNzaWduZWRUZWFjaGVyOiBDb252ZXJ0IHRvIGZhY3RvciAodGVhY2hlciBuYW1lcyBhcyBjYXRlZ29yaWNhbCBncm91cHMpDQpkYXRhJEFzc2lnbmVkVGVhY2hlciA8LSBhcy5mYWN0b3IoZGF0YSRBc3NpZ25lZFRlYWNoZXIpDQoNCiMgQ2hlY2sgY29udmVyc2lvbnMNCnN0cihkYXRhKQ0KDQojIFBhcnQgMkE6IERlc2NyaXB0aXZlIFN0YXRpc3RpY3MNCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQojIDEuIFVuaXZhcmlhdGUgU3RhdGlzdGljcyBmb3IgQ0dQQQ0KY2F0KCJDR1BBIFN0YXRpc3RpY3M6XG4iKQ0KY2F0KCJNZWFuOiIsIG1lYW4oZGF0YSRDR1BBKSwgIlxuIikNCmNhdCgiTWVkaWFuOiIsIG1lZGlhbihkYXRhJENHUEEpLCAiXG4iKQ0KY2F0KCJTdGFuZGFyZCBEZXZpYXRpb246Iiwgc2QoZGF0YSRDR1BBKSwgIlxuXG4iKQ0KDQojIDIuIEZyZXF1ZW5jeSBEaXN0cmlidXRpb25zDQpjYXQoIkZyZXF1ZW5jeSBUYWJsZXM6XG4iKQ0KY2F0KCJTZXg6XG4iKQ0KcHJpbnQodGFibGUoZGF0YSRTZXgpKQ0KY2F0KCJcbkdyb3VwOlxuIikNCnByaW50KHRhYmxlKGRhdGEkR3JvdXApKQ0KY2F0KCJcbkFzc2lnbmVkVGVhY2hlcjpcbiIpDQpwcmludCh0YWJsZShkYXRhJEFzc2lnbmVkVGVhY2hlcikpDQpjYXQoIlxuIikNCg0KIyAzLiBHcm91cCBDb21wYXJpc29ucw0KY2F0KCJDR1BBIGJ5IFNleDpcbiIpDQpwcmludChkYXRhICU+JSBncm91cF9ieShTZXgpICU+JSANCiAgICAgIHN1bW1hcmlzZShNZWFuID0gbWVhbihDR1BBKSwgU0QgPSBzZChDR1BBKSwgQ291bnQgPSBuKCkpKQ0KDQpjYXQoIlxuQ0dQQSBieSBHcm91cDpcbiIpDQpwcmludChkYXRhICU+JSBncm91cF9ieShHcm91cCkgJT4lIA0KICAgICAgc3VtbWFyaXNlKE1lYW4gPSBtZWFuKENHUEEpLCBTRCA9IHNkKENHUEEpLCBDb3VudCA9IG4oKSkpDQoNCiMgUGFydCAyQjogRGF0YSBWaXN1YWxpemF0aW9uDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KIyAxLiBEaXN0cmlidXRpb24gUGxvdHMNCiMgSGlzdG9ncmFtIG9mIENHUEENCmhpc3QoZGF0YSRDR1BBLCBtYWluID0gIkhpc3RvZ3JhbSBvZiBDR1BBIiwgeGxhYiA9ICJDR1BBIiwgeWxhYiA9ICJGcmVxdWVuY3kiKQ0KDQojIERlbnNpdHkgcGxvdCBvZiBDR1BBDQpwbG90KGRlbnNpdHkoZGF0YSRDR1BBKSwgbWFpbiA9ICJEZW5zaXR5IFBsb3Qgb2YgQ0dQQSIsIHhsYWIgPSAiQ0dQQSIsIHlsYWIgPSAiRGVuc2l0eSIpDQoNCiMgMi4gQ2F0ZWdvcmljYWwgRGF0YSBQbG90cw0KIyBCYXIgcGxvdCBvZiBTZXgNCmJhcnBsb3QodGFibGUoZGF0YSRTZXgpLCBtYWluID0gIkNvdW50IGJ5IFNleCIsIHhsYWIgPSAiU2V4IiwgeWxhYiA9ICJDb3VudCIpDQoNCiMgQmFyIHBsb3Qgb2YgR3JvdXANCmJhcnBsb3QodGFibGUoZGF0YSRHcm91cCksIG1haW4gPSAiQ291bnQgYnkgR3JvdXAiLCB4bGFiID0gIkdyb3VwIiwgeWxhYiA9ICJDb3VudCIpDQoNCiMgQmFyIHBsb3Qgb2YgQXNzaWduZWRUZWFjaGVyDQpiYXJwbG90KHRhYmxlKGRhdGEkQXNzaWduZWRUZWFjaGVyKSwgbWFpbiA9ICJDb3VudCBieSBBc3NpZ25lZCBUZWFjaGVyIiwgDQogICAgICAgIHhsYWIgPSAiVGVhY2hlciIsIHlsYWIgPSAiQ291bnQiLCBsYXMgPSAyKQ0KDQojIDMuIENvbXBhcmF0aXZlIFBsb3RzDQojIEJveHBsb3Qgb2YgQ0dQQSBieSBTZXgNCmJveHBsb3QoQ0dQQSB+IFNleCwgZGF0YSA9IGRhdGEsIG1haW4gPSAiQ0dQQSBieSBTZXgiLCB4bGFiID0gIlNleCIsIHlsYWIgPSAiQ0dQQSIpDQoNCiMgQm94cGxvdCBvZiBDR1BBIGJ5IEdyb3VwDQpib3hwbG90KENHUEEgfiBHcm91cCwgZGF0YSA9IGRhdGEsIG1haW4gPSAiQ0dQQSBieSBHcm91cCIsIHhsYWIgPSAiR3JvdXAiLCB5bGFiID0gIkNHUEEiKQ0KDQojIFBhcnQgMkM6IEluZmVyZW50aWFsIFN0YXRpc3RpY3MNCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQojIDEuIE1lYW4gQ29tcGFyaXNvbnMNCmNhdCgiXG5ULXRlc3Q6IENHUEEgYnkgU2V4XG4iKQ0KcHJpbnQodC50ZXN0KENHUEEgfiBTZXgsIGRhdGEgPSBkYXRhKSkNCg0KY2F0KCJcbkFOT1ZBOiBDR1BBIGJ5IEdyb3VwXG4iKQ0KcHJpbnQoc3VtbWFyeShhb3YoQ0dQQSB+IEdyb3VwLCBkYXRhID0gZGF0YSkpKQ0KDQpjYXQoIlxuQU5PVkE6IENHUEEgYnkgQXNzaWduZWRUZWFjaGVyXG4iKQ0KcHJpbnQoc3VtbWFyeShhb3YoQ0dQQSB+IEFzc2lnbmVkVGVhY2hlciwgZGF0YSA9IGRhdGEpKSkNCg0KIyAyLiBBc3NvY2lhdGlvbiBUZXN0cw0KY2F0KCJcbkNoaS1zcXVhcmU6IFNleCB2cyBHcm91cFxuIikNCnByaW50KGNoaXNxLnRlc3QodGFibGUoZGF0YSRTZXgsIGRhdGEkR3JvdXApKSkNCg0KY2F0KCJcbkNoaS1zcXVhcmU6IFNleCB2cyBBc3NpZ25lZFRlYWNoZXJcbiIpDQpwcmludChjaGlzcS50ZXN0KHRhYmxlKGRhdGEkU2V4LCBkYXRhJEFzc2lnbmVkVGVhY2hlcikpKQ0KDQojIFBhcnQgMkQ6IFJlZ3Jlc3Npb24gQW5hbHlzaXMNCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQojIFNpbXBsZSBMaW5lYXIgUmVncmVzc2lvbg0KY2F0KCJcblJlZ3Jlc3Npb246IENHUEEgfiBTZXhcbiIpDQpwcmludChzdW1tYXJ5KGxtKENHUEEgfiBTZXgsIGRhdGEgPSBkYXRhKSkpDQoNCmNhdCgiXG5SZWdyZXNzaW9uOiBDR1BBIH4gR3JvdXBcbiIpDQpwcmludChzdW1tYXJ5KGxtKENHUEEgfiBHcm91cCwgZGF0YSA9IGRhdGEpKSkNCg0KIyBNdWx0aXBsZSBSZWdyZXNzaW9uDQpjYXQoIlxuTXVsdGlwbGUgUmVncmVzc2lvbjogQ0dQQSB+IFNleCArIEdyb3VwICsgQXNzaWduZWRUZWFjaGVyXG4iKQ0KZnVsbF9tb2RlbCA8LSBsbShDR1BBIH4gU2V4ICsgR3JvdXAgKyBBc3NpZ25lZFRlYWNoZXIsIGRhdGEgPSBkYXRhKQ0KcHJpbnQoc3VtbWFyeShmdWxsX21vZGVsKSkNCg0KIyBQYXJ0IDNBOiBPdXRsaWVyIERldGVjdGlvbg0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQojIERldGVjdCBvdXRsaWVycyB1c2luZyBJUVIgcnVsZQ0KUTEgPC0gcXVhbnRpbGUoZGF0YSRDR1BBLCAwLjI1KQ0KUTMgPC0gcXVhbnRpbGUoZGF0YSRDR1BBLCAwLjc1KQ0KSVFSX3ZhbCA8LSBRMyAtIFExDQpsb3dlciA8LSBRMSAtIDEuNSAqIElRUl92YWwNCnVwcGVyIDwtIFEzICsgMS41ICogSVFSX3ZhbA0KDQpvdXRsaWVycyA8LSBkYXRhW2RhdGEkQ0dQQSA8IGxvd2VyIHwgZGF0YSRDR1BBID4gdXBwZXIsIF0NCmNhdCgiXG5PdXRsaWVycyBkZXRlY3RlZDoiLCBucm93KG91dGxpZXJzKSwgIlxuIikNCg0KIyBWaXN1YWxpemUgb3V0bGllcnMNCmJveHBsb3QoZGF0YSRDR1BBLCBtYWluID0gIkJveHBsb3Qgb2YgQ0dQQSIsIHlsYWIgPSAiQ0dQQSIpDQoNCiMgUGFydCAzQjogUmVncmVzc2lvbiBEaWFnbm9zdGljcw0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCiMgRGlhZ25vc3RpYyBwbG90cyBmb3IgZnVsbCBtb2RlbA0KcGFyKG1mcm93ID0gYygyLCAyKSkNCnBsb3QoZnVsbF9tb2RlbCkNCnBhcihtZnJvdyA9IGMoMSwgMSkpDQoNCiMgU2hhcGlyby1XaWxrIHRlc3QNCmNhdCgiXG5TaGFwaXJvLVdpbGsgVGVzdCBvbiBSZXNpZHVhbHM6XG4iKQ0KcHJpbnQoc2hhcGlyby50ZXN0KHJlc2lkdWFscyhmdWxsX21vZGVsKSkpDQpgYGANCg0K