Preparation Instructions

EXERCISES

Tidy Data

The United Nations collects information about the estimates of international migration by age, sex, and origin. In this Challenge Problem, you are going to examine the data from 2015 that provides information on migrants by destination country and origin country.

For Questions 1 to 3, refer to the United Nations’ migration spreadsheet (worksheet titled Table 16) found on the Canvas page (titled UN_MigrantStockByOriginAndDestination_2015.xlsx).

  1. Identify at least three things that make this spreadsheet untidy.
  • The column headers contain values rather than names
  • The variables (origins) are stored in both rows and columns
  • There are multiple observations stored in a single table
  1. Describe how you would make this spreadsheet into a tidy dataset. Be sure to clearly define the cases (or observational units) and the variables in your tidy dataset.
  • The cases for this spreadsheet would be each migrants country of origin matched to the destination in 2015, while the variables for this spreadsheet would be Country of Origin, Destination Country/Region, and Migrant Stock. To make this spreadsheet into tidy dataset, each row would represent a case, and each column would represent a variable.
  1. While tidy data is useful for analyzing the data within a software, when might a spreadsheet or presentation like this one be relevant?
  • If an infectious disease outbreak occurred, public health professionals could use this spreadsheet to evaluate where people are immigrating from to determine if the disease came from there.

Extra challenge (not required): Re-write the spreadsheet in a tidy form for the first 10 cases using Google Sheets and providing a link to the data in this document. Be sure to change the Share settings to “Anyone with the link” can view so that the link works.

R programming

Note: The following questions are adapted from the exercises presented in Chapter 3 of the Data Computing textbook.

  1. Explain why the following sentence would result in an error message:
Result <- %>% filter(BabyNames, name == "Prince")
  • Currently, the data table (BabyNames) is next to the argument (name = “Prince”), which is incorrect. The pipe (%>%) has to have the data table (BabyNames) in front of it so that the function (filter) can work properly.
  1. Consider these R expressions. (You don’t have to know what the various functions do to solve this problem.)
# Wrangling the data: to count the number babies named Prince, grouped by year and sex
Princes <-
  BabyNames %>%
  filter(name == "Prince") %>%
  group_by(year, sex) %>%
  summarise(yearlyTotal = sum(count))

# Graphing the results
Princes %>%
  ggplot(data = Princes, aes(x = year, y = yearlyTotal)) + 
  geom_point(aes(color = sex)) + 
  geom_vline(xintercept = 1978)

There are several kinds of components in the above expressions.

  1. function name

  2. data table name

  3. variable name

  4. argument name

  5. constant

Match each of the following to what kind of component ( (a) through (e) ) it is.

  • ggplot(a)

  • data = (d)

  • Princes (b)

  • aes(a)

  • x =(d)

  • year(c)

  • geom_point(a)

  • color =(d)

  • xintercept =(d)

  • 1978(e)

Putting It All Together

Now let’s put the topics of R Markdown, R programming, and tidy data together. You are going to do this by using the msleep data table from the {ggplot2} package.

  1. Load the {ggplot2} package and the msleep dataset. Be sure to show your work in the code chunk below.
library(ggplot2)
data(msleep)
  1. Examine the msleep dataset in at least two ways (using at least two functions). Also, modify the code chunk option so that only the output appears in the knitted document but prevents the code from displaying. Be sure to show your work.
