INTRODUCTION

This is my Capstone Project. I chose to do the Cyclistic Bike Share case study. Cyclistic is a bike sharing company that has over 5800 bikes and 600 docking stations in the Chicago area that launched in 2016. It offers one day passes and single ride passes, the people that use these are know as Casual Members. They also offer a annual membership.

The goal of this project is to find a way to convert Casual riders to Members. To do this I will have to answer a few questions.

How do annual members and casual riders use the Cyclistic bikes differently?

Why would casual riders buy an annual Cyclistic membership?

How can digital media be used by Cyclistic to influence the casual riders to get an annual membership?

I chose to use RStudio to do this project because Rstudio can store and process a large amount of data.

The data that I will be using came from a public dataset located at https://divvy-tripdata.s3.amazonaws.com/index.html. The data has been made available by Motivate International Inc. under https://ride.divvybikes.com/data-license-agreement.

#To start we need to install the packages from R that we will need.

install.packages('tidyverse')
install.packages('janitor')
install.packages('lubridate')
install.packages('ggplot2')
install.packages('readr')
install.packages('dplyr')
install.packages('ggplot2')

#Next we need to load them by using Library.

library(tidyverse)
library(janitor)
library(lubridate)
library(ggplot2)
library(readr)
library(dplyr)
library(ggplot2)

Collecting and organizing the data.

#I downloaded my data from the public data base and used January 2021 through December 2021. I saved this data in a folder on my desktop named bike_trip_data.

#Now I need to upload my data files for my computer to RStudio.

`2021.01.td` <- read.csv("C:/Users/ashle/OneDrive/Desktop/bike_trip_data/2021.01.td.csv")
`2021.02.td` <- read.csv("C:/Users/ashle/OneDrive/Desktop/bike_trip_data/2021.02.td.csv")
`2021.03.td` <- read.csv("C:/Users/ashle/OneDrive/Desktop/bike_trip_data/2021.03.td.csv")
`2021.04.td` <- read.csv("C:/Users/ashle/OneDrive/Desktop/bike_trip_data/2021.04.td.csv")
`2021.05.td` <- read.csv("C:/Users/ashle/OneDrive/Desktop/bike_trip_data/2021.05.td.csv")
`2021.06.td` <- read.csv("C:/Users/ashle/OneDrive/Desktop/bike_trip_data/2021.06.td.csv")
`2021.07.td` <- read.csv("C:/Users/ashle/OneDrive/Desktop/bike_trip_data/2021.07.td.csv")
`2021.08.td` <- read.csv("C:/Users/ashle/OneDrive/Desktop/bike_trip_data/2021.08.td.csv")
`2021.09.td` <- read.csv("C:/Users/ashle/OneDrive/Desktop/bike_trip_data/2021.09.td.csv")
`2021.10.td` <- read.csv("C:/Users/ashle/OneDrive/Desktop/bike_trip_data/2021.10.td.csv")
`2021.11.td` <- read.csv("C:/Users/ashle/OneDrive/Desktop/bike_trip_data/2021.11.td.csv")
`2021.12.td` <- read.csv("C:/Users/ashle/OneDrive/Desktop/bike_trip_data/2021.12.td.csv")

#Now I am going to rename the files to make it easier to know what they are.

Jan2021 <-`2021.01.td`
Feb2021 <-`2021.02.td`
Mar2021 <-`2021.03.td`
April2021 <-`2021.04.td`
May2021 <-`2021.05.td`
June2021 <-`2021.06.td`
July2021 <-`2021.07.td`
Aug2021 <-`2021.08.td`
Sep2021<-`2021.09.td`
Oct2021<-`2021.10.td`
Nov2021<-`2021.11.td`
Dec2021<-`2021.12.td`

#Now I check to make sure all the data is formatted proprtly.

str(Jan2021)
'data.frame':   96834 obs. of  13 variables:
 $ ride_id           : chr  "E19E6F1B8D4C42ED" "DC88F20C2C55F27F" "EC45C94683FE3F27" "4FA453A75AE377DB" ...
 $ rideable_type     : chr  "electric_bike" "electric_bike" "electric_bike" "electric_bike" ...
 $ started_at        : chr  "2021-01-23 16:14:19" "2021-01-27 18:43:08" "2021-01-21 22:35:54" "2021-01-07 13:31:13" ...
 $ ended_at          : chr  "2021-01-23 16:24:44" "2021-01-27 18:47:12" "2021-01-21 22:37:14" "2021-01-07 13:42:55" ...
 $ start_station_name: chr  "California Ave & Cortez St" "California Ave & Cortez St" "California Ave & Cortez St" "California Ave & Cortez St" ...
 $ start_station_id  : chr  "17660" "17660" "17660" "17660" ...
 $ end_station_name  : chr  "" "" "" "" ...
 $ end_station_id    : chr  "" "" "" "" ...
 $ start_lat         : num  41.9 41.9 41.9 41.9 41.9 ...
 $ start_lng         : num  -87.7 -87.7 -87.7 -87.7 -87.7 ...
 $ end_lat           : num  41.9 41.9 41.9 41.9 41.9 ...
 $ end_lng           : num  -87.7 -87.7 -87.7 -87.7 -87.7 ...
 $ member_casual     : chr  "member" "member" "member" "member" ...
str(Feb2021)
'data.frame':   49622 obs. of  13 variables:
 $ ride_id           : chr  "89E7AA6C29227EFF" "0FEFDE2603568365" "E6159D746B2DBB91" "B32D3199F1C2E75B" ...
 $ rideable_type     : chr  "classic_bike" "classic_bike" "electric_bike" "classic_bike" ...
 $ started_at        : chr  "2021-02-12 16:14:56" "2021-02-14 17:52:38" "2021-02-09 19:10:18" "2021-02-02 17:49:41" ...
 $ ended_at          : chr  "2021-02-12 16:21:43" "2021-02-14 18:12:09" "2021-02-09 19:19:10" "2021-02-02 17:54:06" ...
 $ start_station_name: chr  "Glenwood Ave & Touhy Ave" "Glenwood Ave & Touhy Ave" "Clark St & Lake St" "Wood St & Chicago Ave" ...
 $ start_station_id  : chr  "525" "525" "KA1503000012" "637" ...
 $ end_station_name  : chr  "Sheridan Rd & Columbia Ave" "Bosworth Ave & Howard St" "State St & Randolph St" "Honore St & Division St" ...
 $ end_station_id    : chr  "660" "16806" "TA1305000029" "TA1305000034" ...
 $ start_lat         : num  42 42 41.9 41.9 41.8 ...
 $ start_lng         : num  -87.7 -87.7 -87.6 -87.7 -87.6 ...
 $ end_lat           : num  42 42 41.9 41.9 41.8 ...
 $ end_lng           : num  -87.7 -87.7 -87.6 -87.7 -87.6 ...
 $ member_casual     : chr  "member" "casual" "member" "member" ...
