Projekt Ekonometria przestrzenna

library(htmltools)
library(sp)
library(spdep)
library(sf)
library(lmtest)
library(whitestrap)
library(spatialreg)
library(tmap)
library(tseries)
library(dplyr)
library(readxl)
library(knitr)

Wstęp

W ostatnich latach rynek nieruchomości w Polsce przechodzi dynamiczne zmiany, co stanowi istotny temat badań zarówno dla ekonomistów, urbanistów, jak i potencjalnych inwestorów. Ceny mieszkań są kluczowym wskaźnikiem gospodarczym, wpływającym na dostępność lokali mieszkalnych oraz na decyzje zakupowe konsumentów, a także decyzje inwestorów. W obszarach silnie zurbanizowanych oraz w ich pobliżu, ceny mieszkań są zazwyczaj wyższe. W niniejszym projekcie badawczym skupiamy się na analizie przestrzennej zmienności cen za 1 metr kwadratowy mieszkań w Polsce, z podziałem na poszczególne powiaty. Ceny mieszkań nie kształtują się równomiernie na terenie całego kraju.

Celem projektu jest zidentyfikowanie i zrozumienie czynników wpływających na różnice w cenach mieszkań w różnych częściach kraju. Zrozumienie tych różnic ma kluczowe znaczenie dla kształtowania polityki mieszkaniowej, planowania przestrzennego oraz dla deweloperów i inwestorów szukających optymalnych lokalizacji dla swoich przedsięwzięć.

Generowanie danych (jedynie przy pierwszym włączeniu kodu)

1.Wczytanie danych (jeżeli dane zostały już wcześniej wygenerowane)

Opis zmiennych

Zmienna objaśniana

CENA_1M2 - Średnia cena za 1 m2 lokali mieszkalnych sprzedanych w ramach transakcji rynkowych (zł)

Zmienne objaśniające

BEZR_REJ - Bezrobotni zarejestrowani pozostający bez pracy dłużej niż 1 rok [osoby]
ZAS_MIESZK - Zasoby mieszkaniowe
MALZENSTWA - Małżeństwa na 1000 ludności wg lokalizacji
UR_REJ - Stopa bezrobocia rejestrowanego
L_TRANS - Liczba transakcji kupna/sprzedaży lokali mieszkalnych
MIESZK_ODD - Mieszkania oddane do użytkowania
POZWOLENIA - Pozwolenia wydane na budowę mieszkań i zgłoszenia budowy z projektem budowlanym
WYNAGR - Przeciętne miesięczne wynagrodzenia brutto
WSK_DROGI - Drogi - wskaźniki [km/100km2]
L_ZGON - Liczba zgonów
TER_ZIEL - Tereny zieleni - liczba parków spacerowo-wypoczynkowych
L_PRZYST - Liczba czynnych przystanków autobusowych i tramwajowych
GEST_ZAL - Gęstość zaludnienia (liczba osób na 1 km ^2)

2.Dodanie sąsiedztwa I rzędu

Królowa
Królowa
queen1 <- poly2nb(powiaty, queen = TRUE)
Wqueen1 <- nb2listw(queen1)

3.Utworzenie mapy sąsiedztwa

coords <- coordinates(as(powiaty, "Spatial"))
plot(st_geometry(powiaty), border="grey", col = "light blue",asp=1.4)
plot(queen1, coords, add=TRUE)
title("Mapa sąsiedztwa powiatów w Polsce")

4.Utworzenie heatmapy

tmap_options(check.and.fix = TRUE)
tm_shape(powiaty) + 
  tm_fill("CENA_1M", title = "Cena za metr kwadratowy", palette = "YlOrRd",breaks = c(0,2000,3000,4000,5000,6000,7000,Inf), legend.show = TRUE) +
  tm_layout(main.title = "Mapa cieplna cen za metr mieszkań")

5. Test Morana - Statystyki lokalne i globalne.

Badamy stopień intensywności danej cechy w obiektach przestrzennych.

moran.test(powiaty$CENA_1M, Wqueen1)
## 
##  Moran I test under randomisation
## 
## data:  powiaty$CENA_1M  
## weights: Wqueen1    
## 
## Moran I statistic standard deviate = 9.987, p-value < 2.2e-16
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic       Expectation          Variance 
##       0.337563495      -0.002638522       0.001160397
#Statustyka morana = 0.345
# p-value < alfa
moran.plot(powiaty$CENA_1M, listw = Wqueen1)

#Statystyka lokalna
lisa = localmoran(powiaty$CENA_1M, Wqueen1)
summary(lisa)
##        Ii                E.Ii                Var.Ii             Z.Ii        
##  Min.   :-2.26662   Min.   :-1.447e-02   Min.   :0.00000   Min.   :-2.7168  
##  1st Qu.:-0.01517   1st Qu.:-3.335e-03   1st Qu.:0.01853   1st Qu.:-0.1091  
##  Median : 0.11300   Median :-1.143e-03   Median :0.08764   Median : 0.6517  
##  Mean   : 0.33756   Mean   :-2.639e-03   Mean   :0.31999   Mean   : 0.6007  
##  3rd Qu.: 0.46025   3rd Qu.:-2.658e-04   3rd Qu.:0.30376   3rd Qu.: 1.3415  
##  Max.   : 5.02424   Max.   :-1.000e-09   Max.   :4.97258   Max.   : 4.9706  
##  Pr(z != E(Ii))     
##  Min.   :0.0000007  
##  1st Qu.:0.1415508  
##  Median :0.3526931  
##  Mean   :0.4052572  
##  3rd Qu.:0.6506720  
##  Max.   :0.9988542

I. ćwiartka -> zależności High-High, III. Ćwiartka -> zależności Low-Low Statystyka morana = 0.338 P-value=2.2e-16 < alfa = 0,05, więc odrzucamy H0 na korzyść hipotezy alternatywnej, mówiącej o występowaniu zależności przestrzennych wśród cen mieszkań pomiędzy powiatami.

6. Dodanie logarytmów i utworzenie modelu OLS - liniowego modelu potęgowego

Raport modelu z gretla
Model ze zmiennymi: Gestość zaludnienia, wynagrodzenia, zasoby mieszkaniowe(liczba mieszkań) Eliminacji zmiennych dokonaliśmy na podstawie prób i testów modeli w programie GRETL.

powiaty <- powiaty %>%
mutate(WYNAGR = ifelse(JPT_KOD_J == "2467", 5345.45, WYNAGR))

