Setup: Load packages

library(readr)
library(dplyr) 
library(kableExtra) #enhance and customize tables

Attaching package: ‘kableExtra’

The following object is masked from ‘package:dplyr’:

    group_rows
library(magrittr) #provides pipe operator

Attaching package: ‘magrittr’

The following object is masked from ‘package:purrr’:

    set_names

The following object is masked from ‘package:tidyr’:

    extract

Group Information

Group Information
Student name Student number Percentage of contribution
Chamudi Abeysinghe s4150303 100%

Description of the Data

AKSHAY KUMAR (2025) states that ‘This datas real-world trends in children’s screen time usage. It includes data on educational, recreational, and total screen time for children aged 5 to 15 years, with breakdowns by gender (Male, Female, Other/Prefer not to say) and day type (Weekday, Weekend)’.

Available at:https://www.kaggle.com/datasets/ak0212/average-daily-screen-time-for-children

Variable Description:

  1. Age: Children age between 5-15 years. Helps analyze how screen time habits change as children grow older.

  2. Gender: The gender of the child (Male,Female,Other/Prefer not to say). Allows exploration of gender-based differences in screen time behavior.

  3. Screen Type Time: The category of screen use being measured. Includes data on educational, recreational, and total screen time.

  4. Day Type: Indicates whether the data was collected for a weekday or weekend. Helps analyze how screen time varies between school days and off days.

  5. Average Screen Time (hours): The average number of hours spent on screens per day for the given category.

  6. Sample Size: Number of survey respondents represented by the data point. Larger sample sizes usually mean more reliable data.

Import Data

getwd()
[1] "/Users/chamudi/Desktop/RMIT/1st Year 1st Semester/Data Wrangling/Assignments/Updated Assignment 1"
screen_time_ds <- read.csv('Datasets/screen_time.csv')

head(screen_time_ds)
str(screen_time_ds) #to show the structure of the data (types, columns, etc.)
'data.frame':   198 obs. of  6 variables:
 $ Age                        : int  5 5 5 5 5 5 5 5 5 5 ...
 $ Gender                     : chr  "Male" "Male" "Male" "Male" ...
 $ Screen.Time.Type           : chr  "Educational" "Recreational" "Total" "Educational" ...
 $ Day.Type                   : chr  "Weekday" "Weekday" "Weekday" "Weekend" ...
 $ Average.Screen.Time..hours.: num  0.44 1.11 1.55 0.5 1.44 1.93 0.49 0.96 1.45 0.5 ...
 $ Sample.Size                : int  500 500 500 500 500 500 500 500 500 500 ...
summary(screen_time_ds) #to get descriptive statistics
      Age        Gender          Screen.Time.Type     Day.Type        
 Min.   : 5   Length:198         Length:198         Length:198        
 1st Qu.: 7   Class :character   Class :character   Class :character  
 Median :10   Mode  :character   Mode  :character   Mode  :character  
 Mean   :10                                                           
 3rd Qu.:13                                                           
 Max.   :15                                                           
 Average.Screen.Time..hours.  Sample.Size 
 Min.   :0.440               Min.   :300  
 1st Qu.:1.403               1st Qu.:340  
 Median :2.490               Median :400  
 Mean   :2.993               Mean   :400  
 3rd Qu.:4.397               3rd Qu.:460  
 Max.   :8.190               Max.   :500  
dim(screen_time_ds) #number of rows and columns
[1] 198   6
names(screen_time_ds) #column names
[1] "Age"                         "Gender"                     
[3] "Screen.Time.Type"            "Day.Type"                   
[5] "Average.Screen.Time..hours." "Sample.Size"                

First I downloaded a csv data set from Kaggle. Then loaded the libraries. Then I made sure which working directory I am working in. And then using the read.csv package, I imported the data set into an object called ‘screen_time_ds’. Next I loaded the first few rows of the data frame to confirm that the data was read correctly.

I have used other outputs, beside head().

In R, when we use read.csv() and assign it to a object (like screen_time_ds), we are storing the data set in a data frame. In R, a data frame is simply an object that holds tabular data, and by default, read.csv() returns a data frame.

Inspect and Understand

#Check the dimensions of the data frame.
dim(screen_time_ds) 
[1] 198   6
#Check the column names in the data frame, rename them if required.
colnames(screen_time_ds)
[1] "Age"                         "Gender"                     
[3] "Screen.Time.Type"            "Day.Type"                   
[5] "Average.Screen.Time..hours." "Sample.Size"                
screen_time_ds <- screen_time_ds %>%
  rename(
    Screen_Type = Screen.Time.Type,
    Day_Type = Day.Type,
    Avg_Screen_Time = Average.Screen.Time..hours.,
    Sample_Size = Sample.Size
  )

#Summaries the types of variables

sapply(screen_time_ds, class) #https://stackoverflow.com/questions/21125222/determine-the-data-types-of-a-data-frames-columns
            Age          Gender     Screen_Type        Day_Type Avg_Screen_Time 
      "integer"     "character"     "character"     "character"       "numeric" 
    Sample_Size 
      "integer" 