str(Mar2021)
'data.frame':   228496 obs. of  13 variables:
 $ ride_id           : chr  "CFA86D4455AA1030" "30D9DC61227D1AF3" "846D87A15682A284" "994D05AA75A168F2" ...
 $ rideable_type     : chr  "classic_bike" "classic_bike" "classic_bike" "classic_bike" ...
 $ started_at        : chr  "2021-03-16 08:32:30" "2021-03-28 01:26:28" "2021-03-11 21:17:29" "2021-03-11 13:26:42" ...
 $ ended_at          : chr  "2021-03-16 08:36:34" "2021-03-28 01:36:55" "2021-03-11 21:33:53" "2021-03-11 13:55:41" ...
 $ start_station_name: chr  "Humboldt Blvd & Armitage Ave" "Humboldt Blvd & Armitage Ave" "Shields Ave & 28th Pl" "Winthrop Ave & Lawrence Ave" ...
 $ start_station_id  : chr  "15651" "15651" "15443" "TA1308000021" ...
 $ end_station_name  : chr  "Stave St & Armitage Ave" "Central Park Ave & Bloomingdale Ave" "Halsted St & 35th St" "Broadway & Sheridan Rd" ...
 $ end_station_id    : chr  "13266" "18017" "TA1308000043" "13323" ...
 $ start_lat         : num  41.9 41.9 41.8 42 42 ...
 $ start_lng         : num  -87.7 -87.7 -87.6 -87.7 -87.7 ...
 $ end_lat           : num  41.9 41.9 41.8 42 42.1 ...
 $ end_lng           : num  -87.7 -87.7 -87.6 -87.6 -87.7 ...
 $ member_casual     : chr  "casual" "casual" "casual" "casual" ...
str(April2021)
'data.frame':   337230 obs. of  13 variables:
 $ ride_id           : chr  "6C992BD37A98A63F" "1E0145613A209000" "E498E15508A80BAD" "1887262AD101C604" ...
 $ rideable_type     : chr  "classic_bike" "docked_bike" "docked_bike" "classic_bike" ...
 $ started_at        : chr  "2021-04-12 18:25:36" "2021-04-27 17:27:11" "2021-04-03 12:42:45" "2021-04-17 09:17:42" ...
 $ ended_at          : chr  "2021-04-12 18:56:55" "2021-04-27 18:31:29" "2021-04-07 11:40:24" "2021-04-17 09:42:48" ...
 $ start_station_name: chr  "State St & Pearson St" "Dorchester Ave & 49th St" "Loomis Blvd & 84th St" "Honore St & Division St" ...
 $ start_station_id  : chr  "TA1307000061" "KA1503000069" "20121" "TA1305000034" ...
 $ end_station_name  : chr  "Southport Ave & Waveland Ave" "Dorchester Ave & 49th St" "Loomis Blvd & 84th St" "Southport Ave & Waveland Ave" ...
 $ end_station_id    : chr  "13235" "KA1503000069" "20121" "13235" ...
 $ start_lat         : num  41.9 41.8 41.7 41.9 41.7 ...
 $ start_lng         : num  -87.6 -87.6 -87.7 -87.7 -87.7 ...
 $ end_lat           : num  41.9 41.8 41.7 41.9 41.7 ...
 $ end_lng           : num  -87.7 -87.6 -87.7 -87.7 -87.7 ...
 $ member_casual     : chr  "member" "casual" "casual" "member" ...
str(May2021)
'data.frame':   531633 obs. of  13 variables:
 $ ride_id           : chr  "C809ED75D6160B2A" "DD59FDCE0ACACAF3" "0AB83CB88C43EFC2" "7881AC6D39110C60" ...
 $ rideable_type     : chr  "electric_bike" "electric_bike" "electric_bike" "electric_bike" ...
 $ started_at        : chr  "2021-05-30 11:58:15" "2021-05-30 11:29:14" "2021-05-30 14:24:01" "2021-05-30 14:25:51" ...
 $ ended_at          : chr  "2021-05-30 12:10:39" "2021-05-30 12:14:09" "2021-05-30 14:25:13" "2021-05-30 14:41:04" ...
 $ start_station_name: chr  "" "" "" "" ...
 $ start_station_id  : chr  "" "" "" "" ...
 $ end_station_name  : chr  "" "" "" "" ...
 $ end_station_id    : chr  "" "" "" "" ...
 $ start_lat         : num  41.9 41.9 41.9 41.9 41.9 ...
 $ start_lng         : num  -87.6 -87.6 -87.7 -87.7 -87.7 ...
 $ end_lat           : num  41.9 41.8 41.9 41.9 41.9 ...
 $ end_lng           : num  -87.6 -87.6 -87.7 -87.7 -87.7 ...
 $ member_casual     : chr  "casual" "casual" "casual" "casual" ...
str(June2021)
'data.frame':   729595 obs. of  13 variables:
 $ ride_id           : chr  "99FEC93BA843FB20" "06048DCFC8520CAF" "9598066F68045DF2" "B03C0FE48C412214" ...
 $ rideable_type     : chr  "electric_bike" "electric_bike" "electric_bike" "electric_bike" ...
 $ started_at        : chr  "2021-06-13 14:31:28" "2021-06-04 11:18:02" "2021-06-04 09:49:35" "2021-06-03 19:56:05" ...
 $ ended_at          : chr  "2021-06-13 14:34:11" "2021-06-04 11:24:19" "2021-06-04 09:55:34" "2021-06-03 20:21:55" ...
 $ start_station_name: chr  "" "" "" "" ...
 $ start_station_id  : chr  "" "" "" "" ...
 $ end_station_name  : chr  "" "" "" "" ...
 $ end_station_id    : chr  "" "" "" "" ...
 $ start_lat         : num  41.8 41.8 41.8 41.8 41.8 ...
 $ start_lng         : num  -87.6 -87.6 -87.6 -87.6 -87.6 ...
 $ end_lat           : num  41.8 41.8 41.8 41.8 41.8 ...
 $ end_lng           : num  -87.6 -87.6 -87.6 -87.6 -87.6 ...
 $ member_casual     : chr  "member" "member" "member" "member" ...
str(July2021)
'data.frame':   822410 obs. of  13 variables:
 $ ride_id           : chr  "0A1B623926EF4E16" "B2D5583A5A5E76EE" "6F264597DDBF427A" "379B58EAB20E8AA5" ...
 $ rideable_type     : chr  "docked_bike" "classic_bike" "classic_bike" "classic_bike" ...
 $ started_at        : chr  "2021-07-02 14:44:36" "2021-07-07 16:57:42" "2021-07-25 11:30:55" "2021-07-08 22:08:30" ...
 $ ended_at          : chr  "2021-07-02 15:19:58" "2021-07-07 17:16:09" "2021-07-25 11:48:45" "2021-07-08 22:23:32" ...
 $ start_station_name: chr  "Michigan Ave & Washington St" "California Ave & Cortez St" "Wabash Ave & 16th St" "California Ave & Cortez St" ...
 $ start_station_id  : chr  "13001" "17660" "SL-012" "17660" ...
 $ end_station_name  : chr  "Halsted St & North Branch St" "Wood St & Hubbard St" "Rush St & Hubbard St" "Carpenter St & Huron St" ...
 $ end_station_id    : chr  "KA1504000117" "13432" "KA1503000044" "13196" ...
 $ start_lat         : num  41.9 41.9 41.9 41.9 41.9 ...
 $ start_lng         : num  -87.6 -87.7 -87.6 -87.7 -87.7 ...
 $ end_lat           : num  41.9 41.9 41.9 41.9 41.9 ...
 $ end_lng           : num  -87.6 -87.7 -87.6 -87.7 -87.7 ...
 $ member_casual     : chr  "casual" "casual" "member" "member" ...
