Latar Belakang
Dalam dunia bisnis, Coffee Chain merujuk kepada jaringan
bisnis yang terdiri dari beberapa kedai kopi (coffee shops)
yang dimiliki atau dioperasikan oleh satu perusahaan yang sama. Dataset
yang digunakan dalam analisis ini adalah Coffee Chain
Datasets yang merupakan kumpulan data penjualan dan keuangan
dari bisnis produk kopi dan teh di pasar Amerika Serikat pada tahun
2012-2013. Dataset ini mencakup berbagai variabel yang menggambarkan
karakteristik pasar, seperti kode area, letak pasar (central,
east, south, west), state (20
state di Amerika Serikat), ukuran pasar (major market
dan small market), tipe pasar (regular dan
decaf), jenis produk (coffee, tea,
espresso, herbal tea), asal produk (beans dan
leaves), nama produk (amaretto, colombian,
decaf irish cream, green tea, dsb), tanggal, serta
metrik keuangan berupa budget COGS, budget margain,
budget sales, budget profit, COGS,
inventory, margin, marketing,
profit, sales, dan total expenses. Dataset
ini memungkinkan analisis perbandingan antara perencanaan dan
realisasi.
Dalam bisnis coffee chain, memahami faktor-faktor penentu
Profit (laba) yang dihasilkan merupakan hal yang penting dalam
pengambilan keputusan yang strategis. Ada banyak faktor yang dapat
memengaruhi nilai Profit (laba), dua diantaranya adalah
Sales (penjualan) dan Total Expenses (total
pengeluaran). Sales merupakan varianel yang mencerminkan
kemampuan bisnis dalam menghasilkan pendapatan, sementara Total
Expenses mewakili seluruh biaya operasional yang dikeluarkan untuk
mempertahankan bisnis. Dalam analisis ini, akan diukur pengaruh
Sales dan Total Expenses terhadap Profit yang
dihasilkan tiap State di Amerika. Dengan demikian, hasil
analisis ini dapat memberikan informasi penting bagi manajemen dalam
mengoptimalkan strategi bisnis, seperti meningkatkan efisiensi
operasional atau fokus pada pertumbuhan penjualan.
Metode Analisis
Metode yang dapat digunakan untuk analisis ini adalah regresi linear
berganda. Analisis regresi berganda merupakan metode statistik yang
digunakan untuk memahami hubungan antara satu variabel dependen dan dua
atau lebih variabel independen. Tujuan utama dari metode ini adalah
untuk menentukan sejauh mana variabel-variabel independen tersebut
berpengaruh terhadap variasi variabel dependennya. Bentuk umum model
regresi berganda dengan k variabel independen adalah:
\[ Y = \beta_0 + \beta_1X_1 + \beta_2X_2 +
... + \beta_pX_p + \epsilon\] dimana \(Y\) adalah variabel dependen, \(X_1,X_2,...,X_n\) adalah variabel
independen, \(\beta_0,\beta_1,...,\beta_n\) adalah
parameter regresi, dan \(\epsilon\)
adalah sesatan.
Data
Data yang digunakan dalam analisis ini dikelompokkan berdasarkan
State di Amerika Serikat, dengan variabel independen yang
digunakan adalah Sales \((X_1)\) dan Total Expenses \((X_2)\), sedangkan variabel dependen nya
adalah Profit \((Y)\).
# Memuat package yang dibutuhkan
library(readxl)
library(rmarkdown)
library(dplyr)
library(tidyverse)
library(car)
library(lmtest)
library(ggplot2)
# Mengimport datasets dari file excel
Coffee_Chain_Datasets <- read_excel("~/@ SIM 2025/DATA CM 1/3. CM1 - Coffee Chain Datasets/3. CM1 - Coffee Chain Datasets.xlsx")
# Membuat filter data sesuai variabel yang dibutuhkan
Data_Filter <- Coffee_Chain_Datasets %>%
group_by(State) %>%
summarise(
Y = sum(Profit, na.rm = TRUE),
X1 = sum(Sales, na.rm = TRUE),
X2 = sum(`Total Expenses`, na.rm = TRUE)
)
print(Data_Filter)
## # A tibble: 20 × 4
## State Y X1 X2
## <chr> <dbl> <dbl> <dbl>
## 1 California 31785 96892 23222
## 2 Colorado 17743 48179 12143
## 3 Connecticut 7621 25429 8096
## 4 Florida 12310 37443 11009
## 5 Illinois 30821 69883 13653
## 6 Iowa 22212 54750 11838
## 7 Louisiana 7355 23161 7182
## 8 Massachusetts 16442 29965 6765
## 9 Missouri 3601 24647 9641
## 10 Nevada 10616 60159 18586
## 11 New Hampshire 2748 14887 6606
## 12 New Mexico 799 15892 7243
## 13 New York 20096 70852 17637
## 14 Ohio 10773 34517 10251
## 15 Oklahoma 8558 27463 8577
## 16 Oregon 12439 40899 12448
## 17 Texas 15766 37410 8000
## 18 Utah 7751 35384 12409
## 19 Washington 11405 38930 12849
## 20 Wisconsin 8702 33069 11507
Analisis
Statistika Deskriptif
Statistika deskriptif merupakan metode analisis yang digunakan untuk
merangkum, menyajikan data, serta memberikan gambaran yang jelas tentang
karakteristiknya. Beberapa ukuran statistik yang umum digunakan adalah
nilai minimun \((Min)\), nilai maksimum
\((Max)\), kuartil pertama \((Q_1)\), kuartil kedua atau median \((Q_2)\), kuartil ketiga \((Q_3)\), serta nilai rata-rata \((Mean)\).
# Statistik deskriptif dari semua variabel yang digunakan
summary(Data_Filter)
## State Y X1 X2
## Length:20 Min. : 799 Min. :14887 Min. : 6606
## Class :character 1st Qu.: 7718 1st Qu.:26955 1st Qu.: 8072
## Mode :character Median :11089 Median :36397 Median :11258
## Mean :12977 Mean :40991 Mean :11483
## 3rd Qu.:16767 3rd Qu.:49822 3rd Qu.:12548
## Max. :31785 Max. :96892 Max. :23222
Interpretasi: Dari output diperoleh informasi bahwa
variabel State bersifat kategorikal dengan jumlah 20 observasi.
Secara umum, ketiga variabel numerik yaitu \(Y\), \(X_1\), dan \(X_2\) menunjukkan variasi data yang besar
dengan variabel yang memiliki rentang terlebar adalah \(X_1\).
## Kategori State Nilai
## 1 Y Maks California 31785
## 2 Y Min New Mexico 799
## 3 X1 Maks California 96892
## 4 X1 Min New Hampshire 14887
## 5 X2 Maks California 23222
## 6 X2 Min New Hampshire 6606
Interpretasi: Diketahui variabel \(X_1\) mewakili Sales, \(X_2\) mewakili Total Expenses, dan
\(Y\) mewakili Profit. Dari
output \(data.frame\) di atas,
diperoleh informasi bahwa State yang memiliki nilai
Profit, Sales, dan Total Expenses tertinggi
adalah California, hal ini menandai adanya kinerja bisnis yang kuat
meski dengan pengeluaran tinggi. Di sisi lain, New Mexico memiliki
Profit terendah meski Sales, dan Total
Expenses nya bukan yang paling rendah. Sementara New Hampshire
beroperasi dengan Sales, dan Total Expenses paling
rendah.
Scatter Plot tiap Variabel
Scatter Plot Y vs X1
# Scatterplot Y vs X1
ggplot(Data_Filter, aes(x = X1, y = Y)) +
geom_point(color = "#1E5128") + # menciptakan titik
ggtitle("Scatterplot of Y vs X1") +
xlab("X1") +
ylab("Y")

Interpretasi: Scatter plot ini menunjukkan hubungan
antara variabel \(Y\) (sumbu vertikal)
dan \(X_1\) (sumbu horizontal). Pola
yang dihasilkan mengindikasikan adanya kemungkinan hubungan positif
antara \(Y\) dan \(X_1\), di mana peningkatan nilai \(X_1\) cenderung diikuti peningkatan nilai
\(Y\), meskipun tidak terlalu kuat
karena sebaran data yang cukup lebar.
Scatter Plot Y vs X2
# Scatterplot Y vs X2
ggplot(Data_Filter, aes(x = X2, y = Y)) +
geom_point(color = "#1E5128") + # menciptakan titik
ggtitle("Scatterplot of Y vs X2") +
xlab("X2") +
ylab("Y")

