Tujuan

  1. Memahami prinsip-prinsip fundamental dalam Perancangan Percobaan (Design of Experiment/DoE).

  2. Menerapkan berbagai jenis rancangan percobaan, yaitu:

    • Rancangan Acak Lengkap (RAL)

    • Rancangan Acak Kelompok Lengkap (RAKL)

    • Rancangan Bujur Sangkar Latin (RBSL)

  3. Melakukan Analisis Sidik Ragam (ANOVA) untuk percobaan dengan satu faktor.

  4. Melaksanakan Uji Lanjut untuk menguji perbedaan antar perlakuan, seperti uji LSD, Tukey, Duncan, serta analisis Kontras Polinomial Ortogonal untuk tren.

  5. Mengimplementasikan seluruh analisis tersebut secara praktis menggunakan perangkat lunak R.

Definisi Rancangan Percobaan (Design of Experiment / DoE)

Rancangan Percobaan (DoE) adalah metodologi sistematis untuk merencanakan, melaksanakan, menganalisis, dan menginterpretasikan data dari percobaan terkontrol dengan tujuan memperoleh informasi yang valid dan efisien mengenai hubungan sebab-akibat antara variabel respon dan faktor-faktor yang mempengaruhinya.

Karakteristik Utama DoE

  • Sistematis dan Terstruktur: Mengikuti prosedur yang terencana
  • Efisien: Memaksimalkan informasi dengan sumber daya minimal
  • Valid: Hasil dapat dipercaya dan tidak bias
  • Reproduktif: Dapat diulang dengan hasil konsisten

Tujuan

  • Mengidentifikasi faktor yang signifikan mempengaruhi respon
  • Menentukan kondisi optimal proses
  • Memahami interaksi antar faktor
  • Membuat model matematis hubungan variabel

Rancangan Acak Lengkap (RAL)

Rancangan Acak Lengkap (RAL) atau Completely Randomized Design (CRD) adalah rancangan percobaan paling sederhana dimana seluruh unit percobaan dianggap homogen dan perlakuan dialokasikan secara acak tanpa pembatasan.

Ciri-Ciri RAL

  • Homogenitas tinggi antar unit percobaan
  • Pengacakan penuh tanpa pembatasan
  • Tidak ada pengelompokan/blok
  • Pelaksanaan dan analisis sederhana

Model Matematis

\[ Y_{ij} = \mu + \tau_i + \varepsilon_{ij} \]

Keterangan:

- \(Y_{ij}\): Respon ke-j pada perlakuan ke-i
- \(\mu\): Rata-rata umum
- \(\tau_i\): Efek perlakuan ke-i
- \(\varepsilon_{ij}\): Galat percobaan

Kondisi Penggunaan

  • Unit percobaan benar-benar homogen
  • Jumlah unit percobaan kecil
  • Lingkungan terkendali dengan baik

Rancangan Acak Kelompok Lengkap (RAKL)

Rancangan Acak Kelompok Lengkap (RAKL) atau Randomized Complete Block Design (RCBD) digunakan ketika unit percobaan tidak sepenuhnya homogen, sehingga perlu pengelompokan (blok) untuk mengontrol variasi yang diketahui.

Ciri-Ciri RAKL

  • Ada pengelompokan (blok) yang homogen
  • Pengacakan dilakukan di dalam blok
  • Mengontrol variasi antar blok
  • Setiap perlakuan muncul satu kali per blok

Model Matematis

\[ Y_{ij} = \mu + \tau_i + \beta_j + \varepsilon_{ij} \]

Keterangan:

- \(Y_{ij}\): Respon pada perlakuan i dan blok j
- \(\mu\): Rata-rata umum
- \(\tau_i\): Efek perlakuan ke-i
- \(\beta_j\): Efek blok ke-j
- \(\varepsilon_{ij}\): Galat percobaan

Kondisi Penggunaan

  • Terdapat sumber variasi yang diketahui
  • Unit tidak homogen
  • Ingin meningkatkan presisi percobaan

Rancangan Bujur Sangkar Latin (RBSL)

Rancangan Bujur Sangkar Latin (RBSL) atau Latin Square Design (LSD) digunakan untuk mengontrol dua sumber variasi secara simultan dengan struktur baris dan kolom.

Ciri-Ciri RBSL

  • Dua arah pengelompokan (baris dan kolom)
  • Setiap perlakuan muncul satu kali di setiap baris dan kolom
  • Efisiensi tinggi dan seimbang
  • Jumlah baris = jumlah kolom = jumlah perlakuan

Model Matematis

\[ Y_{ijk} = \mu + \tau_i + \beta_j + \gamma_k + \varepsilon_{ijk} \]

Keterangan:

- \(Y_{ijk}\): Respon pada perlakuan i, baris j, kolom k
- \(\mu\): Rata-rata umum
- \(\tau_i\): Efek perlakuan ke-i
- \(\beta_j\): Efek baris ke-j
- \(\gamma_k\): Efek kolom ke-k
- \(\varepsilon_{ijk}\): Galat percobaan

Kondisi Penggunaan

  • Terdapat dua sumber variasi yang ingin dikontrol
  • Jumlah perlakuan kecil (4–8)
  • Interaksi antar faktor diabaikan

Kelebihan dan Kekurangan

Perbandingan RAL, RAKL, dan RBSL

Aspek RAL (CRD) RAKL (RCBD) RBSL (LSD)
Tingkat Homogenitas Sangat tinggi Sedang (ada blok) Rendah (dua arah variasi)
Kompleksitas Desain Sederhana Sedang Tinggi
Kontrol Variasi Tidak ada 1 sumber variasi 2 sumber variasi
Efisiensi Rendah jika tidak homogen Baik Sangat tinggi
Analisis Statistik Sederhana (ANOVA satu arah) Sedikit kompleks (dua arah) Kompleks (tiga arah)
Cocok Untuk Kondisi homogen Percobaan lapangan Kondisi kompleks dengan 2 faktor luar
Jumlah Perlakuan Bebas Sama tiap blok Sama dengan jumlah baris dan kolom

Tabel Kelebihan dan Kekurangan Tiap Rancangan

Rancangan Kelebihan Kekurangan
RAL

- Sederhana dan mudah dianalisis

- Derajat bebas galat maksimal

- Fleksibel jumlah ulangan

- Tidak efisien jika heterogen

  • Presisi rendah

- Tidak bisa kontrol variasi luar

RAKL

- Mengurangi galat melalui pengelompokan

- Meningkatkan presisi

- Cocok untuk variasi tanah

- Kehilangan derajat bebas blok

  • Analisis lebih kompleks

  • Tidak efisien jika blok kurang tepat

RBSL

- Kontrol dua sumber variasi

- Efisiensi tinggi

- Desain seimbang

- Harus persegi (baris=kolom)

- Tidak boleh ada interaksi

- Sulit diterapkan untuk perlakuan banyak


Jenis-Jenis Uji Lanjut (Post-Hoc Tests)

Uji lanjut dilakukan setelah ANOVA menunjukkan adanya perbedaan signifikan antar perlakuan, untuk mengetahui perlakuan mana yang berbeda satu sama lain.


Uji LSD (Least Significant Difference)

Definisi:
Uji perbandingan berganda paling sederhana untuk mendeteksi perbedaan antar dua rata-rata perlakuan.

Rumus: \[ LSD = t_{(\alpha/2, db_{galat})} \times \sqrt{\frac{2 \times KTG}{r}} \]

Karakteristik:

- Sensitif terhadap perbedaan kecil
- Risiko Type I error tinggi
- Cocok untuk perbandingan yang telah direncanakan
- Sesuai untuk jumlah perlakuan sedikit


Uji Tukey (Tukey’s HSD)

Definisi:
Uji rentang berganda yang mengontrol experimentwise error rate secara ketat.

Rumus: \[ HSD = q_{(\alpha, p, db_{galat})} \times \sqrt{\frac{KTG}{r}} \]

Karakteristik: - Lebih konservatif daripada LSD
- Mengontrol tingkat kesalahan keseluruhan
- Cocok untuk semua perbandingan berpasangan
- Aman untuk jumlah perlakuan banyak


Uji Duncan (Duncan’s Multiple Range Test)

Definisi:
Uji rentang berganda yang menyesuaikan tingkat signifikansi berdasarkan jarak antar rata-rata yang diurutkan.

Karakteristik: - Lebih powerful dari Tukey
- Berdasarkan protected LSD principle
- Cocok untuk screening awal
- Risiko kesalahan meningkat dengan banyak perlakuan


Uji Kontras Polinomial Ortogonal

Definisi:
Teknik untuk menganalisis tren respon terhadap perlakuan kuantitatif dengan mempartisi sum of squares perlakuan menjadi komponen polinomial.

Komponen Polinomial: - Linear
- Kuadratik
- Kubik
- dan seterusnya hingga derajat (p–1)

Kegunaan: - Mengidentifikasi pola respon
- Membuat model dosis–respon
- Efisien dalam penggunaan derajat bebas


Uji Lainnya

Uji Karakteristik Utama Kegunaan Utama
Bonferroni Sangat konservatif, modifikasi uji-t Cocok untuk sedikit perbandingan
Scheffé Paling konservatif, fleksibel Cocok untuk kontras tidak terencana
Dunnett Fokus pada perbandingan terhadap kontrol Powerful untuk control comparison

Pemilihan Uji Lanjut yang Tepat

Kondisi Penelitian Uji Lanjut yang Disarankan
Penelitian eksploratori Duncan atau LSD
Penelitian konfirmatori Tukey atau Bonferroni
Perbandingan dengan kontrol Dunnett
Analisis tren kuantitatif Kontras polinomial ortogonal

Percobaan Faktor Tunggal dalam R

Studi Kasus: Pengaruh Jenis Kemasan terhadap Masa Simpan Fillet Ikan Nila

RANCANGAN ACAK LENGKAP (RAL)

Latar Belakang Studi Kasus

Sebuah perusahaan pengolahan ikan ingin mengevaluasi pengaruh 4 jenis kemasan berbeda (A, B, C, D) terhadap masa simpan fillet ikan nila pada suhu chilling (4°C). Parameter yang diukur adalah Total Plate Count (TPC) setelah 7 hari penyimpanan (log CFU/g). Setiap perlakuan diulang 5 kali.

Data Percobaan

# Data untuk RAL
set.seed(123)
data_ral <- data.frame(
  Kemasan = rep(c("A", "B", "C", "D"), each = 5),
  TPC = c(
    # Kemasan A: 5.2, 5.4, 5.1, 5.3, 5.5
    rnorm(5, mean = 5.3, sd = 0.15),
    # Kemasan B: 4.8, 4.9, 4.7, 4.6, 5.0
    rnorm(5, mean = 4.8, sd = 0.15),
    # Kemasan C: 3.5, 3.6, 3.4, 3.7, 3.3
    rnorm(5, mean = 3.5, sd = 0.15),
    # Kemasan D: 6.1, 6.0, 6.2, 5.9, 6.3
    rnorm(5, mean = 6.1, sd = 0.15)
  )
)

data_ral

Analisis ANOVA RAL

# Analisis ANOVA
anova_ral <- aov(TPC ~ Kemasan, data = data_ral)
summary(anova_ral)
##             Df Sum Sq Mean Sq F value   Pr(>F)    
## Kemasan      3 17.497   5.832     235 1.94e-13 ***
## Residuals   16  0.397   0.025                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Hasil ANOVA menunjukkan bahwa jenis kemasan berpengaruh sangat signifikan terhadap nilai TPC fillet ikan nila (p < 0.001). Artinya, perbedaan jenis kemasan menyebabkan perbedaan nyata pada masa simpan ikan.

# Uji Asumsi
plot(anova_ral)

# Uji Normalitas
shapiro.test(residuals(anova_ral))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(anova_ral)
## W = 0.9752, p-value = 0.8585
# Uji Homogenitas Varian
library(car)
## Warning: package 'car' was built under R version 4.5.1
## Loading required package: carData
## Warning: package 'carData' was built under R version 4.5.1
leveneTest(TPC ~ Kemasan, data = data_ral)
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.

Uji Lanjut RAL

# Uji LSD
library(agricolae)
## Warning: package 'agricolae' was built under R version 4.5.2
lsd_ral <- LSD.test(anova_ral, "Kemasan", alpha = 0.05)
print(lsd_ral)
## $statistics
##      MSerror Df     Mean       CV  t.value       LSD
##   0.02481421 16 4.946244 3.184745 2.119905 0.2112013
## 
## $parameters
##         test p.ajusted  name.t ntr alpha
##   Fisher-LSD      none Kemasan   4  0.05
## 
## $means
##        TPC        std r         se      LCL      UCL      Min      Max      Q25
## A 5.329036 0.12165328 5 0.07044744 5.179694 5.478377 5.215929 5.533806 5.265473
## B 4.793352 0.17452344 5 0.07044744 4.644010 4.942694 4.610241 5.057260 4.696972
## C 3.546185 0.09591948 5 0.07044744 3.396843 3.695527 3.416624 3.683612 3.516602
## D 6.116401 0.21165619 5 0.07044744 5.967059 6.265743 5.805007 6.368037 6.029081
##        Q50      Q75
## A 5.310576 5.319393
## B 4.733151 4.869137
## C 3.553972 3.560116
## D 6.174678 6.205203
## 
## $comparison
## NULL
## 
## $groups
##        TPC groups
## D 6.116401      a
## A 5.329036      b
## B 4.793352      c
## C 3.546185      d
## 
## attr(,"class")
## [1] "group"
# Uji Tukey (HSD)
tukey_ral <- HSD.test(anova_ral, "Kemasan", alpha = 0.05)
print(tukey_ral)
## $statistics
##      MSerror Df     Mean       CV       MSD
##   0.02481421 16 4.946244 3.184745 0.2850369
## 
## $parameters
##    test  name.t ntr StudentizedRange alpha
##   Tukey Kemasan   4         4.046093  0.05
## 
## $means
##        TPC        std r         se      Min      Max      Q25      Q50      Q75
## A 5.329036 0.12165328 5 0.07044744 5.215929 5.533806 5.265473 5.310576 5.319393
## B 4.793352 0.17452344 5 0.07044744 4.610241 5.057260 4.696972 4.733151 4.869137
## C 3.546185 0.09591948 5 0.07044744 3.416624 3.683612 3.516602 3.553972 3.560116
## D 6.116401 0.21165619 5 0.07044744 5.805007 6.368037 6.029081 6.174678 6.205203
## 
## $comparison
## NULL
## 
## $groups
##        TPC groups
## D 6.116401      a
## A 5.329036      b
## B 4.793352      c
## C 3.546185      d
## 
## attr(,"class")
## [1] "group"
# Uji Duncan
duncan_ral <- duncan.test(anova_ral, "Kemasan", alpha = 0.05)
print(duncan_ral)
## $statistics
##      MSerror Df     Mean       CV
##   0.02481421 16 4.946244 3.184745
## 
## $parameters
##     test  name.t ntr alpha
##   Duncan Kemasan   4  0.05
## 
## $duncan
##      Table CriticalRange
## 2 2.997999     0.2112013
## 3 3.143802     0.2214728
## 4 3.234945     0.2278936
## 
## $means
##        TPC        std r         se      Min      Max      Q25      Q50      Q75
## A 5.329036 0.12165328 5 0.07044744 5.215929 5.533806 5.265473 5.310576 5.319393
## B 4.793352 0.17452344 5 0.07044744 4.610241 5.057260 4.696972 4.733151 4.869137
## C 3.546185 0.09591948 5 0.07044744 3.416624 3.683612 3.516602 3.553972 3.560116
## D 6.116401 0.21165619 5 0.07044744 5.805007 6.368037 6.029081 6.174678 6.205203
## 
## $comparison
## NULL
## 
## $groups
##        TPC groups
## D 6.116401      a
## A 5.329036      b
## B 4.793352      c
## C 3.546185      d
## 
## attr(,"class")
## [1] "group"
# Uji Kontras Polinomial Ortogonal
data_ral$Kemasan <- as.factor(data_ral$Kemasan)
contrasts(data_ral$Kemasan) <- contr.poly(4)
anova_poly <- aov(TPC ~ Kemasan, data = data_ral)
summary(anova_poly, split = list(Kemasan = list(linear = 1, quadratic = 2, cubic = 3)))
##                      Df Sum Sq Mean Sq F value   Pr(>F)    
## Kemasan               3 17.497   5.832  235.04 1.94e-13 ***
##   Kemasan: linear     1  0.311   0.311   12.52  0.00273 ** 
##   Kemasan: quadratic  1 12.058  12.058  485.94 2.12e-13 ***
##   Kemasan: cubic      1  5.128   5.128  206.64 1.44e-10 ***
## Residuals            16  0.397   0.025                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.5.1
## Warning: package 'ggplot2' was built under R version 4.5.1
## Warning: package 'tibble' was built under R version 4.5.1
## Warning: package 'tidyr' was built under R version 4.5.1
## Warning: package 'readr' was built under R version 4.5.1
## Warning: package 'purrr' was built under R version 4.5.1
## Warning: package 'dplyr' was built under R version 4.5.1
## Warning: package 'forcats' was built under R version 4.5.1
## Warning: package 'lubridate' was built under R version 4.5.1
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.2
## ✔ ggplot2   3.5.2     ✔ tibble    3.3.0
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
## ✔ purrr     1.1.0     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ✖ dplyr::recode() masks car::recode()
## ✖ purrr::some()   masks car::some()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# Fungsi untuk visualisasi hasil
visualisasi_hasil <- function(data, respon, perlakuan, judul) {
  library(ggplot2)
  
  # Boxplot
  p1 <- ggplot(data, aes(x = {{perlakuan}}, y = {{respon}})) +
    geom_boxplot(fill = "lightblue") +
    geom_point(position = position_jitter(0.2), alpha = 0.6) +
    labs(title = paste("Boxplot", judul),
         x = "Perlakuan", y = "Respon") +
    theme_minimal()
  
  # Bar plot dengan standar error
  summary_data <- data %>%
    group_by({{perlakuan}}) %>%
    summarise(mean = mean({{respon}}),
              se = sd({{respon}})/sqrt(n()))
  
  p2 <- ggplot(summary_data, aes(x = {{perlakuan}}, y = mean)) +
    geom_col(fill = "steelblue", alpha = 0.7) +
    geom_errorbar(aes(ymin = mean - se, ymax = mean + se), width = 0.2) +
    labs(title = paste("Rata-rata dengan SE", judul),
         x = "Perlakuan", y = "Rata-rata Respon") +
    theme_minimal()
  
  print(p1)
  print(p2)
}

visualisasi_hasil(data_ral, TPC, Kemasan, "RAL - Masa Simpan Ikan Nila")

RANCANGAN ACAK KELOMPOK LENGKAP (RAK)

Latar Belakang Studi Kasus

Penelitian pengaruh 4 jenis treatment anti-browning (P, Q, R, S) terhadap warna fillet ikan kakap selama penyimpanan. Parameter diukur adalah nilai L* (lightness) setelah 5 hari. Percobaan dilakukan dalam 5 blok (hari berbeda) untuk mengontrol variasi batch ikan.

Data Percobaan

# Data untuk RAK
set.seed(456)
data_rak <- data.frame(
  Treatment = rep(c("P", "Q", "R", "S"), each = 5),
  Blok = rep(1:5, 4),
  Lightness = c(
    # Treatment P: 45, 46, 44, 47, 45
    rnorm(5, mean = 45.5, sd = 1.0),
    # Treatment Q: 52, 51, 53, 50, 52
    rnorm(5, mean = 51.5, sd = 1.0),
    # Treatment R: 48, 47, 49, 46, 48
    rnorm(5, mean = 47.5, sd = 1.0),
    # Treatment S: 55, 54, 56, 53, 55
    rnorm(5, mean = 54.5, sd = 1.0)
  )
)

# Konversi ke faktor
data_rak$Treatment <- as.factor(data_rak$Treatment)
data_rak$Blok <- as.factor(data_rak$Blok)
data_rak

Analisis ANOVA RAK

# Analisis ANOVA dengan blok
anova_rak <- aov(Lightness ~ Treatment + Blok, data = data_rak)
summary(anova_rak)
##             Df Sum Sq Mean Sq F value   Pr(>F)    
## Treatment    3  346.5  115.50 131.147 1.95e-09 ***
## Blok         4    4.8    1.20   1.367    0.302    
## Residuals   12   10.6    0.88                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Uji Asumsi
plot(anova_rak)

# Uji Normalitas
shapiro.test(residuals(anova_rak))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(anova_rak)
## W = 0.93909, p-value = 0.2305

Uji Lanjut RAK