OLS <- lm(log(powiaty$CENA_1M) ~ log(powiaty$GEST_ZA) + log(powiaty$WYNAGR) + log(powiaty$ZAS_MIE), data=powiaty)
OLS
## 
## Call:
## lm(formula = log(powiaty$CENA_1M) ~ log(powiaty$GEST_ZA) + log(powiaty$WYNAGR) + 
##     log(powiaty$ZAS_MIE), data = powiaty)
## 
## Coefficients:
##          (Intercept)  log(powiaty$GEST_ZA)   log(powiaty$WYNAGR)  
##              4.38485               0.03895               0.30340  
## log(powiaty$ZAS_MIE)  
##              0.12006
res = residuals(OLS)

7. Test Morana - Wybór modelu regresji przestrzennej

#Poukładana wersja Moran Test

lm.morantest(OLS, listw=Wqueen1)
## 
##  Global Moran I for regression residuals
## 
## data:  
## model: lm(formula = log(powiaty$CENA_1M) ~ log(powiaty$GEST_ZA) +
## log(powiaty$WYNAGR) + log(powiaty$ZAS_MIE), data = powiaty)
## weights: Wqueen1
## 
## Moran I statistic standard deviate = 8.0868, p-value = 3.061e-16
## alternative hypothesis: greater
## sample estimates:
## Observed Moran I      Expectation         Variance 
##      0.269991597     -0.004434827      0.001151578
moran.plot(res, listw=Wqueen1)

lm.LMtests(OLS, listw=Wqueen1, test="all")
## 
##  Rao's score (a.k.a Lagrange multiplier) diagnostics for spatial
##  dependence
## 
## data:  
## model: lm(formula = log(powiaty$CENA_1M) ~ log(powiaty$GEST_ZA) +
## log(powiaty$WYNAGR) + log(powiaty$ZAS_MIE), data = powiaty)
## test weights: listw
## 
## RSerr = 62.006, df = 1, p-value = 3.442e-15
## 
## 
##  Rao's score (a.k.a Lagrange multiplier) diagnostics for spatial
##  dependence
## 
## data:  
## model: lm(formula = log(powiaty$CENA_1M) ~ log(powiaty$GEST_ZA) +
## log(powiaty$WYNAGR) + log(powiaty$ZAS_MIE), data = powiaty)
## test weights: listw
## 
## RSlag = 53.905, df = 1, p-value = 2.104e-13
## 
## 
##  Rao's score (a.k.a Lagrange multiplier) diagnostics for spatial
##  dependence
## 
## data:  
## model: lm(formula = log(powiaty$CENA_1M) ~ log(powiaty$GEST_ZA) +
## log(powiaty$WYNAGR) + log(powiaty$ZAS_MIE), data = powiaty)
## test weights: listw
## 
## adjRSerr = 8.9288, df = 1, p-value = 0.002807
## 
## 
##  Rao's score (a.k.a Lagrange multiplier) diagnostics for spatial
##  dependence
## 
## data:  
## model: lm(formula = log(powiaty$CENA_1M) ~ log(powiaty$GEST_ZA) +
## log(powiaty$WYNAGR) + log(powiaty$ZAS_MIE), data = powiaty)
## test weights: listw
## 
## adjRSlag = 0.82762, df = 1, p-value = 0.363
## 
## 
##  Rao's score (a.k.a Lagrange multiplier) diagnostics for spatial
##  dependence
## 
## data:  
## model: lm(formula = log(powiaty$CENA_1M) ~ log(powiaty$GEST_ZA) +
## log(powiaty$WYNAGR) + log(powiaty$ZAS_MIE), data = powiaty)
## test weights: listw
## 
## SARMA = 62.834, df = 2, p-value = 2.265e-14
columbus.lagrange <- lm.LMtests(OLS, listw=Wqueen1, test=c("LMerr","RLMerr","LMlag","RLMlag","SARMA"))
summary(columbus.lagrange)
##  Rao's score (a.k.a Lagrange multiplier) diagnostics for spatial
##  dependence
## data:  
## model: lm(formula = log(powiaty$CENA_1M) ~ log(powiaty$GEST_ZA) +
## log(powiaty$WYNAGR) + log(powiaty$ZAS_MIE), data = powiaty)
## test weights: listw
##  
##          statistic parameter   p.value    
## RSerr     62.00621         1 3.442e-15 ***
## adjRSerr   8.92881         1  0.002807 ** 
## RSlag     53.90502         1 2.104e-13 ***
## adjRSlag   0.82762         1  0.362962    
## SARMA     62.83383         2 2.265e-14 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Test Morana - H0: brak zależności przestrzennej p-value blieskie 0 < alfa -> występuje zależność przestrzenna
I para:
RSerr - dotyczy modelu SEM ;
H0 - wybieramy OLS. Dodanie przestrzennego błędu nic nie wnosi ;
H1: wybieramy SEM, wprowadzamy reg. przestrzenna <-
RSlag - dotyczy modelu SAR ;
H0 - wybieramy OLS. Dodanie przestrzennego błędu nic nie wnosi;
H1: wybieramy SAR, wprowadzamy reg. przestrzenna W obu odrzucamy H0, <-
żeby wybrać model, patrzymy na drugą parę.

II para:
adjRSerr - p-value<alfa, odrzucamy H0
adjRSlag - p-value>alfa, brak podstaw do odrzucenia H0.

Na podstawie drugiej miary wybieramy model SEM.

SARMA - połaczenie modeli, bardzo małe p-value to jest najlepsza opcja.

8.1. Durbin - model wspólnego czynnika

