Validitas dan Reliabilitas Tes

~ Penggunaan keseharian ~


Contact
Name Albani
E-mail
Linkedin https://www.linkedin.com/in/al-bani-532b06294/

EPILOG

pernah kah kita berfikir tentang apakah kuisioner kita sudah cukup valid dengan jawaban responden? atau apakah cukup Reliabel? kadang mungking kita mikir wadduh gimana kalo salah nih kuisioner?. Analysis gagal? waduh waduh di marah bos kah?.. Over thingking aja tross ampe types kwkwkkw.

Jadi dari pada over thingking lebih baik melakukan uji coba. Tulisan ini mungkin bisa membantu biar ga over. Yes dengan melakukan Uji Validitas dan Uji Reliabilitas.

Uji validitas dan reliabilitas bertujuan untuk mengecek apakah kuesioner atau items pertanyaan yang kita buat sudah baik atau belum.

PREPARATION

PACKAGE

Package yang digunaakn adalah :

library(readxl)           # Untuk membaca excel
library(tidyverse)        # Untuk membantu mengubah dan menyajikan data dengan lebih baik
library(psych)            # Untuk visualisasi data, analisis faktor, analisis reliabilitas, analisis korelasi, dan banyak lagi.
library(ltm)              # Untuk analisis data dikotomis dan politomus multivariat
library(dplyr)

Untuk penjelasan lebih jelasnya sangat banyak di Google. bisa jalan jalan ke sana atau pakai ChatGPT ya Evort dikit lah nuntut ilmu kwkwk…

DATA SET

Untuk contoh kasus dalam bisnis, kita bisa jalan-jalan di Kaggle. Data yang akan digunakan adalah Starbucks Customer Survey untuk mengetahui data tersebut bisa dengan mengklik di sini silahkan di download.

CLEANING DATA

# aksess data
Customer_Survey <- read.csv("D:/R/1 DATA SET/Starbuck customer survey/Starbucks satisfactory survey.csv",sep = ",", header = T)
head(Customer_Survey, 4)
str(Customer_Survey)
## 'data.frame':    122 obs. of  21 variables:
##  $ Timestamp                                                                                                              : chr  "2019/10/01 12:38:43 PM GMT+8" "2019/10/01 12:38:54 PM GMT+8" "2019/10/01 12:38:56 PM GMT+8" "2019/10/01 12:39:08 PM GMT+8" ...
##  $ X1..Your.Gender                                                                                                        : chr  "Female" "Female" "Male" "Female" ...
##  $ X2..Your.Age                                                                                                           : chr  "From 20 to 29" "From 20 to 29" "From 20 to 29" "From 20 to 29" ...
##  $ X3..Are.you.currently.....                                                                                             : chr  "Student" "Student" "Employed" "Student" ...
##  $ X4..What.is.your.annual.income.                                                                                        : chr  "Less than RM25,000" "Less than RM25,000" "Less than RM25,000" "Less than RM25,000" ...
##  $ X5..How.often.do.you.visit.Starbucks.                                                                                  : chr  "Rarely" "Rarely" "Monthly" "Rarely" ...
##  $ X6..How.do.you.usually.enjoy.Starbucks.                                                                                : chr  "Dine in" "Take away" "Dine in" "Take away" ...
##  $ X7..How.much.time.do.you.normally..spend.during.your.visit.                                                            : chr  "Between 30 minutes to 1 hour" "Below 30 minutes" "Between 30 minutes to 1 hour" "Below 30 minutes" ...
##  $ X8..The.nearest.Starbucks.s.outlet.to.you.is....                                                                       : chr  "within 1km" "1km - 3km" "more than 3km" "more than 3km" ...
##  $ X9..Do.you.have.Starbucks.membership.card.                                                                             : chr  "Yes" "Yes" "Yes" "No" ...
##  $ X10..What.do.you.most.frequently.purchase.at.Starbucks.                                                                : chr  "Coffee" "Cold drinks;Pastries" "Coffee" "Coffee" ...
##  $ X11..On.average..how.much.would.you.spend.at.Starbucks.per.visit.                                                      : chr  "Less than RM20" "Less than RM20" "Less than RM20" "Less than RM20" ...
##  $ X12..How.would.you.rate.the.quality.of.Starbucks.compared.to.other.brands..Coffee.Bean..Old.Town.White.Coffee....to.be.: int  4 4 4 2 3 4 5 4 5 4 ...
##  $ X13..How.would.you.rate.the.price.range.at.Starbucks.                                                                  : int  3 3 3 1 3 3 5 2 4 3 ...
##  $ X14..How.important.are.sales.and.promotions.in.your.purchase.decision.                                                 : int  5 4 4 4 4 5 5 3 4 3 ...
##  $ X15..How.would.you.rate.the.ambiance.at.Starbucks...lighting..music..etc....                                           : int  5 4 4 3 2 5 5 3 4 4 ...
##  $ X16..You.rate.the.WiFi.quality.at.Starbucks.as..                                                                       : int  4 4 4 3 2 4 3 3 4 3 ...
##  $ X17..How.would.you.rate.the.service.at.Starbucks...Promptness..friendliness..etc...                                    : int  4 5 4 3 3 5 5 3 4 3 ...
##  $ X18..How.likely.you.will.choose.Starbucks.for.doing.business.meetings.or.hangout.with.friends.                         : int  3 2 3 3 3 4 5 3 4 4 ...
##  $ X19..How.do.you.come.to.hear.of.promotions.at.Starbucks..Check.all.that.apply.                                         : chr  "Starbucks Website/Apps;Social Media;Emails;Deal sites (fave, iprice, etc...)" "Social Media;In Store displays" "In Store displays;Billboards" "Through friends and word of mouth" ...
##  $ X20..Will.you.continue.buying.at.Starbucks.                                                                            : chr  "Yes" "Yes" "Yes" "No" ...

