Algoritma & Struktur Data

~ Ujian Tengah Semester ~


Kontak : \(\downarrow\)
Email
Instagram https://www.instagram.com/fe_nw/
RPubs https://rpubs.com/ferdnw/

Kasus 1

Asumsikan Anda telah mengumpulkan beberapa kumpulan data dari perusahaan ABC Property seperti yang dapat kita lihat pada tabel berikut:

Id             <- (1:10000)
Marketing_Name <- rep(c("Angel","Sherly","Vanessa","Irene","Julian",
                        "Jeffry","Nikita","Kefas","Siana","Lala",
                        "Fallen","Ardifo","Kevin","Juen","Jerrel",
                        "Imelda","Widi","Theodora","Elvani","Jonathan",
                        "Sofia","Abraham","Siti","Niko","Sefli",
                        "Bene", "Diana", "Pupe", "Andi", "Tatha",
                        "Endri", "Monika", "Hans", "Debora","Hanifa",
                        "James", "Jihan", "Friska","Ardiwan", "Bakti",
                        "Anthon","Amry", "Wiwik", "Bastian", "Budi",
                        "Leo","Simon","Matius","Arry", "Eliando"), 200)
Work_Exp       <- rep(c(1.3,2.4,2.5,3.6,3.7,4.7,5.7,6.7,7.7,7.3,
                        5.3,5.3,10,9.3,3.3,3.3,3.4,3.4,3.5,5.6,
                        3.5,4.6,4.6,5.7,6.2,4.4,6.4,6.4,3.5,7.5,
                        4.6,3.7,4.7,4.3,5.2,6.3,7.4,2.4,3.4,8.2,
                        6.4,7.2,1.5,7.5,10,4.5,6.5,7.2,7.1,7.6),200)
City           <- sample(c("Jakarta","Bogor","Depok","Tengerang","Bekasi"),10000, replace = T)
Cluster        <- sample(c("Victoria","Palmyra","Winona","Tiara", "Narada",
                           "Peronia","Lavesh","Alindra","Sweethome", "Asera",
                           "Teradamai","Albasia", "Adara","Neon","Arana",
                           "Asoka", "Primadona", "Mutiara","Permata","Alamanda" ), 10000, replace=T)
Price          <- sample(c(7000:15000),10000, replace = T)
Date_Sales     <- sample(seq(as.Date("2018/01/01"), by = "day", length.out = 1000),10000, replace = T)
Advertisement  <- sample(c(1:20), 10000, replace = T)
Data           <- data.frame(Id, 
                             Marketing_Name,
                             Work_Exp,
                             City,
                             Cluster,
                             Price,
                             Date_Sales,
                             Advertisement)
library(DT)
datatable(Data)

Soal 1

Kategorikan variabel Harga pada dataset di atas menjadi tiga kelompok sebagai berikut:

  • \(\text{High} > 12000\)
  • \(10000 \le \text{Medium} \le 12000\)
  • \(\text{Low} < 10000\)

Tetapkan ke dalam variabel baru yang disebut Kelas dengan menggunakan fungsi kontrol If, else if, dan else.

R

# tuliskan koding R kalian disini
x= Data$Price
y = ifelse((x>12000),print('High'), ifelse((x>=10000 & x<=12000), print('Medium'), print('Low')))
## [1] "High"
## [1] "Medium"
## [1] "Low"
Data$Classes = y
datatable(Data)

Soal 2

Kategorikan variabel Harga pada dataset di atas menjadi enam kelompok sebagai berikut:

  • Booking_fee nya 5 % jika \(\text{Price} < 8000\)
  • Booking_fee nya 6 % jika \(8000 \le \text{Price} < 9000\)
  • Booking_fee nya 7 % jika \(9000 \le \text{Price} < 10000\)
  • Booking_fee nya 8 % jika \(10000 \le \text{Price} < 11000\)
  • Booking_fee nya 9 % jika \(11000 \le \text{Price} < 13000\)
  • Booking_fee nya 10 % jika \(13000 \le \text{Price} \le 15000\)

Tetapkan ke dalam variabel baru yang disebut Booking_fee dengan menggunakan fungsi kontrol If, else if, dan else.

R

k = Data$Price
l = ifelse((k<8000), 5/100*Data$Price, ifelse((k>=8000 & k<9000),6/100*Data$Price, ifelse((k>=9000 & k<10000), 7/100*Data$Price ,ifelse((k>= 10000 & k<11000), 8/100*Data$Price, ifelse ((k>=11000 & k<13000), 9/100*Data$Price,1/10*Data$Price))) ))

Data$BookingFee = l
Data

Soal 3

Menurut kumpulan data akhir yang telah Anda buat pada soal no 2, saya berasumsi bahwa Anda telah bekerja sebagai pemasaran di perusahaan ABC Property, bagaimana Anda dapat mengumpulkan semua informasi tentang penjualan Anda dengan menggunakan pernyataan for.

R

library(DT)