str(screen_time_ds)
'data.frame':   198 obs. of  6 variables:
 $ Age            : int  5 5 5 5 5 5 5 5 5 5 ...
 $ Gender         : chr  "Male" "Male" "Male" "Male" ...
 $ Screen_Type    : chr  "Educational" "Recreational" "Total" "Educational" ...
 $ Day_Type       : chr  "Weekday" "Weekday" "Weekday" "Weekend" ...
 $ Avg_Screen_Time: num  0.44 1.11 1.55 0.5 1.44 1.93 0.49 0.96 1.45 0.5 ...
 $ Sample_Size    : int  500 500 500 500 500 500 500 500 500 500 ...
#Check the levels of factor variables, rename/rearrange them if required.
levels(screen_time_ds$Age)
NULL
levels(screen_time_ds$Gender)
NULL
levels(screen_time_ds$Screen_Type)
NULL
levels(screen_time_ds$Day_Type)
NULL
levels(screen_time_ds$Avg_Screen_Time)
NULL
levels(screen_time_ds$Sample_Size)
NULL
#convert 'Gender' and 'Day_Type' character column into factor variable
screen_time_ds$Gender <- as.factor(screen_time_ds$Gender)
screen_time_ds$Day_Type <- as.factor(screen_time_ds$Day_Type)

#Check the levels of factor variables after converting
levels(screen_time_ds$Gender)
[1] "Female"                  "Male"                    "Other/Prefer not to say"
levels(screen_time_ds$Day_Type)
[1] "Weekday" "Weekend"
str(screen_time_ds)
'data.frame':   198 obs. of  6 variables:
 $ Age            : int  5 5 5 5 5 5 5 5 5 5 ...
 $ Gender         : Factor w/ 3 levels "Female","Male",..: 2 2 2 2 2 2 1 1 1 1 ...
 $ Screen_Type    : chr  "Educational" "Recreational" "Total" "Educational" ...
 $ Day_Type       : Factor w/ 2 levels "Weekday","Weekend": 1 1 1 2 2 2 1 1 1 2 ...
 $ Avg_Screen_Time: num  0.44 1.11 1.55 0.5 1.44 1.93 0.49 0.96 1.45 0.5 ...
 $ Sample_Size    : int  500 500 500 500 500 500 500 500 500 500 ...

First, I checked the dimensions of the data frame. I used the dim() function and it gave the output 198 observations and 6 variables.

Secondly, I checked the column names in the data frame. I used the colnames() function to get the column names in the data frame. I decided to rename “Screen.Time.Type”, “Day.Type”, “Average.Screen.Time..hours.” and “Sample.Size” column names (replacing long and awkward column names with cleaner versions). Therefore I used rename() function. I saved new column names into the same object where the data set is saved before. I passed data frame using pipe operator for the rename().

Next, I got the summary of the data set. I used the ‘sapply(dataset,class)’ function. I used stack overflow to find a way other that str() function to do this task. Then I used str() and gave the structure summary of our data set, including the class/type of each column. All data types are correct in this data set. Therefore, there is no need of conversion.

If there is a incorrect type, it is given as integer and I want to make it as numeric, so, I use, screen_time_ds\('columnName' <- as.Numeric(screen_time_ds\)’columnName’) function.

Finally, Columns like Gender or Day_Type has a small set of categories, storing them as factors is more appropriate than as strings. So, I decided to change them into factor variables. I didn’t label those factor variables newly and I kept them as it is.

Sub-Setting

#subset data
subset_ds_10 <-screen_time_ds[1:10, ] #The comma , separates rows from columns.

#convert it to a matrix
matrix_10 <- as.matrix(subset_ds_10)
print(matrix_10)
   Age Gender   Screen_Type    Day_Type  Avg_Screen_Time Sample_Size
1  "5" "Male"   "Educational"  "Weekday" "0.44"          "500"      
2  "5" "Male"   "Recreational" "Weekday" "1.11"          "500"      
3  "5" "Male"   "Total"        "Weekday" "1.55"          "500"      
4  "5" "Male"   "Educational"  "Weekend" "0.50"          "500"      
5  "5" "Male"   "Recreational" "Weekend" "1.44"          "500"      
6  "5" "Male"   "Total"        "Weekend" "1.93"          "500"      
7  "5" "Female" "Educational"  "Weekday" "0.49"          "500"      
8  "5" "Female" "Recreational" "Weekday" "0.96"          "500"      
9  "5" "Female" "Total"        "Weekday" "1.45"          "500"      
10 "5" "Female" "Educational"  "Weekend" "0.50"          "500"      
str(matrix_10)
 chr [1:10, 1:6] "5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "Male" "Male" "Male" ...
 - attr(*, "dimnames")=List of 2
  ..$ : chr [1:10] "1" "2" "3" "4" ...
  ..$ : chr [1:6] "Age" "Gender" "Screen_Type" "Day_Type" ...

First, I had to subset data for first 10 observations with all variables. 1:10 means select rows from 1 to 10. The comma , separates rows from columns. Space after the comma means give all the columns. And I am saving the subset data into a new object call ‘subset_ds_10’.

Then to convert it for a matrix, I simply used the as.matrix() function to convert the data frame into a matrix and saved it in a new object called ‘matrix_10’.

A matrix can only hold one data type. In my data frame, I have both numbers and characters (like Age and Gender), R will convert everything into character strings in the matrix. So, we can see that after using the str(matrix_10), it gives the summary as all are chr now.

Create a new Data Frame

# Create integer variable (Number of minutes the child spends on physical activity)
physical_activity_minutes <- c(60,30,20,120,40,20,100,15,10,90)