Data di atas yang akan kita gunakan adalah X12 - X19 karena data yang yang sesuai scala likert adalah data tersebut. sehingga data tersebut saja yang akan kita analisa.

Customer_fiks <- Customer_Survey[, 13:19]       #[a,b] a adalah baris, b adalah colom (penggunaan [])
str(Customer_fiks)
## 'data.frame':    122 obs. of  7 variables:
##  $ X12..How.would.you.rate.the.quality.of.Starbucks.compared.to.other.brands..Coffee.Bean..Old.Town.White.Coffee....to.be.: int  4 4 4 2 3 4 5 4 5 4 ...
##  $ X13..How.would.you.rate.the.price.range.at.Starbucks.                                                                  : int  3 3 3 1 3 3 5 2 4 3 ...
##  $ X14..How.important.are.sales.and.promotions.in.your.purchase.decision.                                                 : int  5 4 4 4 4 5 5 3 4 3 ...
##  $ X15..How.would.you.rate.the.ambiance.at.Starbucks...lighting..music..etc....                                           : int  5 4 4 3 2 5 5 3 4 4 ...
##  $ X16..You.rate.the.WiFi.quality.at.Starbucks.as..                                                                       : int  4 4 4 3 2 4 3 3 4 3 ...
##  $ X17..How.would.you.rate.the.service.at.Starbucks...Promptness..friendliness..etc...                                    : int  4 5 4 3 3 5 5 3 4 3 ...
##  $ X18..How.likely.you.will.choose.Starbucks.for.doing.business.meetings.or.hangout.with.friends.                         : int  3 2 3 3 3 4 5 3 4 4 ...

Data yang kita gunakan adalah data yang bernama Customerfiks. Namun header data kita panjang sekali. kita akan coba mengubahnya dengan nama yang mudah di ingat.

colnames(Customer_fiks) <- paste0("X", 1:ncol(Customer_fiks))    # Merubah nama variable
Customer_fiks$id <- 1:nrow(Customer_fiks)      # Menambahkan colom baru berupa id
Customer_fiks <- cbind(id=Customer_fiks$id, Customer_fiks[, !names(Customer_fiks) %in% "id"])     # Mengubah colom id menjadi paling depan.
str(Customer_fiks)
## 'data.frame':    122 obs. of  8 variables:
##  $ id: int  1 2 3 4 5 6 7 8 9 10 ...
##  $ X1: int  4 4 4 2 3 4 5 4 5 4 ...
##  $ X2: int  3 3 3 1 3 3 5 2 4 3 ...
##  $ X3: int  5 4 4 4 4 5 5 3 4 3 ...
##  $ X4: int  5 4 4 3 2 5 5 3 4 4 ...
##  $ X5: int  4 4 4 3 2 4 3 3 4 3 ...
##  $ X6: int  4 5 4 3 3 5 5 3 4 3 ...
##  $ X7: int  3 2 3 3 3 4 5 3 4 4 ...

