1.Giới thiệu về bộ dữ liệu và đặt vấn đề

1.1. Mô tả bộ dữ liệu

Bộ dữ liệu chứa thông tin mua sắm của 10 cửa hàng ở Istanbul trong giai đoạn từ 2021 đến 2023, được tổng hợp dựa trên phân khúc độ tuổi và giới tính để xem hành vi mua sắm của khách hàng. Thông tin thu thập được gồm 10 biến:

  • invoice_no: ID của đơn hàng

  • customer_id: ID của khách hàng

  • Gender: giới tính khách hàng

  • Age: Độ tuổi

  • Category: Phân loại sản phẩm

  • Quantity: Số lượng hàng mua

  • Price: Giá hàng bán

  • Payment_method: Hình thức thanh toán

  • invoice_date: Ngày mua hàng

  • shopping_mall: Tên cửa hàng

  • industry: ngành hàng ( tiêu dùng nhanh hay thức ăn nhanh)

1.2. Đặt vấn đề

Ước lượng 2 biến

  • Giới tính cólàm ảnh hưởng đến việc khách hàng lựa chọn mua một loại sản phẩm nào đó không (biến Gender có làm ảnh hưởng đến biến Category không?)

  • Giới tính có làm ảnh hưởng đến việc khách hàng lựa chọn mua sản phẩm thuộc ngành hàng nào đó không? (biến Gender có làm ảnh hưởng đến biến industry không?)

  • Giới tính có làm ảnh hưởng đến việc khách hàng lựa chọn phương thức thanh toán không? (biến Gender có làm ảnh hưởng đến biến Payment_method không?)

  • Độ tuổi có làm ảnh hưởng đến việc khách hàng lựa chọn mua một sản phẩm thuộc ngành hàng nào đó không?(biến age có làm ảnh hưởng đến biến industry không?)

  • Độ tuổi có ảnh hưởng đến việc lựa chọn phương thức thanh toán của khách hàng không (biến gender có làm ảnh hưởng đến biến payment_method không)

Ước lượng 3 biến

  • Độ tuổi có làm ảnh hưởng đến việc khách hàng lựa chọn phương thức thanh toán và lựa chọn ngành hàng mua sắm không (biến age có làm ảnh hưởng đến biến payment_method và industry không?)

  • Giới tính có làm ảnh hưởng đến việc khách hàng lựa chọn phương thức thanh toán và lựa chọn ngành hàng mua sắm không (biến gender có làm ảnh hưởng đến biếnpayment_method và industry không?)

3. Lập bảng tần số, tần suất để mô tả

3.1.Bảng tần số của giới tính và loại sản phẩm

  • Bảng tần số của giới tính và loại sản phảm để xem có sự chênh lệch giữa nam và nữ khi chọn một loại sản phẩm nào đó không.
frequency <- table(df$gender, df$category)

frequency
##         
##          Books Clothing Cosmetics Food & Beverage Shoes Souvenir Technology
##   Female  2906    20652      9070            8804  5967     3017       2981
##   Male    2075    13835      6027            5972  4067     1982       2015
##         
##           Toys
##   Female  6085
##   Male    4002
addmargins(frequency)
##         
##          Books Clothing Cosmetics Food & Beverage Shoes Souvenir Technology
##   Female  2906    20652      9070            8804  5967     3017       2981
##   Male    2075    13835      6027            5972  4067     1982       2015
##   Sum     4981    34487     15097           14776 10034     4999       4996
##         
##           Toys   Sum
##   Female  6085 59482
##   Male    4002 39975
##   Sum    10087 99457

Nhìn sơ qua thì ta có thể thấy ở tất cả phân loại sản phẩm, số lượng mua hàng của nữ nhiều hơn số lượng mua hàng của nam (Biểu đồ thể hiện sự chênh lệch giữa nam và nữ và các loại sản phẩm thể hiện ở hình 4.1)

Bảng tần suất của sản phẩm

  • Lập bảng tần suất để xem mặt hàng nào được bán chạy nhất và mặt hàng nào ít bán chạy nhất
frequenproduct <- table(df$category)
percentfrequency <- prop.table(frequenproduct)
percentfrequency
## 
##           Books        Clothing       Cosmetics Food & Beverage           Shoes 
##      0.05008194      0.34675287      0.15179424      0.14856672      0.10088782 
##        Souvenir      Technology            Toys 
##      0.05026293      0.05023276      0.10142071
min(percentfrequency)
## [1] 0.05008194
max(percentfrequency)
## [1] 0.3467529
  • Sản phẩm có số bán ra ít nhất có tần số xuất hiện là 0.05008194
  • Sản phẩm có số bán ra nhiều nhất có tần số xuất hiện là 0.3467529

3.2.Bảng tần số của giới tính và ngành hàng

  • Bảng tần số của giới tính và ngành hàng để xem có sự chênh lệch giữa nam và nữ khi chọn mua một loại hàng không
frequencyindustry <- table(df$gender, df$industry)

frequencyindustry
##         
##            F&B  FMCG
##   Female  8804 50678
##   Male    5972 34003
addmargins(frequencyindustry)
##         
##            F&B  FMCG   Sum
##   Female  8804 50678 59482
##   Male    5972 34003 39975
##   Sum    14776 84681 99457
  • Kết quả cho ta thấy ở cả hai ngành hàng F$B và FMCG, tỷ lệ mua hàng của nữ lớn hơn tỷ lệ mua hàng của nam rất nhiều. (Đồ thị thể hiện sự chênh lệch này nằm ở hình 3.2 )

  • Trong ngành hàng F&B, tỷ lệ khách hàng là nam so với tỷ lệ khách hàng là nữ là: \(\frac{5972}{8804}\). Cho thấy tỷ lệ nữ mua hàng ở ngành hàng này chiếm gần 68% so với tổng khách hàng

  • Trong ngành hàng FMCG, tỷ lệ khách hàng là nam so với tỷ lệ khách hàng là nữ là: \(\frac{34003}{50678}\). Cho thấy tỷ lệ nữ mua hàng ở ngành hàng này chiếm hơn 67% so với tổng khách hàng

3.3.Bảng tần số của độ tuổi và ngành hàng tiêu dùng

  • Bảng tần số của độ tuổi và ngành hàng tiêu dùng để xem rằng giữa người già và người trẻ có sự chọn lựa khác nhau trong các ngành hàng tiêu dùng khác nhau hay không
frequencyage <- table(df$age, df$industry)

frequencyage
##        
##           F&B  FMCG
##   Young  9430 53926
##   Old    5346 30755
addmargins(frequencyage)
##        
##           F&B  FMCG   Sum
##   Young  9430 53926 63356
##   Old    5346 30755 36101
##   Sum   14776 84681 99457
  • Kết quả cho ta thấy ở cả hai ngành hàng F$B và FMCG, tỷ lệ mua hàng của người trể lớn hơn tỷ lệ mua hàng của người già rất nhiều. (Đồ thị thể hiện sự chênh lệch này nằm ở hình 3.3 )

  • Trong ngành hàng F&B, tỷ lệ khách hàng là người trẻ so với tỷ lệ khách hàng là người già là: \(\frac{9430}{5346}\). Cho thấy tỷ lệ người trẻ mua hàng ở ngành hàng này chiếm gần 64% so với tổng khách hàng

  • Trong ngành hàng FMCG, tỷ lệ khách hàng là người trẻ so với tỷ lệ khách hàng là người già là: \(\frac{53926}{30755}\). Cho thấy tỷ lệ người trẻ mua hàng ở ngành hàng này chiếm gần 64% so với tổng khách hàng

3.4.Bảng tần số của độ tuổi và phương thức thanh toán

  • Bảng tần số của độ tuổi để xem độ tuổi ảnh hưởng như thế nào đến việc lựa chọn phương thức thanh toán
frequencypayment <- table(df$age, df$payment_method)

frequencypayment
##        
##          Cash Credit Card Debit Card
##   Young 28259       22256      12841
##   Old   16188       12675       7238
addmargins(frequencypayment)
##        
##          Cash Credit Card Debit Card   Sum
##   Young 28259       22256      12841 63356
##   Old   16188       12675       7238 36101
##   Sum   44447       34931      20079 99457
  • Kết quả cho ta thấy ở cả hai phương thức thanh toán, tỷ lệ mua hàng của người trể lớn hơn tỷ lệ mua hàng của người già rất nhiều. (Đồ thị thể hiện sự chênh lệch này nằm ở hình 3.4 )

  • Trong phương thức trả bằng tiền mặt, tỷ lệ khách hàng là người trẻ so với tỷ lệ khách hàng là người già là: \(\frac{28259}{16188}\). Cho thấy tỷ lệ người trẻ mua hàng ở ngành hàng này gấp 1,74 lần so với người già

  • Trong ngành hàng FMCG, tỷ lệ khách hàng là người trẻ so với tỷ lệ khách hàng là người già là: \(\frac{35097}{ 19913}\). Cho thấy tỷ lệ người trẻ mua hàng ở ngành hàng này gấp 1,76 lần so với người già

3.5.Bảng tần số của độ tuổi, ngành hàng và phương thức thanh toán

frequency3a <- table(df$age, df$industry,df$payment_method)

frequency3a
## , ,  = Cash
## 
##        
##           F&B  FMCG
##   Young  4182 24077
##   Old    2405 13783
## 
## , ,  = Credit Card
## 
##        
##           F&B  FMCG
##   Young  3367 18889
##   Old    1883 10792
## 
## , ,  = Debit Card
## 
##        
##           F&B  FMCG
##   Young  1881 10960
##   Old    1058  6180
addmargins(frequency3a)
## , ,  = Cash
## 
##        
##           F&B  FMCG   Sum
##   Young  4182 24077 28259
##   Old    2405 13783 16188
##   Sum    6587 37860 44447
## 
## , ,  = Credit Card
## 
##        
##           F&B  FMCG   Sum
##   Young  3367 18889 22256
##   Old    1883 10792 12675
##   Sum    5250 29681 34931
## 
## , ,  = Debit Card
## 
##        
##           F&B  FMCG   Sum
##   Young  1881 10960 12841
##   Old    1058  6180  7238
##   Sum    2939 17140 20079
## 
## , ,  = Sum
## 
##        
##           F&B  FMCG   Sum
##   Young  9430 53926 63356
##   Old    5346 30755 36101
##   Sum   14776 84681 99457
  • Cho dù phân loại tần số lựa chọn ngành hàng sản phẩm ứng với phân khúc độ tuổi theo 2 loại hình thức thanh toán thì tỷ lệ lựa chọn ngàng hàng sử dụng giữa nam và nữ cũng không thay đổi.

4. Biểu đồ

4.1. Gender and Category

Biểu đồ thể hiện số lượng mua từng loại sản phẩm được chia theo 2 giới tính

library(ggplot2)
ggplot(df, aes(gender, fill = category)) + geom_bar(position = 'dodge') +  labs(x = "Gender", y = "Count of Category")

Nhìn vào đồ thị cũng dễ dàng nhìn thấy, số lượng mua hàng của Nữ ở tất cả phân loại sản phẩm đều lớn hơn nam, tuy nhiên để đánh giá xem sự chênh lệch từ biểu đồ vẽ ra có đáng tin cậy không thì ta dùng Hypothetics test ước lượng tỷ lệ để đánh giá xem có sự khác nhau về cách lựa chọn sản phẩm của 2 giới tính không.

Biểu đồ thể hiện số lượng mua từng sản phẩm của khách hàng

