Background

Assignment 5: Tidying and Transforming Data

Following are the goal’s for this assignment:
-Transform data between wide and long formats using tidyr package
-Change shapes of data frames using dplyr package
-Perform data transformations to support downstream data analysis

Acquire Data

In this instance, used the assignment’s PDF document as the data source to create a csv dataset using Excel. This dataset stored on GitHub.

theURL = "https://raw.githubusercontent.com/CUNYSPS-RickRN/Team607-1/master/Wk05_airline_arrival_status.csv"

arrivals_df <- read_csv(theURL, col_names = TRUE)
## Parsed with column specification:
## cols(
##   Airline = col_character(),
##   Status = col_character(),
##   LAX = col_double(),
##   PHX = col_double(),
##   SD = col_double(),
##   SFO = col_double(),
##   SEA = col_double()
## )
arrivals_df
## # A tibble: 5 x 7
##   Airline Status    LAX   PHX    SD   SFO   SEA
##   <chr>   <chr>   <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 Alaska  on time   497   221   212   503  1841
## 2 <NA>    delayed    62    12    20   102   305
## 3 <NA>    <NA>       NA    NA    NA    NA    NA
## 4 AM WEST on time   694  4840   383   320   201
## 5 <NA>    delayed   117   415    65   129    61

Data Transformation

Following three rules makes a dataset tidy: variables are in columns, observations are in rows, and values are in cells.

In this step, 3 steps performed to tidy data: - remove “blank line” by selecting status = on time or delayed - fill missing Airline data from previous row - pivot_longer to create observations of each origination/destination pair

Before and after views of dataset of shown

# Data transformation into tidy data form

arrivals_pivot_df <- arrivals_df %>% 
  subset(Status == ("on time") | Status == ("delayed")) %>% 
  fill(Airline) %>% 
  pivot_longer(c("LAX", "PHX", "SD", "SFO", "SEA"), 
               names_to = "dest", values_to = "numflights")

arrivals_pivot_df
## # A tibble: 20 x 4
##    Airline Status  dest  numflights
##    <chr>   <chr>   <chr>      <dbl>
##  1 Alaska  on time LAX          497
##  2 Alaska  on time PHX          221
##  3 Alaska  on time SD           212
##  4 Alaska  on time SFO          503
##  5 Alaska  on time SEA         1841
##  6 Alaska  delayed LAX           62
##  7 Alaska  delayed PHX           12
##  8 Alaska  delayed SD            20
##  9 Alaska  delayed SFO          102
## 10 Alaska  delayed SEA          305
## 11 AM WEST on time LAX          694
## 12 AM WEST on time PHX         4840
## 13 AM WEST on time SD           383
## 14 AM WEST on time SFO          320
## 15 AM WEST on time SEA          201
## 16 AM WEST delayed LAX          117
## 17 AM WEST delayed PHX          415
## 18 AM WEST delayed SD            65
## 19 AM WEST delayed SFO          129
## 20 AM WEST delayed SEA           61

Analysis by Airport

This analysis compares the per-city on-time performance for both airlines.

The first pair of graphs by airline shows the number of on-time and delayed flights by airport. Different shapes are used to distinguish between on-time and delayed status. AM West Airlines has a high concentration of flights at the Phoenix airport while Alaska Airlines has a high concentration of flights at the Seattle airport.

The third graph shows the proportion of each airline’s on-time and delayed flights by airport. One noticeable observation of the Phoenix airport is AM West Airlines has a substantially higher proportion of on-time flights when compared with Alaska Airlines and when compared with all other airports in the sample. In the Seattle airport Alaska Airlines has a substantially higher proportion of on-time flights when compared with AM West Airlines and when compared with all other airports in the sample.

# 
# plot by Airline dest/status num flights info 
ggplot(data = arrivals_pivot_df) + 
  geom_point(mapping = aes(x = dest, y = numflights, color= Airline, shape = Status)) + 
  facet_wrap(~ Airline)

# create new var prop_totalflights and calc prop of on-time by destination
flight_props2 <- arrivals_pivot_df %>% 
  group_by(dest) %>% 
  #  filter(Status == "on time") %>% 
  mutate(prop_totflights = numflights / sum(numflights))


# Compare per-city on-time performance for both airlines
ggplot(data = flight_props2) + 
  geom_point(mapping = aes(x = dest, y = prop_totflights, color = Airline, shape = Status))

