Assignment
Let’s start by loading in a library that has some string functions and then do some smaller stuff just to warm up.
library(stringr)
In the code chunk below, create a variable called first_name
and assign it a value equal to your name.
### your first name
Now, how any characters are in your name?
### Characters in name
Assign the variable last_name
the value of your last name.
### Last Name
And in the following chunck, make a variable named full_name
that combines your first_name
and last_name
.
### Your full name - Look Magic!
Now pay attention, this is very important. Take the output of the last chunk (e.g., your full name), and copy it to the 3\(^{rd}\) line of this document where it say author: "Your Name Here"
! That way I know whose work this is! Nice Job!
String Operations
So we’ll have a little fun with this one. Here are the lyrics to a popular song from the Beetles, entitled Hey Jude.
heyJude <- "Hey Jude don't make it bad Take a sad song and make it better Remember to let her into your heart Then you can start to make it better Hey Jude don't be afraid You were made to go out and get her The minute you let her under your skin Then you begin to make it better And anytime you feel the pain Hey Jude refrain Don't carry the world upon your shoulders For well you know that it's a fool Who plays it cool By making his world a little colder Na na na na na Na na na na Hey Jude don't let me down You have found her now go and get her let it out and let it in Remember to let her into your heart hey Jude Then you can start to make it better So let it out and let it in Hey Jude begin You're waiting for someone to perform with And don't you know that it's just you Hey Jude you'll do The movement you need is on your shoulder Na na na na na Na na na na yeah Hey Jude don't make it bad Take a sad song and make it better Remember to let her under your skin Then you'll begin to make it better Better better better better better ah Na na na na na na na yeah Yeah yeah yeah yeah yeah yeah Na na na na hey Jude Na na na na na na na Na na na na hey Jude Na na na na na na na Na na na na hey Jude Na na na na na na na Na na na na hey Jude Jude Jude Judy Judy Judy Judy ow wow Na na na na na na na my my my Na na na na hey Jude Jude Jude Jude Jude Jude Na na na na na na na yeah yeah yeah Na na na na hey Jude yeah you know you can make it Jude Jude you're not gonna break it Na na na na na na na don't make it bad Jude take a sad song and make it better Na na na na hey Jude oh Jude Jude hey Jude wa Na na na na na na na oh Jude Na na na na hey Jude hey hey hey hey Na na na na na na na hey hey Na na na na hey Jude now Jude Jude Jude Jude Jude Na na na na na na na Jude yeah yeah yeah yeah Na na na na hey Jude Na na na na na na na Na na na na hey Jude na na na na na na na na na Na na na na na na na Na na na na hey Jude Na na na na na na na Na na na na hey Jude Na na na na na na na yeah make it Jude Na na na na hey Jude yeah yeah yeah yeah yeah Yeah Yeah Yeah Yeah Na na na na na na na yeah yeah yeah yeah Yeah Yeah Na na na na hey Jude Na na na na na na na Na na na na hey Jude Na na na na na na na Na na na na hey Jude Na na na na na na na Na na na na hey Jude"
I thought it would be interesting to take a look at word frequencies for this song. To do so, we should probably first make everything the same case so that Hey
and hay
are the same. Look up the function tolower
and make the lyrics in heyJude
all lower cased.
### Make all the text lower case
Splitting Text into Words
In the lecture, I showed how to split a string into sections using the function str_split()
function. Split the lyrics into a single vector as I showed in the recorded lecture and assign it to a variable named words
. In the talk I point out that you should add the optional argument simplify=TRUE
to the optional values in the str_split()
function, make sure to do that here as well.
### Split the song into individual words
Summarizing Word Orders
Now here is something new. The function table()
takes a vector of values and tallies the count of each element. In this case, it will allow you to count each word in that song. Make a new variable named word.freqs
to hold the result and then print it out (by just typing the variable name by itself in the chunk and running the chunk).
### Make a table of the words to get counts
Here is another new thing. You can use the sort()
function to sort the word list by the magnitude of occurrences. It also has an optional argument decreasing
that you can set to TRUE
and have the results presented in decreasing order. (You can see the help file for sort()
by typing in the console ?sort
and hitting return).
### Sort the words in decreasing order.
What are the five most common words in that song?
List of words in decreasing frequency (replace the {XXXX} stuff below to answer:
- {most common word is X and occurs Y times}
- {second most common word is X and occurs Y times}
- {third most common word is X and occurs Y times}
- {fourth most common word is X and occurs Y times}
- {fifth most common word is X and occurs Y times}
Finding Locations in the String
Where is it the location in the full lyrics of the song where “Jude” is repeated three times?
### Show where Jude x 3 occurs
That was easy, now let’s do something more in-depth. The Clean Water Act of 1977 is an important document in our nations recognition that we may need to stop being jerks to the environment. There is a textual copy found on my github site at the following url.
Load in this document and we can do some textual findings.
clean_water_act <- "https://github.com/dyerlab/ENVS-Lectures/raw/master/data/clean_water_act.txt"
text <- readLines( clean_water_act)
The Clean Water Act consists of two main parts. The first one authorizes federal funds to support the treatment of sewage and the second part defines the regulatory requirements for industrial and municipal dischargers. I’ve formatted it such that each row in the file is a single element of the act (e.g., SEC. 101 [33 U.S.C. 1251] paragraph (a)(1) is entirely contained on its own line.
How many times is the word sewage
found (either as sewage
or Sewage
)?
### Finding sewage
The great lakes were intimately involved in the formulation of this Act. What is the official definition of the Great Lakes
as it pertains to bodies of water covered by the Clean Water Act?
### The great lakes... Why are they so great?
LS0tCnRpdGxlOiAiQ2hhcmFjdGVyIERhdGEgQWN0aXZpdHkiCmF1dGhvcjogIlJvZG5leSBEeWVyIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgojIyBBc3NpZ25tZW50CgoKTGV0J3Mgc3RhcnQgYnkgbG9hZGluZyBpbiBhIGxpYnJhcnkgdGhhdCBoYXMgc29tZSBzdHJpbmcgZnVuY3Rpb25zIGFuZCB0aGVuIGRvIHNvbWUgc21hbGxlciBzdHVmZiBqdXN0IHRvIHdhcm0gdXAuCgpgYGB7cn0KbGlicmFyeShzdHJpbmdyKQpgYGAKCkluIHRoZSBjb2RlIGNodW5rIGJlbG93LCBjcmVhdGUgYSB2YXJpYWJsZSBjYWxsZWQgYGZpcnN0X25hbWVgIGFuZCBhc3NpZ24gaXQgYSB2YWx1ZSBlcXVhbCB0byB5b3VyIG5hbWUuCgpgYGB7ciBlY2hvPVRSVUV9CiMjIyB5b3VyIGZpcnN0IG5hbWUKYGBgCgpOb3csIGhvdyBhbnkgY2hhcmFjdGVycyBhcmUgaW4geW91ciBuYW1lPyAKCmBgYHtyfQojIyMgQ2hhcmFjdGVycyBpbiBuYW1lCmBgYAoKQXNzaWduIHRoZSB2YXJpYWJsZSBgbGFzdF9uYW1lYCB0aGUgdmFsdWUgb2YgeW91ciBsYXN0IG5hbWUuCgpgYGB7cn0KIyMjIExhc3QgTmFtZQpgYGAKCkFuZCBpbiB0aGUgZm9sbG93aW5nIGNodW5jaywgbWFrZSBhIHZhcmlhYmxlIG5hbWVkIGBmdWxsX25hbWVgIHRoYXQgY29tYmluZXMgeW91ciBgZmlyc3RfbmFtZWAgYW5kIGBsYXN0X25hbWVgLgoKYGBge3J9CiMjIyBZb3VyIGZ1bGwgbmFtZSAtIExvb2sgTWFnaWMhCgpgYGAKCk5vdyBwYXkgYXR0ZW50aW9uLCB0aGlzIGlzICoqdmVyeSBpbXBvcnRhbnQqKi4gIFRha2UgdGhlIG91dHB1dCBvZiB0aGUgbGFzdCBjaHVuayAoZS5nLiwgeW91ciBmdWxsIG5hbWUpLCBhbmQgKmNvcHkgaXQgdG8gdGhlIDMkXntyZH0kIGxpbmUgb2YgdGhpcyBkb2N1bWVudCB3aGVyZSBpdCBzYXkgYGF1dGhvcjogIllvdXIgTmFtZSBIZXJlImAhKiAgVGhhdCB3YXkgSSBrbm93IHdob3NlIHdvcmsgdGhpcyBpcyEgIE5pY2UgSm9iIV5bWW91J2QgYmUgc3VycHJpc2VkIGhvdyBtYW55IGFzc2lnbm1lbnRzIGFyZSB0dXJuZWQgaW4gd2l0aG91dCBhIG5hbWUgb24gaXQuLi5dCgojIyBTdHJpbmcgT3BlcmF0aW9ucwoKU28gd2UnbGwgaGF2ZSBhIGxpdHRsZSBmdW4gd2l0aCB0aGlzIG9uZS4gIEhlcmUgYXJlIHRoZSBseXJpY3MgdG8gYSBwb3B1bGFyIHNvbmcgZnJvbSB0aGUgQmVldGxlcywgZW50aXRsZWQgKkhleSBKdWRlKi4KCmBgYHtyfQpoZXlKdWRlIDwtICJIZXkgSnVkZSBkb24ndCBtYWtlIGl0IGJhZCBUYWtlIGEgc2FkIHNvbmcgYW5kIG1ha2UgaXQgYmV0dGVyIFJlbWVtYmVyIHRvIGxldCBoZXIgaW50byB5b3VyIGhlYXJ0IFRoZW4geW91IGNhbiBzdGFydCB0byBtYWtlIGl0IGJldHRlciBIZXkgSnVkZSBkb24ndCBiZSBhZnJhaWQgWW91IHdlcmUgbWFkZSB0byBnbyBvdXQgYW5kIGdldCBoZXIgVGhlIG1pbnV0ZSB5b3UgbGV0IGhlciB1bmRlciB5b3VyIHNraW4gVGhlbiB5b3UgYmVnaW4gdG8gbWFrZSBpdCBiZXR0ZXIgQW5kIGFueXRpbWUgeW91IGZlZWwgdGhlIHBhaW4gSGV5IEp1ZGUgcmVmcmFpbiBEb24ndCBjYXJyeSB0aGUgd29ybGQgdXBvbiB5b3VyIHNob3VsZGVycyBGb3Igd2VsbCB5b3Uga25vdyB0aGF0IGl0J3MgYSBmb29sIFdobyBwbGF5cyBpdCBjb29sIEJ5IG1ha2luZyBoaXMgd29ybGQgYSBsaXR0bGUgY29sZGVyIE5hIG5hIG5hIG5hIG5hIE5hIG5hIG5hIG5hIEhleSBKdWRlIGRvbid0IGxldCBtZSBkb3duIFlvdSBoYXZlIGZvdW5kIGhlciBub3cgZ28gYW5kIGdldCBoZXIgbGV0IGl0IG91dCBhbmQgbGV0IGl0IGluIFJlbWVtYmVyIHRvIGxldCBoZXIgaW50byB5b3VyIGhlYXJ0IGhleSBKdWRlIFRoZW4geW91IGNhbiBzdGFydCB0byBtYWtlIGl0IGJldHRlciBTbyBsZXQgaXQgb3V0IGFuZCBsZXQgaXQgaW4gSGV5IEp1ZGUgYmVnaW4gWW91J3JlIHdhaXRpbmcgZm9yIHNvbWVvbmUgdG8gcGVyZm9ybSB3aXRoIEFuZCBkb24ndCB5b3Uga25vdyB0aGF0IGl0J3MganVzdCB5b3UgSGV5IEp1ZGUgeW91J2xsIGRvIFRoZSBtb3ZlbWVudCB5b3UgbmVlZCBpcyBvbiB5b3VyIHNob3VsZGVyIE5hIG5hIG5hIG5hIG5hIE5hIG5hIG5hIG5hIHllYWggSGV5IEp1ZGUgZG9uJ3QgbWFrZSBpdCBiYWQgVGFrZSBhIHNhZCBzb25nIGFuZCBtYWtlIGl0IGJldHRlciBSZW1lbWJlciB0byBsZXQgaGVyIHVuZGVyIHlvdXIgc2tpbiBUaGVuIHlvdSdsbCBiZWdpbiB0byBtYWtlIGl0IGJldHRlciBCZXR0ZXIgYmV0dGVyIGJldHRlciBiZXR0ZXIgYmV0dGVyIGFoIE5hIG5hIG5hIG5hIG5hIG5hIG5hIHllYWggWWVhaCB5ZWFoIHllYWggeWVhaCB5ZWFoIHllYWggTmEgbmEgbmEgbmEgaGV5IEp1ZGUgTmEgbmEgbmEgbmEgbmEgbmEgbmEgTmEgbmEgbmEgbmEgaGV5IEp1ZGUgTmEgbmEgbmEgbmEgbmEgbmEgbmEgTmEgbmEgbmEgbmEgaGV5IEp1ZGUgTmEgbmEgbmEgbmEgbmEgbmEgbmEgTmEgbmEgbmEgbmEgaGV5IEp1ZGUgSnVkZSBKdWRlIEp1ZHkgSnVkeSBKdWR5IEp1ZHkgb3cgd293IE5hIG5hIG5hIG5hIG5hIG5hIG5hIG15IG15IG15IE5hIG5hIG5hIG5hIGhleSBKdWRlIEp1ZGUgSnVkZSBKdWRlIEp1ZGUgSnVkZSBOYSBuYSBuYSBuYSBuYSBuYSBuYSB5ZWFoIHllYWggeWVhaCBOYSBuYSBuYSBuYSBoZXkgSnVkZSB5ZWFoIHlvdSBrbm93IHlvdSBjYW4gbWFrZSBpdCBKdWRlIEp1ZGUgeW91J3JlIG5vdCBnb25uYSBicmVhayBpdCBOYSBuYSBuYSBuYSBuYSBuYSBuYSBkb24ndCBtYWtlIGl0IGJhZCBKdWRlIHRha2UgYSBzYWQgc29uZyBhbmQgbWFrZSBpdCBiZXR0ZXIgTmEgbmEgbmEgbmEgaGV5IEp1ZGUgb2ggSnVkZSBKdWRlIGhleSBKdWRlIHdhIE5hIG5hIG5hIG5hIG5hIG5hIG5hIG9oIEp1ZGUgTmEgbmEgbmEgbmEgaGV5IEp1ZGUgaGV5IGhleSBoZXkgaGV5IE5hIG5hIG5hIG5hIG5hIG5hIG5hIGhleSBoZXkgTmEgbmEgbmEgbmEgaGV5IEp1ZGUgbm93IEp1ZGUgSnVkZSBKdWRlIEp1ZGUgSnVkZSBOYSBuYSBuYSBuYSBuYSBuYSBuYSBKdWRlIHllYWggeWVhaCB5ZWFoIHllYWggTmEgbmEgbmEgbmEgaGV5IEp1ZGUgTmEgbmEgbmEgbmEgbmEgbmEgbmEgTmEgbmEgbmEgbmEgaGV5IEp1ZGUgbmEgbmEgbmEgbmEgbmEgbmEgbmEgbmEgbmEgTmEgbmEgbmEgbmEgbmEgbmEgbmEgTmEgbmEgbmEgbmEgaGV5IEp1ZGUgTmEgbmEgbmEgbmEgbmEgbmEgbmEgTmEgbmEgbmEgbmEgaGV5IEp1ZGUgTmEgbmEgbmEgbmEgbmEgbmEgbmEgeWVhaCBtYWtlIGl0IEp1ZGUgTmEgbmEgbmEgbmEgaGV5IEp1ZGUgeWVhaCB5ZWFoIHllYWggeWVhaCB5ZWFoIFllYWggWWVhaCBZZWFoIFllYWggTmEgbmEgbmEgbmEgbmEgbmEgbmEgeWVhaCB5ZWFoIHllYWggeWVhaCBZZWFoIFllYWggTmEgbmEgbmEgbmEgaGV5IEp1ZGUgTmEgbmEgbmEgbmEgbmEgbmEgbmEgTmEgbmEgbmEgbmEgaGV5IEp1ZGUgTmEgbmEgbmEgbmEgbmEgbmEgbmEgTmEgbmEgbmEgbmEgaGV5IEp1ZGUgTmEgbmEgbmEgbmEgbmEgbmEgbmEgTmEgbmEgbmEgbmEgaGV5IEp1ZGUiCmBgYAoKSSB0aG91Z2h0IGl0IHdvdWxkIGJlIGludGVyZXN0aW5nIHRvIHRha2UgYSBsb29rIGF0IHdvcmQgZnJlcXVlbmNpZXMgZm9yIHRoaXMgc29uZy4gIFRvIGRvIHNvLCB3ZSBzaG91bGQgcHJvYmFibHkgZmlyc3QgbWFrZSBldmVyeXRoaW5nIHRoZSBzYW1lIGNhc2Ugc28gdGhhdCBgSGV5YCBhbmQgYGhheWAgYXJlIHRoZSBzYW1lLiAgTG9vayB1cCB0aGUgZnVuY3Rpb24gYHRvbG93ZXJgIGFuZCBtYWtlIHRoZSBseXJpY3MgaW4gYGhleUp1ZGVgIGFsbCBsb3dlciBjYXNlZC4KCmBgYHtyfQojIyMgTWFrZSBhbGwgdGhlIHRleHQgbG93ZXIgY2FzZQpgYGAKCiMjIFNwbGl0dGluZyBUZXh0IGludG8gV29yZHMKCkluIHRoZSBsZWN0dXJlLCBJIHNob3dlZCBob3cgdG8gc3BsaXQgYSBzdHJpbmcgaW50byBzZWN0aW9ucyB1c2luZyB0aGUgZnVuY3Rpb24gYHN0cl9zcGxpdCgpYCBmdW5jdGlvbi4gIFNwbGl0IHRoZSBseXJpY3MgaW50byBhIHNpbmdsZSB2ZWN0b3IgYXMgSSBzaG93ZWQgaW4gdGhlIHJlY29yZGVkIGxlY3R1cmUgYW5kIGFzc2lnbiBpdCB0byBhIHZhcmlhYmxlIG5hbWVkIGB3b3Jkc2AuICBJbiB0aGUgdGFsayBJIHBvaW50IG91dCB0aGF0IHlvdSBzaG91bGQgYWRkIHRoZSBvcHRpb25hbCBhcmd1bWVudCBgc2ltcGxpZnk9VFJVRWAgdG8gdGhlIG9wdGlvbmFsIHZhbHVlcyBpbiB0aGUgYHN0cl9zcGxpdCgpYCBmdW5jdGlvbiwgbWFrZSBzdXJlIHRvIGRvIHRoYXQgaGVyZSBhcyB3ZWxsLgoKYGBge3J9CiMjIyBTcGxpdCB0aGUgc29uZyBpbnRvIGluZGl2aWR1YWwgd29yZHMgCmBgYAoKCiMjIFN1bW1hcml6aW5nIFdvcmQgT3JkZXJzCgpOb3cgaGVyZSBpcyBzb21ldGhpbmcgbmV3LiAgVGhlIGZ1bmN0aW9uIGB0YWJsZSgpYCB0YWtlcyBhIHZlY3RvciBvZiB2YWx1ZXMgYW5kIHRhbGxpZXMgdGhlIGNvdW50IG9mIGVhY2ggZWxlbWVudC4gIEluIHRoaXMgY2FzZSwgaXQgd2lsbCBhbGxvdyB5b3UgdG8gY291bnQgZWFjaCB3b3JkIGluIHRoYXQgc29uZy4gIE1ha2UgYSBuZXcgdmFyaWFibGUgbmFtZWQgYHdvcmQuZnJlcXNgIHRvIGhvbGQgdGhlIHJlc3VsdCBhbmQgdGhlbiBwcmludCBpdCBvdXQgKGJ5IGp1c3QgdHlwaW5nIHRoZSB2YXJpYWJsZSBuYW1lIGJ5IGl0c2VsZiBpbiB0aGUgY2h1bmsgYW5kIHJ1bm5pbmcgdGhlIGNodW5rKS4KCmBgYHtyfQojIyMgTWFrZSBhIHRhYmxlIG9mIHRoZSB3b3JkcyB0byBnZXQgY291bnRzCmBgYAoKSGVyZSBpcyBhbm90aGVyIG5ldyB0aGluZy4gIFlvdSBjYW4gdXNlIHRoZSBgc29ydCgpYCBmdW5jdGlvbiB0byBzb3J0IHRoZSB3b3JkIGxpc3QgYnkgdGhlIG1hZ25pdHVkZSBvZiBvY2N1cnJlbmNlcy4gSXQgYWxzbyBoYXMgYW4gb3B0aW9uYWwgYXJndW1lbnQgYGRlY3JlYXNpbmdgIHRoYXQgeW91IGNhbiBzZXQgdG8gYFRSVUVgIGFuZCBoYXZlIHRoZSByZXN1bHRzIHByZXNlbnRlZCBpbiBkZWNyZWFzaW5nIG9yZGVyLiAgKFlvdSBjYW4gc2VlIHRoZSBoZWxwIGZpbGUgZm9yIGBzb3J0KClgIGJ5IHR5cGluZyBpbiB0aGUgY29uc29sZSBgP3NvcnRgIGFuZCBoaXR0aW5nIHJldHVybikuCgpgYGB7cn0KIyMjIFNvcnQgdGhlIHdvcmRzIGluIGRlY3JlYXNpbmcgb3JkZXIuCmBgYAoKV2hhdCBhcmUgdGhlIGZpdmUgbW9zdCBjb21tb24gd29yZHMgaW4gdGhhdCBzb25nPwoKTGlzdCBvZiB3b3JkcyBpbiBkZWNyZWFzaW5nIGZyZXF1ZW5jeSAocmVwbGFjZSB0aGUge1hYWFh9IHN0dWZmIGJlbG93IHRvIGFuc3dlcjogIAoKMS4ge21vc3QgY29tbW9uIHdvcmQgaXMgWCBhbmQgb2NjdXJzIFkgdGltZXN9ICAKMi4ge3NlY29uZCBtb3N0IGNvbW1vbiB3b3JkIGlzIFggYW5kIG9jY3VycyBZIHRpbWVzfSAKMy4ge3RoaXJkIG1vc3QgY29tbW9uIHdvcmQgaXMgWCBhbmQgb2NjdXJzIFkgdGltZXN9IAo0LiB7Zm91cnRoIG1vc3QgY29tbW9uIHdvcmQgaXMgWCBhbmQgb2NjdXJzIFkgdGltZXN9IAo1LiB7ZmlmdGggbW9zdCBjb21tb24gd29yZCBpcyBYIGFuZCBvY2N1cnMgWSB0aW1lc30gCgoKIyMgRmluZGluZyBMb2NhdGlvbnMgaW4gdGhlIFN0cmluZwoKV2hlcmUgaXMgaXQgdGhlIGxvY2F0aW9uIGluIHRoZSBmdWxsIGx5cmljcyBvZiB0aGUgc29uZyB3aGVyZSAiSnVkZSIgaXMgcmVwZWF0ZWQgdGhyZWUgdGltZXM/CgpgYGB7cn0KIyMjIFNob3cgd2hlcmUgSnVkZSB4IDMgb2NjdXJzCmBgYAoKCi0tLQoKVGhhdCB3YXMgZWFzeSwgbm93IGxldCdzIGRvIHNvbWV0aGluZyBtb3JlIGluLWRlcHRoLiAgVGhlIENsZWFuIFdhdGVyIEFjdCBvZiAxOTc3IGlzIGFuIGltcG9ydGFudCBkb2N1bWVudCBpbiBvdXIgbmF0aW9ucyByZWNvZ25pdGlvbiB0aGF0IHdlIG1heSBuZWVkIHRvIHN0b3AgYmVpbmcgamVya3MgdG8gdGhlIGVudmlyb25tZW50LiAgVGhlcmUgaXMgYSB0ZXh0dWFsIGNvcHkgZm91bmQgb24gbXkgZ2l0aHViIHNpdGUgYXQgdGhlIGZvbGxvd2luZyB1cmwuCgpMb2FkIGluIHRoaXMgZG9jdW1lbnQgYW5kIHdlIGNhbiBkbyBzb21lIHRleHR1YWwgZmluZGluZ3MuCgpgYGB7cn0KY2xlYW5fd2F0ZXJfYWN0IDwtICJodHRwczovL2dpdGh1Yi5jb20vZHllcmxhYi9FTlZTLUxlY3R1cmVzL3Jhdy9tYXN0ZXIvZGF0YS9jbGVhbl93YXRlcl9hY3QudHh0Igp0ZXh0IDwtIHJlYWRMaW5lcyggY2xlYW5fd2F0ZXJfYWN0KQpgYGAKCgoKVGhlIENsZWFuIFdhdGVyIEFjdCBjb25zaXN0cyBvZiB0d28gbWFpbiBwYXJ0cy4gIFRoZSBmaXJzdCBvbmUgYXV0aG9yaXplcyBmZWRlcmFsIGZ1bmRzIHRvIHN1cHBvcnQgdGhlIHRyZWF0bWVudCBvZiBzZXdhZ2UgYW5kIHRoZSBzZWNvbmQgcGFydCBkZWZpbmVzIHRoZSByZWd1bGF0b3J5IHJlcXVpcmVtZW50cyBmb3IgaW5kdXN0cmlhbCBhbmQgbXVuaWNpcGFsIGRpc2NoYXJnZXJzLiAgSSd2ZSBmb3JtYXR0ZWQgaXQgc3VjaCB0aGF0IGVhY2ggcm93IGluIHRoZSBmaWxlIGlzIGEgc2luZ2xlIGVsZW1lbnQgb2YgdGhlIGFjdCAoZS5nLiwgU0VDLiAxMDEgWzMzIFUuUy5DLiAxMjUxXSBwYXJhZ3JhcGggKGEpKDEpIGlzIGVudGlyZWx5IGNvbnRhaW5lZCBvbiBpdHMgb3duIGxpbmUuCgpIb3cgbWFueSB0aW1lcyBpcyB0aGUgd29yZCBgc2V3YWdlYCBmb3VuZCAoZWl0aGVyIGFzIGBzZXdhZ2VgIG9yIGBTZXdhZ2VgKT8KCmBgYHtyfQojIyMgRmluZGluZyBzZXdhZ2UKYGBgCgpUaGUgZ3JlYXQgbGFrZXMgd2VyZSBpbnRpbWF0ZWx5IGludm9sdmVkIGluIHRoZSBmb3JtdWxhdGlvbiBvZiB0aGlzIEFjdC4gIFdoYXQgaXMgdGhlIG9mZmljaWFsIGRlZmluaXRpb24gb2YgdGhlIGBHcmVhdCBMYWtlc2AgYXMgaXQgcGVydGFpbnMgdG8gYm9kaWVzIG9mIHdhdGVyIGNvdmVyZWQgYnkgdGhlIENsZWFuIFdhdGVyIEFjdD8KCmBgYHtyfQojIyMgVGhlIGdyZWF0IGxha2VzLi4uICBXaHkgYXJlIHRoZXkgc28gZ3JlYXQ/CmBgYAoKCgoK