ggplot(df, aes(category)) + geom_bar(position = 'dodge') + labs(x= "Category", y= "Count of invoice")

  • Clothing là sản phẩm được tiêu thụ nhiều nhất. Nhìn vào đồ thị ta khó phân biệt được Books, Souvenir hay Technology là sản phẩm tiêu thụ ít nhất. Phần 5.1 sẽ dùng Hypothetics test để xem thử sản phẩm nào có tần suất xuất hiện ít nhất.

4.2. Gender and Industry

Biểu đồ thể hiện số lượng mua từng loại ngành hàng được chia theo 2 giới tính

ggplot(df, aes(gender, fill = industry)) + geom_bar(position = 'dodge') +  labs(x = "Gender", y = "Count of industry")

4.3. Age and Industry

Biểu đồ thể hiện số lượng mua từng loại ngành hàng được chia theo 2 độ tuổi

ggplot(df, aes(age, fill = industry)) + geom_bar(position = 'dodge') +  labs(x = "Age", y = "Count of industry")

4.4. Age and Payment_method

Biểu đồ thể hiện số khách hàng lựa chọn từng phương thức thanh toán được chia theo 2 độ tuổi

ggplot(df, aes(age, fill = payment_method)) + geom_bar(position = 'dodge') +  labs(x = "Age", y = "Count of invoice")

5.Ước lượng tỷ lệ

Ước lượng tỷ lệ của từng sản phẩm

Nhìn vào đồ thị thể hiện số lượng mua hàng của từng sản phẩm, ta thấy Books là sản phẩm ít bán chạy nhất. Ta đặt ra câu hỏi là có chắc chắn Books là loại sản phẩm có số lượng mua hàng ít nhất không? Ước lượng tỷ lệ người mua sản phẩm là Books đồng thời kiểm định xem tỷ lệ (%) người mua Books có phải là 5% không (5% là tần sô của sản phẩm được bán ra ít nhất)? Chúng ta tiến hành kiểm định giả thuyết \(H_0=0,05\)

books <- df[df$category == "Books",]
prop.test(length(books$category), length(books$category), p = 0.05)
## 
##  1-sample proportions test with continuity correction
## 
## data:  length(books$category) out of length(books$category), null probability 0.05
## X-squared = 94619, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.05
## 95 percent confidence interval:
##  0.9990392 1.0000000
## sample estimates:
## p 
## 1

Kết quả cho ta thấy giá trị P-value < mức ý nghĩa 0.05. Ta bác bỏ H0, tức là tỷ lệ mua sản phẩm Books của khách hàng không phải là 0.05%.

  • Nhìn vào đồ thị, ta thấy Clothing là sản phẩm bán chạy nhất. Ta đặt ra câu hỏi là có chắc chắn Clothing là loại sản phẩm có số lượng mua hàng nhiều nhất không? Ước lượng tỷ lệ người mua sản phẩm là Clothings đồng thời kiểm định xem tỷ lệ (%) người mua Clothing có phải là 35% không (35% là tấn số của sản phẩm được bán chạy nhất)? Chúng ta tiến hành kiểm định giả thuyết \(H_0=0.35\)
Clothings <- df[df$category == "Clothing",]
prop.test(length(Clothings$category), length(Clothings$category), p = 0.35)
## 
##  1-sample proportions test with continuity correction
## 
## data:  length(Clothings$category) out of length(Clothings$category), null probability 0.35
## X-squared = 64044, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.35
## 95 percent confidence interval:
##  0.9998611 1.0000000
## sample estimates:
## p 
## 1

Giá trị P-value trả về rất bé, nhỏ hơn mức ý nghĩa 0.05 nên ta bác bỏ H0, vậy tỷ lệ mua sản phẩm Clothings không phải là 35%.

Ước lượng chênh lệch tỷ lệ của từng sản phẩm đối với từng phân khúc khách hàng

1. Ước lượng sự chênh lệch về tỷ lệ mua Books giữa nam và nữ.

Đặt giả thuyết \(H_0\): Tỷ lệ mua Books của nam và nữ là bằng nhau

Male <- df[df$gender == "Male",]
Female <- df[df$gender == "Female",]

Malerate <- Male[Male$category == "Books",]
Femalerate <- Female[Female$category == "Books",]

genderate <- c(nrow(Male), nrow(Male))
categoryrate <- c(nrow(Malerate), nrow(Femalerate))

prop.test(categoryrate,genderate)
## 
##  2-sample test for equality of proportions with continuity correction
## 
## data:  categoryrate out of genderate
## X-squared = 147.49, df = 1, p-value < 2.2e-16
## alternative hypothesis: two.sided
## 95 percent confidence interval:
##  -0.02416072 -0.01741527
## sample estimates:
##     prop 1     prop 2 
## 0.05190744 0.07269543

Kết quả P_value rất nhỏ, ta bác bỏ H0. Cho thấy có sự khác biệt giữa tỷ lệ nam mua Books và nữ mua Books. Ngoài ra, khoảng tin cậy cho tỷ lệ mua books của hai giới tính này là (-0.02416072,-0.01741527), không bao gồm số 0, cho thấy giữa 2 tỷ lệ này có một sự chênh lệch đáng kể. Tỷ lệ của nhóm thứ nhất là 0.05190744, tỷ lệ của nhóm thứ 2 là 0.07269543.

2.Ước lượng sự chênh lệch về tỷ lệ mua Clothings giữa nam và nữ.

Đặt giả thuyết \(H_0\): Tỷ lệ mua Clothings của nam và nữ là bằng nhau

Male <- df[df$gender == "Male",]
Female <- df[df$gender == "Female",]

Malerate <- Male[Male$category == "Clothing",]
Femalerate <- Female[Female$category == "Clothing",]

genderate <- c(nrow(Male), nrow(Male))
categoryrate <- c(nrow(Malerate), nrow(Femalerate))

prop.test(categoryrate,genderate)
## 
##  2-sample test for equality of proportions with continuity correction
## 
## data:  categoryrate out of genderate
## X-squared = 2369, df = 1, p-value < 2.2e-16
## alternative hypothesis: two.sided
## 95 percent confidence interval:
##  -0.1773201 -0.1637430
## sample estimates:
##    prop 1    prop 2 
## 0.3460913 0.5166229

Kết quả P_value rất nhỏ, ta bác bỏ H0. Cho thấy có sự khác biệt giữa tỷ lệ nam mua Clothings và nữ mua Clothings. Ngoài ra, khoảng tin cậy cho tỷ lệ mua Clothings của hai giới tính này là (-0.1773201, -0.1637430), không bao gồm số 0, cho thấy giữa 2 tỷ lệ này có một sự chênh lệch đáng kể. Tỷ lệ của nhóm thứ nhất là 0.3460913, tỷ lệ của nhóm thứ 2 là 0.5166229.

6. Relative Risk/ Odd Ratio

6.1. Gender and Payment_method

Relative Risk

df$payment_method[df$payment_method == "Debit Card"] <- "Credit Card"
paymentfrequency <- table(df$gender, df$payment_method)

addmargins(paymentfrequency)
##         
##           Cash Credit Card   Sum
##   Female 26509       32973 59482
##   Male   17938       22037 39975
##   Sum    44447       55010 99457
RelRisk(paymentfrequency) #Relrisk tính ở vị trí 11 so với 21 (biến thành công là cột thứ 1)
## [1] 0.9931669
riskratio(paymentfrequency)
## $data
##         
##           Cash Credit Card Total
##   Female 26509       32973 59482
##   Male   17938       22037 39975
##   Total  44447       55010 99457
## 
## $measure
##         risk ratio with 95% C.I.
##           estimate     lower    upper
##   Female 1.0000000        NA       NA
##   Male   0.9944687 0.9831882 1.005879
## 
## $p.value
##         two-sided
##          midp.exact fisher.exact chi.square
##   Female         NA           NA         NA
##   Male    0.3402943    0.3423102  0.3402862
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
  • Rủi ro tương đối của nam chọn Cash làm phương thức thanh toán so với nữ chọn Cash làm phương thức thanh toán là 1.00688. Kết quả này lớn hơn 1, nghĩa là Nam sẽ có nguy cơ chọn Cash là phương thức thanh toán hơn nữ
  • Kết quả trên cho thấy rủi ro tương đối của nữ chọn Credit Card làm phương thức thanh toán so với nam chọn credit card làm phương thức thanh toán là 1.005562. Kết quả này cũng lớn hơn 1, cho thấy nữ có nguy cơ chọn Credit Card làm phương thức thanh toán hơn Nam.

Odd Ratio

  • Tỷ lệ nam và nữ giữa xác suất “sử dụng Cash” và xác suất “không sử dụng Cash”
oddsratio(paymentfrequency)
## $data
##         
##           Cash Credit Card Total
##   Female 26509       32973 59482
##   Male   17938       22037 39975
##   Total  44447       55010 99457
## 
## $measure
##         odds ratio with 95% C.I.
##           estimate     lower    upper
##   Female 1.0000000        NA       NA
##   Male   0.9876839 0.9628148 1.013201
## 
## $p.value
##         two-sided
##          midp.exact fisher.exact chi.square
##   Female         NA           NA         NA
##   Male    0.3402943    0.3423102  0.3402862
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
  • Tỷ lệ Nam sử dụng Cash làm phương thức thanh toán so với nữ sử dụng cash làm phương thức thanh toán là 1.01246, giá trị này lớn hơn 1 tức là nam sẽ có nguy cơ sử dụng cash làm phương thức thanh toán hơn nữ.

6.2. Gender and Industry

Relative Risk

addmargins(frequencyindustry)
##         
##            F&B  FMCG   Sum
##   Female  8804 50678 59482
##   Male    5972 34003 39975
##   Sum    14776 84681 99457
RelRisk(frequencyindustry)
## [1] 0.9907479
riskratio(frequencyindustry)
## $data
##         
##            F&B  FMCG Total
##   Female  8804 50678 59482
##   Male    5972 34003 39975
##   Total  14776 84681 99457
## 
## $measure
##         risk ratio with 95% C.I.
##           estimate     lower    upper
##   Female 1.0000000        NA       NA
##   Male   0.9983777 0.9930996 1.003684
## 
## $p.value
##         two-sided
##          midp.exact fisher.exact chi.square
##   Female         NA           NA         NA
##   Male    0.5477424    0.5484646  0.5479025
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
  • Rủi ro tương đối của nữ chọn F&B là ngành hàng tiêu dùng với nam chọn F&B là ngành hàng tiêu dùng là 0.9907479. Giá trị này bé hơn 1, thể hiện nữ sẽ ít chọn F&B là ngành hàng tiêu dùng hơn nam.
  • Rủi ro tương đối giữa nam chọn FMCG là ngành hàng tiêu dùng và nữ chọn FMCG là ngành hàng tiêu dùng là 0.9983777, giá trị này bé hơn 1, thể hiện nam sẽ ít chọn FMCG là ngành hàng tiêu dùng hơn nữ.

Odd Ratio

oddsratio(frequencyindustry)
## $data
##         
##            F&B  FMCG Total
##   Female  8804 50678 59482
##   Male    5972 34003 39975
##   Total  14776 84681 99457
## 
## $measure
##         odds ratio with 95% C.I.
##           estimate     lower    upper
##   Female 1.0000000        NA       NA
##   Male   0.9891338 0.9545528 1.025001
## 
## $p.value
##         two-sided
##          midp.exact fisher.exact chi.square
##   Female         NA           NA         NA
##   Male    0.5477424    0.5484646  0.5479025
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
  • Xác xuất của nữ chọn ngành hàng F&B là 0.9891338, giá trị này nhỏ hơn 1 cũng thể hiện nữ ít chọn ngành hàng F&B hơn so với nam.

