### 0-6 MOnth= Kitten 
### 6-24 Month = Young
### 24 Month above = Adult

### Age Wise Prevalence of FPV 
library(readxl)
fpv <- read_excel("fpv.xlsx")
View(fpv)
# Create age groups based on the 'Months' column
fpv$age_group = cut(fpv$Months,
                    breaks = c(-Inf, 6, 24, Inf),
                    labels = c("Kitten (<= 6 Months)", "Young (>6 to 24 Months)", "Adult (> 24 Months)"),
                    right = TRUE)

# Count samples in each age group
age_group_counts = table(fpv$age_group)

# Convert the table to a data frame
age_group_df = as.data.frame(age_group_counts)

# Rename the columns for clarity
colnames(age_group_df) = c("Age Group", "Total")

# Display the counts in table form
print(age_group_df)
# Create age groups based on the 'Months' column
fpv$age_group = cut(fpv$Months,
                    breaks = c(-Inf, 6, 24, Inf),
                    labels = c("Kitten (<= 6 Months)", "Young (>6 to 24 Months)", "Adult (> 24 Months)"),
                    right = TRUE)

# Create a subset of the data with "FPV" diagnoses
fpv_fpv = fpv[fpv$`Diagnosis based on clinical signs and rapid test` == "FPV", ]

# Count the number of FPV cases in each age group
fpv_age_group_counts = table(fpv_fpv$age_group)

# Convert the table to a data frame
fpv_age_group_df = as.data.frame(fpv_age_group_counts)

# Rename the columns
colnames(fpv_age_group_df) = c("Age Group", "Positive")

# Display the counts in table form
print(fpv_age_group_df)
# Create age groups based on the 'Months' column
fpv$age_group = cut(fpv$Months,
                    breaks = c(-Inf, 6, 24, Inf),
                    labels = c("Kitten (<= 6 Months)", "Young (>6 to 24 Months)", "Adult (> 24 Months)"),
                    right = TRUE)

# Count total samples in each age group
age_group_counts = table(fpv$age_group)

# Create a subset of the data with "FPV" diagnoses
fpv_fpv = fpv[fpv$`Diagnosis based on clinical signs and rapid test` == "FPV", ]

# Count the number of FPV cases in each age group
fpv_age_group_counts = table(fpv_fpv$age_group)

# Convert the counts to data frames
age_group_df = as.data.frame(age_group_counts)
fpv_age_group_df = as.data.frame(fpv_age_group_counts)

# Rename the columns
colnames(age_group_df) = c("Age Group", "Total")
colnames(fpv_age_group_df) = c("Age Group", "Positive")

# Merge the total and positive counts into one data frame
merged_df = merge(age_group_df, fpv_age_group_df, by = "Age Group", all.x = TRUE)

# Fill NAs with 0 for age groups with no positive cases
merged_df$Positive[is.na(merged_df$Positive)] = 0

# Calculate prevalence
merged_df$Prevalence = (merged_df$Positive / merged_df$Total) * 100

# Display the final counts with prevalence
print(merged_df)
# Count samples in each sex group
sex_group_counts = table(fpv$Sex)

# Convert the table to a data frame
sex_group_df = as.data.frame(sex_group_counts)

# Rename the columns for clarity
colnames(sex_group_df) = c("Sex", "Total")

# Display the counts in table form
print(sex_group_df)
NA
# Create a subset of the data with "FPV" diagnoses
fpv_fpv = fpv[fpv$`Diagnosis based on clinical signs and rapid test` == "FPV", ]

# Count the number of FPV cases in each sex group
fpv_sex_counts = table(fpv_fpv$Sex)

# Convert the table to a data frame
fpv_sex_df = as.data.frame(fpv_sex_counts)

# Rename the columns for clarity
colnames(fpv_sex_df) = c("Sex", "Positive")

