Problem 1
Please enter your github repo address in the space provided below.
I’ve added a little example to jog your memory.
Example: My GitHub Link
Enter Here: My Github
Link
Problem 2
For this problem, you are asked to create a list of 3
concepts you have learned about so far this semester. Enter the
solution below in the space provided.
Include the name of the course as a sub-heading (that is, using
##)
Include the concepts as an unordered list (This
should not be done in a chunk of code, but simply inserted using
markdown syntax).
Include a link to information about at least one of the concept
you listed (for example a link to the Wikipedia page about that
concept/topics).
Include an an image that you think represents either one of the
concepts or how you feel about one of the concepts.
Remember: you can also scan in and save something you’ve
drawn or taken a picture of yourself.
Solution Below:
Concept 1
Discrete Mathematics
In discrete math I learned that functions have a use in just about
every type of math, not just programming. Functions in discrete require
only one output per input, any more than that invalidates the function.
Discrete has helped me improve my logic and reasoning. Wikipedia page
for math logic 
Concept 2
Statistics
In Statistics I learned about probability and how it relates to
everything. I have always been good at statistics but reinforcing the
fundamentals have been fun for me so far. My love for statistics is
partly why I went into the data science field. Wikipedia page for
probability 
Concept 3
C++
In my C++ class, I mostly just reinforced what I learned in my C
class last year. One interesting concept I learned however was
recursion. You can call a function within a function, just have to make
sure that its not an infinite loop and theres a control variable to stop
it. Wikipedia
page for Recursion 
Problem 3
In this problem you will practice some basic R operations. Include
solutions to each items by inserting a new R chunk of code (make sure
you run the chunk so that the output is displayed)
- Create a variable called
my_name that contains your
preferred name.
{r} # Solution for 3a: my_name <- "Charles Downing"
- Create a variable called
name_length that holds how
many letters are in my_name. Do not just set how many
letters you have in your name to this variable, use a built-in
function.
{r} # Solution for 3b: namelength <- length(my_name)
- Show which value is bigger: \(e^\pi\) or \(\pi^e\).
Hint: R has some built-in functions, exp() being one of
them.
{r} # Solution for 3c: etopi <- exp(pi) pitoe <- pi^exp(1) big <- (max(etopi,pitoe)) big
- Define a function called
add_three
that takes a single argument and returns a value with 3 units added to
the original input.
{r} # Solution for 3d: add_three <- function(x) { y <- x + 3 y }
- Use the colon operator
: to create a vector
v of numbers from 10 to 49. Find the length of this vector
using the length() function.
{r} # Solution for 3e: v = 10:49 length(v)
- Use the
seq() function to produce a range of number
from -5 to 10 in 0.5 increments.
{r} # Solution for 3F: seq(from = -5, to = 10, by = 0.5)
Problem 4
- Define a function
imperial_to_metric
that takes in two arguments: a number of feet and a
number of inches. The function should return the equivalent length in
meters
To convert a length L from feet (ft) and
inches (inches) to meters (m), one can use the
relation: L(m) = L(ft) × 0.3048 + L(inches) × 0.0254
```{r}
imperial_to_metric <- function(feet,inches){ meters <- (feet *
0.3048 + inches * 0.0254) meters }
(b) Create a variable `height_in_meters` by passing your height in imperial to the `imperial_to_metric` function.
```{r}
height_in_meters <- imperial_to_metric(5,6)
Problem 5
- Create the following vectors in
R (see the pattern and
use appropriate functions to construct these vectors):
\(a = (5, 10, 15, 20, ...,
160)\)
\(b = (87, 86, 85, ..., 56)\)
```{r}
a = seq(from =5, to = 160, by = 5) b = seq(from = 87, to = 56, by =
-1)
(b) Multiply these vectors and call the result `d` (element-wise multiplication).
```{r}
d <- a*b
- What are the 19th, 20th, and 21st elements of
d?
```{r}
d[19:21]
(d) What are all of the elements of `d` which are less than 2000?
```{r}
d[d<2000]
- How many elements of
d are greater than 6000?
```{r}
d[d>6000]
# Problem 6 - Word Problem
Assume that you have several investment choices. For each investment, there are two equally likely end-of-year forecasts: the optimistic value (up_value), and the pessimistic value (down_value). Assume the expected return and risk of each investment is given by:
> expected_end_value = (up_value + down_value) / 2 <br>
expected_return = (expected_end_value - initial_investment) / initial_investment <br>
risk = (up_value - down_value) / 2 <br>
a) Write a program that for one investment choice, prompts for three inputs:
- initial investment amount
- optimistic end value (up_value)
- pessimistic end value (down_value)
and then calculates the investment’s expected return and risk. You will need to enter your own chunks for this below:
```{r}
investment_pro <- function(Amount,up_value,down_value) {
# Calculation
expected_end_value <- (up_value + down_value) / 2
expected_return <- (expected_end_value - Amount) / Amount
risk = (up_value - down_value) / 2
#Printing
cat("Results:\n", "Expected End Value: ",expected_end_value, "\n","Expected Return: ",expected_return, "\n","Risk: ",risk)
}
```{r} #Prompts the user for input Amount <-
as.numeric(readline(prompt = “Enter initial investment:”)) up_value
<- as.numeric(readline(prompt = “Enter the optimistic value:”))
down_value <- as.numeric(readline(prompt = “Enter the pessimistic
value:”)) investment_pro(Amount,up_value,down_value) #For the result
below I used: 100,200,150
```
LS0tDQp0aXRsZTogIkZvdW5kYXRpb25zIG9mIERhdGEgQW5hbHl0aWNzIC0gSFcgMSINCmF1dGhvcjogIkNoYXJsZXMgLSBEb3duaW5nIC0gJ0Nkb3duaW5nNzYwNkBmbG9yaWRhcG9seS5lZHUiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojIFByb2JsZW0gMQ0KDQpQbGVhc2UgZW50ZXIgeW91ciBnaXRodWIgcmVwbyBhZGRyZXNzIGluIHRoZSBzcGFjZSBwcm92aWRlZCBiZWxvdy4gSSd2ZSBhZGRlZCBhIGxpdHRsZSBleGFtcGxlIHRvIGpvZyB5b3VyIG1lbW9yeS4NCg0KPkV4YW1wbGU6ICBbTXkgR2l0SHViIExpbmtdKFRoZUdpdEh1YkxpbmsuY29tKQ0KDQoNCj4gRW50ZXIgSGVyZTogDQpbTXkgR2l0aHViIExpbmtdKGh0dHBzOi8vZ2l0aHViLmNvbS9DaGFybGVzLUQtRlBVP3RhYj1yZXBvc2l0b3JpZXMpDQoNCg0KIyBQcm9ibGVtIDINCg0KRm9yIHRoaXMgcHJvYmxlbSwgeW91IGFyZSBhc2tlZCB0byBjcmVhdGUgYSBsaXN0IG9mICoqMyBjb25jZXB0cyoqIHlvdSBoYXZlIGxlYXJuZWQgYWJvdXQgc28gZmFyIHRoaXMgc2VtZXN0ZXIuIEVudGVyIHRoZSBzb2x1dGlvbiBiZWxvdyBpbiB0aGUgc3BhY2UgcHJvdmlkZWQuDQoNCmEuIEluY2x1ZGUgdGhlIG5hbWUgb2YgdGhlIGNvdXJzZSBhcyBhIHN1Yi1oZWFkaW5nICh0aGF0IGlzLCB1c2luZyBgIyNgKQ0KDQoNCmIuIEluY2x1ZGUgdGhlIGNvbmNlcHRzIGFzIGFuICoqdW5vcmRlcmVkIGxpc3QqKiAoVGhpcyBzaG91bGQgbm90IGJlIGRvbmUgaW4gYSBjaHVuayBvZiBjb2RlLCBidXQgc2ltcGx5IGluc2VydGVkIHVzaW5nIG1hcmtkb3duIHN5bnRheCkuIA0KDQoNCmMuIEluY2x1ZGUgYSBsaW5rIHRvIGluZm9ybWF0aW9uIGFib3V0IGF0IGxlYXN0IG9uZSBvZiB0aGUgY29uY2VwdCB5b3UgbGlzdGVkIChmb3IgZXhhbXBsZSBhIGxpbmsgdG8gdGhlIFdpa2lwZWRpYSBwYWdlIGFib3V0IHRoYXQgY29uY2VwdC90b3BpY3MpLg0KDQoNCg0KZC4gSW5jbHVkZSBhbiBhbiBpbWFnZSB0aGF0IHlvdSB0aGluayByZXByZXNlbnRzIGVpdGhlciBvbmUgb2YgdGhlIGNvbmNlcHRzIG9yIGhvdyB5b3UgZmVlbCBhYm91dCBvbmUgb2YgdGhlIGNvbmNlcHRzLiANCg0KKipSZW1lbWJlcjogeW91IGNhbiBhbHNvIHNjYW4gaW4gYW5kIHNhdmUgc29tZXRoaW5nIHlvdSd2ZSBkcmF3biBvciB0YWtlbiBhIHBpY3R1cmUgb2YgeW91cnNlbGYuKioNCg0KPlNvbHV0aW9uIEJlbG93Og0KDQoNCiMgQ29uY2VwdCAxDQojIyBEaXNjcmV0ZSBNYXRoZW1hdGljcw0KSW4gZGlzY3JldGUgbWF0aCBJIGxlYXJuZWQgdGhhdCBmdW5jdGlvbnMgaGF2ZSBhIHVzZSBpbiBqdXN0IGFib3V0IGV2ZXJ5IHR5cGUgb2YgbWF0aCwgbm90IGp1c3QgcHJvZ3JhbW1pbmcuIEZ1bmN0aW9ucyBpbiBkaXNjcmV0ZSByZXF1aXJlIG9ubHkgb25lIG91dHB1dCBwZXIgaW5wdXQsIGFueSBtb3JlIHRoYW4gdGhhdCBpbnZhbGlkYXRlcyB0aGUgZnVuY3Rpb24uIERpc2NyZXRlIGhhcyBoZWxwZWQgbWUgaW1wcm92ZSBteSBsb2dpYyBhbmQgcmVhc29uaW5nLg0KW1dpa2lwZWRpYSBwYWdlIGZvciBtYXRoIGxvZ2ljXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NYXRoZW1hdGljYWxfbG9naWMpDQohW2Z1bmN0aW9uXShaOi9TY2hvb2wvWWVhciAyL1NlbWVzdGVyIDEvRGF0YSBTY2llbmNlL0ludmVyc2VfRnVuY3Rpb24ucG5nKQ0KDQojIENvbmNlcHQgMg0KIyMgU3RhdGlzdGljcw0KSW4gU3RhdGlzdGljcyBJIGxlYXJuZWQgYWJvdXQgcHJvYmFiaWxpdHkgYW5kIGhvdyBpdCByZWxhdGVzIHRvIGV2ZXJ5dGhpbmcuIEkgaGF2ZSBhbHdheXMgYmVlbiBnb29kIGF0IHN0YXRpc3RpY3MgYnV0IHJlaW5mb3JjaW5nIHRoZSBmdW5kYW1lbnRhbHMgaGF2ZSBiZWVuIGZ1biBmb3IgbWUgc28gZmFyLiBNeSBsb3ZlIGZvciBzdGF0aXN0aWNzIGlzIHBhcnRseSB3aHkgSSB3ZW50IGludG8gdGhlIGRhdGEgc2NpZW5jZSBmaWVsZC4NCltXaWtpcGVkaWEgcGFnZSBmb3IgcHJvYmFiaWxpdHldKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1Byb2JhYmlsaXR5KQ0KIVtDb2luIHRvc3NdKFo6L1NjaG9vbC9ZZWFyIDIvU2VtZXN0ZXIgMS9EYXRhIFNjaWVuY2UvNTAweDMwMC1RdWFydGVycy1Ub3AtSW1hZ2UtdjIucG5nKQ0KDQojIENvbmNlcHQgMw0KIyMgQysrDQpJbiBteSBDKysgY2xhc3MsIEkgbW9zdGx5IGp1c3QgcmVpbmZvcmNlZCB3aGF0IEkgbGVhcm5lZCBpbiBteSBDIGNsYXNzIGxhc3QgeWVhci4gT25lIGludGVyZXN0aW5nIGNvbmNlcHQgSSBsZWFybmVkIGhvd2V2ZXIgd2FzIHJlY3Vyc2lvbi4gWW91IGNhbiBjYWxsIGEgZnVuY3Rpb24gd2l0aGluIGEgZnVuY3Rpb24sIGp1c3QgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCBpdHMgbm90IGFuIGluZmluaXRlIGxvb3AgYW5kIHRoZXJlcyBhIGNvbnRyb2wgdmFyaWFibGUgdG8gc3RvcCBpdC4NCltXaWtpcGVkaWEgcGFnZSBmb3IgUmVjdXJzaW9uXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9SZWN1cnNpb25fKGNvbXB1dGVyX3NjaWVuY2UpKQ0KIVtSZWN1cnNpb25dKFo6L1NjaG9vbC9ZZWFyIDIvU2VtZXN0ZXIgMS9EYXRhIFNjaWVuY2UvbWVuZ2VyLWdhZmVlOTA1ZTdfMTkyMC0xNDQweDEwODAud2VicCkNCg0KIyBQcm9ibGVtIDMNCg0KSW4gdGhpcyBwcm9ibGVtIHlvdSB3aWxsIHByYWN0aWNlIHNvbWUgYmFzaWMgUiBvcGVyYXRpb25zLiBJbmNsdWRlIHNvbHV0aW9ucyB0byBlYWNoIGl0ZW1zIGJ5IGluc2VydGluZyBhIG5ldyBSIGNodW5rIG9mIGNvZGUgKG1ha2Ugc3VyZSB5b3UgcnVuIHRoZSBjaHVuayBzbyB0aGF0IHRoZSBvdXRwdXQgaXMgZGlzcGxheWVkKQ0KDQooYSkgQ3JlYXRlIGEgdmFyaWFibGUgY2FsbGVkIGBteV9uYW1lYCB0aGF0IGNvbnRhaW5zIHlvdXIgcHJlZmVycmVkIG5hbWUuDQoNCmBgYHtyfQ0KIyBTb2x1dGlvbiBmb3IgM2E6DQpteV9uYW1lIDwtICJDaGFybGVzIERvd25pbmciDQpgYGANCg0KDQooYikgIENyZWF0ZSBhIHZhcmlhYmxlIGNhbGxlZCBgbmFtZV9sZW5ndGhgIHRoYXQgaG9sZHMgaG93IG1hbnkgbGV0dGVycyBhcmUgaW4gYG15X25hbWVgLiBEbyBub3QganVzdCBzZXQgaG93IG1hbnkgbGV0dGVycyB5b3UgaGF2ZSBpbiB5b3VyIG5hbWUgdG8gdGhpcyB2YXJpYWJsZSwgdXNlIGEgYnVpbHQtaW4gZnVuY3Rpb24uDQoNCmBgYHtyfQ0KIyBTb2x1dGlvbiBmb3IgM2I6DQpuYW1lbGVuZ3RoIDwtIGxlbmd0aChteV9uYW1lKQ0KYGBgDQoNCg0KKGMpIFNob3cgd2hpY2ggdmFsdWUgaXMgYmlnZ2VyOiAkZV5ccGkkIG9yICRccGleZSQuIA0KDQo+IEhpbnQ6IFIgaGFzIHNvbWUgYnVpbHQtaW4gZnVuY3Rpb25zLCBgZXhwKClgIGJlaW5nIG9uZSBvZiB0aGVtLg0KDQpgYGB7cn0NCiMgU29sdXRpb24gZm9yIDNjOg0KZXRvcGkgPC0gZXhwKHBpKQ0KcGl0b2UgPC0gcGleZXhwKDEpDQpiaWcgPC0gKG1heChldG9waSxwaXRvZSkpDQpiaWcNCmBgYA0KDQoNCihkKSBEZWZpbmUgYSAqKmZ1bmN0aW9uKiogY2FsbGVkIGBhZGRfdGhyZWVgIHRoYXQgdGFrZXMgYSBzaW5nbGUgYXJndW1lbnQgYW5kIHJldHVybnMgYSB2YWx1ZSB3aXRoIDMgdW5pdHMgYWRkZWQgdG8gdGhlIG9yaWdpbmFsIGlucHV0Lg0KDQpgYGB7cn0NCiMgU29sdXRpb24gZm9yIDNkOg0KYWRkX3RocmVlIDwtIGZ1bmN0aW9uKHgpIHsNCiAgeSA8LSB4ICsgMw0KICB5DQp9DQpgYGANCg0KDQooZSkgIFVzZSB0aGUgY29sb24gb3BlcmF0b3IgYDpgIHRvIGNyZWF0ZSBhIHZlY3RvciBgdmAgb2YgbnVtYmVycyBmcm9tIDEwIHRvIDQ5LiBGaW5kIHRoZSBsZW5ndGggb2YgdGhpcyB2ZWN0b3IgdXNpbmcgdGhlIGBsZW5ndGgoKWAgZnVuY3Rpb24uDQoNCmBgYHtyfQ0KIyBTb2x1dGlvbiBmb3IgM2U6DQp2ID0gMTA6NDkNCmxlbmd0aCh2KQ0KYGBgDQoNCg0KKGYpIFVzZSB0aGUgYHNlcSgpYCBmdW5jdGlvbiB0byBwcm9kdWNlIGEgcmFuZ2Ugb2YgbnVtYmVyIGZyb20gLTUgdG8gMTAgaW4gMC41IGluY3JlbWVudHMuDQoNCmBgYHtyfQ0KIyBTb2x1dGlvbiBmb3IgM0Y6DQpzZXEoZnJvbSA9IC01LCB0byA9IDEwLCBieSA9IDAuNSkNCmBgYA0KDQoNCiMgUHJvYmxlbSA0DQoNCg0KKGEpICoqRGVmaW5lIGEgZnVuY3Rpb24qKiBgaW1wZXJpYWxfdG9fbWV0cmljYCB0aGF0IHRha2VzIGluICoqdHdvIGFyZ3VtZW50cyoqOiBhIG51bWJlciBvZiBmZWV0IGFuZCBhIG51bWJlciBvZiBpbmNoZXMuIFRoZSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHRoZSBlcXVpdmFsZW50IGxlbmd0aCBpbiBtZXRlcnMNCg0KPiBUbyBjb252ZXJ0IGEgbGVuZ3RoIGBMYCBmcm9tIGZlZXQgKGBmdGApIGFuZCBpbmNoZXMgKGBpbmNoZXNgKSB0byBtZXRlcnMgKGBtYCksIG9uZSBjYW4gdXNlIHRoZSByZWxhdGlvbjogYEwobSkgPSBMKGZ0KSDDlyAwLjMwNDggKyBMKGluY2hlcykgw5cgMC4wMjU0YA0KDQpgYGB7cn0NCg0KaW1wZXJpYWxfdG9fbWV0cmljIDwtIGZ1bmN0aW9uKGZlZXQsaW5jaGVzKXsNCiAgbWV0ZXJzIDwtIChmZWV0ICogMC4zMDQ4ICsgaW5jaGVzICogMC4wMjU0KQ0KICBtZXRlcnMNCn0NCmBgYA0KDQoNCihiKSBDcmVhdGUgYSB2YXJpYWJsZSBgaGVpZ2h0X2luX21ldGVyc2AgYnkgcGFzc2luZyB5b3VyIGhlaWdodCBpbiBpbXBlcmlhbCB0byB0aGUgYGltcGVyaWFsX3RvX21ldHJpY2AgZnVuY3Rpb24uDQoNCmBgYHtyfQ0KaGVpZ2h0X2luX21ldGVycyA8LSBpbXBlcmlhbF90b19tZXRyaWMoNSw2KQ0KYGBgDQoNCg0KIyBQcm9ibGVtIDUNCg0KKGEpIENyZWF0ZSB0aGUgZm9sbG93aW5nIHZlY3RvcnMgaW4gYFJgIChzZWUgdGhlIHBhdHRlcm4gYW5kIHVzZSBhcHByb3ByaWF0ZSBmdW5jdGlvbnMgdG8gY29uc3RydWN0IHRoZXNlIHZlY3RvcnMpOg0KDQokYSA9ICg1LCAxMCwgMTUsIDIwLCAuLi4sIDE2MCkkDQoNCiRiID0gKDg3LCA4NiwgODUsIC4uLiwgNTYpJA0KDQoNCmBgYHtyfQ0KDQphID0gc2VxKGZyb20gPTUsIHRvID0gMTYwLCBieSA9IDUpDQpiID0gc2VxKGZyb20gPSA4NywgdG8gPSA1NiwgYnkgPSAtMSkNCmBgYA0KDQoNCihiKSBNdWx0aXBseSB0aGVzZSB2ZWN0b3JzIGFuZCBjYWxsIHRoZSByZXN1bHQgYGRgIChlbGVtZW50LXdpc2UgbXVsdGlwbGljYXRpb24pLiANCg0KYGBge3J9DQoNCmQgPC0gYSpiDQpgYGANCg0KDQooYykgV2hhdCBhcmUgdGhlIDE5dGgsIDIwdGgsIGFuZCAyMXN0IGVsZW1lbnRzIG9mIGBkYD8NCg0KYGBge3J9DQoNCmRbMTk6MjFdDQpgYGANCg0KDQooZCkgV2hhdCBhcmUgYWxsIG9mIHRoZSBlbGVtZW50cyBvZiBgZGAgd2hpY2ggYXJlIGxlc3MgdGhhbiAyMDAwPw0KDQpgYGB7cn0NCg0KZFtkPDIwMDBdDQpgYGANCg0KDQooZSkgSG93IG1hbnkgZWxlbWVudHMgb2YgYGRgIGFyZSBncmVhdGVyIHRoYW4gNjAwMD8NCg0KDQpgYGB7cn0NCg0KZFtkPjYwMDBdDQpgYGANCg0KDQojIFByb2JsZW0gNiAtIFdvcmQgUHJvYmxlbQ0KDQpBc3N1bWUgdGhhdCB5b3UgaGF2ZSBzZXZlcmFsIGludmVzdG1lbnQgY2hvaWNlcy4gRm9yIGVhY2ggaW52ZXN0bWVudCwgdGhlcmUgYXJlIHR3byBlcXVhbGx5IGxpa2VseSBlbmQtb2YteWVhciBmb3JlY2FzdHM6IHRoZSBvcHRpbWlzdGljIHZhbHVlICh1cF92YWx1ZSksIGFuZCB0aGUgcGVzc2ltaXN0aWMgdmFsdWUgKGRvd25fdmFsdWUpLiBBc3N1bWUgdGhlIGV4cGVjdGVkIHJldHVybiBhbmQgcmlzayBvZiBlYWNoIGludmVzdG1lbnQgaXMgZ2l2ZW4gYnk6DQoNCj4gZXhwZWN0ZWRfZW5kX3ZhbHVlID0gKHVwX3ZhbHVlICsgZG93bl92YWx1ZSkgLyAyIDxicj4NCiAgZXhwZWN0ZWRfcmV0dXJuID0gKGV4cGVjdGVkX2VuZF92YWx1ZSAtIGluaXRpYWxfaW52ZXN0bWVudCkgLyBpbml0aWFsX2ludmVzdG1lbnQgPGJyPg0KICByaXNrID0gKHVwX3ZhbHVlIC0gZG93bl92YWx1ZSkgLyAyIDxicj4NCg0KYSkgV3JpdGUgYSBwcm9ncmFtIHRoYXQgZm9yIG9uZSBpbnZlc3RtZW50IGNob2ljZSwgcHJvbXB0cyBmb3IgdGhyZWUgaW5wdXRzOg0KDQotIGluaXRpYWwgaW52ZXN0bWVudCBhbW91bnQNCi0gb3B0aW1pc3RpYyBlbmQgdmFsdWUgKHVwX3ZhbHVlKQ0KLSBwZXNzaW1pc3RpYyBlbmQgdmFsdWUgKGRvd25fdmFsdWUpDQoNCmFuZCB0aGVuIGNhbGN1bGF0ZXMgdGhlIGludmVzdG1lbnTigJlzIGV4cGVjdGVkIHJldHVybiBhbmQgcmlzay4gWW91IHdpbGwgbmVlZCB0byBlbnRlciB5b3VyIG93biBjaHVua3MgZm9yIHRoaXMgYmVsb3c6DQoNCg0KYGBge3J9DQogIGludmVzdG1lbnRfcHJvIDwtIGZ1bmN0aW9uKEFtb3VudCx1cF92YWx1ZSxkb3duX3ZhbHVlKSB7DQogICAgIyBDYWxjdWxhdGlvbg0KZXhwZWN0ZWRfZW5kX3ZhbHVlIDwtICh1cF92YWx1ZSArIGRvd25fdmFsdWUpIC8gMg0KZXhwZWN0ZWRfcmV0dXJuIDwtIChleHBlY3RlZF9lbmRfdmFsdWUgLSBBbW91bnQpIC8gQW1vdW50DQpyaXNrID0gKHVwX3ZhbHVlIC0gZG93bl92YWx1ZSkgLyAyDQogICAgI1ByaW50aW5nDQpjYXQoIlJlc3VsdHM6XG4iLCAiRXhwZWN0ZWQgRW5kIFZhbHVlOiAiLGV4cGVjdGVkX2VuZF92YWx1ZSwgIlxuIiwiRXhwZWN0ZWQgUmV0dXJuOiAiLGV4cGVjdGVkX3JldHVybiwgIlxuIiwiUmlzazogIixyaXNrKQ0KICB9DQoNCmBgYA0KDQpgYGB7cn0NCiAgICAjUHJvbXB0cyB0aGUgdXNlciBmb3IgaW5wdXQNCkFtb3VudCA8LSBhcy5udW1lcmljKHJlYWRsaW5lKHByb21wdCA9ICJFbnRlciBpbml0aWFsIGludmVzdG1lbnQ6ICIpKQ0KdXBfdmFsdWUgPC0gYXMubnVtZXJpYyhyZWFkbGluZShwcm9tcHQgPSAiRW50ZXIgdGhlIG9wdGltaXN0aWMgdmFsdWU6ICIpKQ0KZG93bl92YWx1ZSA8LSBhcy5udW1lcmljKHJlYWRsaW5lKHByb21wdCA9ICJFbnRlciB0aGUgcGVzc2ltaXN0aWMgdmFsdWU6ICIpKQ0KaW52ZXN0bWVudF9wcm8oQW1vdW50LHVwX3ZhbHVlLGRvd25fdmFsdWUpDQojRm9yIHRoZSByZXN1bHQgYmVsb3cgSSB1c2VkOiAxMDAsMjAwLDE1MA0KDQpgYGA=