z=for(x  in "Irene" ){print(subset(Data,subset=(Marketing_Name== x)))}
##        Id Marketing_Name Work_Exp      City   Cluster Price Date_Sales
## 4       4          Irene      3.6 Tengerang   Permata  7323 2018-11-03
## 54     54          Irene      3.6    Bekasi     Asoka  7158 2018-12-27
## 104   104          Irene      3.6     Bogor Teradamai  7538 2020-03-07
## 154   154          Irene      3.6    Bekasi     Adara  7268 2018-06-13
## 204   204          Irene      3.6   Jakarta     Asera 14417 2018-07-01
## 254   254          Irene      3.6     Depok  Alamanda 13613 2018-08-01
## 304   304          Irene      3.6     Bogor    Lavesh 10605 2018-11-15
## 354   354          Irene      3.6   Jakarta    Narada 10786 2020-04-27
## 404   404          Irene      3.6 Tengerang   Alindra 11820 2018-02-08
## 454   454          Irene      3.6     Depok     Asoka  9672 2019-02-18
## 504   504          Irene      3.6     Depok  Alamanda 10247 2020-04-08
## 554   554          Irene      3.6     Bogor     Arana 14623 2020-07-05
## 604   604          Irene      3.6    Bekasi    Winona  9467 2018-06-22
## 654   654          Irene      3.6     Depok   Permata  9016 2019-07-09
## 704   704          Irene      3.6 Tengerang   Albasia  8105 2019-01-14
## 754   754          Irene      3.6   Jakarta   Peronia  8964 2018-05-20
## 804   804          Irene      3.6   Jakarta     Arana 13280 2018-07-03
## 854   854          Irene      3.6   Jakarta Primadona 13644 2019-03-06
## 904   904          Irene      3.6   Jakarta   Permata 11010 2018-04-06
## 954   954          Irene      3.6     Bogor Primadona 10587 2019-04-15
## 1004 1004          Irene      3.6   Jakarta    Narada 12511 2020-09-06
## 1054 1054          Irene      3.6    Bekasi   Mutiara  8049 2019-03-08
## 1104 1104          Irene      3.6     Depok    Narada 13829 2020-06-25
## 1154 1154          Irene      3.6     Bogor Sweethome 11032 2020-04-11
## 1204 1204          Irene      3.6   Jakarta     Tiara 13707 2019-11-02
## 1254 1254          Irene      3.6   Jakarta   Albasia 11023 2020-02-18
## 1304 1304          Irene      3.6     Depok    Narada 10159 2020-09-05
## 1354 1354          Irene      3.6 Tengerang      Neon 11180 2019-09-24
## 1404 1404          Irene      3.6 Tengerang     Asoka  7307 2020-09-03
## 1454 1454          Irene      3.6 Tengerang  Alamanda 13435 2018-04-12
## 1504 1504          Irene      3.6     Bogor     Arana 11532 2019-04-18
## 1554 1554          Irene      3.6     Depok    Winona 14982 2018-10-27
## 1604 1604          Irene      3.6    Bekasi     Asoka 11617 2019-05-15
## 1654 1654          Irene      3.6     Bogor Teradamai 10828 2020-03-26
## 1704 1704          Irene      3.6     Depok  Alamanda  8138 2020-01-07
## 1754 1754          Irene      3.6     Depok Sweethome  9632 2019-10-02
## 1804 1804          Irene      3.6     Bogor     Adara 13244 2020-05-22
## 1854 1854          Irene      3.6     Depok   Alindra 12778 2018-07-19
## 1904 1904          Irene      3.6    Bekasi Teradamai  7847 2018-06-07
## 1954 1954          Irene      3.6 Tengerang Teradamai  9282 2020-06-28
## 2004 2004          Irene      3.6   Jakarta Sweethome  9264 2019-11-08
## 2054 2054          Irene      3.6   Jakarta    Lavesh 12223 2018-10-24
## 2104 2104          Irene      3.6    Bekasi    Lavesh 13444 2018-03-27
## 2154 2154          Irene      3.6    Bekasi    Winona 10138 2020-08-01
## 2204 2204          Irene      3.6   Jakarta   Albasia  7012 2018-09-03
## 2254 2254          Irene      3.6    Bekasi   Mutiara  8021 2018-08-02
## 2304 2304          Irene      3.6 Tengerang Primadona  7580 2019-04-25
## 2354 2354          Irene      3.6     Depok   Palmyra 10905 2019-12-13
## 2404 2404          Irene      3.6 Tengerang     Asoka 14141 2019-08-21
## 2454 2454          Irene      3.6   Jakarta     Adara 10168 2020-06-08
## 2504 2504          Irene      3.6   Jakarta     Asoka 10303 2020-07-07
## 2554 2554          Irene      3.6     Bogor Sweethome 12546 2018-12-03
## 2604 2604          Irene      3.6     Depok     Asera  9602 2018-04-22
## 2654 2654          Irene      3.6     Bogor     Arana  9728 2018-08-17
## 2704 2704          Irene      3.6     Depok Primadona  9521 2018-08-19
## 2754 2754          Irene      3.6     Bogor   Mutiara 14280 2020-04-26
## 2804 2804          Irene      3.6   Jakarta    Winona 12260 2019-09-03
## 2854 2854          Irene      3.6     Depok   Peronia  7044 2020-03-14
## 2904 2904          Irene      3.6 Tengerang   Alindra 12053 2020-02-21
## 2954 2954          Irene      3.6     Depok     Adara 11571 2018-01-21
## 3004 3004          Irene      3.6     Bogor  Alamanda 11444 2019-10-26
## 3054 3054          Irene      3.6 Tengerang Teradamai 13860 2019-11-05
## 3104 3104          Irene      3.6   Jakarta     Arana  8472 2020-07-26
## 3154 3154          Irene      3.6   Jakarta     Asoka 13919 2019-05-26
## 3204 3204          Irene      3.6    Bekasi   Palmyra 14174 2020-05-27
## 3254 3254          Irene      3.6    Bekasi Teradamai 10083 2020-01-27
## 3304 3304          Irene      3.6     Depok     Asera 13998 2018-02-07
## 3354 3354          Irene      3.6   Jakarta   Palmyra  9622 2018-10-18
## 3404 3404          Irene      3.6     Depok   Permata  8133 2018-04-14
## 3454 3454          Irene      3.6    Bekasi Primadona 13569 2018-09-23
## 3504 3504          Irene      3.6   Jakarta  Alamanda 10723 2018-03-16
## 3554 3554          Irene      3.6     Bogor     Adara  8542 2018-08-03
## 3604 3604          Irene      3.6     Depok  Victoria 12879 2019-03-30
## 3654 3654          Irene      3.6     Bogor Primadona 14179 2020-08-17
## 3704 3704          Irene      3.6    Bekasi  Alamanda 10191 2019-01-10
## 3754 3754          Irene      3.6 Tengerang Teradamai  7365 2019-08-25
## 3804 3804          Irene      3.6    Bekasi   Albasia 11796 2018-07-04
## 3854 3854          Irene      3.6   Jakarta     Asera 14666 2019-06-19
## 3904 3904          Irene      3.6 Tengerang Primadona 11587 2020-09-01
## 3954 3954          Irene      3.6     Depok   Mutiara 12995 2018-04-24
## 4004 4004          Irene      3.6     Bogor     Tiara  8421 2020-09-24
## 4054 4054          Irene      3.6    Bekasi  Victoria 14494 2018-03-03
## 4104 4104          Irene      3.6 Tengerang Primadona 12004 2018-10-31
## 4154 4154          Irene      3.6     Depok Teradamai  7799 2018-11-01
## 4204 4204          Irene      3.6 Tengerang     Asera 11524 2018-02-19
## 4254 4254          Irene      3.6 Tengerang     Asoka 11976 2019-07-10
## 4304 4304          Irene      3.6 Tengerang     Adara 12811 2020-08-16
## 4354 4354          Irene      3.6     Depok   Mutiara 11728 2018-06-21
## 4404 4404          Irene      3.6     Bogor Primadona  7646 2019-08-30
## 4454 4454          Irene      3.6     Depok     Arana 14657 2018-10-16
## 4504 4504          Irene      3.6   Jakarta   Mutiara 13785 2018-07-21
## 4554 4554          Irene      3.6   Jakarta  Victoria 13686 2019-08-17
## 4604 4604          Irene      3.6    Bekasi    Lavesh 11347 2020-06-30
## 4654 4654          Irene      3.6   Jakarta     Asoka 12531 2020-08-20
## 4704 4704          Irene      3.6 Tengerang    Narada  8384 2019-03-09
## 4754 4754          Irene      3.6     Depok    Narada  9098 2018-10-24
## 4804 4804          Irene      3.6 Tengerang  Alamanda  9029 2020-02-05
## 4854 4854          Irene      3.6   Jakarta Sweethome  9109 2019-04-22
## 4904 4904          Irene      3.6     Depok     Arana 11097 2019-01-27
## 4954 4954          Irene      3.6     Bogor   Mutiara  8455 2020-09-12
## 5004 5004          Irene      3.6     Depok Primadona  8175 2018-02-28
## 5054 5054          Irene      3.6 Tengerang      Neon 12526 2019-06-25
## 5104 5104          Irene      3.6     Bogor   Alindra  8050 2018-05-29
## 5154 5154          Irene      3.6     Depok    Lavesh 10702 2019-04-02
## 5204 5204          Irene      3.6     Depok   Albasia 11470 2020-04-24
## 5254 5254          Irene      3.6    Bekasi   Peronia 11261 2018-10-25
## 5304 5304          Irene      3.6   Jakarta Teradamai  7829 2019-08-13
## 5354 5354          Irene      3.6    Bekasi    Lavesh  7362 2018-12-15
## 5404 5404          Irene      3.6   Jakarta Primadona  8841 2019-11-17
## 5454 5454          Irene      3.6     Depok     Asoka  9609 2019-03-25
## 5504 5504          Irene      3.6     Bogor   Palmyra 11582 2020-03-03
## 5554 5554          Irene      3.6    Bekasi   Albasia  7183 2019-12-16
## 5604 5604          Irene      3.6     Bogor    Winona 13655 2020-01-24
## 5654 5654          Irene      3.6     Depok   Permata  7885 2019-04-02
## 5704 5704          Irene      3.6     Bogor   Peronia  9197 2020-06-03
## 5754 5754          Irene      3.6     Depok   Palmyra 14645 2019-07-08
## 5804 5804          Irene      3.6     Bogor  Alamanda 13653 2019-01-26
## 5854 5854          Irene      3.6     Bogor    Lavesh  7232 2018-02-27
## 5904 5904          Irene      3.6 Tengerang Primadona  8533 2019-02-28
## 5954 5954          Irene      3.6     Bogor Primadona 10785 2018-05-20
## 6004 6004          Irene      3.6 Tengerang     Asera 10630 2018-04-14
## 6054 6054          Irene      3.6 Tengerang Sweethome  8251 2019-05-17
## 6104 6104          Irene      3.6     Bogor    Narada 10997 2018-12-30
## 6154 6154          Irene      3.6 Tengerang   Albasia  7952 2020-06-17
## 6204 6204          Irene      3.6     Bogor     Arana  9750 2019-08-07
## 6254 6254          Irene      3.6     Depok  Alamanda 11580 2018-12-15
## 6304 6304          Irene      3.6     Depok   Albasia 12963 2020-02-13
## 6354 6354          Irene      3.6     Depok   Albasia  7889 2019-01-20
## 6404 6404          Irene      3.6   Jakarta      Neon 12499 2019-10-16
## 6454 6454          Irene      3.6    Bekasi   Mutiara  7446 2020-08-13
## 6504 6504          Irene      3.6 Tengerang     Adara  8824 2018-05-29
## 6554 6554          Irene      3.6   Jakarta    Lavesh  9558 2018-09-17
## 6604 6604          Irene      3.6 Tengerang     Asera  9583 2020-02-07
## 6654 6654          Irene      3.6     Depok   Palmyra 10336 2019-05-03
## 6704 6704          Irene      3.6   Jakarta     Arana  7869 2020-06-04
## 6754 6754          Irene      3.6     Bogor Sweethome  9979 2019-04-07
## 6804 6804          Irene      3.6 Tengerang   Permata  7879 2018-01-03
## 6854 6854          Irene      3.6 Tengerang     Tiara 10737 2019-11-28
## 6904 6904          Irene      3.6 Tengerang   Albasia  8943 2020-04-07
## 6954 6954          Irene      3.6    Bekasi  Victoria  7056 2018-03-11
## 7004 7004          Irene      3.6    Bekasi   Alindra  8801 2020-04-27
## 7054 7054          Irene      3.6     Bogor    Lavesh 14966 2020-01-22
## 7104 7104          Irene      3.6   Jakarta     Tiara 11991 2019-08-10
## 7154 7154          Irene      3.6     Bogor Sweethome 13470 2020-01-25
## 7204 7204          Irene      3.6 Tengerang     Asera  7585 2020-09-21
## 7254 7254          Irene      3.6     Depok   Palmyra  8530 2018-07-18
## 7304 7304          Irene      3.6 Tengerang     Arana  7490 2020-08-18
## 7354 7354          Irene      3.6   Jakarta    Narada 11842 2020-03-03
## 7404 7404          Irene      3.6     Depok Teradamai 11666 2019-11-13
## 7454 7454          Irene      3.6    Bekasi    Winona  7759 2020-06-13
## 7504 7504          Irene      3.6    Bekasi  Alamanda 14370 2019-02-14
## 7554 7554          Irene      3.6     Depok   Peronia 12640 2018-03-23
## 7604 7604          Irene      3.6     Depok  Alamanda 10464 2019-05-26
## 7654 7654          Irene      3.6     Bogor  Alamanda  9828 2020-07-20
## 7704 7704          Irene      3.6 Tengerang     Adara  8151 2018-04-22
## 7754 7754          Irene      3.6     Depok   Alindra 12789 2020-09-21
## 7804 7804          Irene      3.6     Depok      Neon 12656 2019-07-21
## 7854 7854          Irene      3.6     Bogor   Permata 13199 2018-10-03
## 7904 7904          Irene      3.6    Bekasi Teradamai  9554 2019-10-22
## 7954 7954          Irene      3.6     Depok      Neon 10942 2020-06-21
## 8004 8004          Irene      3.6   Jakarta  Victoria 12550 2020-08-28
## 8054 8054          Irene      3.6    Bekasi   Alindra  7408 2019-12-06
## 8104 8104          Irene      3.6 Tengerang     Tiara 11336 2018-03-01
## 8154 8154          Irene      3.6     Bogor  Victoria  8825 2018-01-11
## 8204 8204          Irene      3.6   Jakarta    Lavesh 13554 2019-12-27
## 8254 8254          Irene      3.6   Jakarta Teradamai  8080 2018-03-22
## 8304 8304          Irene      3.6     Bogor   Permata  9420 2018-08-04
## 8354 8354          Irene      3.6     Bogor Primadona 12265 2018-05-20
## 8404 8404          Irene      3.6     Depok     Tiara 13549 2019-03-31
## 8454 8454          Irene      3.6    Bekasi   Mutiara 10903 2019-06-03
## 8504 8504          Irene      3.6     Bogor    Winona 14837 2018-12-01
## 8554 8554          Irene      3.6   Jakarta Sweethome  8101 2020-09-10
## 8604 8604          Irene      3.6 Tengerang     Asera  9620 2019-11-19
## 8654 8654          Irene      3.6     Depok Sweethome 12536 2018-08-10
## 8704 8704          Irene      3.6     Depok    Lavesh 12569 2018-06-23
## 8754 8754          Irene      3.6     Depok    Winona 12452 2018-09-19
## 8804 8804          Irene      3.6   Jakarta Teradamai 14589 2018-12-25
## 8854 8854          Irene      3.6     Depok    Lavesh 11861 2019-03-16
## 8904 8904          Irene      3.6    Bekasi   Albasia 12401 2018-09-12
## 8954 8954          Irene      3.6     Depok     Arana 13500 2019-07-22
## 9004 9004          Irene      3.6 Tengerang Primadona  9487 2019-12-07
## 9054 9054          Irene      3.6    Bekasi    Lavesh 14905 2020-06-08
## 9104 9104          Irene      3.6    Bekasi   Permata  7309 2020-03-11
## 9154 9154          Irene      3.6     Bogor Teradamai 12805 2018-03-01
## 9204 9204          Irene      3.6     Bogor     Asera 12483 2018-05-12
## 9254 9254          Irene      3.6     Depok   Peronia 13585 2018-07-29
## 9304 9304          Irene      3.6   Jakarta  Alamanda 12653 2018-05-06
## 9354 9354          Irene      3.6     Bogor   Permata  9742 2019-10-17
## 9404 9404          Irene      3.6 Tengerang      Neon 10927 2020-09-07
## 9454 9454          Irene      3.6     Bogor   Mutiara 13325 2020-02-25
## 9504 9504          Irene      3.6     Bogor  Victoria 14994 2018-07-25
## 9554 9554          Irene      3.6    Bekasi Teradamai 10562 2019-04-04
## 9604 9604          Irene      3.6   Jakarta     Asoka 13954 2020-04-18
## 9654 9654          Irene      3.6 Tengerang     Arana  7756 2019-02-03
## 9704 9704          Irene      3.6    Bekasi     Asera  9858 2019-05-03
## 9754 9754          Irene      3.6     Bogor    Narada  9274 2018-11-30
## 9804 9804          Irene      3.6    Bekasi      Neon 13211 2018-11-02
## 9854 9854          Irene      3.6     Depok  Alamanda  9577 2020-04-27
## 9904 9904          Irene      3.6    Bekasi     Arana 12328 2019-04-17
## 9954 9954          Irene      3.6     Depok    Winona 13207 2019-11-29
##      Advertisement Classes BookingFee
## 4                5     Low     366.15
## 54              14     Low     357.90
## 104             15     Low     376.90
## 154             13     Low     363.40
## 204             18    High    1441.70
## 254              3    High    1361.30
## 304              1  Medium     848.40
## 354             13  Medium     862.88
## 404             18  Medium    1063.80
## 454              2     Low     677.04
## 504             15  Medium     819.76
## 554             20    High    1462.30
## 604             13     Low     662.69
## 654             14     Low     631.12
## 704              1     Low     486.30
## 754             10     Low     537.84
## 804              4    High    1328.00
## 854             13    High    1364.40
## 904              9  Medium     990.90
## 954              9  Medium     846.96
## 1004            19    High    1125.99
## 1054            19     Low     482.94
## 1104            13    High    1382.90
## 1154            19  Medium     992.88
## 1204            15    High    1370.70
## 1254            11  Medium     992.07
## 1304             3  Medium     812.72
## 1354             9  Medium    1006.20
## 1404            14     Low     365.35
## 1454            15    High    1343.50
## 1504             2  Medium    1037.88
## 1554            16    High    1498.20
## 1604            12  Medium    1045.53
## 1654            12  Medium     866.24
## 1704            11     Low     488.28
## 1754            15     Low     674.24
## 1804             3    High    1324.40
## 1854             7    High    1150.02
## 1904            10     Low     392.35
## 1954            16     Low     649.74
## 2004            19     Low     648.48
## 2054            16    High    1100.07
## 2104             6    High    1344.40
## 2154             4  Medium     811.04
## 2204             6     Low     350.60
## 2254            15     Low     481.26
## 2304             6     Low     379.00
## 2354            18  Medium     872.40
## 2404            12    High    1414.10
## 2454            14  Medium     813.44
## 2504             5  Medium     824.24
## 2554             4    High    1129.14
## 2604            14     Low     672.14
## 2654            12     Low     680.96
## 2704             8     Low     666.47
## 2754            19    High    1428.00
## 2804            16    High    1103.40
## 2854            19     Low     352.20
## 2904             9    High    1084.77
## 2954             2  Medium    1041.39
## 3004            18  Medium    1029.96
## 3054             9    High    1386.00
## 3104            18     Low     508.32
## 3154            13    High    1391.90
## 3204            11    High    1417.40
## 3254            17  Medium     806.64
## 3304            11    High    1399.80
## 3354            14     Low     673.54
## 3404            17     Low     487.98
## 3454             4    High    1356.90
## 3504            20  Medium     857.84
## 3554             3     Low     512.52
## 3604            19    High    1159.11
## 3654             7    High    1417.90
## 3704             9  Medium     815.28
## 3754             3     Low     368.25
## 3804             9  Medium    1061.64
## 3854            13    High    1466.60
## 3904            13  Medium    1042.83
## 3954             3    High    1169.55
## 4004            15     Low     505.26
## 4054            15    High    1449.40
## 4104            13    High    1080.36
## 4154            10     Low     389.95
## 4204             9  Medium    1037.16
## 4254            15  Medium    1077.84
## 4304            14    High    1152.99
## 4354             8  Medium    1055.52
## 4404            17     Low     382.30
## 4454             9    High    1465.70
## 4504            13    High    1378.50
## 4554            17    High    1368.60
## 4604            10  Medium    1021.23
## 4654            15    High    1127.79
## 4704             6     Low     503.04
## 4754            18     Low     636.86
## 4804             4     Low     632.03
## 4854             6     Low     637.63
## 4904            20  Medium     998.73
## 4954            13     Low     507.30
## 5004             8     Low     490.50
## 5054             7    High    1127.34
## 5104            18     Low     483.00
## 5154            12  Medium     856.16
## 5204            14  Medium    1032.30
## 5254             8  Medium    1013.49
## 5304             6     Low     391.45
## 5354             7     Low     368.10
## 5404             8     Low     530.46
## 5454             9     Low     672.63
## 5504            18  Medium    1042.38
## 5554             8     Low     359.15
## 5604            14    High    1365.50
## 5654             7     Low     394.25
## 5704             6     Low     643.79
## 5754            18    High    1464.50
## 5804            20    High    1365.30
## 5854            18     Low     361.60
## 5904            20     Low     511.98
## 5954            18  Medium     862.80
## 6004             7  Medium     850.40
## 6054            13     Low     495.06
## 6104             1  Medium     879.76
## 6154             9     Low     397.60
## 6204             7     Low     682.50
## 6254            19  Medium    1042.20
## 6304            16    High    1166.67
## 6354             4     Low     394.45
## 6404             3    High    1124.91
## 6454             9     Low     372.30
## 6504             9     Low     529.44
## 6554            10     Low     669.06
## 6604            20     Low     670.81
## 6654            13  Medium     826.88
## 6704             2     Low     393.45
## 6754             4     Low     698.53
## 6804            14     Low     393.95
## 6854             8  Medium     858.96
## 6904             3     Low     536.58
## 6954             1     Low     352.80
## 7004            12     Low     528.06
## 7054            16    High    1496.60
## 7104            18  Medium    1079.19
## 7154             3    High    1347.00
## 7204            19     Low     379.25
## 7254             2     Low     511.80
## 7304             7     Low     374.50
## 7354             8  Medium    1065.78
## 7404             6  Medium    1049.94
## 7454             9     Low     387.95
## 7504             6    High    1437.00
## 7554            16    High    1137.60
## 7604             8  Medium     837.12
## 7654             2     Low     687.96
## 7704            12     Low     489.06
## 7754             9    High    1151.01
## 7804            10    High    1139.04
## 7854            15    High    1319.90
## 7904            13     Low     668.78
## 7954            12  Medium     875.36
## 8004             9    High    1129.50
## 8054            14     Low     370.40
## 8104             8  Medium    1020.24
## 8154             6     Low     529.50
## 8204             2    High    1355.40
## 8254            14     Low     484.80
## 8304            13     Low     659.40
## 8354            18    High    1103.85
## 8404            10    High    1354.90
## 8454            17  Medium     872.24
## 8504            11    High    1483.70
## 8554            10     Low     486.06
## 8604             5     Low     673.40
## 8654             4    High    1128.24
## 8704            14    High    1131.21
## 8754            16    High    1120.68
## 8804             9    High    1458.90
## 8854             5  Medium    1067.49
## 8904            13    High    1116.09
## 8954             5    High    1350.00
## 9004             7     Low     664.09
## 9054            15    High    1490.50
## 9104            17     Low     365.45
## 9154             9    High    1152.45
## 9204            12    High    1123.47
## 9254            15    High    1358.50
## 9304             5    High    1138.77
## 9354            20     Low     681.94
## 9404             1  Medium     874.16
## 9454            15    High    1332.50
## 9504             5    High    1499.40
## 9554            11  Medium     844.96
## 9604            15    High    1395.40
## 9654            14     Low     387.80
## 9704            12     Low     690.06
## 9754            11     Low     649.18
## 9804             8    High    1321.10
## 9854             2     Low     670.39
## 9904            15    High    1109.52
## 9954            15    High    1320.70