Oke.. datanya sudah rapih kek doi yang mau malmingan. selanjutnya langsung di gass.


TEST

VALIDITY TEST

Uji ini memang lebih sering dipakai oleh rekan-rekan di jurusan sosial karena terkait design alat pengukuran (kuesioner) yang menggunakan skala likert. Untuk menguji validitas, kita cukup menghitung korelasi antar variabel terhadap variabel totalnya.

Banyak pihak juga yang berargumen bahwa item-total correlations tidak bisa digunakan untuk melihat validitas, which is quite true dan validitas itu ada berbagai macam jenisnya (face validity, content validity, dan lainnya). Tapi untuk kepentingan praktis metode yang dijelaskan di blog ini adalah metode yang paling sering dipakai. Cuma tujuan utamanya adalah untuk nge-drop item yang tidak sejalan dengan apa yang kuisionernya ukur.

Uji validitas dilakukan dengan cara membuat satu variabel (kolom) baru berisi penjumlahan dari semua variabel rates yang ada. Misalkan saya definisikan variabel baru bernama Data_validity sebagai berikut:

Customer_fiks = Customer_fiks %>% 
  mutate(Data_validity = X1+X2+X3+X4+X5+X6+X7)
head(Customer_fiks, 10)

Untuk menguji validitas, kita cukup menghitung korelasi antar variabel terhadap variabel totalnya

data_without_id <- Customer_fiks[ ,2:9]
round(cor(data_without_id), 2) 
##                 X1   X2   X3   X4   X5   X6   X7 Data_validity
## X1            1.00 0.53 0.22 0.58 0.29 0.45 0.42          0.72
## X2            0.53 1.00 0.17 0.39 0.29 0.37 0.42          0.67
## X3            0.22 0.17 1.00 0.40 0.33 0.39 0.20          0.57
## X4            0.58 0.39 0.40 1.00 0.49 0.60 0.35          0.78
## X5            0.29 0.29 0.33 0.49 1.00 0.58 0.26          0.66
## X6            0.45 0.37 0.39 0.60 0.58 1.00 0.43          0.77
## X7            0.42 0.42 0.20 0.35 0.26 0.43 1.00          0.64
## Data_validity 0.72 0.67 0.57 0.78 0.66 0.77 0.64          1.00

Terlihat bahwa semua items memiliki korelasi >0.5 terhadap starbucks_rate yang berarti semua items tersebut valid (sejalan dengan apa yang kuisionernya ukur).


RELIABILITY TEST

uji ini memang lebih sering dipakai oleh rekan-rekan di jurusan sosial karena terkait design alat pengukuran (kuesioner) yang menggunakan skala likert. Uji reliabilitas digunakan untuk melihat konsistensi responden dalam menjawab kuisioner. Uji ini dilakukan terhadap seluruh pertanyaan yang ada.

Kita akan melihat nilai Cronbach’s Alpha sebagai pedoman:

Jika nilai Cronbach’s Alpha > 60 maka reliabel. 

Jika nilai Cronbach’s Alpha < 60 maka tidak reliabel. 

Untuk menghitung Cronbach’s Alpha, saya menggunakan library(psych).

