Central Tendency for Housing Data in R

In this project, you will find the mean, median, and mode cost of one-bedroom apartments in three of the five New York City boroughs: Brooklyn, Manhattan, and Queens.

Using your findings, you will make conclusions about the cost of living in each of the boroughs. We will also discuss an important assumption that we make when we point out differences between the boroughs.

We worked with Streeteasy.com to collect this data. While we will only focus on the cost of one-bedroom apartments, the dataset includes a lot more information if you’re interested in asking your own questions about the Brooklyn, Manhattan, and Queens housing market.

# Load libraries
library(readr)
library(dplyr)
library(DescTools)
# Read in housing data
brooklyn_one_bed <- read_csv('brooklyn-one-bed.csv')
brooklyn_price <- brooklyn_one_bed$rent

manhattan_one_bed <- read_csv('manhattan-one-bed.csv')
manhattan_price <- manhattan_one_bed$rent

queens_one_bed <- read_csv('queens-one-bed.csv')
queens_price <- queens_one_bed$rent

Find the Mean

#Calculate Mean
brooklyn_mean<-mean(brooklyn_price)
brooklyn_mean
[1] 3327.404
manhattan_mean<-mean(manhattan_price)
manhattan_mean
[1] 3993.477
queens_mean<-mean(queens_price)
queens_mean
[1] 2346.254

Find the Median

#Calculate Median
brooklyn_median<-median(brooklyn_price)
brooklyn_median
[1] 3000
manhattan_median<-median(manhattan_price)
manhattan_median
[1] 3800
queens_median<-median(queens_price)
queens_median
[1] 2200

Find the Mode

#Calculate Mode
brooklyn_mode<-Mode(brooklyn_price)
brooklyn_mode
[1] 2500
attr(,"freq")
[1] 26
manhattan_mode<-Mode(manhattan_price)
manhattan_mode
[1] 3500
attr(,"freq")
[1] 56
queens_mode<-Mode(queens_price)
queens_mode
[1] 1750
attr(,"freq")
[1] 11

It looks like the average cost of one-bedroom apartments in Manhattan is the most, and in Queens is the least. This pattern holds for the median and mode values as well.

While the mode is not the most important indicator of centrality, the fact that mean, median, and mode are within a few hundred dollars for each borough indicates the data is centered around:

  • $3,300 for Brooklyn
  • $3,900 for Manhattan
  • $2,300 for Queens

We assumed that the data from Streeteasy is representative of housing prices for the entire borough. Given that Streeteasy is only used by a subset of property owners, this is not a fair assumption. A quick search on rentcafe.com will tell you the averages are more like:

  • $2,695 for Brooklyn one-bedroom apartments
  • $4,188 for Manhattan one-bedroom apartments
  • $2,178 for Queens one-bedroom apartments

This is an interesting finding. Why may the cost from rentcafe.com be higher in Manhattan than in Brooklyn or Queens?

Although we don’t have the answer to this question, it’s worth thinking about the possible differences between our Streeteasy data and where rentcafe is pulling their data.

Histograms

library(ggplot2)
#Histograms
b <- ggplot (brooklyn_one_bed, aes(x=rent)) +
  geom_histogram(binwidth = 100) + 
  geom_vline(aes(xintercept=brooklyn_mean,
                 linetype=Mean, color = Blue),
             color="blue",
             linetype="dashed",
             size=1,
             show.legend = TRUE)  + 
  geom_vline(aes(xintercept=brooklyn_median,
             linetype=Median, color = Red),
             color="Red",
             linetype="dashed",
             size=1, show.legend = TRUE) + 
  geom_vline(aes(xintercept=brooklyn_mode,
             linetype=Mode, color = Green),
             color="Green",
             linetype="dashed",
             size=1, show.legend = TRUE) +
  labs(title="Monthly Rent in Brooklyn")
b