# Create ordinal variable (Parental monitoring or restrictions over the child’s screen usage)
parental_control_level <- c("Low", "High", "High", "None", "Moderate", "High", "None", "High", "High", "Low") 

str(parental_control_level)
 chr [1:10] "Low" "High" "High" "None" "Moderate" "High" "None" "High" "High" ...
class(parental_control_level)
[1] "character"
# Convert parental_control_level to ordered factor
parental_control_level <- factor(parental_control_level, 
                                 levels = c("None", "Low", "Moderate", "High"),
                                 ordered = TRUE)
str(parental_control_level)
 Ord.factor w/ 4 levels "None"<"Low"<"Moderate"<..: 2 4 4 1 3 4 1 4 4 2
levels(parental_control_level)
[1] "None"     "Low"      "Moderate" "High"    
class(parental_control_level)
[1] "ordered" "factor" 
# Combine into data frame
child_df <- data.frame(Physical_Activity_Minutes = physical_activity_minutes, Parental_Control_Level = parental_control_level)

str(child_df)
'data.frame':   10 obs. of  2 variables:
 $ Physical_Activity_Minutes: num  60 30 20 120 40 20 100 15 10 90
 $ Parental_Control_Level   : Ord.factor w/ 4 levels "None"<"Low"<"Moderate"<..: 2 4 4 1 3 4 1 4 4 2
# Create numeric variable (Sleep Duration (hours))
sleep_duration_hours <- c(9.2,8.7, 7.5, 9.0, 6.8, 8.3, 7.0, 9.5, 6.5, 8.0)

#use cbind() to add this vector to your data frame.
child_df <- cbind(child_df, sleep_duration_hours)

#get dimensions 
dim(child_df)
[1] 10  3
str(child_df)
'data.frame':   10 obs. of  3 variables:
 $ Physical_Activity_Minutes: num  60 30 20 120 40 20 100 15 10 90
 $ Parental_Control_Level   : Ord.factor w/ 4 levels "None"<"Low"<"Moderate"<..: 2 4 4 1 3 4 1 4 4 2
 $ sleep_duration_hours     : num  9.2 8.7 7.5 9 6.8 8.3 7 9.5 6.5 8

Even though it is independent from the previous data set, I made one integer variable and ordinal variable which goes with my previous data set. For each,it has 10 observations. ‘parental_control_level’ class is character. As per instructed, I converted ordinal variable in to a ordered factor variable. Then I got the class as “ordered” “factor”. And using the data.frame (), I finally made the data frame using integer variable and ordered factor variable. Again created a numeric variable. Using cbind() function, I added the new numeric vector variable with the previous data frame. Using dim() function, it confirms that in the end there are 10 observations with 3 variables.

Presentation

Presentation link: https://rmit-arc.instructuremedia.com/embed/f20ce682-1340-4aba-b1a5-3ff3139a24d1

References

Stack overflow (2025), Stack overflow website, accessed 09 April 2025. https://stackoverflow.com/questions/21125222/determine-the-data-types-of-a-data-frames-columns

W3Schools (2025) R Tutorial, w3schools website, accessed 29 March 2025. https://www.w3schools.com/r/r_data_frames.asp

AKSHAY KUMAR (2025) Average Daily Screen Time for Children, Kaggle website, accessed 29 March 2025. https://www.kaggle.com/datasets/ak0212/average-daily-screen-time-for-children

DataCamp (2024) Subsetting in R Tutorial, datacamp website, 10 April 2025. https://www.datacamp.com/tutorial/subsets-in-r