alpha(data_without_id)
## 
## Reliability analysis   
## Call: alpha(x = data_without_id)
## 
##   raw_alpha std.alpha G6(smc) average_r S/N    ase mean  sd median_r
##       0.77      0.87    0.84      0.46 6.9 0.0066  6.2 1.2     0.42
## 
##     95% confidence boundaries 
##          lower alpha upper
## Feldt     0.70  0.77  0.83
## Duhachek  0.76  0.77  0.78
## 
##  Reliability if an item is dropped:
##               raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r med.r
## X1                 0.74      0.86    0.94      0.46 6.1   0.0081 0.032  0.42
## X2                 0.74      0.87    0.93      0.48 6.5   0.0083 0.032  0.45
## X3                 0.75      0.88    0.93      0.51 7.3   0.0081 0.026  0.49
## X4                 0.73      0.85    0.95      0.45 5.7   0.0081 0.033  0.42
## X5                 0.74      0.87    0.94      0.48 6.5   0.0080 0.032  0.43
## X6                 0.74      0.85    0.96      0.45 5.6   0.0079 0.033  0.42
## X7                 0.74      0.87    0.93      0.49 6.7   0.0082 0.032  0.49
## Data_validity      0.81      0.82    0.82      0.39 4.4   0.0270 0.016  0.39
## 
##  Item statistics 
##                 n raw.r std.r r.cor r.drop mean   sd
## X1            122  0.72  0.72  0.69   0.67  3.7 0.94
## X2            122  0.67  0.66  0.59   0.60  2.9 1.08
## X3            122  0.57  0.56  0.46   0.49  3.8 1.09
## X4            122  0.78  0.79  0.77   0.74  3.8 0.93
## X5            122  0.66  0.67  0.61   0.60  3.3 0.96
## X6            122  0.77  0.79  0.77   0.73  3.7 0.83
## X7            122  0.64  0.64  0.56   0.57  3.5 1.03
## Data_validity 122  1.00  1.00  0.90   1.00 24.6 4.69
## 
## Non missing response frequency for each item
##       1    2    3    4    5 miss
## X1 0.02 0.07 0.32 0.40 0.19    0
## X2 0.11 0.22 0.39 0.20 0.07    0
## X3 0.05 0.06 0.25 0.34 0.30    0
## X4 0.02 0.05 0.29 0.43 0.21    0
## X5 0.06 0.11 0.44 0.31 0.08    0
## X6 0.01 0.03 0.35 0.42 0.19    0
## X7 0.03 0.12 0.32 0.34 0.18    0

Nilai Cronbach’s Alpha dapat dilihat dari nilai raw_alpha, yakni sebesar 0.79, artinya kuesioner yang kita gunakan sudah reliabel.

Selanjutnya, kita bisa melihat data raw_alpha per variabel. Nilai raw_alpha tersebut mengindikasikan besaran raw_alpha dari kuesioner jika item tersebut dihapus (Reliability if an item is dropped).


Silahkan di Share ya. Terimakasih