str(Aug2021)
'data.frame':   804352 obs. of  13 variables:
 $ ride_id           : chr  "99103BB87CC6C1BB" "EAFCCCFB0A3FC5A1" "9EF4F46C57AD234D" "5834D3208BFAF1DA" ...
 $ rideable_type     : chr  "electric_bike" "electric_bike" "electric_bike" "electric_bike" ...
 $ started_at        : chr  "2021-08-10 17:15:49" "2021-08-10 17:23:14" "2021-08-21 02:34:23" "2021-08-21 06:52:55" ...
 $ ended_at          : chr  "2021-08-10 17:22:44" "2021-08-10 17:39:24" "2021-08-21 02:50:36" "2021-08-21 07:08:13" ...
 $ start_station_name: chr  "" "" "" "" ...
 $ start_station_id  : chr  "" "" "" "" ...
 $ end_station_name  : chr  "" "" "" "" ...
 $ end_station_id    : chr  "" "" "" "" ...
 $ start_lat         : num  41.8 41.8 42 42 41.8 ...
 $ start_lng         : num  -87.7 -87.7 -87.7 -87.7 -87.6 ...
 $ end_lat           : num  41.8 41.8 42 42 41.8 ...
 $ end_lng           : num  -87.7 -87.6 -87.7 -87.7 -87.6 ...
 $ member_casual     : chr  "member" "member" "member" "member" ...
str(Sep2021)
'data.frame':   756147 obs. of  13 variables:
 $ ride_id           : chr  "9DC7B962304CBFD8" "F930E2C6872D6B32" "6EF72137900BB910" "78D1DE133B3DBF55" ...
 $ rideable_type     : chr  "electric_bike" "electric_bike" "electric_bike" "electric_bike" ...
 $ started_at        : chr  "2021-09-28 16:07:10" "2021-09-28 14:24:51" "2021-09-28 00:20:16" "2021-09-28 14:51:17" ...
 $ ended_at          : chr  "2021-09-28 16:09:54" "2021-09-28 14:40:05" "2021-09-28 00:23:57" "2021-09-28 15:00:06" ...
 $ start_station_name: chr  "" "" "" "" ...
 $ start_station_id  : chr  "" "" "" "" ...
 $ end_station_name  : chr  "" "" "" "" ...
 $ end_station_id    : chr  "" "" "" "" ...
 $ start_lat         : num  41.9 41.9 41.8 41.8 41.9 ...
 $ start_lng         : num  -87.7 -87.6 -87.7 -87.7 -87.7 ...
 $ end_lat           : num  41.9 42 41.8 41.8 41.9 ...
 $ end_lng           : num  -87.7 -87.7 -87.7 -87.7 -87.7 ...
 $ member_casual     : chr  "casual" "casual" "casual" "casual" ...
str(Oct2021)
'data.frame':   631226 obs. of  13 variables:
 $ ride_id           : chr  "620BC6107255BF4C" "4471C70731AB2E45" "26CA69D43D15EE14" "362947F0437E1514" ...
 $ rideable_type     : chr  "electric_bike" "electric_bike" "electric_bike" "electric_bike" ...
 $ started_at        : chr  "2021-10-22 12:46:42" "2021-10-21 09:12:37" "2021-10-16 16:28:39" "2021-10-16 16:17:48" ...
 $ ended_at          : chr  "2021-10-22 12:49:50" "2021-10-21 09:14:14" "2021-10-16 16:36:26" "2021-10-16 16:19:03" ...
 $ start_station_name: chr  "Kingsbury St & Kinzie St" "" "" "" ...
 $ start_station_id  : chr  "KA1503000043" "" "" "" ...
 $ end_station_name  : chr  "" "" "" "" ...
 $ end_station_id    : chr  "" "" "" "" ...
 $ start_lat         : num  41.9 41.9 41.9 41.9 41.9 ...
 $ start_lng         : num  -87.6 -87.7 -87.7 -87.7 -87.7 ...
 $ end_lat           : num  41.9 41.9 41.9 41.9 41.9 ...
 $ end_lng           : num  -87.6 -87.7 -87.7 -87.7 -87.7 ...
 $ member_casual     : chr  "member" "member" "member" "member" ...
str(Nov2021)
'data.frame':   359978 obs. of  13 variables:
 $ ride_id           : chr  "7C00A93E10556E47" "90854840DFD508BA" "0A7D10CDD144061C" "2F3BE33085BCFF02" ...
 $ rideable_type     : chr  "electric_bike" "electric_bike" "electric_bike" "electric_bike" ...
 $ started_at        : chr  "2021-11-27 13:27:38" "2021-11-27 13:38:25" "2021-11-26 22:03:34" "2021-11-27 09:56:49" ...
 $ ended_at          : chr  "2021-11-27 13:46:38" "2021-11-27 13:56:10" "2021-11-26 22:05:56" "2021-11-27 10:01:50" ...
 $ start_station_name: chr  "" "" "" "" ...
 $ start_station_id  : chr  "" "" "" "" ...
 $ end_station_name  : chr  "" "" "" "" ...
 $ end_station_id    : chr  "" "" "" "" ...
 $ start_lat         : num  41.9 42 42 41.9 41.9 ...
 $ start_lng         : num  -87.7 -87.7 -87.7 -87.8 -87.6 ...
 $ end_lat           : num  42 41.9 42 41.9 41.9 ...
 $ end_lng           : num  -87.7 -87.7 -87.7 -87.8 -87.6 ...
 $ member_casual     : chr  "casual" "casual" "casual" "casual" ...