LS0tCnRpdGxlOiAiRGF0YSBXcmFuZ2xpbmcgKERhdGEgUHJlcHJvY2Vzc2luZykiIAphdXRob3I6ICJDaGFtdWRpIEFiZXlzaW5naGUiCnN1YnRpdGxlOiBQcmFjdGljYWwgQXNzZXNzbWVudCAxCmRhdGU6ICIzMS8wMy8yMDI1IgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdCAKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0Ci0tLQoKIyMgKipTZXR1cDogTG9hZCBwYWNrYWdlcyoqCgpgYGB7cn0KbGlicmFyeShyZWFkcikKbGlicmFyeShkcGx5cikgCmxpYnJhcnkoa2FibGVFeHRyYSkgI2VuaGFuY2UgYW5kIGN1c3RvbWl6ZSB0YWJsZXMKbGlicmFyeShtYWdyaXR0cikgI3Byb3ZpZGVzIHBpcGUgb3BlcmF0b3IKYGBgCgoKIyMgKipHcm91cCBJbmZvcm1hdGlvbioqCmBgYHtyLCBlY2hvPUZBTFNFfQoKbmE8LSBjKCJDaGFtdWRpIEFiZXlzaW5naGUiKQpubzwtIGMoInM0MTUwMzAzIikKcGM8LSBjKCIxMDAlIikKCnM8LSBkYXRhLmZyYW1lKGNiaW5kKG5hLG5vLHBjKSkKY29sbmFtZXMocyk8LSBjKCJTdHVkZW50IG5hbWUiLCAiU3R1ZGVudCBudW1iZXIiLCAiUGVyY2VudGFnZSBvZiBjb250cmlidXRpb24iKQoKcyAlPiUga2JsKGNhcHRpb24gPSAiR3JvdXAgSW5mb3JtYXRpb24iKSAlPiUKICBrYWJsZV9jbGFzc2ljKGZ1bGxfd2lkdGggPSBGLCBodG1sX2ZvbnQgPSAiQ2FtYnJpYSIpCgpgYGAKCiMjICoqRGVzY3JpcHRpb24gb2YgdGhlIERhdGEqKgoKQUtTSEFZIEtVTUFSICgyMDI1KSBzdGF0ZXMgdGhhdCAnVGhpcyBkYXRhcyByZWFsLXdvcmxkIHRyZW5kcyBpbiBjaGlsZHJlbidzIHNjcmVlbiB0aW1lIHVzYWdlLiBJdCBpbmNsdWRlcyBkYXRhIG9uIGVkdWNhdGlvbmFsLCByZWNyZWF0aW9uYWwsIGFuZCB0b3RhbCBzY3JlZW4gdGltZSBmb3IgY2hpbGRyZW4gYWdlZCA1IHRvIDE1IHllYXJzLCB3aXRoIGJyZWFrZG93bnMgYnkgZ2VuZGVyIChNYWxlLCBGZW1hbGUsIE90aGVyL1ByZWZlciBub3QgdG8gc2F5KSBhbmQgZGF5IHR5cGUgKFdlZWtkYXksIFdlZWtlbmQpJy4gCgpBdmFpbGFibGUgYXQ6aHR0cHM6Ly93d3cua2FnZ2xlLmNvbS9kYXRhc2V0cy9hazAyMTIvYXZlcmFnZS1kYWlseS1zY3JlZW4tdGltZS1mb3ItY2hpbGRyZW4KClZhcmlhYmxlIERlc2NyaXB0aW9uOgoKMS4gQWdlOiBDaGlsZHJlbiBhZ2UgYmV0d2VlbiA1LTE1IHllYXJzLiBIZWxwcyBhbmFseXplIGhvdyBzY3JlZW4gdGltZSBoYWJpdHMgY2hhbmdlIGFzIGNoaWxkcmVuIGdyb3cgb2xkZXIuCgoyLiBHZW5kZXI6IFRoZSBnZW5kZXIgb2YgdGhlIGNoaWxkIChNYWxlLEZlbWFsZSxPdGhlci9QcmVmZXIgbm90IHRvIHNheSkuIEFsbG93cyBleHBsb3JhdGlvbiBvZiBnZW5kZXItYmFzZWQgZGlmZmVyZW5jZXMgaW4gc2NyZWVuIHRpbWUgYmVoYXZpb3IuCgozLiBTY3JlZW4gVHlwZSBUaW1lOiBUaGUgY2F0ZWdvcnkgb2Ygc2NyZWVuIHVzZSBiZWluZyBtZWFzdXJlZC4gSW5jbHVkZXMgZGF0YSBvbiBlZHVjYXRpb25hbCwgcmVjcmVhdGlvbmFsLCBhbmQgdG90YWwgc2NyZWVuIHRpbWUuIAoKNC4gRGF5IFR5cGU6IEluZGljYXRlcyB3aGV0aGVyIHRoZSBkYXRhIHdhcyBjb2xsZWN0ZWQgZm9yIGEgd2Vla2RheSBvciB3ZWVrZW5kLiBIZWxwcyBhbmFseXplIGhvdyBzY3JlZW4gdGltZSB2YXJpZXMgYmV0d2VlbiBzY2hvb2wgZGF5cyBhbmQgb2ZmIGRheXMuCgo1LiBBdmVyYWdlIFNjcmVlbiBUaW1lIChob3Vycyk6IFRoZSBhdmVyYWdlIG51bWJlciBvZiBob3VycyBzcGVudCBvbiBzY3JlZW5zIHBlciBkYXkgZm9yIHRoZSBnaXZlbiBjYXRlZ29yeS4gCgo2LiBTYW1wbGUgU2l6ZTogTnVtYmVyIG9mIHN1cnZleSByZXNwb25kZW50cyByZXByZXNlbnRlZCBieSB0aGUgZGF0YSBwb2ludC4gTGFyZ2VyIHNhbXBsZSBzaXplcyB1c3VhbGx5IG1lYW4gbW9yZSByZWxpYWJsZSBkYXRhLgoKCiMjICoqSW1wb3J0IERhdGEqKgoKYGBge3J9CmdldHdkKCkKc2NyZWVuX3RpbWVfZHMgPC0gcmVhZC5jc3YoJ0RhdGFzZXRzL3NjcmVlbl90aW1lLmNzdicpCgpoZWFkKHNjcmVlbl90aW1lX2RzKQpzdHIoc2NyZWVuX3RpbWVfZHMpICN0byBzaG93IHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGRhdGEgKHR5cGVzLCBjb2x1bW5zLCBldGMuKQpzdW1tYXJ5KHNjcmVlbl90aW1lX2RzKSAjdG8gZ2V0IGRlc2NyaXB0aXZlIHN0YXRpc3RpY3MKZGltKHNjcmVlbl90aW1lX2RzKSAjbnVtYmVyIG9mIHJvd3MgYW5kIGNvbHVtbnMKbmFtZXMoc2NyZWVuX3RpbWVfZHMpICNjb2x1bW4gbmFtZXMKYGBgCkZpcnN0IEkgZG93bmxvYWRlZCBhIGNzdiBkYXRhIHNldCBmcm9tIEthZ2dsZS4gVGhlbiBsb2FkZWQgdGhlIGxpYnJhcmllcy4gVGhlbiBJIG1hZGUgc3VyZSB3aGljaCB3b3JraW5nIGRpcmVjdG9yeSBJIGFtIHdvcmtpbmcgaW4uIEFuZCB0aGVuIHVzaW5nIHRoZSByZWFkLmNzdiBwYWNrYWdlLCBJIGltcG9ydGVkIHRoZSBkYXRhIHNldCBpbnRvIGFuIG9iamVjdCBjYWxsZWQgJ3NjcmVlbl90aW1lX2RzJy4gTmV4dCBJIGxvYWRlZCB0aGUgZmlyc3QgZmV3IHJvd3Mgb2YgdGhlIGRhdGEgZnJhbWUgdG8gY29uZmlybSB0aGF0IHRoZSBkYXRhIHdhcyByZWFkIGNvcnJlY3RseS4gCgpJIGhhdmUgdXNlZCBvdGhlciBvdXRwdXRzLCBiZXNpZGUgaGVhZCgpLgoKSW4gUiwgd2hlbiB3ZSB1c2UgcmVhZC5jc3YoKSBhbmQgYXNzaWduIGl0IHRvIGEgb2JqZWN0IChsaWtlIHNjcmVlbl90aW1lX2RzKSwgd2UgYXJlIHN0b3JpbmcgdGhlIGRhdGEgc2V0IGluIGEgZGF0YSBmcmFtZS4gSW4gUiwgYSBkYXRhIGZyYW1lIGlzIHNpbXBseSBhbiBvYmplY3QgdGhhdCBob2xkcyB0YWJ1bGFyIGRhdGEsIGFuZCBieSBkZWZhdWx0LCByZWFkLmNzdigpIHJldHVybnMgYSBkYXRhIGZyYW1lLgoKIyMgKipJbnNwZWN0IGFuZCBVbmRlcnN0YW5kKioKCmBgYHtyfQojQ2hlY2sgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIGRhdGEgZnJhbWUuCmRpbShzY3JlZW5fdGltZV9kcykgCgojQ2hlY2sgdGhlIGNvbHVtbiBuYW1lcyBpbiB0aGUgZGF0YSBmcmFtZSwgcmVuYW1lIHRoZW0gaWYgcmVxdWlyZWQuCmNvbG5hbWVzKHNjcmVlbl90aW1lX2RzKQoKc2NyZWVuX3RpbWVfZHMgPC0gc2NyZWVuX3RpbWVfZHMgJT4lCiAgcmVuYW1lKAogICAgU2NyZWVuX1R5cGUgPSBTY3JlZW4uVGltZS5UeXBlLAogICAgRGF5X1R5cGUgPSBEYXkuVHlwZSwKICAgIEF2Z19TY3JlZW5fVGltZSA9IEF2ZXJhZ2UuU2NyZWVuLlRpbWUuLmhvdXJzLiwKICAgIFNhbXBsZV9TaXplID0gU2FtcGxlLlNpemUKICApCgojU3VtbWFyaWVzIHRoZSB0eXBlcyBvZiB2YXJpYWJsZXMKCnNhcHBseShzY3JlZW5fdGltZV9kcywgY2xhc3MpICNodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yMTEyNTIyMi9kZXRlcm1pbmUtdGhlLWRhdGEtdHlwZXMtb2YtYS1kYXRhLWZyYW1lcy1jb2x1bW5zCnN0cihzY3JlZW5fdGltZV9kcykKCiNDaGVjayB0aGUgbGV2ZWxzIG9mIGZhY3RvciB2YXJpYWJsZXMsIHJlbmFtZS9yZWFycmFuZ2UgdGhlbSBpZiByZXF1aXJlZC4KbGV2ZWxzKHNjcmVlbl90aW1lX2RzJEFnZSkKbGV2ZWxzKHNjcmVlbl90aW1lX2RzJEdlbmRlcikKbGV2ZWxzKHNjcmVlbl90aW1lX2RzJFNjcmVlbl9UeXBlKQpsZXZlbHMoc2NyZWVuX3RpbWVfZHMkRGF5X1R5cGUpCmxldmVscyhzY3JlZW5fdGltZV9kcyRBdmdfU2NyZWVuX1RpbWUpCmxldmVscyhzY3JlZW5fdGltZV9kcyRTYW1wbGVfU2l6ZSkKCiNjb252ZXJ0ICdHZW5kZXInIGFuZCAnRGF5X1R5cGUnIGNoYXJhY3RlciBjb2x1bW4gaW50byBmYWN0b3IgdmFyaWFibGUKc2NyZWVuX3RpbWVfZHMkR2VuZGVyIDwtIGFzLmZhY3RvcihzY3JlZW5fdGltZV9kcyRHZW5kZXIpCnNjcmVlbl90aW1lX2RzJERheV9UeXBlIDwtIGFzLmZhY3RvcihzY3JlZW5fdGltZV9kcyREYXlfVHlwZSkKCiNDaGVjayB0aGUgbGV2ZWxzIG9mIGZhY3RvciB2YXJpYWJsZXMgYWZ0ZXIgY29udmVydGluZwpsZXZlbHMoc2NyZWVuX3RpbWVfZHMkR2VuZGVyKQpsZXZlbHMoc2NyZWVuX3RpbWVfZHMkRGF5X1R5cGUpCgpzdHIoc2NyZWVuX3RpbWVfZHMpCgpgYGAKRmlyc3QsIEkgY2hlY2tlZCB0aGUgZGltZW5zaW9ucyBvZiB0aGUgZGF0YSBmcmFtZS4gSSB1c2VkIHRoZSBkaW0oKSBmdW5jdGlvbiBhbmQgaXQgZ2F2ZSB0aGUgb3V0cHV0IDE5OCBvYnNlcnZhdGlvbnMgYW5kIDYgdmFyaWFibGVzLgoKU2Vjb25kbHksIEkgY2hlY2tlZCB0aGUgY29sdW1uIG5hbWVzIGluIHRoZSBkYXRhIGZyYW1lLiBJIHVzZWQgdGhlIGNvbG5hbWVzKCkgZnVuY3Rpb24gdG8gZ2V0IHRoZSBjb2x1bW4gbmFtZXMgaW4gdGhlIGRhdGEgZnJhbWUuIEkgZGVjaWRlZCB0byByZW5hbWUgIlNjcmVlbi5UaW1lLlR5cGUiLCAiRGF5LlR5cGUiLCAiQXZlcmFnZS5TY3JlZW4uVGltZS4uaG91cnMuIiBhbmQgIlNhbXBsZS5TaXplIiBjb2x1bW4gbmFtZXMgKHJlcGxhY2luZyBsb25nIGFuZCBhd2t3YXJkIGNvbHVtbiBuYW1lcyB3aXRoIGNsZWFuZXIgdmVyc2lvbnMpLiBUaGVyZWZvcmUgSSB1c2VkIHJlbmFtZSgpIGZ1bmN0aW9uLiBJIHNhdmVkIG5ldyBjb2x1bW4gbmFtZXMgaW50byB0aGUgc2FtZSBvYmplY3Qgd2hlcmUgdGhlIGRhdGEgc2V0IGlzIHNhdmVkIGJlZm9yZS4gSSBwYXNzZWQgZGF0YSBmcmFtZSB1c2luZyBwaXBlIG9wZXJhdG9yIGZvciB0aGUgcmVuYW1lKCkuIAoKTmV4dCwgSSBnb3QgdGhlIHN1bW1hcnkgb2YgdGhlIGRhdGEgc2V0LiBJIHVzZWQgdGhlICdzYXBwbHkoZGF0YXNldCxjbGFzcyknIGZ1bmN0aW9uLiBJIHVzZWQgc3RhY2sgb3ZlcmZsb3cgdG8gZmluZCBhIHdheSBvdGhlciB0aGF0IHN0cigpIGZ1bmN0aW9uIHRvIGRvIHRoaXMgdGFzay4gVGhlbiBJIHVzZWQgc3RyKCkgYW5kIGdhdmUgdGhlIHN0cnVjdHVyZSBzdW1tYXJ5IG9mIG91ciBkYXRhIHNldCwgaW5jbHVkaW5nIHRoZSBjbGFzcy90eXBlIG9mIGVhY2ggY29sdW1uLiBBbGwgZGF0YSB0eXBlcyBhcmUgY29ycmVjdCBpbiB0aGlzIGRhdGEgc2V0LiBUaGVyZWZvcmUsIHRoZXJlIGlzIG5vIG5lZWQgb2YgY29udmVyc2lvbi4gCgpJZiB0aGVyZSBpcyBhIGluY29ycmVjdCB0eXBlLCBpdCBpcyBnaXZlbiBhcyBpbnRlZ2VyIGFuZCBJIHdhbnQgdG8gbWFrZSBpdCBhcyBudW1lcmljLCBzbywgSSB1c2UsIHNjcmVlbl90aW1lX2RzJCdjb2x1bW5OYW1lJyA8LSBhcy5OdW1lcmljKHNjcmVlbl90aW1lX2RzJCdjb2x1bW5OYW1lJykgZnVuY3Rpb24uIAoKRmluYWxseSwgQ29sdW1ucyBsaWtlIEdlbmRlciBvciBEYXlfVHlwZSBoYXMgYSBzbWFsbCBzZXQgb2YgY2F0ZWdvcmllcywgc3RvcmluZyB0aGVtIGFzIGZhY3RvcnMgaXMgbW9yZSBhcHByb3ByaWF0ZSB0aGFuIGFzIHN0cmluZ3MuIFNvLCBJIGRlY2lkZWQgdG8gY2hhbmdlIHRoZW0gaW50byBmYWN0b3IgdmFyaWFibGVzLiBJIGRpZG4ndCBsYWJlbCB0aG9zZSBmYWN0b3IgdmFyaWFibGVzIG5ld2x5IGFuZCBJIGtlcHQgdGhlbSBhcyBpdCBpcy4gCgojIyAqKlN1Yi1TZXR0aW5nKiogCgpgYGB7cn0KI3N1YnNldCBkYXRhCnN1YnNldF9kc18xMCA8LXNjcmVlbl90aW1lX2RzWzE6MTAsIF0gI1RoZSBjb21tYSAsIHNlcGFyYXRlcyByb3dzIGZyb20gY29sdW1ucy4KCiNjb252ZXJ0IGl0IHRvIGEgbWF0cml4Cm1hdHJpeF8xMCA8LSBhcy5tYXRyaXgoc3Vic2V0X2RzXzEwKQpwcmludChtYXRyaXhfMTApCgpzdHIobWF0cml4XzEwKQpgYGAKRmlyc3QsIEkgaGFkIHRvIHN1YnNldCBkYXRhIGZvciBmaXJzdCAxMCBvYnNlcnZhdGlvbnMgd2l0aCBhbGwgdmFyaWFibGVzLiAxOjEwIG1lYW5zIHNlbGVjdCByb3dzIGZyb20gMSB0byAxMC4gVGhlIGNvbW1hICwgc2VwYXJhdGVzIHJvd3MgZnJvbSBjb2x1bW5zLiBTcGFjZSBhZnRlciB0aGUgY29tbWEgbWVhbnMgZ2l2ZSBhbGwgdGhlIGNvbHVtbnMuIEFuZCBJIGFtIHNhdmluZyB0aGUgc3Vic2V0IGRhdGEgaW50byBhIG5ldyBvYmplY3QgY2FsbCAnc3Vic2V0X2RzXzEwJy4KClRoZW4gdG8gY29udmVydCBpdCBmb3IgYSBtYXRyaXgsIEkgc2ltcGx5IHVzZWQgdGhlIGFzLm1hdHJpeCgpIGZ1bmN0aW9uIHRvIGNvbnZlcnQgdGhlIGRhdGEgZnJhbWUgaW50byBhIG1hdHJpeCBhbmQgc2F2ZWQgaXQgaW4gYSBuZXcgb2JqZWN0IGNhbGxlZCAnbWF0cml4XzEwJy4gCgpBIG1hdHJpeCBjYW4gb25seSBob2xkIG9uZSBkYXRhIHR5cGUuIEluIG15IGRhdGEgZnJhbWUsIEkgaGF2ZSBib3RoIG51bWJlcnMgYW5kIGNoYXJhY3RlcnMgKGxpa2UgQWdlIGFuZCBHZW5kZXIpLCBSIHdpbGwgY29udmVydCBldmVyeXRoaW5nIGludG8gY2hhcmFjdGVyIHN0cmluZ3MgaW4gdGhlIG1hdHJpeC4gU28sIHdlIGNhbiBzZWUgdGhhdCBhZnRlciB1c2luZyB0aGUgc3RyKG1hdHJpeF8xMCksIGl0IGdpdmVzIHRoZSBzdW1tYXJ5IGFzIGFsbCBhcmUgY2hyIG5vdy4gCgojIyAqKkNyZWF0ZSBhIG5ldyBEYXRhIEZyYW1lKioKCmBgYHtyfQojIENyZWF0ZSBpbnRlZ2VyIHZhcmlhYmxlIChOdW1iZXIgb2YgbWludXRlcyB0aGUgY2hpbGQgc3BlbmRzIG9uIHBoeXNpY2FsIGFjdGl2aXR5KQpwaHlzaWNhbF9hY3Rpdml0eV9taW51dGVzIDwtIGMoNjAsMzAsMjAsMTIwLDQwLDIwLDEwMCwxNSwxMCw5MCkKCiMgQ3JlYXRlIG9yZGluYWwgdmFyaWFibGUgKFBhcmVudGFsIG1vbml0b3Jpbmcgb3IgcmVzdHJpY3Rpb25zIG92ZXIgdGhlIGNoaWxk4oCZcyBzY3JlZW4gdXNhZ2UpCnBhcmVudGFsX2NvbnRyb2xfbGV2ZWwgPC0gYygiTG93IiwgIkhpZ2giLCAiSGlnaCIsICJOb25lIiwgIk1vZGVyYXRlIiwgIkhpZ2giLCAiTm9uZSIsICJIaWdoIiwgIkhpZ2giLCAiTG93IikgCgpzdHIocGFyZW50YWxfY29udHJvbF9sZXZlbCkKY2xhc3MocGFyZW50YWxfY29udHJvbF9sZXZlbCkKCiMgQ29udmVydCBwYXJlbnRhbF9jb250cm9sX2xldmVsIHRvIG9yZGVyZWQgZmFjdG9yCnBhcmVudGFsX2NvbnRyb2xfbGV2ZWwgPC0gZmFjdG9yKHBhcmVudGFsX2NvbnRyb2xfbGV2ZWwsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJOb25lIiwgIkxvdyIsICJNb2RlcmF0ZSIsICJIaWdoIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyZWQgPSBUUlVFKQpzdHIocGFyZW50YWxfY29udHJvbF9sZXZlbCkKbGV2ZWxzKHBhcmVudGFsX2NvbnRyb2xfbGV2ZWwpCmNsYXNzKHBhcmVudGFsX2NvbnRyb2xfbGV2ZWwpCgojIENvbWJpbmUgaW50byBkYXRhIGZyYW1lCmNoaWxkX2RmIDwtIGRhdGEuZnJhbWUoUGh5c2ljYWxfQWN0aXZpdHlfTWludXRlcyA9IHBoeXNpY2FsX2FjdGl2aXR5X21pbnV0ZXMsIFBhcmVudGFsX0NvbnRyb2xfTGV2ZWwgPSBwYXJlbnRhbF9jb250cm9sX2xldmVsKQoKc3RyKGNoaWxkX2RmKQoKIyBDcmVhdGUgbnVtZXJpYyB2YXJpYWJsZSAoU2xlZXAgRHVyYXRpb24gKGhvdXJzKSkKc2xlZXBfZHVyYXRpb25faG91cnMgPC0gYyg5LjIsOC43LCA3LjUsIDkuMCwgNi44LCA4LjMsIDcuMCwgOS41LCA2LjUsIDguMCkKCiN1c2UgY2JpbmQoKSB0byBhZGQgdGhpcyB2ZWN0b3IgdG8geW91ciBkYXRhIGZyYW1lLgpjaGlsZF9kZiA8LSBjYmluZChjaGlsZF9kZiwgc2xlZXBfZHVyYXRpb25faG91cnMpCgojZ2V0IGRpbWVuc2lvbnMgCmRpbShjaGlsZF9kZikKCnN0cihjaGlsZF9kZikKYGBgCkV2ZW4gdGhvdWdoIGl0IGlzIGluZGVwZW5kZW50IGZyb20gdGhlIHByZXZpb3VzIGRhdGEgc2V0LCBJIG1hZGUgb25lIGludGVnZXIgdmFyaWFibGUgYW5kIG9yZGluYWwgdmFyaWFibGUgd2hpY2ggZ29lcyB3aXRoIG15IHByZXZpb3VzIGRhdGEgc2V0LiBGb3IgZWFjaCxpdCBoYXMgMTAgb2JzZXJ2YXRpb25zLiAncGFyZW50YWxfY29udHJvbF9sZXZlbCcgY2xhc3MgaXMgY2hhcmFjdGVyLiBBcyBwZXIgaW5zdHJ1Y3RlZCwgSSBjb252ZXJ0ZWQgb3JkaW5hbCB2YXJpYWJsZSBpbiB0byBhIG9yZGVyZWQgZmFjdG9yIHZhcmlhYmxlLiBUaGVuIEkgZ290IHRoZSBjbGFzcyBhcyAib3JkZXJlZCIgImZhY3RvciIuIEFuZCB1c2luZyB0aGUgZGF0YS5mcmFtZSAoKSwgSSBmaW5hbGx5IG1hZGUgdGhlIGRhdGEgZnJhbWUgdXNpbmcgaW50ZWdlciB2YXJpYWJsZSBhbmQgb3JkZXJlZCBmYWN0b3IgdmFyaWFibGUuIEFnYWluIGNyZWF0ZWQgYSBudW1lcmljIHZhcmlhYmxlLiBVc2luZyBjYmluZCgpIGZ1bmN0aW9uLCBJIGFkZGVkIHRoZSBuZXcgbnVtZXJpYyB2ZWN0b3IgdmFyaWFibGUgd2l0aCB0aGUgcHJldmlvdXMgZGF0YSBmcmFtZS4gVXNpbmcgZGltKCkgZnVuY3Rpb24sIGl0IGNvbmZpcm1zIHRoYXQgaW4gdGhlIGVuZCB0aGVyZSBhcmUgMTAgb2JzZXJ2YXRpb25zIHdpdGggMyB2YXJpYWJsZXMuICAKCiMjCSoqUHJlc2VudGF0aW9uICoqClByZXNlbnRhdGlvbiBsaW5rOiBodHRwczovL3JtaXQtYXJjLmluc3RydWN0dXJlbWVkaWEuY29tL2VtYmVkL2YyMGNlNjgyLTEzNDAtNGFiYS1iMWE1LTNmZjMxMzlhMjRkMQoKIyMJKipSZWZlcmVuY2VzICoqCgpTdGFjayBvdmVyZmxvdyAoMjAyNSksIFN0YWNrIG92ZXJmbG93IHdlYnNpdGUsIGFjY2Vzc2VkIDA5IEFwcmlsIDIwMjUuIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzIxMTI1MjIyL2RldGVybWluZS10aGUtZGF0YS10eXBlcy1vZi1hLWRhdGEtZnJhbWVzLWNvbHVtbnMKClczU2Nob29scyAoMjAyNSkgUiBUdXRvcmlhbCwgdzNzY2hvb2xzIHdlYnNpdGUsIGFjY2Vzc2VkIDI5IE1hcmNoIDIwMjUuIGh0dHBzOi8vd3d3Lnczc2Nob29scy5jb20vci9yX2RhdGFfZnJhbWVzLmFzcAoKQUtTSEFZIEtVTUFSICgyMDI1KSBBdmVyYWdlIERhaWx5IFNjcmVlbiBUaW1lIGZvciBDaGlsZHJlbiwgS2FnZ2xlIHdlYnNpdGUsIGFjY2Vzc2VkIDI5IE1hcmNoIDIwMjUuIGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vZGF0YXNldHMvYWswMjEyL2F2ZXJhZ2UtZGFpbHktc2NyZWVuLXRpbWUtZm9yLWNoaWxkcmVuCgpEYXRhQ2FtcCAoMjAyNCkgU3Vic2V0dGluZyBpbiBSIFR1dG9yaWFsLCBkYXRhY2FtcCB3ZWJzaXRlLCAxMCBBcHJpbCAyMDI1LiBodHRwczovL3d3dy5kYXRhY2FtcC5jb20vdHV0b3JpYWwvc3Vic2V0cy1pbi1yCg==