Interpretasi: Scatter plot ini menunjukkan hubungan
antara variabel \(Y\) (sumbu vertikal)
dan \(X_2\) (sumbu horizontal). Pola
yang dihasilkan menunjukkan kemungkinan hubungan negatif antara \(X_2\) dan \(Y\), di mana peningkatan nilai \(X_2\) justru diikuti oleh penurunan nilai
\(Y\).
Uji Asumsi Klasik
# Membuat persamaan model regresi linier berganda
model <- lm(Y ~ X1+X2, data=Data_Filter)
model
##
## Call:
## lm(formula = Y ~ X1 + X2, data = Data_Filter)
##
## Coefficients:
## (Intercept) X1 X2
## 5695.9338 0.7534 -2.0554
Uji Non-Multikolinearitas
Hipotesis
\(H_0\) : Tidak terjadi gejala
multikolinearitas
\(H_1\) : Terjadi gejala
multikolinearitas
Tingkat Signifikansi (\(\alpha\)) = \(5\)% = \(0.05\)
Daerah Kritis
\(H_0\) ditolak jika \(VIF > 10\)
Statistik Uji
# Plot VIF
nilai_vif <- vif(model)
plot(nilai_vif, type = "bar", main = "VIF Plot")

# Uji Non-Multikolinearitas
vif(model)
## X1 X2
## 6.095037 6.095037
Kesimpulan
Karena dari perhitungan, diperoleh nilai \(VIF\) kedua variabel \(< 10\), maka \(H_0\) gagal ditolak, yang artinya model
tidak mengalami gejala multikolinearitas.
Uji Normalitas Residu
Hipotesis
\(H_0\) : Residu data berdistribusi
normal
\(H_1\) : Residu data tidak
berdistribusi normal
Tingkat Signifikansi (\(\alpha\)) = \(5\)% = \(0.05\)
Daerah Kritis
\(H_0\) ditolak jika \(p-value < \alpha = 0.05\)
Statistik Uji
# Q-Q Plot
qqnorm(resid(model))
qqline(resid(model))

# Uji Normalitas Residu
shapiro.test(resid(model))
##
## Shapiro-Wilk normality test
##
## data: resid(model)
## W = 0.98436, p-value = 0.9774
Kesimpulan
Karena jika dilihat plot normal Q-Q nya, dapat terlihat bahwa
titik-titik menyebar di sekitar grafik normal mengikuti garis diagonal
dan nilai \(p-value = 0.9774 > \alpha =
0.05\) maka \(H_0\) gagal
ditolak, yang artinya residu data berdistribusi normal.
Uji Non-Autokorelasi
Hipotesis
\(H_0\) : Tidak ada autokorelasi
antar residu data
\(H_1\) : Terjadi autokorelasi antar
residu data
Tingkat Signifikansi \((\alpha)\) = \(5\)% = \(0.05\)
Daerah Kritis
\(H_0\) ditolak jika \(p-value < \alpha = 0.05\)
Statistik Uji
# Uji Autokorelasi
dwtest(model)
##
## Durbin-Watson test
##
## data: model
## DW = 1.5004, p-value = 0.1046
## alternative hypothesis: true autocorrelation is greater than 0
Kesimpulan
Karena dari perhitungan, diperoleh nilai \(p-value = 0.1046 > \alpha = 0.05\) maka
\(H_0\) gagal ditolak, yang artinya
tidak ada autokorelasi antar residu data
Uji Homoskedastisitas
Hipotesis
\(H_0\) : Terdapat homoskedastisitas
dalam residu data
\(H_1\) : Tidak terdapat
homoskedastisitas dalam residu data
Tingkat Signifikansi (\(\alpha\)) = \(5\)% = \(0.05\)
Daerah Kritis
\(H_0\) ditolak jika \(p-value < \alpha = 0.05\)
Statistik Uji
# Plot
plot(model, which = 1)