str(Dec2021)
'data.frame':   131573 obs. of  13 variables:
 $ ride_id           : chr  "70B6A9A437D4C30D" "158A465D4E74C54A" "5262016E0F1F2F9A" "BE119628E44F871E" ...
 $ rideable_type     : chr  "classic_bike" "electric_bike" "electric_bike" "electric_bike" ...
 $ started_at        : chr  "2020-12-27 12:44:29" "2020-12-18 17:37:15" "2020-12-15 15:04:33" "2020-12-15 15:54:18" ...
 $ ended_at          : chr  "2020-12-27 12:55:06" "2020-12-18 17:44:19" "2020-12-15 15:11:28" "2020-12-15 16:00:11" ...
 $ start_station_name: chr  "Aberdeen St & Jackson Blvd" "" "" "" ...
 $ start_station_id  : chr  "13157" "" "" "" ...
 $ end_station_name  : chr  "Desplaines St & Kinzie St" "" "" "" ...
 $ end_station_id    : chr  "TA1306000003" "" "" "" ...
 $ start_lat         : num  41.9 41.9 41.9 41.9 41.8 ...
 $ start_lng         : num  -87.7 -87.7 -87.7 -87.7 -87.6 ...
 $ end_lat           : num  41.9 41.9 41.9 41.9 41.8 ...
 $ end_lng           : num  -87.6 -87.7 -87.7 -87.7 -87.6 ...
 $ member_casual     : chr  "member" "member" "member" "member" ...

#Now I am going to take all of my data frames and combine them using bind_row to make a new data frame and name it.

ride_2021 <- bind_rows(Jan2021, Feb2021, Mar2021, April2021, May2021, June2021, July2021, Aug2021, Sep2021, Oct2021, Nov2021, Dec2021)

#I am going to rename some of the columns to help make it easier.

ride_2021 <- rename(ride_2021, customer_type = member_casual,bike_type = rideable_type)
ride_2021 <- rename(ride_2021, start_time = started_at)

This is where the data cleaning process starts.

#Here I am going to make new columns and formats for Date, Month, Day and day of the week.

ride_2021$date <- as.Date(ride_2021$start_time)
ride_2021$week_day <- format(as.Date(ride_2021$date), "%A")
ride_2021$month <- format(as.Date(ride_2021$date), "%m")
ride_2021$year<-format(ride_2021$date,"%Y")

#Here I will put the days of the week in order.

ride_2021$week_day <- ordered(ride_2021$week_day, 
                                     levels=c("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", 
                                              "Friday", "Saturday"))

#Now I am going to figure out the trip durations.

ride_2021$ride_length <-difftime(ride_2021$ended_at,ride_2021$start_time,units = "mins")

#Now I am going to filter out anything over 1 day, 1440 minutes.

ride_2021 <- ride_2021[!ride_2021$ride_length>1440,]

#Next I will make a new data frame for all the cleaned data. I will also be taking any trips that were 0 seconds or less out of that data frame.

ride_2021<- ride_2021[!(ride_2021$ride_length<=0),]

#Now I am going to remove any blanks from the start station name and end station name.

ride_2021 <- ride_2021 %>%
  filter(
    !(is.na(start_station_name) |
        start_station_name == "")) %>% 
  
  filter(
    !(is.na(end_station_name) |
        end_station_name == ""))

#Here I am making sure there are no duplicutes in my clean data by running a ride_id_check. This should come back as 0.

ride_id_check <- ride_2021 %>%
  count(ride_id) %>%
  filter(n > 1)

Data Annlysis

#Now I will find out how many of each rider type there is. I will be naming each of these next steps and saving them as data frames.

num_of_rider <-view(table(ride_2021$customer_type))

#Here we find out how many minutes each rider type use the bike service for.

ride_length_each <-view(setNames(aggregate(ride_length ~ customer_type, ride_2021, sum), 
              c("customer_type", " total_ride_length(mins)")))

#This is the mean, max, and min for both casual and member riders.

ride_diff <- view(ride_2021 %>% 
       group_by(customer_type) %>% 
       summarise(min_length_minutes = min(ride_length), max_length_minutes = max(ride_length), 
                 median_length_minutes = median(ride_length), mean_length_minutes = mean(ride_length)))

#This is how I find the average number of rides a day

avg_weekday <-view(ride_2021 %>% 
       group_by(week_day) %>% 
       summarize(Avg_length = mean(ride_length),
                 number_of_rides = n())
     )

#Now I will find the average number of rides a month.

avg_month <-view(ride_2021 %>% 
       group_by(month) %>% 
       summarize(Avg_length = mean(ride_length),
                 number_of_rides = n())
)

#Here I find the average ride length by rider type per weekday.

avg_ride_length <-view(aggregate(ride_2021$ride_length ~ ride_2021$customer_type + 
            ride_2021$week_day, FUN = mean))

Graphs

#Next I am going to start my graphs to show the two types of riders, casual and member. I will have one for rides per day of the week and one for rides per month.

options(scipen = 999)
ggplot(data = ride_2021) +
  aes(x = week_day, fill = customer_type) +
  geom_bar(position = 'dodge') +
  labs(x = 'Day of week', y = 'Number of rides', fill = 'Customer Type', title = 'Number of rides by member type',subtitle = 'One week of rides')

ggplot(data=ride_2021)+
  aes(x=month,fill=customer_type) +
  geom_bar(position = 'dodge')+
  labs(title= 'Number of rides a month shown by rider type')

Conclusion

I have found that casual riders tend to use the bike passes more on weekends and during the summer months. The annual members seem to use the bikes pretty consistently throughout the week. I believe from my findings that if you charged more on weekends and during the summer for the one day passes and ride passes and offered a discount on the annual membership it would help convert riders. I believe the best time to advertise these discounts for the annual passes would be before the summer months hit, I believe this because if people were to see this while planning there summer vacations/plans it would make them be more open to it. I believe a good digital way to advertise this would be to put these new rates on the website or app so that when someone bought a ride pass or a one day pass they would see the savings they would get if they signed up for the annual membership. I believe another thing that might help covert casual riders would to be to offer a bring a friend pass. Instead of having to pay per person an annual rider could bring a friend with them a few times a year by using a one time code. This would also help boost new members.

