Практическая работа №2

Статистический анализ качественных (категориальных) признаков

Глушков Егор Александрович, гр. 20.М04-мм
Вариант № 7. Категориальные переменные: intpla, curwor, se.


Данные (addicts.xls), варианты в Табл.1. Для каждой из трех независимых категориальных переменных исследовать таблицы сопряженности с зависимой переменной end.

Переменные:

Исследуем переменные на наличие пропусков.

c(summary(as.factor(addicts$intpla)), summary(as.factor(addicts$curwor)), summary(as.factor(addicts$se)), summary(as.factor(addicts$end)))
   1    2    0    1    0    1 NA's    0    1 NA's 
 141  139  204   76  213   65    2  202   77    1 

Исключаем данные с пропусками и выделяем нужные столбцы [удалены 3 записи]

data <- na.omit(addicts[ , c("intpla", "curwor", "se", "end")])
summary(data)
     intpla          curwor             se              end        
 Min.   :1.000   Min.   :0.0000   Min.   :0.0000   Min.   :0.0000  
 1st Qu.:1.000   1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:0.0000  
 Median :1.000   Median :0.0000   Median :0.0000   Median :0.0000  
 Mean   :1.498   Mean   :0.2744   Mean   :0.2347   Mean   :0.2708  
 3rd Qu.:2.000   3rd Qu.:1.0000   3rd Qu.:0.0000   3rd Qu.:1.0000  
 Max.   :2.000   Max.   :1.0000   Max.   :1.0000   Max.   :1.0000  

Гипотезы о независимости по критерию \(\chi^2\) и точному критерию Фишера

intpla - место лечения

tab_intpla <- table(X=data$intpla, Y=data$end); tab_intpla
   Y
X     0   1
  1  96  43
  2 106  32
tab_intpla[,2]/rowSums(tab_intpla)
        1         2 
0.3093525 0.2318841 

Для 30.9% лечившихся амбулаторно и для 23.2% лечившихся в диспансере программа лечения была выполнена.

c(fisher.test(tab_intpla)$p.value, chisq.test(tab_intpla, correct=FALSE)$p.value, chisq.test(tab_intpla)$p.value)
[1] 0.1763913 0.1468375 0.1883169

Итоговые p.value критериев Фишера и \(\chi^2\) без поправки и с поправкой на непрерывность превышают уровень значимости 0.05. Гипотеза о том, что условные вероятности одинаковы, не отвергается. Проценты людей, лечившихся амбулаторно и в диспансере, отличаются незначимо. Данные признаки независимы. Различия в частотах можно объяснить случайностью.

curwor - занятость

tab_curwor <- table(X=data$curwor, Y=data$end); tab_curwor
   Y
X     0   1
  0 153  48
  1  49  27
tab_curwor[,2]/rowSums(tab_curwor)
        0         1 
0.2388060 0.3552632 

Для 23.9% лечившихся, занятых на работе, и для 35.5% пациентов, кто не работал, программа лечения была выполнена.

c(fisher.test(tab_curwor)$p.value, chisq.test(tab_curwor, correct=FALSE)$p.value, chisq.test(tab_curwor)$p.value)
[1] 0.06837940 0.05162145 0.07269287

Итоговые p.value критериев Фишера и \(\chi^2\) без поправки и с поправкой на непрерывность лишь немного превышают уровень значимости 0.05. Гипотеза о том, что условные вероятности одинаковы, не отвергается. Проценты людей, имеющих работу и не имеющих, отличаются незначимо, однако к данным результатам стоит отнестись с осторожностью ввиду достаточно близкого к уровню значимости 0.05 p-значения критериев.

se - использование успокоительных средств

tab_se <- table(X=data$se, Y=data$end); tab_se
   Y
X     0   1
  0 149  63
  1  53  12
tab_se[,2]/rowSums(tab_se)
        0         1 
0.2971698 0.1846154 

Для 29.7% лечившихся, не употреблявших успокоительные средства, и для 18.5% пациентов, кто употреблял успокоительные, программа лечения была выполнена.

c(fisher.test(tab_se)$p.value, chisq.test(tab_se, correct=FALSE)$p.value, chisq.test(tab_se)$p.value)
[1] 0.08081371 0.07400653 0.10372925