6.3. Age and Industry

Relative Risk

addmargins(frequencyage)
##        
##           F&B  FMCG   Sum
##   Young  9430 53926 63356
##   Old    5346 30755 36101
##   Sum   14776 84681 99457
RelRisk(frequencyage)
## [1] 1.005111
riskratio(frequencyage)
## $data
##        
##           F&B  FMCG Total
##   Young  9430 53926 63356
##   Old    5346 30755 36101
##   Total 14776 84681 99457
## 
## $measure
##        risk ratio with 95% C.I.
##         estimate     lower    upper
##   Young 1.000000        NA       NA
##   Old   1.000889 0.9955046 1.006303
## 
## $p.value
##        two-sided
##         midp.exact fisher.exact chi.square
##   Young         NA           NA         NA
##   Old    0.7473071     0.752617  0.7468917
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
  • Giá trị Relrisk = 1.005111 lớn hơn 1 thể hiện xác xuất người trẻ chọn ngành hàng F&B nhiều hơn người già chọn ngành hàng F&B
  • Giá trị Risratio = 1.000889 lớn hơn 1 thể hiện xác xuất người già chọn ngành hàng FMCG nhiều hơn người trẻ chọn ngành hàng FMCG

Odd Ratio

oddsratio(frequencyage)
## $data
##        
##           F&B  FMCG Total
##   Young  9430 53926 63356
##   Old    5346 30755 36101
##   Total 14776 84681 99457
## 
## $measure
##        odds ratio with 95% C.I.
##         estimate     lower    upper
##   Young 1.000000        NA       NA
##   Old   1.005994 0.9700925 1.043272
## 
## $p.value
##        two-sided
##         midp.exact fisher.exact chi.square
##   Young         NA           NA         NA
##   Old    0.7473071     0.752617  0.7468917
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
  • Giá trị 1.005994 lớn hơn 1 cho thấy, ở ngành hàng F&B, người trẻ sẽ có nhu cầu nhiều hơn người già

7. Thống kê suy diễn

  • Để kiểm định xem giới tính có ảnh hưởng đến hành vi lựa chọn sản phẩm khi mua hàng của khách hàng không, ta dùng Hypothetics test và phương pháp kiểm định thống kê Chi-square Giả thuyết \(H_0\): Hai biến độc lập hoàn toàn

7.1. Gender and Category

Kiểm định tính độc lập

chisq.test(frequency)
## 
##  Pearson's Chi-squared test
## 
## data:  frequency
## X-squared = 7.5679, df = 7, p-value = 0.3722
  • Giá trị p-value = 0.3722, chúng ta chưa đủ chứng cứ để bác bỏ H0. Vậy giới tính không ảnh hưởng đến việc lựa chọn sản phẩm của khách hàng.

7.2. Gender and Industry

chisq.test(frequencyindustry)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  frequencyindustry
## X-squared = 0.35024, df = 1, p-value = 0.554
  • Giá trị p-value = 0.554, chúng ta chưa đủ chứng cứ để bác bỏ H0. Vậy giới tính không ảnh hưởng đến việc lựa chọn ngành hàng mua sắm của khách hàng.

7.3. Age and Industry

chisq.test(frequencyage)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  frequencyage
## X-squared = 0.098264, df = 1, p-value = 0.7539
  • Giá trị p-value = 0.7539, chúng ta chưa đủ chứng cứ để bác bỏ H0. Vậy độ tuổi không ảnh hưởng đến việc lựa chọn ngành hàng mua sắm của khách hàng.

7.4. Age and payment_method

chisq.test(frequencypayment)
## 
##  Pearson's Chi-squared test
## 
## data:  frequencypayment
## X-squared = 0.83703, df = 2, p-value = 0.658
  • Giá trị p-value = 0.658, chúng ta chưa đủ chứng cứ để bác bỏ H0. Vậy độ tuổi không ảnh hưởng đến việc lựa chọn phương thức thanh toán.

8. Hồi quy

Xây dựng mô hình hồi quy

1.Giả sử ở trong biến Gender, thuộc tính gọi là thành công khi kết quả trả về là Male(Nam)

gender <- factor(df$gender)
levels(gender) #Vì thuộc tính thứ 2 là Male nên Male được gọi là "thành công"
## [1] "Female" "Male"
fitted <- glm(factor(gender) ~ category, family = binomial(link = 'logit'), data = df)
summary(fitted)
## 
## Call:
## glm(formula = factor(gender) ~ category, family = binomial(link = "logit"), 
##     data = df)
## 
## Coefficients:
##                         Estimate Std. Error z value Pr(>|z|)    
## (Intercept)             -0.33682    0.02874 -11.719   <2e-16 ***
## categoryClothing        -0.06379    0.03077  -2.073   0.0381 *  
## categoryCosmetics       -0.07191    0.03320  -2.166   0.0303 *  
## categoryFood & Beverage -0.05131    0.03327  -1.542   0.1231    
## categoryShoes           -0.04652    0.03521  -1.321   0.1864    
## categorySouvenir        -0.08334    0.04077  -2.044   0.0409 *  
## categoryTechnology      -0.05482    0.04072  -1.346   0.1781    
## categoryToys            -0.08222    0.03522  -2.335   0.0196 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 134026  on 99456  degrees of freedom
## Residual deviance: 134018  on 99449  degrees of freedom
## AIC: 134034
## 
## Number of Fisher Scoring iterations: 4
  • Đọc kết quả P_value. Mô hình hồi quy trên giải thích rằng các sản phẩm categoryClothing, categoryCosmetics, categorySouvenir, categoryToys sẽ ảnh hưởng lên phân khúc khách hàng là Nam.

2.Giả sử ở trong biến Gender, thuộc tính gọi là thành công khi kết quả trả về là Male(Nam)

df$gender <- factor(df$gender, levels = c("Male","Female"))
gender <- factor(df$gender)
levels(gender) #Đổi lại thuộc tính thứ 2 là Female nên Female được gọi là "thành công"
## [1] "Male"   "Female"
fitted <- glm(factor(gender) ~ category, family = binomial(link = 'logit'), data = df)
summary(fitted)
## 
## Call:
## glm(formula = factor(gender) ~ category, family = binomial(link = "logit"), 
##     data = df)
## 
## Coefficients:
##                         Estimate Std. Error z value Pr(>|z|)    
## (Intercept)              0.33682    0.02874  11.719   <2e-16 ***
## categoryClothing         0.06379    0.03077   2.073   0.0381 *  
## categoryCosmetics        0.07191    0.03320   2.166   0.0303 *  
## categoryFood & Beverage  0.05131    0.03327   1.542   0.1231    
## categoryShoes            0.04652    0.03521   1.321   0.1864    
## categorySouvenir         0.08334    0.04077   2.044   0.0409 *  
## categoryTechnology       0.05482    0.04072   1.346   0.1781    
## categoryToys             0.08222    0.03522   2.335   0.0196 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 134026  on 99456  degrees of freedom
## Residual deviance: 134018  on 99449  degrees of freedom
## AIC: 134034
## 
## Number of Fisher Scoring iterations: 4
  • Đọc kết quả P_value. Mô hình hồi quy trên cũng giải thích rằng các sản phẩm categoryClothing,categoryCosmetics, categorySouvenir, categoryToys sẽ ảnh hưởng lên phân khúc khách hàng là Nữ.