## tibble [83 × 11] (S3: tbl_df/tbl/data.frame)
##  $ name        : chr [1:83] "Cheetah" "Owl monkey" "Mountain beaver" "Greater short-tailed shrew" ...
##  $ genus       : chr [1:83] "Acinonyx" "Aotus" "Aplodontia" "Blarina" ...
##  $ vore        : chr [1:83] "carni" "omni" "herbi" "omni" ...
##  $ order       : chr [1:83] "Carnivora" "Primates" "Rodentia" "Soricomorpha" ...
##  $ conservation: chr [1:83] "lc" NA "nt" "lc" ...
##  $ sleep_total : num [1:83] 12.1 17 14.4 14.9 4 14.4 8.7 7 10.1 3 ...
##  $ sleep_rem   : num [1:83] NA 1.8 2.4 2.3 0.7 2.2 1.4 NA 2.9 NA ...
##  $ sleep_cycle : num [1:83] NA NA NA 0.133 0.667 ...
##  $ awake       : num [1:83] 11.9 7 9.6 9.1 20 9.6 15.3 17 13.9 21 ...
##  $ brainwt     : num [1:83] NA 0.0155 NA 0.00029 0.423 NA NA NA 0.07 0.0982 ...
##  $ bodywt      : num [1:83] 50 0.48 1.35 0.019 600 ...
## [1] 83
##  [1] "name"         "genus"        "vore"         "order"        "conservation"
##  [6] "sleep_total"  "sleep_rem"    "sleep_cycle"  "awake"        "brainwt"     
## [11] "bodywt"
## [1] "carni"   "omni"    "herbi"   NA        "insecti"
  1. How many cases are there are in the msleep dataset? How many variables?
  • There are 83 cases and 11 variables in the ‘msleep’ dataset.
  1. Define what a case is (in the context of the dataset).
  • In this dataset each case represents the type of animal species, matched with sleep data
  1. Describe the attribute or measurement that is contained in the brainwt variable.
  • The measurement ‘brainwt’ variable represents brain weight for the different animals.
  1. How many categories are in the vore variable and what do they represent? Note: the documentation in the help file for the msleep data set is not consistent with the number of groups in the data. Please base your answer on the number of categories in the actual data.
  • There are 5 categories in the ‘vore’ variable.

    *carni represents carnivore animals

    *omni represents omnivore animals

    *herbi represents herbivore animals

    *insecti represents insect animals

    *NA represents missing values

  1. Tweak each of the following R commands so that they run correctly [Note: Take out eval=FALSE in the options of the code chunk so that the code executes in your assignment]:
library(ggplot2)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
ggplot(data = msleep) + 
  geom_point(mapping = aes(x = bodywt, y = sleep_total))

omnivore <- msleep %>%
  filter(vore == "omni")