# Display the counts in table form
print(fpv_sex_df)
NA
# Count samples with "Diarrhoea"
diarrhoea_only = sum(fpv$Signs == "Diarrhoea")
print(diarrhoea_only)
[1] 10
# Count how many entries in the "Signs" column contain "diarrhoea"
##Mistake in Data Entry, contains both diarrhoea and Diarrhorea in spelling 
diarrhoea_count = sum(grepl("diarrhoea", fpv$Signs, ignore.case = TRUE))
diarrhorea_count = sum(grepl("Diarrhorea", fpv$Signs, ignore.case = TRUE))
Diarrhoetic_Cat = diarrhoea_count + diarrhorea_count
# Count the total number of entries in the "Signs" column
total_entries = nrow(fpv)
# Calculate the non-diarrhoetic count
non_diarrhoetic_count = total_entries - Diarrhoetic_Cat
# Print the result
print(Diarrhoetic_Cat)
[1] 53
print(non_diarrhoetic_count)
[1] 284
# Create subsets for diarrhoetic and non-diarrhoetic cases
diarrhoetic_cases = fpv[grepl("diarrhoea", fpv$Signs, ignore.case = TRUE) | grepl("Diarrhorea", fpv$Signs, ignore.case = TRUE), ]
non_diarrhoetic_cases = fpv[!(grepl("diarrhoea", fpv$Signs, ignore.case = TRUE) | grepl("Diarrhorea", fpv$Signs, ignore.case = TRUE)), ]

# Count how many FPV cases are in the diarrhoetic subset
fpv_diarrhoetic_count = sum(diarrhoetic_cases$`Diagnosis based on clinical signs and rapid test` == "FPV")

# Count how many FPV cases are in the non-diarrhoetic subset
fpv_non_diarrhoetic_count = sum(non_diarrhoetic_cases$`Diagnosis based on clinical signs and rapid test` == "FPV")

# Print the results
cat("FPV cases among Diarrhoetic:", fpv_diarrhoetic_count, "\n")
FPV cases among Diarrhoetic: 23 
cat("FPV cases among Non-Diarrhoetic:", fpv_non_diarrhoetic_count, "\n")
FPV cases among Non-Diarrhoetic: 10 
# Count how many entries in the "Breed" column contain "Local"
local_count = sum(grepl("local", fpv$Breed, ignore.case = TRUE))
Persian_count = sum(grepl("Persian", fpv$Breed, ignore.case = TRUE))
Domestic_short_hair_count = sum(grepl("short hair", fpv$Breed, ignore.case = TRUE)) 
Domestic_long_hair_count = sum(grepl("long hair", fpv$Breed, ignore.case = TRUE))
Others_count = sum(grepl("Others", fpv$Breed, ignore.case = TRUE))
#Mistake in Data Entry
Ohers_count = sum(grepl("Ohers", fpv$Breed, ignore.case = TRUE))

Others = Others_count + Ohers_count

total_type = local_count + Persian_count + Domestic_short_hair_count + Domestic_long_hair_count + Others
#Print
print(local_count)
[1] 153
print(Persian_count)
[1] 101
print(Domestic_short_hair_count)
[1] 21
print(Domestic_long_hair_count)
[1] 15
print(Others)
[1] 47
print(total_type)
[1] 337
# Initialize counts for each breed with FPV
local_fpv_count = sum(grepl("local", fpv$Breed, ignore.case = TRUE) & fpv$`Diagnosis based on clinical signs and rapid test` == "FPV")
persian_fpv_count = sum(grepl("Persian", fpv$Breed, ignore.case = TRUE) & fpv$`Diagnosis based on clinical signs and rapid test` == "FPV")
domestic_short_hair_fpv_count = sum(grepl("short hair", fpv$Breed, ignore.case = TRUE) & fpv$`Diagnosis based on clinical signs and rapid test` == "FPV")
domestic_long_hair_fpv_count = sum(grepl("long hair", fpv$Breed, ignore.case = TRUE) & fpv$`Diagnosis based on clinical signs and rapid test` == "FPV")
others_fpv_count = sum(grepl("Others", fpv$Breed, ignore.case = TRUE) & fpv$`Diagnosis based on clinical signs and rapid test` == "FPV")
ohers_fpv_count = sum(grepl("Ohers", fpv$Breed, ignore.case = TRUE) & fpv$`Diagnosis based on clinical signs and rapid test` == "FPV")