# Uji Homoskedastisitas
bptest(model)
##
## studentized Breusch-Pagan test
##
## data: model
## BP = 2.1651, df = 2, p-value = 0.3387
Kesimpulan
Karena dari perhitungan, diperoleh nilai \(p-value = 0.3387 > \alpha = 0.05\) maka
\(H_0\) gagal ditolak, yang artinya
terdapat homoskedastisitas dalam residu data.
Analisis Regresi Linear Berganda
# Membuat persamaan model regresi linier berganda
model <- lm(Y ~ X1+X2, data=Data_Filter)
model
##
## Call:
## lm(formula = Y ~ X1 + X2, data = Data_Filter)
##
## Coefficients:
## (Intercept) X1 X2
## 5695.9338 0.7534 -2.0554
##
## Call:
## lm(formula = Y ~ X1 + X2, data = Data_Filter)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2730.98 -893.82 -29.75 933.62 2787.80
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 5695.93380 1099.66103 5.18 7.54e-05 ***
## X1 0.75343 0.04344 17.34 3.03e-12 ***
## X2 -2.05540 0.20719 -9.92 1.74e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1581 on 17 degrees of freedom
## Multiple R-squared: 0.9681, Adjusted R-squared: 0.9643
## F-statistic: 257.7 on 2 and 17 DF, p-value: 1.928e-13
Berdasarkan hasil analisis regresi di atas, diperoleh persamaan
regresi untuk model ini : \[ Y = 5696.93380 +
0.75343X_1 - 2.05540X_2\] Interpretasi
model:
- Jika variabel Sales \((X_1)\) dan Total Expenses \((X_2)\) diasumsikan bernilai nol, maka
nilai Profit \((Y)\) akan
bernilai 5696,93380.
- Setiap kenaikan satu nilai Sales \((X_1)\), akan menaikkan nilai
Profit \((Y)\) sebesar
0,75343.
- Setiap kenaikan satu nilai Total Expenses \((X_2)\) akan menurunkan nilai
Profit \((Y)\) sebesar
2,05540.
Selain itu, dari hasil \(summary(model)\) juga diperoleh bahwa nilai
Koefisien Determinasi (Adjusted R-Squared) bernilai 96,43%. Hal
ini menunjukkan bahwa variabel independen \((X)\) dalam model regresi ini mampu
menjelaskan variansi dari variabel dependen \((Y)\) sebesar 96,43%, sedangkan sisanya
yaitu 3,57% dijelaskan oleh variabel lain yang tidak digunakan dalam
model.
Uji Hipotesis
Uji Simultan (F)
Hipotesis
\(H_0\) : Variabel independen secara
simultan tidak berpengaruh signifikan terhadap variabel dependen
\(H_1\) : Variabel independen secara
simultan berpengaruh signifikan terhadap variabel dependennya
Tingkat Signifikansi (\(\alpha\)) = \(5\)% = \(0.05\)
Daerah Kritis
\(H_0\) ditolak jika \(p-value < \alpha = 0.05\)
Statistik Uji
##
## Call:
## lm(formula = Y ~ X1 + X2, data = Data_Filter)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2730.98 -893.82 -29.75 933.62 2787.80
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 5695.93380 1099.66103 5.18 7.54e-05 ***
## X1 0.75343 0.04344 17.34 3.03e-12 ***
## X2 -2.05540 0.20719 -9.92 1.74e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1581 on 17 degrees of freedom
## Multiple R-squared: 0.9681, Adjusted R-squared: 0.9643
## F-statistic: 257.7 on 2 and 17 DF, p-value: 1.928e-13
Kesimpulan
Karena dari perhitungan, diperoleh nilai \(p-value = 1.928*10^{-13} < \alpha =
0.05\) maka \(H_0\) ditolak,
yang artinya semua variabel independen berpengaruh signifikan terhadap
variabel dependen secara simultan.
Uji Parsial (T)
Hipotesis
Untuk \(X_1\) =
Sales
\(H_0\) : Sales tidak
berpengaruh signifikan terhadap Profit
\(H_1\) : Sales berpengaruh
signifikan terhadap Profit
Untuk \(X_2\) = Total
Expenses
\(H_0\) : Total Expenses
tidak berpengaruh signifikan terhadap Profit
\(H_1\) : Total Expenses
berpengaruh signifikan terhadap Profit
Tingkat Signifikansi (\(\alpha\)) = \(5\)% = \(0.05\)
Daerah Kritis
\(H_0\) ditolak jika \(p-value < \alpha = 0.05\)
Statistik Uji
##
## Call:
## lm(formula = Y ~ X1 + X2, data = Data_Filter)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2730.98 -893.82 -29.75 933.62 2787.80
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 5695.93380 1099.66103 5.18 7.54e-05 ***
## X1 0.75343 0.04344 17.34 3.03e-12 ***
## X2 -2.05540 0.20719 -9.92 1.74e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1581 on 17 degrees of freedom
## Multiple R-squared: 0.9681, Adjusted R-squared: 0.9643
## F-statistic: 257.7 on 2 and 17 DF, p-value: 1.928e-13
- Kesimpulan
Untuk \(X_1\) =
Sales
Karena dari perhitungan, diperoleh nilai \(p-value = 3.03*10^{-12} < \alpha =
0.05\) maka \(H_0\) ditolak,
yang artinya Sales memiliki pengaruh yang signifikan terhadap
Profit secara parsial.
Untuk \(X_2\) = Total
Expenses
Karena dari perhitungan, diperoleh nilai \(p-value = 1.74*10^{-8} < \alpha = 0.05\)
maka \(H_0\) ditolak, yang artinya
Total Expenses memiliki pengaruh yang signifikan terhadap
Profit secara parsial.
Kesimpulan Hasil Analisis
Berdasarkan analisis yang sudah dilakukan dapat disimpulkan bahwa
variabel independen \(X_1\) yaitu
Sales dan \(X_2\) yaitu
Total Expenses berpengaruh secara signfikan terhadap variabel
dependen Y yaitu Profit secara bersama-sama atau simultan dan
secara parsial dengan persamaan model regresi linear bergandanya adalah
\(Y = 5696.93380 + 0.75343X_1 -
2.05540X_2\). Model regresi ini memiliki nilai koefisien
determinasi sebesar 96,43% yang berarti variabel independen \((X)\) dalam model regresi ini mampu
menjelaskan variansi dari variabel dependen sebesar 96,43%, sedangkan
sisanya yaitu sebesar 3,57% dijelaskan oleh variabel lain yang tidak
digunakan dalam model. Selain itu, berdasarkan uji asumsi klasik, semua
uji asumsi yakni, uji non-multikolinearitas, uji normalitas residu, uji
non-autokorelasi, dan uji homoskedastisitas terpenuhi sehingga model
regresi ini layak untuk digunakan.
Analisis ini menunjukkan bahwa Profit (laba) perusahaan
coffee chain sangat dipengaruhi oleh penjualan (Sales)
dan pengeluaran (Total Expenses), di mana kontrol biaya
memegang peran lebih kritis dibandingkan peningkatan penjualan. Model
regresi yang dihasilkan memiliki nilai koefisien determinasi yang cukup
tinggi, sehingga perusahaan dapat menggunakannya untuk mengambil
keputusan strategis seperti optimalisasi biaya, alokasi sumber daya, dan
evaluasi kinerja per State di Amerika Serikat. Kunci utamanya
adalah menyeimbangkan pertumbuhan penjualan dengan efisiensi biaya,
sambil mempertimbangkan faktor eksternal lain yang mungkin berdampak
kecil namun signifikan. Dengan pendekatan ini, perusahaan dapat
meningkatkan profit secara lebih efektif dan terukur.
Daftar Pustaka
Purba, R. L. (2022, Mei 22). Penerapan regresi berganda dengan R
Studio. RPubs.
Sholihah, S.M., Aditiya, N.Y., Evani, E.S., & Maghfiroh, S.
(2023). Konsep uji asumsi klasik pada regresi linier berganda. Jurnal
Riset Akuntansi Soedirman (JRAS), 2(2), [102-110].
LS0tDQp0aXRsZTogIkFuYWxpc2lzIFJlZ3Jlc2kgTGluZWFyIEJlcmdhbmRhIFBlbmdhcnVoIFNhbGVzIGRhbiBUb3RhbCBFeHBlbnNlcyB0ZXJoYWRhcCBQcm9maXQgUGVuanVhbGFuIERhdGEgQ29mZmVlIENoYWluIHBhZGEgU2V0aWFwIFN0YXRlIGRpIEFtZXJpa2EgdGFodW4gMjAxMi0yMDEzIg0KYXV0aG9yOiAiQW1hbGlhIFJpemt5IEFsIE1haWRhaCB8IE0wNzIzMDA3Ig0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0aGVtZTogeWV0aQ0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogdHJ1ZQ0KICAgIGhpZ2hsaWdodCA6IGhhZGRvY2sNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiAic2hvdyINCi0tLQ0KDQo8c3R5bGU+DQogIGJvZHkgew0KICAgIGZvbnQtZmFtaWx5OiBUaW1lcyBOZXcgUm9tYW4sIHNhbnMtc2VyaWY7DQogICAgYmFja2dyb3VuZC1jb2xvcjogI2RiZGJkYjsNCiAgICB0ZXh0LWFsaWduOiBqdXN0aWZ5Ow0KICB9DQogIGgxIHsNCiAgICBjb2xvcjogIzA0MjkzQTsNCiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIH0NCiAgaDIgew0KICAgIGNvbG9yOiAjMDA1ODdBOw0KICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgfQ0KICBoMyB7DQogICAgY29sb3I6IGJsYWNrOw0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIH0NCiAgLnRpdGxlIHsNCiAgICBjb2xvcjogIzBGMzA1NzsNCiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIH0gIA0KICAuYXV0aG9yLCAuZGF0ZSB7DQogICAgY29sb3I6ICMyNzY2ODg7DQogICAgdGV4dC1hbGlnbjogY2VudGVyOw0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBwIHsNCiAgICB0ZXh0LWFsaWduOiBqdXN0aWZ5Ow0KICAgIGZvbnQtc2l6ZTogMTVweDsNCiAgICBjb2xvcjogI2JsYWNrOw0KICB9DQogIHByZSB7DQogICAgY29sb3I6IGJsYWNrOw0KICAgIG92ZXJmbG93LXg6IGF1dG87IA0KICB9DQo8L3N0eWxlPg0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCi0tLS0tLS0NCg0KIyAqKkxhdGFyIEJlbGFrYW5nKioNCg0KRGFsYW0gZHVuaWEgYmlzbmlzLCAqQ29mZmVlIENoYWluKiBtZXJ1anVrIGtlcGFkYSBqYXJpbmdhbiBiaXNuaXMgeWFuZyB0ZXJkaXJpIGRhcmkgYmViZXJhcGEga2VkYWkga29waSAoKmNvZmZlZSBzaG9wcyopIHlhbmcgZGltaWxpa2kgYXRhdSBkaW9wZXJhc2lrYW4gb2xlaCBzYXR1IHBlcnVzYWhhYW4geWFuZyBzYW1hLiBEYXRhc2V0IHlhbmcgZGlndW5ha2FuIGRhbGFtIGFuYWxpc2lzIGluaSBhZGFsYWggKipDb2ZmZWUgQ2hhaW4gRGF0YXNldHMqKiB5YW5nIG1lcnVwYWthbiBrdW1wdWxhbiBkYXRhIHBlbmp1YWxhbiBkYW4ga2V1YW5nYW4gZGFyaSBiaXNuaXMgcHJvZHVrIGtvcGkgZGFuIHRlaCBkaSBwYXNhciBBbWVyaWthIFNlcmlrYXQgcGFkYSB0YWh1biAyMDEyLTIwMTMuIERhdGFzZXQgaW5pIG1lbmNha3VwIGJlcmJhZ2FpIHZhcmlhYmVsIHlhbmcgbWVuZ2dhbWJhcmthbiBrYXJha3RlcmlzdGlrIHBhc2FyLCBzZXBlcnRpIGtvZGUgYXJlYSwgbGV0YWsgcGFzYXIgKCpjZW50cmFsKiwgKmVhc3QqLCAqc291dGgqLCAqd2VzdCopLCAqc3RhdGUqICgyMCAqc3RhdGUqIGRpIEFtZXJpa2EgU2VyaWthdCksIHVrdXJhbiBwYXNhciAoKm1ham9yIG1hcmtldCogZGFuICpzbWFsbCBtYXJrZXQqKSwgdGlwZSBwYXNhciAoKnJlZ3VsYXIqIGRhbiAqZGVjYWYqKSwgamVuaXMgcHJvZHVrICgqY29mZmVlKiwgKnRlYSosICplc3ByZXNzbyosICpoZXJiYWwgdGVhKiksIGFzYWwgcHJvZHVrICgqYmVhbnMqIGRhbiAqbGVhdmVzKiksIG5hbWEgcHJvZHVrICgqYW1hcmV0dG8qLCAqY29sb21iaWFuKiwgKmRlY2FmIGlyaXNoIGNyZWFtKiwgKmdyZWVuIHRlYSosIGRzYiksIHRhbmdnYWwsIHNlcnRhIG1ldHJpayBrZXVhbmdhbiBiZXJ1cGEgKmJ1ZGdldCBDT0dTKiwgKmJ1ZGdldCBtYXJnYWluKiwgKmJ1ZGdldCBzYWxlcyosICpidWRnZXQgcHJvZml0KiwgKkNPR1MqLCAqaW52ZW50b3J5KiwgKm1hcmdpbiosICptYXJrZXRpbmcqLCAqcHJvZml0KiwgKnNhbGVzKiwgZGFuICp0b3RhbCBleHBlbnNlcyouIERhdGFzZXQgaW5pIG1lbXVuZ2tpbmthbiBhbmFsaXNpcyBwZXJiYW5kaW5nYW4gYW50YXJhIHBlcmVuY2FuYWFuIGRhbiByZWFsaXNhc2kuDQoNCkRhbGFtIGJpc25pcyAqY29mZmVlIGNoYWluKiwgbWVtYWhhbWkgZmFrdG9yLWZha3RvciBwZW5lbnR1ICpQcm9maXQqIChsYWJhKSB5YW5nIGRpaGFzaWxrYW4gbWVydXBha2FuIGhhbCB5YW5nIHBlbnRpbmcgZGFsYW0gcGVuZ2FtYmlsYW4ga2VwdXR1c2FuIHlhbmcgc3RyYXRlZ2lzLiBBZGEgYmFueWFrIGZha3RvciB5YW5nIGRhcGF0IG1lbWVuZ2FydWhpIG5pbGFpICpQcm9maXQqIChsYWJhKSwgZHVhIGRpYW50YXJhbnlhIGFkYWxhaCAqU2FsZXMqIChwZW5qdWFsYW4pIGRhbiAqVG90YWwgRXhwZW5zZXMqICh0b3RhbCBwZW5nZWx1YXJhbikuICpTYWxlcyogbWVydXBha2FuIHZhcmlhbmVsIHlhbmcgbWVuY2VybWlua2FuIGtlbWFtcHVhbiBiaXNuaXMgZGFsYW0gbWVuZ2hhc2lsa2FuIHBlbmRhcGF0YW4sIHNlbWVudGFyYSAqVG90YWwgRXhwZW5zZXMqIG1ld2FraWxpIHNlbHVydWggYmlheWEgb3BlcmFzaW9uYWwgeWFuZyBkaWtlbHVhcmthbiB1bnR1ayBtZW1wZXJ0YWhhbmthbiBiaXNuaXMuIERhbGFtIGFuYWxpc2lzIGluaSwgYWthbiBkaXVrdXIgcGVuZ2FydWggKlNhbGVzKiBkYW4gKlRvdGFsIEV4cGVuc2VzKiB0ZXJoYWRhcCAqUHJvZml0KiB5YW5nIGRpaGFzaWxrYW4gdGlhcCAqU3RhdGUqIGRpIEFtZXJpa2EuIERlbmdhbiBkZW1pa2lhbiwgaGFzaWwgYW5hbGlzaXMgaW5pIGRhcGF0IG1lbWJlcmlrYW4gaW5mb3JtYXNpIHBlbnRpbmcgYmFnaSBtYW5hamVtZW4gZGFsYW0gbWVuZ29wdGltYWxrYW4gc3RyYXRlZ2kgYmlzbmlzLCBzZXBlcnRpIG1lbmluZ2thdGthbiBlZmlzaWVuc2kgb3BlcmFzaW9uYWwgYXRhdSBmb2t1cyBwYWRhIHBlcnR1bWJ1aGFuIHBlbmp1YWxhbi4NCg0KLS0tLS0tLQ0KDQojICoqTWV0b2RlIEFuYWxpc2lzKioNCg0KTWV0b2RlIHlhbmcgZGFwYXQgZGlndW5ha2FuIHVudHVrIGFuYWxpc2lzIGluaSBhZGFsYWggcmVncmVzaSBsaW5lYXIgYmVyZ2FuZGEuIEFuYWxpc2lzIHJlZ3Jlc2kgYmVyZ2FuZGEgbWVydXBha2FuIG1ldG9kZSBzdGF0aXN0aWsgeWFuZyBkaWd1bmFrYW4gdW50dWsgbWVtYWhhbWkgaHVidW5nYW4gYW50YXJhIHNhdHUgdmFyaWFiZWwgZGVwZW5kZW4gZGFuIGR1YSBhdGF1IGxlYmloIHZhcmlhYmVsIGluZGVwZW5kZW4uIFR1anVhbiB1dGFtYSBkYXJpIG1ldG9kZSBpbmkgYWRhbGFoIHVudHVrIG1lbmVudHVrYW4gc2VqYXVoIG1hbmEgdmFyaWFiZWwtdmFyaWFiZWwgaW5kZXBlbmRlbiB0ZXJzZWJ1dCBiZXJwZW5nYXJ1aCB0ZXJoYWRhcCB2YXJpYXNpIHZhcmlhYmVsIGRlcGVuZGVubnlhLiBCZW50dWsgdW11bSBtb2RlbCByZWdyZXNpIGJlcmdhbmRhIGRlbmdhbiBrIHZhcmlhYmVsIGluZGVwZW5kZW4gYWRhbGFoOg0KDQokJCBZID0gXGJldGFfMCArIFxiZXRhXzFYXzEgKyBcYmV0YV8yWF8yICsgLi4uICsgXGJldGFfcFhfcCArIFxlcHNpbG9uJCQNCmRpbWFuYSAkWSQgYWRhbGFoIHZhcmlhYmVsIGRlcGVuZGVuLCAkWF8xLFhfMiwuLi4sWF9uJCBhZGFsYWggdmFyaWFiZWwgaW5kZXBlbmRlbiwgJFxiZXRhXzAsXGJldGFfMSwuLi4sXGJldGFfbiQgYWRhbGFoIHBhcmFtZXRlciByZWdyZXNpLCBkYW4gJFxlcHNpbG9uJCBhZGFsYWggc2VzYXRhbi4NCg0KLS0tLS0tLQ0KDQojICoqRGF0YSoqDQoNCkRhdGEgeWFuZyBkaWd1bmFrYW4gZGFsYW0gYW5hbGlzaXMgaW5pIGRpa2Vsb21wb2trYW4gYmVyZGFzYXJrYW4gKlN0YXRlKiBkaSBBbWVyaWthIFNlcmlrYXQsIGRlbmdhbiB2YXJpYWJlbCBpbmRlcGVuZGVuIHlhbmcgZGlndW5ha2FuIGFkYWxhaCAqU2FsZXMqICQoWF8xKSQgZGFuICpUb3RhbCBFeHBlbnNlcyogJChYXzIpJCwgc2VkYW5na2FuIHZhcmlhYmVsIGRlcGVuZGVuIG55YSBhZGFsYWggKlByb2ZpdCogJChZKSQuDQogDQpgYGB7ciBMaWJyYXJ5IHlhbmcgRGlidXR1aGthbiwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgTWVtdWF0IHBhY2thZ2UgeWFuZyBkaWJ1dHVoa2FuDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkocm1hcmtkb3duKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShjYXIpDQpsaWJyYXJ5KGxtdGVzdCkNCmxpYnJhcnkoZ2dwbG90MikNCmBgYA0KDQpgYGB7ciBJbXBvcnQgRGF0YX0NCiMgTWVuZ2ltcG9ydCBkYXRhc2V0cyBkYXJpIGZpbGUgZXhjZWwNCkNvZmZlZV9DaGFpbl9EYXRhc2V0cyA8LSByZWFkX2V4Y2VsKCJ+L0AgU0lNIDIwMjUvREFUQSBDTSAxLzMuIENNMSAtIENvZmZlZSBDaGFpbiBEYXRhc2V0cy8zLiBDTTEgLSBDb2ZmZWUgQ2hhaW4gRGF0YXNldHMueGxzeCIpDQpgYGANCg0KYGBge3IgRmlsdGVyIERhdGF9DQojIE1lbWJ1YXQgZmlsdGVyIGRhdGEgc2VzdWFpIHZhcmlhYmVsIHlhbmcgZGlidXR1aGthbg0KRGF0YV9GaWx0ZXIgPC0gQ29mZmVlX0NoYWluX0RhdGFzZXRzICU+JQ0KICBncm91cF9ieShTdGF0ZSkgJT4lDQogIHN1bW1hcmlzZSgNCiAgICBZID0gc3VtKFByb2ZpdCwgbmEucm0gPSBUUlVFKSwNCiAgICBYMSA9IHN1bShTYWxlcywgbmEucm0gPSBUUlVFKSwNCiAgICBYMiA9IHN1bShgVG90YWwgRXhwZW5zZXNgLCBuYS5ybSA9IFRSVUUpDQogICkNCnByaW50KERhdGFfRmlsdGVyKQ0KYGBgDQoNCi0tLS0tLS0NCg0KIyAqKkFuYWxpc2lzKioNCiMjIFN0YXRpc3Rpa2EgRGVza3JpcHRpZg0KDQpTdGF0aXN0aWthIGRlc2tyaXB0aWYgbWVydXBha2FuIG1ldG9kZSBhbmFsaXNpcyB5YW5nIGRpZ3VuYWthbiB1bnR1ayBtZXJhbmdrdW0sIG1lbnlhamlrYW4gZGF0YSwgc2VydGEgbWVtYmVyaWthbiBnYW1iYXJhbiB5YW5nIGplbGFzIHRlbnRhbmcga2FyYWt0ZXJpc3Rpa255YS4gQmViZXJhcGEgdWt1cmFuIHN0YXRpc3RpayB5YW5nIHVtdW0gZGlndW5ha2FuIGFkYWxhaCBuaWxhaSBtaW5pbXVuICQoTWluKSQsIG5pbGFpIG1ha3NpbXVtICQoTWF4KSQsIGt1YXJ0aWwgcGVydGFtYSAkKFFfMSkkLCBrdWFydGlsIGtlZHVhIGF0YXUgbWVkaWFuICQoUV8yKSQsIGt1YXJ0aWwga2V0aWdhICQoUV8zKSQsIHNlcnRhIG5pbGFpIHJhdGEtcmF0YSAkKE1lYW4pJC4NCg0KYGBge3IgU3RhdGlzdGlrIERlc2tyaXB0aWZ9DQojIFN0YXRpc3RpayBkZXNrcmlwdGlmIGRhcmkgc2VtdWEgdmFyaWFiZWwgeWFuZyBkaWd1bmFrYW4NCnN1bW1hcnkoRGF0YV9GaWx0ZXIpDQpgYGANCg0KKipJbnRlcnByZXRhc2kqKjoNCkRhcmkgb3V0cHV0IGRpcGVyb2xlaCBpbmZvcm1hc2kgYmFod2EgdmFyaWFiZWwgKlN0YXRlKiBiZXJzaWZhdCBrYXRlZ29yaWthbCBkZW5nYW4ganVtbGFoIDIwIG9ic2VydmFzaS4gU2VjYXJhIHVtdW0sIGtldGlnYSB2YXJpYWJlbCBudW1lcmlrIHlhaXR1ICRZJCwgJFhfMSQsIGRhbiAkWF8yJCBtZW51bmp1a2thbiB2YXJpYXNpIGRhdGEgeWFuZyBiZXNhciBkZW5nYW4gdmFyaWFiZWwgeWFuZyBtZW1pbGlraSByZW50YW5nIHRlcmxlYmFyIGFkYWxhaCAkWF8xJC4gIA0KDQpgYGB7ciBOaWxhaSBUZXJ0aW5nZ2kgVGVyZW5kYWgsIGVjaG89RkFMU0V9DQojIE5pbGFpIE1ha3NpbXVtIGRhbiBNaW5pbXVtIHNldGlhcCBWYXJpYWJlbA0Kc3VtbWFyeV9tYXhtaW4gPC0gZGF0YS5mcmFtZSgNCiAgS2F0ZWdvcmkgPSBjKCJZIE1ha3MiLCAiWSBNaW4iLCAiWDEgTWFrcyIsICJYMSBNaW4iLCAiWDIgTWFrcyIsICJYMiBNaW4iKSwNCiAgU3RhdGUgPSBjKA0KICAgIERhdGFfRmlsdGVyJFN0YXRlW3doaWNoLm1heChEYXRhX0ZpbHRlciRZKV0sDQogICAgRGF0YV9GaWx0ZXIkU3RhdGVbd2hpY2gubWluKERhdGFfRmlsdGVyJFkpXSwNCiAgICBEYXRhX0ZpbHRlciRTdGF0ZVt3aGljaC5tYXgoRGF0YV9GaWx0ZXIkWDEpXSwNCiAgICBEYXRhX0ZpbHRlciRTdGF0ZVt3aGljaC5taW4oRGF0YV9GaWx0ZXIkWDEpXSwNCiAgICBEYXRhX0ZpbHRlciRTdGF0ZVt3aGljaC5tYXgoRGF0YV9GaWx0ZXIkWDIpXSwNCiAgICBEYXRhX0ZpbHRlciRTdGF0ZVt3aGljaC5taW4oRGF0YV9GaWx0ZXIkWDIpXQ0KICApLA0KICBOaWxhaSA9IGMoDQogICAgbWF4KERhdGFfRmlsdGVyJFkpLA0KICAgIG1pbihEYXRhX0ZpbHRlciRZKSwNCiAgICBtYXgoRGF0YV9GaWx0ZXIkWDEpLA0KICAgIG1pbihEYXRhX0ZpbHRlciRYMSksDQogICAgbWF4KERhdGFfRmlsdGVyJFgyKSwNCiAgICBtaW4oRGF0YV9GaWx0ZXIkWDIpDQogICkNCikNCiMgVGFtcGlsa2FuIGhhc2lsDQpwcmludChzdW1tYXJ5X21heG1pbikNCmBgYA0KDQoqKkludGVycHJldGFzaSoqOiBEaWtldGFodWkgdmFyaWFiZWwgJFhfMSQgbWV3YWtpbGkgKlNhbGVzKiwgJFhfMiQgbWV3YWtpbGkgKlRvdGFsIEV4cGVuc2VzKiwgZGFuICRZJCBtZXdha2lsaSAqUHJvZml0Ki4gRGFyaSBvdXRwdXQgJGRhdGEuZnJhbWUkIGRpIGF0YXMsIGRpcGVyb2xlaCBpbmZvcm1hc2kgYmFod2EgKlN0YXRlKiB5YW5nIG1lbWlsaWtpIG5pbGFpICpQcm9maXQqLCAqU2FsZXMqLCBkYW4gKlRvdGFsIEV4cGVuc2VzKiB0ZXJ0aW5nZ2kgYWRhbGFoIENhbGlmb3JuaWEsIGhhbCBpbmkgbWVuYW5kYWkgYWRhbnlhIGtpbmVyamEgYmlzbmlzIHlhbmcga3VhdCBtZXNraSBkZW5nYW4gcGVuZ2VsdWFyYW4gdGluZ2dpLiBEaSBzaXNpIGxhaW4sIE5ldyBNZXhpY28gbWVtaWxpa2kgKlByb2ZpdCogdGVyZW5kYWggbWVza2kgKlNhbGVzKiwgZGFuICpUb3RhbCBFeHBlbnNlcyogbnlhIGJ1a2FuIHlhbmcgcGFsaW5nIHJlbmRhaC4gU2VtZW50YXJhIE5ldyBIYW1wc2hpcmUgYmVyb3BlcmFzaSBkZW5nYW4gKlNhbGVzKiwgZGFuICpUb3RhbCBFeHBlbnNlcyogcGFsaW5nIHJlbmRhaC4NCg0KIyMgU2NhdHRlciBQbG90IHRpYXAgVmFyaWFiZWwNCiMjIyBTY2F0dGVyIFBsb3QgWSB2cyBYMQ0KYGBge3IgU2NhdHRlciBQbG90IDF9DQojIFNjYXR0ZXJwbG90IFkgdnMgWDENCmdncGxvdChEYXRhX0ZpbHRlciwgYWVzKHggPSBYMSwgeSA9IFkpKSArDQogICAgZ2VvbV9wb2ludChjb2xvciA9ICIjMUU1MTI4IikgKyAgICAgICAgICMgbWVuY2lwdGFrYW4gdGl0aWsNCiAgICBnZ3RpdGxlKCJTY2F0dGVycGxvdCBvZiBZIHZzIFgxIikgKw0KICAgIHhsYWIoIlgxIikgKw0KICAgIHlsYWIoIlkiKQ0KYGBgDQoNCioqSW50ZXJwcmV0YXNpKio6IFNjYXR0ZXIgcGxvdCBpbmkgbWVudW5qdWtrYW4gaHVidW5nYW4gYW50YXJhIHZhcmlhYmVsICRZJCAoc3VtYnUgdmVydGlrYWwpIGRhbiAkWF8xJCAoc3VtYnUgaG9yaXpvbnRhbCkuIFBvbGEgeWFuZyBkaWhhc2lsa2FuIG1lbmdpbmRpa2FzaWthbiBhZGFueWEga2VtdW5na2luYW4gaHVidW5nYW4gcG9zaXRpZiBhbnRhcmEgJFkkIGRhbiAkWF8xJCwgZGkgbWFuYSBwZW5pbmdrYXRhbiBuaWxhaSAkWF8xJCBjZW5kZXJ1bmcgZGlpa3V0aSBwZW5pbmdrYXRhbiBuaWxhaSAkWSQsIG1lc2tpcHVuIHRpZGFrIHRlcmxhbHUga3VhdCBrYXJlbmEgc2ViYXJhbiBkYXRhIHlhbmcgY3VrdXAgbGViYXIuDQoNCiMjIyBTY2F0dGVyIFBsb3QgWSB2cyBYMg0KYGBge3IgU2NhdHRlciBQbG90IDJ9DQojIFNjYXR0ZXJwbG90IFkgdnMgWDINCmdncGxvdChEYXRhX0ZpbHRlciwgYWVzKHggPSBYMiwgeSA9IFkpKSArDQogICAgZ2VvbV9wb2ludChjb2xvciA9ICIjMUU1MTI4IikgKyAgICAgICAgICMgbWVuY2lwdGFrYW4gdGl0aWsNCiAgICBnZ3RpdGxlKCJTY2F0dGVycGxvdCBvZiBZIHZzIFgyIikgKw0KICAgIHhsYWIoIlgyIikgKw0KICAgIHlsYWIoIlkiKQ0KYGBgDQoNCioqSW50ZXJwcmV0YXNpKio6IFNjYXR0ZXIgcGxvdCBpbmkgbWVudW5qdWtrYW4gaHVidW5nYW4gYW50YXJhIHZhcmlhYmVsICRZJCAoc3VtYnUgdmVydGlrYWwpIGRhbiAkWF8yJCAoc3VtYnUgaG9yaXpvbnRhbCkuIFBvbGEgeWFuZyBkaWhhc2lsa2FuIG1lbnVuanVra2FuIGtlbXVuZ2tpbmFuIGh1YnVuZ2FuIG5lZ2F0aWYgYW50YXJhICRYXzIkIGRhbiAkWSQsIGRpIG1hbmEgcGVuaW5na2F0YW4gbmlsYWkgJFhfMiQganVzdHJ1IGRpaWt1dGkgb2xlaCBwZW51cnVuYW4gbmlsYWkgJFkkLg0KDQojIyBVamkgQXN1bXNpIEtsYXNpaw0KDQpgYGB7ciBNZW1idWF0IG1vZGVsIHJlZ3Jlc2kgbGluaWVyfQ0KIyBNZW1idWF0IHBlcnNhbWFhbiBtb2RlbCByZWdyZXNpIGxpbmllciBiZXJnYW5kYQ0KbW9kZWwgPC0gbG0oWSB+IFgxK1gyLCBkYXRhPURhdGFfRmlsdGVyKQ0KbW9kZWwNCmBgYA0KDQojIyMgVWppIE5vbi1NdWx0aWtvbGluZWFyaXRhcw0KMS4gSGlwb3Rlc2lzDQoNCiAgICAkSF8wJCA6IFRpZGFrIHRlcmphZGkgZ2VqYWxhIG11bHRpa29saW5lYXJpdGFzDQogICAgDQogICAgJEhfMSQgOiBUZXJqYWRpIGdlamFsYSBtdWx0aWtvbGluZWFyaXRhcw0KICAgIA0KMi4gVGluZ2thdCBTaWduaWZpa2Fuc2kgKCRcYWxwaGEkKSA9ICQ1JCUgPSAkMC4wNSQNCg0KMy4gRGFlcmFoIEtyaXRpcyANCg0KICAgICRIXzAkIGRpdG9sYWsgamlrYSAkVklGID4gMTAkDQogIA0KNC4gU3RhdGlzdGlrIFVqaQ0KDQpgYGB7ciBVamkgTm9uLU11bHRpa29saW5lYXJpdGFzLCB3YXJuaW5nPUZBTFNFfQ0KIyBQbG90IFZJRg0KbmlsYWlfdmlmIDwtIHZpZihtb2RlbCkNCnBsb3QobmlsYWlfdmlmLCB0eXBlID0gImJhciIsIG1haW4gPSAiVklGIFBsb3QiKQ0KDQojIFVqaSBOb24tTXVsdGlrb2xpbmVhcml0YXMNCnZpZihtb2RlbCkNCmBgYA0KDQo1LiBLZXNpbXB1bGFuIA0KDQogICAgS2FyZW5hIGRhcmkgcGVyaGl0dW5nYW4sIGRpcGVyb2xlaCBuaWxhaSAkVklGJCBrZWR1YSB2YXJpYWJlbCAkPCAxMCQsIG1ha2EgJEhfMCQgZ2FnYWwgZGl0b2xhaywgeWFuZyBhcnRpbnlhIG1vZGVsIHRpZGFrIG1lbmdhbGFtaSBnZWphbGEgbXVsdGlrb2xpbmVhcml0YXMuDQoNCiMjIyBVamkgTm9ybWFsaXRhcyBSZXNpZHUNCg0KMS4gSGlwb3Rlc2lzDQoNCiAgICAkSF8wJCA6IFJlc2lkdSBkYXRhIGJlcmRpc3RyaWJ1c2kgbm9ybWFsDQogICAgDQogICAgJEhfMSQgOiBSZXNpZHUgZGF0YSB0aWRhayBiZXJkaXN0cmlidXNpIG5vcm1hbA0KDQoyLiBUaW5na2F0IFNpZ25pZmlrYW5zaSAoJFxhbHBoYSQpID0gJDUkJSA9ICQwLjA1JA0KDQozLiBEYWVyYWggS3JpdGlzIA0KDQogICAgJEhfMCQgZGl0b2xhayBqaWthICRwLXZhbHVlIDwgXGFscGhhID0gMC4wNSQNCg0KNC4gU3RhdGlzdGlrIFVqaQ0KDQpgYGB7ciBVamkgTm9ybWFsaXRhcyBSZXNpZHVhbH0NCiMgUS1RIFBsb3QNCnFxbm9ybShyZXNpZChtb2RlbCkpDQpxcWxpbmUocmVzaWQobW9kZWwpKQ0KDQojIFVqaSBOb3JtYWxpdGFzIFJlc2lkdQ0Kc2hhcGlyby50ZXN0KHJlc2lkKG1vZGVsKSkNCmBgYA0KDQo1LiBLZXNpbXB1bGFuIA0KDQogICAgS2FyZW5hIGppa2EgZGlsaWhhdCBwbG90IG5vcm1hbCBRLVEgbnlhLCBkYXBhdCB0ZXJsaWhhdCBiYWh3YSB0aXRpay10aXRpayBtZW55ZWJhciBkaSBzZWtpdGFyIGdyYWZpayBub3JtYWwgbWVuZ2lrdXRpIGdhcmlzIGRpYWdvbmFsIGRhbiBuaWxhaSAkcC12YWx1ZSA9IDAuOTc3NCA+IFxhbHBoYSA9IDAuMDUkIG1ha2EgJEhfMCQgZ2FnYWwgZGl0b2xhaywgeWFuZyBhcnRpbnlhIHJlc2lkdSBkYXRhIGJlcmRpc3RyaWJ1c2kgbm9ybWFsLg0KDQojIyMgVWppIE5vbi1BdXRva29yZWxhc2kNCg0KMS4gSGlwb3Rlc2lzDQoNCiAgICAkSF8wJCA6IFRpZGFrIGFkYSBhdXRva29yZWxhc2kgYW50YXIgcmVzaWR1IGRhdGENCg0KICAgICRIXzEkIDogVGVyamFkaSBhdXRva29yZWxhc2kgYW50YXIgcmVzaWR1IGRhdGENCg0KMi4gVGluZ2thdCBTaWduaWZpa2Fuc2kgJChcYWxwaGEpJCA9ICQ1JCUgPSAkMC4wNSQNCg0KMy4gRGFlcmFoIEtyaXRpcyANCg0KICAgICRIXzAkIGRpdG9sYWsgamlrYSAkcC12YWx1ZSA8IFxhbHBoYSA9IDAuMDUkDQoNCjQuIFN0YXRpc3RpayBVamkNCg0KYGBge3IgVWppIE5vbi1BdXRva29yZWxhc2l9DQojIFVqaSBBdXRva29yZWxhc2kNCmR3dGVzdChtb2RlbCkNCmBgYA0KDQo1LiBLZXNpbXB1bGFuIA0KDQogICAgS2FyZW5hIGRhcmkgcGVyaGl0dW5nYW4sIGRpcGVyb2xlaCBuaWxhaSAkcC12YWx1ZSA9IDAuMTA0NiA+IFxhbHBoYSA9IDAuMDUkIG1ha2EgJEhfMCQgZ2FnYWwgZGl0b2xhaywgeWFuZyBhcnRpbnlhIHRpZGFrIGFkYSBhdXRva29yZWxhc2kgYW50YXIgcmVzaWR1IGRhdGENCg0KIyMjIFVqaSBIb21vc2tlZGFzdGlzaXRhcw0KDQoxLiBIaXBvdGVzaXMNCg0KICAgICRIXzAkIDogVGVyZGFwYXQgaG9tb3NrZWRhc3Rpc2l0YXMgZGFsYW0gcmVzaWR1IGRhdGEgDQoNCiAgICAkSF8xJCA6IFRpZGFrIHRlcmRhcGF0IGhvbW9za2VkYXN0aXNpdGFzICBkYWxhbSByZXNpZHUgZGF0YQ0KDQoyLiBUaW5na2F0IFNpZ25pZmlrYW5zaSAoJFxhbHBoYSQpID0gJDUkJSA9ICQwLjA1JA0KDQozLiBEYWVyYWggS3JpdGlzIA0KDQogICAgJEhfMCQgZGl0b2xhayBqaWthICRwLXZhbHVlIDwgXGFscGhhID0gMC4wNSQNCg0KNC4gU3RhdGlzdGlrIFVqaQ0KDQpgYGB7ciBVamkgSG9tb3NrZWRhc3Rpc2l0YXN9DQojIFBsb3QNCnBsb3QobW9kZWwsIHdoaWNoID0gMSkNCiMgVWppIEhvbW9za2VkYXN0aXNpdGFzDQpicHRlc3QobW9kZWwpDQpgYGANCg0KNS4gS2VzaW1wdWxhbiANCg0KICAgIEthcmVuYSBkYXJpIHBlcmhpdHVuZ2FuLCBkaXBlcm9sZWggbmlsYWkgJHAtdmFsdWUgPSAwLjMzODcgPiBcYWxwaGEgPSAwLjA1JCBtYWthICRIXzAkIGdhZ2FsIGRpdG9sYWssIHlhbmcgYXJ0aW55YSB0ZXJkYXBhdCBob21vc2tlZGFzdGlzaXRhcyBkYWxhbSByZXNpZHUgZGF0YS4gDQoNCiMjIEFuYWxpc2lzIFJlZ3Jlc2kgTGluZWFyIEJlcmdhbmRhDQoNCmBgYHtyIE1lbWJ1YXQgcGVyc2FtYWFuIG1vZGVsIHJlZ3Jlc2kgbGluaWVyIGJlcmdhbmRhfQ0KIyBNZW1idWF0IHBlcnNhbWFhbiBtb2RlbCByZWdyZXNpIGxpbmllciBiZXJnYW5kYQ0KbW9kZWwgPC0gbG0oWSB+IFgxK1gyLCBkYXRhPURhdGFfRmlsdGVyKQ0KbW9kZWwNCnN1bW1hcnkobW9kZWwpDQpgYGANCg0KQmVyZGFzYXJrYW4gaGFzaWwgYW5hbGlzaXMgcmVncmVzaSBkaSBhdGFzLCBkaXBlcm9sZWggcGVyc2FtYWFuIHJlZ3Jlc2kgdW50dWsgbW9kZWwgaW5pIDoNCiQkIFkgPSA1Njk2LjkzMzgwICsgMC43NTM0M1hfMSAtIDIuMDU1NDBYXzIkJA0KKipJbnRlcnByZXRhc2kgbW9kZWwqKjoNCg0KMS4gSmlrYSB2YXJpYWJlbCAqU2FsZXMqICQoWF8xKSQgZGFuICpUb3RhbCBFeHBlbnNlcyogJChYXzIpJCBkaWFzdW1zaWthbiBiZXJuaWxhaSBub2wsIG1ha2EgbmlsYWkgKlByb2ZpdCogJChZKSQgYWthbiBiZXJuaWxhaSA1Njk2LDkzMzgwLg0KMi4gU2V0aWFwIGtlbmFpa2FuIHNhdHUgbmlsYWkgKlNhbGVzKiAkKFhfMSkkLCBha2FuIG1lbmFpa2thbiBuaWxhaSAqUHJvZml0KiAkKFkpJCBzZWJlc2FyIDAsNzUzNDMuDQozLiBTZXRpYXAga2VuYWlrYW4gc2F0dSBuaWxhaSAqVG90YWwgRXhwZW5zZXMqICQoWF8yKSQgYWthbiBtZW51cnVua2FuIG5pbGFpICpQcm9maXQqICQoWSkkIHNlYmVzYXIgMiwwNTU0MC4NCg0KU2VsYWluIGl0dSwgZGFyaSBoYXNpbCAkc3VtbWFyeShtb2RlbCkkIGp1Z2EgZGlwZXJvbGVoIGJhaHdhIG5pbGFpIEtvZWZpc2llbiBEZXRlcm1pbmFzaSAoKkFkanVzdGVkIFItU3F1YXJlZCopIGJlcm5pbGFpIDk2LDQzJS4gSGFsIGluaSBtZW51bmp1a2thbiBiYWh3YSB2YXJpYWJlbCBpbmRlcGVuZGVuICQoWCkkIGRhbGFtIG1vZGVsIHJlZ3Jlc2kgaW5pIG1hbXB1IG1lbmplbGFza2FuIHZhcmlhbnNpIGRhcmkgdmFyaWFiZWwgZGVwZW5kZW4gJChZKSQgc2ViZXNhciA5Niw0MyUsIHNlZGFuZ2thbiBzaXNhbnlhIHlhaXR1IDMsNTclIGRpamVsYXNrYW4gb2xlaCB2YXJpYWJlbCBsYWluIHlhbmcgdGlkYWsgZGlndW5ha2FuIGRhbGFtIG1vZGVsLiANCg0KIyMgVWppIEhpcG90ZXNpcyANCiMjIyBVamkgU2ltdWx0YW4gKEYpDQoxLiBIaXBvdGVzaXMNCg0KICAgICRIXzAkIDogVmFyaWFiZWwgaW5kZXBlbmRlbiBzZWNhcmEgc2ltdWx0YW4gdGlkYWsgYmVycGVuZ2FydWggc2lnbmlmaWthbiB0ZXJoYWRhcCB2YXJpYWJlbCBkZXBlbmRlbg0KDQogICAgJEhfMSQgOiBWYXJpYWJlbCBpbmRlcGVuZGVuIHNlY2FyYSBzaW11bHRhbiBiZXJwZW5nYXJ1aCBzaWduaWZpa2FuIHRlcmhhZGFwIHZhcmlhYmVsIGRlcGVuZGVubnlhDQoNCjIuIFRpbmdrYXQgU2lnbmlmaWthbnNpICgkXGFscGhhJCkgPSAkNSQlID0gJDAuMDUkDQoNCjMuIERhZXJhaCBLcml0aXMgDQoNCiAgICAkSF8wJCBkaXRvbGFrIGppa2EgJHAtdmFsdWUgPCBcYWxwaGEgPSAwLjA1JA0KDQo0LiBTdGF0aXN0aWsgVWppDQoNCmBgYHtyIFVqaSBGfQ0KIyBVamkgRg0Kc3VtbWFyeShtb2RlbCkNCmBgYA0KDQo1LiBLZXNpbXB1bGFuIA0KDQogICAgS2FyZW5hIGRhcmkgcGVyaGl0dW5nYW4sIGRpcGVyb2xlaCBuaWxhaSAkcC12YWx1ZSA9IDEuOTI4KjEwXnstMTN9IDwgXGFscGhhID0gMC4wNSQgbWFrYSAkSF8wJCBkaXRvbGFrLCB5YW5nIGFydGlueWEgc2VtdWEgdmFyaWFiZWwgaW5kZXBlbmRlbiBiZXJwZW5nYXJ1aCBzaWduaWZpa2FuIHRlcmhhZGFwIHZhcmlhYmVsIGRlcGVuZGVuIHNlY2FyYSBzaW11bHRhbi4NCg0KIyMjIFVqaSBQYXJzaWFsIChUKQ0KMS4gSGlwb3Rlc2lzDQoNCiAgICAtIFVudHVrICRYXzEkID0gKlNhbGVzKiANCg0KICAgICAgJEhfMCQgOiAqU2FsZXMqIHRpZGFrIGJlcnBlbmdhcnVoIHNpZ25pZmlrYW4gdGVyaGFkYXAgKlByb2ZpdCoNCg0KICAgICAgJEhfMSQgOiAqU2FsZXMqIGJlcnBlbmdhcnVoIHNpZ25pZmlrYW4gdGVyaGFkYXAgKlByb2ZpdCoNCg0KICAgIC0gVW50dWsgJFhfMiQgPSAqVG90YWwgRXhwZW5zZXMqIA0KDQogICAgICAkSF8wJCA6ICpUb3RhbCBFeHBlbnNlcyogdGlkYWsgYmVycGVuZ2FydWggc2lnbmlmaWthbiB0ZXJoYWRhcCAqUHJvZml0Kg0KDQogICAgICAkSF8xJCA6ICpUb3RhbCBFeHBlbnNlcyogYmVycGVuZ2FydWggc2lnbmlmaWthbiB0ZXJoYWRhcCAqUHJvZml0Kg0KDQoyLiBUaW5na2F0IFNpZ25pZmlrYW5zaSAoJFxhbHBoYSQpID0gJDUkJSA9ICQwLjA1JA0KDQozLiBEYWVyYWggS3JpdGlzIA0KDQogICAgJEhfMCQgZGl0b2xhayBqaWthICRwLXZhbHVlIDwgXGFscGhhID0gMC4wNSQNCg0KNC4gU3RhdGlzdGlrIFVqaQ0KDQpgYGB7ciBVamkgVH0NCiMgVWppIFQNCnN1bW1hcnkobW9kZWwpDQpgYGANCg0KNS4gS2VzaW1wdWxhbiANCg0KICAtIFVudHVrICRYXzEkID0gKlNhbGVzKiANCg0KICAgIEthcmVuYSBkYXJpICBwZXJoaXR1bmdhbiwgZGlwZXJvbGVoIG5pbGFpICRwLXZhbHVlID0gMy4wMyoxMF57LTEyfSA8IFxhbHBoYSA9IDAuMDUkIG1ha2EgJEhfMCQgZGl0b2xhaywgeWFuZyBhcnRpbnlhICpTYWxlcyogbWVtaWxpa2kgcGVuZ2FydWggeWFuZyBzaWduaWZpa2FuIHRlcmhhZGFwICpQcm9maXQqIHNlY2FyYSBwYXJzaWFsLiANCg0KICAtIFVudHVrICRYXzIkID0gKlRvdGFsIEV4cGVuc2VzKiANCg0KICAgIEthcmVuYSBkYXJpICBwZXJoaXR1bmdhbiwgZGlwZXJvbGVoIG5pbGFpICRwLXZhbHVlID0gMS43NCoxMF57LTh9IDwgXGFscGhhID0gMC4wNSQgbWFrYSAkSF8wJCBkaXRvbGFrLCB5YW5nIGFydGlueWEgKlRvdGFsIEV4cGVuc2VzKiBtZW1pbGlraSBwZW5nYXJ1aCB5YW5nIHNpZ25pZmlrYW4gdGVyaGFkYXAgKlByb2ZpdCogc2VjYXJhIHBhcnNpYWwuDQoNCi0tLS0tLS0NCg0KIyAqKktlc2ltcHVsYW4gSGFzaWwgQW5hbGlzaXMqKg0KDQpCZXJkYXNhcmthbiBhbmFsaXNpcyB5YW5nIHN1ZGFoIGRpbGFrdWthbiBkYXBhdCBkaXNpbXB1bGthbiBiYWh3YSB2YXJpYWJlbCBpbmRlcGVuZGVuICRYXzEkIHlhaXR1ICpTYWxlcyogZGFuICRYXzIkIHlhaXR1ICpUb3RhbCBFeHBlbnNlcyogYmVycGVuZ2FydWggc2VjYXJhIHNpZ25maWthbiB0ZXJoYWRhcCB2YXJpYWJlbCBkZXBlbmRlbiBZIHlhaXR1ICpQcm9maXQqIHNlY2FyYSBiZXJzYW1hLXNhbWEgYXRhdSBzaW11bHRhbiBkYW4gc2VjYXJhIHBhcnNpYWwgZGVuZ2FuIHBlcnNhbWFhbiBtb2RlbCByZWdyZXNpIGxpbmVhciBiZXJnYW5kYW55YSBhZGFsYWggJFkgPSA1Njk2LjkzMzgwICsgMC43NTM0M1hfMSAtIDIuMDU1NDBYXzIkLiBNb2RlbCByZWdyZXNpIGluaSBtZW1pbGlraSBuaWxhaSBrb2VmaXNpZW4gZGV0ZXJtaW5hc2kgc2ViZXNhciA5Niw0MyUgeWFuZyBiZXJhcnRpIHZhcmlhYmVsIGluZGVwZW5kZW4gJChYKSQgZGFsYW0gbW9kZWwgcmVncmVzaSBpbmkgbWFtcHUgbWVuamVsYXNrYW4gdmFyaWFuc2kgZGFyaSB2YXJpYWJlbCBkZXBlbmRlbiBzZWJlc2FyIDk2LDQzJSwgc2VkYW5na2FuIHNpc2FueWEgeWFpdHUgc2ViZXNhciAzLDU3JSBkaWplbGFza2FuIG9sZWggdmFyaWFiZWwgbGFpbiB5YW5nIHRpZGFrIGRpZ3VuYWthbiBkYWxhbSBtb2RlbC4gU2VsYWluIGl0dSwgYmVyZGFzYXJrYW4gdWppIGFzdW1zaSBrbGFzaWssIHNlbXVhIHVqaSBhc3Vtc2kgeWFrbmksIHVqaSBub24tbXVsdGlrb2xpbmVhcml0YXMsIHVqaSBub3JtYWxpdGFzIHJlc2lkdSwgdWppIG5vbi1hdXRva29yZWxhc2ksIGRhbiB1amkgaG9tb3NrZWRhc3Rpc2l0YXMgdGVycGVudWhpIHNlaGluZ2dhIG1vZGVsIHJlZ3Jlc2kgaW5pIGxheWFrIHVudHVrIGRpZ3VuYWthbi4NCg0KQW5hbGlzaXMgaW5pIG1lbnVuanVra2FuIGJhaHdhICpQcm9maXQqIChsYWJhKSBwZXJ1c2FoYWFuICpjb2ZmZWUgY2hhaW4qIHNhbmdhdCBkaXBlbmdhcnVoaSBvbGVoIHBlbmp1YWxhbiAoKlNhbGVzKikgZGFuIHBlbmdlbHVhcmFuICgqVG90YWwgRXhwZW5zZXMqKSwgZGkgbWFuYSBrb250cm9sIGJpYXlhIG1lbWVnYW5nIHBlcmFuIGxlYmloIGtyaXRpcyBkaWJhbmRpbmdrYW4gcGVuaW5na2F0YW4gcGVuanVhbGFuLiBNb2RlbCByZWdyZXNpIHlhbmcgZGloYXNpbGthbiBtZW1pbGlraSBuaWxhaSBrb2VmaXNpZW4gZGV0ZXJtaW5hc2kgeWFuZyBjdWt1cCB0aW5nZ2ksIHNlaGluZ2dhIHBlcnVzYWhhYW4gZGFwYXQgbWVuZ2d1bmFrYW5ueWEgdW50dWsgbWVuZ2FtYmlsIGtlcHV0dXNhbiBzdHJhdGVnaXMgc2VwZXJ0aSBvcHRpbWFsaXNhc2kgYmlheWEsIGFsb2thc2kgc3VtYmVyIGRheWEsIGRhbiBldmFsdWFzaSBraW5lcmphIHBlciAqU3RhdGUqIGRpIEFtZXJpa2EgU2VyaWthdC4gS3VuY2kgdXRhbWFueWEgYWRhbGFoIG1lbnllaW1iYW5na2FuIHBlcnR1bWJ1aGFuIHBlbmp1YWxhbiBkZW5nYW4gZWZpc2llbnNpIGJpYXlhLCBzYW1iaWwgbWVtcGVydGltYmFuZ2thbiBmYWt0b3IgZWtzdGVybmFsIGxhaW4geWFuZyBtdW5na2luIGJlcmRhbXBhayBrZWNpbCBuYW11biBzaWduaWZpa2FuLiBEZW5nYW4gcGVuZGVrYXRhbiBpbmksIHBlcnVzYWhhYW4gZGFwYXQgbWVuaW5na2F0a2FuIHByb2ZpdCBzZWNhcmEgbGViaWggZWZla3RpZiBkYW4gdGVydWt1ci4NCg0KLS0tLS0tLQ0KDQojICoqRGFmdGFyIFB1c3Rha2EqKg0KDQpQdXJiYSwgUi4gTC4gKDIwMjIsIE1laSAyMikuIFBlbmVyYXBhbiByZWdyZXNpIGJlcmdhbmRhIGRlbmdhbiBSIFN0dWRpby4gUlB1YnMuDQoNClNob2xpaGFoLCBTLk0uLCBBZGl0aXlhLCBOLlkuLCBFdmFuaSwgRS5TLiwgJiBNYWdoZmlyb2gsIFMuICgyMDIzKS4gS29uc2VwIHVqaSBhc3Vtc2kga2xhc2lrIHBhZGEgcmVncmVzaSBsaW5pZXIgYmVyZ2FuZGEuIEp1cm5hbCBSaXNldCBBa3VudGFuc2kgU29lZGlybWFuIChKUkFTKSwgMigyKSwgWzEwMi0xMTBdLg==