Mô hình Hồi quy đơn giản
Như đã biết, để có thể xác định mối tương quan giữa 2 biến số liên tục x và y chúng ta có thể sử dụng hệ số tương quan:
- Hệ số tương quan Pearson (Có tham số)
- Hệ số tương quan Spearman (Phi tham số)
Hệ số tương quan r (được chuẩn hóa từ hiệp biến của 2 biến số x và y) phản ánh mối tương quan giữa x và y. Tuy nhiên để có thể mô mình hóa được hệ số tương quan này, chúng ta cần sử dụng tới hồi quy tuyến tính. Ví dụ được đưa ra trong bài viết đề cập tới 2 biến liên tục trong bộ dữ liệu nhỏ giải thích về thời gian mang thai ảnh hướng tới cân nặng của trẻ sơ sinh (dữ liệu thai kỳ).
Một chút về lịch sử:
Chúng ta sẽ nhắc lại một chút về lịch sử mô hình hồi quy. Mô hình Hồi quy tuyến tính có xuất phát điểm phát minh từ nhà khoa học lừng danh Francis Galton (em họ của Charles Darwin). Sir Francis Galton (16 tháng 2 năm 1822 - 17 tháng 1 năm 1911) là một nhà thông thái, nhà nhân chủng học, ưu sinh học, nhà thám hiểm, nhà địa lý, nhà phát minh, nhà khí tượng học và nhà thống kê người Anh. Ông được phong tước hiệp sĩ năm 1909.
Trong sự nghiệp của mình, Galton viết trên 340 bài báo và sách. Ông cũng là người sáng tạo ra khái niệm hệ số tương quan trong thống kê và phát triển hồi quy về điểm trung bình. Ông là người đầu tiên áp dụng các phương pháp thống kê đối với nghiên cứu về sự khác biệt của con người và tính di truyền của trí thông minh, ông giới thiệu việc sử dụng bảng hỏi và khảo sát nhằm thu thập dữ liệu với con người.
Francis Galton là nhà tiên phong của thuyết ưu sinh và là người đã đặt tên thuyết ưu sinh (tiếng Anh: eugenics). Ông cũng là người sáng lập ra ngành trắc nghiệm học tâm lý. Ông phát minh ra phương pháp phân loại dấu vân tay, đóng vai trò hữu dụng đối với khoa học pháp lý.
Mấu chốt nhất trong nghiên cứu thống kê của Galton đó là đã phát hiện ra mối liên quan giữa chiều cao của những người có tầng lớp xã hội cao, trí thức liên quan đến IQ của họ vì vào thời đó những người có chiều cao hơn với những người khác đều đại đa số là quan chức và tầng lớp trí thức còn những người có chiều cao thấp hơn đều là tầng lớp lao động bình thường của xã hội. Tuy nhiên, mặc dù thiên tài nhưng Galoton lại không thể đưa ra được một cách chứng minh và định lượng chính xác về vấn đề ông nghiên cứu mà sau này chính Karl Pearson (cha đẻ của hệ số tương quan Pearson) đã giúp ông định lượng vấn đề này.
Dữ liệu thai kỳ:
Bộ dữ liệu bao gồm 2 biến
- Biến thời gian(period): Miêu tả thời gian (tuần) của bà mẹ mang thai
- Biến cân nặng(weight): Miêu tả cân nặng (kg) của thai nhi
Chúng ta sẽ mô phỏng mối tương quan của 2 biến này và tính hệ số tương quan Pearson, miêu tả qua ma trận tương quan để trực quan dữ liệu.
## Warning: package 'psych' was built under R version 4.0.2
## [1] 0.8175185