DURBIN <- lagsarlm(log(powiaty$CENA_1M) ~ log(powiaty$GEST_ZA) + log(powiaty$WYNAGR) + log(powiaty$ZAS_MIE), data=powiaty, listw=Wqueen1, type="mixed");
summary(DURBIN)
## 
## Call:lagsarlm(formula = log(powiaty$CENA_1M) ~ log(powiaty$GEST_ZA) + 
##     log(powiaty$WYNAGR) + log(powiaty$ZAS_MIE), data = powiaty, 
##     listw = Wqueen1, type = "mixed")
## 
## Residuals:
##        Min         1Q     Median         3Q        Max 
## -0.4260211 -0.1028220  0.0050804  0.0959232  0.6214819 
## 
## Type: mixed 
## Coefficients: (asymptotic standard errors) 
##                           Estimate Std. Error z value  Pr(>|z|)
## (Intercept)               1.256654   1.278964  0.9826  0.325826
## log(powiaty$GEST_ZA)      0.057553   0.010088  5.7051 1.163e-08
## log(powiaty$WYNAGR)       0.207686   0.101205  2.0521  0.040157
## log(powiaty$ZAS_MIE)      0.088895   0.017999  4.9389 7.855e-07
## lag.log(powiaty$GEST_ZA) -0.088120   0.018034 -4.8864 1.027e-06
## lag.log(powiaty$WYNAGR)   0.016740   0.168098  0.0996  0.920671
## lag.log(powiaty$ZAS_MIE)  0.093449   0.035966  2.5983  0.009369
## 
## Rho: 0.41411, LR test value: 43.477, p-value: 4.29e-11
## Asymptotic standard error: 0.062287
##     z-value: 6.6484, p-value: 2.9623e-11
## Wald statistic: 44.202, p-value: 2.9623e-11
## 
## Log likelihood: 144.1586 for mixed model
## ML residual variance (sigma squared): 0.026469, (sigma: 0.16269)
## Number of observations: 380 
## Number of parameters estimated: 9 
## AIC: -270.32, (AIC for lm: -228.84)
## LM test for residual autocorrelation
## test value: 13.595, p-value: 0.00022676
SCM2 <- lagsarlm(log(powiaty$CENA_1M) ~ log(powiaty$GEST_ZA) + log(powiaty$WYNAGR) + log(powiaty$ZAS_MIE), data=powiaty, listw=Wqueen1, Durbin = ~log(powiaty$ZAS_MIE)+
                log(powiaty$GEST_ZA));
summary(SCM2)
## 
## Call:lagsarlm(formula = log(powiaty$CENA_1M) ~ log(powiaty$GEST_ZA) + 
##     log(powiaty$WYNAGR) + log(powiaty$ZAS_MIE), data = powiaty, 
##     listw = Wqueen1, Durbin = ~log(powiaty$ZAS_MIE) + log(powiaty$GEST_ZA))
## 
## Residuals:
##        Min         1Q     Median         3Q        Max 
## -0.4260160 -0.1022567  0.0055942  0.0957840  0.6223171 
## 
## Type: mixed 
## Coefficients: (asymptotic standard errors) 
##                            Estimate Std. Error z value  Pr(>|z|)
## (Intercept)               1.3534254  0.8323450  1.6260  0.103941
## log(powiaty$GEST_ZA)      0.0573568  0.0098622  5.8158 6.034e-09
## log(powiaty$WYNAGR)       0.2120192  0.0913373  2.3213  0.020272
## log(powiaty$ZAS_MIE)      0.0888738  0.0179977  4.9381 7.890e-07
## lag.log(powiaty$ZAS_MIE)  0.0935208  0.0359411  2.6021  0.009267
## lag.log(powiaty$GEST_ZA) -0.0874753  0.0168519 -5.1908 2.094e-07
## 
## Rho: 0.41506, LR test value: 44.877, p-value: 2.098e-11
## Asymptotic standard error: 0.061656
##     z-value: 6.7319, p-value: 1.6748e-11
## Wald statistic: 45.318, p-value: 1.6748e-11
## 
## Log likelihood: 144.1537 for mixed model
## ML residual variance (sigma squared): 0.026465, (sigma: 0.16268)
## Number of observations: 380 
## Number of parameters estimated: 8 
## AIC: -272.31, (AIC for lm: -229.43)
## LM test for residual autocorrelation
## test value: 10.785, p-value: 0.001023

8.2. SARMA - model mieszany SAR+SMA

SARMA<- sacsarlm(log(powiaty$CENA_1M) ~ log(powiaty$GEST_ZA) + log(powiaty$WYNAGR) + log(powiaty$ZAS_MIE), data=powiaty, listw=Wqueen1)
summary(SARMA)
## 
## Call:sacsarlm(formula = log(powiaty$CENA_1M) ~ log(powiaty$GEST_ZA) + 
##     log(powiaty$WYNAGR) + log(powiaty$ZAS_MIE), data = powiaty, 
##     listw = Wqueen1)
## 
## Residuals:
##        Min         1Q     Median         3Q        Max 
## -0.4167510 -0.0942371  0.0034049  0.0909543  0.5358800 
## 
## Type: sac 
## Coefficients: (asymptotic standard errors) 
##                       Estimate Std. Error z value  Pr(>|z|)
## (Intercept)          7.9420341  1.3074681  6.0744 1.245e-09
## log(powiaty$GEST_ZA) 0.0657181  0.0092633  7.0945 1.298e-12
## log(powiaty$WYNAGR)  0.2690093  0.0960455  2.8009  0.005097
## log(powiaty$ZAS_MIE) 0.0733567  0.0167245  4.3862 1.154e-05
## 
## Rho: -0.34495
## Asymptotic standard error: 0.12021
##     z-value: -2.8696, p-value: 0.00411
## Lambda: 0.7139
## Asymptotic standard error: 0.070467
##     z-value: 10.131, p-value: < 2.22e-16
## 
## LR test value: 58.888, p-value: 1.6309e-13
## 
## Log likelihood: 138.4168 for sac model
## ML residual variance (sigma squared): 0.024461, (sigma: 0.1564)
## Number of observations: 380 
## Number of parameters estimated: 7 
## AIC: -262.83, (AIC for lm: -207.95)

9. Decyzja

Model DURBINA ma najmniejsze kryt. informacyjne AKAIKE i dlatego wybieramy go, pomimo, że model SARMA też ma dobre statystyki.

10. Model Durbina - interpretacje

Współczynniki:

log(powiaty$GEST_ZA): 0.057 (p < 0.0001)

Wzrost gęstości zaludnienia o 1% powoduje wzrost ceny mieszkań o około 0.057%. Ten współczynnik jest dodatni i bardzo istotny, co wskazuje na silny wpływ gestacji(zagęsczenia ludności) na ceny mieszkań.

log(powiaty$WYNAGR): 0.212 (p = 0.020)

Wzrost wynagrodzeń o 1% prowadzi do wzrostu ceny mieszkań o około 0.212%. Współczynnik ten jest pozytywny i istotny, co oznacza, że wyższe wynagrodzenia są związane z wyższymi cenami mieszkań.

log(powiaty$ZAS_MIE): 0.089 (p < 0.0001)