LS0tDQp0aXRsZTogQ3ljbGlzdGljIGNhc2Ugc3R1ZHkNCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KQXVydGhlcjogQXNobGV5DQotLS0NCiMgIElOVFJPRFVDVElPTg0KDQpUaGlzIGlzIG15IENhcHN0b25lIFByb2plY3QuIEkgY2hvc2UgdG8gZG8gdGhlIEN5Y2xpc3RpYyBCaWtlIFNoYXJlIGNhc2Ugc3R1ZHkuIEN5Y2xpc3RpYyBpcyBhIGJpa2Ugc2hhcmluZyBjb21wYW55IHRoYXQgaGFzIG92ZXIgNTgwMCBiaWtlcyBhbmQgNjAwIGRvY2tpbmcgc3RhdGlvbnMgaW4gdGhlIENoaWNhZ28gYXJlYSB0aGF0IGxhdW5jaGVkIGluIDIwMTYuIEl0IG9mZmVycyBvbmUgZGF5IHBhc3NlcyBhbmQgc2luZ2xlIHJpZGUgcGFzc2VzLCB0aGUgcGVvcGxlIHRoYXQgdXNlIHRoZXNlIGFyZSBrbm93IGFzIENhc3VhbCBNZW1iZXJzLiBUaGV5IGFsc28gb2ZmZXIgYSBhbm51YWwgbWVtYmVyc2hpcC4NCg0KVGhlIGdvYWwgb2YgdGhpcyBwcm9qZWN0IGlzIHRvIGZpbmQgYSB3YXkgdG8gY29udmVydCBDYXN1YWwgcmlkZXJzIHRvIE1lbWJlcnMuIFRvIGRvIHRoaXMgSSB3aWxsIGhhdmUgdG8gYW5zd2VyIGEgZmV3IHF1ZXN0aW9ucy4NCg0KSG93IGRvIGFubnVhbCBtZW1iZXJzIGFuZCBjYXN1YWwgcmlkZXJzIHVzZSB0aGUgQ3ljbGlzdGljIGJpa2VzIGRpZmZlcmVudGx5Pw0KDQpXaHkgd291bGQgY2FzdWFsIHJpZGVycyBidXkgYW4gYW5udWFsIEN5Y2xpc3RpYyBtZW1iZXJzaGlwPw0KDQpIb3cgY2FuIGRpZ2l0YWwgbWVkaWEgYmUgdXNlZCBieSBDeWNsaXN0aWMgdG8gaW5mbHVlbmNlIHRoZSBjYXN1YWwgcmlkZXJzIHRvIGdldCBhbiBhbm51YWwgbWVtYmVyc2hpcD8NCg0KSSBjaG9zZSB0byB1c2UgUlN0dWRpbyB0byBkbyB0aGlzIHByb2plY3QgYmVjYXVzZSBSc3R1ZGlvIGNhbiBzdG9yZSBhbmQgcHJvY2VzcyBhIGxhcmdlIGFtb3VudCBvZiBkYXRhLiANCg0KVGhlIGRhdGEgdGhhdCBJIHdpbGwgYmUgdXNpbmcgY2FtZSBmcm9tIGEgcHVibGljIGRhdGFzZXQgbG9jYXRlZCBhdCBodHRwczovL2RpdnZ5LXRyaXBkYXRhLnMzLmFtYXpvbmF3cy5jb20vaW5kZXguaHRtbC4gVGhlIGRhdGEgaGFzIGJlZW4gbWFkZSBhdmFpbGFibGUgYnkgTW90aXZhdGUgSW50ZXJuYXRpb25hbCBJbmMuIHVuZGVyIGh0dHBzOi8vcmlkZS5kaXZ2eWJpa2VzLmNvbS9kYXRhLWxpY2Vuc2UtYWdyZWVtZW50Lg0KDQojVG8gc3RhcnQgd2UgbmVlZCB0byBpbnN0YWxsIHRoZSBwYWNrYWdlcyBmcm9tIFIgdGhhdCB3ZSB3aWxsIG5lZWQuDQpgYGB7ciBpbnN0YWxsIHRoZSBwYWNrYWdlc30NCmluc3RhbGwucGFja2FnZXMoJ3RpZHl2ZXJzZScpDQppbnN0YWxsLnBhY2thZ2VzKCdqYW5pdG9yJykNCmluc3RhbGwucGFja2FnZXMoJ2x1YnJpZGF0ZScpDQppbnN0YWxsLnBhY2thZ2VzKCdnZ3Bsb3QyJykNCmluc3RhbGwucGFja2FnZXMoJ3JlYWRyJykNCmluc3RhbGwucGFja2FnZXMoJ2RwbHlyJykNCmluc3RhbGwucGFja2FnZXMoJ2dncGxvdDInKQ0KYGBgDQoNCiNOZXh0IHdlIG5lZWQgdG8gbG9hZCB0aGVtIGJ5IHVzaW5nIExpYnJhcnkuDQoNCmBgYHtyIGxvYWQgcGFja2FnZXN9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoamFuaXRvcikNCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShyZWFkcikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpgYGANCg0KIyAgQ29sbGVjdGluZyBhbmQgb3JnYW5pemluZyB0aGUgZGF0YS4NCg0KI0kgZG93bmxvYWRlZCBteSBkYXRhIGZyb20gdGhlIHB1YmxpYyBkYXRhIGJhc2UgYW5kIHVzZWQgSmFudWFyeSAyMDIxIHRocm91Z2ggRGVjZW1iZXIgMjAyMS4gSSBzYXZlZCB0aGlzIGRhdGEgaW4gYSBmb2xkZXIgb24gbXkgZGVza3RvcCBuYW1lZCBiaWtlX3RyaXBfZGF0YS4NCg0KI05vdyBJIG5lZWQgdG8gdXBsb2FkIG15IGRhdGEgZmlsZXMgZm9yIG15IGNvbXB1dGVyIHRvIFJTdHVkaW8uDQoNCmBgYHtyIGltcG9ydCB0aGUgZGF0YSBmcm9tIG15IGRla3RvcCB0byBSU3R1ZGlvfQ0KYDIwMjEuMDEudGRgIDwtIHJlYWQuY3N2KCJDOi9Vc2Vycy9hc2hsZS9PbmVEcml2ZS9EZXNrdG9wL2Jpa2VfdHJpcF9kYXRhLzIwMjEuMDEudGQuY3N2IikNCmAyMDIxLjAyLnRkYCA8LSByZWFkLmNzdigiQzovVXNlcnMvYXNobGUvT25lRHJpdmUvRGVza3RvcC9iaWtlX3RyaXBfZGF0YS8yMDIxLjAyLnRkLmNzdiIpDQpgMjAyMS4wMy50ZGAgPC0gcmVhZC5jc3YoIkM6L1VzZXJzL2FzaGxlL09uZURyaXZlL0Rlc2t0b3AvYmlrZV90cmlwX2RhdGEvMjAyMS4wMy50ZC5jc3YiKQ0KYDIwMjEuMDQudGRgIDwtIHJlYWQuY3N2KCJDOi9Vc2Vycy9hc2hsZS9PbmVEcml2ZS9EZXNrdG9wL2Jpa2VfdHJpcF9kYXRhLzIwMjEuMDQudGQuY3N2IikNCmAyMDIxLjA1LnRkYCA8LSByZWFkLmNzdigiQzovVXNlcnMvYXNobGUvT25lRHJpdmUvRGVza3RvcC9iaWtlX3RyaXBfZGF0YS8yMDIxLjA1LnRkLmNzdiIpDQpgMjAyMS4wNi50ZGAgPC0gcmVhZC5jc3YoIkM6L1VzZXJzL2FzaGxlL09uZURyaXZlL0Rlc2t0b3AvYmlrZV90cmlwX2RhdGEvMjAyMS4wNi50ZC5jc3YiKQ0KYDIwMjEuMDcudGRgIDwtIHJlYWQuY3N2KCJDOi9Vc2Vycy9hc2hsZS9PbmVEcml2ZS9EZXNrdG9wL2Jpa2VfdHJpcF9kYXRhLzIwMjEuMDcudGQuY3N2IikNCmAyMDIxLjA4LnRkYCA8LSByZWFkLmNzdigiQzovVXNlcnMvYXNobGUvT25lRHJpdmUvRGVza3RvcC9iaWtlX3RyaXBfZGF0YS8yMDIxLjA4LnRkLmNzdiIpDQpgMjAyMS4wOS50ZGAgPC0gcmVhZC5jc3YoIkM6L1VzZXJzL2FzaGxlL09uZURyaXZlL0Rlc2t0b3AvYmlrZV90cmlwX2RhdGEvMjAyMS4wOS50ZC5jc3YiKQ0KYDIwMjEuMTAudGRgIDwtIHJlYWQuY3N2KCJDOi9Vc2Vycy9hc2hsZS9PbmVEcml2ZS9EZXNrdG9wL2Jpa2VfdHJpcF9kYXRhLzIwMjEuMTAudGQuY3N2IikNCmAyMDIxLjExLnRkYCA8LSByZWFkLmNzdigiQzovVXNlcnMvYXNobGUvT25lRHJpdmUvRGVza3RvcC9iaWtlX3RyaXBfZGF0YS8yMDIxLjExLnRkLmNzdiIpDQpgMjAyMS4xMi50ZGAgPC0gcmVhZC5jc3YoIkM6L1VzZXJzL2FzaGxlL09uZURyaXZlL0Rlc2t0b3AvYmlrZV90cmlwX2RhdGEvMjAyMS4xMi50ZC5jc3YiKQ0KYGBgDQoNCiNOb3cgSSBhbSBnb2luZyB0byByZW5hbWUgdGhlIGZpbGVzIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGtub3cgd2hhdCB0aGV5IGFyZS4NCg0KYGBge3IgcmVuYW1pbmcgZGF0YSB0byBtYWtlIGl0IGVhc2llciB0byBpZGVudGlmeX0NCkphbjIwMjEgPC1gMjAyMS4wMS50ZGANCkZlYjIwMjEgPC1gMjAyMS4wMi50ZGANCk1hcjIwMjEgPC1gMjAyMS4wMy50ZGANCkFwcmlsMjAyMSA8LWAyMDIxLjA0LnRkYA0KTWF5MjAyMSA8LWAyMDIxLjA1LnRkYA0KSnVuZTIwMjEgPC1gMjAyMS4wNi50ZGANCkp1bHkyMDIxIDwtYDIwMjEuMDcudGRgDQpBdWcyMDIxIDwtYDIwMjEuMDgudGRgDQpTZXAyMDIxPC1gMjAyMS4wOS50ZGANCk9jdDIwMjE8LWAyMDIxLjEwLnRkYA0KTm92MjAyMTwtYDIwMjEuMTEudGRgDQpEZWMyMDIxPC1gMjAyMS4xMi50ZGANCmBgYA0KDQojTm93IEkgY2hlY2sgdG8gbWFrZSBzdXJlIGFsbCB0aGUgZGF0YSBpcyBmb3JtYXR0ZWQgcHJvcHJ0bHkuDQoNCmBgYHtyIGNoZWNraW5nIGZvcm1hdH0NCnN0cihKYW4yMDIxKQ0Kc3RyKEZlYjIwMjEpDQpzdHIoTWFyMjAyMSkNCnN0cihBcHJpbDIwMjEpDQpzdHIoTWF5MjAyMSkNCnN0cihKdW5lMjAyMSkNCnN0cihKdWx5MjAyMSkNCnN0cihBdWcyMDIxKQ0Kc3RyKFNlcDIwMjEpDQpzdHIoT2N0MjAyMSkNCnN0cihOb3YyMDIxKQ0Kc3RyKERlYzIwMjEpDQpgYGANCg0KI05vdyBJIGFtIGdvaW5nIHRvIHRha2UgYWxsIG9mIG15IGRhdGEgZnJhbWVzIGFuZCBjb21iaW5lIHRoZW0gdXNpbmcgYmluZF9yb3cgdG8gbWFrZSBhIG5ldyBkYXRhIGZyYW1lIGFuZCBuYW1lIGl0Lg0KDQpgYGB7ciBjb21iaW5pbmcgZGF0YSBmcmFtZSBhbmQgbmFtaW5nIGl0fQ0KcmlkZV8yMDIxIDwtIGJpbmRfcm93cyhKYW4yMDIxLCBGZWIyMDIxLCBNYXIyMDIxLCBBcHJpbDIwMjEsIE1heTIwMjEsIEp1bmUyMDIxLCBKdWx5MjAyMSwgQXVnMjAyMSwgU2VwMjAyMSwgT2N0MjAyMSwgTm92MjAyMSwgRGVjMjAyMSkNCmBgYA0KI0kgYW0gZ29pbmcgdG8gcmVuYW1lIHNvbWUgb2YgdGhlIGNvbHVtbnMgdG8gaGVscCBtYWtlIGl0IGVhc2llci4NCg0KYGBge3J9DQpyaWRlXzIwMjEgPC0gcmVuYW1lKHJpZGVfMjAyMSwgY3VzdG9tZXJfdHlwZSA9IG1lbWJlcl9jYXN1YWwsYmlrZV90eXBlID0gcmlkZWFibGVfdHlwZSkNCnJpZGVfMjAyMSA8LSByZW5hbWUocmlkZV8yMDIxLCBzdGFydF90aW1lID0gc3RhcnRlZF9hdCkNCmBgYA0KIyBUaGlzIGlzIHdoZXJlIHRoZSBkYXRhIGNsZWFuaW5nIHByb2Nlc3Mgc3RhcnRzLg0KDQojSGVyZSBJIGFtIGdvaW5nIHRvIG1ha2UgbmV3IGNvbHVtbnMgYW5kIGZvcm1hdHMgZm9yIERhdGUsIE1vbnRoLCBEYXkgYW5kIGRheSBvZiB0aGUgd2Vlay4NCg0KYGBge3J9DQpyaWRlXzIwMjEkZGF0ZSA8LSBhcy5EYXRlKHJpZGVfMjAyMSRzdGFydF90aW1lKQ0KcmlkZV8yMDIxJHdlZWtfZGF5IDwtIGZvcm1hdChhcy5EYXRlKHJpZGVfMjAyMSRkYXRlKSwgIiVBIikNCnJpZGVfMjAyMSRtb250aCA8LSBmb3JtYXQoYXMuRGF0ZShyaWRlXzIwMjEkZGF0ZSksICIlbSIpDQpyaWRlXzIwMjEkeWVhcjwtZm9ybWF0KHJpZGVfMjAyMSRkYXRlLCIlWSIpDQpgYGANCiNIZXJlIEkgd2lsbCBwdXQgdGhlIGRheXMgb2YgdGhlIHdlZWsgaW4gb3JkZXIuDQoNCmBgYHtyfQ0KcmlkZV8yMDIxJHdlZWtfZGF5IDwtIG9yZGVyZWQocmlkZV8yMDIxJHdlZWtfZGF5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHM9YygiU3VuZGF5IiwgIk1vbmRheSIsICJUdWVzZGF5IiwgIldlZG5lc2RheSIsICJUaHVyc2RheSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGcmlkYXkiLCAiU2F0dXJkYXkiKSkNCmBgYA0KDQojTm93IEkgYW0gZ29pbmcgdG8gZmlndXJlIG91dCB0aGUgdHJpcCBkdXJhdGlvbnMuDQpgYGB7cn0NCnJpZGVfMjAyMSRyaWRlX2xlbmd0aCA8LWRpZmZ0aW1lKHJpZGVfMjAyMSRlbmRlZF9hdCxyaWRlXzIwMjEkc3RhcnRfdGltZSx1bml0cyA9ICJtaW5zIikNCmBgYA0KDQojTm93IEkgYW0gZ29pbmcgdG8gZmlsdGVyIG91dCBhbnl0aGluZyBvdmVyIDEgZGF5LCAxNDQwIG1pbnV0ZXMuDQoNCmBgYHtyfQ0KcmlkZV8yMDIxIDwtIHJpZGVfMjAyMVshcmlkZV8yMDIxJHJpZGVfbGVuZ3RoPjE0NDAsXQ0KYGBgDQoNCg0KI05leHQgSSB3aWxsIG1ha2UgYSBuZXcgZGF0YSBmcmFtZSBmb3IgYWxsIHRoZSBjbGVhbmVkIGRhdGEuIEkgd2lsbCBhbHNvIGJlIHRha2luZyBhbnkgdHJpcHMgdGhhdCB3ZXJlIDAgc2Vjb25kcyBvciBsZXNzIG91dCBvZiB0aGF0IGRhdGEgZnJhbWUuDQoNCmBgYHtyfQ0KcmlkZV8yMDIxPC0gcmlkZV8yMDIxWyEocmlkZV8yMDIxJHJpZGVfbGVuZ3RoPD0wKSxdDQpgYGANCg0KI05vdyBJIGFtIGdvaW5nIHRvIHJlbW92ZSBhbnkgYmxhbmtzIGZyb20gdGhlIHN0YXJ0IHN0YXRpb24gbmFtZSBhbmQgZW5kIHN0YXRpb24gbmFtZS4NCmBgYHtyfQ0KcmlkZV8yMDIxIDwtIHJpZGVfMjAyMSAlPiUNCiAgZmlsdGVyKA0KICAgICEoaXMubmEoc3RhcnRfc3RhdGlvbl9uYW1lKSB8DQogICAgICAgIHN0YXJ0X3N0YXRpb25fbmFtZSA9PSAiIikpICU+JSANCiAgDQogIGZpbHRlcigNCiAgICAhKGlzLm5hKGVuZF9zdGF0aW9uX25hbWUpIHwNCiAgICAgICAgZW5kX3N0YXRpb25fbmFtZSA9PSAiIikpDQpgYGANCg0KI0hlcmUgSSBhbSBtYWtpbmcgc3VyZSB0aGVyZSBhcmUgbm8gZHVwbGljdXRlcyBpbiBteSBjbGVhbiBkYXRhIGJ5IHJ1bm5pbmcgYSByaWRlX2lkX2NoZWNrLiBUaGlzIHNob3VsZCBjb21lIGJhY2sgYXMgMC4NCg0KYGBge3J9DQpyaWRlX2lkX2NoZWNrIDwtIHJpZGVfMjAyMSAlPiUNCiAgY291bnQocmlkZV9pZCkgJT4lDQogIGZpbHRlcihuID4gMSkNCmBgYA0KIyAgRGF0YSBBbm5seXNpcyANCg0KI05vdyBJIHdpbGwgZmluZCBvdXQgaG93IG1hbnkgb2YgZWFjaCByaWRlciB0eXBlIHRoZXJlIGlzLiBJIHdpbGwgYmUgbmFtaW5nIGVhY2ggb2YgdGhlc2UgbmV4dCBzdGVwcyBhbmQgc2F2aW5nIHRoZW0gYXMgZGF0YSBmcmFtZXMuDQpgYGB7cn0NCm51bV9vZl9yaWRlciA8LXZpZXcodGFibGUocmlkZV8yMDIxJGN1c3RvbWVyX3R5cGUpKQ0KYGBgDQojSGVyZSB3ZSBmaW5kIG91dCBob3cgbWFueSBtaW51dGVzIGVhY2ggcmlkZXIgdHlwZSB1c2UgdGhlIGJpa2Ugc2VydmljZSBmb3IuDQpgYGB7cn0NCnJpZGVfbGVuZ3RoX2VhY2ggPC12aWV3KHNldE5hbWVzKGFnZ3JlZ2F0ZShyaWRlX2xlbmd0aCB+IGN1c3RvbWVyX3R5cGUsIHJpZGVfMjAyMSwgc3VtKSwgDQogICAgICAgICAgICAgIGMoImN1c3RvbWVyX3R5cGUiLCAiIHRvdGFsX3JpZGVfbGVuZ3RoKG1pbnMpIikpKQ0KYGBgDQojVGhpcyBpcyB0aGUgbWVhbiwgbWF4LCBhbmQgbWluIGZvciBib3RoIGNhc3VhbCBhbmQgbWVtYmVyIHJpZGVycy4NCg0KYGBge3J9DQpyaWRlX2RpZmYgPC0gdmlldyhyaWRlXzIwMjEgJT4lIA0KICAgICAgIGdyb3VwX2J5KGN1c3RvbWVyX3R5cGUpICU+JSANCiAgICAgICBzdW1tYXJpc2UobWluX2xlbmd0aF9taW51dGVzID0gbWluKHJpZGVfbGVuZ3RoKSwgbWF4X2xlbmd0aF9taW51dGVzID0gbWF4KHJpZGVfbGVuZ3RoKSwgDQogICAgICAgICAgICAgICAgIG1lZGlhbl9sZW5ndGhfbWludXRlcyA9IG1lZGlhbihyaWRlX2xlbmd0aCksIG1lYW5fbGVuZ3RoX21pbnV0ZXMgPSBtZWFuKHJpZGVfbGVuZ3RoKSkpDQpgYGANCiNUaGlzIGlzIGhvdyBJIGZpbmQgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIHJpZGVzIGEgZGF5DQoNCmBgYHtyfQ0KYXZnX3dlZWtkYXkgPC12aWV3KHJpZGVfMjAyMSAlPiUgDQogICAgICAgZ3JvdXBfYnkod2Vla19kYXkpICU+JSANCiAgICAgICBzdW1tYXJpemUoQXZnX2xlbmd0aCA9IG1lYW4ocmlkZV9sZW5ndGgpLA0KICAgICAgICAgICAgICAgICBudW1iZXJfb2ZfcmlkZXMgPSBuKCkpDQogICAgICkNCg0KYGBgDQojTm93IEkgd2lsbCBmaW5kIHRoZSBhdmVyYWdlIG51bWJlciBvZiByaWRlcyBhIG1vbnRoLg0KDQpgYGB7cn0NCmF2Z19tb250aCA8LXZpZXcocmlkZV8yMDIxICU+JSANCiAgICAgICBncm91cF9ieShtb250aCkgJT4lIA0KICAgICAgIHN1bW1hcml6ZShBdmdfbGVuZ3RoID0gbWVhbihyaWRlX2xlbmd0aCksDQogICAgICAgICAgICAgICAgIG51bWJlcl9vZl9yaWRlcyA9IG4oKSkNCikNCg0KYGBgDQojSGVyZSBJIGZpbmQgdGhlIGF2ZXJhZ2UgcmlkZSBsZW5ndGggYnkgcmlkZXIgdHlwZSBwZXIgd2Vla2RheS4NCmBgYHtyfQ0KYXZnX3JpZGVfbGVuZ3RoIDwtdmlldyhhZ2dyZWdhdGUocmlkZV8yMDIxJHJpZGVfbGVuZ3RoIH4gcmlkZV8yMDIxJGN1c3RvbWVyX3R5cGUgKyANCiAgICAgICAgICAgIHJpZGVfMjAyMSR3ZWVrX2RheSwgRlVOID0gbWVhbikpDQpgYGANCiMgIEdyYXBocw0KDQojTmV4dCBJIGFtIGdvaW5nIHRvIHN0YXJ0IG15IGdyYXBocyB0byBzaG93IHRoZSB0d28gdHlwZXMgb2YgcmlkZXJzLCBjYXN1YWwgYW5kIG1lbWJlci4gSSB3aWxsIGhhdmUgb25lIGZvciByaWRlcyBwZXIgZGF5IG9mIHRoZSB3ZWVrIGFuZCBvbmUgZm9yIHJpZGVzIHBlciBtb250aC4gDQoNCg0KYGBge3IgV2VlayBvZiByaWRlc30NCm9wdGlvbnMoc2NpcGVuID0gOTk5KQ0KZ2dwbG90KGRhdGEgPSByaWRlXzIwMjEpICsNCiAgYWVzKHggPSB3ZWVrX2RheSwgZmlsbCA9IGN1c3RvbWVyX3R5cGUpICsNCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAnZG9kZ2UnKSArDQogIGxhYnMoeCA9ICdEYXkgb2Ygd2VlaycsIHkgPSAnTnVtYmVyIG9mIHJpZGVzJywgZmlsbCA9ICdDdXN0b21lciBUeXBlJywgdGl0bGUgPSAnTnVtYmVyIG9mIHJpZGVzIGJ5IG1lbWJlciB0eXBlJyxzdWJ0aXRsZSA9ICdPbmUgd2VlayBvZiByaWRlcycpDQoNCmBgYA0KDQpgYGB7cn0NCmdncGxvdChkYXRhPXJpZGVfMjAyMSkrDQogIGFlcyh4PW1vbnRoLGZpbGw9Y3VzdG9tZXJfdHlwZSkgKw0KICBnZW9tX2Jhcihwb3NpdGlvbiA9ICdkb2RnZScpKw0KICBsYWJzKHRpdGxlPSAnTnVtYmVyIG9mIHJpZGVzIGEgbW9udGggc2hvd24gYnkgcmlkZXIgdHlwZScpDQpgYGANCg0KIyAgQ29uY2x1c2lvbiANCg0KSSBoYXZlIGZvdW5kIHRoYXQgY2FzdWFsIHJpZGVycyB0ZW5kIHRvIHVzZSB0aGUgYmlrZSBwYXNzZXMgbW9yZSBvbiB3ZWVrZW5kcyBhbmQgZHVyaW5nIHRoZSBzdW1tZXIgbW9udGhzLg0KVGhlIGFubnVhbCBtZW1iZXJzIHNlZW0gdG8gdXNlIHRoZSBiaWtlcyBwcmV0dHkgY29uc2lzdGVudGx5IHRocm91Z2hvdXQgdGhlIHdlZWsuIEkgYmVsaWV2ZSBmcm9tIG15IGZpbmRpbmdzIHRoYXQgaWYgeW91IGNoYXJnZWQgbW9yZSBvbiB3ZWVrZW5kcyBhbmQgZHVyaW5nIHRoZSBzdW1tZXIgZm9yIHRoZSBvbmUgZGF5IHBhc3NlcyBhbmQgcmlkZSBwYXNzZXMgYW5kIG9mZmVyZWQgYSBkaXNjb3VudCBvbiB0aGUgYW5udWFsIG1lbWJlcnNoaXAgaXQgd291bGQgaGVscCBjb252ZXJ0IHJpZGVycy4gDQpJIGJlbGlldmUgdGhlIGJlc3QgdGltZSB0byBhZHZlcnRpc2UgdGhlc2UgZGlzY291bnRzIGZvciB0aGUgYW5udWFsIHBhc3NlcyB3b3VsZCBiZSBiZWZvcmUgdGhlIHN1bW1lciBtb250aHMgaGl0LCBJIGJlbGlldmUgdGhpcyBiZWNhdXNlIGlmIHBlb3BsZSB3ZXJlIHRvIHNlZSB0aGlzIHdoaWxlIHBsYW5uaW5nIHRoZXJlIHN1bW1lciB2YWNhdGlvbnMvcGxhbnMgaXQgd291bGQgbWFrZSB0aGVtIGJlIG1vcmUgb3BlbiB0byBpdC4gDQpJIGJlbGlldmUgYSBnb29kIGRpZ2l0YWwgd2F5IHRvIGFkdmVydGlzZSB0aGlzIHdvdWxkIGJlIHRvIHB1dCB0aGVzZSBuZXcgcmF0ZXMgb24gdGhlIHdlYnNpdGUgb3IgYXBwIHNvIHRoYXQgd2hlbiBzb21lb25lIGJvdWdodCBhIHJpZGUgcGFzcyBvciBhIG9uZSBkYXkgcGFzcyB0aGV5IHdvdWxkIHNlZSB0aGUgc2F2aW5ncyB0aGV5IHdvdWxkIGdldCBpZiB0aGV5IHNpZ25lZCB1cCBmb3IgdGhlIGFubnVhbCBtZW1iZXJzaGlwLiANCkkgYmVsaWV2ZSBhbm90aGVyIHRoaW5nIHRoYXQgbWlnaHQgaGVscCBjb3ZlcnQgY2FzdWFsIHJpZGVycyB3b3VsZCB0byBiZSB0byBvZmZlciBhIGJyaW5nIGEgZnJpZW5kIHBhc3MuIEluc3RlYWQgb2YgaGF2aW5nIHRvIHBheSBwZXIgcGVyc29uIGFuIGFubnVhbCByaWRlciBjb3VsZCBicmluZyBhIGZyaWVuZCB3aXRoIHRoZW0gYSBmZXcgdGltZXMgYSB5ZWFyIGJ5IHVzaW5nIGEgb25lIHRpbWUgY29kZS4gVGhpcyB3b3VsZCBhbHNvIGhlbHAgYm9vc3QgbmV3IG1lbWJlcnMuDQoNCg==