Phương trình Hồi quy
Dạng biểu diễn Để giới thiệu mô hình hồi quy tuyến tính, chúng ta cần đến vài ký hiệu. Gọi \((x, y)\) là cặp giá trị \(x\) và \(y\) củ đối tượng \(i(i =1,2,3,....,n)\) trong đó \(x\) coi là period và \(y\) là weight. Trong ví dụ trên \(n =17\) cá nhân. Mô hình hồi quy tuyến tính phát biểu rằng giá trị \(y_{i}\) là hàm số của một giá trị ban đầu và một hệ số liên quan với x:
\(y_{i} = \alpha + \beta*x_{i}\)
Trong đó, \(\alpha\) là giá trị ban đầu của \(y\), còn gọi là intercept; \(\beta\) là hệ số liên quan tới \(x\), và thường được gọi là slope hay hệ số góc của mô hình hồi quy. Trong mô hình này, \(\alpha\) và \(\beta\) là 2 hằng số. Có thể xem mô hình trên là đại diện cho dữ liệu về mối liên quan giữa \(x\) và \(y\). Tuy nhiên chúng ta thấy rằng, đường thẳng này đều không thể nối tất cả các điểm có giá trị \((x, y)\) lại với nhau được; sẽ có một số giá trị lệch khỏi mô hinh. Do đó, chúng ta thêm một yếu tố khác của mô hình và ký hiệu là \(\epsilon_{i}\).
\(y_{i} = \alpha + \beta*x_{i} + \epsilon_{i}\)
Chúng ta sẽ làm đơn giản ký hiệu bằng cách bỏ ký hiệu
\(i\) cho mỗi quan sát:
\(y = \alpha + \beta*x + \epsilon\)
Đây là mô hình cho quần thể (population), cần dùng 17 quan sát được để ước tính 2 tham số cho mô hình quần thể. Một cách tổng quát:
Giá trị quan sát của \(y\) = Giá trị tiên lượng + Phần dư (residual)
\(y =\hat{y} + e\)
Giá trị \(\hat{y}\) còn được gọi là expected value. Phần \((a+b*x)\) là phần mô hình hệ thống, và phần nhiễu(noise) \(e\) Ước tính tham số: Giả sử chúng ta có 2 điểm \((x_{1}, y_{1})\) và \((x_{2}, y_{2})\) trong một khoảng không gian \(x-y\), và mục tiêu là tìm một đường thẳng để nối 2 điểm này. Cách đơn giản nhất là dùng slope (hệ số góc) và gradient(độ dốc).
\(slope = \frac{\Delta y}{\Delta x}\) = \(\frac{y_{2}-y_{1}}{x_{2}-x_{1}}\)
Mục tiêu đưa ra là tìm \(\alpha\) và \(\beta\) sao cho:
\(min\Sigma (y-\alpha-\beta*x)^2\) là bé nhất.
Ước tính tham số bằng R
Trong R, dùng hàm \(lm()\) dùng để ước tính tham số cho mô hình hồi quy tuyến tính bằng phương pháp bình phương tối thiểu. Cú pháp: \(lm( y\sim x, data)\)
Trong đó,
\(y\) là biến phụ thuộc,
\(x\) là biến tiên lượng hay còn gọi là biến độc lập. Theo bộ dữ liệu thaiky phía trên, chúng ta có thể mô tả như sau:
\(weight = \alpha + \beta(period) + \epsilon\)
m = lm(weight ~ period, data = thaiky)
summary(m)
##
## Call:
## lm(formula = weight ~ period, data = thaiky)
##
## Residuals:
## Min 1Q Median 3Q Max
## -958.6 -157.2 7.7 201.0 667.8
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -4020.05 1263.05 -3.183 0.00618 **
## period 180.46 32.82 5.498 6.13e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 414.4 on 15 degrees of freedom
## Multiple R-squared: 0.6683, Adjusted R-squared: 0.6462
## F-statistic: 30.23 on 1 and 15 DF, p-value: 6.13e-05
Theo kết quả đưa ra, mô hình hồi quy sẽ là: \(Weight = -4020.5 + 180.46 * Period\)
Diễn giải tham số:
Chúng ta có thể thể hiện mô hình này bằng đường thẳng như sau. Đường biểu diễn màu đỏ chính là giá trị tiên lượng (-4020.5 +180.46 * period) của mô hình:
plot(weight ~ period, pch = 16, data = thaiky)
abline(lm(weight ~ period), col = 'red')
Ý nghĩa của slope
Tham số quan trọng nhất của mô hình hồi quy chính là \(\beta\) hay slope. Để hiểu rõ hơn ý nghĩa của tham số này, chúng ta dùng mô hình dự đoán cho 2 quan sát sau:
- Quan sát thêm 1: Nếu thai kỳ là 40 tuần, trọng lượng trẻ sơ sinh sẽ là: \(weight = -4020.5 + 180.46 * 40 = 3197.9 (gram)\)
- Nếu thai kỳ là 41 tuần, trọng lượng trẻ sơ sinh sẽ là: \(weight = -4020.5 + 180.46 * 41 = 3378.36 (gram)\) Do đó, sự khác biệt về thai kỳ là 3378.36-3197.9 = 180.46 (gram)
Đây chính là slope. Mô hình này có ý nghĩa là khi thai kỳ được tăng lên 1 đơn vị (tuần) thì trọng lượng trẻ sơ sinh sẽ tăng lên xấp xỉ 180.46 gram.
Ý nghĩa cửa \(\alpha\)
Hằng số intercept = -4020.5 có nghĩa là khi period = 0 thì trọng lượng là -4020.5. Điều này cho thấy rằng hằng số \(\alpha\) trong mô hình hồi quy tuyến tính không có ý nghĩa. Không có ý nghĩa bởi vì trọng lượng không thể là số âm, và trong thực tế thì không thể nào có sản phụ nào có thai kỳ là 0 tuần. Do đó, đôi khi chúng ta xem \(\alpha\) là một “hằng số giả định nào đó”. Tuy nhiên, chúng ta có thể biến \(\alpha\) có ý nghĩa bằng cách hoán chuyển biến period sang đơn vị \(z\):
\(zperiod = \frac{period - trung bình(period)}{Độ lệch chuẩn của period}\)
Giá trị trung bình của period là 38.5 tuần, độ lệch chuẩn là 3.1 tuần. Điều này có nghĩa là khi trung bình period là 38.5 tuần thì zperiod bằng 0. Hoán chuyển lại thang đo: \(zperiod = scale(period)\) Theo thang đo mới thì \(zperiod\) sẽ có trung bình (\(\overline{zperiod}\)) là 0 và độ lệch chuẩn là 1. Áp dụng mô hình hồi quy cho \(zperiod\):
\(m = lm(weight \sim zperiod, data = thaiky)\) \(summary(m)\)
thaiky$zperiod <- scale(thaiky$period)
m=lm(weight ~ zperiod, data = thaiky)
summary(m)
##
## Call:
## lm(formula = weight ~ zperiod, data = thaiky)
##
## Residuals:
## Min 1Q Median 3Q Max
## -958.6 -157.2 7.7 201.0 667.8
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2902.0 100.5 28.872 1.46e-14 ***
## zperiod 569.6 103.6 5.498 6.13e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 414.4 on 15 degrees of freedom
## Multiple R-squared: 0.6683, Adjusted R-squared: 0.6462
## F-statistic: 30.23 on 1 and 15 DF, p-value: 6.13e-05
plot(density(thaiky$zperiod), xlab = "zperiod", main = "The density of zperiod")

