Go back to the Contents page.


Press Show to reveal the code chunks.


# Create a clipboard button on the rendered HTML page
source(here::here("clipboard.R")); clipboard
# Set seed for reproducibility
set.seed(1982) 
# Set global options for all code chunks
knitr::opts_chunk$set(
  # Disable messages printed by R code chunks
  message = FALSE,    
  # Disable warnings printed by R code chunks
  warning = FALSE,    
  # Show R code within code chunks in output
  echo = TRUE,        
  # Include both R code and its results in output
  include = TRUE,     
  # Evaluate R code chunks
  eval = FALSE,       
  # Enable caching of R code chunks for faster rendering
  cache = FALSE,      
  # Align figures in the center of the output
  fig.align = "center",
  # Enable retina display for high-resolution figures
  retina = 2,
  # Show errors in the output instead of stopping rendering
  error = TRUE,
  # Do not collapse code and output into a single block
  collapse = FALSE
)
# Start the figure counter
fig_count <- 0
# Define the captioner function
captioner <- function(caption) {
  fig_count <<- fig_count + 1
  paste0("Figure ", fig_count, ": ", caption)
}
library(MetricGraph)
library(ggplot2)
library(reshape2)
library(dplyr)
library(viridis)
library(plotly)
library(patchwork)
library(slackr)
source("keys.R")
slackr_setup(token = token) # token comes from keys.R
## [1] "Successfully connected to Slack"
capture.output(
  knitr::purl(here::here("functionality1.Rmd"), output = here::here("functionality1.R")),
  file = here::here("old/purl_log.txt")
)
source(here::here("functionality1.R"))
x_eye <- 5#8
y_eye <- -1#-2
z_eye <- 2#3

Let \(\Gamma = (\mathcal{V}, \mathcal{E})\) be a metric graph with vertex set \(\mathcal{V} = \{v_1, v, v_2\}\) and edge set \(\mathcal{E} = \{e_1, e_2\}\). Assume that the edges \(e_1\) and \(e_2\) meet at the vertex \(v\), so that \(v\) is their common endpoint. For later reference, we recall the Kirchhoff vertex conditions \[\begin{equation} \label{eq:kirchhoff_cond} \tag{1} \mathcal{K}(\Gamma) = \left\{f\in C(\Gamma)\;\middle|\; \forall v\in \mathcal{V}:\; \sum_{e\in\mathcal{E}_v}\partial_e f(v)=0 \right\}, \end{equation}\] where \(\mathcal{E}_v\) denotes the set of edges incident to \(v\), and \[\begin{equation} \label{eq:dir_der} \tag{2} \partial_ef(v) = \begin{cases} f'_e(0), \quad &\text{if }v=0,\\ -f'_e(\ell_e), \quad &\text{if }v=\ell_e. \end{cases} \end{equation}\]

1 Compatible orientation

apply_edge_functions_fast <- function(graph, f_list) {
  
  if (length(f_list) != graph$nE) {
    stop(sprintf(
      "Number of functions (%d) must equal number of edges (%d).",
      length(f_list), graph$nE
    ))
  }
  VtE <- graph$mesh$VtE
  edge_lengths <- graph$edge_lengths
  
  edge   <- VtE[,1]
  s_norm <- VtE[,2]
  s_true <- s_norm * edge_lengths[edge]

  out <- sapply(seq_len(nrow(VtE)), function(i) f_list[[edge[i]]](s_true[i]))
  return(out)
}

We first assume that the edges are compatibly oriented, namely \(e_1 = [0,\ell_1]\) and \(e_2=[0,\ell_2]\), with the vertex \(v\) corresponding to \(\ell_1\) on \(e_1\) and \(0\) on \(e_2\). With this parametrization, we can glue the two edges into a single interval \([e_1,e_2]\simeq [0,\ell_1+\ell_2]\) and view a function \(f = \{f_{e_1},f_{e_2}\}\in C(\Gamma)\) as a function \(\hat{f}\in C([0,\ell_1+\ell_2])\) so that \(f_{e_1}(\ell_1) = \hat{f}(v) = f_{e_2}(0)\). Consider the function \(f = \{f_{e_1},f_{e_2}\}\) given by \[\begin{equation*} \begin{cases} f_{e_1}(t) = t^4,& t\in[0,\ell_1],\\ f_{e_2}(t) = (t+\ell_1)^4,& t\in[0,\ell_2]. \end{cases} \end{equation*}\] Its edgewise derivatives are given by \[\begin{equation*} \begin{cases} f'_{e_1}(t) = 4t^3,& t\in[0,\ell_1],\\ f'_{e_2}(t) = 4(t+\ell_1)^3,& t\in[0,\ell_2]. \end{cases} \end{equation*}\] Under the above identification, \(f\) corresponds to the function \[\begin{align*} \hat{f}(t) = t^4,\quad t\in[0,\ell_1 + \ell_2], \end{align*}\] whose derivative is \[\begin{align*} \hat{f}(t) = 4t^3,\quad t\in[0,\ell_1 + \ell_2]. \end{align*}\] In particular, \(\hat{f} \in C^1([0,\ell_1+\ell_2])\), and therefore \(f\) has a continuous first derivative across the vertex \(v\). See Figure 2. Moreover, the edgewise derivatives must agree at \(v\), that is, we must have \(f'_{e_1}(\ell_1) = \hat{f}'(v) = f'_{e_2}(0)\), which is the case since \[\begin{align*} f'_{e_1}(\ell_1) = 4\ell_1^3\quad\text{ and }\quad \hat{f}'(v) = \hat{f}'(\ell_1)=4\ell_1^3\quad \text{ and }\quad f'_{e_2}(0) = 4\ell_1^3. \end{align*}\] By using \(\eqref{eq:dir_der}\), we get that \[\begin{align*} \partial_{e_1}f(v) = -f'_{e_1}(\ell_1)=-4\ell_1^3\quad\text{ and }\quad \partial_{e_2}f(v) = f'_{e_2}(0)=4\ell_1^3, \end{align*}\] and therefore, \[\begin{equation} \sum_{e \in \mathcal{E}_v} \partial_e f(v) =\partial_{e_1}f(v) + \partial_{e_2}f(v) = -f'_{e_1}(\ell_1) + f'_{e_2}(0) = -4\ell_1^3 + 4\ell_1^3 = 0, \end{equation}\] which means that \(f\) satisfies the Kirchhoff vertex conditions \(\eqref{eq:kirchhoff_cond}\) at vertex \(v\). This is an instance of the fact that \(f\) satisfies the Kirchhoff vertex conditions \(\eqref{eq:kirchhoff_cond}\) at all vertices \(v\) with \(\deg(v) =2\) if and only if \(f'\) is continuous at at all vertices \(v\) with \(\deg(v) =2\).

h = 0.01
ell1 <- 1
ell2 <- 0.4
e1 <- rbind(c(-ell1,0), # (x,y) = underline(e_1) 
            c(0,0))  # (x,y) = overline(e_1) 
e2 <- rbind(c(0,0),
            c(ell2,0))

e1_ini_x <- -ell1; e1_ini_y <- 0; e1_ini_z <- 0
e1_fin_x <- 0; e1_fin_y <- 0; e1_fin_z <- 0

# Midpoint
xm1 <- (e1_fin_x + e1_ini_x)/2
ym1 <- (e1_fin_y + e1_ini_y)/2
zm1 <- (e1_fin_z + e1_ini_z)/2

# Direction vector
dx1 <- e1_fin_x - e1_ini_x
dy1 <- e1_fin_y - e1_ini_y
dz1 <- e1_fin_z - e1_ini_z

e2_ini_x <- 0; e2_ini_y <- 0; e2_ini_z <- 0
e2_fin_x <- ell2; e2_fin_y <- 0; e2_fin_z <- 0

# Midpoint
xm2 <- (e2_fin_x + e2_ini_x)/2
ym2 <- (e2_fin_y + e2_ini_y)/2
zm2 <- (e2_fin_z + e2_ini_z)/2

# Direction vector
dx2 <- e2_fin_x - e2_ini_x
dy2 <- e2_fin_y - e2_ini_y
dz2 <- e2_fin_z - e2_ini_z


graph <- metric_graph$new(edges = list(e1 = e1, e2 = e2))
graph$build_mesh(h = h)
fe1 <- function(t) t^4
fe2 <- function(t) (t + ell1)^4

dfe1 <- function(t) 4*t^3
dfe2 <- function(t) 4*(t + ell1)^3

ddfe1 <- function(t) 12*t^2
ddfe2 <- function(t) 12*(t + ell1)^2

dddfe1 <- function(t) 24*t
dddfe2 <- function(t) 24*(t + ell1)

f_list <- list(fe1, fe2)
df_list <- list(dfe1, dfe2)
ddf_list <- list(ddfe1, ddfe2)
dddf_list <- list(dddfe1, dddfe2)

f_list_aux <- f_list
df_list_aux <- df_list
ddf_list_aux <- ddf_list
dddf_list_aux <- dddf_list