LS0tDQp0aXRsZTogIkJhaXRhcGJ1b2kxIg0KYXV0aG9yOiAiTmd1eWVuQmluaFBodW9uZ1V5ZW4iDQpkYXRlOiAiMjAyNC0wNi0wMiINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IFRSVUUNCiAgICB0b2NfZmxvYXQ6IFRSVUUNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogIHBkZl9kb2N1bWVudDoNCiAgICBleHRyYV9kZXBlbmRlbmNpZXM6DQogICAgICB2aWV0bmFtOiB1dGY4DQogICAgdG9jOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCmdlb21ldHJ5Og0KICAgICAgLSBpbm5lcj0zY20NCiAgICAgIC0gb3V0ZXI9NGNtDQogICAgICAtIHRvcD0zY20NCiAgICAgIC0gYm90dG9tPTRjbQ0KICAgICAgLSBoZWFkc2VwPTIycHQNCiAgICAgIC0gaGVhZGhlaWdodD0xMXB0DQogICAgICAtIGZvb3Rza2lwPTMzcHQNCiAgICAgIC0gaWdub3JlaGVhZA0KICAgICAgLSBpZ25vcmVmb290DQogICAgICAtIGhlaWdodHJvdW5kZWQNCmVkaXRvcl9vcHRpb25zOiANCiAgbWFya2Rvd246IA0KICAgIHdyYXA6IDcyDQotLS0NCg0KDQojIyAxLkdp4bubaSB0aGnhu4d1IHbhu4EgYuG7mSBk4buvIGxp4buHdSB2w6AgxJHhurd0IHbhuqVuIMSR4buBDQojIyMgMS4xLiBNw7QgdOG6oyBi4buZIGThu68gbGnhu4d1DQoNCkLhu5kgZOG7ryBsaeG7h3UgY2jhu6lhIHRow7RuZyB0aW4gbXVhIHPhuq9tIGPhu6dhIDEwIGPhu61hIGjDoG5nIOG7nyBJc3RhbmJ1bCB0cm9uZyBnaWFpIMSRb+G6oW4gdOG7qyAyMDIxIMSR4bq/biAyMDIzLCDEkcaw4bujYyB04buVbmcgaOG7o3AgZOG7sWEgdHLDqm4gcGjDom4ga2jDumMgxJHhu5kgdHXhu5VpIHbDoCBnaeG7m2kgdMOtbmggxJHhu4MgeGVtIGjDoG5oIHZpIG11YSBz4bqvbSBj4bunYSBraMOhY2ggaMOgbmcuIFRow7RuZyB0aW4gdGh1IHRo4bqtcCDEkcaw4bujYyBn4buTbSAxMCBiaeG6v246DQoNCi0gaW52b2ljZV9ubzogSUQgY+G7p2EgxJHGoW4gaMOgbmcNCg0KLSBjdXN0b21lcl9pZDogSUQgY+G7p2Ega2jDoWNoIGjDoG5nDQoNCi0gR2VuZGVyOiBnaeG7m2kgdMOtbmgga2jDoWNoIGjDoG5nDQoNCi0gQWdlOiDEkOG7mSB0deG7lWkNCg0KLSBDYXRlZ29yeTogUGjDom4gbG/huqFpIHPhuqNuIHBo4bqpbSANCg0KLSBRdWFudGl0eTogU+G7kSBsxrDhu6NuZyBow6BuZyBtdWENCg0KLSBQcmljZTogR2nDoSBow6BuZyBiw6FuDQoNCi0gUGF5bWVudF9tZXRob2Q6IEjDrG5oIHRo4bupYyB0aGFuaCB0b8Ohbg0KDQotIGludm9pY2VfZGF0ZTogTmfDoHkgbXVhIGjDoG5nDQoNCi0gc2hvcHBpbmdfbWFsbDogVMOqbiBj4butYSBow6BuZw0KDQotIGluZHVzdHJ5OiBuZ8OgbmggaMOgbmcgKCB0acOqdSBkw7luZyBuaGFuaCBoYXkgdGjhu6ljIMSDbiBuaGFuaCkNCg0KIyMjIDEuMi4gxJDhurd0IHbhuqVuIMSR4buBDQoNCioqxq/hu5tjIGzGsOG7o25nIDIgYmnhur9uKioNCg0KLSBHaeG7m2kgdMOtbmggY8OzbMOgbSDhuqNuaCBoxrDhu59uZyDEkeG6v24gdmnhu4djIGtow6FjaCBow6BuZyBs4buxYSBjaOG7jW4gbXVhIG3hu5l0IGxv4bqhaSBz4bqjbiBwaOG6qW0gbsOgbyDEkcOzIGtow7RuZyAoYmnhur9uIEdlbmRlciBjw7MgbMOgbSDhuqNuaCBoxrDhu59uZyDEkeG6v24gYmnhur9uIENhdGVnb3J5IGtow7RuZz8pDQoNCi0gR2nhu5tpIHTDrW5oIGPDsyBsw6BtIOG6o25oIGjGsOG7n25nIMSR4bq/biB2aeG7h2Mga2jDoWNoIGjDoG5nIGzhu7FhIGNo4buNbiBtdWEgc+G6o24gcGjhuqltIHRodeG7mWMgbmfDoG5oIGjDoG5nIG7DoG8gxJHDsyBraMO0bmc/IChiaeG6v24gR2VuZGVyIGPDsyBsw6BtIOG6o25oIGjGsOG7n25nIMSR4bq/biBiaeG6v24gaW5kdXN0cnkga2jDtG5nPykNCg0KLSBHaeG7m2kgdMOtbmggY8OzIGzDoG0g4bqjbmggaMaw4bufbmcgxJHhur9uIHZp4buHYyBraMOhY2ggaMOgbmcgbOG7sWEgY2jhu41uIHBoxrDGoW5nIHRo4bupYyB0aGFuaCB0b8OhbiBraMO0bmc/DQooYmnhur9uIEdlbmRlciBjw7MgbMOgbSDhuqNuaCBoxrDhu59uZyDEkeG6v24gYmnhur9uIFBheW1lbnRfbWV0aG9kIGtow7RuZz8pDQoNCi0gxJDhu5kgdHXhu5VpIGPDsyBsw6BtIOG6o25oIGjGsOG7n25nIMSR4bq/biB2aeG7h2Mga2jDoWNoIGjDoG5nIGzhu7FhIGNo4buNbiBtdWEgbeG7mXQgc+G6o24gcGjhuqltIHRodeG7mWMgbmfDoG5oIGjDoG5nIG7DoG8gxJHDsyBraMO0bmc/KGJp4bq/biBhZ2UgY8OzIGzDoG0g4bqjbmggaMaw4bufbmcgxJHhur9uIGJp4bq/biBpbmR1c3RyeSBraMO0bmc/KQ0KDQotIMSQ4buZIHR14buVaSBjw7Mg4bqjbmggaMaw4bufbmcgxJHhur9uIHZp4buHYyBs4buxYSBjaOG7jW4gcGjGsMahbmcgdGjhu6ljIHRoYW5oIHRvw6FuIGPhu6dhIGtow6FjaCBow6BuZyBraMO0bmcgKGJp4bq/biBnZW5kZXIgY8OzIGzDoG0g4bqjbmggaMaw4bufbmcgxJHhur9uIGJp4bq/biBwYXltZW50X21ldGhvZCBraMO0bmcpDQoNCioqxq/hu5tjIGzGsOG7o25nIDMgYmnhur9uKioNCg0KLSDEkOG7mSB0deG7lWkgY8OzIGzDoG0g4bqjbmggaMaw4bufbmcgxJHhur9uIHZp4buHYyBraMOhY2ggaMOgbmcgbOG7sWEgY2jhu41uIHBoxrDGoW5nIHRo4bupYyB0aGFuaCB0b8OhbiB2w6AgbOG7sWEgY2jhu41uIG5nw6BuaCBow6BuZyBtdWEgc+G6r20ga2jDtG5nIChiaeG6v24gYWdlIGPDsyBsw6BtIOG6o25oIGjGsOG7n25nIMSR4bq/biBiaeG6v24gcGF5bWVudF9tZXRob2QgdsOgIGluZHVzdHJ5IGtow7RuZz8pDQoNCi0gR2nhu5tpIHTDrW5oIGPDsyBsw6BtIOG6o25oIGjGsOG7n25nIMSR4bq/biB2aeG7h2Mga2jDoWNoIGjDoG5nIGzhu7FhIGNo4buNbiBwaMawxqFuZyB0aOG7qWMgdGhhbmggdG/DoW4gdsOgIGzhu7FhIGNo4buNbiBuZ8OgbmggaMOgbmcgbXVhIHPhuq9tIGtow7RuZyAoYmnhur9uIGdlbmRlciBjw7MgbMOgbSDhuqNuaCBoxrDhu59uZyDEkeG6v24gYmnhur9ucGF5bWVudF9tZXRob2QgdsOgIGluZHVzdHJ5IGtow7RuZz8pDQoNCiMjIDMuIEzhuq1wIGLhuqNuZyB04bqnbiBz4buRLCB04bqnbiBzdeG6pXQgxJHhu4MgbcO0IHThuqMgDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KDQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQoNCmxpYnJhcnkodGlkeXZlcnNlKQ0KDQpsaWJyYXJ5KERlc2NUb29scykNCmxpYnJhcnkoZXBpdG9vbHMpDQpkZiA8LSByZWFkLmNzdigiRDovUGjDom4gdMOtY2ggZOG7ryBsaeG7h3UgxJHhu4tuaCB0w61uaC9jdXN0b21lcl9zaG9wcGluZ19kYXRhLmNzdiIpDQpkZiRpbmR1c3RyeSA8LSBpZmVsc2UoZGYkY2F0ZWdvcnkgPT0gIkZvb2QgJiBCZXZlcmFnZSIsICJGJkIiLCAiRk1DRyIpDQpkZiRhZ2UgPC0gY3V0KGRmJGFnZSwgYnJlYWtzID0gYygwLDUwLDEwMCksIGxhYmVscyA9IGMoIllvdW5nIiwiT2xkIikpDQpkZg0KDQpgYGANCg0KIyMjIDMuMS5C4bqjbmcgdOG6p24gc+G7kSBj4bunYSBnaeG7m2kgdMOtbmggdsOgIGxv4bqhaSBz4bqjbiBwaOG6qW0NCg0KLSBC4bqjbmcgdOG6p24gc+G7kSBj4bunYSBnaeG7m2kgdMOtbmggdsOgIGxv4bqhaSBz4bqjbiBwaOG6o20gxJHhu4MgeGVtIGPDsyBz4buxIGNow6puaCBs4buHY2ggZ2nhu69hIG5hbSB2w6AgbuG7ryBraGkgY2jhu41uIG3hu5l0IGxv4bqhaSBz4bqjbiBwaOG6qW0gbsOgbyDEkcOzIGtow7RuZy4NCg0KYGBge3J9DQoNCmZyZXF1ZW5jeSA8LSB0YWJsZShkZiRnZW5kZXIsIGRmJGNhdGVnb3J5KQ0KDQpmcmVxdWVuY3kNCmFkZG1hcmdpbnMoZnJlcXVlbmN5KQ0KYGBgDQpOaMOsbiBzxqEgcXVhIHRow6wgdGEgY8OzIHRo4buDIHRo4bqleSDhu58gdOG6pXQgY+G6oyBwaMOibiBsb+G6oWkgc+G6o24gcGjhuqltLCBz4buRIGzGsOG7o25nIG11YSBow6BuZyBj4bunYSBu4buvIG5oaeG7gXUgaMahbiBz4buRIGzGsOG7o25nIG11YSBow6BuZyBj4bunYSBuYW0gDQooKkJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gc+G7sSBjaMOqbmggbOG7h2NoIGdp4buvYSBuYW0gdsOgIG7hu68gdsOgIGPDoWMgbG/huqFpIHPhuqNuIHBo4bqpbSB0aOG7gyBoaeG7h24g4bufIGjDrG5oIDQuMSopDQoNCioqQuG6o25nIHThuqduIHN14bqldCBj4bunYSBz4bqjbiBwaOG6qW0qKg0KDQotIEzhuq1wIGLhuqNuZyB04bqnbiBzdeG6pXQgxJHhu4MgeGVtIG3hurd0IGjDoG5nIG7DoG8gxJHGsOG7o2MgYsOhbiBjaOG6oXkgbmjhuqV0IHbDoCBt4bq3dCBow6BuZyBuw6BvIMOtdCBiw6FuIGNo4bqheSBuaOG6pXQNCg0KYGBge3J9DQpmcmVxdWVucHJvZHVjdCA8LSB0YWJsZShkZiRjYXRlZ29yeSkNCnBlcmNlbnRmcmVxdWVuY3kgPC0gcHJvcC50YWJsZShmcmVxdWVucHJvZHVjdCkNCnBlcmNlbnRmcmVxdWVuY3kNCm1pbihwZXJjZW50ZnJlcXVlbmN5KQ0KbWF4KHBlcmNlbnRmcmVxdWVuY3kpDQoNCmBgYA0KLSBT4bqjbiBwaOG6qW0gY8OzIHPhu5EgYsOhbiByYSDDrXQgbmjhuqV0IGPDsyB04bqnbiBz4buRIHh14bqldCBoaeG7h24gbMOgIDAuMDUwMDgxOTQNCi0gU+G6o24gcGjhuqltIGPDsyBz4buRIGLDoW4gcmEgbmhp4buBdSBuaOG6pXQgY8OzIHThuqduIHPhu5EgeHXhuqV0IGhp4buHbiBsw6AgMC4zNDY3NTI5DQoNCiMjIyAzLjIuQuG6o25nIHThuqduIHPhu5EgY+G7p2EgZ2nhu5tpIHTDrW5oIHbDoCBuZ8OgbmggaMOgbmcNCg0KLSBC4bqjbmcgdOG6p24gc+G7kSBj4bunYSBnaeG7m2kgdMOtbmggdsOgIG5nw6BuaCBow6BuZyDEkeG7gyB4ZW0gY8OzIHPhu7EgY2jDqm5oIGzhu4djaCBnaeG7r2EgbmFtIHbDoCBu4buvIGtoaSBjaOG7jW4gbXVhIG3hu5l0IGxv4bqhaSBow6BuZyBraMO0bmcNCmBgYHtyfQ0KZnJlcXVlbmN5aW5kdXN0cnkgPC0gdGFibGUoZGYkZ2VuZGVyLCBkZiRpbmR1c3RyeSkNCg0KZnJlcXVlbmN5aW5kdXN0cnkNCmFkZG1hcmdpbnMoZnJlcXVlbmN5aW5kdXN0cnkpDQpgYGANCg0KLSBL4bq/dCBxdeG6oyBjaG8gdGEgdGjhuqV5IOG7nyBj4bqjIGhhaSBuZ8OgbmggaMOgbmcgRiRCIHbDoCBGTUNHLCB04bu3IGzhu4cgbXVhIGjDoG5nIGPhu6dhIG7hu68gbOG7m24gaMahbiB04bu3IGzhu4cgbXVhIGjDoG5nIGPhu6dhIG5hbSBy4bqldCBuaGnhu4F1LiAoKsSQ4buTIHRo4buLIHRo4buDIGhp4buHbiBz4buxIGNow6puaCBs4buHY2ggbsOgeSBu4bqxbSDhu58gaMOsbmggMy4yKiApDQoNCi0gVHJvbmcgbmfDoG5oIGjDoG5nIEYmQiwgdOG7tyBs4buHIGtow6FjaCBow6BuZyBsw6AgbmFtIHNvIHbhu5tpIHThu7cgbOG7hyBraMOhY2ggaMOgbmcgbMOgIG7hu68gbMOgOg0KJFxmcmFjezU5NzJ9ezg4MDR9JC4gQ2hvIHRo4bqleSB04bu3IGzhu4cgbuG7ryBtdWEgaMOgbmcg4bufIG5nw6BuaCBow6BuZyBuw6B5IGNoaeG6v20gZ+G6p24gNjglIHNvIHbhu5tpIHThu5VuZyBraMOhY2ggaMOgbmcNCg0KLSBUcm9uZyBuZ8OgbmggaMOgbmcgRk1DRywgdOG7tyBs4buHIGtow6FjaCBow6BuZyBsw6AgbmFtIHNvIHbhu5tpIHThu7cgbOG7hyBraMOhY2ggaMOgbmcgbMOgIG7hu68gbMOgOiAkXGZyYWN7MzQwMDN9ezUwNjc4fSQuIENobyB0aOG6pXkgdOG7tyBs4buHIG7hu68gbXVhIGjDoG5nIOG7nyBuZ8OgbmggaMOgbmcgbsOgeSBjaGnhur9tIGjGoW4gNjclIHNvIHbhu5tpIHThu5VuZyBraMOhY2ggaMOgbmcNCg0KIyMjIDMuMy5C4bqjbmcgdOG6p24gc+G7kSBj4bunYSDEkeG7mSB0deG7lWkgdsOgIG5nw6BuaCBow6BuZyB0acOqdSBkw7luZw0KDQotIELhuqNuZyB04bqnbiBz4buRIGPhu6dhIMSR4buZIHR14buVaSB2w6AgbmfDoG5oIGjDoG5nIHRpw6p1IGTDuW5nIMSR4buDIHhlbSBy4bqxbmcgZ2nhu69hIG5nxrDhu51pIGdpw6AgdsOgIG5nxrDhu51pIHRy4bq7IGPDsyBz4buxIGNo4buNbiBs4buxYSBraMOhYyBuaGF1IHRyb25nIGPDoWMgbmfDoG5oIGjDoG5nIHRpw6p1IGTDuW5nIGtow6FjIG5oYXUgaGF5IGtow7RuZw0KDQpgYGB7cn0NCmZyZXF1ZW5jeWFnZSA8LSB0YWJsZShkZiRhZ2UsIGRmJGluZHVzdHJ5KQ0KDQpmcmVxdWVuY3lhZ2UNCmFkZG1hcmdpbnMoZnJlcXVlbmN5YWdlKQ0KYGBgDQotIEvhur90IHF14bqjIGNobyB0YSB0aOG6pXkg4bufIGPhuqMgaGFpIG5nw6BuaCBow6BuZyBGJEIgdsOgIEZNQ0csIHThu7cgbOG7hyBtdWEgaMOgbmcgY+G7p2EgbmfGsOG7nWkgdHLhu4MgbOG7m24gaMahbiB04bu3IGzhu4cgbXVhIGjDoG5nIGPhu6dhIG5nxrDhu51pIGdpw6AgcuG6pXQgbmhp4buBdS4gKCrEkOG7kyB0aOG7iyB0aOG7gyBoaeG7h24gc+G7sSBjaMOqbmggbOG7h2NoIG7DoHkgbuG6sW0g4bufIGjDrG5oIDMuMyogKQ0KDQotIFRyb25nIG5nw6BuaCBow6BuZyBGJkIsIHThu7cgbOG7hyBraMOhY2ggaMOgbmcgbMOgIG5nxrDhu51pIHRy4bq7IHNvIHbhu5tpIHThu7cgbOG7hyBraMOhY2ggaMOgbmcgbMOgIG5nxrDhu51pIGdpw6AgbMOgOg0KJFxmcmFjezk0MzB9ezUzNDZ9JC4gQ2hvIHRo4bqleSB04bu3IGzhu4cgbmfGsOG7nWkgdHLhursgbXVhIGjDoG5nIOG7nyBuZ8OgbmggaMOgbmcgbsOgeSBjaGnhur9tIGfhuqduIDY0JSBzbyB24bubaSB04buVbmcga2jDoWNoIGjDoG5nDQoNCi0gVHJvbmcgbmfDoG5oIGjDoG5nIEZNQ0csIHThu7cgbOG7hyBraMOhY2ggaMOgbmcgbMOgIG5nxrDhu51pIHRy4bq7IHNvIHbhu5tpIHThu7cgbOG7hyBraMOhY2ggaMOgbmcgbMOgIG5nxrDhu51pIGdpw6AgbMOgOiAkXGZyYWN7NTM5MjZ9ezMwNzU1fSQuIENobyB0aOG6pXkgdOG7tyBs4buHIG5nxrDhu51pIHRy4bq7IG11YSBow6BuZyDhu58gbmfDoG5oIGjDoG5nIG7DoHkgY2hp4bq/bSBn4bqnbiA2NCUgc28gduG7m2kgdOG7lW5nIGtow6FjaCBow6BuZw0KDQoNCiMjIyAzLjQuQuG6o25nIHThuqduIHPhu5EgY+G7p2EgxJHhu5kgdHXhu5VpIHbDoCBwaMawxqFuZyB0aOG7qWMgdGhhbmggdG/DoW4NCg0KLSBC4bqjbmcgdOG6p24gc+G7kSBj4bunYSDEkeG7mSB0deG7lWkgxJHhu4MgeGVtIMSR4buZIHR14buVaSDhuqNuaCBoxrDhu59uZyBuaMawIHRo4bq/IG7DoG8gxJHhur9uIHZp4buHYyBs4buxYSBjaOG7jW4gcGjGsMahbmcgdGjhu6ljIHRoYW5oIHRvw6FuDQoNCmBgYHtyfQ0KZnJlcXVlbmN5cGF5bWVudCA8LSB0YWJsZShkZiRhZ2UsIGRmJHBheW1lbnRfbWV0aG9kKQ0KDQpmcmVxdWVuY3lwYXltZW50DQphZGRtYXJnaW5zKGZyZXF1ZW5jeXBheW1lbnQpDQoNCmBgYA0KLSBL4bq/dCBxdeG6oyBjaG8gdGEgdGjhuqV5IOG7nyBj4bqjIGhhaSBwaMawxqFuZyB0aOG7qWMgdGhhbmggdG/DoW4sIHThu7cgbOG7hyBtdWEgaMOgbmcgY+G7p2EgbmfGsOG7nWkgdHLhu4MgbOG7m24gaMahbiB04bu3IGzhu4cgbXVhIGjDoG5nIGPhu6dhIG5nxrDhu51pIGdpw6AgcuG6pXQgbmhp4buBdS4gKCrEkOG7kyB0aOG7iyB0aOG7gyBoaeG7h24gc+G7sSBjaMOqbmggbOG7h2NoIG7DoHkgbuG6sW0g4bufIGjDrG5oIDMuNCogKQ0KDQotIFRyb25nIHBoxrDGoW5nIHRo4bupYyB0cuG6oyBi4bqxbmcgdGnhu4FuIG3hurd0LCB04bu3IGzhu4cga2jDoWNoIGjDoG5nIGzDoCBuZ8aw4budaSB0cuG6uyBzbyB24bubaSB04bu3IGzhu4cga2jDoWNoIGjDoG5nIGzDoCBuZ8aw4budaSBnacOgIGzDoDoNCiRcZnJhY3syODI1OX17MTYxODh9JC4gQ2hvIHRo4bqleSB04bu3IGzhu4cgbmfGsOG7nWkgdHLhursgbXVhIGjDoG5nIOG7nyBuZ8OgbmggaMOgbmcgbsOgeSBn4bqlcCAxLDc0IGzhuqduIHNvIHbhu5tpIG5nxrDhu51pIGdpw6ANCg0KLSBUcm9uZyBuZ8OgbmggaMOgbmcgRk1DRywgdOG7tyBs4buHIGtow6FjaCBow6BuZyBsw6AgbmfGsOG7nWkgdHLhursgc28gduG7m2kgdOG7tyBs4buHIGtow6FjaCBow6BuZyBsw6AgbmfGsOG7nWkgZ2nDoCBsw6A6ICRcZnJhY3szNTA5N317IDE5OTEzfSQuIENobyB0aOG6pXkgdOG7tyBs4buHIG5nxrDhu51pIHRy4bq7IG11YSBow6BuZyDhu58gbmfDoG5oIGjDoG5nIG7DoHkgZ+G6pXAgMSw3NiBs4bqnbiBzbyB24bubaSBuZ8aw4budaSBnacOgDQoNCiMjIyAzLjUuQuG6o25nIHThuqduIHPhu5EgY+G7p2EgxJHhu5kgdHXhu5VpLCBuZ8OgbmggaMOgbmcgdsOgIHBoxrDGoW5nIHRo4bupYyB0aGFuaCB0b8Ohbg0KYGBge3J9DQpmcmVxdWVuY3kzYSA8LSB0YWJsZShkZiRhZ2UsIGRmJGluZHVzdHJ5LGRmJHBheW1lbnRfbWV0aG9kKQ0KDQpmcmVxdWVuY3kzYQ0KYWRkbWFyZ2lucyhmcmVxdWVuY3kzYSkNCg0KYGBgDQotIENobyBkw7kgcGjDom4gbG/huqFpIHThuqduIHPhu5EgbOG7sWEgY2jhu41uIG5nw6BuaCBow6BuZyBz4bqjbiBwaOG6qW0g4bupbmcgduG7m2kgcGjDom4ga2jDumMgxJHhu5kgdHXhu5VpIHRoZW8gMiBsb+G6oWkgaMOsbmggdGjhu6ljIHRoYW5oIHRvw6FuIHRow6wgdOG7tyBs4buHIGzhu7FhIGNo4buNbiBuZ8OgbmcgaMOgbmcgc+G7rSBk4bulbmcgZ2nhu69hIG5hbSB2w6AgbuG7ryBjxaluZyBraMO0bmcgdGhheSDEkeG7lWkuDQoNCiMjIDQuIEJp4buDdSDEkeG7kyANCiMjIyA0LjEuIEdlbmRlciBhbmQgQ2F0ZWdvcnkNCg0KKipCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcgbXVhIHThu6tuZyBsb+G6oWkgc+G6o24gcGjhuqltIMSRxrDhu6NjIGNoaWEgdGhlbyAyIGdp4bubaSB0w61uaCoqDQoNCmBgYHtyfQ0KDQpsaWJyYXJ5KGdncGxvdDIpDQpnZ3Bsb3QoZGYsIGFlcyhnZW5kZXIsIGZpbGwgPSBjYXRlZ29yeSkpICsgZ2VvbV9iYXIocG9zaXRpb24gPSAnZG9kZ2UnKSArICBsYWJzKHggPSAiR2VuZGVyIiwgeSA9ICJDb3VudCBvZiBDYXRlZ29yeSIpDQoNCmBgYA0KDQoNCk5ow6xuIHbDoG8gxJHhu5MgdGjhu4sgY8WpbmcgZOG7hSBkw6BuZyBuaMOsbiB0aOG6pXksIHPhu5EgbMaw4bujbmcgbXVhIGjDoG5nIGPhu6dhIE7hu68g4bufIHThuqV0IGPhuqMgcGjDom4gbG/huqFpIHPhuqNuIHBo4bqpbSDEkeG7gXUgbOG7m24gaMahbiBuYW0sIHR1eSBuaGnDqm4gxJHhu4MgxJHDoW5oIGdpw6EgeGVtIHPhu7EgY2jDqm5oIGzhu4djaCB04burIGJp4buDdSDEkeG7kyB24bq9IHJhIGPDsyDEkcOhbmcgdGluIGPhuq15IGtow7RuZyB0aMOsIHRhIGTDuW5nIEh5cG90aGV0aWNzIHRlc3QgxrDhu5tjIGzGsOG7o25nIHThu7cgbOG7hyDEkeG7gyDEkcOhbmggZ2nDoSB4ZW0gY8OzIHPhu7Ega2jDoWMgbmhhdSB24buBIGPDoWNoIGzhu7FhIGNo4buNbiBz4bqjbiBwaOG6qW0gY+G7p2EgMiBnaeG7m2kgdMOtbmgga2jDtG5nLg0KDQoqKkJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyBtdWEgdOG7q25nIHPhuqNuIHBo4bqpbSBj4bunYSBraMOhY2ggaMOgbmcqKg0KDQpgYGB7cn0NCmdncGxvdChkZiwgYWVzKGNhdGVnb3J5KSkgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICdkb2RnZScpICsgbGFicyh4PSAiQ2F0ZWdvcnkiLCB5PSAiQ291bnQgb2YgaW52b2ljZSIpDQoNCg0KYGBgDQoNCi0gQ2xvdGhpbmcgbMOgIHPhuqNuIHBo4bqpbSDEkcaw4bujYyB0acOqdSB0aOG7pSBuaGnhu4F1IG5o4bqldC4gTmjDrG4gdsOgbyDEkeG7kyB0aOG7iyB0YSBraMOzIHBow6JuIGJp4buHdCDEkcaw4bujYyBCb29rcywgU291dmVuaXIgaGF5IFRlY2hub2xvZ3kgbMOgIHPhuqNuIHBo4bqpbSB0acOqdSB0aOG7pSDDrXQgbmjhuqV0LiBQaOG6p24gNS4xIHPhur0gZMO5bmcgSHlwb3RoZXRpY3MgdGVzdCDEkeG7gyB4ZW0gdGjhu60gc+G6o24gcGjhuqltIG7DoG8gY8OzIHThuqduIHN14bqldCB4deG6pXQgaGnhu4duIMOtdCBuaOG6pXQuDQoNCiMjIyA0LjIuIEdlbmRlciBhbmQgSW5kdXN0cnkNCg0KKipCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcgbXVhIHThu6tuZyBsb+G6oWkgbmfDoG5oIGjDoG5nIMSRxrDhu6NjIGNoaWEgdGhlbyAyIGdp4bubaSB0w61uaCoqDQoNCmBgYHtyfQ0KDQpnZ3Bsb3QoZGYsIGFlcyhnZW5kZXIsIGZpbGwgPSBpbmR1c3RyeSkpICsgZ2VvbV9iYXIocG9zaXRpb24gPSAnZG9kZ2UnKSArICBsYWJzKHggPSAiR2VuZGVyIiwgeSA9ICJDb3VudCBvZiBpbmR1c3RyeSIpDQoNCmBgYA0KDQoNCiMjIyA0LjMuIEFnZSBhbmQgSW5kdXN0cnkNCg0KKipCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcgbXVhIHThu6tuZyBsb+G6oWkgbmfDoG5oIGjDoG5nIMSRxrDhu6NjIGNoaWEgdGhlbyAyIMSR4buZIHR14buVaSoqDQoNCmBgYHtyfQ0KDQpnZ3Bsb3QoZGYsIGFlcyhhZ2UsIGZpbGwgPSBpbmR1c3RyeSkpICsgZ2VvbV9iYXIocG9zaXRpb24gPSAnZG9kZ2UnKSArICBsYWJzKHggPSAiQWdlIiwgeSA9ICJDb3VudCBvZiBpbmR1c3RyeSIpDQoNCmBgYA0KDQojIyMgNC40LiBBZ2UgYW5kIFBheW1lbnRfbWV0aG9kDQoNCioqQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBz4buRIGtow6FjaCBow6BuZyBs4buxYSBjaOG7jW4gdOG7q25nIHBoxrDGoW5nIHRo4bupYyB0aGFuaCB0b8OhbiDEkcaw4bujYyBjaGlhIHRoZW8gMiDEkeG7mSB0deG7lWkgKioNCg0KYGBge3J9DQoNCmdncGxvdChkZiwgYWVzKGFnZSwgZmlsbCA9IHBheW1lbnRfbWV0aG9kKSkgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICdkb2RnZScpICsgIGxhYnMoeCA9ICJBZ2UiLCB5ID0gIkNvdW50IG9mIGludm9pY2UiKQ0KDQpgYGANCg0KDQojIyA1Lsav4bubYyBsxrDhu6NuZyB04bu3IGzhu4cgDQoNCioqxq/hu5tjIGzGsOG7o25nIHThu7cgbOG7hyBj4bunYSB04burbmcgc+G6o24gcGjhuqltICoqDQoNCk5ow6xuIHbDoG8gxJHhu5MgdGjhu4sgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcgbXVhIGjDoG5nIGPhu6dhIHThu6tuZyBz4bqjbiBwaOG6qW0sIHRhIHRo4bqleSBCb29rcyBsw6Agc+G6o24gcGjhuqltIMOtdCBiw6FuIGNo4bqheSBuaOG6pXQuIFRhIMSR4bq3dCByYSBjw6J1IGjhu49pIGzDoCBjw7MgY2jhuq9jIGNo4bqvbiBCb29rcyBsw6AgbG/huqFpIHPhuqNuIHBo4bqpbSBjw7Mgc+G7kSBsxrDhu6NuZyBtdWEgaMOgbmcgw610IG5o4bqldCBraMO0bmc/IMav4bubYyBsxrDhu6NuZyB04bu3IGzhu4cgbmfGsOG7nWkgbXVhIHPhuqNuIHBo4bqpbSBsw6AgQm9va3MgxJHhu5NuZyB0aOG7nWkga2nhu4NtIMSR4buLbmggeGVtIHThu7cgbOG7hyAoJSkgbmfGsOG7nWkgbXVhIEJvb2tzIGPDsyBwaOG6o2kgbMOgIDUlIGtow7RuZyAoNSUgbMOgIHThuqduIHPDtCBj4bunYSBz4bqjbiBwaOG6qW0gxJHGsOG7o2MgYsOhbiByYSDDrXQgbmjhuqV0KT8NCkNow7puZyB0YSB0aeG6v24gaMOgbmgga2nhu4NtIMSR4buLbmggZ2nhuqMgdGh1eeG6v3QgJEhfMD0wLDA1JA0KDQpgYGB7cn0NCmJvb2tzIDwtIGRmW2RmJGNhdGVnb3J5ID09ICJCb29rcyIsXQ0KcHJvcC50ZXN0KGxlbmd0aChib29rcyRjYXRlZ29yeSksIGxlbmd0aChib29rcyRjYXRlZ29yeSksIHAgPSAwLjA1KQ0KYGBgDQoNCkvhur90IHF14bqjIGNobyB0YSB0aOG6pXkgZ2nDoSB0cuG7iyBQLXZhbHVlIDwgbeG7qWMgw70gbmdoxKlhIDAuMDUuIFRhIGLDoWMgYuG7jyBIMCwgdOG7qWMgbMOgIHThu7cgbOG7hyBtdWEgc+G6o24gcGjhuqltIEJvb2tzIGPhu6dhIGtow6FjaCBow6BuZyBraMO0bmcgcGjhuqNpIGzDoCAwLjA1JS4NCg0KLSBOaMOsbiB2w6BvIMSR4buTIHRo4buLLCB0YSB0aOG6pXkgQ2xvdGhpbmcgbMOgIHPhuqNuIHBo4bqpbSBiw6FuIGNo4bqheSBuaOG6pXQuIFRhIMSR4bq3dCByYSBjw6J1IGjhu49pIGzDoCBjw7MgY2jhuq9jIGNo4bqvbiBDbG90aGluZyBsw6AgbG/huqFpIHPhuqNuIHBo4bqpbSBjw7Mgc+G7kSBsxrDhu6NuZyBtdWEgaMOgbmcgbmhp4buBdSBuaOG6pXQga2jDtG5nPyDGr+G7m2MgbMaw4bujbmcgdOG7tyBs4buHIG5nxrDhu51pIG11YSBz4bqjbiBwaOG6qW0gbMOgIENsb3RoaW5ncyDEkeG7k25nIHRo4budaSBraeG7g20gxJHhu4tuaCB4ZW0gdOG7tyBs4buHICglKSBuZ8aw4budaSBtdWEgQ2xvdGhpbmcgY8OzIHBo4bqjaSBsw6AgMzUlIGtow7RuZyAoMzUlIGzDoCB04bqlbiBz4buRIGPhu6dhIHPhuqNuIHBo4bqpbSDEkcaw4bujYyBiw6FuIGNo4bqheSBuaOG6pXQpPw0KQ2jDum5nIHRhIHRp4bq/biBow6BuaCBraeG7g20gxJHhu4tuaCBnaeG6oyB0aHV54bq/dCAkSF8wPTAuMzUkDQoNCmBgYHtyfQ0KQ2xvdGhpbmdzIDwtIGRmW2RmJGNhdGVnb3J5ID09ICJDbG90aGluZyIsXQ0KcHJvcC50ZXN0KGxlbmd0aChDbG90aGluZ3MkY2F0ZWdvcnkpLCBsZW5ndGgoQ2xvdGhpbmdzJGNhdGVnb3J5KSwgcCA9IDAuMzUpDQpgYGANCkdpw6EgdHLhu4sgUC12YWx1ZSB0cuG6oyB24buBIHLhuqV0IGLDqSwgbmjhu48gaMahbiBt4bupYyDDvSBuZ2jEqWEgMC4wNSBuw6puIHRhIGLDoWMgYuG7jyBIMCwgduG6rXkgdOG7tyBs4buHIG11YSBz4bqjbiBwaOG6qW0gQ2xvdGhpbmdzIGtow7RuZyBwaOG6o2kgbMOgIDM1JS4NCg0KKirGr+G7m2MgbMaw4bujbmcgY2jDqm5oIGzhu4djaCB04bu3IGzhu4cgY+G7p2EgdOG7q25nIHPhuqNuIHBo4bqpbSDEkeG7kWkgduG7m2kgdOG7q25nIHBow6JuIGtow7pjIGtow6FjaCBow6BuZyoqDQoNCioxLiDGr+G7m2MgbMaw4bujbmcgc+G7sSBjaMOqbmggbOG7h2NoIHbhu4EgdOG7tyBs4buHIG11YSBCb29rcyBnaeG7r2EgbmFtIHbDoCBu4buvLioNCg0KxJDhurd0IGdp4bqjIHRodXnhur90ICRIXzAkOiBU4bu3IGzhu4cgbXVhIEJvb2tzIGPhu6dhIG5hbSB2w6AgbuG7ryBsw6AgYuG6sW5nIG5oYXUNCg0KYGBge3J9DQpNYWxlIDwtIGRmW2RmJGdlbmRlciA9PSAiTWFsZSIsXQ0KRmVtYWxlIDwtIGRmW2RmJGdlbmRlciA9PSAiRmVtYWxlIixdDQoNCk1hbGVyYXRlIDwtIE1hbGVbTWFsZSRjYXRlZ29yeSA9PSAiQm9va3MiLF0NCkZlbWFsZXJhdGUgPC0gRmVtYWxlW0ZlbWFsZSRjYXRlZ29yeSA9PSAiQm9va3MiLF0NCg0KZ2VuZGVyYXRlIDwtIGMobnJvdyhNYWxlKSwgbnJvdyhNYWxlKSkNCmNhdGVnb3J5cmF0ZSA8LSBjKG5yb3coTWFsZXJhdGUpLCBucm93KEZlbWFsZXJhdGUpKQ0KDQpwcm9wLnRlc3QoY2F0ZWdvcnlyYXRlLGdlbmRlcmF0ZSkNCg0KDQpgYGANCkvhur90IHF14bqjIFBfdmFsdWUgcuG6pXQgbmjhu48sIHRhIGLDoWMgYuG7jyBIMC4gQ2hvIHRo4bqleSBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgZ2nhu69hIHThu7cgbOG7hyBuYW0gbXVhIEJvb2tzIHbDoCBu4buvIG11YSBCb29rcy4gTmdvw6BpIHJhLCBraG/huqNuZyB0aW4gY+G6rXkgY2hvIHThu7cgbOG7hyBtdWEgYm9va3MgY+G7p2EgaGFpIGdp4bubaSB0w61uaCBuw6B5IGzDoCAoLTAuMDI0MTYwNzIsLTAuMDE3NDE1MjcpLCBraMO0bmcgYmFvIGfhu5NtIHPhu5EgMCwgY2hvIHRo4bqleSBnaeG7r2EgMiB04bu3IGzhu4cgbsOgeSBjw7MgbeG7mXQgc+G7sSBjaMOqbmggbOG7h2NoIMSRw6FuZyBr4buDLiBU4bu3IGzhu4cgY+G7p2EgbmjDs20gdGjhu6kgbmjhuqV0IGzDoCAwLjA1MTkwNzQ0LCB04bu3IGzhu4cgY+G7p2EgbmjDs20gdGjhu6kgMiBsw6AgMC4wNzI2OTU0My4NCg0KDQoqMi7Gr+G7m2MgbMaw4bujbmcgc+G7sSBjaMOqbmggbOG7h2NoIHbhu4EgdOG7tyBs4buHIG11YSBDbG90aGluZ3MgZ2nhu69hIG5hbSB2w6AgbuG7ry4qDQoNCsSQ4bq3dCBnaeG6oyB0aHV54bq/dCAkSF8wJDogVOG7tyBs4buHIG11YSBDbG90aGluZ3MgY+G7p2EgbmFtIHbDoCBu4buvIGzDoCBi4bqxbmcgbmhhdQ0KDQpgYGB7cn0NCk1hbGUgPC0gZGZbZGYkZ2VuZGVyID09ICJNYWxlIixdDQpGZW1hbGUgPC0gZGZbZGYkZ2VuZGVyID09ICJGZW1hbGUiLF0NCg0KTWFsZXJhdGUgPC0gTWFsZVtNYWxlJGNhdGVnb3J5ID09ICJDbG90aGluZyIsXQ0KRmVtYWxlcmF0ZSA8LSBGZW1hbGVbRmVtYWxlJGNhdGVnb3J5ID09ICJDbG90aGluZyIsXQ0KDQpnZW5kZXJhdGUgPC0gYyhucm93KE1hbGUpLCBucm93KE1hbGUpKQ0KY2F0ZWdvcnlyYXRlIDwtIGMobnJvdyhNYWxlcmF0ZSksIG5yb3coRmVtYWxlcmF0ZSkpDQoNCnByb3AudGVzdChjYXRlZ29yeXJhdGUsZ2VuZGVyYXRlKQ0KYGBgDQpL4bq/dCBxdeG6oyBQX3ZhbHVlIHLhuqV0IG5o4buPLCB0YSBiw6FjIGLhu48gSDAuIENobyB0aOG6pXkgY8OzIHPhu7Ega2jDoWMgYmnhu4d0IGdp4buvYSB04bu3IGzhu4cgbmFtIG11YSBDbG90aGluZ3MgdsOgIG7hu68gbXVhIENsb3RoaW5ncy4gTmdvw6BpIHJhLCBraG/huqNuZyB0aW4gY+G6rXkgY2hvIHThu7cgbOG7hyBtdWEgQ2xvdGhpbmdzIGPhu6dhIGhhaSBnaeG7m2kgdMOtbmggbsOgeSBsw6AgKC0wLjE3NzMyMDEsIC0wLjE2Mzc0MzApLCBraMO0bmcgYmFvIGfhu5NtIHPhu5EgMCwgY2hvIHRo4bqleSBnaeG7r2EgMiB04bu3IGzhu4cgbsOgeSBjw7MgbeG7mXQgc+G7sSBjaMOqbmggbOG7h2NoIMSRw6FuZyBr4buDLiBU4bu3IGzhu4cgY+G7p2EgbmjDs20gdGjhu6kgbmjhuqV0IGzDoCAwLjM0NjA5MTMsIHThu7cgbOG7hyBj4bunYSBuaMOzbSB0aOG7qSAyIGzDoCAwLjUxNjYyMjkuDQoNCiMjIDYuIFJlbGF0aXZlIFJpc2svIE9kZCBSYXRpbyANCg0KIyMjIDYuMS4gR2VuZGVyIGFuZCBQYXltZW50X21ldGhvZA0KDQoqKlJlbGF0aXZlIFJpc2sqKg0KDQoNCmBgYHtyfQ0KDQpkZiRwYXltZW50X21ldGhvZFtkZiRwYXltZW50X21ldGhvZCA9PSAiRGViaXQgQ2FyZCJdIDwtICJDcmVkaXQgQ2FyZCINCnBheW1lbnRmcmVxdWVuY3kgPC0gdGFibGUoZGYkZ2VuZGVyLCBkZiRwYXltZW50X21ldGhvZCkNCg0KYWRkbWFyZ2lucyhwYXltZW50ZnJlcXVlbmN5KQ0KDQpSZWxSaXNrKHBheW1lbnRmcmVxdWVuY3kpICNSZWxyaXNrIHTDrW5oIOG7nyB24buLIHRyw60gMTEgc28gduG7m2kgMjEgKGJp4bq/biB0aMOgbmggY8O0bmcgbMOgIGPhu5l0IHRo4bupIDEpDQoNCnJpc2tyYXRpbyhwYXltZW50ZnJlcXVlbmN5KQ0KDQoNCg0KDQpgYGANCg0KLSBS4bunaSBybyB0xrDGoW5nIMSR4buRaSBj4bunYSBuYW0gY2jhu41uIENhc2ggbMOgbSBwaMawxqFuZyB0aOG7qWMgdGhhbmggdG/DoW4gc28gduG7m2kgbuG7ryBjaOG7jW4gQ2FzaCBsw6BtIHBoxrDGoW5nIHRo4bupYyB0aGFuaCB0b8OhbiBsw6AgMS4wMDY4OC4gS+G6v3QgcXXhuqMgbsOgeSBs4bubbiBoxqFuIDEsIG5naMSpYSBsw6AgTmFtIHPhur0gY8OzIG5ndXkgY8ahIGNo4buNbiBDYXNoIGzDoCBwaMawxqFuZyB0aOG7qWMgdGhhbmggdG/DoW4gaMahbiBu4buvIA0KLSBL4bq/dCBxdeG6oyB0csOqbiBjaG8gdGjhuqV5IHLhu6dpIHJvIHTGsMahbmcgxJHhu5FpIGPhu6dhIG7hu68gY2jhu41uIENyZWRpdCBDYXJkIGzDoG0gcGjGsMahbmcgdGjhu6ljIHRoYW5oIHRvw6FuIHNvIHbhu5tpIG5hbSBjaOG7jW4gY3JlZGl0IGNhcmQgbMOgbSBwaMawxqFuZyB0aOG7qWMgdGhhbmggdG/DoW4gbMOgIDEuMDA1NTYyLiBL4bq/dCBxdeG6oyBuw6B5IGPFqW5nIGzhu5tuIGjGoW4gMSwgY2hvIHRo4bqleSBu4buvIGPDsyBuZ3V5IGPGoSBjaOG7jW4gQ3JlZGl0IENhcmQgbMOgbSBwaMawxqFuZyB0aOG7qWMgdGhhbmggdG/DoW4gaMahbiBOYW0uDQoNCg0KKipPZGQgUmF0aW8qKg0KDQotIFThu7cgbOG7hyBuYW0gdsOgIG7hu68gZ2nhu69hIHjDoWMgc3XhuqV0ICJz4butIGThu6VuZyBDYXNoIiB2w6AgeMOhYyBzdeG6pXQgImtow7RuZyBz4butIGThu6VuZyBDYXNoIg0KDQpgYGB7cn0NCm9kZHNyYXRpbyhwYXltZW50ZnJlcXVlbmN5KQ0KDQpgYGANCg0KLSBU4bu3IGzhu4cgTmFtIHPhu60gZOG7pW5nIENhc2ggbMOgbSBwaMawxqFuZyB0aOG7qWMgdGhhbmggdG/DoW4gc28gduG7m2kgbuG7ryBz4butIGThu6VuZyBjYXNoIGzDoG0gcGjGsMahbmcgdGjhu6ljIHRoYW5oIHRvw6FuIGzDoCAxLjAxMjQ2LCBnacOhIHRy4buLIG7DoHkgbOG7m24gaMahbiAxIHThu6ljIGzDoCBuYW0gc+G6vSBjw7Mgbmd1eSBjxqEgc+G7rSBk4bulbmcgY2FzaCBsw6BtIHBoxrDGoW5nIHRo4bupYyB0aGFuaCB0b8OhbiBoxqFuIG7hu68uDQoNCg0KDQojIyMgNi4yLiBHZW5kZXIgYW5kIEluZHVzdHJ5DQoNCioqUmVsYXRpdmUgUmlzayoqDQpgYGB7cn0NCg0KYWRkbWFyZ2lucyhmcmVxdWVuY3lpbmR1c3RyeSkNCg0KUmVsUmlzayhmcmVxdWVuY3lpbmR1c3RyeSkNCnJpc2tyYXRpbyhmcmVxdWVuY3lpbmR1c3RyeSkNCg0KYGBgDQotIFLhu6dpIHJvIHTGsMahbmcgxJHhu5FpIGPhu6dhIG7hu68gY2jhu41uIEYmQiBsw6AgbmfDoG5oIGjDoG5nIHRpw6p1IGTDuW5nIHbhu5tpIG5hbSBjaOG7jW4gRiZCIGzDoCBuZ8OgbmggaMOgbmcgdGnDqnUgZMO5bmcgbMOgIDAuOTkwNzQ3OS4gR2nDoSB0cuG7iyBuw6B5IGLDqSBoxqFuIDEsIHRo4buDIGhp4buHbiBu4buvIHPhur0gw610IGNo4buNbiBGJkIgbMOgIG5nw6BuaCBow6BuZyB0acOqdSBkw7luZyBoxqFuIG5hbS4NCi0gUuG7p2kgcm8gdMawxqFuZyDEkeG7kWkgZ2nhu69hIG5hbSBjaOG7jW4gRk1DRyBsw6AgbmfDoG5oIGjDoG5nIHRpw6p1IGTDuW5nIHbDoCBu4buvIGNo4buNbiBGTUNHIGzDoCBuZ8OgbmggaMOgbmcgdGnDqnUgZMO5bmcgbMOgIDAuOTk4Mzc3NywgZ2nDoSB0cuG7iyBuw6B5IGLDqSBoxqFuIDEsIHRo4buDIGhp4buHbiBuYW0gc+G6vSDDrXQgY2jhu41uIEZNQ0cgbMOgIG5nw6BuaCBow6BuZyB0acOqdSBkw7luZyBoxqFuIG7hu68uDQoNCioqT2RkIFJhdGlvKioNCg0KYGBge3J9DQpvZGRzcmF0aW8oZnJlcXVlbmN5aW5kdXN0cnkpDQoNCg0KYGBgDQotIFjDoWMgeHXhuqV0IGPhu6dhIG7hu68gY2jhu41uIG5nw6BuaCBow6BuZyBGJkIgbMOgIDAuOTg5MTMzOCwgZ2nDoSB0cuG7iyBuw6B5IG5o4buPIGjGoW4gMSBjxaluZyB0aOG7gyBoaeG7h24gbuG7ryDDrXQgY2jhu41uIG5nw6BuaCBow6BuZyBGJkIgaMahbiBzbyB24bubaSBuYW0uDQoNCiMjIyA2LjMuIEFnZSBhbmQgSW5kdXN0cnkNCg0KKipSZWxhdGl2ZSBSaXNrKioNCmBgYHtyfQ0KDQphZGRtYXJnaW5zKGZyZXF1ZW5jeWFnZSkNClJlbFJpc2soZnJlcXVlbmN5YWdlKQ0Kcmlza3JhdGlvKGZyZXF1ZW5jeWFnZSkNCg0KYGBgDQotIEdpw6EgdHLhu4sgUmVscmlzayA9IDEuMDA1MTExIGzhu5tuIGjGoW4gMSB0aOG7gyBoaeG7h24geMOhYyB4deG6pXQgbmfGsOG7nWkgdHLhursgY2jhu41uIG5nw6BuaCBow6BuZyBGJkIgbmhp4buBdSBoxqFuIG5nxrDhu51pIGdpw6AgY2jhu41uIG5nw6BuaCBow6BuZyBGJkINCi0gR2nDoSB0cuG7iyBSaXNyYXRpbyA9IDEuMDAwODg5IGzhu5tuIGjGoW4gMSB0aOG7gyBoaeG7h24geMOhYyB4deG6pXQgbmfGsOG7nWkgZ2nDoCBjaOG7jW4gbmfDoG5oIGjDoG5nIEZNQ0cgbmhp4buBdSBoxqFuIG5nxrDhu51pIHRy4bq7IGNo4buNbiBuZ8OgbmggaMOgbmcgRk1DRw0KDQoqKk9kZCBSYXRpbyoqDQoNCmBgYHtyfQ0Kb2Rkc3JhdGlvKGZyZXF1ZW5jeWFnZSkNCg0KDQpgYGANCg0KLSBHacOhIHRy4buLIDEuMDA1OTk0IGzhu5tuIGjGoW4gMSBjaG8gdGjhuqV5LCDhu58gbmfDoG5oIGjDoG5nIEYmQiwgbmfGsOG7nWkgdHLhursgc+G6vSBjw7Mgbmh1IGPhuqd1IG5oaeG7gXUgaMahbiBuZ8aw4budaSBnacOgDQoNCiMjIDcuIFRo4buRbmcga8OqIHN1eSBkaeG7hW4NCg0KLSDEkOG7gyBraeG7g20gxJHhu4tuaCB4ZW0gZ2nhu5tpIHTDrW5oIGPDsyDhuqNuaCBoxrDhu59uZyDEkeG6v24gaMOgbmggdmkgbOG7sWEgY2jhu41uIHPhuqNuIHBo4bqpbSBraGkgbXVhIGjDoG5nIGPhu6dhIGtow6FjaCBow6BuZyBraMO0bmcsIHRhIGTDuW5nIEh5cG90aGV0aWNzIHRlc3QgdsOgIHBoxrDGoW5nIHBow6FwIGtp4buDbSDEkeG7i25oIHRo4buRbmcga8OqIENoaS1zcXVhcmUgDQpHaeG6oyB0aHV54bq/dCAkSF8wJDogSGFpIGJp4bq/biDEkeG7mWMgbOG6rXAgaG/DoG4gdG/DoG4NCg0KIyMjIDcuMS4gR2VuZGVyIGFuZCBDYXRlZ29yeQ0KDQoqKktp4buDbSDEkeG7i25oIHTDrW5oIMSR4buZYyBs4bqtcCoqDQoNCg0KYGBge3J9DQpjaGlzcS50ZXN0KGZyZXF1ZW5jeSkNCmBgYA0KDQotIEdpw6EgdHLhu4sgcC12YWx1ZSA9IDAuMzcyMiwgY2jDum5nIHRhIGNoxrBhIMSR4bunIGNo4bupbmcgY+G7qSDEkeG7gyBiw6FjIGLhu48gSDAuIFbhuq15IGdp4bubaSB0w61uaCBraMO0bmcg4bqjbmggaMaw4bufbmcgxJHhur9uIHZp4buHYyBs4buxYSBjaOG7jW4gc+G6o24gcGjhuqltIGPhu6dhIGtow6FjaCBow6BuZy4NCg0KIyMjIDcuMi4gR2VuZGVyIGFuZCBJbmR1c3RyeQ0KYGBge3J9DQpjaGlzcS50ZXN0KGZyZXF1ZW5jeWluZHVzdHJ5KQ0KYGBgDQoNCi0gR2nDoSB0cuG7iyBwLXZhbHVlID0gMC41NTQsIGNow7puZyB0YSBjaMawYSDEkeG7pyBjaOG7qW5nIGPhu6kgxJHhu4MgYsOhYyBi4buPIEgwLiBW4bqteSBnaeG7m2kgdMOtbmgga2jDtG5nIOG6o25oIGjGsOG7n25nIMSR4bq/biB2aeG7h2MgbOG7sWEgY2jhu41uIG5nw6BuaCBow6BuZyBtdWEgc+G6r20gY+G7p2Ega2jDoWNoIGjDoG5nLg0KDQojIyMgNy4zLiBBZ2UgYW5kIEluZHVzdHJ5DQpgYGB7cn0NCmNoaXNxLnRlc3QoZnJlcXVlbmN5YWdlKQ0KYGBgDQoNCi0gR2nDoSB0cuG7iyBwLXZhbHVlID0gIDAuNzUzOSwgY2jDum5nIHRhIGNoxrBhIMSR4bunIGNo4bupbmcgY+G7qSDEkeG7gyBiw6FjIGLhu48gSDAuIFbhuq15IMSR4buZIHR14buVaSBraMO0bmcg4bqjbmggaMaw4bufbmcgxJHhur9uIHZp4buHYyBs4buxYSBjaOG7jW4gbmfDoG5oIGjDoG5nIG11YSBz4bqvbSBj4bunYSBraMOhY2ggaMOgbmcuDQoNCiMjIyA3LjQuIEFnZSBhbmQgcGF5bWVudF9tZXRob2QNCg0KYGBge3J9DQpjaGlzcS50ZXN0KGZyZXF1ZW5jeXBheW1lbnQpDQpgYGANCg0KLSBHacOhIHRy4buLIHAtdmFsdWUgPSAgMC42NTgsIGNow7puZyB0YSBjaMawYSDEkeG7pyBjaOG7qW5nIGPhu6kgxJHhu4MgYsOhYyBi4buPIEgwLiBW4bqteSDEkeG7mSB0deG7lWkga2jDtG5nIOG6o25oIGjGsOG7n25nIMSR4bq/biB2aeG7h2MgbOG7sWEgY2jhu41uIHBoxrDGoW5nIHRo4bupYyB0aGFuaCB0b8Ohbi4NCg0KIyMgOC4gSOG7k2kgcXV5DQoNCg0KKipYw6J5IGThu7FuZyBtw7QgaMOsbmggaOG7k2kgcXV5KioNCg0KKjEuR2nhuqMgc+G7rSDhu58gdHJvbmcgYmnhur9uIEdlbmRlciwgdGh14buZYyB0w61uaCBn4buNaSBsw6AgdGjDoG5oIGPDtG5nIGtoaSBr4bq/dCBxdeG6oyB0cuG6oyB24buBIGzDoCBNYWxlKE5hbSkqDQpgYGB7cn0NCmdlbmRlciA8LSBmYWN0b3IoZGYkZ2VuZGVyKQ0KbGV2ZWxzKGdlbmRlcikgI1bDrCB0aHXhu5ljIHTDrW5oIHRo4bupIDIgbMOgIE1hbGUgbsOqbiBNYWxlIMSRxrDhu6NjIGfhu41pIGzDoCAidGjDoG5oIGPDtG5nIg0KDQpmaXR0ZWQgPC0gZ2xtKGZhY3RvcihnZW5kZXIpIH4gY2F0ZWdvcnksIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAnbG9naXQnKSwgZGF0YSA9IGRmKQ0Kc3VtbWFyeShmaXR0ZWQpDQoNCmBgYA0KLSDEkOG7jWMga+G6v3QgcXXhuqMgUF92YWx1ZS4gTcO0IGjDrG5oIGjhu5NpIHF1eSB0csOqbiBnaeG6o2kgdGjDrWNoIHLhurFuZyBjw6FjIHPhuqNuIHBo4bqpbSBjYXRlZ29yeUNsb3RoaW5nLA0KY2F0ZWdvcnlDb3NtZXRpY3MsIGNhdGVnb3J5U291dmVuaXIsIGNhdGVnb3J5VG95cyBz4bq9IOG6o25oIGjGsOG7n25nIGzDqm4gcGjDom4ga2jDumMga2jDoWNoIGjDoG5nIGzDoCBOYW0uDQoNCioyLkdp4bqjIHPhu60g4bufIHRyb25nIGJp4bq/biBHZW5kZXIsIHRodeG7mWMgdMOtbmggZ+G7jWkgbMOgIHRow6BuaCBjw7RuZyBraGkga+G6v3QgcXXhuqMgdHLhuqMgduG7gSBsw6AgTWFsZShOYW0pKg0KDQpgYGB7cn0NCmRmJGdlbmRlciA8LSBmYWN0b3IoZGYkZ2VuZGVyLCBsZXZlbHMgPSBjKCJNYWxlIiwiRmVtYWxlIikpDQpnZW5kZXIgPC0gZmFjdG9yKGRmJGdlbmRlcikNCmxldmVscyhnZW5kZXIpICPEkOG7lWkgbOG6oWkgdGh14buZYyB0w61uaCB0aOG7qSAyIGzDoCBGZW1hbGUgbsOqbiBGZW1hbGUgxJHGsOG7o2MgZ+G7jWkgbMOgICJ0aMOgbmggY8O0bmciDQoNCmZpdHRlZCA8LSBnbG0oZmFjdG9yKGdlbmRlcikgfiBjYXRlZ29yeSwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICdsb2dpdCcpLCBkYXRhID0gZGYpDQpzdW1tYXJ5KGZpdHRlZCkNCg0KYGBgDQotIMSQ4buNYyBr4bq/dCBxdeG6oyBQX3ZhbHVlLiBNw7QgaMOsbmggaOG7k2kgcXV5IHRyw6puIGPFqW5nIGdp4bqjaSB0aMOtY2ggcuG6sW5nIGPDoWMgc+G6o24gcGjhuqltIGNhdGVnb3J5Q2xvdGhpbmcsY2F0ZWdvcnlDb3NtZXRpY3MsIGNhdGVnb3J5U291dmVuaXIsIGNhdGVnb3J5VG95cyBz4bq9IOG6o25oIGjGsOG7n25nIGzDqm4gcGjDom4ga2jDumMga2jDoWNoIGjDoG5nIGzDoCBO4buvLg0KDQoNCg0KDQo=