Kiểm tra giả định:
Mô hình hồi quy tuyến tính, cũng tương tự như phương pháp phân tích tương quan dựa vào 4 giả định sau:
- Thứ nhất, mối liên hệ giữa \(x\) và \(y\) phải là mối quan hệ tuyến tính và là tham số tuyến tính
- Thứ hai, phân bố của phần dư \(e_{i}\) phải tuân theo (hay xấp xỉ) luật phân bố chuẩn với trung bình \(0\) và phương sai \(s^2\), theo ký hiệu: \(e \sim N(0,\sigma^2)\)
- Thứ ba, phương sai của \(y\) không thay đổi theo giá trị \(x\)
- Thứ tư, các giá trị của \(y_{i}\) và \(y_{i-1}\) độc lập với nhau. Chúng ta hoàn toàn có thể kiểm tra các giả định này thông qua autoplot() trong package ggfortify
#install.packages("ggfortify")
library(ggfortify)
## Warning: package 'ggfortify' was built under R version 4.0.3
## Loading required package: ggplot2
## Warning: package 'ggplot2' was built under R version 4.0.2
##
## Attaching package: 'ggplot2'
## The following objects are masked from 'package:psych':
##
## %+%, alpha
## Warning: `arrange_()` is deprecated as of dplyr 0.7.0.
## Please use `arrange()` instead.
## See vignette('programming') for more help
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_warnings()` to see where this warning was generated.

- Biểu đồ 1 bên trái phần trên đưa ra mối liên hệ giữa giá trị dự đoán (prediction) \(\hat y_{i}\) và phần dư \(e_{i}\), cho thấy các giá trị phần dư xoay quanh 0, tức đúng với giả định một về giá trị trung bình của phần dư
- Biểu đồ 2 bên phải phần trên đưa ra mối liên hệ giữa giá trị lý thuyết và thực tế của phần dư. Nếu phân phối của phần dư tuân theo luật phân phối Chuẩn thì các giá trị nằm trên đường lý thuyết (lệch với trục \(O_{x}\)) góc 45 độ). Do đó theo biểu đồ trên, phù hợp với giả định thứ hai.
- Biểu đồ phần dưới bên trái trình bày mối tương quan giữa giá trị dự đoán và căn số bậc hai của phần dư. Biểu đồ này cho chúng ta biết phương sai của phần dư có hay không liên quan đến giá trị biến trên trục x. Biểu đồ cho thấy không có mối liên quan, và điều này cho chúng ta biết rằng giả định về đồng dạng phương sai (homogeneity) là có thể chấp nhận được.
- Biểu đồ thứ 4 dưới cùng bên phải hàng dưới trình bày giá trị “Leverage” và phần dư chuẩn hóa. Biểu đồ này cho chúng ta biết có những giá trị có ảnh hưởng cao hay không (influential observation). Ngoại trừ một vài quan sát (số 17), phần còn lại đều có giá trị phần dư chuẩn hóa nằm trong khoảng từ -2 đến +2. Do đó có thể chấp nhận được rằng không có giá trị ngoại lai (outliers) ảnh hưởng đến mô hình.
LS0tDQp0aXRsZTogIlNpbXBsZSBMaW5lYXIgUmVncmVzc2lvbiINCmF1dGhvcjogIlRyYW4gUXVhbmcgUXV5IC0gIERlcGFydG1lbnQgb2YgQ29tcHV0ZXIgU2NpZW5jZXMgYW5kIFRlY2hub2xvZ3kiIA0KZGF0ZTogIkphbnVhcnkgMTksIDIwMjEiDQpvdXRwdXQ6DQogIA0KICBodG1sX2RvY3VtZW50OiANCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBzaG93DQogICAgaGlnaGxpZ2h0OiB6ZW5idXJuDQogICAgbnVtYmVyX3NlY3Rpb25zOiBubw0KICAgIHRoZW1lOiAiZmxhdGx5Ig0KICAgIHRvYzogVFJVRQ0KICAgIHRvY19mbG9hdDogVFJVRQ0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lDQotLS0NCg0KIyBNw7QgaMOsbmggSOG7k2kgcXV5IMSRxqFuIGdp4bqjbg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQoNCk5oxrAgxJHDoyBiaeG6v3QsIMSR4buDIGPDsyB0aOG7gyB4w6FjIMSR4buLbmggbeG7kWkgdMawxqFuZyBxdWFuIGdp4buvYSAyIGJp4bq/biBz4buRIGxpw6puIHThu6VjIHggdsOgIHkgY2jDum5nIHRhIGPDsyB0aOG7gyBz4butIGThu6VuZyBo4buHIHPhu5EgdMawxqFuZyBxdWFuOg0KDQoqIEjhu4cgc+G7kSB0xrDGoW5nIHF1YW4gUGVhcnNvbiAoQ8OzIHRoYW0gc+G7kSkNCiogSOG7hyBz4buRIHTGsMahbmcgcXVhbiBTcGVhcm1hbiAoUGhpIHRoYW0gc+G7kSkNCg0KSOG7hyBz4buRIHTGsMahbmcgcXVhbiByICjEkcaw4bujYyBjaHXhuqluIGjDs2EgdOG7qyBoaeG7h3AgYmnhur9uIGPhu6dhIDIgYmnhur9uIHPhu5EgeCB2w6AgeSkgcGjhuqNuIMOhbmggbeG7kWkgdMawxqFuZyBxdWFuIGdp4buvYSB4IHbDoCB5LiBUdXkgbmhpw6puIMSR4buDIGPDsyB0aOG7gyBtw7QgbcOsbmggaMOzYSDEkcaw4bujYyBo4buHIHPhu5EgdMawxqFuZyBxdWFuIG7DoHksIGNow7puZyB0YSBj4bqnbiBz4butIGThu6VuZyB04bubaSBo4buTaSBxdXkgdHV54bq/biB0w61uaC4gVsOtIGThu6UgxJHGsOG7o2MgxJHGsGEgcmEgdHJvbmcgYsOgaSB2aeG6v3QgxJHhu4EgY+G6rXAgdOG7m2kgMiBiaeG6v24gbGnDqm4gdOG7pWMgdHJvbmcgYuG7mSBk4buvIGxp4buHdSBuaOG7jyBnaeG6o2kgdGjDrWNoIHbhu4EgdGjhu51pIGdpYW4gbWFuZyB0aGFpIOG6o25oIGjGsOG7m25nIHThu5tpIGPDom4gbuG6t25nIGPhu6dhIHRy4bq7IHPGoSBzaW5oIChk4buvIGxp4buHdSB0aGFpIGvhu7MpLg0KPC9kaXY+DQoNCiMjIE3hu5l0IGNow7p0IHbhu4EgbOG7i2NoIHPhu606DQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCkNow7puZyB0YSBz4bq9IG5o4bqvYyBs4bqhaSBt4buZdCBjaMO6dCB24buBIGzhu4tjaCBz4butIG3DtCBow6xuaCBo4buTaSBxdXkuIE3DtCBow6xuaCBI4buTaSBxdXkgdHV54bq/biB0w61uaCBjw7MgeHXhuqV0IHBow6F0IMSRaeG7g20gcGjDoXQgbWluaCB04burIG5ow6Aga2hvYSBo4buNYyBs4burbmcgZGFuaCBGcmFuY2lzIEdhbHRvbiAoZW0gaOG7jSBj4bunYSBDaGFybGVzIERhcndpbikuDQpTaXIgRnJhbmNpcyBHYWx0b24gKDE2IHRow6FuZyAyIG7Eg20gMTgyMiAtIDE3IHRow6FuZyAxIG7Eg20gMTkxMSkgbMOgIG3hu5l0IG5ow6AgdGjDtG5nIHRow6FpLCBuaMOgIG5ow6JuIGNo4bunbmcgaOG7jWMsIMawdSBzaW5oIGjhu41jLCBuaMOgIHRow6FtIGhp4buDbSwgbmjDoCDEkeG7i2EgbMO9LCBuaMOgIHBow6F0IG1pbmgsIG5ow6Aga2jDrSB0xrDhu6NuZyBo4buNYyB2w6AgbmjDoCB0aOG7kW5nIGvDqiBuZ8aw4budaSBBbmguIMOUbmcgxJHGsOG7o2MgcGhvbmcgdMaw4bubYyBoaeG7h3Agc8SpIG7Eg20gMTkwOS4NCg0KVHJvbmcgc+G7sSBuZ2hp4buHcCBj4bunYSBtw6xuaCwgR2FsdG9uIHZp4bq/dCB0csOqbiAzNDAgYsOgaSBiw6FvIHbDoCBzw6FjaC4gw5RuZyBjxaluZyBsw6AgbmfGsOG7nWkgc8OhbmcgdOG6oW8gcmEga2jDoWkgbmnhu4dtIGjhu4cgc+G7kSB0xrDGoW5nIHF1YW4gdHJvbmcgdGjhu5FuZyBrw6ogdsOgIHBow6F0IHRyaeG7g24gaOG7k2kgcXV5IHbhu4EgxJFp4buDbSB0cnVuZyBiw6xuaC4gw5RuZyBsw6AgbmfGsOG7nWkgxJHhuqd1IHRpw6puIMOhcCBk4bulbmcgY8OhYyBwaMawxqFuZyBwaMOhcCB0aOG7kW5nIGvDqiDEkeG7kWkgduG7m2kgbmdoacOqbiBj4bupdSB24buBIHPhu7Ega2jDoWMgYmnhu4d0IGPhu6dhIGNvbiBuZ8aw4budaSB2w6AgdMOtbmggZGkgdHJ1eeG7gW4gY+G7p2EgdHLDrSB0aMO0bmcgbWluaCwgw7RuZyBnaeG7m2kgdGhp4buHdSB2aeG7h2Mgc+G7rSBk4bulbmcgYuG6o25nIGjhu49pIHbDoCBraOG6o28gc8OhdCBuaOG6sW0gdGh1IHRo4bqtcCBk4buvIGxp4buHdSB24bubaSBjb24gbmfGsOG7nWkuDQoNCkZyYW5jaXMgR2FsdG9uIGzDoCBuaMOgIHRpw6puIHBob25nIGPhu6dhIHRodXnhur90IMawdSBzaW5oIHbDoCBsw6AgbmfGsOG7nWkgxJHDoyDEkeG6t3QgdMOqbiB0aHV54bq/dCDGsHUgc2luaCAodGnhur9uZyBBbmg6IGV1Z2VuaWNzKS4gw5RuZyBjxaluZyBsw6AgbmfGsOG7nWkgc8OhbmcgbOG6rXAgcmEgbmfDoG5oIHRy4bqvYyBuZ2hp4buHbSBo4buNYyB0w6JtIGzDvS4gw5RuZyBwaMOhdCBtaW5oIHJhIHBoxrDGoW5nIHBow6FwIHBow6JuIGxv4bqhaSBk4bqldSB2w6JuIHRheSwgxJHDs25nIHZhaSB0csOyIGjhu691IGThu6VuZyDEkeG7kWkgduG7m2kga2hvYSBo4buNYyBwaMOhcCBsw70uDQoNCk3huqV1IGNo4buRdCBuaOG6pXQgdHJvbmcgbmdoacOqbiBj4bupdSB0aOG7kW5nIGvDqiBj4bunYSBHYWx0b24gxJHDsyBsw6AgxJHDoyBwaMOhdCBoaeG7h24gcmEgbeG7kWkgbGnDqm4gcXVhbiBnaeG7r2EgY2hp4buBdSBjYW8gY+G7p2Egbmjhu69uZyBuZ8aw4budaSBjw7MgdOG6p25nIGzhu5twIHjDoyBo4buZaSBjYW8sIHRyw60gdGjhu6ljIGxpw6puIHF1YW4gxJHhur9uIElRIGPhu6dhIGjhu40gdsOsIHbDoG8gdGjhu51pIMSRw7Mgbmjhu69uZyBuZ8aw4budaSBjw7MgY2hp4buBdSBjYW8gaMahbiB24bubaSBuaOG7r25nIG5nxrDhu51pIGtow6FjIMSR4buBdSDEkeG6oWkgxJFhIHPhu5EgbMOgIHF1YW4gY2jhu6ljIHbDoCB04bqnbmcgbOG7m3AgdHLDrSB0aOG7qWMgY8OybiBuaOG7r25nIG5nxrDhu51pIGPDsyBjaGnhu4F1IGNhbyB0aOG6pXAgaMahbiDEkeG7gXUgbMOgIHThuqduZyBs4bubcCBsYW8gxJHhu5luZyBiw6xuaCB0aMaw4budbmcgY+G7p2EgeMOjIGjhu5lpLiBUdXkgbmhpw6puLCBt4bq3YyBkw7kgdGhpw6puIHTDoGkgbmjGsG5nIEdhbG90b24gbOG6oWkga2jDtG5nIHRo4buDIMSRxrBhIHJhIMSRxrDhu6NjIG3hu5l0IGPDoWNoIGNo4bupbmcgbWluaCB2w6AgxJHhu4tuaCBsxrDhu6NuZyBjaMOtbmggeMOhYyB24buBIHbhuqVuIMSR4buBIMO0bmcgbmdoacOqbiBj4bupdSBtw6Agc2F1IG7DoHkgY2jDrW5oIEthcmwgUGVhcnNvbiAoY2hhIMSR4bq7IGPhu6dhIGjhu4cgc+G7kSB0xrDGoW5nIHF1YW4gUGVhcnNvbikgxJHDoyBnacO6cCDDtG5nIMSR4buLbmggbMaw4bujbmcgduG6pW4gxJHhu4EgbsOgeS4NCjwvZGl2Pg0KIyMgROG7ryBsaeG7h3UgdGhhaSBr4buzOg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQpC4buZIGThu68gbGnhu4d1IGJhbyBn4buTbSAyIGJp4bq/bg0KDQoqIEJp4bq/biB0aOG7nWkgZ2lhbihwZXJpb2QpOiBNacOqdSB04bqjIHRo4budaSBnaWFuICh0deG6p24pIGPhu6dhIGLDoCBt4bq5IG1hbmcgdGhhaQ0KKiBCaeG6v24gY8OibiBu4bq3bmcod2VpZ2h0KTogTWnDqnUgdOG6oyBjw6JuIG7hurduZyAoa2cpIGPhu6dhIHRoYWkgbmhpDQoNCg0KQ2jDum5nIHRhIHPhur0gbcO0IHBo4buPbmcgbeG7kWkgdMawxqFuZyBxdWFuIGPhu6dhIDIgYmnhur9uIG7DoHkgdsOgIHTDrW5oIGjhu4cgc+G7kSB0xrDGoW5nIHF1YW4gUGVhcnNvbiwgbWnDqnUgdOG6oyBxdWEgbWEgdHLhuq1uIHTGsMahbmcgcXVhbiDEkeG7gyB0cuG7sWMgcXVhbiBk4buvIGxp4buHdS4NCjwvZGl2Pg0KDQpgYGB7ciwgZWNobyA9IEZBTFNFfQ0KDQpsaWJyYXJ5KHBzeWNoKQ0KdGhhaWt5MSA9IHJlYWQuY3N2KCJ0aGFpa3kuY3N2IikNCnRoYWlreSA9IHRoYWlreTFbLC0xXQ0KY29sbmFtZXModGhhaWt5KSA9IGMoInBlcmlvZCIsICJ3ZWlnaHQiKQ0KI3N0cih0aGFpa3kpDQoNCmNvcih0aGFpa3kkcGVyaW9kLCB0aGFpa3kkd2VpZ2h0KQ0KcGxvdCh0aGFpa3kkcGVyaW9kIH4gdGhhaWt5JHdlaWdodCwgcGNoID0gMTYpDQphYmxpbmUobG0odGhhaWt5JHBlcmlvZCB+IHRoYWlreSR3ZWlnaHQpLCBjb2wgPSAncmVkJykNCnBhaXJzLnBhbmVscyh0aGFpa3kpDQoNCmBgYA0KDQojIFBoxrDGoW5nIHRyw6xuaCBI4buTaSBxdXkNCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQogIEThuqFuZyBiaeG7g3UgZGnhu4VuDQogIMSQ4buDIGdp4bubaSB0aGnhu4d1IG3DtCBow6xuaCBo4buTaSBxdXkgdHV54bq/biB0w61uaCwgY2jDum5nIHRhIGPhuqduIMSR4bq/biB2w6BpIGvDvSBoaeG7h3UuIEfhu41pICQoeCwgeSkkIGzDoCBj4bq3cCBnacOhIHRy4buLICR4JCB2w6AgJHkkIGPhu6cgxJHhu5FpIHTGsOG7o25nICRpKGkgPTEsMiwzLC4uLi4sbikkIHRyb25nIMSRw7MgJHgkIGNvaSBsw6AgcGVyaW9kIHbDoCAkeSQgbMOgIHdlaWdodC4gVHJvbmcgdsOtIGThu6UgdHLDqm4gJG4gPTE3JCBjw6EgbmjDom4uIE3DtCBow6xuaCBo4buTaSBxdXkgdHV54bq/biB0w61uaCBwaMOhdCBiaeG7g3UgcuG6sW5nIGdpw6EgdHLhu4sgJHlfe2l9JCBsw6AgaMOgbSBz4buRIGPhu6dhIG3hu5l0IGdpw6EgdHLhu4sgYmFuIMSR4bqndSB2w6AgbeG7mXQgaOG7hyBz4buRIGxpw6puIHF1YW4gduG7m2kgeDoNCiAgPC9kaXY+DQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiPg0KJHlfe2l9ID0gXGFscGhhICsgXGJldGEqeF97aX0kDQo8L2Rpdj4NCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KICBUcm9uZyDEkcOzLCAkXGFscGhhJCBsw6AgZ2nDoSB0cuG7iyBiYW4gxJHhuqd1IGPhu6dhICR5JCwgY8OybiBn4buNaSBsw6AgKmludGVyY2VwdCo7ICRcYmV0YSQgbMOgIGjhu4cgc+G7kSBsacOqbiBxdWFuIHThu5tpICR4JCwgdsOgIHRoxrDhu51uZyDEkcaw4bujYyBn4buNaSBsw6AgKnNsb3BlKiBoYXkgaOG7hyBz4buRIGfDs2MgY+G7p2EgbcO0IGjDrG5oIGjhu5NpIHF1eS4gVHJvbmcgbcO0IGjDrG5oIG7DoHksICRcYWxwaGEkIHbDoCAkXGJldGEkIGzDoCAyIGjhurFuZyBz4buRLiBDw7MgdGjhu4MgeGVtIG3DtCBow6xuaCB0csOqbiBsw6AgxJHhuqFpIGRp4buHbiBjaG8gZOG7ryBsaeG7h3UgduG7gSBt4buRaSBsacOqbiBxdWFuIGdp4buvYSAkeCQgdsOgICR5JC4NCiAgVHV5IG5oacOqbiBjaMO6bmcgdGEgdGjhuqV5IHLhurFuZywgxJHGsOG7nW5nIHRo4bqzbmcgbsOgeSDEkeG7gXUga2jDtG5nIHRo4buDIG7hu5FpIHThuqV0IGPhuqMgY8OhYyDEkWnhu4NtIGPDsyBnacOhIHRy4buLICQoeCwgeSkkIGzhuqFpIHbhu5tpIG5oYXUgxJHGsOG7o2M7IHPhur0gY8OzIG3hu5l0IHPhu5EgZ2nDoSB0cuG7iyBs4buHY2gga2jhu49pIG3DtCBoaW5oLiBEbyDEkcOzLCBjaMO6bmcgdGEgdGjDqm0gbeG7mXQgeeG6v3UgdOG7kSBraMOhYyBj4bunYSBtw7QgaMOsbmggdsOgIGvDvSBoaeG7h3UgbMOgICRcZXBzaWxvbl97aX0kLg0KPC9kaXY+DQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiPg0KJHlfe2l9ID0gXGFscGhhICsgXGJldGEqeF97aX0gKyBcZXBzaWxvbl97aX0kDQo8L2Rpdj4NCiAgQ2jDum5nIHRhIHPhur0gbMOgbSDEkcahbiBnaeG6o24ga8O9IGhp4buHdSBi4bqxbmcgY8OhY2ggYuG7jyBrw70gaGnhu4d1ICokaSQqIGNobyBt4buXaSBxdWFuIHPDoXQ6DQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiPg0KJHkgPSBcYWxwaGEgKyBcYmV0YSp4ICsgXGVwc2lsb24kDQo8L2Rpdj4NCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KICDEkMOieSBsw6AgbcO0IGjDrG5oIGNobyAqcXXhuqduIHRo4buDKiAocG9wdWxhdGlvbiksIGPhuqduIGTDuW5nIDE3IHF1YW4gc8OhdCDEkcaw4bujYyDEkeG7gyDGsOG7m2MgdMOtbmggMiB0aGFtIHPhu5EgY2hvIG3DtCBow6xuaCBxdeG6p24gdGjhu4MuIA0KICBN4buZdCBjw6FjaCB04buVbmcgcXXDoXQ6IA0KICA8L2Rpdj4NCiAgPGRpdiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIj4NCkdpw6EgdHLhu4sgcXVhbiBzw6F0IGPhu6dhICR5JCA9IEdpw6EgdHLhu4sgdGnDqm4gbMaw4bujbmcgKyBQaOG6p24gZMawIChyZXNpZHVhbCkNCiANCiAgJHkgPVxoYXR7eX0gKyBlJA0KPC9kaXY+IA0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQogIEdpw6EgdHLhu4sgJFxoYXR7eX0kIGPDsm4gxJHGsOG7o2MgZ+G7jWkgbMOgICpleHBlY3RlZCB2YWx1ZSouIFBo4bqnbiAkKGErYip4KSQgbMOgIHBo4bqnbiBtw7QgaMOsbmggaOG7hyB0aOG7kW5nLCB2w6AgcGjhuqduIG5oaeG7hXUobm9pc2UpICRlJA0KICDGr+G7m2MgdMOtbmggdGhhbSBz4buROg0KICBHaeG6oyBz4butIGNow7puZyB0YSBjw7MgMiDEkWnhu4NtICQoeF97MX0sIHlfezF9KSQgdsOgICQoeF97Mn0sIHlfezJ9KSQgdHJvbmcgbeG7mXQga2hv4bqjbmcga2jDtG5nIGdpYW4gJHgteSQsIHbDoCBt4bulYyB0acOqdSBsw6AgdMOsbSBt4buZdCDEkcaw4budbmcgdGjhurNuZyDEkeG7gyBu4buRaSAyIMSRaeG7g20gbsOgeS4gQ8OhY2ggxJHGoW4gZ2nhuqNuIG5o4bqldCBsw6AgZMO5bmcgc2xvcGUgKGjhu4cgc+G7kSBnw7NjKSB2w6AgZ3JhZGllbnQoxJHhu5kgZOG7kWMpLiANCiAgDQohW2FsdF0oQzovVXNlcnMvTXlQQy9EZXNrdG9wL0xpbmVhciBSZWdyZXNzaW9uL0NvcnJlbGF0aW9uLzEucG5nKQ0KPC9kaXY+DQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiPg0KDQokc2xvcGUgPSBcZnJhY3tcRGVsdGEgeX17XERlbHRhIHh9JCA9ICRcZnJhY3t5X3syfS15X3sxfX17eF97Mn0teF97MX19JA0KPC9kaXY+IA0KICANCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KICBN4bulYyB0acOqdSDEkcawYSByYSBsw6AgdMOsbSAkXGFscGhhJCB2w6AgJFxiZXRhJCBzYW8gY2hvOg0KPC9kaXY+DQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiPg0KDQokbWluXFNpZ21hICh5LVxhbHBoYS1cYmV0YSp4KV4yJCBsw6AgYsOpIG5o4bqldC4NCjwvZGl2PiANCiMgxq/hu5tjIHTDrW5oIHRoYW0gc+G7kSBi4bqxbmcgUg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQogIFRyb25nIFIsIGTDuW5nIGjDoG0gJGxtKCkkIGTDuW5nIMSR4buDIMaw4bubYyB0w61uaCB0aGFtIHPhu5EgY2hvIG3DtCBow6xuaCBo4buTaSBxdXkgdHV54bq/biB0w61uaCBi4bqxbmcgcGjGsMahbmcgcGjDoXAgYsOsbmggcGjGsMahbmcgdOG7kWkgdGhp4buDdS4gQ8O6IHBow6FwOg0KICAkbG0oIHlcc2ltIHgsIGRhdGEpJA0KPC9kaXY+DQogVHJvbmcgxJHDsywgJHkkIGzDoCBiaeG6v24gcGjhu6UgdGh14buZYywgJHgkIGzDoCBiaeG6v24gdGnDqm4gbMaw4bujbmcgaGF5IGPDsm4gZ+G7jWkgbMOgIGJp4bq/biDEkeG7mWMgbOG6rXAuIFRoZW8gYuG7mSBk4buvIGxp4buHdSB0aGFpa3kgcGjDrWEgdHLDqm4sIGNow7puZyB0YSBjw7MgdGjhu4MgbcO0IHThuqMgbmjGsCBzYXU6DQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiPg0KDQokd2VpZ2h0ID0gXGFscGhhICsgXGJldGEocGVyaW9kKSArIFxlcHNpbG9uJA0KDQo8L2Rpdj4NCg0KYGBge3IsIGV2YWwgPSBUUlVFfSANCm0gPSBsbSh3ZWlnaHQgfiBwZXJpb2QsIGRhdGEgPSB0aGFpa3kpDQpzdW1tYXJ5KG0pDQoNCmBgYA0KVGhlbyBr4bq/dCBxdeG6oyDEkcawYSByYSwgbcO0IGjDrG5oIGjhu5NpIHF1eSBz4bq9IGzDoDoNCiRXZWlnaHQgPSAtNDAyMC41ICsgMTgwLjQ2ICogUGVyaW9kJA0KDQojIERp4buFbiBnaeG6o2kgdGhhbSBz4buROg0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCiAgQ2jDum5nIHRhIGPDsyB0aOG7gyB0aOG7gyBoaeG7h24gbcO0IGjDrG5oIG7DoHkgYuG6sW5nIMSRxrDhu51uZyB0aOG6s25nIG5oxrAgc2F1LiDEkMaw4budbmcgYmnhu4N1IGRp4buFbiBtw6B1IMSR4buPIGNow61uaCBsw6AgZ2nDoSB0cuG7iyB0acOqbiBsxrDhu6NuZyAoLTQwMjAuNSArMTgwLjQ2ICogcGVyaW9kKSBj4bunYSBtw7QgaMOsbmg6DQo8L2Rpdj4NCg0KYGBge3IsIGV2YWwgPSBGQUxTRX0gDQoNCnBsb3Qod2VpZ2h0IH4gcGVyaW9kLCBwY2ggPSAxNiwgZGF0YSA9IHRoYWlreSkNCmFibGluZShsbSh3ZWlnaHQgfiBwZXJpb2QpLCBjb2wgPSAncmVkJykNCg0KDQoNCg0KDQpgYGAgIA0KDQojIyDDnSBuZ2jEqWEgY+G7p2EgKnNsb3BlKg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQogIFRoYW0gc+G7kSBxdWFuIHRy4buNbmcgbmjhuqV0IGPhu6dhIG3DtCBow6xuaCBo4buTaSBxdXkgY2jDrW5oIGzDoCAkXGJldGEkIGhheSAqc2xvcGUqLiDEkOG7gyBoaeG7g3UgcsO1IGjGoW4gw70gbmdoxKlhIGPhu6dhIHRoYW0gc+G7kSBuw6B5LCBjaMO6bmcgdGEgZMO5bmcgbcO0IGjDrG5oIGThu7EgxJFvw6FuIGNobyAyIHF1YW4gc8OhdCBzYXU6DQo8L2Rpdj4NCg0KMS4gUXVhbiBzw6F0IHRow6ptIDE6IE7hur91IHRoYWkga+G7syBsw6AgNDAgdHXhuqduLCB0cuG7jW5nIGzGsOG7o25nIHRy4bq7IHPGoSBzaW5oIHPhur0gbMOgOg0KICAkd2VpZ2h0ID0gLTQwMjAuNSArIDE4MC40NiAqIDQwID0gMzE5Ny45IChncmFtKSQNCjIuIE7hur91IHRoYWkga+G7syBsw6AgNDEgdHXhuqduLCB0cuG7jW5nIGzGsOG7o25nIHRy4bq7IHPGoSBzaW5oIHPhur0gbMOgOg0KICAkd2VpZ2h0ID0gLTQwMjAuNSArIDE4MC40NiAqIDQxID0gMzM3OC4zNiAoZ3JhbSkkDQogIERvIMSRw7MsIHPhu7Ega2jDoWMgYmnhu4d0IHbhu4EgdGhhaSBr4buzIGzDoCAzMzc4LjM2LTMxOTcuOSA9IDE4MC40NiAoZ3JhbSkNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KICDEkMOieSBjaMOtbmggbMOgICpzbG9wZSouIE3DtCBow6xuaCBuw6B5IGPDsyDDvSBuZ2jEqWEgbMOgIGtoaSB0aGFpIGvhu7MgxJHGsOG7o2MgdMSDbmcgbMOqbiAxIMSRxqFuIHbhu4sgKHR14bqnbikgdGjDrCB0cuG7jW5nIGzGsOG7o25nIHRy4bq7IHPGoSBzaW5oIHPhur0gdMSDbmcgbMOqbiB44bqlcCB44buJIDE4MC40NiBncmFtLg0KPC9kaXY+DQoNCg0KIyMgw50gbmdoxKlhIGPhu61hICRcYWxwaGEkDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KICBI4bqxbmcgc+G7kSAqaW50ZXJjZXB0KiA9IC00MDIwLjUgY8OzIG5naMSpYSBsw6Aga2hpIHBlcmlvZCA9IDAgdGjDrCB0cuG7jW5nIGzGsOG7o25nIGzDoCAtNDAyMC41LiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBy4bqxbmcgaOG6sW5nIHPhu5EgJFxhbHBoYSQgdHJvbmcgbcO0IGjDrG5oIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIGtow7RuZyBjw7Mgw70gbmdoxKlhLiBLaMO0bmcgY8OzIMO9IG5naMSpYSBi4bufaSB2w6wgdHLhu41uZyBsxrDhu6NuZyBraMO0bmcgdGjhu4MgbMOgIHPhu5Egw6JtLCB2w6AgdHJvbmcgdGjhu7FjIHThur8gdGjDrCBraMO0bmcgdGjhu4MgbsOgbyBjw7Mgc+G6o24gcGjhu6UgbsOgbyBjw7MgdGhhaSBr4buzIGzDoCAwIHR14bqnbi4gRG8gxJHDsywgxJHDtGkga2hpIGNow7puZyB0YSB4ZW0gJFxhbHBoYSQgbMOgIG3hu5l0ICJo4bqxbmcgc+G7kSBnaeG6oyDEkeG7i25oIG7DoG8gxJHDsyIuDQogIFR1eSBuaGnDqm4sIGNow7puZyB0YSBjw7MgdGjhu4MgYmnhur9uICRcYWxwaGEkIGPDsyDDvSBuZ2jEqWEgYuG6sW5nIGPDoWNoIGhvw6FuIGNodXnhu4NuIGJp4bq/biBwZXJpb2Qgc2FuZyDEkcahbiB24buLICR6JDoNCjwvZGl2Pg0KICANCiAgJHpwZXJpb2QgPSBcZnJhY3twZXJpb2QgLSB0cnVuZyBiw6xuaChwZXJpb2QpfXvEkOG7mSBs4buHY2ggY2h14bqpbiBj4bunYSBwZXJpb2R9JA0KICANCiAgR2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBj4bunYSBwZXJpb2QgbMOgIDM4LjUgdHXhuqduLCDEkeG7mSBs4buHY2ggY2h14bqpbiBsw6AgMy4xIHR14bqnbi4gxJBp4buBdSBuw6B5IGPDsyBuZ2jEqWEgbMOgIGtoaSB0cnVuZyBiw6xuaCBwZXJpb2QgbMOgIDM4LjUgdHXhuqduIHRow6wgenBlcmlvZCBi4bqxbmcgMC4NCiAgSG/DoW4gY2h1eeG7g24gbOG6oWkgdGhhbmcgxJFvOiANCiAgJHpwZXJpb2QgPSBzY2FsZShwZXJpb2QpJA0KICBUaGVvIHRoYW5nIMSRbyBt4bubaSB0aMOsICR6cGVyaW9kJCBz4bq9IGPDsyB0cnVuZyBiw6xuaCAoJFxvdmVybGluZXt6cGVyaW9kfSQpIGzDoCAwIHbDoCDEkeG7mSBs4buHY2ggY2h14bqpbiBsw6AgMS4NCiAgw4FwIGThu6VuZyBtw7QgaMOsbmggaOG7k2kgcXV5IGNobyAkenBlcmlvZCQ6DQogIA0KICAkbSA9IGxtKHdlaWdodCBcc2ltIHpwZXJpb2QsIGRhdGEgPSB0aGFpa3kpJA0KICAkc3VtbWFyeShtKSQNCmBgYHtyLCBldmFsID0gVFJVRX0gDQp0aGFpa3kkenBlcmlvZCA8LSBzY2FsZSh0aGFpa3kkcGVyaW9kKQ0KbT1sbSh3ZWlnaHQgfiB6cGVyaW9kLCBkYXRhID0gdGhhaWt5KQ0Kc3VtbWFyeShtKQ0KcGxvdChkZW5zaXR5KHRoYWlreSR6cGVyaW9kKSwgeGxhYiA9ICJ6cGVyaW9kIiwgbWFpbiA9ICJUaGUgZGVuc2l0eSBvZiB6cGVyaW9kIikNCg0KYGBgICANCg0KIyBLaeG7g20gdHJhIGdp4bqjIMSR4buLbmg6DQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCiAgTcO0IGjDrG5oIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oLCBjxaluZyB0xrDGoW5nIHThu7EgbmjGsCBwaMawxqFuZyBwaMOhcCBwaMOibiB0w61jaCB0xrDGoW5nIHF1YW4gZOG7sWEgdsOgbyA0IGdp4bqjIMSR4buLbmggc2F1Og0KICANCiAgKiBUaOG7qSBuaOG6pXQsIG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hICR4JCB2w6AgJHkkIHBo4bqjaSBsw6AgbeG7kWkgcXVhbiBo4buHIHR1eeG6v24gdMOtbmggdsOgIGzDoCB0aGFtIHPhu5EgdHV54bq/biB0w61uaA0KICAqIFRo4bupIGhhaSwgcGjDom4gYuG7kSBj4bunYSBwaOG6p24gZMawICRlX3tpfSQgcGjhuqNpIHR1w6JuIHRoZW8gKGhheSB44bqlcCB44buJKSBsdeG6rXQgcGjDom4gYuG7kSBjaHXhuqluIHbhu5tpIHRydW5nIGLDrG5oICQwJCB2w6AgcGjGsMahbmcgc2FpICRzXjIkLCB0aGVvIGvDvSBoaeG7h3U6ICRlIFxzaW0gTigwLFxzaWdtYV4yKSQNCiAgICogVGjhu6kgYmEsIHBoxrDGoW5nIHNhaSBj4bunYSAkeSQga2jDtG5nIHRoYXkgxJHhu5VpIHRoZW8gZ2nDoSB0cuG7iyAkeCQNCiAgICogVGjhu6kgdMawLCBjw6FjIGdpw6EgdHLhu4sgY+G7p2EgJHlfe2l9JCB2w6AgJHlfe2ktMX0kIMSR4buZYyBs4bqtcCB24bubaSBuaGF1Lg0KICAgQ2jDum5nIHRhIGhvw6BuIHRvw6BuIGPDsyB0aOG7gyBraeG7g20gdHJhIGPDoWMgZ2nhuqMgxJHhu4tuaCBuw6B5IHRow7RuZyBxdWEgYXV0b3Bsb3QoKSB0cm9uZyBwYWNrYWdlICpnZ2ZvcnRpZnkqDQogICA8L2Rpdj4NCg0KYGBge3IsIGV2YWwgPSBUUlVFfSANCiNpbnN0YWxsLnBhY2thZ2VzKCJnZ2ZvcnRpZnkiKQ0KbGlicmFyeShnZ2ZvcnRpZnkpDQphdXRvcGxvdChtKQ0KDQpgYGAgDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KICAtIEJp4buDdSDEkeG7kyAxIGLDqm4gdHLDoWkgcGjhuqduIHRyw6puIMSRxrBhIHJhIG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIGdpw6EgdHLhu4sgZOG7sSDEkW/DoW4gKHByZWRpY3Rpb24pICRcaGF0IHlfe2l9JCB2w6AgcGjhuqduIGTGsCAkZV97aX0kLCBjaG8gdGjhuqV5IGPDoWMgZ2nDoSB0cuG7iyBwaOG6p24gZMawIHhvYXkgcXVhbmggMCwgdOG7qWMgxJHDum5nIHbhu5tpIGdp4bqjIMSR4buLbmggbeG7mXQgduG7gSBnacOhIHRy4buLIHRydW5nIGLDrG5oIGPhu6dhIHBo4bqnbiBkxrANCiAgLSBCaeG7g3UgxJHhu5MgMiBiw6puIHBo4bqjaSBwaOG6p24gdHLDqm4gxJHGsGEgcmEgbeG7kWkgbGnDqm4gaOG7hyBnaeG7r2EgZ2nDoSB0cuG7iyBsw70gdGh1eeG6v3QgdsOgIHRo4buxYyB04bq/IGPhu6dhIHBo4bqnbiBkxrAuIE7hur91IHBow6JuIHBo4buRaSBj4bunYSBwaOG6p24gZMawIHR1w6JuIHRoZW8gbHXhuq10IHBow6JuIHBo4buRaSBDaHXhuqluIHRow6wgY8OhYyBnacOhIHRy4buLIG7hurFtIHRyw6puIMSRxrDhu51uZyBsw70gdGh1eeG6v3QgKGzhu4djaCB24bubaSB0cuG7pWMgJE9fe3h9JCkgZ8OzYyA0NSDEkeG7mSkuIERvIMSRw7MgdGhlbyBiaeG7g3UgxJHhu5MgdHLDqm4sIHBow7kgaOG7o3AgduG7m2kgZ2nhuqMgxJHhu4tuaCB0aOG7qSBoYWkuDQogIC0gQmnhu4N1IMSR4buTIHBo4bqnbiBkxrDhu5tpIGLDqm4gdHLDoWkgdHLDrG5oIGLDoHkgbeG7kWkgdMawxqFuZyBxdWFuIGdp4buvYSBnacOhIHRy4buLIGThu7EgxJFvw6FuIHbDoCBjxINuIHPhu5EgYuG6rWMgaGFpIGPhu6dhIHBo4bqnbiBkxrAuIEJp4buDdSDEkeG7kyBuw6B5IGNobyBjaMO6bmcgdGEgYmnhur90IHBoxrDGoW5nIHNhaSBj4bunYSBwaOG6p24gZMawIGPDsyBoYXkga2jDtG5nIGxpw6puIHF1YW4gxJHhur9uIGdpw6EgdHLhu4sgYmnhur9uIHRyw6puIHRy4bulYyB4LiBCaeG7g3UgxJHhu5MgY2hvIHRo4bqleSBraMO0bmcgY8OzIG3hu5FpIGxpw6puIHF1YW4sIHbDoCDEkWnhu4F1IG7DoHkgY2hvIGNow7puZyB0YSBiaeG6v3QgcuG6sW5nIGdp4bqjIMSR4buLbmggduG7gSDEkeG7k25nIGThuqFuZyBwaMawxqFuZyBzYWkgKGhvbW9nZW5laXR5KSBsw6AgY8OzIHRo4buDIGNo4bqlcCBuaOG6rW4gxJHGsOG7o2MuDQogIC0gQmnhu4N1IMSR4buTIHRo4bupIDQgZMaw4bubaSBjw7luZyBiw6puIHBo4bqjaSBow6BuZyBkxrDhu5tpIHRyw6xuaCBiw6B5IGdpw6EgdHLhu4sgKiJMZXZlcmFnZSIqIHbDoCBwaOG6p24gZMawIGNodeG6qW4gaMOzYS4gQmnhu4N1IMSR4buTIG7DoHkgY2hvIGNow7puZyB0YSBiaeG6v3QgY8OzIG5o4buvbmcgZ2nDoSB0cuG7iyBjw7Mg4bqjbmggaMaw4bufbmcgY2FvIGhheSBraMO0bmcgKGluZmx1ZW50aWFsIG9ic2VydmF0aW9uKS4gTmdv4bqhaSB0cuG7qyBt4buZdCB2w6BpIHF1YW4gc8OhdCAoc+G7kSAxNyksIHBo4bqnbiBjw7JuIGzhuqFpIMSR4buBdSBjw7MgZ2nDoSB0cuG7iyBwaOG6p24gZMawIGNodeG6qW4gaMOzYSBu4bqxbSB0cm9uZyBraG/huqNuZyB04burIC0yIMSR4bq/biArMi4gRG8gxJHDsyBjw7MgdGjhu4MgY2jhuqVwIG5o4bqtbiDEkcaw4bujYyBy4bqxbmcga2jDtG5nIGPDsyBnacOhIHRy4buLIG5nb+G6oWkgbGFpIChvdXRsaWVycykg4bqjbmggaMaw4bufbmcgxJHhur9uIG3DtCBow6xuaC4NCjwvZGl2Pg0KDQoNCg==