Soal 4

Jika Anda akan mendapatkan bonus 2% dari Booking fee per unit sebagai pemasaran dan juga mendapatkan bonus tambahan 1% jika Anda telah bekerja di perusahaan ini selama lebih dari 3 tahun. Silakan hitung total bonus dengan menggunakan pernyataan if, for, dan break.

R

DataIrene = subset(Data, subset=(Marketing_Name == "Irene"))


b = ifelse((DataIrene$Work_Exp>3), (DataIrene$BookingFee*0.03),(DataIrene$BookingFee*0.02))

DataIrene$Bonus = b

DataIrene
Totalbonus=sum(DataIrene$Bonus)
Totalbonus
## [1] 5351.693

Soal 5

Pada bagian ini, Anda diharapkan dapa membuat fungsi yang dapat menjawab setiap penyataan dibawah ini dengan melibatkan setiap fungsi kontrol yang dipelajari pada pertemuan 7.

  • Siapa nama marketing pemasaran terbaik?
  • Kota dan Cluster mana yang paling menguntungkan?
  • Hitung total biaya iklan Anda, jika Anda harus membayarnya $4 setiap kali iklan.
  • Hitung rata-rata biaya iklan untuk setiap marketing di Perusahaan tersebut.
  • Hitung Total Pendapatan (dalam Bulanan)

R

 Angel = subset (Data, subset=(Marketing_Name == "Angel")) 
Sherly=subset (Data, subset=(Marketing_Name == "Sherly")) 
Vanessa=subset(Data, subset=(Marketing_Name == "Vanessa"  ))
Irene=subset(Data, subset=(Marketing_Name == "Irene"))
Julian=subset (Data, subset=(Marketing_Name == "Julian"))
Jeffry =subset (Data, subset=(Marketing_Name == "Jeffry")) 
Nikita =subset (Data, subset=(Marketing_Name =="Nikita")) 
Kefas =subset(Data, subset=(Marketing_Name == "Kefas"))
Siana =subset (Data, subset=(Marketing_Name == "Siana")) 
Lala=subset (Data, subset=(Marketing_Name == "Lala")) 
Fallen =subset (Data, subset=(Marketing_Name == "Fallen")) 
Ardifo =subset (Data, subset=(Marketing_Name == "Ardifo"))
Kevin =subset (Data, subset=(Marketing_Name == "Kevin"))
Juen =subset (Data, subset=(Marketing_Name == "Juen")) 
Jerrel =subset (Data, subset=(Marketing_Name == "Jerrel"))
Imelda =subset (Data, subset=(Marketing_Name == "Imelda")) 
Widi =subset(Data, subset=(Marketing_Name == "Widi")) 
Theodor = subset (Data, subset=(Marketing_Name == "Theodor")) 
Elvani =subset (Data, subset=(Marketing_Name == "Elvani")) 
Jonathan = subset (Data, subset=(Marketing_Name == "Jonathan")) 
Sofia =subset (Data, subset=(Marketing_Name == "Sofia")) 
Abraham = subset (Data, subset=(Marketing_Name == "Abraham")) 
Siti =subset (Data, subset=(Marketing_Name == "Siti")) 
Niko =subset(Data, subset=(Marketing_Name == "Niko")) 
Sefli =subset (Data, subset=(Marketing_Name == "Selfi")) 
Bene =subset(Data, subset=(Marketing_Name == "Bene")) 
Diana =subset (Data, subset=(Marketing_Name == "Diana"))
Pupe =subset(Data, subset=(Marketing_Name == "Pupe")) 
Andi =subset (Data, subset=(Marketing_Name == "Andi")) 
Tatha =subset (Data, subset=(Marketing_Name == "Tatha"))
Endri=subset (Data, subset=(Marketing_Name == "Endri")) 
Monika= subset(Data, subset=(Marketing_Name == "Monika")) 
Hans =subset(Data, subset=(Marketing_Name == "Hans")) 
Debora= subset (Data, subset=(Marketing_Name == "Debora")) 
Hanifa= subset (Data, subset=(Marketing_Name == "Hanifa"))
James =subset (Data, subset=(Marketing_Name == "James")) 
Jihan =subset (Data, subset=(Marketing_Name == "Jihan"))
Friska =subset (Data, subset=(Marketing_Name == "Friska")) 
Ardiwan = subset (Data, subset=(Marketing_Name == "Ardiwan")) 
Bakti =subset (Data, subset=(Marketing_Name == "Bakti")) 
Anthon =subset (Data, subset=(Marketing_Name == "Anthon")) 
Amry =subset (Data, subset=(Marketing_Name == "Amry")) 
Wiwik =subset (Data, subset=(Marketing_Name == "Wiwik")) 
Bastian = subset (Data, subset=(Marketing_Name == "Bastian")) 
Budi = subset (Data, subset=(Marketing_Name == "Budi")) 
Leo = subset (Data, subset=(Marketing_Name == "Leo")) 
Simon = subset (Data, subset=(Marketing_Name == "Simon")) 
Matius = subset (Data, subset=(Marketing_Name == "Matius")) 
Arry = subset (Data, subset=(Marketing_Name == "Arry")) 
Eliando = subset (Data, subset=(Marketing_Name == "Eliando")) 
  
Nama_Sales = c("Angel","Sherly","Vanessa","Irene","Julian",
                        "Jeffry","Nikita","Kefas","Siana","Lala",
                        "Fallen","Ardifo","Kevin","Juen","Jerrel",
                        "Imelda","Widi","Theodora","Elvani","Jonathan",
                        "Sofia","Abraham","Siti","Niko","Sefli",
                        "Bene", "Diana", "Pupe", "Andi", "Tatha",
                        "Endri", "Monika", "Hans", "Debora","Hanifa",
                        "James", "Jihan", "Friska","Ardiwan", "Bakti",
                        "Anthon","Amry", "Wiwik", "Bastian", "Budi",
                        "Leo","Simon","Matius","Arry", "Eliando")
propertysold = c(sum(Angel$Price), sum(Sherly$Price), sum(Vanessa$Price), sum(Irene$Price),
sum(Julian$Price), sum (Jeffry$Price), sum(Nikita$Price), sum(Kefas$Price), sum(Siana$Price), sum(Lala$Price), sum(Fallen$Price), sum(Ardifo$Price), sum(Kevin$Price), sum (Juen$Price), sum(Jerrel$Price), sum(Imelda$Price), sum(Widi$Price), sum(Theodor$Price), sum(Elvani$Price), sum(Jonathan$Price), sum(Sofia$Price), sum(Abraham$Price), sum(Siti$Price), sum(Niko$Price), sum(Sefli$Price), sum(Bene$Price), sum( Diana$Price), sum (Pupe$Price), sum(Andi$Price), sum( Tatha$Price), sum(Endri$Price), sum( Monika$Price), sum( Hans$Price), sum( Debora$Price), sum(Hanifa$Price), sum (James$Price), sum( Jihan$Price), sum( Friska$Price), sum(Ardiwan$Price), sum(Bakti$Price), sum(Anthon$Price), sum(Amry$Price), sum( Wiwik$Price), sum( Bastian$Price), sum( Budi$Price), sum (Leo$Price), sum(Simon$Price), sum(Matius$Price), sum(Arry$Price), sum( Eliando$Price))