Wzrost zasobów mieszkaniowych o 1% powoduje wzrost ceny mieszkań o około 0.089%. Ten współczynnik jest dodatni i bardzo istotny, co wskazuje, że większa dostępność mieszkań (zasobów mieskzaniowych) przyczynia się do wzrostu cen mieszkań.

Współczynniki Opóźnień Przestrzennych.

lag.log(powiaty$ZAS_MIE): 0.094 (p = 0.009)

Przestrzenne opóźnienie zasobów mieszkaniowych o 1% powoduje wzrost ceny mieszkań o około 0.094%. Współczynnik ten jest dodatni i istotny, co sugeruje, że ceny mieszkań są pozytywnie skorelowane z liczbą zasobów mieszkaniowych w sąsiednich powiatach.

lag.log(powiaty$GEST_ZA): -0.087 (p < 0.0001)

Przestrzenne opóźnienie gęstości zaludnienia o 1% powoduje spadek ceny mieszkań o około 0.087%. Ten współczynnik jest negatywny i bardzo istotny, co wskazuje, że wyższe zagęszczenie ludności w sąsiednich powiatach ma negatywny wpływ na ceny mieszkań.

LS0tDQp0aXRsZTogIlByb2pla3QgRWtvbm9tZXRyaWEgcHJ6ZXN0cnplbm5hIg0KZGF0ZTogIjIwMjQtMDYtMDgiDQphdXRob3I6ICJNYXRldXN6IFN1cm93aWVjLCBBZ2F0YSBNaWNoYWxza2EsIE1pY2hhxYIgS3XFum5pZXdza2kiDQpvdXRwdXQ6DQogIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOg0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIHRvY19kZXB0aDogNA0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KDQoNCi0tLQ0KDQpgYGB7ciwgZWNobz1GQUxTRSxpbmNsdWRlPUZBTFNFLCByZXN1bHRzID0gJ2hpZGUnfQ0Kb3B0aW9ucyhyZXBvcyA9IGxpc3QoQ1JBTj0iaHR0cDovL2NyYW4ucnN0dWRpby5jb20vIikpDQppbnN0YWxsLnBhY2thZ2VzKCJ3aGl0ZXN0cmFwIikNCmluc3RhbGwucGFja2FnZXMoInNwYXRpYWxyZWciKSANCmluc3RhbGwucGFja2FnZXMoInRtYXAiKSANCmluc3RhbGwucGFja2FnZXMoInNwZGVwIikNCmluc3RhbGwucGFja2FnZXMoInNmIikNCmluc3RhbGwucGFja2FnZXMoImxtdGVzdCIpDQppbnN0YWxsLnBhY2thZ2VzKCJ0c2VyaWVzIikNCmluc3RhbGwucGFja2FnZXMoImV4cG0iKQ0KaW5zdGFsbC5wYWNrYWdlcygicmVhZHhsIikNCmluc3RhbGwucGFja2FnZXMoInJtYXJrZG93biIpDQpgYGANCg0KYGBge3IgxYFhZG93YW5pZSBwYWtpZXTDs3csIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHMgPSAnaGlkZSd9DQpsaWJyYXJ5KGh0bWx0b29scykNCmxpYnJhcnkoc3ApDQpsaWJyYXJ5KHNwZGVwKQ0KbGlicmFyeShzZikNCmxpYnJhcnkobG10ZXN0KQ0KbGlicmFyeSh3aGl0ZXN0cmFwKQ0KbGlicmFyeShzcGF0aWFscmVnKQ0KbGlicmFyeSh0bWFwKQ0KbGlicmFyeSh0c2VyaWVzKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShrbml0cikNCmBgYA0KIyBXc3TEmXANCg0KVyBvc3RhdG5pY2ggbGF0YWNoIHJ5bmVrIG5pZXJ1Y2hvbW/Fm2NpIHcgUG9sc2NlIHByemVjaG9kemkgZHluYW1pY3puZSB6bWlhbnksIGNvIHN0YW5vd2kgaXN0b3RueSB0ZW1hdCBiYWRhxYQgemFyw7N3bm8gZGxhIGVrb25vbWlzdMOzdywgdXJiYW5pc3TDs3csIGphayBpIHBvdGVuY2phbG55Y2ggaW53ZXN0b3LDs3cuIENlbnkgbWllc3prYcWEIHPEhSBrbHVjem93eW0gd3NrYcW6bmlraWVtIGdvc3BvZGFyY3p5bSwgd3DFgnl3YWrEhWN5bSBuYSBkb3N0xJlwbm/Fm8SHIGxva2FsaSBtaWVzemthbG55Y2ggb3JheiBuYSBkZWN5emplIHpha3Vwb3dlIGtvbnN1bWVudMOzdywgYSB0YWvFvGUgZGVjeXpqZSBpbndlc3RvcsOzdy4gVyBvYnN6YXJhY2ggc2lsbmllIHp1cmJhbml6b3dhbnljaCBvcmF6IHcgaWNoIHBvYmxpxbx1LCBjZW55IG1pZXN6a2HFhCBzxIUgemF6d3ljemFqIHd5xbxzemUuDQpXIG5pbmllanN6eW0gcHJvamVrY2llIGJhZGF3Y3p5bSBza3VwaWFteSBzacSZIG5hIGFuYWxpemllIHByemVzdHJ6ZW5uZWogem1pZW5ub8WbY2kgY2VuIHphIDEgbWV0ciBrd2FkcmF0b3d5IG1pZXN6a2HFhCB3IFBvbHNjZSwgeiBwb2R6aWHFgmVtIG5hIHBvc3pjemVnw7NsbmUgcG93aWF0eS4gQ2VueSBtaWVzemthxYQgbmllIGtzenRhxYJ0dWrEhSBzacSZIHLDs3dub21pZXJuaWUgbmEgdGVyZW5pZSBjYcWCZWdvIGtyYWp1LiANCg0KQ2VsZW0gcHJvamVrdHUgamVzdCB6aWRlbnR5Zmlrb3dhbmllIGkgenJvenVtaWVuaWUgY3p5bm5pa8OzdyB3cMWCeXdhasSFY3ljaCBuYSByw7PFvG5pY2UgdyBjZW5hY2ggbWllc3prYcWEIHcgcsOzxbxueWNoIGN6xJnFm2NpYWNoIGtyYWp1LiBacm96dW1pZW5pZSB0eWNoIHLDs8W8bmljIG1hIGtsdWN6b3dlIHpuYWN6ZW5pZSBkbGEga3N6dGHFgnRvd2FuaWEgcG9saXR5a2kgbWllc3prYW5pb3dlaiwgcGxhbm93YW5pYSBwcnplc3RyemVubmVnbyBvcmF6IGRsYSBkZXdlbG9wZXLDs3cgaSBpbndlc3RvcsOzdyBzenVrYWrEhWN5Y2ggb3B0eW1hbG55Y2ggbG9rYWxpemFjamkgZGxhIHN3b2ljaCBwcnplZHNpxJl3emnEmcSHLg0KDQojIEdlbmVyb3dhbmllIGRhbnljaCAoamVkeW5pZSBwcnp5IHBpZXJ3c3p5bSB3xYLEhWN6ZW5pdSBrb2R1KQ0KDQpgYGB7ciBHZW5lcm93YW5pZSBkYW55Y2gsIGV2YWw9RkFMU0UsIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1UUlVFLCBpbmNsdWRlPUZBTFNFfQ0Kc2V0d2QoIkM6L1VzZXJzL21pY2hhL09uZURyaXZlL1B1bHBpdC9TdHVkaWEvUHJvamVrdCBFa29ub21ldHJpYSBwcnplc3RyemVubmEiKQ0KZGF0YSA8LSBzdF9yZWFkKCJBMDJfR3JhbmljZV9wb3dpYXRvdy5zaHAiKSANCmhlYWQoZGF0YSkNCg0KZGF0YXNldCA8LSByZWFkeGw6OnJlYWRfZXhjZWwoIkRhdGFzZXRfcHJval8yLnhsc3giKQ0KI2RhdGFzZXQgPC0gcmVhZHhsOjpyZWFkX2V4Y2VsKCJEYXRhc2V0X3Byb2pfdjIueGxzeCIpDQpoZWFkKGRhdGFzZXQpDQoNCnBvd2lhdHkgPC0gbGVmdF9qb2luKGRhdGEsZGF0YXNldCwgYnk9YygiSlBUX0tPRF9KRSI9IklEIikpDQojcG93aWF0eSA8LSByaWdodF9qb2luKGRhdGEsZGF0YXNldDIsIGJ5PWMoIkpQVF9LT0RfSkUiPSJJRCIpKQ0KDQpzdHIocG93aWF0eSkNCnN0X3dyaXRlKHBvd2lhdHksICJwb3dpYXR5X2RhbmUuc2hwIikNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQojIDEuV2N6eXRhbmllIGRhbnljaCAoamXFvGVsaSBkYW5lIHpvc3RhxYJ5IGp1xbwgd2N6ZcWbbmllaiB3eWdlbmVyb3dhbmUpIA0KDQpgYGB7ciBXY3p5dGFuaWUgZGFueWNoLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHMgPSAnaGlkZSd9DQpzZXR3ZCgiQzovVXNlcnMvbWljaGEvT25lRHJpdmUvUHVscGl0L1N0dWRpYS9Qcm9qZWt0IEVrb25vbWV0cmlhIHByemVzdHJ6ZW5uYSIpDQpwb3dpYXR5IDwtIHN0X3JlYWQoInBvd2lhdHlfZGFuZS5zaHAiKQ0KICNwb3dpYXR5IDwtIHN0X3JlYWQoIkM6L1VzZXJzL01hdGV1c3ovRGVza3RvcC9TZW1lc3RyIDIgKElJIHN0LikvRWtvbm9tZXRyaWEgI3ByemVzdHJ6ZW5uYS9Qcm9qZWt0L0Jlel9vdXRsaWVyw7N3L3Bvd2lhdHlfZGFuZS5zaHAiKQ0KaGVhZChwb3dpYXR5KQ0Kc3RyKHBvd2lhdHkpDQpwb3dpYXR5JENFTkFfMU08LWFzLm51bWVyaWMocG93aWF0eSRDRU5BXzFNKQ0KcG93aWF0eSRXWU5BR1I8LWFzLm51bWVyaWMocG93aWF0eSRXWU5BR1IpDQpwb3dpYXR5JExfWkdPTjwtYXMubnVtZXJpYyhwb3dpYXR5JExfWkdPTikNCnBvd2lhdHkkQkVaUl9SRTwtYXMubnVtZXJpYyhwb3dpYXR5JEJFWlJfUkUpDQpwb3dpYXR5JFpBU19NSUU8LWFzLm51bWVyaWMocG93aWF0eSRaQVNfTUlFKQ0KYGBgDQojIyBPcGlzIHptaWVubnljaA0KDQojIyMgWm1pZW5uYSBvYmphxZtuaWFuYQ0KQ0VOQV8xTTIgLSDFmnJlZG5pYSBjZW5hIHphIDEgbTIgbG9rYWxpIG1pZXN6a2FsbnljaCBzcHJ6ZWRhbnljaCB3IHJhbWFjaCB0cmFuc2FrY2ppIHJ5bmtvd3ljaCAoesWCKQ0KDQojIyMgWm1pZW5uZSBvYmphxZtuaWFqxIVjZSAgICANCkJFWlJfUkVKIC0gQmV6cm9ib3RuaSB6YXJlamVzdHJvd2FuaSBwb3pvc3RhasSFY3kgYmV6IHByYWN5IGTFgnXFvGVqIG5pxbwgMSByb2sgW29zb2J5XSAgIA0KWkFTX01JRVNaSyAtIFphc29ieSBtaWVzemthbmlvd2UgICAgDQpNQUxaRU5TVFdBIC0gTWHFgsW8ZcWEc3R3YSBuYSAxMDAwIGx1ZG5vxZtjaSB3ZyBsb2thbGl6YWNqaSAgIA0KVVJfUkVKIC0gU3RvcGEgYmV6cm9ib2NpYSByZWplc3Ryb3dhbmVnbyAgICANCkxfVFJBTlMgLSBMaWN6YmEgdHJhbnNha2NqaSBrdXBuYS9zcHJ6ZWRhxbx5IGxva2FsaSBtaWVzemthbG55Y2ggICANCk1JRVNaS19PREQgLSBNaWVzemthbmlhIG9kZGFuZSBkbyB1xbx5dGtvd2FuaWEgICANClBPWldPTEVOSUEgLSBQb3p3b2xlbmlhIHd5ZGFuZSBuYSBidWRvd8SZIG1pZXN6a2HFhCBpIHpnxYJvc3plbmlhIGJ1ZG93eSB6IHByb2pla3RlbSBidWRvd2xhbnltICAgIA0KV1lOQUdSIC0gUHJ6ZWNpxJl0bmUgbWllc2nEmWN6bmUgd3luYWdyb2R6ZW5pYSBicnV0dG8gICANCldTS19EUk9HSSAtIERyb2dpIC0gd3NrYcW6bmlraSBba20vMTAwa20yXSAgIA0KTF9aR09OIC0gTGljemJhIHpnb27Ds3cgICAgDQpURVJfWklFTCAtIFRlcmVueSB6aWVsZW5pIC0gbGljemJhIHBhcmvDs3cgc3BhY2Vyb3dvLXd5cG9jenlua293eWNoICAgICAgDQpMX1BSWllTVCAtIExpY3piYSBjenlubnljaCBwcnp5c3RhbmvDs3cgYXV0b2J1c293eWNoIGkgdHJhbXdham93eWNoICAgIA0KR0VTVF9aQUwgLSBHxJlzdG/Fm8SHIHphbHVkbmllbmlhIChsaWN6YmEgb3PDs2IgbmEgMSBrbSBeMikNCg0KIyAyLkRvZGFuaWUgc8SFc2llZHp0d2EgSSByesSZZHUNCg0KIVtLcsOzbG93YV0oQzovVXNlcnMvbWljaGEvT25lRHJpdmUvUHVscGl0L1N0dWRpYS9MaWdodFF1ZWVuLndlYnApDQogICAgDQoNCmBgYHtyIERvZGFuaWUgc8SFc2llZHp0d2EgSSByesSZZHUsIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnF1ZWVuMSA8LSBwb2x5Mm5iKHBvd2lhdHksIHF1ZWVuID0gVFJVRSkNCldxdWVlbjEgPC0gbmIybGlzdHcocXVlZW4xKQ0KDQpgYGANCg0KIyAzLlV0d29yemVuaWUgbWFweSBzxIVzaWVkenR3YQ0KDQpgYGB7ciBNYXBhIHNhc2llZHp0d2EsIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmNvb3JkcyA8LSBjb29yZGluYXRlcyhhcyhwb3dpYXR5LCAiU3BhdGlhbCIpKQ0KcGxvdChzdF9nZW9tZXRyeShwb3dpYXR5KSwgYm9yZGVyPSJncmV5IiwgY29sID0gImxpZ2h0IGJsdWUiLGFzcD0xLjQpDQpwbG90KHF1ZWVuMSwgY29vcmRzLCBhZGQ9VFJVRSkNCnRpdGxlKCJNYXBhIHPEhXNpZWR6dHdhIHBvd2lhdMOzdyB3IFBvbHNjZSIpDQpgYGANCg0KIyA0LlV0d29yemVuaWUgaGVhdG1hcHkNCg0KYGBge3IgSGVhdG1hcCwgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KdG1hcF9vcHRpb25zKGNoZWNrLmFuZC5maXggPSBUUlVFKQ0KdG1fc2hhcGUocG93aWF0eSkgKyANCiAgdG1fZmlsbCgiQ0VOQV8xTSIsIHRpdGxlID0gIkNlbmEgemEgbWV0ciBrd2FkcmF0b3d5IiwgcGFsZXR0ZSA9ICJZbE9yUmQiLGJyZWFrcyA9IGMoMCwyMDAwLDMwMDAsNDAwMCw1MDAwLDYwMDAsNzAwMCxJbmYpLCBsZWdlbmQuc2hvdyA9IFRSVUUpICsNCiAgdG1fbGF5b3V0KG1haW4udGl0bGUgPSAiTWFwYSBjaWVwbG5hIGNlbiB6YSBtZXRyIG1pZXN6a2HFhCIpDQoNCg0KYGBgDQoNCiMgNS4gVGVzdCBNb3JhbmEgLSBTdGF0eXN0eWtpIGxva2FsbmUgaSBnbG9iYWxuZS4gDQpCYWRhbXkgc3RvcGllxYQgaW50ZW5zeXdub8WbY2kgZGFuZWogY2VjaHkgdyBvYmlla3RhY2ggcHJ6ZXN0cnplbm55Y2guDQoNCmBgYHtyIHN0YXQuIGxva2FsbmUgaSBnbG9iYWxuZSwgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQptb3Jhbi50ZXN0KHBvd2lhdHkkQ0VOQV8xTSwgV3F1ZWVuMSkNCiNTdGF0dXN0eWthIG1vcmFuYSA9IDAuMzQ1DQojIHAtdmFsdWUgPCBhbGZhDQptb3Jhbi5wbG90KHBvd2lhdHkkQ0VOQV8xTSwgbGlzdHcgPSBXcXVlZW4xKQ0KDQojU3RhdHlzdHlrYSBsb2thbG5hDQpsaXNhID0gbG9jYWxtb3Jhbihwb3dpYXR5JENFTkFfMU0sIFdxdWVlbjEpDQpzdW1tYXJ5KGxpc2EpDQoNCg0KYGBgDQoNCkkuIMSHd2lhcnRrYSAtPiB6YWxlxbxub8WbY2kgSGlnaC1IaWdoLCBJSUkuIMSGd2lhcnRrYSAtPiB6YWxlxbxub8WbY2kgTG93LUxvdw0KU3RhdHlzdHlrYSBtb3JhbmEgPSAwLjMzOCBQLXZhbHVlPTIuMmUtMTYgPCBhbGZhID0gMCwwNSwgd2nEmWMgb2RyenVjYW15IEgwIG5hIGtvcnp5xZvEhyBoaXBvdGV6eSBhbHRlcm5hdHl3bmVqLCBtw7N3acSFY2VqIG8gd3lzdMSZcG93YW5pdSB6YWxlxbxub8WbY2kgcHJ6ZXN0cnplbm55Y2ggd8WbcsOzZCBjZW4gbWllc3prYcWEIHBvbWnEmWR6eSBwb3dpYXRhbWkuDQoNCiMgNi4gRG9kYW5pZSBsb2dhcnl0bcOzdyBpIHV0d29yemVuaWUgbW9kZWx1IE9MUyAtIGxpbmlvd2VnbyBtb2RlbHUgcG90xJlnb3dlZ28gDQoNCiFbUmFwb3J0IG1vZGVsdSB6IGdyZXRsYV0oQzovVXNlcnMvbWljaGEvT25lRHJpdmUvUHVscGl0L1N0dWRpYS9tb2RlbF9ncmV0bC5wbmcpICAgIA0KTW9kZWwgemUgem1pZW5ueW1pOiBHZXN0b8WbxIcgemFsdWRuaWVuaWEsIHd5bmFncm9kemVuaWEsIHphc29ieSBtaWVzemthbmlvd2UobGljemJhIG1pZXN6a2HFhCkgRWxpbWluYWNqaSB6bWllbm55Y2ggZG9rb25hbGnFm215IG5hIHBvZHN0YXdpZSBwcsOzYiBpIHRlc3TDs3cgbW9kZWxpIHcgcHJvZ3JhbWllIEdSRVRMLg0KDQpgYGB7ciBtb2RlbCBPTFMsIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KcG93aWF0eSA8LSBwb3dpYXR5ICU+JQ0KbXV0YXRlKFdZTkFHUiA9IGlmZWxzZShKUFRfS09EX0ogPT0gIjI0NjciLCA1MzQ1LjQ1LCBXWU5BR1IpKQ0KDQpPTFMgPC0gbG0obG9nKHBvd2lhdHkkQ0VOQV8xTSkgfiBsb2cocG93aWF0eSRHRVNUX1pBKSArIGxvZyhwb3dpYXR5JFdZTkFHUikgKyBsb2cocG93aWF0eSRaQVNfTUlFKSwgZGF0YT1wb3dpYXR5KQ0KT0xTDQoNCnJlcyA9IHJlc2lkdWFscyhPTFMpDQpgYGANCg0KIyA3LiBUZXN0IE1vcmFuYSAtIFd5YsOzciBtb2RlbHUgcmVncmVzamkgcHJ6ZXN0cnplbm5lag0KDQpgYGB7ciBtb3JhbiB0ZXN0LCBlY2hvPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojUG91a8WCYWRhbmEgd2Vyc2phIE1vcmFuIFRlc3QNCg0KbG0ubW9yYW50ZXN0KE9MUywgbGlzdHc9V3F1ZWVuMSkNCm1vcmFuLnBsb3QocmVzLCBsaXN0dz1XcXVlZW4xKQ0KbG0uTE10ZXN0cyhPTFMsIGxpc3R3PVdxdWVlbjEsIHRlc3Q9ImFsbCIpDQpjb2x1bWJ1cy5sYWdyYW5nZSA8LSBsbS5MTXRlc3RzKE9MUywgbGlzdHc9V3F1ZWVuMSwgdGVzdD1jKCJMTWVyciIsIlJMTWVyciIsIkxNbGFnIiwiUkxNbGFnIiwiU0FSTUEiKSkNCnN1bW1hcnkoY29sdW1idXMubGFncmFuZ2UpDQpgYGANClRlc3QgTW9yYW5hIC0gSDA6IGJyYWsgemFsZcW8bm/Fm2NpIHByemVzdHJ6ZW5uZWogcC12YWx1ZSBibGllc2tpZSAwIDwgYWxmYSAtPiB3eXN0xJlwdWplIHphbGXFvG5vxZvEhyBwcnplc3RyemVubmEgICAgDQpJIHBhcmE6ICAgDQpSU2VyciAtIGRvdHljenkgbW9kZWx1IFNFTSA7ICAgICAgICANCkgwIC0gd3liaWVyYW15IE9MUy4gRG9kYW5pZSBwcnplc3RyemVubmVnbyBixYLEmWR1IG5pYyBuaWUgd25vc2kgOyAgICAgICANCkgxOiB3eWJpZXJhbXkgU0VNLCB3cHJvd2FkemFteSByZWcuIHByemVzdHJ6ZW5uYSA8LSAgIA0KUlNsYWcgLSBkb3R5Y3p5IG1vZGVsdSBTQVIgOyAgICANCkgwIC0gd3liaWVyYW15IE9MUy4gRG9kYW5pZSBwcnplc3RyemVubmVnbyBixYLEmWR1IG5pYyBuaWUgd25vc2k7ICAgIA0KSDE6IHd5YmllcmFteSBTQVIsIHdwcm93YWR6YW15IHJlZy4gcHJ6ZXN0cnplbm5hIFcgb2J1IG9kcnp1Y2FteSBIMCwgPC0gICANCsW8ZWJ5IHd5YnJhxIcgbW9kZWwsIHBhdHJ6eW15IG5hIGRydWfEhSBwYXLEmS4gICAgIA0KIA0KSUkgcGFyYTogICAgIA0KYWRqUlNlcnIgLSBwLXZhbHVlPGFsZmEsIG9kcnp1Y2FteSBIMCAgICANCmFkalJTbGFnIC0gcC12YWx1ZT5hbGZhLCBicmFrIHBvZHN0YXcgZG8gb2RyenVjZW5pYSBIMC4gICANCg0KTmEgcG9kc3Rhd2llIGRydWdpZWogbWlhcnkgd3liaWVyYW15IG1vZGVsIFNFTS4NCg0KU0FSTUEgLSBwb8WCYWN6ZW5pZSBtb2RlbGksIGJhcmR6byBtYcWCZSBwLXZhbHVlIHRvIGplc3QgbmFqbGVwc3phIG9wY2phLiAgIA0KDQoNCiMgOC4xLiBEdXJiaW4gLSBtb2RlbCB3c3DDs2xuZWdvIGN6eW5uaWthDQoNCmBgYHtyIER1cmJpbiwgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KRFVSQklOIDwtIGxhZ3NhcmxtKGxvZyhwb3dpYXR5JENFTkFfMU0pIH4gbG9nKHBvd2lhdHkkR0VTVF9aQSkgKyBsb2cocG93aWF0eSRXWU5BR1IpICsgbG9nKHBvd2lhdHkkWkFTX01JRSksIGRhdGE9cG93aWF0eSwgbGlzdHc9V3F1ZWVuMSwgdHlwZT0ibWl4ZWQiKTsNCnN1bW1hcnkoRFVSQklOKQ0KDQoNClNDTTIgPC0gbGFnc2FybG0obG9nKHBvd2lhdHkkQ0VOQV8xTSkgfiBsb2cocG93aWF0eSRHRVNUX1pBKSArIGxvZyhwb3dpYXR5JFdZTkFHUikgKyBsb2cocG93aWF0eSRaQVNfTUlFKSwgZGF0YT1wb3dpYXR5LCBsaXN0dz1XcXVlZW4xLCBEdXJiaW4gPSB+bG9nKHBvd2lhdHkkWkFTX01JRSkrDQogICAgICAgICAgICAgICAgbG9nKHBvd2lhdHkkR0VTVF9aQSkpOw0Kc3VtbWFyeShTQ00yKQ0KDQpgYGANCg0KIyA4LjIuIFNBUk1BIC0gbW9kZWwgbWllc3phbnkgU0FSK1NNQQ0KDQpgYGB7ciBTQVJNQSwgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KU0FSTUE8LSBzYWNzYXJsbShsb2cocG93aWF0eSRDRU5BXzFNKSB+IGxvZyhwb3dpYXR5JEdFU1RfWkEpICsgbG9nKHBvd2lhdHkkV1lOQUdSKSArIGxvZyhwb3dpYXR5JFpBU19NSUUpLCBkYXRhPXBvd2lhdHksIGxpc3R3PVdxdWVlbjEpDQpzdW1tYXJ5KFNBUk1BKQ0KYGBgDQoNCiMgOS4gRGVjeXpqYQ0KTW9kZWwgRFVSQklOQSBtYSBuYWptbmllanN6ZSBrcnl0LiBpbmZvcm1hY3lqbmUgQUtBSUtFIGkgZGxhdGVnbyB3eWJpZXJhbXkgZ28sIHBvbWltbywgxbxlIG1vZGVsIFNBUk1BIHRlxbwgbWEgZG9icmUgc3RhdHlzdHlraS4NCg0KIyAxMC4gTW9kZWwgRHVyYmluYSAtIGludGVycHJldGFjamUgDQoNCldzcMOzxYJjenlubmlraToNCg0KbG9nKHBvd2lhdHkkR0VTVF9aQSk6IDAuMDU3IChwIDwgMC4wMDAxKQ0KDQpXenJvc3QgZ8SZc3RvxZtjaSB6YWx1ZG5pZW5pYSBvIDElIHBvd29kdWplIHd6cm9zdCBjZW55IG1pZXN6a2HFhCBvIG9rb8WCbyAwLjA1NyUuIFRlbiB3c3DDs8WCY3p5bm5payBqZXN0IGRvZGF0bmkgaSBiYXJkem8gaXN0b3RueSwgY28gd3NrYXp1amUgbmEgc2lsbnkgd3DFgnl3IGdlc3RhY2ppKHphZ8SZc2N6ZW5pYSBsdWRub8WbY2kpIG5hIGNlbnkgbWllc3prYcWELg0KDQpsb2cocG93aWF0eSRXWU5BR1IpOiAwLjIxMiAocCA9IDAuMDIwKQ0KDQpXenJvc3Qgd3luYWdyb2R6ZcWEIG8gMSUgcHJvd2FkemkgZG8gd3pyb3N0dSBjZW55IG1pZXN6a2HFhCBvIG9rb8WCbyAwLjIxMiUuIFdzcMOzxYJjenlubmlrIHRlbiBqZXN0IHBvenl0eXdueSBpIGlzdG90bnksIGNvIG96bmFjemEsIMW8ZSB3ecW8c3plIHd5bmFncm9kemVuaWEgc8SFIHp3acSFemFuZSB6IHd5xbxzenltaSBjZW5hbWkgbWllc3prYcWELg0KDQpsb2cocG93aWF0eSRaQVNfTUlFKTogMC4wODkgKHAgPCAwLjAwMDEpDQoNCld6cm9zdCB6YXNvYsOzdyBtaWVzemthbmlvd3ljaCBvIDElIHBvd29kdWplIHd6cm9zdCBjZW55IG1pZXN6a2HFhCBvIG9rb8WCbyAwLjA4OSUuIFRlbiB3c3DDs8WCY3p5bm5payBqZXN0IGRvZGF0bmkgaSBiYXJkem8gaXN0b3RueSwgY28gd3NrYXp1amUsIMW8ZSB3acSZa3N6YSBkb3N0xJlwbm/Fm8SHIG1pZXN6a2HFhCAoemFzb2LDs3cgbWllc2t6YW5pb3d5Y2gpIHByenljenluaWEgc2nEmSBkbyB3enJvc3R1IGNlbiBtaWVzemthxYQuDQoNCldzcMOzxYJjenlubmlraSBPcMOzxbpuaWXFhCBQcnplc3RyemVubnljaC4NCg0KbGFnLmxvZyhwb3dpYXR5JFpBU19NSUUpOiAwLjA5NCAocCA9IDAuMDA5KQ0KDQpQcnplc3RyemVubmUgb3DDs8W6bmllbmllIHphc29iw7N3IG1pZXN6a2FuaW93eWNoIG8gMSUgcG93b2R1amUgd3pyb3N0IGNlbnkgbWllc3prYcWEIG8gb2tvxYJvIDAuMDk0JS4gV3Nww7PFgmN6eW5uaWsgdGVuIGplc3QgZG9kYXRuaSBpIGlzdG90bnksIGNvIHN1Z2VydWplLCDFvGUgY2VueSBtaWVzemthxYQgc8SFIHBvenl0eXduaWUgc2tvcmVsb3dhbmUgeiBsaWN6YsSFIHphc29iw7N3IG1pZXN6a2FuaW93eWNoIHcgc8SFc2llZG5pY2ggcG93aWF0YWNoLg0KDQpsYWcubG9nKHBvd2lhdHkkR0VTVF9aQSk6IC0wLjA4NyAocCA8IDAuMDAwMSkNCg0KUHJ6ZXN0cnplbm5lIG9ww7PFum5pZW5pZSBnxJlzdG/Fm2NpIHphbHVkbmllbmlhIG8gMSUgcG93b2R1amUgc3BhZGVrIGNlbnkgbWllc3prYcWEIG8gb2tvxYJvIDAuMDg3JS4gVGVuIHdzcMOzxYJjenlubmlrIGplc3QgbmVnYXR5d255IGkgYmFyZHpvIGlzdG90bnksIGNvIHdza2F6dWplLCDFvGUgd3nFvHN6ZSB6YWfEmXN6Y3plbmllIGx1ZG5vxZtjaSB3IHPEhXNpZWRuaWNoIHBvd2lhdGFjaCBtYSBuZWdhdHl3bnkgd3DFgnl3IG5hIGNlbnkgbWllc3prYcWELg==