# Uji LSD untuk RAK
lsd_rak <- LSD.test(anova_rak, "Treatment", alpha = 0.05)
print(lsd_rak)
## $statistics
##     MSerror Df     Mean      CV  t.value     LSD
##   0.8806661 12 50.23302 1.86817 2.178813 1.29317
## 
## $parameters
##         test p.ajusted    name.t ntr alpha
##   Fisher-LSD      none Treatment   4  0.05
## 
## $means
##   Lightness       std r        se      LCL      UCL      Min      Max      Q25
## P  45.09518 1.0551031 5 0.4196823 44.18077 46.00959 44.11111 46.30087 44.15648
## Q  51.93954 0.5055053 5 0.4196823 51.02513 52.85395 51.17594 52.50735 51.75055
## R  47.81943 1.3996871 5 0.4196823 46.90502 48.73384 46.05919 49.15393 46.58419
## S  56.07794 0.7199784 5 0.4196823 55.16353 56.99235 54.88748 56.78003 56.03788
##        Q50      Q75
## P 44.78564 46.12178
## Q 52.07323 52.19064
## R 48.48873 48.81110
## S 56.23694 56.44736
## 
## $comparison
## NULL
## 
## $groups
##   Lightness groups
## S  56.07794      a
## Q  51.93954      b
## R  47.81943      c
## P  45.09518      d
## 
## attr(,"class")
## [1] "group"
# Uji Tukey untuk RAK
tukey_rak <- HSD.test(anova_rak, "Treatment", alpha = 0.05)
print(tukey_rak)
## $statistics
##     MSerror Df     Mean      CV      MSD
##   0.8806661 12 50.23302 1.86817 1.762103
## 
## $parameters
##    test    name.t ntr StudentizedRange alpha
##   Tukey Treatment   4          4.19866  0.05
## 
## $means
##   Lightness       std r        se      Min      Max      Q25      Q50      Q75
## P  45.09518 1.0551031 5 0.4196823 44.11111 46.30087 44.15648 44.78564 46.12178
## Q  51.93954 0.5055053 5 0.4196823 51.17594 52.50735 51.75055 52.07323 52.19064
## R  47.81943 1.3996871 5 0.4196823 46.05919 49.15393 46.58419 48.48873 48.81110
## S  56.07794 0.7199784 5 0.4196823 54.88748 56.78003 56.03788 56.23694 56.44736
## 
## $comparison
## NULL
## 
## $groups
##   Lightness groups
## S  56.07794      a
## Q  51.93954      b
## R  47.81943      c
## P  45.09518      d
## 
## attr(,"class")
## [1] "group"
# Uji Duncan untuk RAK
duncan_rak <- duncan.test(anova_rak, "Treatment", alpha = 0.05)
print(duncan_rak)
## $statistics
##     MSerror Df     Mean      CV
##   0.8806661 12 50.23302 1.86817
## 
## $parameters
##     test    name.t ntr alpha
##   Duncan Treatment   4  0.05
## 
## $duncan
##      Table CriticalRange
## 2 3.081307      1.293170
## 3 3.225244      1.353578
## 4 3.312453      1.390178
## 
## $means
##   Lightness       std r        se      Min      Max      Q25      Q50      Q75
## P  45.09518 1.0551031 5 0.4196823 44.11111 46.30087 44.15648 44.78564 46.12178
## Q  51.93954 0.5055053 5 0.4196823 51.17594 52.50735 51.75055 52.07323 52.19064
## R  47.81943 1.3996871 5 0.4196823 46.05919 49.15393 46.58419 48.48873 48.81110
## S  56.07794 0.7199784 5 0.4196823 54.88748 56.78003 56.03788 56.23694 56.44736
## 
## $comparison
## NULL
## 
## $groups
##   Lightness groups
## S  56.07794      a
## Q  51.93954      b
## R  47.81943      c
## P  45.09518      d
## 
## attr(,"class")
## [1] "group"
# Kontras Polinomial Ortogonal
contrasts(data_rak$Treatment) <- contr.poly(4)
anova_rak_poly <- aov(Lightness ~ Treatment + Blok, data = data_rak)
summary(anova_rak_poly, split = list(Treatment = list(linear = 1, quadratic = 2, cubic = 3)))
##                        Df Sum Sq Mean Sq F value   Pr(>F)    
## Treatment               3  346.5  115.50 131.147 1.95e-09 ***
##   Treatment: linear     1  207.8  207.77 235.919 2.96e-09 ***
##   Treatment: quadratic  1    2.5    2.50   2.838    0.118    
##   Treatment: cubic      1  136.2  136.23 154.684 3.24e-08 ***
## Blok                    4    4.8    1.20   1.367    0.302    
## Residuals              12   10.6    0.88                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
visualisasi_hasil(data_rak, Lightness, Treatment, "RAK - Warna Fillet Kakap")

RANCANGAN BUJUR SANGKAR LATIN (RBSL)

Latar Belakang Studi Kasus

Penelitian pengaruh 4 suhu penyimpanan berbeda (10°C, 15°C, 20°C, 25°C) terhadap TVB (Total Volatile Base) fillet ikan bandeng. Dikontrol dua arah: batch ikan (baris) dan waktu pengukuran (kolom).

Data Percobaan

# Data untuk RBSL
set.seed(789)
data_rbsl <- data.frame(
  Suhu = c("10C", "20C", "15C", "25C", 
           "15C", "10C", "25C", "20C",
           "25C", "15C", "20C", "10C", 
           "20C", "25C", "10C", "15C"),
  Baris = rep(1:4, each = 4),
  Kolom = rep(1:4, 4),
  TVB = c(
    # Data TVB (mgN/100g) untuk setiap kombinasi
    12.5, 18.3, 15.2, 22.1,
    14.8, 11.9, 21.5, 17.6,
    20.8, 16.1, 19.2, 13.4,
    18.9, 23.7, 14.1, 16.9
  )
)

# Konversi ke faktor
data_rbsl$Suhu <- as.factor(data_rbsl$Suhu)
data_rbsl$Baris <- as.factor(data_rbsl$Baris)
data_rbsl$Kolom <- as.factor(data_rbsl$Kolom)
data_rbsl

Analisis ANOVA RBSL

# Analisis ANOVA RBSL
anova_rbsl <- aov(TVB ~ Suhu + Baris + Kolom, data = data_rbsl)
summary(anova_rbsl)
##             Df Sum Sq Mean Sq F value   Pr(>F)    
## Suhu         3 179.49   59.83 196.704 2.22e-06 ***
## Baris        3   8.05    2.68   8.825   0.0128 *  
## Kolom        3   1.69    0.56   1.849   0.2389    
## Residuals    6   1.83    0.30                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Uji Asumsi
plot(anova_rbsl)

# Uji Normalitas
shapiro.test(residuals(anova_rbsl))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(anova_rbsl)
## W = 0.95219, p-value = 0.5252
# Uji Homogenitas Varian
leveneTest(TVB ~ Suhu, data = data_rbsl)

Uji Lanjut RBSL

# Uji LSD untuk RBSL
lsd_rbsl <- LSD.test(anova_rbsl, "Suhu", alpha = 0.05)
print(lsd_rbsl)
## $statistics
##     MSerror Df    Mean       CV  t.value       LSD
##   0.3041667  6 17.3125 3.185635 2.446912 0.9542433
## 
## $parameters
##         test p.ajusted name.t ntr alpha
##   Fisher-LSD      none   Suhu   4  0.05
## 
## $means
##        TVB       std r        se      LCL      UCL  Min  Max    Q25   Q50
## 10C 12.975 0.9708244 4 0.2757565 12.30025 13.64975 11.9 14.1 12.350 12.95
## 15C 15.750 0.9398581 4 0.2757565 15.07525 16.42475 14.8 16.9 15.100 15.65
## 20C 18.500 0.7071068 4 0.2757565 17.82525 19.17475 17.6 19.2 18.125 18.60
## 25C 22.025 1.2365948 4 0.2757565 21.35025 22.69975 20.8 23.7 21.325 21.80
##        Q75
## 10C 13.575
## 15C 16.300
## 20C 18.975
## 25C 22.500
## 
## $comparison
## NULL
## 
## $groups
##        TVB groups
## 25C 22.025      a
## 20C 18.500      b
## 15C 15.750      c
## 10C 12.975      d
## 
## attr(,"class")
## [1] "group"
# Uji Tukey untuk RBSL
tukey_rbsl <- HSD.test(anova_rbsl, "Suhu", alpha = 0.05)
print(tukey_rbsl)
## $statistics
##     MSerror Df    Mean       CV      MSD
##   0.3041667  6 17.3125 3.185635 1.349993
## 
## $parameters
##    test name.t ntr StudentizedRange alpha
##   Tukey   Suhu   4         4.895599  0.05
## 
## $means
##        TVB       std r        se  Min  Max    Q25   Q50    Q75
## 10C 12.975 0.9708244 4 0.2757565 11.9 14.1 12.350 12.95 13.575
## 15C 15.750 0.9398581 4 0.2757565 14.8 16.9 15.100 15.65 16.300
## 20C 18.500 0.7071068 4 0.2757565 17.6 19.2 18.125 18.60 18.975
## 25C 22.025 1.2365948 4 0.2757565 20.8 23.7 21.325 21.80 22.500
## 
## $comparison
## NULL
## 
## $groups
##        TVB groups
## 25C 22.025      a
## 20C 18.500      b
## 15C 15.750      c
## 10C 12.975      d
## 
## attr(,"class")
## [1] "group"
# Uji Duncan untuk RBSL
duncan_rbsl <- duncan.test(anova_rbsl, "Suhu", alpha = 0.05)
print(duncan_rbsl)
## $statistics
##     MSerror Df    Mean       CV
##   0.3041667  6 17.3125 3.185635
## 
## $parameters
##     test name.t ntr alpha
##   Duncan   Suhu   4  0.05
## 
## $duncan
##      Table CriticalRange
## 2 3.460456     0.9542433
## 3 3.586498     0.9890002
## 4 3.648934     1.0062174
## 
## $means
##        TVB       std r        se  Min  Max    Q25   Q50    Q75
## 10C 12.975 0.9708244 4 0.2757565 11.9 14.1 12.350 12.95 13.575
## 15C 15.750 0.9398581 4 0.2757565 14.8 16.9 15.100 15.65 16.300
## 20C 18.500 0.7071068 4 0.2757565 17.6 19.2 18.125 18.60 18.975
## 25C 22.025 1.2365948 4 0.2757565 20.8 23.7 21.325 21.80 22.500
## 
## $comparison
## NULL
## 
## $groups
##        TVB groups
## 25C 22.025      a
## 20C 18.500      b
## 15C 15.750      c
## 10C 12.975      d
## 
## attr(,"class")
## [1] "group"
# Kontras Polinomial Ortogonal (suhu sebagai faktor kuantitatif)
data_rbsl$Suhu_num <- as.numeric(gsub("C", "", data_rbsl$Suhu))
contrasts(data_rbsl$Suhu) <- contr.poly(4)
anova_rbsl_poly <- aov(TVB ~ Suhu + Baris + Kolom, data = data_rbsl)
summary(anova_rbsl_poly, split = list(Suhu = list(linear = 1, quadratic = 2, cubic = 3)))
##                   Df Sum Sq Mean Sq F value   Pr(>F)    
## Suhu               3 179.49   59.83 196.704 2.22e-06 ***
##   Suhu: linear     1 178.80  178.80 587.842 3.24e-07 ***
##   Suhu: quadratic  1   0.56    0.56   1.849   0.2227    
##   Suhu: cubic      1   0.13    0.13   0.421   0.5405    
## Baris              3   8.05    2.68   8.825   0.0128 *  
## Kolom              3   1.69    0.56   1.849   0.2389    
## Residuals          6   1.83    0.30                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
visualisasi_hasil(data_rbsl, TVB, Suhu, "RBSL - TVB Ikan Bandeng")

Percobaan Dua Faktor dalam R

Studi Kasus: Pengaruh Suhu Penyimpanan dan Jenis Kemasan terhadap Kualitas Ikan

RANCANGAN ACAK LENGKAP (RAL) FAKTORIAL

Latar Belakang Studi Kasus

Penelitian pengaruh kombinasi suhu penyimpanan (4°C, 10°C) dan jenis kemasan (Vakum, MAP, Styrofoam) terhadap pH fillet ikan nila setelah 7 hari penyimpanan.Data Percobaan

# Data untuk RAL Faktorial
set.seed(123)
data_ral_2faktor <- data.frame(
  Suhu = rep(rep(c("4C", "10C"), each = 3), 5),
  Kemasan = rep(rep(c("Vakum", "MAP", "Styrofoam"), 2), 5),
  pH = c(
    # Suhu 4°C
    rnorm(5, mean = 6.2, sd = 0.1),  # Vakum
    rnorm(5, mean = 6.4, sd = 0.1),  # MAP
    rnorm(5, mean = 6.8, sd = 0.1),  # Styrofoam
    # Suhu 10°C
    rnorm(5, mean = 6.6, sd = 0.1),  # Vakum
    rnorm(5, mean = 6.9, sd = 0.1),  # MAP
    rnorm(5, mean = 7.4, sd = 0.1)   # Styrofoam
  )
)

# Konversi ke faktor
data_ral_2faktor$Suhu <- as.factor(data_ral_2faktor$Suhu)
data_ral_2faktor$Kemasan <- as.factor(data_ral_2faktor$Kemasan)
data_ral_2faktor

Analisis ANOVA Dua Faktor RAL

# Analisis ANOVA dengan interaksi
anova_ral_2faktor <- aov(pH ~ Suhu * Kemasan, data = data_ral_2faktor)
summary(anova_ral_2faktor)
##              Df Sum Sq Mean Sq F value Pr(>F)
## Suhu          1  0.130 0.12999   0.742  0.398
## Kemasan       2  0.091 0.04537   0.259  0.774
## Suhu:Kemasan  2  0.007 0.00351   0.020  0.980
## Residuals    24  4.206 0.17526
# Uji Asumsi
plot(anova_ral_2faktor)

# Uji Normalitas
shapiro.test(residuals(anova_ral_2faktor))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(anova_ral_2faktor)
## W = 0.93531, p-value = 0.06803
# Uji Homogenitas Varian
library(car)
leveneTest(pH ~ Suhu * Kemasan, data = data_ral_2faktor)
# Uji Interaksi Signifikan - Simple Effect Analysis
library(emmeans)
## Warning: package 'emmeans' was built under R version 4.5.1
## Welcome to emmeans.
## Caution: You lose important information if you filter this package's results.
## See '? untidy'
# Simple effects analysis
simple_effects <- emmeans(anova_ral_2faktor, ~ Kemasan | Suhu)
pairs(simple_effects, adjust = "tukey")
## Suhu = 10C:
##  contrast          estimate    SE df t.ratio p.value
##  MAP - Styrofoam    -0.0589 0.265 24  -0.223  0.9731
##  MAP - Vakum         0.0468 0.265 24   0.177  0.9829
##  Styrofoam - Vakum   0.1057 0.265 24   0.399  0.9162
## 
## Suhu = 4C:
##  contrast          estimate    SE df t.ratio p.value
##  MAP - Styrofoam    -0.1326 0.265 24  -0.501  0.8716
##  MAP - Vakum         0.0216 0.265 24   0.081  0.9963
##  Styrofoam - Vakum   0.1542 0.265 24   0.582  0.8308
## 
## P value adjustment: tukey method for comparing a family of 3 estimates
# Atau menggunakan LSD untuk setiap level suhu
# Untuk Suhu 4°C
data_4C <- subset(data_ral_2faktor, Suhu == "4C")
anova_4C <- aov(pH ~ Kemasan, data = data_4C)
lsd_4C <- LSD.test(anova_4C, "Kemasan", alpha = 0.05)
print(lsd_4C)
## $statistics
##     MSerror Df    Mean       CV  t.value      LSD
##   0.1625811 12 6.64613 6.066891 2.178813 0.555629
## 
## $parameters
##         test p.ajusted  name.t ntr alpha
##   Fisher-LSD      none Kemasan   3  0.05
## 
## $means
##                 pH       std r        se      LCL      UCL      Min      Max
## MAP       6.609119 0.4273459 5 0.1803225 6.216230 7.002008 6.176982 7.231331
## Styrofoam 6.741720 0.4665358 5 0.1803225 6.348830 7.134609 6.331315 7.483779
## Vakum     6.587551 0.2957417 5 0.1803225 6.194662 6.980440 6.143952 6.840077
##                Q25      Q50      Q75
## MAP       6.273494 6.552721 6.811068
## Styrofoam 6.355871 6.744416 6.793218
## Vakum     6.446092 6.670136 6.837496
## 
## $comparison
## NULL
## 
## $groups
##                 pH groups
## Styrofoam 6.741720      a
## MAP       6.609119      a
## Vakum     6.587551      a
## 
## attr(,"class")
## [1] "group"
# Untuk Suhu 10°C
data_10C <- subset(data_ral_2faktor, Suhu == "10C")
anova_10C <- aov(pH ~ Kemasan, data = data_10C)
lsd_10C <- LSD.test(anova_10C, "Kemasan", alpha = 0.05)
print(lsd_10C)
## $statistics
##     MSerror Df     Mean       CV  t.value       LSD
##   0.1879426 12 6.777783 6.396244 2.178813 0.5973963
## 
## $parameters
##         test p.ajusted  name.t ntr alpha
##   Fisher-LSD      none Kemasan   3  0.05
## 
## $means
##                 pH       std r        se      LCL      UCL      Min      Max
## MAP       6.773742 0.3921534 5 0.1938776 6.351319 7.196165 6.212929 7.286186
## Styrofoam 6.832664 0.4279086 5 0.1938776 6.410241 7.255087 6.403338 7.525381
## Vakum     6.726943 0.4763798 5 0.1938776 6.304520 7.149366 6.207051 7.415337
##                Q25      Q50      Q75
## MAP       6.649785 6.797400 6.922408
## Styrofoam 6.571506 6.827111 6.835981
## Vakum     6.355434 6.778691 6.878203
## 
## $comparison
## NULL
## 
## $groups
##                 pH groups
## Styrofoam 6.832664      a
## MAP       6.773742      a
## Vakum     6.726943      a
## 
## attr(,"class")
## [1] "group"
# Uji Tukey untuk interaksi
interaction_means <- emmeans(anova_ral_2faktor, ~ Suhu:Kemasan)
tukey_interaction <- pairs(interaction_means, adjust = "tukey")
print(tukey_interaction)
##  contrast                     estimate    SE df t.ratio p.value
##  10C MAP - 4C MAP               0.1646 0.265 24   0.622  0.9883
##  10C MAP - 10C Styrofoam       -0.0589 0.265 24  -0.223  0.9999
##  10C MAP - 4C Styrofoam         0.0320 0.265 24   0.121  1.0000
##  10C MAP - 10C Vakum            0.0468 0.265 24   0.177  1.0000
##  10C MAP - 4C Vakum             0.1862 0.265 24   0.703  0.9797
##  4C MAP - 10C Styrofoam        -0.2235 0.265 24  -0.844  0.9559
##  4C MAP - 4C Styrofoam         -0.1326 0.265 24  -0.501  0.9957
##  4C MAP - 10C Vakum            -0.1178 0.265 24  -0.445  0.9975
##  4C MAP - 4C Vakum              0.0216 0.265 24   0.081  1.0000
##  10C Styrofoam - 4C Styrofoam   0.0909 0.265 24   0.343  0.9993
##  10C Styrofoam - 10C Vakum      0.1057 0.265 24   0.399  0.9985
##  10C Styrofoam - 4C Vakum       0.2451 0.265 24   0.926  0.9359
##  4C Styrofoam - 10C Vakum       0.0148 0.265 24   0.056  1.0000
##  4C Styrofoam - 4C Vakum        0.1542 0.265 24   0.582  0.9913
##  10C Vakum - 4C Vakum           0.1394 0.265 24   0.526  0.9945
## 
## P value adjustment: tukey method for comparing a family of 6 estimates
# Fungsi visualisasi interaksi
visualisasi_interaksi <- function(data, respon, faktor1, faktor2, judul) {
  library(ggplot2)
  library(dplyr)
  
  # Interaction plot
  interaction_data <- data %>%
    group_by({{faktor1}}, {{faktor2}}) %>%
    summarise(mean_respon = mean({{respon}}),
              se = sd({{respon}})/sqrt(n()))
  
  p1 <- ggplot(interaction_data, 
               aes(x = {{faktor1}}, y = mean_respon, 
                   color = {{faktor2}}, group = {{faktor2}})) +
    geom_line(size = 1) +
    geom_point(size = 2) +
    geom_errorbar(aes(ymin = mean_respon - se, ymax = mean_respon + se), 
                  width = 0.1) +
    labs(title = paste("Plot Interaksi", judul),
         x = deparse(substitute(faktor1)),
         y = "Rata-rata Respon",
         color = deparse(substitute(faktor2))) +
    theme_minimal()
  
  # Heatmap interaksi
  p2 <- ggplot(interaction_data, 
               aes(x = {{faktor1}}, y = {{faktor2}}, fill = mean_respon)) +
    geom_tile() +
    scale_fill_gradient(low = "blue", high = "red") +
    labs(title = paste("Heatmap Interaksi", judul),
         x = deparse(substitute(faktor1)),
         y = deparse(substitute(faktor2)),
         fill = "Rata-rata") +
    theme_minimal()
  
  print(p1)
  print(p2)
}