m <- ggplot (manhattan_one_bed, aes(x=rent)) +
  geom_histogram(binwidth = 100) + 
  geom_vline(aes(xintercept=manhattan_mean,
                 linetype=Mean, color = Blue),
             color="blue",
             linetype="dashed",
             size=1,
             show.legend = TRUE)  + 
  geom_vline(aes(xintercept=manhattan_median,
             linetype=Median, color = Red),
             color="Red",
             linetype="dashed",
             size=1, show.legend = TRUE) + 
  geom_vline(aes(xintercept=manhattan_mode,
             linetype=Mode, color = Green),
             color="Green",
             linetype="dashed",
             size=1, show.legend = TRUE) +
  labs(title="Monthly Rent in Manhattan")
m


q <- ggplot (queens_one_bed, aes(x=rent)) +
  geom_histogram(binwidth = 40) + 
  geom_vline(aes(xintercept=queens_mean,
                 linetype=Mean, color = Blue),
             color="blue",
             linetype="dashed",
             size=1,
             show.legend = TRUE)  + 
  geom_vline(aes(xintercept=queens_median,
             linetype=Median, color = Red),
             color="Red",
             linetype="dashed",
             size=1, show.legend = TRUE) + 
  geom_vline(aes(xintercept=queens_mode,
             linetype=Mode, color = Green),
             color="Green",
             linetype="dashed",
             size=1, show.legend = TRUE) +
  labs(title="Monthly Rent in Queens")

q

# Don't look below here
# Mean
if(exists('brooklyn_mean')) {
  print(paste("The mean price in Brooklyn is" , round(brooklyn_mean, digits=2))) 
}else{
    print("The mean price in Brooklyn is not yet defined.")
}
[1] "The mean price in Brooklyn is 3327.4"
if(exists("manhattan_mean")) {
    print(paste("The mean price in Manhattan is", round(manhattan_mean,digits=2)))
} else {
    print("The mean in Manhattan is not yet defined.")
}
[1] "The mean price in Manhattan is 3993.48"
if(exists("queens_mean")) {
    print(paste("The mean price in Queens is" , round(queens_mean,digits=2)))
} else {
  print("The mean price in Queens is not yet defined.")
}   
[1] "The mean price in Queens is 2346.25"
    
# Median
if(exists("brooklyn_median")) {
  print(paste("The median price in Brooklyn is" , brooklyn_median)) 
}else{
    print("The median price in Brooklyn is not yet defined.")
}
[1] "The median price in Brooklyn is 3000"
if(exists("manhattan_median")) {
    print(paste("The median price in Manhattan is", manhattan_median))
} else {
    print("The median in Manhattan is not yet defined.")
}
[1] "The median price in Manhattan is 3800"
if(exists("queens_median")) {
    print(paste("The median price in Queens is" , queens_median))
} else {
  print("The median price in Queens is not yet defined.")
} 
[1] "The median price in Queens is 2200"
    