Итоговые p.value критериев Фишера и \(\chi^2\) без поправки и с поправкой на непрерывность немного превышают уровень значимости 0.05. Гипотеза о том, что условные вероятности одинаковы, не отвергается. Проценты людей, принимавших и не принимавших успокоительные, отличаются незначимо, однако к данным результатам стоит отнестись с некоторой осторожностью.

Коэффициенты неопределенности

Entropy <- function(x)
{
  p <- x / sum(x)
  p <- p[p!=0]
  -sum(p*log(p, 2))
}

Uncertainty_coefficient <- function(tab)
{
  Hxy <- Entropy(as.vector(tab))
  Hx<-Entropy(rowSums(tab))
  Hy<-Entropy(colSums(tab))
  I <- Hx + Hy - Hxy
  c(I/Hx, I/Hy, 2*I/(Hx+Hy)) * 100
}
  1. Независимые переменные по отдельности
Uncertainty_coefficient(tab_intpla)
[1] 0.5496901 0.6524060 0.5966596
Uncertainty_coefficient(tab_curwor)
[1] 1.125993 1.132826 1.129399
Uncertainty_coefficient(tab_se)
[1] 1.119485 1.044402 1.080641

Для признака intpla коэффициент неопределенности едва превышает 0.5%, для curwor и se – чуть больше 1%. Таким образом, знание любого из этих признаков по отдельности не вносит ясности в вопрос, было ли лечение успешным, так как зависимости между этими признаками с end практически нет, только за счет объема выборки есть некоторое отличие от нуля.

  1. Пары независимых переменных
x <- data$end
X. <- data[, -which(colnames(data)=="end")]

Bin_encoding <- function(X_)
{
  rowSums(apply(rbind(2^(seq(ncol(X_))-1), X_), 2, function(x) x[-1] * x[1]))
}

Uncertainty_coefficients_multiple <- function(x, X., k)
{
  C <- combn(ncol(X.), k)
  L <- apply(C, 2, function(z) {
    Uncertainty_coefficient(table(x, Bin_encoding(X.[, z])))[1]
  })
  df <- data.frame(t(apply(C, 2, function(z)colnames(X.)[z])), L=L)
  df[order(df$L, decreasing=TRUE),]
}
Uncertainty_coefficients_multiple(x, X., k=2)
  1. Все три независимые переменные одновременно
Uncertainty_coefficients_multiple(x, X., k=3)

Сочетание пары переменных “занятость - использование успокоительных” даёт нам лишь 2.1% информации о том, насколько программа лечения была выполнена. Другие две пары объясняют зависимую переменную end лишь на 1.24% и 1.5%. Аналогично можно сказать и о комбинации сразу всех трех признаков: 2.47%, что фактически говорит о независимости успешности лечения от места лечения, занятости, приема успокоительных или комбинации этих признаков в паре или даже тройке.