visualisasi_interaksi(data_ral_2faktor, pH, Suhu, Kemasan, "RAL - pH Ikan Nila")
## `summarise()` has grouped output by 'Suhu'. You can override using the
## `.groups` argument.
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

RANCANGAN ACAK KELOMPOK LENGKAP (RAK) FAKTORIAL

Latar Belakang Studi Kasus

Pengaruh konsentrasi garam (5%, 10%, 15%) dan jenis ikan (Nila, Patin, Lele) terhadap kadar air produk ikan asin. Percobaan dilakukan dalam 4 blok (batch pembuatan berbeda).

# Data untuk RAK Faktorial
set.seed(456)
data_rak_2faktor <- data.frame(
  Blok = rep(1:4, each = 9),
  Garam = rep(rep(c("5%", "10%", "15%"), each = 3), 4),
  Jenis_Ikan = rep(c("Nila", "Patin", "Lele"), 12),
  Kadar_Air = c(
    # Blok 1
    rnorm(3, mean = 45, sd = 1.5),  # 5% - Nila, Patin, Lele
    rnorm(3, mean = 40, sd = 1.5),  # 10% - Nila, Patin, Lele
    rnorm(3, mean = 35, sd = 1.5),  # 15% - Nila, Patin, Lele
    # Blok 2
    rnorm(3, mean = 46, sd = 1.5),
    rnorm(3, mean = 41, sd = 1.5),
    rnorm(3, mean = 36, sd = 1.5),
    # Blok 3
    rnorm(3, mean = 44, sd = 1.5),
    rnorm(3, mean = 39, sd = 1.5),
    rnorm(3, mean = 34, sd = 1.5),
    # Blok 4
    rnorm(3, mean = 45, sd = 1.5),
    rnorm(3, mean = 40, sd = 1.5),
    rnorm(3, mean = 35, sd = 1.5)
  )
)

# Konversi ke faktor
data_rak_2faktor$Blok <- as.factor(data_rak_2faktor$Blok)
data_rak_2faktor$Garam <- as.factor(data_rak_2faktor$Garam)
data_rak_2faktor$Jenis_Ikan <- as.factor(data_rak_2faktor$Jenis_Ikan)
data_rak_2faktor

Analisis ANOVA Dua Faktor RAK

# Analisis ANOVA dengan blok dan interaksi
anova_rak_2faktor <- aov(Kadar_Air ~ Garam * Jenis_Ikan + Blok, data = data_rak_2faktor)
summary(anova_rak_2faktor)
##                  Df Sum Sq Mean Sq F value   Pr(>F)    
## Garam             2  559.1  279.55  96.992 3.17e-12 ***
## Jenis_Ikan        2    2.6    1.32   0.458  0.63825    
## Blok              3   41.5   13.82   4.795  0.00934 ** 
## Garam:Jenis_Ikan  4    0.6    0.16   0.055  0.99406    
## Residuals        24   69.2    2.88                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Uji Asumsi
plot(anova_rak_2faktor)

# Uji Normalitas
shapiro.test(residuals(anova_rak_2faktor))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(anova_rak_2faktor)
## W = 0.98519, p-value = 0.9013

Uji Lanjut RAK Dua Faktor

# Analisis simple effects menggunakan emmeans
library(emmeans)

# Simple effects untuk setiap level garam
simple_garam <- emmeans(anova_rak_2faktor, ~ Jenis_Ikan | Garam)
tukey_garam <- pairs(simple_garam, adjust = "tukey")
print(tukey_garam)
## Garam = 10%:
##  contrast     estimate  SE df t.ratio p.value
##  Lele - Nila   -0.3410 1.2 24  -0.284  0.9566
##  Lele - Patin  -0.9279 1.2 24  -0.773  0.7228
##  Nila - Patin  -0.5870 1.2 24  -0.489  0.8772
## 
## Garam = 15%:
##  contrast     estimate  SE df t.ratio p.value
##  Lele - Nila   -0.0565 1.2 24  -0.047  0.9988
##  Lele - Patin  -0.2043 1.2 24  -0.170  0.9842
##  Nila - Patin  -0.1478 1.2 24  -0.123  0.9917
## 
## Garam = 5%:
##  contrast     estimate  SE df t.ratio p.value
##  Lele - Nila   -0.2375 1.2 24  -0.198  0.9787
##  Lele - Patin  -0.8176 1.2 24  -0.681  0.7766
##  Nila - Patin  -0.5801 1.2 24  -0.483  0.8798
## 
## Results are averaged over the levels of: Blok 
## P value adjustment: tukey method for comparing a family of 3 estimates
# Simple effects untuk setiap jenis ikan
simple_ikan <- emmeans(anova_rak_2faktor, ~ Garam | Jenis_Ikan)
tukey_ikan <- pairs(simple_ikan, adjust = "tukey")
print(tukey_ikan)
## Jenis_Ikan = Lele:
##  contrast  estimate  SE df t.ratio p.value
##  10% - 15%     2.64 1.2 24   2.196  0.0923
##  10% - 5%     -6.54 1.2 24  -5.447  <.0001
##  15% - 5%     -9.18 1.2 24  -7.643  <.0001
## 
## Jenis_Ikan = Nila:
##  contrast  estimate  SE df t.ratio p.value
##  10% - 15%     2.92 1.2 24   2.433  0.0572
##  10% - 5%     -6.44 1.2 24  -5.361  <.0001
##  15% - 5%     -9.36 1.2 24  -7.794  <.0001
## 
## Jenis_Ikan = Patin:
##  contrast  estimate  SE df t.ratio p.value
##  10% - 15%     3.36 1.2 24   2.799  0.0260
##  10% - 5%     -6.43 1.2 24  -5.355  <.0001
##  15% - 5%     -9.79 1.2 24  -8.154  <.0001
## 
## Results are averaged over the levels of: Blok 
## P value adjustment: tukey method for comparing a family of 3 estimates
# Uji LSD manual untuk interaksi signifikan
# Untuk Garam 5%
data_5p <- subset(data_rak_2faktor, Garam == "5%")
anova_5p <- aov(Kadar_Air ~ Jenis_Ikan + Blok, data = data_5p)
lsd_5p <- LSD.test(anova_5p, "Jenis_Ikan", alpha = 0.05)
print(lsd_5p)
## $statistics
##    MSerror Df     Mean       CV  t.value      LSD
##   4.625794  6 45.55722 4.721021 2.446912 3.721315
## 
## $parameters
##         test p.ajusted     name.t ntr alpha
##   Fisher-LSD      none Jenis_Ikan   3  0.05
## 
## $means
##       Kadar_Air      std r       se      LCL      UCL      Min      Max
## Lele   45.20550 2.285900 4 1.075383 42.57413 47.83686 43.28809 47.96665
## Nila   45.44301 2.068385 4 1.075383 42.81164 48.07438 42.98472 47.42005
## Patin  46.02315 1.078377 4 1.075383 43.39178 48.65451 44.62628 47.22681
##            Q25      Q50      Q75
## Lele  43.34647 44.78362 46.64265
## Nila  44.12675 45.68364 46.99990
## Patin 45.60607 46.11974 46.53682
## 
## $comparison
## NULL
## 
## $groups
##       Kadar_Air groups
## Patin  46.02315      a
## Nila   45.44301      a
## Lele   45.20550      a
## 
## attr(,"class")
## [1] "group"
# Uji Duncan untuk interaksi
duncan_interaction <- duncan.test(anova_rak_2faktor, 
                                 c("Garam", "Jenis_Ikan"), 
                                 alpha = 0.05)
print(duncan_interaction)
## $statistics
##    MSerror Df     Mean       CV
##   2.882218 24 40.25472 4.217418
## 
## $parameters
##     test           name.t ntr alpha
##   Duncan Garam:Jenis_Ikan   9  0.05
## 
## $duncan
##      Table CriticalRange
## 2 2.918793      2.477632
## 3 3.065610      2.602258
## 4 3.159874      2.682274
## 5 3.226454      2.738792
## 6 3.276155      2.780980
## 7 3.314602      2.813616
## 8 3.345082      2.839489
## 9 3.369669      2.860360
## 
## $means
##           Kadar_Air      std r        se      Min      Max      Q25      Q50
## 10%:Lele   38.66667 1.145530 4 0.8488549 37.00163 39.51391 38.37950 39.07557
## 10%:Nila   39.00765 2.580934 4 0.8488549 36.42404 42.48309 37.54351 38.56174
## 10%:Patin  39.59461 2.784594 4 0.8488549 36.85975 43.48089 38.41129 39.01889
## 15%:Lele   36.03036 1.899546 4 0.8488549 33.30572 37.72348 35.70970 36.54613
## 15%:Nila   36.08687 2.084094 4 0.8488549 33.94625 38.92103 35.06973 35.74010
## 15%:Patin  36.23465 1.591673 4 0.8488549 35.25594 38.60540 35.34585 35.53862
## 5%:Lele    45.20550 2.285900 4 0.8488549 43.28809 47.96665 43.34647 44.78362
## 5%:Nila    45.44301 2.068385 4 0.8488549 42.98472 47.42005 44.12675 45.68364
## 5%:Patin   46.02315 1.078377 4 0.8488549 44.62628 47.22681 45.60607 46.11974
##                Q75
## 10%:Lele  39.36274
## 10%:Nila  40.02588
## 10%:Patin 40.20221
## 15%:Lele  36.86679
## 15%:Nila  36.75723
## 15%:Patin 36.42742
## 5%:Lele   46.64265
## 5%:Nila   46.99990
## 5%:Patin  46.53682
## 
## $comparison
## NULL
## 
## $groups
##           Kadar_Air groups
## 5%:Patin   46.02315      a
## 5%:Nila    45.44301      a
## 5%:Lele    45.20550      a
## 10%:Patin  39.59461      b
## 10%:Nila   39.00765      b
## 10%:Lele   38.66667     bc
## 15%:Patin  36.23465      c
## 15%:Nila   36.08687      c
## 15%:Lele   36.03036      c
## 
## attr(,"class")
## [1] "group"
visualisasi_interaksi(data_rak_2faktor, Kadar_Air, Garam, Jenis_Ikan, "RAK - Kadar Air Ikan Asin")
## `summarise()` has grouped output by 'Garam'. You can override using the
## `.groups` argument.

RANCANGAN BUJUR SANGKAR LATIN (RBSL) FAKTORIAL

Latar Belakang Studi Kasus

Pengaruh waktu penyimpanan (1, 2, 3, 4 minggu) dan metode pengawetan (Fresh, Ice, Chiller, Frozen) terhadap TPC (Total Plate Count) fillet ikan kembung. Dikontrol dua arah: batch ikan (baris) dan laboratorium penguji (kolom).

# Data untuk RBSL Faktorial
set.seed(789)
data_rbsl_2faktor <- data.frame(
  Baris = rep(1:4, each = 16),
  Kolom = rep(1:4, 16),
  Waktu = rep(rep(c("1mg", "2mg", "3mg", "4mg"), each = 4), 4),
  Metode = rep(c("Fresh", "Ice", "Chiller", "Frozen"), 16),
  TPC = c(
    # Baris 1 - berbagai kombinasi
    rnorm(4, mean = 4.5, sd = 0.3),  # 1mg - berbagai metode
    rnorm(4, mean = 5.2, sd = 0.3),  # 2mg
    rnorm(4, mean = 6.1, sd = 0.3),  # 3mg
    rnorm(4, mean = 7.3, sd = 0.3),  # 4mg
    # Baris 2
    rnorm(4, mean = 3.8, sd = 0.3),
    rnorm(4, mean = 4.5, sd = 0.3),
    rnorm(4, mean = 5.8, sd = 0.3),
    rnorm(4, mean = 7.1, sd = 0.3),
    # Baris 3
    rnorm(4, mean = 4.2, sd = 0.3),
    rnorm(4, mean = 5.0, sd = 0.3),
    rnorm(4, mean = 6.2, sd = 0.3),
    rnorm(4, mean = 7.5, sd = 0.3),
    # Baris 4
    rnorm(4, mean = 4.0, sd = 0.3),
    rnorm(4, mean = 4.8, sd = 0.3),
    rnorm(4, mean = 6.0, sd = 0.3),
    rnorm(4, mean = 7.2, sd = 0.3)
  )
)

# Konversi ke faktor
data_rbsl_2faktor$Baris <- as.factor(data_rbsl_2faktor$Baris)
data_rbsl_2faktor$Kolom <- as.factor(data_rbsl_2faktor$Kolom)
data_rbsl_2faktor$Waktu <- as.factor(data_rbsl_2faktor$Waktu)
data_rbsl_2faktor$Metode <- as.factor(data_rbsl_2faktor$Metode)

Analisis ANOVA Dua Faktor RBSL

# Analisis ANOVA RBSL dengan interaksi
anova_rbsl_2faktor <- aov(TPC ~ Waktu * Metode + Baris + Kolom, data = data_rbsl_2faktor)
summary(anova_rbsl_2faktor)
##              Df Sum Sq Mean Sq F value   Pr(>F)    
## Waktu         3  95.95   31.98 354.002  < 2e-16 ***
## Metode        3   0.09    0.03   0.324    0.808    
## Baris         3   2.69    0.90   9.919 3.88e-05 ***
## Waktu:Metode  9   0.90    0.10   1.112    0.374    
## Residuals    45   4.07    0.09                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Uji Asumsi
plot(anova_rbsl_2faktor)

# Uji Normalitas
shapiro.test(residuals(anova_rbsl_2faktor))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(anova_rbsl_2faktor)
## W = 0.99065, p-value = 0.912
# Uji Homogenitas Varian
leveneTest(TPC ~ Waktu * Metode, data = data_rbsl_2faktor)

Uji Lanjut RBSL Dua Faktor

# Analisis interaksi menggunakan emmeans
library(emmeans)

# Simple effects analysis
simple_waktu <- emmeans(anova_rbsl_2faktor, ~ Metode | Waktu)
## NOTE: A nesting structure was detected in the fitted model:
##     Metode %in% Kolom
tukey_waktu <- pairs(simple_waktu, adjust = "tukey")
print(tukey_waktu)
## Waktu = 1mg:
##  contrast                       estimate    SE df t.ratio p.value
##  Fresh Kolom1 - Ice Kolom2        0.2627 0.213 45   1.236  0.9998
##  Fresh Kolom1 - Chiller Kolom3    0.2082 0.213 45   0.980  1.0000
##  Fresh Kolom1 - Frozen Kolom4     0.4016 0.213 45   1.889  0.9581
##  Ice Kolom2 - Chiller Kolom3     -0.0545 0.213 45  -0.256  1.0000
##  Ice Kolom2 - Frozen Kolom4       0.1389 0.213 45   0.653  1.0000
##  Chiller Kolom3 - Frozen Kolom4   0.1934 0.213 45   0.910  1.0000
## 
## Waktu = 2mg:
##  contrast                       estimate    SE df t.ratio p.value
##  Fresh Kolom1 - Ice Kolom2       -0.1078 0.213 45  -0.507  1.0000
##  Fresh Kolom1 - Chiller Kolom3    0.0934 0.213 45   0.440  1.0000
##  Fresh Kolom1 - Frozen Kolom4    -0.2288 0.213 45  -1.077  1.0000
##  Ice Kolom2 - Chiller Kolom3      0.2012 0.213 45   0.946  1.0000
##  Ice Kolom2 - Frozen Kolom4      -0.1211 0.213 45  -0.570  1.0000
##  Chiller Kolom3 - Frozen Kolom4  -0.3222 0.213 45  -1.516  0.9965
## 
## Waktu = 3mg:
##  contrast                       estimate    SE df t.ratio p.value
##  Fresh Kolom1 - Ice Kolom2       -0.2097 0.213 45  -0.987  1.0000
##  Fresh Kolom1 - Chiller Kolom3   -0.2714 0.213 45  -1.277  0.9997
##  Fresh Kolom1 - Frozen Kolom4    -0.1768 0.213 45  -0.832  1.0000
##  Ice Kolom2 - Chiller Kolom3     -0.0617 0.213 45  -0.290  1.0000
##  Ice Kolom2 - Frozen Kolom4       0.0329 0.213 45   0.155  1.0000
##  Chiller Kolom3 - Frozen Kolom4   0.0946 0.213 45   0.445  1.0000
## 
## Waktu = 4mg:
##  contrast                       estimate    SE df t.ratio p.value
##  Fresh Kolom1 - Ice Kolom2        0.0774 0.213 45   0.364  1.0000
##  Fresh Kolom1 - Chiller Kolom3    0.3333 0.213 45   1.568  0.9947
##  Fresh Kolom1 - Frozen Kolom4     0.0531 0.213 45   0.250  1.0000
##  Ice Kolom2 - Chiller Kolom3      0.2559 0.213 45   1.204  0.9999
##  Ice Kolom2 - Frozen Kolom4      -0.0243 0.213 45  -0.114  1.0000
##  Chiller Kolom3 - Frozen Kolom4  -0.2802 0.213 45  -1.318  0.9995
## 
## Results are averaged over some or all of the levels of: Baris 
## P value adjustment: tukey method for comparing a family of 24 estimates
# Simple effects untuk setiap metode
simple_metode <- emmeans(anova_rbsl_2faktor, ~ Waktu | Metode)
## NOTE: A nesting structure was detected in the fitted model:
##     Metode %in% Kolom
tukey_metode <- pairs(simple_metode, adjust = "tukey")
print(tukey_metode)
## Kolom = 3, Metode = Chiller:
##  contrast  estimate    SE df t.ratio p.value
##  1mg - 2mg   -0.582 0.213 45  -2.739  0.5043
##  1mg - 3mg   -2.102 0.213 45  -9.889  <.0001
##  1mg - 4mg   -2.983 0.213 45 -14.034  <.0001
##  2mg - 3mg   -1.520 0.213 45  -7.150  <.0001
##  2mg - 4mg   -2.401 0.213 45 -11.295  <.0001
##  3mg - 4mg   -0.881 0.213 45  -4.145  0.0239
## 
## Kolom = 1, Metode = Fresh:
##  contrast  estimate    SE df t.ratio p.value
##  1mg - 2mg   -0.467 0.213 45  -2.199  0.8502
##  1mg - 3mg   -1.622 0.213 45  -7.633  <.0001
##  1mg - 4mg   -3.108 0.213 45 -14.623  <.0001
##  2mg - 3mg   -1.155 0.213 45  -5.434  0.0005
##  2mg - 4mg   -2.641 0.213 45 -12.424  <.0001
##  3mg - 4mg   -1.486 0.213 45  -6.990  <.0001
## 
## Kolom = 4, Metode = Frozen:
##  contrast  estimate    SE df t.ratio p.value
##  1mg - 2mg   -1.098 0.213 45  -5.165  0.0011
##  1mg - 3mg   -2.201 0.213 45 -10.354  <.0001
##  1mg - 4mg   -3.456 0.213 45 -16.262  <.0001
##  2mg - 3mg   -1.103 0.213 45  -5.189  0.0010
##  2mg - 4mg   -2.359 0.213 45 -11.097  <.0001
##  3mg - 4mg   -1.256 0.213 45  -5.908  0.0001
## 
## Kolom = 2, Metode = Ice:
##  contrast  estimate    SE df t.ratio p.value
##  1mg - 2mg   -0.838 0.213 45  -3.942  0.0413
##  1mg - 3mg   -2.095 0.213 45  -9.855  <.0001
##  1mg - 4mg   -3.293 0.213 45 -15.494  <.0001
##  2mg - 3mg   -1.257 0.213 45  -5.913  0.0001
##  2mg - 4mg   -2.455 0.213 45 -11.552  <.0001
##  3mg - 4mg   -1.199 0.213 45  -5.639  0.0002
## 
## Results are averaged over some or all of the levels of: Baris 
## P value adjustment: tukey method for comparing a family of 24 estimates
# Uji LSD untuk kombinasi spesifik
# Untuk Waktu 1 minggu
data_1mg <- subset(data_rbsl_2faktor, Waktu == "1mg")
anova_1mg <- aov(TPC ~ Metode + Baris + Kolom, data = data_1mg)
lsd_1mg <- LSD.test(anova_1mg, "Metode", alpha = 0.05)
print(lsd_1mg)
## $statistics
##      MSerror Df     Mean       CV  t.value       LSD
##   0.08074926  9 4.070532 6.981007 2.262157 0.4545452
## 
## $parameters
##         test p.ajusted name.t ntr alpha
##   Fisher-LSD      none Metode   4  0.05
## 
## $means
##              TPC       std r        se      LCL      UCL      Min      Max
## Chiller 4.080445 0.2814864 4 0.1420821 3.759033 4.401857 3.862812 4.494096
## Fresh   4.288663 0.3086432 4 0.1420821 3.967251 4.610075 3.926861 4.657229
## Frozen  3.887073 0.4712628 4 0.1420821 3.565661 4.208485 3.544116 4.554942
## Ice     4.025948 0.3644304 4 0.1420821 3.704536 4.347360 3.617911 4.369757
##              Q25      Q50      Q75
## Chiller 3.950092 3.982436 4.112789
## Fresh   4.122541 4.285281 4.451403
## Frozen  3.561128 3.724617 4.050561
## Ice     3.770805 4.058061 4.313204
## 
## $comparison
## NULL
## 
## $groups
##              TPC groups
## Fresh   4.288663      a
## Chiller 4.080445      a
## Ice     4.025948      a
## Frozen  3.887073      a
## 
## attr(,"class")
## [1] "group"
# Uji Duncan untuk semua kombinasi
duncan_rbsl <- duncan.test(anova_rbsl_2faktor, 
                          c("Waktu", "Metode"), 
                          alpha = 0.05)