Analysis by Airline

AM West Airlines had a better performance of having approximately 89% of flights on-time while Alaska Airlines had approximately 87% of its flights on-time.

# calculate numerator
flight_props_n <- flight_props2 %>% 
  group_by(Airline) %>% 
  filter(Status == "on time", Airline == "Alaska") %>% 
  summarize(numflights)
## `summarise()` regrouping output by 'Airline' (override with `.groups` argument)
# calculate denominator
flight_props_d <- flight_props2 %>% 
  group_by(Airline) %>% 
  filter(Airline == "Alaska") %>% 
  summarize(numflights)
## `summarise()` regrouping output by 'Airline' (override with `.groups` argument)
OT_Alaska <- sum(flight_props_n$numflights) /sum(flight_props_d$numflights)

cat("Alaska Airlines had ", OT_Alaska, " of flights on-time.\n ",
    "Number of on-time flights=",sum(flight_props_n$numflights),
    " out of ",sum(flight_props_d$numflights))
## Alaska Airlines had  0.8672848  of flights on-time.
##   Number of on-time flights= 3274  out of  3775
# Calculate numerator
flight_props_n <- flight_props2 %>% 
  group_by(Airline) %>% 
  filter(Status == "on time", Airline == "AM WEST") %>% 
  summarize(numflights)
## `summarise()` regrouping output by 'Airline' (override with `.groups` argument)
# Calculate denominator
flight_props_d <- flight_props2 %>% 
  group_by(Airline) %>% 
  filter(Airline == "AM WEST") %>% 
  summarize(numflights)
## `summarise()` regrouping output by 'Airline' (override with `.groups` argument)
OT_AMWEST <- sum(flight_props_n$numflights) /sum(flight_props_d$numflights)
cat("AM West Airlines had ", OT_AMWEST, " of flights on-time.\n ",
    "Number of on-time flights=",sum(flight_props_n$numflights),
    " out of ",sum(flight_props_d$numflights))
## AM West Airlines had  0.8910727  of flights on-time.
##   Number of on-time flights= 6438  out of  7225

Conclusion

Airlines with hub airports defined as those with high concentration of flights appear to have a higher number of on-time flights. Phoenix airport appears to be a hub for AM West Airlines while Seattle airport appears to be a hub for Alaska Airlines.

AM West Airlines had a better performance of having approximately 89% of flights on-time while Alaska Airlines had approximately 87% of its flights on-time. AM West airlines had more than twice the number of flights than Alaska airlines.

LS0tDQp0aXRsZTogIkQ2MDdfdGVtcGxhdGUiDQphdXRob3I6ICJSaWNrUk4iDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6IA0KICBvcGVuaW50cm86OmxhYl9yZXBvcnQ6IGRlZmF1bHQNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KLS0tDQoNCiMgQmFja2dyb3VuZA0KIyMgQXNzaWdubWVudCA1OiBUaWR5aW5nIGFuZCBUcmFuc2Zvcm1pbmcgRGF0YQ0KDQoNCjxzdHlsZT4NCmRpdi5ibHVlIHsgYmFja2dyb3VuZC1jb2xvcjojZTZmMGZmOyBib3JkZXItcmFkaXVzOiA1cHg7IHBhZGRpbmc6IDIwcHg7fQ0KPC9zdHlsZT4NCjxkaXYgY2xhc3MgPSAiYmx1ZSI+DQoNCkZvbGxvd2luZyBhcmUgdGhlIGdvYWwncyBmb3IgdGhpcyBhc3NpZ25tZW50OiAgDQotVHJhbnNmb3JtIGRhdGEgYmV0d2VlbiB3aWRlIGFuZCBsb25nIGZvcm1hdHMgdXNpbmcgdGlkeXIgcGFja2FnZSAgDQotQ2hhbmdlIHNoYXBlcyBvZiBkYXRhIGZyYW1lcyB1c2luZyBkcGx5ciBwYWNrYWdlICANCi1QZXJmb3JtIGRhdGEgdHJhbnNmb3JtYXRpb25zIHRvIHN1cHBvcnQgZG93bnN0cmVhbSBkYXRhIGFuYWx5c2lzDQoNCg0KPC9kaXY+IFxoZmlsbFxicmVhaw0KDQoNCmBgYHtyIHN0ZXBfc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoZ2dwbG90MikNCmBgYA0KDQojIEFjcXVpcmUgRGF0YQ0KDQo8c3R5bGU+DQpkaXYuYmx1ZSB7IGJhY2tncm91bmQtY29sb3I6I2U2ZjBmZjsgYm9yZGVyLXJhZGl1czogNXB4OyBwYWRkaW5nOiAyMHB4O30NCjwvc3R5bGU+DQo8ZGl2IGNsYXNzID0gImJsdWUiPg0KDQpJbiB0aGlzIGluc3RhbmNlLCB1c2VkIHRoZSBhc3NpZ25tZW50J3MgUERGIGRvY3VtZW50IGFzIHRoZSBkYXRhIHNvdXJjZSB0byBjcmVhdGUgYSBjc3YgZGF0YXNldCB1c2luZyBFeGNlbC4gIFRoaXMgZGF0YXNldCBzdG9yZWQgb24gR2l0SHViLg0KDQo8L2Rpdj4gXGhmaWxsXGJyZWFrDQoNCg0KYGBge3Igc3RlcF9yZWFkY3N2LCBlY2hvPVRSVUUgfQ0KdGhlVVJMID0gImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9DVU5ZU1BTLVJpY2tSTi9UZWFtNjA3LTEvbWFzdGVyL1drMDVfYWlybGluZV9hcnJpdmFsX3N0YXR1cy5jc3YiDQoNCmFycml2YWxzX2RmIDwtIHJlYWRfY3N2KHRoZVVSTCwgY29sX25hbWVzID0gVFJVRSkNCg0KYXJyaXZhbHNfZGYNCg0KYGBgDQoNCiMgRGF0YSBUcmFuc2Zvcm1hdGlvbiANCg0KPHN0eWxlPg0KZGl2LmJsdWUgeyBiYWNrZ3JvdW5kLWNvbG9yOiNlNmYwZmY7IGJvcmRlci1yYWRpdXM6IDVweDsgcGFkZGluZzogMjBweDt9DQo8L3N0eWxlPg0KPGRpdiBjbGFzcyA9ICJibHVlIj4NCg0KRm9sbG93aW5nIHRocmVlIHJ1bGVzIG1ha2VzIGEgZGF0YXNldCB0aWR5OiB2YXJpYWJsZXMgYXJlIGluIGNvbHVtbnMsIG9ic2VydmF0aW9ucyBhcmUgaW4gcm93cywgYW5kIHZhbHVlcyBhcmUgaW4gY2VsbHMuDQoNCkluIHRoaXMgc3RlcCwgMyBzdGVwcyBwZXJmb3JtZWQgdG8gdGlkeSBkYXRhOg0KLSByZW1vdmUgImJsYW5rIGxpbmUiIGJ5IHNlbGVjdGluZyBzdGF0dXMgPSBvbiB0aW1lIG9yIGRlbGF5ZWQNCi0gZmlsbCBtaXNzaW5nIEFpcmxpbmUgZGF0YSBmcm9tIHByZXZpb3VzIHJvdw0KLSBwaXZvdF9sb25nZXIgdG8gY3JlYXRlIG9ic2VydmF0aW9ucyBvZiBlYWNoIG9yaWdpbmF0aW9uL2Rlc3RpbmF0aW9uIHBhaXINCg0KQmVmb3JlIGFuZCBhZnRlciB2aWV3cyBvZiBkYXRhc2V0IG9mIHNob3duDQoNCjwvZGl2PiBcaGZpbGxcYnJlYWsNCmBgYHtyIHN0ZXBfZGF0YV90cmFuc2Zvcm1hdGlvbiwgZWNobz1UUlVFfQ0KIyBEYXRhIHRyYW5zZm9ybWF0aW9uIGludG8gdGlkeSBkYXRhIGZvcm0NCg0KYXJyaXZhbHNfcGl2b3RfZGYgPC0gYXJyaXZhbHNfZGYgJT4lIA0KICBzdWJzZXQoU3RhdHVzID09ICgib24gdGltZSIpIHwgU3RhdHVzID09ICgiZGVsYXllZCIpKSAlPiUgDQogIGZpbGwoQWlybGluZSkgJT4lIA0KICBwaXZvdF9sb25nZXIoYygiTEFYIiwgIlBIWCIsICJTRCIsICJTRk8iLCAiU0VBIiksIA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiZGVzdCIsIHZhbHVlc190byA9ICJudW1mbGlnaHRzIikNCg0KYXJyaXZhbHNfcGl2b3RfZGYNCg0KYGBgDQoNCiMgQW5hbHlzaXMgYnkgQWlycG9ydA0KDQo8c3R5bGU+DQpkaXYuYmx1ZSB7IGJhY2tncm91bmQtY29sb3I6I2U2ZjBmZjsgYm9yZGVyLXJhZGl1czogNXB4OyBwYWRkaW5nOiAyMHB4O30NCjwvc3R5bGU+DQo8ZGl2IGNsYXNzID0gImJsdWUiPg0KDQpUaGlzIGFuYWx5c2lzIGNvbXBhcmVzIHRoZSBwZXItY2l0eSBvbi10aW1lIHBlcmZvcm1hbmNlIGZvciBib3RoIGFpcmxpbmVzLg0KDQpUaGUgZmlyc3QgcGFpciBvZiBncmFwaHMgYnkgYWlybGluZSBzaG93cyB0aGUgbnVtYmVyIG9mIG9uLXRpbWUgYW5kIGRlbGF5ZWQNCmZsaWdodHMgYnkgYWlycG9ydC4gIERpZmZlcmVudCBzaGFwZXMgYXJlIHVzZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBvbi10aW1lDQphbmQgZGVsYXllZCBzdGF0dXMuICBBTSBXZXN0IEFpcmxpbmVzIGhhcyAgYSBoaWdoIGNvbmNlbnRyYXRpb24gb2YgZmxpZ2h0cw0KYXQgdGhlIFBob2VuaXggYWlycG9ydCB3aGlsZSBBbGFza2EgQWlybGluZXMgaGFzIGEgaGlnaCBjb25jZW50cmF0aW9uIG9mIGZsaWdodHMNCmF0IHRoZSBTZWF0dGxlIGFpcnBvcnQuDQoNClRoZSB0aGlyZCBncmFwaCBzaG93cyB0aGUgcHJvcG9ydGlvbiBvZiBlYWNoIGFpcmxpbmUncyBvbi10aW1lIGFuZCBkZWxheWVkIGZsaWdodHMNCmJ5IGFpcnBvcnQuICBPbmUgbm90aWNlYWJsZSBvYnNlcnZhdGlvbiBvZiB0aGUgUGhvZW5peCBhaXJwb3J0IGlzIEFNIFdlc3QgQWlybGluZXMgaGFzIGENCnN1YnN0YW50aWFsbHkgaGlnaGVyIHByb3BvcnRpb24gb2Ygb24tdGltZSBmbGlnaHRzIHdoZW4gY29tcGFyZWQgd2l0aCBBbGFza2EgQWlybGluZXMNCmFuZCB3aGVuIGNvbXBhcmVkIHdpdGggYWxsIG90aGVyIGFpcnBvcnRzIGluIHRoZSBzYW1wbGUuICBJbiB0aGUgU2VhdHRsZSBhaXJwb3J0IA0KQWxhc2thIEFpcmxpbmVzIGhhcyBhIHN1YnN0YW50aWFsbHkgaGlnaGVyIHByb3BvcnRpb24gb2Ygb24tdGltZSBmbGlnaHRzIHdoZW4gY29tcGFyZWQNCndpdGggQU0gV2VzdCBBaXJsaW5lcyBhbmQgd2hlbiBjb21wYXJlZCB3aXRoIGFsbCBvdGhlciBhaXJwb3J0cyBpbiB0aGUgc2FtcGxlLg0KDQo8L2Rpdj4gXGhmaWxsXGJyZWFrDQoNCg0KYGBge3Igc3RlcF9hbmFseXNpc19jaXR5LCBlY2hvPVRSVUV9DQojIA0KIyBwbG90IGJ5IEFpcmxpbmUgZGVzdC9zdGF0dXMgbnVtIGZsaWdodHMgaW5mbyANCmdncGxvdChkYXRhID0gYXJyaXZhbHNfcGl2b3RfZGYpICsgDQogIGdlb21fcG9pbnQobWFwcGluZyA9IGFlcyh4ID0gZGVzdCwgeSA9IG51bWZsaWdodHMsIGNvbG9yPSBBaXJsaW5lLCBzaGFwZSA9IFN0YXR1cykpICsgDQogIGZhY2V0X3dyYXAofiBBaXJsaW5lKQ0KDQojIGNyZWF0ZSBuZXcgdmFyIHByb3BfdG90YWxmbGlnaHRzIGFuZCBjYWxjIHByb3Agb2Ygb24tdGltZSBieSBkZXN0aW5hdGlvbg0KZmxpZ2h0X3Byb3BzMiA8LSBhcnJpdmFsc19waXZvdF9kZiAlPiUgDQogIGdyb3VwX2J5KGRlc3QpICU+JSANCiAgIyAgZmlsdGVyKFN0YXR1cyA9PSAib24gdGltZSIpICU+JSANCiAgbXV0YXRlKHByb3BfdG90ZmxpZ2h0cyA9IG51bWZsaWdodHMgLyBzdW0obnVtZmxpZ2h0cykpDQoNCg0KIyBDb21wYXJlIHBlci1jaXR5IG9uLXRpbWUgcGVyZm9ybWFuY2UgZm9yIGJvdGggYWlybGluZXMNCmdncGxvdChkYXRhID0gZmxpZ2h0X3Byb3BzMikgKyANCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gYWVzKHggPSBkZXN0LCB5ID0gcHJvcF90b3RmbGlnaHRzLCBjb2xvciA9IEFpcmxpbmUsIHNoYXBlID0gU3RhdHVzKSkNCg0KDQoNCmBgYA0KDQojIEFuYWx5c2lzIGJ5IEFpcmxpbmUNCg0KPHN0eWxlPg0KZGl2LmJsdWUgeyBiYWNrZ3JvdW5kLWNvbG9yOiNlNmYwZmY7IGJvcmRlci1yYWRpdXM6IDVweDsgcGFkZGluZzogMjBweDt9DQo8L3N0eWxlPg0KPGRpdiBjbGFzcyA9ICJibHVlIj4NCg0KQU0gV2VzdCBBaXJsaW5lcyBoYWQgYSBiZXR0ZXIgcGVyZm9ybWFuY2Ugb2YgaGF2aW5nIGFwcHJveGltYXRlbHkgODklIG9mIGZsaWdodHMgb24tdGltZQ0Kd2hpbGUgQWxhc2thIEFpcmxpbmVzIGhhZCBhcHByb3hpbWF0ZWx5IDg3JSBvZiBpdHMgZmxpZ2h0cyBvbi10aW1lLg0KDQo8L2Rpdj4gXGhmaWxsXGJyZWFrDQoNCmBgYHtyIHN0ZXBfYW5hbHlzaXNfQWlybGluZSwgZWNobz1UUlVFfQ0KIyBjYWxjdWxhdGUgbnVtZXJhdG9yDQpmbGlnaHRfcHJvcHNfbiA8LSBmbGlnaHRfcHJvcHMyICU+JSANCiAgZ3JvdXBfYnkoQWlybGluZSkgJT4lIA0KICBmaWx0ZXIoU3RhdHVzID09ICJvbiB0aW1lIiwgQWlybGluZSA9PSAiQWxhc2thIikgJT4lIA0KICBzdW1tYXJpemUobnVtZmxpZ2h0cykNCg0KIyBjYWxjdWxhdGUgZGVub21pbmF0b3INCmZsaWdodF9wcm9wc19kIDwtIGZsaWdodF9wcm9wczIgJT4lIA0KICBncm91cF9ieShBaXJsaW5lKSAlPiUgDQogIGZpbHRlcihBaXJsaW5lID09ICJBbGFza2EiKSAlPiUgDQogIHN1bW1hcml6ZShudW1mbGlnaHRzKQ0KDQoNCk9UX0FsYXNrYSA8LSBzdW0oZmxpZ2h0X3Byb3BzX24kbnVtZmxpZ2h0cykgL3N1bShmbGlnaHRfcHJvcHNfZCRudW1mbGlnaHRzKQ0KDQpjYXQoIkFsYXNrYSBBaXJsaW5lcyBoYWQgIiwgT1RfQWxhc2thLCAiIG9mIGZsaWdodHMgb24tdGltZS5cbiAiLA0KICAgICJOdW1iZXIgb2Ygb24tdGltZSBmbGlnaHRzPSIsc3VtKGZsaWdodF9wcm9wc19uJG51bWZsaWdodHMpLA0KICAgICIgb3V0IG9mICIsc3VtKGZsaWdodF9wcm9wc19kJG51bWZsaWdodHMpKQ0KDQojIENhbGN1bGF0ZSBudW1lcmF0b3INCmZsaWdodF9wcm9wc19uIDwtIGZsaWdodF9wcm9wczIgJT4lIA0KICBncm91cF9ieShBaXJsaW5lKSAlPiUgDQogIGZpbHRlcihTdGF0dXMgPT0gIm9uIHRpbWUiLCBBaXJsaW5lID09ICJBTSBXRVNUIikgJT4lIA0KICBzdW1tYXJpemUobnVtZmxpZ2h0cykNCg0KIyBDYWxjdWxhdGUgZGVub21pbmF0b3INCmZsaWdodF9wcm9wc19kIDwtIGZsaWdodF9wcm9wczIgJT4lIA0KICBncm91cF9ieShBaXJsaW5lKSAlPiUgDQogIGZpbHRlcihBaXJsaW5lID09ICJBTSBXRVNUIikgJT4lIA0KICBzdW1tYXJpemUobnVtZmxpZ2h0cykNCg0KDQpPVF9BTVdFU1QgPC0gc3VtKGZsaWdodF9wcm9wc19uJG51bWZsaWdodHMpIC9zdW0oZmxpZ2h0X3Byb3BzX2QkbnVtZmxpZ2h0cykNCmNhdCgiQU0gV2VzdCBBaXJsaW5lcyBoYWQgIiwgT1RfQU1XRVNULCAiIG9mIGZsaWdodHMgb24tdGltZS5cbiAiLA0KICAgICJOdW1iZXIgb2Ygb24tdGltZSBmbGlnaHRzPSIsc3VtKGZsaWdodF9wcm9wc19uJG51bWZsaWdodHMpLA0KICAgICIgb3V0IG9mICIsc3VtKGZsaWdodF9wcm9wc19kJG51bWZsaWdodHMpKQ0KDQpgYGANCg0KDQoNCiMgQ29uY2x1c2lvbg0KDQo8c3R5bGU+DQpkaXYuYmx1ZSB7IGJhY2tncm91bmQtY29sb3I6I2U2ZjBmZjsgYm9yZGVyLXJhZGl1czogNXB4OyBwYWRkaW5nOiAyMHB4O30NCjwvc3R5bGU+DQo8ZGl2IGNsYXNzID0gImJsdWUiPg0KDQpBaXJsaW5lcyB3aXRoIGh1YiBhaXJwb3J0cyBkZWZpbmVkIGFzIHRob3NlIHdpdGggaGlnaCBjb25jZW50cmF0aW9uIG9mIGZsaWdodHMNCmFwcGVhciB0byBoYXZlIGEgaGlnaGVyIG51bWJlciBvZiBvbi10aW1lIGZsaWdodHMuICBQaG9lbml4IGFpcnBvcnQgYXBwZWFycyANCnRvIGJlIGEgaHViIGZvciBBTSBXZXN0IEFpcmxpbmVzIHdoaWxlIFNlYXR0bGUgYWlycG9ydCBhcHBlYXJzIHRvIGJlIGEgaHViDQpmb3IgQWxhc2thIEFpcmxpbmVzLg0KDQpBTSBXZXN0IEFpcmxpbmVzIGhhZCBhIGJldHRlciBwZXJmb3JtYW5jZSBvZiBoYXZpbmcgYXBwcm94aW1hdGVseSA4OSUgb2YgZmxpZ2h0cyBvbi10aW1lDQp3aGlsZSBBbGFza2EgQWlybGluZXMgaGFkIGFwcHJveGltYXRlbHkgODclIG9mIGl0cyBmbGlnaHRzIG9uLXRpbWUuICBBTSBXZXN0DQphaXJsaW5lcyBoYWQgbW9yZSB0aGFuIHR3aWNlIHRoZSBudW1iZXIgb2YgZmxpZ2h0cyB0aGFuIEFsYXNrYSBhaXJsaW5lcy4NCg0KDQo8L2Rpdj4gXGhmaWxsXGJyZWFrDQo=