Question2. The Public Service Answering Point (PSAP) in San Francisco employs \(19\) operators in \(8\)-hour shifts to process \(911\) calls. There are at least \(5\) operators always answering calls. The number of calls processed per operator can be modeled with a Poisson random variable with rate \(\lambda_0 =20\) calls per hour.

Quesion 2 (a) What is the probability an operator can process 20 calls in an hour? Repeat for 30 calls in an hour?

#Answer 2a
# Define the parameters
lambda_0 <- 20


p20calls <- dpois(20, lambda=lambda_0)


p30calls <- dpois(30, lambda=lambda_0)


cat("20calls:",p20calls)
20calls: 0.08883532
cat("30calls:",p30calls)
30calls: 0.008343536

Quesion 2 (b) Given that 240 calls occurred in an hour, what is the probability that the ten operators can process them all assuming they are split equally among the operators?

#Answer 2b
lambda_0 <- 20
prob_one_operator <- dpois(24, lambda_0)
prob_ten_operators <- prob_one_operator

cat("probability that the ten operators can process them all",prob_ten_operators)
probability that the ten operators can process them all 0.05573456

Quesion 2 (c) Now, If the aggregate call rate per hour \(\lambda_c\) , is measured by \(\lambda_c = 85\) calls per hour, what is the probability of more than \(100\) calls in an hour

#Answer 
lambda_c <- 85
lessthan <- ppois(100, lambda=lambda_c)
morethan <- 1 - lessthan
morethan
[1] 0.04934533

Question 3. For the two random number generator below A and B(don’t forget to add your R code)

- [A] \(Z_i = (9Z_{i-1} + 1) \mod 16\) with \(Z_0 = 5\).

- [B] \(Z_i = (7Z_{i-1} + 3) \mod 32\) with \(Z_0 = 10\),

Quesion 3 (a) Compute \(Z_i\) and \(U_i\) for values of \(i\) until a number is repeated, what is the period of both the generator? Provide your comments about the period of both RGN

#Answer 3a
# Generator A
Z_0_A <- 5
Z_values_A <- c(Z_0_A)
U_values_A <- c(Z_0_A / 16)

while(TRUE) {
  Z_next_A <- (9 * Z_values_A[length(Z_values_A)] + 1) %% 16
  if(Z_next_A %in% Z_values_A) break
  Z_values_A <- append(Z_values_A, Z_next_A)
  U_values_A <- append(U_values_A, Z_next_A / 16)
}


cat("Period of A ",period_A)
Period of A  16
# Generator B
Z_0_B <- 10
Z_values_B <- c(Z_0_B)
U_values_B <- c(Z_0_B / 32)

while(TRUE) {
  Z_next_B <- (7 * Z_values_B[length(Z_values_B)] + 3) %% 32
  if(Z_next_B %in% Z_values_B) break
  Z_values_B <- append(Z_values_B, Z_next_B)
  U_values_B <- append(U_values_B, Z_next_B / 32)
}


cat(" ,Period of B ",period_B)
 ,Period of B  8

Quesion 3 (b) Which of these parameters effect the period of LCG – \(a\), \(b\), \(Z_0\)

#Answer 
cat("Answer a,b and Z", "")
Answer a,b and Z 

Quesion 3 (c) For both generators plot a scatter diagram of the Zi values 1 apart. What are your observations from these plots? What do you think about the property of randomness of these generators?

#Answer
# Scatter diagram for Generator A
plot(Z_values_A[-length(Z_values_A)], Z_values_A[-1], main="Scatter Diagram for Generator A", xlab="Zi", ylab="Zi+1", pch=19, col="blue")


# Scatter diagram for Generator B
plot(Z_values_B[-length(Z_values_B)], Z_values_B[-1], main="Scatter Diagram for Generator B", xlab="Zi", ylab="Zi+1", pch=19, col="red")


