Tugas Pertemuan 11
Seven Tools Analysis
1 Several Application : Marketing
2 Cheet Sheet in R
## Tanggal Media Respon
## 1 2025-05-01 Instagram Ads Tertarik, visualnya bagus
## 2 2025-05-02 YouTube Tertarik, visualnya bagus
## 3 2025-05-03 TikTok Tidak relevan dengan kebutuhan saya
## 4 2025-05-04 Facebook Tidak tertarik, terlalu banyak teks
## 5 2025-05-05 Billboard Tidak suka, terlalu sering muncul
## 6 2025-05-06 Instagram Ads Sangat tertarik, akan coba produknya
## 7 2025-05-07 YouTube Biasa saja, kurang meyakinkan
## 8 2025-05-08 Radio Tidak suka, terlalu sering muncul
## 9 2025-05-09 Facebook Bagus, tapi tampilannya terlalu ramai
## 10 2025-05-10 TikTok Tidak relevan dengan kebutuhan saya
## 11 2025-05-11 Instagram Ads Sangat tertarik, akan coba produknya
## 12 2025-05-12 YouTube Tertarik, visualnya bagus
## 13 2025-05-13 Facebook Bagus, tapi tampilannya terlalu ramai
## 14 2025-05-14 Billboard Bagus, tapi tampilannya terlalu ramai
## 15 2025-05-15 Instagram Ads Bagus, tapi tampilannya terlalu ramai
## 16 2025-05-16 YouTube Tertarik, visualnya bagus
## 17 2025-05-17 TikTok Kurang informatif
## 18 2025-05-18 Facebook Tidak relevan dengan kebutuhan saya
## 19 2025-05-19 Instagram Ads Tertarik, karena diskon menarik
## 20 2025-05-20 YouTube Tidak relevan dengan kebutuhan saya
## 21 2025-05-21 Instagram Ads Bagus, tapi tampilannya terlalu ramai
## 22 2025-05-22 Facebook Tertarik, visualnya bagus
## 23 2025-05-23 YouTube Biasa saja, kurang meyakinkan
## 24 2025-05-24 TikTok Tertarik, iklannya menarik dan informatif
## 25 2025-05-25 Instagram Ads Tertarik, karena diskon menarik
## 26 2025-05-26 Radio Sangat tertarik, akan coba produknya
## 27 2025-05-27 Facebook Tidak relevan dengan kebutuhan saya
## 28 2025-05-28 TikTok Tertarik, karena diskon menarik
## 29 2025-05-29 Instagram Ads Bagus, tapi tampilannya terlalu ramai
## 30 2025-05-30 YouTube Bagus, tapi tampilannya terlalu ramai
## 31 2025-05-31 Facebook Tidak relevan dengan kebutuhan saya
## 32 2025-06-01 Instagram Ads Tertarik, karena diskon menarik
## 33 2025-06-02 YouTube Sangat tertarik, akan coba produknya
## 34 2025-06-03 TikTok Tertarik, karena diskon menarik
## 35 2025-06-04 Instagram Ads Sangat tertarik, akan coba produknya
## 36 2025-06-05 Radio Tidak suka, terlalu sering muncul
## 37 2025-06-06 Facebook Bagus, tapi tampilannya terlalu ramai
## 38 2025-06-07 YouTube Tidak tertarik, terlalu banyak teks
## 39 2025-06-08 Instagram Ads Sangat tertarik, akan coba produknya
## 40 2025-06-09 TikTok Kurang informatif
## 41 2025-06-10 YouTube Tidak tertarik, terlalu banyak teks
## 42 2025-06-11 Facebook Tertarik, iklannya menarik dan informatif
## 43 2025-06-12 Instagram Ads Bagus, tapi tampilannya terlalu ramai
## 44 2025-06-13 YouTube Bagus, tapi tampilannya terlalu ramai
## 45 2025-06-14 Facebook Tidak suka, terlalu sering muncul
## 46 2025-06-15 TikTok Sangat tertarik, akan coba produknya
## 47 2025-06-16 Instagram Ads Bagus, tapi tampilannya terlalu ramai
## 48 2025-06-17 YouTube Tidak relevan dengan kebutuhan saya
## 49 2025-06-18 Facebook Biasa saja, kurang meyakinkan
## 50 2025-06-19 Instagram Ads Tidak suka, terlalu sering muncul
## 51 2025-06-20 TikTok Kurang informatif
## 52 2025-06-21 YouTube Tidak suka, terlalu sering muncul
## 53 2025-06-22 Instagram Ads Tidak suka, terlalu sering muncul
## 54 2025-06-23 Facebook Tertarik, karena diskon menarik
## 55 2025-06-24 TikTok Tertarik, iklannya menarik dan informatif
## 56 2025-06-25 YouTube Tidak suka, terlalu sering muncul
## 57 2025-06-26 Instagram Ads Tidak tertarik, terlalu banyak teks
## 58 2025-06-27 Facebook Tertarik, iklannya menarik dan informatif
## 59 2025-06-28 YouTube Tidak tertarik, terlalu banyak teks
## 60 2025-06-29 Instagram Ads Biasa saja, kurang meyakinkan
## 61 2025-06-30 TikTok Sangat tertarik, akan coba produknya
## 62 2025-07-01 Facebook Tidak suka, terlalu sering muncul
## 63 2025-07-02 YouTube Tertarik, visualnya bagus
## 64 2025-07-03 Instagram Ads Bagus, tapi tampilannya terlalu ramai
## 65 2025-07-04 TikTok Biasa saja, kurang meyakinkan
## 66 2025-07-05 Facebook Tidak suka, terlalu sering muncul
## 67 2025-07-06 Instagram Ads Bagus, tapi tampilannya terlalu ramai
## 68 2025-07-07 YouTube Bagus, tapi tampilannya terlalu ramai
## 69 2025-07-08 Facebook Tertarik, karena diskon menarik
## 70 2025-07-09 TikTok Tertarik, visualnya bagus
## 71 2025-07-10 Instagram Ads Kurang informatif
## 72 2025-07-11 YouTube Bagus, tapi tampilannya terlalu ramai
## 73 2025-07-12 TikTok Tertarik, visualnya bagus
## 74 2025-07-13 Instagram Ads Tertarik, karena diskon menarik
## 75 2025-07-14 Facebook Tertarik, visualnya bagus
## 76 2025-07-15 YouTube Tertarik, karena diskon menarik
## 77 2025-07-16 Instagram Ads Tidak suka, terlalu sering muncul
## 78 2025-07-17 Facebook Tidak relevan dengan kebutuhan saya
## 79 2025-07-18 TikTok Sangat tertarik, akan coba produknya
## 80 2025-07-19 YouTube Sangat tertarik, akan coba produknya
## 81 2025-07-20 Instagram Ads Kurang informatif
## 82 2025-07-21 TikTok Tertarik, visualnya bagus
## 83 2025-07-22 Facebook Tidak relevan dengan kebutuhan saya
## 84 2025-07-23 YouTube Tidak tertarik, terlalu banyak teks
## 85 2025-07-24 Instagram Ads Tidak relevan dengan kebutuhan saya
## 86 2025-07-25 TikTok Tidak tertarik, terlalu banyak teks
## 87 2025-07-26 YouTube Tidak relevan dengan kebutuhan saya
## 88 2025-07-27 Facebook Tidak suka, terlalu sering muncul
2.1 Tabulasi Frekuensi
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
2.1.1 Visualisasi Sederhana
## Loading required package: ggplot2
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
## A marker object has been specified, but markers is not in the mode
## Adding markers to the mode...
3 Histogram
# Install and load necessary libraries
library(plotly)
library(dplyr)
# Menghitung frekuensi setiap media yang digunakan
media_freq <- data %>%
group_by(Media) %>%
summarise(Frequency = n())
# Membuat histogram dari frekuensi media yang digunakan
media_plot <- plot_ly(
x = media_freq$Media, # Media
y = media_freq$Frequency, # Frekuensi penggunaan media
type = 'bar', # Jenis plot adalah bar chart
marker = list(color = 'lightblue', line = list(color = 'black', width = 1)),
name = 'Frekuensi Media'
) %>%
layout(
title = 'Frekuensi Penggunaan Media Iklan',
xaxis = list(title = 'Media', showgrid = FALSE),
yaxis = list(title = 'Frekuensi', showgrid = FALSE),
plot_bgcolor = 'white',
paper_bgcolor = 'white',
showlegend = TRUE,
legend = list(
orientation = 'v', # vertical legend
x = 0.98, # almost at the right edge
xanchor = 'right',
y = 0.98, # almost at the top
yanchor = 'top',
bgcolor = 'rgba(255,255,255,0.8)', # semi-transparent background
bordercolor = 'black',
borderwidth = 0.3
)
)
# Menampilkan plot
media_plot4 Pareto Chart
# Load libraries
library(dplyr)
library(plotly)
library(RColorBrewer)
# Ringkas data: jumlah respon per media promosi
pareto_data <- data %>%
count(Media, sort = TRUE) %>%
mutate(
cum_freq = cumsum(n) / sum(n) * 100, # Persentase kumulatif
Media = factor(Media, levels = unique(Media)) # Atur urutan faktor
)
# Buat warna untuk masing-masing media
colors <- RColorBrewer::brewer.pal(n = nrow(pareto_data), name = "Set3")
# Buat grafik Plotly
fig <- plot_ly(data = pareto_data)
# Tambahkan diagram batang
fig <- fig %>% add_bars(
x = ~Media,
y = ~n,
name = 'Jumlah Responden',
marker = list(color = colors),
yaxis = "y1"
)
# Tambahkan garis kumulatif
fig <- fig %>% add_lines(
x = ~Media,
y = ~cum_freq,
name = 'Kumulatif (%)',
yaxis = "y2",
line = list(color = 'red', dash = 'dash')
)
# Tambahkan garis batas 80%
fig <- fig %>% add_lines(
x = ~Media,
y = rep(80, nrow(pareto_data)),
name = 'Batas 80%',
yaxis = "y2",
line = list(color = 'green', dash = 'dot')
)
# Atur tampilan layout
fig <- fig %>% layout(
title = "Pareto Chart - Saluran Promosi Efektif",
xaxis = list(
title = "Media Promosi",
tickangle = -45
),
yaxis = list(title = "Jumlah Responden"),
yaxis2 = list(
title = "Persentase Kumulatif (%)",
overlaying = "y",
side = "right",
range = c(0, 100)
),
legend = list(x = 0.75, y = 0.75)
)
# Tampilkan grafik
fig5 Scatter Diagram
# Install plotly jika belum terpasang
# install.packages("plotly")
# Muat library
library(plotly)
# Data yang kamu berikan
set.seed(123)
data <- data.frame(
Tanggal = seq.Date(from = as.Date("2025-05-01"), by = "day", length.out = 88),
Media = sample(c("Instagram Ads", "YouTube", "TikTok", "Facebook", "Billboard", "Radio"), 88, replace = TRUE),
Respon = sample(c(
"Tertarik, iklannya menarik dan informatif",
"Tidak tertarik, terlalu banyak teks",
"Tertarik, visualnya bagus",
"Biasa saja, kurang meyakinkan",
"Sangat tertarik, akan coba produknya",
"Tidak suka, terlalu sering muncul",
"Tertarik, karena diskon menarik",
"Kurang informatif",
"Bagus, tapi tampilannya terlalu ramai",
"Tidak relevan dengan kebutuhan saya"
), size = 88, replace = TRUE)
)
# Simulasikan Anggaran Iklan (dalam juta) dan Hasil Penjualan (dalam juta)
set.seed(42)
data$Anggaran_Iklan <- round(runif(88, 10, 100), 1)
data$Hasil_Penjualan <- data$Anggaran_Iklan * runif(88, 0.8, 1.2) + rnorm(88, 0, 5)
# Hitung korelasi
correlation_value <- cor(data$Anggaran_Iklan, data$Hasil_Penjualan)
# Scatter plot dengan plotly
fig <- plot_ly(data,
x = ~Anggaran_Iklan,
y = ~Hasil_Penjualan,
type = 'scatter',
mode = 'markers',
marker = list(color = 'blue', size = 10),
text = ~paste("Media:", Media, "<br>Respon:", Respon),
hoverinfo = "text+x+y") %>%
add_lines(x = data$Anggaran_Iklan,
y = predict(lm(Hasil_Penjualan ~ Anggaran_Iklan, data = data)),
line = list(color = 'red', dash = 'solid', width = 2)) %>%
layout(title = paste("Scatter Plot: Hubungan Anggaran Iklan dan Hasil Penjualan\nKorelasi: ", round(correlation_value, 2)),
xaxis = list(title = "Anggaran Iklan (juta)"),
yaxis = list(title = "Hasil Penjualan (juta)"))
# Tampilkan plot
fig## A marker object has been specified, but markers is not in the mode
## Adding markers to the mode...
6 Control Chart
# Load libraries
library(plotly)
library(dplyr)
# Hitung jumlah keterlibatan per tanggal
engagement_data <- data %>%
group_by(Tanggal) %>%
summarise(Jumlah_Respon = n())
# Hitung nilai Control Limit
CL <- mean(engagement_data$Jumlah_Respon)
UCL <- CL + 3 * sd(engagement_data$Jumlah_Respon)
LCL <- CL - 3 * sd(engagement_data$Jumlah_Respon)
# Tandai outlier
engagement_data <- engagement_data %>%
mutate(Outlier = ifelse(Jumlah_Respon > UCL | Jumlah_Respon < LCL, "Ya", "Tidak"))
# Buat Control Chart
plot_ly(engagement_data,
x = ~Tanggal,
y = ~Jumlah_Respon,
type = 'scatter',
mode = 'lines+markers',
line = list(color = 'blue'),
marker = list(size = 8, color = ifelse(engagement_data$Outlier == "Ya", "red", "blue")),
hoverinfo = 'text',
text = ~paste("Tanggal:", Tanggal, "<br>Jumlah Respon:", Jumlah_Respon)) %>%
add_lines(y = rep(CL, nrow(engagement_data)), name = "CL", line = list(color = 'green', dash = 'dot')) %>%
add_lines(y = rep(UCL, nrow(engagement_data)), name = "UCL", line = list(color = 'red', dash = 'dot')) %>%
add_lines(y = rep(LCL, nrow(engagement_data)), name = "LCL", line = list(color = 'red', dash = 'dot')) %>%
layout(title = "Control Chart – Fluktuasi Keterlibatan Media Sosial",
xaxis = list(title = "Tanggal"),
yaxis = list(title = "Jumlah Respon"),
legend = list(orientation = 'h', x = 0.3, y = -0.2))## A marker object has been specified, but markers is not in the mode
## Adding markers to the mode...
## A marker object has been specified, but markers is not in the mode
## Adding markers to the mode...
## A marker object has been specified, but markers is not in the mode
## Adding markers to the mode...
7 Fishbone
# Pastikan semua package terinstal
if (!requireNamespace("DiagrammeR", quietly = TRUE)) install.packages("DiagrammeR")
if (!requireNamespace("DiagrammeRsvg", quietly = TRUE)) install.packages("DiagrammeRsvg")
if (!requireNamespace("rsvg", quietly = TRUE)) install.packages("rsvg")
library(DiagrammeR)## Warning: package 'DiagrammeR' was built under R version 4.4.3
## Warning: package 'DiagrammeRsvg' was built under R version 4.4.3
## Warning: package 'rsvg' was built under R version 4.4.3
## Linking to librsvg 2.57.0
# Buat diagram fishbone
graph <- grViz("
digraph fishbone {
graph [layout = dot, rankdir = LR]
node [fontname=Helvetica, fontsize=25, style=filled]
Problem [label='Kampanye Gagal\\nMeningkatkan Penjualan', shape=ellipse, fillcolor=lightcoral, width=5.0, height=1.2]
node [shape=diamond, width=2.5, height=1.0, fillcolor='#FFD700']
A1 [label='Media']
A2 [label='Konten']
A3 [label='Targeting']
A4 [label='Frekuensi']
A5 [label='Anggaran']
A6 [label='Waktu']
node [shape=ellipse, width=2.5, height=0.6, fillcolor='#90EE90']
A1a [label='Media kurang sesuai']
A1b [label='Terlalu banyak platform']
A2a [label='Konten tidak menarik']
A2b [label='Terlalu banyak teks']
A3a [label='Tidak sesuai segmentasi']
A3b [label='Iklan tidak relevan']
A4a [label='Frekuensi terlalu tinggi']
A4b [label='Frekuensi terlalu rendah']
A5a [label='Anggaran terlalu kecil']
A5b [label='Distribusi tidak optimal']
A6a [label='Waktu kampanye kurang tepat']
A6b [label='Terlambat merespon tren']
A1 -> Problem
A2 -> Problem
A3 -> Problem
A4 -> Problem
A5 -> Problem
A6 -> Problem
A1a -> A1
A1b -> A1
A2a -> A2
A2b -> A2
A3a -> A3
A3b -> A3
A4a -> A4
A4b -> A4
A5a -> A5
A5b -> A5
A6a -> A6
A6b -> A6
}
")
# Simpan hasil sebagai gambar
dir.create("images/bab8", recursive = TRUE, showWarnings = FALSE)
svg_code <- DiagrammeRsvg::export_svg(graph)
rsvg_png(charToRaw(svg_code), file = "images/bab8/fishbone_campaign_fail.png", width = 1200, height = 800)
rsvg_pdf(charToRaw(svg_code), file = "images/bab8/fishbone_campaign_fail.pdf")
# Tampilkan gambar dalam dokumen
knitr::include_graphics("images/bab8/fishbone_campaign_fail.png")8 Flowchart
# Pastikan paket DiagrammeR sudah terpasang
# install.packages("DiagrammeR")
library(DiagrammeR)
grViz("
digraph kampanye {
graph [rankdir = TB, layout = dot]
node [shape = box, style=filled, fillcolor=lightblue]
A [label = 'Riset Pasar & Audiens']
B [label = 'Susun Strategi Iklan']
C [label = 'Luncurkan Iklan']
D [label = 'Monitor Respons & Engagement']
E [label = 'Tindak Lanjut ke Calon Pelanggan']
F [label = 'Kumpulkan Data & Feedback']
G [label = 'Evaluasi Hasil Kampanye']
node [shape = diamond, style=filled, fillcolor=lemonchiffon]
H [label = 'Apakah Target Tercapai?']
node [shape = ellipse, style=filled, fillcolor=pink]
I [label = 'No']
node [shape = box, style=filled, fillcolor=lightgray]
J [label = 'Perbaiki Strategi']
node [shape = box, style=filled, fillcolor=lightgreen]
K [label = 'Kampanye Sukses']
node [shape = circle, style=filled, fillcolor=cyan]
Start [label = 'Start']
Start -> A -> B -> C -> D -> E -> F -> G -> H
H -> K [label='Yes']
H -> I
I -> J -> B
}
")```
LS0tDQp0aXRsZTogIlR1Z2FzIFBlcnRlbXVhbiAxMSINCnN1YnRpdGxlOiAiU2V2ZW4gVG9vbHMgQW5hbHlzaXMiDQphdXRob3I6IA0KICAtICJEd2kgU3JpIFlhbnRpIE1hbnVsbGFuZyINCiAgLSAiTmFiaWxhIEFuZ2dpdGEgUHV0cmkiDQpkYXRlOiAgImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJUIgJWQsICVZJylgIg0Kb3V0cHV0Og0KICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjogICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9qdWJhL3JtZGZvcm1hdHMNCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQ0KICAgIHRodW1ibmFpbHM6IHRydWUNCiAgICBsaWdodGJveDogdHJ1ZQ0KICAgIGdhbGxlcnk6IHRydWUNCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgICBsaWJfZGlyOiBsaWJzDQogICAgZGZfcHJpbnQ6ICJwYWdlZCINCiAgICBjb2RlX2ZvbGRpbmc6ICJzaG93Ig0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIGNzczogIkM6L1VzZXJzL0R3aSBNYW51bGxhbmcvRG93bmxvYWRzL3N0eWxlLmNzcyINCi0tLQ0KDQo8aW1nIGlkPSJsb2dvLXV0YW1hIiBzcmM9IkM6L1VzZXJzL0R3aSBNYW51bGxhbmcvUGljdHVyZXMvRk9UTy5qcGciIGFsdD0iTG9nbyIgc3R5bGU9IndpZHRoOjUwMHB4OyBkaXNwbGF5OiBibG9jazsgbWFyZ2luOiBhdXRvOyI+DQoNCg0KIyBTZXZlcmFsIEFwcGxpY2F0aW9uIDogTWFya2V0aW5nDQojIENoZWV0IFNoZWV0IGluIFINCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBUYW5nZ2FsID0gYXMuRGF0ZShjKA0KICAgICIyMDI1LTA1LTAxIiwgIjIwMjUtMDUtMDIiLCAiMjAyNS0wNS0wMyIsICIyMDI1LTA1LTA0IiwgIjIwMjUtMDUtMDUiLA0KICAgICIyMDI1LTA1LTA2IiwgIjIwMjUtMDUtMDciLCAiMjAyNS0wNS0wOCIsICIyMDI1LTA1LTA5IiwgIjIwMjUtMDUtMTAiLA0KICAgICIyMDI1LTA1LTExIiwgIjIwMjUtMDUtMTIiLCAiMjAyNS0wNS0xMyIsICIyMDI1LTA1LTE0IiwgIjIwMjUtMDUtMTUiLA0KICAgICIyMDI1LTA1LTE2IiwgIjIwMjUtMDUtMTciLCAiMjAyNS0wNS0xOCIsICIyMDI1LTA1LTE5IiwgIjIwMjUtMDUtMjAiLA0KICAgICIyMDI1LTA1LTIxIiwgIjIwMjUtMDUtMjIiLCAiMjAyNS0wNS0yMyIsICIyMDI1LTA1LTI0IiwgIjIwMjUtMDUtMjUiLA0KICAgICIyMDI1LTA1LTI2IiwgIjIwMjUtMDUtMjciLCAiMjAyNS0wNS0yOCIsICIyMDI1LTA1LTI5IiwgIjIwMjUtMDUtMzAiLA0KICAgICIyMDI1LTA1LTMxIiwgIjIwMjUtMDYtMDEiLCAiMjAyNS0wNi0wMiIsICIyMDI1LTA2LTAzIiwgIjIwMjUtMDYtMDQiLA0KICAgICIyMDI1LTA2LTA1IiwgIjIwMjUtMDYtMDYiLCAiMjAyNS0wNi0wNyIsICIyMDI1LTA2LTA4IiwgIjIwMjUtMDYtMDkiLA0KICAgICIyMDI1LTA2LTEwIiwgIjIwMjUtMDYtMTEiLCAiMjAyNS0wNi0xMiIsICIyMDI1LTA2LTEzIiwgIjIwMjUtMDYtMTQiLA0KICAgICIyMDI1LTA2LTE1IiwgIjIwMjUtMDYtMTYiLCAiMjAyNS0wNi0xNyIsICIyMDI1LTA2LTE4IiwgIjIwMjUtMDYtMTkiLA0KICAgICIyMDI1LTA2LTIwIiwgIjIwMjUtMDYtMjEiLCAiMjAyNS0wNi0yMiIsICIyMDI1LTA2LTIzIiwgIjIwMjUtMDYtMjQiLA0KICAgICIyMDI1LTA2LTI1IiwgIjIwMjUtMDYtMjYiLCAiMjAyNS0wNi0yNyIsICIyMDI1LTA2LTI4IiwgIjIwMjUtMDYtMjkiLA0KICAgICIyMDI1LTA2LTMwIiwgIjIwMjUtMDctMDEiLCAiMjAyNS0wNy0wMiIsICIyMDI1LTA3LTAzIiwgIjIwMjUtMDctMDQiLA0KICAgICIyMDI1LTA3LTA1IiwgIjIwMjUtMDctMDYiLCAiMjAyNS0wNy0wNyIsICIyMDI1LTA3LTA4IiwgIjIwMjUtMDctMDkiLA0KICAgICIyMDI1LTA3LTEwIiwgIjIwMjUtMDctMTEiLCAiMjAyNS0wNy0xMiIsICIyMDI1LTA3LTEzIiwgIjIwMjUtMDctMTQiLA0KICAgICIyMDI1LTA3LTE1IiwgIjIwMjUtMDctMTYiLCAiMjAyNS0wNy0xNyIsICIyMDI1LTA3LTE4IiwgIjIwMjUtMDctMTkiLA0KICAgICIyMDI1LTA3LTIwIiwgIjIwMjUtMDctMjEiLCAiMjAyNS0wNy0yMiIsICIyMDI1LTA3LTIzIiwgIjIwMjUtMDctMjQiLA0KICAgICIyMDI1LTA3LTI1IiwgIjIwMjUtMDctMjYiLCAiMjAyNS0wNy0yNyINCiAgKSksDQogIE1lZGlhID0gYygNCiAgICAiSW5zdGFncmFtIEFkcyIsICJZb3VUdWJlIiwgIlRpa1RvayIsICJGYWNlYm9vayIsICJCaWxsYm9hcmQiLA0KICAgICJJbnN0YWdyYW0gQWRzIiwgIllvdVR1YmUiLCAiUmFkaW8iLCAiRmFjZWJvb2siLCAiVGlrVG9rIiwNCiAgICAiSW5zdGFncmFtIEFkcyIsICJZb3VUdWJlIiwgIkZhY2Vib29rIiwgIkJpbGxib2FyZCIsICJJbnN0YWdyYW0gQWRzIiwNCiAgICAiWW91VHViZSIsICJUaWtUb2siLCAiRmFjZWJvb2siLCAiSW5zdGFncmFtIEFkcyIsICJZb3VUdWJlIiwNCiAgICAiSW5zdGFncmFtIEFkcyIsICJGYWNlYm9vayIsICJZb3VUdWJlIiwgIlRpa1RvayIsICJJbnN0YWdyYW0gQWRzIiwNCiAgICAiUmFkaW8iLCAiRmFjZWJvb2siLCAiVGlrVG9rIiwgIkluc3RhZ3JhbSBBZHMiLCAiWW91VHViZSIsDQogICAgIkZhY2Vib29rIiwgIkluc3RhZ3JhbSBBZHMiLCAiWW91VHViZSIsICJUaWtUb2siLCAiSW5zdGFncmFtIEFkcyIsDQogICAgIlJhZGlvIiwgIkZhY2Vib29rIiwgIllvdVR1YmUiLCAiSW5zdGFncmFtIEFkcyIsICJUaWtUb2siLA0KICAgICJZb3VUdWJlIiwgIkZhY2Vib29rIiwgIkluc3RhZ3JhbSBBZHMiLCAiWW91VHViZSIsICJGYWNlYm9vayIsDQogICAgIlRpa1RvayIsICJJbnN0YWdyYW0gQWRzIiwgIllvdVR1YmUiLCAiRmFjZWJvb2siLCAiSW5zdGFncmFtIEFkcyIsDQogICAgIlRpa1RvayIsICJZb3VUdWJlIiwgIkluc3RhZ3JhbSBBZHMiLCAiRmFjZWJvb2siLCAiVGlrVG9rIiwNCiAgICAiWW91VHViZSIsICJJbnN0YWdyYW0gQWRzIiwgIkZhY2Vib29rIiwgIllvdVR1YmUiLCAiSW5zdGFncmFtIEFkcyIsDQogICAgIlRpa1RvayIsICJGYWNlYm9vayIsICJZb3VUdWJlIiwgIkluc3RhZ3JhbSBBZHMiLCAiVGlrVG9rIiwNCiAgICAiRmFjZWJvb2siLCAiSW5zdGFncmFtIEFkcyIsICJZb3VUdWJlIiwgIkZhY2Vib29rIiwgIlRpa1RvayIsDQogICAgIkluc3RhZ3JhbSBBZHMiLCAiWW91VHViZSIsICJUaWtUb2siLCAiSW5zdGFncmFtIEFkcyIsICJGYWNlYm9vayIsDQogICAgIllvdVR1YmUiLCAiSW5zdGFncmFtIEFkcyIsICJGYWNlYm9vayIsICJUaWtUb2siLCAiWW91VHViZSIsDQogICAgIkluc3RhZ3JhbSBBZHMiLCAiVGlrVG9rIiwgIkZhY2Vib29rIiwgIllvdVR1YmUiLCAiSW5zdGFncmFtIEFkcyIsDQogICAgIlRpa1RvayIsICJZb3VUdWJlIiwgIkZhY2Vib29rIg0KICApLA0KICBSZXNwb24gPSByZXAoIlRlcnRhcmlrLCBpa2xhbm55YSBtZW5hcmlrIGRhbiBpbmZvcm1hdGlmIiwgODgpDQopDQoNCiMgVmFyaWFzaSByZXNwb24NCnNldC5zZWVkKDEyMykgICMgU3VwYXlhIGhhc2lsIGFjYWsgdGV0YXAga29uc2lzdGVuDQpyZXNwb25fdmFyaWFzaSA8LSBjKA0KICAiVGVydGFyaWssIGlrbGFubnlhIG1lbmFyaWsgZGFuIGluZm9ybWF0aWYiLA0KICAiVGlkYWsgdGVydGFyaWssIHRlcmxhbHUgYmFueWFrIHRla3MiLA0KICAiVGVydGFyaWssIHZpc3VhbG55YSBiYWd1cyIsDQogICJCaWFzYSBzYWphLCBrdXJhbmcgbWV5YWtpbmthbiIsDQogICJTYW5nYXQgdGVydGFyaWssIGFrYW4gY29iYSBwcm9kdWtueWEiLA0KICAiVGlkYWsgc3VrYSwgdGVybGFsdSBzZXJpbmcgbXVuY3VsIiwNCiAgIlRlcnRhcmlrLCBrYXJlbmEgZGlza29uIG1lbmFyaWsiLA0KICAiS3VyYW5nIGluZm9ybWF0aWYiLA0KICAiQmFndXMsIHRhcGkgdGFtcGlsYW5ueWEgdGVybGFsdSByYW1haSIsDQogICJUaWRhayByZWxldmFuIGRlbmdhbiBrZWJ1dHVoYW4gc2F5YSINCikNCg0KIyBVcGRhdGUga29sb20gUmVzcG9uIGRlbmdhbiBwaWxpaGFuIGFjYWsNCmRhdGEkUmVzcG9uIDwtIHNhbXBsZShyZXNwb25fdmFyaWFzaSwgc2l6ZSA9IG5yb3coZGF0YSksIHJlcGxhY2UgPSBUUlVFKQ0KDQojIENldGFrIGRhdGENCnByaW50KGRhdGEpDQoNCmBgYA0KDQoNCiMjIFRhYnVsYXNpIEZyZWt1ZW5zaQ0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShEVCkNCg0KIyBIaXR1bmcgZnJla3VlbnNpIHRpYXAgcmVzcG9uDQpyZXNwb25fc3VtbWFyeSA8LSBkYXRhICU+JQ0KICBjb3VudChSZXNwb24sIHNvcnQgPSBUUlVFKSAlPiUNCiAgcmVuYW1lKEZyZXF1ZW5jeSA9IG4pDQoNCiMgVGFtcGlsa2FuIHRhYmVsIHN1bW1hcnkNCmRhdGF0YWJsZSgNCiAgcmVzcG9uX3N1bW1hcnksDQogIG9wdGlvbnMgPSBsaXN0KA0KICAgIHNjcm9sbENvbGxhcHNlID0gVFJVRSwNCiAgICBzZWFyY2hpbmcgPSBGQUxTRSwgICAjIEhhcHVzIGtvdGFrIHBlbmNhcmlhbg0KICAgIHBhZ2luZyA9IEZBTFNFICAgICAgICMgSGFwdXMgcGFnaW5hc2kNCiAgKSwNCiAgcm93bmFtZXMgPSBGQUxTRSwNCiAgY2FwdGlvbiA9IGh0bWx0b29sczo6dGFncyRjYXB0aW9uKA0KICAgIHN0eWxlID0gJ2NhcHRpb24tc2lkZTogdG9wOyB0ZXh0LWFsaWduOiBsZWZ0OyANCiAgICAgICAgICAgICBmb250LXNpemU6IDE4cHg7IGZvbnQtd2VpZ2h0OiBib2xkOycsDQogICAgJ1N1bW1hcnkgb2YgQ3VzdG9tZXIgUmVzcG9uc2VzIHRvIEFkIENhbXBhaWducycNCiAgKSwNCiAgY2xhc3MgPSAnc3RyaXBlIGhvdmVyIGNvbXBhY3QnDQopDQoNCmBgYA0KDQojIyMgVmlzdWFsaXNhc2kgU2VkZXJoYW5hDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShwbG90bHkpDQoNCiMgSW50ZXJhY3RpdmUgYmFyIGNoYXJ0IHdpdGggbGFiZWxzIG9uIGJhcnMNCnBsb3RfbHkocmVzcG9uX3N1bW1hcnksDQogICAgICAgIHggPSB+RnJlcXVlbmN5LA0KICAgICAgICB5ID0gfnJlb3JkZXIoUmVzcG9uLCBGcmVxdWVuY3kpLA0KICAgICAgICB0eXBlID0gJ2JhcicsDQogICAgICAgIG9yaWVudGF0aW9uID0gJ2gnLA0KICAgICAgICBtYXJrZXIgPSBsaXN0KA0KICAgICAgICAgIGNvbG9yID0gfkZyZXF1ZW5jeSwNCiAgICAgICAgICBjb2xvcnNjYWxlID0gJ0JsdWVyZWQnLCAgIyBCaXNhIGNvYmEgd2FybmEgbGFpbg0KICAgICAgICAgIHNob3dzY2FsZSA9IFRSVUUNCiAgICAgICAgKQ0KKSAlPiUgDQogIGxheW91dCgNCiAgICB0aXRsZSA9IGxpc3QodGV4dCA9ICJTdW1tYXJ5IG9mIEN1c3RvbWVyIFJlc3BvbnNlcyB0byBBZCBDYW1wYWlnbnMiLCBmb250ID0gbGlzdChzaXplID0gMTgpKSwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiRnJlcXVlbmN5IiksDQogICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIlJlc3BvbnNlIiksDQogICAgbWFyZ2luID0gbGlzdChsID0gMTIwKSwNCiAgICBzaG93bGVnZW5kID0gRkFMU0UNCiAgKSAlPiUNCiAgYWRkX3RleHQoDQogICAgdGV4dCA9IH5GcmVxdWVuY3ksICAjIE1lbmFtYmFoa2FuIGxhYmVsIGZyZWt1ZW5zaSBwYWRhIHNldGlhcCBiYXINCiAgICB0ZXh0cG9zaXRpb24gPSAnYXV0bycsDQogICAgZm9udCA9IGxpc3Qoc2l6ZSA9IDEyLCBjb2xvciA9ICdibGFjaycpDQogICkNCg0KDQpgYGANCg0KDQojIEhpc3RvZ3JhbQ0KDQpgYGB7ciwgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPVRSVUUsIGVjaG89VFJVRX0NCiMgSW5zdGFsbCBhbmQgbG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoZHBseXIpDQoNCiMgTWVuZ2hpdHVuZyBmcmVrdWVuc2kgc2V0aWFwIG1lZGlhIHlhbmcgZGlndW5ha2FuDQptZWRpYV9mcmVxIDwtIGRhdGEgJT4lDQogIGdyb3VwX2J5KE1lZGlhKSAlPiUNCiAgc3VtbWFyaXNlKEZyZXF1ZW5jeSA9IG4oKSkNCg0KIyBNZW1idWF0IGhpc3RvZ3JhbSBkYXJpIGZyZWt1ZW5zaSBtZWRpYSB5YW5nIGRpZ3VuYWthbg0KbWVkaWFfcGxvdCA8LSBwbG90X2x5KA0KICB4ID0gbWVkaWFfZnJlcSRNZWRpYSwgICMgTWVkaWENCiAgeSA9IG1lZGlhX2ZyZXEkRnJlcXVlbmN5LCAgIyBGcmVrdWVuc2kgcGVuZ2d1bmFhbiBtZWRpYQ0KICB0eXBlID0gJ2JhcicsICAjIEplbmlzIHBsb3QgYWRhbGFoIGJhciBjaGFydA0KICBtYXJrZXIgPSBsaXN0KGNvbG9yID0gJ2xpZ2h0Ymx1ZScsIGxpbmUgPSBsaXN0KGNvbG9yID0gJ2JsYWNrJywgd2lkdGggPSAxKSksDQogIG5hbWUgPSAnRnJla3VlbnNpIE1lZGlhJw0KKSAlPiUNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gJ0ZyZWt1ZW5zaSBQZW5nZ3VuYWFuIE1lZGlhIElrbGFuJywNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAnTWVkaWEnLCBzaG93Z3JpZCA9IEZBTFNFKSwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAnRnJla3VlbnNpJywgc2hvd2dyaWQgPSBGQUxTRSksDQogICAgcGxvdF9iZ2NvbG9yID0gJ3doaXRlJywNCiAgICBwYXBlcl9iZ2NvbG9yID0gJ3doaXRlJywNCiAgICBzaG93bGVnZW5kID0gVFJVRSwNCiAgICBsZWdlbmQgPSBsaXN0KA0KICAgICAgb3JpZW50YXRpb24gPSAndicsICAgICMgdmVydGljYWwgbGVnZW5kDQogICAgICB4ID0gMC45OCwgICAgICAgICAgICAgIyBhbG1vc3QgYXQgdGhlIHJpZ2h0IGVkZ2UNCiAgICAgIHhhbmNob3IgPSAncmlnaHQnLA0KICAgICAgeSA9IDAuOTgsICAgICAgICAgICAgICMgYWxtb3N0IGF0IHRoZSB0b3ANCiAgICAgIHlhbmNob3IgPSAndG9wJywNCiAgICAgIGJnY29sb3IgPSAncmdiYSgyNTUsMjU1LDI1NSwwLjgpJywgICMgc2VtaS10cmFuc3BhcmVudCBiYWNrZ3JvdW5kDQogICAgICBib3JkZXJjb2xvciA9ICdibGFjaycsDQogICAgICBib3JkZXJ3aWR0aCA9IDAuMw0KICAgICkNCiAgKQ0KDQojIE1lbmFtcGlsa2FuIHBsb3QNCm1lZGlhX3Bsb3QNCg0KDQpgYGANCg0KDQojIFBhcmV0byBDaGFydA0KDQpgYGB7ciwgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPVRSVUUsIGVjaG89VFJVRX0NCg0KIyBMb2FkIGxpYnJhcmllcw0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQoNCiMgUmluZ2thcyBkYXRhOiBqdW1sYWggcmVzcG9uIHBlciBtZWRpYSBwcm9tb3NpDQpwYXJldG9fZGF0YSA8LSBkYXRhICU+JQ0KICBjb3VudChNZWRpYSwgc29ydCA9IFRSVUUpICU+JQ0KICBtdXRhdGUoDQogICAgY3VtX2ZyZXEgPSBjdW1zdW0obikgLyBzdW0obikgKiAxMDAsICAjIFBlcnNlbnRhc2Uga3VtdWxhdGlmDQogICAgTWVkaWEgPSBmYWN0b3IoTWVkaWEsIGxldmVscyA9IHVuaXF1ZShNZWRpYSkpICAjIEF0dXIgdXJ1dGFuIGZha3Rvcg0KICApDQoNCiMgQnVhdCB3YXJuYSB1bnR1ayBtYXNpbmctbWFzaW5nIG1lZGlhDQpjb2xvcnMgPC0gUkNvbG9yQnJld2VyOjpicmV3ZXIucGFsKG4gPSBucm93KHBhcmV0b19kYXRhKSwgbmFtZSA9ICJTZXQzIikNCg0KIyBCdWF0IGdyYWZpayBQbG90bHkNCmZpZyA8LSBwbG90X2x5KGRhdGEgPSBwYXJldG9fZGF0YSkNCg0KIyBUYW1iYWhrYW4gZGlhZ3JhbSBiYXRhbmcNCmZpZyA8LSBmaWcgJT4lIGFkZF9iYXJzKA0KICB4ID0gfk1lZGlhLA0KICB5ID0gfm4sDQogIG5hbWUgPSAnSnVtbGFoIFJlc3BvbmRlbicsDQogIG1hcmtlciA9IGxpc3QoY29sb3IgPSBjb2xvcnMpLA0KICB5YXhpcyA9ICJ5MSINCikNCg0KIyBUYW1iYWhrYW4gZ2FyaXMga3VtdWxhdGlmDQpmaWcgPC0gZmlnICU+JSBhZGRfbGluZXMoDQogIHggPSB+TWVkaWEsDQogIHkgPSB+Y3VtX2ZyZXEsDQogIG5hbWUgPSAnS3VtdWxhdGlmICglKScsDQogIHlheGlzID0gInkyIiwNCiAgbGluZSA9IGxpc3QoY29sb3IgPSAncmVkJywgZGFzaCA9ICdkYXNoJykNCikNCg0KIyBUYW1iYWhrYW4gZ2FyaXMgYmF0YXMgODAlDQpmaWcgPC0gZmlnICU+JSBhZGRfbGluZXMoDQogIHggPSB+TWVkaWEsDQogIHkgPSByZXAoODAsIG5yb3cocGFyZXRvX2RhdGEpKSwNCiAgbmFtZSA9ICdCYXRhcyA4MCUnLA0KICB5YXhpcyA9ICJ5MiIsDQogIGxpbmUgPSBsaXN0KGNvbG9yID0gJ2dyZWVuJywgZGFzaCA9ICdkb3QnKQ0KKQ0KDQojIEF0dXIgdGFtcGlsYW4gbGF5b3V0DQpmaWcgPC0gZmlnICU+JSBsYXlvdXQoDQogIHRpdGxlID0gIlBhcmV0byBDaGFydCAtIFNhbHVyYW4gUHJvbW9zaSBFZmVrdGlmIiwNCiAgeGF4aXMgPSBsaXN0KA0KICAgIHRpdGxlID0gIk1lZGlhIFByb21vc2kiLA0KICAgIHRpY2thbmdsZSA9IC00NQ0KICApLA0KICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiSnVtbGFoIFJlc3BvbmRlbiIpLA0KICB5YXhpczIgPSBsaXN0KA0KICAgIHRpdGxlID0gIlBlcnNlbnRhc2UgS3VtdWxhdGlmICglKSIsDQogICAgb3ZlcmxheWluZyA9ICJ5IiwNCiAgICBzaWRlID0gInJpZ2h0IiwNCiAgICByYW5nZSA9IGMoMCwgMTAwKQ0KICApLA0KICBsZWdlbmQgPSBsaXN0KHggPSAwLjc1LCB5ID0gMC43NSkNCikNCg0KIyBUYW1waWxrYW4gZ3JhZmlrDQpmaWcNCg0KDQpgYGANCg0KIyBTY2F0dGVyIERpYWdyYW0NCg0KYGBge3IsIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1UUlVFLCBlY2hvPVRSVUV9DQoNCiMgSW5zdGFsbCBwbG90bHkgamlrYSBiZWx1bSB0ZXJwYXNhbmcNCiMgaW5zdGFsbC5wYWNrYWdlcygicGxvdGx5IikNCg0KIyBNdWF0IGxpYnJhcnkNCmxpYnJhcnkocGxvdGx5KQ0KDQojIERhdGEgeWFuZyBrYW11IGJlcmlrYW4NCnNldC5zZWVkKDEyMykNCmRhdGEgPC0gZGF0YS5mcmFtZSgNCiAgVGFuZ2dhbCA9IHNlcS5EYXRlKGZyb20gPSBhcy5EYXRlKCIyMDI1LTA1LTAxIiksIGJ5ID0gImRheSIsIGxlbmd0aC5vdXQgPSA4OCksDQogIE1lZGlhID0gc2FtcGxlKGMoIkluc3RhZ3JhbSBBZHMiLCAiWW91VHViZSIsICJUaWtUb2siLCAiRmFjZWJvb2siLCAiQmlsbGJvYXJkIiwgIlJhZGlvIiksIDg4LCByZXBsYWNlID0gVFJVRSksDQogIFJlc3BvbiA9IHNhbXBsZShjKA0KICAgICJUZXJ0YXJpaywgaWtsYW5ueWEgbWVuYXJpayBkYW4gaW5mb3JtYXRpZiIsDQogICAgIlRpZGFrIHRlcnRhcmlrLCB0ZXJsYWx1IGJhbnlhayB0ZWtzIiwNCiAgICAiVGVydGFyaWssIHZpc3VhbG55YSBiYWd1cyIsDQogICAgIkJpYXNhIHNhamEsIGt1cmFuZyBtZXlha2lua2FuIiwNCiAgICAiU2FuZ2F0IHRlcnRhcmlrLCBha2FuIGNvYmEgcHJvZHVrbnlhIiwNCiAgICAiVGlkYWsgc3VrYSwgdGVybGFsdSBzZXJpbmcgbXVuY3VsIiwNCiAgICAiVGVydGFyaWssIGthcmVuYSBkaXNrb24gbWVuYXJpayIsDQogICAgIkt1cmFuZyBpbmZvcm1hdGlmIiwNCiAgICAiQmFndXMsIHRhcGkgdGFtcGlsYW5ueWEgdGVybGFsdSByYW1haSIsDQogICAgIlRpZGFrIHJlbGV2YW4gZGVuZ2FuIGtlYnV0dWhhbiBzYXlhIg0KICApLCBzaXplID0gODgsIHJlcGxhY2UgPSBUUlVFKQ0KKQ0KDQojIFNpbXVsYXNpa2FuIEFuZ2dhcmFuIElrbGFuIChkYWxhbSBqdXRhKSBkYW4gSGFzaWwgUGVuanVhbGFuIChkYWxhbSBqdXRhKQ0Kc2V0LnNlZWQoNDIpDQpkYXRhJEFuZ2dhcmFuX0lrbGFuIDwtIHJvdW5kKHJ1bmlmKDg4LCAxMCwgMTAwKSwgMSkNCmRhdGEkSGFzaWxfUGVuanVhbGFuIDwtIGRhdGEkQW5nZ2FyYW5fSWtsYW4gKiBydW5pZig4OCwgMC44LCAxLjIpICsgcm5vcm0oODgsIDAsIDUpDQoNCiMgSGl0dW5nIGtvcmVsYXNpDQpjb3JyZWxhdGlvbl92YWx1ZSA8LSBjb3IoZGF0YSRBbmdnYXJhbl9Ja2xhbiwgZGF0YSRIYXNpbF9QZW5qdWFsYW4pDQoNCiMgU2NhdHRlciBwbG90IGRlbmdhbiBwbG90bHkNCmZpZyA8LSBwbG90X2x5KGRhdGEsDQogICAgICAgICAgICAgICB4ID0gfkFuZ2dhcmFuX0lrbGFuLA0KICAgICAgICAgICAgICAgeSA9IH5IYXNpbF9QZW5qdWFsYW4sDQogICAgICAgICAgICAgICB0eXBlID0gJ3NjYXR0ZXInLA0KICAgICAgICAgICAgICAgbW9kZSA9ICdtYXJrZXJzJywNCiAgICAgICAgICAgICAgIG1hcmtlciA9IGxpc3QoY29sb3IgPSAnYmx1ZScsIHNpemUgPSAxMCksDQogICAgICAgICAgICAgICB0ZXh0ID0gfnBhc3RlKCJNZWRpYToiLCBNZWRpYSwgIjxicj5SZXNwb246IiwgUmVzcG9uKSwNCiAgICAgICAgICAgICAgIGhvdmVyaW5mbyA9ICJ0ZXh0K3greSIpICU+JQ0KICBhZGRfbGluZXMoeCA9IGRhdGEkQW5nZ2FyYW5fSWtsYW4sDQogICAgICAgICAgICB5ID0gcHJlZGljdChsbShIYXNpbF9QZW5qdWFsYW4gfiBBbmdnYXJhbl9Ja2xhbiwgZGF0YSA9IGRhdGEpKSwNCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JlZCcsIGRhc2ggPSAnc29saWQnLCB3aWR0aCA9IDIpKSAlPiUNCiAgbGF5b3V0KHRpdGxlID0gcGFzdGUoIlNjYXR0ZXIgUGxvdDogSHVidW5nYW4gQW5nZ2FyYW4gSWtsYW4gZGFuIEhhc2lsIFBlbmp1YWxhblxuS29yZWxhc2k6ICIsIHJvdW5kKGNvcnJlbGF0aW9uX3ZhbHVlLCAyKSksDQogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQW5nZ2FyYW4gSWtsYW4gKGp1dGEpIiksDQogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiSGFzaWwgUGVuanVhbGFuIChqdXRhKSIpKQ0KDQojIFRhbXBpbGthbiBwbG90DQpmaWcNCg0KYGBgDQoNCg0KIyBDb250cm9sIENoYXJ0DQoNCmBgYHtyLCBtZXNzYWdlPVRSVUUsIHdhcm5pbmc9VFJVRSwgZWNobz1UUlVFfQ0KDQojIExvYWQgbGlicmFyaWVzDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoZHBseXIpDQoNCiMgSGl0dW5nIGp1bWxhaCBrZXRlcmxpYmF0YW4gcGVyIHRhbmdnYWwNCmVuZ2FnZW1lbnRfZGF0YSA8LSBkYXRhICU+JQ0KICBncm91cF9ieShUYW5nZ2FsKSAlPiUNCiAgc3VtbWFyaXNlKEp1bWxhaF9SZXNwb24gPSBuKCkpDQoNCiMgSGl0dW5nIG5pbGFpIENvbnRyb2wgTGltaXQNCkNMIDwtIG1lYW4oZW5nYWdlbWVudF9kYXRhJEp1bWxhaF9SZXNwb24pDQpVQ0wgPC0gQ0wgKyAzICogc2QoZW5nYWdlbWVudF9kYXRhJEp1bWxhaF9SZXNwb24pDQpMQ0wgPC0gQ0wgLSAzICogc2QoZW5nYWdlbWVudF9kYXRhJEp1bWxhaF9SZXNwb24pDQoNCiMgVGFuZGFpIG91dGxpZXINCmVuZ2FnZW1lbnRfZGF0YSA8LSBlbmdhZ2VtZW50X2RhdGEgJT4lDQogIG11dGF0ZShPdXRsaWVyID0gaWZlbHNlKEp1bWxhaF9SZXNwb24gPiBVQ0wgfCBKdW1sYWhfUmVzcG9uIDwgTENMLCAiWWEiLCAiVGlkYWsiKSkNCg0KIyBCdWF0IENvbnRyb2wgQ2hhcnQNCnBsb3RfbHkoZW5nYWdlbWVudF9kYXRhLA0KICAgICAgICB4ID0gflRhbmdnYWwsDQogICAgICAgIHkgPSB+SnVtbGFoX1Jlc3BvbiwNCiAgICAgICAgdHlwZSA9ICdzY2F0dGVyJywNCiAgICAgICAgbW9kZSA9ICdsaW5lcyttYXJrZXJzJywNCiAgICAgICAgbGluZSA9IGxpc3QoY29sb3IgPSAnYmx1ZScpLA0KICAgICAgICBtYXJrZXIgPSBsaXN0KHNpemUgPSA4LCBjb2xvciA9IGlmZWxzZShlbmdhZ2VtZW50X2RhdGEkT3V0bGllciA9PSAiWWEiLCAicmVkIiwgImJsdWUiKSksDQogICAgICAgIGhvdmVyaW5mbyA9ICd0ZXh0JywNCiAgICAgICAgdGV4dCA9IH5wYXN0ZSgiVGFuZ2dhbDoiLCBUYW5nZ2FsLCAiPGJyPkp1bWxhaCBSZXNwb246IiwgSnVtbGFoX1Jlc3BvbikpICU+JQ0KICBhZGRfbGluZXMoeSA9IHJlcChDTCwgbnJvdyhlbmdhZ2VtZW50X2RhdGEpKSwgbmFtZSA9ICJDTCIsIGxpbmUgPSBsaXN0KGNvbG9yID0gJ2dyZWVuJywgZGFzaCA9ICdkb3QnKSkgJT4lDQogIGFkZF9saW5lcyh5ID0gcmVwKFVDTCwgbnJvdyhlbmdhZ2VtZW50X2RhdGEpKSwgbmFtZSA9ICJVQ0wiLCBsaW5lID0gbGlzdChjb2xvciA9ICdyZWQnLCBkYXNoID0gJ2RvdCcpKSAlPiUNCiAgYWRkX2xpbmVzKHkgPSByZXAoTENMLCBucm93KGVuZ2FnZW1lbnRfZGF0YSkpLCBuYW1lID0gIkxDTCIsIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JlZCcsIGRhc2ggPSAnZG90JykpICU+JQ0KICBsYXlvdXQodGl0bGUgPSAiQ29udHJvbCBDaGFydCDigJMgRmx1a3R1YXNpIEtldGVybGliYXRhbiBNZWRpYSBTb3NpYWwiLA0KICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIlRhbmdnYWwiKSwNCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJKdW1sYWggUmVzcG9uIiksDQogICAgICAgICBsZWdlbmQgPSBsaXN0KG9yaWVudGF0aW9uID0gJ2gnLCB4ID0gMC4zLCB5ID0gLTAuMikpDQoNCmBgYA0KDQojIEZpc2hib25lDQoNCmBgYHtyLCBtZXNzYWdlPVRSVUUsIHdhcm5pbmc9VFJVRSwgZWNobz1UUlVFfQ0KDQojIFBhc3Rpa2FuIHNlbXVhIHBhY2thZ2UgdGVyaW5zdGFsDQppZiAoIXJlcXVpcmVOYW1lc3BhY2UoIkRpYWdyYW1tZVIiLCBxdWlldGx5ID0gVFJVRSkpIGluc3RhbGwucGFja2FnZXMoIkRpYWdyYW1tZVIiKQ0KaWYgKCFyZXF1aXJlTmFtZXNwYWNlKCJEaWFncmFtbWVSc3ZnIiwgcXVpZXRseSA9IFRSVUUpKSBpbnN0YWxsLnBhY2thZ2VzKCJEaWFncmFtbWVSc3ZnIikNCmlmICghcmVxdWlyZU5hbWVzcGFjZSgicnN2ZyIsIHF1aWV0bHkgPSBUUlVFKSkgaW5zdGFsbC5wYWNrYWdlcygicnN2ZyIpDQoNCmxpYnJhcnkoRGlhZ3JhbW1lUikNCmxpYnJhcnkoRGlhZ3JhbW1lUnN2ZykNCmxpYnJhcnkocnN2ZykNCg0KIyBCdWF0IGRpYWdyYW0gZmlzaGJvbmUNCmdyYXBoIDwtIGdyVml6KCINCmRpZ3JhcGggZmlzaGJvbmUgew0KICBncmFwaCBbbGF5b3V0ID0gZG90LCByYW5rZGlyID0gTFJdDQoNCiAgbm9kZSBbZm9udG5hbWU9SGVsdmV0aWNhLCBmb250c2l6ZT0yNSwgc3R5bGU9ZmlsbGVkXQ0KDQogIFByb2JsZW0gW2xhYmVsPSdLYW1wYW55ZSBHYWdhbFxcbk1lbmluZ2thdGthbiBQZW5qdWFsYW4nLCBzaGFwZT1lbGxpcHNlLCBmaWxsY29sb3I9bGlnaHRjb3JhbCwgd2lkdGg9NS4wLCBoZWlnaHQ9MS4yXQ0KDQogIG5vZGUgW3NoYXBlPWRpYW1vbmQsIHdpZHRoPTIuNSwgaGVpZ2h0PTEuMCwgZmlsbGNvbG9yPScjRkZENzAwJ10NCiAgQTEgW2xhYmVsPSdNZWRpYSddDQogIEEyIFtsYWJlbD0nS29udGVuJ10NCiAgQTMgW2xhYmVsPSdUYXJnZXRpbmcnXQ0KICBBNCBbbGFiZWw9J0ZyZWt1ZW5zaSddDQogIEE1IFtsYWJlbD0nQW5nZ2FyYW4nXQ0KICBBNiBbbGFiZWw9J1dha3R1J10NCg0KICBub2RlIFtzaGFwZT1lbGxpcHNlLCB3aWR0aD0yLjUsIGhlaWdodD0wLjYsIGZpbGxjb2xvcj0nIzkwRUU5MCddDQogIEExYSBbbGFiZWw9J01lZGlhIGt1cmFuZyBzZXN1YWknXQ0KICBBMWIgW2xhYmVsPSdUZXJsYWx1IGJhbnlhayBwbGF0Zm9ybSddDQogIEEyYSBbbGFiZWw9J0tvbnRlbiB0aWRhayBtZW5hcmlrJ10NCiAgQTJiIFtsYWJlbD0nVGVybGFsdSBiYW55YWsgdGVrcyddDQogIEEzYSBbbGFiZWw9J1RpZGFrIHNlc3VhaSBzZWdtZW50YXNpJ10NCiAgQTNiIFtsYWJlbD0nSWtsYW4gdGlkYWsgcmVsZXZhbiddDQogIEE0YSBbbGFiZWw9J0ZyZWt1ZW5zaSB0ZXJsYWx1IHRpbmdnaSddDQogIEE0YiBbbGFiZWw9J0ZyZWt1ZW5zaSB0ZXJsYWx1IHJlbmRhaCddDQogIEE1YSBbbGFiZWw9J0FuZ2dhcmFuIHRlcmxhbHUga2VjaWwnXQ0KICBBNWIgW2xhYmVsPSdEaXN0cmlidXNpIHRpZGFrIG9wdGltYWwnXQ0KICBBNmEgW2xhYmVsPSdXYWt0dSBrYW1wYW55ZSBrdXJhbmcgdGVwYXQnXQ0KICBBNmIgW2xhYmVsPSdUZXJsYW1iYXQgbWVyZXNwb24gdHJlbiddDQoNCiAgQTEgLT4gUHJvYmxlbQ0KICBBMiAtPiBQcm9ibGVtDQogIEEzIC0+IFByb2JsZW0NCiAgQTQgLT4gUHJvYmxlbQ0KICBBNSAtPiBQcm9ibGVtDQogIEE2IC0+IFByb2JsZW0NCg0KICBBMWEgLT4gQTENCiAgQTFiIC0+IEExDQogIEEyYSAtPiBBMg0KICBBMmIgLT4gQTINCiAgQTNhIC0+IEEzDQogIEEzYiAtPiBBMw0KICBBNGEgLT4gQTQNCiAgQTRiIC0+IEE0DQogIEE1YSAtPiBBNQ0KICBBNWIgLT4gQTUNCiAgQTZhIC0+IEE2DQogIEE2YiAtPiBBNg0KfQ0KIikNCg0KIyBTaW1wYW4gaGFzaWwgc2ViYWdhaSBnYW1iYXINCmRpci5jcmVhdGUoImltYWdlcy9iYWI4IiwgcmVjdXJzaXZlID0gVFJVRSwgc2hvd1dhcm5pbmdzID0gRkFMU0UpDQpzdmdfY29kZSA8LSBEaWFncmFtbWVSc3ZnOjpleHBvcnRfc3ZnKGdyYXBoKQ0KDQpyc3ZnX3BuZyhjaGFyVG9SYXcoc3ZnX2NvZGUpLCBmaWxlID0gImltYWdlcy9iYWI4L2Zpc2hib25lX2NhbXBhaWduX2ZhaWwucG5nIiwgd2lkdGggPSAxMjAwLCBoZWlnaHQgPSA4MDApDQpyc3ZnX3BkZihjaGFyVG9SYXcoc3ZnX2NvZGUpLCBmaWxlID0gImltYWdlcy9iYWI4L2Zpc2hib25lX2NhbXBhaWduX2ZhaWwucGRmIikNCg0KIyBUYW1waWxrYW4gZ2FtYmFyIGRhbGFtIGRva3VtZW4NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJpbWFnZXMvYmFiOC9maXNoYm9uZV9jYW1wYWlnbl9mYWlsLnBuZyIpDQoNCmBgYA0KDQojIEZsb3djaGFydA0KDQpgYGB7ciwgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPVRSVUUsIGVjaG89VFJVRX0NCiMgUGFzdGlrYW4gcGFrZXQgRGlhZ3JhbW1lUiBzdWRhaCB0ZXJwYXNhbmcNCiMgaW5zdGFsbC5wYWNrYWdlcygiRGlhZ3JhbW1lUiIpDQoNCmxpYnJhcnkoRGlhZ3JhbW1lUikNCg0KZ3JWaXooIg0KZGlncmFwaCBrYW1wYW55ZSB7DQogIA0KICBncmFwaCBbcmFua2RpciA9IFRCLCBsYXlvdXQgPSBkb3RdDQoNCiAgbm9kZSBbc2hhcGUgPSBib3gsIHN0eWxlPWZpbGxlZCwgZmlsbGNvbG9yPWxpZ2h0Ymx1ZV0NCiAgQSBbbGFiZWwgPSAnUmlzZXQgUGFzYXIgJiBBdWRpZW5zJ10NCiAgQiBbbGFiZWwgPSAnU3VzdW4gU3RyYXRlZ2kgSWtsYW4nXQ0KICBDIFtsYWJlbCA9ICdMdW5jdXJrYW4gSWtsYW4nXQ0KICBEIFtsYWJlbCA9ICdNb25pdG9yIFJlc3BvbnMgJiBFbmdhZ2VtZW50J10NCiAgRSBbbGFiZWwgPSAnVGluZGFrIExhbmp1dCBrZSBDYWxvbiBQZWxhbmdnYW4nXQ0KICBGIFtsYWJlbCA9ICdLdW1wdWxrYW4gRGF0YSAmIEZlZWRiYWNrJ10NCiAgRyBbbGFiZWwgPSAnRXZhbHVhc2kgSGFzaWwgS2FtcGFueWUnXQ0KICANCiAgbm9kZSBbc2hhcGUgPSBkaWFtb25kLCBzdHlsZT1maWxsZWQsIGZpbGxjb2xvcj1sZW1vbmNoaWZmb25dDQogIEggW2xhYmVsID0gJ0FwYWthaCBUYXJnZXQgVGVyY2FwYWk/J10NCiAgDQogIG5vZGUgW3NoYXBlID0gZWxsaXBzZSwgc3R5bGU9ZmlsbGVkLCBmaWxsY29sb3I9cGlua10NCiAgSSBbbGFiZWwgPSAnTm8nXQ0KICANCiAgbm9kZSBbc2hhcGUgPSBib3gsIHN0eWxlPWZpbGxlZCwgZmlsbGNvbG9yPWxpZ2h0Z3JheV0NCiAgSiBbbGFiZWwgPSAnUGVyYmFpa2kgU3RyYXRlZ2knXQ0KDQogIG5vZGUgW3NoYXBlID0gYm94LCBzdHlsZT1maWxsZWQsIGZpbGxjb2xvcj1saWdodGdyZWVuXQ0KICBLIFtsYWJlbCA9ICdLYW1wYW55ZSBTdWtzZXMnXQ0KDQogIG5vZGUgW3NoYXBlID0gY2lyY2xlLCBzdHlsZT1maWxsZWQsIGZpbGxjb2xvcj1jeWFuXQ0KICBTdGFydCBbbGFiZWwgPSAnU3RhcnQnXQ0KDQogIFN0YXJ0IC0+IEEgLT4gQiAtPiBDIC0+IEQgLT4gRSAtPiBGIC0+IEcgLT4gSA0KICBIIC0+IEsgW2xhYmVsPSdZZXMnXQ0KICBIIC0+IEkNCiAgSSAtPiBKIC0+IEINCn0NCiIpDQoNCmBgYA0KDQpgYGANCg0K