# Calculate total FPV cases for Others category
total_others_fpv = others_fpv_count + ohers_fpv_count

# Print results
cat("FPV Count in Local Breed:", local_fpv_count, "\n")
FPV Count in Local Breed: 14 
cat("FPV Count in Persian Breed:", persian_fpv_count, "\n")
FPV Count in Persian Breed: 10 
cat("FPV Count in Domestic Short Hair Breed:", domestic_short_hair_fpv_count, "\n")
FPV Count in Domestic Short Hair Breed: 4 
cat("FPV Count in Domestic Long Hair Breed:", domestic_long_hair_fpv_count, "\n")
FPV Count in Domestic Long Hair Breed: 3 
cat("Total FPV Count in Others Breed:", total_others_fpv, "\n")
Total FPV Count in Others Breed: 2 
LS0tDQp0aXRsZTogIkZQViBEQVRBIFNFVCINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQpgYGB7cn0NCiMjIyBEYXRhIExvYWQgDQpsaWJyYXJ5KHJlYWR4bCkNCmZwdiA8LSByZWFkX2V4Y2VsKCJmcHYueGxzeCIpDQpWaWV3KGZwdikNCg0KYGBgDQoNCg0KYGBge3J9DQojIENyZWF0ZSBhZ2UgZ3JvdXBzIGJhc2VkIG9uIHRoZSAnTW9udGhzJyBjb2x1bW4NCmZwdiRhZ2VfZ3JvdXAgPSBjdXQoZnB2JE1vbnRocywNCiAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygtSW5mLCA2LCAyNCwgSW5mKSwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiS2l0dGVuICg8PSA2IE1vbnRocykiLCAiWW91bmcgKD42IHRvIDI0IE1vbnRocykiLCAiQWR1bHQgKD4gMjQgTW9udGhzKSIpLA0KICAgICAgICAgICAgICAgICAgICByaWdodCA9IFRSVUUpDQoNCiMgQ291bnQgc2FtcGxlcyBpbiBlYWNoIGFnZSBncm91cA0KYWdlX2dyb3VwX2NvdW50cyA9IHRhYmxlKGZwdiRhZ2VfZ3JvdXApDQoNCiMgQ29udmVydCB0aGUgdGFibGUgdG8gYSBkYXRhIGZyYW1lDQphZ2VfZ3JvdXBfZGYgPSBhcy5kYXRhLmZyYW1lKGFnZV9ncm91cF9jb3VudHMpDQoNCiMgUmVuYW1lIHRoZSBjb2x1bW5zIGZvciBjbGFyaXR5DQpjb2xuYW1lcyhhZ2VfZ3JvdXBfZGYpID0gYygiQWdlIEdyb3VwIiwgIlRvdGFsIikNCg0KIyBEaXNwbGF5IHRoZSBjb3VudHMgaW4gdGFibGUgZm9ybQ0KcHJpbnQoYWdlX2dyb3VwX2RmKQ0KYGBgDQpgYGB7cn0NCiMgQ3JlYXRlIGFnZSBncm91cHMgYmFzZWQgb24gdGhlICdNb250aHMnIGNvbHVtbg0KZnB2JGFnZV9ncm91cCA9IGN1dChmcHYkTW9udGhzLA0KICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKC1JbmYsIDYsIDI0LCBJbmYpLA0KICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJLaXR0ZW4gKDw9IDYgTW9udGhzKSIsICJZb3VuZyAoPjYgdG8gMjQgTW9udGhzKSIsICJBZHVsdCAoPiAyNCBNb250aHMpIiksDQogICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gVFJVRSkNCg0KIyBDcmVhdGUgYSBzdWJzZXQgb2YgdGhlIGRhdGEgd2l0aCAiRlBWIiBkaWFnbm9zZXMNCmZwdl9mcHYgPSBmcHZbZnB2JGBEaWFnbm9zaXMgYmFzZWQgb24gY2xpbmljYWwgc2lnbnMgYW5kIHJhcGlkIHRlc3RgID09ICJGUFYiLCBdDQoNCiMgQ291bnQgdGhlIG51bWJlciBvZiBGUFYgY2FzZXMgaW4gZWFjaCBhZ2UgZ3JvdXANCmZwdl9hZ2VfZ3JvdXBfY291bnRzID0gdGFibGUoZnB2X2ZwdiRhZ2VfZ3JvdXApDQoNCiMgQ29udmVydCB0aGUgdGFibGUgdG8gYSBkYXRhIGZyYW1lDQpmcHZfYWdlX2dyb3VwX2RmID0gYXMuZGF0YS5mcmFtZShmcHZfYWdlX2dyb3VwX2NvdW50cykNCg0KIyBSZW5hbWUgdGhlIGNvbHVtbnMNCmNvbG5hbWVzKGZwdl9hZ2VfZ3JvdXBfZGYpID0gYygiQWdlIEdyb3VwIiwgIlBvc2l0aXZlIikNCg0KIyBEaXNwbGF5IHRoZSBjb3VudHMgaW4gdGFibGUgZm9ybQ0KcHJpbnQoZnB2X2FnZV9ncm91cF9kZikNCmBgYA0KYGBge3J9DQojIENyZWF0ZSBhZ2UgZ3JvdXBzIGJhc2VkIG9uIHRoZSAnTW9udGhzJyBjb2x1bW4NCmZwdiRhZ2VfZ3JvdXAgPSBjdXQoZnB2JE1vbnRocywNCiAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygtSW5mLCA2LCAyNCwgSW5mKSwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiS2l0dGVuICg8PSA2IE1vbnRocykiLCAiWW91bmcgKD42IHRvIDI0IE1vbnRocykiLCAiQWR1bHQgKD4gMjQgTW9udGhzKSIpLA0KICAgICAgICAgICAgICAgICAgICByaWdodCA9IFRSVUUpDQoNCiMgQ291bnQgdG90YWwgc2FtcGxlcyBpbiBlYWNoIGFnZSBncm91cA0KYWdlX2dyb3VwX2NvdW50cyA9IHRhYmxlKGZwdiRhZ2VfZ3JvdXApDQoNCiMgQ3JlYXRlIGEgc3Vic2V0IG9mIHRoZSBkYXRhIHdpdGggIkZQViIgZGlhZ25vc2VzDQpmcHZfZnB2ID0gZnB2W2ZwdiRgRGlhZ25vc2lzIGJhc2VkIG9uIGNsaW5pY2FsIHNpZ25zIGFuZCByYXBpZCB0ZXN0YCA9PSAiRlBWIiwgXQ0KDQojIENvdW50IHRoZSBudW1iZXIgb2YgRlBWIGNhc2VzIGluIGVhY2ggYWdlIGdyb3VwDQpmcHZfYWdlX2dyb3VwX2NvdW50cyA9IHRhYmxlKGZwdl9mcHYkYWdlX2dyb3VwKQ0KDQojIENvbnZlcnQgdGhlIGNvdW50cyB0byBkYXRhIGZyYW1lcw0KYWdlX2dyb3VwX2RmID0gYXMuZGF0YS5mcmFtZShhZ2VfZ3JvdXBfY291bnRzKQ0KZnB2X2FnZV9ncm91cF9kZiA9IGFzLmRhdGEuZnJhbWUoZnB2X2FnZV9ncm91cF9jb3VudHMpDQoNCiMgUmVuYW1lIHRoZSBjb2x1bW5zDQpjb2xuYW1lcyhhZ2VfZ3JvdXBfZGYpID0gYygiQWdlIEdyb3VwIiwgIlRvdGFsIikNCmNvbG5hbWVzKGZwdl9hZ2VfZ3JvdXBfZGYpID0gYygiQWdlIEdyb3VwIiwgIlBvc2l0aXZlIikNCg0KIyBNZXJnZSB0aGUgdG90YWwgYW5kIHBvc2l0aXZlIGNvdW50cyBpbnRvIG9uZSBkYXRhIGZyYW1lDQptZXJnZWRfZGYgPSBtZXJnZShhZ2VfZ3JvdXBfZGYsIGZwdl9hZ2VfZ3JvdXBfZGYsIGJ5ID0gIkFnZSBHcm91cCIsIGFsbC54ID0gVFJVRSkNCg0KIyBGaWxsIE5BcyB3aXRoIDAgZm9yIGFnZSBncm91cHMgd2l0aCBubyBwb3NpdGl2ZSBjYXNlcw0KbWVyZ2VkX2RmJFBvc2l0aXZlW2lzLm5hKG1lcmdlZF9kZiRQb3NpdGl2ZSldID0gMA0KDQojIENhbGN1bGF0ZSBwcmV2YWxlbmNlDQptZXJnZWRfZGYkUHJldmFsZW5jZSA9IChtZXJnZWRfZGYkUG9zaXRpdmUgLyBtZXJnZWRfZGYkVG90YWwpICogMTAwDQoNCiMgRGlzcGxheSB0aGUgZmluYWwgY291bnRzIHdpdGggcHJldmFsZW5jZQ0KcHJpbnQobWVyZ2VkX2RmKQ0KYGBgDQoNCmBgYHtyfQ0KIyBDb3VudCBzYW1wbGVzIGluIGVhY2ggc2V4IGdyb3VwDQpzZXhfZ3JvdXBfY291bnRzID0gdGFibGUoZnB2JFNleCkNCg0KIyBDb252ZXJ0IHRoZSB0YWJsZSB0byBhIGRhdGEgZnJhbWUNCnNleF9ncm91cF9kZiA9IGFzLmRhdGEuZnJhbWUoc2V4X2dyb3VwX2NvdW50cykNCg0KIyBSZW5hbWUgdGhlIGNvbHVtbnMgZm9yIGNsYXJpdHkNCmNvbG5hbWVzKHNleF9ncm91cF9kZikgPSBjKCJTZXgiLCAiVG90YWwiKQ0KDQojIERpc3BsYXkgdGhlIGNvdW50cyBpbiB0YWJsZSBmb3JtDQpwcmludChzZXhfZ3JvdXBfZGYpDQoNCmBgYA0KDQpgYGB7cn0NCiMgQ3JlYXRlIGEgc3Vic2V0IG9mIHRoZSBkYXRhIHdpdGggIkZQViIgZGlhZ25vc2VzDQpmcHZfZnB2ID0gZnB2W2ZwdiRgRGlhZ25vc2lzIGJhc2VkIG9uIGNsaW5pY2FsIHNpZ25zIGFuZCByYXBpZCB0ZXN0YCA9PSAiRlBWIiwgXQ0KDQojIENvdW50IHRoZSBudW1iZXIgb2YgRlBWIGNhc2VzIGluIGVhY2ggc2V4IGdyb3VwDQpmcHZfc2V4X2NvdW50cyA9IHRhYmxlKGZwdl9mcHYkU2V4KQ0KDQojIENvbnZlcnQgdGhlIHRhYmxlIHRvIGEgZGF0YSBmcmFtZQ0KZnB2X3NleF9kZiA9IGFzLmRhdGEuZnJhbWUoZnB2X3NleF9jb3VudHMpDQoNCiMgUmVuYW1lIHRoZSBjb2x1bW5zIGZvciBjbGFyaXR5DQpjb2xuYW1lcyhmcHZfc2V4X2RmKSA9IGMoIlNleCIsICJQb3NpdGl2ZSIpDQoNCiMgRGlzcGxheSB0aGUgY291bnRzIGluIHRhYmxlIGZvcm0NCnByaW50KGZwdl9zZXhfZGYpDQoNCmBgYA0KDQpgYGB7cn0NCiMgQ291bnQgc2FtcGxlcyB3aXRoICJEaWFycmhvZWEiDQpkaWFycmhvZWFfb25seSA9IHN1bShmcHYkU2lnbnMgPT0gIkRpYXJyaG9lYSIpDQpwcmludChkaWFycmhvZWFfb25seSkNCmBgYA0KYGBge3J9DQojIENvdW50IGhvdyBtYW55IGVudHJpZXMgaW4gdGhlICJTaWducyIgY29sdW1uIGNvbnRhaW4gImRpYXJyaG9lYSINCiMjTWlzdGFrZSBpbiBEYXRhIEVudHJ5LCBjb250YWlucyBib3RoIGRpYXJyaG9lYSBhbmQgRGlhcnJob3JlYSBpbiBzcGVsbGluZyANCmRpYXJyaG9lYV9jb3VudCA9IHN1bShncmVwbCgiZGlhcnJob2VhIiwgZnB2JFNpZ25zLCBpZ25vcmUuY2FzZSA9IFRSVUUpKQ0KZGlhcnJob3JlYV9jb3VudCA9IHN1bShncmVwbCgiRGlhcnJob3JlYSIsIGZwdiRTaWducywgaWdub3JlLmNhc2UgPSBUUlVFKSkNCkRpYXJyaG9ldGljX0NhdCA9IGRpYXJyaG9lYV9jb3VudCArIGRpYXJyaG9yZWFfY291bnQNCiMgQ291bnQgdGhlIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSAiU2lnbnMiIGNvbHVtbg0KdG90YWxfZW50cmllcyA9IG5yb3coZnB2KQ0KIyBDYWxjdWxhdGUgdGhlIG5vbi1kaWFycmhvZXRpYyBjb3VudA0Kbm9uX2RpYXJyaG9ldGljX2NvdW50ID0gdG90YWxfZW50cmllcyAtIERpYXJyaG9ldGljX0NhdA0KIyBQcmludCB0aGUgcmVzdWx0DQpwcmludChEaWFycmhvZXRpY19DYXQpDQpwcmludChub25fZGlhcnJob2V0aWNfY291bnQpDQpgYGANCmBgYHtyfQ0KIyBDcmVhdGUgc3Vic2V0cyBmb3IgZGlhcnJob2V0aWMgYW5kIG5vbi1kaWFycmhvZXRpYyBjYXNlcw0KZGlhcnJob2V0aWNfY2FzZXMgPSBmcHZbZ3JlcGwoImRpYXJyaG9lYSIsIGZwdiRTaWducywgaWdub3JlLmNhc2UgPSBUUlVFKSB8IGdyZXBsKCJEaWFycmhvcmVhIiwgZnB2JFNpZ25zLCBpZ25vcmUuY2FzZSA9IFRSVUUpLCBdDQpub25fZGlhcnJob2V0aWNfY2FzZXMgPSBmcHZbIShncmVwbCgiZGlhcnJob2VhIiwgZnB2JFNpZ25zLCBpZ25vcmUuY2FzZSA9IFRSVUUpIHwgZ3JlcGwoIkRpYXJyaG9yZWEiLCBmcHYkU2lnbnMsIGlnbm9yZS5jYXNlID0gVFJVRSkpLCBdDQoNCiMgQ291bnQgaG93IG1hbnkgRlBWIGNhc2VzIGFyZSBpbiB0aGUgZGlhcnJob2V0aWMgc3Vic2V0DQpmcHZfZGlhcnJob2V0aWNfY291bnQgPSBzdW0oZGlhcnJob2V0aWNfY2FzZXMkYERpYWdub3NpcyBiYXNlZCBvbiBjbGluaWNhbCBzaWducyBhbmQgcmFwaWQgdGVzdGAgPT0gIkZQViIpDQoNCiMgQ291bnQgaG93IG1hbnkgRlBWIGNhc2VzIGFyZSBpbiB0aGUgbm9uLWRpYXJyaG9ldGljIHN1YnNldA0KZnB2X25vbl9kaWFycmhvZXRpY19jb3VudCA9IHN1bShub25fZGlhcnJob2V0aWNfY2FzZXMkYERpYWdub3NpcyBiYXNlZCBvbiBjbGluaWNhbCBzaWducyBhbmQgcmFwaWQgdGVzdGAgPT0gIkZQViIpDQoNCiMgUHJpbnQgdGhlIHJlc3VsdHMNCmNhdCgiRlBWIGNhc2VzIGFtb25nIERpYXJyaG9ldGljOiIsIGZwdl9kaWFycmhvZXRpY19jb3VudCwgIlxuIikNCmNhdCgiRlBWIGNhc2VzIGFtb25nIE5vbi1EaWFycmhvZXRpYzoiLCBmcHZfbm9uX2RpYXJyaG9ldGljX2NvdW50LCAiXG4iKQ0KYGBgDQoNCmBgYHtyfQ0KIyBDb3VudCBob3cgbWFueSBlbnRyaWVzIGluIHRoZSAiQnJlZWQiIGNvbHVtbiBjb250YWluICJMb2NhbCINCmxvY2FsX2NvdW50ID0gc3VtKGdyZXBsKCJsb2NhbCIsIGZwdiRCcmVlZCwgaWdub3JlLmNhc2UgPSBUUlVFKSkNClBlcnNpYW5fY291bnQgPSBzdW0oZ3JlcGwoIlBlcnNpYW4iLCBmcHYkQnJlZWQsIGlnbm9yZS5jYXNlID0gVFJVRSkpDQpEb21lc3RpY19zaG9ydF9oYWlyX2NvdW50ID0gc3VtKGdyZXBsKCJzaG9ydCBoYWlyIiwgZnB2JEJyZWVkLCBpZ25vcmUuY2FzZSA9IFRSVUUpKSANCkRvbWVzdGljX2xvbmdfaGFpcl9jb3VudCA9IHN1bShncmVwbCgibG9uZyBoYWlyIiwgZnB2JEJyZWVkLCBpZ25vcmUuY2FzZSA9IFRSVUUpKQ0KT3RoZXJzX2NvdW50ID0gc3VtKGdyZXBsKCJPdGhlcnMiLCBmcHYkQnJlZWQsIGlnbm9yZS5jYXNlID0gVFJVRSkpDQojTWlzdGFrZSBpbiBEYXRhIEVudHJ5DQpPaGVyc19jb3VudCA9IHN1bShncmVwbCgiT2hlcnMiLCBmcHYkQnJlZWQsIGlnbm9yZS5jYXNlID0gVFJVRSkpDQoNCk90aGVycyA9IE90aGVyc19jb3VudCArIE9oZXJzX2NvdW50DQoNCnRvdGFsX3R5cGUgPSBsb2NhbF9jb3VudCArIFBlcnNpYW5fY291bnQgKyBEb21lc3RpY19zaG9ydF9oYWlyX2NvdW50ICsgRG9tZXN0aWNfbG9uZ19oYWlyX2NvdW50ICsgT3RoZXJzDQojUHJpbnQNCnByaW50KGxvY2FsX2NvdW50KQ0KcHJpbnQoUGVyc2lhbl9jb3VudCkNCnByaW50KERvbWVzdGljX3Nob3J0X2hhaXJfY291bnQpDQpwcmludChEb21lc3RpY19sb25nX2hhaXJfY291bnQpDQpwcmludChPdGhlcnMpDQpwcmludCh0b3RhbF90eXBlKQ0KYGBgDQpgYGB7cn0NCiMgSW5pdGlhbGl6ZSBjb3VudHMgZm9yIGVhY2ggYnJlZWQgd2l0aCBGUFYNCmxvY2FsX2Zwdl9jb3VudCA9IHN1bShncmVwbCgibG9jYWwiLCBmcHYkQnJlZWQsIGlnbm9yZS5jYXNlID0gVFJVRSkgJiBmcHYkYERpYWdub3NpcyBiYXNlZCBvbiBjbGluaWNhbCBzaWducyBhbmQgcmFwaWQgdGVzdGAgPT0gIkZQViIpDQpwZXJzaWFuX2Zwdl9jb3VudCA9IHN1bShncmVwbCgiUGVyc2lhbiIsIGZwdiRCcmVlZCwgaWdub3JlLmNhc2UgPSBUUlVFKSAmIGZwdiRgRGlhZ25vc2lzIGJhc2VkIG9uIGNsaW5pY2FsIHNpZ25zIGFuZCByYXBpZCB0ZXN0YCA9PSAiRlBWIikNCmRvbWVzdGljX3Nob3J0X2hhaXJfZnB2X2NvdW50ID0gc3VtKGdyZXBsKCJzaG9ydCBoYWlyIiwgZnB2JEJyZWVkLCBpZ25vcmUuY2FzZSA9IFRSVUUpICYgZnB2JGBEaWFnbm9zaXMgYmFzZWQgb24gY2xpbmljYWwgc2lnbnMgYW5kIHJhcGlkIHRlc3RgID09ICJGUFYiKQ0KZG9tZXN0aWNfbG9uZ19oYWlyX2Zwdl9jb3VudCA9IHN1bShncmVwbCgibG9uZyBoYWlyIiwgZnB2JEJyZWVkLCBpZ25vcmUuY2FzZSA9IFRSVUUpICYgZnB2JGBEaWFnbm9zaXMgYmFzZWQgb24gY2xpbmljYWwgc2lnbnMgYW5kIHJhcGlkIHRlc3RgID09ICJGUFYiKQ0Kb3RoZXJzX2Zwdl9jb3VudCA9IHN1bShncmVwbCgiT3RoZXJzIiwgZnB2JEJyZWVkLCBpZ25vcmUuY2FzZSA9IFRSVUUpICYgZnB2JGBEaWFnbm9zaXMgYmFzZWQgb24gY2xpbmljYWwgc2lnbnMgYW5kIHJhcGlkIHRlc3RgID09ICJGUFYiKQ0Kb2hlcnNfZnB2X2NvdW50ID0gc3VtKGdyZXBsKCJPaGVycyIsIGZwdiRCcmVlZCwgaWdub3JlLmNhc2UgPSBUUlVFKSAmIGZwdiRgRGlhZ25vc2lzIGJhc2VkIG9uIGNsaW5pY2FsIHNpZ25zIGFuZCByYXBpZCB0ZXN0YCA9PSAiRlBWIikNCg0KIyBDYWxjdWxhdGUgdG90YWwgRlBWIGNhc2VzIGZvciBPdGhlcnMgY2F0ZWdvcnkNCnRvdGFsX290aGVyc19mcHYgPSBvdGhlcnNfZnB2X2NvdW50ICsgb2hlcnNfZnB2X2NvdW50DQoNCiMgUHJpbnQgcmVzdWx0cw0KY2F0KCJGUFYgQ291bnQgaW4gTG9jYWwgQnJlZWQ6IiwgbG9jYWxfZnB2X2NvdW50LCAiXG4iKQ0KY2F0KCJGUFYgQ291bnQgaW4gUGVyc2lhbiBCcmVlZDoiLCBwZXJzaWFuX2Zwdl9jb3VudCwgIlxuIikNCmNhdCgiRlBWIENvdW50IGluIERvbWVzdGljIFNob3J0IEhhaXIgQnJlZWQ6IiwgZG9tZXN0aWNfc2hvcnRfaGFpcl9mcHZfY291bnQsICJcbiIpDQpjYXQoIkZQViBDb3VudCBpbiBEb21lc3RpYyBMb25nIEhhaXIgQnJlZWQ6IiwgZG9tZXN0aWNfbG9uZ19oYWlyX2Zwdl9jb3VudCwgIlxuIikNCmNhdCgiVG90YWwgRlBWIENvdW50IGluIE90aGVycyBCcmVlZDoiLCB0b3RhbF9vdGhlcnNfZnB2LCAiXG4iKQ0KDQpgYGANCg0K