print(duncan_rbsl)
## $statistics
##      MSerror Df     Mean       CV
##   0.09035187 45 5.560857 5.405387
## 
## $parameters
##     test       name.t ntr alpha
##   Duncan Waktu:Metode  16  0.05
## 
## $duncan
##       Table CriticalRange
## 2  2.848372     0.4280902
## 3  2.995440     0.4501934
## 4  3.091920     0.4646937
## 5  3.161684     0.4751788
## 6  3.215093     0.4832058
## 7  3.257548     0.4895865
## 8  3.292203     0.4947948
## 9  3.321052     0.4991307
## 10 3.345434     0.5027950
## 11 3.366284     0.5059287
## 12 3.384284     0.5086340
## 13 3.399942     0.5109872
## 14 3.413647     0.5130470
## 15 3.425703     0.5148589
## 16 3.436352     0.5164595
## 
## $means
##                  TPC       std r        se      Min      Max      Q25      Q50
## 1mg:Chiller 4.080445 0.2814864 4 0.1502929 3.862812 4.494096 3.950092 3.982436
## 1mg:Fresh   4.288663 0.3086432 4 0.1502929 3.926861 4.657229 4.122541 4.285281
## 1mg:Frozen  3.887073 0.4712628 4 0.1502929 3.544116 4.554942 3.561128 3.724617
## 1mg:Ice     4.025948 0.3644304 4 0.1502929 3.617911 4.369757 3.770805 4.058061
## 2mg:Chiller 4.662608 0.3268195 4 0.1502929 4.242694 5.000106 4.501711 4.703817
## 2mg:Fresh   4.756025 0.3799379 4 0.1502929 4.289385 5.091595 4.525827 4.821561
## 2mg:Frozen  4.984845 0.2660113 4 0.1502929 4.610328 5.198181 4.889992 5.065436
## 2mg:Ice     4.863777 0.1619686 4 0.1502929 4.705041 5.054655 4.743808 4.847707
## 3mg:Chiller 6.182345 0.4217941 4 0.1502929 5.719567 6.683614 5.914375 6.163099
## 3mg:Fresh   5.910979 0.4218184 4 0.1502929 5.371092 6.325518 5.690307 5.973653
## 3mg:Frozen  6.087756 0.3691661 4 0.1502929 5.740230 6.440960 5.784432 6.084917
## 3mg:Ice     6.120666 0.4986002 4 0.1502929 5.646303 6.727859 5.751522 6.054252
## 4mg:Chiller 7.063282 0.4136482 4 0.1502929 6.573714 7.578372 6.883902 7.050520
## 4mg:Fresh   7.396623 0.3383056 4 0.1502929 7.103263 7.879571 7.210829 7.301828
## 4mg:Frozen  7.343501 0.5231867 4 0.1502929 6.759507 7.904554 6.990631 7.354971
## 4mg:Ice     7.319180 0.2718128 4 0.1502929 7.049963 7.653292 7.127713 7.286731
##                  Q75
## 1mg:Chiller 4.112789
## 1mg:Fresh   4.451403
## 1mg:Frozen  4.050561
## 1mg:Ice     4.313204
## 2mg:Chiller 4.864714
## 2mg:Fresh   5.051759
## 2mg:Frozen  5.160290
## 2mg:Ice     4.967676
## 3mg:Chiller 6.431068
## 3mg:Fresh   6.194324
## 3mg:Frozen  6.388242
## 3mg:Ice     6.423396
## 4mg:Chiller 7.229899
## 4mg:Fresh   7.487622
## 4mg:Frozen  7.707840
## 4mg:Ice     7.478198
## 
## $comparison
## NULL
## 
## $groups
##                  TPC groups
## 4mg:Fresh   7.396623      a
## 4mg:Frozen  7.343501      a
## 4mg:Ice     7.319180      a
## 4mg:Chiller 7.063282      a
## 3mg:Chiller 6.182345      b
## 3mg:Ice     6.120666      b
## 3mg:Frozen  6.087756      b
## 3mg:Fresh   5.910979      b
## 2mg:Frozen  4.984845      c
## 2mg:Ice     4.863777      c
## 2mg:Fresh   4.756025      c
## 2mg:Chiller 4.662608     cd
## 1mg:Fresh   4.288663     de
## 1mg:Chiller 4.080445      e
## 1mg:Ice     4.025948      e
## 1mg:Frozen  3.887073      e
## 
## attr(,"class")
## [1] "group"
# Kontras polinomial untuk waktu (faktor kuantitatif)
data_rbsl_2faktor$Waktu_num <- as.numeric(gsub("mg", "", data_rbsl_2faktor$Waktu))
contrasts(data_rbsl_2faktor$Waktu) <- contr.poly(4)
anova_rbsl_poly <- aov(TPC ~ Waktu * Metode + Baris + Kolom, data = data_rbsl_2faktor)
summary(anova_rbsl_poly, split = list(Waktu = list(linear = 1, quadratic = 2, cubic = 3)))
##                           Df Sum Sq Mean Sq  F value   Pr(>F)    
## Waktu                      3  95.95   31.98  354.002  < 2e-16 ***
##   Waktu: linear            1  94.86   94.86 1049.847  < 2e-16 ***
##   Waktu: quadratic         1   0.84    0.84    9.324  0.00379 ** 
##   Waktu: cubic             1   0.26    0.26    2.834  0.09921 .  
## Metode                     3   0.09    0.03    0.324  0.80820    
## Baris                      3   2.69    0.90    9.919 3.88e-05 ***
## Waktu:Metode               9   0.90    0.10    1.112  0.37392    
##   Waktu:Metode: linear     3   0.15    0.05    0.551  0.65012    
##   Waktu:Metode: quadratic  3   0.44    0.15    1.619  0.19830    
##   Waktu:Metode: cubic      3   0.32    0.11    1.167  0.33279    
## Residuals                 45   4.07    0.09                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
visualisasi_interaksi(data_rbsl_2faktor, TPC, Waktu, Metode, "RBSL - TPC Ikan Kembung")
## `summarise()` has grouped output by 'Waktu'. You can override using the
## `.groups` argument.

Latihan Diskusi & Tugas Singkat

Soal 1: Keseragaman Lingkungan

Situasi: Seorang peneliti ingin menguji efektivitas 5 jenis pakan berbeda terhadap pertumbuhan ikan lele. Percobaan dilakukan di dalam ruangan terkontrol dengan sistem akuarium yang identik, dimana semua kondisi lingkungan (suhu air, pH, oksigen terlarut) dapat dipertahankan secara seragam.

Pertanyaan: Rancangan percobaan apa yang paling efisien untuk situasi ini? Mengapa?

Soal 2: Heterogenitas Lahan

Situasi: Penelitian pengaruh 4 dosis probiotik berbeda terhadap kualitas air tambak udang. Percobaan dilakukan di 6 petak tambak yang memiliki karakteristik berbeda (kedalaman, jenis tanah, riwayat penggunaan).

Pertanyaan: Rancangan apa yang tepat untuk mengatasi variasi antar petak tambak? Jelaskan alasan pemilihan rancangan tersebut.

Soal 3: Variasi Dua Arah

Situasi: Studi pengaruh 3 metode pengolahan ikan (segar, beku, asap) terhadap daya terima konsumen. Percobaan perlu mengontrol variasi dari dua sumber: batch bahan baku (3 batch berbeda) dan panelis (3 kelompok panelis dengan karakteristik berbeda).

Pertanyaan: Rancangan percobaan mana yang dapat mengontrol kedua sumber variasi tersebut secara simultan?


TUGAS SINGKAT

Tugas 1: Pemupukan Tambak

Studi Kasus: Seorang pembudidaya ikan ingin menguji efektivitas 3 jenis pupuk organik (Pupuk A, Pupuk B, Pupuk C) untuk meningkatkan produktivitas tambak ikan nila. Percobaan akan dilakukan di 4 lahan tambak yang berbeda.

Tugas:

1. Tentukan jenis rancangan percobaan yang tepat

2. Hitung jumlah satuan percobaan yang dibutuhkan

3. Buat tabel layout rancangan percobaan

4. Jelaskan alasan pemilihan rancangan tersebut

Parameter yang diukur: Produksi biomass ikan (kg/hektar)


Tugas 2: Optimasi Pakan Ikan

Studi Kasus: Penelitian pengaruh kombinasi jenis pakan (Pelet, Cacing, Campuran) dan frekuensi pemberian pakan (2 kali/hari, 3 kali/hari, 4 kali/hari) terhadap pertumbuhan ikan gurame.

Kondisi: Percobaan dilakukan menggunakan 27 unit keramba jaring apung yang ditempatkan di perairan waduk.

Tugas:

1. Identifikasi faktor dan level dalam percobaan

2. Tentukan jenis rancangan percobaan

3. Hitung total satuan percobaan

4. Buat kerangka tabel ANOVA yang diharapkan

5. Susun layout percobaan

Parameter: Laju pertumbuhan harian (gram/hari)

Tugas 3: Pengawetan Filet Ikan

Studi Kasus: Evaluasi pengaruh suhu penyimpanan (4°C, 10°C) dan jenis kemasan (Vakum, MAP, Plastik Biasa) terhadap masa simpan filet ikan kakap.

Kondisi: Percobaan menggunakan 3 batch ikan yang berbeda (tanggal tangkapan berbeda) dan dilakukan pengulangan 4 kali untuk setiap kombinasi perlakuan.

Tugas:

1. Tentukan rancangan yang dapat mengontrol variasi batch

2. Hitung kebutuhan unit percobaan

3. Buat diagram alur percobaan

4. Tentukan variabel respon dan kovariat yang mungkin

5. Susun tabel pengamatan

Parameter: Total Plate Count (log CFU/g) setelah 7 hari penyimpanan


Tugas 4: Interpretasi Hasil

Data Hasil Percobaan: Sebuah penelitian menguji 4 metode pengolahan ikan asin (A, B, C, D) dengan RAL menghasilkan output ANOVA berikut:

            Df Sum Sq Mean Sq F value   Pr(>F)    
Metode       3  145.2   48.40   15.24 2.34e-05 ***
Residuals   20   63.5    3.18                     
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Rata-rata perlakuan: A = 25.3, B = 30.1, C = 28.4, D = 22.8

Pertanyaan:

1. Apakah terdapat perbedaan yang signifikan antar metode pengolahan?

2. Metode mana yang memberikan hasil terbaik?

3. Uji lanjut apa yang tepat untuk mengetahui perbedaan antar perlakuan?

4. Jika dilakukan uji Tukey, interpretasikan kemungkinan hasilnya