f <- apply_edge_functions_fast(graph, f_list)
df <- apply_edge_functions_fast(graph, df_list)
ddf <- apply_edge_functions_fast(graph, ddf_list)
dddf <- apply_edge_functions_fast(graph, dddf_list)
sizeref <- 0.1
pf <- graph$plot_function(X = f, vertex_size = gsw, edge_width = gsw, line_width = gsw, type = "plotly") |> 
  add_trace(
  type = "cone",
  x = ym1,
  y = xm1,
  z = zm1,
  u = dy1,
  v = dx1,
  w = dz1,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("green", "green")),
  cmin = 0,
  cmax = 1
) |>
  add_trace(
  type = "cone",
  x = ym2,
  y = xm2,
  z = zm2,
  u = dy2,
  v = dx2,
  w = dz2,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("green", "green")),
  cmin = 0,
  cmax = 1
) |>
  config(mathjax = 'cdn') |>
  plotly::layout(title = list(text = TeX("f"), y = 0.8),
                 font = list(family = "Palatino"),
                 scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              yaxis = list(title = list(text = "y", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              zaxis = list(title = list(text = "z", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
                   aspectratio = list(x = 2, 
                                 y = 2, 
                                 z = 2),
                   camera = list(eye = list(x = x_eye, 
                                       y = y_eye, 
                                       z = z_eye),
                            center = list(x = 0, 
                                          y = 0, 
                                          z = 0)),
                   annotations = list(
                     
             list(
               x = e1_ini_y, y = e1_ini_x, z = e1_ini_z,
               text = TeX("v_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = 0, y = 0, z = 0,
               text = TeX("v"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = e2_fin_y, y = e2_fin_x, z = e2_fin_z,
               text = TeX("v_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym1, y = xm1, z = zm1,
               text = TeX("e_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym2, y = xm2, z = zm2,
               text = TeX("e_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))

pdf <- graph$plot_function(X = df, vertex_size = gsw, edge_width = gsw, line_width = gsw, type = "plotly") |> 
  add_trace(
  type = "cone",
  x = ym1,
  y = xm1,
  z = zm1,
  u = dy1,
  v = dx1,
  w = dz1,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("green", "green")),
  cmin = 0,
  cmax = 1
) |>
  add_trace(
  type = "cone",
  x = ym2,
  y = xm2,
  z = zm2,
  u = dy2,
  v = dx2,
  w = dz2,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("green", "green")),
  cmin = 0,
  cmax = 1
) |>
  config(mathjax = 'cdn') |>
  plotly::layout(title = list(text = TeX("f'"), y = 0.8),
                 font = list(family = "Palatino"),
                 scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              yaxis = list(title = list(text = "y", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              zaxis = list(title = list(text = "z", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
                   aspectratio = list(x = 2, 
                                 y = 2, 
                                 z = 2),
                   camera = list(eye = list(x = x_eye, 
                                       y = y_eye, 
                                       z = z_eye),
                            center = list(x = 0, 
                                          y = 0, 
                                          z = 0)),
                   annotations = list(
                     
             list(
               x = e1_ini_y, y = e1_ini_x, z = e1_ini_z,
               text = TeX("v_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = 0, y = 0, z = 0,
               text = TeX("v"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = e2_fin_y, y = e2_fin_x, z = e2_fin_z,
               text = TeX("v_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym1, y = xm1, z = zm1,
               text = TeX("e_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym2, y = xm2, z = zm2,
               text = TeX("e_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))

pddf <- graph$plot_function(X = ddf, vertex_size = gsw, edge_width = gsw, line_width = gsw, type = "plotly") |>
  add_trace(
  type = "cone",
  x = ym1,
  y = xm1,
  z = zm1,
  u = dy1,
  v = dx1,
  w = dz1,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("green", "green")),
  cmin = 0,
  cmax = 1
) |>
  add_trace(
  type = "cone",
  x = ym2,
  y = xm2,
  z = zm2,
  u = dy2,
  v = dx2,
  w = dz2,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("green", "green")),
  cmin = 0,
  cmax = 1
) |>
  config(mathjax = 'cdn') |>
  plotly::layout(title = list(text = TeX("f''"), y = 0.8), 
                 font = list(family = "Palatino"),
                 scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              yaxis = list(title = list(text = "y", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              zaxis = list(title = list(text = "z", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
                   aspectratio = list(x = 2, 
                                 y = 2, 
                                 z = 2),
                   camera = list(eye = list(x = x_eye, 
                                       y = y_eye, 
                                       z = z_eye),
                            center = list(x = 0, 
                                          y = 0, 
                                          z = 0)),
                   annotations = list(
                     
             list(
               x = e1_ini_y, y = e1_ini_x, z = e1_ini_z,
               text = TeX("v_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = 0, y = 0, z = 0,
               text = TeX("v"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = e2_fin_y, y = e2_fin_x, z = e2_fin_z,
               text = TeX("v_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym1, y = xm1, z = zm1,
               text = TeX("e_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym2, y = xm2, z = zm2,
               text = TeX("e_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))

pdddf <- graph$plot_function(X = dddf, vertex_size = gsw, edge_width = gsw, line_width = gsw, type = "plotly") |> 
  add_trace(
  type = "cone",
  x = ym1,
  y = xm1,
  z = zm1,
  u = dy1,
  v = dx1,
  w = dz1,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("green", "green")),
  cmin = 0,
  cmax = 1
) |>
  add_trace(
  type = "cone",
  x = ym2,
  y = xm2,
  z = zm2,
  u = dy2,
  v = dx2,
  w = dz2,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("green", "green")),
  cmin = 0,
  cmax = 1
) |>
  config(mathjax = 'cdn') |>
  plotly::layout(title = list(text = TeX("f'''"), y = 0.8),
                 font = list(family = "Palatino"),
                 scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              yaxis = list(title = list(text = "y", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              zaxis = list(title = list(text = "z", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
                   aspectratio = list(x = 2, 
                                 y = 2, 
                                 z = 2),
                   camera = list(eye = list(x = x_eye, 
                                       y = y_eye, 
                                       z = z_eye),
                            center = list(x = 0, 
                                          y = 0, 
                                          z = 0)),
                   annotations = list(
                     
             list(
               x = e1_ini_y, y = e1_ini_x, z = e1_ini_z,
               text = TeX("v_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = 0, y = 0, z = 0,
               text = TeX("v"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = e2_fin_y, y = e2_fin_x, z = e2_fin_z,
               text = TeX("v_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym1, y = xm1, z = zm1,
               text = TeX("e_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym2, y = xm2, z = zm2,
               text = TeX("e_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))

save(pf, file = here::here("data_files/pf.Rdata"))
save(pdf, file = here::here("data_files/pdf.Rdata"))
save(pddf, file = here::here("data_files/pddf.Rdata"))
save(pdddf, file = here::here("data_files/pdddf.Rdata"))
load(here::here("data_files/pf.Rdata"))
pf

Figure 1: Function \(f = \{f_e\}_{e\in\mathcal{E}}\) given by \(f_{e_1}(t) = t^4\) and \(f_{e_2}(t) = (t+\ell_1)^4\).

load(here::here("data_files/pdf.Rdata"))
pdf

Figure 2: Function \(f' = \{f'_e\}_{e\in\mathcal{E}}\) given by \(f'_{e_1}(t) = 4t^3\) and \(f'_{e_2}(t) = 4(t+\ell_1)^3\).

load(here::here("data_files/pddf.Rdata"))
pddf

Figure 3: Function \(f'' = \{f''_e\}_{e\in\mathcal{E}}\) given by \(f''_{e_1}(t) = 12t^2\) and \(f''_{e_2}(t) = 12(t+\ell_1)^2\).

load(here::here("data_files/pdddf.Rdata"))
pdddf

Figure 4: Function \(f''' = \{f'''_e\}_{e\in\mathcal{E}}\) given by \(f'''_{e_1}(t) = 24t\) and \(f'''_{e_2}(t) = 24(t+\ell_1)\).

2 Incompatible orientation

my_apply_edge_functions <- function(graph, f_list, ell1, ell2, h){
  l1_mesh <- seq(0, ell1, by = h)
  l2_mesh <- seq(0, ell2, by = h)
  f1 <- f_list[[1]](l1_mesh)
  f2 <- f_list[[2]](l2_mesh)
  l1_mesh_norm <- l1_mesh/ell1
  l2_mesh_norm <- l2_mesh/ell2
  PtE1 <- cbind(rep(1, length(l1_mesh)), l1_mesh_norm)
  PtE2 <- cbind(rep(2, length(l2_mesh)), l2_mesh_norm)
  XY1 <- graph$coordinates(PtE1)
  XY2 <- graph$coordinates(PtE2)
  DF1 <- data.frame(x = XY1[,1], y = XY1[,2], z = f1)
  DF2 <- data.frame(x = XY2[,1], y = XY2[,2], z = f2)
  DF <- rbind(DF1, rep(NA, 3), DF2)
  return(list(DF = DF))
}

Now study the case where the edges are not compatible oriented. For that, we flip edge \(e_2\), that is, \(e_1 = [0,\ell_1]\) and \(e_2=[0,\ell_2]\) with \(v\) corresponding to \(\ell_1\) on \(e_1\) and \(\ell_2\) on \(e_2\). Consider the function \(g = \{g_{e_1},g_{e_2}\}\) given by \[\begin{equation*} \begin{cases} g_{e_1}(\tau) = \tau^4,& \tau\in[0,\ell_1],\\ g_{e_2}(\tau) = (\tau-(\ell_1+\ell_2))^4,& \tau\in[0,\ell_2]. \end{cases} \end{equation*}\] Its edgewise derivatives are given by \[\begin{equation*} \begin{cases} g'_{e_1}(\tau) = 4\tau^3,& \tau\in[0,\ell_1],\\ g'_{e_2}(\tau) = 4(\tau-(\ell_1+\ell_2))^3,& \tau\in[0,\ell_2]. \end{cases} \end{equation*}\] The coordinates derivatives at \(v\) are given by \[\begin{equation} g'_{e_1}(\ell_1)=4\ell_1^3\quad\text{ and }\quad g'_{e_2}(\ell_2)=-4\ell_1^3. \end{equation}\] Let us check the Kirchhoff vertex conditions \(\eqref{eq:kirchhoff_cond}\) at vertex \(v\). By using \(\eqref{eq:dir_der}\), we get that \[\begin{align*} \partial_{e_1}g(v) = -g'_{e_1}(\ell_1)=-4\ell_1^3\quad\text{ and }\quad \partial_{e_2}g(v) = -g'_{e_2}(\ell_2)=4\ell_1^3, \end{align*}\] and therefore, \[\begin{equation} \label{eq:invariant_c} \tag{3} \sum_{e \in \mathcal{E}_v} \partial_e g(v) =\partial_{e_1}g(v) + \partial_{e_2}g(v) = -g'_{e_1}(\ell_1) -g'_{e_2}(\ell_2) = -4\ell_1^3 + 4\ell_1^3 = 0, \end{equation}\] which shows that \(g\) satisfies the Kirchhoff vertex conditions \(\eqref{eq:kirchhoff_cond}\) at vertex \(v\). At first glance, the edgewise derivative, \(g' = \{g'_{e_1},g'_{e_2}\}\) appears discontinuous at \(v\), which might seem contradictory. See Figure 6.

To clarify, observe that \(f = g\) as functions on the graph. Indeed, by reparametrizing edge \(e_1\) by \(\tau=t\) and edge \(e_2\) by \(\tau = \ell_2-t\), we obtain \(f_{e_1}=g_{e_1}\) and \(f_{e_2}=g_{e_2}\). More precisely, \[\begin{align} \label{eq:eq_of_f_g} \tag{4} g_{e_1}(\tau) = g_{e_1}(t) = t^4 = f_{e_1}(t)\quad\text{ and }\quad g_{e_2}(\tau) = g_{e_2}(\ell_2-t) = (\ell_2-t-(\ell_1+\ell_2))^4 = (t+\ell_1)^4= f_{e_2}(t), \end{align}\] Thus \(f\) and \(g\) coincide on each edge after reparametrization, and define the same function on the graph. The apparent discontinuity of \(g'\) arises solely from the reversed coordinate on \(e_2\). The function itself has not changed, only its coordinate representation.

From \(\eqref{eq:eq_of_f_g}\), by the chain rule, the first derivative transforms as \[\begin{equation} \label{eq:der_inv} \tag{5} g'_{e_2}(\tau) = \dfrac{d}{d\tau} (g_{e_2}(\tau)) = \dfrac{d}{d\tau} (f_{e_2}(t)) = \dfrac{d}{dt} (f_{e_2}(t)) \dfrac{dt}{d\tau} = - \dfrac{d}{dt} (f_{e_2}(t)) = - f'_{e_2}(t) \end{equation}\]

so the coordinate derivative changes sign under reparametrization. Hence, edgewise derivatives are not invariant under orientation changes. By contrast, the outward derivative \(\partial_e g(v)\) is invariant, and is therefore the correct intrinsic quantity to check the Kirchhoff condition.

In the compatible orientation case, \(f'_{e_1}(\ell_1) = f'_{e_2}(0)\), so the coordinate derivatives match. In the flipped orientation case, \(g'_{e_1}(\ell_1) \neq g'_{e_2}(\ell_2)\), but this mismatch is purely a consequence of the reversed parametrization. The correct invariant comparison is \(\eqref{eq:invariant_c}\), which demonstrates that the Kirchhoff condition is intrinsic and independent of edge parametrization.

In conclusion, the apparent contradiction arises only when comparing coordinate derivatives with opposite orientations, which is not geometrically meaningful. Continuity of the derivative at a vertex must be interpreted intrinsically: at a degree-two vertex, this intrinsic continuity is equivalent to the Kirchhoff condition.

e2 <- e2[2:1,]
graph <- metric_graph$new(edges = list(e1 = e1, e2 = e2))
graph$build_mesh(h = h)
e1_ini_x <- -ell1; e1_ini_y <- 0; e1_ini_z <- 0
e1_fin_x <- 0; e1_fin_y <- 0; e1_fin_z <- 0

# Midpoint
xm1 <- (e1_fin_x + e1_ini_x)/2
ym1 <- (e1_fin_y + e1_ini_y)/2
zm1 <- (e1_fin_z + e1_ini_z)/2

# Direction vector
dx1 <- e1_fin_x - e1_ini_x
dy1 <- e1_fin_y - e1_ini_y
dz1 <- e1_fin_z - e1_ini_z

e2_ini_x <- ell2; e2_ini_y <- 0; e2_ini_z <- 0
e2_fin_x <- 0; e2_fin_y <- 0; e2_fin_z <- 0

# Midpoint
xm2 <- (e2_fin_x + e2_ini_x)/2
ym2 <- (e2_fin_y + e2_ini_y)/2
zm2 <- (e2_fin_z + e2_ini_z)/2

# Direction vector
dx2 <- e2_fin_x - e2_ini_x
dy2 <- e2_fin_y - e2_ini_y
dz2 <- e2_fin_z - e2_ini_z
fe1 <- function(t) t^4
fe2 <- function(t) (t - (ell1 + ell2))^4

dfe1 <- function(t) 4*t^3
dfe2 <- function(t) 4*(t - (ell1 + ell2))^3

ddfe1 <- function(t) 12*t^2
ddfe2 <- function(t) 12*(t - (ell1 + ell2))^2

dddfe1 <- function(t) 24*t
dddfe2 <- function(t) 24*(t - (ell1 + ell2))

f_list <- list(fe1, fe2)
df_list <- list(dfe1, dfe2)
ddf_list <- list(ddfe1, ddfe2)
dddf_list <- list(dddfe1, dddfe2)

f <- my_apply_edge_functions(graph, f_list, ell1, ell2, h)
df <- my_apply_edge_functions(graph, df_list, ell1, ell2, h)
ddf <- my_apply_edge_functions(graph, ddf_list, ell1, ell2, h)
dddf <- my_apply_edge_functions(graph, dddf_list, ell1, ell2, h)

f_aux <- my_apply_edge_functions(graph, f_list_aux, ell1, ell2, h)
df_aux <- my_apply_edge_functions(graph, df_list_aux, ell1, ell2, h)
ddf_aux <- my_apply_edge_functions(graph, ddf_list_aux, ell1, ell2, h)
dddf_aux <- my_apply_edge_functions(graph, dddf_list_aux, ell1, ell2, h)
p_base <- graph$plot_function(X = rep(0, nrow(graph$mesh$VtE)), vertex_size = gsw, line_color = "black", edge_width = gsw, line_width = gsw, type = "plotly")
DF <- f$DF
pf3 <- p_base |>
  add_trace(
  type = "cone",
  x = ym1,
  y = xm1,
  z = zm1,
  u = dy1,
  v = dx1,
  w = dz1,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  cmin = 0,
  cmax = 1
) |>
  add_trace(
  type = "cone",
  x = ym2,
  y = xm2,
  z = zm2,
  u = dy2,
  v = dx2,
  w = dz2,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  cmin = 0,
  cmax = 1
) |>
    add_trace(data = DF,
            x = ~y, 
            y = ~x, 
            z = ~z, 
            type = "scatter3d",
            mode = "lines",  
            line = list(color = "rgb(0,0,200)", width = gsw),
            showlegend = FALSE) |>
  add_trace(x = rep(DF$y, each = 3), 
            y = rep(DF$x, each = 3), 
            z = unlist(lapply(DF$z, function(zj) c(0, zj, NA))),
            type = "scatter3d", 
            mode = "lines",
            line = list(color = "gray", width = 0.5),
            showlegend = FALSE) |>
  config(mathjax = 'cdn') |>
  plotly::layout(title = list(text = TeX("g"), y = 0.8),
                 font = list(family = "Palatino"),
                 scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              yaxis = list(title = list(text = "y", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              zaxis = list(title = list(text = "z", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
                   aspectratio = list(x = 2, 
                                 y = 2, 
                                 z = 2),
                   camera = list(eye = list(x = x_eye, 
                                       y = y_eye, 
                                       z = z_eye),
                            center = list(x = 0, 
                                          y = 0, 
                                          z = 0)),
                   annotations = list(
                     
             list(
               x = e1_ini_y, y = e1_ini_x, z = e1_ini_z,
               text = TeX("v_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = 0, y = 0, z = 0,
               text = TeX("v"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = e2_ini_y, y = e2_ini_x, z = e2_ini_z,
               text = TeX("v_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym1, y = xm1, z = zm1,
               text = TeX("e_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym2, y = xm2, z = zm2,
               text = TeX("\\hat{e}_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))

DF <- df$DF
pdf3 <- p_base |>
  add_trace(
  type = "cone",
  x = ym1,
  y = xm1,
  z = zm1,
  u = dy1,
  v = dx1,
  w = dz1,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  cmin = 0,
  cmax = 1
) |>
  add_trace(
  type = "cone",
  x = ym2,
  y = xm2,
  z = zm2,
  u = dy2,
  v = dx2,
  w = dz2,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  cmin = 0,
  cmax = 1
) |>
    add_trace(data = DF,
            x = ~y, 
            y = ~x, 
            z = ~z, 
            type = "scatter3d",
            mode = "lines",  
            line = list(color = "rgb(0,0,200)", width = gsw),
            showlegend = FALSE) |>
  add_trace(x = rep(DF$y, each = 3), 
            y = rep(DF$x, each = 3), 
            z = unlist(lapply(DF$z, function(zj) c(0, zj, NA))),
            type = "scatter3d", 
            mode = "lines",
            line = list(color = "gray", width = 0.5),
            showlegend = FALSE) |>
  config(mathjax = 'cdn') |>
  plotly::layout(title = list(text = TeX("g'"), y = 0.8),
                 font = list(family = "Palatino"),
                 scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              yaxis = list(title = list(text = "y", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              zaxis = list(title = list(text = "z", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
                   aspectratio = list(x = 2, 
                                 y = 2, 
                                 z = 2),
                   camera = list(eye = list(x = x_eye, 
                                       y = y_eye, 
                                       z = z_eye),
                            center = list(x = 0, 
                                          y = 0, 
                                          z = 0)),
                   annotations = list(
                     
             list(
               x = e1_ini_y, y = e1_ini_x, z = e1_ini_z,
               text = TeX("v_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = 0, y = 0, z = 0,
               text = TeX("v"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = e2_ini_y, y = e2_ini_x, z = e2_ini_z,
               text = TeX("v_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym1, y = xm1, z = zm1,
               text = TeX("e_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym2, y = xm2, z = zm2,
               text = TeX("\\hat{e}_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))

DF <- ddf$DF
pddf3 <- p_base |>
  add_trace(
  type = "cone",
  x = ym1,
  y = xm1,
  z = zm1,
  u = dy1,
  v = dx1,
  w = dz1,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  cmin = 0,
  cmax = 1
) |>
  add_trace(
  type = "cone",
  x = ym2,
  y = xm2,
  z = zm2,
  u = dy2,
  v = dx2,
  w = dz2,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  cmin = 0,
  cmax = 1
) |>
    add_trace(data = DF,
            x = ~y, 
            y = ~x, 
            z = ~z, 
            type = "scatter3d",
            mode = "lines",  
            line = list(color = "rgb(0,0,200)", width = gsw),
            showlegend = FALSE) |>
  add_trace(x = rep(DF$y, each = 3), 
            y = rep(DF$x, each = 3), 
            z = unlist(lapply(DF$z, function(zj) c(0, zj, NA))),
            type = "scatter3d", 
            mode = "lines",
            line = list(color = "gray", width = 0.5),
            showlegend = FALSE) |>
  config(mathjax = 'cdn') |>
  plotly::layout(title = list(text = TeX("g''"), y = 0.8), 
                 font = list(family = "Palatino"),
                 scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              yaxis = list(title = list(text = "y", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              zaxis = list(title = list(text = "z", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
                   aspectratio = list(x = 2, 
                                 y = 2, 
                                 z = 2),
                   camera = list(eye = list(x = x_eye, 
                                       y = y_eye, 
                                       z = z_eye),
                            center = list(x = 0, 
                                          y = 0, 
                                          z = 0)),
                   annotations = list(
                     
             list(
               x = e1_ini_y, y = e1_ini_x, z = e1_ini_z,
               text = TeX("v_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = 0, y = 0, z = 0,
               text = TeX("v"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = e2_ini_y, y = e2_ini_x, z = e2_ini_z,
               text = TeX("v_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym1, y = xm1, z = zm1,
               text = TeX("e_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym2, y = xm2, z = zm2,
               text = TeX("\\hat{e}_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))

DF <- dddf$DF
pdddf3 <- p_base |>
  add_trace(
  type = "cone",
  x = ym1,
  y = xm1,
  z = zm1,
  u = dy1,
  v = dx1,
  w = dz1,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  cmin = 0,
  cmax = 1
) |>
  add_trace(
  type = "cone",
  x = ym2,
  y = xm2,
  z = zm2,
  u = dy2,
  v = dx2,
  w = dz2,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  cmin = 0,
  cmax = 1
) |>
    add_trace(data = DF,
            x = ~y, 
            y = ~x, 
            z = ~z, 
            type = "scatter3d",
            mode = "lines",  
            line = list(color = "rgb(0,0,200)", width = gsw),
            showlegend = FALSE) |>
  add_trace(x = rep(DF$y, each = 3), 
            y = rep(DF$x, each = 3), 
            z = unlist(lapply(DF$z, function(zj) c(0, zj, NA))),
            type = "scatter3d", 
            mode = "lines",
            line = list(color = "gray", width = 0.5),
            showlegend = FALSE) |>
  config(mathjax = 'cdn') |>
  plotly::layout(title = list(text = TeX("g'''"), y = 0.8), 
                 font = list(family = "Palatino"),
                 scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              yaxis = list(title = list(text = "y", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              zaxis = list(title = list(text = "z", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
                   aspectratio = list(x = 2, 
                                 y = 2, 
                                 z = 2),
                   camera = list(eye = list(x = x_eye, 
                                       y = y_eye, 
                                       z = z_eye),
                            center = list(x = 0, 
                                          y = 0, 
                                          z = 0)),
                   annotations = list(
                     
             list(
               x = e1_ini_y, y = e1_ini_x, z = e1_ini_z,
               text = TeX("v_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = 0, y = 0, z = 0,
               text = TeX("v"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = e2_ini_y, y = e2_ini_x, z = e2_ini_z,
               text = TeX("v_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym1, y = xm1, z = zm1,
               text = TeX("e_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym2, y = xm2, z = zm2,
               text = TeX("\\hat{e}_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))

save(pf3, file = here::here("data_files/pf3.Rdata"))
save(pdf3, file = here::here("data_files/pdf3.Rdata"))
save(pddf3, file = here::here("data_files/pddf3.Rdata"))
save(pdddf3, file = here::here("data_files/pdddf3.Rdata"))
load(here::here("data_files/pf3.Rdata"))
pf3

Figure 5: Function \(g = \{g_e\}_{e\in\mathcal{E}}\) given by \(g_{e_1}(\tau) = \tau^4\) and \(g_{\hat{e}_2}(\tau) = (\tau-(\ell_1+\ell_2))^4\).

load(here::here("data_files/pdf3.Rdata"))
pdf3

Figure 6: Function \(g' = \{g'_e\}_{e\in\mathcal{E}}\) given by \(g'_{e_1}(\tau) = 4\tau^3\) and \(g'_{\hat{e}_2}(\tau) = 4(\tau-(\ell_1+\ell_2))^3\).

load(here::here("data_files/pddf3.Rdata"))
pddf3

Figure 7: Function \(g'' = \{g''_e\}_{e\in\mathcal{E}}\) given by \(g''_{e_1}(\tau) = 12\tau^2\) and \(g''_{\hat{e}_2}(\tau) = 12(\tau-(\ell_1+\ell_2))^2\).

load(here::here("data_files/pdddf3.Rdata"))
pdddf3

Figure 8: Function \(g''' = \{g'''_e\}_{e\in\mathcal{E}}\) given by \(g'''_{e_1}(\tau) = 24\tau\) and \(g'''_{\hat{e}_2}(\tau) = 24(\tau-(\ell_1+\ell_2))\).

Figure 6 illustrates precisely the relation expressed in \(\eqref{eq:der_inv}\). That is, \(g'_{e_2}\) can be obtained by multiplying \(f'_{e_2}\) by \(-1\).

3 Even order derivatives are orientation-independent

We again apply the chain rule in \(\eqref{eq:der_inv}\) to obtain \[\begin{equation} g''_{e_2}(\tau) = \dfrac{d}{d\tau} ( - f'_{e_2}(t)) = - \dfrac{d}{dt} (f'_{e_2}(t)) \dfrac{dt}{d\tau} = f''_{e_2}(t), \end{equation}\] so that the second derivative does not change sign under a flip. See Figure 7. This means that even order derivatives are orientation-independent. In general, for the \(k\)-th derivative, we have \[\begin{equation} \dfrac{d^k}{d\tau^k}(g_{e_2}(\tau)) = (-1)^k\dfrac{d^k}{dt^k}(f_{e_2}(t)). \end{equation}\]

4 Additional plots

DF <- f_aux$DF
pf_aux <- p_base |>
  add_trace(
  type = "cone",
  x = ym1,
  y = xm1,
  z = zm1,
  u = dy1,
  v = dx1,
  w = dz1,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  cmin = 0,
  cmax = 1
) |>
  add_trace(
  type = "cone",
  x = ym2,
  y = xm2,
  z = zm2,
  u = dy2,
  v = dx2,
  w = dz2,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  cmin = 0,
  cmax = 1
) |>
    add_trace(data = DF,
            x = ~y, 
            y = ~x, 
            z = ~z, 
            type = "scatter3d",
            mode = "lines",  
            line = list(color = "rgb(0,0,200)", width = gsw),
            showlegend = FALSE) |>
  add_trace(x = rep(DF$y, each = 3), 
            y = rep(DF$x, each = 3), 
            z = unlist(lapply(DF$z, function(zj) c(0, zj, NA))),
            type = "scatter3d", 
            mode = "lines",
            line = list(color = "gray", width = 0.5),
            showlegend = FALSE) |>
  config(mathjax = 'cdn') |>
  plotly::layout(title = list(text = TeX("\\hat{f}"), y = 0.8),
                 font = list(family = "Palatino"),
                 scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              yaxis = list(title = list(text = "y", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              zaxis = list(title = list(text = "z", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
                   aspectratio = list(x = 2, 
                                 y = 2, 
                                 z = 2),
                   camera = list(eye = list(x = x_eye, 
                                       y = y_eye, 
                                       z = z_eye),
                            center = list(x = 0, 
                                          y = 0, 
                                          z = 0)),
                   annotations = list(
                     
             list(
               x = e1_ini_y, y = e1_ini_x, z = e1_ini_z,
               text = TeX("v_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = 0, y = 0, z = 0,
               text = TeX("v"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = e2_ini_y, y = e2_ini_x, z = e2_ini_z,
               text = TeX("v_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym1, y = xm1, z = zm1,
               text = TeX("e_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym2, y = xm2, z = zm2,
               text = TeX("\\hat{e}_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))
DF <- df_aux$DF
pdf_aux <- p_base |>
  add_trace(
  type = "cone",
  x = ym1,
  y = xm1,
  z = zm1,
  u = dy1,
  v = dx1,
  w = dz1,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  cmin = 0,
  cmax = 1
) |>
  add_trace(
  type = "cone",
  x = ym2,
  y = xm2,
  z = zm2,
  u = dy2,
  v = dx2,
  w = dz2,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  cmin = 0,
  cmax = 1
) |>
    add_trace(data = DF,
            x = ~y, 
            y = ~x, 
            z = ~z, 
            type = "scatter3d",
            mode = "lines",  
            line = list(color = "rgb(0,0,200)", width = gsw),
            showlegend = FALSE) |>
  add_trace(x = rep(DF$y, each = 3), 
            y = rep(DF$x, each = 3), 
            z = unlist(lapply(DF$z, function(zj) c(0, zj, NA))),
            type = "scatter3d", 
            mode = "lines",
            line = list(color = "gray", width = 0.5),
            showlegend = FALSE) |>
  config(mathjax = 'cdn') |>
  plotly::layout(title = list(text = TeX("\\hat{f}'"), y = 0.8),
                 font = list(family = "Palatino"),
                 scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              yaxis = list(title = list(text = "y", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              zaxis = list(title = list(text = "z", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
                   aspectratio = list(x = 2, 
                                 y = 2, 
                                 z = 2),
                   camera = list(eye = list(x = x_eye, 
                                       y = y_eye, 
                                       z = z_eye),
                            center = list(x = 0, 
                                          y = 0, 
                                          z = 0)),
                   annotations = list(
                     
             list(
               x = e1_ini_y, y = e1_ini_x, z = e1_ini_z,
               text = TeX("v_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = 0, y = 0, z = 0,
               text = TeX("v"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = e2_ini_y, y = e2_ini_x, z = e2_ini_z,
               text = TeX("v_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym1, y = xm1, z = zm1,
               text = TeX("e_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym2, y = xm2, z = zm2,
               text = TeX("\\hat{e}_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))

DF <- ddf_aux$DF
pddf_aux <- p_base |>
  add_trace(
  type = "cone",
  x = ym1,
  y = xm1,
  z = zm1,
  u = dy1,
  v = dx1,
  w = dz1,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  cmin = 0,
  cmax = 1
) |>
  add_trace(
  type = "cone",
  x = ym2,
  y = xm2,
  z = zm2,
  u = dy2,
  v = dx2,
  w = dz2,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  cmin = 0,
  cmax = 1
) |>
    add_trace(data = DF,
            x = ~y, 
            y = ~x, 
            z = ~z, 
            type = "scatter3d",
            mode = "lines",  
            line = list(color = "rgb(0,0,200)", width = gsw),
            showlegend = FALSE) |>
  add_trace(x = rep(DF$y, each = 3), 
            y = rep(DF$x, each = 3), 
            z = unlist(lapply(DF$z, function(zj) c(0, zj, NA))),
            type = "scatter3d", 
            mode = "lines",
            line = list(color = "gray", width = 0.5),
            showlegend = FALSE) |>
  config(mathjax = 'cdn') |>
  plotly::layout(title = list(text = TeX("\\hat{f}''"), y = 0.8),
                 font = list(family = "Palatino"),
                 scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              yaxis = list(title = list(text = "y", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              zaxis = list(title = list(text = "z", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
                   aspectratio = list(x = 2, 
                                 y = 2, 
                                 z = 2),
                   camera = list(eye = list(x = x_eye, 
                                       y = y_eye, 
                                       z = z_eye),
                            center = list(x = 0, 
                                          y = 0, 
                                          z = 0)),
                   annotations = list(
                     
             list(
               x = e1_ini_y, y = e1_ini_x, z = e1_ini_z,
               text = TeX("v_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = 0, y = 0, z = 0,
               text = TeX("v"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = e2_ini_y, y = e2_ini_x, z = e2_ini_z,
               text = TeX("v_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym1, y = xm1, z = zm1,
               text = TeX("e_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym2, y = xm2, z = zm2,
               text = TeX("\\hat{e}_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))

DF <- dddf_aux$DF
pdddf_aux <- p_base |>
  add_trace(
  type = "cone",
  x = ym1,
  y = xm1,
  z = zm1,
  u = dy1,
  v = dx1,
  w = dz1,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  cmin = 0,
  cmax = 1
) |>
  add_trace(
  type = "cone",
  x = ym2,
  y = xm2,
  z = zm2,
  u = dy2,
  v = dx2,
  w = dz2,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  cmin = 0,
  cmax = 1
) |>
    add_trace(data = DF,
            x = ~y, 
            y = ~x, 
            z = ~z, 
            type = "scatter3d",
            mode = "lines",  
            line = list(color = "rgb(0,0,200)", width = gsw),
            showlegend = FALSE) |>
  add_trace(x = rep(DF$y, each = 3), 
            y = rep(DF$x, each = 3), 
            z = unlist(lapply(DF$z, function(zj) c(0, zj, NA))),
            type = "scatter3d", 
            mode = "lines",
            line = list(color = "gray", width = 0.5),
            showlegend = FALSE) |>
  config(mathjax = 'cdn') |>
  plotly::layout(title = list(text = TeX("\\hat{f}'''"), y = 0.8),
                 font = list(family = "Palatino"),
                 scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              yaxis = list(title = list(text = "y", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              zaxis = list(title = list(text = "z", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
                   aspectratio = list(x = 2, 
                                 y = 2, 
                                 z = 2),
                   camera = list(eye = list(x = x_eye, 
                                       y = y_eye, 
                                       z = z_eye),
                            center = list(x = 0, 
                                          y = 0, 
                                          z = 0)),
                   annotations = list(
                     
             list(
               x = e1_ini_y, y = e1_ini_x, z = e1_ini_z,
               text = TeX("v_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = 0, y = 0, z = 0,
               text = TeX("v"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = e2_ini_y, y = e2_ini_x, z = e2_ini_z,
               text = TeX("v_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym1, y = xm1, z = zm1,
               text = TeX("e_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym2, y = xm2, z = zm2,
               text = TeX("\\hat{e}_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))



save(pf_aux, file = here::here("data_files/pf_aux.Rdata"))
save(pdf_aux, file = here::here("data_files/pdf_aux.Rdata"))
save(pddf_aux, file = here::here("data_files/pddf_aux.Rdata"))
save(pdddf_aux, file = here::here("data_files/pdddf_aux.Rdata"))
load(here::here("data_files/pf.Rdata"))
pf

Figure 9: Function \(f = \{f_e\}_{e\in\mathcal{E}}\) given by \(f_{e_1}(t) = t^4\) and \(f_{e_2}(t) = (t+\ell_1)^4\).

load(here::here("data_files/pf_aux.Rdata"))
pf_aux

Figure 10: Function \(\hat{f} = \{f_e\}_{e\in\mathcal{E}}\) given by \(f_{e_1}(t) = t^4\) and \(f_{\hat{e}_2}(t) = (t+\ell_1)^4\).

load(here::here("data_files/pf3.Rdata"))
pf3

Figure 11: Function \(g = \{g_e\}_{e\in\mathcal{E}}\) given by \(g_{e_1}(\tau) = \tau^4\) and \(g_{\hat{e}_2}(\tau) = (\tau-(\ell_1+\ell_2))^4\).

5 For \(\hat{f}\)

load(here::here("data_files/pf_aux.Rdata"))
pf_aux

Figure 12: Function \(\hat{f} = \{f_e\}_{e\in\mathcal{E}}\) given by \(f_{e_1}(t) = t^4\) and \(f_{\hat{e}_2}(t) = (t+\ell_1)^4\).

load(here::here("data_files/pdf_aux.Rdata"))
pdf_aux

Figure 13: Function \(\hat{f}' = \{f'_e\}_{e\in\mathcal{E}}\) given by \(f'_{e_1}(t) = 4t^3\) and \(f'_{\hat{e}_2}(t) = 4(t+\ell_1)^3\).

load(here::here("data_files/pddf_aux.Rdata"))
pddf_aux

Figure 14: Function \(\hat{f}'' = \{f''_e\}_{e\in\mathcal{E}}\) given by \(f''_{e_1}(t) = 12t^2\) and \(f''_{\hat{e}_2}(t) = 12(t+\ell_1)^2\).

load(here::here("data_files/pdddf_aux.Rdata"))
pdddf_aux

Figure 15: Function \(\hat{f}''' = \{f'''_e\}_{e\in\mathcal{E}}\) given by \(f'''_{e_1}(t) = 24t\) and \(f'''_{\hat{e}_2}(t) = 24(t+\ell_1)\).

6 References

grateful::cite_packages(output = "paragraph", out.dir = ".")

We used R version 4.5.2 (R Core Team 2025a) and the following R packages: cowplot v. 1.2.0 (Wilke 2025), ggmap v. 4.0.2 (Kahle and Wickham 2013), ggpubr v. 0.6.3 (Kassambara 2026), ggtext v. 0.1.2 (Wilke and Wiernik 2022), glue v. 1.8.0 (Hester and Bryan 2024), grid v. 4.5.2 (R Core Team 2025b), here v. 1.0.1 (Müller 2020), htmltools v. 0.5.8.1 (Cheng et al. 2024), INLA v. 25.11.22 (Rue, Martino, and Chopin 2009; Lindgren, Rue, and Lindström 2011; Martins et al. 2013; Lindgren and Rue 2015; De Coninck et al. 2016; Rue et al. 2017; Verbosio et al. 2017; Bakka et al. 2018; Kourounis, Fuchs, and Schenk 2018), inlabru v. 2.13.0 (Yuan et al. 2017; Bachl et al. 2019), knitr v. 1.50 (Xie 2014, 2015, 2025), latex2exp v. 0.9.8 (Meschiari 2026), Matrix v. 1.7.3 (Bates, Maechler, and Jagan 2025), MetricGraph v. 1.5.0.9000 (Bolin, Simas, and Wallin 2023a, 2023b, 2024, 2025; Bolin et al. 2024), OpenStreetMap v. 0.4.1 (Fellows and Stotz 2025), patchwork v. 1.3.1 (Pedersen 2025), plotly v. 4.11.0 (Sievert 2020), plotrix v. 3.8.14 (J 2006), renv v. 1.1.7 (Ushey and Wickham 2026), reshape2 v. 1.4.4 (Wickham 2007), reticulate v. 1.44.1 (Ushey, Allaire, and Tang 2025), rmarkdown v. 2.30 (Xie, Allaire, and Grolemund 2018; Xie, Dervieux, and Riederer 2020; Allaire et al. 2025), rSPDE v. 2.5.2.9000 (Bolin and Kirchner 2020; Bolin and Simas 2023; Bolin, Simas, and Xiong 2024), scales v. 1.4.0 (Wickham, Pedersen, and Seidel 2025), sf v. 1.1.0 (E. Pebesma 2018; E. Pebesma and Bivand 2023), slackr v. 3.4.0 (Kaye et al. 2025), sp v. 2.2.1 (E. J. Pebesma and Bivand 2005; Bivand, Pebesma, and Gomez-Rubio 2013), tidyverse v. 2.0.0 (Wickham et al. 2019), tikzDevice v. 0.12.6 (Sharpsteen and Bracken 2023), viridis v. 0.6.5 (Garnier et al. 2024), xaringanExtra v. 0.8.0 (Aden-Buie and Warkentin 2024).

Aden-Buie, Garrick, and Matthew T. Warkentin. 2024. xaringanExtra: Extras and Extensions for xaringan Slides. https://doi.org/10.32614/CRAN.package.xaringanExtra.
Allaire, JJ, Yihui Xie, Christophe Dervieux, Jonathan McPherson, Javier Luraschi, Kevin Ushey, Aron Atkins, et al. 2025. rmarkdown: Dynamic Documents for r. https://github.com/rstudio/rmarkdown.
Bachl, Fabian E., Finn Lindgren, David L. Borchers, and Janine B. Illian. 2019. inlabru: An R Package for Bayesian Spatial Modelling from Ecological Survey Data.” Methods in Ecology and Evolution 10: 760–66. https://doi.org/10.1111/2041-210X.13168.
Bakka, Haakon, Håvard Rue, Geir-Arne Fuglstad, Andrea I. Riebler, David Bolin, Janine Illian, Elias Krainski, Daniel P. Simpson, and Finn K. Lindgren. 2018. “Spatial Modelling with INLA: A Review.” WIRES (Invited Extended Review) xx (Feb): xx–. http://arxiv.org/abs/1802.06350.
Bates, Douglas, Martin Maechler, and Mikael Jagan. 2025. Matrix: Sparse and Dense Matrix Classes and Methods. https://doi.org/10.32614/CRAN.package.Matrix.
Bivand, Roger S., Edzer Pebesma, and Virgilio Gomez-Rubio. 2013. Applied Spatial Data Analysis with R, Second Edition. Springer, NY. https://asdar-book.org/.
Bolin, David, and Kristin Kirchner. 2020. “The Rational SPDE Approach for Gaussian Random Fields with General Smoothness.” Journal of Computational and Graphical Statistics 29 (2): 274–85. https://doi.org/10.1080/10618600.2019.1665537.
Bolin, David, Mihály Kovács, Vivek Kumar, and Alexandre B. Simas. 2024. “Regularity and Numerical Approximation of Fractional Elliptic Differential Equations on Compact Metric Graphs.” Mathematics of Computation 93 (349): 2439–72. https://doi.org/10.1090/mcom/3929.
Bolin, David, and Alexandre B. Simas. 2023. rSPDE: Rational Approximations of Fractional Stochastic Partial Differential Equations. https://CRAN.R-project.org/package=rSPDE.
Bolin, David, Alexandre B. Simas, and Jonas Wallin. 2023a. MetricGraph: Random Fields on Metric Graphs. https://CRAN.R-project.org/package=MetricGraph.
———. 2023b. “Statistical Inference for Gaussian Whittle-Matérn Fields on Metric Graphs.” arXiv Preprint arXiv:2304.10372. https://doi.org/10.48550/arXiv.2304.10372.
———. 2024. “Gaussian Whittle-Matérn Fields on Metric Graphs.” Bernoulli 30 (2): 1611–39. https://doi.org/10.3150/23-BEJ1647.
———. 2025. “Markov Properties of Gaussian Random Fields on Compact Metric Graphs.” Bernoulli. https://doi.org/10.48550/arXiv.2304.03190.
Bolin, David, Alexandre B. Simas, and Zhen Xiong. 2024. “Covariance-Based Rational Approximations of Fractional SPDEs for Computationally Efficient Bayesian Inference.” Journal of Computational and Graphical Statistics 33 (1): 64–74. https://doi.org/10.1080/10618600.2023.2231051.
Cheng, Joe, Carson Sievert, Barret Schloerke, Winston Chang, Yihui Xie, and Jeff Allen. 2024. htmltools: Tools for HTML. https://github.com/rstudio/htmltools.
De Coninck, Arne, Bernard De Baets, Drosos Kourounis, Fabio Verbosio, Olaf Schenk, Steven Maenhout, and Jan Fostier. 2016. Needles: Toward Large-Scale Genomic Prediction with Marker-by-Environment Interaction.” Genetics 203 (1): 543–55. https://doi.org/10.1534/genetics.115.179887.
Fellows, Ian, and Jan-Peter Stotz. 2025. OpenStreetMap: Access to Open Street Map Raster Images. https://doi.org/10.32614/CRAN.package.OpenStreetMap.
Garnier, Simon, Ross, Noam, Rudis, Robert, Camargo, et al. 2024. viridis(Lite) - Colorblind-Friendly Color Maps for r. https://doi.org/10.5281/zenodo.4679423.
Hester, Jim, and Jennifer Bryan. 2024. glue: Interpreted String Literals. https://glue.tidyverse.org/.
J, Lemon. 2006. Plotrix: A Package in the Red Light District of r.” R-News 6 (4): 8–12.
Kahle, David, and Hadley Wickham. 2013. ggmap: Spatial Visualization with Ggplot2.” The R Journal 5 (1): 144–61. https://journal.r-project.org/archive/2013-1/kahle-wickham.pdf.
Kassambara, Alboukadel. 2026. ggpubr: ggplot2 Based Publication Ready Plots. https://doi.org/10.32614/CRAN.package.ggpubr.
Kaye, Matt, Bob Rudis, Andrie de Vries, and Jonathan Sidi. 2025. slackr: Send Messages, Images, r Objects and Files to Slack Channels/Users. https://github.com/mrkaye97/slackr.
Kourounis, D., A. Fuchs, and O. Schenk. 2018. “Towards the Next Generation of Multiperiod Optimal Power Flow Solvers.” IEEE Transactions on Power Systems PP (99): 1–10. https://doi.org/10.1109/TPWRS.2017.2789187.
Lindgren, Finn, and Håvard Rue. 2015. “Bayesian Spatial Modelling with R-INLA.” Journal of Statistical Software 63 (19): 1–25. http://www.jstatsoft.org/v63/i19/.
Lindgren, Finn, Håvard Rue, and Johan Lindström. 2011. “An Explicit Link Between Gaussian Fields and Gaussian Markov Random Fields: The Stochastic Partial Differential Equation Approach (with Discussion).” Journal of the Royal Statistical Society B 73 (4): 423–98.
Martins, Thiago G., Daniel Simpson, Finn Lindgren, and Håvard Rue. 2013. “Bayesian Computing with INLA: New Features.” Computational Statistics and Data Analysis 67: 68–83.
Meschiari, Stefano. 2026. Latex2exp: Use LaTeX Expressions in Plots. https://doi.org/10.32614/CRAN.package.latex2exp.
Müller, Kirill. 2020. here: A Simpler Way to Find Your Files. https://doi.org/10.32614/CRAN.package.here.
Pebesma, Edzer. 2018. Simple Features for R: Standardized Support for Spatial Vector Data.” The R Journal 10 (1): 439–46. https://doi.org/10.32614/RJ-2018-009.
Pebesma, Edzer J., and Roger Bivand. 2005. “Classes and Methods for Spatial Data in R.” R News 5 (2): 9–13. https://CRAN.R-project.org/doc/Rnews/.
Pebesma, Edzer, and Roger Bivand. 2023. Spatial Data Science: With applications in R. Chapman and Hall/CRC. https://doi.org/10.1201/9780429459016.
Pedersen, Thomas Lin. 2025. patchwork: The Composer of Plots. https://doi.org/10.32614/CRAN.package.patchwork.
R Core Team. 2025a. R: A Language and Environment for Statistical Computing. Vienna, Austria: R Foundation for Statistical Computing. https://www.R-project.org/.
———. 2025b. R: A Language and Environment for Statistical Computing. Vienna, Austria: R Foundation for Statistical Computing. https://www.R-project.org/.
Rue, Håvard, Sara Martino, and Nicholas Chopin. 2009. “Approximate Bayesian Inference for Latent Gaussian Models Using Integrated Nested Laplace Approximations (with Discussion).” Journal of the Royal Statistical Society B 71: 319–92.
Rue, Håvard, Andrea I. Riebler, Sigrunn H. Sørbye, Janine B. Illian, Daniel P. Simpson, and Finn K. Lindgren. 2017. “Bayesian Computing with INLA: A Review.” Annual Reviews of Statistics and Its Applications 4 (March): 395–421. http://arxiv.org/abs/1604.00860.
Sharpsteen, Charlie, and Cameron Bracken. 2023. tikzDevice: R Graphics Output in LaTeX Format. https://doi.org/10.32614/CRAN.package.tikzDevice.
Sievert, Carson. 2020. Interactive Web-Based Data Visualization with r, Plotly, and Shiny. Chapman; Hall/CRC. https://plotly-r.com.
Ushey, Kevin, JJ Allaire, and Yuan Tang. 2025. reticulate: Interface to Python. https://doi.org/10.32614/CRAN.package.reticulate.
Ushey, Kevin, and Hadley Wickham. 2026. renv: Project Environments. https://doi.org/10.32614/CRAN.package.renv.
Verbosio, Fabio, Arne De Coninck, Drosos Kourounis, and Olaf Schenk. 2017. “Enhancing the Scalability of Selected Inversion Factorization Algorithms in Genomic Prediction.” Journal of Computational Science 22 (Supplement C): 99–108. https://doi.org/10.1016/j.jocs.2017.08.013.
Wickham, Hadley. 2007. “Reshaping Data with the reshape Package.” Journal of Statistical Software 21 (12): 1–20. http://www.jstatsoft.org/v21/i12/.
Wickham, Hadley, Mara Averick, Jennifer Bryan, Winston Chang, Lucy D’Agostino McGowan, Romain François, Garrett Grolemund, et al. 2019. “Welcome to the tidyverse.” Journal of Open Source Software 4 (43): 1686. https://doi.org/10.21105/joss.01686.
Wickham, Hadley, Thomas Lin Pedersen, and Dana Seidel. 2025. scales: Scale Functions for Visualization. https://scales.r-lib.org.
Wilke, Claus O. 2025. cowplot: Streamlined Plot Theme and Plot Annotations for ggplot2. https://doi.org/10.32614/CRAN.package.cowplot.
Wilke, Claus O., and Brenton M. Wiernik. 2022. ggtext: Improved Text Rendering Support for ggplot2. https://doi.org/10.32614/CRAN.package.ggtext.
Xie, Yihui. 2014. knitr: A Comprehensive Tool for Reproducible Research in R.” In Implementing Reproducible Computational Research, edited by Victoria Stodden, Friedrich Leisch, and Roger D. Peng. Chapman; Hall/CRC.
———. 2015. Dynamic Documents with R and Knitr. 2nd ed. Boca Raton, Florida: Chapman; Hall/CRC. https://yihui.org/knitr/.
———. 2025. knitr: A General-Purpose Package for Dynamic Report Generation in R. https://yihui.org/knitr/.
Xie, Yihui, J. J. Allaire, and Garrett Grolemund. 2018. R Markdown: The Definitive Guide. Boca Raton, Florida: Chapman; Hall/CRC. https://bookdown.org/yihui/rmarkdown.
Xie, Yihui, Christophe Dervieux, and Emily Riederer. 2020. R Markdown Cookbook. Boca Raton, Florida: Chapman; Hall/CRC. https://bookdown.org/yihui/rmarkdown-cookbook.
Yuan, Yuan, Bachl, Fabian E., Lindgren, Finn, Borchers, et al. 2017. “Point Process Models for Spatio-Temporal Distance Sampling Data from a Large-Scale Survey of Blue Whales.” Ann. Appl. Stat. 11 (4): 2270–97. https://doi.org/10.1214/17-AOAS1078.
LS0tCnRpdGxlOiAiSW50cmluc2ljIGNvbnRpbnVpdHkgaXMgZXF1aXZhbGVudCB0byB0aGUgS2lyY2hob2ZmIGNvbmRpdGlvbiBmb3IgZGVncmVlLXR3byB2ZXJ0aWNlcyIKZGF0ZTogIkxhc3QgbW9kaWZpZWQ6IGByIGZvcm1hdChTeXMudGltZSgpLCAnJWQtJW0tJVkuJylgIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIG1hdGhqYXg6ICJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL21hdGhqYXhAMy9lczUvdGV4LW1tbC1jaHRtbC5qcyIKICAgIGhpZ2hsaWdodDogcHlnbWVudHMKICAgIHRoZW1lOiBmbGF0bHkKICAgIGNvZGVfZm9sZGluZzogaGlkZSAjIGNsYXNzLnNvdXJjZSA9ICJmb2xkLWhpZGUiIHRvIGhpZGUgY29kZSBhbmQgYWRkIGEgYnV0dG9uIHRvIHNob3cgaXQKICAgIGRmX3ByaW50OiBwYWdlZAogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogdHJ1ZQogICAgICBzbW9vdGhfc2Nyb2xsOiB0cnVlCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjc3M6IHZpc3VhbC5jc3MKYWx3YXlzX2FsbG93X2h0bWw6IHRydWUKYmlibGlvZ3JhcGh5OiAKICAtIHJlZmVyZW5jZXMuYmliCiAgLSBncmF0ZWZ1bC1yZWZzLmJpYgpoZWFkZXItaW5jbHVkZXM6CiAgLSBcbmV3Y29tbWFuZHtcYXJ9e1xtYXRoYmJ7Un19CiAgLSBcbmV3Y29tbWFuZHtcbGxhdn1bMV17XGxlZnRceyMxXHJpZ2h0XH19CiAgLSBcbmV3Y29tbWFuZHtccGFyZX1bMV17XGxlZnQoIzFccmlnaHQpfQogIC0gXG5ld2NvbW1hbmR7XE5jYWx9e1xtYXRoY2Fse059fQogIC0gXG5ld2NvbW1hbmR7XFZjYWx9e1xtYXRoY2Fse1Z9fQogIC0gXG5ld2NvbW1hbmR7XEVjYWx9e1xtYXRoY2Fse0V9fQogIC0gXG5ld2NvbW1hbmR7XFdjYWx9e1xtYXRoY2Fse1d9fQogIC0gXG5ld2NvbW1hbmR7XGFsbW9zdGV2ZXJ5d2hlcmV9e1xtYXRocm17YS5lLn1cO30KLS0tCgpHbyBiYWNrIHRvIHRoZSBbQ29udGVudHNdKGFib3V0Lmh0bWwpIHBhZ2UuCgo8ZGl2IHN0eWxlPSJjb2xvcjogIzJjM2U1MDsgdGV4dC1hbGlnbjogcmlnaHQ7Ij4KKioqKioqKiogIAo8c3Ryb25nPlByZXNzIFNob3cgdG8gcmV2ZWFsIHRoZSBjb2RlIGNodW5rcy48L3N0cm9uZz4gIAoKKioqKioqKioKPC9kaXY+CgoKYGBge3J9CiMgQ3JlYXRlIGEgY2xpcGJvYXJkIGJ1dHRvbiBvbiB0aGUgcmVuZGVyZWQgSFRNTCBwYWdlCnNvdXJjZShoZXJlOjpoZXJlKCJjbGlwYm9hcmQuUiIpKTsgY2xpcGJvYXJkCiMgU2V0IHNlZWQgZm9yIHJlcHJvZHVjaWJpbGl0eQpzZXQuc2VlZCgxOTgyKSAKIyBTZXQgZ2xvYmFsIG9wdGlvbnMgZm9yIGFsbCBjb2RlIGNodW5rcwprbml0cjo6b3B0c19jaHVuayRzZXQoCiAgIyBEaXNhYmxlIG1lc3NhZ2VzIHByaW50ZWQgYnkgUiBjb2RlIGNodW5rcwogIG1lc3NhZ2UgPSBGQUxTRSwgICAgCiAgIyBEaXNhYmxlIHdhcm5pbmdzIHByaW50ZWQgYnkgUiBjb2RlIGNodW5rcwogIHdhcm5pbmcgPSBGQUxTRSwgICAgCiAgIyBTaG93IFIgY29kZSB3aXRoaW4gY29kZSBjaHVua3MgaW4gb3V0cHV0CiAgZWNobyA9IFRSVUUsICAgICAgICAKICAjIEluY2x1ZGUgYm90aCBSIGNvZGUgYW5kIGl0cyByZXN1bHRzIGluIG91dHB1dAogIGluY2x1ZGUgPSBUUlVFLCAgICAgCiAgIyBFdmFsdWF0ZSBSIGNvZGUgY2h1bmtzCiAgZXZhbCA9IEZBTFNFLCAgICAgICAKICAjIEVuYWJsZSBjYWNoaW5nIG9mIFIgY29kZSBjaHVua3MgZm9yIGZhc3RlciByZW5kZXJpbmcKICBjYWNoZSA9IEZBTFNFLCAgICAgIAogICMgQWxpZ24gZmlndXJlcyBpbiB0aGUgY2VudGVyIG9mIHRoZSBvdXRwdXQKICBmaWcuYWxpZ24gPSAiY2VudGVyIiwKICAjIEVuYWJsZSByZXRpbmEgZGlzcGxheSBmb3IgaGlnaC1yZXNvbHV0aW9uIGZpZ3VyZXMKICByZXRpbmEgPSAyLAogICMgU2hvdyBlcnJvcnMgaW4gdGhlIG91dHB1dCBpbnN0ZWFkIG9mIHN0b3BwaW5nIHJlbmRlcmluZwogIGVycm9yID0gVFJVRSwKICAjIERvIG5vdCBjb2xsYXBzZSBjb2RlIGFuZCBvdXRwdXQgaW50byBhIHNpbmdsZSBibG9jawogIGNvbGxhcHNlID0gRkFMU0UKKQojIFN0YXJ0IHRoZSBmaWd1cmUgY291bnRlcgpmaWdfY291bnQgPC0gMAojIERlZmluZSB0aGUgY2FwdGlvbmVyIGZ1bmN0aW9uCmNhcHRpb25lciA8LSBmdW5jdGlvbihjYXB0aW9uKSB7CiAgZmlnX2NvdW50IDw8LSBmaWdfY291bnQgKyAxCiAgcGFzdGUwKCJGaWd1cmUgIiwgZmlnX2NvdW50LCAiOiAiLCBjYXB0aW9uKQp9CgpgYGAKCmBgYHtyLCBldmFsID0gVFJVRX0KbGlicmFyeShNZXRyaWNHcmFwaCkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHJlc2hhcGUyKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHZpcmlkaXMpCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KHBhdGNod29yaykKbGlicmFyeShzbGFja3IpCnNvdXJjZSgia2V5cy5SIikKc2xhY2tyX3NldHVwKHRva2VuID0gdG9rZW4pICMgdG9rZW4gY29tZXMgZnJvbSBrZXlzLlIKYGBgCgoKYGBge3J9CmNhcHR1cmUub3V0cHV0KAogIGtuaXRyOjpwdXJsKGhlcmU6OmhlcmUoImZ1bmN0aW9uYWxpdHkxLlJtZCIpLCBvdXRwdXQgPSBoZXJlOjpoZXJlKCJmdW5jdGlvbmFsaXR5MS5SIikpLAogIGZpbGUgPSBoZXJlOjpoZXJlKCJvbGQvcHVybF9sb2cudHh0IikKKQpzb3VyY2UoaGVyZTo6aGVyZSgiZnVuY3Rpb25hbGl0eTEuUiIpKQpgYGAKCgoKYGBge3J9CnhfZXllIDwtIDUjOAp5X2V5ZSA8LSAtMSMtMgp6X2V5ZSA8LSAyIzMKYGBgCgpMZXQgJFxHYW1tYSA9IChcbWF0aGNhbHtWfSwgXG1hdGhjYWx7RX0pJCBiZSBhIG1ldHJpYyBncmFwaCB3aXRoIHZlcnRleCBzZXQgJFxtYXRoY2Fse1Z9ID0gXHt2XzEsIHYsIHZfMlx9JCBhbmQgZWRnZSBzZXQgJFxtYXRoY2Fse0V9ID0gXHtlXzEsIGVfMlx9JC4gQXNzdW1lIHRoYXQgdGhlIGVkZ2VzICRlXzEkIGFuZCAkZV8yJCBtZWV0IGF0IHRoZSB2ZXJ0ZXggJHYkLCBzbyB0aGF0ICR2JCBpcyB0aGVpciBjb21tb24gZW5kcG9pbnQuIEZvciBsYXRlciByZWZlcmVuY2UsIHdlIHJlY2FsbCB0aGUgS2lyY2hob2ZmIHZlcnRleCBjb25kaXRpb25zClxiZWdpbntlcXVhdGlvbn0KXGxhYmVse2VxOmtpcmNoaG9mZl9jb25kfQpcdGFnezF9CiAgIFxtYXRoY2Fse0t9KFxHYW1tYSkgPSAgXGxlZnRce2ZcaW4gQyhcR2FtbWEpXDtcbWlkZGxlfFw7IFxmb3JhbGwgdlxpbiBcbWF0aGNhbHtWfTpcOyBcc3VtX3tlXGluXG1hdGhjYWx7RX1fdn1ccGFydGlhbF9lIGYodik9MCBccmlnaHRcfSwKXGVuZHtlcXVhdGlvbn0Kd2hlcmUgJFxtYXRoY2Fse0V9X3YkIGRlbm90ZXMgdGhlIHNldCBvZiBlZGdlcyBpbmNpZGVudCB0byAkdiQsIGFuZApcYmVnaW57ZXF1YXRpb259ClxsYWJlbHtlcTpkaXJfZGVyfQpcdGFnezJ9CiAgICAgICAgXHBhcnRpYWxfZWYodikgPSAKICAgICAgICBcYmVnaW57Y2FzZXN9CiAgICAgICAgICAgIGYnX2UoMCksIFxxdWFkICZcdGV4dHtpZiB9dj0wLFxcCiAgICAgICAgICAgIC1mJ19lKFxlbGxfZSksIFxxdWFkICZcdGV4dHtpZiB9dj1cZWxsX2UuCiAgICAgICAgXGVuZHtjYXNlc30KXGVuZHtlcXVhdGlvbn0KCiMgQ29tcGF0aWJsZSBvcmllbnRhdGlvbgoKYGBge3J9CmFwcGx5X2VkZ2VfZnVuY3Rpb25zX2Zhc3QgPC0gZnVuY3Rpb24oZ3JhcGgsIGZfbGlzdCkgewogIAogIGlmIChsZW5ndGgoZl9saXN0KSAhPSBncmFwaCRuRSkgewogICAgc3RvcChzcHJpbnRmKAogICAgICAiTnVtYmVyIG9mIGZ1bmN0aW9ucyAoJWQpIG11c3QgZXF1YWwgbnVtYmVyIG9mIGVkZ2VzICglZCkuIiwKICAgICAgbGVuZ3RoKGZfbGlzdCksIGdyYXBoJG5FCiAgICApKQogIH0KICBWdEUgPC0gZ3JhcGgkbWVzaCRWdEUKICBlZGdlX2xlbmd0aHMgPC0gZ3JhcGgkZWRnZV9sZW5ndGhzCiAgCiAgZWRnZSAgIDwtIFZ0RVssMV0KICBzX25vcm0gPC0gVnRFWywyXQogIHNfdHJ1ZSA8LSBzX25vcm0gKiBlZGdlX2xlbmd0aHNbZWRnZV0KCiAgb3V0IDwtIHNhcHBseShzZXFfbGVuKG5yb3coVnRFKSksIGZ1bmN0aW9uKGkpIGZfbGlzdFtbZWRnZVtpXV1dKHNfdHJ1ZVtpXSkpCiAgcmV0dXJuKG91dCkKfQpgYGAKCgpXZSBmaXJzdCBhc3N1bWUgdGhhdCB0aGUgZWRnZXMgYXJlIGNvbXBhdGlibHkgb3JpZW50ZWQsIG5hbWVseSAkZV8xID0gWzAsXGVsbF8xXSQgYW5kICRlXzI9WzAsXGVsbF8yXSQsIHdpdGggdGhlIHZlcnRleCAkdiQgY29ycmVzcG9uZGluZyB0byAkXGVsbF8xJCBvbiAkZV8xJCBhbmQgJDAkIG9uICRlXzIkLiBXaXRoIHRoaXMgcGFyYW1ldHJpemF0aW9uLCB3ZSBjYW4gZ2x1ZSB0aGUgdHdvIGVkZ2VzIGludG8gYSBzaW5nbGUgaW50ZXJ2YWwgJFtlXzEsZV8yXVxzaW1lcSBbMCxcZWxsXzErXGVsbF8yXSQgYW5kIHZpZXcgYSBmdW5jdGlvbiAkZiA9IFx7Zl97ZV8xfSxmX3tlXzJ9XH1caW4gQyhcR2FtbWEpJCBhcyBhIGZ1bmN0aW9uICRcaGF0e2Z9XGluIEMoWzAsXGVsbF8xK1xlbGxfMl0pJCBzbyB0aGF0ICRmX3tlXzF9KFxlbGxfMSkgPSBcaGF0e2Z9KHYpID0gZl97ZV8yfSgwKSQuIENvbnNpZGVyIHRoZSBmdW5jdGlvbiAkZiA9IFx7Zl97ZV8xfSxmX3tlXzJ9XH0kIGdpdmVuIGJ5ClxiZWdpbntlcXVhdGlvbip9CiAgICBcYmVnaW57Y2FzZXN9CiAgICAgICAgZl97ZV8xfSh0KSA9IHReNCwmIHRcaW5bMCxcZWxsXzFdLFxcCiAgICAgICAgZl97ZV8yfSh0KSA9ICh0K1xlbGxfMSleNCwmIHRcaW5bMCxcZWxsXzJdLgogICAgXGVuZHtjYXNlc30KXGVuZHtlcXVhdGlvbip9Ckl0cyBlZGdld2lzZSBkZXJpdmF0aXZlcyBhcmUgZ2l2ZW4gYnkKXGJlZ2lue2VxdWF0aW9uKn0KICAgIFxiZWdpbntjYXNlc30KICAgICAgICBmJ197ZV8xfSh0KSA9IDR0XjMsJiB0XGluWzAsXGVsbF8xXSxcXAogICAgICAgIGYnX3tlXzJ9KHQpID0gNCh0K1xlbGxfMSleMywmIHRcaW5bMCxcZWxsXzJdLgogICAgXGVuZHtjYXNlc30KXGVuZHtlcXVhdGlvbip9ClVuZGVyIHRoZSBhYm92ZSBpZGVudGlmaWNhdGlvbiwgJGYkIGNvcnJlc3BvbmRzIHRvIHRoZSBmdW5jdGlvbgpcYmVnaW57YWxpZ24qfQogICAgXGhhdHtmfSh0KSA9IHReNCxccXVhZCB0XGluWzAsXGVsbF8xICsgXGVsbF8yXSwKXGVuZHthbGlnbip9Cndob3NlIGRlcml2YXRpdmUgaXMKXGJlZ2lue2FsaWduKn0KICAgIFxoYXR7Zn0odCkgPSA0dF4zLFxxdWFkIHRcaW5bMCxcZWxsXzEgKyBcZWxsXzJdLgpcZW5ke2FsaWduKn0KSW4gcGFydGljdWxhciwgJFxoYXR7Zn0gXGluIENeMShbMCxcZWxsXzErXGVsbF8yXSkkLCBhbmQgdGhlcmVmb3JlICRmJCBoYXMgYSBjb250aW51b3VzIGZpcnN0IGRlcml2YXRpdmUgYWNyb3NzIHRoZSB2ZXJ0ZXggJHYkLiBTZWUgRmlndXJlIDIuIE1vcmVvdmVyLCB0aGUgZWRnZXdpc2UgZGVyaXZhdGl2ZXMgbXVzdCBhZ3JlZSBhdCAkdiQsIHRoYXQgaXMsIHdlIG11c3QgaGF2ZSAkZidfe2VfMX0oXGVsbF8xKSA9IFxoYXR7Zn0nKHYpID0gZidfe2VfMn0oMCkkLCB3aGljaCBpcyB0aGUgY2FzZSBzaW5jZQpcYmVnaW57YWxpZ24qfQogICAgZidfe2VfMX0oXGVsbF8xKSA9IDRcZWxsXzFeM1xxdWFkXHRleHR7IGFuZCB9XHF1YWQgIFxoYXR7Zn0nKHYpID0gXGhhdHtmfScoXGVsbF8xKT00XGVsbF8xXjNccXVhZCBcdGV4dHsgYW5kIH1ccXVhZCBmJ197ZV8yfSgwKSAgPSA0XGVsbF8xXjMuClxlbmR7YWxpZ24qfQpCeSB1c2luZyBcZXFyZWZ7ZXE6ZGlyX2Rlcn0sIHdlIGdldCB0aGF0IApcYmVnaW57YWxpZ24qfQogICAgICAgIFxwYXJ0aWFsX3tlXzF9Zih2KSA9IC1mJ197ZV8xfShcZWxsXzEpPS00XGVsbF8xXjNccXVhZFx0ZXh0eyBhbmQgfVxxdWFkIFxwYXJ0aWFsX3tlXzJ9Zih2KSA9IGYnX3tlXzJ9KDApPTRcZWxsXzFeMywKXGVuZHthbGlnbip9CmFuZCB0aGVyZWZvcmUsClxiZWdpbntlcXVhdGlvbn0KXHN1bV97ZSBcaW4gXG1hdGhjYWx7RX1fdn0gXHBhcnRpYWxfZSBmKHYpID1ccGFydGlhbF97ZV8xfWYodikgKyBccGFydGlhbF97ZV8yfWYodikgPSAtZidfe2VfMX0oXGVsbF8xKSArIGYnX3tlXzJ9KDApID0gLTRcZWxsXzFeMyArIDRcZWxsXzFeMyA9IDAsClxlbmR7ZXF1YXRpb259CndoaWNoIG1lYW5zIHRoYXQgJGYkIHNhdGlzZmllcyB0aGUgS2lyY2hob2ZmIHZlcnRleCBjb25kaXRpb25zIFxlcXJlZntlcTpraXJjaGhvZmZfY29uZH0gYXQgdmVydGV4ICR2JC4gVGhpcyBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdCB0aGF0ICRmJCBzYXRpc2ZpZXMgdGhlIEtpcmNoaG9mZiB2ZXJ0ZXggY29uZGl0aW9ucyBcZXFyZWZ7ZXE6a2lyY2hob2ZmX2NvbmR9IGF0IGFsbCB2ZXJ0aWNlcyAkdiQgd2l0aCAkXGRlZyh2KSA9MiQgaWYgYW5kIG9ubHkgaWYgJGYnJCBpcyBjb250aW51b3VzIGF0IGF0IGFsbCB2ZXJ0aWNlcyAkdiQgd2l0aCAkXGRlZyh2KSA9MiQuCgoKYGBge3J9CmggPSAwLjAxCmVsbDEgPC0gMQplbGwyIDwtIDAuNAplMSA8LSByYmluZChjKC1lbGwxLDApLCAjICh4LHkpID0gdW5kZXJsaW5lKGVfMSkgCiAgICAgICAgICAgIGMoMCwwKSkgICMgKHgseSkgPSBvdmVybGluZShlXzEpIAplMiA8LSByYmluZChjKDAsMCksCiAgICAgICAgICAgIGMoZWxsMiwwKSkKCmUxX2luaV94IDwtIC1lbGwxOyBlMV9pbmlfeSA8LSAwOyBlMV9pbmlfeiA8LSAwCmUxX2Zpbl94IDwtIDA7IGUxX2Zpbl95IDwtIDA7IGUxX2Zpbl96IDwtIDAKCiMgTWlkcG9pbnQKeG0xIDwtIChlMV9maW5feCArIGUxX2luaV94KS8yCnltMSA8LSAoZTFfZmluX3kgKyBlMV9pbmlfeSkvMgp6bTEgPC0gKGUxX2Zpbl96ICsgZTFfaW5pX3opLzIKCiMgRGlyZWN0aW9uIHZlY3RvcgpkeDEgPC0gZTFfZmluX3ggLSBlMV9pbmlfeApkeTEgPC0gZTFfZmluX3kgLSBlMV9pbmlfeQpkejEgPC0gZTFfZmluX3ogLSBlMV9pbmlfegoKZTJfaW5pX3ggPC0gMDsgZTJfaW5pX3kgPC0gMDsgZTJfaW5pX3ogPC0gMAplMl9maW5feCA8LSBlbGwyOyBlMl9maW5feSA8LSAwOyBlMl9maW5feiA8LSAwCgojIE1pZHBvaW50CnhtMiA8LSAoZTJfZmluX3ggKyBlMl9pbmlfeCkvMgp5bTIgPC0gKGUyX2Zpbl95ICsgZTJfaW5pX3kpLzIKem0yIDwtIChlMl9maW5feiArIGUyX2luaV96KS8yCgojIERpcmVjdGlvbiB2ZWN0b3IKZHgyIDwtIGUyX2Zpbl94IC0gZTJfaW5pX3gKZHkyIDwtIGUyX2Zpbl95IC0gZTJfaW5pX3kKZHoyIDwtIGUyX2Zpbl96IC0gZTJfaW5pX3oKCgpncmFwaCA8LSBtZXRyaWNfZ3JhcGgkbmV3KGVkZ2VzID0gbGlzdChlMSA9IGUxLCBlMiA9IGUyKSkKZ3JhcGgkYnVpbGRfbWVzaChoID0gaCkKYGBgCgoKYGBge3J9CmZlMSA8LSBmdW5jdGlvbih0KSB0XjQKZmUyIDwtIGZ1bmN0aW9uKHQpICh0ICsgZWxsMSleNAoKZGZlMSA8LSBmdW5jdGlvbih0KSA0KnReMwpkZmUyIDwtIGZ1bmN0aW9uKHQpIDQqKHQgKyBlbGwxKV4zCgpkZGZlMSA8LSBmdW5jdGlvbih0KSAxMip0XjIKZGRmZTIgPC0gZnVuY3Rpb24odCkgMTIqKHQgKyBlbGwxKV4yCgpkZGRmZTEgPC0gZnVuY3Rpb24odCkgMjQqdApkZGRmZTIgPC0gZnVuY3Rpb24odCkgMjQqKHQgKyBlbGwxKQoKZl9saXN0IDwtIGxpc3QoZmUxLCBmZTIpCmRmX2xpc3QgPC0gbGlzdChkZmUxLCBkZmUyKQpkZGZfbGlzdCA8LSBsaXN0KGRkZmUxLCBkZGZlMikKZGRkZl9saXN0IDwtIGxpc3QoZGRkZmUxLCBkZGRmZTIpCgpmX2xpc3RfYXV4IDwtIGZfbGlzdApkZl9saXN0X2F1eCA8LSBkZl9saXN0CmRkZl9saXN0X2F1eCA8LSBkZGZfbGlzdApkZGRmX2xpc3RfYXV4IDwtIGRkZGZfbGlzdAoKZiA8LSBhcHBseV9lZGdlX2Z1bmN0aW9uc19mYXN0KGdyYXBoLCBmX2xpc3QpCmRmIDwtIGFwcGx5X2VkZ2VfZnVuY3Rpb25zX2Zhc3QoZ3JhcGgsIGRmX2xpc3QpCmRkZiA8LSBhcHBseV9lZGdlX2Z1bmN0aW9uc19mYXN0KGdyYXBoLCBkZGZfbGlzdCkKZGRkZiA8LSBhcHBseV9lZGdlX2Z1bmN0aW9uc19mYXN0KGdyYXBoLCBkZGRmX2xpc3QpCmBgYAoKCgpgYGB7cn0Kc2l6ZXJlZiA8LSAwLjEKcGYgPC0gZ3JhcGgkcGxvdF9mdW5jdGlvbihYID0gZiwgdmVydGV4X3NpemUgPSBnc3csIGVkZ2Vfd2lkdGggPSBnc3csIGxpbmVfd2lkdGggPSBnc3csIHR5cGUgPSAicGxvdGx5IikgfD4gCiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMSwKICB5ID0geG0xLAogIHogPSB6bTEsCiAgdSA9IGR5MSwKICB2ID0gZHgxLAogIHcgPSBkejEsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJncmVlbiIsICJncmVlbiIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMiwKICB5ID0geG0yLAogIHogPSB6bTIsCiAgdSA9IGR5MiwKICB2ID0gZHgyLAogIHcgPSBkejIsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJncmVlbiIsICJncmVlbiIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgY29uZmlnKG1hdGhqYXggPSAnY2RuJykgfD4KICBwbG90bHk6OmxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IFRlWCgiZiIpLCB5ID0gMC44KSwKICAgICAgICAgICAgICAgICBmb250ID0gbGlzdChmYW1pbHkgPSAiUGFsYXRpbm8iKSwKICAgICAgICAgICAgICAgICBzY2VuZSA9IGxpc3QoeGF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gIngiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieSIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgIHpheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ6IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgICAgICBhc3BlY3RyYXRpbyA9IGxpc3QoeCA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAyKSwKICAgICAgICAgICAgICAgICAgIGNhbWVyYSA9IGxpc3QoZXllID0gbGlzdCh4ID0geF9leWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0geV9leWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gel9leWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyID0gbGlzdCh4ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDApKSwKICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zID0gbGlzdCgKICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTFfaW5pX3ksIHkgPSBlMV9pbmlfeCwgeiA9IGUxX2luaV96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSAwLCB5ID0gMCwgeiA9IDAsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInYiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMl9maW5feSwgeSA9IGUyX2Zpbl94LCB6ID0gZTJfZmluX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMSwgeSA9IHhtMSwgeiA9IHptMSwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiZV8xIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0yLCB5ID0geG0yLCB6ID0gem0yLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJlXzIiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSkKICAgICAgICAgICAgICAgICApKQoKcGRmIDwtIGdyYXBoJHBsb3RfZnVuY3Rpb24oWCA9IGRmLCB2ZXJ0ZXhfc2l6ZSA9IGdzdywgZWRnZV93aWR0aCA9IGdzdywgbGluZV93aWR0aCA9IGdzdywgdHlwZSA9ICJwbG90bHkiKSB8PiAKICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0xLAogIHkgPSB4bTEsCiAgeiA9IHptMSwKICB1ID0gZHkxLAogIHYgPSBkeDEsCiAgdyA9IGR6MSwKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoImdyZWVuIiwgImdyZWVuIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0yLAogIHkgPSB4bTIsCiAgeiA9IHptMiwKICB1ID0gZHkyLAogIHYgPSBkeDIsCiAgdyA9IGR6MiwKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoImdyZWVuIiwgImdyZWVuIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBjb25maWcobWF0aGpheCA9ICdjZG4nKSB8PgogIHBsb3RseTo6bGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gVGVYKCJmJyIpLCB5ID0gMC44KSwKICAgICAgICAgICAgICAgICBmb250ID0gbGlzdChmYW1pbHkgPSAiUGFsYXRpbm8iKSwKICAgICAgICAgICAgICAgICBzY2VuZSA9IGxpc3QoeGF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gIngiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieSIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgIHpheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ6IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgICAgICBhc3BlY3RyYXRpbyA9IGxpc3QoeCA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAyKSwKICAgICAgICAgICAgICAgICAgIGNhbWVyYSA9IGxpc3QoZXllID0gbGlzdCh4ID0geF9leWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0geV9leWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gel9leWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyID0gbGlzdCh4ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDApKSwKICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zID0gbGlzdCgKICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTFfaW5pX3ksIHkgPSBlMV9pbmlfeCwgeiA9IGUxX2luaV96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSAwLCB5ID0gMCwgeiA9IDAsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInYiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMl9maW5feSwgeSA9IGUyX2Zpbl94LCB6ID0gZTJfZmluX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMSwgeSA9IHhtMSwgeiA9IHptMSwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiZV8xIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0yLCB5ID0geG0yLCB6ID0gem0yLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJlXzIiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSkKICAgICAgICAgICAgICAgICApKQoKcGRkZiA8LSBncmFwaCRwbG90X2Z1bmN0aW9uKFggPSBkZGYsIHZlcnRleF9zaXplID0gZ3N3LCBlZGdlX3dpZHRoID0gZ3N3LCBsaW5lX3dpZHRoID0gZ3N3LCB0eXBlID0gInBsb3RseSIpIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMSwKICB5ID0geG0xLAogIHogPSB6bTEsCiAgdSA9IGR5MSwKICB2ID0gZHgxLAogIHcgPSBkejEsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJncmVlbiIsICJncmVlbiIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMiwKICB5ID0geG0yLAogIHogPSB6bTIsCiAgdSA9IGR5MiwKICB2ID0gZHgyLAogIHcgPSBkejIsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJncmVlbiIsICJncmVlbiIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgY29uZmlnKG1hdGhqYXggPSAnY2RuJykgfD4KICBwbG90bHk6OmxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IFRlWCgiZicnIiksIHkgPSAwLjgpLCAKICAgICAgICAgICAgICAgICBmb250ID0gbGlzdChmYW1pbHkgPSAiUGFsYXRpbm8iKSwKICAgICAgICAgICAgICAgICBzY2VuZSA9IGxpc3QoeGF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gIngiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieSIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgIHpheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ6IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgICAgICBhc3BlY3RyYXRpbyA9IGxpc3QoeCA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAyKSwKICAgICAgICAgICAgICAgICAgIGNhbWVyYSA9IGxpc3QoZXllID0gbGlzdCh4ID0geF9leWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0geV9leWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gel9leWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyID0gbGlzdCh4ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDApKSwKICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zID0gbGlzdCgKICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTFfaW5pX3ksIHkgPSBlMV9pbmlfeCwgeiA9IGUxX2luaV96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSAwLCB5ID0gMCwgeiA9IDAsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInYiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMl9maW5feSwgeSA9IGUyX2Zpbl94LCB6ID0gZTJfZmluX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMSwgeSA9IHhtMSwgeiA9IHptMSwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiZV8xIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0yLCB5ID0geG0yLCB6ID0gem0yLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJlXzIiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSkKICAgICAgICAgICAgICAgICApKQoKcGRkZGYgPC0gZ3JhcGgkcGxvdF9mdW5jdGlvbihYID0gZGRkZiwgdmVydGV4X3NpemUgPSBnc3csIGVkZ2Vfd2lkdGggPSBnc3csIGxpbmVfd2lkdGggPSBnc3csIHR5cGUgPSAicGxvdGx5IikgfD4gCiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMSwKICB5ID0geG0xLAogIHogPSB6bTEsCiAgdSA9IGR5MSwKICB2ID0gZHgxLAogIHcgPSBkejEsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJncmVlbiIsICJncmVlbiIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMiwKICB5ID0geG0yLAogIHogPSB6bTIsCiAgdSA9IGR5MiwKICB2ID0gZHgyLAogIHcgPSBkejIsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJncmVlbiIsICJncmVlbiIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgY29uZmlnKG1hdGhqYXggPSAnY2RuJykgfD4KICBwbG90bHk6OmxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IFRlWCgiZicnJyIpLCB5ID0gMC44KSwKICAgICAgICAgICAgICAgICBmb250ID0gbGlzdChmYW1pbHkgPSAiUGFsYXRpbm8iKSwKICAgICAgICAgICAgICAgICBzY2VuZSA9IGxpc3QoeGF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gIngiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieSIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgIHpheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ6IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgICAgICBhc3BlY3RyYXRpbyA9IGxpc3QoeCA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAyKSwKICAgICAgICAgICAgICAgICAgIGNhbWVyYSA9IGxpc3QoZXllID0gbGlzdCh4ID0geF9leWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0geV9leWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gel9leWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyID0gbGlzdCh4ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDApKSwKICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zID0gbGlzdCgKICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTFfaW5pX3ksIHkgPSBlMV9pbmlfeCwgeiA9IGUxX2luaV96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSAwLCB5ID0gMCwgeiA9IDAsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInYiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMl9maW5feSwgeSA9IGUyX2Zpbl94LCB6ID0gZTJfZmluX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMSwgeSA9IHhtMSwgeiA9IHptMSwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiZV8xIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0yLCB5ID0geG0yLCB6ID0gem0yLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJlXzIiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSkKICAgICAgICAgICAgICAgICApKQoKc2F2ZShwZiwgZmlsZSA9IGhlcmU6OmhlcmUoImRhdGFfZmlsZXMvcGYuUmRhdGEiKSkKc2F2ZShwZGYsIGZpbGUgPSBoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3BkZi5SZGF0YSIpKQpzYXZlKHBkZGYsIGZpbGUgPSBoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3BkZGYuUmRhdGEiKSkKc2F2ZShwZGRkZiwgZmlsZSA9IGhlcmU6OmhlcmUoImRhdGFfZmlsZXMvcGRkZGYuUmRhdGEiKSkKYGBgCgoKOjo6OiB7c3R5bGU9ImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogNDg1cHggNDg1cHggNDg1cHggNDg1cHg7IGdyaWQtY29sdW1uLWdhcDogMHB4OyJ9CgoKOjo6IHt9CgpgYGB7ciwgZXZhbCA9IFRSVUUsIGZpZy5oZWlnaHQgPSA3LCBvdXQud2lkdGggPSAiMTAwJSIsIGZpZy5jYXAgPSBjYXB0aW9uZXIoIkZ1bmN0aW9uICRmID0gXFx7Zl9lXFx9X3tlXFxpblxcbWF0aGNhbHtFfX0kIGdpdmVuIGJ5ICRmX3tlXzF9KHQpID0gdF40JCBhbmQgJGZfe2VfMn0odCkgPSAodCtcXGVsbF8xKV40JC4iKX0KbG9hZChoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3BmLlJkYXRhIikpCnBmCmBgYAoKOjo6CgoKOjo6IHt9CgpgYGB7ciwgZXZhbCA9IFRSVUUsIGZpZy5oZWlnaHQgPSA3LCBvdXQud2lkdGggPSAiMTAwJSIsIGZpZy5jYXAgPSBjYXB0aW9uZXIoIkZ1bmN0aW9uICRmJyA9IFxce2YnX2VcXH1fe2VcXGluXFxtYXRoY2Fse0V9fSQgZ2l2ZW4gYnkgJGYnX3tlXzF9KHQpID0gNHReMyQgYW5kICRmJ197ZV8yfSh0KSA9IDQodCtcXGVsbF8xKV4zJC4iKX0KbG9hZChoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3BkZi5SZGF0YSIpKQpwZGYKYGBgCgo6OjoKCgo6Ojoge30KCmBgYHtyLCBldmFsID0gVFJVRSwgZmlnLmhlaWdodCA9IDcsIG91dC53aWR0aCA9ICIxMDAlIiwgZmlnLmNhcCA9IGNhcHRpb25lcigiRnVuY3Rpb24gJGYnJyA9IFxce2YnJ19lXFx9X3tlXFxpblxcbWF0aGNhbHtFfX0kIGdpdmVuIGJ5ICRmJydfe2VfMX0odCkgPSAxMnReMiQgYW5kICRmJydfe2VfMn0odCkgPSAxMih0K1xcZWxsXzEpXjIkLiIpfQpsb2FkKGhlcmU6OmhlcmUoImRhdGFfZmlsZXMvcGRkZi5SZGF0YSIpKQpwZGRmCmBgYAoKOjo6CgoKOjo6IHt9CgpgYGB7ciwgZXZhbCA9IFRSVUUsIGZpZy5oZWlnaHQgPSA3LCBvdXQud2lkdGggPSAiMTAwJSIsIGZpZy5jYXAgPSBjYXB0aW9uZXIoIkZ1bmN0aW9uICRmJycnID0gXFx7ZicnJ19lXFx9X3tlXFxpblxcbWF0aGNhbHtFfX0kIGdpdmVuIGJ5ICRmJycnX3tlXzF9KHQpID0gMjR0JCBhbmQgJGYnJydfe2VfMn0odCkgPSAyNCh0K1xcZWxsXzEpJC4iKX0KbG9hZChoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3BkZGRmLlJkYXRhIikpCnBkZGRmCmBgYAoKCjo6OgoKOjo6OgoKCiMgSW5jb21wYXRpYmxlIG9yaWVudGF0aW9uCgoKCmBgYHtyfQpteV9hcHBseV9lZGdlX2Z1bmN0aW9ucyA8LSBmdW5jdGlvbihncmFwaCwgZl9saXN0LCBlbGwxLCBlbGwyLCBoKXsKICBsMV9tZXNoIDwtIHNlcSgwLCBlbGwxLCBieSA9IGgpCiAgbDJfbWVzaCA8LSBzZXEoMCwgZWxsMiwgYnkgPSBoKQogIGYxIDwtIGZfbGlzdFtbMV1dKGwxX21lc2gpCiAgZjIgPC0gZl9saXN0W1syXV0obDJfbWVzaCkKICBsMV9tZXNoX25vcm0gPC0gbDFfbWVzaC9lbGwxCiAgbDJfbWVzaF9ub3JtIDwtIGwyX21lc2gvZWxsMgogIFB0RTEgPC0gY2JpbmQocmVwKDEsIGxlbmd0aChsMV9tZXNoKSksIGwxX21lc2hfbm9ybSkKICBQdEUyIDwtIGNiaW5kKHJlcCgyLCBsZW5ndGgobDJfbWVzaCkpLCBsMl9tZXNoX25vcm0pCiAgWFkxIDwtIGdyYXBoJGNvb3JkaW5hdGVzKFB0RTEpCiAgWFkyIDwtIGdyYXBoJGNvb3JkaW5hdGVzKFB0RTIpCiAgREYxIDwtIGRhdGEuZnJhbWUoeCA9IFhZMVssMV0sIHkgPSBYWTFbLDJdLCB6ID0gZjEpCiAgREYyIDwtIGRhdGEuZnJhbWUoeCA9IFhZMlssMV0sIHkgPSBYWTJbLDJdLCB6ID0gZjIpCiAgREYgPC0gcmJpbmQoREYxLCByZXAoTkEsIDMpLCBERjIpCiAgcmV0dXJuKGxpc3QoREYgPSBERikpCn0KYGBgCgpOb3cgc3R1ZHkgdGhlIGNhc2Ugd2hlcmUgdGhlIGVkZ2VzIGFyZSBub3QgY29tcGF0aWJsZSBvcmllbnRlZC4gRm9yIHRoYXQsIHdlIGZsaXAgZWRnZSAkZV8yJCwgdGhhdCBpcywgJGVfMSA9IFswLFxlbGxfMV0kIGFuZCAkZV8yPVswLFxlbGxfMl0kIHdpdGggJHYkIGNvcnJlc3BvbmRpbmcgdG8gJFxlbGxfMSQgb24gJGVfMSQgYW5kICRcZWxsXzIkIG9uICRlXzIkLiBDb25zaWRlciB0aGUgZnVuY3Rpb24gJGcgPSBce2dfe2VfMX0sZ197ZV8yfVx9JCBnaXZlbiBieQpcYmVnaW57ZXF1YXRpb24qfQogICAgXGJlZ2lue2Nhc2VzfQogICAgICAgIGdfe2VfMX0oXHRhdSkgPSBcdGF1XjQsJiBcdGF1XGluWzAsXGVsbF8xXSxcXAogICAgICAgIGdfe2VfMn0oXHRhdSkgPSAoXHRhdS0oXGVsbF8xK1xlbGxfMikpXjQsJiBcdGF1XGluWzAsXGVsbF8yXS4KICAgIFxlbmR7Y2FzZXN9ClxlbmR7ZXF1YXRpb24qfQpJdHMgZWRnZXdpc2UgZGVyaXZhdGl2ZXMgYXJlIGdpdmVuIGJ5ClxiZWdpbntlcXVhdGlvbip9CiAgICBcYmVnaW57Y2FzZXN9CiAgICAgICAgZydfe2VfMX0oXHRhdSkgPSA0XHRhdV4zLCYgXHRhdVxpblswLFxlbGxfMV0sXFwKICAgICAgICBnJ197ZV8yfShcdGF1KSA9IDQoXHRhdS0oXGVsbF8xK1xlbGxfMikpXjMsJiBcdGF1XGluWzAsXGVsbF8yXS4KICAgIFxlbmR7Y2FzZXN9ClxlbmR7ZXF1YXRpb24qfQpUaGUgY29vcmRpbmF0ZXMgZGVyaXZhdGl2ZXMgYXQgJHYkIGFyZSBnaXZlbiBieQpcYmVnaW57ZXF1YXRpb259CmcnX3tlXzF9KFxlbGxfMSk9NFxlbGxfMV4zXHF1YWRcdGV4dHsgYW5kIH1ccXVhZCBnJ197ZV8yfShcZWxsXzIpPS00XGVsbF8xXjMuClxlbmR7ZXF1YXRpb259CkxldCB1cyBjaGVjayB0aGUgS2lyY2hob2ZmIHZlcnRleCBjb25kaXRpb25zIFxlcXJlZntlcTpraXJjaGhvZmZfY29uZH0gYXQgdmVydGV4ICR2JC4gQnkgdXNpbmcgXGVxcmVme2VxOmRpcl9kZXJ9LCB3ZSBnZXQgdGhhdCAKXGJlZ2lue2FsaWduKn0KICAgICAgICBccGFydGlhbF97ZV8xfWcodikgPSAtZydfe2VfMX0oXGVsbF8xKT0tNFxlbGxfMV4zXHF1YWRcdGV4dHsgYW5kIH1ccXVhZCBccGFydGlhbF97ZV8yfWcodikgPSAtZydfe2VfMn0oXGVsbF8yKT00XGVsbF8xXjMsClxlbmR7YWxpZ24qfQphbmQgdGhlcmVmb3JlLApcYmVnaW57ZXF1YXRpb259ClxsYWJlbHtlcTppbnZhcmlhbnRfY30KXHRhZ3szfQpcc3VtX3tlIFxpbiBcbWF0aGNhbHtFfV92fSBccGFydGlhbF9lIGcodikgPVxwYXJ0aWFsX3tlXzF9Zyh2KSArIFxwYXJ0aWFsX3tlXzJ9Zyh2KSA9IC1nJ197ZV8xfShcZWxsXzEpIC1nJ197ZV8yfShcZWxsXzIpID0gLTRcZWxsXzFeMyArIDRcZWxsXzFeMyA9IDAsClxlbmR7ZXF1YXRpb259CndoaWNoIHNob3dzIHRoYXQgJGckIHNhdGlzZmllcyB0aGUgS2lyY2hob2ZmIHZlcnRleCBjb25kaXRpb25zIFxlcXJlZntlcTpraXJjaGhvZmZfY29uZH0gYXQgdmVydGV4ICR2JC4gQXQgZmlyc3QgZ2xhbmNlLCB0aGUgZWRnZXdpc2UgZGVyaXZhdGl2ZSwgJGcnID0gXHtnJ197ZV8xfSxnJ197ZV8yfVx9JCBhcHBlYXJzIGRpc2NvbnRpbnVvdXMgYXQgJHYkLCB3aGljaCBtaWdodCBzZWVtIGNvbnRyYWRpY3RvcnkuIFNlZSBGaWd1cmUgNi4KClRvIGNsYXJpZnksIG9ic2VydmUgdGhhdCAkZiA9IGckIGFzIGZ1bmN0aW9ucyBvbiB0aGUgZ3JhcGguIEluZGVlZCwgYnkgcmVwYXJhbWV0cml6aW5nIGVkZ2UgJGVfMSQgYnkgJFx0YXU9dCQgYW5kIGVkZ2UgJGVfMiQgYnkgJFx0YXUgPSBcZWxsXzItdCQsIHdlIG9idGFpbiAkZl97ZV8xfT1nX3tlXzF9JCAgYW5kICRmX3tlXzJ9PWdfe2VfMn0kLiBNb3JlIHByZWNpc2VseSwKXGJlZ2lue2FsaWdufQpcbGFiZWx7ZXE6ZXFfb2ZfZl9nfQpcdGFnezR9CiAgICAgZ197ZV8xfShcdGF1KSA9IGdfe2VfMX0odCkgPSB0XjQgPSBmX3tlXzF9KHQpXHF1YWRcdGV4dHsgYW5kIH1ccXVhZCAgIGdfe2VfMn0oXHRhdSkgPSBnX3tlXzJ9KFxlbGxfMi10KSA9IChcZWxsXzItdC0oXGVsbF8xK1xlbGxfMikpXjQgPSAodCtcZWxsXzEpXjQ9IGZfe2VfMn0odCksClxlbmR7YWxpZ259ClRodXMgJGYkIGFuZCAkZyQgY29pbmNpZGUgb24gZWFjaCBlZGdlIGFmdGVyIHJlcGFyYW1ldHJpemF0aW9uLCBhbmQgZGVmaW5lIHRoZSBzYW1lIGZ1bmN0aW9uIG9uIHRoZSBncmFwaC4gVGhlIGFwcGFyZW50IGRpc2NvbnRpbnVpdHkgb2YgJGcnJCBhcmlzZXMgc29sZWx5IGZyb20gdGhlIHJldmVyc2VkIGNvb3JkaW5hdGUgb24gJGVfMiQuIFRoZSBmdW5jdGlvbiBpdHNlbGYgaGFzIG5vdCBjaGFuZ2VkLCBvbmx5IGl0cyBjb29yZGluYXRlIHJlcHJlc2VudGF0aW9uLgoKRnJvbSBcZXFyZWZ7ZXE6ZXFfb2ZfZl9nfSwgYnkgdGhlIGNoYWluIHJ1bGUsIHRoZSBmaXJzdCBkZXJpdmF0aXZlIHRyYW5zZm9ybXMgYXMKXGJlZ2lue2VxdWF0aW9ufQpcbGFiZWx7ZXE6ZGVyX2ludn0KXHRhZ3s1fQpnJ197ZV8yfShcdGF1KSA9IFxkZnJhY3tkfXtkXHRhdX0gKGdfe2VfMn0oXHRhdSkpID0gXGRmcmFje2R9e2RcdGF1fSAoZl97ZV8yfSh0KSkgPSBcZGZyYWN7ZH17ZHR9IChmX3tlXzJ9KHQpKSBcZGZyYWN7ZHR9e2RcdGF1fSA9IC0gXGRmcmFje2R9e2R0fSAoZl97ZV8yfSh0KSkgPSAtIGYnX3tlXzJ9KHQpClxlbmR7ZXF1YXRpb259CgpzbyB0aGUgY29vcmRpbmF0ZSBkZXJpdmF0aXZlIGNoYW5nZXMgc2lnbiB1bmRlciByZXBhcmFtZXRyaXphdGlvbi4gSGVuY2UsIGVkZ2V3aXNlIGRlcml2YXRpdmVzIGFyZSBub3QgaW52YXJpYW50IHVuZGVyIG9yaWVudGF0aW9uIGNoYW5nZXMuIEJ5IGNvbnRyYXN0LCB0aGUgb3V0d2FyZCBkZXJpdmF0aXZlICRccGFydGlhbF9lIGcodikkIGlzIGludmFyaWFudCwgYW5kIGlzIHRoZXJlZm9yZSB0aGUgY29ycmVjdCBpbnRyaW5zaWMgcXVhbnRpdHkgdG8gY2hlY2sgdGhlIEtpcmNoaG9mZiBjb25kaXRpb24uCgpJbiB0aGUgY29tcGF0aWJsZSBvcmllbnRhdGlvbiBjYXNlLCAkZidfe2VfMX0oXGVsbF8xKSA9IGYnX3tlXzJ9KDApJCwgc28gdGhlIGNvb3JkaW5hdGUgZGVyaXZhdGl2ZXMgbWF0Y2guIEluIHRoZSBmbGlwcGVkIG9yaWVudGF0aW9uIGNhc2UsICRnJ197ZV8xfShcZWxsXzEpIFxuZXEgZydfe2VfMn0oXGVsbF8yKSQsIGJ1dCB0aGlzIG1pc21hdGNoIGlzIHB1cmVseSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXZlcnNlZCBwYXJhbWV0cml6YXRpb24uIFRoZSBjb3JyZWN0IGludmFyaWFudCBjb21wYXJpc29uIGlzIFxlcXJlZntlcTppbnZhcmlhbnRfY30sIHdoaWNoIGRlbW9uc3RyYXRlcyB0aGF0IHRoZSBLaXJjaGhvZmYgY29uZGl0aW9uIGlzIGludHJpbnNpYyBhbmQgaW5kZXBlbmRlbnQgb2YgZWRnZSBwYXJhbWV0cml6YXRpb24uCgpJbiBjb25jbHVzaW9uLCB0aGUgYXBwYXJlbnQgY29udHJhZGljdGlvbiBhcmlzZXMgb25seSB3aGVuIGNvbXBhcmluZyBjb29yZGluYXRlIGRlcml2YXRpdmVzIHdpdGggb3Bwb3NpdGUgb3JpZW50YXRpb25zLCB3aGljaCBpcyBub3QgZ2VvbWV0cmljYWxseSBtZWFuaW5nZnVsLiBDb250aW51aXR5IG9mIHRoZSBkZXJpdmF0aXZlIGF0IGEgdmVydGV4IG11c3QgYmUgaW50ZXJwcmV0ZWQgaW50cmluc2ljYWxseTogYXQgYSBkZWdyZWUtdHdvIHZlcnRleCwgdGhpcyBpbnRyaW5zaWMgY29udGludWl0eSBpcyBlcXVpdmFsZW50IHRvIHRoZSBLaXJjaGhvZmYgY29uZGl0aW9uLgoKCgpgYGB7cn0KZTIgPC0gZTJbMjoxLF0KZ3JhcGggPC0gbWV0cmljX2dyYXBoJG5ldyhlZGdlcyA9IGxpc3QoZTEgPSBlMSwgZTIgPSBlMikpCmdyYXBoJGJ1aWxkX21lc2goaCA9IGgpCmBgYAoKCmBgYHtyfQplMV9pbmlfeCA8LSAtZWxsMTsgZTFfaW5pX3kgPC0gMDsgZTFfaW5pX3ogPC0gMAplMV9maW5feCA8LSAwOyBlMV9maW5feSA8LSAwOyBlMV9maW5feiA8LSAwCgojIE1pZHBvaW50CnhtMSA8LSAoZTFfZmluX3ggKyBlMV9pbmlfeCkvMgp5bTEgPC0gKGUxX2Zpbl95ICsgZTFfaW5pX3kpLzIKem0xIDwtIChlMV9maW5feiArIGUxX2luaV96KS8yCgojIERpcmVjdGlvbiB2ZWN0b3IKZHgxIDwtIGUxX2Zpbl94IC0gZTFfaW5pX3gKZHkxIDwtIGUxX2Zpbl95IC0gZTFfaW5pX3kKZHoxIDwtIGUxX2Zpbl96IC0gZTFfaW5pX3oKCmUyX2luaV94IDwtIGVsbDI7IGUyX2luaV95IDwtIDA7IGUyX2luaV96IDwtIDAKZTJfZmluX3ggPC0gMDsgZTJfZmluX3kgPC0gMDsgZTJfZmluX3ogPC0gMAoKIyBNaWRwb2ludAp4bTIgPC0gKGUyX2Zpbl94ICsgZTJfaW5pX3gpLzIKeW0yIDwtIChlMl9maW5feSArIGUyX2luaV95KS8yCnptMiA8LSAoZTJfZmluX3ogKyBlMl9pbmlfeikvMgoKIyBEaXJlY3Rpb24gdmVjdG9yCmR4MiA8LSBlMl9maW5feCAtIGUyX2luaV94CmR5MiA8LSBlMl9maW5feSAtIGUyX2luaV95CmR6MiA8LSBlMl9maW5feiAtIGUyX2luaV96CmBgYAoKYGBge3J9CmZlMSA8LSBmdW5jdGlvbih0KSB0XjQKZmUyIDwtIGZ1bmN0aW9uKHQpICh0IC0gKGVsbDEgKyBlbGwyKSleNAoKZGZlMSA8LSBmdW5jdGlvbih0KSA0KnReMwpkZmUyIDwtIGZ1bmN0aW9uKHQpIDQqKHQgLSAoZWxsMSArIGVsbDIpKV4zCgpkZGZlMSA8LSBmdW5jdGlvbih0KSAxMip0XjIKZGRmZTIgPC0gZnVuY3Rpb24odCkgMTIqKHQgLSAoZWxsMSArIGVsbDIpKV4yCgpkZGRmZTEgPC0gZnVuY3Rpb24odCkgMjQqdApkZGRmZTIgPC0gZnVuY3Rpb24odCkgMjQqKHQgLSAoZWxsMSArIGVsbDIpKQoKZl9saXN0IDwtIGxpc3QoZmUxLCBmZTIpCmRmX2xpc3QgPC0gbGlzdChkZmUxLCBkZmUyKQpkZGZfbGlzdCA8LSBsaXN0KGRkZmUxLCBkZGZlMikKZGRkZl9saXN0IDwtIGxpc3QoZGRkZmUxLCBkZGRmZTIpCgpmIDwtIG15X2FwcGx5X2VkZ2VfZnVuY3Rpb25zKGdyYXBoLCBmX2xpc3QsIGVsbDEsIGVsbDIsIGgpCmRmIDwtIG15X2FwcGx5X2VkZ2VfZnVuY3Rpb25zKGdyYXBoLCBkZl9saXN0LCBlbGwxLCBlbGwyLCBoKQpkZGYgPC0gbXlfYXBwbHlfZWRnZV9mdW5jdGlvbnMoZ3JhcGgsIGRkZl9saXN0LCBlbGwxLCBlbGwyLCBoKQpkZGRmIDwtIG15X2FwcGx5X2VkZ2VfZnVuY3Rpb25zKGdyYXBoLCBkZGRmX2xpc3QsIGVsbDEsIGVsbDIsIGgpCgpmX2F1eCA8LSBteV9hcHBseV9lZGdlX2Z1bmN0aW9ucyhncmFwaCwgZl9saXN0X2F1eCwgZWxsMSwgZWxsMiwgaCkKZGZfYXV4IDwtIG15X2FwcGx5X2VkZ2VfZnVuY3Rpb25zKGdyYXBoLCBkZl9saXN0X2F1eCwgZWxsMSwgZWxsMiwgaCkKZGRmX2F1eCA8LSBteV9hcHBseV9lZGdlX2Z1bmN0aW9ucyhncmFwaCwgZGRmX2xpc3RfYXV4LCBlbGwxLCBlbGwyLCBoKQpkZGRmX2F1eCA8LSBteV9hcHBseV9lZGdlX2Z1bmN0aW9ucyhncmFwaCwgZGRkZl9saXN0X2F1eCwgZWxsMSwgZWxsMiwgaCkKYGBgCgoKYGBge3J9CnBfYmFzZSA8LSBncmFwaCRwbG90X2Z1bmN0aW9uKFggPSByZXAoMCwgbnJvdyhncmFwaCRtZXNoJFZ0RSkpLCB2ZXJ0ZXhfc2l6ZSA9IGdzdywgbGluZV9jb2xvciA9ICJibGFjayIsIGVkZ2Vfd2lkdGggPSBnc3csIGxpbmVfd2lkdGggPSBnc3csIHR5cGUgPSAicGxvdGx5IikKREYgPC0gZiRERgpwZjMgPC0gcF9iYXNlIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMSwKICB5ID0geG0xLAogIHogPSB6bTEsCiAgdSA9IGR5MSwKICB2ID0gZHgxLAogIHcgPSBkejEsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJyZWQiLCAicmVkIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0yLAogIHkgPSB4bTIsCiAgeiA9IHptMiwKICB1ID0gZHkyLAogIHYgPSBkeDIsCiAgdyA9IGR6MiwKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoInJlZCIsICJyZWQiKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogICAgYWRkX3RyYWNlKGRhdGEgPSBERiwKICAgICAgICAgICAgeCA9IH55LCAKICAgICAgICAgICAgeSA9IH54LCAKICAgICAgICAgICAgeiA9IH56LCAKICAgICAgICAgICAgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICBtb2RlID0gImxpbmVzIiwgIAogICAgICAgICAgICBsaW5lID0gbGlzdChjb2xvciA9ICJyZ2IoMCwwLDIwMCkiLCB3aWR0aCA9IGdzdyksCiAgICAgICAgICAgIHNob3dsZWdlbmQgPSBGQUxTRSkgfD4KICBhZGRfdHJhY2UoeCA9IHJlcChERiR5LCBlYWNoID0gMyksIAogICAgICAgICAgICB5ID0gcmVwKERGJHgsIGVhY2ggPSAzKSwgCiAgICAgICAgICAgIHogPSB1bmxpc3QobGFwcGx5KERGJHosIGZ1bmN0aW9uKHpqKSBjKDAsIHpqLCBOQSkpKSwKICAgICAgICAgICAgdHlwZSA9ICJzY2F0dGVyM2QiLCAKICAgICAgICAgICAgbW9kZSA9ICJsaW5lcyIsCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gImdyYXkiLCB3aWR0aCA9IDAuNSksCiAgICAgICAgICAgIHNob3dsZWdlbmQgPSBGQUxTRSkgfD4KICBjb25maWcobWF0aGpheCA9ICdjZG4nKSB8PgogIHBsb3RseTo6bGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gVGVYKCJnIiksIHkgPSAwLjgpLAogICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGZhbWlseSA9ICJQYWxhdGlubyIpLAogICAgICAgICAgICAgICAgIHNjZW5lID0gbGlzdCh4YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieCIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ5IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgemF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInoiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICAgICAgIGFzcGVjdHJhdGlvID0gbGlzdCh4ID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDIpLAogICAgICAgICAgICAgICAgICAgY2FtZXJhID0gbGlzdChleWUgPSBsaXN0KHggPSB4X2V5ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSB5X2V5ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSB6X2V5ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIgPSBsaXN0KHggPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMCkpLAogICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSBsaXN0KAogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMV9pbmlfeSwgeSA9IGUxX2luaV94LCB6ID0gZTFfaW5pX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IDAsIHkgPSAwLCB6ID0gMCwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUyX2luaV95LCB5ID0gZTJfaW5pX3gsIHogPSBlMl9pbmlfeiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0xLCB5ID0geG0xLCB6ID0gem0xLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJlXzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTIsIHkgPSB4bTIsIHogPSB6bTIsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoIlxcaGF0e2V9XzIiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSkKICAgICAgICAgICAgICAgICApKQoKREYgPC0gZGYkREYKcGRmMyA8LSBwX2Jhc2UgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0xLAogIHkgPSB4bTEsCiAgeiA9IHptMSwKICB1ID0gZHkxLAogIHYgPSBkeDEsCiAgdyA9IGR6MSwKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoInJlZCIsICJyZWQiKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTIsCiAgeSA9IHhtMiwKICB6ID0gem0yLAogIHUgPSBkeTIsCiAgdiA9IGR4MiwKICB3ID0gZHoyLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygicmVkIiwgInJlZCIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgICBhZGRfdHJhY2UoZGF0YSA9IERGLAogICAgICAgICAgICB4ID0gfnksIAogICAgICAgICAgICB5ID0gfngsIAogICAgICAgICAgICB6ID0gfnosIAogICAgICAgICAgICB0eXBlID0gInNjYXR0ZXIzZCIsCiAgICAgICAgICAgIG1vZGUgPSAibGluZXMiLCAgCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gInJnYigwLDAsMjAwKSIsIHdpZHRoID0gZ3N3KSwKICAgICAgICAgICAgc2hvd2xlZ2VuZCA9IEZBTFNFKSB8PgogIGFkZF90cmFjZSh4ID0gcmVwKERGJHksIGVhY2ggPSAzKSwgCiAgICAgICAgICAgIHkgPSByZXAoREYkeCwgZWFjaCA9IDMpLCAKICAgICAgICAgICAgeiA9IHVubGlzdChsYXBwbHkoREYkeiwgZnVuY3Rpb24oemopIGMoMCwgemosIE5BKSkpLAogICAgICAgICAgICB0eXBlID0gInNjYXR0ZXIzZCIsIAogICAgICAgICAgICBtb2RlID0gImxpbmVzIiwKICAgICAgICAgICAgbGluZSA9IGxpc3QoY29sb3IgPSAiZ3JheSIsIHdpZHRoID0gMC41KSwKICAgICAgICAgICAgc2hvd2xlZ2VuZCA9IEZBTFNFKSB8PgogIGNvbmZpZyhtYXRoamF4ID0gJ2NkbicpIHw+CiAgcGxvdGx5OjpsYXlvdXQodGl0bGUgPSBsaXN0KHRleHQgPSBUZVgoImcnIiksIHkgPSAwLjgpLAogICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGZhbWlseSA9ICJQYWxhdGlubyIpLAogICAgICAgICAgICAgICAgIHNjZW5lID0gbGlzdCh4YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieCIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ5IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgemF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInoiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICAgICAgIGFzcGVjdHJhdGlvID0gbGlzdCh4ID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDIpLAogICAgICAgICAgICAgICAgICAgY2FtZXJhID0gbGlzdChleWUgPSBsaXN0KHggPSB4X2V5ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSB5X2V5ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSB6X2V5ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIgPSBsaXN0KHggPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMCkpLAogICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSBsaXN0KAogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMV9pbmlfeSwgeSA9IGUxX2luaV94LCB6ID0gZTFfaW5pX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IDAsIHkgPSAwLCB6ID0gMCwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUyX2luaV95LCB5ID0gZTJfaW5pX3gsIHogPSBlMl9pbmlfeiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0xLCB5ID0geG0xLCB6ID0gem0xLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJlXzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTIsIHkgPSB4bTIsIHogPSB6bTIsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoIlxcaGF0e2V9XzIiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSkKICAgICAgICAgICAgICAgICApKQoKREYgPC0gZGRmJERGCnBkZGYzIDwtIHBfYmFzZSB8PgogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTEsCiAgeSA9IHhtMSwKICB6ID0gem0xLAogIHUgPSBkeTEsCiAgdiA9IGR4MSwKICB3ID0gZHoxLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygicmVkIiwgInJlZCIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMiwKICB5ID0geG0yLAogIHogPSB6bTIsCiAgdSA9IGR5MiwKICB2ID0gZHgyLAogIHcgPSBkejIsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJyZWQiLCAicmVkIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICAgIGFkZF90cmFjZShkYXRhID0gREYsCiAgICAgICAgICAgIHggPSB+eSwgCiAgICAgICAgICAgIHkgPSB+eCwgCiAgICAgICAgICAgIHogPSB+eiwgCiAgICAgICAgICAgIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgICAgICAgICAgbW9kZSA9ICJsaW5lcyIsICAKICAgICAgICAgICAgbGluZSA9IGxpc3QoY29sb3IgPSAicmdiKDAsMCwyMDApIiwgd2lkdGggPSBnc3cpLAogICAgICAgICAgICBzaG93bGVnZW5kID0gRkFMU0UpIHw+CiAgYWRkX3RyYWNlKHggPSByZXAoREYkeSwgZWFjaCA9IDMpLCAKICAgICAgICAgICAgeSA9IHJlcChERiR4LCBlYWNoID0gMyksIAogICAgICAgICAgICB6ID0gdW5saXN0KGxhcHBseShERiR6LCBmdW5jdGlvbih6aikgYygwLCB6aiwgTkEpKSksCiAgICAgICAgICAgIHR5cGUgPSAic2NhdHRlcjNkIiwgCiAgICAgICAgICAgIG1vZGUgPSAibGluZXMiLAogICAgICAgICAgICBsaW5lID0gbGlzdChjb2xvciA9ICJncmF5Iiwgd2lkdGggPSAwLjUpLAogICAgICAgICAgICBzaG93bGVnZW5kID0gRkFMU0UpIHw+CiAgY29uZmlnKG1hdGhqYXggPSAnY2RuJykgfD4KICBwbG90bHk6OmxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IFRlWCgiZycnIiksIHkgPSAwLjgpLCAKICAgICAgICAgICAgICAgICBmb250ID0gbGlzdChmYW1pbHkgPSAiUGFsYXRpbm8iKSwKICAgICAgICAgICAgICAgICBzY2VuZSA9IGxpc3QoeGF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gIngiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieSIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgIHpheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ6IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgICAgICBhc3BlY3RyYXRpbyA9IGxpc3QoeCA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAyKSwKICAgICAgICAgICAgICAgICAgIGNhbWVyYSA9IGxpc3QoZXllID0gbGlzdCh4ID0geF9leWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0geV9leWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gel9leWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyID0gbGlzdCh4ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDApKSwKICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zID0gbGlzdCgKICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTFfaW5pX3ksIHkgPSBlMV9pbmlfeCwgeiA9IGUxX2luaV96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSAwLCB5ID0gMCwgeiA9IDAsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInYiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMl9pbmlfeSwgeSA9IGUyX2luaV94LCB6ID0gZTJfaW5pX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMSwgeSA9IHhtMSwgeiA9IHptMSwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiZV8xIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0yLCB5ID0geG0yLCB6ID0gem0yLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJcXGhhdHtlfV8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIikpCiAgICAgICAgICAgICAgICAgKSkKCkRGIDwtIGRkZGYkREYKcGRkZGYzIDwtIHBfYmFzZSB8PgogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTEsCiAgeSA9IHhtMSwKICB6ID0gem0xLAogIHUgPSBkeTEsCiAgdiA9IGR4MSwKICB3ID0gZHoxLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygicmVkIiwgInJlZCIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMiwKICB5ID0geG0yLAogIHogPSB6bTIsCiAgdSA9IGR5MiwKICB2ID0gZHgyLAogIHcgPSBkejIsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJyZWQiLCAicmVkIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICAgIGFkZF90cmFjZShkYXRhID0gREYsCiAgICAgICAgICAgIHggPSB+eSwgCiAgICAgICAgICAgIHkgPSB+eCwgCiAgICAgICAgICAgIHogPSB+eiwgCiAgICAgICAgICAgIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgICAgICAgICAgbW9kZSA9ICJsaW5lcyIsICAKICAgICAgICAgICAgbGluZSA9IGxpc3QoY29sb3IgPSAicmdiKDAsMCwyMDApIiwgd2lkdGggPSBnc3cpLAogICAgICAgICAgICBzaG93bGVnZW5kID0gRkFMU0UpIHw+CiAgYWRkX3RyYWNlKHggPSByZXAoREYkeSwgZWFjaCA9IDMpLCAKICAgICAgICAgICAgeSA9IHJlcChERiR4LCBlYWNoID0gMyksIAogICAgICAgICAgICB6ID0gdW5saXN0KGxhcHBseShERiR6LCBmdW5jdGlvbih6aikgYygwLCB6aiwgTkEpKSksCiAgICAgICAgICAgIHR5cGUgPSAic2NhdHRlcjNkIiwgCiAgICAgICAgICAgIG1vZGUgPSAibGluZXMiLAogICAgICAgICAgICBsaW5lID0gbGlzdChjb2xvciA9ICJncmF5Iiwgd2lkdGggPSAwLjUpLAogICAgICAgICAgICBzaG93bGVnZW5kID0gRkFMU0UpIHw+CiAgY29uZmlnKG1hdGhqYXggPSAnY2RuJykgfD4KICBwbG90bHk6OmxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IFRlWCgiZycnJyIpLCB5ID0gMC44KSwgCiAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoZmFtaWx5ID0gIlBhbGF0aW5vIiksCiAgICAgICAgICAgICAgICAgc2NlbmUgPSBsaXN0KHhheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ4IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInkiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICB6YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieiIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgICAgICAgYXNwZWN0cmF0aW8gPSBsaXN0KHggPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMiksCiAgICAgICAgICAgICAgICAgICBjYW1lcmEgPSBsaXN0KGV5ZSA9IGxpc3QoeCA9IHhfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHlfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IHpfZXllKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciA9IGxpc3QoeCA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAwKSksCiAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucyA9IGxpc3QoCiAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUxX2luaV95LCB5ID0gZTFfaW5pX3gsIHogPSBlMV9pbmlfeiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8xIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gMCwgeSA9IDAsIHogPSAwLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2IiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTJfaW5pX3ksIHkgPSBlMl9pbmlfeCwgeiA9IGUyX2luaV96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzIiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTEsIHkgPSB4bTEsIHogPSB6bTEsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoImVfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMiwgeSA9IHhtMiwgeiA9IHptMiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiXFxoYXR7ZX1fMiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpKQogICAgICAgICAgICAgICAgICkpCgpzYXZlKHBmMywgZmlsZSA9IGhlcmU6OmhlcmUoImRhdGFfZmlsZXMvcGYzLlJkYXRhIikpCnNhdmUocGRmMywgZmlsZSA9IGhlcmU6OmhlcmUoImRhdGFfZmlsZXMvcGRmMy5SZGF0YSIpKQpzYXZlKHBkZGYzLCBmaWxlID0gaGVyZTo6aGVyZSgiZGF0YV9maWxlcy9wZGRmMy5SZGF0YSIpKQpzYXZlKHBkZGRmMywgZmlsZSA9IGhlcmU6OmhlcmUoImRhdGFfZmlsZXMvcGRkZGYzLlJkYXRhIikpCmBgYAoKCgoKCgoKCgo6Ojo6IHtzdHlsZT0iZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiA0ODVweCA0ODVweCA0ODVweCA0ODVweDsgZ3JpZC1jb2x1bW4tZ2FwOiAwcHg7In0KCgo6Ojoge30KCmBgYHtyLCBldmFsPSBUUlVFLCBmaWcuaGVpZ2h0ID0gNywgb3V0LndpZHRoID0gIjEwMCUiLCBmaWcuY2FwID0gY2FwdGlvbmVyKCJGdW5jdGlvbiAkZyA9IFxce2dfZVxcfV97ZVxcaW5cXG1hdGhjYWx7RX19JCBnaXZlbiBieSAkZ197ZV8xfShcXHRhdSkgPSBcXHRhdV40JCBhbmQgJGdfe1xcaGF0e2V9XzJ9KFxcdGF1KSA9IChcXHRhdS0oXFxlbGxfMStcXGVsbF8yKSleNCQuIil9CmxvYWQoaGVyZTo6aGVyZSgiZGF0YV9maWxlcy9wZjMuUmRhdGEiKSkKcGYzCmBgYAoKOjo6CgoKOjo6IHt9CgpgYGB7ciwgZXZhbD0gVFJVRSwgZmlnLmhlaWdodCA9IDcsIG91dC53aWR0aCA9ICIxMDAlIiwgZmlnLmNhcCA9IGNhcHRpb25lcigiRnVuY3Rpb24gJGcnID0gXFx7ZydfZVxcfV97ZVxcaW5cXG1hdGhjYWx7RX19JCBnaXZlbiBieSAkZydfe2VfMX0oXFx0YXUpID0gNFxcdGF1XjMkIGFuZCAkZydfe1xcaGF0e2V9XzJ9KFxcdGF1KSA9IDQoXFx0YXUtKFxcZWxsXzErXFxlbGxfMikpXjMkLiIpfQpsb2FkKGhlcmU6OmhlcmUoImRhdGFfZmlsZXMvcGRmMy5SZGF0YSIpKQpwZGYzCmBgYAoKOjo6CgoKOjo6IHt9CgpgYGB7ciwgZXZhbD0gVFJVRSwgZmlnLmhlaWdodCA9IDcsIG91dC53aWR0aCA9ICIxMDAlIiwgZmlnLmNhcCA9IGNhcHRpb25lcigiRnVuY3Rpb24gJGcnJyA9IFxce2cnJ19lXFx9X3tlXFxpblxcbWF0aGNhbHtFfX0kIGdpdmVuIGJ5ICRnJydfe2VfMX0oXFx0YXUpID0gMTJcXHRhdV4yJCBhbmQgJGcnJ197XFxoYXR7ZX1fMn0oXFx0YXUpID0gMTIoXFx0YXUtKFxcZWxsXzErXFxlbGxfMikpXjIkLiIpfQpsb2FkKGhlcmU6OmhlcmUoImRhdGFfZmlsZXMvcGRkZjMuUmRhdGEiKSkKcGRkZjMKYGBgCgo6OjoKCgo6Ojoge30KCmBgYHtyLCBldmFsPSBUUlVFLCBmaWcuaGVpZ2h0ID0gNywgb3V0LndpZHRoID0gIjEwMCUiLCBmaWcuY2FwID0gY2FwdGlvbmVyKCJGdW5jdGlvbiAkZycnJyA9IFxce2cnJydfZVxcfV97ZVxcaW5cXG1hdGhjYWx7RX19JCBnaXZlbiBieSAkZycnJ197ZV8xfShcXHRhdSkgPSAyNFxcdGF1JCBhbmQgJGcnJydfe1xcaGF0e2V9XzJ9KFxcdGF1KSA9IDI0KFxcdGF1LShcXGVsbF8xK1xcZWxsXzIpKSQuIil9CmxvYWQoaGVyZTo6aGVyZSgiZGF0YV9maWxlcy9wZGRkZjMuUmRhdGEiKSkKcGRkZGYzCmBgYAoKCjo6OgoKOjo6OgoKCkZpZ3VyZSA2IGlsbHVzdHJhdGVzIHByZWNpc2VseSB0aGUgcmVsYXRpb24gZXhwcmVzc2VkIGluIFxlcXJlZntlcTpkZXJfaW52fS4gVGhhdCBpcywgJGcnX3tlXzJ9JCBjYW4gYmUgb2J0YWluZWQgYnkgbXVsdGlwbHlpbmcgJGYnX3tlXzJ9JCBieSAkLTEkLgoKIyBFdmVuIG9yZGVyIGRlcml2YXRpdmVzIGFyZSBvcmllbnRhdGlvbi1pbmRlcGVuZGVudAoKV2UgYWdhaW4gYXBwbHkgdGhlIGNoYWluIHJ1bGUgaW4gXGVxcmVme2VxOmRlcl9pbnZ9IHRvIG9idGFpbgpcYmVnaW57ZXF1YXRpb259CmcnJ197ZV8yfShcdGF1KSA9IFxkZnJhY3tkfXtkXHRhdX0gKCAtIGYnX3tlXzJ9KHQpKSA9IC0gXGRmcmFje2R9e2R0fSAoZidfe2VfMn0odCkpIFxkZnJhY3tkdH17ZFx0YXV9ID0gZicnX3tlXzJ9KHQpLApcZW5ke2VxdWF0aW9ufQpzbyB0aGF0IHRoZSBzZWNvbmQgZGVyaXZhdGl2ZSBkb2VzIG5vdCBjaGFuZ2Ugc2lnbiB1bmRlciBhIGZsaXAuIFNlZSBGaWd1cmUgNy4gVGhpcyBtZWFucyB0aGF0IGV2ZW4gb3JkZXIgZGVyaXZhdGl2ZXMgYXJlIG9yaWVudGF0aW9uLWluZGVwZW5kZW50LiBJbiBnZW5lcmFsLCBmb3IgdGhlICRrJC10aCBkZXJpdmF0aXZlLCB3ZSBoYXZlClxiZWdpbntlcXVhdGlvbn0KXGRmcmFje2Rea317ZFx0YXVea30oZ197ZV8yfShcdGF1KSkgPSAoLTEpXmtcZGZyYWN7ZF5rfXtkdF5rfShmX3tlXzJ9KHQpKS4KXGVuZHtlcXVhdGlvbn0KCgojIEFkZGl0aW9uYWwgcGxvdHMKCmBgYHtyfQpERiA8LSBmX2F1eCRERgpwZl9hdXggPC0gcF9iYXNlIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMSwKICB5ID0geG0xLAogIHogPSB6bTEsCiAgdSA9IGR5MSwKICB2ID0gZHgxLAogIHcgPSBkejEsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJyZWQiLCAicmVkIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0yLAogIHkgPSB4bTIsCiAgeiA9IHptMiwKICB1ID0gZHkyLAogIHYgPSBkeDIsCiAgdyA9IGR6MiwKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoInJlZCIsICJyZWQiKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogICAgYWRkX3RyYWNlKGRhdGEgPSBERiwKICAgICAgICAgICAgeCA9IH55LCAKICAgICAgICAgICAgeSA9IH54LCAKICAgICAgICAgICAgeiA9IH56LCAKICAgICAgICAgICAgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICBtb2RlID0gImxpbmVzIiwgIAogICAgICAgICAgICBsaW5lID0gbGlzdChjb2xvciA9ICJyZ2IoMCwwLDIwMCkiLCB3aWR0aCA9IGdzdyksCiAgICAgICAgICAgIHNob3dsZWdlbmQgPSBGQUxTRSkgfD4KICBhZGRfdHJhY2UoeCA9IHJlcChERiR5LCBlYWNoID0gMyksIAogICAgICAgICAgICB5ID0gcmVwKERGJHgsIGVhY2ggPSAzKSwgCiAgICAgICAgICAgIHogPSB1bmxpc3QobGFwcGx5KERGJHosIGZ1bmN0aW9uKHpqKSBjKDAsIHpqLCBOQSkpKSwKICAgICAgICAgICAgdHlwZSA9ICJzY2F0dGVyM2QiLCAKICAgICAgICAgICAgbW9kZSA9ICJsaW5lcyIsCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gImdyYXkiLCB3aWR0aCA9IDAuNSksCiAgICAgICAgICAgIHNob3dsZWdlbmQgPSBGQUxTRSkgfD4KICBjb25maWcobWF0aGpheCA9ICdjZG4nKSB8PgogIHBsb3RseTo6bGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gVGVYKCJcXGhhdHtmfSIpLCB5ID0gMC44KSwKICAgICAgICAgICAgICAgICBmb250ID0gbGlzdChmYW1pbHkgPSAiUGFsYXRpbm8iKSwKICAgICAgICAgICAgICAgICBzY2VuZSA9IGxpc3QoeGF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gIngiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieSIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgIHpheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ6IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgICAgICBhc3BlY3RyYXRpbyA9IGxpc3QoeCA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAyKSwKICAgICAgICAgICAgICAgICAgIGNhbWVyYSA9IGxpc3QoZXllID0gbGlzdCh4ID0geF9leWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0geV9leWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gel9leWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyID0gbGlzdCh4ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDApKSwKICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zID0gbGlzdCgKICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTFfaW5pX3ksIHkgPSBlMV9pbmlfeCwgeiA9IGUxX2luaV96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSAwLCB5ID0gMCwgeiA9IDAsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInYiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMl9pbmlfeSwgeSA9IGUyX2luaV94LCB6ID0gZTJfaW5pX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMSwgeSA9IHhtMSwgeiA9IHptMSwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiZV8xIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0yLCB5ID0geG0yLCB6ID0gem0yLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJcXGhhdHtlfV8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIikpCiAgICAgICAgICAgICAgICAgKSkKREYgPC0gZGZfYXV4JERGCnBkZl9hdXggPC0gcF9iYXNlIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMSwKICB5ID0geG0xLAogIHogPSB6bTEsCiAgdSA9IGR5MSwKICB2ID0gZHgxLAogIHcgPSBkejEsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJyZWQiLCAicmVkIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0yLAogIHkgPSB4bTIsCiAgeiA9IHptMiwKICB1ID0gZHkyLAogIHYgPSBkeDIsCiAgdyA9IGR6MiwKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoInJlZCIsICJyZWQiKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogICAgYWRkX3RyYWNlKGRhdGEgPSBERiwKICAgICAgICAgICAgeCA9IH55LCAKICAgICAgICAgICAgeSA9IH54LCAKICAgICAgICAgICAgeiA9IH56LCAKICAgICAgICAgICAgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICBtb2RlID0gImxpbmVzIiwgIAogICAgICAgICAgICBsaW5lID0gbGlzdChjb2xvciA9ICJyZ2IoMCwwLDIwMCkiLCB3aWR0aCA9IGdzdyksCiAgICAgICAgICAgIHNob3dsZWdlbmQgPSBGQUxTRSkgfD4KICBhZGRfdHJhY2UoeCA9IHJlcChERiR5LCBlYWNoID0gMyksIAogICAgICAgICAgICB5ID0gcmVwKERGJHgsIGVhY2ggPSAzKSwgCiAgICAgICAgICAgIHogPSB1bmxpc3QobGFwcGx5KERGJHosIGZ1bmN0aW9uKHpqKSBjKDAsIHpqLCBOQSkpKSwKICAgICAgICAgICAgdHlwZSA9ICJzY2F0dGVyM2QiLCAKICAgICAgICAgICAgbW9kZSA9ICJsaW5lcyIsCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gImdyYXkiLCB3aWR0aCA9IDAuNSksCiAgICAgICAgICAgIHNob3dsZWdlbmQgPSBGQUxTRSkgfD4KICBjb25maWcobWF0aGpheCA9ICdjZG4nKSB8PgogIHBsb3RseTo6bGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gVGVYKCJcXGhhdHtmfSciKSwgeSA9IDAuOCksCiAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoZmFtaWx5ID0gIlBhbGF0aW5vIiksCiAgICAgICAgICAgICAgICAgc2NlbmUgPSBsaXN0KHhheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ4IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInkiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICB6YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieiIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgICAgICAgYXNwZWN0cmF0aW8gPSBsaXN0KHggPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMiksCiAgICAgICAgICAgICAgICAgICBjYW1lcmEgPSBsaXN0KGV5ZSA9IGxpc3QoeCA9IHhfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHlfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IHpfZXllKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciA9IGxpc3QoeCA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAwKSksCiAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucyA9IGxpc3QoCiAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUxX2luaV95LCB5ID0gZTFfaW5pX3gsIHogPSBlMV9pbmlfeiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8xIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gMCwgeSA9IDAsIHogPSAwLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2IiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTJfaW5pX3ksIHkgPSBlMl9pbmlfeCwgeiA9IGUyX2luaV96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzIiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTEsIHkgPSB4bTEsIHogPSB6bTEsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoImVfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMiwgeSA9IHhtMiwgeiA9IHptMiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiXFxoYXR7ZX1fMiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpKQogICAgICAgICAgICAgICAgICkpCgpERiA8LSBkZGZfYXV4JERGCnBkZGZfYXV4IDwtIHBfYmFzZSB8PgogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTEsCiAgeSA9IHhtMSwKICB6ID0gem0xLAogIHUgPSBkeTEsCiAgdiA9IGR4MSwKICB3ID0gZHoxLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygicmVkIiwgInJlZCIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMiwKICB5ID0geG0yLAogIHogPSB6bTIsCiAgdSA9IGR5MiwKICB2ID0gZHgyLAogIHcgPSBkejIsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJyZWQiLCAicmVkIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICAgIGFkZF90cmFjZShkYXRhID0gREYsCiAgICAgICAgICAgIHggPSB+eSwgCiAgICAgICAgICAgIHkgPSB+eCwgCiAgICAgICAgICAgIHogPSB+eiwgCiAgICAgICAgICAgIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgICAgICAgICAgbW9kZSA9ICJsaW5lcyIsICAKICAgICAgICAgICAgbGluZSA9IGxpc3QoY29sb3IgPSAicmdiKDAsMCwyMDApIiwgd2lkdGggPSBnc3cpLAogICAgICAgICAgICBzaG93bGVnZW5kID0gRkFMU0UpIHw+CiAgYWRkX3RyYWNlKHggPSByZXAoREYkeSwgZWFjaCA9IDMpLCAKICAgICAgICAgICAgeSA9IHJlcChERiR4LCBlYWNoID0gMyksIAogICAgICAgICAgICB6ID0gdW5saXN0KGxhcHBseShERiR6LCBmdW5jdGlvbih6aikgYygwLCB6aiwgTkEpKSksCiAgICAgICAgICAgIHR5cGUgPSAic2NhdHRlcjNkIiwgCiAgICAgICAgICAgIG1vZGUgPSAibGluZXMiLAogICAgICAgICAgICBsaW5lID0gbGlzdChjb2xvciA9ICJncmF5Iiwgd2lkdGggPSAwLjUpLAogICAgICAgICAgICBzaG93bGVnZW5kID0gRkFMU0UpIHw+CiAgY29uZmlnKG1hdGhqYXggPSAnY2RuJykgfD4KICBwbG90bHk6OmxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IFRlWCgiXFxoYXR7Zn0nJyIpLCB5ID0gMC44KSwKICAgICAgICAgICAgICAgICBmb250ID0gbGlzdChmYW1pbHkgPSAiUGFsYXRpbm8iKSwKICAgICAgICAgICAgICAgICBzY2VuZSA9IGxpc3QoeGF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gIngiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieSIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgIHpheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ6IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgICAgICBhc3BlY3RyYXRpbyA9IGxpc3QoeCA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAyKSwKICAgICAgICAgICAgICAgICAgIGNhbWVyYSA9IGxpc3QoZXllID0gbGlzdCh4ID0geF9leWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0geV9leWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gel9leWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyID0gbGlzdCh4ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDApKSwKICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zID0gbGlzdCgKICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTFfaW5pX3ksIHkgPSBlMV9pbmlfeCwgeiA9IGUxX2luaV96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSAwLCB5ID0gMCwgeiA9IDAsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInYiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMl9pbmlfeSwgeSA9IGUyX2luaV94LCB6ID0gZTJfaW5pX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMSwgeSA9IHhtMSwgeiA9IHptMSwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiZV8xIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0yLCB5ID0geG0yLCB6ID0gem0yLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJcXGhhdHtlfV8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIikpCiAgICAgICAgICAgICAgICAgKSkKCkRGIDwtIGRkZGZfYXV4JERGCnBkZGRmX2F1eCA8LSBwX2Jhc2UgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0xLAogIHkgPSB4bTEsCiAgeiA9IHptMSwKICB1ID0gZHkxLAogIHYgPSBkeDEsCiAgdyA9IGR6MSwKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoInJlZCIsICJyZWQiKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTIsCiAgeSA9IHhtMiwKICB6ID0gem0yLAogIHUgPSBkeTIsCiAgdiA9IGR4MiwKICB3ID0gZHoyLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygicmVkIiwgInJlZCIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgICBhZGRfdHJhY2UoZGF0YSA9IERGLAogICAgICAgICAgICB4ID0gfnksIAogICAgICAgICAgICB5ID0gfngsIAogICAgICAgICAgICB6ID0gfnosIAogICAgICAgICAgICB0eXBlID0gInNjYXR0ZXIzZCIsCiAgICAgICAgICAgIG1vZGUgPSAibGluZXMiLCAgCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gInJnYigwLDAsMjAwKSIsIHdpZHRoID0gZ3N3KSwKICAgICAgICAgICAgc2hvd2xlZ2VuZCA9IEZBTFNFKSB8PgogIGFkZF90cmFjZSh4ID0gcmVwKERGJHksIGVhY2ggPSAzKSwgCiAgICAgICAgICAgIHkgPSByZXAoREYkeCwgZWFjaCA9IDMpLCAKICAgICAgICAgICAgeiA9IHVubGlzdChsYXBwbHkoREYkeiwgZnVuY3Rpb24oemopIGMoMCwgemosIE5BKSkpLAogICAgICAgICAgICB0eXBlID0gInNjYXR0ZXIzZCIsIAogICAgICAgICAgICBtb2RlID0gImxpbmVzIiwKICAgICAgICAgICAgbGluZSA9IGxpc3QoY29sb3IgPSAiZ3JheSIsIHdpZHRoID0gMC41KSwKICAgICAgICAgICAgc2hvd2xlZ2VuZCA9IEZBTFNFKSB8PgogIGNvbmZpZyhtYXRoamF4ID0gJ2NkbicpIHw+CiAgcGxvdGx5OjpsYXlvdXQodGl0bGUgPSBsaXN0KHRleHQgPSBUZVgoIlxcaGF0e2Z9JycnIiksIHkgPSAwLjgpLAogICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGZhbWlseSA9ICJQYWxhdGlubyIpLAogICAgICAgICAgICAgICAgIHNjZW5lID0gbGlzdCh4YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieCIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ5IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgemF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInoiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICAgICAgIGFzcGVjdHJhdGlvID0gbGlzdCh4ID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDIpLAogICAgICAgICAgICAgICAgICAgY2FtZXJhID0gbGlzdChleWUgPSBsaXN0KHggPSB4X2V5ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSB5X2V5ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSB6X2V5ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIgPSBsaXN0KHggPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMCkpLAogICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSBsaXN0KAogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMV9pbmlfeSwgeSA9IGUxX2luaV94LCB6ID0gZTFfaW5pX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IDAsIHkgPSAwLCB6ID0gMCwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUyX2luaV95LCB5ID0gZTJfaW5pX3gsIHogPSBlMl9pbmlfeiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0xLCB5ID0geG0xLCB6ID0gem0xLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJlXzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTIsIHkgPSB4bTIsIHogPSB6bTIsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoIlxcaGF0e2V9XzIiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSkKICAgICAgICAgICAgICAgICApKQoKCgpzYXZlKHBmX2F1eCwgZmlsZSA9IGhlcmU6OmhlcmUoImRhdGFfZmlsZXMvcGZfYXV4LlJkYXRhIikpCnNhdmUocGRmX2F1eCwgZmlsZSA9IGhlcmU6OmhlcmUoImRhdGFfZmlsZXMvcGRmX2F1eC5SZGF0YSIpKQpzYXZlKHBkZGZfYXV4LCBmaWxlID0gaGVyZTo6aGVyZSgiZGF0YV9maWxlcy9wZGRmX2F1eC5SZGF0YSIpKQpzYXZlKHBkZGRmX2F1eCwgZmlsZSA9IGhlcmU6OmhlcmUoImRhdGFfZmlsZXMvcGRkZGZfYXV4LlJkYXRhIikpCgpgYGAKCgo6Ojo6IHtzdHlsZT0iZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiA0ODVweCA0ODVweCA0ODVweCA0ODVweDsgZ3JpZC1jb2x1bW4tZ2FwOiAwcHg7In0KCgo6Ojoge30KCmBgYHtyLCBldmFsID0gVFJVRSwgZmlnLmhlaWdodCA9IDcsIG91dC53aWR0aCA9ICIxMDAlIiwgZmlnLmNhcCA9IGNhcHRpb25lcigiRnVuY3Rpb24gJGYgPSBcXHtmX2VcXH1fe2VcXGluXFxtYXRoY2Fse0V9fSQgZ2l2ZW4gYnkgJGZfe2VfMX0odCkgPSB0XjQkIGFuZCAkZl97ZV8yfSh0KSA9ICh0K1xcZWxsXzEpXjQkLiIpfQpsb2FkKGhlcmU6OmhlcmUoImRhdGFfZmlsZXMvcGYuUmRhdGEiKSkKcGYKYGBgCgo6OjoKCjo6OiB7fQoKYGBge3IsIGV2YWwgPSBUUlVFLCBmaWcuaGVpZ2h0ID0gNywgb3V0LndpZHRoID0gIjEwMCUiLCBmaWcuY2FwID0gY2FwdGlvbmVyKCJGdW5jdGlvbiAkXFxoYXR7Zn0gPSBcXHtmX2VcXH1fe2VcXGluXFxtYXRoY2Fse0V9fSQgZ2l2ZW4gYnkgJGZfe2VfMX0odCkgPSB0XjQkIGFuZCAkZl97XFxoYXR7ZX1fMn0odCkgPSAodCtcXGVsbF8xKV40JC4iKX0KbG9hZChoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3BmX2F1eC5SZGF0YSIpKQpwZl9hdXgKYGBgCgo6OjoKCjo6OiB7fQoKYGBge3IsIGV2YWw9IFRSVUUsIGZpZy5oZWlnaHQgPSA3LCBvdXQud2lkdGggPSAiMTAwJSIsIGZpZy5jYXAgPSBjYXB0aW9uZXIoIkZ1bmN0aW9uICRnID0gXFx7Z19lXFx9X3tlXFxpblxcbWF0aGNhbHtFfX0kIGdpdmVuIGJ5ICRnX3tlXzF9KFxcdGF1KSA9IFxcdGF1XjQkIGFuZCAkZ197XFxoYXR7ZX1fMn0oXFx0YXUpID0gKFxcdGF1LShcXGVsbF8xK1xcZWxsXzIpKV40JC4iKX0KbG9hZChoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3BmMy5SZGF0YSIpKQpwZjMKYGBgCgo6OjoKCjo6OjoKCgojIEZvciAkXGhhdHtmfSQKCjo6Ojoge3N0eWxlPSJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDQ4NXB4IDQ4NXB4IDQ4NXB4IDQ4NXB4OyBncmlkLWNvbHVtbi1nYXA6IDBweDsifQoKCjo6OiB7fQoKYGBge3IsIGV2YWwgPSBUUlVFLCBmaWcuaGVpZ2h0ID0gNywgb3V0LndpZHRoID0gIjEwMCUiLCBmaWcuY2FwID0gY2FwdGlvbmVyKCJGdW5jdGlvbiAkXFxoYXR7Zn0gPSBcXHtmX2VcXH1fe2VcXGluXFxtYXRoY2Fse0V9fSQgZ2l2ZW4gYnkgJGZfe2VfMX0odCkgPSB0XjQkIGFuZCAkZl97XFxoYXR7ZX1fMn0odCkgPSAodCtcXGVsbF8xKV40JC4iKX0KbG9hZChoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3BmX2F1eC5SZGF0YSIpKQpwZl9hdXgKYGBgCgo6OjoKCgo6Ojoge30KCmBgYHtyLCBldmFsID0gVFJVRSwgZmlnLmhlaWdodCA9IDcsIG91dC53aWR0aCA9ICIxMDAlIiwgZmlnLmNhcCA9IGNhcHRpb25lcigiRnVuY3Rpb24gJFxcaGF0e2Z9JyA9IFxce2YnX2VcXH1fe2VcXGluXFxtYXRoY2Fse0V9fSQgZ2l2ZW4gYnkgJGYnX3tlXzF9KHQpID0gNHReMyQgYW5kICRmJ197XFxoYXR7ZX1fMn0odCkgPSA0KHQrXFxlbGxfMSleMyQuIil9CmxvYWQoaGVyZTo6aGVyZSgiZGF0YV9maWxlcy9wZGZfYXV4LlJkYXRhIikpCnBkZl9hdXgKYGBgCgo6OjoKCgo6Ojoge30KCmBgYHtyLCBldmFsID0gVFJVRSwgZmlnLmhlaWdodCA9IDcsIG91dC53aWR0aCA9ICIxMDAlIiwgZmlnLmNhcCA9IGNhcHRpb25lcigiRnVuY3Rpb24gJFxcaGF0e2Z9JycgPSBcXHtmJydfZVxcfV97ZVxcaW5cXG1hdGhjYWx7RX19JCBnaXZlbiBieSAkZicnX3tlXzF9KHQpID0gMTJ0XjIkIGFuZCAkZicnX3tcXGhhdHtlfV8yfSh0KSA9IDEyKHQrXFxlbGxfMSleMiQuIil9CmxvYWQoaGVyZTo6aGVyZSgiZGF0YV9maWxlcy9wZGRmX2F1eC5SZGF0YSIpKQpwZGRmX2F1eApgYGAKCjo6OgoKCjo6OiB7fQoKYGBge3IsIGV2YWwgPSBUUlVFLCBmaWcuaGVpZ2h0ID0gNywgb3V0LndpZHRoID0gIjEwMCUiLCBmaWcuY2FwID0gY2FwdGlvbmVyKCJGdW5jdGlvbiAkXFxoYXR7Zn0nJycgPSBcXHtmJycnX2VcXH1fe2VcXGluXFxtYXRoY2Fse0V9fSQgZ2l2ZW4gYnkgJGYnJydfe2VfMX0odCkgPSAyNHQkIGFuZCAkZicnJ197XFxoYXR7ZX1fMn0odCkgPSAyNCh0K1xcZWxsXzEpJC4iKX0KbG9hZChoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3BkZGRmX2F1eC5SZGF0YSIpKQpwZGRkZl9hdXgKYGBgCgoKOjo6Cgo6Ojo6CgoKCiMgUmVmZXJlbmNlcwoKYGBge3IsIGV2YWwgPSBUUlVFfQpncmF0ZWZ1bDo6Y2l0ZV9wYWNrYWdlcyhvdXRwdXQgPSAicGFyYWdyYXBoIiwgb3V0LmRpciA9ICIuIikKYGBgCgo=