datamarketing= data.frame(Nama_Sales, propertysold)

datamarketing
# Best Marketing
datamarketing[which.max(datamarketing$propertysold),]
#Kota dan Cluster Paling Menguntungkan
profitable= Data[,c("City","Cluster","Price")]

profitable[which.max(profitable$Price),]
#Total Biaya Sdvertisment irene
costforad = subset(Data, subset=(Marketing_Name == "Irene"))

adscost = ( costforad$Advertisement * 4)

Totalcost=print(sum(adscost))
## [1] 8796
# Rata-Rata cost iklan
Namasales = c("Angel","Sherly","Vanessa","Irene","Julian",
                        "Jeffry","Nikita","Kefas","Siana","Lala",
                        "Fallen","Ardifo","Kevin","Juen","Jerrel",
                        "Imelda","Widi","Theodora","Elvani","Jonathan",
                        "Sofia","Abraham","Siti","Niko","Sefli",
                        "Bene", "Diana", "Pupe", "Andi", "Tatha",
                        "Endri", "Monika", "Hans", "Debora","Hanifa",
                        "James", "Jihan", "Friska","Ardiwan", "Bakti",
                        "Anthon","Amry", "Wiwik", "Bastian", "Budi",
                        "Leo","Simon","Matius","Arry", "Eliando")
ratacost = for (x in Namasales) {
  f= subset ( Data, subset=(Marketing_Name == x ))
  c=sum(f$Advertisement * 4)
  print (cat(sum(c)/length(f$Id), (cat(x, 'Rata-rata pengeluaran untuk iklan'))))}
## Angel Rata-rata pengeluaran untuk iklan39.64NULL
## Sherly Rata-rata pengeluaran untuk iklan42.2NULL
## Vanessa Rata-rata pengeluaran untuk iklan43.44NULL
## Irene Rata-rata pengeluaran untuk iklan43.98NULL
## Julian Rata-rata pengeluaran untuk iklan42.04NULL
## Jeffry Rata-rata pengeluaran untuk iklan39.68NULL
## Nikita Rata-rata pengeluaran untuk iklan43.6NULL
## Kefas Rata-rata pengeluaran untuk iklan41.28NULL
## Siana Rata-rata pengeluaran untuk iklan43.4NULL
## Lala Rata-rata pengeluaran untuk iklan44.04NULL
## Fallen Rata-rata pengeluaran untuk iklan42.8NULL
## Ardifo Rata-rata pengeluaran untuk iklan42.2NULL
## Kevin Rata-rata pengeluaran untuk iklan42.24NULL
## Juen Rata-rata pengeluaran untuk iklan40.88NULL
## Jerrel Rata-rata pengeluaran untuk iklan41.76NULL
## Imelda Rata-rata pengeluaran untuk iklan41.44NULL
## Widi Rata-rata pengeluaran untuk iklan41.78NULL
## Theodora Rata-rata pengeluaran untuk iklan41.54NULL
## Elvani Rata-rata pengeluaran untuk iklan41NULL
## Jonathan Rata-rata pengeluaran untuk iklan42.3NULL
## Sofia Rata-rata pengeluaran untuk iklan43.74NULL
## Abraham Rata-rata pengeluaran untuk iklan40.22NULL
## Siti Rata-rata pengeluaran untuk iklan39.58NULL
## Niko Rata-rata pengeluaran untuk iklan38.06NULL
## Sefli Rata-rata pengeluaran untuk iklan43.38NULL
## Bene Rata-rata pengeluaran untuk iklan43.88NULL
## Diana Rata-rata pengeluaran untuk iklan42.56NULL
## Pupe Rata-rata pengeluaran untuk iklan42.76NULL
## Andi Rata-rata pengeluaran untuk iklan40.14NULL
## Tatha Rata-rata pengeluaran untuk iklan43.56NULL
## Endri Rata-rata pengeluaran untuk iklan44.1NULL
## Monika Rata-rata pengeluaran untuk iklan43.16NULL
## Hans Rata-rata pengeluaran untuk iklan41.22NULL
## Debora Rata-rata pengeluaran untuk iklan41.08NULL
## Hanifa Rata-rata pengeluaran untuk iklan39.1NULL
## James Rata-rata pengeluaran untuk iklan38.96NULL
## Jihan Rata-rata pengeluaran untuk iklan39.02NULL
## Friska Rata-rata pengeluaran untuk iklan41.28NULL
## Ardiwan Rata-rata pengeluaran untuk iklan43.8NULL
## Bakti Rata-rata pengeluaran untuk iklan41.76NULL
## Anthon Rata-rata pengeluaran untuk iklan40.54NULL
## Amry Rata-rata pengeluaran untuk iklan41.36NULL
## Wiwik Rata-rata pengeluaran untuk iklan41.02NULL
## Bastian Rata-rata pengeluaran untuk iklan40.94NULL
## Budi Rata-rata pengeluaran untuk iklan42.04NULL
## Leo Rata-rata pengeluaran untuk iklan39.96NULL
## Simon Rata-rata pengeluaran untuk iklan43.66NULL
## Matius Rata-rata pengeluaran untuk iklan39.12NULL
## Arry Rata-rata pengeluaran untuk iklan41.52NULL
## Eliando Rata-rata pengeluaran untuk iklan43.06NULL
# Pendapatan

revenue= (sum(Data$Price)-(sum(Data$Advertisment) * 4))/((max(Data$Work_Exp))*12)

revenue
## [1] 917232.2

Kasus 2

Misalkan Anda memiliki proyek riset pasar untuk mempertahankan beberapa pelanggan potensial di perusahaan Anda. Mari kita asumsikan Anda bekerja di perusahaan asuransi ABC. Untuk melakukannya, Anda ingin mengumpulkan kumpulan data berikut:

  • Marital_Status : menetapkan status perkawinan acak (“Ya”, “Tidak”)
  • Address : berikan alamat acak (JABODETABEK)
  • Work_Location : menetapkan lokasi kerja secara acak (JABODETABEK)
  • Age : menetapkan urutan angka acak (dari 19 hingga 60)
  • Academic : menetapkan tingkat akademik acak (“J.School”, “H.School”, “Sarjana”, “Magister”, “Phd”)
  • Job : 10 pekerjaan acak untuk setiap tingkat akademik
  • Grade : 5 nilai acak untuk setiap Pekerjaan
  • Income : tetapkan pendapatan yang mungkin untuk setiap Pekerjaan
  • Spending : tetapkan kemungkinan pengeluaran untuk setiap Pekerjaan
  • Number_of_children: menetapkan nomor acak di antara 0 dan 10 (sesuai dengan status perkawinan)
  • Private_vehicle : menetapkan kemungkinan kendaraan pribadi untuk setiap orang (“Mobil”, “sepeda motor”, “Umum”)
  • Home : “Sewa”, “Milik”, “Kredit”

Soal 1

Tolong berikan saya kumpulan data tentang informasi 50000 pelanggan yang mengacu pada setiap variabel di atas!

R

marital_status <- sample(c("Yes", "No"), 50000, replace = T) 
Address <-sample(c("Jakarta", "Bogor", "Depok", "Tangerang", "Bekasi"),50000, replace=T)
Work_Location <-sample(c("Jakarta", "Bogor", "Depok", "Tangerang", "Bekasi"),50000, replace=T)
Age <-floor (runif(50000,19,60))
Academic <-sample(c("J.School", "H.School", "Bachelor Degree", "Master",
"Phd"), 50000, replace = T) 





Grade <-sample(c("S+", "S", "A+", "A",
"B"), 50000, replace=T) 

Number_of_children <- ifelse(marital_status =="Yes", sample((c(0:10)), length(marital_status =="Yes"), replace=T), "0")
Private_vehicle <- sample(c("Car", "Motorcycle", "Public"),
50000, replace=T)
Home <- sample(c("Rent", "Own", "Credit"), 50000, replace=T) 

Datasoal2 <-data.frame (marital_status, Address, Work_Location, Age, Academic, Grade, Number_of_children, Private_vehicle, Home)

library(data.table)
data.table(Datasoal2)
Job <- ifelse (Datasoal2$Academic == "J.School", sample(c("Cleaning Service", "Security Guard", "Waiter")),
ifelse(Datasoal2$Academic == "H.School", sample(c("Waiter", "Security Guard")), ifelse(Datasoal2$Academic == "Bachelor Degree", sample(c("CEO", "Teacher")), ifelse(Datasoal2$Academic == "Master",sample(c("Board Director", "Actuarist", "Software Enginering")), sample(c("Head of Research", "Teacher"))
))))

Datasoal2 = data.frame(marital_status, Address, Work_Location, Age, Academic,Job, Grade, Number_of_children, Private_vehicle, Home)

Income <- ifelse (Datasoal2$Job == "Cleaning Service", sample(c(5000:6000)),
ifelse(Datasoal2$Job == "Clerk", sample(c(4500:5500)), ifelse(Datasoal2$Job == "Waiter", sample(c(4500:6000)), ifelse(Datasoal2$Job == "Teacher",sample(c(6000:9000)), ifelse (Datasoal2$Job == "Actuarist", sample(c(8500:13000)), ifelse(Datasoal2$ Job == "Software Enginering", sample(c(8000:12000)), ifelse (Datasoal2$Job =="Security Guard", sample(c(5000:5500)), ifelse (Datasoal2$Job== "Head of Research", sample(c(9000:14000)), ifelse(Datasoal2$Job == "CEO", sample(c(13000:20000)), sample(c(11000:16000))
)))))))))

Spending <- ifelse (Datasoal2$Job == "Cleaning Service", sample(c(3000:4500)),
ifelse(Datasoal2$Job == "Clerk", sample(c(2200:5100)), ifelse(Datasoal2$Job == "Waiter", sample(c(3000:5000)), ifelse(Datasoal2$Job == "Teacher",sample(c(4000:7500)), ifelse (Datasoal2$Job == "Actuarist", sample(c(3500:9000)), ifelse(Datasoal2$ Job == "Software Enginering", sample(c(5000:7500)), ifelse (Datasoal2$Job =="Security Guard", sample(c(4000:4500)), ifelse (Datasoal2$Job== "Head of Research", sample(c(6000:10500)), ifelse(Datasoal2$Job == "CEO", sample(c(6000:10000)), sample(c(5500:11000))
)))))))))

Datasoal2$Job=Job
Datasoal2$Income = Income
Datasoal2$Spending = Spending

Datasoal2

Soal 2

Ringkasan Statistik penting seperti apa yang bisa Anda dapatkan dari kumpulan data Anda?

R

summary(Datasoal2)
##  marital_status       Address          Work_Location           Age       
##  Length:50000       Length:50000       Length:50000       Min.   :19.00  
##  Class :character   Class :character   Class :character   1st Qu.:29.00  
##  Mode  :character   Mode  :character   Mode  :character   Median :39.00  
##                                                           Mean   :38.92  
##                                                           3rd Qu.:49.00  
##                                                           Max.   :59.00  
##    Academic             Job               Grade           Number_of_children
##  Length:50000       Length:50000       Length:50000       Length:50000      
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##  Private_vehicle        Home               Income         Spending    
##  Length:50000       Length:50000       Min.   : 4500   Min.   : 3000  
##  Class :character   Class :character   1st Qu.: 5381   1st Qu.: 4216  
##  Mode  :character   Mode  :character   Median : 7505   Median : 5247  
##                                        Mean   : 8704   Mean   : 5783  
##                                        3rd Qu.:11377   3rd Qu.: 7115  
##                                        Max.   :20000   Max.   :11000