#Mode
if(exists("brooklyn_mode")) {
  print(paste("The mode price in Brooklyn is" , brooklyn_mode)) 
}else{
    print("The mode price in Brooklyn is not yet defined.")
}
[1] "The mode price in Brooklyn is 2500"
if(exists("manhattan_median")) {
    print(paste("The mode price in Manhattan is", manhattan_mode))
} else {
    print("The mode in Manhattan is not yet defined.")
}
[1] "The mode price in Manhattan is 3500"
if(exists("queens_median")) {
    print(paste("The mode price in Queens is" , queens_mode))
} else {
  print("The mode price in Queens is not yet defined.")
} 
[1] "The mode price in Queens is 1750"
LS0tDQp0aXRsZTogIk1vZGUgaW4gUiINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiMjIENlbnRyYWwgVGVuZGVuY3kgZm9yIEhvdXNpbmcgRGF0YSBpbiBSDQoNCkluIHRoaXMgcHJvamVjdCwgeW91IHdpbGwgZmluZCB0aGUgbWVhbiwgbWVkaWFuLCBhbmQgbW9kZSBjb3N0IG9mIG9uZS1iZWRyb29tIGFwYXJ0bWVudHMgaW4gdGhyZWUgb2YgdGhlIGZpdmUgTmV3IFlvcmsgQ2l0eSBib3JvdWdoczogQnJvb2tseW4sIE1hbmhhdHRhbiwgYW5kIFF1ZWVucy4NCg0KVXNpbmcgeW91ciBmaW5kaW5ncywgeW91IHdpbGwgbWFrZSBjb25jbHVzaW9ucyBhYm91dCB0aGUgY29zdCBvZiBsaXZpbmcgaW4gZWFjaCBvZiB0aGUgYm9yb3VnaHMuIFdlIHdpbGwgYWxzbyBkaXNjdXNzIGFuIGltcG9ydGFudCBhc3N1bXB0aW9uIHRoYXQgd2UgbWFrZSB3aGVuIHdlIHBvaW50IG91dCBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBib3JvdWdocy4NCg0KV2Ugd29ya2VkIHdpdGggU3RyZWV0ZWFzeS5jb20gdG8gY29sbGVjdCB0aGlzIGRhdGEuIFdoaWxlIHdlIHdpbGwgb25seSBmb2N1cyBvbiB0aGUgY29zdCBvZiBvbmUtYmVkcm9vbSBhcGFydG1lbnRzLCB0aGUgZGF0YXNldCBpbmNsdWRlcyBhIGxvdCBtb3JlIGluZm9ybWF0aW9uIGlmIHlvdeKAmXJlIGludGVyZXN0ZWQgaW4gYXNraW5nIHlvdXIgb3duIHF1ZXN0aW9ucyBhYm91dCB0aGUgQnJvb2tseW4sIE1hbmhhdHRhbiwgYW5kIFF1ZWVucyBob3VzaW5nIG1hcmtldC4NCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVycm9yPVRSVUV9DQojIExvYWQgbGlicmFyaWVzDQpsaWJyYXJ5KHJlYWRyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoRGVzY1Rvb2xzKQ0KYGBgDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1UUlVFfQ0KIyBSZWFkIGluIGhvdXNpbmcgZGF0YQ0KYnJvb2tseW5fb25lX2JlZCA8LSByZWFkX2NzdignYnJvb2tseW4tb25lLWJlZC5jc3YnKQ0KYnJvb2tseW5fcHJpY2UgPC0gYnJvb2tseW5fb25lX2JlZCRyZW50DQoNCm1hbmhhdHRhbl9vbmVfYmVkIDwtIHJlYWRfY3N2KCdtYW5oYXR0YW4tb25lLWJlZC5jc3YnKQ0KbWFuaGF0dGFuX3ByaWNlIDwtIG1hbmhhdHRhbl9vbmVfYmVkJHJlbnQNCg0KcXVlZW5zX29uZV9iZWQgPC0gcmVhZF9jc3YoJ3F1ZWVucy1vbmUtYmVkLmNzdicpDQpxdWVlbnNfcHJpY2UgPC0gcXVlZW5zX29uZV9iZWQkcmVudA0KYGBgDQojIyMgRmluZCB0aGUgTWVhbg0KYGBge3IgZXJyb3I9VFJVRX0NCiNDYWxjdWxhdGUgTWVhbg0KYnJvb2tseW5fbWVhbjwtbWVhbihicm9va2x5bl9wcmljZSkNCmJyb29rbHluX21lYW4NCm1hbmhhdHRhbl9tZWFuPC1tZWFuKG1hbmhhdHRhbl9wcmljZSkNCm1hbmhhdHRhbl9tZWFuDQpxdWVlbnNfbWVhbjwtbWVhbihxdWVlbnNfcHJpY2UpDQpxdWVlbnNfbWVhbg0KYGBgDQojIyMgRmluZCB0aGUgTWVkaWFuDQpgYGB7ciBlcnJvcj1UUlVFfQ0KI0NhbGN1bGF0ZSBNZWRpYW4NCmJyb29rbHluX21lZGlhbjwtbWVkaWFuKGJyb29rbHluX3ByaWNlKQ0KYnJvb2tseW5fbWVkaWFuDQptYW5oYXR0YW5fbWVkaWFuPC1tZWRpYW4obWFuaGF0dGFuX3ByaWNlKQ0KbWFuaGF0dGFuX21lZGlhbg0KcXVlZW5zX21lZGlhbjwtbWVkaWFuKHF1ZWVuc19wcmljZSkNCnF1ZWVuc19tZWRpYW4NCmBgYA0KDQojIyMgRmluZCB0aGUgTW9kZQ0KYGBge3IgZXJyb3I9VFJVRX0NCiNDYWxjdWxhdGUgTW9kZQ0KYnJvb2tseW5fbW9kZTwtTW9kZShicm9va2x5bl9wcmljZSkNCmJyb29rbHluX21vZGUNCm1hbmhhdHRhbl9tb2RlPC1Nb2RlKG1hbmhhdHRhbl9wcmljZSkNCm1hbmhhdHRhbl9tb2RlDQpxdWVlbnNfbW9kZTwtTW9kZShxdWVlbnNfcHJpY2UpDQpxdWVlbnNfbW9kZQ0KYGBgDQpJdCBsb29rcyBsaWtlIHRoZSBhdmVyYWdlIGNvc3Qgb2Ygb25lLWJlZHJvb20gYXBhcnRtZW50cyBpbiBNYW5oYXR0YW4gaXMgdGhlIG1vc3QsIGFuZCBpbiBRdWVlbnMgaXMgdGhlIGxlYXN0LiBUaGlzIHBhdHRlcm4gaG9sZHMgZm9yIHRoZSBtZWRpYW4gYW5kIG1vZGUgdmFsdWVzIGFzIHdlbGwuDQoNCldoaWxlIHRoZSBtb2RlIGlzIG5vdCB0aGUgbW9zdCBpbXBvcnRhbnQgaW5kaWNhdG9yIG9mIGNlbnRyYWxpdHksIHRoZSBmYWN0IHRoYXQgbWVhbiwgbWVkaWFuLCBhbmQgbW9kZSBhcmUgd2l0aGluIGEgZmV3IGh1bmRyZWQgZG9sbGFycyBmb3IgZWFjaCBib3JvdWdoIGluZGljYXRlcyB0aGUgZGF0YSBpcyBjZW50ZXJlZCBhcm91bmQ6DQoNCi0gJDMsMzAwIGZvciBCcm9va2x5bg0KLSAkMyw5MDAgZm9yIE1hbmhhdHRhbg0KLSAkMiwzMDAgZm9yIFF1ZWVucw0KDQpXZSBhc3N1bWVkIHRoYXQgdGhlIGRhdGEgZnJvbSBTdHJlZXRlYXN5IGlzIHJlcHJlc2VudGF0aXZlIG9mIGhvdXNpbmcgcHJpY2VzIGZvciB0aGUgZW50aXJlIGJvcm91Z2guIEdpdmVuIHRoYXQgU3RyZWV0ZWFzeSBpcyBvbmx5IHVzZWQgYnkgYSBzdWJzZXQgb2YgcHJvcGVydHkgb3duZXJzLCB0aGlzIGlzIG5vdCBhIGZhaXIgYXNzdW1wdGlvbi4gQSBxdWljayBzZWFyY2ggb24gcmVudGNhZmUuY29tIHdpbGwgdGVsbCB5b3UgdGhlIGF2ZXJhZ2VzIGFyZSBtb3JlIGxpa2U6DQoNCi0gJDIsNjk1IGZvciBCcm9va2x5biBvbmUtYmVkcm9vbSBhcGFydG1lbnRzDQotICQ0LDE4OCBmb3IgTWFuaGF0dGFuIG9uZS1iZWRyb29tIGFwYXJ0bWVudHMNCi0gJDIsMTc4IGZvciBRdWVlbnMgb25lLWJlZHJvb20gYXBhcnRtZW50cw0KDQpUaGlzIGlzIGFuIGludGVyZXN0aW5nIGZpbmRpbmcuIFdoeSBtYXkgdGhlIGNvc3QgZnJvbSByZW50Y2FmZS5jb20gYmUgaGlnaGVyIGluIE1hbmhhdHRhbiB0aGFuIGluIEJyb29rbHluIG9yIFF1ZWVucz8NCg0KQWx0aG91Z2ggd2UgZG9u4oCZdCBoYXZlIHRoZSBhbnN3ZXIgdG8gdGhpcyBxdWVzdGlvbiwgaXTigJlzIHdvcnRoIHRoaW5raW5nIGFib3V0IHRoZSBwb3NzaWJsZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIG91ciBTdHJlZXRlYXN5IGRhdGEgYW5kIHdoZXJlIHJlbnRjYWZlIGlzIHB1bGxpbmcgdGhlaXIgZGF0YS4NCg0KIyMjIEhpc3RvZ3JhbXMNCmBgYHtyIGVycm9yPVRSVUV9DQpsaWJyYXJ5KGdncGxvdDIpDQoNCmBgYA0KDQoNCmBgYHtyIGVycm9yPVRSVUV9DQojSGlzdG9ncmFtcw0KYiA8LSBnZ3Bsb3QgKGJyb29rbHluX29uZV9iZWQsIGFlcyh4PXJlbnQpKSArDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMTAwKSArIA0KICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0PWJyb29rbHluX21lYW4sDQogICAgICAgICAgICAgICAgIGxpbmV0eXBlPU1lYW4sIGNvbG9yID0gQmx1ZSksDQogICAgICAgICAgICAgY29sb3I9ImJsdWUiLA0KICAgICAgICAgICAgIGxpbmV0eXBlPSJkYXNoZWQiLA0KICAgICAgICAgICAgIHNpemU9MSwNCiAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IFRSVUUpICArIA0KICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0PWJyb29rbHluX21lZGlhbiwNCiAgICAgICAgICAgICBsaW5ldHlwZT1NZWRpYW4sIGNvbG9yID0gUmVkKSwNCiAgICAgICAgICAgICBjb2xvcj0iUmVkIiwNCiAgICAgICAgICAgICBsaW5ldHlwZT0iZGFzaGVkIiwNCiAgICAgICAgICAgICBzaXplPTEsIHNob3cubGVnZW5kID0gVFJVRSkgKyANCiAgZ2VvbV92bGluZShhZXMoeGludGVyY2VwdD1icm9va2x5bl9tb2RlLA0KICAgICAgICAgICAgIGxpbmV0eXBlPU1vZGUsIGNvbG9yID0gR3JlZW4pLA0KICAgICAgICAgICAgIGNvbG9yPSJHcmVlbiIsDQogICAgICAgICAgICAgbGluZXR5cGU9ImRhc2hlZCIsDQogICAgICAgICAgICAgc2l6ZT0xLCBzaG93LmxlZ2VuZCA9IFRSVUUpICsNCiAgbGFicyh0aXRsZT0iTW9udGhseSBSZW50IGluIEJyb29rbHluIikNCmINCg0KbSA8LSBnZ3Bsb3QgKG1hbmhhdHRhbl9vbmVfYmVkLCBhZXMoeD1yZW50KSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEwMCkgKyANCiAgZ2VvbV92bGluZShhZXMoeGludGVyY2VwdD1tYW5oYXR0YW5fbWVhbiwNCiAgICAgICAgICAgICAgICAgbGluZXR5cGU9TWVhbiwgY29sb3IgPSBCbHVlKSwNCiAgICAgICAgICAgICBjb2xvcj0iYmx1ZSIsDQogICAgICAgICAgICAgbGluZXR5cGU9ImRhc2hlZCIsDQogICAgICAgICAgICAgc2l6ZT0xLA0KICAgICAgICAgICAgIHNob3cubGVnZW5kID0gVFJVRSkgICsgDQogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQ9bWFuaGF0dGFuX21lZGlhbiwNCiAgICAgICAgICAgICBsaW5ldHlwZT1NZWRpYW4sIGNvbG9yID0gUmVkKSwNCiAgICAgICAgICAgICBjb2xvcj0iUmVkIiwNCiAgICAgICAgICAgICBsaW5ldHlwZT0iZGFzaGVkIiwNCiAgICAgICAgICAgICBzaXplPTEsIHNob3cubGVnZW5kID0gVFJVRSkgKyANCiAgZ2VvbV92bGluZShhZXMoeGludGVyY2VwdD1tYW5oYXR0YW5fbW9kZSwNCiAgICAgICAgICAgICBsaW5ldHlwZT1Nb2RlLCBjb2xvciA9IEdyZWVuKSwNCiAgICAgICAgICAgICBjb2xvcj0iR3JlZW4iLA0KICAgICAgICAgICAgIGxpbmV0eXBlPSJkYXNoZWQiLA0KICAgICAgICAgICAgIHNpemU9MSwgc2hvdy5sZWdlbmQgPSBUUlVFKSArDQogIGxhYnModGl0bGU9Ik1vbnRobHkgUmVudCBpbiBNYW5oYXR0YW4iKQ0KbQ0KDQpxIDwtIGdncGxvdCAocXVlZW5zX29uZV9iZWQsIGFlcyh4PXJlbnQpKSArDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gNDApICsgDQogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQ9cXVlZW5zX21lYW4sDQogICAgICAgICAgICAgICAgIGxpbmV0eXBlPU1lYW4sIGNvbG9yID0gQmx1ZSksDQogICAgICAgICAgICAgY29sb3I9ImJsdWUiLA0KICAgICAgICAgICAgIGxpbmV0eXBlPSJkYXNoZWQiLA0KICAgICAgICAgICAgIHNpemU9MSwNCiAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IFRSVUUpICArIA0KICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0PXF1ZWVuc19tZWRpYW4sDQogICAgICAgICAgICAgbGluZXR5cGU9TWVkaWFuLCBjb2xvciA9IFJlZCksDQogICAgICAgICAgICAgY29sb3I9IlJlZCIsDQogICAgICAgICAgICAgbGluZXR5cGU9ImRhc2hlZCIsDQogICAgICAgICAgICAgc2l6ZT0xLCBzaG93LmxlZ2VuZCA9IFRSVUUpICsgDQogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQ9cXVlZW5zX21vZGUsDQogICAgICAgICAgICAgbGluZXR5cGU9TW9kZSwgY29sb3IgPSBHcmVlbiksDQogICAgICAgICAgICAgY29sb3I9IkdyZWVuIiwNCiAgICAgICAgICAgICBsaW5ldHlwZT0iZGFzaGVkIiwNCiAgICAgICAgICAgICBzaXplPTEsIHNob3cubGVnZW5kID0gVFJVRSkgKw0KICBsYWJzKHRpdGxlPSJNb250aGx5IFJlbnQgaW4gUXVlZW5zIikNCg0KcQ0KYGBgDQoNCmBgYHtyIGVycm9yPVRSVUV9DQojIERvbid0IGxvb2sgYmVsb3cgaGVyZQ0KIyBNZWFuDQppZihleGlzdHMoJ2Jyb29rbHluX21lYW4nKSkgew0KICBwcmludChwYXN0ZSgiVGhlIG1lYW4gcHJpY2UgaW4gQnJvb2tseW4gaXMiICwgcm91bmQoYnJvb2tseW5fbWVhbiwgZGlnaXRzPTIpKSkgDQp9ZWxzZXsNCiAgICBwcmludCgiVGhlIG1lYW4gcHJpY2UgaW4gQnJvb2tseW4gaXMgbm90IHlldCBkZWZpbmVkLiIpDQp9DQoNCmlmKGV4aXN0cygibWFuaGF0dGFuX21lYW4iKSkgew0KICAgIHByaW50KHBhc3RlKCJUaGUgbWVhbiBwcmljZSBpbiBNYW5oYXR0YW4gaXMiLCByb3VuZChtYW5oYXR0YW5fbWVhbixkaWdpdHM9MikpKQ0KfSBlbHNlIHsNCiAgICBwcmludCgiVGhlIG1lYW4gaW4gTWFuaGF0dGFuIGlzIG5vdCB5ZXQgZGVmaW5lZC4iKQ0KfQ0KaWYoZXhpc3RzKCJxdWVlbnNfbWVhbiIpKSB7DQogICAgcHJpbnQocGFzdGUoIlRoZSBtZWFuIHByaWNlIGluIFF1ZWVucyBpcyIgLCByb3VuZChxdWVlbnNfbWVhbixkaWdpdHM9MikpKQ0KfSBlbHNlIHsNCiAgcHJpbnQoIlRoZSBtZWFuIHByaWNlIGluIFF1ZWVucyBpcyBub3QgeWV0IGRlZmluZWQuIikNCn0gICANCiAgICANCiMgTWVkaWFuDQppZihleGlzdHMoImJyb29rbHluX21lZGlhbiIpKSB7DQogIHByaW50KHBhc3RlKCJUaGUgbWVkaWFuIHByaWNlIGluIEJyb29rbHluIGlzIiAsIGJyb29rbHluX21lZGlhbikpIA0KfWVsc2V7DQogICAgcHJpbnQoIlRoZSBtZWRpYW4gcHJpY2UgaW4gQnJvb2tseW4gaXMgbm90IHlldCBkZWZpbmVkLiIpDQp9DQoNCmlmKGV4aXN0cygibWFuaGF0dGFuX21lZGlhbiIpKSB7DQogICAgcHJpbnQocGFzdGUoIlRoZSBtZWRpYW4gcHJpY2UgaW4gTWFuaGF0dGFuIGlzIiwgbWFuaGF0dGFuX21lZGlhbikpDQp9IGVsc2Ugew0KICAgIHByaW50KCJUaGUgbWVkaWFuIGluIE1hbmhhdHRhbiBpcyBub3QgeWV0IGRlZmluZWQuIikNCn0NCmlmKGV4aXN0cygicXVlZW5zX21lZGlhbiIpKSB7DQogICAgcHJpbnQocGFzdGUoIlRoZSBtZWRpYW4gcHJpY2UgaW4gUXVlZW5zIGlzIiAsIHF1ZWVuc19tZWRpYW4pKQ0KfSBlbHNlIHsNCiAgcHJpbnQoIlRoZSBtZWRpYW4gcHJpY2UgaW4gUXVlZW5zIGlzIG5vdCB5ZXQgZGVmaW5lZC4iKQ0KfSANCiAgICANCiNNb2RlDQppZihleGlzdHMoImJyb29rbHluX21vZGUiKSkgew0KICBwcmludChwYXN0ZSgiVGhlIG1vZGUgcHJpY2UgaW4gQnJvb2tseW4gaXMiICwgYnJvb2tseW5fbW9kZSkpIA0KfWVsc2V7DQogICAgcHJpbnQoIlRoZSBtb2RlIHByaWNlIGluIEJyb29rbHluIGlzIG5vdCB5ZXQgZGVmaW5lZC4iKQ0KfQ0KDQppZihleGlzdHMoIm1hbmhhdHRhbl9tZWRpYW4iKSkgew0KICAgIHByaW50KHBhc3RlKCJUaGUgbW9kZSBwcmljZSBpbiBNYW5oYXR0YW4gaXMiLCBtYW5oYXR0YW5fbW9kZSkpDQp9IGVsc2Ugew0KICAgIHByaW50KCJUaGUgbW9kZSBpbiBNYW5oYXR0YW4gaXMgbm90IHlldCBkZWZpbmVkLiIpDQp9DQppZihleGlzdHMoInF1ZWVuc19tZWRpYW4iKSkgew0KICAgIHByaW50KHBhc3RlKCJUaGUgbW9kZSBwcmljZSBpbiBRdWVlbnMgaXMiICwgcXVlZW5zX21vZGUpKQ0KfSBlbHNlIHsNCiAgcHJpbnQoIlRoZSBtb2RlIHByaWNlIGluIFF1ZWVucyBpcyBub3QgeWV0IGRlZmluZWQuIikNCn0gDQpgYGANCg0K