omnivore
LS0tCnRpdGxlOiAiV2VlayAyIENoYWxsZW5nZSBQcm9ibGVtIgphdXRob3I6ICJCaWxzdW1hIEFkZW1hIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBwYWdlZAogICAgY29kZV9kb3dubG9hZDogdHJ1ZQotLS0KCiMjIyBQcmVwYXJhdGlvbiBJbnN0cnVjdGlvbnMKCi0gUmVtaW5kZXI6IE1ha2Ugc3VyZSB0byBzYXZlIHRoaXMgZmlsZSAoRmlsZSA+IFNhdmUgQXMgLi4uKSBpbiB0aGUgZm9sZGVyIHlvdSBjcmVhdGVkIGZvciB0aGlzIGNsYXNzIChOT1QgaW4gdGhlIERvd25sb2FkcyBmb2xkZXIhKS4KCi0gS25pdCB5b3VyIGRvY3VtZW50IHRvIEhUTUwgZnJlcXVlbnRseSBzbyB5b3UgY2FuIG1vcmUgZWFzaWx5IGZpbmQgeW91ciBtaXN0YWtlcy4gW1RoaW5ncyB0byBjb25zaWRlciB3aGVuIHlvdSBrbml0IHlvdXIgZG9jdW1lbnRzOiBEb2VzIGV2ZXJ5dGhpbmcgbG9vayBhcyB5b3Ugc3VzcGVjdGVkPyBJZiBub3QsIHRyeSB0byBmaWd1cmUgb3V0IHRoZSBwcm9ibGVtIGFuZCBmaXggaXQuXQoKLSBCZSBzdXJlIHRvIGNoYW5nZSB0aGUgYXV0aG9yIGluIHRoZSBZQU1MIHRvIHlvdXIgbmFtZS4gUmVtZW1iZXIgdG8ga2VlcCBpdCBpbnNpZGUgdGhlIHF1b3Rlcy4KCgojIyMjIEVYRVJDSVNFUwoKKipUaWR5IERhdGEqKgoKVGhlIFtVbml0ZWQgTmF0aW9uc10oaHR0cHM6Ly93d3cudW4ub3JnL2RldmVsb3BtZW50L2Rlc2EvcGQvY29udGVudC9pbnRlcm5hdGlvbmFsLW1pZ3JhbnQtc3RvY2spIGNvbGxlY3RzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlc3RpbWF0ZXMgb2YgaW50ZXJuYXRpb25hbCBtaWdyYXRpb24gYnkgYWdlLCBzZXgsIGFuZCBvcmlnaW4uIEluIHRoaXMgQ2hhbGxlbmdlIFByb2JsZW0sIHlvdSBhcmUgZ29pbmcgdG8gZXhhbWluZSB0aGUgZGF0YSBmcm9tIDIwMTUgdGhhdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBvbiBtaWdyYW50cyBieSBkZXN0aW5hdGlvbiBjb3VudHJ5IGFuZCBvcmlnaW4gY291bnRyeS4KCkZvciBRdWVzdGlvbnMgMSB0byAzLCByZWZlciB0byB0aGUgVW5pdGVkIE5hdGlvbnMnIG1pZ3JhdGlvbiBzcHJlYWRzaGVldCAod29ya3NoZWV0IHRpdGxlZCBUYWJsZSAxNikgZm91bmQgb24gdGhlIENhbnZhcyBwYWdlICh0aXRsZWQgKlVOX01pZ3JhbnRTdG9ja0J5T3JpZ2luQW5kRGVzdGluYXRpb25fMjAxNS54bHN4KikuIAoKKEApIElkZW50aWZ5IGF0IGxlYXN0IHRocmVlIHRoaW5ncyB0aGF0IG1ha2UgdGhpcyBzcHJlYWRzaGVldCB1bnRpZHkuIAoqIFRoZSBjb2x1bW4gaGVhZGVycyBjb250YWluIHZhbHVlcyByYXRoZXIgdGhhbiBuYW1lcyAKKiBUaGUgdmFyaWFibGVzIChvcmlnaW5zKSBhcmUgc3RvcmVkIGluIGJvdGggcm93cyBhbmQgY29sdW1ucyAKKiBUaGVyZSBhcmUgbXVsdGlwbGUgb2JzZXJ2YXRpb25zIHN0b3JlZCBpbiBhIHNpbmdsZSB0YWJsZQoKKEApIERlc2NyaWJlIGhvdyB5b3Ugd291bGQgbWFrZSB0aGlzIHNwcmVhZHNoZWV0IGludG8gYSB0aWR5IGRhdGFzZXQuIEJlIHN1cmUgdG8gY2xlYXJseSBkZWZpbmUgdGhlIGNhc2VzIChvciBvYnNlcnZhdGlvbmFsIHVuaXRzKSBhbmQgdGhlIHZhcmlhYmxlcyBpbiB5b3VyIHRpZHkgZGF0YXNldC4gCiogVGhlIGNhc2VzIGZvciB0aGlzIHNwcmVhZHNoZWV0IHdvdWxkIGJlIGVhY2ggbWlncmFudHMgY291bnRyeSBvZiBvcmlnaW4gbWF0Y2hlZCB0byB0aGUgZGVzdGluYXRpb24gaW4gMjAxNSwgd2hpbGUgdGhlIHZhcmlhYmxlcyBmb3IgdGhpcyBzcHJlYWRzaGVldCB3b3VsZCBiZSBDb3VudHJ5IG9mIE9yaWdpbiwgRGVzdGluYXRpb24gQ291bnRyeS9SZWdpb24sIGFuZCBNaWdyYW50IFN0b2NrLiBUbyBtYWtlIHRoaXMgc3ByZWFkc2hlZXQgaW50byB0aWR5IGRhdGFzZXQsIGVhY2ggcm93IHdvdWxkIHJlcHJlc2VudCBhIGNhc2UsIGFuZCBlYWNoIGNvbHVtbiB3b3VsZCByZXByZXNlbnQgYSB2YXJpYWJsZS4gCgooQCkgV2hpbGUgdGlkeSBkYXRhIGlzIHVzZWZ1bCBmb3IgYW5hbHl6aW5nIHRoZSBkYXRhIHdpdGhpbiBhIHNvZnR3YXJlLCB3aGVuIG1pZ2h0IGEgc3ByZWFkc2hlZXQgb3IgcHJlc2VudGF0aW9uIGxpa2UgdGhpcyBvbmUgYmUgcmVsZXZhbnQ/CiogSWYgYW4gaW5mZWN0aW91cyBkaXNlYXNlIG91dGJyZWFrIG9jY3VycmVkLCBwdWJsaWMgaGVhbHRoIHByb2Zlc3Npb25hbHMgY291bGQgdXNlIHRoaXMgc3ByZWFkc2hlZXQgdG8gZXZhbHVhdGUgd2hlcmUgcGVvcGxlIGFyZSBpbW1pZ3JhdGluZyBmcm9tIHRvIGRldGVybWluZSBpZiB0aGUgZGlzZWFzZSBjYW1lIGZyb20gdGhlcmUuICAgCgoqKkV4dHJhIGNoYWxsZW5nZSAobm90IHJlcXVpcmVkKToqKiBSZS13cml0ZSB0aGUgc3ByZWFkc2hlZXQgaW4gYSB0aWR5IGZvcm0gZm9yIHRoZSBmaXJzdCAxMCBjYXNlcyB1c2luZyBHb29nbGUgU2hlZXRzIGFuZCBwcm92aWRpbmcgYSBsaW5rIHRvIHRoZSBkYXRhIGluIHRoaXMgZG9jdW1lbnQuIEJlIHN1cmUgdG8gY2hhbmdlIHRoZSBTaGFyZSBzZXR0aW5ncyB0byAiQW55b25lIHdpdGggdGhlIGxpbmsiIGNhbiB2aWV3IHNvIHRoYXQgdGhlIGxpbmsgd29ya3MuCgoqKlIgcHJvZ3JhbW1pbmcqKgoKTm90ZTogVGhlIGZvbGxvd2luZyBxdWVzdGlvbnMgYXJlIGFkYXB0ZWQgZnJvbSB0aGUgZXhlcmNpc2VzIHByZXNlbnRlZCBpbiBDaGFwdGVyIDMgb2YgdGhlIFtEYXRhIENvbXB1dGluZ10oaHR0cHM6Ly9kdGthcGxhbi5naXRodWIuaW8vRGF0YUNvbXB1dGluZ0Vib29rL2NoYXAtYmFzaWMtci1jb21tYW5kcy5odG1sI2NoYXA6YmFzaWMtci1jb21tYW5kcykgdGV4dGJvb2suCgooQCkgRXhwbGFpbiB3aHkgdGhlIGZvbGxvd2luZyBzZW50ZW5jZSB3b3VsZCByZXN1bHQgaW4gYW4gZXJyb3IgbWVzc2FnZToKCmBgYHtyIGV2YWw9RkFMU0V9ClJlc3VsdCA8LSAlPiUgZmlsdGVyKEJhYnlOYW1lcywgbmFtZSA9PSAiUHJpbmNlIikKYGBgCiogQ3VycmVudGx5LCB0aGUgZGF0YSB0YWJsZSAoQmFieU5hbWVzKSBpcyBuZXh0IHRvIHRoZSBhcmd1bWVudCAobmFtZSA9ICJQcmluY2UiKSwgd2hpY2ggaXMgaW5jb3JyZWN0LiBUaGUgcGlwZSAoJT4lKSBoYXMgdG8gaGF2ZSB0aGUgZGF0YSB0YWJsZSAoQmFieU5hbWVzKSBpbiBmcm9udCBvZiBpdCBzbyB0aGF0IHRoZSBmdW5jdGlvbiAoZmlsdGVyKSBjYW4gd29yayBwcm9wZXJseS4gCihAKSBDb25zaWRlciB0aGVzZSBSIGV4cHJlc3Npb25zLiAoWW91IGRvbuKAmXQgaGF2ZSB0byBrbm93IHdoYXQgdGhlIHZhcmlvdXMgZnVuY3Rpb25zIGRvIHRvIHNvbHZlIHRoaXMgcHJvYmxlbS4pCgpgYGB7ciBldmFsPUZBTFNFfQojIFdyYW5nbGluZyB0aGUgZGF0YTogdG8gY291bnQgdGhlIG51bWJlciBiYWJpZXMgbmFtZWQgUHJpbmNlLCBncm91cGVkIGJ5IHllYXIgYW5kIHNleApQcmluY2VzIDwtCiAgQmFieU5hbWVzICU+JQogIGZpbHRlcihuYW1lID09ICJQcmluY2UiKSAlPiUKICBncm91cF9ieSh5ZWFyLCBzZXgpICU+JQogIHN1bW1hcmlzZSh5ZWFybHlUb3RhbCA9IHN1bShjb3VudCkpCgojIEdyYXBoaW5nIHRoZSByZXN1bHRzClByaW5jZXMgJT4lCiAgZ2dwbG90KGRhdGEgPSBQcmluY2VzLCBhZXMoeCA9IHllYXIsIHkgPSB5ZWFybHlUb3RhbCkpICsgCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBzZXgpKSArIAogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDE5NzgpCmBgYAoKVGhlcmUgYXJlIHNldmVyYWwga2luZHMgb2YgY29tcG9uZW50cyBpbiB0aGUgYWJvdmUgZXhwcmVzc2lvbnMuCgphLiBmdW5jdGlvbiBuYW1lCgojLiBkYXRhIHRhYmxlIG5hbWUKCiMuIHZhcmlhYmxlIG5hbWUKCiMuIGFyZ3VtZW50IG5hbWUKCiMuIGNvbnN0YW50CgpNYXRjaCBlYWNoIG9mIHRoZSBmb2xsb3dpbmcgdG8gd2hhdCBraW5kIG9mIGNvbXBvbmVudCAoIChhKSB0aHJvdWdoIChlKSApIGl0IGlzLgoKLSBgZ2dwbG90KGEpYAoKLSBgZGF0YSA9IChkKWAKCi0gYFByaW5jZXMgKGIpYAoKLSBgYWVzKGEpYAoKLSBgeCA9KGQpYAoKLSBgeWVhcihjKWAKCi0gYGdlb21fcG9pbnQoYSlgCgotIGBjb2xvciA9KGQpYAoKLSBgeGludGVyY2VwdCA9KGQpYAoKLSBgMTk3OChlKWAKCioqUHV0dGluZyBJdCBBbGwgVG9nZXRoZXIqKgoKTm93IGxldCdzIHB1dCB0aGUgdG9waWNzIG9mIFIgTWFya2Rvd24sIFIgcHJvZ3JhbW1pbmcsIGFuZCB0aWR5IGRhdGEgdG9nZXRoZXIuIFlvdSBhcmUgZ29pbmcgdG8gZG8gdGhpcyBieSB1c2luZyB0aGUgYG1zbGVlcGAgZGF0YSB0YWJsZSBmcm9tIHRoZSBge2dncGxvdDJ9YCBwYWNrYWdlLiAKCihAKSBMb2FkIHRoZSBge2dncGxvdDJ9YCBwYWNrYWdlIGFuZCB0aGUgYG1zbGVlcGAgZGF0YXNldC4gQmUgc3VyZSB0byBzaG93IHlvdXIgd29yayBpbiB0aGUgY29kZSBjaHVuayBiZWxvdy4KCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCmRhdGEobXNsZWVwKQpgYGAKCihAKSBFeGFtaW5lIHRoZSBgbXNsZWVwYCBkYXRhc2V0IGluIGF0IGxlYXN0IHR3byB3YXlzICh1c2luZyBhdCBsZWFzdCB0d28gZnVuY3Rpb25zKS4gQWxzbywgbW9kaWZ5IHRoZSBjb2RlIGNodW5rIG9wdGlvbiBzbyB0aGF0IG9ubHkgdGhlIG91dHB1dCBhcHBlYXJzIGluIHRoZSBrbml0dGVkIGRvY3VtZW50IGJ1dCBwcmV2ZW50cyB0aGUgY29kZSBmcm9tIGRpc3BsYXlpbmcuIEJlIHN1cmUgdG8gc2hvdyB5b3VyIHdvcmsuCgpgYGB7ciBlY2hvPUZBTFNFfQpzdHIobXNsZWVwKQpucm93KG1zbGVlcCkKbmFtZXMobXNsZWVwKQp1bmlxdWUobXNsZWVwJHZvcmUpCmBgYAoKKEApIEhvdyBtYW55IGNhc2VzIGFyZSB0aGVyZSBhcmUgaW4gdGhlIGBtc2xlZXBgIGRhdGFzZXQ/IEhvdyBtYW55IHZhcmlhYmxlcz8KKiBUaGVyZSBhcmUgODMgY2FzZXMgYW5kIDExIHZhcmlhYmxlcyBpbiB0aGUgJ21zbGVlcCcgZGF0YXNldC4gCgooQCkgRGVmaW5lIHdoYXQgYSBjYXNlIGlzIChpbiB0aGUgY29udGV4dCBvZiB0aGUgZGF0YXNldCkuCiogSW4gdGhpcyBkYXRhc2V0IGVhY2ggY2FzZSByZXByZXNlbnRzIHRoZSB0eXBlIG9mIGFuaW1hbCBzcGVjaWVzLCBtYXRjaGVkIHdpdGggc2xlZXAgZGF0YSAKCihAKSBEZXNjcmliZSB0aGUgYXR0cmlidXRlIG9yIG1lYXN1cmVtZW50IHRoYXQgaXMgY29udGFpbmVkIGluIHRoZSBgYnJhaW53dGAgdmFyaWFibGUuCiogVGhlIG1lYXN1cmVtZW50ICdicmFpbnd0JyB2YXJpYWJsZSByZXByZXNlbnRzIGJyYWluIHdlaWdodCBmb3IgdGhlIGRpZmZlcmVudCBhbmltYWxzLiAKCihAKSBIb3cgbWFueSBjYXRlZ29yaWVzIGFyZSBpbiB0aGUgYHZvcmVgIHZhcmlhYmxlIGFuZCB3aGF0IGRvIHRoZXkgcmVwcmVzZW50PyBOb3RlOiB0aGUgZG9jdW1lbnRhdGlvbiBpbiB0aGUgaGVscCBmaWxlIGZvciB0aGUgYG1zbGVlcGAgZGF0YSBzZXQgaXMgbm90IGNvbnNpc3RlbnQgd2l0aCB0aGUgbnVtYmVyIG9mIGdyb3VwcyBpbiB0aGUgZGF0YS4gUGxlYXNlIGJhc2UgeW91ciBhbnN3ZXIgb24gdGhlIG51bWJlciBvZiBjYXRlZ29yaWVzIGluIHRoZSBhY3R1YWwgZGF0YS4gCiogVGhlcmUgYXJlIDUgY2F0ZWdvcmllcyBpbiB0aGUgJ3ZvcmUnIHZhcmlhYmxlLiAKCiAgKmNhcm5pIHJlcHJlc2VudHMgY2Fybml2b3JlIGFuaW1hbHMKICAKICAqb21uaSByZXByZXNlbnRzIG9tbml2b3JlIGFuaW1hbHMgCiAgCiAgKmhlcmJpIHJlcHJlc2VudHMgaGVyYml2b3JlIGFuaW1hbHMgCiAgCiAgKmluc2VjdGkgcmVwcmVzZW50cyBpbnNlY3QgYW5pbWFscyAKICAKICAqTkEgcmVwcmVzZW50cyBtaXNzaW5nIHZhbHVlcwoKKEApIFR3ZWFrIGVhY2ggb2YgdGhlIGZvbGxvd2luZyBSIGNvbW1hbmRzIHNvIHRoYXQgdGhleSBydW4gY29ycmVjdGx5IFtOb3RlOiBUYWtlIG91dCBgZXZhbD1GQUxTRWAgaW4gdGhlIG9wdGlvbnMgb2YgdGhlIGNvZGUgY2h1bmsgc28gdGhhdCB0aGUgY29kZSBleGVjdXRlcyBpbiB5b3VyIGFzc2lnbm1lbnRdOgoKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKCmdncGxvdChkYXRhID0gbXNsZWVwKSArIAogIGdlb21fcG9pbnQobWFwcGluZyA9IGFlcyh4ID0gYm9keXd0LCB5ID0gc2xlZXBfdG90YWwpKQoKb21uaXZvcmUgPC0gbXNsZWVwICU+JQogIGZpbHRlcih2b3JlID09ICJvbW5pIikKb21uaXZvcmUKYGBgCgo=