`

Soal 3

Menurut perhitungan dan analisis Anda, pelanggan mana yang potensial untuk Anda pertahankan?

R

Datasoal2$NetWorth = Datasoal2$Income-Datasoal2$Spending

Datasoal2
#Potential untuk dipertahankan
subset(Datasoal2, NetWorth>= 7000)

Referensi

  1. ref 1
  2. ref 2
  3. ref 3
LS0tDQp0aXRsZTogIkFsZ29yaXRtYSAmIFN0cnVrdHVyIERhdGEiDQpzdWJ0aXRsZTogIn4gVWppYW4gVGVuZ2FoIFNlbWVzdGVyIH4iDQphdXRob3I6ICJGZXJkaW5hbmQgTmF0aGFuaWVsIFdpZGpheWEgKDIwMjE0OTIwMDA2KSINCmRhdGU6ICAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiDQpvdXRwdXQ6DQogIHJtZGZvcm1hdHM6OnJvYm9ib29rOiAgICMgaHR0cHM6Ly9naXRodWIuY29tL2p1YmEvcm1kZm9ybWF0cw0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlDQogICAgdGh1bWJuYWlsczogdHJ1ZQ0KICAgIGxpZ2h0Ym94OiB0cnVlDQogICAgZ2FsbGVyeTogdHJ1ZQ0KICAgIGxpYl9kaXI6IGxpYnMNCiAgICBkZl9wcmludDogInBhZ2VkIg0KICAgIGNvZGVfZm9sZGluZzogInNob3ciDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgY3NzOiAic3R5bGUuY3NzIg0KDQotLS0NCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChjbGFzcy5zb3VyY2UgPSAibm9jb3B5IiwNCiAgICAgICAgICAgICAgICAgICAgICBjbGFzcy5vdXRwdXQgPSAibm9jb3B5IiwNCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRiwNCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRikNCg0KbGlicmFyeShyZXRpY3VsYXRlKQ0KbGlicmFyeShSY3BwKQ0KDQpgYGANCg0KPGJyPg0KDQo8aW1nIHN0eWxlPSJmbG9hdDogcmlnaHQ7IG1hcmdpbjogLTUwcHggNTBweCAwcHggNTBweDsgd2lkdGg6MzAlIiBzcmM9ImZvdG8uanBnIi8+IA0KDQp8DQo6LS0tLSB8Oi0tLS0NCioqS29udGFrKip8ICoqOiAkXGRvd25hcnJvdyQqKg0KRW1haWx8IGZlcmRpbmFuZC53aWRqYXlhQHN0dWRlbnQubWF0YW5hdW5pdmVyc2l0eS5hYy5pZA0KSW5zdGFncmFtIHwgaHR0cHM6Ly93d3cuaW5zdGFncmFtLmNvbS9mZV9udy8gDQpSUHVicyAgfCBodHRwczovL3JwdWJzLmNvbS9mZXJkbncvIA0KDQoqKioNCg0KIyBLYXN1cyAxIA0KDQpBc3Vtc2lrYW4gQW5kYSB0ZWxhaCBtZW5ndW1wdWxrYW4gYmViZXJhcGEga3VtcHVsYW4gZGF0YSBkYXJpIHBlcnVzYWhhYW4gYEFCQyBQcm9wZXJ0eWAgc2VwZXJ0aSB5YW5nIGRhcGF0IGtpdGEgbGloYXQgcGFkYSB0YWJlbCBiZXJpa3V0OiANCg0KYGBge3IsIG1lc3NhZ2U9Rn0NCklkICAgICAgICAgICAgIDwtICgxOjEwMDAwKQ0KTWFya2V0aW5nX05hbWUgPC0gcmVwKGMoIkFuZ2VsIiwiU2hlcmx5IiwiVmFuZXNzYSIsIklyZW5lIiwiSnVsaWFuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJKZWZmcnkiLCJOaWtpdGEiLCJLZWZhcyIsIlNpYW5hIiwiTGFsYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAiRmFsbGVuIiwiQXJkaWZvIiwiS2V2aW4iLCJKdWVuIiwiSmVycmVsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJJbWVsZGEiLCJXaWRpIiwiVGhlb2RvcmEiLCJFbHZhbmkiLCJKb25hdGhhbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAiU29maWEiLCJBYnJhaGFtIiwiU2l0aSIsIk5pa28iLCJTZWZsaSIsDQogICAgICAgICAgICAgICAgICAgICAgICAiQmVuZSIsICJEaWFuYSIsICJQdXBlIiwgIkFuZGkiLCAiVGF0aGEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIkVuZHJpIiwgIk1vbmlrYSIsICJIYW5zIiwgIkRlYm9yYSIsIkhhbmlmYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAiSmFtZXMiLCAiSmloYW4iLCAiRnJpc2thIiwiQXJkaXdhbiIsICJCYWt0aSIsDQogICAgICAgICAgICAgICAgICAgICAgICAiQW50aG9uIiwiQW1yeSIsICJXaXdpayIsICJCYXN0aWFuIiwgIkJ1ZGkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIkxlbyIsIlNpbW9uIiwiTWF0aXVzIiwiQXJyeSIsICJFbGlhbmRvIiksIDIwMCkNCldvcmtfRXhwICAgICAgIDwtIHJlcChjKDEuMywyLjQsMi41LDMuNiwzLjcsNC43LDUuNyw2LjcsNy43LDcuMywNCiAgICAgICAgICAgICAgICAgICAgICAgIDUuMyw1LjMsMTAsOS4zLDMuMywzLjMsMy40LDMuNCwzLjUsNS42LA0KICAgICAgICAgICAgICAgICAgICAgICAgMy41LDQuNiw0LjYsNS43LDYuMiw0LjQsNi40LDYuNCwzLjUsNy41LA0KICAgICAgICAgICAgICAgICAgICAgICAgNC42LDMuNyw0LjcsNC4zLDUuMiw2LjMsNy40LDIuNCwzLjQsOC4yLA0KICAgICAgICAgICAgICAgICAgICAgICAgNi40LDcuMiwxLjUsNy41LDEwLDQuNSw2LjUsNy4yLDcuMSw3LjYpLDIwMCkNCkNpdHkgICAgICAgICAgIDwtIHNhbXBsZShjKCJKYWthcnRhIiwiQm9nb3IiLCJEZXBvayIsIlRlbmdlcmFuZyIsIkJla2FzaSIpLDEwMDAwLCByZXBsYWNlID0gVCkNCkNsdXN0ZXIgICAgICAgIDwtIHNhbXBsZShjKCJWaWN0b3JpYSIsIlBhbG15cmEiLCJXaW5vbmEiLCJUaWFyYSIsICJOYXJhZGEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBlcm9uaWEiLCJMYXZlc2giLCJBbGluZHJhIiwiU3dlZXRob21lIiwgIkFzZXJhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJUZXJhZGFtYWkiLCJBbGJhc2lhIiwgIkFkYXJhIiwiTmVvbiIsIkFyYW5hIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJBc29rYSIsICJQcmltYWRvbmEiLCAiTXV0aWFyYSIsIlBlcm1hdGEiLCJBbGFtYW5kYSIgKSwgMTAwMDAsIHJlcGxhY2U9VCkNClByaWNlICAgICAgICAgIDwtIHNhbXBsZShjKDcwMDA6MTUwMDApLDEwMDAwLCByZXBsYWNlID0gVCkNCkRhdGVfU2FsZXMgICAgIDwtIHNhbXBsZShzZXEoYXMuRGF0ZSgiMjAxOC8wMS8wMSIpLCBieSA9ICJkYXkiLCBsZW5ndGgub3V0ID0gMTAwMCksMTAwMDAsIHJlcGxhY2UgPSBUKQ0KQWR2ZXJ0aXNlbWVudCAgPC0gc2FtcGxlKGMoMToyMCksIDEwMDAwLCByZXBsYWNlID0gVCkNCkRhdGEgICAgICAgICAgIDwtIGRhdGEuZnJhbWUoSWQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXJrZXRpbmdfTmFtZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29ya19FeHAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpdHksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsdXN0ZXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaWNlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlX1NhbGVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZHZlcnRpc2VtZW50KQ0KbGlicmFyeShEVCkNCmRhdGF0YWJsZShEYXRhKQ0KYGBgDQoNCiMjIFNvYWwgMSB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQpLYXRlZ29yaWthbiB2YXJpYWJlbCBgSGFyZ2FgIHBhZGEgZGF0YXNldCBkaSBhdGFzIG1lbmphZGkgdGlnYSBrZWxvbXBvayBzZWJhZ2FpIGJlcmlrdXQ6DQoNCiogJFx0ZXh0e0hpZ2h9ID4gMTIwMDAkDQoqICQxMDAwMCBcbGUgXHRleHR7TWVkaXVtfSBcbGUgMTIwMDAkDQoqICRcdGV4dHtMb3d9IDwgMTAwMDAkDQoNClRldGFwa2FuIGtlIGRhbGFtIHZhcmlhYmVsIGJhcnUgeWFuZyBkaXNlYnV0IGBLZWxhc2AgZGVuZ2FuIG1lbmdndW5ha2FuIGZ1bmdzaSBrb250cm9sIGBJZmAsIGBlbHNlIGlmYCwgZGFuIGBlbHNlYC4NCg0KIyMjIFINCg0KYGBge3J9DQojIHR1bGlza2FuIGtvZGluZyBSIGthbGlhbiBkaXNpbmkNCng9IERhdGEkUHJpY2UNCnkgPSBpZmVsc2UoKHg+MTIwMDApLHByaW50KCdIaWdoJyksIGlmZWxzZSgoeD49MTAwMDAgJiB4PD0xMjAwMCksIHByaW50KCdNZWRpdW0nKSwgcHJpbnQoJ0xvdycpKSkNCg0KRGF0YSRDbGFzc2VzID0geQ0KZGF0YXRhYmxlKERhdGEpDQpgYGANCg0KDQoNCg0KDQoNCg0KIyMgU29hbCAyIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNCkthdGVnb3Jpa2FuIHZhcmlhYmVsIGBIYXJnYWAgcGFkYSBkYXRhc2V0IGRpIGF0YXMgbWVuamFkaSBlbmFtIGtlbG9tcG9rIHNlYmFnYWkgYmVyaWt1dDoNCg0KKiBCb29raW5nX2ZlZSBueWEgNSAlIGppa2EgJFx0ZXh0e1ByaWNlfSA8IDgwMDAkDQoqIEJvb2tpbmdfZmVlIG55YSA2ICUgamlrYSAkODAwMCBcbGUgXHRleHR7UHJpY2V9IDwgOTAwMCQNCiogQm9va2luZ19mZWUgbnlhIDcgJSBqaWthICQ5MDAwIFxsZSBcdGV4dHtQcmljZX0gPCAxMDAwMCQNCiogQm9va2luZ19mZWUgbnlhIDggJSBqaWthICQxMDAwMCBcbGUgXHRleHR7UHJpY2V9IDwgMTEwMDAkDQoqIEJvb2tpbmdfZmVlIG55YSA5ICUgamlrYSAkMTEwMDAgXGxlIFx0ZXh0e1ByaWNlfSA8IDEzMDAwJA0KKiBCb29raW5nX2ZlZSBueWEgMTAgJSBqaWthICQxMzAwMCBcbGUgXHRleHR7UHJpY2V9IFxsZSAxNTAwMCQNCg0KVGV0YXBrYW4ga2UgZGFsYW0gdmFyaWFiZWwgYmFydSB5YW5nIGRpc2VidXQgYEJvb2tpbmdfZmVlYCBkZW5nYW4gbWVuZ2d1bmFrYW4gZnVuZ3NpIGtvbnRyb2wgYElmYCwgYGVsc2UgaWZgLCBkYW4gYGVsc2VgLg0KDQojIyMgUg0KDQpgYGB7cn0NCmsgPSBEYXRhJFByaWNlDQpsID0gaWZlbHNlKChrPDgwMDApLCA1LzEwMCpEYXRhJFByaWNlLCBpZmVsc2UoKGs+PTgwMDAgJiBrPDkwMDApLDYvMTAwKkRhdGEkUHJpY2UsIGlmZWxzZSgoaz49OTAwMCAmIGs8MTAwMDApLCA3LzEwMCpEYXRhJFByaWNlICxpZmVsc2UoKGs+PSAxMDAwMCAmIGs8MTEwMDApLCA4LzEwMCpEYXRhJFByaWNlLCBpZmVsc2UgKChrPj0xMTAwMCAmIGs8MTMwMDApLCA5LzEwMCpEYXRhJFByaWNlLDEvMTAqRGF0YSRQcmljZSkpKSApKQ0KDQpEYXRhJEJvb2tpbmdGZWUgPSBsDQpEYXRhDQpgYGANCg0KDQoNCg0KDQoNCiMjIFNvYWwgMyB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQpNZW51cnV0IGt1bXB1bGFuIGRhdGEgYWtoaXIgeWFuZyB0ZWxhaCBBbmRhIGJ1YXQgcGFkYSBzb2FsIG5vIDIsIHNheWEgYmVyYXN1bXNpIGJhaHdhIEFuZGEgdGVsYWggYmVrZXJqYSBzZWJhZ2FpIHBlbWFzYXJhbiBkaSBwZXJ1c2FoYWFuIGBBQkMgUHJvcGVydHlgLCBiYWdhaW1hbmEgQW5kYSBkYXBhdCBtZW5ndW1wdWxrYW4gc2VtdWEgaW5mb3JtYXNpIHRlbnRhbmcgcGVuanVhbGFuIEFuZGEgZGVuZ2FuIG1lbmdndW5ha2FuIHBlcm55YXRhYW4gYGZvcmAuIA0KDQojIyMgUg0KDQpgYGB7cn0NCmxpYnJhcnkoRFQpDQoNCno9Zm9yKHggIGluICJJcmVuZSIgKXtwcmludChzdWJzZXQoRGF0YSxzdWJzZXQ9KE1hcmtldGluZ19OYW1lPT0geCkpKX0NCmBgYA0KDQoNCg0KDQoNCiMjIFNvYWwgNCB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQpKaWthIEFuZGEgYWthbiBtZW5kYXBhdGthbiBib251cyAyJSBkYXJpIGBCb29raW5nIGZlZWAgcGVyIHVuaXQgc2ViYWdhaSBwZW1hc2FyYW4gZGFuIGp1Z2EgbWVuZGFwYXRrYW4gYm9udXMgdGFtYmFoYW4gMSUgamlrYSBBbmRhIHRlbGFoIGJla2VyamEgZGkgcGVydXNhaGFhbiBpbmkgc2VsYW1hIGxlYmloIGRhcmkgMyB0YWh1bi4gU2lsYWthbiBoaXR1bmcgdG90YWwgYm9udXMgZGVuZ2FuIG1lbmdndW5ha2FuIHBlcm55YXRhYW4gYGlmLCBmb3IsIGRhbiBicmVha2AuICANCg0KIyMjIFINCg0KYGBge3J9DQpEYXRhSXJlbmUgPSBzdWJzZXQoRGF0YSwgc3Vic2V0PShNYXJrZXRpbmdfTmFtZSA9PSAiSXJlbmUiKSkNCg0KDQpiID0gaWZlbHNlKChEYXRhSXJlbmUkV29ya19FeHA+MyksIChEYXRhSXJlbmUkQm9va2luZ0ZlZSowLjAzKSwoRGF0YUlyZW5lJEJvb2tpbmdGZWUqMC4wMikpDQoNCkRhdGFJcmVuZSRCb251cyA9IGINCg0KRGF0YUlyZW5lDQoNCmBgYA0KYGBge3J9DQoNClRvdGFsYm9udXM9c3VtKERhdGFJcmVuZSRCb251cykNClRvdGFsYm9udXMNCmBgYA0KDQoNCg0KDQoNCiMjIFNvYWwgNSB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQpQYWRhIGJhZ2lhbiBpbmksIEFuZGEgZGloYXJhcGthbiBkYXBhIG1lbWJ1YXQgZnVuZ3NpIHlhbmcgZGFwYXQgbWVuamF3YWIgc2V0aWFwIHBlbnlhdGFhbiBkaWJhd2FoIGluaSBkZW5nYW4gbWVsaWJhdGthbiBzZXRpYXAgZnVuZ3NpIGtvbnRyb2wgeWFuZyBkaXBlbGFqYXJpIHBhZGEgcGVydGVtdWFuIDcuDQoNCiogU2lhcGEgbmFtYSBtYXJrZXRpbmcgcGVtYXNhcmFuIHRlcmJhaWs/DQoqIEtvdGEgZGFuIENsdXN0ZXIgbWFuYSB5YW5nIHBhbGluZyBtZW5ndW50dW5na2FuPw0KKiBIaXR1bmcgdG90YWwgYmlheWEgaWtsYW4gQW5kYSwgamlrYSBBbmRhIGhhcnVzIG1lbWJheWFybnlhICQ0IHNldGlhcCBrYWxpIGlrbGFuLg0KKiBIaXR1bmcgcmF0YS1yYXRhIGJpYXlhIGlrbGFuIHVudHVrIHNldGlhcCBtYXJrZXRpbmcgZGkgUGVydXNhaGFhbiB0ZXJzZWJ1dC4NCiogSGl0dW5nIFRvdGFsIFBlbmRhcGF0YW4gKGRhbGFtIEJ1bGFuYW4pIA0KDQojIyMgUg0KDQpgYGB7cn0NCiBBbmdlbCA9IHN1YnNldCAoRGF0YSwgc3Vic2V0PShNYXJrZXRpbmdfTmFtZSA9PSAiQW5nZWwiKSkgDQpTaGVybHk9c3Vic2V0IChEYXRhLCBzdWJzZXQ9KE1hcmtldGluZ19OYW1lID09ICJTaGVybHkiKSkgDQpWYW5lc3NhPXN1YnNldChEYXRhLCBzdWJzZXQ9KE1hcmtldGluZ19OYW1lID09ICJWYW5lc3NhIiAgKSkNCklyZW5lPXN1YnNldChEYXRhLCBzdWJzZXQ9KE1hcmtldGluZ19OYW1lID09ICJJcmVuZSIpKQ0KSnVsaWFuPXN1YnNldCAoRGF0YSwgc3Vic2V0PShNYXJrZXRpbmdfTmFtZSA9PSAiSnVsaWFuIikpDQpKZWZmcnkgPXN1YnNldCAoRGF0YSwgc3Vic2V0PShNYXJrZXRpbmdfTmFtZSA9PSAiSmVmZnJ5IikpIA0KTmlraXRhID1zdWJzZXQgKERhdGEsIHN1YnNldD0oTWFya2V0aW5nX05hbWUgPT0iTmlraXRhIikpIA0KS2VmYXMgPXN1YnNldChEYXRhLCBzdWJzZXQ9KE1hcmtldGluZ19OYW1lID09ICJLZWZhcyIpKQ0KU2lhbmEgPXN1YnNldCAoRGF0YSwgc3Vic2V0PShNYXJrZXRpbmdfTmFtZSA9PSAiU2lhbmEiKSkgDQpMYWxhPXN1YnNldCAoRGF0YSwgc3Vic2V0PShNYXJrZXRpbmdfTmFtZSA9PSAiTGFsYSIpKSANCkZhbGxlbiA9c3Vic2V0IChEYXRhLCBzdWJzZXQ9KE1hcmtldGluZ19OYW1lID09ICJGYWxsZW4iKSkgDQpBcmRpZm8gPXN1YnNldCAoRGF0YSwgc3Vic2V0PShNYXJrZXRpbmdfTmFtZSA9PSAiQXJkaWZvIikpDQpLZXZpbiA9c3Vic2V0IChEYXRhLCBzdWJzZXQ9KE1hcmtldGluZ19OYW1lID09ICJLZXZpbiIpKQ0KSnVlbiA9c3Vic2V0IChEYXRhLCBzdWJzZXQ9KE1hcmtldGluZ19OYW1lID09ICJKdWVuIikpIA0KSmVycmVsID1zdWJzZXQgKERhdGEsIHN1YnNldD0oTWFya2V0aW5nX05hbWUgPT0gIkplcnJlbCIpKQ0KSW1lbGRhID1zdWJzZXQgKERhdGEsIHN1YnNldD0oTWFya2V0aW5nX05hbWUgPT0gIkltZWxkYSIpKSANCldpZGkgPXN1YnNldChEYXRhLCBzdWJzZXQ9KE1hcmtldGluZ19OYW1lID09ICJXaWRpIikpIA0KVGhlb2RvciA9IHN1YnNldCAoRGF0YSwgc3Vic2V0PShNYXJrZXRpbmdfTmFtZSA9PSAiVGhlb2RvciIpKSANCkVsdmFuaSA9c3Vic2V0IChEYXRhLCBzdWJzZXQ9KE1hcmtldGluZ19OYW1lID09ICJFbHZhbmkiKSkgDQpKb25hdGhhbiA9IHN1YnNldCAoRGF0YSwgc3Vic2V0PShNYXJrZXRpbmdfTmFtZSA9PSAiSm9uYXRoYW4iKSkgDQpTb2ZpYSA9c3Vic2V0IChEYXRhLCBzdWJzZXQ9KE1hcmtldGluZ19OYW1lID09ICJTb2ZpYSIpKSANCkFicmFoYW0gPSBzdWJzZXQgKERhdGEsIHN1YnNldD0oTWFya2V0aW5nX05hbWUgPT0gIkFicmFoYW0iKSkgDQpTaXRpID1zdWJzZXQgKERhdGEsIHN1YnNldD0oTWFya2V0aW5nX05hbWUgPT0gIlNpdGkiKSkgDQpOaWtvID1zdWJzZXQoRGF0YSwgc3Vic2V0PShNYXJrZXRpbmdfTmFtZSA9PSAiTmlrbyIpKSANClNlZmxpID1zdWJzZXQgKERhdGEsIHN1YnNldD0oTWFya2V0aW5nX05hbWUgPT0gIlNlbGZpIikpIA0KQmVuZSA9c3Vic2V0KERhdGEsIHN1YnNldD0oTWFya2V0aW5nX05hbWUgPT0gIkJlbmUiKSkgDQpEaWFuYSA9c3Vic2V0IChEYXRhLCBzdWJzZXQ9KE1hcmtldGluZ19OYW1lID09ICJEaWFuYSIpKQ0KUHVwZSA9c3Vic2V0KERhdGEsIHN1YnNldD0oTWFya2V0aW5nX05hbWUgPT0gIlB1cGUiKSkgDQpBbmRpID1zdWJzZXQgKERhdGEsIHN1YnNldD0oTWFya2V0aW5nX05hbWUgPT0gIkFuZGkiKSkgDQpUYXRoYSA9c3Vic2V0IChEYXRhLCBzdWJzZXQ9KE1hcmtldGluZ19OYW1lID09ICJUYXRoYSIpKQ0KRW5kcmk9c3Vic2V0IChEYXRhLCBzdWJzZXQ9KE1hcmtldGluZ19OYW1lID09ICJFbmRyaSIpKSANCk1vbmlrYT0gc3Vic2V0KERhdGEsIHN1YnNldD0oTWFya2V0aW5nX05hbWUgPT0gIk1vbmlrYSIpKSANCkhhbnMgPXN1YnNldChEYXRhLCBzdWJzZXQ9KE1hcmtldGluZ19OYW1lID09ICJIYW5zIikpIA0KRGVib3JhPSBzdWJzZXQgKERhdGEsIHN1YnNldD0oTWFya2V0aW5nX05hbWUgPT0gIkRlYm9yYSIpKSANCkhhbmlmYT0gc3Vic2V0IChEYXRhLCBzdWJzZXQ9KE1hcmtldGluZ19OYW1lID09ICJIYW5pZmEiKSkNCkphbWVzID1zdWJzZXQgKERhdGEsIHN1YnNldD0oTWFya2V0aW5nX05hbWUgPT0gIkphbWVzIikpIA0KSmloYW4gPXN1YnNldCAoRGF0YSwgc3Vic2V0PShNYXJrZXRpbmdfTmFtZSA9PSAiSmloYW4iKSkNCkZyaXNrYSA9c3Vic2V0IChEYXRhLCBzdWJzZXQ9KE1hcmtldGluZ19OYW1lID09ICJGcmlza2EiKSkgDQpBcmRpd2FuID0gc3Vic2V0IChEYXRhLCBzdWJzZXQ9KE1hcmtldGluZ19OYW1lID09ICJBcmRpd2FuIikpIA0KQmFrdGkgPXN1YnNldCAoRGF0YSwgc3Vic2V0PShNYXJrZXRpbmdfTmFtZSA9PSAiQmFrdGkiKSkgDQpBbnRob24gPXN1YnNldCAoRGF0YSwgc3Vic2V0PShNYXJrZXRpbmdfTmFtZSA9PSAiQW50aG9uIikpIA0KQW1yeSA9c3Vic2V0IChEYXRhLCBzdWJzZXQ9KE1hcmtldGluZ19OYW1lID09ICJBbXJ5IikpIA0KV2l3aWsgPXN1YnNldCAoRGF0YSwgc3Vic2V0PShNYXJrZXRpbmdfTmFtZSA9PSAiV2l3aWsiKSkgDQpCYXN0aWFuID0gc3Vic2V0IChEYXRhLCBzdWJzZXQ9KE1hcmtldGluZ19OYW1lID09ICJCYXN0aWFuIikpIA0KQnVkaSA9IHN1YnNldCAoRGF0YSwgc3Vic2V0PShNYXJrZXRpbmdfTmFtZSA9PSAiQnVkaSIpKSANCkxlbyA9IHN1YnNldCAoRGF0YSwgc3Vic2V0PShNYXJrZXRpbmdfTmFtZSA9PSAiTGVvIikpIA0KU2ltb24gPSBzdWJzZXQgKERhdGEsIHN1YnNldD0oTWFya2V0aW5nX05hbWUgPT0gIlNpbW9uIikpIA0KTWF0aXVzID0gc3Vic2V0IChEYXRhLCBzdWJzZXQ9KE1hcmtldGluZ19OYW1lID09ICJNYXRpdXMiKSkgDQpBcnJ5ID0gc3Vic2V0IChEYXRhLCBzdWJzZXQ9KE1hcmtldGluZ19OYW1lID09ICJBcnJ5IikpIA0KRWxpYW5kbyA9IHN1YnNldCAoRGF0YSwgc3Vic2V0PShNYXJrZXRpbmdfTmFtZSA9PSAiRWxpYW5kbyIpKSANCiAgDQpOYW1hX1NhbGVzID0gYygiQW5nZWwiLCJTaGVybHkiLCJWYW5lc3NhIiwiSXJlbmUiLCJKdWxpYW4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgIkplZmZyeSIsIk5pa2l0YSIsIktlZmFzIiwiU2lhbmEiLCJMYWxhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJGYWxsZW4iLCJBcmRpZm8iLCJLZXZpbiIsIkp1ZW4iLCJKZXJyZWwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIkltZWxkYSIsIldpZGkiLCJUaGVvZG9yYSIsIkVsdmFuaSIsIkpvbmF0aGFuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJTb2ZpYSIsIkFicmFoYW0iLCJTaXRpIiwiTmlrbyIsIlNlZmxpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJCZW5lIiwgIkRpYW5hIiwgIlB1cGUiLCAiQW5kaSIsICJUYXRoYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAiRW5kcmkiLCAiTW9uaWthIiwgIkhhbnMiLCAiRGVib3JhIiwiSGFuaWZhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJKYW1lcyIsICJKaWhhbiIsICJGcmlza2EiLCJBcmRpd2FuIiwgIkJha3RpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJBbnRob24iLCJBbXJ5IiwgIldpd2lrIiwgIkJhc3RpYW4iLCAiQnVkaSIsDQogICAgICAgICAgICAgICAgICAgICAgICAiTGVvIiwiU2ltb24iLCJNYXRpdXMiLCJBcnJ5IiwgIkVsaWFuZG8iKQ0KcHJvcGVydHlzb2xkID0gYyhzdW0oQW5nZWwkUHJpY2UpLCBzdW0oU2hlcmx5JFByaWNlKSwgc3VtKFZhbmVzc2EkUHJpY2UpLCBzdW0oSXJlbmUkUHJpY2UpLA0Kc3VtKEp1bGlhbiRQcmljZSksIHN1bSAoSmVmZnJ5JFByaWNlKSwgc3VtKE5pa2l0YSRQcmljZSksIHN1bShLZWZhcyRQcmljZSksIHN1bShTaWFuYSRQcmljZSksIHN1bShMYWxhJFByaWNlKSwgc3VtKEZhbGxlbiRQcmljZSksIHN1bShBcmRpZm8kUHJpY2UpLCBzdW0oS2V2aW4kUHJpY2UpLCBzdW0gKEp1ZW4kUHJpY2UpLCBzdW0oSmVycmVsJFByaWNlKSwgc3VtKEltZWxkYSRQcmljZSksIHN1bShXaWRpJFByaWNlKSwgc3VtKFRoZW9kb3IkUHJpY2UpLCBzdW0oRWx2YW5pJFByaWNlKSwgc3VtKEpvbmF0aGFuJFByaWNlKSwgc3VtKFNvZmlhJFByaWNlKSwgc3VtKEFicmFoYW0kUHJpY2UpLCBzdW0oU2l0aSRQcmljZSksIHN1bShOaWtvJFByaWNlKSwgc3VtKFNlZmxpJFByaWNlKSwgc3VtKEJlbmUkUHJpY2UpLCBzdW0oIERpYW5hJFByaWNlKSwgc3VtIChQdXBlJFByaWNlKSwgc3VtKEFuZGkkUHJpY2UpLCBzdW0oIFRhdGhhJFByaWNlKSwgc3VtKEVuZHJpJFByaWNlKSwgc3VtKCBNb25pa2EkUHJpY2UpLCBzdW0oIEhhbnMkUHJpY2UpLCBzdW0oIERlYm9yYSRQcmljZSksIHN1bShIYW5pZmEkUHJpY2UpLCBzdW0gKEphbWVzJFByaWNlKSwgc3VtKCBKaWhhbiRQcmljZSksIHN1bSggRnJpc2thJFByaWNlKSwgc3VtKEFyZGl3YW4kUHJpY2UpLCBzdW0oQmFrdGkkUHJpY2UpLCBzdW0oQW50aG9uJFByaWNlKSwgc3VtKEFtcnkkUHJpY2UpLCBzdW0oIFdpd2lrJFByaWNlKSwgc3VtKCBCYXN0aWFuJFByaWNlKSwgc3VtKCBCdWRpJFByaWNlKSwgc3VtIChMZW8kUHJpY2UpLCBzdW0oU2ltb24kUHJpY2UpLCBzdW0oTWF0aXVzJFByaWNlKSwgc3VtKEFycnkkUHJpY2UpLCBzdW0oIEVsaWFuZG8kUHJpY2UpKQ0KDQpkYXRhbWFya2V0aW5nPSBkYXRhLmZyYW1lKE5hbWFfU2FsZXMsIHByb3BlcnR5c29sZCkNCg0KZGF0YW1hcmtldGluZw0KDQpgYGANCmBgYHtyfQ0KIyBCZXN0IE1hcmtldGluZw0KZGF0YW1hcmtldGluZ1t3aGljaC5tYXgoZGF0YW1hcmtldGluZyRwcm9wZXJ0eXNvbGQpLF0NCmBgYA0KYGBge3J9DQojS290YSBkYW4gQ2x1c3RlciBQYWxpbmcgTWVuZ3VudHVuZ2thbg0KcHJvZml0YWJsZT0gRGF0YVssYygiQ2l0eSIsIkNsdXN0ZXIiLCJQcmljZSIpXQ0KDQpwcm9maXRhYmxlW3doaWNoLm1heChwcm9maXRhYmxlJFByaWNlKSxdDQpgYGANCg0KYGBge3J9DQojVG90YWwgQmlheWEgU2R2ZXJ0aXNtZW50IGlyZW5lDQpjb3N0Zm9yYWQgPSBzdWJzZXQoRGF0YSwgc3Vic2V0PShNYXJrZXRpbmdfTmFtZSA9PSAiSXJlbmUiKSkNCg0KYWRzY29zdCA9ICggY29zdGZvcmFkJEFkdmVydGlzZW1lbnQgKiA0KQ0KDQpUb3RhbGNvc3Q9cHJpbnQoc3VtKGFkc2Nvc3QpKQ0KDQpgYGANCg0KYGBge3J9DQojIFJhdGEtUmF0YSBjb3N0IGlrbGFuDQpOYW1hc2FsZXMgPSBjKCJBbmdlbCIsIlNoZXJseSIsIlZhbmVzc2EiLCJJcmVuZSIsIkp1bGlhbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAiSmVmZnJ5IiwiTmlraXRhIiwiS2VmYXMiLCJTaWFuYSIsIkxhbGEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIkZhbGxlbiIsIkFyZGlmbyIsIktldmluIiwiSnVlbiIsIkplcnJlbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAiSW1lbGRhIiwiV2lkaSIsIlRoZW9kb3JhIiwiRWx2YW5pIiwiSm9uYXRoYW4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgIlNvZmlhIiwiQWJyYWhhbSIsIlNpdGkiLCJOaWtvIiwiU2VmbGkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIkJlbmUiLCAiRGlhbmEiLCAiUHVwZSIsICJBbmRpIiwgIlRhdGhhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJFbmRyaSIsICJNb25pa2EiLCAiSGFucyIsICJEZWJvcmEiLCJIYW5pZmEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIkphbWVzIiwgIkppaGFuIiwgIkZyaXNrYSIsIkFyZGl3YW4iLCAiQmFrdGkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIkFudGhvbiIsIkFtcnkiLCAiV2l3aWsiLCAiQmFzdGlhbiIsICJCdWRpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJMZW8iLCJTaW1vbiIsIk1hdGl1cyIsIkFycnkiLCAiRWxpYW5kbyIpDQpyYXRhY29zdCA9IGZvciAoeCBpbiBOYW1hc2FsZXMpIHsNCiAgZj0gc3Vic2V0ICggRGF0YSwgc3Vic2V0PShNYXJrZXRpbmdfTmFtZSA9PSB4ICkpDQogIGM9c3VtKGYkQWR2ZXJ0aXNlbWVudCAqIDQpDQogIHByaW50IChjYXQoc3VtKGMpL2xlbmd0aChmJElkKSwgKGNhdCh4LCAnUmF0YS1yYXRhIHBlbmdlbHVhcmFuIHVudHVrIGlrbGFuJykpKSl9DQoNCg0KDQpgYGAgICANCg0KYGBge3J9DQojIFBlbmRhcGF0YW4NCg0KcmV2ZW51ZT0gKHN1bShEYXRhJFByaWNlKS0oc3VtKERhdGEkQWR2ZXJ0aXNtZW50KSAqIDQpKS8oKG1heChEYXRhJFdvcmtfRXhwKSkqMTIpDQoNCnJldmVudWUNCmBgYA0KDQoNCg0KDQoNCg0KDQojIEthc3VzIDINCg0KTWlzYWxrYW4gQW5kYSBtZW1pbGlraSBwcm95ZWsgcmlzZXQgcGFzYXIgdW50dWsgbWVtcGVydGFoYW5rYW4gYmViZXJhcGEgcGVsYW5nZ2FuIHBvdGVuc2lhbCBkaSBwZXJ1c2FoYWFuIEFuZGEuIE1hcmkga2l0YSBhc3Vtc2lrYW4gQW5kYSBiZWtlcmphIGRpIHBlcnVzYWhhYW4gYXN1cmFuc2kgQUJDLiBVbnR1ayBtZWxha3VrYW5ueWEsIEFuZGEgaW5naW4gbWVuZ3VtcHVsa2FuIGt1bXB1bGFuIGRhdGEgYmVyaWt1dDoNCg0KKiAqKk1hcml0YWxfU3RhdHVzKiogICAgOiBtZW5ldGFwa2FuIHN0YXR1cyBwZXJrYXdpbmFuIGFjYWsgKCJZYSIsICJUaWRhayIpDQoqICoqQWRkcmVzcyoqICAgICAgICAgICA6IGJlcmlrYW4gYWxhbWF0IGFjYWsgKEpBQk9ERVRBQkVLKSANCiogKipXb3JrX0xvY2F0aW9uKiogICAgIDogbWVuZXRhcGthbiBsb2thc2kga2VyamEgc2VjYXJhIGFjYWsgKEpBQk9ERVRBQkVLKSANCiogKipBZ2UqKiAgICAgICAgICAgICAgIDogbWVuZXRhcGthbiB1cnV0YW4gYW5na2EgYWNhayAoZGFyaSAxOSBoaW5nZ2EgNjApIA0KKiAqKkFjYWRlbWljKiogICAgICAgICAgOiBtZW5ldGFwa2FuIHRpbmdrYXQgYWthZGVtaWsgYWNhayAoIkouU2Nob29sIiwgIkguU2Nob29sIiwgIlNhcmphbmEiLCAiTWFnaXN0ZXIiLCAiUGhkIikgDQoqICoqSm9iKiogICAgICAgICAgICAgICA6IDEwIHBla2VyamFhbiBhY2FrIHVudHVrIHNldGlhcCB0aW5na2F0IGFrYWRlbWlrICANCiogKipHcmFkZSoqICAgICAgICAgICAgIDogNSBuaWxhaSBhY2FrIHVudHVrIHNldGlhcCBQZWtlcmphYW4gDQoqICoqSW5jb21lKiogICAgICAgICAgICA6IHRldGFwa2FuIHBlbmRhcGF0YW4geWFuZyBtdW5na2luIHVudHVrIHNldGlhcCBQZWtlcmphYW4gIA0KKiAqKlNwZW5kaW5nKiogICAgICAgICAgOiB0ZXRhcGthbiBrZW11bmdraW5hbiBwZW5nZWx1YXJhbiB1bnR1ayBzZXRpYXAgUGVrZXJqYWFuIA0KKiAqKk51bWJlcl9vZl9jaGlsZHJlbioqOiBtZW5ldGFwa2FuIG5vbW9yIGFjYWsgZGkgYW50YXJhIDAgZGFuIDEwIChzZXN1YWkgZGVuZ2FuIHN0YXR1cyBwZXJrYXdpbmFuKQ0KKiAqKlByaXZhdGVfdmVoaWNsZSoqICAgOiBtZW5ldGFwa2FuIGtlbXVuZ2tpbmFuIGtlbmRhcmFhbiBwcmliYWRpIHVudHVrIHNldGlhcCBvcmFuZyAoIk1vYmlsIiwgInNlcGVkYSBtb3RvciIsICJVbXVtIikgDQoqICoqSG9tZSoqICAgICAgICAgICAgICA6ICJTZXdhIiwgIk1pbGlrIiwgIktyZWRpdCIgDQoNCiMjIFNvYWwgMSB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQpUb2xvbmcgYmVyaWthbiBzYXlhIGt1bXB1bGFuIGRhdGEgdGVudGFuZyBpbmZvcm1hc2kgNTAwMDAgcGVsYW5nZ2FuIHlhbmcgbWVuZ2FjdSBwYWRhIHNldGlhcCB2YXJpYWJlbCBkaSBhdGFzISANCg0KIyMjIFIgDQoNCmBgYHtyfQ0KbWFyaXRhbF9zdGF0dXMgPC0gc2FtcGxlKGMoIlllcyIsICJObyIpLCA1MDAwMCwgcmVwbGFjZSA9IFQpIA0KQWRkcmVzcyA8LXNhbXBsZShjKCJKYWthcnRhIiwgIkJvZ29yIiwgIkRlcG9rIiwgIlRhbmdlcmFuZyIsICJCZWthc2kiKSw1MDAwMCwgcmVwbGFjZT1UKQ0KV29ya19Mb2NhdGlvbiA8LXNhbXBsZShjKCJKYWthcnRhIiwgIkJvZ29yIiwgIkRlcG9rIiwgIlRhbmdlcmFuZyIsICJCZWthc2kiKSw1MDAwMCwgcmVwbGFjZT1UKQ0KQWdlIDwtZmxvb3IgKHJ1bmlmKDUwMDAwLDE5LDYwKSkNCkFjYWRlbWljIDwtc2FtcGxlKGMoIkouU2Nob29sIiwgIkguU2Nob29sIiwgIkJhY2hlbG9yIERlZ3JlZSIsICJNYXN0ZXIiLA0KIlBoZCIpLCA1MDAwMCwgcmVwbGFjZSA9IFQpIA0KDQoNCg0KDQoNCkdyYWRlIDwtc2FtcGxlKGMoIlMrIiwgIlMiLCAiQSsiLCAiQSIsDQoiQiIpLCA1MDAwMCwgcmVwbGFjZT1UKSANCg0KTnVtYmVyX29mX2NoaWxkcmVuIDwtIGlmZWxzZShtYXJpdGFsX3N0YXR1cyA9PSJZZXMiLCBzYW1wbGUoKGMoMDoxMCkpLCBsZW5ndGgobWFyaXRhbF9zdGF0dXMgPT0iWWVzIiksIHJlcGxhY2U9VCksICIwIikNClByaXZhdGVfdmVoaWNsZSA8LSBzYW1wbGUoYygiQ2FyIiwgIk1vdG9yY3ljbGUiLCAiUHVibGljIiksDQo1MDAwMCwgcmVwbGFjZT1UKQ0KSG9tZSA8LSBzYW1wbGUoYygiUmVudCIsICJPd24iLCAiQ3JlZGl0IiksIDUwMDAwLCByZXBsYWNlPVQpIA0KDQpEYXRhc29hbDIgPC1kYXRhLmZyYW1lIChtYXJpdGFsX3N0YXR1cywgQWRkcmVzcywgV29ya19Mb2NhdGlvbiwgQWdlLCBBY2FkZW1pYywgR3JhZGUsIE51bWJlcl9vZl9jaGlsZHJlbiwgUHJpdmF0ZV92ZWhpY2xlLCBIb21lKQ0KDQpsaWJyYXJ5KGRhdGEudGFibGUpDQpkYXRhLnRhYmxlKERhdGFzb2FsMikNCmBgYA0KDQpgYGB7cn0NCg0KSm9iIDwtIGlmZWxzZSAoRGF0YXNvYWwyJEFjYWRlbWljID09ICJKLlNjaG9vbCIsIHNhbXBsZShjKCJDbGVhbmluZyBTZXJ2aWNlIiwgIlNlY3VyaXR5IEd1YXJkIiwgIldhaXRlciIpKSwNCmlmZWxzZShEYXRhc29hbDIkQWNhZGVtaWMgPT0gIkguU2Nob29sIiwgc2FtcGxlKGMoIldhaXRlciIsICJTZWN1cml0eSBHdWFyZCIpKSwgaWZlbHNlKERhdGFzb2FsMiRBY2FkZW1pYyA9PSAiQmFjaGVsb3IgRGVncmVlIiwgc2FtcGxlKGMoIkNFTyIsICJUZWFjaGVyIikpLCBpZmVsc2UoRGF0YXNvYWwyJEFjYWRlbWljID09ICJNYXN0ZXIiLHNhbXBsZShjKCJCb2FyZCBEaXJlY3RvciIsICJBY3R1YXJpc3QiLCAiU29mdHdhcmUgRW5naW5lcmluZyIpKSwgc2FtcGxlKGMoIkhlYWQgb2YgUmVzZWFyY2giLCAiVGVhY2hlciIpKQ0KKSkpKQ0KDQpEYXRhc29hbDIgPSBkYXRhLmZyYW1lKG1hcml0YWxfc3RhdHVzLCBBZGRyZXNzLCBXb3JrX0xvY2F0aW9uLCBBZ2UsIEFjYWRlbWljLEpvYiwgR3JhZGUsIE51bWJlcl9vZl9jaGlsZHJlbiwgUHJpdmF0ZV92ZWhpY2xlLCBIb21lKQ0KDQpJbmNvbWUgPC0gaWZlbHNlIChEYXRhc29hbDIkSm9iID09ICJDbGVhbmluZyBTZXJ2aWNlIiwgc2FtcGxlKGMoNTAwMDo2MDAwKSksDQppZmVsc2UoRGF0YXNvYWwyJEpvYiA9PSAiQ2xlcmsiLCBzYW1wbGUoYyg0NTAwOjU1MDApKSwgaWZlbHNlKERhdGFzb2FsMiRKb2IgPT0gIldhaXRlciIsIHNhbXBsZShjKDQ1MDA6NjAwMCkpLCBpZmVsc2UoRGF0YXNvYWwyJEpvYiA9PSAiVGVhY2hlciIsc2FtcGxlKGMoNjAwMDo5MDAwKSksIGlmZWxzZSAoRGF0YXNvYWwyJEpvYiA9PSAiQWN0dWFyaXN0Iiwgc2FtcGxlKGMoODUwMDoxMzAwMCkpLCBpZmVsc2UoRGF0YXNvYWwyJCBKb2IgPT0gIlNvZnR3YXJlIEVuZ2luZXJpbmciLCBzYW1wbGUoYyg4MDAwOjEyMDAwKSksIGlmZWxzZSAoRGF0YXNvYWwyJEpvYiA9PSJTZWN1cml0eSBHdWFyZCIsIHNhbXBsZShjKDUwMDA6NTUwMCkpLCBpZmVsc2UgKERhdGFzb2FsMiRKb2I9PSAiSGVhZCBvZiBSZXNlYXJjaCIsIHNhbXBsZShjKDkwMDA6MTQwMDApKSwgaWZlbHNlKERhdGFzb2FsMiRKb2IgPT0gIkNFTyIsIHNhbXBsZShjKDEzMDAwOjIwMDAwKSksIHNhbXBsZShjKDExMDAwOjE2MDAwKSkNCikpKSkpKSkpKQ0KDQpTcGVuZGluZyA8LSBpZmVsc2UgKERhdGFzb2FsMiRKb2IgPT0gIkNsZWFuaW5nIFNlcnZpY2UiLCBzYW1wbGUoYygzMDAwOjQ1MDApKSwNCmlmZWxzZShEYXRhc29hbDIkSm9iID09ICJDbGVyayIsIHNhbXBsZShjKDIyMDA6NTEwMCkpLCBpZmVsc2UoRGF0YXNvYWwyJEpvYiA9PSAiV2FpdGVyIiwgc2FtcGxlKGMoMzAwMDo1MDAwKSksIGlmZWxzZShEYXRhc29hbDIkSm9iID09ICJUZWFjaGVyIixzYW1wbGUoYyg0MDAwOjc1MDApKSwgaWZlbHNlIChEYXRhc29hbDIkSm9iID09ICJBY3R1YXJpc3QiLCBzYW1wbGUoYygzNTAwOjkwMDApKSwgaWZlbHNlKERhdGFzb2FsMiQgSm9iID09ICJTb2Z0d2FyZSBFbmdpbmVyaW5nIiwgc2FtcGxlKGMoNTAwMDo3NTAwKSksIGlmZWxzZSAoRGF0YXNvYWwyJEpvYiA9PSJTZWN1cml0eSBHdWFyZCIsIHNhbXBsZShjKDQwMDA6NDUwMCkpLCBpZmVsc2UgKERhdGFzb2FsMiRKb2I9PSAiSGVhZCBvZiBSZXNlYXJjaCIsIHNhbXBsZShjKDYwMDA6MTA1MDApKSwgaWZlbHNlKERhdGFzb2FsMiRKb2IgPT0gIkNFTyIsIHNhbXBsZShjKDYwMDA6MTAwMDApKSwgc2FtcGxlKGMoNTUwMDoxMTAwMCkpDQopKSkpKSkpKSkNCg0KRGF0YXNvYWwyJEpvYj1Kb2INCkRhdGFzb2FsMiRJbmNvbWUgPSBJbmNvbWUNCkRhdGFzb2FsMiRTcGVuZGluZyA9IFNwZW5kaW5nDQoNCkRhdGFzb2FsMg0KDQpgYGANCg0KDQoNCg0KIyMgU29hbCAyIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNClJpbmdrYXNhbiBTdGF0aXN0aWsgcGVudGluZyBzZXBlcnRpIGFwYSB5YW5nIGJpc2EgQW5kYSBkYXBhdGthbiBkYXJpIGt1bXB1bGFuIGRhdGEgQW5kYT8NCg0KIyMjIFINCg0KYGBge3J9DQpzdW1tYXJ5KERhdGFzb2FsMikNCmBgYA0KDQoNCg0KYA0KDQoNCiMjIFNvYWwgMyB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQpNZW51cnV0IHBlcmhpdHVuZ2FuIGRhbiBhbmFsaXNpcyBBbmRhLCBwZWxhbmdnYW4gbWFuYSB5YW5nIHBvdGVuc2lhbCB1bnR1ayBBbmRhIHBlcnRhaGFua2FuPyANCg0KIyMjIFINCg0KYGBge3J9DQpEYXRhc29hbDIkTmV0V29ydGggPSBEYXRhc29hbDIkSW5jb21lLURhdGFzb2FsMiRTcGVuZGluZw0KDQpEYXRhc29hbDINCmBgYA0KYGBge3J9DQojUG90ZW50aWFsIHVudHVrIGRpcGVydGFoYW5rYW4NCnN1YnNldChEYXRhc29hbDIsIE5ldFdvcnRoPj0gNzAwMCkNCg0KYGBgDQogIA0KDQoNCg0KDQoNCiANCg0KDQojIFJlZmVyZW5zaQ0KDQoxLiAgIHJlZiAxDQoyLiAgIHJlZiAyDQozLiAgIHJlZiAzDQoNCg0KDQoNCg==