LS0tDQp0aXRsZTogIiINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiMjIyMg0J/RgNCw0LrRgtC40YfQtdGB0LrQsNGPINGA0LDQsdC+0YLQsCDihJYyDQojIyMg0KHRgtCw0YLQuNGB0YLQuNGH0LXRgdC60LjQuSDQsNC90LDQu9C40Lcg0LrQsNGH0LXRgdGC0LLQtdC90L3Ri9GFICjQutCw0YLQtdCz0L7RgNC40LDQu9GM0L3Ri9GFKSDQv9GA0LjQt9C90LDQutC+0LINCg0KPiDQk9C70YPRiNC60L7QsiDQldCz0L7RgCDQkNC70LXQutGB0LDQvdC00YDQvtCy0LjRhywg0LPRgC4gMjAu0JwwNC3QvNC8ICANCj4g0JLQsNGA0LjQsNC90YIg4oSWIDcuINCa0LDRgtC10LPQvtGA0LjQsNC70YzQvdGL0LUg0L/QtdGA0LXQvNC10L3QvdGL0LU6IGludHBsYSwgY3Vyd29yLCBzZS4NCg0KLS0tDQrQlNCw0L3QvdGL0LUgKGFkZGljdHMueGxzKSwg0LLQsNGA0LjQsNC90YLRiyDQsiDQotCw0LHQuy4xLiDQlNC70Y8g0LrQsNC20LTQvtC5INC40Lcg0YLRgNC10YUg0L3QtdC30LDQstC40YHQuNC80YvRhSDQutCw0YLQtdCz0L7RgNC40LDQu9GM0L3Ri9GFINC/0LXRgNC10LzQtdC90L3Ri9GFINC40YHRgdC70LXQtNC+0LLQsNGC0Ywg0YLQsNCx0LvQuNGG0Ysg0YHQvtC/0YDRj9C20LXQvdC90L7RgdGC0Lgg0YEg0LfQsNCy0LjRgdC40LzQvtC5INC/0LXRgNC10LzQtdC90L3QvtC5IGVuZC4NCg0KKiDQn9GA0L7QstC10YDQuNGC0Ywg0LPQuNC/0L7RgtC10LfRiyDQviDQvdC10LfQsNCy0LjRgdC40LzQvtGB0YLQuCDQv9C+INC60YDQuNGC0LXRgNC40Y4g0YXQuC3QutCy0LDQtNGA0LDRgiAo0LHQtdC3INC/0L7Qv9GA0LDQstC60Lgg0Lgg0YEg0L/QvtC/0YDQsNCy0LrQvtC5KSDQuCDRgtC+0YfQvdC+0LzRgyDQutGA0LjRgtC10YDQuNGOINCk0LjRiNC10YDQsC4g0J/RgNC10LTRgdGC0LDQstC40YLRjCDRg9GB0LvQvtCy0L3Ri9C1INCy0LXRgNC+0Y/RgtC90L7RgdGC0Lgg0Lgg0LfQvdCw0YfQuNC80L7RgdGC0Lgg0LjRhSDQvtGC0LvQuNGH0LjRjy4NCiog0JLRi9GH0LjRgdC70LjRgtGMINC60L7RjdGE0YTQuNGG0LjQtdC90YLRiyDQvdC10L7Qv9GA0LXQtNC10LvQtdC90L3QvtGB0YLQuCDQtNC70Y8g0LfQsNCy0LjRgdC40LzQvtC5INC/0LXRgNC10LzQtdC90L3QvtC5IGVuZCDQuCAxKSDQtNC70Y8g0LrQsNC20LTQvtC5INC40Lcg0L3QtdC30LDQstC40YHQuNC80YvRhSDQv9C10YDQtdC80LXQvdC90YvRhSDQv9C+INC+0YLQtNC10LvRjNC90L7RgdGC0LgsIDIpINC00LvRjyDRgtGA0LXRhSDQv9Cw0YAg0L3QtdC30LDQstC40YHQuNC80YvRhSDQv9C10YDQtdC80LXQvdC90YvRhSwgMykg0LTQu9GPINCy0YHQtdGFINGC0YDQtdGFINC90LXQt9Cw0LLQuNGB0LjQvNGL0YUg0L/QtdGA0LXQvNC10L3QvdGL0YUg0L7QtNC90L7QstGA0LXQvNC10L3QvdC+Lg0KDQrQn9C10YDQtdC80LXQvdC90YvQtTogIA0KDQorIGludHBsYSAtLSDQvNC10YHRgtC+INC70LXRh9C10L3QuNGPICgxIC0g0LDQvNCx0YPQu9Cw0YLQvtGA0L3QviwgMiAtINCyINC00LjRgdC/0LDQvdGB0LXRgNC1KQ0KKyBjdXJ3b3IgLS0g0LfQsNC90Y/RgtC+0YHRgtGMICgxIC0g0YDQsNCx0L7RgtCw0LXRgiwgMiAtINC90LUg0YDQsNCx0L7RgtCw0LXRgikNCisgc2UgLS0g0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC40LUg0YPRgdC/0L7QutC+0LjRgtC10LvRjNC90YvRhSDRgdGA0LXQtNGB0YLQsiAoMSAtINC00LAsIDAgLSDQvdC10YIpDQorIGVuZCAtLSDQuNGC0L7QsyDQu9C10YfQtdC90LjRjyAoMSAtINC/0YDQvtCz0YDQsNC80LzQsCDQu9C10YfQtdC90LjRjyDQstGL0L/QvtC70L3QtdC90LAsIDAgLSDQv9GA0L7Qs9GA0LDQvNC80LAg0YHQvtGA0LLQsNC90LApDQoNCg0K0JjRgdGB0LvQtdC00YPQtdC8INC/0LXRgNC10LzQtdC90L3Ri9C1INC90LAg0L3QsNC70LjRh9C40LUg0L/RgNC+0L/Rg9GB0LrQvtCyLiANCmBgYHtyfQ0KYyhzdW1tYXJ5KGFzLmZhY3RvcihhZGRpY3RzJGludHBsYSkpLCBzdW1tYXJ5KGFzLmZhY3RvcihhZGRpY3RzJGN1cndvcikpLCBzdW1tYXJ5KGFzLmZhY3RvcihhZGRpY3RzJHNlKSksIHN1bW1hcnkoYXMuZmFjdG9yKGFkZGljdHMkZW5kKSkpDQpgYGANCg0K0JjRgdC60LvRjtGH0LDQtdC8INC00LDQvdC90YvQtSDRgSDQv9GA0L7Qv9GD0YHQutCw0LzQuCDQuCDQstGL0LTQtdC70Y/QtdC8INC90YPQttC90YvQtSDRgdGC0L7Qu9Cx0YbRiyBb0YPQtNCw0LvQtdC90YsgMyDQt9Cw0L/QuNGB0LhdDQpgYGB7cn0NCmRhdGEgPC0gbmEub21pdChhZGRpY3RzWyAsIGMoImludHBsYSIsICJjdXJ3b3IiLCAic2UiLCAiZW5kIildKQ0Kc3VtbWFyeShkYXRhKQ0KYGBgDQoNCiMjIyDQk9C40L/QvtGC0LXQt9GLINC+INC90LXQt9Cw0LLQuNGB0LjQvNC+0YHRgtC4INC/0L4g0LrRgNC40YLQtdGA0LjRjiAkXGNoaV4yJCDQuCDRgtC+0YfQvdC+0LzRgyDQutGA0LjRgtC10YDQuNGOINCk0LjRiNC10YDQsA0KDQo+IGludHBsYSAtINC80LXRgdGC0L4g0LvQtdGH0LXQvdC40Y8NCg0KYGBge3J9DQp0YWJfaW50cGxhIDwtIHRhYmxlKFg9ZGF0YSRpbnRwbGEsIFk9ZGF0YSRlbmQpOyB0YWJfaW50cGxhDQpgYGANCg0KYGBge3J9DQp0YWJfaW50cGxhWywyXS9yb3dTdW1zKHRhYl9pbnRwbGEpDQpgYGANCtCU0LvRjyAzMC45JSDQu9C10YfQuNCy0YjQuNGF0YHRjyDQsNC80LHRg9C70LDRgtC+0YDQvdC+INC4INC00LvRjyAyMy4yJSDQu9C10YfQuNCy0YjQuNGF0YHRjyDQsiDQtNC40YHQv9Cw0L3RgdC10YDQtSDQv9GA0L7Qs9GA0LDQvNC80LAg0LvQtdGH0LXQvdC40Y8g0LHRi9C70LAg0LLRi9C/0L7Qu9C90LXQvdCwLiANCg0KYGBge3J9DQpjKGZpc2hlci50ZXN0KHRhYl9pbnRwbGEpJHAudmFsdWUsIGNoaXNxLnRlc3QodGFiX2ludHBsYSwgY29ycmVjdD1GQUxTRSkkcC52YWx1ZSwgY2hpc3EudGVzdCh0YWJfaW50cGxhKSRwLnZhbHVlKQ0KYGBgDQrQmNGC0L7Qs9C+0LLRi9C1IHAudmFsdWUg0LrRgNC40YLQtdGA0LjQtdCyINCk0LjRiNC10YDQsCDQuCAkXGNoaV4yJCDQsdC10Lcg0L/QvtC/0YDQsNCy0LrQuCDQuCDRgSDQv9C+0L/RgNCw0LLQutC+0Lkg0L3QsCDQvdC10L/RgNC10YDRi9Cy0L3QvtGB0YLRjCDQv9GA0LXQstGL0YjQsNGO0YIg0YPRgNC+0LLQtdC90Ywg0LfQvdCw0YfQuNC80L7RgdGC0LggMC4wNS4g0JPQuNC/0L7RgtC10LfQsCDQviDRgtC+0LwsINGH0YLQviDRg9GB0LvQvtCy0L3Ri9C1INCy0LXRgNC+0Y/RgtC90L7RgdGC0Lgg0L7QtNC40L3QsNC60L7QstGLLCAqKtC90LUg0L7RgtCy0LXRgNCz0LDQtdGC0YHRjyoqLiDQn9GA0L7RhtC10L3RgtGLINC70Y7QtNC10LksINC70LXRh9C40LLRiNC40YXRgdGPINCw0LzQsdGD0LvQsNGC0L7RgNC90L4g0Lgg0LIg0LTQuNGB0L/QsNC90YHQtdGA0LUsINC+0YLQu9C40YfQsNGO0YLRgdGPICoq0L3QtdC30L3QsNGH0LjQvNC+KiouINCU0LDQvdC90YvQtSDQv9GA0LjQt9C90LDQutC4INC90LXQt9Cw0LLQuNGB0LjQvNGLLiDQoNCw0LfQu9C40YfQuNGPINCyINGH0LDRgdGC0L7RgtCw0YUg0LzQvtC20L3QviDQvtCx0YrRj9GB0L3QuNGC0Ywg0YHQu9GD0YfQsNC50L3QvtGB0YLRjNGOLiANCg0KDQo+IGN1cndvciAtINC30LDQvdGP0YLQvtGB0YLRjA0KDQpgYGB7cn0NCnRhYl9jdXJ3b3IgPC0gdGFibGUoWD1kYXRhJGN1cndvciwgWT1kYXRhJGVuZCk7IHRhYl9jdXJ3b3INCmBgYA0KDQpgYGB7cn0NCnRhYl9jdXJ3b3JbLDJdL3Jvd1N1bXModGFiX2N1cndvcikNCmBgYA0K0JTQu9GPIDIzLjklINC70LXRh9C40LLRiNC40YXRgdGPLCDQt9Cw0L3Rj9GC0YvRhSDQvdCwINGA0LDQsdC+0YLQtSwg0Lgg0LTQu9GPIDM1LjUlINC/0LDRhtC40LXQvdGC0L7Qsiwg0LrRgtC+INC90LUg0YDQsNCx0L7RgtCw0LssINC/0YDQvtCz0YDQsNC80LzQsCDQu9C10YfQtdC90LjRjyDQsdGL0LvQsCDQstGL0L/QvtC70L3QtdC90LAuIA0KDQpgYGB7cn0NCmMoZmlzaGVyLnRlc3QodGFiX2N1cndvcikkcC52YWx1ZSwgY2hpc3EudGVzdCh0YWJfY3Vyd29yLCBjb3JyZWN0PUZBTFNFKSRwLnZhbHVlLCBjaGlzcS50ZXN0KHRhYl9jdXJ3b3IpJHAudmFsdWUpDQpgYGANCtCY0YLQvtCz0L7QstGL0LUgcC52YWx1ZSDQutGA0LjRgtC10YDQuNC10LIg0KTQuNGI0LXRgNCwINC4ICRcY2hpXjIkINCx0LXQtyDQv9C+0L/RgNCw0LLQutC4INC4INGBINC/0L7Qv9GA0LDQstC60L7QuSDQvdCwINC90LXQv9GA0LXRgNGL0LLQvdC+0YHRgtGMINC70LjRiNGMINC90LXQvNC90L7Qs9C+INC/0YDQtdCy0YvRiNCw0Y7RgiDRg9GA0L7QstC10L3RjCDQt9C90LDRh9C40LzQvtGB0YLQuCAwLjA1LiDQk9C40L/QvtGC0LXQt9CwINC+INGC0L7QvCwg0YfRgtC+INGD0YHQu9C+0LLQvdGL0LUg0LLQtdGA0L7Rj9GC0L3QvtGB0YLQuCDQvtC00LjQvdCw0LrQvtCy0YssICoq0L3QtSDQvtGC0LLQtdGA0LPQsNC10YLRgdGPKiouINCf0YDQvtGG0LXQvdGC0Ysg0LvRjtC00LXQuSwg0LjQvNC10Y7RidC40YUg0YDQsNCx0L7RgtGDINC4INC90LUg0LjQvNC10Y7RidC40YUsINC+0YLQu9C40YfQsNGO0YLRgdGPICoq0L3QtdC30L3QsNGH0LjQvNC+KiosINC+0LTQvdCw0LrQviDQuiDQtNCw0L3QvdGL0Lwg0YDQtdC30YPQu9GM0YLQsNGC0LDQvCDRgdGC0L7QuNGCINC+0YLQvdC10YHRgtC40YHRjCDRgSDQvtGB0YLQvtGA0L7QttC90L7RgdGC0YzRjiDQstCy0LjQtNGDINC00L7RgdGC0LDRgtC+0YfQvdC+INCx0LvQuNC30LrQvtCz0L4g0Log0YPRgNC+0LLQvdGOINC30L3QsNGH0LjQvNC+0YHRgtC4IDAuMDUgcC3Qt9C90LDRh9C10L3QuNGPINC60YDQuNGC0LXRgNC40LXQsi4NCg0KPiBzZSAtINC40YHQv9C+0LvRjNC30L7QstCw0L3QuNC1INGD0YHQv9C+0LrQvtC40YLQtdC70YzQvdGL0YUg0YHRgNC10LTRgdGC0LINCg0KYGBge3J9DQp0YWJfc2UgPC0gdGFibGUoWD1kYXRhJHNlLCBZPWRhdGEkZW5kKTsgdGFiX3NlDQpgYGANCg0KYGBge3J9DQp0YWJfc2VbLDJdL3Jvd1N1bXModGFiX3NlKQ0KYGBgDQrQlNC70Y8gMjkuNyUg0LvQtdGH0LjQstGI0LjRhdGB0Y8sINC90LUg0YPQv9C+0YLRgNC10LHQu9GP0LLRiNC40YUg0YPRgdC/0L7QutC+0LjRgtC10LvRjNC90YvQtSDRgdGA0LXQtNGB0YLQstCwLCDQuCDQtNC70Y8gMTguNSUg0L/QsNGG0LjQtdC90YLQvtCyLCDQutGC0L4g0YPQv9C+0YLRgNC10LHQu9GP0Lsg0YPRgdC/0L7QutC+0LjRgtC10LvRjNC90YvQtSwg0L/RgNC+0LPRgNCw0LzQvNCwINC70LXRh9C10L3QuNGPINCx0YvQu9CwINCy0YvQv9C+0LvQvdC10L3QsC4gDQoNCmBgYHtyfQ0KYyhmaXNoZXIudGVzdCh0YWJfc2UpJHAudmFsdWUsIGNoaXNxLnRlc3QodGFiX3NlLCBjb3JyZWN0PUZBTFNFKSRwLnZhbHVlLCBjaGlzcS50ZXN0KHRhYl9zZSkkcC52YWx1ZSkNCmBgYA0K0JjRgtC+0LPQvtCy0YvQtSBwLnZhbHVlINC60YDQuNGC0LXRgNC40LXQsiDQpNC40YjQtdGA0LAg0LggJFxjaGleMiQg0LHQtdC3INC/0L7Qv9GA0LDQstC60Lgg0Lgg0YEg0L/QvtC/0YDQsNCy0LrQvtC5INC90LAg0L3QtdC/0YDQtdGA0YvQstC90L7RgdGC0Ywg0L3QtdC80L3QvtCz0L4g0L/RgNC10LLRi9GI0LDRjtGCINGD0YDQvtCy0LXQvdGMINC30L3QsNGH0LjQvNC+0YHRgtC4IDAuMDUuINCT0LjQv9C+0YLQtdC30LAg0L4g0YLQvtC8LCDRh9GC0L4g0YPRgdC70L7QstC90YvQtSDQstC10YDQvtGP0YLQvdC+0YHRgtC4INC+0LTQuNC90LDQutC+0LLRiywgKirQvdC1INC+0YLQstC10YDQs9Cw0LXRgtGB0Y8qKi4g0J/RgNC+0YbQtdC90YLRiyDQu9GO0LTQtdC5LCDQv9GA0LjQvdC40LzQsNCy0YjQuNGFINC4INC90LUg0L/RgNC40L3QuNC80LDQstGI0LjRhSDRg9GB0L/QvtC60L7QuNGC0LXQu9GM0L3Ri9C1LCDQvtGC0LvQuNGH0LDRjtGC0YHRjyAqKtC90LXQt9C90LDRh9C40LzQvioqLCDQvtC00L3QsNC60L4g0Log0LTQsNC90L3Ri9C8INGA0LXQt9GD0LvRjNGC0LDRgtCw0Lwg0YHRgtC+0LjRgiDQvtGC0L3QtdGB0YLQuNGB0Ywg0YEg0L3QtdC60L7RgtC+0YDQvtC5INC+0YHRgtC+0YDQvtC20L3QvtGB0YLRjNGOLg0KDQoNCiMjIyDQmtC+0Y3RhNGE0LjRhtC40LXQvdGC0Ysg0L3QtdC+0L/RgNC10LTQtdC70LXQvdC90L7RgdGC0LgNCg0KYGBge3J9DQpFbnRyb3B5IDwtIGZ1bmN0aW9uKHgpDQp7DQogIHAgPC0geCAvIHN1bSh4KQ0KICBwIDwtIHBbcCE9MF0NCiAgLXN1bShwICogbG9nKHAsIDIpKQ0KfQ0KDQpVbmNlcnRhaW50eV9jb2VmZmljaWVudCA8LSBmdW5jdGlvbih0YWIpDQp7DQogIEh4eSA8LSBFbnRyb3B5KGFzLnZlY3Rvcih0YWIpKQ0KICBIeDwtRW50cm9weShyb3dTdW1zKHRhYikpDQogIEh5PC1FbnRyb3B5KGNvbFN1bXModGFiKSkNCiAgSSA8LSBIeCArIEh5IC0gSHh5DQogIGMoSS9IeCwgSS9IeSwgMipJLyhIeCtIeSkpICogMTAwDQp9DQpgYGANCg0KMS4g0J3QtdC30LDQstC40YHQuNC80YvQtSDQv9C10YDQtdC80LXQvdC90YvQtSDQv9C+INC+0YLQtNC10LvRjNC90L7RgdGC0LgNCg0KYGBge3J9DQpVbmNlcnRhaW50eV9jb2VmZmljaWVudCh0YWJfaW50cGxhKQ0KVW5jZXJ0YWludHlfY29lZmZpY2llbnQodGFiX2N1cndvcikNClVuY2VydGFpbnR5X2NvZWZmaWNpZW50KHRhYl9zZSkNCmBgYA0K0JTQu9GPINC/0YDQuNC30L3QsNC60LAgaW50cGxhINC60L7RjdGE0YTQuNGG0LjQtdC90YIg0L3QtdC+0L/RgNC10LTQtdC70LXQvdC90L7RgdGC0Lgg0LXQtNCy0LAg0L/RgNC10LLRi9GI0LDQtdGCIDAuNSUsINC00LvRjyBjdXJ3b3Ig0Lggc2UgLS0g0YfRg9GC0Ywg0LHQvtC70YzRiNC1IDElLiDQotCw0LrQuNC8INC+0LHRgNCw0LfQvtC8LCDQt9C90LDQvdC40LUg0LvRjtCx0L7Qs9C+INC40Lcg0Y3RgtC40YUg0L/RgNC40LfQvdCw0LrQvtCyINC/0L4g0L7RgtC00LXQu9GM0L3QvtGB0YLQuCDQvdC1INCy0L3QvtGB0LjRgiDRj9GB0L3QvtGB0YLQuCDQsiDQstC+0L/RgNC+0YEsINCx0YvQu9C+INC70Lgg0LvQtdGH0LXQvdC40LUg0YPRgdC/0LXRiNC90YvQvCwg0YLQsNC6INC60LDQuiDQt9Cw0LLQuNGB0LjQvNC+0YHRgtC4INC80LXQttC00YMg0Y3RgtC40LzQuCDQv9GA0LjQt9C90LDQutCw0LzQuCDRgSBlbmQg0L/RgNCw0LrRgtC40YfQtdGB0LrQuCDQvdC10YIsINGC0L7Qu9GM0LrQviDQt9CwINGB0YfQtdGCINC+0LHRitC10LzQsCDQstGL0LHQvtGA0LrQuCDQtdGB0YLRjCDQvdC10LrQvtGC0L7RgNC+0LUg0L7RgtC70LjRh9C40LUg0L7RgiDQvdGD0LvRjy4NCg0KDQoyLiDQn9Cw0YDRiyDQvdC10LfQsNCy0LjRgdC40LzRi9GFINC/0LXRgNC10LzQtdC90L3Ri9GFDQpgYGB7cn0NCnggPC0gZGF0YSRlbmQNClguIDwtIGRhdGFbLCAtd2hpY2goY29sbmFtZXMoZGF0YSk9PSJlbmQiKV0NCg0KQmluX2VuY29kaW5nIDwtIGZ1bmN0aW9uKFhfKQ0Kew0KICByb3dTdW1zKGFwcGx5KHJiaW5kKDJeKHNlcShuY29sKFhfKSktMSksIFhfKSwgMiwgZnVuY3Rpb24oeCkgeFstMV0gKiB4WzFdKSkNCn0NCg0KVW5jZXJ0YWludHlfY29lZmZpY2llbnRzX211bHRpcGxlIDwtIGZ1bmN0aW9uKHgsIFguLCBrKQ0Kew0KICBDIDwtIGNvbWJuKG5jb2woWC4pLCBrKQ0KICBMIDwtIGFwcGx5KEMsIDIsIGZ1bmN0aW9uKHopIHsNCiAgICBVbmNlcnRhaW50eV9jb2VmZmljaWVudCh0YWJsZSh4LCBCaW5fZW5jb2RpbmcoWC5bLCB6XSkpKVsxXQ0KICB9KQ0KICBkZiA8LSBkYXRhLmZyYW1lKHQoYXBwbHkoQywgMiwgZnVuY3Rpb24oeiljb2xuYW1lcyhYLilbel0pKSwgTD1MKQ0KICBkZltvcmRlcihkZiRMLCBkZWNyZWFzaW5nPVRSVUUpLF0NCn0NCmBgYA0KDQoNCmBgYHtyfQ0KVW5jZXJ0YWludHlfY29lZmZpY2llbnRzX211bHRpcGxlKHgsIFguLCBrPTIpDQpgYGANCg0KMy4g0JLRgdC1INGC0YDQuCDQvdC10LfQsNCy0LjRgdC40LzRi9C1INC/0LXRgNC10LzQtdC90L3Ri9C1INC+0LTQvdC+0LLRgNC10LzQtdC90L3Qvg0KYGBge3J9DQpVbmNlcnRhaW50eV9jb2VmZmljaWVudHNfbXVsdGlwbGUoeCwgWC4sIGs9MykNCmBgYA0KDQrQodC+0YfQtdGC0LDQvdC40LUg0L/QsNGA0Ysg0L/QtdGA0LXQvNC10L3QvdGL0YUgItC30LDQvdGP0YLQvtGB0YLRjCAtINC40YHQv9C+0LvRjNC30L7QstCw0L3QuNC1INGD0YHQv9C+0LrQvtC40YLQtdC70YzQvdGL0YUiINC00LDRkdGCINC90LDQvCDQu9C40YjRjCAyLjElINC40L3RhNC+0YDQvNCw0YbQuNC4INC+INGC0L7QvCwg0L3QsNGB0LrQvtC70YzQutC+INC/0YDQvtCz0YDQsNC80LzQsCDQu9C10YfQtdC90LjRjyDQsdGL0LvQsCDQstGL0L/QvtC70L3QtdC90LAuINCU0YDRg9Cz0LjQtSDQtNCy0LUg0L/QsNGA0Ysg0L7QsdGK0Y/RgdC90Y/RjtGCINC30LDQstC40YHQuNC80YPRjiDQv9C10YDQtdC80LXQvdC90YPRjiBlbmQg0LvQuNGI0Ywg0L3QsCAxLjI0JSDQuCAxLjUlLiDQkNC90LDQu9C+0LPQuNGH0L3QviDQvNC+0LbQvdC+INGB0LrQsNC30LDRgtGMINC4INC+INC60L7QvNCx0LjQvdCw0YbQuNC4INGB0YDQsNC30YMg0LLRgdC10YUg0YLRgNC10YUg0L/RgNC40LfQvdCw0LrQvtCyOiAyLjQ3JSwg0YfRgtC+INGE0LDQutGC0LjRh9C10YHQutC4INCz0L7QstC+0YDQuNGCINC+INC90LXQt9Cw0LLQuNGB0LjQvNC+0YHRgtC4INGD0YHQv9C10YjQvdC+0YHRgtC4INC70LXRh9C10L3QuNGPINC+0YIg0LzQtdGB0YLQsCDQu9C10YfQtdC90LjRjywg0LfQsNC90Y/RgtC+0YHRgtC4LCDQv9GA0LjQtdC80LAg0YPRgdC/0L7QutC+0LjRgtC10LvRjNC90YvRhSDQuNC70Lgg0LrQvtC80LHQuNC90LDRhtC40Lgg0Y3RgtC40YUg0L/RgNC40LfQvdCw0LrQvtCyINCyINC/0LDRgNC1INC40LvQuCDQtNCw0LbQtSDRgtGA0L7QudC60LUuIA0K