cat("If the scatter diagram forms a distinct pattern (like lines or grids), then the generator might not be producing very random numbers. A more random scattering, where there doesn't seem to be a recognizable pattern, indicates a better level of randomness from the generator.
The quality of randomness is judged based on how unpredictable the sequences are. The more dispersed and pattern-less the scatter diagram, the better the randomness. If there's a discernible pattern in the scatter plot, then the sequences from that generator are more predictable, reducing its quality as a random number generator.")
If the scatter diagram forms a distinct pattern (like lines or grids), then the generator might not be producing very random numbers. A more random scattering, where there doesn't seem to be a recognizable pattern, indicates a better level of randomness from the generator.
The quality of randomness is judged based on how unpredictable the sequences are. The more dispersed and pattern-less the scatter diagram, the better the randomness. If there's a discernible pattern in the scatter plot, then the sequences from that generator are more predictable, reducing its quality as a random number generator.

Quesion 3 (d) Randomness of default random generator of R – Run runif command to generate 100 random numbers and plot the scatter diagram of these numbers ( values 1 apart) and discuss your observations about randomness of this random generator.

#Answer

random_numbers <- runif(100)


plot(random_numbers[-100], random_numbers[-1],col="yellow", xlab="Value at i", ylab="Value at i+1", main="Scatter Diagram of Random Numbers (1 Apart)")

NA
NA
NA

Quesion 3 (e) Compute the mean value of \(U_i\) across the period

#Answer
Z <- 5  # Starting value
Z_values_A <- c(Z)
m_A <- 16  # Modulus

# Generate sequence until a repetition is found
while (TRUE) {
  Z <- (9 * Z + 1) %% m_A
  if (Z %in% Z_values_A) {
    break
  }
  Z_values_A <- c(Z_values_A, Z)
}

# Computing U_i values and mean for Generator A
U_values_A <- Z_values_A / m_A
mean_U_A <- mean(U_values_A)


cat("Mean A",mean_U_A)
Mean A 0.46875
Z <- 10  # Starting value
Z_values_B <- c(Z)
m_B <- 32  # Modulus

# Generate sequence until a repetition is found
while (TRUE) {
  Z <- (7 * Z + 3) %% m_B
  if (Z %in% Z_values_B) {
    break
  }
  Z_values_B <- c(Z_values_B, Z)
}

# Computing U_i values and mean for Generator B
U_values_B <- Z_values_B / m_B
mean_U_B <- mean(U_values_B)


cat("Mean B",mean_U_B)
Mean B 0.421875

Quesion 3 (f) By providing a plot of density (histogram) discuss the uniformity of both of the generators

#Answer
# Plot histogram for U_values_A
hist(U_values_A, breaks=20, main="Histogram of U_i Values for Generator A", xlab="U_i", col="lightblue", probability=TRUE, border="black")

# Adding a density line
lines(density(U_values_A), col="blue", lwd=2)


# Plot histogram for U_values_B
hist(U_values_B, breaks=20, main="Histogram of U_i Values for Generator B", xlab="U_i", col="lightgreen", probability=TRUE, border="black")

# Adding a density line
lines(density(U_values_B), col="green", lwd=2)

NA
NA

Question 4. Using the inverse transform method

Question 4.(a) Develop an algorithm for the random variable with cumulative distribution function F(x) below.

\[ F(x) = 1 - e^{-(x/\lambda)^k} \]

where \(x \geq 0\), \(\lambda \geq 0\), and \(k \geq 0\).

# Answer 4a
# This might be hard to print using R - you can write the step in your notebook and then include image here / or you can include as seperate file when upload

# Check if the IRdisplay package is already installed
if (!require(IRdisplay, quietly = TRUE)) {
  # If not installed, install it
  install.packages("IRdisplay")
  
  # Load the IRdisplay library
  library(IRdisplay)
} else {
  # If already installed, just load the library
  library(IRdisplay)
}

inverse_transform_method <- function(lambda, k, n) {
  # n is the number of random numbers you want to generate
  
  # Generate n uniformly distributed random numbers
  U <- runif(n)
  
  # Apply the inverse transform
  x <- lambda * (-log(1 - U))^(1/k)
  
  return(x)
}

# To generate, say, 1000 random numbers with lambda = 1 and k = 2:
random_numbers <- inverse_transform_method(lambda = 1, k = 2, n = 1000)
hist(random_numbers, main="Histogram of Generated Random Numbers", xlab="x", breaks=50, col="lightblue", border="black")



# Embed an image
#display_png(file = "example.png")

Quesion 4 (b) Use the first three Ui values from part (a) and generator [A] of previous problem to create 3 values from the random variable when, \(\lambda = 1\), \(𝑘 = 5\)

#Answer
# Generate the first three Zi values using generator [A]
Z <- 5  # Initial value for Z_0
Z_values_A <- c(Z)
m_A <- 16  # Modulus for generator [A]

for(i in 1:2) {
  Z <- (9 * Z + 1) %% m_A
  Z_values_A <- c(Z_values_A, Z)
}

# Convert Zi values to Ui values
U_values_A <- Z_values_A / m_A

# Use the Ui values with the inverse transform
lambda <- 1
k <- 5
x_values <- lambda * (-log(1 - U_values_A[1:3]))^(1/k)

print(x_values)
[1] 0.8217415 1.1576822 1.2262446

Quesion 4 (c) sing R generate 10,000 values from your algorithm when = 1 , 𝑘 = 5 and plot a histogram of the density. Discuss what insights you obtain when you look at the plot generated here vs the plot you generated in question 3 (e)

#Answer
# Algorithm using the inverse transform method
generate_values <- function(lambda, k, n) {
  U <- runif(n)  # Generate n uniformly distributed random numbers
  
  # Apply the inverse transform
  x <- lambda * (-log(1 - U))^(1/k)
  return(x)
}

# Generate 10,000 values using the given parameters
lambda <- 1
k <- 5
n <- 10000
generated_values <- generate_values(lambda, k, n)

# Plot the histogram
hist(generated_values, main="Histogram for Inverse Transform Generated Values", xlab="x", breaks=50, probability=TRUE, col="lightblue", border="black", ylim=c(0, 0.6))

# Adding a density line
lines(density(generated_values), col="blue", lwd=2)

cat("The histogram from 4c, shaped by the exponential-like distribution
F(x), likely shows a pronounced skew towards lower values, diverging from the more evenly spread values of the generator in 3(e), which aimed for uniformity.If the histogram from 3(e) had relatively consistent bar heights, it'd indicate the LCG's success at approximating a uniform distribution; in contrast, varying bar heights in 4c's histogram are expected given its non-uniform target distribution.")
The histogram from 4c, shaped by the exponential-like distribution
F(x), likely shows a pronounced skew towards lower values, diverging from the more evenly spread values of the generator in 3(e), which aimed for uniformity.If the histogram from 3(e) had relatively consistent bar heights, it'd indicate the LCG's success at approximating a uniform distribution; in contrast, varying bar heights in 4c's histogram are expected given its non-uniform target distribution.

Question 5. Develop a Monte Carlo simulation in R that counts the number of uniform [0,1] random numbers that must be summed to get a sum greater than 1. Run a single simulation with n = 10,000 times and find the mean of the number of counts. Do you think this number looks somewhat familiar. Every student might get slightly different value any ideas why?

#Answer
monte_carlo_simulation <- function() {
  sum <- 0
  count <- 0
  while(sum <= 1) {
    sum <- sum + runif(1) # Generate a random number between 0 and 1
    count <- count + 1
  }
  return(count)
}

# Running the simulation 10,000 times
n <- 10000
results <- replicate(n, monte_carlo_simulation())

# Finding the mean count
mean_count <- mean(results)
print(mean_count)
[1] 2.703

Question 6. For our specific random variable, we know that its PDF is defined by the function \(f(x) = 10x(1-x)\). Utilize the accept-reject algorithm to draw samples from this distribution. Take a look at Lecture 10 slide 8 and 9

#Answer
f <- function(x) {
  return(10*x*(1-x))
}

# Using uniform distribution as proposal distribution
g <- function(x) {
  return(1)
}

# Finding c
x_values <- seq(0, 1, 0.01)
c <- max(f(x_values))

accept_reject_sampling <- function(n) {
  samples <- numeric(n)
  count <- 0
  while(count < n) {
    X <- runif(1)
    U <- runif(1)
    if(U <= f(X) / (c * g(X))) {
      count <- count + 1
      samples[count] <- X
    }
  }
  return(samples)
}

# Drawing samples
samples <- accept_reject_sampling(10000)
hist(samples, main="Histogram of Samples", xlab="x", breaks=10, col="lightblue", border="black")

Quesion 1 (b)

#Answer
LS0tCnRpdGxlOiAiIDxjZW50ZXI+PHNwYW4gc3R5bGU9J2NvbG9yOiBibHVlOyc+IEhvbWV3b3JrIDMgPC9zcGFuPjwvY2VudGVyPiIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKCiMgUXVlc3Rpb24gMS4gIENvbnNpZGVyIHRoZSBCaW5vbWlhbCBkaXN0cmlidXRpb24gd2l0aCAkbiA9IDI0JCBhbmQgJHAgPSAuOSQgdGhhdCBpcyB1c2VkIHRvIG1vZGVsIHRoZSBudW1iZXIgb2YgY29ycmVjdGx5IHJlY2VpdmVkIGJpdHMgb24gYSBzYXRlbGxpdGUgbGluayB0aGF0IHRyYW5zbWl0cyBkYXRhIGluICQyNCQtYml0IGJsb2Nrcy4KCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDEgKGEpIFBsb3QgdGhlIHByb2JhYmlsaXR5IGRlbnNpdHkgZnVuY3Rpb24gYW5kIGN1bXVsYXRpdmUgZGlzdHJpYnV0aW9uIGZ1bmN0aW9uIGZvciB0aGUgbnVtYmVyIG9mIGNvcnJlY3RseSByZWNlaXZlZCBiaXRzPC9zcGFuPgoKYGBge3J9CiNBbnN3ZXIgMWEKCmluc3RhbGwucGFja2FnZXMoImdncGxvdDIiKQpsaWJyYXJ5KGdncGxvdDIpCgojIERlZmluZSBwYXJhbWV0ZXJzCm4gPC0gMjQKcCA8LSAwLjkKeCA8LSAwOm4KCiMgQ2FsY3VsYXRlIFBERiBhbmQgQ0RGCnBkZiA8LSBkYmlub20oeCwgbiwgcCkKY2RmIDwtIHBiaW5vbSh4LCBuLCBwKQoKIyBQbG90IFBERgpnZ3Bsb3QoZGF0YS5mcmFtZSh4PXgsIHk9cGRmKSwgYWVzKHg9eCwgeT15KSkgKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikgKwogIGxhYnModGl0bGU9IlByb2JhYmlsaXR5IERlbnNpdHkgRnVuY3Rpb24iLCB4PSJOdW1iZXIgb2YgY29ycmVjdGx5IHJlY2VpdmVkIGJpdHMiLCB5PSJQcm9iYWJpbGl0eSIpICsKICB0aGVtZV9taW5pbWFsKCkKCiMgUGxvdCBDREYKZ2dwbG90KGRhdGEuZnJhbWUoeD14LCB5PWNkZiksIGFlcyh4PXgsIHk9eSkpICsKICBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZT0iQ3VtdWxhdGl2ZSBEaXN0cmlidXRpb24gRnVuY3Rpb24iLCB4PSJOdW1iZXIgb2YgY29ycmVjdGx5IHJlY2VpdmVkIGJpdHMiLCB5PSJDdW11bGF0aXZlIFByb2JhYmlsaXR5IikgKwogIHRoZW1lX21pbmltYWwoKQoKYGBgCgojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc2lvbiAxIChiKSBXaGF0IGlzIHRoZSBtZWFuIG51bWJlciBvZiBjb3JyZWN0bHkgcmVjZWl2ZWQgYml0cz8gV2hhdCBpcyB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uPzwvc3Bhbj4KYGBge3J9CiNBbnN3ZXIgMWIKIyhtYWtlIHN1cmUgdGhhdCB3aGF0IHlvdSBwcmludCBtYWtlIHNlbnNlIHRvIG1lKSAtIGZvciBleGFtcGxlIHRvIHByaW50IG1lYW4geW91IGNhbiB1c2UgY2F0IGNvbW1hbmQgb25jZSB5b3UgZG9uZSB3aXRoIHRoZSBjYWxjdWxhdGlvbiBhbmQgaGF2ZSB2YWx1ZSBpbiB0aGUgdmFyaWFibGUKI3ZhcmlhYmxlX25hbWU9MTAgCiNjYXQoIk1lYW4gbnVtYmVyIG9mIGNvcnJlY3RseSByZWNlaXZlZCBiaXRzICIsICB2YXJpYWJsZV9uYW1lKQoKbiA8LSAyNApwIDwtIDAuOQoKCm1lYW5fdmFsIDwtIG4gKiBwCnN0ZF9kZXYgPC0gc3FydChuICogcCAqICgxIC0gcCkpCgoKY2F0KCJNZWFuIG51bWJlciBvZiBjb3JyZWN0bHkgcmVjZWl2ZWQgYml0czoiLCBtZWFuX3ZhbCwgIlxuIikKY2F0KCJTdGFuZGFyZCBkZXZpYXRpb24gb2YgY29ycmVjdGx5IHJlY2VpdmVkIGJpdHM6Iiwgc3RkX2RldiwgIlxuIikKCgpgYGAKCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDEgKGMpIFdoYXQgaXMgdGhlIHByb2JhYmlsaXR5IG9mIG1vcmUgdGhhbiAkMyQtYml0IGVycm9ycyBpbiB0aGUgYmxvY2sgb2YgJDI0JD88L3NwYW4+CmBgYHtyfQojQW5zd2VyIDFjCm4gPC0gMjQgIAprIDwtIDMgICAKcCA8LSAuMSAgCgpwcm9iIDwtIDEgLSBwYmlub20oaywgbiwgcCkKCnByaW50KHByb2IpCgoKYGBgCgoKIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gMSAoZCkgV2hhdCBpcyB0aGUgbWVkaWFuIG9mIHRoaXMgZGlzdHJpYnV0aW9uPyBXaGF0IGNhbiB5b3UgaW50ZXJwcmV0IGZyb20gdGhlIG1lZGlhbiB2YWx1ZT8gPC9zcGFuPgpgYGB7cn0KI0Fuc3dlciAxZAoKbiA8LSAyNApwIDwtIDAuOQoKCm1lZGlhbl92YWwgPC0gcWJpbm9tKDAuNSwgbiwgcCkKCgpjYXQoIk1lZGlhbiBudW1iZXIgb2YgY29ycmVjdGx5IHJlY2VpdmVkIGJpdHM6IiwgbWVkaWFuX3ZhbCwgIlxuIikKCmNhdCgiSXQgaXMgdGhlIG1pZGRsZSB2YWx1ZSBvZiBCaXRzIHJlY2lldmVkIikKCmBgYAoKCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDEgKGUpICBXaGF0IGlzIHRoZSA2MHRoIHF1YW50aWxlIG9mIHRoaXMgZGlzdHJpYnV0aW9uPyBXaGF0IGNhbiB5b3UgaW50ZXJwcmV0IGZyb20gdGhpcyB2YWx1ZT88L3NwYW4+CmBgYHtyfQojQW5zd2VyIDFlCgpuIDwtIDI0CnAgPC0gMC45CgoKcXVhbnRpbGVfNjAgPC0gcWJpbm9tKDAuNiwgbiwgcCkKCgpjYXQoIjYwdGggcXVhbnRpbGUgb2YgY29ycmVjdGx5IHJlY2VpdmVkIGJpdHM6IiwgcXVhbnRpbGVfNjAsICJcbiIpCgoKY2F0KCJJdCBtZWFucyB0aGF0IDYwJSBvZiB0aGUgZGF0YSBpcyBiZWxvdyB0aGlzIHBvaW50IikKYGBgCgojIFF1ZXN0aW9uMi4gVGhlIFB1YmxpYyBTZXJ2aWNlIEFuc3dlcmluZyBQb2ludCAoUFNBUCkgaW4gU2FuIEZyYW5jaXNjbyBlbXBsb3lzICQxOSQgb3BlcmF0b3JzIGluICQ4JC1ob3VyIHNoaWZ0cyB0byBwcm9jZXNzICQ5MTEkIGNhbGxzLiBUaGVyZSBhcmUgYXQgbGVhc3QgJDUkIG9wZXJhdG9ycyBhbHdheXMgYW5zd2VyaW5nIGNhbGxzLiBUaGUgbnVtYmVyIG9mIGNhbGxzIHByb2Nlc3NlZCBwZXIgb3BlcmF0b3IgY2FuIGJlIG1vZGVsZWQgd2l0aCBhIFBvaXNzb24gcmFuZG9tIHZhcmlhYmxlIHdpdGggcmF0ZSAkXGxhbWJkYV8wID0yMCQgY2FsbHMgcGVyIGhvdXIuCgojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc2lvbiAyIChhKSBXaGF0IGlzIHRoZSBwcm9iYWJpbGl0eSBhbiBvcGVyYXRvciBjYW4gcHJvY2VzcyAyMCBjYWxscyBpbiBhbiBob3VyPyBSZXBlYXQgZm9yIDMwIGNhbGxzIGluIGFuIGhvdXI/IDwvc3Bhbj4KYGBge3J9CiNBbnN3ZXIgMmEKCmxhbWJkYV8wIDwtIDIwCgoKcDIwY2FsbHMgPC0gZHBvaXMoMjAsIGxhbWJkYT1sYW1iZGFfMCkKCgpwMzBjYWxscyA8LSBkcG9pcygzMCwgbGFtYmRhPWxhbWJkYV8wKQoKCmNhdCgiMjBjYWxsczoiLHAyMGNhbGxzKQpjYXQoIjMwY2FsbHM6IixwMzBjYWxscykKCgpgYGAKCgojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc2lvbiAyIChiKSBHaXZlbiB0aGF0IDI0MCBjYWxscyBvY2N1cnJlZCBpbiBhbiBob3VyLCB3aGF0IGlzIHRoZSBwcm9iYWJpbGl0eSB0aGF0IHRoZSB0ZW4gb3BlcmF0b3JzIGNhbiBwcm9jZXNzIHRoZW0gYWxsIGFzc3VtaW5nIHRoZXkgYXJlIHNwbGl0IGVxdWFsbHkgYW1vbmcgdGhlIG9wZXJhdG9ycz88L3NwYW4+CmBgYHtyfQojQW5zd2VyIDJiCmxhbWJkYV8wIDwtIDIwCnByb2Jfb25lX29wZXJhdG9yIDwtIGRwb2lzKDI0LCBsYW1iZGFfMCkKcHJvYl90ZW5fb3BlcmF0b3JzIDwtIHByb2Jfb25lX29wZXJhdG9yCgpjYXQoInByb2JhYmlsaXR5IHRoYXQgdGhlIHRlbiBvcGVyYXRvcnMgY2FuIHByb2Nlc3MgdGhlbSBhbGwiLHByb2JfdGVuX29wZXJhdG9ycykKCgpgYGAKCgojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc2lvbiAyIChjKSBOb3csIElmIHRoZSBhZ2dyZWdhdGUgY2FsbCByYXRlIHBlciBob3VyICRcbGFtYmRhX2MkICwgaXMgbWVhc3VyZWQgYnkgJFxsYW1iZGFfYyA9IDg1JCBjYWxscyBwZXIgaG91ciwgd2hhdCBpcyB0aGUgcHJvYmFiaWxpdHkgb2YgbW9yZSB0aGFuICQxMDAkIGNhbGxzIGluIGFuIGhvdXI8L3NwYW4+CmBgYHtyfQojQW5zd2VyIApsYW1iZGFfYyA8LSA4NQpsZXNzdGhhbiA8LSBwcG9pcygxMDAsIGxhbWJkYT1sYW1iZGFfYykKbW9yZXRoYW4gPC0gMSAtIGxlc3N0aGFuCm1vcmV0aGFuCgoKYGBgCgojIFF1ZXN0aW9uIDMuIEZvciB0aGUgdHdvIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGJlbG93IEEgYW5kIEIoZG9u4oCZdCBmb3JnZXQgdG8gYWRkIHlvdXIgUiBjb2RlKQojIyMgLSBbQV0gXChaX2kgPSAoOVpfe2ktMX0gKyAxKSBcbW9kIDE2XCkgd2l0aCBcKFpfMCA9IDVcKS4KIyMjIC0gW0JdIFwoWl9pID0gKDdaX3tpLTF9ICsgMykgXG1vZCAzMlwpIHdpdGggXChaXzAgPSAxMFwpLAoKCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDMgKGEpIENvbXB1dGUgJFpfaSQgYW5kICRVX2kkIGZvciB2YWx1ZXMgb2YgJGkkIHVudGlsIGEgbnVtYmVyIGlzIHJlcGVhdGVkLCB3aGF0IGlzIHRoZSBwZXJpb2Qgb2YgYm90aCB0aGUgZ2VuZXJhdG9yPyBQcm92aWRlIHlvdXIgY29tbWVudHMgYWJvdXQgdGhlIHBlcmlvZCBvZiBib3RoIFJHTiA8L3NwYW4+CgpgYGB7cn0KI0Fuc3dlciAzYQojIEdlbmVyYXRvciBBClpfMF9BIDwtIDUKWl92YWx1ZXNfQSA8LSBjKFpfMF9BKQpVX3ZhbHVlc19BIDwtIGMoWl8wX0EgLyAxNikKCndoaWxlKFRSVUUpIHsKICBaX25leHRfQSA8LSAoOSAqIFpfdmFsdWVzX0FbbGVuZ3RoKFpfdmFsdWVzX0EpXSArIDEpICUlIDE2CiAgaWYoWl9uZXh0X0EgJWluJSBaX3ZhbHVlc19BKSBicmVhawogIFpfdmFsdWVzX0EgPC0gYXBwZW5kKFpfdmFsdWVzX0EsIFpfbmV4dF9BKQogIFVfdmFsdWVzX0EgPC0gYXBwZW5kKFVfdmFsdWVzX0EsIFpfbmV4dF9BIC8gMTYpCn0KCgpjYXQoIlBlcmlvZCBvZiBBICIscGVyaW9kX0EpCgojIEdlbmVyYXRvciBCClpfMF9CIDwtIDEwClpfdmFsdWVzX0IgPC0gYyhaXzBfQikKVV92YWx1ZXNfQiA8LSBjKFpfMF9CIC8gMzIpCgp3aGlsZShUUlVFKSB7CiAgWl9uZXh0X0IgPC0gKDcgKiBaX3ZhbHVlc19CW2xlbmd0aChaX3ZhbHVlc19CKV0gKyAzKSAlJSAzMgogIGlmKFpfbmV4dF9CICVpbiUgWl92YWx1ZXNfQikgYnJlYWsKICBaX3ZhbHVlc19CIDwtIGFwcGVuZChaX3ZhbHVlc19CLCBaX25leHRfQikKICBVX3ZhbHVlc19CIDwtIGFwcGVuZChVX3ZhbHVlc19CLCBaX25leHRfQiAvIDMyKQp9CgoKY2F0KCIgLFBlcmlvZCBvZiBCICIscGVyaW9kX0IpCgoKYGBgCgoKIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gMyAoYikgV2hpY2ggb2YgdGhlc2UgcGFyYW1ldGVycyBlZmZlY3QgdGhlIHBlcmlvZCBvZiBMQ0cg4oCTICRhJCwgJGIkLCAkWl8wJCA8L3NwYW4+CmBgYHtyfQojQW5zd2VyIApjYXQoIkFuc3dlciBhLGIgYW5kIFoiLCAiIikKYGBgCgoKIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gMyAoYykgRm9yIGJvdGggZ2VuZXJhdG9ycyBwbG90IGEgc2NhdHRlciBkaWFncmFtIG9mIHRoZSBaaSB2YWx1ZXMgMSBhcGFydC4gV2hhdCBhcmUgeW91ciBvYnNlcnZhdGlvbnMgZnJvbSB0aGVzZSBwbG90cz8gV2hhdCBkbyB5b3UgdGhpbmsgYWJvdXQgdGhlIHByb3BlcnR5IG9mIHJhbmRvbW5lc3Mgb2YgdGhlc2UgZ2VuZXJhdG9ycz8gPC9zcGFuPgpgYGB7cn0KI0Fuc3dlcgojIFNjYXR0ZXIgZGlhZ3JhbSBmb3IgR2VuZXJhdG9yIEEKcGxvdChaX3ZhbHVlc19BWy1sZW5ndGgoWl92YWx1ZXNfQSldLCBaX3ZhbHVlc19BWy0xXSwgbWFpbj0iU2NhdHRlciBEaWFncmFtIGZvciBHZW5lcmF0b3IgQSIsIHhsYWI9IlppIiwgeWxhYj0iWmkrMSIsIHBjaD0xOSwgY29sPSJibHVlIikKCiMgU2NhdHRlciBkaWFncmFtIGZvciBHZW5lcmF0b3IgQgpwbG90KFpfdmFsdWVzX0JbLWxlbmd0aChaX3ZhbHVlc19CKV0sIFpfdmFsdWVzX0JbLTFdLCBtYWluPSJTY2F0dGVyIERpYWdyYW0gZm9yIEdlbmVyYXRvciBCIiwgeGxhYj0iWmkiLCB5bGFiPSJaaSsxIiwgcGNoPTE5LCBjb2w9InJlZCIpCgpjYXQoIklmIHRoZSBzY2F0dGVyIGRpYWdyYW0gZm9ybXMgYSBkaXN0aW5jdCBwYXR0ZXJuIChsaWtlIGxpbmVzIG9yIGdyaWRzKSwgdGhlbiB0aGUgZ2VuZXJhdG9yIG1pZ2h0IG5vdCBiZSBwcm9kdWNpbmcgdmVyeSByYW5kb20gbnVtYmVycy4gQSBtb3JlIHJhbmRvbSBzY2F0dGVyaW5nLCB3aGVyZSB0aGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYSByZWNvZ25pemFibGUgcGF0dGVybiwgaW5kaWNhdGVzIGEgYmV0dGVyIGxldmVsIG9mIHJhbmRvbW5lc3MgZnJvbSB0aGUgZ2VuZXJhdG9yLgpUaGUgcXVhbGl0eSBvZiByYW5kb21uZXNzIGlzIGp1ZGdlZCBiYXNlZCBvbiBob3cgdW5wcmVkaWN0YWJsZSB0aGUgc2VxdWVuY2VzIGFyZS4gVGhlIG1vcmUgZGlzcGVyc2VkIGFuZCBwYXR0ZXJuLWxlc3MgdGhlIHNjYXR0ZXIgZGlhZ3JhbSwgdGhlIGJldHRlciB0aGUgcmFuZG9tbmVzcy4gSWYgdGhlcmUncyBhIGRpc2Nlcm5pYmxlIHBhdHRlcm4gaW4gdGhlIHNjYXR0ZXIgcGxvdCwgdGhlbiB0aGUgc2VxdWVuY2VzIGZyb20gdGhhdCBnZW5lcmF0b3IgYXJlIG1vcmUgcHJlZGljdGFibGUsIHJlZHVjaW5nIGl0cyBxdWFsaXR5IGFzIGEgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuIikKCmBgYAoKCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDMgKGQpIFJhbmRvbW5lc3Mgb2YgZGVmYXVsdCByYW5kb20gZ2VuZXJhdG9yIG9mIFIg4oCTIFJ1biBydW5pZiBjb21tYW5kIHRvIGdlbmVyYXRlIDEwMCByYW5kb20gbnVtYmVycyBhbmQgcGxvdCB0aGUgc2NhdHRlciBkaWFncmFtIG9mIHRoZXNlIG51bWJlcnMgKCB2YWx1ZXMgMSBhcGFydCkgYW5kIGRpc2N1c3MgeW91ciBvYnNlcnZhdGlvbnMgYWJvdXQgcmFuZG9tbmVzcyBvZiB0aGlzIHJhbmRvbSBnZW5lcmF0b3IuIDwvc3Bhbj4KYGBge3J9CiNBbnN3ZXIKCnJhbmRvbV9udW1iZXJzIDwtIHJ1bmlmKDEwMCkKCgpwbG90KHJhbmRvbV9udW1iZXJzWy0xMDBdLCByYW5kb21fbnVtYmVyc1stMV0sY29sPSJ5ZWxsb3ciLCB4bGFiPSJWYWx1ZSBhdCBpIiwgeWxhYj0iVmFsdWUgYXQgaSsxIiwgbWFpbj0iU2NhdHRlciBEaWFncmFtIG9mIFJhbmRvbSBOdW1iZXJzICgxIEFwYXJ0KSIpCgoKCmBgYAoKCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDMgKGUpIENvbXB1dGUgdGhlIG1lYW4gdmFsdWUgb2YgJFVfaSQgYWNyb3NzIHRoZSBwZXJpb2Q8L3NwYW4+CmBgYHtyfQojQW5zd2VyClogPC0gNSAgClpfdmFsdWVzX0EgPC0gYyhaKQptX0EgPC0gMTYgIAoKCndoaWxlIChUUlVFKSB7CiAgWiA8LSAoOSAqIFogKyAxKSAlJSBtX0EKICBpZiAoWiAlaW4lIFpfdmFsdWVzX0EpIHsKICAgIGJyZWFrCiAgfQogIFpfdmFsdWVzX0EgPC0gYyhaX3ZhbHVlc19BLCBaKQp9CgoKVV92YWx1ZXNfQSA8LSBaX3ZhbHVlc19BIC8gbV9BCm1lYW5fVV9BIDwtIG1lYW4oVV92YWx1ZXNfQSkKCgpjYXQoIk1lYW4gQSIsbWVhbl9VX0EpCgpaIDwtIDEwICAjIFN0YXJ0aW5nIHZhbHVlClpfdmFsdWVzX0IgPC0gYyhaKQptX0IgPC0gMzIgICMgTW9kdWx1cwoKCndoaWxlIChUUlVFKSB7CiAgWiA8LSAoNyAqIFogKyAzKSAlJSBtX0IKICBpZiAoWiAlaW4lIFpfdmFsdWVzX0IpIHsKICAgIGJyZWFrCiAgfQogIFpfdmFsdWVzX0IgPC0gYyhaX3ZhbHVlc19CLCBaKQp9CgojIENvbXB1dGluZyBVX2kgdmFsdWVzIGFuZCBtZWFuIGZvciBHZW5lcmF0b3IgQgpVX3ZhbHVlc19CIDwtIFpfdmFsdWVzX0IgLyBtX0IKbWVhbl9VX0IgPC0gbWVhbihVX3ZhbHVlc19CKQoKCmNhdCgiTWVhbiBCIixtZWFuX1VfQikKCgpgYGAKCgojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc2lvbiAzIChmKSBCeSBwcm92aWRpbmcgYSBwbG90IG9mIGRlbnNpdHkgKGhpc3RvZ3JhbSkgZGlzY3VzcyB0aGUgdW5pZm9ybWl0eSBvZiBib3RoIG9mIHRoZSBnZW5lcmF0b3JzIDwvc3Bhbj4KYGBge3J9CiNBbnN3ZXIKIyBQbG90IGhpc3RvZ3JhbSBmb3IgVV92YWx1ZXNfQQpoaXN0KFVfdmFsdWVzX0EsIGJyZWFrcz0yMCwgbWFpbj0iSGlzdG9ncmFtIG9mIFVfaSBWYWx1ZXMgZm9yIEdlbmVyYXRvciBBIiwgeGxhYj0iVV9pIiwgY29sPSJsaWdodGJsdWUiLCBwcm9iYWJpbGl0eT1UUlVFLCBib3JkZXI9ImJsYWNrIikKCiMgQWRkaW5nIGEgZGVuc2l0eSBsaW5lCmxpbmVzKGRlbnNpdHkoVV92YWx1ZXNfQSksIGNvbD0iYmx1ZSIsIGx3ZD0yKQoKIyBQbG90IGhpc3RvZ3JhbSBmb3IgVV92YWx1ZXNfQgpoaXN0KFVfdmFsdWVzX0IsIGJyZWFrcz0yMCwgbWFpbj0iSGlzdG9ncmFtIG9mIFVfaSBWYWx1ZXMgZm9yIEdlbmVyYXRvciBCIiwgeGxhYj0iVV9pIiwgY29sPSJsaWdodGdyZWVuIiwgcHJvYmFiaWxpdHk9VFJVRSwgYm9yZGVyPSJibGFjayIpCgojIEFkZGluZyBhIGRlbnNpdHkgbGluZQpsaW5lcyhkZW5zaXR5KFVfdmFsdWVzX0IpLCBjb2w9ImdyZWVuIiwgbHdkPTIpCgoKYGBgCgojIFF1ZXN0aW9uIDQuIFVzaW5nIHRoZSBpbnZlcnNlIHRyYW5zZm9ybSBtZXRob2QKCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzdGlvbiA0LihhKSBEZXZlbG9wIGFuIGFsZ29yaXRobSBmb3IgdGhlIHJhbmRvbSB2YXJpYWJsZSB3aXRoIGN1bXVsYXRpdmUgZGlzdHJpYnV0aW9uIGZ1bmN0aW9uIEYoeCkgYmVsb3cuPC9zcGFuPgoKXFsgRih4KSA9IDEgLSBlXnstKHgvXGxhbWJkYSlea30gXF0KCndoZXJlIFwoIHggXGdlcSAwIFwpLCBcKCBcbGFtYmRhIFxnZXEgMCBcKSwgYW5kIFwoIGsgXGdlcSAwIFwpLgoKYGBge3J9CiMgQW5zd2VyIDRhCiMgVGhpcyBtaWdodCBiZSBoYXJkIHRvIHByaW50IHVzaW5nIFIgLSB5b3UgY2FuIHdyaXRlIHRoZSBzdGVwIGluIHlvdXIgbm90ZWJvb2sgYW5kIHRoZW4gaW5jbHVkZSBpbWFnZSBoZXJlIC8gb3IgeW91IGNhbiBpbmNsdWRlIGFzIHNlcGVyYXRlIGZpbGUgd2hlbiB1cGxvYWQKCgppZiAoIXJlcXVpcmUoSVJkaXNwbGF5LCBxdWlldGx5ID0gVFJVRSkpIHsKICAKICBpbnN0YWxsLnBhY2thZ2VzKCJJUmRpc3BsYXkiKQogIAogIAogIGxpYnJhcnkoSVJkaXNwbGF5KQp9IGVsc2UgewogIAogIGxpYnJhcnkoSVJkaXNwbGF5KQp9CgppbnZlcnNlX3RyYW5zZm9ybV9tZXRob2QgPC0gZnVuY3Rpb24obGFtYmRhLCBrLCBuKSB7CiAgIyBuIGlzIHRoZSBudW1iZXIgb2YgcmFuZG9tIG51bWJlcnMgeW91IHdhbnQgdG8gZ2VuZXJhdGUKICAKICAKICBVIDwtIHJ1bmlmKG4pCiAgCiAgIyBBcHBseSB0aGUgaW52ZXJzZSB0cmFuc2Zvcm0KICB4IDwtIGxhbWJkYSAqICgtbG9nKDEgLSBVKSleKDEvaykKICAKICByZXR1cm4oeCkKfQoKCnJhbmRvbV9udW1iZXJzIDwtIGludmVyc2VfdHJhbnNmb3JtX21ldGhvZChsYW1iZGEgPSAxLCBrID0gMiwgbiA9IDEwMDApCmhpc3QocmFuZG9tX251bWJlcnMsIG1haW49Ikhpc3RvZ3JhbSBvZiBHZW5lcmF0ZWQgUmFuZG9tIE51bWJlcnMiLCB4bGFiPSJ4IiwgYnJlYWtzPTUwLCBjb2w9ImxpZ2h0Ymx1ZSIsIGJvcmRlcj0iYmxhY2siKQoKCiMgRW1iZWQgYW4gaW1hZ2UKI2Rpc3BsYXlfcG5nKGZpbGUgPSAiZXhhbXBsZS5wbmciKQoKCmBgYAoKCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDQgKGIpIFVzZSB0aGUgZmlyc3QgdGhyZWUgVWkgdmFsdWVzIGZyb20gcGFydCAoYSkgYW5kIGdlbmVyYXRvciBbQV0gb2YgcHJldmlvdXMgcHJvYmxlbSB0byBjcmVhdGUgMyB2YWx1ZXMgZnJvbSB0aGUgcmFuZG9tIHZhcmlhYmxlIHdoZW4sICRcbGFtYmRhID0gMSQsICTwnZGYID0gNSQ8L3NwYW4+CmBgYHtyfQojQW5zd2VyCgpaIDwtIDUgIApaX3ZhbHVlc19BIDwtIGMoWikKbV9BIDwtIDE2ICAKCmZvcihpIGluIDE6MikgewogIFogPC0gKDkgKiBaICsgMSkgJSUgbV9BCiAgWl92YWx1ZXNfQSA8LSBjKFpfdmFsdWVzX0EsIFopCn0KCgpVX3ZhbHVlc19BIDwtIFpfdmFsdWVzX0EgLyBtX0EKCgpsYW1iZGEgPC0gMQprIDwtIDUKeF92YWx1ZXMgPC0gbGFtYmRhICogKC1sb2coMSAtIFVfdmFsdWVzX0FbMTozXSkpXigxL2spCgpwcmludCh4X3ZhbHVlcykKCgpgYGAKCgojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc2lvbiA0IChjKSBzaW5nIFIgZ2VuZXJhdGUgMTAsMDAwIHZhbHVlcyBmcm9tIHlvdXIgYWxnb3JpdGhtIHdoZW4gIFxsYW1iZGEgPSAxICwg8J2RmCA9IDUgIGFuZCBwbG90IGEgaGlzdG9ncmFtIG9mIHRoZSBkZW5zaXR5LiBEaXNjdXNzIHdoYXQgaW5zaWdodHMgeW91IG9idGFpbiB3aGVuIHlvdSBsb29rIGF0IHRoZSBwbG90IGdlbmVyYXRlZCBoZXJlIHZzIHRoZSBwbG90IHlvdSBnZW5lcmF0ZWQgaW4gcXVlc3Rpb24gMyAoZSkgPC9zcGFuPgpgYGB7cn0KI0Fuc3dlcgoKZ2VuZXJhdGVfdmFsdWVzIDwtIGZ1bmN0aW9uKGxhbWJkYSwgaywgbikgewogIFUgPC0gcnVuaWYobikgICMgR2VuZXJhdGUgbiB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQgcmFuZG9tIG51bWJlcnMKICAKIAogIHggPC0gbGFtYmRhICogKC1sb2coMSAtIFUpKV4oMS9rKQogIHJldHVybih4KQp9CgoKbGFtYmRhIDwtIDEKayA8LSA1Cm4gPC0gMTAwMDAKZ2VuZXJhdGVkX3ZhbHVlcyA8LSBnZW5lcmF0ZV92YWx1ZXMobGFtYmRhLCBrLCBuKQoKIyBQbG90IHRoZSBoaXN0b2dyYW0KaGlzdChnZW5lcmF0ZWRfdmFsdWVzLCBtYWluPSJIaXN0b2dyYW0gZm9yIEludmVyc2UgVHJhbnNmb3JtIEdlbmVyYXRlZCBWYWx1ZXMiLCB4bGFiPSJ4IiwgYnJlYWtzPTUwLCBwcm9iYWJpbGl0eT1UUlVFLCBjb2w9ImxpZ2h0Ymx1ZSIsIGJvcmRlcj0iYmxhY2siLCB5bGltPWMoMCwgMC42KSkKCiMgQWRkaW5nIGEgZGVuc2l0eSBsaW5lCmxpbmVzKGRlbnNpdHkoZ2VuZXJhdGVkX3ZhbHVlcyksIGNvbD0iYmx1ZSIsIGx3ZD0yKQpjYXQoIlRoZSBoaXN0b2dyYW0gZnJvbSA0Yywgc2hhcGVkIGJ5IHRoZSBleHBvbmVudGlhbC1saWtlIGRpc3RyaWJ1dGlvbgpGKHgpLCBsaWtlbHkgc2hvd3MgYSBwcm9ub3VuY2VkIHNrZXcgdG93YXJkcyBsb3dlciB2YWx1ZXMsIGRpdmVyZ2luZyBmcm9tIHRoZSBtb3JlIGV2ZW5seSBzcHJlYWQgdmFsdWVzIG9mIHRoZSBnZW5lcmF0b3IgaW4gMyhlKSwgd2hpY2ggYWltZWQgZm9yIHVuaWZvcm1pdHkuSWYgdGhlIGhpc3RvZ3JhbSBmcm9tIDMoZSkgaGFkIHJlbGF0aXZlbHkgY29uc2lzdGVudCBiYXIgaGVpZ2h0cywgaXQnZCBpbmRpY2F0ZSB0aGUgTENHJ3Mgc3VjY2VzcyBhdCBhcHByb3hpbWF0aW5nIGEgdW5pZm9ybSBkaXN0cmlidXRpb247IGluIGNvbnRyYXN0LCB2YXJ5aW5nIGJhciBoZWlnaHRzIGluIDRjJ3MgaGlzdG9ncmFtIGFyZSBleHBlY3RlZCBnaXZlbiBpdHMgbm9uLXVuaWZvcm0gdGFyZ2V0IGRpc3RyaWJ1dGlvbi4iKQoKYGBgCgojIFF1ZXN0aW9uIDUuIERldmVsb3AgYSBNb250ZSBDYXJsbyBzaW11bGF0aW9uIGluIFIgdGhhdCBjb3VudHMgdGhlIG51bWJlciBvZiB1bmlmb3JtIFswLDFdIHJhbmRvbSBudW1iZXJzIHRoYXQgbXVzdCBiZSBzdW1tZWQgdG8gZ2V0IGEgc3VtIGdyZWF0ZXIgdGhhbiAxLiBSdW4gYSBzaW5nbGUgc2ltdWxhdGlvbiB3aXRoIG4gPSAxMCwwMDAgdGltZXMgYW5kIGZpbmQgdGhlIG1lYW4gb2YgdGhlIG51bWJlciBvZiBjb3VudHMuIERvIHlvdSB0aGluayB0aGlzIG51bWJlciBsb29rcyBzb21ld2hhdCBmYW1pbGlhci4gRXZlcnkgc3R1ZGVudCBtaWdodCBnZXQgc2xpZ2h0bHkgZGlmZmVyZW50IHZhbHVlIGFueSBpZGVhcyB3aHk/CmBgYHtyfQojQW5zd2VyCm1vbnRlX2NhcmxvX3NpbXVsYXRpb24gPC0gZnVuY3Rpb24oKSB7CiAgc3VtIDwtIDAKICBjb3VudCA8LSAwCiAgd2hpbGUoc3VtIDw9IDEpIHsKICAgIHN1bSA8LSBzdW0gKyBydW5pZigxKSAjIEdlbmVyYXRlIGEgcmFuZG9tIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEKICAgIGNvdW50IDwtIGNvdW50ICsgMQogIH0KICByZXR1cm4oY291bnQpCn0KCgpuIDwtIDEwMDAwCnJlc3VsdHMgPC0gcmVwbGljYXRlKG4sIG1vbnRlX2NhcmxvX3NpbXVsYXRpb24oKSkKCiMgRmluZGluZyB0aGUgbWVhbiBjb3VudAptZWFuX2NvdW50IDwtIG1lYW4ocmVzdWx0cykKcHJpbnQobWVhbl9jb3VudCkKCmBgYAoKIyBRdWVzdGlvbiA2LiBGb3Igb3VyIHNwZWNpZmljIHJhbmRvbSB2YXJpYWJsZSwgd2Uga25vdyB0aGF0IGl0cyBQREYgaXMgZGVmaW5lZCBieSB0aGUgZnVuY3Rpb24gJGYoeCkgPSAxMHgoMS14KSQuIFV0aWxpemUgdGhlIGFjY2VwdC1yZWplY3QgYWxnb3JpdGhtIHRvIGRyYXcgc2FtcGxlcyBmcm9tIHRoaXMgZGlzdHJpYnV0aW9uLiBUYWtlIGEgbG9vayBhdCBMZWN0dXJlIDEwIHNsaWRlIDggYW5kIDkKCmBgYHtyfQojQW5zd2VyCmYgPC0gZnVuY3Rpb24oeCkgewogIHJldHVybigxMCp4KigxLXgpKQp9CgojIFVzaW5nIHVuaWZvcm0gZGlzdHJpYnV0aW9uIGFzIHByb3Bvc2FsIGRpc3RyaWJ1dGlvbgpnIDwtIGZ1bmN0aW9uKHgpIHsKICByZXR1cm4oMSkKfQoKIyBGaW5kaW5nIGMKeF92YWx1ZXMgPC0gc2VxKDAsIDEsIDAuMDEpCmMgPC0gbWF4KGYoeF92YWx1ZXMpKQoKYWNjZXB0X3JlamVjdF9zYW1wbGluZyA8LSBmdW5jdGlvbihuKSB7CiAgc2FtcGxlcyA8LSBudW1lcmljKG4pCiAgY291bnQgPC0gMAogIHdoaWxlKGNvdW50IDwgbikgewogICAgWCA8LSBydW5pZigxKQogICAgVSA8LSBydW5pZigxKQogICAgaWYoVSA8PSBmKFgpIC8gKGMgKiBnKFgpKSkgewogICAgICBjb3VudCA8LSBjb3VudCArIDEKICAgICAgc2FtcGxlc1tjb3VudF0gPC0gWAogICAgfQogIH0KICByZXR1cm4oc2FtcGxlcykKfQoKIyBEcmF3aW5nIHNhbXBsZXMKc2FtcGxlcyA8LSBhY2NlcHRfcmVqZWN0X3NhbXBsaW5nKDEwMDAwKQpoaXN0KHNhbXBsZXMsIG1haW49Ikhpc3RvZ3JhbSBvZiBTYW1wbGVzIiwgeGxhYj0ieCIsIGJyZWFrcz0xMCwgY29sPSJsaWdodGJsdWUiLCBib3JkZXI9ImJsYWNrIikKCmBgYAoKCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDEgKGIpIDwvc3Bhbj4KYGBge3J9CiNBbnN3ZXIKCmBgYAoK