LS0tDQp0aXRsZTogIlZhbGlkaXRhcyBkYW4gUmVsaWFiaWxpdGFzIFRlcyINCnN1YnRpdGxlOiAifiBQZW5nZ3VuYWFuIGtlc2VoYXJpYW4gfiINCmF1dGhvcjogIkFsYmFuaSINCmRhdGU6ICJgIHIgU3lzLkRhdGUoKSINCm91dHB1dDogDQogIHJtZGZvcm1hdHM6OnJvYm9ib29rOg0KICAgIHRvYzogNA0KICAgIHNlY3Rpb25fbnVtYmVyOiB5ZXMNCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQ0KICAgIHRodW1ibmFpbHM6IHRydWUNCiAgICBsaWdodGJveDogdHJ1ZQ0KICAgIGdhbGxlcnk6IHRydWUNCiAgICBsaWJfZGlyOiB0cnVlDQogICAgZGZfcHJpbnQ6ICJwYWdlZCINCiAgICBjb2RlX2ZvbGRpbmc6ICJzaG93Ig0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIGNzczogInN0eWxlLmNzcyINCi0tLQ0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQobWVzc2FnZSA9IEYsDQogICAgICAgICAgICAgICAgICAgICAgd2FybmluZyA9IEYpDQpgYGANCg0KPGJyPg0KDQp8DQo6LS0tfDotLS0NCioqQ29udGFjdCoqICAgfA0KTmFtZSB8IEFsYmFuaSAgIHwNCkUtbWFpbCB8IGFsYmFuaS5iYWdhQGdtYWlsLmNvbSAgICB8DQpMaW5rZWRpbiB8IGh0dHBzOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9hbC1iYW5pLTUzMmIwNjI5NC8NCg0KKioqKg0KDQojIEVQSUxPRw0KDQpwZXJuYWgga2FoIGtpdGEgYmVyZmlraXIgdGVudGFuZyBhcGFrYWgga3Vpc2lvbmVyIGtpdGEgc3VkYWggY3VrdXAgdmFsaWQgZGVuZ2FuIGphd2FiYW4gcmVzcG9uZGVuPyBhdGF1IGFwYWthaCBjdWt1cCBSZWxpYWJlbD8ga2FkYW5nIG11bmdraW5nIGtpdGEgbWlraXIgd2FkZHVoIGdpbWFuYSBrYWxvIHNhbGFoIG5paCBrdWlzaW9uZXI/LiBBbmFseXNpcyBnYWdhbD8gd2FkdWggd2FkdWggZGkgbWFyYWggYm9zIGthaD8uLiBPdmVyIHRoaW5na2luZyBhamEgdHJvc3MgYW1wZSB0eXBlcyBrd2t3a2t3LiANCg0KSmFkaSBkYXJpIHBhZGEgb3ZlciB0aGluZ2tpbmcgbGViaWggYmFpayBtZWxha3VrYW4gdWppIGNvYmEuIFR1bGlzYW4gaW5pIG11bmdraW4gYmlzYSBtZW1iYW50dSBiaWFyIGdhIG92ZXIuIFllcyBkZW5nYW4gbWVsYWt1a2FuICpVamkgVmFsaWRpdGFzKiBkYW4gKlVqaSBSZWxpYWJpbGl0YXMqLiANCg0KICAgIFVqaSB2YWxpZGl0YXMgZGFuIHJlbGlhYmlsaXRhcyBiZXJ0dWp1YW4gdW50dWsgbWVuZ2VjZWsgYXBha2FoIGt1ZXNpb25lciBhdGF1IGl0ZW1zIHBlcnRhbnlhYW4geWFuZyBraXRhIGJ1YXQgc3VkYWggYmFpayBhdGF1IGJlbHVtLg0KDQoqKioqDQoNCiMgUFJFUEFSQVRJT04NCg0KIyMgUEFDS0FHRQ0KDQpQYWNrYWdlIHlhbmcgZGlndW5hYWtuIGFkYWxhaCA6IA0KDQpgYGB7cn0NCmxpYnJhcnkocmVhZHhsKSAgICAgICAgICAgIyBVbnR1ayBtZW1iYWNhIGV4Y2VsDQpsaWJyYXJ5KHRpZHl2ZXJzZSkgICAgICAgICMgVW50dWsgbWVtYmFudHUgbWVuZ3ViYWggZGFuIG1lbnlhamlrYW4gZGF0YSBkZW5nYW4gbGViaWggYmFpaw0KbGlicmFyeShwc3ljaCkgICAgICAgICAgICAjIFVudHVrIHZpc3VhbGlzYXNpIGRhdGEsIGFuYWxpc2lzIGZha3RvciwgYW5hbGlzaXMgcmVsaWFiaWxpdGFzLCBhbmFsaXNpcyBrb3JlbGFzaSwgZGFuIGJhbnlhayBsYWdpLg0KbGlicmFyeShsdG0pICAgICAgICAgICAgICAjIFVudHVrIGFuYWxpc2lzIGRhdGEgZGlrb3RvbWlzIGRhbiBwb2xpdG9tdXMgbXVsdGl2YXJpYXQNCmxpYnJhcnkoZHBseXIpDQpgYGANCg0KVW50dWsgcGVuamVsYXNhbiBsZWJpaCBqZWxhc255YSBzYW5nYXQgYmFueWFrIGRpIEdvb2dsZS4gYmlzYSBqYWxhbiBqYWxhbiBrZSBzYW5hIGF0YXUgcGFrYWkgQ2hhdEdQVCB5YSBFdm9ydCBkaWtpdCBsYWggbnVudHV0IGlsbXUga3drd2suLi4NCg0KIyMgREFUQSBTRVQNCg0KVW50dWsgY29udG9oIGthc3VzIGRhbGFtIGJpc25pcywga2l0YSBiaXNhIGphbGFuLWphbGFuIGRpIGBLYWdnbGVgLiBEYXRhIHlhbmcgYWthbiBkaWd1bmFrYW4gYWRhbGFoICoqU3RhcmJ1Y2tzIEN1c3RvbWVyIFN1cnZleSoqIHVudHVrIG1lbmdldGFodWkgZGF0YSB0ZXJzZWJ1dCBiaXNhIGRlbmdhbiBtZW5na2xpayBbZGkgc2luaV0oaHR0cHM6Ly93d3cua2FnZ2xlLmNvbS9kYXRhc2V0cy9tYWhpcmFobXpoL3N0YXJidWNrcy1jdXN0b21lci1yZXRlbnRpb24tbWFsYXlzaWEtc3VydmV5KSBzaWxhaGthbiBkaSBkb3dubG9hZC4NCg0KIyMgQ0xFQU5JTkcgREFUQQ0KDQpgYGB7cn0NCiMgYWtzZXNzIGRhdGENCkN1c3RvbWVyX1N1cnZleSA8LSByZWFkLmNzdigiRDovUi8xIERBVEEgU0VUL1N0YXJidWNrIGN1c3RvbWVyIHN1cnZleS9TdGFyYnVja3Mgc2F0aXNmYWN0b3J5IHN1cnZleS5jc3YiLHNlcCA9ICIsIiwgaGVhZGVyID0gVCkNCmhlYWQoQ3VzdG9tZXJfU3VydmV5LCA0KQ0KYGBgDQpgYGB7cn0NCnN0cihDdXN0b21lcl9TdXJ2ZXkpDQpgYGANCkRhdGEgZGkgYXRhcyB5YW5nIGFrYW4ga2l0YSBndW5ha2FuIGFkYWxhaCBgWDEyYCAtIGBYMTlgIGthcmVuYSBkYXRhIHlhbmcgeWFuZyBzZXN1YWkgc2NhbGEgbGlrZXJ0IGFkYWxhaCBkYXRhIHRlcnNlYnV0LiBzZWhpbmdnYSBkYXRhIHRlcnNlYnV0IHNhamEgeWFuZyBha2FuIGtpdGEgYW5hbGlzYS4NCg0KYGBge3J9DQpDdXN0b21lcl9maWtzIDwtIEN1c3RvbWVyX1N1cnZleVssIDEzOjE5XSAgICAgICAjW2EsYl0gYSBhZGFsYWggYmFyaXMsIGIgYWRhbGFoIGNvbG9tIChwZW5nZ3VuYWFuIFtdKQ0Kc3RyKEN1c3RvbWVyX2Zpa3MpDQpgYGANCkRhdGEgeWFuZyBraXRhIGd1bmFrYW4gYWRhbGFoIGRhdGEgeWFuZyBiZXJuYW1hIGBDdXN0b21lcmZpa3NgLiBOYW11biBoZWFkZXIgZGF0YSBraXRhIHBhbmphbmcgc2VrYWxpLiBraXRhIGFrYW4gY29iYSBtZW5ndWJhaG55YSBkZW5nYW4gbmFtYSB5YW5nIG11ZGFoIGRpIGluZ2F0Lg0KDQpgYGB7cn0NCmNvbG5hbWVzKEN1c3RvbWVyX2Zpa3MpIDwtIHBhc3RlMCgiWCIsIDE6bmNvbChDdXN0b21lcl9maWtzKSkgICAgIyBNZXJ1YmFoIG5hbWEgdmFyaWFibGUNCkN1c3RvbWVyX2Zpa3MkaWQgPC0gMTpucm93KEN1c3RvbWVyX2Zpa3MpICAgICAgIyBNZW5hbWJhaGthbiBjb2xvbSBiYXJ1IGJlcnVwYSBpZA0KQ3VzdG9tZXJfZmlrcyA8LSBjYmluZChpZD1DdXN0b21lcl9maWtzJGlkLCBDdXN0b21lcl9maWtzWywgIW5hbWVzKEN1c3RvbWVyX2Zpa3MpICVpbiUgImlkIl0pICAgICAjIE1lbmd1YmFoIGNvbG9tIGlkIG1lbmphZGkgcGFsaW5nIGRlcGFuLg0Kc3RyKEN1c3RvbWVyX2Zpa3MpDQpgYGANCk9rZS4uIGRhdGFueWEgc3VkYWggcmFwaWgga2VrIGRvaSB5YW5nIG1hdSBtYWxtaW5nYW4uIHNlbGFuanV0bnlhIGxhbmdzdW5nIGRpIGdhc3MuDQoNCioqKioNCg0KIyBURVNUDQoNCiMjIFZBTElESVRZIFRFU1QNCg0KVWppIGluaSBtZW1hbmcgbGViaWggc2VyaW5nIGRpcGFrYWkgb2xlaCByZWthbi1yZWthbiBkaSBqdXJ1c2FuIHNvc2lhbCBrYXJlbmEgdGVya2FpdCBkZXNpZ24gYWxhdCBwZW5ndWt1cmFuIChrdWVzaW9uZXIpIHlhbmcgbWVuZ2d1bmFrYW4gc2thbGEgbGlrZXJ0LiBVbnR1ayBtZW5ndWppIHZhbGlkaXRhcywga2l0YSBjdWt1cCBtZW5naGl0dW5nIGtvcmVsYXNpIGFudGFyIHZhcmlhYmVsIHRlcmhhZGFwIHZhcmlhYmVsIHRvdGFsbnlhLg0KDQpCYW55YWsgcGloYWsganVnYSB5YW5nIGJlcmFyZ3VtZW4gYmFod2EgaXRlbS10b3RhbCBjb3JyZWxhdGlvbnMgdGlkYWsgYmlzYSBkaWd1bmFrYW4gdW50dWsgbWVsaWhhdCB2YWxpZGl0YXMsIHdoaWNoIGlzIHF1aXRlIHRydWUgZGFuIHZhbGlkaXRhcyBpdHUgYWRhIGJlcmJhZ2FpIG1hY2FtIGplbmlzbnlhIChmYWNlIHZhbGlkaXR5LCBjb250ZW50IHZhbGlkaXR5LCBkYW4gbGFpbm55YSkuIFRhcGkgdW50dWsga2VwZW50aW5nYW4gcHJha3RpcyBtZXRvZGUgeWFuZyBkaWplbGFza2FuIGRpIGJsb2cgaW5pIGFkYWxhaCBtZXRvZGUgeWFuZyBwYWxpbmcgc2VyaW5nIGRpcGFrYWkuIEN1bWEgdHVqdWFuIHV0YW1hbnlhIGFkYWxhaCB1bnR1ayBuZ2UtZHJvcCBpdGVtIHlhbmcgdGlkYWsgc2VqYWxhbiBkZW5nYW4gYXBhIHlhbmcga3Vpc2lvbmVybnlhIHVrdXIuIA0KDQpVamkgdmFsaWRpdGFzIGRpbGFrdWthbiBkZW5nYW4gY2FyYSBtZW1idWF0IHNhdHUgdmFyaWFiZWwgKGtvbG9tKSBiYXJ1IGJlcmlzaSBwZW5qdW1sYWhhbiBkYXJpIHNlbXVhIHZhcmlhYmVsIHJhdGVzIHlhbmcgYWRhLiBNaXNhbGthbiBzYXlhIGRlZmluaXNpa2FuIHZhcmlhYmVsIGJhcnUgYmVybmFtYSBgRGF0YV92YWxpZGl0eWAgc2ViYWdhaSBiZXJpa3V0Og0KDQpgYGB7cn0NCkN1c3RvbWVyX2Zpa3MgPSBDdXN0b21lcl9maWtzICU+JSANCiAgbXV0YXRlKERhdGFfdmFsaWRpdHkgPSBYMStYMitYMytYNCtYNStYNitYNykNCmhlYWQoQ3VzdG9tZXJfZmlrcywgMTApDQpgYGANClVudHVrIG1lbmd1amkgdmFsaWRpdGFzLCBraXRhIGN1a3VwIG1lbmdoaXR1bmcga29yZWxhc2kgYW50YXIgdmFyaWFiZWwgdGVyaGFkYXAgdmFyaWFiZWwgdG90YWxueWENCmBgYHtyfQ0KZGF0YV93aXRob3V0X2lkIDwtIEN1c3RvbWVyX2Zpa3NbICwyOjldDQpyb3VuZChjb3IoZGF0YV93aXRob3V0X2lkKSwgMikgDQpgYGANCg0KDQpUZXJsaWhhdCBiYWh3YSBzZW11YSBpdGVtcyBtZW1pbGlraSBrb3JlbGFzaSBgPjAuNWAgdGVyaGFkYXAgc3RhcmJ1Y2tzX3JhdGUgeWFuZyBiZXJhcnRpIHNlbXVhIGl0ZW1zIHRlcnNlYnV0IHZhbGlkIChzZWphbGFuIGRlbmdhbiBhcGEgeWFuZyBrdWlzaW9uZXJueWEgdWt1cikuDQoNCioqKioNCg0KIyMgUkVMSUFCSUxJVFkgVEVTVA0KDQp1amkgaW5pIG1lbWFuZyBsZWJpaCBzZXJpbmcgZGlwYWthaSBvbGVoIHJla2FuLXJla2FuIGRpIGp1cnVzYW4gc29zaWFsIGthcmVuYSB0ZXJrYWl0IGRlc2lnbiBhbGF0IHBlbmd1a3VyYW4gKGt1ZXNpb25lcikgeWFuZyBtZW5nZ3VuYWthbiBza2FsYSBsaWtlcnQuIFVqaSByZWxpYWJpbGl0YXMgZGlndW5ha2FuIHVudHVrIG1lbGloYXQga29uc2lzdGVuc2kgcmVzcG9uZGVuIGRhbGFtIG1lbmphd2FiIGt1aXNpb25lci4gVWppIGluaSBkaWxha3VrYW4gdGVyaGFkYXAgc2VsdXJ1aCBwZXJ0YW55YWFuIHlhbmcgYWRhLiANCg0KS2l0YSBha2FuIG1lbGloYXQgbmlsYWkgQ3JvbmJhY2jigJlzIEFscGhhIHNlYmFnYWkgcGVkb21hbjogDQoNCiAgICBKaWthIG5pbGFpIENyb25iYWNo4oCZcyBBbHBoYSA+IDYwIG1ha2EgcmVsaWFiZWwuIA0KDQogICAgSmlrYSBuaWxhaSBDcm9uYmFjaOKAmXMgQWxwaGEgPCA2MCBtYWthIHRpZGFrIHJlbGlhYmVsLiANCg0KVW50dWsgbWVuZ2hpdHVuZyBDcm9uYmFjaOKAmXMgQWxwaGEsIHNheWEgbWVuZ2d1bmFrYW4gbGlicmFyeShwc3ljaCkuIA0KDQpgYGB7cn0NCmFscGhhKGRhdGFfd2l0aG91dF9pZCkNCmBgYA0KTmlsYWkgYENyb25iYWNo4oCZcyBBbHBoYWAgZGFwYXQgZGlsaWhhdCBkYXJpIG5pbGFpIGByYXdfYWxwaGFgLCB5YWtuaSBzZWJlc2FyIGAwLjc5YCwgYXJ0aW55YSBrdWVzaW9uZXIgeWFuZyBraXRhIGd1bmFrYW4gc3VkYWggcmVsaWFiZWwuDQoNClNlbGFuanV0bnlhLCBraXRhIGJpc2EgbWVsaWhhdCBkYXRhIHJhd19hbHBoYSBwZXIgdmFyaWFiZWwuIE5pbGFpIHJhd19hbHBoYSB0ZXJzZWJ1dCBtZW5naW5kaWthc2lrYW4gYmVzYXJhbiByYXdfYWxwaGEgZGFyaSBrdWVzaW9uZXIgamlrYSBpdGVtIHRlcnNlYnV0IGRpaGFwdXMgKFJlbGlhYmlsaXR5IGlmIGFuIGl0ZW0gaXMgZHJvcHBlZCkuDQoNCioqKioNCg0KU2lsYWhrYW4gZGkgU2hhcmUgeWEuIFRlcmltYWthc2loDQo=