LS0tDQp0aXRsZTogIlJhbmNhbmdhbiBQZXJjb2JhYW4iDQphdXRob3I6ICJOZ3VyYWggU2VudGFuYSINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdGhlbWU6IGNvc21vICAgICAgICAgICMgVGVtYSBCb290c3RyYXAgbW9kZXJuDQogICAgaGlnaGxpZ2h0OiB0YW5nbyAgICAgICMgV2FybmEga29kZSBjZXJhaA0KICAgIHRvYzogdHJ1ZSAgICAgICAgICAgICAjIERhZnRhciBpc2kNCiAgICB0b2NfZmxvYXQ6IHRydWUgICAgICAgIyBUT0MgbWVuZ2FtYmFuZw0KICAgIHRvY19kZXB0aDogMw0KICAgIG51bWJlcl9zZWN0aW9uczogZmFsc2UgIyBQZW5vbW9yYW4gb3RvbWF0aXMNCiAgICBkZl9wcmludDogcGFnZWQgICAgICAgIyBUYWJlbCB0YW1waWwgaW50ZXJha3RpZg0KICAgIGNvZGVfZm9sZGluZzogc2hvdyAgICAjIFNlbWJ1bnlpa2FuL3RhbXBpbGthbiBrb2RlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZSAgICAgICAjIEJpc2EgdW5kdWgga29kZSBsYW5nc3VuZw0KICAgIGZpZ19jYXB0aW9uOiB0cnVlICAgICAgICAgIyBDYXB0aW9uIG90b21hdGlzIHVudHVrIGdhbWJhcg0KICAgIGZpZ193aWR0aDogNw0KICAgIGZpZ19oZWlnaHQ6IDQuNQ0KICAgIHNtb290aF9zY3JvbGw6IHRydWUNCmFsd2F5c19hbGxvd19odG1sOiB0cnVlDQotLS0NCg0KIyAqKlR1anVhbioqDQoNCjEuICBNZW1haGFtaSBwcmluc2lwLXByaW5zaXAgZnVuZGFtZW50YWwgZGFsYW0gUGVyYW5jYW5nYW4gUGVyY29iYWFuIChEZXNpZ24gb2YgRXhwZXJpbWVudC9Eb0UpLg0KDQoyLiAgTWVuZXJhcGthbiBiZXJiYWdhaSBqZW5pcyByYW5jYW5nYW4gcGVyY29iYWFuLCB5YWl0dToNCg0KICAgIC0gICBSYW5jYW5nYW4gQWNhayBMZW5na2FwIChSQUwpDQoNCiAgICAtICAgUmFuY2FuZ2FuIEFjYWsgS2Vsb21wb2sgTGVuZ2thcCAoUkFLTCkNCg0KICAgIC0gICBSYW5jYW5nYW4gQnVqdXIgU2FuZ2thciBMYXRpbiAoUkJTTCkNCg0KMy4gIE1lbGFrdWthbiBBbmFsaXNpcyBTaWRpayBSYWdhbSAoQU5PVkEpIHVudHVrIHBlcmNvYmFhbiBkZW5nYW4gc2F0dSBmYWt0b3IuDQoNCjQuICBNZWxha3NhbmFrYW4gVWppIExhbmp1dCB1bnR1ayBtZW5ndWppIHBlcmJlZGFhbiBhbnRhciBwZXJsYWt1YW4sIHNlcGVydGkgdWppIExTRCwgVHVrZXksIER1bmNhbiwgc2VydGEgYW5hbGlzaXMgS29udHJhcyBQb2xpbm9taWFsIE9ydG9nb25hbCB1bnR1ayB0cmVuLg0KDQo1LiAgTWVuZ2ltcGxlbWVudGFzaWthbiBzZWx1cnVoIGFuYWxpc2lzIHRlcnNlYnV0IHNlY2FyYSBwcmFrdGlzIG1lbmdndW5ha2FuIHBlcmFuZ2thdCBsdW5hayAqKlIqKi4NCg0KIyBEZWZpbmlzaSBSYW5jYW5nYW4gUGVyY29iYWFuIChEZXNpZ24gb2YgRXhwZXJpbWVudCAvIERvRSkNCg0KKipSYW5jYW5nYW4gUGVyY29iYWFuIChEb0UpKiogYWRhbGFoIG1ldG9kb2xvZ2kgc2lzdGVtYXRpcyB1bnR1ayBtZXJlbmNhbmFrYW4sIG1lbGFrc2FuYWthbiwgbWVuZ2FuYWxpc2lzLCBkYW4gbWVuZ2ludGVycHJldGFzaWthbiBkYXRhIGRhcmkgcGVyY29iYWFuIHRlcmtvbnRyb2wgZGVuZ2FuIHR1anVhbiBtZW1wZXJvbGVoIGluZm9ybWFzaSB5YW5nIHZhbGlkIGRhbiBlZmlzaWVuIG1lbmdlbmFpIGh1YnVuZ2FuIHNlYmFiLWFraWJhdCBhbnRhcmEgdmFyaWFiZWwgcmVzcG9uIGRhbiBmYWt0b3ItZmFrdG9yIHlhbmcgbWVtcGVuZ2FydWhpbnlhLg0KDQoqKkthcmFrdGVyaXN0aWsgVXRhbWEgRG9FKioNCg0KLSAgIFNpc3RlbWF0aXMgZGFuIFRlcnN0cnVrdHVyOiBNZW5naWt1dGkgcHJvc2VkdXIgeWFuZyB0ZXJlbmNhbmENCi0gICBFZmlzaWVuOiBNZW1ha3NpbWFsa2FuIGluZm9ybWFzaSBkZW5nYW4gc3VtYmVyIGRheWEgbWluaW1hbA0KLSAgIFZhbGlkOiBIYXNpbCBkYXBhdCBkaXBlcmNheWEgZGFuIHRpZGFrIGJpYXMNCi0gICBSZXByb2R1a3RpZjogRGFwYXQgZGl1bGFuZyBkZW5nYW4gaGFzaWwga29uc2lzdGVuDQoNCioqVHVqdWFuKioNCg0KLSAgIE1lbmdpZGVudGlmaWthc2kgZmFrdG9yIHlhbmcgc2lnbmlmaWthbiBtZW1wZW5nYXJ1aGkgcmVzcG9uDQotICAgTWVuZW50dWthbiBrb25kaXNpIG9wdGltYWwgcHJvc2VzDQotICAgTWVtYWhhbWkgaW50ZXJha3NpIGFudGFyIGZha3Rvcg0KLSAgIE1lbWJ1YXQgbW9kZWwgbWF0ZW1hdGlzIGh1YnVuZ2FuIHZhcmlhYmVsDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIFJhbmNhbmdhbiBBY2FrIExlbmdrYXAgKFJBTCkNCg0KKipSYW5jYW5nYW4gQWNhayBMZW5na2FwIChSQUwpKiogYXRhdSAqKkNvbXBsZXRlbHkgUmFuZG9taXplZCBEZXNpZ24gKENSRCkqKiBhZGFsYWggcmFuY2FuZ2FuIHBlcmNvYmFhbiBwYWxpbmcgc2VkZXJoYW5hIGRpbWFuYSBzZWx1cnVoIHVuaXQgcGVyY29iYWFuIGRpYW5nZ2FwIGhvbW9nZW4gZGFuIHBlcmxha3VhbiBkaWFsb2thc2lrYW4gc2VjYXJhIGFjYWsgdGFucGEgcGVtYmF0YXNhbi4NCg0KKipDaXJpLUNpcmkgUkFMKioNCg0KLSAgIEhvbW9nZW5pdGFzIHRpbmdnaSBhbnRhciB1bml0IHBlcmNvYmFhbg0KLSAgIFBlbmdhY2FrYW4gcGVudWggdGFucGEgcGVtYmF0YXNhbg0KLSAgIFRpZGFrIGFkYSBwZW5nZWxvbXBva2FuL2Jsb2sNCi0gICBQZWxha3NhbmFhbiBkYW4gYW5hbGlzaXMgc2VkZXJoYW5hDQoNCioqTW9kZWwgTWF0ZW1hdGlzKioNCg0KJCQNCllfe2lqfSA9IFxtdSArIFx0YXVfaSArIFx2YXJlcHNpbG9uX3tpan0NCiQkDQoNCioqS2V0ZXJhbmdhbjoqKg0KDQpcLSAkWV97aWp9JDogUmVzcG9uIGtlLWogcGFkYSBwZXJsYWt1YW4ga2UtaVwNCi0gJFxtdSQ6IFJhdGEtcmF0YSB1bXVtXA0KLSAkXHRhdV9pJDogRWZlayBwZXJsYWt1YW4ga2UtaVwNCi0gJFx2YXJlcHNpbG9uX3tpan0kOiBHYWxhdCBwZXJjb2JhYW4NCg0KKipLb25kaXNpIFBlbmdndW5hYW4qKg0KDQotICAgVW5pdCBwZXJjb2JhYW4gYmVuYXItYmVuYXIgaG9tb2dlbg0KLSAgIEp1bWxhaCB1bml0IHBlcmNvYmFhbiBrZWNpbA0KLSAgIExpbmdrdW5nYW4gdGVya2VuZGFsaSBkZW5nYW4gYmFpaw0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyBSYW5jYW5nYW4gQWNhayBLZWxvbXBvayBMZW5na2FwIChSQUtMKQ0KDQoqKlJhbmNhbmdhbiBBY2FrIEtlbG9tcG9rIExlbmdrYXAgKFJBS0wpKiogYXRhdSAqKlJhbmRvbWl6ZWQgQ29tcGxldGUgQmxvY2sgRGVzaWduIChSQ0JEKSoqIGRpZ3VuYWthbiBrZXRpa2EgdW5pdCBwZXJjb2JhYW4gdGlkYWsgc2VwZW51aG55YSBob21vZ2VuLCBzZWhpbmdnYSBwZXJsdSBwZW5nZWxvbXBva2FuIChibG9rKSB1bnR1ayBtZW5nb250cm9sIHZhcmlhc2kgeWFuZyBkaWtldGFodWkuDQoNCioqQ2lyaS1DaXJpIFJBS0wqKg0KDQotICAgQWRhIHBlbmdlbG9tcG9rYW4gKGJsb2spIHlhbmcgaG9tb2dlbg0KLSAgIFBlbmdhY2FrYW4gZGlsYWt1a2FuIGRpIGRhbGFtIGJsb2sNCi0gICBNZW5nb250cm9sIHZhcmlhc2kgYW50YXIgYmxvaw0KLSAgIFNldGlhcCBwZXJsYWt1YW4gbXVuY3VsIHNhdHUga2FsaSBwZXIgYmxvaw0KDQoqKk1vZGVsIE1hdGVtYXRpcyoqDQoNCiQkDQpZX3tpan0gPSBcbXUgKyBcdGF1X2kgKyBcYmV0YV9qICsgXHZhcmVwc2lsb25fe2lqfQ0KJCQNCg0KKipLZXRlcmFuZ2FuOioqDQoNClwtICRZX3tpan0kOiBSZXNwb24gcGFkYSBwZXJsYWt1YW4gaSBkYW4gYmxvayBqXA0KLSAkXG11JDogUmF0YS1yYXRhIHVtdW1cDQotICRcdGF1X2kkOiBFZmVrIHBlcmxha3VhbiBrZS1pXA0KLSAkXGJldGFfaiQ6IEVmZWsgYmxvayBrZS1qXA0KLSAkXHZhcmVwc2lsb25fe2lqfSQ6IEdhbGF0IHBlcmNvYmFhbg0KDQoqKktvbmRpc2kgUGVuZ2d1bmFhbioqDQoNCi0gICBUZXJkYXBhdCBzdW1iZXIgdmFyaWFzaSB5YW5nIGRpa2V0YWh1aQ0KLSAgIFVuaXQgdGlkYWsgaG9tb2dlbg0KLSAgIEluZ2luIG1lbmluZ2thdGthbiBwcmVzaXNpIHBlcmNvYmFhbg0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyBSYW5jYW5nYW4gQnVqdXIgU2FuZ2thciBMYXRpbiAoUkJTTCkNCg0KKipSYW5jYW5nYW4gQnVqdXIgU2FuZ2thciBMYXRpbiAoUkJTTCkqKiBhdGF1ICoqTGF0aW4gU3F1YXJlIERlc2lnbiAoTFNEKSoqIGRpZ3VuYWthbiB1bnR1ayBtZW5nb250cm9sIGR1YSBzdW1iZXIgdmFyaWFzaSBzZWNhcmEgc2ltdWx0YW4gZGVuZ2FuIHN0cnVrdHVyIGJhcmlzIGRhbiBrb2xvbS4NCg0KKipDaXJpLUNpcmkgUkJTTCoqDQoNCi0gICBEdWEgYXJhaCBwZW5nZWxvbXBva2FuIChiYXJpcyBkYW4ga29sb20pDQotICAgU2V0aWFwIHBlcmxha3VhbiBtdW5jdWwgc2F0dSBrYWxpIGRpIHNldGlhcCBiYXJpcyBkYW4ga29sb20NCi0gICBFZmlzaWVuc2kgdGluZ2dpIGRhbiBzZWltYmFuZw0KLSAgIEp1bWxhaCBiYXJpcyA9IGp1bWxhaCBrb2xvbSA9IGp1bWxhaCBwZXJsYWt1YW4NCg0KKipNb2RlbCBNYXRlbWF0aXMqKg0KDQokJA0KWV97aWprfSA9IFxtdSArIFx0YXVfaSArIFxiZXRhX2ogKyBcZ2FtbWFfayArIFx2YXJlcHNpbG9uX3tpamt9DQokJA0KDQoqKktldGVyYW5nYW46KioNCg0KXC0gJFlfe2lqa30kOiBSZXNwb24gcGFkYSBwZXJsYWt1YW4gaSwgYmFyaXMgaiwga29sb20ga1wNCi0gJFxtdSQ6IFJhdGEtcmF0YSB1bXVtXA0KLSAkXHRhdV9pJDogRWZlayBwZXJsYWt1YW4ga2UtaVwNCi0gJFxiZXRhX2okOiBFZmVrIGJhcmlzIGtlLWpcDQotICRcZ2FtbWFfayQ6IEVmZWsga29sb20ga2Uta1wNCi0gJFx2YXJlcHNpbG9uX3tpamt9JDogR2FsYXQgcGVyY29iYWFuDQoNCioqS29uZGlzaSBQZW5nZ3VuYWFuKioNCg0KLSAgIFRlcmRhcGF0IGR1YSBzdW1iZXIgdmFyaWFzaSB5YW5nIGluZ2luIGRpa29udHJvbA0KLSAgIEp1bWxhaCBwZXJsYWt1YW4ga2VjaWwgKDTigJM4KQ0KLSAgIEludGVyYWtzaSBhbnRhciBmYWt0b3IgZGlhYmFpa2FuDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIEtlbGViaWhhbiBkYW4gS2VrdXJhbmdhbg0KDQoqKlBlcmJhbmRpbmdhbiBSQUwsIFJBS0wsIGRhbiBSQlNMKioNCg0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCBBc3BlayAgICAgICAgICAgICAgICAgICB8ICoqUkFMIChDUkQpKiogICAgICAgICAgICAgICB8ICoqUkFLTCAoUkNCRCkqKiAgICAgICAgICAgICB8ICoqUkJTTCAoTFNEKSoqICAgICAgICAgICAgICAgICAgICAgICAgfA0KKzo9PT09PT09PT09PT09PT09PT09PT09PT0rOj09PT09PT09PT09PT09PT09PT09PT09PT09PT0rOj09PT09PT09PT09PT09PT09PT09PT09PT09PT0rOj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kw0KfCAqKlRpbmdrYXQgSG9tb2dlbml0YXMqKiB8IFNhbmdhdCB0aW5nZ2kgICAgICAgICAgICAgICB8IFNlZGFuZyAoYWRhIGJsb2spICAgICAgICAgICB8IFJlbmRhaCAoZHVhIGFyYWggdmFyaWFzaSkgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCAqKktvbXBsZWtzaXRhcyBEZXNhaW4qKiB8IFNlZGVyaGFuYSAgICAgICAgICAgICAgICAgICB8IFNlZGFuZyAgICAgICAgICAgICAgICAgICAgICB8IFRpbmdnaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCAqKktvbnRyb2wgVmFyaWFzaSoqICAgICB8IFRpZGFrIGFkYSAgICAgICAgICAgICAgICAgICB8IDEgc3VtYmVyIHZhcmlhc2kgICAgICAgICAgICB8IDIgc3VtYmVyIHZhcmlhc2kgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCAqKkVmaXNpZW5zaSoqICAgICAgICAgICB8IFJlbmRhaCBqaWthIHRpZGFrIGhvbW9nZW4gICB8IEJhaWsgICAgICAgICAgICAgICAgICAgICAgICB8IFNhbmdhdCB0aW5nZ2kgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCAqKkFuYWxpc2lzIFN0YXRpc3RpayoqICB8IFNlZGVyaGFuYSAoQU5PVkEgc2F0dSBhcmFoKSB8IFNlZGlraXQga29tcGxla3MgKGR1YSBhcmFoKSB8IEtvbXBsZWtzICh0aWdhIGFyYWgpICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCAqKkNvY29rIFVudHVrKiogICAgICAgICB8IEtvbmRpc2kgaG9tb2dlbiAgICAgICAgICAgICB8IFBlcmNvYmFhbiBsYXBhbmdhbiAgICAgICAgICB8IEtvbmRpc2kga29tcGxla3MgZGVuZ2FuIDIgZmFrdG9yIGx1YXIgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCAqKkp1bWxhaCBQZXJsYWt1YW4qKiAgICB8IEJlYmFzICAgICAgICAgICAgICAgICAgICAgICB8IFNhbWEgdGlhcCBibG9rICAgICAgICAgICAgICB8IFNhbWEgZGVuZ2FuIGp1bWxhaCBiYXJpcyBkYW4ga29sb20gICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KDQoqKlRhYmVsIEtlbGViaWhhbiBkYW4gS2VrdXJhbmdhbiBUaWFwIFJhbmNhbmdhbioqDQoNCistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgKipSYW5jYW5nYW4qKiB8ICoqS2VsZWJpaGFuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKipLZWt1cmFuZ2FuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCis6PT09PT09PT09PT09PT0rOj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsNCnwgKipSQUwqKiAgICAgICB8IFwtIFNlZGVyaGFuYSBkYW4gbXVkYWggZGlhbmFsaXNpcyAgICAgICAgIHwgXC0gVGlkYWsgZWZpc2llbiBqaWthIGhldGVyb2dlbiAgICAgICAgICAgIHwNCnwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgICAgICAgICAgICAgICB8IFwtIERlcmFqYXQgYmViYXMgZ2FsYXQgbWFrc2ltYWwgICAgICAgICAgIHwgLSAgIFByZXNpc2kgcmVuZGFoICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgICAgICAgICAgICAgICB8IFwtIEZsZWtzaWJlbCBqdW1sYWggdWxhbmdhbiAgICAgICAgICAgICAgIHwgXC0gVGlkYWsgYmlzYSBrb250cm9sIHZhcmlhc2kgbHVhciAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgKipSQUtMKiogICAgICB8IFwtIE1lbmd1cmFuZ2kgZ2FsYXQgbWVsYWx1aSBwZW5nZWxvbXBva2FuIHwgXC0gS2VoaWxhbmdhbiBkZXJhamF0IGJlYmFzIGJsb2sgICAgICAgICAgIHwNCnwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgICAgICAgICAgICAgICB8IFwtIE1lbmluZ2thdGthbiBwcmVzaXNpICAgICAgICAgICAgICAgICAgIHwgLSAgIEFuYWxpc2lzIGxlYmloIGtvbXBsZWtzICAgICAgICAgICAgICAgIHwNCnwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgICAgICAgICAgICAgICB8IFwtIENvY29rIHVudHVrIHZhcmlhc2kgdGFuYWggICAgICAgICAgICAgIHwgLSAgIFRpZGFrIGVmaXNpZW4gamlrYSBibG9rIGt1cmFuZyB0ZXBhdCAgIHwNCistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgKipSQlNMKiogICAgICB8IFwtIEtvbnRyb2wgZHVhIHN1bWJlciB2YXJpYXNpICAgICAgICAgICAgIHwgXC0gSGFydXMgcGVyc2VnaSAoYmFyaXM9a29sb20pICAgICAgICAgICAgIHwNCnwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgICAgICAgICAgICAgICB8IFwtIEVmaXNpZW5zaSB0aW5nZ2kgICAgICAgICAgICAgICAgICAgICAgIHwgXC0gVGlkYWsgYm9sZWggYWRhIGludGVyYWtzaSAgICAgICAgICAgICAgIHwNCnwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgICAgICAgICAgICAgICB8IFwtIERlc2FpbiBzZWltYmFuZyAgICAgICAgICAgICAgICAgICAgICAgIHwgXC0gU3VsaXQgZGl0ZXJhcGthbiB1bnR1ayBwZXJsYWt1YW4gYmFueWFrIHwNCistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMgSmVuaXMtSmVuaXMgVWppIExhbmp1dCAoUG9zdC1Ib2MgVGVzdHMpDQoNClVqaSBsYW5qdXQgZGlsYWt1a2FuIHNldGVsYWggKipBTk9WQSoqIG1lbnVuanVra2FuIGFkYW55YSBwZXJiZWRhYW4gc2lnbmlmaWthbiBhbnRhciBwZXJsYWt1YW4sIHVudHVrIG1lbmdldGFodWkgcGVybGFrdWFuIG1hbmEgeWFuZyBiZXJiZWRhIHNhdHUgc2FtYSBsYWluLg0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyMgVWppIExTRCAoTGVhc3QgU2lnbmlmaWNhbnQgRGlmZmVyZW5jZSkNCg0KKipEZWZpbmlzaToqKlwNClVqaSBwZXJiYW5kaW5nYW4gYmVyZ2FuZGEgcGFsaW5nIHNlZGVyaGFuYSB1bnR1ayBtZW5kZXRla3NpIHBlcmJlZGFhbiBhbnRhciBkdWEgcmF0YS1yYXRhIHBlcmxha3Vhbi4NCg0KKipSdW11czoqKiAkJA0KTFNEID0gdF97KFxhbHBoYS8yLCBkYl97Z2FsYXR9KX0gXHRpbWVzIFxzcXJ0e1xmcmFjezIgXHRpbWVzIEtUR317cn19DQokJA0KDQoqKkthcmFrdGVyaXN0aWs6KioNCg0KXC0gU2Vuc2l0aWYgdGVyaGFkYXAgcGVyYmVkYWFuIGtlY2lsXA0KLSBSaXNpa28gVHlwZSBJIGVycm9yIHRpbmdnaVwNCi0gQ29jb2sgdW50dWsgcGVyYmFuZGluZ2FuIHlhbmcgdGVsYWggZGlyZW5jYW5ha2FuXA0KLSBTZXN1YWkgdW50dWsganVtbGFoIHBlcmxha3VhbiBzZWRpa2l0DQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIyAqKlVqaSBUdWtleSAoVHVrZXkncyBIU0QpKioNCg0KKipEZWZpbmlzaToqKlwNClVqaSByZW50YW5nIGJlcmdhbmRhIHlhbmcgbWVuZ29udHJvbCAqZXhwZXJpbWVudHdpc2UgZXJyb3IgcmF0ZSogc2VjYXJhIGtldGF0Lg0KDQoqKlJ1bXVzOioqICQkDQpIU0QgPSBxX3soXGFscGhhLCBwLCBkYl97Z2FsYXR9KX0gXHRpbWVzIFxzcXJ0e1xmcmFje0tUR317cn19DQokJA0KDQoqKkthcmFrdGVyaXN0aWs6KiogLSBMZWJpaCBrb25zZXJ2YXRpZiBkYXJpcGFkYSBMU0RcDQotIE1lbmdvbnRyb2wgdGluZ2thdCBrZXNhbGFoYW4ga2VzZWx1cnVoYW5cDQotIENvY29rIHVudHVrIHNlbXVhIHBlcmJhbmRpbmdhbiBiZXJwYXNhbmdhblwNCi0gQW1hbiB1bnR1ayBqdW1sYWggcGVybGFrdWFuIGJhbnlhaw0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyMgVWppIER1bmNhbiAoRHVuY2Fu4oCZcyBNdWx0aXBsZSBSYW5nZSBUZXN0KQ0KDQoqKkRlZmluaXNpOioqXA0KVWppIHJlbnRhbmcgYmVyZ2FuZGEgeWFuZyBtZW55ZXN1YWlrYW4gdGluZ2thdCBzaWduaWZpa2Fuc2kgYmVyZGFzYXJrYW4gamFyYWsgYW50YXIgcmF0YS1yYXRhIHlhbmcgZGl1cnV0a2FuLg0KDQoqKkthcmFrdGVyaXN0aWs6KiogLSBMZWJpaCBwb3dlcmZ1bCBkYXJpIFR1a2V5XA0KLSBCZXJkYXNhcmthbiAqcHJvdGVjdGVkIExTRCBwcmluY2lwbGUqXA0KLSBDb2NvayB1bnR1ayBzY3JlZW5pbmcgYXdhbFwNCi0gUmlzaWtvIGtlc2FsYWhhbiBtZW5pbmdrYXQgZGVuZ2FuIGJhbnlhayBwZXJsYWt1YW4NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMjIFVqaSBLb250cmFzIFBvbGlub21pYWwgT3J0b2dvbmFsDQoNCioqRGVmaW5pc2k6KipcDQpUZWtuaWsgdW50dWsgbWVuZ2FuYWxpc2lzIHRyZW4gcmVzcG9uIHRlcmhhZGFwIHBlcmxha3VhbiBrdWFudGl0YXRpZiBkZW5nYW4gbWVtcGFydGlzaSAqc3VtIG9mIHNxdWFyZXMqIHBlcmxha3VhbiBtZW5qYWRpIGtvbXBvbmVuIHBvbGlub21pYWwuDQoNCioqS29tcG9uZW4gUG9saW5vbWlhbDoqKiAtIExpbmVhclwNCi0gS3VhZHJhdGlrXA0KLSBLdWJpa1wNCi0gZGFuIHNldGVydXNueWEgaGluZ2dhIGRlcmFqYXQgKHDigJMxKQ0KDQoqKktlZ3VuYWFuOioqIC0gTWVuZ2lkZW50aWZpa2FzaSBwb2xhIHJlc3BvblwNCi0gTWVtYnVhdCBtb2RlbCBkb3Npc+KAk3Jlc3BvblwNCi0gRWZpc2llbiBkYWxhbSBwZW5nZ3VuYWFuIGRlcmFqYXQgYmViYXMNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMjIFVqaSBMYWlubnlhDQoNCistLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCAqKlVqaSoqICAgICAgICB8ICoqS2FyYWt0ZXJpc3RpayBVdGFtYSoqICAgICAgICAgICAgICAgICAgfCAqKktlZ3VuYWFuIFV0YW1hKiogICAgICAgICAgICAgICAgICB8DQorOj09PT09PT09PT09PT09PSs6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rOj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsNCnwgKipCb25mZXJyb25pKiogfCBTYW5nYXQga29uc2VydmF0aWYsIG1vZGlmaWthc2kgdWppLXQgICAgIHwgQ29jb2sgdW50dWsgc2VkaWtpdCBwZXJiYW5kaW5nYW4gICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQp8ICoqU2NoZWZmw6kqKiAgICB8IFBhbGluZyBrb25zZXJ2YXRpZiwgZmxla3NpYmVsICAgICAgICAgICAgfCBDb2NvayB1bnR1ayBrb250cmFzIHRpZGFrIHRlcmVuY2FuYSB8DQorLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgKipEdW5uZXR0KiogICAgfCBGb2t1cyBwYWRhIHBlcmJhbmRpbmdhbiB0ZXJoYWRhcCBrb250cm9sIHwgUG93ZXJmdWwgdW50dWsgKmNvbnRyb2wgY29tcGFyaXNvbiogfA0KKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIyBQZW1pbGloYW4gVWppIExhbmp1dCB5YW5nIFRlcGF0DQoNCnwgKipLb25kaXNpIFBlbmVsaXRpYW4qKiAgICAgIHwgKipVamkgTGFuanV0IHlhbmcgRGlzYXJhbmthbioqIHwNCnw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCnwgUGVuZWxpdGlhbiBla3NwbG9yYXRvcmkgICAgIHwgRHVuY2FuIGF0YXUgTFNEICAgICAgICAgICAgICAgIHwNCnwgUGVuZWxpdGlhbiBrb25maXJtYXRvcmkgICAgIHwgVHVrZXkgYXRhdSBCb25mZXJyb25pICAgICAgICAgIHwNCnwgUGVyYmFuZGluZ2FuIGRlbmdhbiBrb250cm9sIHwgRHVubmV0dCAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgQW5hbGlzaXMgdHJlbiBrdWFudGl0YXRpZiAgIHwgS29udHJhcyBwb2xpbm9taWFsIG9ydG9nb25hbCAgIHwNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMgUGVyY29iYWFuIEZha3RvciBUdW5nZ2FsIGRhbGFtIFINCg0KIyMgU3R1ZGkgS2FzdXM6IFBlbmdhcnVoIEplbmlzIEtlbWFzYW4gdGVyaGFkYXAgTWFzYSBTaW1wYW4gRmlsbGV0IElrYW4gTmlsYQ0KDQojIyBSQU5DQU5HQU4gQUNBSyBMRU5HS0FQIChSQUwpDQoNCiMjIyMgKipMYXRhciBCZWxha2FuZyBTdHVkaSBLYXN1cyoqDQoNClNlYnVhaCBwZXJ1c2FoYWFuIHBlbmdvbGFoYW4gaWthbiBpbmdpbiBtZW5nZXZhbHVhc2kgcGVuZ2FydWggNCBqZW5pcyBrZW1hc2FuIGJlcmJlZGEgKEEsIEIsIEMsIEQpIHRlcmhhZGFwIG1hc2Egc2ltcGFuIGZpbGxldCBpa2FuIG5pbGEgcGFkYSBzdWh1IGNoaWxsaW5nICg0wrBDKS4gUGFyYW1ldGVyIHlhbmcgZGl1a3VyIGFkYWxhaCBUb3RhbCBQbGF0ZSBDb3VudCAoVFBDKSBzZXRlbGFoIDcgaGFyaSBwZW55aW1wYW5hbiAobG9nIENGVS9nKS4gU2V0aWFwIHBlcmxha3VhbiBkaXVsYW5nIDUga2FsaS4NCg0KIyMjIyAqKkRhdGEgUGVyY29iYWFuKioNCg0KYGBge3J9DQojIERhdGEgdW50dWsgUkFMDQpzZXQuc2VlZCgxMjMpDQpkYXRhX3JhbCA8LSBkYXRhLmZyYW1lKA0KICBLZW1hc2FuID0gcmVwKGMoIkEiLCAiQiIsICJDIiwgIkQiKSwgZWFjaCA9IDUpLA0KICBUUEMgPSBjKA0KICAgICMgS2VtYXNhbiBBOiA1LjIsIDUuNCwgNS4xLCA1LjMsIDUuNQ0KICAgIHJub3JtKDUsIG1lYW4gPSA1LjMsIHNkID0gMC4xNSksDQogICAgIyBLZW1hc2FuIEI6IDQuOCwgNC45LCA0LjcsIDQuNiwgNS4wDQogICAgcm5vcm0oNSwgbWVhbiA9IDQuOCwgc2QgPSAwLjE1KSwNCiAgICAjIEtlbWFzYW4gQzogMy41LCAzLjYsIDMuNCwgMy43LCAzLjMNCiAgICBybm9ybSg1LCBtZWFuID0gMy41LCBzZCA9IDAuMTUpLA0KICAgICMgS2VtYXNhbiBEOiA2LjEsIDYuMCwgNi4yLCA1LjksIDYuMw0KICAgIHJub3JtKDUsIG1lYW4gPSA2LjEsIHNkID0gMC4xNSkNCiAgKQ0KKQ0KDQpkYXRhX3JhbA0KYGBgDQoNCiMjIyMgKipBbmFsaXNpcyBBTk9WQSBSQUwqKg0KDQpgYGB7cn0NCiMgQW5hbGlzaXMgQU5PVkENCmFub3ZhX3JhbCA8LSBhb3YoVFBDIH4gS2VtYXNhbiwgZGF0YSA9IGRhdGFfcmFsKQ0Kc3VtbWFyeShhbm92YV9yYWwpDQpgYGANCg0KSGFzaWwgQU5PVkEgbWVudW5qdWtrYW4gYmFod2EgamVuaXMga2VtYXNhbiBiZXJwZW5nYXJ1aCBzYW5nYXQgc2lnbmlmaWthbiB0ZXJoYWRhcCBuaWxhaSBUUEMgZmlsbGV0IGlrYW4gbmlsYSAocCBcPCAwLjAwMSkuIEFydGlueWEsIHBlcmJlZGFhbiBqZW5pcyBrZW1hc2FuIG1lbnllYmFia2FuIHBlcmJlZGFhbiBueWF0YSBwYWRhIG1hc2Egc2ltcGFuIGlrYW4uDQoNCmBgYHtyfQ0KIyBVamkgQXN1bXNpDQpwbG90KGFub3ZhX3JhbCkNCg0KIyBVamkgTm9ybWFsaXRhcw0Kc2hhcGlyby50ZXN0KHJlc2lkdWFscyhhbm92YV9yYWwpKQ0KDQojIFVqaSBIb21vZ2VuaXRhcyBWYXJpYW4NCmxpYnJhcnkoY2FyKQ0KbGV2ZW5lVGVzdChUUEMgfiBLZW1hc2FuLCBkYXRhID0gZGF0YV9yYWwpDQpgYGANCg0KIyMjIyAqKlVqaSBMYW5qdXQgUkFMKioNCg0KYGBge3J9DQojIFVqaSBMU0QNCmxpYnJhcnkoYWdyaWNvbGFlKQ0KbHNkX3JhbCA8LSBMU0QudGVzdChhbm92YV9yYWwsICJLZW1hc2FuIiwgYWxwaGEgPSAwLjA1KQ0KcHJpbnQobHNkX3JhbCkNCg0KIyBVamkgVHVrZXkgKEhTRCkNCnR1a2V5X3JhbCA8LSBIU0QudGVzdChhbm92YV9yYWwsICJLZW1hc2FuIiwgYWxwaGEgPSAwLjA1KQ0KcHJpbnQodHVrZXlfcmFsKQ0KDQojIFVqaSBEdW5jYW4NCmR1bmNhbl9yYWwgPC0gZHVuY2FuLnRlc3QoYW5vdmFfcmFsLCAiS2VtYXNhbiIsIGFscGhhID0gMC4wNSkNCnByaW50KGR1bmNhbl9yYWwpDQoNCiMgVWppIEtvbnRyYXMgUG9saW5vbWlhbCBPcnRvZ29uYWwNCmRhdGFfcmFsJEtlbWFzYW4gPC0gYXMuZmFjdG9yKGRhdGFfcmFsJEtlbWFzYW4pDQpjb250cmFzdHMoZGF0YV9yYWwkS2VtYXNhbikgPC0gY29udHIucG9seSg0KQ0KYW5vdmFfcG9seSA8LSBhb3YoVFBDIH4gS2VtYXNhbiwgZGF0YSA9IGRhdGFfcmFsKQ0Kc3VtbWFyeShhbm92YV9wb2x5LCBzcGxpdCA9IGxpc3QoS2VtYXNhbiA9IGxpc3QobGluZWFyID0gMSwgcXVhZHJhdGljID0gMiwgY3ViaWMgPSAzKSkpDQoNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KIyBGdW5nc2kgdW50dWsgdmlzdWFsaXNhc2kgaGFzaWwNCnZpc3VhbGlzYXNpX2hhc2lsIDwtIGZ1bmN0aW9uKGRhdGEsIHJlc3BvbiwgcGVybGFrdWFuLCBqdWR1bCkgew0KICBsaWJyYXJ5KGdncGxvdDIpDQogIA0KICAjIEJveHBsb3QNCiAgcDEgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0ge3twZXJsYWt1YW59fSwgeSA9IHt7cmVzcG9ufX0pKSArDQogICAgZ2VvbV9ib3hwbG90KGZpbGwgPSAibGlnaHRibHVlIikgKw0KICAgIGdlb21fcG9pbnQocG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIoMC4yKSwgYWxwaGEgPSAwLjYpICsNCiAgICBsYWJzKHRpdGxlID0gcGFzdGUoIkJveHBsb3QiLCBqdWR1bCksDQogICAgICAgICB4ID0gIlBlcmxha3VhbiIsIHkgPSAiUmVzcG9uIikgKw0KICAgIHRoZW1lX21pbmltYWwoKQ0KICANCiAgIyBCYXIgcGxvdCBkZW5nYW4gc3RhbmRhciBlcnJvcg0KICBzdW1tYXJ5X2RhdGEgPC0gZGF0YSAlPiUNCiAgICBncm91cF9ieSh7e3Blcmxha3Vhbn19KSAlPiUNCiAgICBzdW1tYXJpc2UobWVhbiA9IG1lYW4oe3tyZXNwb259fSksDQogICAgICAgICAgICAgIHNlID0gc2Qoe3tyZXNwb259fSkvc3FydChuKCkpKQ0KICANCiAgcDIgPC0gZ2dwbG90KHN1bW1hcnlfZGF0YSwgYWVzKHggPSB7e3Blcmxha3Vhbn19LCB5ID0gbWVhbikpICsNCiAgICBnZW9tX2NvbChmaWxsID0gInN0ZWVsYmx1ZSIsIGFscGhhID0gMC43KSArDQogICAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IG1lYW4gLSBzZSwgeW1heCA9IG1lYW4gKyBzZSksIHdpZHRoID0gMC4yKSArDQogICAgbGFicyh0aXRsZSA9IHBhc3RlKCJSYXRhLXJhdGEgZGVuZ2FuIFNFIiwganVkdWwpLA0KICAgICAgICAgeCA9ICJQZXJsYWt1YW4iLCB5ID0gIlJhdGEtcmF0YSBSZXNwb24iKSArDQogICAgdGhlbWVfbWluaW1hbCgpDQogIA0KICBwcmludChwMSkNCiAgcHJpbnQocDIpDQp9DQoNCnZpc3VhbGlzYXNpX2hhc2lsKGRhdGFfcmFsLCBUUEMsIEtlbWFzYW4sICJSQUwgLSBNYXNhIFNpbXBhbiBJa2FuIE5pbGEiKQ0KYGBgDQoNCiMjIFJBTkNBTkdBTiBBQ0FLIEtFTE9NUE9LIExFTkdLQVAgKFJBSykNCg0KIyMjIyAqKkxhdGFyIEJlbGFrYW5nIFN0dWRpIEthc3VzKioNCg0KUGVuZWxpdGlhbiBwZW5nYXJ1aCA0IGplbmlzIHRyZWF0bWVudCBhbnRpLWJyb3duaW5nIChQLCBRLCBSLCBTKSB0ZXJoYWRhcCB3YXJuYSBmaWxsZXQgaWthbiBrYWthcCBzZWxhbWEgcGVueWltcGFuYW4uIFBhcmFtZXRlciBkaXVrdXIgYWRhbGFoIG5pbGFpIExcKiAobGlnaHRuZXNzKSBzZXRlbGFoIDUgaGFyaS4gUGVyY29iYWFuIGRpbGFrdWthbiBkYWxhbSA1IGJsb2sgKGhhcmkgYmVyYmVkYSkgdW50dWsgbWVuZ29udHJvbCB2YXJpYXNpIGJhdGNoIGlrYW4uDQoNCiMjIyMgKipEYXRhIFBlcmNvYmFhbioqDQoNCmBgYHtyfQ0KIyBEYXRhIHVudHVrIFJBSw0Kc2V0LnNlZWQoNDU2KQ0KZGF0YV9yYWsgPC0gZGF0YS5mcmFtZSgNCiAgVHJlYXRtZW50ID0gcmVwKGMoIlAiLCAiUSIsICJSIiwgIlMiKSwgZWFjaCA9IDUpLA0KICBCbG9rID0gcmVwKDE6NSwgNCksDQogIExpZ2h0bmVzcyA9IGMoDQogICAgIyBUcmVhdG1lbnQgUDogNDUsIDQ2LCA0NCwgNDcsIDQ1DQogICAgcm5vcm0oNSwgbWVhbiA9IDQ1LjUsIHNkID0gMS4wKSwNCiAgICAjIFRyZWF0bWVudCBROiA1MiwgNTEsIDUzLCA1MCwgNTINCiAgICBybm9ybSg1LCBtZWFuID0gNTEuNSwgc2QgPSAxLjApLA0KICAgICMgVHJlYXRtZW50IFI6IDQ4LCA0NywgNDksIDQ2LCA0OA0KICAgIHJub3JtKDUsIG1lYW4gPSA0Ny41LCBzZCA9IDEuMCksDQogICAgIyBUcmVhdG1lbnQgUzogNTUsIDU0LCA1NiwgNTMsIDU1DQogICAgcm5vcm0oNSwgbWVhbiA9IDU0LjUsIHNkID0gMS4wKQ0KICApDQopDQoNCiMgS29udmVyc2kga2UgZmFrdG9yDQpkYXRhX3JhayRUcmVhdG1lbnQgPC0gYXMuZmFjdG9yKGRhdGFfcmFrJFRyZWF0bWVudCkNCmRhdGFfcmFrJEJsb2sgPC0gYXMuZmFjdG9yKGRhdGFfcmFrJEJsb2spDQpkYXRhX3Jhaw0KYGBgDQoNCiMjIyMgKipBbmFsaXNpcyBBTk9WQSBSQUsqKg0KDQpgYGB7cn0NCiMgQW5hbGlzaXMgQU5PVkEgZGVuZ2FuIGJsb2sNCmFub3ZhX3JhayA8LSBhb3YoTGlnaHRuZXNzIH4gVHJlYXRtZW50ICsgQmxvaywgZGF0YSA9IGRhdGFfcmFrKQ0Kc3VtbWFyeShhbm92YV9yYWspDQoNCiMgVWppIEFzdW1zaQ0KcGxvdChhbm92YV9yYWspDQoNCiMgVWppIE5vcm1hbGl0YXMNCnNoYXBpcm8udGVzdChyZXNpZHVhbHMoYW5vdmFfcmFrKSkNCmBgYA0KDQojIyMjICoqVWppIExhbmp1dCBSQUsqKg0KDQpgYGB7cn0NCiMgVWppIExTRCB1bnR1ayBSQUsNCmxzZF9yYWsgPC0gTFNELnRlc3QoYW5vdmFfcmFrLCAiVHJlYXRtZW50IiwgYWxwaGEgPSAwLjA1KQ0KcHJpbnQobHNkX3JhaykNCg0KIyBVamkgVHVrZXkgdW50dWsgUkFLDQp0dWtleV9yYWsgPC0gSFNELnRlc3QoYW5vdmFfcmFrLCAiVHJlYXRtZW50IiwgYWxwaGEgPSAwLjA1KQ0KcHJpbnQodHVrZXlfcmFrKQ0KDQojIFVqaSBEdW5jYW4gdW50dWsgUkFLDQpkdW5jYW5fcmFrIDwtIGR1bmNhbi50ZXN0KGFub3ZhX3JhaywgIlRyZWF0bWVudCIsIGFscGhhID0gMC4wNSkNCnByaW50KGR1bmNhbl9yYWspDQoNCiMgS29udHJhcyBQb2xpbm9taWFsIE9ydG9nb25hbA0KY29udHJhc3RzKGRhdGFfcmFrJFRyZWF0bWVudCkgPC0gY29udHIucG9seSg0KQ0KYW5vdmFfcmFrX3BvbHkgPC0gYW92KExpZ2h0bmVzcyB+IFRyZWF0bWVudCArIEJsb2ssIGRhdGEgPSBkYXRhX3JhaykNCnN1bW1hcnkoYW5vdmFfcmFrX3BvbHksIHNwbGl0ID0gbGlzdChUcmVhdG1lbnQgPSBsaXN0KGxpbmVhciA9IDEsIHF1YWRyYXRpYyA9IDIsIGN1YmljID0gMykpKQ0KYGBgDQoNCmBgYHtyfQ0KdmlzdWFsaXNhc2lfaGFzaWwoZGF0YV9yYWssIExpZ2h0bmVzcywgVHJlYXRtZW50LCAiUkFLIC0gV2FybmEgRmlsbGV0IEtha2FwIikNCmBgYA0KDQojIyBSQU5DQU5HQU4gQlVKVVIgU0FOR0tBUiBMQVRJTiAoUkJTTCkNCg0KIyMjIyAqKkxhdGFyIEJlbGFrYW5nIFN0dWRpIEthc3VzKioNCg0KUGVuZWxpdGlhbiBwZW5nYXJ1aCA0IHN1aHUgcGVueWltcGFuYW4gYmVyYmVkYSAoMTDCsEMsIDE1wrBDLCAyMMKwQywgMjXCsEMpIHRlcmhhZGFwIFRWQiAoVG90YWwgVm9sYXRpbGUgQmFzZSkgZmlsbGV0IGlrYW4gYmFuZGVuZy4gRGlrb250cm9sIGR1YSBhcmFoOiBiYXRjaCBpa2FuIChiYXJpcykgZGFuIHdha3R1IHBlbmd1a3VyYW4gKGtvbG9tKS4NCg0KIyMjIyAqKkRhdGEgUGVyY29iYWFuKioNCg0KYGBge3J9DQojIERhdGEgdW50dWsgUkJTTA0Kc2V0LnNlZWQoNzg5KQ0KZGF0YV9yYnNsIDwtIGRhdGEuZnJhbWUoDQogIFN1aHUgPSBjKCIxMEMiLCAiMjBDIiwgIjE1QyIsICIyNUMiLCANCiAgICAgICAgICAgIjE1QyIsICIxMEMiLCAiMjVDIiwgIjIwQyIsDQogICAgICAgICAgICIyNUMiLCAiMTVDIiwgIjIwQyIsICIxMEMiLCANCiAgICAgICAgICAgIjIwQyIsICIyNUMiLCAiMTBDIiwgIjE1QyIpLA0KICBCYXJpcyA9IHJlcCgxOjQsIGVhY2ggPSA0KSwNCiAgS29sb20gPSByZXAoMTo0LCA0KSwNCiAgVFZCID0gYygNCiAgICAjIERhdGEgVFZCIChtZ04vMTAwZykgdW50dWsgc2V0aWFwIGtvbWJpbmFzaQ0KICAgIDEyLjUsIDE4LjMsIDE1LjIsIDIyLjEsDQogICAgMTQuOCwgMTEuOSwgMjEuNSwgMTcuNiwNCiAgICAyMC44LCAxNi4xLCAxOS4yLCAxMy40LA0KICAgIDE4LjksIDIzLjcsIDE0LjEsIDE2LjkNCiAgKQ0KKQ0KDQojIEtvbnZlcnNpIGtlIGZha3Rvcg0KZGF0YV9yYnNsJFN1aHUgPC0gYXMuZmFjdG9yKGRhdGFfcmJzbCRTdWh1KQ0KZGF0YV9yYnNsJEJhcmlzIDwtIGFzLmZhY3RvcihkYXRhX3Jic2wkQmFyaXMpDQpkYXRhX3Jic2wkS29sb20gPC0gYXMuZmFjdG9yKGRhdGFfcmJzbCRLb2xvbSkNCmRhdGFfcmJzbA0KYGBgDQoNCiMjIyMgKipBbmFsaXNpcyBBTk9WQSBSQlNMKioNCg0KYGBge3J9DQojIEFuYWxpc2lzIEFOT1ZBIFJCU0wNCmFub3ZhX3Jic2wgPC0gYW92KFRWQiB+IFN1aHUgKyBCYXJpcyArIEtvbG9tLCBkYXRhID0gZGF0YV9yYnNsKQ0Kc3VtbWFyeShhbm92YV9yYnNsKQ0KDQojIFVqaSBBc3Vtc2kNCnBsb3QoYW5vdmFfcmJzbCkNCg0KIyBVamkgTm9ybWFsaXRhcw0Kc2hhcGlyby50ZXN0KHJlc2lkdWFscyhhbm92YV9yYnNsKSkNCg0KIyBVamkgSG9tb2dlbml0YXMgVmFyaWFuDQpsZXZlbmVUZXN0KFRWQiB+IFN1aHUsIGRhdGEgPSBkYXRhX3Jic2wpDQpgYGANCg0KIyMjIyAqKlVqaSBMYW5qdXQgUkJTTCoqDQoNCmBgYHtyfQ0KIyBVamkgTFNEIHVudHVrIFJCU0wNCmxzZF9yYnNsIDwtIExTRC50ZXN0KGFub3ZhX3Jic2wsICJTdWh1IiwgYWxwaGEgPSAwLjA1KQ0KcHJpbnQobHNkX3Jic2wpDQoNCiMgVWppIFR1a2V5IHVudHVrIFJCU0wNCnR1a2V5X3Jic2wgPC0gSFNELnRlc3QoYW5vdmFfcmJzbCwgIlN1aHUiLCBhbHBoYSA9IDAuMDUpDQpwcmludCh0dWtleV9yYnNsKQ0KDQojIFVqaSBEdW5jYW4gdW50dWsgUkJTTA0KZHVuY2FuX3Jic2wgPC0gZHVuY2FuLnRlc3QoYW5vdmFfcmJzbCwgIlN1aHUiLCBhbHBoYSA9IDAuMDUpDQpwcmludChkdW5jYW5fcmJzbCkNCg0KIyBLb250cmFzIFBvbGlub21pYWwgT3J0b2dvbmFsIChzdWh1IHNlYmFnYWkgZmFrdG9yIGt1YW50aXRhdGlmKQ0KZGF0YV9yYnNsJFN1aHVfbnVtIDwtIGFzLm51bWVyaWMoZ3N1YigiQyIsICIiLCBkYXRhX3Jic2wkU3VodSkpDQpjb250cmFzdHMoZGF0YV9yYnNsJFN1aHUpIDwtIGNvbnRyLnBvbHkoNCkNCmFub3ZhX3Jic2xfcG9seSA8LSBhb3YoVFZCIH4gU3VodSArIEJhcmlzICsgS29sb20sIGRhdGEgPSBkYXRhX3Jic2wpDQpzdW1tYXJ5KGFub3ZhX3Jic2xfcG9seSwgc3BsaXQgPSBsaXN0KFN1aHUgPSBsaXN0KGxpbmVhciA9IDEsIHF1YWRyYXRpYyA9IDIsIGN1YmljID0gMykpKQ0KYGBgDQoNCmBgYHtyfQ0KdmlzdWFsaXNhc2lfaGFzaWwoZGF0YV9yYnNsLCBUVkIsIFN1aHUsICJSQlNMIC0gVFZCIElrYW4gQmFuZGVuZyIpDQpgYGANCg0KIyBQZXJjb2JhYW4gRHVhIEZha3RvciBkYWxhbSBSDQoNCiMjIFN0dWRpIEthc3VzOiBQZW5nYXJ1aCBTdWh1IFBlbnlpbXBhbmFuIGRhbiBKZW5pcyBLZW1hc2FuIHRlcmhhZGFwIEt1YWxpdGFzIElrYW4NCg0KIyMgUkFOQ0FOR0FOIEFDQUsgTEVOR0tBUCAoUkFMKSBGQUtUT1JJQUwNCg0KIyMjIyAqKkxhdGFyIEJlbGFrYW5nIFN0dWRpIEthc3VzKioNCg0KUGVuZWxpdGlhbiBwZW5nYXJ1aCBrb21iaW5hc2kgc3VodSBwZW55aW1wYW5hbiAoNMKwQywgMTDCsEMpIGRhbiBqZW5pcyBrZW1hc2FuIChWYWt1bSwgTUFQLCBTdHlyb2ZvYW0pIHRlcmhhZGFwIHBIIGZpbGxldCBpa2FuIG5pbGEgc2V0ZWxhaCA3IGhhcmkgcGVueWltcGFuYW4uRGF0YSBQZXJjb2JhYW4NCg0KYGBge3J9DQojIERhdGEgdW50dWsgUkFMIEZha3RvcmlhbA0Kc2V0LnNlZWQoMTIzKQ0KZGF0YV9yYWxfMmZha3RvciA8LSBkYXRhLmZyYW1lKA0KICBTdWh1ID0gcmVwKHJlcChjKCI0QyIsICIxMEMiKSwgZWFjaCA9IDMpLCA1KSwNCiAgS2VtYXNhbiA9IHJlcChyZXAoYygiVmFrdW0iLCAiTUFQIiwgIlN0eXJvZm9hbSIpLCAyKSwgNSksDQogIHBIID0gYygNCiAgICAjIFN1aHUgNMKwQw0KICAgIHJub3JtKDUsIG1lYW4gPSA2LjIsIHNkID0gMC4xKSwgICMgVmFrdW0NCiAgICBybm9ybSg1LCBtZWFuID0gNi40LCBzZCA9IDAuMSksICAjIE1BUA0KICAgIHJub3JtKDUsIG1lYW4gPSA2LjgsIHNkID0gMC4xKSwgICMgU3R5cm9mb2FtDQogICAgIyBTdWh1IDEwwrBDDQogICAgcm5vcm0oNSwgbWVhbiA9IDYuNiwgc2QgPSAwLjEpLCAgIyBWYWt1bQ0KICAgIHJub3JtKDUsIG1lYW4gPSA2LjksIHNkID0gMC4xKSwgICMgTUFQDQogICAgcm5vcm0oNSwgbWVhbiA9IDcuNCwgc2QgPSAwLjEpICAgIyBTdHlyb2ZvYW0NCiAgKQ0KKQ0KDQojIEtvbnZlcnNpIGtlIGZha3Rvcg0KZGF0YV9yYWxfMmZha3RvciRTdWh1IDwtIGFzLmZhY3RvcihkYXRhX3JhbF8yZmFrdG9yJFN1aHUpDQpkYXRhX3JhbF8yZmFrdG9yJEtlbWFzYW4gPC0gYXMuZmFjdG9yKGRhdGFfcmFsXzJmYWt0b3IkS2VtYXNhbikNCmRhdGFfcmFsXzJmYWt0b3INCmBgYA0KDQojIyMjICoqQW5hbGlzaXMgQU5PVkEgRHVhIEZha3RvciBSQUwqKg0KDQpgYGB7cn0NCiMgQW5hbGlzaXMgQU5PVkEgZGVuZ2FuIGludGVyYWtzaQ0KYW5vdmFfcmFsXzJmYWt0b3IgPC0gYW92KHBIIH4gU3VodSAqIEtlbWFzYW4sIGRhdGEgPSBkYXRhX3JhbF8yZmFrdG9yKQ0Kc3VtbWFyeShhbm92YV9yYWxfMmZha3RvcikNCg0KIyBVamkgQXN1bXNpDQpwbG90KGFub3ZhX3JhbF8yZmFrdG9yKQ0KDQojIFVqaSBOb3JtYWxpdGFzDQpzaGFwaXJvLnRlc3QocmVzaWR1YWxzKGFub3ZhX3JhbF8yZmFrdG9yKSkNCg0KIyBVamkgSG9tb2dlbml0YXMgVmFyaWFuDQpsaWJyYXJ5KGNhcikNCmxldmVuZVRlc3QocEggfiBTdWh1ICogS2VtYXNhbiwgZGF0YSA9IGRhdGFfcmFsXzJmYWt0b3IpDQpgYGANCg0KYGBge3J9DQojIFVqaSBJbnRlcmFrc2kgU2lnbmlmaWthbiAtIFNpbXBsZSBFZmZlY3QgQW5hbHlzaXMNCmxpYnJhcnkoZW1tZWFucykNCg0KIyBTaW1wbGUgZWZmZWN0cyBhbmFseXNpcw0Kc2ltcGxlX2VmZmVjdHMgPC0gZW1tZWFucyhhbm92YV9yYWxfMmZha3RvciwgfiBLZW1hc2FuIHwgU3VodSkNCnBhaXJzKHNpbXBsZV9lZmZlY3RzLCBhZGp1c3QgPSAidHVrZXkiKQ0KDQojIEF0YXUgbWVuZ2d1bmFrYW4gTFNEIHVudHVrIHNldGlhcCBsZXZlbCBzdWh1DQojIFVudHVrIFN1aHUgNMKwQw0KZGF0YV80QyA8LSBzdWJzZXQoZGF0YV9yYWxfMmZha3RvciwgU3VodSA9PSAiNEMiKQ0KYW5vdmFfNEMgPC0gYW92KHBIIH4gS2VtYXNhbiwgZGF0YSA9IGRhdGFfNEMpDQpsc2RfNEMgPC0gTFNELnRlc3QoYW5vdmFfNEMsICJLZW1hc2FuIiwgYWxwaGEgPSAwLjA1KQ0KcHJpbnQobHNkXzRDKQ0KDQojIFVudHVrIFN1aHUgMTDCsEMNCmRhdGFfMTBDIDwtIHN1YnNldChkYXRhX3JhbF8yZmFrdG9yLCBTdWh1ID09ICIxMEMiKQ0KYW5vdmFfMTBDIDwtIGFvdihwSCB+IEtlbWFzYW4sIGRhdGEgPSBkYXRhXzEwQykNCmxzZF8xMEMgPC0gTFNELnRlc3QoYW5vdmFfMTBDLCAiS2VtYXNhbiIsIGFscGhhID0gMC4wNSkNCnByaW50KGxzZF8xMEMpDQoNCiMgVWppIFR1a2V5IHVudHVrIGludGVyYWtzaQ0KaW50ZXJhY3Rpb25fbWVhbnMgPC0gZW1tZWFucyhhbm92YV9yYWxfMmZha3RvciwgfiBTdWh1OktlbWFzYW4pDQp0dWtleV9pbnRlcmFjdGlvbiA8LSBwYWlycyhpbnRlcmFjdGlvbl9tZWFucywgYWRqdXN0ID0gInR1a2V5IikNCnByaW50KHR1a2V5X2ludGVyYWN0aW9uKQ0KYGBgDQoNCmBgYHtyfQ0KIyBGdW5nc2kgdmlzdWFsaXNhc2kgaW50ZXJha3NpDQp2aXN1YWxpc2FzaV9pbnRlcmFrc2kgPC0gZnVuY3Rpb24oZGF0YSwgcmVzcG9uLCBmYWt0b3IxLCBmYWt0b3IyLCBqdWR1bCkgew0KICBsaWJyYXJ5KGdncGxvdDIpDQogIGxpYnJhcnkoZHBseXIpDQogIA0KICAjIEludGVyYWN0aW9uIHBsb3QNCiAgaW50ZXJhY3Rpb25fZGF0YSA8LSBkYXRhICU+JQ0KICAgIGdyb3VwX2J5KHt7ZmFrdG9yMX19LCB7e2Zha3RvcjJ9fSkgJT4lDQogICAgc3VtbWFyaXNlKG1lYW5fcmVzcG9uID0gbWVhbih7e3Jlc3Bvbn19KSwNCiAgICAgICAgICAgICAgc2UgPSBzZCh7e3Jlc3Bvbn19KS9zcXJ0KG4oKSkpDQogIA0KICBwMSA8LSBnZ3Bsb3QoaW50ZXJhY3Rpb25fZGF0YSwgDQogICAgICAgICAgICAgICBhZXMoeCA9IHt7ZmFrdG9yMX19LCB5ID0gbWVhbl9yZXNwb24sIA0KICAgICAgICAgICAgICAgICAgIGNvbG9yID0ge3tmYWt0b3IyfX0sIGdyb3VwID0ge3tmYWt0b3IyfX0pKSArDQogICAgZ2VvbV9saW5lKHNpemUgPSAxKSArDQogICAgZ2VvbV9wb2ludChzaXplID0gMikgKw0KICAgIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBtZWFuX3Jlc3BvbiAtIHNlLCB5bWF4ID0gbWVhbl9yZXNwb24gKyBzZSksIA0KICAgICAgICAgICAgICAgICAgd2lkdGggPSAwLjEpICsNCiAgICBsYWJzKHRpdGxlID0gcGFzdGUoIlBsb3QgSW50ZXJha3NpIiwganVkdWwpLA0KICAgICAgICAgeCA9IGRlcGFyc2Uoc3Vic3RpdHV0ZShmYWt0b3IxKSksDQogICAgICAgICB5ID0gIlJhdGEtcmF0YSBSZXNwb24iLA0KICAgICAgICAgY29sb3IgPSBkZXBhcnNlKHN1YnN0aXR1dGUoZmFrdG9yMikpKSArDQogICAgdGhlbWVfbWluaW1hbCgpDQogIA0KICAjIEhlYXRtYXAgaW50ZXJha3NpDQogIHAyIDwtIGdncGxvdChpbnRlcmFjdGlvbl9kYXRhLCANCiAgICAgICAgICAgICAgIGFlcyh4ID0ge3tmYWt0b3IxfX0sIHkgPSB7e2Zha3RvcjJ9fSwgZmlsbCA9IG1lYW5fcmVzcG9uKSkgKw0KICAgIGdlb21fdGlsZSgpICsNCiAgICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9ICJibHVlIiwgaGlnaCA9ICJyZWQiKSArDQogICAgbGFicyh0aXRsZSA9IHBhc3RlKCJIZWF0bWFwIEludGVyYWtzaSIsIGp1ZHVsKSwNCiAgICAgICAgIHggPSBkZXBhcnNlKHN1YnN0aXR1dGUoZmFrdG9yMSkpLA0KICAgICAgICAgeSA9IGRlcGFyc2Uoc3Vic3RpdHV0ZShmYWt0b3IyKSksDQogICAgICAgICBmaWxsID0gIlJhdGEtcmF0YSIpICsNCiAgICB0aGVtZV9taW5pbWFsKCkNCiAgDQogIHByaW50KHAxKQ0KICBwcmludChwMikNCn0NCg0KdmlzdWFsaXNhc2lfaW50ZXJha3NpKGRhdGFfcmFsXzJmYWt0b3IsIHBILCBTdWh1LCBLZW1hc2FuLCAiUkFMIC0gcEggSWthbiBOaWxhIikNCmBgYA0KDQojIyBSQU5DQU5HQU4gQUNBSyBLRUxPTVBPSyBMRU5HS0FQIChSQUspIEZBS1RPUklBTA0KDQojIyMjICoqTGF0YXIgQmVsYWthbmcgU3R1ZGkgS2FzdXMqKg0KDQpQZW5nYXJ1aCBrb25zZW50cmFzaSBnYXJhbSAoNSUsIDEwJSwgMTUlKSBkYW4gamVuaXMgaWthbiAoTmlsYSwgUGF0aW4sIExlbGUpIHRlcmhhZGFwIGthZGFyIGFpciBwcm9kdWsgaWthbiBhc2luLiBQZXJjb2JhYW4gZGlsYWt1a2FuIGRhbGFtIDQgYmxvayAoYmF0Y2ggcGVtYnVhdGFuIGJlcmJlZGEpLg0KDQpgYGB7cn0NCiMgRGF0YSB1bnR1ayBSQUsgRmFrdG9yaWFsDQpzZXQuc2VlZCg0NTYpDQpkYXRhX3Jha18yZmFrdG9yIDwtIGRhdGEuZnJhbWUoDQogIEJsb2sgPSByZXAoMTo0LCBlYWNoID0gOSksDQogIEdhcmFtID0gcmVwKHJlcChjKCI1JSIsICIxMCUiLCAiMTUlIiksIGVhY2ggPSAzKSwgNCksDQogIEplbmlzX0lrYW4gPSByZXAoYygiTmlsYSIsICJQYXRpbiIsICJMZWxlIiksIDEyKSwNCiAgS2FkYXJfQWlyID0gYygNCiAgICAjIEJsb2sgMQ0KICAgIHJub3JtKDMsIG1lYW4gPSA0NSwgc2QgPSAxLjUpLCAgIyA1JSAtIE5pbGEsIFBhdGluLCBMZWxlDQogICAgcm5vcm0oMywgbWVhbiA9IDQwLCBzZCA9IDEuNSksICAjIDEwJSAtIE5pbGEsIFBhdGluLCBMZWxlDQogICAgcm5vcm0oMywgbWVhbiA9IDM1LCBzZCA9IDEuNSksICAjIDE1JSAtIE5pbGEsIFBhdGluLCBMZWxlDQogICAgIyBCbG9rIDINCiAgICBybm9ybSgzLCBtZWFuID0gNDYsIHNkID0gMS41KSwNCiAgICBybm9ybSgzLCBtZWFuID0gNDEsIHNkID0gMS41KSwNCiAgICBybm9ybSgzLCBtZWFuID0gMzYsIHNkID0gMS41KSwNCiAgICAjIEJsb2sgMw0KICAgIHJub3JtKDMsIG1lYW4gPSA0NCwgc2QgPSAxLjUpLA0KICAgIHJub3JtKDMsIG1lYW4gPSAzOSwgc2QgPSAxLjUpLA0KICAgIHJub3JtKDMsIG1lYW4gPSAzNCwgc2QgPSAxLjUpLA0KICAgICMgQmxvayA0DQogICAgcm5vcm0oMywgbWVhbiA9IDQ1LCBzZCA9IDEuNSksDQogICAgcm5vcm0oMywgbWVhbiA9IDQwLCBzZCA9IDEuNSksDQogICAgcm5vcm0oMywgbWVhbiA9IDM1LCBzZCA9IDEuNSkNCiAgKQ0KKQ0KDQojIEtvbnZlcnNpIGtlIGZha3Rvcg0KZGF0YV9yYWtfMmZha3RvciRCbG9rIDwtIGFzLmZhY3RvcihkYXRhX3Jha18yZmFrdG9yJEJsb2spDQpkYXRhX3Jha18yZmFrdG9yJEdhcmFtIDwtIGFzLmZhY3RvcihkYXRhX3Jha18yZmFrdG9yJEdhcmFtKQ0KZGF0YV9yYWtfMmZha3RvciRKZW5pc19Ja2FuIDwtIGFzLmZhY3RvcihkYXRhX3Jha18yZmFrdG9yJEplbmlzX0lrYW4pDQpkYXRhX3Jha18yZmFrdG9yDQpgYGANCg0KIyMjIyAqKkFuYWxpc2lzIEFOT1ZBIER1YSBGYWt0b3IgUkFLKioNCg0KYGBge3J9DQojIEFuYWxpc2lzIEFOT1ZBIGRlbmdhbiBibG9rIGRhbiBpbnRlcmFrc2kNCmFub3ZhX3Jha18yZmFrdG9yIDwtIGFvdihLYWRhcl9BaXIgfiBHYXJhbSAqIEplbmlzX0lrYW4gKyBCbG9rLCBkYXRhID0gZGF0YV9yYWtfMmZha3RvcikNCnN1bW1hcnkoYW5vdmFfcmFrXzJmYWt0b3IpDQoNCiMgVWppIEFzdW1zaQ0KcGxvdChhbm92YV9yYWtfMmZha3RvcikNCg0KIyBVamkgTm9ybWFsaXRhcw0Kc2hhcGlyby50ZXN0KHJlc2lkdWFscyhhbm92YV9yYWtfMmZha3RvcikpDQpgYGANCg0KIyMjIyAqKlVqaSBMYW5qdXQgUkFLIER1YSBGYWt0b3IqKg0KDQpgYGB7cn0NCiMgQW5hbGlzaXMgc2ltcGxlIGVmZmVjdHMgbWVuZ2d1bmFrYW4gZW1tZWFucw0KbGlicmFyeShlbW1lYW5zKQ0KDQojIFNpbXBsZSBlZmZlY3RzIHVudHVrIHNldGlhcCBsZXZlbCBnYXJhbQ0Kc2ltcGxlX2dhcmFtIDwtIGVtbWVhbnMoYW5vdmFfcmFrXzJmYWt0b3IsIH4gSmVuaXNfSWthbiB8IEdhcmFtKQ0KdHVrZXlfZ2FyYW0gPC0gcGFpcnMoc2ltcGxlX2dhcmFtLCBhZGp1c3QgPSAidHVrZXkiKQ0KcHJpbnQodHVrZXlfZ2FyYW0pDQoNCiMgU2ltcGxlIGVmZmVjdHMgdW50dWsgc2V0aWFwIGplbmlzIGlrYW4NCnNpbXBsZV9pa2FuIDwtIGVtbWVhbnMoYW5vdmFfcmFrXzJmYWt0b3IsIH4gR2FyYW0gfCBKZW5pc19Ja2FuKQ0KdHVrZXlfaWthbiA8LSBwYWlycyhzaW1wbGVfaWthbiwgYWRqdXN0ID0gInR1a2V5IikNCnByaW50KHR1a2V5X2lrYW4pDQoNCiMgVWppIExTRCBtYW51YWwgdW50dWsgaW50ZXJha3NpIHNpZ25pZmlrYW4NCiMgVW50dWsgR2FyYW0gNSUNCmRhdGFfNXAgPC0gc3Vic2V0KGRhdGFfcmFrXzJmYWt0b3IsIEdhcmFtID09ICI1JSIpDQphbm92YV81cCA8LSBhb3YoS2FkYXJfQWlyIH4gSmVuaXNfSWthbiArIEJsb2ssIGRhdGEgPSBkYXRhXzVwKQ0KbHNkXzVwIDwtIExTRC50ZXN0KGFub3ZhXzVwLCAiSmVuaXNfSWthbiIsIGFscGhhID0gMC4wNSkNCnByaW50KGxzZF81cCkNCg0KIyBVamkgRHVuY2FuIHVudHVrIGludGVyYWtzaQ0KZHVuY2FuX2ludGVyYWN0aW9uIDwtIGR1bmNhbi50ZXN0KGFub3ZhX3Jha18yZmFrdG9yLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoIkdhcmFtIiwgIkplbmlzX0lrYW4iKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuMDUpDQpwcmludChkdW5jYW5faW50ZXJhY3Rpb24pDQpgYGANCg0KYGBge3J9DQp2aXN1YWxpc2FzaV9pbnRlcmFrc2koZGF0YV9yYWtfMmZha3RvciwgS2FkYXJfQWlyLCBHYXJhbSwgSmVuaXNfSWthbiwgIlJBSyAtIEthZGFyIEFpciBJa2FuIEFzaW4iKQ0KYGBgDQoNCiMjIFJBTkNBTkdBTiBCVUpVUiBTQU5HS0FSIExBVElOIChSQlNMKSBGQUtUT1JJQUwNCg0KIyMjIyAqKkxhdGFyIEJlbGFrYW5nIFN0dWRpIEthc3VzKioNCg0KUGVuZ2FydWggd2FrdHUgcGVueWltcGFuYW4gKDEsIDIsIDMsIDQgbWluZ2d1KSBkYW4gbWV0b2RlIHBlbmdhd2V0YW4gKEZyZXNoLCBJY2UsIENoaWxsZXIsIEZyb3plbikgdGVyaGFkYXAgVFBDIChUb3RhbCBQbGF0ZSBDb3VudCkgZmlsbGV0IGlrYW4ga2VtYnVuZy4gRGlrb250cm9sIGR1YSBhcmFoOiBiYXRjaCBpa2FuIChiYXJpcykgZGFuIGxhYm9yYXRvcml1bSBwZW5ndWppIChrb2xvbSkuDQoNCmBgYHtyfQ0KIyBEYXRhIHVudHVrIFJCU0wgRmFrdG9yaWFsDQpzZXQuc2VlZCg3ODkpDQpkYXRhX3Jic2xfMmZha3RvciA8LSBkYXRhLmZyYW1lKA0KICBCYXJpcyA9IHJlcCgxOjQsIGVhY2ggPSAxNiksDQogIEtvbG9tID0gcmVwKDE6NCwgMTYpLA0KICBXYWt0dSA9IHJlcChyZXAoYygiMW1nIiwgIjJtZyIsICIzbWciLCAiNG1nIiksIGVhY2ggPSA0KSwgNCksDQogIE1ldG9kZSA9IHJlcChjKCJGcmVzaCIsICJJY2UiLCAiQ2hpbGxlciIsICJGcm96ZW4iKSwgMTYpLA0KICBUUEMgPSBjKA0KICAgICMgQmFyaXMgMSAtIGJlcmJhZ2FpIGtvbWJpbmFzaQ0KICAgIHJub3JtKDQsIG1lYW4gPSA0LjUsIHNkID0gMC4zKSwgICMgMW1nIC0gYmVyYmFnYWkgbWV0b2RlDQogICAgcm5vcm0oNCwgbWVhbiA9IDUuMiwgc2QgPSAwLjMpLCAgIyAybWcNCiAgICBybm9ybSg0LCBtZWFuID0gNi4xLCBzZCA9IDAuMyksICAjIDNtZw0KICAgIHJub3JtKDQsIG1lYW4gPSA3LjMsIHNkID0gMC4zKSwgICMgNG1nDQogICAgIyBCYXJpcyAyDQogICAgcm5vcm0oNCwgbWVhbiA9IDMuOCwgc2QgPSAwLjMpLA0KICAgIHJub3JtKDQsIG1lYW4gPSA0LjUsIHNkID0gMC4zKSwNCiAgICBybm9ybSg0LCBtZWFuID0gNS44LCBzZCA9IDAuMyksDQogICAgcm5vcm0oNCwgbWVhbiA9IDcuMSwgc2QgPSAwLjMpLA0KICAgICMgQmFyaXMgMw0KICAgIHJub3JtKDQsIG1lYW4gPSA0LjIsIHNkID0gMC4zKSwNCiAgICBybm9ybSg0LCBtZWFuID0gNS4wLCBzZCA9IDAuMyksDQogICAgcm5vcm0oNCwgbWVhbiA9IDYuMiwgc2QgPSAwLjMpLA0KICAgIHJub3JtKDQsIG1lYW4gPSA3LjUsIHNkID0gMC4zKSwNCiAgICAjIEJhcmlzIDQNCiAgICBybm9ybSg0LCBtZWFuID0gNC4wLCBzZCA9IDAuMyksDQogICAgcm5vcm0oNCwgbWVhbiA9IDQuOCwgc2QgPSAwLjMpLA0KICAgIHJub3JtKDQsIG1lYW4gPSA2LjAsIHNkID0gMC4zKSwNCiAgICBybm9ybSg0LCBtZWFuID0gNy4yLCBzZCA9IDAuMykNCiAgKQ0KKQ0KDQojIEtvbnZlcnNpIGtlIGZha3Rvcg0KZGF0YV9yYnNsXzJmYWt0b3IkQmFyaXMgPC0gYXMuZmFjdG9yKGRhdGFfcmJzbF8yZmFrdG9yJEJhcmlzKQ0KZGF0YV9yYnNsXzJmYWt0b3IkS29sb20gPC0gYXMuZmFjdG9yKGRhdGFfcmJzbF8yZmFrdG9yJEtvbG9tKQ0KZGF0YV9yYnNsXzJmYWt0b3IkV2FrdHUgPC0gYXMuZmFjdG9yKGRhdGFfcmJzbF8yZmFrdG9yJFdha3R1KQ0KZGF0YV9yYnNsXzJmYWt0b3IkTWV0b2RlIDwtIGFzLmZhY3RvcihkYXRhX3Jic2xfMmZha3RvciRNZXRvZGUpDQpgYGANCg0KIyMjIyAqKkFuYWxpc2lzIEFOT1ZBIER1YSBGYWt0b3IgUkJTTCoqDQoNCmBgYHtyfQ0KIyBBbmFsaXNpcyBBTk9WQSBSQlNMIGRlbmdhbiBpbnRlcmFrc2kNCmFub3ZhX3Jic2xfMmZha3RvciA8LSBhb3YoVFBDIH4gV2FrdHUgKiBNZXRvZGUgKyBCYXJpcyArIEtvbG9tLCBkYXRhID0gZGF0YV9yYnNsXzJmYWt0b3IpDQpzdW1tYXJ5KGFub3ZhX3Jic2xfMmZha3RvcikNCg0KIyBVamkgQXN1bXNpDQpwbG90KGFub3ZhX3Jic2xfMmZha3RvcikNCg0KIyBVamkgTm9ybWFsaXRhcw0Kc2hhcGlyby50ZXN0KHJlc2lkdWFscyhhbm92YV9yYnNsXzJmYWt0b3IpKQ0KDQojIFVqaSBIb21vZ2VuaXRhcyBWYXJpYW4NCmxldmVuZVRlc3QoVFBDIH4gV2FrdHUgKiBNZXRvZGUsIGRhdGEgPSBkYXRhX3Jic2xfMmZha3RvcikNCmBgYA0KDQojIyMjICoqVWppIExhbmp1dCBSQlNMIER1YSBGYWt0b3IqKg0KDQpgYGB7cn0NCiMgQW5hbGlzaXMgaW50ZXJha3NpIG1lbmdndW5ha2FuIGVtbWVhbnMNCmxpYnJhcnkoZW1tZWFucykNCg0KIyBTaW1wbGUgZWZmZWN0cyBhbmFseXNpcw0Kc2ltcGxlX3dha3R1IDwtIGVtbWVhbnMoYW5vdmFfcmJzbF8yZmFrdG9yLCB+IE1ldG9kZSB8IFdha3R1KQ0KdHVrZXlfd2FrdHUgPC0gcGFpcnMoc2ltcGxlX3dha3R1LCBhZGp1c3QgPSAidHVrZXkiKQ0KcHJpbnQodHVrZXlfd2FrdHUpDQoNCiMgU2ltcGxlIGVmZmVjdHMgdW50dWsgc2V0aWFwIG1ldG9kZQ0Kc2ltcGxlX21ldG9kZSA8LSBlbW1lYW5zKGFub3ZhX3Jic2xfMmZha3RvciwgfiBXYWt0dSB8IE1ldG9kZSkNCnR1a2V5X21ldG9kZSA8LSBwYWlycyhzaW1wbGVfbWV0b2RlLCBhZGp1c3QgPSAidHVrZXkiKQ0KcHJpbnQodHVrZXlfbWV0b2RlKQ0KDQojIFVqaSBMU0QgdW50dWsga29tYmluYXNpIHNwZXNpZmlrDQojIFVudHVrIFdha3R1IDEgbWluZ2d1DQpkYXRhXzFtZyA8LSBzdWJzZXQoZGF0YV9yYnNsXzJmYWt0b3IsIFdha3R1ID09ICIxbWciKQ0KYW5vdmFfMW1nIDwtIGFvdihUUEMgfiBNZXRvZGUgKyBCYXJpcyArIEtvbG9tLCBkYXRhID0gZGF0YV8xbWcpDQpsc2RfMW1nIDwtIExTRC50ZXN0KGFub3ZhXzFtZywgIk1ldG9kZSIsIGFscGhhID0gMC4wNSkNCnByaW50KGxzZF8xbWcpDQoNCiMgVWppIER1bmNhbiB1bnR1ayBzZW11YSBrb21iaW5hc2kNCmR1bmNhbl9yYnNsIDwtIGR1bmNhbi50ZXN0KGFub3ZhX3Jic2xfMmZha3RvciwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGMoIldha3R1IiwgIk1ldG9kZSIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjA1KQ0KcHJpbnQoZHVuY2FuX3Jic2wpDQoNCiMgS29udHJhcyBwb2xpbm9taWFsIHVudHVrIHdha3R1IChmYWt0b3Iga3VhbnRpdGF0aWYpDQpkYXRhX3Jic2xfMmZha3RvciRXYWt0dV9udW0gPC0gYXMubnVtZXJpYyhnc3ViKCJtZyIsICIiLCBkYXRhX3Jic2xfMmZha3RvciRXYWt0dSkpDQpjb250cmFzdHMoZGF0YV9yYnNsXzJmYWt0b3IkV2FrdHUpIDwtIGNvbnRyLnBvbHkoNCkNCmFub3ZhX3Jic2xfcG9seSA8LSBhb3YoVFBDIH4gV2FrdHUgKiBNZXRvZGUgKyBCYXJpcyArIEtvbG9tLCBkYXRhID0gZGF0YV9yYnNsXzJmYWt0b3IpDQpzdW1tYXJ5KGFub3ZhX3Jic2xfcG9seSwgc3BsaXQgPSBsaXN0KFdha3R1ID0gbGlzdChsaW5lYXIgPSAxLCBxdWFkcmF0aWMgPSAyLCBjdWJpYyA9IDMpKSkNCmBgYA0KDQpgYGB7cn0NCnZpc3VhbGlzYXNpX2ludGVyYWtzaShkYXRhX3Jic2xfMmZha3RvciwgVFBDLCBXYWt0dSwgTWV0b2RlLCAiUkJTTCAtIFRQQyBJa2FuIEtlbWJ1bmciKQ0KYGBgDQoNCiMgTGF0aWhhbiBEaXNrdXNpICYgVHVnYXMgU2luZ2thdA0KDQoqKlNvYWwgMTogS2VzZXJhZ2FtYW4gTGluZ2t1bmdhbioqDQoNCioqU2l0dWFzaToqKiBTZW9yYW5nIHBlbmVsaXRpIGluZ2luIG1lbmd1amkgZWZla3Rpdml0YXMgNSBqZW5pcyBwYWthbiBiZXJiZWRhIHRlcmhhZGFwIHBlcnR1bWJ1aGFuIGlrYW4gbGVsZS4gUGVyY29iYWFuIGRpbGFrdWthbiBkaSBkYWxhbSBydWFuZ2FuIHRlcmtvbnRyb2wgZGVuZ2FuIHNpc3RlbSBha3Vhcml1bSB5YW5nIGlkZW50aWssIGRpbWFuYSBzZW11YSBrb25kaXNpIGxpbmdrdW5nYW4gKHN1aHUgYWlyLCBwSCwgb2tzaWdlbiB0ZXJsYXJ1dCkgZGFwYXQgZGlwZXJ0YWhhbmthbiBzZWNhcmEgc2VyYWdhbS4NCg0KKipQZXJ0YW55YWFuOioqIFJhbmNhbmdhbiBwZXJjb2JhYW4gYXBhIHlhbmcgcGFsaW5nIGVmaXNpZW4gdW50dWsgc2l0dWFzaSBpbmk/IE1lbmdhcGE/DQoNCioqU29hbCAyOiBIZXRlcm9nZW5pdGFzIExhaGFuKioNCg0KKipTaXR1YXNpOioqIFBlbmVsaXRpYW4gcGVuZ2FydWggNCBkb3NpcyBwcm9iaW90aWsgYmVyYmVkYSB0ZXJoYWRhcCBrdWFsaXRhcyBhaXIgdGFtYmFrIHVkYW5nLiBQZXJjb2JhYW4gZGlsYWt1a2FuIGRpIDYgcGV0YWsgdGFtYmFrIHlhbmcgbWVtaWxpa2kga2FyYWt0ZXJpc3RpayBiZXJiZWRhIChrZWRhbGFtYW4sIGplbmlzIHRhbmFoLCByaXdheWF0IHBlbmdndW5hYW4pLg0KDQoqKlBlcnRhbnlhYW46KiogUmFuY2FuZ2FuIGFwYSB5YW5nIHRlcGF0IHVudHVrIG1lbmdhdGFzaSB2YXJpYXNpIGFudGFyIHBldGFrIHRhbWJhaz8gSmVsYXNrYW4gYWxhc2FuIHBlbWlsaWhhbiByYW5jYW5nYW4gdGVyc2VidXQuDQoNCioqU29hbCAzOiBWYXJpYXNpIER1YSBBcmFoKioNCg0KKipTaXR1YXNpOioqIFN0dWRpIHBlbmdhcnVoIDMgbWV0b2RlIHBlbmdvbGFoYW4gaWthbiAoc2VnYXIsIGJla3UsIGFzYXApIHRlcmhhZGFwIGRheWEgdGVyaW1hIGtvbnN1bWVuLiBQZXJjb2JhYW4gcGVybHUgbWVuZ29udHJvbCB2YXJpYXNpIGRhcmkgZHVhIHN1bWJlcjogYmF0Y2ggYmFoYW4gYmFrdSAoMyBiYXRjaCBiZXJiZWRhKSBkYW4gcGFuZWxpcyAoMyBrZWxvbXBvayBwYW5lbGlzIGRlbmdhbiBrYXJha3RlcmlzdGlrIGJlcmJlZGEpLg0KDQoqKlBlcnRhbnlhYW46KiogUmFuY2FuZ2FuIHBlcmNvYmFhbiBtYW5hIHlhbmcgZGFwYXQgbWVuZ29udHJvbCBrZWR1YSBzdW1iZXIgdmFyaWFzaSB0ZXJzZWJ1dCBzZWNhcmEgc2ltdWx0YW4/DQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIyAqKlRVR0FTIFNJTkdLQVQqKg0KDQoqKlR1Z2FzIDE6IFBlbXVwdWthbiBUYW1iYWsqKg0KDQoqKlN0dWRpIEthc3VzOioqIFNlb3JhbmcgcGVtYnVkaWRheWEgaWthbiBpbmdpbiBtZW5ndWppIGVmZWt0aXZpdGFzIDMgamVuaXMgcHVwdWsgb3JnYW5payAoUHVwdWsgQSwgUHVwdWsgQiwgUHVwdWsgQykgdW50dWsgbWVuaW5na2F0a2FuIHByb2R1a3Rpdml0YXMgdGFtYmFrIGlrYW4gbmlsYS4gUGVyY29iYWFuIGFrYW4gZGlsYWt1a2FuIGRpIDQgbGFoYW4gdGFtYmFrIHlhbmcgYmVyYmVkYS4NCg0KKipUdWdhczoqKg0KDQoxXC4gVGVudHVrYW4gamVuaXMgcmFuY2FuZ2FuIHBlcmNvYmFhbiB5YW5nIHRlcGF0DQoNCjJcLiBIaXR1bmcganVtbGFoIHNhdHVhbiBwZXJjb2JhYW4geWFuZyBkaWJ1dHVoa2FuDQoNCjNcLiBCdWF0IHRhYmVsIGxheW91dCByYW5jYW5nYW4gcGVyY29iYWFuDQoNCjRcLiBKZWxhc2thbiBhbGFzYW4gcGVtaWxpaGFuIHJhbmNhbmdhbiB0ZXJzZWJ1dA0KDQoqKlBhcmFtZXRlciB5YW5nIGRpdWt1cjoqKiBQcm9kdWtzaSBiaW9tYXNzIGlrYW4gKGtnL2hla3RhcikNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCioqVHVnYXMgMjogT3B0aW1hc2kgUGFrYW4gSWthbioqDQoNCioqU3R1ZGkgS2FzdXM6KiogUGVuZWxpdGlhbiBwZW5nYXJ1aCBrb21iaW5hc2kgamVuaXMgcGFrYW4gKFBlbGV0LCBDYWNpbmcsIENhbXB1cmFuKSBkYW4gZnJla3VlbnNpIHBlbWJlcmlhbiBwYWthbiAoMiBrYWxpL2hhcmksIDMga2FsaS9oYXJpLCA0IGthbGkvaGFyaSkgdGVyaGFkYXAgcGVydHVtYnVoYW4gaWthbiBndXJhbWUuDQoNCioqS29uZGlzaToqKiBQZXJjb2JhYW4gZGlsYWt1a2FuIG1lbmdndW5ha2FuIDI3IHVuaXQga2VyYW1iYSBqYXJpbmcgYXB1bmcgeWFuZyBkaXRlbXBhdGthbiBkaSBwZXJhaXJhbiB3YWR1ay4NCg0KKipUdWdhczoqKg0KDQoxXC4gSWRlbnRpZmlrYXNpIGZha3RvciBkYW4gbGV2ZWwgZGFsYW0gcGVyY29iYWFuDQoNCjJcLiBUZW50dWthbiBqZW5pcyByYW5jYW5nYW4gcGVyY29iYWFuDQoNCjNcLiBIaXR1bmcgdG90YWwgc2F0dWFuIHBlcmNvYmFhbg0KDQo0XC4gQnVhdCBrZXJhbmdrYSB0YWJlbCBBTk9WQSB5YW5nIGRpaGFyYXBrYW4NCg0KNVwuIFN1c3VuIGxheW91dCBwZXJjb2JhYW4NCg0KKipQYXJhbWV0ZXI6KiogTGFqdSBwZXJ0dW1idWhhbiBoYXJpYW4gKGdyYW0vaGFyaSkNCg0KKipUdWdhcyAzOiBQZW5nYXdldGFuIEZpbGV0IElrYW4qKg0KDQoqKlN0dWRpIEthc3VzOioqIEV2YWx1YXNpIHBlbmdhcnVoIHN1aHUgcGVueWltcGFuYW4gKDTCsEMsIDEwwrBDKSBkYW4gamVuaXMga2VtYXNhbiAoVmFrdW0sIE1BUCwgUGxhc3RpayBCaWFzYSkgdGVyaGFkYXAgbWFzYSBzaW1wYW4gZmlsZXQgaWthbiBrYWthcC4NCg0KKipLb25kaXNpOioqIFBlcmNvYmFhbiBtZW5nZ3VuYWthbiAzIGJhdGNoIGlrYW4geWFuZyBiZXJiZWRhICh0YW5nZ2FsIHRhbmdrYXBhbiBiZXJiZWRhKSBkYW4gZGlsYWt1a2FuIHBlbmd1bGFuZ2FuIDQga2FsaSB1bnR1ayBzZXRpYXAga29tYmluYXNpIHBlcmxha3Vhbi4NCg0KKipUdWdhczoqKg0KDQoxXC4gVGVudHVrYW4gcmFuY2FuZ2FuIHlhbmcgZGFwYXQgbWVuZ29udHJvbCB2YXJpYXNpIGJhdGNoDQoNCjJcLiBIaXR1bmcga2VidXR1aGFuIHVuaXQgcGVyY29iYWFuDQoNCjNcLiBCdWF0IGRpYWdyYW0gYWx1ciBwZXJjb2JhYW4NCg0KNFwuIFRlbnR1a2FuIHZhcmlhYmVsIHJlc3BvbiBkYW4ga292YXJpYXQgeWFuZyBtdW5na2luDQoNCjVcLiBTdXN1biB0YWJlbCBwZW5nYW1hdGFuDQoNCioqUGFyYW1ldGVyOioqIFRvdGFsIFBsYXRlIENvdW50IChsb2cgQ0ZVL2cpIHNldGVsYWggNyBoYXJpIHBlbnlpbXBhbmFuDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQoqKlR1Z2FzIDQ6IEludGVycHJldGFzaSBIYXNpbCoqDQoNCioqRGF0YSBIYXNpbCBQZXJjb2JhYW46KiogU2VidWFoIHBlbmVsaXRpYW4gbWVuZ3VqaSA0IG1ldG9kZSBwZW5nb2xhaGFuIGlrYW4gYXNpbiAoQSwgQiwgQywgRCkgZGVuZ2FuIFJBTCBtZW5naGFzaWxrYW4gb3V0cHV0IEFOT1ZBIGJlcmlrdXQ6DQoNCmBgYCAgICAgICAgIA0KICAgICAgICAgICAgRGYgU3VtIFNxIE1lYW4gU3EgRiB2YWx1ZSAgIFByKD5GKSAgICANCk1ldG9kZSAgICAgICAzICAxNDUuMiAgIDQ4LjQwICAgMTUuMjQgMi4zNGUtMDUgKioqDQpSZXNpZHVhbHMgICAyMCAgIDYzLjUgICAgMy4xOCAgICAgICAgICAgICAgICAgICAgIA0KLS0tDQpTaWduaWYuIGNvZGVzOiAgMCAnKioqJyAwLjAwMSAnKionIDAuMDEgJyonIDAuMDUgJy4nIDAuMSAnICcgMQ0KYGBgDQoNClJhdGEtcmF0YSBwZXJsYWt1YW46IEEgPSAyNS4zLCBCID0gMzAuMSwgQyA9IDI4LjQsIEQgPSAyMi44DQoNCioqUGVydGFueWFhbjoqKg0KDQoxXC4gQXBha2FoIHRlcmRhcGF0IHBlcmJlZGFhbiB5YW5nIHNpZ25pZmlrYW4gYW50YXIgbWV0b2RlIHBlbmdvbGFoYW4/DQoNCjJcLiBNZXRvZGUgbWFuYSB5YW5nIG1lbWJlcmlrYW4gaGFzaWwgdGVyYmFpaz8NCg0KM1wuIFVqaSBsYW5qdXQgYXBhIHlhbmcgdGVwYXQgdW50dWsgbWVuZ2V0YWh1aSBwZXJiZWRhYW4gYW50YXIgcGVybGFrdWFuPw0KDQo0XC4gSmlrYSBkaWxha3VrYW4gdWppIFR1a2V5LCBpbnRlcnByZXRhc2lrYW4ga2VtdW5na2luYW4gaGFzaWxueWENCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQo=