Section 1 - Loading the Data

1.1

How many rows of data (observations) are in this dataset?

Sys.setlocale("LC_ALL","C")
[1] "C"
Warning message:
In scan(file = file, what = what, sep = sep, quote = quote, dec = dec,  :
  EOF within quoted string
191641
[1] 191641

1.2

How many variables are in this dataset?

11
[1] 11

1.3

Using the “max” function, what is the maximum value of the variable “ID”?

max(mvtWeek1$ID)
[1] 9181151

1.4

What is the minimum value of the variable “Beat”?

min(mvtWeek1$Beat)
[1] 111

1.5

How many observations have value TRUE in the Arrest variable (this is the number of crimes for which an arrest was made)?

sum(mvtWeek1$Arrest)
[1] 15536

1.6

How many observations have a LocationDescription value of ALLEY?

table(mvtWeek1$LocationDescription)

                             ABANDONED BUILDING 
                                              4 
AIRPORT BUILDING NON-TERMINAL - NON-SECURE AREA 
                                              4 
    AIRPORT BUILDING NON-TERMINAL - SECURE AREA 
                                              1 
             AIRPORT EXTERIOR - NON-SECURE AREA 
                                             24 
                 AIRPORT EXTERIOR - SECURE AREA 
                                              1 
                            AIRPORT PARKING LOT 
                                             11 
 AIRPORT TERMINAL UPPER LEVEL - NON-SECURE AREA 
                                              5 
                  AIRPORT VENDING ESTABLISHMENT 
                                             10 
                               AIRPORT/AIRCRAFT 
                                            363 
                                          ALLEY 
                                           2308 
                                ANIMAL HOSPITAL 
                                              1 
                                      APARTMENT 
                                            184 
                                APPLIANCE STORE 
                                              1 
                                  ATHLETIC CLUB 
                                              9 
                                           BANK 
                                              7 
                                  BAR OR TAVERN 
                                             17 
                                     BARBERSHOP 
                                              4 
                                  BOWLING ALLEY 
                                              3 
                                         BRIDGE 
                                              2 
                                       CAR WASH 
                                             44 
                                  CHA APARTMENT 
                                              5 
                        CHA PARKING LOT/GROUNDS 
                                            405 
              CHURCH/SYNAGOGUE/PLACE OF WORSHIP 
                                             56 
                                 CLEANING STORE 
                                              3 
                     COLLEGE/UNIVERSITY GROUNDS 
                                             47 
              COLLEGE/UNIVERSITY RESIDENCE HALL 
                                              2 
                   COMMERCIAL / BUSINESS OFFICE 
                                            126 
                              CONSTRUCTION SITE 
                                             35 
                              CONVENIENCE STORE 
                                              7 
                    CTA GARAGE / OTHER PROPERTY 
                                            148 
                                      CTA TRAIN 
                                              1 
                              CURRENCY EXCHANGE 
                                              2 
                                DAY CARE CENTER 
                                              5 
                               DEPARTMENT STORE 
                                             22 
                         DRIVEWAY - RESIDENTIAL 
                                           1675 
                                     DRUG STORE 
                                              8 
                 FACTORY/MANUFACTURING BUILDING 
                                             16 
                                   FIRE STATION 
                                              5 
                                FOREST PRESERVE 
                                              6 
                                    GAS STATION 
                                           2111 
                   GOVERNMENT BUILDING/PROPERTY 
                                             48 
                             GROCERY FOOD STORE 
                                             80 
                             HIGHWAY/EXPRESSWAY 
                                             22 
                      HOSPITAL BUILDING/GROUNDS 
                                            101 
                                    HOTEL/MOTEL 
                                            124 
                        JAIL / LOCK-UP FACILITY 
                                              1 
                 LAKEFRONT/WATERFRONT/RIVERBANK 
                                              4 
                                        LIBRARY 
                                              4 
                          MEDICAL/DENTAL OFFICE 
                                              3 
                            MOVIE HOUSE/THEATER 
                                             18 
                                      NEWSSTAND 
                                              1 
                   NURSING HOME/RETIREMENT HOME 
                                             21 
                                          OTHER 
                                           4573 
                OTHER COMMERCIAL TRANSPORTATION 
                                              8 
              OTHER RAILROAD PROP / TRAIN DEPOT 
                                             28 
                                  PARK PROPERTY 
                                            255 
                 PARKING LOT/GARAGE(NON.RESID.) 
                                          14852 
                POLICE FACILITY/VEH PARKING LOT 
                                            266 
                                      RESIDENCE 
                                           1302 
                        RESIDENCE PORCH/HALLWAY 
                                             18 
                               RESIDENCE-GARAGE 
                                           1176 
                  RESIDENTIAL YARD (FRONT/BACK) 
                                           1536 
                                     RESTAURANT 
                                             49 
                               SAVINGS AND LOAN 
                                              4 
                      SCHOOL, PRIVATE, BUILDING 
                                             14 
                       SCHOOL, PRIVATE, GROUNDS 
                                             23 
                       SCHOOL, PUBLIC, BUILDING 
                                            114 
                        SCHOOL, PUBLIC, GROUNDS 
                                            206 
                                       SIDEWALK 
                                            462 
                             SMALL RETAIL STORE 
                                             33 
                           SPORTS ARENA/STADIUM 
                                            166 
                                         STREET 
                                         156564 
                            TAVERN/LIQUOR STORE 
                                             14 
                                        TAXICAB 
                                             21 
                                VACANT LOT/LAND 
                                            985 
                         VEHICLE NON-COMMERCIAL 
                                            817 
                             VEHICLE-COMMERCIAL 
                                             23 
                                      WAREHOUSE 
                                             17 

Section 2 - Understanding Dates in R

In many datasets, like this one, you have a date field. Unfortunately, R does not automatically recognize entries that look like dates. We need to use a function in R to extract the date and time. Take a look at the first entry of Date (remember to use square brackets when looking at a certain entry of a variable).

2.1

In what format are the entries in the variable Date?

  • Month/Day/Year Hour:Minute
  • Day/Month/Year Hour:Minute
  • Hour:Minute Month/Day/Year
  • Hour:Minute Day/Month/Year
"Month/Day/Year Hour:Minute"
[1] "Month/Day/Year Hour:Minute"

2.2

Now, let’s convert these characters into a Date object in R. In your R console, type

DateConvert = as.Date(strptime(mvt$Date, "%m/%d/%y %H:%M"))

This converts the variable “Date” into a Date object in R. Take a look at the variable DateConvert using the summary function.

What is the month and year of the median date in our dataset? Enter your answer as “Month Year”, without the quotes. (Ex: if the answer was 2008-03-28, you would give the answer “March 2008”, without the quotes.)

DateConvert = as.Date(strptime(mvtWeek1$Date, "%m/%d/%y %H:%M"))
summary(DateConvert)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max.     NA's 
      NA       NA       NA       NA       NA       NA "191641" 
"May 2006"
[1] "May 2006"

2.3

Now, let’s extract the month and the day of the week, and add these variables to our data frame mvt. We can do this with two simple functions. Type the following commands in R:

mvt$Month = months(DateConvert)

mvt$Weekday = weekdays(DateConvert)

This creates two new variables in our data frame, Month and Weekday, and sets them equal to the month and weekday values that we can extract from the Date object. Lastly, replace the old Date variable with DateConvert by typing:

mvt$Date = DateConvert

Using the table command, answer the following questions.

In which month did the fewest motor vehicle thefts occur?

 mvtWeek1$Month = months(DateConvert)
 mvtWeek1$Weekday = weekdays(DateConvert)
 mvtWeek1$Date = DateConvert
 table(mvtWeek1$Month)
< table of extent 0 >
 "February"
[1] "February"

2.4

On which weekday did the most motor vehicle thefts occur?

table(mvtWeek1$Weekday)
< table of extent 0 >
"Friday"
[1] "Friday"

2.5

Each observation in the dataset represents a motor vehicle theft, and the Arrest variable indicates whether an arrest was later made for this theft. Which month has the largest number of motor vehicle thefts for which an arrest was made?

table(mvtWeek1$Month,mvtWeek1$Arrest)
< table of extent 0 x 2 >
table(mvtWeek1$Arrest,mvtWeek1$Month)
< table of extent 2 x 0 >
"January"
[1] "January"
LS0tDQp0aXRsZTogIkFTMS0xIEFuIEFuYWx5dGljYWwgRGV0ZWN0aXZlIg0KYXV0aG9yOiAiPG5hbWU+IKdFwmCnyiA8c3R1ZGVudCBJRD4gTTA2NDExMTAzMiINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCi0gLSAtIA0KDQojIyMgU2VjdGlvbiAxIC0gTG9hZGluZyB0aGUgRGF0YQ0KDQojIyMjIDEuMSANCkhvdyBtYW55IHJvd3Mgb2YgZGF0YSAob2JzZXJ2YXRpb25zKSBhcmUgaW4gdGhpcyBkYXRhc2V0Pw0KDQpgYGB7cn0NClN5cy5zZXRsb2NhbGUoIkxDX0FMTCIsIkMiKQ0KMTkxNjQxDQpgYGANCg0KDQojIyMjIDEuMiANCkhvdyBtYW55IHZhcmlhYmxlcyBhcmUgaW4gdGhpcyBkYXRhc2V0Pw0KYGBge3J9DQoxMQ0KYGBgDQoNCg0KIyMjIyAxLjMgDQpVc2luZyB0aGUgIm1heCIgZnVuY3Rpb24sIHdoYXQgaXMgdGhlIG1heGltdW0gdmFsdWUgb2YgdGhlIHZhcmlhYmxlICJJRCI/DQoNCmBgYHtyfQ0KbWF4KG12dFdlZWsxJElEKQ0KYGBgDQoNCiMjIyMgMS40IA0KV2hhdCBpcyB0aGUgbWluaW11bSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgIkJlYXQiPw0KYGBge3J9DQptaW4obXZ0V2VlazEkQmVhdCkNCmBgYA0KDQojIyMjIDEuNSANCkhvdyBtYW55IG9ic2VydmF0aW9ucyBoYXZlIHZhbHVlIFRSVUUgaW4gdGhlIEFycmVzdCB2YXJpYWJsZSAodGhpcyBpcyB0aGUgbnVtYmVyIG9mIGNyaW1lcyBmb3Igd2hpY2ggYW4gYXJyZXN0IHdhcyBtYWRlKT8NCg0KYGBge3J9DQpzdW0obXZ0V2VlazEkQXJyZXN0KQ0KYGBgDQoNCiMjIyMgMS42IA0KSG93IG1hbnkgb2JzZXJ2YXRpb25zIGhhdmUgYSBMb2NhdGlvbkRlc2NyaXB0aW9uIHZhbHVlIG9mIEFMTEVZPw0KDQpgYGB7cn0NCnRhYmxlKG12dFdlZWsxJExvY2F0aW9uRGVzY3JpcHRpb24pDQpgYGANCg0KIyMjIFNlY3Rpb24gMiAtIFVuZGVyc3RhbmRpbmcgRGF0ZXMgaW4gUg0KDQoNCkluIG1hbnkgZGF0YXNldHMsIGxpa2UgdGhpcyBvbmUsIHlvdSBoYXZlIGEgZGF0ZSBmaWVsZC4gVW5mb3J0dW5hdGVseSwgUiBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IHJlY29nbml6ZSBlbnRyaWVzIHRoYXQgbG9vayBsaWtlIGRhdGVzLiBXZSBuZWVkIHRvIHVzZSBhIGZ1bmN0aW9uIGluIFIgdG8gZXh0cmFjdCB0aGUgZGF0ZSBhbmQgdGltZS4gVGFrZSBhIGxvb2sgYXQgdGhlIGZpcnN0IGVudHJ5IG9mIERhdGUgKHJlbWVtYmVyIHRvIHVzZSBzcXVhcmUgYnJhY2tldHMgd2hlbiBsb29raW5nIGF0IGEgY2VydGFpbiBlbnRyeSBvZiBhIHZhcmlhYmxlKS4NCg0KIyMjIyAyLjEgDQpJbiB3aGF0IGZvcm1hdCBhcmUgdGhlIGVudHJpZXMgaW4gdGhlIHZhcmlhYmxlIERhdGU/DQoNCisgTW9udGgvRGF5L1llYXIgSG91cjpNaW51dGUNCisgRGF5L01vbnRoL1llYXIgSG91cjpNaW51dGUNCisgSG91cjpNaW51dGUgTW9udGgvRGF5L1llYXINCisgSG91cjpNaW51dGUgRGF5L01vbnRoL1llYXINCg0KYGBge3J9DQoiTW9udGgvRGF5L1llYXIgSG91cjpNaW51dGUiDQpgYGANCg0KIyMjIyAyLjIgDQoNCk5vdywgbGV0J3MgY29udmVydCB0aGVzZSBjaGFyYWN0ZXJzIGludG8gYSBEYXRlIG9iamVjdCBpbiBSLiBJbiB5b3VyIFIgY29uc29sZSwgdHlwZQ0KDQogICAgRGF0ZUNvbnZlcnQgPSBhcy5EYXRlKHN0cnB0aW1lKG12dCREYXRlLCAiJW0vJWQvJXkgJUg6JU0iKSkNCg0KVGhpcyBjb252ZXJ0cyB0aGUgdmFyaWFibGUgIkRhdGUiIGludG8gYSBEYXRlIG9iamVjdCBpbiBSLiBUYWtlIGEgbG9vayBhdCB0aGUgdmFyaWFibGUgRGF0ZUNvbnZlcnQgdXNpbmcgdGhlIHN1bW1hcnkgZnVuY3Rpb24uDQoNCldoYXQgaXMgdGhlIG1vbnRoIGFuZCB5ZWFyIG9mIHRoZSBtZWRpYW4gZGF0ZSBpbiBvdXIgZGF0YXNldD8gRW50ZXIgeW91ciBhbnN3ZXIgYXMgIk1vbnRoIFllYXIiLCB3aXRob3V0IHRoZSBxdW90ZXMuIChFeDogaWYgdGhlIGFuc3dlciB3YXMgMjAwOC0wMy0yOCwgeW91IHdvdWxkIGdpdmUgdGhlIGFuc3dlciAiTWFyY2ggMjAwOCIsIHdpdGhvdXQgdGhlIHF1b3Rlcy4pDQoNCmBgYHtyfQ0KRGF0ZUNvbnZlcnQgPSBhcy5EYXRlKHN0cnB0aW1lKG12dFdlZWsxJERhdGUsICIlbS8lZC8leSAlSDolTSIpKQ0Kc3VtbWFyeShEYXRlQ29udmVydCkNCiJNYXkgMjAwNiINCmBgYA0KDQojIyMjIDIuMw0KTm93LCBsZXQncyBleHRyYWN0IHRoZSBtb250aCBhbmQgdGhlIGRheSBvZiB0aGUgd2VlaywgYW5kIGFkZCB0aGVzZSB2YXJpYWJsZXMgdG8gb3VyIGRhdGEgZnJhbWUgbXZ0LiBXZSBjYW4gZG8gdGhpcyB3aXRoIHR3byBzaW1wbGUgZnVuY3Rpb25zLiBUeXBlIHRoZSBmb2xsb3dpbmcgY29tbWFuZHMgaW4gUjoNCg0KICAgIG12dCRNb250aCA9IG1vbnRocyhEYXRlQ29udmVydCkNCg0KICAgIG12dCRXZWVrZGF5ID0gd2Vla2RheXMoRGF0ZUNvbnZlcnQpDQoNClRoaXMgY3JlYXRlcyB0d28gbmV3IHZhcmlhYmxlcyBpbiBvdXIgZGF0YSBmcmFtZSwgTW9udGggYW5kIFdlZWtkYXksIGFuZCBzZXRzIHRoZW0gZXF1YWwgdG8gdGhlIG1vbnRoIGFuZCB3ZWVrZGF5IHZhbHVlcyB0aGF0IHdlIGNhbiBleHRyYWN0IGZyb20gdGhlIERhdGUgb2JqZWN0LiBMYXN0bHksIHJlcGxhY2UgdGhlIG9sZCBEYXRlIHZhcmlhYmxlIHdpdGggRGF0ZUNvbnZlcnQgYnkgdHlwaW5nOg0KDQogICAgbXZ0JERhdGUgPSBEYXRlQ29udmVydA0KDQpVc2luZyB0aGUgdGFibGUgY29tbWFuZCwgYW5zd2VyIHRoZSBmb2xsb3dpbmcgcXVlc3Rpb25zLg0KDQpJbiB3aGljaCBtb250aCBkaWQgdGhlIGZld2VzdCBtb3RvciB2ZWhpY2xlIHRoZWZ0cyBvY2N1cj8NCg0KYGBge3J9DQogbXZ0V2VlazEkTW9udGggPSBtb250aHMoRGF0ZUNvbnZlcnQpDQogbXZ0V2VlazEkV2Vla2RheSA9IHdlZWtkYXlzKERhdGVDb252ZXJ0KQ0KIG12dFdlZWsxJERhdGUgPSBEYXRlQ29udmVydA0KIHRhYmxlKG12dFdlZWsxJE1vbnRoKQ0KICJGZWJydWFyeSINCmBgYA0KDQojIyMjIDIuNCANCk9uIHdoaWNoIHdlZWtkYXkgZGlkIHRoZSBtb3N0IG1vdG9yIHZlaGljbGUgdGhlZnRzIG9jY3VyPw0KDQpgYGB7cn0NCnRhYmxlKG12dFdlZWsxJFdlZWtkYXkpDQoiRnJpZGF5Ig0KYGBgDQoNCiMjIyMgMi41IA0KRWFjaCBvYnNlcnZhdGlvbiBpbiB0aGUgZGF0YXNldCByZXByZXNlbnRzIGEgbW90b3IgdmVoaWNsZSB0aGVmdCwgYW5kIHRoZSBBcnJlc3QgdmFyaWFibGUgaW5kaWNhdGVzIHdoZXRoZXIgYW4gYXJyZXN0IHdhcyBsYXRlciBtYWRlIGZvciB0aGlzIHRoZWZ0LiBXaGljaCBtb250aCBoYXMgdGhlIGxhcmdlc3QgbnVtYmVyIG9mIG1vdG9yIHZlaGljbGUgdGhlZnRzIGZvciB3aGljaCBhbiBhcnJlc3Qgd2FzIG1hZGU/DQoNCmBgYHtyfQ0KdGFibGUobXZ0V2VlazEkTW9udGgsbXZ0V2VlazEkQXJyZXN0KQ0KdGFibGUobXZ0V2VlazEkQXJyZXN0LG12dFdlZWsxJE1vbnRoKQ0KIkphbnVhcnkiDQpgYGANCg0KIyMjIFNlY3Rpb24gMyAtIFZpc3VhbGl6aW5nIENyaW1lIFRyZW5kcw0KDQojIyMjIDMuMQ0KDQpOb3csIGxldCdzIG1ha2Ugc29tZSBwbG90cyB0byBoZWxwIHVzIGJldHRlciB1bmRlcnN0YW5kIGhvdyBjcmltZSBoYXMgY2hhbmdlZCBvdmVyIHRpbWUgaW4gQ2hpY2Fnby4gVGhyb3VnaG91dCB0aGlzIHByb2JsZW0sIGFuZCBpbiBnZW5lcmFsLCB5b3UgY2FuIHNhdmUgeW91ciBwbG90IHRvIGEgZmlsZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHRoaXMgd2Vic2l0ZSB2ZXJ5IGNsZWFybHkgZXhwbGFpbnMgdGhlIHByb2Nlc3MuDQoNCkZpcnN0LCBsZXQncyBtYWtlIGEgaGlzdG9ncmFtIG9mIHRoZSB2YXJpYWJsZSBEYXRlLiBXZSdsbCBhZGQgYW4gZXh0cmEgYXJndW1lbnQsIHRvIHNwZWNpZnkgdGhlIG51bWJlciBvZiBiYXJzIHdlIHdhbnQgaW4gb3VyIGhpc3RvZ3JhbS4gSW4geW91ciBSIGNvbnNvbGUsIHR5cGUNCg0KaGlzdChtdnQkRGF0ZSwgYnJlYWtzPTEwMCkNCg0KYGBge3J9DQpoaXN0KG12dFdlZWsxJERhdGUsIGJyZWFrcz0xMDApDQpgYGANCg0KTG9va2luZyBhdCB0aGUgaGlzdG9ncmFtLCBhbnN3ZXIgdGhlIGZvbGxvd2luZyBxdWVzdGlvbnMuDQoNCkluIGdlbmVyYWwsIGRvZXMgaXQgbG9vayBsaWtlIGNyaW1lIGluY3JlYXNlcyBvciBkZWNyZWFzZXMgZnJvbSAyMDAyIC0gMjAxMj8NCg0KKyBJbmNyZWFzZXMNCisgRGVjcmVhc2VzDQoNCmBgYHtyfQ0KIkRlY3JlYXNlIg0KYGBgDQoNCkluIGdlbmVyYWwsIGRvZXMgaXQgbG9vayBsaWtlIGNyaW1lIGluY3JlYXNlcyBvciBkZWNyZWFzZXMgZnJvbSAyMDA1IC0gMjAwOD8NCg0KKyBJbmNyZWFzZXMNCisgRGVjcmVhc2VzDQoNCmBgYHtyfQ0KIkRlY3JlYXNlIg0KYGBgDQoNCiMjIyMgMy4yDQpOb3csIGxldCdzIHNlZSBob3cgYXJyZXN0cyBoYXZlIGNoYW5nZWQgb3ZlciB0aW1lLiBDcmVhdGUgYSBib3hwbG90IG9mIHRoZSB2YXJpYWJsZSAiRGF0ZSIsIHNvcnRlZCBieSB0aGUgdmFyaWFibGUgIkFycmVzdCIgKGlmIHlvdSBhcmUgbm90IGZhbWlsaWFyIHdpdGggYm94cGxvdHMgYW5kIHdvdWxkIGxpa2UgdG8gbGVhcm4gbW9yZSwgY2hlY2sgb3V0IHRoaXMgdHV0b3JpYWwpLiBJbiBhIGJveHBsb3QsIHRoZSBib2xkIGhvcml6b250YWwgbGluZSBpcyB0aGUgbWVkaWFuIHZhbHVlIG9mIHRoZSBkYXRhLCB0aGUgYm94IHNob3dzIHRoZSByYW5nZSBvZiB2YWx1ZXMgYmV0d2VlbiB0aGUgZmlyc3QgcXVhcnRpbGUgYW5kIHRoaXJkIHF1YXJ0aWxlLCBhbmQgdGhlIHdoaXNrZXJzICh0aGUgZG90dGVkIGxpbmVzIGV4dGVuZGluZyBvdXRzaWRlIHRoZSBib3gpIHNob3cgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzLCBleGNsdWRpbmcgYW55IG91dGxpZXJzICh3aGljaCBhcmUgcGxvdHRlZCBhcyBjaXJjbGVzKS4gT3V0bGllcnMgYXJlIGRlZmluZWQgYnkgZmlyc3QgY29tcHV0aW5nIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGZpcnN0IGFuZCB0aGlyZCBxdWFydGlsZSB2YWx1ZXMsIG9yIHRoZSBoZWlnaHQgb2YgdGhlIGJveC4gVGhpcyBudW1iZXIgaXMgY2FsbGVkIHRoZSBJbnRlci1RdWFydGlsZSBSYW5nZSAoSVFSKS4gQW55IHBvaW50IHRoYXQgaXMgZ3JlYXRlciB0aGFuIHRoZSB0aGlyZCBxdWFydGlsZSBwbHVzIHRoZSBJUVIgb3IgbGVzcyB0aGFuIHRoZSBmaXJzdCBxdWFydGlsZSBtaW51cyB0aGUgSVFSIGlzIGNvbnNpZGVyZWQgYW4gb3V0bGllci4NCg0KRG9lcyBpdCBsb29rIGxpa2UgdGhlcmUgd2VyZSBtb3JlIGNyaW1lcyBmb3Igd2hpY2ggYXJyZXN0cyB3ZXJlIG1hZGUgaW4gdGhlIGZpcnN0IGhhbGYgb2YgdGhlIHRpbWUgcGVyaW9kIG9yIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGUgdGltZSBwZXJpb2Q/IChOb3RlIHRoYXQgdGhlIHRpbWUgcGVyaW9kIGlzIGZyb20gMjAwMSB0byAyMDEyLCBzbyB0aGUgbWlkZGxlIG9mIHRoZSB0aW1lIHBlcmlvZCBpcyB0aGUgYmVnaW5uaW5nIG9mIDIwMDcuKQ0KDQorIEZpcnN0IGhhbGYNCisgU2Vjb25kIGhhbGYNCg0KYGBge3J9DQpib3hwbG90KG12dFdlZWsxJERhdGUgfiBtdnRXZWVrMSRBcnJlc3QpDQoiRmlyc3QgaGFsZiINCmBgYA0KDQoNCiMjIyMgMy4zDQpMZXQncyBpbnZlc3RpZ2F0ZSB0aGlzIGZ1cnRoZXIuIFVzZSB0aGUgdGFibGUgZnVuY3Rpb24gZm9yIHRoZSBuZXh0IGZldyBxdWVzdGlvbnMuDQoNCkZvciB3aGF0IHByb3BvcnRpb24gb2YgbW90b3IgdmVoaWNsZSB0aGVmdHMgaW4gMjAwMSB3YXMgYW4gYXJyZXN0IG1hZGU/DQoNCk5vdGU6IGluIHRoaXMgcXVlc3Rpb24gYW5kIG1hbnkgb3RoZXJzIGluIHRoZSBjb3Vyc2UsIHdlIGFyZSBhc2tpbmcgZm9yIGFuIGFuc3dlciBhcyBhIHByb3BvcnRpb24uIFRoZXJlZm9yZSwgeW91ciBhbnN3ZXIgc2hvdWxkIHRha2UgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEuDQoNCmBgYHtyfQ0KdGFibGUobXZ0V2VlazEkQXJyZXN0LCBtdnRXZWVrMSRZZWFyKQ0KMjE1Mi8oMjE1MisxODUxNykgDQpgYGANCg0KIyMjIyAzLjQNCkZvciB3aGF0IHByb3BvcnRpb24gb2YgbW90b3IgdmVoaWNsZSB0aGVmdHMgaW4gMjAwNyB3YXMgYW4gYXJyZXN0IG1hZGU/DQoNCmBgYHtyfQ0KdGFibGUobXZ0V2VlazEkWWVhcixtdnRXZWVrMSRBcnJlc3QpDQoxMjEyLygxMjEyKzEzMDY4KQ0KYGBgDQoNCiMjIyMgMy41DQpGb3Igd2hhdCBwcm9wb3J0aW9uIG9mIG1vdG9yIHZlaGljbGUgdGhlZnRzIGluIDIwMTIgd2FzIGFuIGFycmVzdCBtYWRlPw0KDQpgYGB7cn0NCjU1MC8oNTUwKzEzNTQyKQ0KDQpgYGANCg0KU2luY2UgdGhlcmUgbWF5IHN0aWxsIGJlIG9wZW4gaW52ZXN0aWdhdGlvbnMgZm9yIHJlY2VudCBjcmltZXMsIHRoaXMgY291bGQgZXhwbGFpbiB0aGUgdHJlbmQgd2UgYXJlIHNlZWluZyBpbiB0aGUgZGF0YS4gVGhlcmUgY291bGQgYWxzbyBiZSBvdGhlciBmYWN0b3JzIGF0IHBsYXksIGFuZCB0aGlzIHRyZW5kIHNob3VsZCBiZSBpbnZlc3RpZ2F0ZWQgZnVydGhlci4gSG93ZXZlciwgc2luY2Ugd2UgZG9uJ3Qga25vdyB3aGVuIHRoZSBhcnJlc3RzIHdlcmUgYWN0dWFsbHkgbWFkZSwgb3VyIGRldGVjdGl2ZSB3b3JrIGluIHRoaXMgYXJlYSBoYXMgcmVhY2hlZCBhIGRlYWQgZW5kLg0KDQojIyMgU2VjdGlvbiA0IC0gUG9wdWxhciBMb2NhdGlvbnMNCg0KIyMjIyA0LjENCkFuYWx5emluZyB0aGlzIGRhdGEgY291bGQgYmUgdXNlZnVsIHRvIHRoZSBDaGljYWdvIFBvbGljZSBEZXBhcnRtZW50IHdoZW4gZGVjaWRpbmcgd2hlcmUgdG8gYWxsb2NhdGUgcmVzb3VyY2VzLiBJZiB0aGV5IHdhbnQgdG8gaW5jcmVhc2UgdGhlIG51bWJlciBvZiBhcnJlc3RzIHRoYXQgYXJlIG1hZGUgZm9yIG1vdG9yIHZlaGljbGUgdGhlZnRzLCB3aGVyZSBzaG91bGQgdGhleSBmb2N1cyB0aGVpciBlZmZvcnRzPw0KDQpXZSB3YW50IHRvIGZpbmQgdGhlIHRvcCBmaXZlIGxvY2F0aW9ucyB3aGVyZSBtb3RvciB2ZWhpY2xlIHRoZWZ0cyBvY2N1ci4gSWYgeW91IGNyZWF0ZSBhIHRhYmxlIG9mIHRoZSBMb2NhdGlvbkRlc2NyaXB0aW9uIHZhcmlhYmxlLCBpdCBpcyB1bmZvcnR1bmF0ZWx5IHZlcnkgaGFyZCB0byByZWFkIHNpbmNlIHRoZXJlIGFyZSA3OCBkaWZmZXJlbnQgbG9jYXRpb25zIGluIHRoZSBkYXRhIHNldC4gQnkgdXNpbmcgdGhlIHNvcnQgZnVuY3Rpb24sIHdlIGNhbiB2aWV3IHRoaXMgc2FtZSB0YWJsZSwgYnV0IHNvcnRlZCBieSB0aGUgbnVtYmVyIG9mIG9ic2VydmF0aW9ucyBpbiBlYWNoIGNhdGVnb3J5LiBJbiB5b3VyIFIgY29uc29sZSwgdHlwZToNCg0KICAgIHNvcnQodGFibGUobXZ0JExvY2F0aW9uRGVzY3JpcHRpb24pKQ0KDQpXaGljaCBsb2NhdGlvbnMgYXJlIHRoZSB0b3AgZml2ZSBsb2NhdGlvbnMgZm9yIG1vdG9yIHZlaGljbGUgdGhlZnRzLCBleGNsdWRpbmcgdGhlICJPdGhlciIgY2F0ZWdvcnk/IFlvdSBzaG91bGQgc2VsZWN0IDUgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zLg0KDQorIEJhbmsNCisgR2FzIFN0YXRpb24NCisgSG90ZWwvTW90ZWwNCisgU3RyZWV0DQorIENhciBXYXNoDQorIFJlc3RhdXJhbnQNCisgUGFya2luZyBMb3QvR2FyYWdlIChOb24tUmVzaWRlbnRpYWwpDQorIEFsbGV5DQorIERyaXZld2F5IChSZXNpZGVudGlhbCkNCisgVmFjYW50IExvdC9MYW5kDQoNCmBgYHtyfQ0Kc29ydCh0YWJsZShtdnRXZWVrMSRMb2NhdGlvbkRlc2NyaXB0aW9uKSkNCmBgYA0KDQojIyMjIDQuMiANCkNyZWF0ZSBhIHN1YnNldCBvZiB5b3VyIGRhdGEsIG9ubHkgdGFraW5nIG9ic2VydmF0aW9ucyBmb3Igd2hpY2ggdGhlIHRoZWZ0IGhhcHBlbmVkIGluIG9uZSBvZiB0aGVzZSBmaXZlIGxvY2F0aW9ucywgYW5kIGNhbGwgdGhpcyBuZXcgZGF0YSBzZXQgIlRvcDUiLiBUbyBkbyB0aGlzLCB5b3UgY2FuIHVzZSB0aGUgfCBzeW1ib2wuIEluIGxlY3R1cmUsIHdlIHVzZWQgdGhlICYgc3ltYm9sIHRvIHVzZSB0d28gY3JpdGVyaWEgdG8gbWFrZSBhIHN1YnNldCBvZiB0aGUgZGF0YS4gVG8gb25seSB0YWtlIG9ic2VydmF0aW9ucyB0aGF0IGhhdmUgYSBjZXJ0YWluIHZhbHVlIGluIG9uZSB2YXJpYWJsZSBvciB0aGUgb3RoZXIsIHRoZSB8IGNoYXJhY3RlciBjYW4gYmUgdXNlZCBpbiBwbGFjZSBvZiB0aGUgJiBzeW1ib2wuIFRoaXMgaXMgYWxzbyBjYWxsZWQgYSBsb2dpY2FsICJvciIgb3BlcmF0aW9uLg0KDQpBbHRlcm5hdGVseSwgeW91IGNvdWxkIGNyZWF0ZSBmaXZlIGRpZmZlcmVudCBzdWJzZXRzLCBhbmQgdGhlbiBtZXJnZSB0aGVtIHRvZ2V0aGVyIGludG8gb25lIGRhdGEgZnJhbWUgdXNpbmcgcmJpbmQuDQoNCkhvdyBtYW55IG9ic2VydmF0aW9ucyBhcmUgaW4gVG9wNT8NCg0KYGBge3J9DQpUb3A1IDwtIHN1YnNldChtdnRXZWVrMSwgTG9jYXRpb25EZXNjcmlwdGlvbj09IlNUUkVFVCIgfCBMb2NhdGlvbkRlc2NyaXB0aW9uPT0iUEFSS0lORyBMT1QvR0FSQUdFKE5PTi5SRVNJRC4pIiB8IExvY2F0aW9uRGVzY3JpcHRpb249PSJBTExFWSIgfCBMb2NhdGlvbkRlc2NyaXB0aW9uPT0iR0FTIFNUQVRJT04iIHwgTG9jYXRpb25EZXNjcmlwdGlvbj09IkRSSVZFV0FZIC0gUkVTSURFTlRJQUwiKQ0Kc3RyKFRvcDUpDQpgYGANCg0KIyMjIyA0LjMNClIgd2lsbCByZW1lbWJlciB0aGUgb3RoZXIgY2F0ZWdvcmllcyBvZiB0aGUgTG9jYXRpb25EZXNjcmlwdGlvbiB2YXJpYWJsZSBmcm9tIHRoZSBvcmlnaW5hbCBkYXRhc2V0LCBzbyBydW5uaW5nIHRhYmxlKFRvcDUkTG9jYXRpb25EZXNjcmlwdGlvbikgd2lsbCBoYXZlIGEgbG90IG9mIHVubmVjZXNzYXJ5IG91dHB1dC4gVG8gbWFrZSBvdXIgdGFibGVzIGEgYml0IG5pY2VyIHRvIHJlYWQsIHdlIGNhbiByZWZyZXNoIHRoaXMgZmFjdG9yIHZhcmlhYmxlLiBJbiB5b3VyIFIgY29uc29sZSwgdHlwZToNCg0KICAgIFRvcDUkTG9jYXRpb25EZXNjcmlwdGlvbiA9IGZhY3RvcihUb3A1JExvY2F0aW9uRGVzY3JpcHRpb24pDQoNCklmIHlvdSBydW4gdGhlIHN0ciBvciB0YWJsZSBmdW5jdGlvbiBvbiBUb3A1IG5vdywgeW91IHNob3VsZCBzZWUgdGhhdCBMb2NhdGlvbkRlc2NyaXB0aW9uIG5vdyBvbmx5IGhhcyA1IHZhbHVlcywgYXMgd2UgZXhwZWN0Lg0KDQpVc2UgdGhlIFRvcDUgZGF0YSBmcmFtZSB0byBhbnN3ZXIgdGhlIHJlbWFpbmluZyBxdWVzdGlvbnMuDQoNCk9uZSBvZiB0aGUgbG9jYXRpb25zIGhhcyBhIG11Y2ggaGlnaGVyIGFycmVzdCByYXRlIHRoYW4gdGhlIG90aGVyIGxvY2F0aW9ucy4gV2hpY2ggaXMgaXQ/IFBsZWFzZSBlbnRlciB0aGUgdGV4dCBpbiBleGFjdGx5IHRoZSBzYW1lIHdheSBhcyBob3cgaXQgbG9va3MgaW4gdGhlIGFuc3dlciBvcHRpb25zIGZvciBQcm9ibGVtIDQuMS4NCg0KYGBge3J9DQp0YWJsZShUb3A1JExvY2F0aW9uRGVzY3JpcHRpb24sIFRvcDUkQXJyZXN0KQ0KYGBgDQoNCg0KIyMjIyA0LjQgDQpPbiB3aGljaCBkYXkgb2YgdGhlIHdlZWsgZG8gdGhlIG1vc3QgbW90b3IgdmVoaWNsZSB0aGVmdHMgYXQgZ2FzIHN0YXRpb25zIGhhcHBlbj8NCihNb25kYXl+U3VuZGF5KQ0KDQpgYGB7cn0NCnRhYmxlKFRvcDUkTG9jYXRpb25EZXNjcmlwdGlvbiwgVG9wNSRXZWVrZGF5KQ0KYGBgDQoNCiMjIyMgNC41DQpPbiB3aGljaCBkYXkgb2YgdGhlIHdlZWsgZG8gdGhlIGZld2VzdCBtb3RvciB2ZWhpY2xlIHRoZWZ0cyBpbiByZXNpZGVudGlhbCBkcml2ZXdheXMgaGFwcGVuPyhNb25kYXl+U3VuZGF5KQ0KDQpgYGB7cn0NCnRhYmxlKFRvcDUkTG9jYXRpb25EZXNjcmlwdGlvbiwgVG9wNSRXZWVrZGF5KQ0KYGBgDQoNCg0KDQoNCg0K