1 Overview

1.1 Approach

This document implements and compares two trajectory methods for normal CD4 T cells, then projects Sézary syndrome CD4 T cells onto both reference trajectories.

1.1.1 Method 1 — Custom MST (Burel et al. 2022 approach)

  • Over-cluster within each annotated state → define milestones (M00–M07)
  • Compute Minimum Spanning Tree on milestone centroids in UMAP space
  • Project each cell onto nearest MST edge → pseudotime

1.1.2 Method 2 — Monocle3

  • Convert Seurat object → cell_data_set
  • learn_graph() fits principal graph to data topology
  • order_cells() rooted at CD4 Naive centroid → pseudotime
  • graph_test() identifies trajectory-variable genes

1.1.3 Comparison

  • Spearman correlation between pseudotimes
  • Agreement on cell ordering per state
  • Concordance on Sézary cell positioning

1.2 Key Objects

Object Description Required columns
cd4_ref Annotated normal CD4 T cells $predicted.celltype.l2, UMAP, RNA
sezary_obj Sézary CD4 T cells RNA (normalised), optional ADT

1.3 Packages Required

install.packages(c("igraph","RANN","ggrepel","patchwork","pheatmap","viridis"))
BiocManager::install("monocle3")
remotes::install_github("satijalab/seurat-wrappers")

2 Setup

suppressPackageStartupMessages({
  library(Seurat)
  library(SeuratWrappers)
  library(monocle3)
  library(igraph)
  library(RANN)
  library(ggplot2)
  library(ggrepel)
  library(dplyr)
  library(tidyr)
  library(patchwork)
  library(pheatmap)
  library(viridis)
  library(scales)
  library(RColorBrewer)
  library(knitr)
  library(kableExtra)
})

STATE_COLORS <- c(
  "CD4 Naive"     = "#4472C4",
  "CD4 TCM"       = "#70AD47",
  "CD4 TEM"       = "#ED7D31",
  "CD4 Temra/CTL" = "#C00000",
  "Treg"          = "#7030A0"
)

METHOD_COLORS <- c(
  "Monocle3"   = "#e74c3c",
  "Custom MST" = "#2980b9"
)

STATE_ORDER <- c("CD4 Naive","CD4 TCM","CD4 TEM","CD4 Temra/CTL","Treg")

UMAP_NAME <- "umap"
STATE_COL <- "predicted.celltype.l2"

# BIOINFORMATICIAN NOTE on resolutions:
# Dotplot showed M03 was TCM-like (LTB+/IL7R+, no effector markers) —
# this means resolution 0.08 for TCM was still too high, producing 3 TCM
# milestones instead of 2. Reducing to 0.05 collapses the third TCM milestone
# so the sub-clustering yields exactly 2 TCM milestones (early and late).
# TEM resolution increased to 0.30 to better separate TEM from Temra.
MILESTONE_RES <- c(
  "CD4 Naive"     = 0.05,   # CHANGED 0.10→0.05: single homogeneous milestone
  "CD4 TCM"       = 0.05,   # CHANGED 0.08→0.05: was producing 3 milestones, need 2
  "CD4 TEM"       = 0.30,   # CHANGED 0.20→0.30: better separation of TEM vs Temra
  "CD4 Temra/CTL" = 0.10,   # unchanged — single milestone (only 10 cells)
  "Treg"          = 0.20    # unchanged — 2 milestones (naive + terminal)
)

cat("✓ Setup complete\n")
✓ Setup complete
cat("\nState colours:\n");        print(STATE_COLORS)

State colours:
    CD4 Naive       CD4 TCM       CD4 TEM CD4 Temra/CTL          Treg 
    "#4472C4"     "#70AD47"     "#ED7D31"     "#C00000"     "#7030A0" 
cat("\nMilestone resolutions:\n"); print(MILESTONE_RES)

Milestone resolutions:
    CD4 Naive       CD4 TCM       CD4 TEM CD4 Temra/CTL          Treg 
         0.05          0.05          0.30          0.10          0.20 
cat("\nState column:", STATE_COL, "\n")

State column: predicted.celltype.l2 
cat("UMAP name:   ", UMAP_NAME,  "\n")
UMAP name:    umap 

3 Load & Validate Objects

cd4_ref    <- readRDS("../../CD4_reference_clean_Azimuth_ready_for_Slingshot.rds")
sezary_obj <- readRDS("/home/nabbasi/apollo_home/1-Seurat_RDS_OBJECT_FINAL/All_samples_Merged_with_Renamed_Clusters_Cell_state-03-12-2025.rds.rds")

cat("CD4 reference loaded:", ncol(cd4_ref),    "cells\n")
CD4 reference loaded: 11466 cells
cat("Sezary object loaded:", ncol(sezary_obj), "cells\n")
Sezary object loaded: 49305 cells
cat("\nAzimuth l2 labels present:\n")

Azimuth l2 labels present:
print(table(cd4_ref@meta.data[[STATE_COL]]))

    CD4 Naive       CD4 TCM       CD4 TEM CD4 Temra/CTL          Treg 
         2037          9067           145            10           207 
stopifnot(
  "predicted.celltype.l2 missing from cd4_ref" = STATE_COL %in% colnames(cd4_ref@meta.data),
  "UMAP missing from cd4_ref"                  = UMAP_NAME %in% names(cd4_ref@reductions),
  "RNA assay missing from cd4_ref"             = "RNA" %in% names(cd4_ref@assays),
  "RNA assay missing from sezary_obj"          = "RNA" %in% names(sezary_obj@assays)
)
cat("✅ Validation passed\n")
✅ Validation passed
DefaultAssay(cd4_ref)    <- "RNA"
DefaultAssay(sezary_obj) <- "RNA"

cd4_states_keep <- names(MILESTONE_RES)
cells_keep      <- cd4_ref@meta.data[[STATE_COL]] %in% cd4_states_keep
if (sum(!cells_keep) > 0) {
  cd4_ref <- subset(cd4_ref, cells = colnames(cd4_ref)[cells_keep])
  cat("Subsetted to trajectory states:", ncol(cd4_ref), "cells\n")
}

umap_df           <- as.data.frame(Embeddings(cd4_ref, UMAP_NAME))
colnames(umap_df) <- c("UMAP_1","UMAP_2")
umap_df$cell      <- rownames(umap_df)
umap_df$state     <- cd4_ref@meta.data[[STATE_COL]]

ref_summary <- cd4_ref@meta.data %>%
  count(!!sym(STATE_COL), name = "n_cells") %>%
  rename(State = !!sym(STATE_COL)) %>%
  mutate(pct = round(100 * n_cells / sum(n_cells), 1)) %>%
  arrange(match(State, STATE_ORDER))

kable(ref_summary,
      caption = sprintf("Reference CD4 T cells (n = %d total)", ncol(cd4_ref))) %>%
  kable_styling(bootstrap_options = c("striped","hover"), full_width = FALSE)
Reference CD4 T cells (n = 11466 total)
State n_cells pct
CD4 Naive 2037 17.8
CD4 TCM 9067 79.1
CD4 TEM 145 1.3
CD4 Temra/CTL 10 0.1
Treg 207 1.8

4 Define Milestones (Shared by Both Methods)

4.1 Sub-clustering

set.seed(42)
cd4_ref@meta.data$milestone <- NA_character_
milestone_counter           <- 0L
milestone_state_map         <- list()

states_present <- intersect(names(MILESTONE_RES),
                             unique(cd4_ref@meta.data[[STATE_COL]]))

cat("Defining milestones by sub-clustering within each state:\n\n")
Defining milestones by sub-clustering within each state:
for (st in states_present) {
  cells_st <- colnames(cd4_ref)[cd4_ref@meta.data[[STATE_COL]] == st]

  if (length(cells_st) < 50) {
    m_id <- sprintf("M%02d", milestone_counter)
    cd4_ref@meta.data$milestone[colnames(cd4_ref) %in% cells_st] <- m_id
    milestone_state_map[[m_id]] <- st
    milestone_counter <- milestone_counter + 1L
    cat(sprintf("  %-20s  %4d cells  →  1 milestone (%s) [too few]\n",
                st, length(cells_st), m_id))
    next
  }

  sub_obj <- subset(cd4_ref, cells = cells_st)

  sub_obj <- FindNeighbors(
    sub_obj,
    reduction  = "pca",
    dims       = 1:20,
    k.param    = 20,
    graph.name = c("sub_nn","sub_snn"),
    verbose    = FALSE
  )

  sub_obj <- FindClusters(
    sub_obj,
    graph.name  = "sub_snn",
    resolution  = MILESTONE_RES[st],
    random.seed = 42,
    verbose     = FALSE
  )

  sub_clusters <- as.character(sub_obj$seurat_clusters)
  n_sub        <- length(unique(sub_clusters))

  for (sc in sort(unique(sub_clusters))) {
    m_id     <- sprintf("M%02d", milestone_counter)
    sc_cells <- cells_st[sub_clusters == sc]
    cd4_ref@meta.data$milestone[colnames(cd4_ref) %in% sc_cells] <- m_id
    milestone_state_map[[m_id]] <- st
    milestone_counter <- milestone_counter + 1L
  }

  cat(sprintf("  %-20s  %4d cells  →  %d milestones (M%02d–M%02d)\n",
              st, length(cells_st), n_sub,
              milestone_counter - n_sub, milestone_counter - 1))
}
  CD4 Naive             2037 cells  →  1 milestones (M00–M00)
  CD4 TCM               9067 cells  →  2 milestones (M01–M02)
  CD4 TEM                145 cells  →  2 milestones (M03–M04)
  CD4 Temra/CTL           10 cells  →  1 milestone (M05) [too few]
  Treg                   207 cells  →  2 milestones (M06–M07)
cat(sprintf("\nTotal milestones: %d\n", milestone_counter))

Total milestones: 8
cat("\nMilestone distribution:\n")

Milestone distribution:
print(table(cd4_ref@meta.data$milestone, useNA = "ifany"))

 M00  M01  M02  M03  M04  M05  M06  M07 
2037 8679  388   81   64   10  146   61 

4.2 Milestone Centroids


umap_df$milestone <- cd4_ref@meta.data$milestone

milestone_centroids <- umap_df %>%
  filter(!is.na(milestone)) %>%
  group_by(milestone) %>%
  summarise(
    UMAP_1  = mean(UMAP_1),
    UMAP_2  = mean(UMAP_2),
    n_cells = n(),
    state   = dplyr::first(state),
    .groups = "drop"
  ) %>%
  mutate(state = unlist(milestone_state_map[milestone])) %>%
  arrange(milestone)

cat("Milestone centroids — inspect before setting manual edges:\n")
Milestone centroids — inspect before setting manual edges:
print(milestone_centroids[, c("milestone","state","UMAP_1","UMAP_2","n_cells")])

kable(milestone_centroids,
      caption = "Milestone centroids in UMAP space",
      digits  = 3) %>%
  kable_styling(bootstrap_options = c("striped","condensed"), full_width = FALSE)
Milestone centroids in UMAP space
milestone UMAP_1 UMAP_2 n_cells state
M00 -3.437 -0.644 2037 CD4 Naive
M01 0.723 -0.140 8679 CD4 TCM
M02 -1.685 4.765 388 CD4 TCM
M03 6.667 -1.003 81 CD4 TEM
M04 6.336 0.424 64 CD4 TEM
M05 6.944 -0.262 10 CD4 Temra/CTL
M06 1.124 3.371 146 Treg
M07 3.276 3.962 61 Treg

5 Method 1 — Custom MST Trajectory

Custom MST approach (Burel et al. 2022): connects milestone centroids with a Minimum Spanning Tree; cells get pseudotime by projection onto nearest edge.

5.1 MST Computation

# ── Step 1: Distance matrix ────────────────────────────────────────────────
centroid_mat <- as.matrix(milestone_centroids[, c("UMAP_1","UMAP_2")])
rownames(centroid_mat) <- milestone_centroids$milestone
dist_mat <- as.matrix(dist(centroid_mat, method = "euclidean"))

# ── Step 2: Root = CD4 Naive ──────────────────────────────────────────────
tn_milestones <- milestone_centroids$milestone[milestone_centroids$state == "CD4 Naive"]
cat("CD4 Naive milestones:", tn_milestones, "\n")
CD4 Naive milestones: M00 
if (length(tn_milestones) == 1) {
  root_ms <- tn_milestones
} else {
  tn_centroid <- colMeans(centroid_mat[tn_milestones, , drop = FALSE])
  tn_dists    <- rowSums((centroid_mat[tn_milestones, , drop = FALSE] -
                   matrix(tn_centroid, nrow=length(tn_milestones), ncol=2, byrow=TRUE))^2)
  root_ms <- tn_milestones[which.min(tn_dists)]
}
cat("Root milestone:", root_ms, "\n")
Root milestone: M00 
# ── Step 3: Automatic MST — inspect only ──────────────────────────────────
g_auto   <- graph_from_adjacency_matrix(dist_mat, mode="undirected",
                                        weighted=TRUE, diag=FALSE)
mst_auto <- mst(g_auto, algorithm="prim")
cat("\nAutomatic MST (reference only):\n")

Automatic MST (reference only):
auto_edges <- as_edgelist(mst_auto)
for (i in seq_len(nrow(auto_edges))) {
  s1 <- milestone_centroids$state[milestone_centroids$milestone == auto_edges[i,1]]
  s2 <- milestone_centroids$state[milestone_centroids$milestone == auto_edges[i,2]]
  cat(sprintf("  %s(%s) — %s(%s)\n", auto_edges[i,1], s1, auto_edges[i,2], s2))
}
  M00(CD4 Naive) — M01(CD4 TCM)
  M01(CD4 TCM) — M06(Treg)
  M02(CD4 TCM) — M06(Treg)
  M03(CD4 TEM) — M05(CD4 Temra/CTL)
  M04(CD4 TEM) — M05(CD4 Temra/CTL)
  M04(CD4 TEM) — M07(Treg)
  M06(Treg) — M07(Treg)
# ── Step 4: Build edgelist via state lookup ────────────────────────────────
ms_by_state <- function(state_name, rank = 1) {
  candidates <- milestone_centroids[milestone_centroids$state == state_name, ]
  if (nrow(candidates) < rank) stop(sprintf(
    "State '%s' has only %d milestone(s), but rank=%d was requested.",
    state_name, nrow(candidates), rank))
  candidates <- candidates[order(candidates$UMAP_1), ]
  candidates$milestone[rank]
}

naive_ms  <- ms_by_state("CD4 Naive",    1)
tcm_e_ms  <- ms_by_state("CD4 TCM",      1)
tcm_l_ms  <- ms_by_state("CD4 TCM",      2)
tem_e_ms  <- ms_by_state("CD4 TEM",      1)
tem_l_ms  <- ms_by_state("CD4 TEM",      2)
temra_ms  <- ms_by_state("CD4 Temra/CTL",1)
treg_n_ms <- ms_by_state("Treg",         1)
treg_t_ms <- ms_by_state("Treg",         2)

cat("\nState-to-Current-ID mapping:\n")

State-to-Current-ID mapping:
cat(sprintf("  Naive: %s\n  TCM:   %s(early), %s(late)\n", naive_ms, tcm_e_ms, tcm_l_ms))
  Naive: M00
  TCM:   M02(early), M01(late)
cat(sprintf("  TEM:   %s(early), %s(late)\n  Temra: %s\n", tem_e_ms, tem_l_ms, temra_ms))
  TEM:   M04(early), M03(late)
  Temra: M05
cat(sprintf("  Treg:  %s(naive), %s(terminal)\n", treg_n_ms, treg_t_ms))
  Treg:  M06(naive), M07(terminal)
edge_list_ordered <- matrix(c(
  naive_ms,  tcm_e_ms,
  tcm_e_ms,  tcm_l_ms,
  tcm_l_ms,  tem_e_ms,
  tem_e_ms,  tem_l_ms,
  tem_l_ms,  temra_ms,
  tcm_l_ms,  treg_n_ms,
  treg_n_ms, treg_t_ms
), ncol = 2, byrow = TRUE)

# ✅ FIXED: e[1] = row name, e[2] = col name → single numeric distance value
edge_weights <- apply(edge_list_ordered, 1, function(e) dist_mat[e[1], e[2]])

# Validate no NaN weights before building graph
if (any(!is.finite(edge_weights))) {
  bad <- which(!is.finite(edge_weights))
  print(data.frame(from=edge_list_ordered[bad,1],
                   to  =edge_list_ordered[bad,2],
                   w   =edge_weights[bad]))
  stop("NaN/NA/Inf edge weights detected — check state lookup or dist_mat rownames.")
}

mst_graph <- graph_from_edgelist(edge_list_ordered, directed = FALSE)
E(mst_graph)$weight <- edge_weights

cat("\nManual edges defined:\n")

Manual edges defined:
for (i in seq_len(nrow(edge_list_ordered))) {
  sf <- milestone_centroids$state[milestone_centroids$milestone == edge_list_ordered[i,1]]
  st <- milestone_centroids$state[milestone_centroids$milestone == edge_list_ordered[i,2]]
  cat(sprintf("  %s(%s) → %s(%s)  w=%.4f\n",
              edge_list_ordered[i,1], sf, edge_list_ordered[i,2], st, edge_weights[i]))
}
  M00(CD4 Naive) → M02(CD4 TCM)  w=5.6851
  M02(CD4 TCM) → M01(CD4 TCM)  w=5.4642
  M01(CD4 TCM) → M04(CD4 TEM)  w=5.6416
  M04(CD4 TEM) → M03(CD4 TEM)  w=1.4646
  M03(CD4 TEM) → M05(CD4 Temra/CTL)  w=0.7915
  M01(CD4 TCM) → M06(Treg)  w=3.5341
  M06(Treg) → M07(Treg)  w=2.2321
# ── Step 5: Explicit traversal order ──────────────────────────────────────
bfs_order_clean <- unique(as.vector(t(edge_list_ordered)))
cat("\nTraversal order:", paste(bfs_order_clean, collapse=" → "), "\n")

Traversal order: M00 → M02 → M01 → M04 → M03 → M05 → M06 → M07 
stopifnot(
  "Must have 8 milestones" = length(bfs_order_clean) == 8,
  "Naive must be root"     = bfs_order_clean[1] == naive_ms,
  "Temra before Treg"      = which(bfs_order_clean==temra_ms) < which(bfs_order_clean==treg_n_ms)
)
cat("✅ Traversal order validated\n")
✅ Traversal order validated
# ── Step 6: Rename to M00-M07 ─────────────────────────────────────────────
old_to_new <- setNames(sprintf("M%02d", seq_along(bfs_order_clean) - 1L), bfs_order_clean)

cat("\nRenaming map:\n")

Renaming map:
for (o in names(old_to_new)) {
  st <- milestone_centroids$state[milestone_centroids$milestone == o]
  cat(sprintf("  %s (%s) → %s\n", o, st, old_to_new[o]))
}
  M00 (CD4 Naive) → M00
  M02 (CD4 TCM) → M01
  M01 (CD4 TCM) → M02
  M04 (CD4 TEM) → M03
  M03 (CD4 TEM) → M04
  M05 (CD4 Temra/CTL) → M05
  M06 (Treg) → M06
  M07 (Treg) → M07
milestone_centroids$milestone <- old_to_new[milestone_centroids$milestone]
cd4_ref@meta.data$milestone   <- unname(old_to_new[cd4_ref@meta.data$milestone])
names(milestone_state_map)    <- old_to_new[names(milestone_state_map)]
rownames(centroid_mat)        <- old_to_new[rownames(centroid_mat)]
rownames(dist_mat)            <- old_to_new[rownames(dist_mat)]
colnames(dist_mat)            <- old_to_new[colnames(dist_mat)]
V(mst_graph)$name             <- unname(old_to_new[V(mst_graph)$name])
cat("✅ Renaming applied\n")
✅ Renaming applied
# ── Step 7: Verify final biology ──────────────────────────────────────────
milestone_order <- sprintf("M%02d", seq_len(nrow(milestone_centroids)) - 1L)
cat("\nFinal milestone → biology:\n")

Final milestone → biology:
for (m in milestone_order) {
  st <- milestone_centroids$state[milestone_centroids$milestone == m]
  nc <- milestone_centroids$n_cells[milestone_centroids$milestone == m]
  cat(sprintf("  %s = %-20s  n=%4d\n", m, st, nc))
}
  M00 = CD4 Naive             n=2037
  M01 = CD4 TCM               n= 388
  M02 = CD4 TCM               n=8679
  M03 = CD4 TEM               n=  64
  M04 = CD4 TEM               n=  81
  M05 = CD4 Temra/CTL         n=  10
  M06 = Treg                  n= 146
  M07 = Treg                  n=  61
cat("Expected:\n  M00=Naive  M01/M02=TCM  M03/M04=TEM  M05=Temra/CTL  M06/M07=Treg\n")
Expected:
  M00=Naive  M01/M02=TCM  M03/M04=TEM  M05=Temra/CTL  M06/M07=Treg
# ── Swap helper ────────────────────────────────────────────────────────────
swap_ms <- function(a, b) {
  tmp <- "__TMP__"
  vn <- V(mst_graph)$name
  vn[vn==a] <- tmp; vn[vn==b] <- a; vn[vn==tmp] <- b; V(mst_graph)$name <<- vn
  mc <- milestone_centroids$milestone
  mc[mc==a] <- tmp; mc[mc==b] <- a; mc[mc==tmp] <- b; milestone_centroids$milestone <<- mc
  mv <- cd4_ref@meta.data$milestone
  mv[!is.na(mv)&mv==a] <- tmp; mv[!is.na(mv)&mv==b] <- a
  mv[!is.na(mv)&mv==tmp] <- b; cd4_ref@meta.data$milestone <<- mv
  nm <- names(milestone_state_map)
  nm[nm==a] <- tmp; nm[nm==b] <- a; nm[nm==tmp] <- b; names(milestone_state_map) <<- nm
  rn <- rownames(centroid_mat)
  rn[rn==a] <- tmp; rn[rn==b] <- a; rn[rn==tmp] <- b; rownames(centroid_mat) <<- rn
  rn <- rownames(dist_mat); cn <- colnames(dist_mat)
  rn[rn==a] <- tmp; rn[rn==b] <- a; rn[rn==tmp] <- b; rownames(dist_mat) <<- rn
  cn[cn==a] <- tmp; cn[cn==b] <- a; cn[cn==tmp] <- b; colnames(dist_mat) <<- cn
  cat(sprintf("  Swapped %s <-> %s\n", a, b))
}
# swap_ms("M03","M04")  # TEM early/late reversed?
# swap_ms("M06","M07")  # Treg naive/terminal reversed?

# ── Step 8: Graph distances — unweighted (steps from root) ────────────────
# weights=NA forces hop-count distance, avoids any NaN weight issue entirely
graph_dists <- distances(mst_graph, v = "M00", weights = NA)
graph_dists[is.infinite(graph_dists)] <- max(graph_dists[is.finite(graph_dists)]) + 1

milestone_centroids$graph_dist <- as.numeric(graph_dists[, milestone_centroids$milestone])
milestone_centroids$order_pos  <- match(milestone_centroids$milestone, milestone_order)
milestone_centroids             <- arrange(milestone_centroids, order_pos)

# ── Step 9: Edge data frame for plotting ──────────────────────────────────
mst_edges   <- as_edgelist(mst_graph)
mst_edge_df <- do.call(rbind, lapply(seq_len(nrow(mst_edges)), function(i) {
  m1 <- mst_edges[i,1]; m2 <- mst_edges[i,2]
  r1 <- milestone_centroids[milestone_centroids$milestone == m1, ]
  r2 <- milestone_centroids[milestone_centroids$milestone == m2, ]
  if (nrow(r1)==0 || nrow(r2)==0) return(NULL)
  data.frame(x1=r1$UMAP_1, y1=r1$UMAP_2, x2=r2$UMAP_1, y2=r2$UMAP_2)
}))

# ── Final summary ─────────────────────────────────────────────────────────
cat(sprintf("\nFinal MST: %d nodes, %d edges | Root: M00\n",
            vcount(mst_graph), ecount(mst_graph)))

Final MST: 8 nodes, 7 edges | Root: M00
mst_edges_final <- as_edgelist(mst_graph)
for (i in seq_len(nrow(mst_edges_final))) {
  s1 <- milestone_centroids$state[milestone_centroids$milestone == mst_edges_final[i,1]]
  s2 <- milestone_centroids$state[milestone_centroids$milestone == mst_edges_final[i,2]]
  cat(sprintf("  %s (%s) → %s (%s)\n", mst_edges_final[i,1], s1, mst_edges_final[i,2], s2))
}
  M00 (CD4 Naive) → M01 (CD4 TCM)
  M01 (CD4 TCM) → M02 (CD4 TCM)
  M02 (CD4 TCM) → M03 (CD4 TEM)
  M03 (CD4 TEM) → M04 (CD4 TEM)
  M04 (CD4 TEM) → M05 (CD4 Temra/CTL)
  M02 (CD4 TCM) → M06 (Treg)
  M06 (Treg) → M07 (Treg)

5.2 Pseudotime Projection

project_onto_mst <- function(cell_coords, centroid_mat, mst_graph, graph_dists) {
  edges      <- as_edgelist(mst_graph)
  n_cells    <- nrow(cell_coords)
  pseudotime <- numeric(n_cells)
  nearest_ms <- character(n_cells)

  for (i in seq_len(n_cells)) {
    cx <- cell_coords[i, 1]; cy <- cell_coords[i, 2]
    best_dist <- Inf; best_pt <- 0; best_ms <- NA_character_

    for (e in seq_len(nrow(edges))) {
      m1 <- edges[e,1]; m2 <- edges[e,2]
      p1 <- centroid_mat[m1,]; p2 <- centroid_mat[m2,]
      dx <- p2[1]-p1[1]; dy <- p2[2]-p1[2]
      len2 <- dx^2 + dy^2
      if (len2 < 1e-10) next
      t    <- max(0, min(1, ((cx-p1[1])*dx + (cy-p1[2])*dy) / len2))
      proj <- c(p1[1]+t*dx, p1[2]+t*dy)
      d    <- sqrt((cx-proj[1])^2 + (cy-proj[2])^2)
      if (d < best_dist) {
        best_dist <- d
        pt_m1     <- graph_dists[m1]
        pt_m2     <- graph_dists[m2]
        best_pt   <- pt_m1 + t * (pt_m2 - pt_m1)
        best_ms   <- if (t < 0.5) m1 else m2
      }
    }
    pseudotime[i] <- best_pt
    nearest_ms[i] <- best_ms
  }
  list(pseudotime = pseudotime, nearest_ms = nearest_ms)
}

cell_coords <- as.matrix(umap_df[colnames(cd4_ref), c("UMAP_1","UMAP_2")])
g_dists_vec <- setNames(as.numeric(graph_dists), colnames(graph_dists))

cat("Projecting reference cells onto MST...\n")
Projecting reference cells onto MST...
mst_proj <- project_onto_mst(cell_coords, centroid_mat, mst_graph, g_dists_vec)

mst_pt_raw   <- mst_proj$pseudotime
mst_pt_range <- range(mst_pt_raw, na.rm = TRUE)

meta <- cd4_ref@meta.data
meta$mst_pseudotime      <- mst_pt_raw
meta$mst_pseudotime_norm <- 100 * (mst_pt_raw - mst_pt_range[1]) /
                                   (mst_pt_range[2] - mst_pt_range[1])
meta$nearest_milestone   <- mst_proj$nearest_ms
cd4_ref@meta.data        <- meta

cat(sprintf("MST pseudotime range: %.3f – %.3f\n",
            mst_pt_range[1], mst_pt_range[2]))
MST pseudotime range: 0.000 – 5.000
# Validate: median pseudotime should increase along trajectory
cat("\nMedian pseudotime per state (should increase Naive→TCM→TEM→Temra):\n")

Median pseudotime per state (should increase Naive→TCM→TEM→Temra):
pt_check <- cd4_ref@meta.data %>%
  group_by(!!sym(STATE_COL)) %>%
  summarise(median_pt = round(median(mst_pseudotime_norm, na.rm=TRUE), 1),
            .groups="drop") %>%
  arrange(median_pt)
print(pt_check)

5.3 Visualisation

ms_plot <- milestone_centroids %>% mutate(x = order_pos, y = 0)

state_bands <- ms_plot %>%
  group_by(state) %>%
  summarise(xmin = min(x)-.4, xmax = max(x)+.4, .groups="drop") %>%
  mutate(ymin=-.35, ymax=-.15, fill=STATE_COLORS[state])

edge_linear <- do.call(rbind, lapply(seq_len(nrow(mst_edges)), function(i) {
  m1<-mst_edges[i,1]; m2<-mst_edges[i,2]
  r1<-ms_plot[ms_plot$milestone==m1,]; r2<-ms_plot[ms_plot$milestone==m2,]
  if(nrow(r1)==0||nrow(r2)==0) return(NULL)
  data.frame(x1=r1$x,y1=r1$y,x2=r2$x,y2=r2$y)
}))

# ── Panel a: Linear milestone trajectory ──────────────────────────────────
p_mst_linear <- ggplot() +
  geom_rect(data=state_bands,
            aes(xmin=xmin,xmax=xmax,ymin=ymin,ymax=ymax,fill=state), alpha=.85) +
  geom_text(data=state_bands,
            aes(x=(xmin+xmax)/2, y=(ymin+ymax)/2, label=state),
            colour="white", size=3.5, fontface="bold") +
  geom_segment(data=edge_linear,
               aes(x=x1,y=y1,xend=x2,yend=y2),
               colour="grey35", linewidth=1.3, lineend="round") +
  geom_text(data=ms_plot,
            aes(x=x, y=y+0.18, label=paste0("n=", scales::comma(n_cells))),
            size=3, colour="grey10", fontface="bold", vjust=0) +
  geom_point(data=ms_plot, aes(x=x, y=y, fill=state),
             shape=21, colour="white", stroke=2, size=12) +
  geom_text(data=ms_plot, aes(x=x, y=y, label=milestone),
            size=3.2, colour="white", fontface="bold") +
  scale_fill_manual(values=STATE_COLORS, name="State") +
  coord_cartesian(ylim=c(-.5, 0.45)) +
  theme_void() +
  theme(legend.position = "right",
        legend.title    = element_text(size=10, face="bold"),
        legend.text     = element_text(size=9),
        plot.title      = element_text(size=13, face="bold", hjust=.5),
        plot.margin     = margin(15, 10, 10, 10)) +
  ggtitle("Custom MST — Milestones Trajectory")

# ── Panel b: Milestones on UMAP ───────────────────────────────────────────
p_mst_umap_ms <- ggplot() +
  geom_point(data=umap_df[sample(nrow(umap_df)),],
             aes(x=UMAP_1,y=UMAP_2,colour=state), size=.35, alpha=.5) +
  geom_segment(data=mst_edge_df,
               aes(x=x1,y=y1,xend=x2,yend=y2),
               colour="black", linewidth=1, alpha=.85, lineend="round") +
  geom_point(data=milestone_centroids,
             aes(x=UMAP_1,y=UMAP_2,fill=state),
             shape=21, size=8, colour="white", stroke=2) +
  geom_text_repel(data=milestone_centroids,
                  aes(x=UMAP_1,y=UMAP_2,label=milestone),
                  size=3, colour="white", fontface="bold",
                  bg.color="grey20", bg.r=.15, max.overlaps=25,
                  point.padding=0.3, box.padding=0.4) +
  scale_colour_manual(values=STATE_COLORS, guide="none") +
  scale_fill_manual(values=STATE_COLORS, name="State") +
  theme_classic() +
  labs(x="UMAP-1",y="UMAP-2",title="Custom MST — Milestones on UMAP") +
  theme(plot.title=element_text(size=13,face="bold"))

# ── Panel c: Pseudotime on UMAP ───────────────────────────────────────────
pt_umap_df            <- umap_df
pt_umap_df$pseudotime <- cd4_ref@meta.data$mst_pseudotime_norm

p_mst_pseudo <- ggplot(pt_umap_df[sample(nrow(pt_umap_df)),],
                        aes(x=UMAP_1,y=UMAP_2,colour=pseudotime)) +
  geom_point(size=.35, alpha=.7) +
  scale_colour_gradientn(
    colours = c("#0D0887","#6A00A8","#B12A90","#E16462","#FCA636","#F0F921"),
    name    = "Pseudotime\n(0–100)", limits=c(0,100)) +
  geom_segment(data=mst_edge_df,
               aes(x=x1,y=y1,xend=x2,yend=y2),
               colour="black", linewidth=.7, alpha=.6, inherit.aes=FALSE) +
  theme_classic() +
  labs(x="UMAP-1",y="UMAP-2",title="Custom MST — Pseudotime on UMAP") +
  theme(plot.title=element_text(size=13,face="bold"))

print((p_mst_linear) / (p_mst_umap_ms | p_mst_pseudo))

# Panel A: Linear trajectory
print(p_mst_linear)


# Panel B: Milestones on UMAP  
print(p_mst_umap_ms)


# Panel C: Pseudotime on UMAP
print(p_mst_pseudo)

5.4 Visualisation



# Panel B: Milestones on UMAP  
print(p_mst_umap_ms)


# Panel C: Pseudotime on UMAP
print(p_mst_pseudo)


6 Method 2 — Monocle3 Trajectory

Monocle3 fits a principal graph directly to the data topology using reversed graph embedding, then assigns pseudotime by geodesic distance from the root.

6.1 Convert & Preprocess

DefaultAssay(cd4_ref) <- "RNA"

cd4_ref_joined <- JoinLayers(cd4_ref)
cds <- as.cell_data_set(cd4_ref_joined)

colData(cds)[[STATE_COL]] <- cd4_ref@meta.data[[STATE_COL]]
colData(cds)$milestone    <- cd4_ref@meta.data$milestone

reducedDims(cds)[["PCA"]]  <- Embeddings(cd4_ref, "pca")
reducedDims(cds)[["UMAP"]] <- Embeddings(cd4_ref, UMAP_NAME)

cds <- estimate_size_factors(cds)
cds@clusters$UMAP$clusters <- cd4_ref@meta.data[[STATE_COL]]

cat("cell_data_set created:\n")
cell_data_set created:
cat(sprintf("  %d cells | %d genes\n", ncol(cds), nrow(cds)))
  11466 cells | 36601 genes

6.2 Learn Graph & Set Root

set.seed(42)
DefaultAssay(cd4_ref) <- "RNA"
cd4_ref_joined <- JoinLayers(cd4_ref)
cds <- as.cell_data_set(cd4_ref_joined)

# ── Transfer metadata ──────────────────────────────────────────────────────
colData(cds)[[STATE_COL]] <- cd4_ref@meta.data[[STATE_COL]]
colData(cds)$milestone    <- cd4_ref@meta.data$milestone

# ── Transfer reductions ───────────────────────────────────────────────────
reducedDims(cds)[["PCA"]]  <- Embeddings(cd4_ref, "pca")
reducedDims(cds)[["UMAP"]] <- Embeddings(cd4_ref, UMAP_NAME)

cds <- estimate_size_factors(cds)

# ── FIX: Set BOTH clusters AND partitions with NAMED factors ──────────────
# learn_graph() checks: names(cds@clusters$UMAP$partitions) != NULL
cell_ids <- colnames(cds)

# Clusters: named factor of state labels
cluster_vec <- setNames(
  factor(cd4_ref@meta.data[[STATE_COL]]),
  cell_ids
)

# Partitions: all cells in one partition (required slot, use_partition=FALSE
# ignores boundaries but the slot must still be a named factor)
partition_vec <- setNames(
  factor(rep(1L, length(cell_ids))),
  cell_ids
)

cds@clusters$UMAP$clusters   <- cluster_vec
cds@clusters$UMAP$partitions  <- partition_vec

# Verify names are present before calling learn_graph
stopifnot(
  "clusters must be named"   = !is.null(names(cds@clusters$UMAP$clusters)),
  "partitions must be named" = !is.null(names(cds@clusters$UMAP$partitions)),
  "cluster length matches"   = length(cds@clusters$UMAP$clusters) == ncol(cds),
  "partition length matches" = length(cds@clusters$UMAP$partitions) == ncol(cds)
)
cat(sprintf("✅ clusters and partitions set: %d cells\n", ncol(cds)))
✅ clusters and partitions set: 11466 cells
cat("cell_data_set created:\n")
cell_data_set created:
cat(sprintf("  %d cells | %d genes\n", ncol(cds), nrow(cds)))
  11466 cells | 36601 genes
# ── learn_graph ────────────────────────────────────────────────────────────
set.seed(42)
cds <- learn_graph(
  cds,
  use_partition       = FALSE,
  close_loop          = FALSE,
  learn_graph_control = list(minimal_branch_len = 8, nn.k = 20),
  verbose             = FALSE
)
cat("✅ learn_graph complete\n")
✅ learn_graph complete

6.3 Order Cells & Assign Pseudotime

# Set root at CD4 Naive centroid and assign pseudotime
tn_cells    <- colnames(cds)[colData(cds)[[STATE_COL]] == "CD4 Naive"]
tn_umap     <- reducedDims(cds)[["UMAP"]][tn_cells, , drop = FALSE]
tn_centroid <- colMeans(tn_umap)

pr_nodes     <- t(cds@principal_graph_aux[["UMAP"]]$dp_mst)
node_dists   <- rowSums((pr_nodes - matrix(tn_centroid, nrow=nrow(pr_nodes),
                                            ncol=2, byrow=TRUE))^2)
root_pr_node <- names(which.min(node_dists))
cat(sprintf("Root principal graph node: %s\n", root_pr_node))
Root principal graph node: Y_14
cds <- order_cells(cds, root_pr_nodes = root_pr_node)

pt_raw <- pseudotime(cds)
cat(sprintf("Pseudotime: %d non-NA | %d NA\n",
            sum(!is.na(pt_raw)), sum(is.na(pt_raw))))
Pseudotime: 11466 non-NA | 0 NA
cat(sprintf("Raw range: %.3f – %.3f\n",
            min(pt_raw, na.rm=TRUE), max(pt_raw, na.rm=TRUE)))
Raw range: 0.000 – 25.356
stopifnot("order_cells produced all NA — check root node" = sum(!is.na(pt_raw)) > 0)

# Normalise and write to cd4_ref metadata
pt_min <- min(pt_raw, na.rm=TRUE)
pt_max <- max(pt_raw, na.rm=TRUE)

meta <- cd4_ref@meta.data
meta$monocle3_pseudotime      <- as.numeric(pt_raw)
meta$monocle3_pseudotime_norm <- 100 * (as.numeric(pt_raw) - pt_min) /
                                        (pt_max - pt_min)
cd4_ref@meta.data <- meta

cat(sprintf("Non-NA in metadata: %d / %d\n",
            sum(!is.na(cd4_ref@meta.data$monocle3_pseudotime_norm)),
            ncol(cd4_ref)))
Non-NA in metadata: 11466 / 11466
cat("\nMedian pseudotime per state (Naive < TCM < TEM < Temra expected):\n")

Median pseudotime per state (Naive < TCM < TEM < Temra expected):
cd4_ref@meta.data %>%
  group_by(!!sym(STATE_COL)) %>%
  summarise(median_pt = round(median(monocle3_pseudotime_norm, na.rm=TRUE), 1),
            .groups   = "drop") %>%
  arrange(median_pt) %>%
  print()

6.4 Visualisation


pr_graph_obj <- principal_graph(cds)[["UMAP"]]
pr_layout    <- t(cds@principal_graph_aux[["UMAP"]]$dp_mst)

m3_edge_list <- igraph::as_edgelist(pr_graph_obj)
m3_edge_df   <- do.call(rbind, lapply(seq_len(nrow(m3_edge_list)), function(i) {
  n1 <- m3_edge_list[i,1]; n2 <- m3_edge_list[i,2]
  data.frame(x1=pr_layout[n1,1], y1=pr_layout[n1,2],
             x2=pr_layout[n2,1], y2=pr_layout[n2,2])
}))

umap_m3            <- umap_df
umap_m3$pseudotime <- cd4_ref@meta.data$monocle3_pseudotime_norm

p_m3_states <- ggplot() +
  geom_point(data=umap_m3[sample(nrow(umap_m3)),],
             aes(x=UMAP_1, y=UMAP_2, colour=state), size=.35, alpha=.6) +
  geom_segment(data=m3_edge_df,
               aes(x=x1,y=y1,xend=x2,yend=y2),
               colour="black", linewidth=.6, alpha=.7, lineend="round") +
  scale_colour_manual(values=STATE_COLORS, name="State") +
  theme_classic() +
  labs(x="UMAP-1",y="UMAP-2", title="Monocle3 — Principal Graph & States") +
  theme(plot.title=element_text(size=13,face="bold"))

p_m3_pseudo <- ggplot(umap_m3[sample(nrow(umap_m3)),],
                       aes(x=UMAP_1, y=UMAP_2, colour=pseudotime)) +
  geom_point(size=.35, alpha=.7) +
  scale_colour_gradientn(
    colours=c("#0D0887","#6A00A8","#B12A90","#E16462","#FCA636","#F0F921"),
    name="Pseudotime\n(0–100)", limits=c(0,100)) +
  geom_segment(data=m3_edge_df,
               aes(x=x1,y=y1,xend=x2,yend=y2),
               colour="black", linewidth=.6, alpha=.6, inherit.aes=FALSE) +
  theme_classic() +
  labs(x="UMAP-1",y="UMAP-2", title="Monocle3 — Pseudotime on UMAP") +
  theme(plot.title=element_text(size=13,face="bold"))

m3_pt_df <- data.frame(
  state      = factor(cd4_ref@meta.data[[STATE_COL]], levels=STATE_ORDER),
  pseudotime = cd4_ref@meta.data$monocle3_pseudotime_norm
) %>% filter(!is.na(pseudotime), state %in% STATE_ORDER)

p_m3_violin <- ggplot(m3_pt_df, aes(x=state, y=pseudotime, fill=state)) +
  geom_violin(scale="width", trim=FALSE, alpha=.85) +
  geom_boxplot(width=.08, fill="white", outlier.size=.3, outlier.alpha=.3) +
  scale_fill_manual(values=STATE_COLORS, guide="none") +
  theme_classic() +
  labs(x=NULL, y="Pseudotime (0–100)", title="Monocle3 — Pseudotime per State") +
  theme(axis.text.x=element_text(size=11, face="bold"),
        plot.title=element_text(size=13,face="bold"))

print((p_m3_states | p_m3_pseudo) / (p_m3_violin | plot_spacer()))

p_m3_states

p_m3_pseudo

p_m3_violin 


saveRDS(cd4_ref,             "cd4_ref_dual_trajectory.rds")
saveRDS(cds,                 "monocle3_cds.rds")

6.5 Trajectory-Variable Genes

var_genes_use <- head(VariableFeatures(cd4_ref), 2000)
var_genes_use <- intersect(var_genes_use, rownames(cds))
cat(sprintf("Variable genes for graph_test: %d\n", length(var_genes_use)))
Variable genes for graph_test: 2000
cat("Running graph_test (Moran's I)...\n")
Running graph_test (Moran's I)...
pr_test_res <- graph_test(
  cds[var_genes_use, ],
  neighbor_graph = "principal_graph",
  cores          = 2
)

  |                                                                                                                            |   0%, ETA NA
  |                                                                                                                         |   0%, ETA 06:10
  |                                                                                                                         |   0%, ETA 03:33
  |                                                                                                                         |   0%, ETA 02:41
  |                                                                                                                         |   0%, ETA 02:08
  |                                                                                                                         |   0%, ETA 01:50
  |                                                                                                                         |   0%, ETA 01:36
  |                                                                                                                         |   0%, ETA 01:31
  |                                                                                                                         |   0%, ETA 01:19
  |=                                                                                                                        |   0%, ETA 01:09
  |=                                                                                                                        |   1%, ETA 01:08
  |=                                                                                                                        |   1%, ETA 01:03
  |=                                                                                                                        |   1%, ETA 01:02
  |=                                                                                                                        |   1%, ETA 00:58
  |=                                                                                                                        |   1%, ETA 00:58
  |=                                                                                                                        |   1%, ETA 00:54
  |=                                                                                                                        |   1%, ETA 00:54
  |=                                                                                                                        |   1%, ETA 00:52
  |=                                                                                                                        |   1%, ETA 00:52
  |=                                                                                                                        |   1%, ETA 00:49
  |=                                                                                                                        |   1%, ETA 00:49
  |=                                                                                                                        |   1%, ETA 00:47
  |=                                                                                                                        |   1%, ETA 00:48
  |=                                                                                                                        |   1%, ETA 00:46
  |==                                                                                                                       |   1%, ETA 00:46
  |==                                                                                                                       |   1%, ETA 00:45
  |==                                                                                                                       |   1%, ETA 00:45
  |==                                                                                                                       |   1%, ETA 00:44
  |==                                                                                                                       |   1%, ETA 00:45
  |==                                                                                                                       |   2%, ETA 00:44
  |==                                                                                                                       |   2%, ETA 00:44
  |==                                                                                                                       |   2%, ETA 00:43
  |==                                                                                                                       |   2%, ETA 00:44
  |==                                                                                                                       |   2%, ETA 00:43
  |==                                                                                                                       |   2%, ETA 00:43
  |==                                                                                                                       |   2%, ETA 00:42
  |==                                                                                                                       |   2%, ETA 00:43
  |==                                                                                                                       |   2%, ETA 00:42
  |==                                                                                                                       |   2%, ETA 00:42
  |==                                                                                                                       |   2%, ETA 00:42
  |==                                                                                                                       |   2%, ETA 00:42
  |===                                                                                                                      |   2%, ETA 00:42
  |===                                                                                                                      |   2%, ETA 00:43
  |===                                                                                                                      |   2%, ETA 00:42
  |===                                                                                                                      |   2%, ETA 00:42
  |===                                                                                                                      |   2%, ETA 00:42
  |===                                                                                                                      |   2%, ETA 00:42
  |===                                                                                                                      |   2%, ETA 00:42
  |===                                                                                                                      |   2%, ETA 00:42
  |===                                                                                                                      |   2%, ETA 00:41
  |===                                                                                                                      |   3%, ETA 00:42
  |===                                                                                                                      |   3%, ETA 00:42
  |===                                                                                                                      |   3%, ETA 00:42
  |===                                                                                                                      |   3%, ETA 00:42
  |===                                                                                                                      |   3%, ETA 00:41
  |===                                                                                                                      |   3%, ETA 00:42
  |===                                                                                                                      |   3%, ETA 00:41
  |====                                                                                                                     |   3%, ETA 00:41
  |====                                                                                                                     |   3%, ETA 00:41
  |====                                                                                                                     |   3%, ETA 00:41
  |====                                                                                                                     |   3%, ETA 00:41
  |====                                                                                                                     |   3%, ETA 00:41
  |====                                                                                                                     |   3%, ETA 00:40
  |====                                                                                                                     |   3%, ETA 00:41
  |====                                                                                                                     |   3%, ETA 00:40
  |====                                                                                                                     |   3%, ETA 00:41
  |====                                                                                                                     |   3%, ETA 00:40
  |====                                                                                                                     |   3%, ETA 00:41
  |====                                                                                                                     |   3%, ETA 00:40
  |====                                                                                                                     |   4%, ETA 00:40
  |====                                                                                                                     |   4%, ETA 00:40
  |====                                                                                                                     |   4%, ETA 00:40
  |====                                                                                                                     |   4%, ETA 00:40
  |====                                                                                                                     |   4%, ETA 00:40
  |=====                                                                                                                    |   4%, ETA 00:40
  |=====                                                                                                                    |   4%, ETA 00:40
  |=====                                                                                                                    |   4%, ETA 00:40
  |=====                                                                                                                    |   4%, ETA 00:40
  |=====                                                                                                                    |   4%, ETA 00:40
  |=====                                                                                                                    |   4%, ETA 00:40
  |=====                                                                                                                    |   4%, ETA 00:40
  |=====                                                                                                                    |   4%, ETA 00:40
  |=====                                                                                                                    |   4%, ETA 00:40
  |=====                                                                                                                    |   4%, ETA 00:40
  |=====                                                                                                                    |   4%, ETA 00:40
  |=====                                                                                                                    |   4%, ETA 00:40
  |=====                                                                                                                    |   4%, ETA 00:40
  |=====                                                                                                                    |   4%, ETA 00:40
  |=====                                                                                                                    |   4%, ETA 00:40
  |=====                                                                                                                    |   4%, ETA 00:40
  |======                                                                                                                   |   5%, ETA 00:40
  |======                                                                                                                   |   5%, ETA 00:39
  |======                                                                                                                   |   5%, ETA 00:40
  |======                                                                                                                   |   5%, ETA 00:39
  |======                                                                                                                   |   5%, ETA 00:40
  |======                                                                                                                   |   5%, ETA 00:39
  |======                                                                                                                   |   5%, ETA 00:39
  |======                                                                                                                   |   5%, ETA 00:39
  |======                                                                                                                   |   5%, ETA 00:39
  |======                                                                                                                   |   5%, ETA 00:39
  |======                                                                                                                   |   5%, ETA 00:39
  |======                                                                                                                   |   5%, ETA 00:39
  |======                                                                                                                   |   5%, ETA 00:39
  |======                                                                                                                   |   5%, ETA 00:39
  |======                                                                                                                   |   5%, ETA 00:39
  |======                                                                                                                   |   5%, ETA 00:39
  |======                                                                                                                   |   5%, ETA 00:38
  |=======                                                                                                                  |   5%, ETA 00:39
  |=======                                                                                                                  |   5%, ETA 00:38
  |=======                                                                                                                  |   6%, ETA 00:39
  |=======                                                                                                                  |   6%, ETA 00:38
  |=======                                                                                                                  |   6%, ETA 00:38
  |=======                                                                                                                  |   6%, ETA 00:38
  |=======                                                                                                                  |   6%, ETA 00:38
  |=======                                                                                                                  |   6%, ETA 00:38
  |=======                                                                                                                  |   6%, ETA 00:38
  |=======                                                                                                                  |   6%, ETA 00:38
  |=======                                                                                                                  |   6%, ETA 00:38
  |=======                                                                                                                  |   6%, ETA 00:38
  |========                                                                                                                 |   6%, ETA 00:38
  |========                                                                                                                 |   6%, ETA 00:38
  |========                                                                                                                 |   6%, ETA 00:37
  |========                                                                                                                 |   6%, ETA 00:37
  |========                                                                                                                 |   6%, ETA 00:37
  |========                                                                                                                 |   6%, ETA 00:37
  |========                                                                                                                 |   6%, ETA 00:37
  |========                                                                                                                 |   7%, ETA 00:37
  |========                                                                                                                 |   7%, ETA 00:37
  |========                                                                                                                 |   7%, ETA 00:37
  |========                                                                                                                 |   7%, ETA 00:37
  |========                                                                                                                 |   7%, ETA 00:37
  |========                                                                                                                 |   7%, ETA 00:37
  |========                                                                                                                 |   7%, ETA 00:36
  |========                                                                                                                 |   7%, ETA 00:36
  |========                                                                                                                 |   7%, ETA 00:36
  |========                                                                                                                 |   7%, ETA 00:36
  |=========                                                                                                                |   7%, ETA 00:36
  |=========                                                                                                                |   7%, ETA 00:36
  |=========                                                                                                                |   7%, ETA 00:36
  |=========                                                                                                                |   7%, ETA 00:36
  |=========                                                                                                                |   7%, ETA 00:36
  |=========                                                                                                                |   7%, ETA 00:36
  |=========                                                                                                                |   7%, ETA 00:36
  |=========                                                                                                                |   7%, ETA 00:36
  |=========                                                                                                                |   7%, ETA 00:36
  |=========                                                                                                                |   8%, ETA 00:36
  |=========                                                                                                                |   8%, ETA 00:36
  |=========                                                                                                                |   8%, ETA 00:36
  |=========                                                                                                                |   8%, ETA 00:36
  |=========                                                                                                                |   8%, ETA 00:35
  |=========                                                                                                                |   8%, ETA 00:35
  |=========                                                                                                                |   8%, ETA 00:35
  |=========                                                                                                                |   8%, ETA 00:35
  |==========                                                                                                               |   8%, ETA 00:35
  |==========                                                                                                               |   8%, ETA 00:35
  |==========                                                                                                               |   8%, ETA 00:35
  |==========                                                                                                               |   8%, ETA 00:35
  |==========                                                                                                               |   8%, ETA 00:35
  |==========                                                                                                               |   8%, ETA 00:35
  |==========                                                                                                               |   8%, ETA 00:35
  |==========                                                                                                               |   8%, ETA 00:35
  |==========                                                                                                               |   8%, ETA 00:35
  |==========                                                                                                               |   8%, ETA 00:35
  |==========                                                                                                               |   8%, ETA 00:35
  |==========                                                                                                               |   8%, ETA 00:35
  |==========                                                                                                               |   8%, ETA 00:35
  |==========                                                                                                               |   9%, ETA 00:35
  |==========                                                                                                               |   9%, ETA 00:35
  |==========                                                                                                               |   9%, ETA 00:34
  |===========                                                                                                              |   9%, ETA 00:34
  |===========                                                                                                              |   9%, ETA 00:34
  |===========                                                                                                              |   9%, ETA 00:34
  |===========                                                                                                              |   9%, ETA 00:34
  |===========                                                                                                              |   9%, ETA 00:34
  |===========                                                                                                              |   9%, ETA 00:34
  |===========                                                                                                              |   9%, ETA 00:34
  |===========                                                                                                              |   9%, ETA 00:34
  |===========                                                                                                              |   9%, ETA 00:34
  |===========                                                                                                              |   9%, ETA 00:34
  |===========                                                                                                              |   9%, ETA 00:34
  |===========                                                                                                              |   9%, ETA 00:34
  |===========                                                                                                              |   9%, ETA 00:34
  |===========                                                                                                              |   9%, ETA 00:34
  |===========                                                                                                              |   9%, ETA 00:34
  |===========                                                                                                              |   9%, ETA 00:34
  |===========                                                                                                              |  10%, ETA 00:34
  |============                                                                                                             |  10%, ETA 00:33
  |============                                                                                                             |  10%, ETA 00:33
  |============                                                                                                             |  10%, ETA 00:33
  |============                                                                                                             |  10%, ETA 00:33
  |============                                                                                                             |  10%, ETA 00:33
  |============                                                                                                             |  10%, ETA 00:33
  |============                                                                                                             |  10%, ETA 00:33
  |============                                                                                                             |  10%, ETA 00:33
  |============                                                                                                             |  10%, ETA 00:33
  |============                                                                                                             |  10%, ETA 00:33
  |============                                                                                                             |  10%, ETA 00:33
  |============                                                                                                             |  10%, ETA 00:33
  |============                                                                                                             |  10%, ETA 00:33
  |============                                                                                                             |  10%, ETA 00:33
  |============                                                                                                             |  10%, ETA 00:33
  |============                                                                                                             |  10%, ETA 00:33
  |=============                                                                                                            |  10%, ETA 00:33
  |=============                                                                                                            |  10%, ETA 00:33
  |=============                                                                                                            |  10%, ETA 00:33
  |=============                                                                                                            |  10%, ETA 00:33
  |=============                                                                                                            |  11%, ETA 00:33
  |=============                                                                                                            |  11%, ETA 00:32
  |=============                                                                                                            |  11%, ETA 00:32
  |=============                                                                                                            |  11%, ETA 00:32
  |=============                                                                                                            |  11%, ETA 00:32
  |=============                                                                                                            |  11%, ETA 00:32
  |=============                                                                                                            |  11%, ETA 00:32
  |=============                                                                                                            |  11%, ETA 00:32
  |=============                                                                                                            |  11%, ETA 00:32
  |=============                                                                                                            |  11%, ETA 00:32
  |=============                                                                                                            |  11%, ETA 00:32
  |=============                                                                                                            |  11%, ETA 00:32
  |=============                                                                                                            |  11%, ETA 00:32
  |==============                                                                                                           |  11%, ETA 00:32
  |==============                                                                                                           |  11%, ETA 00:32
  |==============                                                                                                           |  11%, ETA 00:32
  |==============                                                                                                           |  11%, ETA 00:32
  |==============                                                                                                           |  11%, ETA 00:32
  |==============                                                                                                           |  11%, ETA 00:32
  |==============                                                                                                           |  12%, ETA 00:32
  |==============                                                                                                           |  12%, ETA 00:32
  |==============                                                                                                           |  12%, ETA 00:32
  |==============                                                                                                           |  12%, ETA 00:32
  |==============                                                                                                           |  12%, ETA 00:31
  |==============                                                                                                           |  12%, ETA 00:31
  |==============                                                                                                           |  12%, ETA 00:31
  |==============                                                                                                           |  12%, ETA 00:31
  |==============                                                                                                           |  12%, ETA 00:31
  |==============                                                                                                           |  12%, ETA 00:31
  |===============                                                                                                          |  12%, ETA 00:31
  |===============                                                                                                          |  12%, ETA 00:31
  |===============                                                                                                          |  12%, ETA 00:31
  |===============                                                                                                          |  12%, ETA 00:31
  |===============                                                                                                          |  12%, ETA 00:31
  |===============                                                                                                          |  12%, ETA 00:31
  |===============                                                                                                          |  12%, ETA 00:31
  |===============                                                                                                          |  12%, ETA 00:31
  |===============                                                                                                          |  12%, ETA 00:31
  |===============                                                                                                          |  12%, ETA 00:31
  |===============                                                                                                          |  12%, ETA 00:31
  |===============                                                                                                          |  13%, ETA 00:31
  |===============                                                                                                          |  13%, ETA 00:31
  |===============                                                                                                          |  13%, ETA 00:31
  |===============                                                                                                          |  13%, ETA 00:31
  |===============                                                                                                          |  13%, ETA 00:31
  |===============                                                                                                          |  13%, ETA 00:31
  |================                                                                                                         |  13%, ETA 00:31
  |================                                                                                                         |  13%, ETA 00:31
  |================                                                                                                         |  13%, ETA 00:31
  |================                                                                                                         |  13%, ETA 00:31
  |================                                                                                                         |  13%, ETA 00:31
  |================                                                                                                         |  13%, ETA 00:30
  |================                                                                                                         |  13%, ETA 00:30
  |================                                                                                                         |  13%, ETA 00:30
  |================                                                                                                         |  13%, ETA 00:30
  |================                                                                                                         |  13%, ETA 00:30
  |================                                                                                                         |  13%, ETA 00:30
  |================                                                                                                         |  13%, ETA 00:30
  |================                                                                                                         |  13%, ETA 00:30
  |================                                                                                                         |  14%, ETA 00:30
  |================                                                                                                         |  14%, ETA 00:30
  |================                                                                                                         |  14%, ETA 00:30
  |=================                                                                                                        |  14%, ETA 00:30
  |=================                                                                                                        |  14%, ETA 00:30
  |=================                                                                                                        |  14%, ETA 00:30
  |=================                                                                                                        |  14%, ETA 00:30
  |=================                                                                                                        |  14%, ETA 00:30
  |=================                                                                                                        |  14%, ETA 00:30
  |=================                                                                                                        |  14%, ETA 00:30
  |=================                                                                                                        |  14%, ETA 00:30
  |=================                                                                                                        |  14%, ETA 00:30
  |=================                                                                                                        |  14%, ETA 00:30
  |=================                                                                                                        |  14%, ETA 00:30
  |=================                                                                                                        |  14%, ETA 00:30
  |=================                                                                                                        |  14%, ETA 00:30
  |=================                                                                                                        |  14%, ETA 00:30
  |=================                                                                                                        |  14%, ETA 00:30
  |=================                                                                                                        |  14%, ETA 00:30
  |=================                                                                                                        |  14%, ETA 00:30
  |==================                                                                                                       |  14%, ETA 00:30
  |==================                                                                                                       |  15%, ETA 00:30
  |==================                                                                                                       |  15%, ETA 00:30
  |==================                                                                                                       |  15%, ETA 00:30
  |==================                                                                                                       |  15%, ETA 00:30
  |==================                                                                                                       |  15%, ETA 00:30
  |==================                                                                                                       |  15%, ETA 00:30
  |==================                                                                                                       |  15%, ETA 00:30
  |==================                                                                                                       |  15%, ETA 00:29
  |==================                                                                                                       |  15%, ETA 00:29
  |==================                                                                                                       |  15%, ETA 00:29
  |==================                                                                                                       |  15%, ETA 00:29
  |==================                                                                                                       |  15%, ETA 00:29
  |==================                                                                                                       |  15%, ETA 00:29
  |==================                                                                                                       |  15%, ETA 00:29
  |==================                                                                                                       |  15%, ETA 00:29
  |===================                                                                                                      |  15%, ETA 00:29
  |===================                                                                                                      |  15%, ETA 00:29
  |===================                                                                                                      |  15%, ETA 00:29
  |===================                                                                                                      |  15%, ETA 00:29
  |===================                                                                                                      |  16%, ETA 00:29
  |===================                                                                                                      |  16%, ETA 00:29
  |===================                                                                                                      |  16%, ETA 00:29
  |===================                                                                                                      |  16%, ETA 00:29
  |===================                                                                                                      |  16%, ETA 00:29
  |===================                                                                                                      |  16%, ETA 00:29
  |===================                                                                                                      |  16%, ETA 00:29
  |===================                                                                                                      |  16%, ETA 00:29
  |===================                                                                                                      |  16%, ETA 00:29
  |===================                                                                                                      |  16%, ETA 00:29
  |===================                                                                                                      |  16%, ETA 00:29
  |===================                                                                                                      |  16%, ETA 00:29
  |===================                                                                                                      |  16%, ETA 00:29
  |====================                                                                                                     |  16%, ETA 00:29
  |====================                                                                                                     |  16%, ETA 00:29
  |====================                                                                                                     |  16%, ETA 00:29
  |====================                                                                                                     |  16%, ETA 00:29
  |====================                                                                                                     |  16%, ETA 00:29
  |====================                                                                                                     |  16%, ETA 00:29
  |====================                                                                                                     |  16%, ETA 00:29
  |====================                                                                                                     |  16%, ETA 00:29
  |====================                                                                                                     |  17%, ETA 00:28
  |====================                                                                                                     |  17%, ETA 00:28
  |====================                                                                                                     |  17%, ETA 00:28
  |====================                                                                                                     |  17%, ETA 00:28
  |====================                                                                                                     |  17%, ETA 00:28
  |====================                                                                                                     |  17%, ETA 00:28
  |====================                                                                                                     |  17%, ETA 00:28
  |====================                                                                                                     |  17%, ETA 00:28
  |=====================                                                                                                    |  17%, ETA 00:28
  |=====================                                                                                                    |  17%, ETA 00:28
  |=====================                                                                                                    |  17%, ETA 00:28
  |=====================                                                                                                    |  17%, ETA 00:28
  |=====================                                                                                                    |  17%, ETA 00:28
  |=====================                                                                                                    |  17%, ETA 00:28
  |=====================                                                                                                    |  17%, ETA 00:28
  |=====================                                                                                                    |  17%, ETA 00:28
  |=====================                                                                                                    |  17%, ETA 00:28
  |=====================                                                                                                    |  17%, ETA 00:28
  |=====================                                                                                                    |  17%, ETA 00:28
  |=====================                                                                                                    |  18%, ETA 00:28
  |=====================                                                                                                    |  18%, ETA 00:28
  |=====================                                                                                                    |  18%, ETA 00:28
  |=====================                                                                                                    |  18%, ETA 00:28
  |=====================                                                                                                    |  18%, ETA 00:28
  |=====================                                                                                                    |  18%, ETA 00:28
  |======================                                                                                                   |  18%, ETA 00:28
  |======================                                                                                                   |  18%, ETA 00:28
  |======================                                                                                                   |  18%, ETA 00:28
  |======================                                                                                                   |  18%, ETA 00:28
  |======================                                                                                                   |  18%, ETA 00:28
  |======================                                                                                                   |  18%, ETA 00:28
  |======================                                                                                                   |  18%, ETA 00:28
  |======================                                                                                                   |  18%, ETA 00:28
  |======================                                                                                                   |  18%, ETA 00:28
  |======================                                                                                                   |  18%, ETA 00:27
  |======================                                                                                                   |  18%, ETA 00:27
  |======================                                                                                                   |  18%, ETA 00:27
  |======================                                                                                                   |  18%, ETA 00:27
  |======================                                                                                                   |  18%, ETA 00:27
  |======================                                                                                                   |  18%, ETA 00:27
  |======================                                                                                                   |  19%, ETA 00:27
  |=======================                                                                                                  |  19%, ETA 00:27
  |=======================                                                                                                  |  19%, ETA 00:27
  |=======================                                                                                                  |  19%, ETA 00:27
  |=======================                                                                                                  |  19%, ETA 00:27
  |=======================                                                                                                  |  19%, ETA 00:27
  |=======================                                                                                                  |  19%, ETA 00:27
  |=======================                                                                                                  |  19%, ETA 00:27
  |=======================                                                                                                  |  19%, ETA 00:27
  |=======================                                                                                                  |  19%, ETA 00:27
  |=======================                                                                                                  |  19%, ETA 00:27
  |=======================                                                                                                  |  19%, ETA 00:27
  |=======================                                                                                                  |  19%, ETA 00:27
  |=======================                                                                                                  |  19%, ETA 00:27
  |=======================                                                                                                  |  19%, ETA 00:27
  |=======================                                                                                                  |  19%, ETA 00:27
  |=======================                                                                                                  |  19%, ETA 00:27
  |=======================                                                                                                  |  19%, ETA 00:27
  |========================                                                                                                 |  19%, ETA 00:27
  |========================                                                                                                 |  20%, ETA 00:27
  |========================                                                                                                 |  20%, ETA 00:27
  |========================                                                                                                 |  20%, ETA 00:27
  |========================                                                                                                 |  20%, ETA 00:27
  |========================                                                                                                 |  20%, ETA 00:27
  |========================                                                                                                 |  20%, ETA 00:27
  |========================                                                                                                 |  20%, ETA 00:27
  |========================                                                                                                 |  20%, ETA 00:27
  |========================                                                                                                 |  20%, ETA 00:27
  |========================                                                                                                 |  20%, ETA 00:27
  |========================                                                                                                 |  20%, ETA 00:27
  |========================                                                                                                 |  20%, ETA 00:27
  |========================                                                                                                 |  20%, ETA 00:27
  |========================                                                                                                 |  20%, ETA 00:27
  |========================                                                                                                 |  20%, ETA 00:27
  |=========================                                                                                                |  20%, ETA 00:27
  |=========================                                                                                                |  20%, ETA 00:27
  |=========================                                                                                                |  20%, ETA 00:27
  |=========================                                                                                                |  20%, ETA 00:26
  |=========================                                                                                                |  20%, ETA 00:26
  |=========================                                                                                                |  20%, ETA 00:26
  |=========================                                                                                                |  21%, ETA 00:26
  |=========================                                                                                                |  21%, ETA 00:26
  |=========================                                                                                                |  21%, ETA 00:26
  |=========================                                                                                                |  21%, ETA 00:26
  |=========================                                                                                                |  21%, ETA 00:26
  |=========================                                                                                                |  21%, ETA 00:26
  |=========================                                                                                                |  21%, ETA 00:26
  |=========================                                                                                                |  21%, ETA 00:26
  |=========================                                                                                                |  21%, ETA 00:26
  |=========================                                                                                                |  21%, ETA 00:26
  |=========================                                                                                                |  21%, ETA 00:26
  |==========================                                                                                               |  21%, ETA 00:26
  |==========================                                                                                               |  21%, ETA 00:26
  |==========================                                                                                               |  21%, ETA 00:26
  |==========================                                                                                               |  21%, ETA 00:26
  |==========================                                                                                               |  21%, ETA 00:26
  |==========================                                                                                               |  21%, ETA 00:26
  |==========================                                                                                               |  21%, ETA 00:26
  |==========================                                                                                               |  21%, ETA 00:26
  |==========================                                                                                               |  22%, ETA 00:26
  |==========================                                                                                               |  22%, ETA 00:26
  |==========================                                                                                               |  22%, ETA 00:26
  |==========================                                                                                               |  22%, ETA 00:26
  |==========================                                                                                               |  22%, ETA 00:26
  |==========================                                                                                               |  22%, ETA 00:26
  |==========================                                                                                               |  22%, ETA 00:26
  |==========================                                                                                               |  22%, ETA 00:26
  |==========================                                                                                               |  22%, ETA 00:26
  |===========================                                                                                              |  22%, ETA 00:26
  |===========================                                                                                              |  22%, ETA 00:26
  |===========================                                                                                              |  22%, ETA 00:26
  |===========================                                                                                              |  22%, ETA 00:26
  |===========================                                                                                              |  22%, ETA 00:26
  |===========================                                                                                              |  22%, ETA 00:26
  |===========================                                                                                              |  22%, ETA 00:26
  |===========================                                                                                              |  22%, ETA 00:26
  |===========================                                                                                              |  22%, ETA 00:26
  |===========================                                                                                              |  22%, ETA 00:26
  |===========================                                                                                              |  22%, ETA 00:26
  |===========================                                                                                              |  22%, ETA 00:26
  |===========================                                                                                              |  23%, ETA 00:26
  |===========================                                                                                              |  23%, ETA 00:26
  |===========================                                                                                              |  23%, ETA 00:26
  |===========================                                                                                              |  23%, ETA 00:26
  |============================                                                                                             |  23%, ETA 00:26
  |============================                                                                                             |  23%, ETA 00:26
  |============================                                                                                             |  23%, ETA 00:25
  |============================                                                                                             |  23%, ETA 00:25
  |============================                                                                                             |  23%, ETA 00:26
  |============================                                                                                             |  23%, ETA 00:26
  |============================                                                                                             |  23%, ETA 00:26
  |============================                                                                                             |  23%, ETA 00:26
  |============================                                                                                             |  23%, ETA 00:26
  |============================                                                                                             |  23%, ETA 00:26
  |============================                                                                                             |  23%, ETA 00:26
  |============================                                                                                             |  23%, ETA 00:26
  |============================                                                                                             |  23%, ETA 00:26
  |============================                                                                                             |  23%, ETA 00:26
  |============================                                                                                             |  23%, ETA 00:26
  |============================                                                                                             |  24%, ETA 00:26
  |============================                                                                                             |  24%, ETA 00:26
  |=============================                                                                                            |  24%, ETA 00:25
  |=============================                                                                                            |  24%, ETA 00:25
  |=============================                                                                                            |  24%, ETA 00:25
  |=============================                                                                                            |  24%, ETA 00:25
  |=============================                                                                                            |  24%, ETA 00:25
  |=============================                                                                                            |  24%, ETA 00:25
  |=============================                                                                                            |  24%, ETA 00:25
  |=============================                                                                                            |  24%, ETA 00:25
  |=============================                                                                                            |  24%, ETA 00:25
  |=============================                                                                                            |  24%, ETA 00:25
  |=============================                                                                                            |  24%, ETA 00:25
  |=============================                                                                                            |  24%, ETA 00:25
  |=============================                                                                                            |  24%, ETA 00:25
  |=============================                                                                                            |  24%, ETA 00:25
  |=============================                                                                                            |  24%, ETA 00:25
  |=============================                                                                                            |  24%, ETA 00:25
  |==============================                                                                                           |  24%, ETA 00:25
  |==============================                                                                                           |  24%, ETA 00:25
  |==============================                                                                                           |  24%, ETA 00:25
  |==============================                                                                                           |  25%, ETA 00:25
  |==============================                                                                                           |  25%, ETA 00:25
  |==============================                                                                                           |  25%, ETA 00:25
  |==============================                                                                                           |  25%, ETA 00:25
  |==============================                                                                                           |  25%, ETA 00:25
  |==============================                                                                                           |  25%, ETA 00:25
  |==============================                                                                                           |  25%, ETA 00:25
  |==============================                                                                                           |  25%, ETA 00:25
  |==============================                                                                                           |  25%, ETA 00:25
  |==============================                                                                                           |  25%, ETA 00:25
  |==============================                                                                                           |  25%, ETA 00:25
  |==============================                                                                                           |  25%, ETA 00:25
  |==============================                                                                                           |  25%, ETA 00:25
  |==============================                                                                                           |  25%, ETA 00:25
  |===============================                                                                                          |  25%, ETA 00:25
  |===============================                                                                                          |  25%, ETA 00:25
  |===============================                                                                                          |  25%, ETA 00:25
  |===============================                                                                                          |  25%, ETA 00:25
  |===============================                                                                                          |  25%, ETA 00:25
  |===============================                                                                                          |  26%, ETA 00:25
  |===============================                                                                                          |  26%, ETA 00:25
  |===============================                                                                                          |  26%, ETA 00:25
  |===============================                                                                                          |  26%, ETA 00:25
  |===============================                                                                                          |  26%, ETA 00:24
  |===============================                                                                                          |  26%, ETA 00:24
  |===============================                                                                                          |  26%, ETA 00:24
  |===============================                                                                                          |  26%, ETA 00:24
  |===============================                                                                                          |  26%, ETA 00:24
  |===============================                                                                                          |  26%, ETA 00:24
  |===============================                                                                                          |  26%, ETA 00:24
  |================================                                                                                         |  26%, ETA 00:24
  |================================                                                                                         |  26%, ETA 00:24
  |================================                                                                                         |  26%, ETA 00:24
  |================================                                                                                         |  26%, ETA 00:24
  |================================                                                                                         |  26%, ETA 00:24
  |================================                                                                                         |  26%, ETA 00:24
  |================================                                                                                         |  26%, ETA 00:24
  |================================                                                                                         |  26%, ETA 00:24
  |================================                                                                                         |  26%, ETA 00:24
  |================================                                                                                         |  26%, ETA 00:24
  |================================                                                                                         |  27%, ETA 00:24
  |================================                                                                                         |  27%, ETA 00:24
  |================================                                                                                         |  27%, ETA 00:24
  |================================                                                                                         |  27%, ETA 00:24
  |================================                                                                                         |  27%, ETA 00:24
  |================================                                                                                         |  27%, ETA 00:24
  |================================                                                                                         |  27%, ETA 00:24
  |=================================                                                                                        |  27%, ETA 00:24
  |=================================                                                                                        |  27%, ETA 00:24
  |=================================                                                                                        |  27%, ETA 00:24
  |=================================                                                                                        |  27%, ETA 00:24
  |=================================                                                                                        |  27%, ETA 00:24
  |=================================                                                                                        |  27%, ETA 00:24
  |=================================                                                                                        |  27%, ETA 00:24
  |=================================                                                                                        |  27%, ETA 00:24
  |=================================                                                                                        |  27%, ETA 00:24
  |=================================                                                                                        |  27%, ETA 00:24
  |=================================                                                                                        |  27%, ETA 00:24
  |=================================                                                                                        |  27%, ETA 00:24
  |=================================                                                                                        |  28%, ETA 00:24
  |=================================                                                                                        |  28%, ETA 00:24
  |=================================                                                                                        |  28%, ETA 00:24
  |=================================                                                                                        |  28%, ETA 00:24
  |==================================                                                                                       |  28%, ETA 00:24
  |==================================                                                                                       |  28%, ETA 00:24
  |==================================                                                                                       |  28%, ETA 00:24
  |==================================                                                                                       |  28%, ETA 00:24
  |==================================                                                                                       |  28%, ETA 00:24
  |==================================                                                                                       |  28%, ETA 00:23
  |==================================                                                                                       |  28%, ETA 00:23
  |==================================                                                                                       |  28%, ETA 00:23
  |==================================                                                                                       |  28%, ETA 00:23
  |==================================                                                                                       |  28%, ETA 00:23
  |==================================                                                                                       |  28%, ETA 00:23
  |==================================                                                                                       |  28%, ETA 00:23
  |==================================                                                                                       |  28%, ETA 00:23
  |==================================                                                                                       |  28%, ETA 00:23
  |==================================                                                                                       |  28%, ETA 00:23
  |==================================                                                                                       |  28%, ETA 00:23
  |==================================                                                                                       |  28%, ETA 00:23
  |===================================                                                                                      |  29%, ETA 00:23
  |===================================                                                                                      |  29%, ETA 00:23
  |===================================                                                                                      |  29%, ETA 00:23
  |===================================                                                                                      |  29%, ETA 00:23
  |===================================                                                                                      |  29%, ETA 00:23
  |===================================                                                                                      |  29%, ETA 00:23
  |===================================                                                                                      |  29%, ETA 00:23
  |===================================                                                                                      |  29%, ETA 00:23
  |===================================                                                                                      |  29%, ETA 00:23
  |===================================                                                                                      |  29%, ETA 00:23
  |===================================                                                                                      |  29%, ETA 00:23
  |===================================                                                                                      |  29%, ETA 00:23
  |===================================                                                                                      |  29%, ETA 00:23
  |===================================                                                                                      |  29%, ETA 00:23
  |===================================                                                                                      |  29%, ETA 00:23
  |===================================                                                                                      |  29%, ETA 00:23
  |====================================                                                                                     |  29%, ETA 00:23
  |====================================                                                                                     |  29%, ETA 00:23
  |====================================                                                                                     |  29%, ETA 00:23
  |====================================                                                                                     |  30%, ETA 00:23
  |====================================                                                                                     |  30%, ETA 00:23
  |====================================                                                                                     |  30%, ETA 00:23
  |====================================                                                                                     |  30%, ETA 00:23
  |====================================                                                                                     |  30%, ETA 00:23
  |====================================                                                                                     |  30%, ETA 00:23
  |====================================                                                                                     |  30%, ETA 00:23
  |====================================                                                                                     |  30%, ETA 00:23
  |====================================                                                                                     |  30%, ETA 00:23
  |====================================                                                                                     |  30%, ETA 00:23
  |====================================                                                                                     |  30%, ETA 00:23
  |====================================                                                                                     |  30%, ETA 00:23
  |====================================                                                                                     |  30%, ETA 00:23
  |====================================                                                                                     |  30%, ETA 00:23
  |=====================================                                                                                    |  30%, ETA 00:23
  |=====================================                                                                                    |  30%, ETA 00:23
  |=====================================                                                                                    |  30%, ETA 00:23
  |=====================================                                                                                    |  30%, ETA 00:23
  |=====================================                                                                                    |  30%, ETA 00:22
  |=====================================                                                                                    |  30%, ETA 00:22
  |=====================================                                                                                    |  30%, ETA 00:22
  |=====================================                                                                                    |  31%, ETA 00:22
  |=====================================                                                                                    |  31%, ETA 00:22
  |=====================================                                                                                    |  31%, ETA 00:22
  |=====================================                                                                                    |  31%, ETA 00:22
  |=====================================                                                                                    |  31%, ETA 00:22
  |=====================================                                                                                    |  31%, ETA 00:22
  |=====================================                                                                                    |  31%, ETA 00:22
  |=====================================                                                                                    |  31%, ETA 00:22
  |=====================================                                                                                    |  31%, ETA 00:22
  |======================================                                                                                   |  31%, ETA 00:22
  |======================================                                                                                   |  31%, ETA 00:22
  |======================================                                                                                   |  31%, ETA 00:22
  |======================================                                                                                   |  31%, ETA 00:22
  |======================================                                                                                   |  31%, ETA 00:22
  |======================================                                                                                   |  31%, ETA 00:22
  |======================================                                                                                   |  31%, ETA 00:22
  |======================================                                                                                   |  31%, ETA 00:22
  |======================================                                                                                   |  31%, ETA 00:22
  |======================================                                                                                   |  31%, ETA 00:22
  |======================================                                                                                   |  32%, ETA 00:22
  |======================================                                                                                   |  32%, ETA 00:22
  |======================================                                                                                   |  32%, ETA 00:22
  |======================================                                                                                   |  32%, ETA 00:22
  |======================================                                                                                   |  32%, ETA 00:22
  |======================================                                                                                   |  32%, ETA 00:22
  |======================================                                                                                   |  32%, ETA 00:22
  |=======================================                                                                                  |  32%, ETA 00:22
  |=======================================                                                                                  |  32%, ETA 00:22
  |=======================================                                                                                  |  32%, ETA 00:22
  |=======================================                                                                                  |  32%, ETA 00:22
  |=======================================                                                                                  |  32%, ETA 00:22
  |=======================================                                                                                  |  32%, ETA 00:22
  |=======================================                                                                                  |  32%, ETA 00:22
  |=======================================                                                                                  |  32%, ETA 00:22
  |=======================================                                                                                  |  32%, ETA 00:22
  |=======================================                                                                                  |  32%, ETA 00:22
  |=======================================                                                                                  |  32%, ETA 00:22
  |=======================================                                                                                  |  32%, ETA 00:22
  |=======================================                                                                                  |  32%, ETA 00:22
  |=======================================                                                                                  |  33%, ETA 00:22
  |=======================================                                                                                  |  33%, ETA 00:22
  |========================================                                                                                 |  33%, ETA 00:22
  |========================================                                                                                 |  33%, ETA 00:22
  |========================================                                                                                 |  33%, ETA 00:22
  |========================================                                                                                 |  33%, ETA 00:22
  |========================================                                                                                 |  33%, ETA 00:22
  |========================================                                                                                 |  33%, ETA 00:22
  |========================================                                                                                 |  33%, ETA 00:21
  |========================================                                                                                 |  33%, ETA 00:21
  |========================================                                                                                 |  33%, ETA 00:21
  |========================================                                                                                 |  33%, ETA 00:21
  |========================================                                                                                 |  33%, ETA 00:21
  |========================================                                                                                 |  33%, ETA 00:21
  |========================================                                                                                 |  33%, ETA 00:21
  |========================================                                                                                 |  33%, ETA 00:21
  |========================================                                                                                 |  33%, ETA 00:21
  |========================================                                                                                 |  33%, ETA 00:21
  |========================================                                                                                 |  33%, ETA 00:21
  |=========================================                                                                                |  34%, ETA 00:21
  |=========================================                                                                                |  34%, ETA 00:21
  |=========================================                                                                                |  34%, ETA 00:21
  |=========================================                                                                                |  34%, ETA 00:21
  |=========================================                                                                                |  34%, ETA 00:21
  |=========================================                                                                                |  34%, ETA 00:21
  |=========================================                                                                                |  34%, ETA 00:21
  |=========================================                                                                                |  34%, ETA 00:21
  |=========================================                                                                                |  34%, ETA 00:21
  |=========================================                                                                                |  34%, ETA 00:21
  |=========================================                                                                                |  34%, ETA 00:21
  |=========================================                                                                                |  34%, ETA 00:21
  |=========================================                                                                                |  34%, ETA 00:21
  |=========================================                                                                                |  34%, ETA 00:21
  |=========================================                                                                                |  34%, ETA 00:21
  |=========================================                                                                                |  34%, ETA 00:21
  |==========================================                                                                               |  34%, ETA 00:21
  |==========================================                                                                               |  34%, ETA 00:21
  |==========================================                                                                               |  34%, ETA 00:21
  |==========================================                                                                               |  34%, ETA 00:21
  |==========================================                                                                               |  34%, ETA 00:21
  |==========================================                                                                               |  35%, ETA 00:21
  |==========================================                                                                               |  35%, ETA 00:21
  |==========================================                                                                               |  35%, ETA 00:21
  |==========================================                                                                               |  35%, ETA 00:21
  |==========================================                                                                               |  35%, ETA 00:21
  |==========================================                                                                               |  35%, ETA 00:21
  |==========================================                                                                               |  35%, ETA 00:21
  |==========================================                                                                               |  35%, ETA 00:21
  |==========================================                                                                               |  35%, ETA 00:21
  |==========================================                                                                               |  35%, ETA 00:21
  |==========================================                                                                               |  35%, ETA 00:21
  |==========================================                                                                               |  35%, ETA 00:21
  |===========================================                                                                              |  35%, ETA 00:21
  |===========================================                                                                              |  35%, ETA 00:21
  |===========================================                                                                              |  35%, ETA 00:21
  |===========================================                                                                              |  35%, ETA 00:21
  |===========================================                                                                              |  35%, ETA 00:21
  |===========================================                                                                              |  35%, ETA 00:21
  |===========================================                                                                              |  35%, ETA 00:21
  |===========================================                                                                              |  36%, ETA 00:21
  |===========================================                                                                              |  36%, ETA 00:21
  |===========================================                                                                              |  36%, ETA 00:21
  |===========================================                                                                              |  36%, ETA 00:21
  |===========================================                                                                              |  36%, ETA 00:20
  |===========================================                                                                              |  36%, ETA 00:20
  |===========================================                                                                              |  36%, ETA 00:20
  |===========================================                                                                              |  36%, ETA 00:20
  |===========================================                                                                              |  36%, ETA 00:20
  |===========================================                                                                              |  36%, ETA 00:20
  |============================================                                                                             |  36%, ETA 00:20
  |============================================                                                                             |  36%, ETA 00:20
  |============================================                                                                             |  36%, ETA 00:20
  |============================================                                                                             |  36%, ETA 00:20
  |============================================                                                                             |  36%, ETA 00:20
  |============================================                                                                             |  36%, ETA 00:20
  |============================================                                                                             |  36%, ETA 00:20
  |============================================                                                                             |  36%, ETA 00:20
  |============================================                                                                             |  36%, ETA 00:20
  |============================================                                                                             |  36%, ETA 00:20
  |============================================                                                                             |  36%, ETA 00:20
  |============================================                                                                             |  37%, ETA 00:20
  |============================================                                                                             |  37%, ETA 00:20
  |============================================                                                                             |  37%, ETA 00:20
  |============================================                                                                             |  37%, ETA 00:20
  |============================================                                                                             |  37%, ETA 00:20
  |=============================================                                                                            |  37%, ETA 00:20
  |=============================================                                                                            |  37%, ETA 00:20
  |=============================================                                                                            |  37%, ETA 00:20
  |=============================================                                                                            |  37%, ETA 00:20
  |=============================================                                                                            |  37%, ETA 00:20
  |=============================================                                                                            |  37%, ETA 00:20
  |=============================================                                                                            |  37%, ETA 00:20
  |=============================================                                                                            |  37%, ETA 00:20
  |=============================================                                                                            |  37%, ETA 00:20
  |=============================================                                                                            |  37%, ETA 00:20
  |=============================================                                                                            |  37%, ETA 00:20
  |=============================================                                                                            |  37%, ETA 00:20
  |=============================================                                                                            |  37%, ETA 00:20
  |=============================================                                                                            |  37%, ETA 00:20
  |=============================================                                                                            |  38%, ETA 00:20
  |=============================================                                                                            |  38%, ETA 00:20
  |=============================================                                                                            |  38%, ETA 00:20
  |==============================================                                                                           |  38%, ETA 00:20
  |==============================================                                                                           |  38%, ETA 00:20
  |==============================================                                                                           |  38%, ETA 00:20
  |==============================================                                                                           |  38%, ETA 00:20
  |==============================================                                                                           |  38%, ETA 00:20
  |==============================================                                                                           |  38%, ETA 00:20
  |==============================================                                                                           |  38%, ETA 00:20
  |==============================================                                                                           |  38%, ETA 00:20
  |==============================================                                                                           |  38%, ETA 00:20
  |==============================================                                                                           |  38%, ETA 00:20
  |==============================================                                                                           |  38%, ETA 00:20
  |==============================================                                                                           |  38%, ETA 00:20
  |==============================================                                                                           |  38%, ETA 00:20
  |==============================================                                                                           |  38%, ETA 00:20
  |==============================================                                                                           |  38%, ETA 00:20
  |==============================================                                                                           |  38%, ETA 00:20
  |===============================================                                                                          |  38%, ETA 00:19
  |===============================================                                                                          |  38%, ETA 00:19
  |===============================================                                                                          |  39%, ETA 00:19
  |===============================================                                                                          |  39%, ETA 00:19
  |===============================================                                                                          |  39%, ETA 00:19
  |===============================================                                                                          |  39%, ETA 00:19
  |===============================================                                                                          |  39%, ETA 00:19
  |===============================================                                                                          |  39%, ETA 00:19
  |===============================================                                                                          |  39%, ETA 00:19
  |===============================================                                                                          |  39%, ETA 00:19
  |===============================================                                                                          |  39%, ETA 00:19
  |===============================================                                                                          |  39%, ETA 00:19
  |===============================================                                                                          |  39%, ETA 00:19
  |===============================================                                                                          |  39%, ETA 00:19
  |===============================================                                                                          |  39%, ETA 00:19
  |===============================================                                                                          |  39%, ETA 00:19
  |================================================                                                                         |  39%, ETA 00:19
  |================================================                                                                         |  39%, ETA 00:19
  |================================================                                                                         |  39%, ETA 00:19
  |================================================                                                                         |  40%, ETA 00:19
  |================================================                                                                         |  40%, ETA 00:19
  |================================================                                                                         |  40%, ETA 00:19
  |================================================                                                                         |  40%, ETA 00:19
  |================================================                                                                         |  40%, ETA 00:19
  |================================================                                                                         |  40%, ETA 00:19
  |================================================                                                                         |  40%, ETA 00:19
  |================================================                                                                         |  40%, ETA 00:19
  |================================================                                                                         |  40%, ETA 00:19
  |================================================                                                                         |  40%, ETA 00:19
  |================================================                                                                         |  40%, ETA 00:19
  |================================================                                                                         |  40%, ETA 00:19
  |=================================================                                                                        |  40%, ETA 00:19
  |=================================================                                                                        |  40%, ETA 00:19
  |=================================================                                                                        |  40%, ETA 00:19
  |=================================================                                                                        |  40%, ETA 00:19
  |=================================================                                                                        |  40%, ETA 00:19
  |=================================================                                                                        |  40%, ETA 00:19
  |=================================================                                                                        |  40%, ETA 00:19
  |=================================================                                                                        |  40%, ETA 00:19
  |=================================================                                                                        |  40%, ETA 00:19
  |=================================================                                                                        |  41%, ETA 00:19
  |=================================================                                                                        |  41%, ETA 00:19
  |=================================================                                                                        |  41%, ETA 00:19
  |=================================================                                                                        |  41%, ETA 00:19
  |=================================================                                                                        |  41%, ETA 00:19
  |=================================================                                                                        |  41%, ETA 00:19
  |=================================================                                                                        |  41%, ETA 00:19
  |=================================================                                                                        |  41%, ETA 00:19
  |==================================================                                                                       |  41%, ETA 00:19
  |==================================================                                                                       |  41%, ETA 00:19
  |==================================================                                                                       |  41%, ETA 00:19
  |==================================================                                                                       |  41%, ETA 00:18
  |==================================================                                                                       |  41%, ETA 00:18
  |==================================================                                                                       |  41%, ETA 00:18
  |==================================================                                                                       |  41%, ETA 00:18
  |==================================================                                                                       |  41%, ETA 00:18
  |==================================================                                                                       |  41%, ETA 00:18
  |==================================================                                                                       |  41%, ETA 00:18
  |==================================================                                                                       |  41%, ETA 00:18
  |==================================================                                                                       |  42%, ETA 00:18
  |==================================================                                                                       |  42%, ETA 00:18
  |==================================================                                                                       |  42%, ETA 00:18
  |==================================================                                                                       |  42%, ETA 00:18
  |==================================================                                                                       |  42%, ETA 00:18
  |===================================================                                                                      |  42%, ETA 00:18
  |===================================================                                                                      |  42%, ETA 00:18
  |===================================================                                                                      |  42%, ETA 00:18
  |===================================================                                                                      |  42%, ETA 00:18
  |===================================================                                                                      |  42%, ETA 00:18
  |===================================================                                                                      |  42%, ETA 00:18
  |===================================================                                                                      |  42%, ETA 00:18
  |===================================================                                                                      |  42%, ETA 00:18
  |===================================================                                                                      |  42%, ETA 00:18
  |===================================================                                                                      |  42%, ETA 00:18
  |===================================================                                                                      |  42%, ETA 00:18
  |===================================================                                                                      |  42%, ETA 00:18
  |===================================================                                                                      |  42%, ETA 00:18
  |===================================================                                                                      |  42%, ETA 00:18
  |===================================================                                                                      |  42%, ETA 00:18
  |===================================================                                                                      |  42%, ETA 00:18
  |===================================================                                                                      |  43%, ETA 00:18
  |====================================================                                                                     |  43%, ETA 00:18
  |====================================================                                                                     |  43%, ETA 00:18
  |====================================================                                                                     |  43%, ETA 00:18
  |====================================================                                                                     |  43%, ETA 00:18
  |====================================================                                                                     |  43%, ETA 00:18
  |====================================================                                                                     |  43%, ETA 00:18
  |====================================================                                                                     |  43%, ETA 00:18
  |====================================================                                                                     |  43%, ETA 00:18
  |====================================================                                                                     |  43%, ETA 00:18
  |====================================================                                                                     |  43%, ETA 00:18
  |====================================================                                                                     |  43%, ETA 00:18
  |====================================================                                                                     |  43%, ETA 00:18
  |====================================================                                                                     |  43%, ETA 00:18
  |====================================================                                                                     |  43%, ETA 00:18
  |====================================================                                                                     |  43%, ETA 00:18
  |====================================================                                                                     |  43%, ETA 00:18
  |=====================================================                                                                    |  43%, ETA 00:18
  |=====================================================                                                                    |  43%, ETA 00:18
  |=====================================================                                                                    |  44%, ETA 00:18
  |=====================================================                                                                    |  44%, ETA 00:18
  |=====================================================                                                                    |  44%, ETA 00:18
  |=====================================================                                                                    |  44%, ETA 00:18
  |=====================================================                                                                    |  44%, ETA 00:18
  |=====================================================                                                                    |  44%, ETA 00:18
  |=====================================================                                                                    |  44%, ETA 00:18
  |=====================================================                                                                    |  44%, ETA 00:18
  |=====================================================                                                                    |  44%, ETA 00:18
  |=====================================================                                                                    |  44%, ETA 00:18
  |=====================================================                                                                    |  44%, ETA 00:17
  |=====================================================                                                                    |  44%, ETA 00:17
  |=====================================================                                                                    |  44%, ETA 00:17
  |=====================================================                                                                    |  44%, ETA 00:17
  |=====================================================                                                                    |  44%, ETA 00:17
  |======================================================                                                                   |  44%, ETA 00:17
  |======================================================                                                                   |  44%, ETA 00:17
  |======================================================                                                                   |  44%, ETA 00:17
  |======================================================                                                                   |  44%, ETA 00:17
  |======================================================                                                                   |  44%, ETA 00:17
  |======================================================                                                                   |  44%, ETA 00:17
  |======================================================                                                                   |  45%, ETA 00:17
  |======================================================                                                                   |  45%, ETA 00:17
  |======================================================                                                                   |  45%, ETA 00:17
  |======================================================                                                                   |  45%, ETA 00:17
  |======================================================                                                                   |  45%, ETA 00:17
  |======================================================                                                                   |  45%, ETA 00:17
  |======================================================                                                                   |  45%, ETA 00:17
  |======================================================                                                                   |  45%, ETA 00:17
  |======================================================                                                                   |  45%, ETA 00:17
  |======================================================                                                                   |  45%, ETA 00:17
  |=======================================================                                                                  |  45%, ETA 00:17
  |=======================================================                                                                  |  45%, ETA 00:17
  |=======================================================                                                                  |  45%, ETA 00:17
  |=======================================================                                                                  |  45%, ETA 00:17
  |=======================================================                                                                  |  45%, ETA 00:17
  |=======================================================                                                                  |  45%, ETA 00:17
  |=======================================================                                                                  |  45%, ETA 00:17
  |=======================================================                                                                  |  45%, ETA 00:17
  |=======================================================                                                                  |  46%, ETA 00:17
  |=======================================================                                                                  |  46%, ETA 00:17
  |=======================================================                                                                  |  46%, ETA 00:17
  |=======================================================                                                                  |  46%, ETA 00:17
  |=======================================================                                                                  |  46%, ETA 00:17
  |=======================================================                                                                  |  46%, ETA 00:17
  |=======================================================                                                                  |  46%, ETA 00:17
  |========================================================                                                                 |  46%, ETA 00:17
  |========================================================                                                                 |  46%, ETA 00:17
  |========================================================                                                                 |  46%, ETA 00:17
  |========================================================                                                                 |  46%, ETA 00:17
  |========================================================                                                                 |  46%, ETA 00:17
  |========================================================                                                                 |  46%, ETA 00:17
  |========================================================                                                                 |  46%, ETA 00:17
  |========================================================                                                                 |  46%, ETA 00:17
  |========================================================                                                                 |  46%, ETA 00:17
  |========================================================                                                                 |  46%, ETA 00:17
  |========================================================                                                                 |  46%, ETA 00:17
  |========================================================                                                                 |  46%, ETA 00:17
  |========================================================                                                                 |  46%, ETA 00:17
  |========================================================                                                                 |  47%, ETA 00:17
  |========================================================                                                                 |  47%, ETA 00:17
  |========================================================                                                                 |  47%, ETA 00:17
  |=========================================================                                                                |  47%, ETA 00:17
  |=========================================================                                                                |  47%, ETA 00:17
  |=========================================================                                                                |  47%, ETA 00:17
  |=========================================================                                                                |  47%, ETA 00:17
  |=========================================================                                                                |  47%, ETA 00:17
  |=========================================================                                                                |  47%, ETA 00:16
  |=========================================================                                                                |  47%, ETA 00:16
  |=========================================================                                                                |  47%, ETA 00:16
  |=========================================================                                                                |  47%, ETA 00:16
  |=========================================================                                                                |  47%, ETA 00:16
  |=========================================================                                                                |  47%, ETA 00:16
  |=========================================================                                                                |  47%, ETA 00:16
  |=========================================================                                                                |  47%, ETA 00:16
  |=========================================================                                                                |  47%, ETA 00:16
  |=========================================================                                                                |  48%, ETA 00:16
  |==========================================================                                                               |  48%, ETA 00:16
  |==========================================================                                                               |  48%, ETA 00:16
  |==========================================================                                                               |  48%, ETA 00:16
  |==========================================================                                                               |  48%, ETA 00:16
  |==========================================================                                                               |  48%, ETA 00:16
  |==========================================================                                                               |  48%, ETA 00:16
  |==========================================================                                                               |  48%, ETA 00:16
  |==========================================================                                                               |  48%, ETA 00:16
  |==========================================================                                                               |  48%, ETA 00:16
  |==========================================================                                                               |  48%, ETA 00:16
  |==========================================================                                                               |  48%, ETA 00:16
  |==========================================================                                                               |  48%, ETA 00:16
  |===========================================================                                                              |  48%, ETA 00:16
  |===========================================================                                                              |  48%, ETA 00:16
  |===========================================================                                                              |  48%, ETA 00:16
  |===========================================================                                                              |  48%, ETA 00:16
  |===========================================================                                                              |  49%, ETA 00:16
  |===========================================================                                                              |  49%, ETA 00:16
  |===========================================================                                                              |  49%, ETA 00:16
  |===========================================================                                                              |  49%, ETA 00:16
  |===========================================================                                                              |  49%, ETA 00:16
  |===========================================================                                                              |  49%, ETA 00:16
  |===========================================================                                                              |  49%, ETA 00:16
  |===========================================================                                                              |  49%, ETA 00:16
  |===========================================================                                                              |  49%, ETA 00:16
  |===========================================================                                                              |  49%, ETA 00:16
  |===========================================================                                                              |  49%, ETA 00:16
  |===========================================================                                                              |  49%, ETA 00:16
  |===========================================================                                                              |  49%, ETA 00:16
  |============================================================                                                             |  49%, ETA 00:16
  |============================================================                                                             |  49%, ETA 00:16
  |============================================================                                                             |  49%, ETA 00:16
  |============================================================                                                             |  49%, ETA 00:16
  |============================================================                                                             |  49%, ETA 00:16
  |============================================================                                                             |  49%, ETA 00:16
  |============================================================                                                             |  50%, ETA 00:16
  |============================================================                                                             |  50%, ETA 00:16
  |============================================================                                                             |  50%, ETA 00:16
  |============================================================                                                             |  50%, ETA 00:16
  |============================================================                                                             |  50%, ETA 00:16
  |============================================================                                                             |  50%, ETA 00:16
  |============================================================                                                             |  50%, ETA 00:16
  |============================================================                                                             |  50%, ETA 00:16
  |============================================================                                                             |  50%, ETA 00:16
  |============================================================                                                             |  50%, ETA 00:16
  |============================================================                                                             |  50%, ETA 00:16
  |=============================================================                                                            |  50%, ETA 00:16
  |=============================================================                                                            |  50%, ETA 00:16
  |=============================================================                                                            |  50%, ETA 00:16
  |=============================================================                                                            |  50%, ETA 00:15
  |=============================================================                                                            |  50%, ETA 00:15
  |=============================================================                                                            |  50%, ETA 00:15
  |=============================================================                                                            |  50%, ETA 00:15
  |=============================================================                                                            |  50%, ETA 00:15
  |=============================================================                                                            |  50%, ETA 00:15
  |=============================================================                                                            |  50%, ETA 00:15
  |=============================================================                                                            |  51%, ETA 00:15
  |=============================================================                                                            |  51%, ETA 00:15
  |=============================================================                                                            |  51%, ETA 00:15
  |=============================================================                                                            |  51%, ETA 00:15
  |=============================================================                                                            |  51%, ETA 00:15
  |=============================================================                                                            |  51%, ETA 00:15
  |==============================================================                                                           |  51%, ETA 00:15
  |==============================================================                                                           |  51%, ETA 00:15
  |==============================================================                                                           |  51%, ETA 00:15
  |==============================================================                                                           |  51%, ETA 00:15
  |==============================================================                                                           |  51%, ETA 00:15
  |==============================================================                                                           |  51%, ETA 00:15
  |==============================================================                                                           |  51%, ETA 00:15
  |==============================================================                                                           |  51%, ETA 00:15
  |==============================================================                                                           |  51%, ETA 00:15
  |==============================================================                                                           |  51%, ETA 00:15
  |==============================================================                                                           |  51%, ETA 00:15
  |==============================================================                                                           |  51%, ETA 00:15
  |==============================================================                                                           |  51%, ETA 00:15
  |==============================================================                                                           |  52%, ETA 00:15
  |==============================================================                                                           |  52%, ETA 00:15
  |==============================================================                                                           |  52%, ETA 00:15
  |==============================================================                                                           |  52%, ETA 00:15
  |===============================================================                                                          |  52%, ETA 00:15
  |===============================================================                                                          |  52%, ETA 00:15
  |===============================================================                                                          |  52%, ETA 00:15
  |===============================================================                                                          |  52%, ETA 00:15
  |===============================================================                                                          |  52%, ETA 00:15
  |===============================================================                                                          |  52%, ETA 00:15
  |===============================================================                                                          |  52%, ETA 00:15
  |===============================================================                                                          |  52%, ETA 00:15
  |===============================================================                                                          |  52%, ETA 00:15
  |===============================================================                                                          |  52%, ETA 00:15
  |===============================================================                                                          |  52%, ETA 00:15
  |===============================================================                                                          |  52%, ETA 00:15
  |===============================================================                                                          |  52%, ETA 00:15
  |===============================================================                                                          |  52%, ETA 00:15
  |===============================================================                                                          |  52%, ETA 00:15
  |===============================================================                                                          |  52%, ETA 00:15
  |================================================================                                                         |  52%, ETA 00:15
  |================================================================                                                         |  53%, ETA 00:15
  |================================================================                                                         |  53%, ETA 00:15
  |================================================================                                                         |  53%, ETA 00:15
  |================================================================                                                         |  53%, ETA 00:15
  |================================================================                                                         |  53%, ETA 00:15
  |================================================================                                                         |  53%, ETA 00:15
  |================================================================                                                         |  53%, ETA 00:15
  |================================================================                                                         |  53%, ETA 00:15
  |================================================================                                                         |  53%, ETA 00:15
  |================================================================                                                         |  53%, ETA 00:15
  |================================================================                                                         |  53%, ETA 00:15
  |================================================================                                                         |  53%, ETA 00:15
  |================================================================                                                         |  53%, ETA 00:15
  |================================================================                                                         |  53%, ETA 00:15
  |================================================================                                                         |  53%, ETA 00:15
  |================================================================                                                         |  53%, ETA 00:15
  |=================================================================                                                        |  53%, ETA 00:15
  |=================================================================                                                        |  53%, ETA 00:15
  |=================================================================                                                        |  53%, ETA 00:15
  |=================================================================                                                        |  54%, ETA 00:14
  |=================================================================                                                        |  54%, ETA 00:14
  |=================================================================                                                        |  54%, ETA 00:14
  |=================================================================                                                        |  54%, ETA 00:14
  |=================================================================                                                        |  54%, ETA 00:14
  |=================================================================                                                        |  54%, ETA 00:14
  |=================================================================                                                        |  54%, ETA 00:14
  |=================================================================                                                        |  54%, ETA 00:14
  |=================================================================                                                        |  54%, ETA 00:14
  |=================================================================                                                        |  54%, ETA 00:14
  |=================================================================                                                        |  54%, ETA 00:14
  |=================================================================                                                        |  54%, ETA 00:14
  |=================================================================                                                        |  54%, ETA 00:14
  |==================================================================                                                       |  54%, ETA 00:14
  |==================================================================                                                       |  54%, ETA 00:14
  |==================================================================                                                       |  54%, ETA 00:14
  |==================================================================                                                       |  54%, ETA 00:14
  |==================================================================                                                       |  54%, ETA 00:14
  |==================================================================                                                       |  54%, ETA 00:14
  |==================================================================                                                       |  54%, ETA 00:14
  |==================================================================                                                       |  55%, ETA 00:14
  |==================================================================                                                       |  55%, ETA 00:14
  |==================================================================                                                       |  55%, ETA 00:14
  |==================================================================                                                       |  55%, ETA 00:14
  |==================================================================                                                       |  55%, ETA 00:14
  |==================================================================                                                       |  55%, ETA 00:14
  |==================================================================                                                       |  55%, ETA 00:14
  |==================================================================                                                       |  55%, ETA 00:14
  |==================================================================                                                       |  55%, ETA 00:14
  |==================================================================                                                       |  55%, ETA 00:14
  |===================================================================                                                      |  55%, ETA 00:14
  |===================================================================                                                      |  55%, ETA 00:14
  |===================================================================                                                      |  55%, ETA 00:14
  |===================================================================                                                      |  55%, ETA 00:14
  |===================================================================                                                      |  55%, ETA 00:14
  |===================================================================                                                      |  55%, ETA 00:14
  |===================================================================                                                      |  55%, ETA 00:14
  |===================================================================                                                      |  55%, ETA 00:14
  |===================================================================                                                      |  55%, ETA 00:14
  |===================================================================                                                      |  55%, ETA 00:14
  |===================================================================                                                      |  56%, ETA 00:14
  |===================================================================                                                      |  56%, ETA 00:14
  |===================================================================                                                      |  56%, ETA 00:14
  |===================================================================                                                      |  56%, ETA 00:14
  |===================================================================                                                      |  56%, ETA 00:14
  |===================================================================                                                      |  56%, ETA 00:14
  |====================================================================                                                     |  56%, ETA 00:14
  |====================================================================                                                     |  56%, ETA 00:14
  |====================================================================                                                     |  56%, ETA 00:14
  |====================================================================                                                     |  56%, ETA 00:14
  |====================================================================                                                     |  56%, ETA 00:14
  |====================================================================                                                     |  56%, ETA 00:14
  |====================================================================                                                     |  56%, ETA 00:14
  |====================================================================                                                     |  56%, ETA 00:14
  |====================================================================                                                     |  56%, ETA 00:14
  |====================================================================                                                     |  56%, ETA 00:14
  |====================================================================                                                     |  56%, ETA 00:14
  |====================================================================                                                     |  56%, ETA 00:14
  |====================================================================                                                     |  56%, ETA 00:14
  |====================================================================                                                     |  56%, ETA 00:14
  |====================================================================                                                     |  56%, ETA 00:14
  |====================================================================                                                     |  57%, ETA 00:14
  |====================================================================                                                     |  57%, ETA 00:14
  |=====================================================================                                                    |  57%, ETA 00:13
  |=====================================================================                                                    |  57%, ETA 00:13
  |=====================================================================                                                    |  57%, ETA 00:13
  |=====================================================================                                                    |  57%, ETA 00:13
  |=====================================================================                                                    |  57%, ETA 00:13
  |=====================================================================                                                    |  57%, ETA 00:13
  |=====================================================================                                                    |  57%, ETA 00:13
  |=====================================================================                                                    |  57%, ETA 00:13
  |=====================================================================                                                    |  57%, ETA 00:13
  |=====================================================================                                                    |  57%, ETA 00:13
  |=====================================================================                                                    |  57%, ETA 00:13
  |=====================================================================                                                    |  57%, ETA 00:13
  |=====================================================================                                                    |  57%, ETA 00:13
  |=====================================================================                                                    |  57%, ETA 00:13
  |=====================================================================                                                    |  57%, ETA 00:13
  |======================================================================                                                   |  57%, ETA 00:13
  |======================================================================                                                   |  57%, ETA 00:13
  |======================================================================                                                   |  58%, ETA 00:13
  |======================================================================                                                   |  58%, ETA 00:13
  |======================================================================                                                   |  58%, ETA 00:13
  |======================================================================                                                   |  58%, ETA 00:13
  |======================================================================                                                   |  58%, ETA 00:13
  |======================================================================                                                   |  58%, ETA 00:13
  |======================================================================                                                   |  58%, ETA 00:13
  |======================================================================                                                   |  58%, ETA 00:13
  |======================================================================                                                   |  58%, ETA 00:13
  |======================================================================                                                   |  58%, ETA 00:13
  |======================================================================                                                   |  58%, ETA 00:13
  |=======================================================================                                                  |  58%, ETA 00:13
  |=======================================================================                                                  |  58%, ETA 00:13
  |=======================================================================                                                  |  58%, ETA 00:13
  |=======================================================================                                                  |  58%, ETA 00:13
  |=======================================================================                                                  |  59%, ETA 00:13
  |=======================================================================                                                  |  59%, ETA 00:13
  |=======================================================================                                                  |  59%, ETA 00:13
  |=======================================================================                                                  |  59%, ETA 00:13
  |=======================================================================                                                  |  59%, ETA 00:13
  |=======================================================================                                                  |  59%, ETA 00:13
  |=======================================================================                                                  |  59%, ETA 00:13
  |=======================================================================                                                  |  59%, ETA 00:13
  |=======================================================================                                                  |  59%, ETA 00:13
  |=======================================================================                                                  |  59%, ETA 00:13
  |=======================================================================                                                  |  59%, ETA 00:13
  |========================================================================                                                 |  59%, ETA 00:13
  |========================================================================                                                 |  59%, ETA 00:13
  |========================================================================                                                 |  59%, ETA 00:13
  |========================================================================                                                 |  59%, ETA 00:13
  |========================================================================                                                 |  59%, ETA 00:13
  |========================================================================                                                 |  59%, ETA 00:13
  |========================================================================                                                 |  59%, ETA 00:13
  |========================================================================                                                 |  59%, ETA 00:13
  |========================================================================                                                 |  60%, ETA 00:13
  |========================================================================                                                 |  60%, ETA 00:13
  |========================================================================                                                 |  60%, ETA 00:13
  |========================================================================                                                 |  60%, ETA 00:13
  |========================================================================                                                 |  60%, ETA 00:13
  |========================================================================                                                 |  60%, ETA 00:13
  |========================================================================                                                 |  60%, ETA 00:13
  |========================================================================                                                 |  60%, ETA 00:13
  |========================================================================                                                 |  60%, ETA 00:13
  |=========================================================================                                                |  60%, ETA 00:13
  |=========================================================================                                                |  60%, ETA 00:13
  |=========================================================================                                                |  60%, ETA 00:12
  |=========================================================================                                                |  60%, ETA 00:12
  |=========================================================================                                                |  60%, ETA 00:12
  |=========================================================================                                                |  60%, ETA 00:12
  |=========================================================================                                                |  60%, ETA 00:12
  |=========================================================================                                                |  60%, ETA 00:12
  |=========================================================================                                                |  60%, ETA 00:12
  |=========================================================================                                                |  60%, ETA 00:12
  |=========================================================================                                                |  60%, ETA 00:12
  |=========================================================================                                                |  60%, ETA 00:12
  |=========================================================================                                                |  61%, ETA 00:12
  |=========================================================================                                                |  61%, ETA 00:12
  |=========================================================================                                                |  61%, ETA 00:12
  |=========================================================================                                                |  61%, ETA 00:12
  |==========================================================================                                               |  61%, ETA 00:12
  |==========================================================================                                               |  61%, ETA 00:12
  |==========================================================================                                               |  61%, ETA 00:12
  |==========================================================================                                               |  61%, ETA 00:12
  |==========================================================================                                               |  61%, ETA 00:12
  |==========================================================================                                               |  61%, ETA 00:12
  |==========================================================================                                               |  61%, ETA 00:12
  |==========================================================================                                               |  61%, ETA 00:12
  |==========================================================================                                               |  61%, ETA 00:12
  |==========================================================================                                               |  61%, ETA 00:12
  |==========================================================================                                               |  61%, ETA 00:12
  |==========================================================================                                               |  61%, ETA 00:12
  |==========================================================================                                               |  61%, ETA 00:12
  |==========================================================================                                               |  61%, ETA 00:12
  |==========================================================================                                               |  61%, ETA 00:12
  |==========================================================================                                               |  62%, ETA 00:12
  |==========================================================================                                               |  62%, ETA 00:12
  |===========================================================================                                              |  62%, ETA 00:12
  |===========================================================================                                              |  62%, ETA 00:12
  |===========================================================================                                              |  62%, ETA 00:12
  |===========================================================================                                              |  62%, ETA 00:12
  |===========================================================================                                              |  62%, ETA 00:12
  |===========================================================================                                              |  62%, ETA 00:12
  |===========================================================================                                              |  62%, ETA 00:12
  |===========================================================================                                              |  62%, ETA 00:12
  |===========================================================================                                              |  62%, ETA 00:12
  |===========================================================================                                              |  62%, ETA 00:12
  |===========================================================================                                              |  62%, ETA 00:12
  |===========================================================================                                              |  62%, ETA 00:12
  |===========================================================================                                              |  62%, ETA 00:12
  |===========================================================================                                              |  62%, ETA 00:12
  |===========================================================================                                              |  62%, ETA 00:12
  |===========================================================================                                              |  62%, ETA 00:12
  |============================================================================                                             |  62%, ETA 00:12
  |============================================================================                                             |  62%, ETA 00:12
  |============================================================================                                             |  62%, ETA 00:12
  |============================================================================                                             |  63%, ETA 00:12
  |============================================================================                                             |  63%, ETA 00:12
  |============================================================================                                             |  63%, ETA 00:12
  |============================================================================                                             |  63%, ETA 00:12
  |============================================================================                                             |  63%, ETA 00:12
  |============================================================================                                             |  63%, ETA 00:12
  |============================================================================                                             |  63%, ETA 00:12
  |============================================================================                                             |  63%, ETA 00:12
  |============================================================================                                             |  63%, ETA 00:12
  |============================================================================                                             |  63%, ETA 00:12
  |============================================================================                                             |  63%, ETA 00:12
  |============================================================================                                             |  63%, ETA 00:12
  |============================================================================                                             |  63%, ETA 00:12
  |============================================================================                                             |  63%, ETA 00:12
  |=============================================================================                                            |  63%, ETA 00:11
  |=============================================================================                                            |  63%, ETA 00:11
  |=============================================================================                                            |  63%, ETA 00:11
  |=============================================================================                                            |  63%, ETA 00:11
  |=============================================================================                                            |  64%, ETA 00:11
  |=============================================================================                                            |  64%, ETA 00:11
  |=============================================================================                                            |  64%, ETA 00:11
  |=============================================================================                                            |  64%, ETA 00:11
  |=============================================================================                                            |  64%, ETA 00:11
  |=============================================================================                                            |  64%, ETA 00:11
  |=============================================================================                                            |  64%, ETA 00:11
  |=============================================================================                                            |  64%, ETA 00:11
  |=============================================================================                                            |  64%, ETA 00:11
  |=============================================================================                                            |  64%, ETA 00:11
  |=============================================================================                                            |  64%, ETA 00:11
  |==============================================================================                                           |  64%, ETA 00:11
  |==============================================================================                                           |  64%, ETA 00:11
  |==============================================================================                                           |  64%, ETA 00:11
  |==============================================================================                                           |  64%, ETA 00:11
  |==============================================================================                                           |  64%, ETA 00:11
  |==============================================================================                                           |  64%, ETA 00:11
  |==============================================================================                                           |  64%, ETA 00:11
  |==============================================================================                                           |  64%, ETA 00:11
  |==============================================================================                                           |  64%, ETA 00:11
  |==============================================================================                                           |  64%, ETA 00:11
  |==============================================================================                                           |  65%, ETA 00:11
  |==============================================================================                                           |  65%, ETA 00:11
  |==============================================================================                                           |  65%, ETA 00:11
  |==============================================================================                                           |  65%, ETA 00:11
  |==============================================================================                                           |  65%, ETA 00:11
  |==============================================================================                                           |  65%, ETA 00:11
  |==============================================================================                                           |  65%, ETA 00:11
  |===============================================================================                                          |  65%, ETA 00:11
  |===============================================================================                                          |  65%, ETA 00:11
  |===============================================================================                                          |  65%, ETA 00:11
  |===============================================================================                                          |  65%, ETA 00:11
  |===============================================================================                                          |  65%, ETA 00:11
  |===============================================================================                                          |  65%, ETA 00:11
  |===============================================================================                                          |  65%, ETA 00:11
  |===============================================================================                                          |  65%, ETA 00:11
  |===============================================================================                                          |  65%, ETA 00:11
  |===============================================================================                                          |  65%, ETA 00:11
  |===============================================================================                                          |  65%, ETA 00:11
  |===============================================================================                                          |  65%, ETA 00:11
  |===============================================================================                                          |  66%, ETA 00:11
  |===============================================================================                                          |  66%, ETA 00:11
  |===============================================================================                                          |  66%, ETA 00:11
  |===============================================================================                                          |  66%, ETA 00:11
  |===============================================================================                                          |  66%, ETA 00:11
  |================================================================================                                         |  66%, ETA 00:11
  |================================================================================                                         |  66%, ETA 00:11
  |================================================================================                                         |  66%, ETA 00:11
  |================================================================================                                         |  66%, ETA 00:11
  |================================================================================                                         |  66%, ETA 00:11
  |================================================================================                                         |  66%, ETA 00:11
  |================================================================================                                         |  66%, ETA 00:11
  |================================================================================                                         |  66%, ETA 00:11
  |================================================================================                                         |  66%, ETA 00:11
  |================================================================================                                         |  66%, ETA 00:11
  |================================================================================                                         |  66%, ETA 00:11
  |================================================================================                                         |  66%, ETA 00:10
  |================================================================================                                         |  66%, ETA 00:10
  |================================================================================                                         |  66%, ETA 00:10
  |=================================================================================                                        |  67%, ETA 00:10
  |=================================================================================                                        |  67%, ETA 00:10
  |=================================================================================                                        |  67%, ETA 00:10
  |=================================================================================                                        |  67%, ETA 00:10
  |=================================================================================                                        |  67%, ETA 00:10
  |=================================================================================                                        |  67%, ETA 00:10
  |=================================================================================                                        |  67%, ETA 00:10
  |=================================================================================                                        |  67%, ETA 00:10
  |=================================================================================                                        |  67%, ETA 00:10
  |=================================================================================                                        |  67%, ETA 00:10
  |=================================================================================                                        |  67%, ETA 00:10
  |=================================================================================                                        |  67%, ETA 00:10
  |=================================================================================                                        |  67%, ETA 00:10
  |=================================================================================                                        |  67%, ETA 00:10
  |=================================================================================                                        |  67%, ETA 00:10
  |=================================================================================                                        |  67%, ETA 00:10
  |=================================================================================                                        |  67%, ETA 00:10
  |==================================================================================                                       |  67%, ETA 00:10
  |==================================================================================                                       |  67%, ETA 00:10
  |==================================================================================                                       |  68%, ETA 00:10
  |==================================================================================                                       |  68%, ETA 00:10
  |==================================================================================                                       |  68%, ETA 00:10
  |==================================================================================                                       |  68%, ETA 00:10
  |==================================================================================                                       |  68%, ETA 00:10
  |==================================================================================                                       |  68%, ETA 00:10
  |==================================================================================                                       |  68%, ETA 00:10
  |==================================================================================                                       |  68%, ETA 00:10
  |==================================================================================                                       |  68%, ETA 00:10
  |==================================================================================                                       |  68%, ETA 00:10
  |==================================================================================                                       |  68%, ETA 00:10
  |==================================================================================                                       |  68%, ETA 00:10
  |==================================================================================                                       |  68%, ETA 00:10
  |==================================================================================                                       |  68%, ETA 00:10
  |===================================================================================                                      |  68%, ETA 00:10
  |===================================================================================                                      |  68%, ETA 00:10
  |===================================================================================                                      |  68%, ETA 00:10
  |===================================================================================                                      |  68%, ETA 00:10
  |===================================================================================                                      |  68%, ETA 00:10
  |===================================================================================                                      |  68%, ETA 00:10
  |===================================================================================                                      |  68%, ETA 00:10
  |===================================================================================                                      |  69%, ETA 00:10
  |===================================================================================                                      |  69%, ETA 00:10
  |===================================================================================                                      |  69%, ETA 00:10
  |===================================================================================                                      |  69%, ETA 00:10
  |===================================================================================                                      |  69%, ETA 00:10
  |===================================================================================                                      |  69%, ETA 00:10
  |===================================================================================                                      |  69%, ETA 00:10
  |===================================================================================                                      |  69%, ETA 00:10
  |====================================================================================                                     |  69%, ETA 00:10
  |====================================================================================                                     |  69%, ETA 00:10
  |====================================================================================                                     |  69%, ETA 00:10
  |====================================================================================                                     |  69%, ETA 00:10
  |====================================================================================                                     |  69%, ETA 00:10
  |====================================================================================                                     |  69%, ETA 00:10
  |====================================================================================                                     |  69%, ETA 00:10
  |====================================================================================                                     |  69%, ETA 00:10
  |====================================================================================                                     |  69%, ETA 00:10
  |====================================================================================                                     |  70%, ETA 00:10
  |====================================================================================                                     |  70%, ETA 00:10
  |====================================================================================                                     |  70%, ETA 00:09
  |====================================================================================                                     |  70%, ETA 00:09
  |====================================================================================                                     |  70%, ETA 00:09
  |====================================================================================                                     |  70%, ETA 00:09
  |====================================================================================                                     |  70%, ETA 00:09
  |=====================================================================================                                    |  70%, ETA 00:09
  |=====================================================================================                                    |  70%, ETA 00:09
  |=====================================================================================                                    |  70%, ETA 00:09
  |=====================================================================================                                    |  70%, ETA 00:09
  |=====================================================================================                                    |  70%, ETA 00:09
  |=====================================================================================                                    |  70%, ETA 00:09
  |=====================================================================================                                    |  70%, ETA 00:09
  |=====================================================================================                                    |  70%, ETA 00:09
  |=====================================================================================                                    |  70%, ETA 00:09
  |=====================================================================================                                    |  70%, ETA 00:09
  |=====================================================================================                                    |  70%, ETA 00:09
  |=====================================================================================                                    |  70%, ETA 00:09
  |=====================================================================================                                    |  70%, ETA 00:09
  |=====================================================================================                                    |  70%, ETA 00:09
  |=====================================================================================                                    |  71%, ETA 00:09
  |=====================================================================================                                    |  71%, ETA 00:09
  |=====================================================================================                                    |  71%, ETA 00:09
  |======================================================================================                                   |  71%, ETA 00:09
  |======================================================================================                                   |  71%, ETA 00:09
  |======================================================================================                                   |  71%, ETA 00:09
  |======================================================================================                                   |  71%, ETA 00:09
  |======================================================================================                                   |  71%, ETA 00:09
  |======================================================================================                                   |  71%, ETA 00:09
  |======================================================================================                                   |  71%, ETA 00:09
  |======================================================================================                                   |  71%, ETA 00:09
  |======================================================================================                                   |  71%, ETA 00:09
  |======================================================================================                                   |  71%, ETA 00:09
  |======================================================================================                                   |  71%, ETA 00:09
  |======================================================================================                                   |  71%, ETA 00:09
  |======================================================================================                                   |  71%, ETA 00:09
  |======================================================================================                                   |  71%, ETA 00:09
  |======================================================================================                                   |  71%, ETA 00:09
  |======================================================================================                                   |  71%, ETA 00:09
  |=======================================================================================                                  |  72%, ETA 00:09
  |=======================================================================================                                  |  72%, ETA 00:09
  |=======================================================================================                                  |  72%, ETA 00:09
  |=======================================================================================                                  |  72%, ETA 00:09
  |=======================================================================================                                  |  72%, ETA 00:09
  |=======================================================================================                                  |  72%, ETA 00:09
  |=======================================================================================                                  |  72%, ETA 00:09
  |=======================================================================================                                  |  72%, ETA 00:09
  |=======================================================================================                                  |  72%, ETA 00:09
  |=======================================================================================                                  |  72%, ETA 00:09
  |=======================================================================================                                  |  72%, ETA 00:09
  |=======================================================================================                                  |  72%, ETA 00:09
  |=======================================================================================                                  |  72%, ETA 00:09
  |=======================================================================================                                  |  72%, ETA 00:09
  |=======================================================================================                                  |  72%, ETA 00:09
  |=======================================================================================                                  |  72%, ETA 00:09
  |=======================================================================================                                  |  72%, ETA 00:09
  |========================================================================================                                 |  72%, ETA 00:09
  |========================================================================================                                 |  72%, ETA 00:09
  |========================================================================================                                 |  72%, ETA 00:09
  |========================================================================================                                 |  72%, ETA 00:09
  |========================================================================================                                 |  73%, ETA 00:09
  |========================================================================================                                 |  73%, ETA 00:09
  |========================================================================================                                 |  73%, ETA 00:09
  |========================================================================================                                 |  73%, ETA 00:09
  |========================================================================================                                 |  73%, ETA 00:09
  |========================================================================================                                 |  73%, ETA 00:09
  |========================================================================================                                 |  73%, ETA 00:09
  |========================================================================================                                 |  73%, ETA 00:09
  |========================================================================================                                 |  73%, ETA 00:09
  |========================================================================================                                 |  73%, ETA 00:08
  |========================================================================================                                 |  73%, ETA 00:08
  |========================================================================================                                 |  73%, ETA 00:08
  |=========================================================================================                                |  73%, ETA 00:08
  |=========================================================================================                                |  73%, ETA 00:08
  |=========================================================================================                                |  73%, ETA 00:08
  |=========================================================================================                                |  73%, ETA 00:08
  |=========================================================================================                                |  73%, ETA 00:08
  |=========================================================================================                                |  73%, ETA 00:08
  |=========================================================================================                                |  73%, ETA 00:08
  |=========================================================================================                                |  74%, ETA 00:08
  |=========================================================================================                                |  74%, ETA 00:08
  |=========================================================================================                                |  74%, ETA 00:08
  |=========================================================================================                                |  74%, ETA 00:08
  |=========================================================================================                                |  74%, ETA 00:08
  |=========================================================================================                                |  74%, ETA 00:08
  |=========================================================================================                                |  74%, ETA 00:08
  |=========================================================================================                                |  74%, ETA 00:08
  |=========================================================================================                                |  74%, ETA 00:08
  |=========================================================================================                                |  74%, ETA 00:08
  |==========================================================================================                               |  74%, ETA 00:08
  |==========================================================================================                               |  74%, ETA 00:08
  |==========================================================================================                               |  74%, ETA 00:08
  |==========================================================================================                               |  74%, ETA 00:08
  |==========================================================================================                               |  74%, ETA 00:08
  |==========================================================================================                               |  74%, ETA 00:08
  |==========================================================================================                               |  74%, ETA 00:08
  |==========================================================================================                               |  74%, ETA 00:08
  |==========================================================================================                               |  74%, ETA 00:08
  |==========================================================================================                               |  74%, ETA 00:08
  |==========================================================================================                               |  74%, ETA 00:08
  |==========================================================================================                               |  75%, ETA 00:08
  |==========================================================================================                               |  75%, ETA 00:08
  |==========================================================================================                               |  75%, ETA 00:08
  |==========================================================================================                               |  75%, ETA 00:08
  |==========================================================================================                               |  75%, ETA 00:08
  |===========================================================================================                              |  75%, ETA 00:08
  |===========================================================================================                              |  75%, ETA 00:08
  |===========================================================================================                              |  75%, ETA 00:08
  |===========================================================================================                              |  75%, ETA 00:08
  |===========================================================================================                              |  75%, ETA 00:08
  |===========================================================================================                              |  75%, ETA 00:08
  |===========================================================================================                              |  75%, ETA 00:08
  |===========================================================================================                              |  75%, ETA 00:08
  |===========================================================================================                              |  75%, ETA 00:08
  |===========================================================================================                              |  75%, ETA 00:08
  |===========================================================================================                              |  75%, ETA 00:08
  |===========================================================================================                              |  75%, ETA 00:08
  |===========================================================================================                              |  75%, ETA 00:08
  |===========================================================================================                              |  75%, ETA 00:08
  |===========================================================================================                              |  76%, ETA 00:08
  |===========================================================================================                              |  76%, ETA 00:08
  |===========================================================================================                              |  76%, ETA 00:08
  |============================================================================================                             |  76%, ETA 00:08
  |============================================================================================                             |  76%, ETA 00:08
  |============================================================================================                             |  76%, ETA 00:08
  |============================================================================================                             |  76%, ETA 00:08
  |============================================================================================                             |  76%, ETA 00:08
  |============================================================================================                             |  76%, ETA 00:08
  |============================================================================================                             |  76%, ETA 00:08
  |============================================================================================                             |  76%, ETA 00:08
  |============================================================================================                             |  76%, ETA 00:08
  |============================================================================================                             |  76%, ETA 00:08
  |============================================================================================                             |  76%, ETA 00:08
  |============================================================================================                             |  76%, ETA 00:08
  |============================================================================================                             |  76%, ETA 00:08
  |============================================================================================                             |  76%, ETA 00:07
  |============================================================================================                             |  76%, ETA 00:07
  |============================================================================================                             |  76%, ETA 00:07
  |=============================================================================================                            |  76%, ETA 00:07
  |=============================================================================================                            |  76%, ETA 00:07
  |=============================================================================================                            |  77%, ETA 00:07
  |=============================================================================================                            |  77%, ETA 00:07
  |=============================================================================================                            |  77%, ETA 00:07
  |=============================================================================================                            |  77%, ETA 00:07
  |=============================================================================================                            |  77%, ETA 00:07
  |=============================================================================================                            |  77%, ETA 00:07
  |=============================================================================================                            |  77%, ETA 00:07
  |=============================================================================================                            |  77%, ETA 00:07
  |=============================================================================================                            |  77%, ETA 00:07
  |=============================================================================================                            |  77%, ETA 00:07
  |=============================================================================================                            |  77%, ETA 00:07
  |=============================================================================================                            |  77%, ETA 00:07
  |=============================================================================================                            |  77%, ETA 00:07
  |=============================================================================================                            |  77%, ETA 00:07
  |==============================================================================================                           |  77%, ETA 00:07
  |==============================================================================================                           |  77%, ETA 00:07
  |==============================================================================================                           |  77%, ETA 00:07
  |==============================================================================================                           |  77%, ETA 00:07
  |==============================================================================================                           |  78%, ETA 00:07
  |==============================================================================================                           |  78%, ETA 00:07
  |==============================================================================================                           |  78%, ETA 00:07
  |==============================================================================================                           |  78%, ETA 00:07
  |==============================================================================================                           |  78%, ETA 00:07
  |==============================================================================================                           |  78%, ETA 00:07
  |==============================================================================================                           |  78%, ETA 00:07
  |==============================================================================================                           |  78%, ETA 00:07
  |==============================================================================================                           |  78%, ETA 00:07
  |==============================================================================================                           |  78%, ETA 00:07
  |==============================================================================================                           |  78%, ETA 00:07
  |==============================================================================================                           |  78%, ETA 00:07
  |===============================================================================================                          |  78%, ETA 00:07
  |===============================================================================================                          |  78%, ETA 00:07
  |===============================================================================================                          |  78%, ETA 00:07
  |===============================================================================================                          |  78%, ETA 00:07
  |===============================================================================================                          |  78%, ETA 00:07
  |===============================================================================================                          |  78%, ETA 00:07
  |===============================================================================================                          |  78%, ETA 00:07
  |===============================================================================================                          |  78%, ETA 00:07
  |===============================================================================================                          |  78%, ETA 00:07
  |===============================================================================================                          |  79%, ETA 00:07
  |===============================================================================================                          |  79%, ETA 00:07
  |===============================================================================================                          |  79%, ETA 00:07
  |===============================================================================================                          |  79%, ETA 00:07
  |===============================================================================================                          |  79%, ETA 00:07
  |===============================================================================================                          |  79%, ETA 00:07
  |===============================================================================================                          |  79%, ETA 00:07
  |===============================================================================================                          |  79%, ETA 00:07
  |================================================================================================                         |  79%, ETA 00:07
  |================================================================================================                         |  79%, ETA 00:07
  |================================================================================================                         |  79%, ETA 00:07
  |================================================================================================                         |  79%, ETA 00:07
  |================================================================================================                         |  79%, ETA 00:07
  |================================================================================================                         |  79%, ETA 00:07
  |================================================================================================                         |  79%, ETA 00:07
  |================================================================================================                         |  79%, ETA 00:07
  |================================================================================================                         |  79%, ETA 00:07
  |================================================================================================                         |  79%, ETA 00:07
  |================================================================================================                         |  79%, ETA 00:06
  |================================================================================================                         |  80%, ETA 00:06
  |================================================================================================                         |  80%, ETA 00:06
  |================================================================================================                         |  80%, ETA 00:06
  |================================================================================================                         |  80%, ETA 00:06
  |================================================================================================                         |  80%, ETA 00:06
  |================================================================================================                         |  80%, ETA 00:06
  |=================================================================================================                        |  80%, ETA 00:06
  |=================================================================================================                        |  80%, ETA 00:06
  |=================================================================================================                        |  80%, ETA 00:06
  |=================================================================================================                        |  80%, ETA 00:06
  |=================================================================================================                        |  80%, ETA 00:06
  |=================================================================================================                        |  80%, ETA 00:06
  |=================================================================================================                        |  80%, ETA 00:06
  |=================================================================================================                        |  80%, ETA 00:06
  |=================================================================================================                        |  80%, ETA 00:06
  |=================================================================================================                        |  80%, ETA 00:06
  |=================================================================================================                        |  80%, ETA 00:06
  |=================================================================================================                        |  80%, ETA 00:06
  |=================================================================================================                        |  80%, ETA 00:06
  |=================================================================================================                        |  80%, ETA 00:06
  |=================================================================================================                        |  80%, ETA 00:06
  |=================================================================================================                        |  81%, ETA 00:06
  |==================================================================================================                       |  81%, ETA 00:06
  |==================================================================================================                       |  81%, ETA 00:06
  |==================================================================================================                       |  81%, ETA 00:06
  |==================================================================================================                       |  81%, ETA 00:06
  |==================================================================================================                       |  81%, ETA 00:06
  |==================================================================================================                       |  81%, ETA 00:06
  |==================================================================================================                       |  81%, ETA 00:06
  |==================================================================================================                       |  81%, ETA 00:06
  |==================================================================================================                       |  81%, ETA 00:06
  |==================================================================================================                       |  81%, ETA 00:06
  |==================================================================================================                       |  81%, ETA 00:06
  |==================================================================================================                       |  81%, ETA 00:06
  |==================================================================================================                       |  81%, ETA 00:06
  |==================================================================================================                       |  81%, ETA 00:06
  |==================================================================================================                       |  81%, ETA 00:06
  |==================================================================================================                       |  81%, ETA 00:06
  |==================================================================================================                       |  81%, ETA 00:06
  |===================================================================================================                      |  81%, ETA 00:06
  |===================================================================================================                      |  82%, ETA 00:06
  |===================================================================================================                      |  82%, ETA 00:06
  |===================================================================================================                      |  82%, ETA 00:06
  |===================================================================================================                      |  82%, ETA 00:06
  |===================================================================================================                      |  82%, ETA 00:06
  |===================================================================================================                      |  82%, ETA 00:06
  |===================================================================================================                      |  82%, ETA 00:06
  |===================================================================================================                      |  82%, ETA 00:06
  |===================================================================================================                      |  82%, ETA 00:06
  |===================================================================================================                      |  82%, ETA 00:06
  |===================================================================================================                      |  82%, ETA 00:06
  |===================================================================================================                      |  82%, ETA 00:06
  |===================================================================================================                      |  82%, ETA 00:06
  |===================================================================================================                      |  82%, ETA 00:06
  |===================================================================================================                      |  82%, ETA 00:06
  |====================================================================================================                     |  82%, ETA 00:06
  |====================================================================================================                     |  82%, ETA 00:06
  |====================================================================================================                     |  82%, ETA 00:06
  |====================================================================================================                     |  82%, ETA 00:06
  |====================================================================================================                     |  82%, ETA 00:06
  |====================================================================================================                     |  82%, ETA 00:06
  |====================================================================================================                     |  83%, ETA 00:06
  |====================================================================================================                     |  83%, ETA 00:05
  |====================================================================================================                     |  83%, ETA 00:05
  |====================================================================================================                     |  83%, ETA 00:05
  |====================================================================================================                     |  83%, ETA 00:05
  |====================================================================================================                     |  83%, ETA 00:05
  |====================================================================================================                     |  83%, ETA 00:05
  |====================================================================================================                     |  83%, ETA 00:05
  |====================================================================================================                     |  83%, ETA 00:05
  |====================================================================================================                     |  83%, ETA 00:05
  |====================================================================================================                     |  83%, ETA 00:05
  |=====================================================================================================                    |  83%, ETA 00:05
  |=====================================================================================================                    |  83%, ETA 00:05
  |=====================================================================================================                    |  83%, ETA 00:05
  |=====================================================================================================                    |  83%, ETA 00:05
  |=====================================================================================================                    |  83%, ETA 00:05
  |=====================================================================================================                    |  83%, ETA 00:05
  |=====================================================================================================                    |  83%, ETA 00:05
  |=====================================================================================================                    |  83%, ETA 00:05
  |=====================================================================================================                    |  84%, ETA 00:05
  |=====================================================================================================                    |  84%, ETA 00:05
  |=====================================================================================================                    |  84%, ETA 00:05
  |=====================================================================================================                    |  84%, ETA 00:05
  |=====================================================================================================                    |  84%, ETA 00:05
  |=====================================================================================================                    |  84%, ETA 00:05
  |=====================================================================================================                    |  84%, ETA 00:05
  |=====================================================================================================                    |  84%, ETA 00:05
  |======================================================================================================                   |  84%, ETA 00:05
  |======================================================================================================                   |  84%, ETA 00:05
  |======================================================================================================                   |  84%, ETA 00:05
  |======================================================================================================                   |  84%, ETA 00:05
  |======================================================================================================                   |  84%, ETA 00:05
  |======================================================================================================                   |  84%, ETA 00:05
  |======================================================================================================                   |  84%, ETA 00:05
  |======================================================================================================                   |  84%, ETA 00:05
  |======================================================================================================                   |  84%, ETA 00:05
  |======================================================================================================                   |  84%, ETA 00:05
  |======================================================================================================                   |  84%, ETA 00:05
  |======================================================================================================                   |  84%, ETA 00:05
  |======================================================================================================                   |  84%, ETA 00:05
  |======================================================================================================                   |  85%, ETA 00:05
  |======================================================================================================                   |  85%, ETA 00:05
  |======================================================================================================                   |  85%, ETA 00:05
  |======================================================================================================                   |  85%, ETA 00:05
  |=======================================================================================================                  |  85%, ETA 00:05
  |=======================================================================================================                  |  85%, ETA 00:05
  |=======================================================================================================                  |  85%, ETA 00:05
  |=======================================================================================================                  |  85%, ETA 00:05
  |=======================================================================================================                  |  85%, ETA 00:05
  |=======================================================================================================                  |  85%, ETA 00:05
  |=======================================================================================================                  |  85%, ETA 00:05
  |=======================================================================================================                  |  85%, ETA 00:05
  |=======================================================================================================                  |  85%, ETA 00:05
  |=======================================================================================================                  |  85%, ETA 00:05
  |=======================================================================================================                  |  85%, ETA 00:05
  |=======================================================================================================                  |  85%, ETA 00:05
  |=======================================================================================================                  |  85%, ETA 00:05
  |=======================================================================================================                  |  85%, ETA 00:05
  |=======================================================================================================                  |  85%, ETA 00:05
  |=======================================================================================================                  |  86%, ETA 00:05
  |========================================================================================================                 |  86%, ETA 00:05
  |========================================================================================================                 |  86%, ETA 00:05
  |========================================================================================================                 |  86%, ETA 00:05
  |========================================================================================================                 |  86%, ETA 00:05
  |========================================================================================================                 |  86%, ETA 00:04
  |========================================================================================================                 |  86%, ETA 00:04
  |========================================================================================================                 |  86%, ETA 00:04
  |========================================================================================================                 |  86%, ETA 00:04
  |========================================================================================================                 |  86%, ETA 00:04
  |========================================================================================================                 |  86%, ETA 00:04
  |========================================================================================================                 |  86%, ETA 00:04
  |========================================================================================================                 |  86%, ETA 00:04
  |========================================================================================================                 |  86%, ETA 00:04
  |========================================================================================================                 |  86%, ETA 00:04
  |========================================================================================================                 |  86%, ETA 00:04
  |========================================================================================================                 |  86%, ETA 00:04
  |========================================================================================================                 |  86%, ETA 00:04
  |=========================================================================================================                |  86%, ETA 00:04
  |=========================================================================================================                |  86%, ETA 00:04
  |=========================================================================================================                |  86%, ETA 00:04
  |=========================================================================================================                |  87%, ETA 00:04
  |=========================================================================================================                |  87%, ETA 00:04
  |=========================================================================================================                |  87%, ETA 00:04
  |=========================================================================================================                |  87%, ETA 00:04
  |=========================================================================================================                |  87%, ETA 00:04
  |=========================================================================================================                |  87%, ETA 00:04
  |=========================================================================================================                |  87%, ETA 00:04
  |=========================================================================================================                |  87%, ETA 00:04
  |=========================================================================================================                |  87%, ETA 00:04
  |=========================================================================================================                |  87%, ETA 00:04
  |=========================================================================================================                |  87%, ETA 00:04
  |=========================================================================================================                |  87%, ETA 00:04
  |=========================================================================================================                |  87%, ETA 00:04
  |==========================================================================================================               |  87%, ETA 00:04
  |==========================================================================================================               |  87%, ETA 00:04
  |==========================================================================================================               |  87%, ETA 00:04
  |==========================================================================================================               |  87%, ETA 00:04
  |==========================================================================================================               |  87%, ETA 00:04
  |==========================================================================================================               |  87%, ETA 00:04
  |==========================================================================================================               |  88%, ETA 00:04
  |==========================================================================================================               |  88%, ETA 00:04
  |==========================================================================================================               |  88%, ETA 00:04
  |==========================================================================================================               |  88%, ETA 00:04
  |==========================================================================================================               |  88%, ETA 00:04
  |==========================================================================================================               |  88%, ETA 00:04
  |==========================================================================================================               |  88%, ETA 00:04
  |==========================================================================================================               |  88%, ETA 00:04
  |==========================================================================================================               |  88%, ETA 00:04
  |==========================================================================================================               |  88%, ETA 00:04
  |==========================================================================================================               |  88%, ETA 00:04
  |===========================================================================================================              |  88%, ETA 00:04
  |===========================================================================================================              |  88%, ETA 00:04
  |===========================================================================================================              |  88%, ETA 00:04
  |===========================================================================================================              |  88%, ETA 00:04
  |===========================================================================================================              |  88%, ETA 00:04
  |===========================================================================================================              |  88%, ETA 00:04
  |===========================================================================================================              |  88%, ETA 00:04
  |===========================================================================================================              |  88%, ETA 00:04
  |===========================================================================================================              |  88%, ETA 00:04
  |===========================================================================================================              |  88%, ETA 00:04
  |===========================================================================================================              |  89%, ETA 00:04
  |===========================================================================================================              |  89%, ETA 00:04
  |===========================================================================================================              |  89%, ETA 00:04
  |===========================================================================================================              |  89%, ETA 00:04
  |===========================================================================================================              |  89%, ETA 00:04
  |===========================================================================================================              |  89%, ETA 00:04
  |============================================================================================================             |  89%, ETA 00:04
  |============================================================================================================             |  89%, ETA 00:03
  |============================================================================================================             |  89%, ETA 00:03
  |============================================================================================================             |  89%, ETA 00:03
  |============================================================================================================             |  89%, ETA 00:03
  |============================================================================================================             |  89%, ETA 00:03
  |============================================================================================================             |  89%, ETA 00:03
  |============================================================================================================             |  89%, ETA 00:03
  |============================================================================================================             |  89%, ETA 00:03
  |============================================================================================================             |  89%, ETA 00:03
  |============================================================================================================             |  89%, ETA 00:03
  |============================================================================================================             |  89%, ETA 00:03
  |============================================================================================================             |  89%, ETA 00:03
  |============================================================================================================             |  90%, ETA 00:03
  |============================================================================================================             |  90%, ETA 00:03
  |============================================================================================================             |  90%, ETA 00:03
  |============================================================================================================             |  90%, ETA 00:03
  |=============================================================================================================            |  90%, ETA 00:03
  |=============================================================================================================            |  90%, ETA 00:03
  |=============================================================================================================            |  90%, ETA 00:03
  |=============================================================================================================            |  90%, ETA 00:03
  |=============================================================================================================            |  90%, ETA 00:03
  |=============================================================================================================            |  90%, ETA 00:03
  |=============================================================================================================            |  90%, ETA 00:03
  |=============================================================================================================            |  90%, ETA 00:03
  |=============================================================================================================            |  90%, ETA 00:03
  |=============================================================================================================            |  90%, ETA 00:03
  |=============================================================================================================            |  90%, ETA 00:03
  |=============================================================================================================            |  90%, ETA 00:03
  |=============================================================================================================            |  90%, ETA 00:03
  |=============================================================================================================            |  90%, ETA 00:03
  |=============================================================================================================            |  90%, ETA 00:03
  |=============================================================================================================            |  90%, ETA 00:03
  |==============================================================================================================           |  90%, ETA 00:03
  |==============================================================================================================           |  91%, ETA 00:03
  |==============================================================================================================           |  91%, ETA 00:03
  |==============================================================================================================           |  91%, ETA 00:03
  |==============================================================================================================           |  91%, ETA 00:03
  |==============================================================================================================           |  91%, ETA 00:03
  |==============================================================================================================           |  91%, ETA 00:03
  |==============================================================================================================           |  91%, ETA 00:03
  |==============================================================================================================           |  91%, ETA 00:03
  |==============================================================================================================           |  91%, ETA 00:03
  |==============================================================================================================           |  91%, ETA 00:03
  |==============================================================================================================           |  91%, ETA 00:03
  |==============================================================================================================           |  91%, ETA 00:03
  |==============================================================================================================           |  91%, ETA 00:03
  |==============================================================================================================           |  91%, ETA 00:03
  |==============================================================================================================           |  91%, ETA 00:03
  |==============================================================================================================           |  91%, ETA 00:03
  |===============================================================================================================          |  91%, ETA 00:03
  |===============================================================================================================          |  91%, ETA 00:03
  |===============================================================================================================          |  91%, ETA 00:03
  |===============================================================================================================          |  92%, ETA 00:03
  |===============================================================================================================          |  92%, ETA 00:03
  |===============================================================================================================          |  92%, ETA 00:03
  |===============================================================================================================          |  92%, ETA 00:03
  |===============================================================================================================          |  92%, ETA 00:03
  |===============================================================================================================          |  92%, ETA 00:03
  |===============================================================================================================          |  92%, ETA 00:03
  |===============================================================================================================          |  92%, ETA 00:03
  |===============================================================================================================          |  92%, ETA 00:03
  |===============================================================================================================          |  92%, ETA 00:03
  |===============================================================================================================          |  92%, ETA 00:03
  |===============================================================================================================          |  92%, ETA 00:02
  |===============================================================================================================          |  92%, ETA 00:02
  |================================================================================================================         |  92%, ETA 00:02
  |================================================================================================================         |  92%, ETA 00:02
  |================================================================================================================         |  92%, ETA 00:02
  |================================================================================================================         |  92%, ETA 00:02
  |================================================================================================================         |  92%, ETA 00:02
  |================================================================================================================         |  92%, ETA 00:02
  |================================================================================================================         |  92%, ETA 00:02
  |================================================================================================================         |  92%, ETA 00:02
  |================================================================================================================         |  93%, ETA 00:02
  |================================================================================================================         |  93%, ETA 00:02
  |================================================================================================================         |  93%, ETA 00:02
  |================================================================================================================         |  93%, ETA 00:02
  |================================================================================================================         |  93%, ETA 00:02
  |================================================================================================================         |  93%, ETA 00:02
  |================================================================================================================         |  93%, ETA 00:02
  |================================================================================================================         |  93%, ETA 00:02
  |================================================================================================================         |  93%, ETA 00:02
  |=================================================================================================================        |  93%, ETA 00:02
  |=================================================================================================================        |  93%, ETA 00:02
  |=================================================================================================================        |  93%, ETA 00:02
  |=================================================================================================================        |  93%, ETA 00:02
  |=================================================================================================================        |  93%, ETA 00:02
  |=================================================================================================================        |  93%, ETA 00:02
  |=================================================================================================================        |  93%, ETA 00:02
  |=================================================================================================================        |  93%, ETA 00:02
  |=================================================================================================================        |  93%, ETA 00:02
  |=================================================================================================================        |  93%, ETA 00:02
  |=================================================================================================================        |  94%, ETA 00:02
  |=================================================================================================================        |  94%, ETA 00:02
  |=================================================================================================================        |  94%, ETA 00:02
  |=================================================================================================================        |  94%, ETA 00:02
  |=================================================================================================================        |  94%, ETA 00:02
  |=================================================================================================================        |  94%, ETA 00:02
  |=================================================================================================================        |  94%, ETA 00:02
  |==================================================================================================================       |  94%, ETA 00:02
  |==================================================================================================================       |  94%, ETA 00:02
  |==================================================================================================================       |  94%, ETA 00:02
  |==================================================================================================================       |  94%, ETA 00:02
  |==================================================================================================================       |  94%, ETA 00:02
  |==================================================================================================================       |  94%, ETA 00:02
  |==================================================================================================================       |  94%, ETA 00:02
  |==================================================================================================================       |  94%, ETA 00:02
  |==================================================================================================================       |  94%, ETA 00:02
  |==================================================================================================================       |  94%, ETA 00:02
  |==================================================================================================================       |  94%, ETA 00:02
  |==================================================================================================================       |  94%, ETA 00:02
  |==================================================================================================================       |  94%, ETA 00:02
  |==================================================================================================================       |  94%, ETA 00:02
  |==================================================================================================================       |  95%, ETA 00:02
  |==================================================================================================================       |  95%, ETA 00:02
  |===================================================================================================================      |  95%, ETA 00:02
  |===================================================================================================================      |  95%, ETA 00:02
  |===================================================================================================================      |  95%, ETA 00:02
  |===================================================================================================================      |  95%, ETA 00:02
  |===================================================================================================================      |  95%, ETA 00:02
  |===================================================================================================================      |  95%, ETA 00:02
  |===================================================================================================================      |  95%, ETA 00:02
  |===================================================================================================================      |  95%, ETA 00:02
  |===================================================================================================================      |  95%, ETA 00:02
  |===================================================================================================================      |  95%, ETA 00:02
  |===================================================================================================================      |  95%, ETA 00:02
  |===================================================================================================================      |  95%, ETA 00:02
  |===================================================================================================================      |  95%, ETA 00:01
  |===================================================================================================================      |  95%, ETA 00:01
  |===================================================================================================================      |  95%, ETA 00:01
  |===================================================================================================================      |  95%, ETA 00:01
  |===================================================================================================================      |  95%, ETA 00:01
  |====================================================================================================================     |  96%, ETA 00:01
  |====================================================================================================================     |  96%, ETA 00:01
  |====================================================================================================================     |  96%, ETA 00:01
  |====================================================================================================================     |  96%, ETA 00:01
  |====================================================================================================================     |  96%, ETA 00:01
  |====================================================================================================================     |  96%, ETA 00:01
  |====================================================================================================================     |  96%, ETA 00:01
  |====================================================================================================================     |  96%, ETA 00:01
  |====================================================================================================================     |  96%, ETA 00:01
  |====================================================================================================================     |  96%, ETA 00:01
  |====================================================================================================================     |  96%, ETA 00:01
  |====================================================================================================================     |  96%, ETA 00:01
  |====================================================================================================================     |  96%, ETA 00:01
  |====================================================================================================================     |  96%, ETA 00:01
  |====================================================================================================================     |  96%, ETA 00:01
  |====================================================================================================================     |  96%, ETA 00:01
  |=====================================================================================================================    |  96%, ETA 00:01
  |=====================================================================================================================    |  96%, ETA 00:01
  |=====================================================================================================================    |  96%, ETA 00:01
  |=====================================================================================================================    |  96%, ETA 00:01
  |=====================================================================================================================    |  96%, ETA 00:01
  |=====================================================================================================================    |  97%, ETA 00:01
  |=====================================================================================================================    |  97%, ETA 00:01
  |=====================================================================================================================    |  97%, ETA 00:01
  |=====================================================================================================================    |  97%, ETA 00:01
  |=====================================================================================================================    |  97%, ETA 00:01
  |=====================================================================================================================    |  97%, ETA 00:01
  |=====================================================================================================================    |  97%, ETA 00:01
  |=====================================================================================================================    |  97%, ETA 00:01
  |=====================================================================================================================    |  97%, ETA 00:01
  |=====================================================================================================================    |  97%, ETA 00:01
  |=====================================================================================================================    |  97%, ETA 00:01
  |=====================================================================================================================    |  97%, ETA 00:01
  |======================================================================================================================   |  97%, ETA 00:01
  |======================================================================================================================   |  97%, ETA 00:01
  |======================================================================================================================   |  97%, ETA 00:01
  |======================================================================================================================   |  97%, ETA 00:01
  |======================================================================================================================   |  97%, ETA 00:01
  |======================================================================================================================   |  97%, ETA 00:01
  |======================================================================================================================   |  97%, ETA 00:01
  |======================================================================================================================   |  98%, ETA 00:01
  |======================================================================================================================   |  98%, ETA 00:01
  |======================================================================================================================   |  98%, ETA 00:01
  |======================================================================================================================   |  98%, ETA 00:01
  |======================================================================================================================   |  98%, ETA 00:01
  |======================================================================================================================   |  98%, ETA 00:01
  |======================================================================================================================   |  98%, ETA 00:01
  |======================================================================================================================   |  98%, ETA 00:01
  |======================================================================================================================   |  98%, ETA 00:01
  |=======================================================================================================================  |  98%, ETA 00:01
  |=======================================================================================================================  |  98%, ETA 00:01
  |=======================================================================================================================  |  98%, ETA 00:01
  |=======================================================================================================================  |  98%, ETA 00:01
  |=======================================================================================================================  |  98%, ETA 00:01
  |=======================================================================================================================  |  98%, ETA 00:01
  |=======================================================================================================================  |  98%, ETA 00:01
  |=======================================================================================================================  |  98%, ETA 00:01
  |=======================================================================================================================  |  98%, ETA 00:01
  |=======================================================================================================================  |  98%, ETA 00:01
  |=======================================================================================================================  |  98%, ETA 00:00
  |=======================================================================================================================  |  98%, ETA 00:00
  |=======================================================================================================================  |  99%, ETA 00:00
  |=======================================================================================================================  |  99%, ETA 00:00
  |=======================================================================================================================  |  99%, ETA 00:00
  |=======================================================================================================================  |  99%, ETA 00:00
  |=======================================================================================================================  |  99%, ETA 00:00
  |======================================================================================================================== |  99%, ETA 00:00
  |======================================================================================================================== |  99%, ETA 00:00
  |======================================================================================================================== |  99%, ETA 00:00
  |======================================================================================================================== |  99%, ETA 00:00
  |======================================================================================================================== |  99%, ETA 00:00
  |======================================================================================================================== |  99%, ETA 00:00
  |======================================================================================================================== |  99%, ETA 00:00
  |======================================================================================================================== |  99%, ETA 00:00
  |======================================================================================================================== |  99%, ETA 00:00
  |======================================================================================================================== |  99%, ETA 00:00
  |======================================================================================================================== |  99%, ETA 00:00
  |======================================================================================================================== |  99%, ETA 00:00
  |======================================================================================================================== |  99%, ETA 00:00
  |======================================================================================================================== |  99%, ETA 00:00
  |======================================================================================================================== | 100%, ETA 00:00
  |======================================================================================================================== | 100%, ETA 00:00
  |=========================================================================================================================| 100%, ETA 00:00
  |=========================================================================================================================| 100%, ETA 00:00
  |=========================================================================================================================| 100%, ETA 00:00
  |=========================================================================================================================| 100%, ETA 00:00
  |=========================================================================================================================| 100%, ETA 00:00
  |=========================================================================================================================| 100%, ETA 00:00
  |=========================================================================================================================| 100%, ETA 00:00
  |=========================================================================================================================| 100%, ETA 00:00
  |=====================================================================================================================| 100%, Elapsed 00:32
# Add gene name as column and filter significant hits
sig_traj_genes <- pr_test_res %>%
  tibble::rownames_to_column("gene") %>%
  filter(q_value < 0.05, status == "OK") %>%
  arrange(desc(morans_I))

cat(sprintf("%d trajectory-variable genes (q < 0.05)\n", nrow(sig_traj_genes)))
1851 trajectory-variable genes (q < 0.05)
# Define genes to exclude from dotplot — ribosomal, mitochondrial, housekeeping
# These are trajectory-variable due to technical reasons not biology
exclude_genes <- grep(
  "^RP[SL]|^MT-|^MALAT1|^NEAT1|^XIST|^ACTB|^GAPDH|^B2M|^EEF|^EIF",
  rownames(cd4_ref), value = TRUE
)
cat(sprintf("Genes to exclude (technical): %d\n", length(exclude_genes)))
Genes to exclude (technical): 199
kable(head(sig_traj_genes[, c("gene","morans_I","q_value")], 20),
      caption = "Top 20 trajectory-variable genes (Monocle3 graph_test)",
      digits  = 4) %>%
  kable_styling(bootstrap_options=c("striped","condensed"), full_width=FALSE)
Top 20 trajectory-variable genes (Monocle3 graph_test)
gene morans_I q_value
CCL5 0.6551 0
RPL32 0.5215 0
EEF1A1 0.5053 0
RPS14 0.5000 0
RPL10 0.4992 0
RPL30 0.4969 0
RPL41 0.4953 0
RPS3A 0.4940 0
RPL34 0.4790 0
RPS13 0.4789 0
RPL39 0.4763 0
RPL19 0.4637 0
RPS8 0.4579 0
RPS23 0.4571 0
RPS12 0.4545 0
RPS27A 0.4537 0
FOXP3 0.4198 0
RPLP1 0.4049 0
LGALS3 0.4027 0
RPS18 0.4008 0

# ── Ensure milestone_factor exists ────────────────────────────────────────
if (!"milestone_factor" %in% colnames(cd4_ref@meta.data)) {
  cd4_ref@meta.data$milestone_factor <- factor(
    cd4_ref@meta.data$milestone, levels = milestone_order
  )
}

# ── Filter technical genes and take top n ─────────────────────────────────
n_keep <- 100

clean_traj_genes <- sig_traj_genes %>%
  filter(!gene %in% exclude_genes) %>%        # use gene column not rownames
  slice_head(n = n_keep) %>%
  pull(gene)                                   # extract as character vector

cat(sprintf("Clean trajectory genes: %d (removed %d technical)\n",
            length(clean_traj_genes),
            nrow(sig_traj_genes) - length(clean_traj_genes)))
Clean trajectory genes: 100 (removed 1751 technical)
cat("First 10:", paste(head(clean_traj_genes, 10), collapse=", "), "\n")
First 10: CCL5, FOXP3, LGALS3, GZMK, ANXA2, S100A4, TPT1, ITGB1, AHNAK, TMSB4X 
# ── Confirm genes exist in object ─────────────────────────────────────────
clean_traj_genes <- intersect(clean_traj_genes, rownames(cd4_ref))
cat(sprintf("Genes found in cd4_ref: %d\n", length(clean_traj_genes)))
Genes found in cd4_ref: 100
# ── DotPlot ───────────────────────────────────────────────────────────────
DefaultAssay(cd4_ref) <- "RNA"
Idents(cd4_ref)       <- "milestone_factor"

p_dot <- DotPlot(
  cd4_ref,
  features  = clean_traj_genes,
  cols      = c("lightgrey", "#d62728"),
  dot.scale = 6,
  scale     = TRUE
) +
  RotatedAxis() +
  coord_flip() +
  ggtitle(sprintf("Top %d Monocle3 Trajectory Genes — Milestones M00–M07", n_keep)) +
  theme(axis.text.x = element_text(size = 8, face = "bold"),
        axis.text.y = element_text(size = 7),
        plot.title  = element_text(size = 13, face = "bold"))

print(p_dot)


7 Method Comparison

Key question: Do the two methods agree on cell ordering?

7.1 Pseudotime Correlation

compare_df <- data.frame(
  cell        = colnames(cd4_ref),
  state       = factor(cd4_ref@meta.data[[STATE_COL]], levels=STATE_ORDER),
  mst_pt      = cd4_ref@meta.data$mst_pseudotime_norm,
  monocle3_pt = cd4_ref@meta.data$monocle3_pseudotime_norm,
  milestone   = cd4_ref@meta.data$milestone
) %>% filter(!is.na(mst_pt), !is.na(monocle3_pt), state %in% STATE_ORDER)

overall_cor <- cor(compare_df$mst_pt, compare_df$monocle3_pt,
                   method = "spearman", use = "complete.obs")

per_state_cor <- compare_df %>%
  group_by(state) %>%
  summarise(
    n         = n(),
    spearman  = round(cor(mst_pt, monocle3_pt, method="spearman"), 3),
    mean_diff = round(mean(mst_pt - monocle3_pt), 1),
    sd_diff   = round(sd(mst_pt - monocle3_pt), 1),
    .groups   = "drop"
  )

p_scatter <- ggplot(
  compare_df[sample(nrow(compare_df), min(5000,nrow(compare_df))),],
  aes(x=mst_pt, y=monocle3_pt, colour=state)
) +
  geom_point(size=.6, alpha=.5) +
  geom_abline(slope=1, intercept=0, linetype="dashed", colour="grey40", linewidth=.8) +
  geom_smooth(method="lm", se=FALSE, colour="black", linewidth=.8) +
  scale_colour_manual(values=STATE_COLORS, name="State") +
  annotate("text", x=5, y=92,
           label=sprintf("Spearman ρ = %.3f", overall_cor),
           size=4.5, fontface="bold", hjust=0) +
  theme_classic() +
  labs(x="Custom MST pseudotime (0–100)", y="Monocle3 pseudotime (0–100)",
       title="Pseudotime correlation: Custom MST vs Monocle3",
       subtitle="Dashed line = perfect agreement | Solid line = linear fit") +
  theme(plot.title=element_text(size=13,face="bold"))

p_density <- ggplot(
  compare_df %>%
    pivot_longer(c(mst_pt, monocle3_pt), names_to="method", values_to="pseudotime") %>%
    mutate(method = recode(method, mst_pt="Custom MST", monocle3_pt="Monocle3")),
  aes(x=pseudotime, colour=method, fill=method)
) +
  geom_density(alpha=.35) +
  scale_colour_manual(values=METHOD_COLORS, name="Method") +
  scale_fill_manual(values=METHOD_COLORS, name="Method") +
  facet_wrap(~state, ncol=3, scales="free_y") +
  theme_classic() +
  labs(x="Pseudotime (0–100)", y="Density",
       title="Pseudotime distribution per state: method comparison") +
  theme(plot.title=element_text(size=13,face="bold"),
        strip.text=element_text(face="bold"))

print(p_scatter | p_density)

cat(sprintf("\nOverall Spearman ρ = %.3f\n\n", overall_cor))

Overall Spearman ρ = 0.778
kable(per_state_cor,
      caption = "Per-state pseudotime correlation (Spearman)",
      col.names = c("State","N cells","Spearman ρ","Mean diff","SD diff")) %>%
  kable_styling(bootstrap_options=c("striped","hover"), full_width=FALSE)
Per-state pseudotime correlation (Spearman)
State N cells Spearman ρ Mean diff SD diff
CD4 Naive 2037 -0.078 -10.0 10.4
CD4 TCM 9067 0.781 -8.4 19.0
CD4 TEM 145 0.283 -15.1 14.9
CD4 Temra/CTL 10 0.399 -3.7 11.1
Treg 207 0.913 22.7 17.8

7.2 Side-by-Side UMAP

umap_compare             <- umap_df
umap_compare$mst_pt      <- cd4_ref@meta.data$mst_pseudotime_norm
umap_compare$monocle3_pt <- cd4_ref@meta.data$monocle3_pseudotime_norm

pt_gradient <- scale_colour_gradientn(
  colours=c("#0D0887","#6A00A8","#B12A90","#E16462","#FCA636","#F0F921"),
  name="Pseudotime\n(0–100)", limits=c(0,100)
)

p_side_mst <- ggplot(umap_compare[sample(nrow(umap_compare)),],
                      aes(x=UMAP_1,y=UMAP_2,colour=mst_pt)) +
  geom_point(size=.35,alpha=.7) +
  geom_segment(data=mst_edge_df, aes(x=x1,y=y1,xend=x2,yend=y2),
               colour="black",linewidth=.7,alpha=.6,inherit.aes=FALSE) +
  pt_gradient + theme_classic() +
  labs(x="UMAP-1",y="UMAP-2",title="Custom MST") +
  theme(plot.title=element_text(size=13,face="bold",colour=METHOD_COLORS["Custom MST"]))

p_side_m3 <- ggplot(umap_compare[sample(nrow(umap_compare)),],
                     aes(x=UMAP_1,y=UMAP_2,colour=monocle3_pt)) +
  geom_point(size=.35,alpha=.7) +
  geom_segment(data=m3_edge_df, aes(x=x1,y=y1,xend=x2,yend=y2),
               colour="black",linewidth=.6,alpha=.6,inherit.aes=FALSE) +
  pt_gradient + theme_classic() +
  labs(x="UMAP-1",y="UMAP-2",title="Monocle3") +
  theme(plot.title=element_text(size=13,face="bold",colour=METHOD_COLORS["Monocle3"]))

print(p_side_mst | p_side_m3)

7.3 Discordant Cells

compare_df$abs_diff <- abs(compare_df$mst_pt - compare_df$monocle3_pt)
threshold <- quantile(compare_df$abs_diff, 0.90, na.rm=TRUE)

discordant <- compare_df %>% filter(abs_diff > threshold) %>% arrange(desc(abs_diff))

cat(sprintf("Top 10%% most discordant cells (|diff| > %.1f): %d cells\n",
            threshold, nrow(discordant)))
Top 10% most discordant cells (|diff| > 31.5): 1147 cells
umap_disc            <- umap_df
umap_disc$discordant <- rownames(umap_disc) %in% discordant$cell
umap_disc$abs_diff   <- compare_df$abs_diff[match(rownames(umap_disc), compare_df$cell)]

p_discordant <- ggplot(umap_disc[sample(nrow(umap_disc)),], aes(x=UMAP_1,y=UMAP_2)) +
  geom_point(data=~filter(., !discordant), colour="grey85", size=.3, alpha=.5) +
  geom_point(data=~filter(., discordant), aes(colour=abs_diff), size=.8, alpha=.85) +
  scale_colour_gradient(low="#FCA636", high="#C00000", name="|MST − M3|") +
  theme_classic() +
  labs(x="UMAP-1",y="UMAP-2",
       title="Discordant cells (top 10% disagreement)",
       subtitle="Boundary/transition cells — biologically expected") +
  theme(plot.title=element_text(size=13,face="bold"))

disc_states <- discordant %>% count(state) %>% mutate(pct=round(100*n/sum(n),1))

p_disc_bar <- ggplot(disc_states, aes(x=reorder(state,-n), y=pct, fill=state)) +
  geom_col(width=.7) +
  geom_text(aes(label=sprintf("%.0f%%",pct)), vjust=-.3, size=3.5) +
  scale_fill_manual(values=STATE_COLORS, guide="none") +
  theme_classic() +
  labs(x="State", y="% of discordant cells", title="State composition of discordant cells") +
  theme(plot.title=element_text(size=12,face="bold"))

print(p_discordant | p_disc_bar)

7.4 Which Method to Use?

if (overall_cor > 0.9) {
  rec <- "HIGH agreement (ρ > 0.9): either method valid. Use **Custom MST** for milestone labels; **Monocle3** for graph_test() trajectory genes."
} else if (overall_cor > 0.7) {
  rec <- "MODERATE agreement (ρ = 0.7–0.9): similar ordering, differ at boundaries. Use both as complementary evidence."
} else {
  rec <- "LOW agreement (ρ < 0.7): significant discordance. Check UMAP topology and milestone assignments."
}

8 Marker DotPlot per Milestone

DefaultAssay(cd4_ref) <- "RNA"

cd4_ref@meta.data$milestone_factor <- factor(
  cd4_ref@meta.data$milestone, levels = milestone_order
)
Idents(cd4_ref) <- "milestone_factor"

panel_genes <- c(
  # Naive
  "CCR7","LEF1","TCF7","SELL","KLF2","SATB1","IL7R","CD27","MAL",
  # TCM
  "S100A4","AQP3","LTB","ITGB1","CD44","CCR4",
  # Shared activation
  "CD69","LMNA",
  # TEM — effector memory and Th1 skewing
  "GZMK","CCL5","EOMES","CXCR3","HOPX","CXCR4","IFNG","TNF","CCR5",
  # Temra/CTL — terminal cytotoxic effector
  "GZMB","GZMA","PRF1","NKG7","CX3CR1","FGFBP2","GNLY","TBX21","ZEB2",
  "FCGR3A","KLRG1","NR4A2",
  # Treg — core identity
  "FOXP3","IL2RA","IKZF2","IKZF4","TIGIT","RTKN2","TNFRSF18","CTLA4",
  # Co-inhibitory receptors — shared between effector Treg and exhaustion
  # Expression here reflects Treg suppressive machinery, NOT dysfunction
  # Critical for Sézary interpretation: Treg-like vs exhausted identity
  "PDCD1","HAVCR2","LAG3"
)

panel_genes <- unique(intersect(panel_genes, rownames(cd4_ref)))

p_dotplot_ms <- DotPlot(
  cd4_ref,
  features  = panel_genes,
  group.by  = "milestone_factor",
  cols      = c("lightgrey","#d62728"),
  dot.scale = 4, scale = TRUE, col.min = -1.5, col.max = 2.5
) +
  RotatedAxis() + coord_flip() +
  theme(axis.text.x     = element_text(size=8, face="bold"),
        axis.text.y     = element_text(size=7),
        plot.title      = element_text(size=13,face="bold"),
        legend.position = "bottom") +
  ggtitle("Marker gene expression per milestone")

print(p_dotplot_ms)


9 Project Sézary Cells onto Reference Trajectory

9.1 MapQuery

options(future.globals.maxSize = 2 * 1024^3)

DefaultAssay(cd4_ref)    <- "RNA"
DefaultAssay(sezary_obj) <- "RNA"

cd4_ref <- FindVariableFeatures(cd4_ref, nfeatures=3000, verbose=FALSE)

cat("Finding transfer anchors...\n")
anchors <- FindTransferAnchors(
  reference            = cd4_ref,
  query                = sezary_obj,
  normalization.method = "LogNormalize",
  reference.reduction  = "pca",
  dims                 = 1:30,
  reduction            = "pcaproject",
  verbose              = FALSE
)

cat("Running MapQuery...\n")
sezary_obj <- MapQuery(
  anchorset           = anchors,
  query               = sezary_obj,
  reference           = cd4_ref,
  refdata             = list(
    predicted_state     = STATE_COL,
    predicted_milestone = "milestone"
  ),
  reference.reduction = "pca",
  reduction.model     = "umap",
  verbose             = FALSE
)

cat("\nPredicted state distribution:\n")
print(table(sezary_obj$predicted.predicted_state))

9.2 Assign Pseudotime via Both Methods

sez_umap_coords           <- as.matrix(Embeddings(sezary_obj, "ref.umap"))
colnames(sez_umap_coords) <- c("UMAP_1","UMAP_2")

cat("Projecting Sézary cells onto MST...\n")
sez_mst <- project_onto_mst(sez_umap_coords, centroid_mat, mst_graph, g_dists_vec)

ref_umap_mat <- Embeddings(cd4_ref, UMAP_NAME)
ref_m3_pt    <- cd4_ref@meta.data$monocle3_pseudotime_norm

nn_result <- nn2(data=ref_umap_mat, query=sez_umap_coords, k=15)
inv_dist  <- 1 / (nn_result$nn.dists + 1e-6)
weights   <- inv_dist / rowSums(inv_dist)

meta_sez <- sezary_obj@meta.data
meta_sez$mst_pseudotime <- pmax(0, pmin(100,
  100 * (sez_mst$pseudotime - mst_pt_range[1]) /
         (mst_pt_range[2] - mst_pt_range[1])
))
meta_sez$nearest_milestone_mst <- sez_mst$nearest_ms
meta_sez$monocle3_pseudotime   <- rowSums(
  weights * matrix(ref_m3_pt[nn_result$nn.idx], nrow=nrow(nn_result$nn.idx))
)
sezary_obj@meta.data <- meta_sez

cat(sprintf("MST pseudotime:      %.1f – %.1f\n",
            range(sezary_obj@meta.data$mst_pseudotime, na.rm=TRUE)))
cat(sprintf("Monocle3 pseudotime: %.1f – %.1f\n",
            range(sezary_obj@meta.data$monocle3_pseudotime, na.rm=TRUE)))

9.3 Projection Visualisation

9.3.1 Custom MST

ref_bg <- data.frame(
  UMAP_1 = Embeddings(cd4_ref, UMAP_NAME)[,1],
  UMAP_2 = Embeddings(cd4_ref, UMAP_NAME)[,2]
)

sez_plot_df <- data.frame(
  UMAP_1          = sez_umap_coords[,"UMAP_1"],
  UMAP_2          = sez_umap_coords[,"UMAP_2"],
  predicted_state = sezary_obj@meta.data$predicted.predicted_state,
  pred_score      = sezary_obj@meta.data$predicted.predicted_state.score,
  mst_pt          = sezary_obj@meta.data$mst_pseudotime,
  m3_pt           = sezary_obj@meta.data$monocle3_pseudotime,
  milestone_ref   = sezary_obj@meta.data$nearest_milestone_mst
)

p_sez_mst_state <- ggplot() +
  geom_point(data=ref_bg[sample(nrow(ref_bg)),],
             aes(x=UMAP_1,y=UMAP_2), colour="grey85", size=.3, alpha=.4) +
  geom_segment(data=mst_edge_df, aes(x=x1,y=y1,xend=x2,yend=y2),
               colour="grey30", linewidth=.8, alpha=.7) +
  geom_point(data=sez_plot_df,
             aes(x=UMAP_1,y=UMAP_2,colour=predicted_state), size=1.8, alpha=.85) +
  geom_text_repel(data=milestone_centroids,
                  aes(x=UMAP_1,y=UMAP_2,label=milestone),
                  size=2.5, colour="grey20", fontface="bold",
                  max.overlaps=20, segment.size=.3) +
  scale_colour_manual(values=STATE_COLORS, name="Predicted state") +
  theme_classic() +
  labs(x="UMAP-1",y="UMAP-2",
       title="Sézary cells — Custom MST projection (predicted state)",
       subtitle="Grey = normal CD4 reference | Coloured = Sézary | Lines = MST") +
  theme(plot.title=element_text(size=13,face="bold"))

p_sez_mst_pt <- ggplot() +
  geom_point(data=ref_bg[sample(nrow(ref_bg)),],
             aes(x=UMAP_1,y=UMAP_2), colour="grey85", size=.3, alpha=.4) +
  geom_segment(data=mst_edge_df, aes(x=x1,y=y1,xend=x2,yend=y2),
               colour="grey30", linewidth=.7, alpha=.6) +
  geom_point(data=sez_plot_df,
             aes(x=UMAP_1,y=UMAP_2,colour=mst_pt), size=1.8, alpha=.9) +
  scale_colour_gradientn(
    colours=c("#0D0887","#6A00A8","#B12A90","#E16462","#FCA636","#F0F921"),
    name="MST\npseudotime", limits=c(0,100)) +
  theme_classic() +
  labs(x="UMAP-1",y="UMAP-2",title="Sézary — MST projected pseudotime") +
  theme(plot.title=element_text(size=13,face="bold"))

print(p_sez_mst_state / p_sez_mst_pt)

9.3.2 Monocle3

p_sez_m3_state <- ggplot() +
  geom_point(data=ref_bg[sample(nrow(ref_bg)),],
             aes(x=UMAP_1,y=UMAP_2), colour="grey85", size=.3, alpha=.4) +
  geom_segment(data=m3_edge_df, aes(x=x1,y=y1,xend=x2,yend=y2),
               colour="grey30", linewidth=.6, alpha=.7) +
  geom_point(data=sez_plot_df,
             aes(x=UMAP_1,y=UMAP_2,colour=predicted_state), size=1.8, alpha=.85) +
  scale_colour_manual(values=STATE_COLORS, name="Predicted state") +
  theme_classic() +
  labs(x="UMAP-1",y="UMAP-2",
       title="Sézary cells — Monocle3 projection (predicted state)") +
  theme(plot.title=element_text(size=13,face="bold"))

p_sez_m3_pt <- ggplot() +
  geom_point(data=ref_bg[sample(nrow(ref_bg)),],
             aes(x=UMAP_1,y=UMAP_2), colour="grey85", size=.3, alpha=.4) +
  geom_segment(data=m3_edge_df, aes(x=x1,y=y1,xend=x2,yend=y2),
               colour="grey30", linewidth=.5, alpha=.6) +
  geom_point(data=sez_plot_df,
             aes(x=UMAP_1,y=UMAP_2,colour=m3_pt), size=1.8, alpha=.9) +
  scale_colour_gradientn(
    colours=c("#0D0887","#6A00A8","#B12A90","#E16462","#FCA636","#F0F921"),
    name="Monocle3\npseudotime", limits=c(0,100)) +
  theme_classic() +
  labs(x="UMAP-1",y="UMAP-2",title="Sézary — Monocle3 projected pseudotime") +
  theme(plot.title=element_text(size=13,face="bold"))

print(p_sez_m3_state / p_sez_m3_pt)

9.3.3 Method Agreement (Sézary)

sez_cor <- cor(sez_plot_df$mst_pt, sez_plot_df$m3_pt,
               method="spearman", use="complete.obs")

p_sez_scatter <- ggplot(sez_plot_df, aes(x=mst_pt, y=m3_pt, colour=predicted_state)) +
  geom_point(size=1.2, alpha=.7) +
  geom_abline(slope=1, intercept=0, linetype="dashed", colour="grey40") +
  geom_smooth(method="lm", se=FALSE, colour="black", linewidth=.8) +
  scale_colour_manual(values=STATE_COLORS, name="Predicted state") +
  annotate("text", x=5, y=90, label=sprintf("Spearman ρ = %.3f", sez_cor),
           size=4.5, fontface="bold", hjust=0) +
  theme_classic() +
  labs(x="Custom MST pseudotime", y="Monocle3 pseudotime",
       title="Sézary cells: pseudotime method agreement") +
  theme(plot.title=element_text(size=12,face="bold"))

p_sez_violin <- ggplot(
  sez_plot_df %>%
    pivot_longer(c(mst_pt,m3_pt), names_to="method", values_to="pt") %>%
    mutate(method=recode(method, mst_pt="Custom MST", m3_pt="Monocle3")),
  aes(x=predicted_state, y=pt, fill=method)
) +
  geom_violin(scale="width", trim=FALSE, alpha=.7, position=position_dodge(.8)) +
  geom_boxplot(width=.08, fill="white", outlier.size=.3, position=position_dodge(.8)) +
  scale_fill_manual(values=METHOD_COLORS, name="Method") +
  theme_classic() +
  labs(x="Predicted state", y="Pseudotime (0–100)",
       title="Sézary pseudotime per state: method comparison") +
  theme(plot.title=element_text(size=12,face="bold"),
        axis.text.x=element_text(angle=30,hjust=1))

print(p_sez_scatter | p_sez_violin)

9.4 Summary Tables

sez_summary <- sez_plot_df %>%
  group_by(predicted_state) %>%
  summarise(
    n_cells         = n(),
    pct             = round(100*n()/nrow(sez_plot_df), 1),
    mean_pred_score = round(mean(pred_score), 3),
    mst_mean_pt     = round(mean(mst_pt, na.rm=TRUE), 1),
    mst_sd_pt       = round(sd(mst_pt,   na.rm=TRUE), 1),
    m3_mean_pt      = round(mean(m3_pt,  na.rm=TRUE), 1),
    m3_sd_pt        = round(sd(m3_pt,    na.rm=TRUE), 1),
    .groups         = "drop"
  ) %>% arrange(mst_mean_pt)

kable(sez_summary,
      col.names = c("State","N","% of Sézary","Pred. score",
                    "MST mean pt","MST SD","M3 mean pt","M3 SD"),
      caption = "Sézary cell trajectory summary — both methods") %>%
  kable_styling(bootstrap_options=c("striped","hover"), full_width=FALSE) %>%
  column_spec(5:6, color="white", background=METHOD_COLORS["Custom MST"]) %>%
  column_spec(7:8, color="white", background=METHOD_COLORS["Monocle3"])

ms_dist <- sez_plot_df %>%
  count(milestone_ref) %>%
  left_join(milestone_centroids[,c("milestone","state","order_pos")],
            by=c("milestone_ref"="milestone")) %>%
  mutate(pct=round(100*n/sum(n),1),
         milestone_ref=factor(milestone_ref, levels=milestone_order)) %>%
  arrange(order_pos)

p_ms_bar <- ggplot(ms_dist, aes(x=milestone_ref, y=pct, fill=state)) +
  geom_col(width=.7) +
  geom_text(aes(label=sprintf("%.0f%%",pct)), vjust=-.3, size=3) +
  scale_fill_manual(values=STATE_COLORS, name="State") +
  scale_x_discrete(limits=milestone_order) +
  theme_classic() +
  labs(x="Nearest reference milestone", y="% Sézary cells",
       title="Sézary cell distribution across reference milestones") +
  theme(axis.text.x=element_text(angle=45,hjust=1),
        plot.title=element_text(size=12,face="bold"))

print(p_ms_bar)

10 Save All Outputs


saveRDS(sezary_obj,          "sezary_projected_dual.rds")
saveRDS(mst_graph,           "mst_graph.rds")
saveRDS(milestone_centroids, "milestone_centroids.rds")

write.csv(milestone_centroids, "milestone_centroids.csv",          row.names=FALSE)
write.csv(per_state_cor,       "method_comparison_per_state.csv",  row.names=FALSE)
write.csv(sez_summary,         "sezary_trajectory_summary.csv",    row.names=FALSE)
write.csv(sig_traj_genes,      "monocle3_trajectory_genes.csv",    row.names=FALSE)
write.csv(ms_dist,             "sezary_milestone_distribution.csv",row.names=FALSE)

ggsave("fig_milestones_linear.pdf",  p_mst_linear,    width=14, height=4)
ggsave("fig_mst_umap.pdf",           p_mst_umap_ms,   width=10, height=8)
ggsave("fig_mst_pseudotime.pdf",     p_mst_pseudo,    width=10, height=8)
ggsave("fig_m3_pseudotime.pdf",      p_m3_pseudo,     width=10, height=8)
ggsave("fig_method_comparison.pdf",  p_scatter,       width=10, height=6)
ggsave("fig_sezary_mst.pdf",         p_sez_mst_state, width=12, height=8)
ggsave("fig_sezary_m3.pdf",          p_sez_m3_state,  width=12, height=8)
ggsave("fig_dotplot_milestones.pdf", p_dotplot_ms,    width=9,  height=18)
ggsave("fig_milestone_bar.pdf",      p_ms_bar,        width=12, height=5)

cat("✓ All outputs saved\n")

11 Session Information

sessionInfo()

12 Metadata Reference

LS0tCnRpdGxlOiAiQ0Q0IFQgQ2VsbCBSZWZlcmVuY2UgVHJhamVjdG9yeSDigJQgTW9ub2NsZTMgdnMgQ3VzdG9tIE1TVCIKc3VidGl0bGU6ICJEdWFsIHRyYWplY3RvcnkgY29tcGFyaXNvbiB8IE1pbGVzdG9uZSBhbm5vdGF0aW9uIHwgU8OpemFyeSBwcm9qZWN0aW9uIgphdXRob3I6ICJOQVNJUiBNQUhNT09EIEFCQkFTSSIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogdHJ1ZQogICAgdGhlbWU6IGpvdXJuYWwKLS0tCgoKCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoCiAgZWNobyAgICAgID0gVFJVRSwKICBtZXNzYWdlICAgPSBGQUxTRSwKICB3YXJuaW5nICAgPSBGQUxTRSwKICBmaWcuYWxpZ24gPSAiY2VudGVyIiwKICBkcGkgICAgICAgPSAxNTAKKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyBPdmVydmlldyAKCiMjIEFwcHJvYWNoCgpUaGlzIGRvY3VtZW50IGltcGxlbWVudHMgYW5kICoqY29tcGFyZXMgdHdvIHRyYWplY3RvcnkgbWV0aG9kcyoqIGZvciBub3JtYWwgQ0Q0IFQgY2VsbHMsIHRoZW4gcHJvamVjdHMgU8OpemFyeSBzeW5kcm9tZSBDRDQgVCBjZWxscyBvbnRvIGJvdGggcmVmZXJlbmNlIHRyYWplY3Rvcmllcy4KCiMjIyBNZXRob2QgMSDigJQgQ3VzdG9tIE1TVCAoQnVyZWwgKmV0IGFsLiogMjAyMiBhcHByb2FjaCkKCi0gICBPdmVyLWNsdXN0ZXIgd2l0aGluIGVhY2ggYW5ub3RhdGVkIHN0YXRlIOKGkiBkZWZpbmUgbWlsZXN0b25lcyAoTTAw4oCTTTA3KQotICAgQ29tcHV0ZSBNaW5pbXVtIFNwYW5uaW5nIFRyZWUgb24gbWlsZXN0b25lIGNlbnRyb2lkcyBpbiBVTUFQIHNwYWNlCi0gICBQcm9qZWN0IGVhY2ggY2VsbCBvbnRvIG5lYXJlc3QgTVNUIGVkZ2Ug4oaSIHBzZXVkb3RpbWUKCiMjIyBNZXRob2QgMiDigJQgTW9ub2NsZTMKCi0gICBDb252ZXJ0IFNldXJhdCBvYmplY3Qg4oaSIGBjZWxsX2RhdGFfc2V0YAotICAgYGxlYXJuX2dyYXBoKClgIGZpdHMgcHJpbmNpcGFsIGdyYXBoIHRvIGRhdGEgdG9wb2xvZ3kKLSAgIGBvcmRlcl9jZWxscygpYCByb290ZWQgYXQgQ0Q0IE5haXZlIGNlbnRyb2lkIOKGkiBwc2V1ZG90aW1lCi0gICBgZ3JhcGhfdGVzdCgpYCBpZGVudGlmaWVzIHRyYWplY3RvcnktdmFyaWFibGUgZ2VuZXMKCiMjIyBDb21wYXJpc29uCgotICAgU3BlYXJtYW4gY29ycmVsYXRpb24gYmV0d2VlbiBwc2V1ZG90aW1lcwotICAgQWdyZWVtZW50IG9uIGNlbGwgb3JkZXJpbmcgcGVyIHN0YXRlCi0gICBDb25jb3JkYW5jZSBvbiBTw6l6YXJ5IGNlbGwgcG9zaXRpb25pbmcKCiMjIEtleSBPYmplY3RzCgp8IE9iamVjdCB8IERlc2NyaXB0aW9uIHwgUmVxdWlyZWQgY29sdW1ucyB8CnwtLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CnwgYGNkNF9yZWZgIHwgQW5ub3RhdGVkIG5vcm1hbCBDRDQgVCBjZWxscyB8IGAkcHJlZGljdGVkLmNlbGx0eXBlLmwyYCwgVU1BUCwgUk5BIHwKfCBgc2V6YXJ5X29iamAgfCBTw6l6YXJ5IENENCBUIGNlbGxzIHwgUk5BIChub3JtYWxpc2VkKSwgb3B0aW9uYWwgQURUIHwKCiMjIFBhY2thZ2VzIFJlcXVpcmVkCgpgYGAgcgppbnN0YWxsLnBhY2thZ2VzKGMoImlncmFwaCIsIlJBTk4iLCJnZ3JlcGVsIiwicGF0Y2h3b3JrIiwicGhlYXRtYXAiLCJ2aXJpZGlzIikpCkJpb2NNYW5hZ2VyOjppbnN0YWxsKCJtb25vY2xlMyIpCnJlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJzYXRpamFsYWIvc2V1cmF0LXdyYXBwZXJzIikKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMgU2V0dXAKCmBgYHtyIGxpYnJhcmllc30Kc3VwcHJlc3NQYWNrYWdlU3RhcnR1cE1lc3NhZ2VzKHsKICBsaWJyYXJ5KFNldXJhdCkKICBsaWJyYXJ5KFNldXJhdFdyYXBwZXJzKQogIGxpYnJhcnkobW9ub2NsZTMpCiAgbGlicmFyeShpZ3JhcGgpCiAgbGlicmFyeShSQU5OKQogIGxpYnJhcnkoZ2dwbG90MikKICBsaWJyYXJ5KGdncmVwZWwpCiAgbGlicmFyeShkcGx5cikKICBsaWJyYXJ5KHRpZHlyKQogIGxpYnJhcnkocGF0Y2h3b3JrKQogIGxpYnJhcnkocGhlYXRtYXApCiAgbGlicmFyeSh2aXJpZGlzKQogIGxpYnJhcnkoc2NhbGVzKQogIGxpYnJhcnkoUkNvbG9yQnJld2VyKQogIGxpYnJhcnkoa25pdHIpCiAgbGlicmFyeShrYWJsZUV4dHJhKQp9KQoKU1RBVEVfQ09MT1JTIDwtIGMoCiAgIkNENCBOYWl2ZSIgICAgID0gIiM0NDcyQzQiLAogICJDRDQgVENNIiAgICAgICA9ICIjNzBBRDQ3IiwKICAiQ0Q0IFRFTSIgICAgICAgPSAiI0VEN0QzMSIsCiAgIkNENCBUZW1yYS9DVEwiID0gIiNDMDAwMDAiLAogICJUcmVnIiAgICAgICAgICA9ICIjNzAzMEEwIgopCgpNRVRIT0RfQ09MT1JTIDwtIGMoCiAgIk1vbm9jbGUzIiAgID0gIiNlNzRjM2MiLAogICJDdXN0b20gTVNUIiA9ICIjMjk4MGI5IgopCgpTVEFURV9PUkRFUiA8LSBjKCJDRDQgTmFpdmUiLCJDRDQgVENNIiwiQ0Q0IFRFTSIsIkNENCBUZW1yYS9DVEwiLCJUcmVnIikKClVNQVBfTkFNRSA8LSAidW1hcCIKU1RBVEVfQ09MIDwtICJwcmVkaWN0ZWQuY2VsbHR5cGUubDIiCgojIEJJT0lORk9STUFUSUNJQU4gTk9URSBvbiByZXNvbHV0aW9uczoKIyBEb3RwbG90IHNob3dlZCBNMDMgd2FzIFRDTS1saWtlIChMVEIrL0lMN1IrLCBubyBlZmZlY3RvciBtYXJrZXJzKSDigJQKIyB0aGlzIG1lYW5zIHJlc29sdXRpb24gMC4wOCBmb3IgVENNIHdhcyBzdGlsbCB0b28gaGlnaCwgcHJvZHVjaW5nIDMgVENNCiMgbWlsZXN0b25lcyBpbnN0ZWFkIG9mIDIuIFJlZHVjaW5nIHRvIDAuMDUgY29sbGFwc2VzIHRoZSB0aGlyZCBUQ00gbWlsZXN0b25lCiMgc28gdGhlIHN1Yi1jbHVzdGVyaW5nIHlpZWxkcyBleGFjdGx5IDIgVENNIG1pbGVzdG9uZXMgKGVhcmx5IGFuZCBsYXRlKS4KIyBURU0gcmVzb2x1dGlvbiBpbmNyZWFzZWQgdG8gMC4zMCB0byBiZXR0ZXIgc2VwYXJhdGUgVEVNIGZyb20gVGVtcmEuCk1JTEVTVE9ORV9SRVMgPC0gYygKICAiQ0Q0IE5haXZlIiAgICAgPSAwLjA1LCAgICMgQ0hBTkdFRCAwLjEw4oaSMC4wNTogc2luZ2xlIGhvbW9nZW5lb3VzIG1pbGVzdG9uZQogICJDRDQgVENNIiAgICAgICA9IDAuMDUsICAgIyBDSEFOR0VEIDAuMDjihpIwLjA1OiB3YXMgcHJvZHVjaW5nIDMgbWlsZXN0b25lcywgbmVlZCAyCiAgIkNENCBURU0iICAgICAgID0gMC4zMCwgICAjIENIQU5HRUQgMC4yMOKGkjAuMzA6IGJldHRlciBzZXBhcmF0aW9uIG9mIFRFTSB2cyBUZW1yYQogICJDRDQgVGVtcmEvQ1RMIiA9IDAuMTAsICAgIyB1bmNoYW5nZWQg4oCUIHNpbmdsZSBtaWxlc3RvbmUgKG9ubHkgMTAgY2VsbHMpCiAgIlRyZWciICAgICAgICAgID0gMC4yMCAgICAjIHVuY2hhbmdlZCDigJQgMiBtaWxlc3RvbmVzIChuYWl2ZSArIHRlcm1pbmFsKQopCgpjYXQoIuKckyBTZXR1cCBjb21wbGV0ZVxuIikKY2F0KCJcblN0YXRlIGNvbG91cnM6XG4iKTsgICAgICAgIHByaW50KFNUQVRFX0NPTE9SUykKY2F0KCJcbk1pbGVzdG9uZSByZXNvbHV0aW9uczpcbiIpOyBwcmludChNSUxFU1RPTkVfUkVTKQpjYXQoIlxuU3RhdGUgY29sdW1uOiIsIFNUQVRFX0NPTCwgIlxuIikKY2F0KCJVTUFQIG5hbWU6ICAgIiwgVU1BUF9OQU1FLCAgIlxuIikKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMgTG9hZCAmIFZhbGlkYXRlIE9iamVjdHMKCmBgYHtyIGxvYWQtb2JqZWN0c30KY2Q0X3JlZiAgICA8LSByZWFkUkRTKCIuLi8uLi9DRDRfcmVmZXJlbmNlX2NsZWFuX0F6aW11dGhfcmVhZHlfZm9yX1NsaW5nc2hvdC5yZHMiKQpzZXphcnlfb2JqIDwtIHJlYWRSRFMoIi9ob21lL25hYmJhc2kvYXBvbGxvX2hvbWUvMS1TZXVyYXRfUkRTX09CSkVDVF9GSU5BTC9BbGxfc2FtcGxlc19NZXJnZWRfd2l0aF9SZW5hbWVkX0NsdXN0ZXJzX0NlbGxfc3RhdGUtMDMtMTItMjAyNS5yZHMucmRzIikKCmNhdCgiQ0Q0IHJlZmVyZW5jZSBsb2FkZWQ6IiwgbmNvbChjZDRfcmVmKSwgICAgImNlbGxzXG4iKQpjYXQoIlNlemFyeSBvYmplY3QgbG9hZGVkOiIsIG5jb2woc2V6YXJ5X29iaiksICJjZWxsc1xuIikKCmNhdCgiXG5BemltdXRoIGwyIGxhYmVscyBwcmVzZW50OlxuIikKcHJpbnQodGFibGUoY2Q0X3JlZkBtZXRhLmRhdGFbW1NUQVRFX0NPTF1dKSkKCnN0b3BpZm5vdCgKICAicHJlZGljdGVkLmNlbGx0eXBlLmwyIG1pc3NpbmcgZnJvbSBjZDRfcmVmIiA9IFNUQVRFX0NPTCAlaW4lIGNvbG5hbWVzKGNkNF9yZWZAbWV0YS5kYXRhKSwKICAiVU1BUCBtaXNzaW5nIGZyb20gY2Q0X3JlZiIgICAgICAgICAgICAgICAgICA9IFVNQVBfTkFNRSAlaW4lIG5hbWVzKGNkNF9yZWZAcmVkdWN0aW9ucyksCiAgIlJOQSBhc3NheSBtaXNzaW5nIGZyb20gY2Q0X3JlZiIgICAgICAgICAgICAgPSAiUk5BIiAlaW4lIG5hbWVzKGNkNF9yZWZAYXNzYXlzKSwKICAiUk5BIGFzc2F5IG1pc3NpbmcgZnJvbSBzZXphcnlfb2JqIiAgICAgICAgICA9ICJSTkEiICVpbiUgbmFtZXMoc2V6YXJ5X29iakBhc3NheXMpCikKY2F0KCLinIUgVmFsaWRhdGlvbiBwYXNzZWRcbiIpCgpEZWZhdWx0QXNzYXkoY2Q0X3JlZikgICAgPC0gIlJOQSIKRGVmYXVsdEFzc2F5KHNlemFyeV9vYmopIDwtICJSTkEiCgpjZDRfc3RhdGVzX2tlZXAgPC0gbmFtZXMoTUlMRVNUT05FX1JFUykKY2VsbHNfa2VlcCAgICAgIDwtIGNkNF9yZWZAbWV0YS5kYXRhW1tTVEFURV9DT0xdXSAlaW4lIGNkNF9zdGF0ZXNfa2VlcAppZiAoc3VtKCFjZWxsc19rZWVwKSA+IDApIHsKICBjZDRfcmVmIDwtIHN1YnNldChjZDRfcmVmLCBjZWxscyA9IGNvbG5hbWVzKGNkNF9yZWYpW2NlbGxzX2tlZXBdKQogIGNhdCgiU3Vic2V0dGVkIHRvIHRyYWplY3Rvcnkgc3RhdGVzOiIsIG5jb2woY2Q0X3JlZiksICJjZWxsc1xuIikKfQoKdW1hcF9kZiAgICAgICAgICAgPC0gYXMuZGF0YS5mcmFtZShFbWJlZGRpbmdzKGNkNF9yZWYsIFVNQVBfTkFNRSkpCmNvbG5hbWVzKHVtYXBfZGYpIDwtIGMoIlVNQVBfMSIsIlVNQVBfMiIpCnVtYXBfZGYkY2VsbCAgICAgIDwtIHJvd25hbWVzKHVtYXBfZGYpCnVtYXBfZGYkc3RhdGUgICAgIDwtIGNkNF9yZWZAbWV0YS5kYXRhW1tTVEFURV9DT0xdXQoKcmVmX3N1bW1hcnkgPC0gY2Q0X3JlZkBtZXRhLmRhdGEgJT4lCiAgY291bnQoISFzeW0oU1RBVEVfQ09MKSwgbmFtZSA9ICJuX2NlbGxzIikgJT4lCiAgcmVuYW1lKFN0YXRlID0gISFzeW0oU1RBVEVfQ09MKSkgJT4lCiAgbXV0YXRlKHBjdCA9IHJvdW5kKDEwMCAqIG5fY2VsbHMgLyBzdW0obl9jZWxscyksIDEpKSAlPiUKICBhcnJhbmdlKG1hdGNoKFN0YXRlLCBTVEFURV9PUkRFUikpCgprYWJsZShyZWZfc3VtbWFyeSwKICAgICAgY2FwdGlvbiA9IHNwcmludGYoIlJlZmVyZW5jZSBDRDQgVCBjZWxscyAobiA9ICVkIHRvdGFsKSIsIG5jb2woY2Q0X3JlZikpKSAlPiUKICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsImhvdmVyIiksIGZ1bGxfd2lkdGggPSBGQUxTRSkKYGBgCgoKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyBEZWZpbmUgTWlsZXN0b25lcyAoU2hhcmVkIGJ5IEJvdGggTWV0aG9kcykgCgojIyBTdWItY2x1c3RlcmluZwoKYGBge3IgZGVmaW5lLW1pbGVzdG9uZXN9CnNldC5zZWVkKDQyKQpjZDRfcmVmQG1ldGEuZGF0YSRtaWxlc3RvbmUgPC0gTkFfY2hhcmFjdGVyXwptaWxlc3RvbmVfY291bnRlciAgICAgICAgICAgPC0gMEwKbWlsZXN0b25lX3N0YXRlX21hcCAgICAgICAgIDwtIGxpc3QoKQoKc3RhdGVzX3ByZXNlbnQgPC0gaW50ZXJzZWN0KG5hbWVzKE1JTEVTVE9ORV9SRVMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZShjZDRfcmVmQG1ldGEuZGF0YVtbU1RBVEVfQ09MXV0pKQoKY2F0KCJEZWZpbmluZyBtaWxlc3RvbmVzIGJ5IHN1Yi1jbHVzdGVyaW5nIHdpdGhpbiBlYWNoIHN0YXRlOlxuXG4iKQoKZm9yIChzdCBpbiBzdGF0ZXNfcHJlc2VudCkgewogIGNlbGxzX3N0IDwtIGNvbG5hbWVzKGNkNF9yZWYpW2NkNF9yZWZAbWV0YS5kYXRhW1tTVEFURV9DT0xdXSA9PSBzdF0KCiAgaWYgKGxlbmd0aChjZWxsc19zdCkgPCA1MCkgewogICAgbV9pZCA8LSBzcHJpbnRmKCJNJTAyZCIsIG1pbGVzdG9uZV9jb3VudGVyKQogICAgY2Q0X3JlZkBtZXRhLmRhdGEkbWlsZXN0b25lW2NvbG5hbWVzKGNkNF9yZWYpICVpbiUgY2VsbHNfc3RdIDwtIG1faWQKICAgIG1pbGVzdG9uZV9zdGF0ZV9tYXBbW21faWRdXSA8LSBzdAogICAgbWlsZXN0b25lX2NvdW50ZXIgPC0gbWlsZXN0b25lX2NvdW50ZXIgKyAxTAogICAgY2F0KHNwcmludGYoIiAgJS0yMHMgICU0ZCBjZWxscyAg4oaSICAxIG1pbGVzdG9uZSAoJXMpIFt0b28gZmV3XVxuIiwKICAgICAgICAgICAgICAgIHN0LCBsZW5ndGgoY2VsbHNfc3QpLCBtX2lkKSkKICAgIG5leHQKICB9CgogIHN1Yl9vYmogPC0gc3Vic2V0KGNkNF9yZWYsIGNlbGxzID0gY2VsbHNfc3QpCgogIHN1Yl9vYmogPC0gRmluZE5laWdoYm9ycygKICAgIHN1Yl9vYmosCiAgICByZWR1Y3Rpb24gID0gInBjYSIsCiAgICBkaW1zICAgICAgID0gMToyMCwKICAgIGsucGFyYW0gICAgPSAyMCwKICAgIGdyYXBoLm5hbWUgPSBjKCJzdWJfbm4iLCJzdWJfc25uIiksCiAgICB2ZXJib3NlICAgID0gRkFMU0UKICApCgogIHN1Yl9vYmogPC0gRmluZENsdXN0ZXJzKAogICAgc3ViX29iaiwKICAgIGdyYXBoLm5hbWUgID0gInN1Yl9zbm4iLAogICAgcmVzb2x1dGlvbiAgPSBNSUxFU1RPTkVfUkVTW3N0XSwKICAgIHJhbmRvbS5zZWVkID0gNDIsCiAgICB2ZXJib3NlICAgICA9IEZBTFNFCiAgKQoKICBzdWJfY2x1c3RlcnMgPC0gYXMuY2hhcmFjdGVyKHN1Yl9vYmokc2V1cmF0X2NsdXN0ZXJzKQogIG5fc3ViICAgICAgICA8LSBsZW5ndGgodW5pcXVlKHN1Yl9jbHVzdGVycykpCgogIGZvciAoc2MgaW4gc29ydCh1bmlxdWUoc3ViX2NsdXN0ZXJzKSkpIHsKICAgIG1faWQgICAgIDwtIHNwcmludGYoIk0lMDJkIiwgbWlsZXN0b25lX2NvdW50ZXIpCiAgICBzY19jZWxscyA8LSBjZWxsc19zdFtzdWJfY2x1c3RlcnMgPT0gc2NdCiAgICBjZDRfcmVmQG1ldGEuZGF0YSRtaWxlc3RvbmVbY29sbmFtZXMoY2Q0X3JlZikgJWluJSBzY19jZWxsc10gPC0gbV9pZAogICAgbWlsZXN0b25lX3N0YXRlX21hcFtbbV9pZF1dIDwtIHN0CiAgICBtaWxlc3RvbmVfY291bnRlciA8LSBtaWxlc3RvbmVfY291bnRlciArIDFMCiAgfQoKICBjYXQoc3ByaW50ZigiICAlLTIwcyAgJTRkIGNlbGxzICDihpIgICVkIG1pbGVzdG9uZXMgKE0lMDJk4oCTTSUwMmQpXG4iLAogICAgICAgICAgICAgIHN0LCBsZW5ndGgoY2VsbHNfc3QpLCBuX3N1YiwKICAgICAgICAgICAgICBtaWxlc3RvbmVfY291bnRlciAtIG5fc3ViLCBtaWxlc3RvbmVfY291bnRlciAtIDEpKQp9CgpjYXQoc3ByaW50ZigiXG5Ub3RhbCBtaWxlc3RvbmVzOiAlZFxuIiwgbWlsZXN0b25lX2NvdW50ZXIpKQpjYXQoIlxuTWlsZXN0b25lIGRpc3RyaWJ1dGlvbjpcbiIpCnByaW50KHRhYmxlKGNkNF9yZWZAbWV0YS5kYXRhJG1pbGVzdG9uZSwgdXNlTkEgPSAiaWZhbnkiKSkKYGBgCgojIyBNaWxlc3RvbmUgQ2VudHJvaWRzCgpgYGB7ciBtaWxlc3RvbmUtY2VudHJvaWRzfQoKdW1hcF9kZiRtaWxlc3RvbmUgPC0gY2Q0X3JlZkBtZXRhLmRhdGEkbWlsZXN0b25lCgptaWxlc3RvbmVfY2VudHJvaWRzIDwtIHVtYXBfZGYgJT4lCiAgZmlsdGVyKCFpcy5uYShtaWxlc3RvbmUpKSAlPiUKICBncm91cF9ieShtaWxlc3RvbmUpICU+JQogIHN1bW1hcmlzZSgKICAgIFVNQVBfMSAgPSBtZWFuKFVNQVBfMSksCiAgICBVTUFQXzIgID0gbWVhbihVTUFQXzIpLAogICAgbl9jZWxscyA9IG4oKSwKICAgIHN0YXRlICAgPSBkcGx5cjo6Zmlyc3Qoc3RhdGUpLAogICAgLmdyb3VwcyA9ICJkcm9wIgogICkgJT4lCiAgbXV0YXRlKHN0YXRlID0gdW5saXN0KG1pbGVzdG9uZV9zdGF0ZV9tYXBbbWlsZXN0b25lXSkpICU+JQogIGFycmFuZ2UobWlsZXN0b25lKQoKY2F0KCJNaWxlc3RvbmUgY2VudHJvaWRzIOKAlCBpbnNwZWN0IGJlZm9yZSBzZXR0aW5nIG1hbnVhbCBlZGdlczpcbiIpCnByaW50KG1pbGVzdG9uZV9jZW50cm9pZHNbLCBjKCJtaWxlc3RvbmUiLCJzdGF0ZSIsIlVNQVBfMSIsIlVNQVBfMiIsIm5fY2VsbHMiKV0pCgprYWJsZShtaWxlc3RvbmVfY2VudHJvaWRzLAogICAgICBjYXB0aW9uID0gIk1pbGVzdG9uZSBjZW50cm9pZHMgaW4gVU1BUCBzcGFjZSIsCiAgICAgIGRpZ2l0cyAgPSAzKSAlPiUKICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsImNvbmRlbnNlZCIpLCBmdWxsX3dpZHRoID0gRkFMU0UpCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIE1ldGhvZCAxIOKAlCBDdXN0b20gTVNUIFRyYWplY3Rvcnkgey50YWJzZXQgLm1ldGhvZC1tc3R9Cgo6Ojogey5zZWN0aW9uLWJveCAubWV0aG9kLW1zdH0KKipDdXN0b20gTVNUIGFwcHJvYWNoKiogKEJ1cmVsICpldCBhbC4qIDIwMjIpOiBjb25uZWN0cyBtaWxlc3RvbmUgY2VudHJvaWRzIHdpdGggYSBNaW5pbXVtIFNwYW5uaW5nIFRyZWU7IGNlbGxzIGdldCBwc2V1ZG90aW1lIGJ5IHByb2plY3Rpb24gb250byBuZWFyZXN0IGVkZ2UuCjo6OgoKIyMgTVNUIENvbXB1dGF0aW9uCgpgYGB7ciBtc3QtY29tcHV0ZX0KIyDilIDilIAgU3RlcCAxOiBEaXN0YW5jZSBtYXRyaXgg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmNlbnRyb2lkX21hdCA8LSBhcy5tYXRyaXgobWlsZXN0b25lX2NlbnRyb2lkc1ssIGMoIlVNQVBfMSIsIlVNQVBfMiIpXSkKcm93bmFtZXMoY2VudHJvaWRfbWF0KSA8LSBtaWxlc3RvbmVfY2VudHJvaWRzJG1pbGVzdG9uZQpkaXN0X21hdCA8LSBhcy5tYXRyaXgoZGlzdChjZW50cm9pZF9tYXQsIG1ldGhvZCA9ICJldWNsaWRlYW4iKSkKCiMg4pSA4pSAIFN0ZXAgMjogUm9vdCA9IENENCBOYWl2ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKdG5fbWlsZXN0b25lcyA8LSBtaWxlc3RvbmVfY2VudHJvaWRzJG1pbGVzdG9uZVttaWxlc3RvbmVfY2VudHJvaWRzJHN0YXRlID09ICJDRDQgTmFpdmUiXQpjYXQoIkNENCBOYWl2ZSBtaWxlc3RvbmVzOiIsIHRuX21pbGVzdG9uZXMsICJcbiIpCgppZiAobGVuZ3RoKHRuX21pbGVzdG9uZXMpID09IDEpIHsKICByb290X21zIDwtIHRuX21pbGVzdG9uZXMKfSBlbHNlIHsKICB0bl9jZW50cm9pZCA8LSBjb2xNZWFucyhjZW50cm9pZF9tYXRbdG5fbWlsZXN0b25lcywgLCBkcm9wID0gRkFMU0VdKQogIHRuX2Rpc3RzICAgIDwtIHJvd1N1bXMoKGNlbnRyb2lkX21hdFt0bl9taWxlc3RvbmVzLCAsIGRyb3AgPSBGQUxTRV0gLQogICAgICAgICAgICAgICAgICAgbWF0cml4KHRuX2NlbnRyb2lkLCBucm93PWxlbmd0aCh0bl9taWxlc3RvbmVzKSwgbmNvbD0yLCBieXJvdz1UUlVFKSleMikKICByb290X21zIDwtIHRuX21pbGVzdG9uZXNbd2hpY2gubWluKHRuX2Rpc3RzKV0KfQpjYXQoIlJvb3QgbWlsZXN0b25lOiIsIHJvb3RfbXMsICJcbiIpCgojIOKUgOKUgCBTdGVwIDM6IEF1dG9tYXRpYyBNU1Qg4oCUIGluc3BlY3Qgb25seSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZ19hdXRvICAgPC0gZ3JhcGhfZnJvbV9hZGphY2VuY3lfbWF0cml4KGRpc3RfbWF0LCBtb2RlPSJ1bmRpcmVjdGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodGVkPVRSVUUsIGRpYWc9RkFMU0UpCm1zdF9hdXRvIDwtIG1zdChnX2F1dG8sIGFsZ29yaXRobT0icHJpbSIpCmNhdCgiXG5BdXRvbWF0aWMgTVNUIChyZWZlcmVuY2Ugb25seSk6XG4iKQphdXRvX2VkZ2VzIDwtIGFzX2VkZ2VsaXN0KG1zdF9hdXRvKQpmb3IgKGkgaW4gc2VxX2xlbihucm93KGF1dG9fZWRnZXMpKSkgewogIHMxIDwtIG1pbGVzdG9uZV9jZW50cm9pZHMkc3RhdGVbbWlsZXN0b25lX2NlbnRyb2lkcyRtaWxlc3RvbmUgPT0gYXV0b19lZGdlc1tpLDFdXQogIHMyIDwtIG1pbGVzdG9uZV9jZW50cm9pZHMkc3RhdGVbbWlsZXN0b25lX2NlbnRyb2lkcyRtaWxlc3RvbmUgPT0gYXV0b19lZGdlc1tpLDJdXQogIGNhdChzcHJpbnRmKCIgICVzKCVzKSDigJQgJXMoJXMpXG4iLCBhdXRvX2VkZ2VzW2ksMV0sIHMxLCBhdXRvX2VkZ2VzW2ksMl0sIHMyKSkKfQoKIyDilIDilIAgU3RlcCA0OiBCdWlsZCBlZGdlbGlzdCB2aWEgc3RhdGUgbG9va3VwIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAptc19ieV9zdGF0ZSA8LSBmdW5jdGlvbihzdGF0ZV9uYW1lLCByYW5rID0gMSkgewogIGNhbmRpZGF0ZXMgPC0gbWlsZXN0b25lX2NlbnRyb2lkc1ttaWxlc3RvbmVfY2VudHJvaWRzJHN0YXRlID09IHN0YXRlX25hbWUsIF0KICBpZiAobnJvdyhjYW5kaWRhdGVzKSA8IHJhbmspIHN0b3Aoc3ByaW50ZigKICAgICJTdGF0ZSAnJXMnIGhhcyBvbmx5ICVkIG1pbGVzdG9uZShzKSwgYnV0IHJhbms9JWQgd2FzIHJlcXVlc3RlZC4iLAogICAgc3RhdGVfbmFtZSwgbnJvdyhjYW5kaWRhdGVzKSwgcmFuaykpCiAgY2FuZGlkYXRlcyA8LSBjYW5kaWRhdGVzW29yZGVyKGNhbmRpZGF0ZXMkVU1BUF8xKSwgXQogIGNhbmRpZGF0ZXMkbWlsZXN0b25lW3JhbmtdCn0KCm5haXZlX21zICA8LSBtc19ieV9zdGF0ZSgiQ0Q0IE5haXZlIiwgICAgMSkKdGNtX2VfbXMgIDwtIG1zX2J5X3N0YXRlKCJDRDQgVENNIiwgICAgICAxKQp0Y21fbF9tcyAgPC0gbXNfYnlfc3RhdGUoIkNENCBUQ00iLCAgICAgIDIpCnRlbV9lX21zICA8LSBtc19ieV9zdGF0ZSgiQ0Q0IFRFTSIsICAgICAgMSkKdGVtX2xfbXMgIDwtIG1zX2J5X3N0YXRlKCJDRDQgVEVNIiwgICAgICAyKQp0ZW1yYV9tcyAgPC0gbXNfYnlfc3RhdGUoIkNENCBUZW1yYS9DVEwiLDEpCnRyZWdfbl9tcyA8LSBtc19ieV9zdGF0ZSgiVHJlZyIsICAgICAgICAgMSkKdHJlZ190X21zIDwtIG1zX2J5X3N0YXRlKCJUcmVnIiwgICAgICAgICAyKQoKY2F0KCJcblN0YXRlLXRvLUN1cnJlbnQtSUQgbWFwcGluZzpcbiIpCmNhdChzcHJpbnRmKCIgIE5haXZlOiAlc1xuICBUQ006ICAgJXMoZWFybHkpLCAlcyhsYXRlKVxuIiwgbmFpdmVfbXMsIHRjbV9lX21zLCB0Y21fbF9tcykpCmNhdChzcHJpbnRmKCIgIFRFTTogICAlcyhlYXJseSksICVzKGxhdGUpXG4gIFRlbXJhOiAlc1xuIiwgdGVtX2VfbXMsIHRlbV9sX21zLCB0ZW1yYV9tcykpCmNhdChzcHJpbnRmKCIgIFRyZWc6ICAlcyhuYWl2ZSksICVzKHRlcm1pbmFsKVxuIiwgdHJlZ19uX21zLCB0cmVnX3RfbXMpKQoKZWRnZV9saXN0X29yZGVyZWQgPC0gbWF0cml4KGMoCiAgbmFpdmVfbXMsICB0Y21fZV9tcywKICB0Y21fZV9tcywgIHRjbV9sX21zLAogIHRjbV9sX21zLCAgdGVtX2VfbXMsCiAgdGVtX2VfbXMsICB0ZW1fbF9tcywKICB0ZW1fbF9tcywgIHRlbXJhX21zLAogIHRjbV9sX21zLCAgdHJlZ19uX21zLAogIHRyZWdfbl9tcywgdHJlZ190X21zCiksIG5jb2wgPSAyLCBieXJvdyA9IFRSVUUpCgojIOKchSBGSVhFRDogZVsxXSA9IHJvdyBuYW1lLCBlWzJdID0gY29sIG5hbWUg4oaSIHNpbmdsZSBudW1lcmljIGRpc3RhbmNlIHZhbHVlCmVkZ2Vfd2VpZ2h0cyA8LSBhcHBseShlZGdlX2xpc3Rfb3JkZXJlZCwgMSwgZnVuY3Rpb24oZSkgZGlzdF9tYXRbZVsxXSwgZVsyXV0pCgojIFZhbGlkYXRlIG5vIE5hTiB3ZWlnaHRzIGJlZm9yZSBidWlsZGluZyBncmFwaAppZiAoYW55KCFpcy5maW5pdGUoZWRnZV93ZWlnaHRzKSkpIHsKICBiYWQgPC0gd2hpY2goIWlzLmZpbml0ZShlZGdlX3dlaWdodHMpKQogIHByaW50KGRhdGEuZnJhbWUoZnJvbT1lZGdlX2xpc3Rfb3JkZXJlZFtiYWQsMV0sCiAgICAgICAgICAgICAgICAgICB0byAgPWVkZ2VfbGlzdF9vcmRlcmVkW2JhZCwyXSwKICAgICAgICAgICAgICAgICAgIHcgICA9ZWRnZV93ZWlnaHRzW2JhZF0pKQogIHN0b3AoIk5hTi9OQS9JbmYgZWRnZSB3ZWlnaHRzIGRldGVjdGVkIOKAlCBjaGVjayBzdGF0ZSBsb29rdXAgb3IgZGlzdF9tYXQgcm93bmFtZXMuIikKfQoKbXN0X2dyYXBoIDwtIGdyYXBoX2Zyb21fZWRnZWxpc3QoZWRnZV9saXN0X29yZGVyZWQsIGRpcmVjdGVkID0gRkFMU0UpCkUobXN0X2dyYXBoKSR3ZWlnaHQgPC0gZWRnZV93ZWlnaHRzCgpjYXQoIlxuTWFudWFsIGVkZ2VzIGRlZmluZWQ6XG4iKQpmb3IgKGkgaW4gc2VxX2xlbihucm93KGVkZ2VfbGlzdF9vcmRlcmVkKSkpIHsKICBzZiA8LSBtaWxlc3RvbmVfY2VudHJvaWRzJHN0YXRlW21pbGVzdG9uZV9jZW50cm9pZHMkbWlsZXN0b25lID09IGVkZ2VfbGlzdF9vcmRlcmVkW2ksMV1dCiAgc3QgPC0gbWlsZXN0b25lX2NlbnRyb2lkcyRzdGF0ZVttaWxlc3RvbmVfY2VudHJvaWRzJG1pbGVzdG9uZSA9PSBlZGdlX2xpc3Rfb3JkZXJlZFtpLDJdXQogIGNhdChzcHJpbnRmKCIgICVzKCVzKSDihpIgJXMoJXMpICB3PSUuNGZcbiIsCiAgICAgICAgICAgICAgZWRnZV9saXN0X29yZGVyZWRbaSwxXSwgc2YsIGVkZ2VfbGlzdF9vcmRlcmVkW2ksMl0sIHN0LCBlZGdlX3dlaWdodHNbaV0pKQp9CgojIOKUgOKUgCBTdGVwIDU6IEV4cGxpY2l0IHRyYXZlcnNhbCBvcmRlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKYmZzX29yZGVyX2NsZWFuIDwtIHVuaXF1ZShhcy52ZWN0b3IodChlZGdlX2xpc3Rfb3JkZXJlZCkpKQpjYXQoIlxuVHJhdmVyc2FsIG9yZGVyOiIsIHBhc3RlKGJmc19vcmRlcl9jbGVhbiwgY29sbGFwc2U9IiDihpIgIiksICJcbiIpCgpzdG9waWZub3QoCiAgIk11c3QgaGF2ZSA4IG1pbGVzdG9uZXMiID0gbGVuZ3RoKGJmc19vcmRlcl9jbGVhbikgPT0gOCwKICAiTmFpdmUgbXVzdCBiZSByb290IiAgICAgPSBiZnNfb3JkZXJfY2xlYW5bMV0gPT0gbmFpdmVfbXMsCiAgIlRlbXJhIGJlZm9yZSBUcmVnIiAgICAgID0gd2hpY2goYmZzX29yZGVyX2NsZWFuPT10ZW1yYV9tcykgPCB3aGljaChiZnNfb3JkZXJfY2xlYW49PXRyZWdfbl9tcykKKQpjYXQoIuKchSBUcmF2ZXJzYWwgb3JkZXIgdmFsaWRhdGVkXG4iKQoKIyDilIDilIAgU3RlcCA2OiBSZW5hbWUgdG8gTTAwLU0wNyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKb2xkX3RvX25ldyA8LSBzZXROYW1lcyhzcHJpbnRmKCJNJTAyZCIsIHNlcV9hbG9uZyhiZnNfb3JkZXJfY2xlYW4pIC0gMUwpLCBiZnNfb3JkZXJfY2xlYW4pCgpjYXQoIlxuUmVuYW1pbmcgbWFwOlxuIikKZm9yIChvIGluIG5hbWVzKG9sZF90b19uZXcpKSB7CiAgc3QgPC0gbWlsZXN0b25lX2NlbnRyb2lkcyRzdGF0ZVttaWxlc3RvbmVfY2VudHJvaWRzJG1pbGVzdG9uZSA9PSBvXQogIGNhdChzcHJpbnRmKCIgICVzICglcykg4oaSICVzXG4iLCBvLCBzdCwgb2xkX3RvX25ld1tvXSkpCn0KCm1pbGVzdG9uZV9jZW50cm9pZHMkbWlsZXN0b25lIDwtIG9sZF90b19uZXdbbWlsZXN0b25lX2NlbnRyb2lkcyRtaWxlc3RvbmVdCmNkNF9yZWZAbWV0YS5kYXRhJG1pbGVzdG9uZSAgIDwtIHVubmFtZShvbGRfdG9fbmV3W2NkNF9yZWZAbWV0YS5kYXRhJG1pbGVzdG9uZV0pCm5hbWVzKG1pbGVzdG9uZV9zdGF0ZV9tYXApICAgIDwtIG9sZF90b19uZXdbbmFtZXMobWlsZXN0b25lX3N0YXRlX21hcCldCnJvd25hbWVzKGNlbnRyb2lkX21hdCkgICAgICAgIDwtIG9sZF90b19uZXdbcm93bmFtZXMoY2VudHJvaWRfbWF0KV0Kcm93bmFtZXMoZGlzdF9tYXQpICAgICAgICAgICAgPC0gb2xkX3RvX25ld1tyb3duYW1lcyhkaXN0X21hdCldCmNvbG5hbWVzKGRpc3RfbWF0KSAgICAgICAgICAgIDwtIG9sZF90b19uZXdbY29sbmFtZXMoZGlzdF9tYXQpXQpWKG1zdF9ncmFwaCkkbmFtZSAgICAgICAgICAgICA8LSB1bm5hbWUob2xkX3RvX25ld1tWKG1zdF9ncmFwaCkkbmFtZV0pCmNhdCgi4pyFIFJlbmFtaW5nIGFwcGxpZWRcbiIpCgojIOKUgOKUgCBTdGVwIDc6IFZlcmlmeSBmaW5hbCBiaW9sb2d5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAptaWxlc3RvbmVfb3JkZXIgPC0gc3ByaW50ZigiTSUwMmQiLCBzZXFfbGVuKG5yb3cobWlsZXN0b25lX2NlbnRyb2lkcykpIC0gMUwpCmNhdCgiXG5GaW5hbCBtaWxlc3RvbmUg4oaSIGJpb2xvZ3k6XG4iKQpmb3IgKG0gaW4gbWlsZXN0b25lX29yZGVyKSB7CiAgc3QgPC0gbWlsZXN0b25lX2NlbnRyb2lkcyRzdGF0ZVttaWxlc3RvbmVfY2VudHJvaWRzJG1pbGVzdG9uZSA9PSBtXQogIG5jIDwtIG1pbGVzdG9uZV9jZW50cm9pZHMkbl9jZWxsc1ttaWxlc3RvbmVfY2VudHJvaWRzJG1pbGVzdG9uZSA9PSBtXQogIGNhdChzcHJpbnRmKCIgICVzID0gJS0yMHMgIG49JTRkXG4iLCBtLCBzdCwgbmMpKQp9CmNhdCgiRXhwZWN0ZWQ6XG4gIE0wMD1OYWl2ZSAgTTAxL00wMj1UQ00gIE0wMy9NMDQ9VEVNICBNMDU9VGVtcmEvQ1RMICBNMDYvTTA3PVRyZWdcbiIpCgojIOKUgOKUgCBTd2FwIGhlbHBlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKc3dhcF9tcyA8LSBmdW5jdGlvbihhLCBiKSB7CiAgdG1wIDwtICJfX1RNUF9fIgogIHZuIDwtIFYobXN0X2dyYXBoKSRuYW1lCiAgdm5bdm49PWFdIDwtIHRtcDsgdm5bdm49PWJdIDwtIGE7IHZuW3ZuPT10bXBdIDwtIGI7IFYobXN0X2dyYXBoKSRuYW1lIDw8LSB2bgogIG1jIDwtIG1pbGVzdG9uZV9jZW50cm9pZHMkbWlsZXN0b25lCiAgbWNbbWM9PWFdIDwtIHRtcDsgbWNbbWM9PWJdIDwtIGE7IG1jW21jPT10bXBdIDwtIGI7IG1pbGVzdG9uZV9jZW50cm9pZHMkbWlsZXN0b25lIDw8LSBtYwogIG12IDwtIGNkNF9yZWZAbWV0YS5kYXRhJG1pbGVzdG9uZQogIG12WyFpcy5uYShtdikmbXY9PWFdIDwtIHRtcDsgbXZbIWlzLm5hKG12KSZtdj09Yl0gPC0gYQogIG12WyFpcy5uYShtdikmbXY9PXRtcF0gPC0gYjsgY2Q0X3JlZkBtZXRhLmRhdGEkbWlsZXN0b25lIDw8LSBtdgogIG5tIDwtIG5hbWVzKG1pbGVzdG9uZV9zdGF0ZV9tYXApCiAgbm1bbm09PWFdIDwtIHRtcDsgbm1bbm09PWJdIDwtIGE7IG5tW25tPT10bXBdIDwtIGI7IG5hbWVzKG1pbGVzdG9uZV9zdGF0ZV9tYXApIDw8LSBubQogIHJuIDwtIHJvd25hbWVzKGNlbnRyb2lkX21hdCkKICBybltybj09YV0gPC0gdG1wOyBybltybj09Yl0gPC0gYTsgcm5bcm49PXRtcF0gPC0gYjsgcm93bmFtZXMoY2VudHJvaWRfbWF0KSA8PC0gcm4KICBybiA8LSByb3duYW1lcyhkaXN0X21hdCk7IGNuIDwtIGNvbG5hbWVzKGRpc3RfbWF0KQogIHJuW3JuPT1hXSA8LSB0bXA7IHJuW3JuPT1iXSA8LSBhOyBybltybj09dG1wXSA8LSBiOyByb3duYW1lcyhkaXN0X21hdCkgPDwtIHJuCiAgY25bY249PWFdIDwtIHRtcDsgY25bY249PWJdIDwtIGE7IGNuW2NuPT10bXBdIDwtIGI7IGNvbG5hbWVzKGRpc3RfbWF0KSA8PC0gY24KICBjYXQoc3ByaW50ZigiICBTd2FwcGVkICVzIDwtPiAlc1xuIiwgYSwgYikpCn0KIyBzd2FwX21zKCJNMDMiLCJNMDQiKSAgIyBURU0gZWFybHkvbGF0ZSByZXZlcnNlZD8KIyBzd2FwX21zKCJNMDYiLCJNMDciKSAgIyBUcmVnIG5haXZlL3Rlcm1pbmFsIHJldmVyc2VkPwoKIyDilIDilIAgU3RlcCA4OiBHcmFwaCBkaXN0YW5jZXMg4oCUIHVud2VpZ2h0ZWQgKHN0ZXBzIGZyb20gcm9vdCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiMgd2VpZ2h0cz1OQSBmb3JjZXMgaG9wLWNvdW50IGRpc3RhbmNlLCBhdm9pZHMgYW55IE5hTiB3ZWlnaHQgaXNzdWUgZW50aXJlbHkKZ3JhcGhfZGlzdHMgPC0gZGlzdGFuY2VzKG1zdF9ncmFwaCwgdiA9ICJNMDAiLCB3ZWlnaHRzID0gTkEpCmdyYXBoX2Rpc3RzW2lzLmluZmluaXRlKGdyYXBoX2Rpc3RzKV0gPC0gbWF4KGdyYXBoX2Rpc3RzW2lzLmZpbml0ZShncmFwaF9kaXN0cyldKSArIDEKCm1pbGVzdG9uZV9jZW50cm9pZHMkZ3JhcGhfZGlzdCA8LSBhcy5udW1lcmljKGdyYXBoX2Rpc3RzWywgbWlsZXN0b25lX2NlbnRyb2lkcyRtaWxlc3RvbmVdKQptaWxlc3RvbmVfY2VudHJvaWRzJG9yZGVyX3BvcyAgPC0gbWF0Y2gobWlsZXN0b25lX2NlbnRyb2lkcyRtaWxlc3RvbmUsIG1pbGVzdG9uZV9vcmRlcikKbWlsZXN0b25lX2NlbnRyb2lkcyAgICAgICAgICAgICA8LSBhcnJhbmdlKG1pbGVzdG9uZV9jZW50cm9pZHMsIG9yZGVyX3BvcykKCiMg4pSA4pSAIFN0ZXAgOTogRWRnZSBkYXRhIGZyYW1lIGZvciBwbG90dGluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKbXN0X2VkZ2VzICAgPC0gYXNfZWRnZWxpc3QobXN0X2dyYXBoKQptc3RfZWRnZV9kZiA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkoc2VxX2xlbihucm93KG1zdF9lZGdlcykpLCBmdW5jdGlvbihpKSB7CiAgbTEgPC0gbXN0X2VkZ2VzW2ksMV07IG0yIDwtIG1zdF9lZGdlc1tpLDJdCiAgcjEgPC0gbWlsZXN0b25lX2NlbnRyb2lkc1ttaWxlc3RvbmVfY2VudHJvaWRzJG1pbGVzdG9uZSA9PSBtMSwgXQogIHIyIDwtIG1pbGVzdG9uZV9jZW50cm9pZHNbbWlsZXN0b25lX2NlbnRyb2lkcyRtaWxlc3RvbmUgPT0gbTIsIF0KICBpZiAobnJvdyhyMSk9PTAgfHwgbnJvdyhyMik9PTApIHJldHVybihOVUxMKQogIGRhdGEuZnJhbWUoeDE9cjEkVU1BUF8xLCB5MT1yMSRVTUFQXzIsIHgyPXIyJFVNQVBfMSwgeTI9cjIkVU1BUF8yKQp9KSkKCiMg4pSA4pSAIEZpbmFsIHN1bW1hcnkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmNhdChzcHJpbnRmKCJcbkZpbmFsIE1TVDogJWQgbm9kZXMsICVkIGVkZ2VzIHwgUm9vdDogTTAwXG4iLAogICAgICAgICAgICB2Y291bnQobXN0X2dyYXBoKSwgZWNvdW50KG1zdF9ncmFwaCkpKQptc3RfZWRnZXNfZmluYWwgPC0gYXNfZWRnZWxpc3QobXN0X2dyYXBoKQpmb3IgKGkgaW4gc2VxX2xlbihucm93KG1zdF9lZGdlc19maW5hbCkpKSB7CiAgczEgPC0gbWlsZXN0b25lX2NlbnRyb2lkcyRzdGF0ZVttaWxlc3RvbmVfY2VudHJvaWRzJG1pbGVzdG9uZSA9PSBtc3RfZWRnZXNfZmluYWxbaSwxXV0KICBzMiA8LSBtaWxlc3RvbmVfY2VudHJvaWRzJHN0YXRlW21pbGVzdG9uZV9jZW50cm9pZHMkbWlsZXN0b25lID09IG1zdF9lZGdlc19maW5hbFtpLDJdXQogIGNhdChzcHJpbnRmKCIgICVzICglcykg4oaSICVzICglcylcbiIsIG1zdF9lZGdlc19maW5hbFtpLDFdLCBzMSwgbXN0X2VkZ2VzX2ZpbmFsW2ksMl0sIHMyKSkKfQoKYGBgCgojIyBQc2V1ZG90aW1lIFByb2plY3Rpb24KCmBgYHtyIG1zdC1wc2V1ZG90aW1lfQpwcm9qZWN0X29udG9fbXN0IDwtIGZ1bmN0aW9uKGNlbGxfY29vcmRzLCBjZW50cm9pZF9tYXQsIG1zdF9ncmFwaCwgZ3JhcGhfZGlzdHMpIHsKICBlZGdlcyAgICAgIDwtIGFzX2VkZ2VsaXN0KG1zdF9ncmFwaCkKICBuX2NlbGxzICAgIDwtIG5yb3coY2VsbF9jb29yZHMpCiAgcHNldWRvdGltZSA8LSBudW1lcmljKG5fY2VsbHMpCiAgbmVhcmVzdF9tcyA8LSBjaGFyYWN0ZXIobl9jZWxscykKCiAgZm9yIChpIGluIHNlcV9sZW4obl9jZWxscykpIHsKICAgIGN4IDwtIGNlbGxfY29vcmRzW2ksIDFdOyBjeSA8LSBjZWxsX2Nvb3Jkc1tpLCAyXQogICAgYmVzdF9kaXN0IDwtIEluZjsgYmVzdF9wdCA8LSAwOyBiZXN0X21zIDwtIE5BX2NoYXJhY3Rlcl8KCiAgICBmb3IgKGUgaW4gc2VxX2xlbihucm93KGVkZ2VzKSkpIHsKICAgICAgbTEgPC0gZWRnZXNbZSwxXTsgbTIgPC0gZWRnZXNbZSwyXQogICAgICBwMSA8LSBjZW50cm9pZF9tYXRbbTEsXTsgcDIgPC0gY2VudHJvaWRfbWF0W20yLF0KICAgICAgZHggPC0gcDJbMV0tcDFbMV07IGR5IDwtIHAyWzJdLXAxWzJdCiAgICAgIGxlbjIgPC0gZHheMiArIGR5XjIKICAgICAgaWYgKGxlbjIgPCAxZS0xMCkgbmV4dAogICAgICB0ICAgIDwtIG1heCgwLCBtaW4oMSwgKChjeC1wMVsxXSkqZHggKyAoY3ktcDFbMl0pKmR5KSAvIGxlbjIpKQogICAgICBwcm9qIDwtIGMocDFbMV0rdCpkeCwgcDFbMl0rdCpkeSkKICAgICAgZCAgICA8LSBzcXJ0KChjeC1wcm9qWzFdKV4yICsgKGN5LXByb2pbMl0pXjIpCiAgICAgIGlmIChkIDwgYmVzdF9kaXN0KSB7CiAgICAgICAgYmVzdF9kaXN0IDwtIGQKICAgICAgICBwdF9tMSAgICAgPC0gZ3JhcGhfZGlzdHNbbTFdCiAgICAgICAgcHRfbTIgICAgIDwtIGdyYXBoX2Rpc3RzW20yXQogICAgICAgIGJlc3RfcHQgICA8LSBwdF9tMSArIHQgKiAocHRfbTIgLSBwdF9tMSkKICAgICAgICBiZXN0X21zICAgPC0gaWYgKHQgPCAwLjUpIG0xIGVsc2UgbTIKICAgICAgfQogICAgfQogICAgcHNldWRvdGltZVtpXSA8LSBiZXN0X3B0CiAgICBuZWFyZXN0X21zW2ldIDwtIGJlc3RfbXMKICB9CiAgbGlzdChwc2V1ZG90aW1lID0gcHNldWRvdGltZSwgbmVhcmVzdF9tcyA9IG5lYXJlc3RfbXMpCn0KCmNlbGxfY29vcmRzIDwtIGFzLm1hdHJpeCh1bWFwX2RmW2NvbG5hbWVzKGNkNF9yZWYpLCBjKCJVTUFQXzEiLCJVTUFQXzIiKV0pCmdfZGlzdHNfdmVjIDwtIHNldE5hbWVzKGFzLm51bWVyaWMoZ3JhcGhfZGlzdHMpLCBjb2xuYW1lcyhncmFwaF9kaXN0cykpCgpjYXQoIlByb2plY3RpbmcgcmVmZXJlbmNlIGNlbGxzIG9udG8gTVNULi4uXG4iKQptc3RfcHJvaiA8LSBwcm9qZWN0X29udG9fbXN0KGNlbGxfY29vcmRzLCBjZW50cm9pZF9tYXQsIG1zdF9ncmFwaCwgZ19kaXN0c192ZWMpCgptc3RfcHRfcmF3ICAgPC0gbXN0X3Byb2okcHNldWRvdGltZQptc3RfcHRfcmFuZ2UgPC0gcmFuZ2UobXN0X3B0X3JhdywgbmEucm0gPSBUUlVFKQoKbWV0YSA8LSBjZDRfcmVmQG1ldGEuZGF0YQptZXRhJG1zdF9wc2V1ZG90aW1lICAgICAgPC0gbXN0X3B0X3JhdwptZXRhJG1zdF9wc2V1ZG90aW1lX25vcm0gPC0gMTAwICogKG1zdF9wdF9yYXcgLSBtc3RfcHRfcmFuZ2VbMV0pIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobXN0X3B0X3JhbmdlWzJdIC0gbXN0X3B0X3JhbmdlWzFdKQptZXRhJG5lYXJlc3RfbWlsZXN0b25lICAgPC0gbXN0X3Byb2okbmVhcmVzdF9tcwpjZDRfcmVmQG1ldGEuZGF0YSAgICAgICAgPC0gbWV0YQoKY2F0KHNwcmludGYoIk1TVCBwc2V1ZG90aW1lIHJhbmdlOiAlLjNmIOKAkyAlLjNmXG4iLAogICAgICAgICAgICBtc3RfcHRfcmFuZ2VbMV0sIG1zdF9wdF9yYW5nZVsyXSkpCgojIFZhbGlkYXRlOiBtZWRpYW4gcHNldWRvdGltZSBzaG91bGQgaW5jcmVhc2UgYWxvbmcgdHJhamVjdG9yeQpjYXQoIlxuTWVkaWFuIHBzZXVkb3RpbWUgcGVyIHN0YXRlIChzaG91bGQgaW5jcmVhc2UgTmFpdmXihpJUQ03ihpJURU3ihpJUZW1yYSk6XG4iKQpwdF9jaGVjayA8LSBjZDRfcmVmQG1ldGEuZGF0YSAlPiUKICBncm91cF9ieSghIXN5bShTVEFURV9DT0wpKSAlPiUKICBzdW1tYXJpc2UobWVkaWFuX3B0ID0gcm91bmQobWVkaWFuKG1zdF9wc2V1ZG90aW1lX25vcm0sIG5hLnJtPVRSVUUpLCAxKSwKICAgICAgICAgICAgLmdyb3Vwcz0iZHJvcCIpICU+JQogIGFycmFuZ2UobWVkaWFuX3B0KQpwcmludChwdF9jaGVjaykKYGBgCgojIyBWaXN1YWxpc2F0aW9uCgpgYGB7ciBtc3QtcGxvdHMsIGZpZy53aWR0aD0xNCwgZmlnLmhlaWdodD0xMn0KbXNfcGxvdCA8LSBtaWxlc3RvbmVfY2VudHJvaWRzICU+JSBtdXRhdGUoeCA9IG9yZGVyX3BvcywgeSA9IDApCgpzdGF0ZV9iYW5kcyA8LSBtc19wbG90ICU+JQogIGdyb3VwX2J5KHN0YXRlKSAlPiUKICBzdW1tYXJpc2UoeG1pbiA9IG1pbih4KS0uNCwgeG1heCA9IG1heCh4KSsuNCwgLmdyb3Vwcz0iZHJvcCIpICU+JQogIG11dGF0ZSh5bWluPS0uMzUsIHltYXg9LS4xNSwgZmlsbD1TVEFURV9DT0xPUlNbc3RhdGVdKQoKZWRnZV9saW5lYXIgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHNlcV9sZW4obnJvdyhtc3RfZWRnZXMpKSwgZnVuY3Rpb24oaSkgewogIG0xPC1tc3RfZWRnZXNbaSwxXTsgbTI8LW1zdF9lZGdlc1tpLDJdCiAgcjE8LW1zX3Bsb3RbbXNfcGxvdCRtaWxlc3RvbmU9PW0xLF07IHIyPC1tc19wbG90W21zX3Bsb3QkbWlsZXN0b25lPT1tMixdCiAgaWYobnJvdyhyMSk9PTB8fG5yb3cocjIpPT0wKSByZXR1cm4oTlVMTCkKICBkYXRhLmZyYW1lKHgxPXIxJHgseTE9cjEkeSx4Mj1yMiR4LHkyPXIyJHkpCn0pKQoKIyDilIDilIAgUGFuZWwgYTogTGluZWFyIG1pbGVzdG9uZSB0cmFqZWN0b3J5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApwX21zdF9saW5lYXIgPC0gZ2dwbG90KCkgKwogIGdlb21fcmVjdChkYXRhPXN0YXRlX2JhbmRzLAogICAgICAgICAgICBhZXMoeG1pbj14bWluLHhtYXg9eG1heCx5bWluPXltaW4seW1heD15bWF4LGZpbGw9c3RhdGUpLCBhbHBoYT0uODUpICsKICBnZW9tX3RleHQoZGF0YT1zdGF0ZV9iYW5kcywKICAgICAgICAgICAgYWVzKHg9KHhtaW4reG1heCkvMiwgeT0oeW1pbit5bWF4KS8yLCBsYWJlbD1zdGF0ZSksCiAgICAgICAgICAgIGNvbG91cj0id2hpdGUiLCBzaXplPTMuNSwgZm9udGZhY2U9ImJvbGQiKSArCiAgZ2VvbV9zZWdtZW50KGRhdGE9ZWRnZV9saW5lYXIsCiAgICAgICAgICAgICAgIGFlcyh4PXgxLHk9eTEseGVuZD14Mix5ZW5kPXkyKSwKICAgICAgICAgICAgICAgY29sb3VyPSJncmV5MzUiLCBsaW5ld2lkdGg9MS4zLCBsaW5lZW5kPSJyb3VuZCIpICsKICBnZW9tX3RleHQoZGF0YT1tc19wbG90LAogICAgICAgICAgICBhZXMoeD14LCB5PXkrMC4xOCwgbGFiZWw9cGFzdGUwKCJuPSIsIHNjYWxlczo6Y29tbWEobl9jZWxscykpKSwKICAgICAgICAgICAgc2l6ZT0zLCBjb2xvdXI9ImdyZXkxMCIsIGZvbnRmYWNlPSJib2xkIiwgdmp1c3Q9MCkgKwogIGdlb21fcG9pbnQoZGF0YT1tc19wbG90LCBhZXMoeD14LCB5PXksIGZpbGw9c3RhdGUpLAogICAgICAgICAgICAgc2hhcGU9MjEsIGNvbG91cj0id2hpdGUiLCBzdHJva2U9Miwgc2l6ZT0xMikgKwogIGdlb21fdGV4dChkYXRhPW1zX3Bsb3QsIGFlcyh4PXgsIHk9eSwgbGFiZWw9bWlsZXN0b25lKSwKICAgICAgICAgICAgc2l6ZT0zLjIsIGNvbG91cj0id2hpdGUiLCBmb250ZmFjZT0iYm9sZCIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9U1RBVEVfQ09MT1JTLCBuYW1lPSJTdGF0ZSIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbT1jKC0uNSwgMC40NSkpICsKICB0aGVtZV92b2lkKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsCiAgICAgICAgbGVnZW5kLnRpdGxlICAgID0gZWxlbWVudF90ZXh0KHNpemU9MTAsIGZhY2U9ImJvbGQiKSwKICAgICAgICBsZWdlbmQudGV4dCAgICAgPSBlbGVtZW50X3RleHQoc2l6ZT05KSwKICAgICAgICBwbG90LnRpdGxlICAgICAgPSBlbGVtZW50X3RleHQoc2l6ZT0xMywgZmFjZT0iYm9sZCIsIGhqdXN0PS41KSwKICAgICAgICBwbG90Lm1hcmdpbiAgICAgPSBtYXJnaW4oMTUsIDEwLCAxMCwgMTApKSArCiAgZ2d0aXRsZSgiQ3VzdG9tIE1TVCDigJQgTWlsZXN0b25lcyBUcmFqZWN0b3J5IikKCiMg4pSA4pSAIFBhbmVsIGI6IE1pbGVzdG9uZXMgb24gVU1BUCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKcF9tc3RfdW1hcF9tcyA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9wb2ludChkYXRhPXVtYXBfZGZbc2FtcGxlKG5yb3codW1hcF9kZikpLF0sCiAgICAgICAgICAgICBhZXMoeD1VTUFQXzEseT1VTUFQXzIsY29sb3VyPXN0YXRlKSwgc2l6ZT0uMzUsIGFscGhhPS41KSArCiAgZ2VvbV9zZWdtZW50KGRhdGE9bXN0X2VkZ2VfZGYsCiAgICAgICAgICAgICAgIGFlcyh4PXgxLHk9eTEseGVuZD14Mix5ZW5kPXkyKSwKICAgICAgICAgICAgICAgY29sb3VyPSJibGFjayIsIGxpbmV3aWR0aD0xLCBhbHBoYT0uODUsIGxpbmVlbmQ9InJvdW5kIikgKwogIGdlb21fcG9pbnQoZGF0YT1taWxlc3RvbmVfY2VudHJvaWRzLAogICAgICAgICAgICAgYWVzKHg9VU1BUF8xLHk9VU1BUF8yLGZpbGw9c3RhdGUpLAogICAgICAgICAgICAgc2hhcGU9MjEsIHNpemU9OCwgY29sb3VyPSJ3aGl0ZSIsIHN0cm9rZT0yKSArCiAgZ2VvbV90ZXh0X3JlcGVsKGRhdGE9bWlsZXN0b25lX2NlbnRyb2lkcywKICAgICAgICAgICAgICAgICAgYWVzKHg9VU1BUF8xLHk9VU1BUF8yLGxhYmVsPW1pbGVzdG9uZSksCiAgICAgICAgICAgICAgICAgIHNpemU9MywgY29sb3VyPSJ3aGl0ZSIsIGZvbnRmYWNlPSJib2xkIiwKICAgICAgICAgICAgICAgICAgYmcuY29sb3I9ImdyZXkyMCIsIGJnLnI9LjE1LCBtYXgub3ZlcmxhcHM9MjUsCiAgICAgICAgICAgICAgICAgIHBvaW50LnBhZGRpbmc9MC4zLCBib3gucGFkZGluZz0wLjQpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1TVEFURV9DT0xPUlMsIGd1aWRlPSJub25lIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1TVEFURV9DT0xPUlMsIG5hbWU9IlN0YXRlIikgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgbGFicyh4PSJVTUFQLTEiLHk9IlVNQVAtMiIsdGl0bGU9IkN1c3RvbSBNU1Qg4oCUIE1pbGVzdG9uZXMgb24gVU1BUCIpICsKICB0aGVtZShwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEzLGZhY2U9ImJvbGQiKSkKCiMg4pSA4pSAIFBhbmVsIGM6IFBzZXVkb3RpbWUgb24gVU1BUCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKcHRfdW1hcF9kZiAgICAgICAgICAgIDwtIHVtYXBfZGYKcHRfdW1hcF9kZiRwc2V1ZG90aW1lIDwtIGNkNF9yZWZAbWV0YS5kYXRhJG1zdF9wc2V1ZG90aW1lX25vcm0KCnBfbXN0X3BzZXVkbyA8LSBnZ3Bsb3QocHRfdW1hcF9kZltzYW1wbGUobnJvdyhwdF91bWFwX2RmKSksXSwKICAgICAgICAgICAgICAgICAgICAgICAgYWVzKHg9VU1BUF8xLHk9VU1BUF8yLGNvbG91cj1wc2V1ZG90aW1lKSkgKwogIGdlb21fcG9pbnQoc2l6ZT0uMzUsIGFscGhhPS43KSArCiAgc2NhbGVfY29sb3VyX2dyYWRpZW50bigKICAgIGNvbG91cnMgPSBjKCIjMEQwODg3IiwiIzZBMDBBOCIsIiNCMTJBOTAiLCIjRTE2NDYyIiwiI0ZDQTYzNiIsIiNGMEY5MjEiKSwKICAgIG5hbWUgICAgPSAiUHNldWRvdGltZVxuKDDigJMxMDApIiwgbGltaXRzPWMoMCwxMDApKSArCiAgZ2VvbV9zZWdtZW50KGRhdGE9bXN0X2VkZ2VfZGYsCiAgICAgICAgICAgICAgIGFlcyh4PXgxLHk9eTEseGVuZD14Mix5ZW5kPXkyKSwKICAgICAgICAgICAgICAgY29sb3VyPSJibGFjayIsIGxpbmV3aWR0aD0uNywgYWxwaGE9LjYsIGluaGVyaXQuYWVzPUZBTFNFKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICBsYWJzKHg9IlVNQVAtMSIseT0iVU1BUC0yIix0aXRsZT0iQ3VzdG9tIE1TVCDigJQgUHNldWRvdGltZSBvbiBVTUFQIikgKwogIHRoZW1lKHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTMsZmFjZT0iYm9sZCIpKQoKcHJpbnQoKHBfbXN0X2xpbmVhcikgLyAocF9tc3RfdW1hcF9tcyB8IHBfbXN0X3BzZXVkbykpCiMgUGFuZWwgQTogTGluZWFyIHRyYWplY3RvcnkKcHJpbnQocF9tc3RfbGluZWFyKQoKIyBQYW5lbCBCOiBNaWxlc3RvbmVzIG9uIFVNQVAgIApwcmludChwX21zdF91bWFwX21zKQoKIyBQYW5lbCBDOiBQc2V1ZG90aW1lIG9uIFVNQVAKcHJpbnQocF9tc3RfcHNldWRvKQoKYGBgCgoKIyMgVmlzdWFsaXNhdGlvbgoKYGBge3IgLCBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD00fQoKCiMgUGFuZWwgQjogTWlsZXN0b25lcyBvbiBVTUFQICAKcHJpbnQocF9tc3RfdW1hcF9tcykKCiMgUGFuZWwgQzogUHNldWRvdGltZSBvbiBVTUFQCnByaW50KHBfbXN0X3BzZXVkbykKCmBgYAoKCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMgTWV0aG9kIDIg4oCUIE1vbm9jbGUzIFRyYWplY3Rvcnkgey50YWJzZXQgLm1ldGhvZC1tb25vY2xlfQoKOjo6IHsuc2VjdGlvbi1ib3ggLm1ldGhvZC1tb25vY2xlfQoqKk1vbm9jbGUzKiogZml0cyBhIHByaW5jaXBhbCBncmFwaCBkaXJlY3RseSB0byB0aGUgZGF0YSB0b3BvbG9neSB1c2luZyByZXZlcnNlZCBncmFwaCBlbWJlZGRpbmcsIHRoZW4gYXNzaWducyBwc2V1ZG90aW1lIGJ5IGdlb2Rlc2ljIGRpc3RhbmNlIGZyb20gdGhlIHJvb3QuCjo6OgoKIyMgQ29udmVydCAmIFByZXByb2Nlc3MKCmBgYHtyIG1vbm9jbGUzLWNvbnZlcnR9CkRlZmF1bHRBc3NheShjZDRfcmVmKSA8LSAiUk5BIgoKY2Q0X3JlZl9qb2luZWQgPC0gSm9pbkxheWVycyhjZDRfcmVmKQpjZHMgPC0gYXMuY2VsbF9kYXRhX3NldChjZDRfcmVmX2pvaW5lZCkKCmNvbERhdGEoY2RzKVtbU1RBVEVfQ09MXV0gPC0gY2Q0X3JlZkBtZXRhLmRhdGFbW1NUQVRFX0NPTF1dCmNvbERhdGEoY2RzKSRtaWxlc3RvbmUgICAgPC0gY2Q0X3JlZkBtZXRhLmRhdGEkbWlsZXN0b25lCgpyZWR1Y2VkRGltcyhjZHMpW1siUENBIl1dICA8LSBFbWJlZGRpbmdzKGNkNF9yZWYsICJwY2EiKQpyZWR1Y2VkRGltcyhjZHMpW1siVU1BUCJdXSA8LSBFbWJlZGRpbmdzKGNkNF9yZWYsIFVNQVBfTkFNRSkKCmNkcyA8LSBlc3RpbWF0ZV9zaXplX2ZhY3RvcnMoY2RzKQpjZHNAY2x1c3RlcnMkVU1BUCRjbHVzdGVycyA8LSBjZDRfcmVmQG1ldGEuZGF0YVtbU1RBVEVfQ09MXV0KCmNhdCgiY2VsbF9kYXRhX3NldCBjcmVhdGVkOlxuIikKY2F0KHNwcmludGYoIiAgJWQgY2VsbHMgfCAlZCBnZW5lc1xuIiwgbmNvbChjZHMpLCBucm93KGNkcykpKQpgYGAKCiMjIExlYXJuIEdyYXBoICYgU2V0IFJvb3QKCmBgYHtyIG1vbm9jbGUzLWdyYXBofQpzZXQuc2VlZCg0MikKRGVmYXVsdEFzc2F5KGNkNF9yZWYpIDwtICJSTkEiCmNkNF9yZWZfam9pbmVkIDwtIEpvaW5MYXllcnMoY2Q0X3JlZikKY2RzIDwtIGFzLmNlbGxfZGF0YV9zZXQoY2Q0X3JlZl9qb2luZWQpCgojIOKUgOKUgCBUcmFuc2ZlciBtZXRhZGF0YSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKY29sRGF0YShjZHMpW1tTVEFURV9DT0xdXSA8LSBjZDRfcmVmQG1ldGEuZGF0YVtbU1RBVEVfQ09MXV0KY29sRGF0YShjZHMpJG1pbGVzdG9uZSAgICA8LSBjZDRfcmVmQG1ldGEuZGF0YSRtaWxlc3RvbmUKCiMg4pSA4pSAIFRyYW5zZmVyIHJlZHVjdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACnJlZHVjZWREaW1zKGNkcylbWyJQQ0EiXV0gIDwtIEVtYmVkZGluZ3MoY2Q0X3JlZiwgInBjYSIpCnJlZHVjZWREaW1zKGNkcylbWyJVTUFQIl1dIDwtIEVtYmVkZGluZ3MoY2Q0X3JlZiwgVU1BUF9OQU1FKQoKY2RzIDwtIGVzdGltYXRlX3NpemVfZmFjdG9ycyhjZHMpCgojIOKUgOKUgCBGSVg6IFNldCBCT1RIIGNsdXN0ZXJzIEFORCBwYXJ0aXRpb25zIHdpdGggTkFNRUQgZmFjdG9ycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKIyBsZWFybl9ncmFwaCgpIGNoZWNrczogbmFtZXMoY2RzQGNsdXN0ZXJzJFVNQVAkcGFydGl0aW9ucykgIT0gTlVMTApjZWxsX2lkcyA8LSBjb2xuYW1lcyhjZHMpCgojIENsdXN0ZXJzOiBuYW1lZCBmYWN0b3Igb2Ygc3RhdGUgbGFiZWxzCmNsdXN0ZXJfdmVjIDwtIHNldE5hbWVzKAogIGZhY3RvcihjZDRfcmVmQG1ldGEuZGF0YVtbU1RBVEVfQ09MXV0pLAogIGNlbGxfaWRzCikKCiMgUGFydGl0aW9uczogYWxsIGNlbGxzIGluIG9uZSBwYXJ0aXRpb24gKHJlcXVpcmVkIHNsb3QsIHVzZV9wYXJ0aXRpb249RkFMU0UKIyBpZ25vcmVzIGJvdW5kYXJpZXMgYnV0IHRoZSBzbG90IG11c3Qgc3RpbGwgYmUgYSBuYW1lZCBmYWN0b3IpCnBhcnRpdGlvbl92ZWMgPC0gc2V0TmFtZXMoCiAgZmFjdG9yKHJlcCgxTCwgbGVuZ3RoKGNlbGxfaWRzKSkpLAogIGNlbGxfaWRzCikKCmNkc0BjbHVzdGVycyRVTUFQJGNsdXN0ZXJzICAgPC0gY2x1c3Rlcl92ZWMKY2RzQGNsdXN0ZXJzJFVNQVAkcGFydGl0aW9ucyAgPC0gcGFydGl0aW9uX3ZlYwoKIyBWZXJpZnkgbmFtZXMgYXJlIHByZXNlbnQgYmVmb3JlIGNhbGxpbmcgbGVhcm5fZ3JhcGgKc3RvcGlmbm90KAogICJjbHVzdGVycyBtdXN0IGJlIG5hbWVkIiAgID0gIWlzLm51bGwobmFtZXMoY2RzQGNsdXN0ZXJzJFVNQVAkY2x1c3RlcnMpKSwKICAicGFydGl0aW9ucyBtdXN0IGJlIG5hbWVkIiA9ICFpcy5udWxsKG5hbWVzKGNkc0BjbHVzdGVycyRVTUFQJHBhcnRpdGlvbnMpKSwKICAiY2x1c3RlciBsZW5ndGggbWF0Y2hlcyIgICA9IGxlbmd0aChjZHNAY2x1c3RlcnMkVU1BUCRjbHVzdGVycykgPT0gbmNvbChjZHMpLAogICJwYXJ0aXRpb24gbGVuZ3RoIG1hdGNoZXMiID0gbGVuZ3RoKGNkc0BjbHVzdGVycyRVTUFQJHBhcnRpdGlvbnMpID09IG5jb2woY2RzKQopCmNhdChzcHJpbnRmKCLinIUgY2x1c3RlcnMgYW5kIHBhcnRpdGlvbnMgc2V0OiAlZCBjZWxsc1xuIiwgbmNvbChjZHMpKSkKCmNhdCgiY2VsbF9kYXRhX3NldCBjcmVhdGVkOlxuIikKY2F0KHNwcmludGYoIiAgJWQgY2VsbHMgfCAlZCBnZW5lc1xuIiwgbmNvbChjZHMpLCBucm93KGNkcykpKQoKIyDilIDilIAgbGVhcm5fZ3JhcGgg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACnNldC5zZWVkKDQyKQpjZHMgPC0gbGVhcm5fZ3JhcGgoCiAgY2RzLAogIHVzZV9wYXJ0aXRpb24gICAgICAgPSBGQUxTRSwKICBjbG9zZV9sb29wICAgICAgICAgID0gRkFMU0UsCiAgbGVhcm5fZ3JhcGhfY29udHJvbCA9IGxpc3QobWluaW1hbF9icmFuY2hfbGVuID0gOCwgbm4uayA9IDIwKSwKICB2ZXJib3NlICAgICAgICAgICAgID0gRkFMU0UKKQpjYXQoIuKchSBsZWFybl9ncmFwaCBjb21wbGV0ZVxuIikKCmBgYAoKIyMgT3JkZXIgQ2VsbHMgJiBBc3NpZ24gUHNldWRvdGltZQpgYGB7ciBtb25vY2xlMy1vcmRlci1jZWxsc30KIyBTZXQgcm9vdCBhdCBDRDQgTmFpdmUgY2VudHJvaWQgYW5kIGFzc2lnbiBwc2V1ZG90aW1lCnRuX2NlbGxzICAgIDwtIGNvbG5hbWVzKGNkcylbY29sRGF0YShjZHMpW1tTVEFURV9DT0xdXSA9PSAiQ0Q0IE5haXZlIl0KdG5fdW1hcCAgICAgPC0gcmVkdWNlZERpbXMoY2RzKVtbIlVNQVAiXV1bdG5fY2VsbHMsICwgZHJvcCA9IEZBTFNFXQp0bl9jZW50cm9pZCA8LSBjb2xNZWFucyh0bl91bWFwKQoKcHJfbm9kZXMgICAgIDwtIHQoY2RzQHByaW5jaXBhbF9ncmFwaF9hdXhbWyJVTUFQIl1dJGRwX21zdCkKbm9kZV9kaXN0cyAgIDwtIHJvd1N1bXMoKHByX25vZGVzIC0gbWF0cml4KHRuX2NlbnRyb2lkLCBucm93PW5yb3cocHJfbm9kZXMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2w9MiwgYnlyb3c9VFJVRSkpXjIpCnJvb3RfcHJfbm9kZSA8LSBuYW1lcyh3aGljaC5taW4obm9kZV9kaXN0cykpCmNhdChzcHJpbnRmKCJSb290IHByaW5jaXBhbCBncmFwaCBub2RlOiAlc1xuIiwgcm9vdF9wcl9ub2RlKSkKCmNkcyA8LSBvcmRlcl9jZWxscyhjZHMsIHJvb3RfcHJfbm9kZXMgPSByb290X3ByX25vZGUpCgpwdF9yYXcgPC0gcHNldWRvdGltZShjZHMpCmNhdChzcHJpbnRmKCJQc2V1ZG90aW1lOiAlZCBub24tTkEgfCAlZCBOQVxuIiwKICAgICAgICAgICAgc3VtKCFpcy5uYShwdF9yYXcpKSwgc3VtKGlzLm5hKHB0X3JhdykpKSkKY2F0KHNwcmludGYoIlJhdyByYW5nZTogJS4zZiDigJMgJS4zZlxuIiwKICAgICAgICAgICAgbWluKHB0X3JhdywgbmEucm09VFJVRSksIG1heChwdF9yYXcsIG5hLnJtPVRSVUUpKSkKCnN0b3BpZm5vdCgib3JkZXJfY2VsbHMgcHJvZHVjZWQgYWxsIE5BIOKAlCBjaGVjayByb290IG5vZGUiID0gc3VtKCFpcy5uYShwdF9yYXcpKSA+IDApCgojIE5vcm1hbGlzZSBhbmQgd3JpdGUgdG8gY2Q0X3JlZiBtZXRhZGF0YQpwdF9taW4gPC0gbWluKHB0X3JhdywgbmEucm09VFJVRSkKcHRfbWF4IDwtIG1heChwdF9yYXcsIG5hLnJtPVRSVUUpCgptZXRhIDwtIGNkNF9yZWZAbWV0YS5kYXRhCm1ldGEkbW9ub2NsZTNfcHNldWRvdGltZSAgICAgIDwtIGFzLm51bWVyaWMocHRfcmF3KQptZXRhJG1vbm9jbGUzX3BzZXVkb3RpbWVfbm9ybSA8LSAxMDAgKiAoYXMubnVtZXJpYyhwdF9yYXcpIC0gcHRfbWluKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHRfbWF4IC0gcHRfbWluKQpjZDRfcmVmQG1ldGEuZGF0YSA8LSBtZXRhCgpjYXQoc3ByaW50ZigiTm9uLU5BIGluIG1ldGFkYXRhOiAlZCAvICVkXG4iLAogICAgICAgICAgICBzdW0oIWlzLm5hKGNkNF9yZWZAbWV0YS5kYXRhJG1vbm9jbGUzX3BzZXVkb3RpbWVfbm9ybSkpLAogICAgICAgICAgICBuY29sKGNkNF9yZWYpKSkKCmNhdCgiXG5NZWRpYW4gcHNldWRvdGltZSBwZXIgc3RhdGUgKE5haXZlIDwgVENNIDwgVEVNIDwgVGVtcmEgZXhwZWN0ZWQpOlxuIikKY2Q0X3JlZkBtZXRhLmRhdGEgJT4lCiAgZ3JvdXBfYnkoISFzeW0oU1RBVEVfQ09MKSkgJT4lCiAgc3VtbWFyaXNlKG1lZGlhbl9wdCA9IHJvdW5kKG1lZGlhbihtb25vY2xlM19wc2V1ZG90aW1lX25vcm0sIG5hLnJtPVRSVUUpLCAxKSwKICAgICAgICAgICAgLmdyb3VwcyAgID0gImRyb3AiKSAlPiUKICBhcnJhbmdlKG1lZGlhbl9wdCkgJT4lCiAgcHJpbnQoKQpgYGAKCgoKIyMgVmlzdWFsaXNhdGlvbgoKYGBge3IgbW9ub2NsZTMtcGxvdHMsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD04fQoKcHJfZ3JhcGhfb2JqIDwtIHByaW5jaXBhbF9ncmFwaChjZHMpW1siVU1BUCJdXQpwcl9sYXlvdXQgICAgPC0gdChjZHNAcHJpbmNpcGFsX2dyYXBoX2F1eFtbIlVNQVAiXV0kZHBfbXN0KQoKbTNfZWRnZV9saXN0IDwtIGlncmFwaDo6YXNfZWRnZWxpc3QocHJfZ3JhcGhfb2JqKQptM19lZGdlX2RmICAgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHNlcV9sZW4obnJvdyhtM19lZGdlX2xpc3QpKSwgZnVuY3Rpb24oaSkgewogIG4xIDwtIG0zX2VkZ2VfbGlzdFtpLDFdOyBuMiA8LSBtM19lZGdlX2xpc3RbaSwyXQogIGRhdGEuZnJhbWUoeDE9cHJfbGF5b3V0W24xLDFdLCB5MT1wcl9sYXlvdXRbbjEsMl0sCiAgICAgICAgICAgICB4Mj1wcl9sYXlvdXRbbjIsMV0sIHkyPXByX2xheW91dFtuMiwyXSkKfSkpCgp1bWFwX20zICAgICAgICAgICAgPC0gdW1hcF9kZgp1bWFwX20zJHBzZXVkb3RpbWUgPC0gY2Q0X3JlZkBtZXRhLmRhdGEkbW9ub2NsZTNfcHNldWRvdGltZV9ub3JtCgpwX20zX3N0YXRlcyA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9wb2ludChkYXRhPXVtYXBfbTNbc2FtcGxlKG5yb3codW1hcF9tMykpLF0sCiAgICAgICAgICAgICBhZXMoeD1VTUFQXzEsIHk9VU1BUF8yLCBjb2xvdXI9c3RhdGUpLCBzaXplPS4zNSwgYWxwaGE9LjYpICsKICBnZW9tX3NlZ21lbnQoZGF0YT1tM19lZGdlX2RmLAogICAgICAgICAgICAgICBhZXMoeD14MSx5PXkxLHhlbmQ9eDIseWVuZD15MiksCiAgICAgICAgICAgICAgIGNvbG91cj0iYmxhY2siLCBsaW5ld2lkdGg9LjYsIGFscGhhPS43LCBsaW5lZW5kPSJyb3VuZCIpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1TVEFURV9DT0xPUlMsIG5hbWU9IlN0YXRlIikgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgbGFicyh4PSJVTUFQLTEiLHk9IlVNQVAtMiIsIHRpdGxlPSJNb25vY2xlMyDigJQgUHJpbmNpcGFsIEdyYXBoICYgU3RhdGVzIikgKwogIHRoZW1lKHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTMsZmFjZT0iYm9sZCIpKQoKcF9tM19wc2V1ZG8gPC0gZ2dwbG90KHVtYXBfbTNbc2FtcGxlKG5yb3codW1hcF9tMykpLF0sCiAgICAgICAgICAgICAgICAgICAgICAgYWVzKHg9VU1BUF8xLCB5PVVNQVBfMiwgY29sb3VyPXBzZXVkb3RpbWUpKSArCiAgZ2VvbV9wb2ludChzaXplPS4zNSwgYWxwaGE9LjcpICsKICBzY2FsZV9jb2xvdXJfZ3JhZGllbnRuKAogICAgY29sb3Vycz1jKCIjMEQwODg3IiwiIzZBMDBBOCIsIiNCMTJBOTAiLCIjRTE2NDYyIiwiI0ZDQTYzNiIsIiNGMEY5MjEiKSwKICAgIG5hbWU9IlBzZXVkb3RpbWVcbigw4oCTMTAwKSIsIGxpbWl0cz1jKDAsMTAwKSkgKwogIGdlb21fc2VnbWVudChkYXRhPW0zX2VkZ2VfZGYsCiAgICAgICAgICAgICAgIGFlcyh4PXgxLHk9eTEseGVuZD14Mix5ZW5kPXkyKSwKICAgICAgICAgICAgICAgY29sb3VyPSJibGFjayIsIGxpbmV3aWR0aD0uNiwgYWxwaGE9LjYsIGluaGVyaXQuYWVzPUZBTFNFKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICBsYWJzKHg9IlVNQVAtMSIseT0iVU1BUC0yIiwgdGl0bGU9Ik1vbm9jbGUzIOKAlCBQc2V1ZG90aW1lIG9uIFVNQVAiKSArCiAgdGhlbWUocGxvdC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMyxmYWNlPSJib2xkIikpCgptM19wdF9kZiA8LSBkYXRhLmZyYW1lKAogIHN0YXRlICAgICAgPSBmYWN0b3IoY2Q0X3JlZkBtZXRhLmRhdGFbW1NUQVRFX0NPTF1dLCBsZXZlbHM9U1RBVEVfT1JERVIpLAogIHBzZXVkb3RpbWUgPSBjZDRfcmVmQG1ldGEuZGF0YSRtb25vY2xlM19wc2V1ZG90aW1lX25vcm0KKSAlPiUgZmlsdGVyKCFpcy5uYShwc2V1ZG90aW1lKSwgc3RhdGUgJWluJSBTVEFURV9PUkRFUikKCnBfbTNfdmlvbGluIDwtIGdncGxvdChtM19wdF9kZiwgYWVzKHg9c3RhdGUsIHk9cHNldWRvdGltZSwgZmlsbD1zdGF0ZSkpICsKICBnZW9tX3Zpb2xpbihzY2FsZT0id2lkdGgiLCB0cmltPUZBTFNFLCBhbHBoYT0uODUpICsKICBnZW9tX2JveHBsb3Qod2lkdGg9LjA4LCBmaWxsPSJ3aGl0ZSIsIG91dGxpZXIuc2l6ZT0uMywgb3V0bGllci5hbHBoYT0uMykgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1TVEFURV9DT0xPUlMsIGd1aWRlPSJub25lIikgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgbGFicyh4PU5VTEwsIHk9IlBzZXVkb3RpbWUgKDDigJMxMDApIiwgdGl0bGU9Ik1vbm9jbGUzIOKAlCBQc2V1ZG90aW1lIHBlciBTdGF0ZSIpICsKICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT0xMSwgZmFjZT0iYm9sZCIpLAogICAgICAgIHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTMsZmFjZT0iYm9sZCIpKQoKcHJpbnQoKHBfbTNfc3RhdGVzIHwgcF9tM19wc2V1ZG8pIC8gKHBfbTNfdmlvbGluIHwgcGxvdF9zcGFjZXIoKSkpCmBgYApgYGB7cn0KcF9tM19zdGF0ZXMKcF9tM19wc2V1ZG8KcF9tM192aW9saW4gCmBgYAoKCgpgYGB7cn0KCnNhdmVSRFMoY2Q0X3JlZiwgICAgICAgICAgICAgImNkNF9yZWZfZHVhbF90cmFqZWN0b3J5LnJkcyIpCnNhdmVSRFMoY2RzLCAgICAgICAgICAgICAgICAgIm1vbm9jbGUzX2Nkcy5yZHMiKQoKYGBgCgojIyBUcmFqZWN0b3J5LVZhcmlhYmxlIEdlbmVzCgpgYGB7ciBtb25vY2xlMy1ncmFwaC10ZXN0fQp2YXJfZ2VuZXNfdXNlIDwtIGhlYWQoVmFyaWFibGVGZWF0dXJlcyhjZDRfcmVmKSwgMjAwMCkKdmFyX2dlbmVzX3VzZSA8LSBpbnRlcnNlY3QodmFyX2dlbmVzX3VzZSwgcm93bmFtZXMoY2RzKSkKY2F0KHNwcmludGYoIlZhcmlhYmxlIGdlbmVzIGZvciBncmFwaF90ZXN0OiAlZFxuIiwgbGVuZ3RoKHZhcl9nZW5lc191c2UpKSkKCmNhdCgiUnVubmluZyBncmFwaF90ZXN0IChNb3JhbidzIEkpLi4uXG4iKQpwcl90ZXN0X3JlcyA8LSBncmFwaF90ZXN0KAogIGNkc1t2YXJfZ2VuZXNfdXNlLCBdLAogIG5laWdoYm9yX2dyYXBoID0gInByaW5jaXBhbF9ncmFwaCIsCiAgY29yZXMgICAgICAgICAgPSAyCikKCiMgQWRkIGdlbmUgbmFtZSBhcyBjb2x1bW4gYW5kIGZpbHRlciBzaWduaWZpY2FudCBoaXRzCnNpZ190cmFqX2dlbmVzIDwtIHByX3Rlc3RfcmVzICU+JQogIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKCJnZW5lIikgJT4lCiAgZmlsdGVyKHFfdmFsdWUgPCAwLjA1LCBzdGF0dXMgPT0gIk9LIikgJT4lCiAgYXJyYW5nZShkZXNjKG1vcmFuc19JKSkKCmNhdChzcHJpbnRmKCIlZCB0cmFqZWN0b3J5LXZhcmlhYmxlIGdlbmVzIChxIDwgMC4wNSlcbiIsIG5yb3coc2lnX3RyYWpfZ2VuZXMpKSkKCiMgRGVmaW5lIGdlbmVzIHRvIGV4Y2x1ZGUgZnJvbSBkb3RwbG90IOKAlCByaWJvc29tYWwsIG1pdG9jaG9uZHJpYWwsIGhvdXNla2VlcGluZwojIFRoZXNlIGFyZSB0cmFqZWN0b3J5LXZhcmlhYmxlIGR1ZSB0byB0ZWNobmljYWwgcmVhc29ucyBub3QgYmlvbG9neQpleGNsdWRlX2dlbmVzIDwtIGdyZXAoCiAgIl5SUFtTTF18Xk1ULXxeTUFMQVQxfF5ORUFUMXxeWElTVHxeQUNUQnxeR0FQREh8XkIyTXxeRUVGfF5FSUYiLAogIHJvd25hbWVzKGNkNF9yZWYpLCB2YWx1ZSA9IFRSVUUKKQpjYXQoc3ByaW50ZigiR2VuZXMgdG8gZXhjbHVkZSAodGVjaG5pY2FsKTogJWRcbiIsIGxlbmd0aChleGNsdWRlX2dlbmVzKSkpCgprYWJsZShoZWFkKHNpZ190cmFqX2dlbmVzWywgYygiZ2VuZSIsIm1vcmFuc19JIiwicV92YWx1ZSIpXSwgMjApLAogICAgICBjYXB0aW9uID0gIlRvcCAyMCB0cmFqZWN0b3J5LXZhcmlhYmxlIGdlbmVzIChNb25vY2xlMyBncmFwaF90ZXN0KSIsCiAgICAgIGRpZ2l0cyAgPSA0KSAlPiUKICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zPWMoInN0cmlwZWQiLCJjb25kZW5zZWQiKSwgZnVsbF93aWR0aD1GQUxTRSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9MjAgfQoKIyDilIDilIAgRW5zdXJlIG1pbGVzdG9uZV9mYWN0b3IgZXhpc3RzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAppZiAoISJtaWxlc3RvbmVfZmFjdG9yIiAlaW4lIGNvbG5hbWVzKGNkNF9yZWZAbWV0YS5kYXRhKSkgewogIGNkNF9yZWZAbWV0YS5kYXRhJG1pbGVzdG9uZV9mYWN0b3IgPC0gZmFjdG9yKAogICAgY2Q0X3JlZkBtZXRhLmRhdGEkbWlsZXN0b25lLCBsZXZlbHMgPSBtaWxlc3RvbmVfb3JkZXIKICApCn0KCiMg4pSA4pSAIEZpbHRlciB0ZWNobmljYWwgZ2VuZXMgYW5kIHRha2UgdG9wIG4g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACm5fa2VlcCA8LSAxMDAKCmNsZWFuX3RyYWpfZ2VuZXMgPC0gc2lnX3RyYWpfZ2VuZXMgJT4lCiAgZmlsdGVyKCFnZW5lICVpbiUgZXhjbHVkZV9nZW5lcykgJT4lICAgICAgICAjIHVzZSBnZW5lIGNvbHVtbiBub3Qgcm93bmFtZXMKICBzbGljZV9oZWFkKG4gPSBuX2tlZXApICU+JQogIHB1bGwoZ2VuZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZXh0cmFjdCBhcyBjaGFyYWN0ZXIgdmVjdG9yCgpjYXQoc3ByaW50ZigiQ2xlYW4gdHJhamVjdG9yeSBnZW5lczogJWQgKHJlbW92ZWQgJWQgdGVjaG5pY2FsKVxuIiwKICAgICAgICAgICAgbGVuZ3RoKGNsZWFuX3RyYWpfZ2VuZXMpLAogICAgICAgICAgICBucm93KHNpZ190cmFqX2dlbmVzKSAtIGxlbmd0aChjbGVhbl90cmFqX2dlbmVzKSkpCmNhdCgiRmlyc3QgMTA6IiwgcGFzdGUoaGVhZChjbGVhbl90cmFqX2dlbmVzLCAxMCksIGNvbGxhcHNlPSIsICIpLCAiXG4iKQoKIyDilIDilIAgQ29uZmlybSBnZW5lcyBleGlzdCBpbiBvYmplY3Qg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmNsZWFuX3RyYWpfZ2VuZXMgPC0gaW50ZXJzZWN0KGNsZWFuX3RyYWpfZ2VuZXMsIHJvd25hbWVzKGNkNF9yZWYpKQpjYXQoc3ByaW50ZigiR2VuZXMgZm91bmQgaW4gY2Q0X3JlZjogJWRcbiIsIGxlbmd0aChjbGVhbl90cmFqX2dlbmVzKSkpCgojIOKUgOKUgCBEb3RQbG90IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApEZWZhdWx0QXNzYXkoY2Q0X3JlZikgPC0gIlJOQSIKSWRlbnRzKGNkNF9yZWYpICAgICAgIDwtICJtaWxlc3RvbmVfZmFjdG9yIgoKcF9kb3QgPC0gRG90UGxvdCgKICBjZDRfcmVmLAogIGZlYXR1cmVzICA9IGNsZWFuX3RyYWpfZ2VuZXMsCiAgY29scyAgICAgID0gYygibGlnaHRncmV5IiwgIiNkNjI3MjgiKSwKICBkb3Quc2NhbGUgPSA2LAogIHNjYWxlICAgICA9IFRSVUUKKSArCiAgUm90YXRlZEF4aXMoKSArCiAgY29vcmRfZmxpcCgpICsKICBnZ3RpdGxlKHNwcmludGYoIlRvcCAlZCBNb25vY2xlMyBUcmFqZWN0b3J5IEdlbmVzIOKAlCBNaWxlc3RvbmVzIE0wMOKAk00wNyIsIG5fa2VlcCkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpLAogICAgICAgIHBsb3QudGl0bGUgID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMywgZmFjZSA9ICJib2xkIikpCgpwcmludChwX2RvdCkKCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIE1ldGhvZCBDb21wYXJpc29uIHsudGFic2V0IC5tZXRob2QtY29tcGFyZX0KCjo6OiB7LnNlY3Rpb24tYm94IC5tZXRob2QtY29tcGFyZX0KKipLZXkgcXVlc3Rpb24qKjogRG8gdGhlIHR3byBtZXRob2RzIGFncmVlIG9uIGNlbGwgb3JkZXJpbmc/Cjo6OgoKIyMgUHNldWRvdGltZSBDb3JyZWxhdGlvbgoKYGBge3IgY29tcGFyZS1jb3JyZWxhdGlvbiwgZmlnLndpZHRoPTE0LCBmaWcuaGVpZ2h0PTV9CmNvbXBhcmVfZGYgPC0gZGF0YS5mcmFtZSgKICBjZWxsICAgICAgICA9IGNvbG5hbWVzKGNkNF9yZWYpLAogIHN0YXRlICAgICAgID0gZmFjdG9yKGNkNF9yZWZAbWV0YS5kYXRhW1tTVEFURV9DT0xdXSwgbGV2ZWxzPVNUQVRFX09SREVSKSwKICBtc3RfcHQgICAgICA9IGNkNF9yZWZAbWV0YS5kYXRhJG1zdF9wc2V1ZG90aW1lX25vcm0sCiAgbW9ub2NsZTNfcHQgPSBjZDRfcmVmQG1ldGEuZGF0YSRtb25vY2xlM19wc2V1ZG90aW1lX25vcm0sCiAgbWlsZXN0b25lICAgPSBjZDRfcmVmQG1ldGEuZGF0YSRtaWxlc3RvbmUKKSAlPiUgZmlsdGVyKCFpcy5uYShtc3RfcHQpLCAhaXMubmEobW9ub2NsZTNfcHQpLCBzdGF0ZSAlaW4lIFNUQVRFX09SREVSKQoKb3ZlcmFsbF9jb3IgPC0gY29yKGNvbXBhcmVfZGYkbXN0X3B0LCBjb21wYXJlX2RmJG1vbm9jbGUzX3B0LAogICAgICAgICAgICAgICAgICAgbWV0aG9kID0gInNwZWFybWFuIiwgdXNlID0gImNvbXBsZXRlLm9icyIpCgpwZXJfc3RhdGVfY29yIDwtIGNvbXBhcmVfZGYgJT4lCiAgZ3JvdXBfYnkoc3RhdGUpICU+JQogIHN1bW1hcmlzZSgKICAgIG4gICAgICAgICA9IG4oKSwKICAgIHNwZWFybWFuICA9IHJvdW5kKGNvcihtc3RfcHQsIG1vbm9jbGUzX3B0LCBtZXRob2Q9InNwZWFybWFuIiksIDMpLAogICAgbWVhbl9kaWZmID0gcm91bmQobWVhbihtc3RfcHQgLSBtb25vY2xlM19wdCksIDEpLAogICAgc2RfZGlmZiAgID0gcm91bmQoc2QobXN0X3B0IC0gbW9ub2NsZTNfcHQpLCAxKSwKICAgIC5ncm91cHMgICA9ICJkcm9wIgogICkKCnBfc2NhdHRlciA8LSBnZ3Bsb3QoCiAgY29tcGFyZV9kZltzYW1wbGUobnJvdyhjb21wYXJlX2RmKSwgbWluKDUwMDAsbnJvdyhjb21wYXJlX2RmKSkpLF0sCiAgYWVzKHg9bXN0X3B0LCB5PW1vbm9jbGUzX3B0LCBjb2xvdXI9c3RhdGUpCikgKwogIGdlb21fcG9pbnQoc2l6ZT0uNiwgYWxwaGE9LjUpICsKICBnZW9tX2FibGluZShzbG9wZT0xLCBpbnRlcmNlcHQ9MCwgbGluZXR5cGU9ImRhc2hlZCIsIGNvbG91cj0iZ3JleTQwIiwgbGluZXdpZHRoPS44KSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsIHNlPUZBTFNFLCBjb2xvdXI9ImJsYWNrIiwgbGluZXdpZHRoPS44KSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9U1RBVEVfQ09MT1JTLCBuYW1lPSJTdGF0ZSIpICsKICBhbm5vdGF0ZSgidGV4dCIsIHg9NSwgeT05MiwKICAgICAgICAgICBsYWJlbD1zcHJpbnRmKCJTcGVhcm1hbiDPgSA9ICUuM2YiLCBvdmVyYWxsX2NvciksCiAgICAgICAgICAgc2l6ZT00LjUsIGZvbnRmYWNlPSJib2xkIiwgaGp1c3Q9MCkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgbGFicyh4PSJDdXN0b20gTVNUIHBzZXVkb3RpbWUgKDDigJMxMDApIiwgeT0iTW9ub2NsZTMgcHNldWRvdGltZSAoMOKAkzEwMCkiLAogICAgICAgdGl0bGU9IlBzZXVkb3RpbWUgY29ycmVsYXRpb246IEN1c3RvbSBNU1QgdnMgTW9ub2NsZTMiLAogICAgICAgc3VidGl0bGU9IkRhc2hlZCBsaW5lID0gcGVyZmVjdCBhZ3JlZW1lbnQgfCBTb2xpZCBsaW5lID0gbGluZWFyIGZpdCIpICsKICB0aGVtZShwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEzLGZhY2U9ImJvbGQiKSkKCnBfZGVuc2l0eSA8LSBnZ3Bsb3QoCiAgY29tcGFyZV9kZiAlPiUKICAgIHBpdm90X2xvbmdlcihjKG1zdF9wdCwgbW9ub2NsZTNfcHQpLCBuYW1lc190bz0ibWV0aG9kIiwgdmFsdWVzX3RvPSJwc2V1ZG90aW1lIikgJT4lCiAgICBtdXRhdGUobWV0aG9kID0gcmVjb2RlKG1ldGhvZCwgbXN0X3B0PSJDdXN0b20gTVNUIiwgbW9ub2NsZTNfcHQ9Ik1vbm9jbGUzIikpLAogIGFlcyh4PXBzZXVkb3RpbWUsIGNvbG91cj1tZXRob2QsIGZpbGw9bWV0aG9kKQopICsKICBnZW9tX2RlbnNpdHkoYWxwaGE9LjM1KSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9TUVUSE9EX0NPTE9SUywgbmFtZT0iTWV0aG9kIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1NRVRIT0RfQ09MT1JTLCBuYW1lPSJNZXRob2QiKSArCiAgZmFjZXRfd3JhcCh+c3RhdGUsIG5jb2w9Mywgc2NhbGVzPSJmcmVlX3kiKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICBsYWJzKHg9IlBzZXVkb3RpbWUgKDDigJMxMDApIiwgeT0iRGVuc2l0eSIsCiAgICAgICB0aXRsZT0iUHNldWRvdGltZSBkaXN0cmlidXRpb24gcGVyIHN0YXRlOiBtZXRob2QgY29tcGFyaXNvbiIpICsKICB0aGVtZShwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEzLGZhY2U9ImJvbGQiKSwKICAgICAgICBzdHJpcC50ZXh0PWVsZW1lbnRfdGV4dChmYWNlPSJib2xkIikpCgpwcmludChwX3NjYXR0ZXIgfCBwX2RlbnNpdHkpCmNhdChzcHJpbnRmKCJcbk92ZXJhbGwgU3BlYXJtYW4gz4EgPSAlLjNmXG5cbiIsIG92ZXJhbGxfY29yKSkKa2FibGUocGVyX3N0YXRlX2NvciwKICAgICAgY2FwdGlvbiA9ICJQZXItc3RhdGUgcHNldWRvdGltZSBjb3JyZWxhdGlvbiAoU3BlYXJtYW4pIiwKICAgICAgY29sLm5hbWVzID0gYygiU3RhdGUiLCJOIGNlbGxzIiwiU3BlYXJtYW4gz4EiLCJNZWFuIGRpZmYiLCJTRCBkaWZmIikpICU+JQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnM9Yygic3RyaXBlZCIsImhvdmVyIiksIGZ1bGxfd2lkdGg9RkFMU0UpCmBgYAoKIyMgU2lkZS1ieS1TaWRlIFVNQVAKCmBgYHtyIGNvbXBhcmUtdW1hcCwgZmlnLndpZHRoPTEzLCBmaWcuaGVpZ2h0PTZ9CnVtYXBfY29tcGFyZSAgICAgICAgICAgICA8LSB1bWFwX2RmCnVtYXBfY29tcGFyZSRtc3RfcHQgICAgICA8LSBjZDRfcmVmQG1ldGEuZGF0YSRtc3RfcHNldWRvdGltZV9ub3JtCnVtYXBfY29tcGFyZSRtb25vY2xlM19wdCA8LSBjZDRfcmVmQG1ldGEuZGF0YSRtb25vY2xlM19wc2V1ZG90aW1lX25vcm0KCnB0X2dyYWRpZW50IDwtIHNjYWxlX2NvbG91cl9ncmFkaWVudG4oCiAgY29sb3Vycz1jKCIjMEQwODg3IiwiIzZBMDBBOCIsIiNCMTJBOTAiLCIjRTE2NDYyIiwiI0ZDQTYzNiIsIiNGMEY5MjEiKSwKICBuYW1lPSJQc2V1ZG90aW1lXG4oMOKAkzEwMCkiLCBsaW1pdHM9YygwLDEwMCkKKQoKcF9zaWRlX21zdCA8LSBnZ3Bsb3QodW1hcF9jb21wYXJlW3NhbXBsZShucm93KHVtYXBfY29tcGFyZSkpLF0sCiAgICAgICAgICAgICAgICAgICAgICBhZXMoeD1VTUFQXzEseT1VTUFQXzIsY29sb3VyPW1zdF9wdCkpICsKICBnZW9tX3BvaW50KHNpemU9LjM1LGFscGhhPS43KSArCiAgZ2VvbV9zZWdtZW50KGRhdGE9bXN0X2VkZ2VfZGYsIGFlcyh4PXgxLHk9eTEseGVuZD14Mix5ZW5kPXkyKSwKICAgICAgICAgICAgICAgY29sb3VyPSJibGFjayIsbGluZXdpZHRoPS43LGFscGhhPS42LGluaGVyaXQuYWVzPUZBTFNFKSArCiAgcHRfZ3JhZGllbnQgKyB0aGVtZV9jbGFzc2ljKCkgKwogIGxhYnMoeD0iVU1BUC0xIix5PSJVTUFQLTIiLHRpdGxlPSJDdXN0b20gTVNUIikgKwogIHRoZW1lKHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTMsZmFjZT0iYm9sZCIsY29sb3VyPU1FVEhPRF9DT0xPUlNbIkN1c3RvbSBNU1QiXSkpCgpwX3NpZGVfbTMgPC0gZ2dwbG90KHVtYXBfY29tcGFyZVtzYW1wbGUobnJvdyh1bWFwX2NvbXBhcmUpKSxdLAogICAgICAgICAgICAgICAgICAgICBhZXMoeD1VTUFQXzEseT1VTUFQXzIsY29sb3VyPW1vbm9jbGUzX3B0KSkgKwogIGdlb21fcG9pbnQoc2l6ZT0uMzUsYWxwaGE9LjcpICsKICBnZW9tX3NlZ21lbnQoZGF0YT1tM19lZGdlX2RmLCBhZXMoeD14MSx5PXkxLHhlbmQ9eDIseWVuZD15MiksCiAgICAgICAgICAgICAgIGNvbG91cj0iYmxhY2siLGxpbmV3aWR0aD0uNixhbHBoYT0uNixpbmhlcml0LmFlcz1GQUxTRSkgKwogIHB0X2dyYWRpZW50ICsgdGhlbWVfY2xhc3NpYygpICsKICBsYWJzKHg9IlVNQVAtMSIseT0iVU1BUC0yIix0aXRsZT0iTW9ub2NsZTMiKSArCiAgdGhlbWUocGxvdC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMyxmYWNlPSJib2xkIixjb2xvdXI9TUVUSE9EX0NPTE9SU1siTW9ub2NsZTMiXSkpCgpwcmludChwX3NpZGVfbXN0IHwgcF9zaWRlX20zKQpgYGAKCiMjIERpc2NvcmRhbnQgQ2VsbHMKCmBgYHtyIGNvbXBhcmUtZGlzY29yZGFudCwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTZ9CmNvbXBhcmVfZGYkYWJzX2RpZmYgPC0gYWJzKGNvbXBhcmVfZGYkbXN0X3B0IC0gY29tcGFyZV9kZiRtb25vY2xlM19wdCkKdGhyZXNob2xkIDwtIHF1YW50aWxlKGNvbXBhcmVfZGYkYWJzX2RpZmYsIDAuOTAsIG5hLnJtPVRSVUUpCgpkaXNjb3JkYW50IDwtIGNvbXBhcmVfZGYgJT4lIGZpbHRlcihhYnNfZGlmZiA+IHRocmVzaG9sZCkgJT4lIGFycmFuZ2UoZGVzYyhhYnNfZGlmZikpCgpjYXQoc3ByaW50ZigiVG9wIDEwJSUgbW9zdCBkaXNjb3JkYW50IGNlbGxzICh8ZGlmZnwgPiAlLjFmKTogJWQgY2VsbHNcbiIsCiAgICAgICAgICAgIHRocmVzaG9sZCwgbnJvdyhkaXNjb3JkYW50KSkpCgp1bWFwX2Rpc2MgICAgICAgICAgICA8LSB1bWFwX2RmCnVtYXBfZGlzYyRkaXNjb3JkYW50IDwtIHJvd25hbWVzKHVtYXBfZGlzYykgJWluJSBkaXNjb3JkYW50JGNlbGwKdW1hcF9kaXNjJGFic19kaWZmICAgPC0gY29tcGFyZV9kZiRhYnNfZGlmZlttYXRjaChyb3duYW1lcyh1bWFwX2Rpc2MpLCBjb21wYXJlX2RmJGNlbGwpXQoKcF9kaXNjb3JkYW50IDwtIGdncGxvdCh1bWFwX2Rpc2Nbc2FtcGxlKG5yb3codW1hcF9kaXNjKSksXSwgYWVzKHg9VU1BUF8xLHk9VU1BUF8yKSkgKwogIGdlb21fcG9pbnQoZGF0YT1+ZmlsdGVyKC4sICFkaXNjb3JkYW50KSwgY29sb3VyPSJncmV5ODUiLCBzaXplPS4zLCBhbHBoYT0uNSkgKwogIGdlb21fcG9pbnQoZGF0YT1+ZmlsdGVyKC4sIGRpc2NvcmRhbnQpLCBhZXMoY29sb3VyPWFic19kaWZmKSwgc2l6ZT0uOCwgYWxwaGE9Ljg1KSArCiAgc2NhbGVfY29sb3VyX2dyYWRpZW50KGxvdz0iI0ZDQTYzNiIsIGhpZ2g9IiNDMDAwMDAiLCBuYW1lPSJ8TVNUIOKIkiBNM3wiKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICBsYWJzKHg9IlVNQVAtMSIseT0iVU1BUC0yIiwKICAgICAgIHRpdGxlPSJEaXNjb3JkYW50IGNlbGxzICh0b3AgMTAlIGRpc2FncmVlbWVudCkiLAogICAgICAgc3VidGl0bGU9IkJvdW5kYXJ5L3RyYW5zaXRpb24gY2VsbHMg4oCUIGJpb2xvZ2ljYWxseSBleHBlY3RlZCIpICsKICB0aGVtZShwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEzLGZhY2U9ImJvbGQiKSkKCmRpc2Nfc3RhdGVzIDwtIGRpc2NvcmRhbnQgJT4lIGNvdW50KHN0YXRlKSAlPiUgbXV0YXRlKHBjdD1yb3VuZCgxMDAqbi9zdW0obiksMSkpCgpwX2Rpc2NfYmFyIDwtIGdncGxvdChkaXNjX3N0YXRlcywgYWVzKHg9cmVvcmRlcihzdGF0ZSwtbiksIHk9cGN0LCBmaWxsPXN0YXRlKSkgKwogIGdlb21fY29sKHdpZHRoPS43KSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1zcHJpbnRmKCIlLjBmJSUiLHBjdCkpLCB2anVzdD0tLjMsIHNpemU9My41KSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPVNUQVRFX0NPTE9SUywgZ3VpZGU9Im5vbmUiKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICBsYWJzKHg9IlN0YXRlIiwgeT0iJSBvZiBkaXNjb3JkYW50IGNlbGxzIiwgdGl0bGU9IlN0YXRlIGNvbXBvc2l0aW9uIG9mIGRpc2NvcmRhbnQgY2VsbHMiKSArCiAgdGhlbWUocGxvdC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMixmYWNlPSJib2xkIikpCgpwcmludChwX2Rpc2NvcmRhbnQgfCBwX2Rpc2NfYmFyKQpgYGAKCiMjIFdoaWNoIE1ldGhvZCB0byBVc2U/CgpgYGB7ciBtZXRob2QtcmVjb21tZW5kYXRpb259CmlmIChvdmVyYWxsX2NvciA+IDAuOSkgewogIHJlYyA8LSAiSElHSCBhZ3JlZW1lbnQgKM+BID4gMC45KTogZWl0aGVyIG1ldGhvZCB2YWxpZC4gVXNlICoqQ3VzdG9tIE1TVCoqIGZvciBtaWxlc3RvbmUgbGFiZWxzOyAqKk1vbm9jbGUzKiogZm9yIGdyYXBoX3Rlc3QoKSB0cmFqZWN0b3J5IGdlbmVzLiIKfSBlbHNlIGlmIChvdmVyYWxsX2NvciA+IDAuNykgewogIHJlYyA8LSAiTU9ERVJBVEUgYWdyZWVtZW50ICjPgSA9IDAuN+KAkzAuOSk6IHNpbWlsYXIgb3JkZXJpbmcsIGRpZmZlciBhdCBib3VuZGFyaWVzLiBVc2UgYm90aCBhcyBjb21wbGVtZW50YXJ5IGV2aWRlbmNlLiIKfSBlbHNlIHsKICByZWMgPC0gIkxPVyBhZ3JlZW1lbnQgKM+BIDwgMC43KTogc2lnbmlmaWNhbnQgZGlzY29yZGFuY2UuIENoZWNrIFVNQVAgdG9wb2xvZ3kgYW5kIG1pbGVzdG9uZSBhc3NpZ25tZW50cy4iCn0KYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMgTWFya2VyIERvdFBsb3QgcGVyIE1pbGVzdG9uZQoKYGBge3IgcGFuZWwtZS1kb3RwbG90LCBmaWcud2lkdGg9OSwgZmlnLmhlaWdodD0xMH0KRGVmYXVsdEFzc2F5KGNkNF9yZWYpIDwtICJSTkEiCgpjZDRfcmVmQG1ldGEuZGF0YSRtaWxlc3RvbmVfZmFjdG9yIDwtIGZhY3RvcigKICBjZDRfcmVmQG1ldGEuZGF0YSRtaWxlc3RvbmUsIGxldmVscyA9IG1pbGVzdG9uZV9vcmRlcgopCklkZW50cyhjZDRfcmVmKSA8LSAibWlsZXN0b25lX2ZhY3RvciIKCnBhbmVsX2dlbmVzIDwtIGMoCiAgIyBOYWl2ZQogICJDQ1I3IiwiTEVGMSIsIlRDRjciLCJTRUxMIiwiS0xGMiIsIlNBVEIxIiwiSUw3UiIsIkNEMjciLCJNQUwiLAogICMgVENNCiAgIlMxMDBBNCIsIkFRUDMiLCJMVEIiLCJJVEdCMSIsIkNENDQiLCJDQ1I0IiwKICAjIFNoYXJlZCBhY3RpdmF0aW9uCiAgIkNENjkiLCJMTU5BIiwKICAjIFRFTSDigJQgZWZmZWN0b3IgbWVtb3J5IGFuZCBUaDEgc2tld2luZwogICJHWk1LIiwiQ0NMNSIsIkVPTUVTIiwiQ1hDUjMiLCJIT1BYIiwiQ1hDUjQiLCJJRk5HIiwiVE5GIiwiQ0NSNSIsCiAgIyBUZW1yYS9DVEwg4oCUIHRlcm1pbmFsIGN5dG90b3hpYyBlZmZlY3RvcgogICJHWk1CIiwiR1pNQSIsIlBSRjEiLCJOS0c3IiwiQ1gzQ1IxIiwiRkdGQlAyIiwiR05MWSIsIlRCWDIxIiwiWkVCMiIsCiAgIkZDR1IzQSIsIktMUkcxIiwiTlI0QTIiLAogICMgVHJlZyDigJQgY29yZSBpZGVudGl0eQogICJGT1hQMyIsIklMMlJBIiwiSUtaRjIiLCJJS1pGNCIsIlRJR0lUIiwiUlRLTjIiLCJUTkZSU0YxOCIsIkNUTEE0IiwKICAjIENvLWluaGliaXRvcnkgcmVjZXB0b3JzIOKAlCBzaGFyZWQgYmV0d2VlbiBlZmZlY3RvciBUcmVnIGFuZCBleGhhdXN0aW9uCiAgIyBFeHByZXNzaW9uIGhlcmUgcmVmbGVjdHMgVHJlZyBzdXBwcmVzc2l2ZSBtYWNoaW5lcnksIE5PVCBkeXNmdW5jdGlvbgogICMgQ3JpdGljYWwgZm9yIFPDqXphcnkgaW50ZXJwcmV0YXRpb246IFRyZWctbGlrZSB2cyBleGhhdXN0ZWQgaWRlbnRpdHkKICAiUERDRDEiLCJIQVZDUjIiLCJMQUczIgopCgpwYW5lbF9nZW5lcyA8LSB1bmlxdWUoaW50ZXJzZWN0KHBhbmVsX2dlbmVzLCByb3duYW1lcyhjZDRfcmVmKSkpCgpwX2RvdHBsb3RfbXMgPC0gRG90UGxvdCgKICBjZDRfcmVmLAogIGZlYXR1cmVzICA9IHBhbmVsX2dlbmVzLAogIGdyb3VwLmJ5ICA9ICJtaWxlc3RvbmVfZmFjdG9yIiwKICBjb2xzICAgICAgPSBjKCJsaWdodGdyZXkiLCIjZDYyNzI4IiksCiAgZG90LnNjYWxlID0gNCwgc2NhbGUgPSBUUlVFLCBjb2wubWluID0gLTEuNSwgY29sLm1heCA9IDIuNQopICsKICBSb3RhdGVkQXhpcygpICsgY29vcmRfZmxpcCgpICsKICB0aGVtZShheGlzLnRleHQueCAgICAgPSBlbGVtZW50X3RleHQoc2l6ZT04LCBmYWNlPSJib2xkIiksCiAgICAgICAgYXhpcy50ZXh0LnkgICAgID0gZWxlbWVudF90ZXh0KHNpemU9NyksCiAgICAgICAgcGxvdC50aXRsZSAgICAgID0gZWxlbWVudF90ZXh0KHNpemU9MTMsZmFjZT0iYm9sZCIpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArCiAgZ2d0aXRsZSgiTWFya2VyIGdlbmUgZXhwcmVzc2lvbiBwZXIgbWlsZXN0b25lIikKCnByaW50KHBfZG90cGxvdF9tcykKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMgUHJvamVjdCBTw6l6YXJ5IENlbGxzIG9udG8gUmVmZXJlbmNlIFRyYWplY3RvcnkKCiMjIE1hcFF1ZXJ5CgpgYGB7ciBzZXphcnktbWFwcXVlcnl9Cm9wdGlvbnMoZnV0dXJlLmdsb2JhbHMubWF4U2l6ZSA9IDIgKiAxMDI0XjMpCgpEZWZhdWx0QXNzYXkoY2Q0X3JlZikgICAgPC0gIlJOQSIKRGVmYXVsdEFzc2F5KHNlemFyeV9vYmopIDwtICJSTkEiCgpjZDRfcmVmIDwtIEZpbmRWYXJpYWJsZUZlYXR1cmVzKGNkNF9yZWYsIG5mZWF0dXJlcz0zMDAwLCB2ZXJib3NlPUZBTFNFKQoKY2F0KCJGaW5kaW5nIHRyYW5zZmVyIGFuY2hvcnMuLi5cbiIpCmFuY2hvcnMgPC0gRmluZFRyYW5zZmVyQW5jaG9ycygKICByZWZlcmVuY2UgICAgICAgICAgICA9IGNkNF9yZWYsCiAgcXVlcnkgICAgICAgICAgICAgICAgPSBzZXphcnlfb2JqLAogIG5vcm1hbGl6YXRpb24ubWV0aG9kID0gIkxvZ05vcm1hbGl6ZSIsCiAgcmVmZXJlbmNlLnJlZHVjdGlvbiAgPSAicGNhIiwKICBkaW1zICAgICAgICAgICAgICAgICA9IDE6MzAsCiAgcmVkdWN0aW9uICAgICAgICAgICAgPSAicGNhcHJvamVjdCIsCiAgdmVyYm9zZSAgICAgICAgICAgICAgPSBGQUxTRQopCgpjYXQoIlJ1bm5pbmcgTWFwUXVlcnkuLi5cbiIpCnNlemFyeV9vYmogPC0gTWFwUXVlcnkoCiAgYW5jaG9yc2V0ICAgICAgICAgICA9IGFuY2hvcnMsCiAgcXVlcnkgICAgICAgICAgICAgICA9IHNlemFyeV9vYmosCiAgcmVmZXJlbmNlICAgICAgICAgICA9IGNkNF9yZWYsCiAgcmVmZGF0YSAgICAgICAgICAgICA9IGxpc3QoCiAgICBwcmVkaWN0ZWRfc3RhdGUgICAgID0gU1RBVEVfQ09MLAogICAgcHJlZGljdGVkX21pbGVzdG9uZSA9ICJtaWxlc3RvbmUiCiAgKSwKICByZWZlcmVuY2UucmVkdWN0aW9uID0gInBjYSIsCiAgcmVkdWN0aW9uLm1vZGVsICAgICA9ICJ1bWFwIiwKICB2ZXJib3NlICAgICAgICAgICAgID0gRkFMU0UKKQoKY2F0KCJcblByZWRpY3RlZCBzdGF0ZSBkaXN0cmlidXRpb246XG4iKQpwcmludCh0YWJsZShzZXphcnlfb2JqJHByZWRpY3RlZC5wcmVkaWN0ZWRfc3RhdGUpKQpgYGAKCiMjIEFzc2lnbiBQc2V1ZG90aW1lIHZpYSBCb3RoIE1ldGhvZHMKCmBgYHtyIHNlemFyeS1wc2V1ZG90aW1lfQpzZXpfdW1hcF9jb29yZHMgICAgICAgICAgIDwtIGFzLm1hdHJpeChFbWJlZGRpbmdzKHNlemFyeV9vYmosICJyZWYudW1hcCIpKQpjb2xuYW1lcyhzZXpfdW1hcF9jb29yZHMpIDwtIGMoIlVNQVBfMSIsIlVNQVBfMiIpCgpjYXQoIlByb2plY3RpbmcgU8OpemFyeSBjZWxscyBvbnRvIE1TVC4uLlxuIikKc2V6X21zdCA8LSBwcm9qZWN0X29udG9fbXN0KHNlel91bWFwX2Nvb3JkcywgY2VudHJvaWRfbWF0LCBtc3RfZ3JhcGgsIGdfZGlzdHNfdmVjKQoKcmVmX3VtYXBfbWF0IDwtIEVtYmVkZGluZ3MoY2Q0X3JlZiwgVU1BUF9OQU1FKQpyZWZfbTNfcHQgICAgPC0gY2Q0X3JlZkBtZXRhLmRhdGEkbW9ub2NsZTNfcHNldWRvdGltZV9ub3JtCgpubl9yZXN1bHQgPC0gbm4yKGRhdGE9cmVmX3VtYXBfbWF0LCBxdWVyeT1zZXpfdW1hcF9jb29yZHMsIGs9MTUpCmludl9kaXN0ICA8LSAxIC8gKG5uX3Jlc3VsdCRubi5kaXN0cyArIDFlLTYpCndlaWdodHMgICA8LSBpbnZfZGlzdCAvIHJvd1N1bXMoaW52X2Rpc3QpCgptZXRhX3NleiA8LSBzZXphcnlfb2JqQG1ldGEuZGF0YQptZXRhX3NleiRtc3RfcHNldWRvdGltZSA8LSBwbWF4KDAsIHBtaW4oMTAwLAogIDEwMCAqIChzZXpfbXN0JHBzZXVkb3RpbWUgLSBtc3RfcHRfcmFuZ2VbMV0pIC8KICAgICAgICAgKG1zdF9wdF9yYW5nZVsyXSAtIG1zdF9wdF9yYW5nZVsxXSkKKSkKbWV0YV9zZXokbmVhcmVzdF9taWxlc3RvbmVfbXN0IDwtIHNlel9tc3QkbmVhcmVzdF9tcwptZXRhX3NleiRtb25vY2xlM19wc2V1ZG90aW1lICAgPC0gcm93U3VtcygKICB3ZWlnaHRzICogbWF0cml4KHJlZl9tM19wdFtubl9yZXN1bHQkbm4uaWR4XSwgbnJvdz1ucm93KG5uX3Jlc3VsdCRubi5pZHgpKQopCnNlemFyeV9vYmpAbWV0YS5kYXRhIDwtIG1ldGFfc2V6CgpjYXQoc3ByaW50ZigiTVNUIHBzZXVkb3RpbWU6ICAgICAgJS4xZiDigJMgJS4xZlxuIiwKICAgICAgICAgICAgcmFuZ2Uoc2V6YXJ5X29iakBtZXRhLmRhdGEkbXN0X3BzZXVkb3RpbWUsIG5hLnJtPVRSVUUpKSkKY2F0KHNwcmludGYoIk1vbm9jbGUzIHBzZXVkb3RpbWU6ICUuMWYg4oCTICUuMWZcbiIsCiAgICAgICAgICAgIHJhbmdlKHNlemFyeV9vYmpAbWV0YS5kYXRhJG1vbm9jbGUzX3BzZXVkb3RpbWUsIG5hLnJtPVRSVUUpKSkKYGBgCgojIyBQcm9qZWN0aW9uIFZpc3VhbGlzYXRpb24gCgojIyMgQ3VzdG9tIE1TVAoKYGBge3Igc2V6LXBsb3QtbXN0LCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9OX0KcmVmX2JnIDwtIGRhdGEuZnJhbWUoCiAgVU1BUF8xID0gRW1iZWRkaW5ncyhjZDRfcmVmLCBVTUFQX05BTUUpWywxXSwKICBVTUFQXzIgPSBFbWJlZGRpbmdzKGNkNF9yZWYsIFVNQVBfTkFNRSlbLDJdCikKCnNlel9wbG90X2RmIDwtIGRhdGEuZnJhbWUoCiAgVU1BUF8xICAgICAgICAgID0gc2V6X3VtYXBfY29vcmRzWywiVU1BUF8xIl0sCiAgVU1BUF8yICAgICAgICAgID0gc2V6X3VtYXBfY29vcmRzWywiVU1BUF8yIl0sCiAgcHJlZGljdGVkX3N0YXRlID0gc2V6YXJ5X29iakBtZXRhLmRhdGEkcHJlZGljdGVkLnByZWRpY3RlZF9zdGF0ZSwKICBwcmVkX3Njb3JlICAgICAgPSBzZXphcnlfb2JqQG1ldGEuZGF0YSRwcmVkaWN0ZWQucHJlZGljdGVkX3N0YXRlLnNjb3JlLAogIG1zdF9wdCAgICAgICAgICA9IHNlemFyeV9vYmpAbWV0YS5kYXRhJG1zdF9wc2V1ZG90aW1lLAogIG0zX3B0ICAgICAgICAgICA9IHNlemFyeV9vYmpAbWV0YS5kYXRhJG1vbm9jbGUzX3BzZXVkb3RpbWUsCiAgbWlsZXN0b25lX3JlZiAgID0gc2V6YXJ5X29iakBtZXRhLmRhdGEkbmVhcmVzdF9taWxlc3RvbmVfbXN0CikKCnBfc2V6X21zdF9zdGF0ZSA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9wb2ludChkYXRhPXJlZl9iZ1tzYW1wbGUobnJvdyhyZWZfYmcpKSxdLAogICAgICAgICAgICAgYWVzKHg9VU1BUF8xLHk9VU1BUF8yKSwgY29sb3VyPSJncmV5ODUiLCBzaXplPS4zLCBhbHBoYT0uNCkgKwogIGdlb21fc2VnbWVudChkYXRhPW1zdF9lZGdlX2RmLCBhZXMoeD14MSx5PXkxLHhlbmQ9eDIseWVuZD15MiksCiAgICAgICAgICAgICAgIGNvbG91cj0iZ3JleTMwIiwgbGluZXdpZHRoPS44LCBhbHBoYT0uNykgKwogIGdlb21fcG9pbnQoZGF0YT1zZXpfcGxvdF9kZiwKICAgICAgICAgICAgIGFlcyh4PVVNQVBfMSx5PVVNQVBfMixjb2xvdXI9cHJlZGljdGVkX3N0YXRlKSwgc2l6ZT0xLjgsIGFscGhhPS44NSkgKwogIGdlb21fdGV4dF9yZXBlbChkYXRhPW1pbGVzdG9uZV9jZW50cm9pZHMsCiAgICAgICAgICAgICAgICAgIGFlcyh4PVVNQVBfMSx5PVVNQVBfMixsYWJlbD1taWxlc3RvbmUpLAogICAgICAgICAgICAgICAgICBzaXplPTIuNSwgY29sb3VyPSJncmV5MjAiLCBmb250ZmFjZT0iYm9sZCIsCiAgICAgICAgICAgICAgICAgIG1heC5vdmVybGFwcz0yMCwgc2VnbWVudC5zaXplPS4zKSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9U1RBVEVfQ09MT1JTLCBuYW1lPSJQcmVkaWN0ZWQgc3RhdGUiKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICBsYWJzKHg9IlVNQVAtMSIseT0iVU1BUC0yIiwKICAgICAgIHRpdGxlPSJTw6l6YXJ5IGNlbGxzIOKAlCBDdXN0b20gTVNUIHByb2plY3Rpb24gKHByZWRpY3RlZCBzdGF0ZSkiLAogICAgICAgc3VidGl0bGU9IkdyZXkgPSBub3JtYWwgQ0Q0IHJlZmVyZW5jZSB8IENvbG91cmVkID0gU8OpemFyeSB8IExpbmVzID0gTVNUIikgKwogIHRoZW1lKHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTMsZmFjZT0iYm9sZCIpKQoKcF9zZXpfbXN0X3B0IDwtIGdncGxvdCgpICsKICBnZW9tX3BvaW50KGRhdGE9cmVmX2JnW3NhbXBsZShucm93KHJlZl9iZykpLF0sCiAgICAgICAgICAgICBhZXMoeD1VTUFQXzEseT1VTUFQXzIpLCBjb2xvdXI9ImdyZXk4NSIsIHNpemU9LjMsIGFscGhhPS40KSArCiAgZ2VvbV9zZWdtZW50KGRhdGE9bXN0X2VkZ2VfZGYsIGFlcyh4PXgxLHk9eTEseGVuZD14Mix5ZW5kPXkyKSwKICAgICAgICAgICAgICAgY29sb3VyPSJncmV5MzAiLCBsaW5ld2lkdGg9LjcsIGFscGhhPS42KSArCiAgZ2VvbV9wb2ludChkYXRhPXNlel9wbG90X2RmLAogICAgICAgICAgICAgYWVzKHg9VU1BUF8xLHk9VU1BUF8yLGNvbG91cj1tc3RfcHQpLCBzaXplPTEuOCwgYWxwaGE9LjkpICsKICBzY2FsZV9jb2xvdXJfZ3JhZGllbnRuKAogICAgY29sb3Vycz1jKCIjMEQwODg3IiwiIzZBMDBBOCIsIiNCMTJBOTAiLCIjRTE2NDYyIiwiI0ZDQTYzNiIsIiNGMEY5MjEiKSwKICAgIG5hbWU9Ik1TVFxucHNldWRvdGltZSIsIGxpbWl0cz1jKDAsMTAwKSkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgbGFicyh4PSJVTUFQLTEiLHk9IlVNQVAtMiIsdGl0bGU9IlPDqXphcnkg4oCUIE1TVCBwcm9qZWN0ZWQgcHNldWRvdGltZSIpICsKICB0aGVtZShwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEzLGZhY2U9ImJvbGQiKSkKCnByaW50KHBfc2V6X21zdF9zdGF0ZSAvIHBfc2V6X21zdF9wdCkKYGBgCgojIyMgTW9ub2NsZTMKCmBgYHtyIHNlei1wbG90LW0zLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9OX0KcF9zZXpfbTNfc3RhdGUgPC0gZ2dwbG90KCkgKwogIGdlb21fcG9pbnQoZGF0YT1yZWZfYmdbc2FtcGxlKG5yb3cocmVmX2JnKSksXSwKICAgICAgICAgICAgIGFlcyh4PVVNQVBfMSx5PVVNQVBfMiksIGNvbG91cj0iZ3JleTg1Iiwgc2l6ZT0uMywgYWxwaGE9LjQpICsKICBnZW9tX3NlZ21lbnQoZGF0YT1tM19lZGdlX2RmLCBhZXMoeD14MSx5PXkxLHhlbmQ9eDIseWVuZD15MiksCiAgICAgICAgICAgICAgIGNvbG91cj0iZ3JleTMwIiwgbGluZXdpZHRoPS42LCBhbHBoYT0uNykgKwogIGdlb21fcG9pbnQoZGF0YT1zZXpfcGxvdF9kZiwKICAgICAgICAgICAgIGFlcyh4PVVNQVBfMSx5PVVNQVBfMixjb2xvdXI9cHJlZGljdGVkX3N0YXRlKSwgc2l6ZT0xLjgsIGFscGhhPS44NSkgKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPVNUQVRFX0NPTE9SUywgbmFtZT0iUHJlZGljdGVkIHN0YXRlIikgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgbGFicyh4PSJVTUFQLTEiLHk9IlVNQVAtMiIsCiAgICAgICB0aXRsZT0iU8OpemFyeSBjZWxscyDigJQgTW9ub2NsZTMgcHJvamVjdGlvbiAocHJlZGljdGVkIHN0YXRlKSIpICsKICB0aGVtZShwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEzLGZhY2U9ImJvbGQiKSkKCnBfc2V6X20zX3B0IDwtIGdncGxvdCgpICsKICBnZW9tX3BvaW50KGRhdGE9cmVmX2JnW3NhbXBsZShucm93KHJlZl9iZykpLF0sCiAgICAgICAgICAgICBhZXMoeD1VTUFQXzEseT1VTUFQXzIpLCBjb2xvdXI9ImdyZXk4NSIsIHNpemU9LjMsIGFscGhhPS40KSArCiAgZ2VvbV9zZWdtZW50KGRhdGE9bTNfZWRnZV9kZiwgYWVzKHg9eDEseT15MSx4ZW5kPXgyLHllbmQ9eTIpLAogICAgICAgICAgICAgICBjb2xvdXI9ImdyZXkzMCIsIGxpbmV3aWR0aD0uNSwgYWxwaGE9LjYpICsKICBnZW9tX3BvaW50KGRhdGE9c2V6X3Bsb3RfZGYsCiAgICAgICAgICAgICBhZXMoeD1VTUFQXzEseT1VTUFQXzIsY29sb3VyPW0zX3B0KSwgc2l6ZT0xLjgsIGFscGhhPS45KSArCiAgc2NhbGVfY29sb3VyX2dyYWRpZW50bigKICAgIGNvbG91cnM9YygiIzBEMDg4NyIsIiM2QTAwQTgiLCIjQjEyQTkwIiwiI0UxNjQ2MiIsIiNGQ0E2MzYiLCIjRjBGOTIxIiksCiAgICBuYW1lPSJNb25vY2xlM1xucHNldWRvdGltZSIsIGxpbWl0cz1jKDAsMTAwKSkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgbGFicyh4PSJVTUFQLTEiLHk9IlVNQVAtMiIsdGl0bGU9IlPDqXphcnkg4oCUIE1vbm9jbGUzIHByb2plY3RlZCBwc2V1ZG90aW1lIikgKwogIHRoZW1lKHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTMsZmFjZT0iYm9sZCIpKQoKcHJpbnQocF9zZXpfbTNfc3RhdGUgLyBwX3Nlel9tM19wdCkKYGBgCgojIyMgTWV0aG9kIEFncmVlbWVudCAoU8OpemFyeSkKCmBgYHtyIHNlei1tZXRob2QtYWdyZWVtZW50LCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9NX0Kc2V6X2NvciA8LSBjb3Ioc2V6X3Bsb3RfZGYkbXN0X3B0LCBzZXpfcGxvdF9kZiRtM19wdCwKICAgICAgICAgICAgICAgbWV0aG9kPSJzcGVhcm1hbiIsIHVzZT0iY29tcGxldGUub2JzIikKCnBfc2V6X3NjYXR0ZXIgPC0gZ2dwbG90KHNlel9wbG90X2RmLCBhZXMoeD1tc3RfcHQsIHk9bTNfcHQsIGNvbG91cj1wcmVkaWN0ZWRfc3RhdGUpKSArCiAgZ2VvbV9wb2ludChzaXplPTEuMiwgYWxwaGE9LjcpICsKICBnZW9tX2FibGluZShzbG9wZT0xLCBpbnRlcmNlcHQ9MCwgbGluZXR5cGU9ImRhc2hlZCIsIGNvbG91cj0iZ3JleTQwIikgKwogIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iLCBzZT1GQUxTRSwgY29sb3VyPSJibGFjayIsIGxpbmV3aWR0aD0uOCkgKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPVNUQVRFX0NPTE9SUywgbmFtZT0iUHJlZGljdGVkIHN0YXRlIikgKwogIGFubm90YXRlKCJ0ZXh0IiwgeD01LCB5PTkwLCBsYWJlbD1zcHJpbnRmKCJTcGVhcm1hbiDPgSA9ICUuM2YiLCBzZXpfY29yKSwKICAgICAgICAgICBzaXplPTQuNSwgZm9udGZhY2U9ImJvbGQiLCBoanVzdD0wKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICBsYWJzKHg9IkN1c3RvbSBNU1QgcHNldWRvdGltZSIsIHk9Ik1vbm9jbGUzIHBzZXVkb3RpbWUiLAogICAgICAgdGl0bGU9IlPDqXphcnkgY2VsbHM6IHBzZXVkb3RpbWUgbWV0aG9kIGFncmVlbWVudCIpICsKICB0aGVtZShwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEyLGZhY2U9ImJvbGQiKSkKCnBfc2V6X3Zpb2xpbiA8LSBnZ3Bsb3QoCiAgc2V6X3Bsb3RfZGYgJT4lCiAgICBwaXZvdF9sb25nZXIoYyhtc3RfcHQsbTNfcHQpLCBuYW1lc190bz0ibWV0aG9kIiwgdmFsdWVzX3RvPSJwdCIpICU+JQogICAgbXV0YXRlKG1ldGhvZD1yZWNvZGUobWV0aG9kLCBtc3RfcHQ9IkN1c3RvbSBNU1QiLCBtM19wdD0iTW9ub2NsZTMiKSksCiAgYWVzKHg9cHJlZGljdGVkX3N0YXRlLCB5PXB0LCBmaWxsPW1ldGhvZCkKKSArCiAgZ2VvbV92aW9saW4oc2NhbGU9IndpZHRoIiwgdHJpbT1GQUxTRSwgYWxwaGE9LjcsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKC44KSkgKwogIGdlb21fYm94cGxvdCh3aWR0aD0uMDgsIGZpbGw9IndoaXRlIiwgb3V0bGllci5zaXplPS4zLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSguOCkpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9TUVUSE9EX0NPTE9SUywgbmFtZT0iTWV0aG9kIikgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgbGFicyh4PSJQcmVkaWN0ZWQgc3RhdGUiLCB5PSJQc2V1ZG90aW1lICgw4oCTMTAwKSIsCiAgICAgICB0aXRsZT0iU8OpemFyeSBwc2V1ZG90aW1lIHBlciBzdGF0ZTogbWV0aG9kIGNvbXBhcmlzb24iKSArCiAgdGhlbWUocGxvdC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMixmYWNlPSJib2xkIiksCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTMwLGhqdXN0PTEpKQoKcHJpbnQocF9zZXpfc2NhdHRlciB8IHBfc2V6X3Zpb2xpbikKYGBgCgojIyBTdW1tYXJ5IFRhYmxlcwoKYGBge3Igc2V6YXJ5LXN1bW1hcnl9CnNlel9zdW1tYXJ5IDwtIHNlel9wbG90X2RmICU+JQogIGdyb3VwX2J5KHByZWRpY3RlZF9zdGF0ZSkgJT4lCiAgc3VtbWFyaXNlKAogICAgbl9jZWxscyAgICAgICAgID0gbigpLAogICAgcGN0ICAgICAgICAgICAgID0gcm91bmQoMTAwKm4oKS9ucm93KHNlel9wbG90X2RmKSwgMSksCiAgICBtZWFuX3ByZWRfc2NvcmUgPSByb3VuZChtZWFuKHByZWRfc2NvcmUpLCAzKSwKICAgIG1zdF9tZWFuX3B0ICAgICA9IHJvdW5kKG1lYW4obXN0X3B0LCBuYS5ybT1UUlVFKSwgMSksCiAgICBtc3Rfc2RfcHQgICAgICAgPSByb3VuZChzZChtc3RfcHQsICAgbmEucm09VFJVRSksIDEpLAogICAgbTNfbWVhbl9wdCAgICAgID0gcm91bmQobWVhbihtM19wdCwgIG5hLnJtPVRSVUUpLCAxKSwKICAgIG0zX3NkX3B0ICAgICAgICA9IHJvdW5kKHNkKG0zX3B0LCAgICBuYS5ybT1UUlVFKSwgMSksCiAgICAuZ3JvdXBzICAgICAgICAgPSAiZHJvcCIKICApICU+JSBhcnJhbmdlKG1zdF9tZWFuX3B0KQoKa2FibGUoc2V6X3N1bW1hcnksCiAgICAgIGNvbC5uYW1lcyA9IGMoIlN0YXRlIiwiTiIsIiUgb2YgU8OpemFyeSIsIlByZWQuIHNjb3JlIiwKICAgICAgICAgICAgICAgICAgICAiTVNUIG1lYW4gcHQiLCJNU1QgU0QiLCJNMyBtZWFuIHB0IiwiTTMgU0QiKSwKICAgICAgY2FwdGlvbiA9ICJTw6l6YXJ5IGNlbGwgdHJhamVjdG9yeSBzdW1tYXJ5IOKAlCBib3RoIG1ldGhvZHMiKSAlPiUKICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zPWMoInN0cmlwZWQiLCJob3ZlciIpLCBmdWxsX3dpZHRoPUZBTFNFKSAlPiUKICBjb2x1bW5fc3BlYyg1OjYsIGNvbG9yPSJ3aGl0ZSIsIGJhY2tncm91bmQ9TUVUSE9EX0NPTE9SU1siQ3VzdG9tIE1TVCJdKSAlPiUKICBjb2x1bW5fc3BlYyg3OjgsIGNvbG9yPSJ3aGl0ZSIsIGJhY2tncm91bmQ9TUVUSE9EX0NPTE9SU1siTW9ub2NsZTMiXSkKCm1zX2Rpc3QgPC0gc2V6X3Bsb3RfZGYgJT4lCiAgY291bnQobWlsZXN0b25lX3JlZikgJT4lCiAgbGVmdF9qb2luKG1pbGVzdG9uZV9jZW50cm9pZHNbLGMoIm1pbGVzdG9uZSIsInN0YXRlIiwib3JkZXJfcG9zIildLAogICAgICAgICAgICBieT1jKCJtaWxlc3RvbmVfcmVmIj0ibWlsZXN0b25lIikpICU+JQogIG11dGF0ZShwY3Q9cm91bmQoMTAwKm4vc3VtKG4pLDEpLAogICAgICAgICBtaWxlc3RvbmVfcmVmPWZhY3RvcihtaWxlc3RvbmVfcmVmLCBsZXZlbHM9bWlsZXN0b25lX29yZGVyKSkgJT4lCiAgYXJyYW5nZShvcmRlcl9wb3MpCgpwX21zX2JhciA8LSBnZ3Bsb3QobXNfZGlzdCwgYWVzKHg9bWlsZXN0b25lX3JlZiwgeT1wY3QsIGZpbGw9c3RhdGUpKSArCiAgZ2VvbV9jb2wod2lkdGg9LjcpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsPXNwcmludGYoIiUuMGYlJSIscGN0KSksIHZqdXN0PS0uMywgc2l6ZT0zKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPVNUQVRFX0NPTE9SUywgbmFtZT0iU3RhdGUiKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHM9bWlsZXN0b25lX29yZGVyKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICBsYWJzKHg9Ik5lYXJlc3QgcmVmZXJlbmNlIG1pbGVzdG9uZSIsIHk9IiUgU8OpemFyeSBjZWxscyIsCiAgICAgICB0aXRsZT0iU8OpemFyeSBjZWxsIGRpc3RyaWJ1dGlvbiBhY3Jvc3MgcmVmZXJlbmNlIG1pbGVzdG9uZXMiKSArCiAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LGhqdXN0PTEpLAogICAgICAgIHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTIsZmFjZT0iYm9sZCIpKQoKcHJpbnQocF9tc19iYXIpCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIFNhdmUgQWxsIE91dHB1dHMKCmBgYHtyIHNhdmUtYWxsfQoKc2F2ZVJEUyhzZXphcnlfb2JqLCAgICAgICAgICAic2V6YXJ5X3Byb2plY3RlZF9kdWFsLnJkcyIpCnNhdmVSRFMobXN0X2dyYXBoLCAgICAgICAgICAgIm1zdF9ncmFwaC5yZHMiKQpzYXZlUkRTKG1pbGVzdG9uZV9jZW50cm9pZHMsICJtaWxlc3RvbmVfY2VudHJvaWRzLnJkcyIpCgp3cml0ZS5jc3YobWlsZXN0b25lX2NlbnRyb2lkcywgIm1pbGVzdG9uZV9jZW50cm9pZHMuY3N2IiwgICAgICAgICAgcm93Lm5hbWVzPUZBTFNFKQp3cml0ZS5jc3YocGVyX3N0YXRlX2NvciwgICAgICAgIm1ldGhvZF9jb21wYXJpc29uX3Blcl9zdGF0ZS5jc3YiLCAgcm93Lm5hbWVzPUZBTFNFKQp3cml0ZS5jc3Yoc2V6X3N1bW1hcnksICAgICAgICAgInNlemFyeV90cmFqZWN0b3J5X3N1bW1hcnkuY3N2IiwgICAgcm93Lm5hbWVzPUZBTFNFKQp3cml0ZS5jc3Yoc2lnX3RyYWpfZ2VuZXMsICAgICAgIm1vbm9jbGUzX3RyYWplY3RvcnlfZ2VuZXMuY3N2IiwgICAgcm93Lm5hbWVzPUZBTFNFKQp3cml0ZS5jc3YobXNfZGlzdCwgICAgICAgICAgICAgInNlemFyeV9taWxlc3RvbmVfZGlzdHJpYnV0aW9uLmNzdiIscm93Lm5hbWVzPUZBTFNFKQoKZ2dzYXZlKCJmaWdfbWlsZXN0b25lc19saW5lYXIucGRmIiwgIHBfbXN0X2xpbmVhciwgICAgd2lkdGg9MTQsIGhlaWdodD00KQpnZ3NhdmUoImZpZ19tc3RfdW1hcC5wZGYiLCAgICAgICAgICAgcF9tc3RfdW1hcF9tcywgICB3aWR0aD0xMCwgaGVpZ2h0PTgpCmdnc2F2ZSgiZmlnX21zdF9wc2V1ZG90aW1lLnBkZiIsICAgICBwX21zdF9wc2V1ZG8sICAgIHdpZHRoPTEwLCBoZWlnaHQ9OCkKZ2dzYXZlKCJmaWdfbTNfcHNldWRvdGltZS5wZGYiLCAgICAgIHBfbTNfcHNldWRvLCAgICAgd2lkdGg9MTAsIGhlaWdodD04KQpnZ3NhdmUoImZpZ19tZXRob2RfY29tcGFyaXNvbi5wZGYiLCAgcF9zY2F0dGVyLCAgICAgICB3aWR0aD0xMCwgaGVpZ2h0PTYpCmdnc2F2ZSgiZmlnX3NlemFyeV9tc3QucGRmIiwgICAgICAgICBwX3Nlel9tc3Rfc3RhdGUsIHdpZHRoPTEyLCBoZWlnaHQ9OCkKZ2dzYXZlKCJmaWdfc2V6YXJ5X20zLnBkZiIsICAgICAgICAgIHBfc2V6X20zX3N0YXRlLCAgd2lkdGg9MTIsIGhlaWdodD04KQpnZ3NhdmUoImZpZ19kb3RwbG90X21pbGVzdG9uZXMucGRmIiwgcF9kb3RwbG90X21zLCAgICB3aWR0aD05LCAgaGVpZ2h0PTE4KQpnZ3NhdmUoImZpZ19taWxlc3RvbmVfYmFyLnBkZiIsICAgICAgcF9tc19iYXIsICAgICAgICB3aWR0aD0xMiwgaGVpZ2h0PTUpCgpjYXQoIuKckyBBbGwgb3V0cHV0cyBzYXZlZFxuIikKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMgU2Vzc2lvbiBJbmZvcm1hdGlvbgoKYGBge3Igc2Vzc2lvbi1pbmZvfQpzZXNzaW9uSW5mbygpCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIE1ldGFkYXRhIFJlZmVyZW5jZQoKYGBge3IgbWV0YWRhdGEtdGFibGUsIGVjaG89RkFMU0V9Cm1ldGFfdGJsIDwtIGRhdGEuZnJhbWUoCiAgT2JqZWN0ID0gYyhyZXAoImNkNF9yZWYiLDYpLCByZXAoInNlemFyeV9vYmoiLDYpKSwKICBDb2x1bW4gPSBjKAogICAgIm1pbGVzdG9uZSIsIm5lYXJlc3RfbWlsZXN0b25lIiwKICAgICJtc3RfcHNldWRvdGltZSIsIm1zdF9wc2V1ZG90aW1lX25vcm0iLAogICAgIm1vbm9jbGUzX3BzZXVkb3RpbWUiLCJtb25vY2xlM19wc2V1ZG90aW1lX25vcm0iLAogICAgInByZWRpY3RlZC5wcmVkaWN0ZWRfc3RhdGUiLCJwcmVkaWN0ZWQucHJlZGljdGVkX21pbGVzdG9uZSIsCiAgICAibmVhcmVzdF9taWxlc3RvbmVfbXN0IiwKICAgICJtc3RfcHNldWRvdGltZSIsIm1vbm9jbGUzX3BzZXVkb3RpbWUiLAogICAgInByZWRpY3RlZC5wcmVkaWN0ZWRfc3RhdGUuc2NvcmUiCiAgKSwKICBEZXNjcmlwdGlvbiA9IGMoCiAgICAiU3ViLWNsdXN0ZXIgbWlsZXN0b25lIElEIChNMDDigJNNMDcpOiBNMDA9TmFpdmUsIE0wMS1NMDI9VENNLCBNMDMtTTA0PVRFTSwgTTA1PVRlbXJhLCBNMDY9VHJlZyBuYWl2ZSwgTTA3PVRyZWcgdGVybWluYWwiLAogICAgIk5lYXJlc3QgTVNUIG5vZGUgZm9yIGVhY2ggcmVmZXJlbmNlIGNlbGwiLAogICAgIlJhdyBNU1QtcHJvamVjdGVkIHBzZXVkb3RpbWUgKGdyYXBoIGRpc3RhbmNlIGZyb20gQ0Q0IE5haXZlIHJvb3QgTTAwKSIsCiAgICAiTVNUIHBzZXVkb3RpbWUgbm9ybWFsaXNlZCB0byAw4oCTMTAwIiwKICAgICJNb25vY2xlMyBwc2V1ZG90aW1lIChyYXcsIGZyb20gb3JkZXJfY2VsbHMoKSkiLAogICAgIk1vbm9jbGUzIHBzZXVkb3RpbWUgbm9ybWFsaXNlZCB0byAw4oCTMTAwIiwKICAgICJNYXBRdWVyeSBsYWJlbCB0cmFuc2ZlcjogcHJlZGljdGVkLmNlbGx0eXBlLmwyIGxhYmVsIGZyb20gcmVmZXJlbmNlIiwKICAgICJNYXBRdWVyeSBsYWJlbCB0cmFuc2ZlcjogbWlsZXN0b25lIGxhYmVsIGZyb20gcmVmZXJlbmNlIiwKICAgICJOZWFyZXN0IE1TVCBtaWxlc3RvbmUgYWZ0ZXIgZWRnZSBwcm9qZWN0aW9uIiwKICAgICJNU1QgcHNldWRvdGltZSBvbiByZWZlcmVuY2UgMOKAkzEwMCBzY2FsZSAoY2FwcGVkIDDigJMxMDApIiwKICAgICJLTk4td2VpZ2h0ZWQgTW9ub2NsZTMgcHNldWRvdGltZSBmcm9tIDE1IG5lYXJlc3QgcmVmZXJlbmNlIG5laWdoYm91cnMiLAogICAgIk1hcFF1ZXJ5IHByZWRpY3Rpb24gY29uZmlkZW5jZSBzY29yZSAoMOKAkzEpIgogICkKKQprYWJsZShtZXRhX3RibCwgY2FwdGlvbj0iQWxsIG1ldGFkYXRhIGZpZWxkcyBhZGRlZCBieSB0aGlzIHBpcGVsaW5lIikgJT4lCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucz1jKCJzdHJpcGVkIiwiY29uZGVuc2VkIiksIGZ1bGxfd2lkdGg9VFJVRSkgJT4lCiAgcm93X3NwZWMod2hpY2gobWV0YV90YmwkT2JqZWN0PT0iY2Q0X3JlZiIpLCAgICBiYWNrZ3JvdW5kPSIjRUJGNUZCIikgJT4lCiAgcm93X3NwZWMod2hpY2gobWV0YV90YmwkT2JqZWN0PT0ic2V6YXJ5X29iaiIpLCBiYWNrZ3JvdW5kPSIjRkRGRUZFIikKYGBgCg==