準備

  1. (自分のPCまたは教室のPCに)ログイン

  2. ウェッブ・ブラウザー(Google Chrome など)を起動

  3. (別のタブまたは ウィンドウで)PositCloud にログイン[Posit.cloud]

    • アカウントのない人はサイン・アップ [共有プロジェクト] から、Save a Permanent Copy)

    • RStudio を自分のコンピュータにインストールしている人は起動

  4. リンクの右上の Raw ボタンの右の Copy a raw file からコピーして演習用 R Markdown ファイルを作成(あとで再度解説します)[Rmd]

第4週

01/11(TH) 南部アフリカ諸国の貧困と不平等の現状1

      南部アフリカ諸国の貧困と不平等の現状2

第4週、第5週の講義では、貧困の問題が特に深刻な南部アフリカ諸国の問題を議論します。

World BankのINEQUALITY IN SOUTHERN AFRICA:AN ASSESSMENT OF THE SOUTHERN AFRICAN CUSTOMS UNION をテキストにしています。教育、失業、COVID-19の貧困に与える影響などを取り上げます。

01/16(TU) Rでデータサイエンス4:貧困 [演習資料]・[Main]

講義 1月11日(木)南部アフリカ諸国の状況


南部アフリカ5カ国の状況の分析

  • 南アフリカ(South Africa)、レソト(Lethoto)、エスワティニ(Eswatini, 旧 Swaziland)、ナミビア(Namivia)、ボツワナ(Botswana)

    • 受講感想にかえて:ジニ指数と所得分布 - 続編 [R Notebook], [Rmd]
      • 国のリストを変えてみよう:スリナム(Suriname), ベリーズ(Belize), ブラジル(Brazil), コロンビア(Colombia)
  • 本日は、別の指標から、これらの国についての貧困度の分析をします。

演習 1月16日(火)

01/16(TU) Rでデータサイエンス4:貧困 [Main]

Poverty rates at national poverty lines

Poverty headcount ratio at national poverty lines (% of population):SI.POV.NAHC [Link]

全国貧困人口比率は、全国貧困線以下で生活している人口の割合です。国の推定値は、世帯調査からの人口加重サブグループ推定値に基づいています。データが EU-SILC からのものである経済の場合、報告される年は所得基準年、つまり調査年の前年。


Poverty and Inequality―Poverty rates at international poverty lines

Poverty headcount ratio at $2.15 a day (2017 PPP) (% of population):SI.POV.DDAY [Link]

1日2.15ドルの貧困人口比率は、2017年の購買力調整後価格で1日2.15ドル未満で生活している人口の割合です。PPP 為替レートの改定により、各国の貧困率を以前の版で報告された貧困率と比較することができなくなった

Poverty headcount ratio at $3.65 a day (2017 PPP) (% of population):SI.POV.LMIC [Link]

1 日 3.65 ドルの貧困人口比率は、2017 年の国際価格で 1 日 3.65 ドル未満で生活している人口の割合

Poverty headcount ratio at $6.85 a day (2017 PPP) (% of population):SI.POV.UMIC [Link]

1日6.85ドルの貧困人口比率は、2017年の国際価格で1日6.85ドル未満で生活している人口の割合

復習

貧困は、どのような尺度で測るのだろうか。

一人当たりの購買力平価(Purchasing Power Parities)による国内総生産(Gross Domestic Product)

  • GDP per capita, PPP (constant 2017 international $): NY.GDP.PCAP.PP.KD [Link]

  • 12/13 極度に貧しい!? [R Notebook], [Rmd]

  • 国ごとの所得の平均のようなものはわかるが、極度の貧困の人がどの程度いるのかはわからない。


人口動態(demography)

  • 人口のデータ(総人口、出生率、死亡率、若年者扶養率、高齢者扶養率)

  • 12/20 人口動態(demography)[R Notebook], [Rmd]

  • 人口データは基本的で、国の値から個人の値を求めたり、他の国と比較しやすい割合から実際の数を求めるなどに必須


ジニ指数および所得分布

  • ジニ指数(Gini), 所得の下位10%, 20%, 20%-40%, 40%-60%, 60%-80%, 80%以上, 90%以上

  • 1/9 ジニって何!? [R Notebook], [Rmd]

  • 1/9 ジニ指数と所得分布 [R Notebook], [Rmd] (参考1/参考2付 [R Notebook])

  • 国の中での所得分布を見、かつ所得分配の公平さを一つの指標(ジニ指数)で表すことにより、比較も可能になったが、極度に貧困なひとがどのぐらいいるのかはわからない。

貧困者率

  • 生活するための基本的ニーズを賄うために必要とそれぞれの国が考える基準を満たしていない人口の割合

    • Poverty headcount ratio at national poverty lines (% of population):SI.POV.NAHC [Link]

    • 日本は? [Wikipedia]

  • $2.15/日 ($65.4/月, 785/年), $3.65($111.0/月, $1,332/年), $6.85($208.4/月, $2,500/年)

    • Poverty headcount ratio at $2.15 a day (2017 PPP) (% of population):SI.POV.DDAY [Link]

    • Poverty headcount ratio at $3.65 a day (2017 PPP) (% of population):SI.POV.LMIC [Link]

    • Poverty headcount ratio at $6.85 a day (2017 PPP) (% of population):SI.POV.UMIC [Link]


準備

library(tidyverse)
library(WDI)

データの読み込み(importing)

追加情報(地域・所得レベル)を読み込みたいので、extra=TRUE としてあります。

最初の1回目は、かならず実行してください。

df_poverty_rate <- WDI(
  indicator = c(ratio = "SI.POV.NAHC",
                under_2.15 = "SI.POV.DDAY",
                under_3.65 = "SI.POV.LMIC",
                under_6.85 = "SI.POV.UMIC"),
  extra = TRUE)

保存と読み込み

2回目からは、data から読み込めるようにしておきます。

最初の1回目は、かならず実行してください。

write_csv(df_poverty_rate, "data/poverty_rate.csv")
df_poverty_rate <- read_csv("data/poverty_rate.csv")
Rows: 16758 Columns: 16── Column specification ──────────────────────────────────────────────────────────────────
Delimiter: ","
chr  (7): country, iso2c, iso3c, region, capital, income, lending
dbl  (7): year, ratio, under_2.15, under_3.65, under_6.85, longitude, latitude
lgl  (1): status
date (1): lastupdated
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

データを見てみよう (viewing)

df_poverty_rate または、head(df_poverty_rate) と、str(df_poverty_rate)

df_poverty_rate

str(df_poverty_rate)
spc_tbl_ [16,758 × 16] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ country    : chr [1:16758] "Afghanistan" "Afghanistan" "Afghanistan" "Afghanistan" ...
 $ iso2c      : chr [1:16758] "AF" "AF" "AF" "AF" ...
 $ iso3c      : chr [1:16758] "AFG" "AFG" "AFG" "AFG" ...
 $ year       : num [1:16758] 2014 1971 2006 2013 1995 ...
 $ status     : logi [1:16758] NA NA NA NA NA NA ...
 $ lastupdated: Date[1:16758], format: "2023-12-18" "2023-12-18" ...
 $ ratio      : num [1:16758] NA NA NA NA NA NA NA NA NA NA ...
 $ under_2.15 : num [1:16758] NA NA NA NA NA NA NA NA NA NA ...
 $ under_3.65 : num [1:16758] NA NA NA NA NA NA NA NA NA NA ...
 $ under_6.85 : num [1:16758] NA NA NA NA NA NA NA NA NA NA ...
 $ region     : chr [1:16758] "South Asia" "South Asia" "South Asia" "South Asia" ...
 $ capital    : chr [1:16758] "Kabul" "Kabul" "Kabul" "Kabul" ...
 $ longitude  : num [1:16758] 69.2 69.2 69.2 69.2 69.2 ...
 $ latitude   : num [1:16758] 34.5 34.5 34.5 34.5 34.5 ...
 $ income     : chr [1:16758] "Low income" "Low income" "Low income" "Low income" ...
 $ lending    : chr [1:16758] "IDA" "IDA" "IDA" "IDA" ...
 - attr(*, "spec")=
  .. cols(
  ..   country = col_character(),
  ..   iso2c = col_character(),
  ..   iso3c = col_character(),
  ..   year = col_double(),
  ..   status = col_logical(),
  ..   lastupdated = col_date(format = ""),
  ..   ratio = col_double(),
  ..   under_2.15 = col_double(),
  ..   under_3.65 = col_double(),
  ..   under_6.85 = col_double(),
  ..   region = col_character(),
  ..   capital = col_character(),
  ..   longitude = col_double(),
  ..   latitude = col_double(),
  ..   income = col_character(),
  ..   lending = col_character()
  .. )
 - attr(*, "problems")=<externalptr> 

変数の選択(selecting)

利用しない変数もあるので select を使って変数を減らします。見やすいように、under_2.15 が NA のものは、削除してあります。

df_poverty_rate_selected <- df_poverty_rate |> drop_na(under_2.15) |>
  select(country, year, ratio, under_2.15, under_3.65, under_6.85, region)
df_poverty_rate_selected 

変形(Wide to Long Data)

四つの指標を同時にいくつか選択し比較したいので、一つの列(変数)にならべた、縦長データ(long data)も作成しておきます。

pivot_longer(ratio:under_6.85, names_to = "level", values_to = "value")

ここでは、ratio から under_6.85 を、level という名前の列にならべ、値を value という列に並べるようにしてあります。

確認するときは、value が NA のものは除き、country と、iso2c と、level と value の部分だけ取り出して確認しています。

df_poverty_rate_long <- df_poverty_rate_selected |> 
  pivot_longer(ratio:under_6.85, names_to = "level", values_to = "value")
df_poverty_rate_long |> drop_na(value) |> select(country, level, value, region)

df_poverty_rate_long <- df_poverty_rate_selected |> 
  pivot_longer(ratio:under_6.85, names_to = "level", values_to = "value")
df_poverty_rate_long |> drop_na(value) |> select(country, level, value, region)

年毎のデータの数の確認(number of data in each year)

df_poverty_rate_long |> drop_na(value) |> 
  group_by(year, level) |> summarize(n = n()) |> arrange(desc(year))
`summarise()` has grouped output by 'year'. You can override using the `.groups` argument.

それぞれの国での貧困率のデータ(ratio)が 多い場合も、絶対的な貧困率が多い場合もあるようだが、指標ごとに集計してみる。

df_poverty_rate_long |> filter(year %in% c(1960, 1970, 1980, 1990, 2000, 2010, 2020)) |> drop_na(value) |> group_by(year, level) |> summarize(n = n()) |>
  ggplot(aes(as.character(year), n, fill = level)) + geom_col(position = "dodge", col = "black", linewidht = 0.1) + labs(x = "year", y = "number of data")
`summarise()` has grouped output by 'year'. You can override using the `.groups` argument.Warning: Ignoring unknown parameters: `linewidht`


df_poverty_rate_long |> 
  filter(country %in% c("World", "Sub-Saharan Africa")) |> drop_na() |>
  ggplot(aes(year, value, col = level, linetype = country)) + geom_line()

Sub-Saharan Africa のデータはないようです。たしかに、ratio は、国ごとに決めるものですから、地域の場合には、ratio の値はないのでしょう。


df_poverty_rate_long |> filter(year %in% c(2000, 2010, 2020)) |> drop_na(value) |> 
  filter(region == "Aggregates") |> filter(level %in% c("ratio", "under_2.15")) |> group_by(country, year, level) |> summarize(n = n())
`summarise()` has grouped output by 'country', 'year'. You can override using the `.groups` argument.

Sub-Saharan Africa の国のデータについて

df_poverty_rate_long |> drop_na(value) |> 
  filter(region == "Sub-Saharan Africa") |> group_by(country, level) |> 
  summarize(n = n())
`summarise()` has grouped output by 'country'. You can override using the `.groups` argument.

アフリカ南部5カ国の分析

国のリストの設定

SOUTH_AFRICA_FIVE に、South Africa, Namibia, Eswatini, Botswana, Lesotho を設定

SOUTH_AFRICA_FIVE <- c("South Africa", "Namibia", "Eswatini", "Botswana", "Lesotho")

5カ国のデータを確認

df_poverty_rate_selected と、df_poverty_rate_long について、アフリカ南部5カ国のデータを確認


df_poverty_rate_selected |> filter(country %in% SOUTH_AFRICA_FIVE)

df_poverty_rate_long |> filter(country %in% SOUTH_AFRICA_FIVE)

各貧困率を折れ線グラフで描いてみる

南アフリカについて

df_poverty_rate_long |> 
  filter(country == "South Africa") |> drop_na(value) |>
  ggplot(aes(year, value, col = level)) + geom_line()

考察:2000年から2008年ごろまで減少しているが、その後、上昇傾向が見られる。


5カ国同時に

df_poverty_rate_long |> 
  filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(value) |>
  ggplot(aes(year, value, col = country, linetype = level)) + geom_line()

考察:複雑でわかりやすいとはいえない


df_poverty_rate_long |> 
  filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(value) |> filter(level != "ratio") |>
  ggplot(aes(year, value, col = country, linetype = level)) + geom_line()

考察:国ごとに決めた貧困率をのぞいてみた。多少改善した。しかし、あとは好み。


5カ国の最新のデータ

df_poverty_rate_selected |> 
  filter(country %in% SOUTH_AFRICA_FIVE) |>
  drop_na(under_2.15) |> group_by(country) |> filter(year == max(year)) |> 
  select(country, year, ratio:under_6.85)

考察:毎年データがあるわけではないので、それぞの国ごとに最新のものを見ることとする


南アフリカ5カ国の貧困度ごとの人口比

df_poverty_rate_long |> 
  filter(country %in% SOUTH_AFRICA_FIVE) |>
  drop_na(value) |> group_by(country) |> filter(year == max(year)) |>
  ggplot(aes(country, value, fill = level)) + geom_col(position = "dodge", col = "black", linewidth = 0.1) + 
  labs(title = "Povert Level Ratio of Five Countries", subtitle = "Botswana in 2015, Eswatini in 2016 ,Lesoto in 2017, Namibia in 2015 \nand South Africa in 2014")


いくつかの国の貧困度ごとの人口比

それぞれの国の、最も新しいデータを用いるものとします。

練習 次の POV_COUNTRIES_YOUR_CHOICE の部分を変更して、いくつかの国の貧困者の割合の表とグラフを作成してください。

POV_COUNTRIES_YOUR_CHOICE <- c("Myanmar", "Kenya", "China", "India", "Indonesia")

POV_COUNTRIES_YOUR_CHOICE <- c("Myanmar", "Kenya", "China", "India", "Indonesia")
df_poverty_rate |> 
  filter(country %in% POV_COUNTRIES_YOUR_CHOICE) |>
  drop_na(ratio) |> group_by(country) |> filter(year == max(year)) |> 
  select(country, iso2c, year, ratio:under_6.85)

df_poverty_rate_long |> 
  filter(country %in% POV_COUNTRIES_YOUR_CHOICE) |>
  drop_na(value) |> group_by(country) |> filter(year == max(year)) |>
  ggplot(aes(country, value, fill = level)) + geom_col(position = "dodge", col = "black", linewidth = 0.1) + 
  labs(title = "Poverty Level Ratio of Countries", subtitle = "Using the most recent data")


折れ線グラフによる比較

線を通常より太くしています。初期値は、GeomLine$default_aes でわかります。

df_poverty_rate_long |> filter(country %in% c("China", "India")) |>
  drop_na(value) |>
  ggplot(aes(year, value, col = country, linetype = level)) + geom_line(linewidth = 1)


ヒストグラム(Histogram)

df_poverty_rate |> drop_na(under_2.15) |> filter(region != "Aggregates") |>
  filter(under_2.15 > 25) |>
  ggplot(aes(under_2.15, fill = region)) + geom_histogram(bins = 10, col = "black", linewidth = 0.1)

ファイルリンク

  • PositCloud 共有リンク:https://posit.cloud/content/5539763

    • 貧困率 - Poverty Rate(poverty_rate.Rmd) [リンク], [Rmd]
      • より詳細なもの:poverty_rate_long.Rmd [リンク], [Rmd]
        • PositCloud では、メモリーオーバー
  • R Notebook のソースファイル(Rmd)を取得する三つの方法

    1. Rmd のリンクをクリックし Raw の横の Copy a raw file からコピー、新規 RMarkdown ファイルを PositCloud または RStudio のプロジェクト内に作成しペースト

    2. PositCloud 共有リンクの ges001 のディレクトリ(フォルダから探す)ファイルを開き、全体を選択してコピーし、自分の RStudio または、PositCloud のファイルで、RMarkdown ファイルを新規作成しペースト

    3. リンクを開き、右上の Code から、Rmd ファイルをダウンロードとし、それを、自分の RStudio または、PositCloud のプロジェクトに移動(Upload)

作業手順とまとめ

  • パッケージ(Package)の利用:

    • インストール(installation):Tools > Install Packages

    • ロード(load)library(tidyverse); library(WDI); library(showtext); library(DescTools)

  • データの取得:WDI(indicator = c(pop = "SP.POP.TOTL"))

    • WDI(indicator = c(ratio = "SI.POV.NAHC", under_2.15 = "SI.POV.DDAY", under_3.65 = "SI.POV.LMIC", under_6.85 = "SI.POV.UMIC"), extra = TRUE)

    • data に書き出し、そこから読み込むと良い。

      • write_csv(df_poverty_rate, "data/poverty_rate.csv")

      • read_csv("data/poverty_rate.csv")

  • データを見る:df_poverty_rate , head(df_poverty_rate), str(df_poverty_rate)


データの変形

  • 変数の選択:select(country, year, ratio, under_2.15, under_3.65, under_6.85, region)

  • データの変形(Long data):pivot_longer(ratio:under_6.85, names_to = "level", values_to = "value")

  • 特定の行の取得:filter(), drop_na(), distinct()

  • 行の順番の並び替え:arrange(desc(year))

  • グループ分け:group_by() , group_by(year, level) |> summarize(n = n())


可視化

  • 折れ線グラフ

    • ggplot(aes(x = year, y = under_2.15) + geom_line()

    • ggplot(aes(x = year, y = under_2.15, col = country) + geom_line()

  • ヒストグラム(度数分布)

    • ggplot(aes(under_2.15, fill = region)) + geom_histogram(bins = 15)
  • 箱ひげ図(Boxplot)

    • ggplot(aes(under_2.15, region, fill = region)) + geom_boxplot()

  • 棒グラフ

    • ggplot(aes(year)) + geom_bar()

    • ggplot(aes(levels, value)) + geom_col()

    • ggplot(aes(x = levels, y = value, fill = country)) + geom_col(position = "dodge")

    • ggplot(aes(x = gini, fill = region)) + geom_histogram()

  • 散布図(+回帰直線)

    • ggplot(aes(gini, 90-100)) + geom_point()

    • ggplot(aes(gini, 80-100)) + geom_point() + geom_smooth(formula = 'y ~ x', method = "lm")

常に、考察、気づいたことを、記録してください。

課題

データは、上で使った二つのデータを使います。

  • df_poverty_rate_selected : wide データと言われるものです。貧困率(under_2.15)のデータを含まないものは削除してあります。

  • df_poverty_rate_long :long データと言われるものです。

練習:データの確認

  1. df_poverty_rate_selected と、df_poverty_rate_long を見てみましょう。どうしますか。

Hint:そのままデータ、head(データ)、Environment から、データを選択

  1. 南アメリカで、ジニ指数が大きいのは、以下の4つの国です。Suriname, Belize, Brazil, Colombia。それを、CHOSEN_GINI_COUNTRIES に代入してください。

Hint:「SOUTH_AFRICA_FIVE に、South Africa, Namibia, Eswatini, Botswana, Lesotho を設定」を参照

  1. df_poverty_rate_selectedの南アメリカ4カ国の最新のデータだけを表示してみましょう。

Hint:SOUTH_AFRICA_FIVE の場合どのようにしたか考えてみましょう。

気づいたこと


南アメリカ4カ国についての分析

  1. 4カ国、それぞれの、貧困率の年次変化を折れ線グラフにより表示

下は、ブラジルについてのものですが、他の3カ国で、データがあるものについては、同様のグラフを描いてください。

df_poverty_rate_long |> filter(country == "Brazil") |> drop_na(value) |>
  ggplot(aes(year, value, col = level)) + geom_line() +
  labs(title = "Poverty Ratio of Brasil")

気づいたこと


南アメリカ4カ国の貧困度ごとの人口比の棒グラフ

  1. 貧困度ごとの人口比の棒グラフを描いてみましょう。

Hint: 南アフリカ5カ国の貧困度ごとの人口比の棒グラフ

気づいたこと


練習:貧困度ごとの人口比

課題にある 1 から 5.

提出はしなくて良いですが、ぜひ実際に手を動かして実行してください。

参考文献

  1. 「みんなのデータサイエンス - Data Science for All」[はじめてのデータサイエンス]

    • 導入として、GDP(国内総生産)のデータを使って説明しています。
  2. Posit Recipes(旧 Posit Primers): The Basics 対話型の演習サイトの最初 [Link]

  3. Posit Cheat Sheet. 早見表です。印刷して使うために、PDF も提供しています。[Site Link]

  4. DataCamp Cheat Sheet: Tidyverse for Biginners. データサイエンスの教育をしている会社の早見表の一つです。基本が簡単にまとまっています。[Link]

LS0tCnRpdGxlOiAiR0VTIDAwMSDmvJTnv5I0IgphdXRob3I6ICJILiBTdXp1a2kiCmRhdGU6ICIyMDI05bm0MeaciDE25pelIgpvdXRwdXQ6CiAgaW9zbGlkZXNfcHJlc2VudGF0aW9uOgogICAgd2lkZXNjcmVlbjogdHJ1ZQogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgaHRtbF9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBwYWdlZAogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKLS0tCgojIyDmupblgpkKCjEuICDvvIjoh6rliIbjga5QQ+OBvuOBn+OBr+aVmeWupOOBrlBD44Gr77yJ44Ot44Kw44Kk44OzCgoyLiAg44Km44Kn44OD44OW44O744OW44Op44Km44K244O877yIR29vZ2xlIENocm9tZSDjgarjganvvInjgpLotbfli5UKCiAgICAtICAgTW9vZGxlIOOBriBHRVMwMDEg57WM5riI44Go57WM5riI5a2m44Gu44K144Kk44OI44GL44KJ44CB44GT44Gu44K544Op44Kk44OJ44Gu44Oa44O844K444KS6KGo56S677yI44Oq44Oz44Kv44CMUuOBp+ODh+ODvOOCv+OCteOCpOOCqOODs+OCueOAjVsqKmh0dHBzOi8vZHMtc2wuZ2l0aHViLmlvL2ludHJvMnIvZ2VzMDAxLyoqXShodHRwczovL2RzLXNsLmdpdGh1Yi5pby9pbnRybzJyL2dlczAwMS8p77yJCgozLiAg77yI5Yil44Gu44K/44OW44G+44Gf44GvIOOCpuOCo+ODs+ODieOCpuOBp++8iVBvc2l0Q2xvdWQg44Gr44Ot44Kw44Kk44OzW1tQb3NpdC5jbG91ZF0oaHR0cHM6Ly9wb3NpdC5jbG91ZC8pXQoKICAgIC0gICDjgqLjgqvjgqbjg7Pjg4jjga7jgarjgYTkurrjga/jgrXjgqTjg7Pjg7vjgqLjg4Pjg5cgW1vlhbHmnInjg5fjg63jgrjjgqfjgq/jg4hdKGh0dHBzOi8vcG9zaXQuY2xvdWQvY29udGVudC81NTM5NzYzKV0g44GL44KJ44CBU2F2ZSBhIFBlcm1hbmVudCBDb3B577yJCgogICAgLSAgIFJTdHVkaW8g44KS6Ieq5YiG44Gu44Kz44Oz44OU44Ol44O844K/44Gr44Kk44Oz44K544OI44O844Or44GX44Gm44GE44KL5Lq644Gv6LW35YuVCgo0LiAg44Oq44Oz44Kv44Gu5Y+z5LiK44GuIFJhdyDjg5zjgr/jg7Pjga7lj7Pjga4gQ29weSBhIHJhdyBmaWxlIOOBi+OCieOCs+ODlOODvOOBl+OBpua8lOe/kueUqCBSIE1hcmtkb3duIOODleOCoeOCpOODq+OCkuS9nOaIkO+8iOOBguOBqOOBp+WGjeW6puino+iqrOOBl+OBvuOBme+8iVtbUm1kXShodHRwczovL2dpdGh1Yi5jb20vZHMtc2wvaW50cm8yci9ibG9iL21haW4vZG9jcy9nZXMwMDEvcG92ZXJ0eV9yYXRlLlJtZCldCgojIyDnrKw06YCxCgowMS8xMShUSCnjgIDljZfpg6jjgqLjg5Xjg6rjgqvoq7jlm73jga7osqflm7DjgajkuI3lubPnrYnjga7nj77nirYxCgrjgIDjgIDjgIDjgIDjgIDjgIDljZfpg6jjgqLjg5Xjg6rjgqvoq7jlm73jga7osqflm7DjgajkuI3lubPnrYnjga7nj77nirYyCgrnrKw06YCx44CB56ysNemAseOBruism+e+qeOBp+OBr+OAgeiyp+WbsOOBruWVj+mhjOOBjOeJueOBq+a3seWIu+OBquWNl+mDqOOCouODleODquOCq+iruOWbveOBruWVj+mhjOOCkuitsOirluOBl+OBvuOBmeOAggoKV29ybGQgQmFua+OBrklORVFVQUxJVFkgSU4gU09VVEhFUk4gQUZSSUNBOkFOIEFTU0VTU01FTlQgT0YgVEhFIFNPVVRIRVJOIEFGUklDQU4gQ1VTVE9NUyBVTklPTiDjgpLjg4bjgq3jgrnjg4jjgavjgZfjgabjgYTjgb7jgZnjgILmlZnogrLjgIHlpLHmpa3jgIFDT1ZJRC0xOeOBruiyp+WbsOOBq+S4juOBiOOCi+W9semfv+OBquOBqeOCkuWPluOCiuS4iuOBkuOBvuOBmeOAggoKMDEvMTYoVFUp44CAUuOBp+ODh+ODvOOCv+OCteOCpOOCqOODs+OCuTQ66LKn5ZuwIFtb5ryU57+S6LOH5paZXShodHRwczovL2RzLXNsLmdpdGh1Yi5pby9pbnRybzJyL2dlczAwMS9wb3ZlcnR5X3JhdGUubmIuaHRtbCld44O7W1tNYWluXShodHRwczovL2RzLXNsLmdpdGh1Yi5pby9pbnRybzJyL2dlczAwMS9pbmRleC5odG1sKV0KCiMjIOism+e+qSAx5pyIMTHml6XvvIjmnKjvvInljZfpg6jjgqLjg5Xjg6rjgqvoq7jlm73jga7nirbms4EKCi0gICBJTkVRVUFMSVRZIElOIFNPVVRIRVJOIEFGUklDQToLQU4gQVNTRVNTTUVOVCBPRiBUSEUgU09VVEhFUk4gQUZSSUNBTgtDVVNUT01TIFVOSU9OIFtbUmVwb3J0XShodHRwczovL2RvY3VtZW50czEud29ybGRiYW5rLm9yZy9jdXJhdGVkL2VuLzA5OTEyNTMwMzA3MjIzNjkwMy9wZGYvUDE2NDkyNzBjMDJhMWYwNmIwYTNhZTAyZTU3ZWFkZDdhODIucGRmKV0gW1tMaW5rXShodHRwczovL29wZW5rbm93bGVkZ2Uud29ybGRiYW5rLm9yZy9lbnRpdGllcy9wdWJsaWNhdGlvbi85ZjhlNDA3My0yNWY5LTU2MmMtOGUzYi01NDFjOTlkZDQyY2IpXQoKICAgIC0gICBFeGVjdXRpdmUgc3VtbWFyeQoKICAgIC0gICBDaGFwdGVyIDHjgIBJbmVxdWFsaXR5IGluIHRoZSBTb3V0aGVybiBBZnJpY2FuIEN1c3RvbXMgVW5pb24KCiAgICAtICAgQ2hhcHRlciAy44CAVGhlIHJvbGUgb2YgaW5oZXJpdGVkIGNpcmN1bXN0YW5jZXMKCiAgICAtICAgQ2hhcHRlciAz44CAVGhlIHJvbGUgb2YgdGhlIHByaW1hcnkgaW5jb21lIGRpc3RyaWJ1dGlvbgoKICAgIC0gICBDaGFwdGVyIDTjgIBUaGUgcm9sZSBvZiB0aGUgc2Vjb25kYXJ5IGluY29tZSBkaXN0cmlidXRpb24KCiAgICAtICAgQ2hhcHRlciA144CAVGhlIHJvbGUgb2YgdGhlIHRlcnRpYXJ5IGluY29tZSBkaXN0cmlidXRpb24gYW5kIGZpc2NhbCBwb2xpY3kKCiAgICAtICAgQ2hhcHRlciA244CAVGhlIHJvbGUgb2Ygc2hvY2tzCgogICAgLSAgIENoYXB0ZXIgN+OAgEFkZHJlc3NpbmcgaW5lcXVhbGl0eSBpbiBTQUNVOiBBIHBvbGljeSBkaXNjdXNzaW9uCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIyDljZfpg6jjgqLjg5Xjg6rjgqvvvJXjgqvlm73jga7nirbms4Hjga7liIbmnpAKCi0gICDljZfjgqLjg5Xjg6rjgqvvvIhTb3V0aCBBZnJpY2HvvInjgIHjg6zjgr3jg4jvvIhMZXRob3Rv77yJ44CB44Ko44K544Ov44OG44Kj44OL77yIRXN3YXRpbmksIOaXpyBTd2F6aWxhbmTvvInjgIHjg4rjg5/jg5PjgqLvvIhOYW1pdmlh77yJ44CB44Oc44OE44Ov44OK77yIQm90c3dhbmHvvIkKCiAgICAtICAg5Y+X6Kyb5oSf5oOz44Gr44GL44GI44Gm77ya44K444OL5oyH5pWw44Go5omA5b6X5YiG5biDIC0g57aa57eoIFtbUiBOb3RlYm9va10oaHR0cHM6Ly9kcy1zbC5naXRodWIuaW8vaW50cm8yci9nZXMwMDEvZ2luaV91cGRhdGVkLm5iLmh0bWwpXSwgW1tSbWRdKGh0dHBzOi8vZ2l0aHViLmNvbS9kcy1zbC9pbnRybzJyL2Jsb2IvbWFpbi9kb2NzL2dlczAwMS9naW5pX3VwZGF0ZWQuUm1kKV0KICAgICAgICAtICAg5Zu944Gu44Oq44K544OI44KS5aSJ44GI44Gm44G/44KI44GG77ya44K544Oq44OK44Og77yIU3VyaW5hbWXvvIksIOODmeODquODvOOCuu+8iEJlbGl6Ze+8iSwg44OW44Op44K444Or77yIQnJhemls77yJLCDjgrPjg63jg7Pjg5PjgqLvvIhDb2xvbWJpYe+8iQoKLSAgIOacrOaXpeOBr+OAgeWIpeOBruaMh+aomeOBi+OCieOAgeOBk+OCjOOCieOBruWbveOBq+OBpOOBhOOBpuOBruiyp+WbsOW6puOBruWIhuaekOOCkuOBl+OBvuOBmeOAggoKIyDmvJTnv5IgMeaciDE25pel77yI54Gr77yJCgojIyAwMS8xNihUVSnjgIBS44Gn44OH44O844K/44K144Kk44Ko44Oz44K5NDrosqflm7AgW1tNYWluXShodHRwczovL2RzLXNsLmdpdGh1Yi5pby9pbnRybzJyL2dlczAwMS9nZXMwMDEtbWFpbi5uYi5odG1sKV0KCioqUG92ZXJ0eSByYXRlcyBhdCBuYXRpb25hbCBwb3ZlcnR5IGxpbmVzKioKClBvdmVydHkgaGVhZGNvdW50IHJhdGlvIGF0IG5hdGlvbmFsIHBvdmVydHkgbGluZXMgKCUgb2YgcG9wdWxhdGlvbinvvJpTSS5QT1YuTkFIQyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TSS5QT1YuTkFIQyldCgrlhajlm73osqflm7Dkurrlj6Pmr5Tnjofjga/jgIHlhajlm73osqflm7Dnt5rku6XkuIvjgafnlJ/mtLvjgZfjgabjgYTjgovkurrlj6Pjga7libLlkIjjgafjgZnjgILlm73jga7mjqjlrprlgKTjga/jgIHkuJbluK/oqr/mn7vjgYvjgonjga7kurrlj6PliqDph43jgrXjg5bjgrDjg6vjg7zjg5fmjqjlrprlgKTjgavln7rjgaXjgYTjgabjgYTjgb7jgZnjgILjg4fjg7zjgr/jgYwgRVUtU0lMQyDjgYvjgonjga7jgoLjga7jgafjgYLjgovntYzmuIjjga7loLTlkIjjgIHloLHlkYrjgZXjgozjgovlubTjga/miYDlvpfln7rmupblubTjgIHjgaTjgb7jgoroqr/mn7vlubTjga7liY3lubTjgIIKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKKipQb3ZlcnR5IGFuZCBJbmVxdWFsaXR54oCVUG92ZXJ0eSByYXRlcyBhdCBpbnRlcm5hdGlvbmFsIHBvdmVydHkgbGluZXMqKgoKUG92ZXJ0eSBoZWFkY291bnQgcmF0aW8gYXQgXCQyLjE1IGEgZGF5ICgyMDE3IFBQUCkgKCUgb2YgcG9wdWxhdGlvbinvvJpTSS5QT1YuRERBWSBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TSS5QT1YuRERBWSldCgox5pelMi4xNeODieODq+OBruiyp+WbsOS6uuWPo+avlOeOh+OBr+OAgTIwMTflubTjga7os7zosrflipvoqr/mlbTlvozkvqHmoLzjgacx5pelMi4xNeODieODq+acqua6gOOBp+eUn+a0u+OBl+OBpuOBhOOCi+S6uuWPo+OBruWJsuWQiOOBp+OBmeOAglBQUCDngrrmm7/jg6zjg7zjg4jjga7mlLnlrprjgavjgojjgorjgIHlkITlm73jga7osqflm7DnjofjgpLku6XliY3jga7niYjjgafloLHlkYrjgZXjgozjgZ/osqflm7Dnjofjgajmr5TovIPjgZnjgovjgZPjgajjgYzjgafjgY3jgarjgY/jgarjgaPjgZ8KClBvdmVydHkgaGVhZGNvdW50IHJhdGlvIGF0IFwkMy42NSBhIGRheSAoMjAxNyBQUFApICglIG9mIHBvcHVsYXRpb24p77yaU0kuUE9WLkxNSUMgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU0kuUE9WLkxNSUMpXQoKMSDml6UgMy42NSDjg4njg6vjga7osqflm7Dkurrlj6Pmr5Tnjofjga/jgIEyMDE3IOW5tOOBruWbvemam+S+oeagvOOBpyAxIOaXpSAzLjY1IOODieODq+acqua6gOOBp+eUn+a0u+OBl+OBpuOBhOOCi+S6uuWPo+OBruWJsuWQiAoKUG92ZXJ0eSBoZWFkY291bnQgcmF0aW8gYXQgXCQ2Ljg1IGEgZGF5ICgyMDE3IFBQUCkgKCUgb2YgcG9wdWxhdGlvbinvvJpTSS5QT1YuVU1JQyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TSS5QT1YuVU1JQyldCgox5pelNi44NeODieODq+OBruiyp+WbsOS6uuWPo+avlOeOh+OBr+OAgTIwMTflubTjga7lm73pmpvkvqHmoLzjgacx5pelNi44NeODieODq+acqua6gOOBp+eUn+a0u+OBl+OBpuOBhOOCi+S6uuWPo+OBruWJsuWQiAoKIyMg5b6p57+SCgrosqflm7Djga/jgIHjganjga7jgojjgYbjgarlsLrluqbjgafmuKzjgovjga7jgaDjgo3jgYbjgYvjgIIKCiMjIyDkuIDkurrlvZPjgZ/jgorjga7os7zosrflipvlubPkvqHvvIhQdXJjaGFzaW5nIFBvd2VyIFBhcml0aWVz77yJ44Gr44KI44KL5Zu95YaF57eP55Sf55Sj77yIR3Jvc3MgRG9tZXN0aWMgUHJvZHVjdO+8iQoKLSAgIEdEUCBwZXIgY2FwaXRhLCBQUFAgKGNvbnN0YW50IDIwMTcgaW50ZXJuYXRpb25hbCBcJCk6IE5ZLkdEUC5QQ0FQLlBQLktEIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL05ZLkdEUC5QQ0FQLlBQLktEKV0KCi0gICAxMi8xMyDmpbXluqbjgavosqfjgZfjgYTvvIHvvJ8gW1tSIE5vdGVib29rXShodHRwczovL2RzLXNsLmdpdGh1Yi5pby9pbnRybzJyL2dlczAwMS9wb3ZlcnR5Lm5iLmh0bWwpXSwgW1tSbWRdKGh0dHBzOi8vZ2l0aHViLmNvbS9kcy1zbC9pbnRybzJyL2Jsb2IvbWFpbi9kb2NzL2dlczAwMS9wb3ZlcnR5LlJtZCldCgotICAg5Zu944GU44Go44Gu5omA5b6X44Gu5bmz5Z2H44Gu44KI44GG44Gq44KC44Gu44Gv44KP44GL44KL44GM44CB5qW15bqm44Gu6LKn5Zuw44Gu5Lq644GM44Gp44Gu56iL5bqm44GE44KL44Gu44GL44Gv44KP44GL44KJ44Gq44GE44CCCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIyDkurrlj6Pli5XmhYvvvIhkZW1vZ3JhcGh577yJCgotICAg5Lq65Y+j44Gu44OH44O844K/77yI57eP5Lq65Y+j44CB5Ye655Sf546H44CB5q275Lqh546H44CB6Iul5bm06ICF5om26aSK546H44CB6auY6b2i6ICF5om26aSK546H77yJCgotICAgMTIvMjAg5Lq65Y+j5YuV5oWL77yIZGVtb2dyYXBoee+8iVtbUiBOb3RlYm9va10oaHR0cHM6Ly9kcy1zbC5naXRodWIuaW8vaW50cm8yci9nZXMwMDEvZGVtb2dyYXBoeS5uYi5odG1sKV0sIFtbUm1kXShodHRwczovL2dpdGh1Yi5jb20vZHMtc2wvaW50cm8yci9ibG9iL21haW4vZG9jcy9nZXMwMDEvZGVtb2dyYXBoeS5SbWQpXQoKLSAgIOS6uuWPo+ODh+ODvOOCv+OBr+WfuuacrOeahOOBp+OAgeWbveOBruWApOOBi+OCieWAi+S6uuOBruWApOOCkuaxguOCgeOBn+OCiuOAgeS7luOBruWbveOBqOavlOi8g+OBl+OChOOBmeOBhOWJsuWQiOOBi+OCieWun+mam+OBruaVsOOCkuaxguOCgeOCi+OBquOBqeOBq+W/hemgiAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyMg44K444OL5oyH5pWw44GK44KI44Gz5omA5b6X5YiG5biDCgotICAg44K444OL5oyH5pWw77yIR2luae+8iSwg5omA5b6X44Gu5LiL5L2NMTAlLCAyMCUsIDIwJS00MCUsIDQwJS02MCUsIDYwJS04MCUsIDgwJeS7peS4iiwgOTAl5Lul5LiKCgotICAgMS85IOOCuOODi+OBo+OBpuS9le+8ge+8nyBbW1IgTm90ZWJvb2tdKGh0dHBzOi8vZHMtc2wuZ2l0aHViLmlvL2ludHJvMnIvZ2VzMDAxL3doYXRfaXNfZ2luaS5uYi5odG1sKV0sIFtbUm1kXShodHRwczovL2dpdGh1Yi5jb20vZHMtc2wvaW50cm8yci9ibG9iL21haW4vZG9jcy9nZXMwMDEvd2hhdF9pc19naW5pLlJtZCldCgotICAgMS85IOOCuOODi+aMh+aVsOOBqOaJgOW+l+WIhuW4gyBbW1IgTm90ZWJvb2tdKGh0dHBzOi8vZHMtc2wuZ2l0aHViLmlvL2ludHJvMnIvZ2VzMDAxL2dpbmkubmIuaHRtbCldLCBbW1JtZF0oaHR0cHM6Ly9naXRodWIuY29tL2RzLXNsL2ludHJvMnIvYmxvYi9tYWluL2RvY3MvZ2VzMDAxL2dpbmkuUm1kKV3jgIDvvIjlj4LogIMxL+WPguiAgzLku5ggW1tSIE5vdGVib29rXShodHRwczovL2RzLXNsLmdpdGh1Yi5pby9pbnRybzJyL2dlczAwMS9naW5pX2xvbmcubmIuaHRtbCld77yJCgotICAg5Zu944Gu5Lit44Gn44Gu5omA5b6X5YiG5biD44KS6KaL44CB44GL44Gk5omA5b6X5YiG6YWN44Gu5YWs5bmz44GV44KS5LiA44Gk44Gu5oyH5qiZ77yI44K444OL5oyH5pWw77yJ44Gn6KGo44GZ44GT44Go44Gr44KI44KK44CB5q+U6LyD44KC5Y+v6IO944Gr44Gq44Gj44Gf44GM44CB5qW15bqm44Gr6LKn5Zuw44Gq44Gy44Go44GM44Gp44Gu44GQ44KJ44GE44GE44KL44Gu44GL44Gv44KP44GL44KJ44Gq44GE44CCCgojIyDosqflm7DogIXnjocKCi0gICDnlJ/mtLvjgZnjgovjgZ/jgoHjga7ln7rmnKznmoTjg4vjg7zjgrrjgpLos4TjgYbjgZ/jgoHjgavlv4XopoHjgajjgZ3jgozjgZ7jgozjga7lm73jgYzogIPjgYjjgovln7rmupbjgpLmuoDjgZ/jgZfjgabjgYTjgarjgYTkurrlj6Pjga7libLlkIgKCiAgICAtICAgUG92ZXJ0eSBoZWFkY291bnQgcmF0aW8gYXQgbmF0aW9uYWwgcG92ZXJ0eSBsaW5lcyAoJSBvZiBwb3B1bGF0aW9uKe+8mlNJLlBPVi5OQUhDIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NJLlBPVi5OQUhDKV0KCiAgICAtICAg5pel5pys44Gv77yfIFtbV2lraXBlZGlhXShodHRwczovL2phLndpa2lwZWRpYS5vcmcvd2lraS8lRTYlOTclQTUlRTYlOUMlQUMlRTMlODElQUUlRTglQjIlQTclRTUlOUIlQjApXQoKLSAgIFwkMi4xNS/ml6UgKFwkNjUuNC/mnIgsIDc4NS/lubQpLCBcJDMuNjXvvIhcJDExMS4wL+aciCwgXCQxLDMzMi/lubTvvIksIFwkNi44Ne+8iFwkMjA4LjQv5pyILCBcJDIsNTAwL+W5tO+8iQoKICAgIC0gICBQb3ZlcnR5IGhlYWRjb3VudCByYXRpbyBhdCBcJDIuMTUgYSBkYXkgKDIwMTcgUFBQKSAoJSBvZiBwb3B1bGF0aW9uKe+8mlNJLlBPVi5EREFZIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NJLlBPVi5EREFZKV0KCiAgICAtICAgUG92ZXJ0eSBoZWFkY291bnQgcmF0aW8gYXQgXCQzLjY1IGEgZGF5ICgyMDE3IFBQUCkgKCUgb2YgcG9wdWxhdGlvbinvvJpTSS5QT1YuTE1JQyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TSS5QT1YuTE1JQyldCgogICAgLSAgIFBvdmVydHkgaGVhZGNvdW50IHJhdGlvIGF0IFwkNi44NSBhIGRheSAoMjAxNyBQUFApICglIG9mIHBvcHVsYXRpb24p77yaU0kuUE9WLlVNSUMgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU0kuUE9WLlVNSUMpXQoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyMg5rqW5YKZCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoV0RJKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMjIOODh+ODvOOCv+OBruiqreOBv+i+vOOBv++8iGltcG9ydGluZ++8iQoK6L+95Yqg5oOF5aCx77yI5Zyw5Z+f44O75omA5b6X44Os44OZ44Or77yJ44KS6Kqt44G/6L6844G/44Gf44GE44Gu44Gn44CBZXh0cmE9VFJVRSDjgajjgZfjgabjgYLjgorjgb7jgZnjgIIKCioqKuacgOWIneOBru+8keWbnuebruOBr+OAgeOBi+OBquOCieOBmuWun+ihjOOBl+OBpuOBj+OBoOOBleOBhOOAgioqKgoKYGBge3IgZXZhbD1GQUxTRX0KZGZfcG92ZXJ0eV9yYXRlIDwtIFdESSgKICBpbmRpY2F0b3IgPSBjKHJhdGlvID0gIlNJLlBPVi5OQUhDIiwKICAgICAgICAgICAgICAgIHVuZGVyXzIuMTUgPSAiU0kuUE9WLkREQVkiLAogICAgICAgICAgICAgICAgdW5kZXJfMy42NSA9ICJTSS5QT1YuTE1JQyIsCiAgICAgICAgICAgICAgICB1bmRlcl82Ljg1ID0gIlNJLlBPVi5VTUlDIiksCiAgZXh0cmEgPSBUUlVFKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMjIyDkv53lrZjjgajoqq3jgb/ovrzjgb8KCu+8kuWbnuebruOBi+OCieOBr+OAgWBkYXRhYCDjgYvjgonoqq3jgb/ovrzjgoHjgovjgojjgYbjgavjgZfjgabjgYrjgY3jgb7jgZnjgIIKCioqKuacgOWIneOBru+8keWbnuebruOBr+OAgeOBi+OBquOCieOBmuWun+ihjOOBl+OBpuOBj+OBoOOBleOBhOOAgioqKgoKYGBge3IgZXZhbD1GQUxTRX0Kd3JpdGVfY3N2KGRmX3BvdmVydHlfcmF0ZSwgImRhdGEvcG92ZXJ0eV9yYXRlLmNzdiIpCmBgYAoKYGBge3J9CmRmX3BvdmVydHlfcmF0ZSA8LSByZWFkX2NzdigiZGF0YS9wb3ZlcnR5X3JhdGUuY3N2IikKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIyDjg4fjg7zjgr/jgpLopovjgabjgb/jgojjgYYgKHZpZXdpbmcpCgpgZGZfcG92ZXJ0eV9yYXRlYCDjgb7jgZ/jga/jgIFgaGVhZChkZl9wb3ZlcnR5X3JhdGUpYCDjgajjgIFgc3RyKGRmX3BvdmVydHlfcmF0ZSlgCgpgYGB7cn0KZGZfcG92ZXJ0eV9yYXRlCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpgYGB7cn0Kc3RyKGRmX3BvdmVydHlfcmF0ZSkKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIyDlpInmlbDjga7pgbjmip7vvIhzZWxlY3RpbmfvvIkKCuWIqeeUqOOBl+OBquOBhOWkieaVsOOCguOBguOCi+OBruOBpyBzZWxlY3Qg44KS5L2/44Gj44Gm5aSJ5pWw44KS5rib44KJ44GX44G+44GZ44CC6KaL44KE44GZ44GE44KI44GG44Gr44CBYHVuZGVyXzIuMTVgIOOBjCBOQSDjga7jgoLjga7jga/jgIHliYrpmaTjgZfjgabjgYLjgorjgb7jgZnjgIIKCmBgYHtyfQpkZl9wb3ZlcnR5X3JhdGVfc2VsZWN0ZWQgPC0gZGZfcG92ZXJ0eV9yYXRlIHw+IGRyb3BfbmEodW5kZXJfMi4xNSkgfD4KICBzZWxlY3QoY291bnRyeSwgeWVhciwgcmF0aW8sIHVuZGVyXzIuMTUsIHVuZGVyXzMuNjUsIHVuZGVyXzYuODUsIHJlZ2lvbikKZGZfcG92ZXJ0eV9yYXRlX3NlbGVjdGVkIApgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMjIOWkieW9ou+8iFdpZGUgdG8gTG9uZyBEYXRh77yJCgrlm5vjgaTjga7mjIfmqJnjgpLlkIzmmYLjgavjgYTjgY/jgaTjgYvpgbjmip7jgZfmr5TovIPjgZfjgZ/jgYTjga7jgafjgIHkuIDjgaTjga7liJfvvIjlpInmlbDvvInjgavjgarjgonjgbnjgZ/jgIHnuKbplbfjg4fjg7zjgr/vvIhsb25nIGRhdGHvvInjgoLkvZzmiJDjgZfjgabjgYrjgY3jgb7jgZnjgIIKCmBwaXZvdF9sb25nZXIocmF0aW86dW5kZXJfNi44NSwgbmFtZXNfdG8gPSAibGV2ZWwiLCB2YWx1ZXNfdG8gPSAidmFsdWUiKWAKCuOBk+OBk+OBp+OBr+OAgWByYXRpb2Ag44GL44KJIGB1bmRlcl82Ljg1YCDjgpLjgIFgbGV2ZWxgIOOBqOOBhOOBhuWQjeWJjeOBruWIl+OBq+OBquOCieOBueOAgeWApOOCkiBgdmFsdWVgIOOBqOOBhOOBhuWIl+OBq+S4puOBueOCi+OCiOOBhuOBq+OBl+OBpuOBguOCiuOBvuOBmeOAggoK56K66KqN44GZ44KL44Go44GN44Gv44CBdmFsdWUg44GMIE5BIOOBruOCguOBruOBr+mZpOOBjeOAgWNvdW50cnkg44Go44CBaXNvMmMg44Go44CBbGV2ZWwg44GoIHZhbHVlIOOBrumDqOWIhuOBoOOBkeWPluOCiuWHuuOBl+OBpueiuuiqjeOBl+OBpuOBhOOBvuOBmeOAggoKYGBge3IgZXZhbD1GQUxTRX0KZGZfcG92ZXJ0eV9yYXRlX2xvbmcgPC0gZGZfcG92ZXJ0eV9yYXRlX3NlbGVjdGVkIHw+IAogIHBpdm90X2xvbmdlcihyYXRpbzp1bmRlcl82Ljg1LCBuYW1lc190byA9ICJsZXZlbCIsIHZhbHVlc190byA9ICJ2YWx1ZSIpCmRmX3BvdmVydHlfcmF0ZV9sb25nIHw+IGRyb3BfbmEodmFsdWUpIHw+IHNlbGVjdChjb3VudHJ5LCBsZXZlbCwgdmFsdWUsIHJlZ2lvbikKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmBgYHtyfQpkZl9wb3ZlcnR5X3JhdGVfbG9uZyA8LSBkZl9wb3ZlcnR5X3JhdGVfc2VsZWN0ZWQgfD4gCiAgcGl2b3RfbG9uZ2VyKHJhdGlvOnVuZGVyXzYuODUsIG5hbWVzX3RvID0gImxldmVsIiwgdmFsdWVzX3RvID0gInZhbHVlIikKZGZfcG92ZXJ0eV9yYXRlX2xvbmcgfD4gZHJvcF9uYSh2YWx1ZSkgfD4gc2VsZWN0KGNvdW50cnksIGxldmVsLCB2YWx1ZSwgcmVnaW9uKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMjIOW5tOavjuOBruODh+ODvOOCv+OBruaVsOOBrueiuuiqje+8iG51bWJlciBvZiBkYXRhIGluIGVhY2ggeWVhcu+8iQoKYGBge3J9CmRmX3BvdmVydHlfcmF0ZV9sb25nIHw+IGRyb3BfbmEodmFsdWUpIHw+IAogIGdyb3VwX2J5KHllYXIsIGxldmVsKSB8PiBzdW1tYXJpemUobiA9IG4oKSkgfD4gYXJyYW5nZShkZXNjKHllYXIpKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoK44Gd44KM44Ge44KM44Gu5Zu944Gn44Gu6LKn5Zuw546H44Gu44OH44O844K/77yIcmF0aW/vvInjgYwg5aSa44GE5aC05ZCI44KC44CB57W25a++55qE44Gq6LKn5Zuw546H44GM5aSa44GE5aC05ZCI44KC44GC44KL44KI44GG44Gg44GM44CB5oyH5qiZ44GU44Go44Gr6ZuG6KiI44GX44Gm44G/44KL44CCCgpgYGB7cn0KZGZfcG92ZXJ0eV9yYXRlX2xvbmcgfD4gZmlsdGVyKHllYXIgJWluJSBjKDE5NjAsIDE5NzAsIDE5ODAsIDE5OTAsIDIwMDAsIDIwMTAsIDIwMjApKSB8PiBkcm9wX25hKHZhbHVlKSB8PiBncm91cF9ieSh5ZWFyLCBsZXZlbCkgfD4gc3VtbWFyaXplKG4gPSBuKCkpIHw+CiAgZ2dwbG90KGFlcyhhcy5jaGFyYWN0ZXIoeWVhciksIG4sIGZpbGwgPSBsZXZlbCkpICsgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiLCBjb2wgPSAiYmxhY2siLCBsaW5ld2lkaHQgPSAwLjEpICsgbGFicyh4ID0gInllYXIiLCB5ID0gIm51bWJlciBvZiBkYXRhIikKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmBgYHtyfQpkZl9wb3ZlcnR5X3JhdGVfbG9uZyB8PiAKICBmaWx0ZXIoY291bnRyeSAlaW4lIGMoIldvcmxkIiwgIlN1Yi1TYWhhcmFuIEFmcmljYSIpKSB8PiBkcm9wX25hKCkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBjb2wgPSBsZXZlbCwgbGluZXR5cGUgPSBjb3VudHJ5KSkgKyBnZW9tX2xpbmUoKQpgYGAKClN1Yi1TYWhhcmFuIEFmcmljYSDjga7jg4fjg7zjgr/jga/jgarjgYTjgojjgYbjgafjgZnjgILjgZ/jgZfjgYvjgavjgIFyYXRpbyDjga/jgIHlm73jgZTjgajjgavmsbrjgoHjgovjgoLjga7jgafjgZnjgYvjgonjgIHlnLDln5/jga7loLTlkIjjgavjga/jgIFyYXRpbyDjga7lgKTjga/jgarjgYTjga7jgafjgZfjgofjgYbjgIIKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3J9CmRmX3BvdmVydHlfcmF0ZV9sb25nIHw+IGZpbHRlcih5ZWFyICVpbiUgYygyMDAwLCAyMDEwLCAyMDIwKSkgfD4gZHJvcF9uYSh2YWx1ZSkgfD4gCiAgZmlsdGVyKHJlZ2lvbiA9PSAiQWdncmVnYXRlcyIpIHw+IGZpbHRlcihsZXZlbCAlaW4lIGMoInJhdGlvIiwgInVuZGVyXzIuMTUiKSkgfD4gZ3JvdXBfYnkoY291bnRyeSwgeWVhciwgbGV2ZWwpIHw+IHN1bW1hcml6ZShuID0gbigpKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMjIyBTdWItU2FoYXJhbiBBZnJpY2Eg44Gu5Zu944Gu44OH44O844K/44Gr44Gk44GE44GmCgpgYGB7cn0KZGZfcG92ZXJ0eV9yYXRlX2xvbmcgfD4gZHJvcF9uYSh2YWx1ZSkgfD4gCiAgZmlsdGVyKHJlZ2lvbiA9PSAiU3ViLVNhaGFyYW4gQWZyaWNhIikgfD4gZ3JvdXBfYnkoY291bnRyeSwgbGV2ZWwpIHw+IAogIHN1bW1hcml6ZShuID0gbigpKQpgYGAKCiMjIOOCouODleODquOCq+WNl+mDqO+8leOCq+WbveOBruWIhuaekAoKIyMjIOWbveOBruODquOCueODiOOBruioreWumgoKU09VVEhfQUZSSUNBX0ZJVkUg44Gr44CBU291dGggQWZyaWNhLCBOYW1pYmlhLCBFc3dhdGluaSwgQm90c3dhbmEsIExlc290aG8g44KS6Kit5a6aCgpgYGB7cn0KU09VVEhfQUZSSUNBX0ZJVkUgPC0gYygiU291dGggQWZyaWNhIiwgIk5hbWliaWEiLCAiRXN3YXRpbmkiLCAiQm90c3dhbmEiLCAiTGVzb3RobyIpCmBgYAoKIyMjIO+8leOCq+WbveOBruODh+ODvOOCv+OCkueiuuiqjQoKYGRmX3BvdmVydHlfcmF0ZV9zZWxlY3RlZGAg44Go44CBYGRmX3BvdmVydHlfcmF0ZV9sb25nYCDjgavjgaTjgYTjgabjgIHjgqLjg5Xjg6rjgqvljZfpg6jvvJXjgqvlm73jga7jg4fjg7zjgr/jgpLnorroqo0KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3J9CmRmX3BvdmVydHlfcmF0ZV9zZWxlY3RlZCB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3J9CmRmX3BvdmVydHlfcmF0ZV9sb25nIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyMg5ZCE6LKn5Zuw546H44KS5oqY44KM57ea44Kw44Op44OV44Gn5o+P44GE44Gm44G/44KLCgojIyMjIOWNl+OCouODleODquOCq+OBq+OBpOOBhOOBpgoKYGBge3J9CmRmX3BvdmVydHlfcmF0ZV9sb25nIHw+IAogIGZpbHRlcihjb3VudHJ5ID09ICJTb3V0aCBBZnJpY2EiKSB8PiBkcm9wX25hKHZhbHVlKSB8PgogIGdncGxvdChhZXMoeWVhciwgdmFsdWUsIGNvbCA9IGxldmVsKSkgKyBnZW9tX2xpbmUoKQpgYGAKCioq6ICD5a+f77yaKioyMDAw5bm044GL44KJMjAwOOW5tOOBlOOCjeOBvuOBp+a4m+WwkeOBl+OBpuOBhOOCi+OBjOOAgeOBneOBruW+jOOAgeS4iuaYh+WCvuWQkeOBjOimi+OCieOCjOOCi+OAggoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyMjIO+8leOCq+WbveWQjOaZguOBqwoKYGBge3J9CmRmX3BvdmVydHlfcmF0ZV9sb25nIHw+IAogIGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIHw+IGRyb3BfbmEodmFsdWUpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCB2YWx1ZSwgY29sID0gY291bnRyeSwgbGluZXR5cGUgPSBsZXZlbCkpICsgZ2VvbV9saW5lKCkKYGBgCgoqKuiAg+Wvn++8mioq6KSH6ZuR44Gn44KP44GL44KK44KE44GZ44GE44Go44Gv44GE44GI44Gq44GECgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmBgYHtyfQpkZl9wb3ZlcnR5X3JhdGVfbG9uZyB8PiAKICBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSB8PiBkcm9wX25hKHZhbHVlKSB8PiBmaWx0ZXIobGV2ZWwgIT0gInJhdGlvIikgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBjb2wgPSBjb3VudHJ5LCBsaW5ldHlwZSA9IGxldmVsKSkgKyBnZW9tX2xpbmUoKQpgYGAKCioq6ICD5a+f77yaKirlm73jgZTjgajjgavmsbrjgoHjgZ/osqflm7DnjofjgpLjga7jgZ7jgYTjgabjgb/jgZ/jgILlpJrlsJHmlLnlloTjgZfjgZ/jgILjgZfjgYvjgZfjgIHjgYLjgajjga/lpb3jgb/jgIIKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMjIO+8leOCq+WbveOBruacgOaWsOOBruODh+ODvOOCvwoKYGBge3J9CmRmX3BvdmVydHlfcmF0ZV9zZWxlY3RlZCB8PiAKICBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSB8PgogIGRyb3BfbmEodW5kZXJfMi4xNSkgfD4gZ3JvdXBfYnkoY291bnRyeSkgfD4gZmlsdGVyKHllYXIgPT0gbWF4KHllYXIpKSB8PiAKICBzZWxlY3QoY291bnRyeSwgeWVhciwgcmF0aW86dW5kZXJfNi44NSkKYGBgCgoqKuiAg+Wvn++8mioq5q+O5bm044OH44O844K/44GM44GC44KL44KP44GR44Gn44Gv44Gq44GE44Gu44Gn44CB44Gd44KM44Ge44Gu5Zu944GU44Go44Gr5pyA5paw44Gu44KC44Gu44KS6KaL44KL44GT44Go44Go44GZ44KLCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIyMg5Y2X44Ki44OV44Oq44Kr77yV44Kr5Zu944Gu6LKn5Zuw5bqm44GU44Go44Gu5Lq65Y+j5q+UCgpgYGB7cn0KZGZfcG92ZXJ0eV9yYXRlX2xvbmcgfD4gCiAgZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgfD4KICBkcm9wX25hKHZhbHVlKSB8PiBncm91cF9ieShjb3VudHJ5KSB8PiBmaWx0ZXIoeWVhciA9PSBtYXgoeWVhcikpIHw+CiAgZ2dwbG90KGFlcyhjb3VudHJ5LCB2YWx1ZSwgZmlsbCA9IGxldmVsKSkgKyBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIsIGNvbCA9ICJibGFjayIsIGxpbmV3aWR0aCA9IDAuMSkgKyAKICBsYWJzKHRpdGxlID0gIlBvdmVydCBMZXZlbCBSYXRpbyBvZiBGaXZlIENvdW50cmllcyIsIHN1YnRpdGxlID0gIkJvdHN3YW5hIGluIDIwMTUsIEVzd2F0aW5pIGluIDIwMTYgLExlc290byBpbiAyMDE3LCBOYW1pYmlhIGluIDIwMTUgXG5hbmQgU291dGggQWZyaWNhIGluIDIwMTQiKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMjIyDjgYTjgY/jgaTjgYvjga7lm73jga7osqflm7DluqbjgZTjgajjga7kurrlj6Pmr5QKCuOBneOCjOOBnuOCjOOBruWbveOBruOAgeacgOOCguaWsOOBl+OBhOODh+ODvOOCv+OCkueUqOOBhOOCi+OCguOBruOBqOOBl+OBvuOBmeOAggoKKirnt7Tnv5Ig5qyh44GuIGBQT1ZfQ09VTlRSSUVTX1lPVVJfQ0hPSUNFYCDjga7pg6jliIbjgpLlpInmm7TjgZfjgabjgIHjgYTjgY/jgaTjgYvjga7lm73jga7osqflm7DogIXjga7libLlkIjjga7ooajjgajjgrDjg6njg5XjgpLkvZzmiJDjgZfjgabjgY/jgaDjgZXjgYTjgIIqKgoKYFBPVl9DT1VOVFJJRVNfWU9VUl9DSE9JQ0UgPC0gYygiTXlhbm1hciIsICJLZW55YSIsICJDaGluYSIsICJJbmRpYSIsICJJbmRvbmVzaWEiKWAKCmBgYHtyfQpQT1ZfQ09VTlRSSUVTX1lPVVJfQ0hPSUNFIDwtIGMoIk15YW5tYXIiLCAiS2VueWEiLCAiQ2hpbmEiLCAiSW5kaWEiLCAiSW5kb25lc2lhIikKZGZfcG92ZXJ0eV9yYXRlIHw+IAogIGZpbHRlcihjb3VudHJ5ICVpbiUgUE9WX0NPVU5UUklFU19ZT1VSX0NIT0lDRSkgfD4KICBkcm9wX25hKHJhdGlvKSB8PiBncm91cF9ieShjb3VudHJ5KSB8PiBmaWx0ZXIoeWVhciA9PSBtYXgoeWVhcikpIHw+IAogIHNlbGVjdChjb3VudHJ5LCBpc28yYywgeWVhciwgcmF0aW86dW5kZXJfNi44NSkKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmBgYHtyfQpkZl9wb3ZlcnR5X3JhdGVfbG9uZyB8PiAKICBmaWx0ZXIoY291bnRyeSAlaW4lIFBPVl9DT1VOVFJJRVNfWU9VUl9DSE9JQ0UpIHw+CiAgZHJvcF9uYSh2YWx1ZSkgfD4gZ3JvdXBfYnkoY291bnRyeSkgfD4gZmlsdGVyKHllYXIgPT0gbWF4KHllYXIpKSB8PgogIGdncGxvdChhZXMoY291bnRyeSwgdmFsdWUsIGZpbGwgPSBsZXZlbCkpICsgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiLCBjb2wgPSAiYmxhY2siLCBsaW5ld2lkdGggPSAwLjEpICsgCiAgbGFicyh0aXRsZSA9ICJQb3ZlcnR5IExldmVsIFJhdGlvIG9mIENvdW50cmllcyIsIHN1YnRpdGxlID0gIlVzaW5nIHRoZSBtb3N0IHJlY2VudCBkYXRhIikKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIyMg5oqY44KM57ea44Kw44Op44OV44Gr44KI44KL5q+U6LyDCgrnt5rjgpLpgJrluLjjgojjgorlpKrjgY/jgZfjgabjgYTjgb7jgZnjgILliJ3mnJ/lgKTjga/jgIFHZW9tTGluZVwkZGVmYXVsdF9hZXMg44Gn44KP44GL44KK44G+44GZ44CCCgpgYGB7cn0KZGZfcG92ZXJ0eV9yYXRlX2xvbmcgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBjKCJDaGluYSIsICJJbmRpYSIpKSB8PgogIGRyb3BfbmEodmFsdWUpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCB2YWx1ZSwgY29sID0gY291bnRyeSwgbGluZXR5cGUgPSBsZXZlbCkpICsgZ2VvbV9saW5lKGxpbmV3aWR0aCA9IDEpCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyMg44OS44K544OI44Kw44Op44Og77yISGlzdG9ncmFt77yJCgpgYGB7cn0KZGZfcG92ZXJ0eV9yYXRlIHw+IGRyb3BfbmEodW5kZXJfMi4xNSkgfD4gZmlsdGVyKHJlZ2lvbiAhPSAiQWdncmVnYXRlcyIpIHw+CiAgZmlsdGVyKHVuZGVyXzIuMTUgPiAyNSkgfD4KICBnZ3Bsb3QoYWVzKHVuZGVyXzIuMTUsIGZpbGwgPSByZWdpb24pKSArIGdlb21faGlzdG9ncmFtKGJpbnMgPSAxMCwgY29sID0gImJsYWNrIiwgbGluZXdpZHRoID0gMC4xKQpgYGAKCiMjIOODleOCoeOCpOODq+ODquODs+OCrwoKLSAgIFBvc2l0Q2xvdWQg5YWx5pyJ44Oq44Oz44Kv77yaPGh0dHBzOi8vcG9zaXQuY2xvdWQvY29udGVudC81NTM5NzYzPgoKICAgIC0gICDosqflm7DnjocgLSBQb3ZlcnR5IFJhdGXvvIhwb3ZlcnR5X3JhdGUuUm1k77yJIFtb44Oq44Oz44KvXShodHRwczovL2RzLXNsLmdpdGh1Yi5pby9pbnRybzJyL2dlczAwMS9wb3ZlcnR5X3JhdGUubmIuaHRtbCldLCBbW1JtZF0oaHR0cHM6Ly9naXRodWIuY29tL2RzLXNsL2ludHJvMnIvYmxvYi9tYWluL2RvY3MvZ2VzMDAxL3BvdmVydHlfcmF0ZS5SbWQpXQogICAgICAgIC0gICDjgojjgoroqbPntLDjgarjgoLjga7vvJpwb3ZlcnR5X3JhdGVfbG9uZy5SbWQgW1vjg6rjg7Pjgq9dKGh0dHBzOi8vZHMtc2wuZ2l0aHViLmlvL2ludHJvMnIvZ2VzMDAxL3BvdmVydHlfcmF0ZV9sb25nLm5iLmh0bWwpXSwgW1tSbWRdKGh0dHBzOi8vZ2l0aHViLmNvbS9kcy1zbC9pbnRybzJyL2Jsb2IvbWFpbi9kb2NzL2dlczAwMS9wb3ZlcnR5X3JhdGVfbG9uZy5SbWQpXQogICAgICAgICAgICAtICAgUG9zaXRDbG91ZCDjgafjga/jgIHjg6Hjg6Ljg6rjg7zjgqrjg7zjg5Djg7wKCi0gICBSIE5vdGVib29rIOOBruOCveODvOOCueODleOCoeOCpOODq++8iFJtZO+8ieOCkuWPluW+l+OBmeOCi+S4ieOBpOOBruaWueazlQoKICAgIDEuICAqKlJtZCDjga7jg6rjg7Pjgq/jgpLjgq/jg6rjg4Pjgq/jgZcgUmF3IOOBruaoquOBriBDb3B5IGEgcmF3IGZpbGUg44GL44KJ44Kz44OU44O844CB5paw6KaPIFJNYXJrZG93biDjg5XjgqHjgqTjg6vjgpIgUG9zaXRDbG91ZCDjgb7jgZ/jga8gUlN0dWRpbyDjga7jg5fjg63jgrjjgqfjgq/jg4jlhoXjgavkvZzmiJDjgZfjg5rjg7zjgrnjg4gqKgoKICAgIDIuICBQb3NpdENsb3VkIOWFseacieODquODs+OCr+OBriBnZXMwMDEg44Gu44OH44Kj44Os44Kv44OI44Oq77yI44OV44Kp44Or44OA44GL44KJ5o6i44GZ77yJ44OV44Kh44Kk44Or44KS6ZaL44GN44CB5YWo5L2T44KS6YG45oqe44GX44Gm44Kz44OU44O844GX44CB6Ieq5YiG44GuIFJTdHVkaW8g44G+44Gf44Gv44CBUG9zaXRDbG91ZCDjga7jg5XjgqHjgqTjg6vjgafjgIFSTWFya2Rvd24g44OV44Kh44Kk44Or44KS5paw6KaP5L2c5oiQ44GX44Oa44O844K544OICgogICAgMy4gIOODquODs+OCr+OCkumWi+OBjeOAgeWPs+S4iuOBriBDb2RlIOOBi+OCieOAgVJtZCDjg5XjgqHjgqTjg6vjgpLjg4Djgqbjg7Pjg63jg7zjg4njgajjgZfjgIHjgZ3jgozjgpLjgIHoh6rliIbjga4gUlN0dWRpbyDjgb7jgZ/jga/jgIFQb3NpdENsb3VkIOOBruODl+ODreOCuOOCp+OCr+ODiOOBq+enu+WLle+8iFVwbG9hZO+8iQoKIyMg5L2c5qWt5omL6aCG44Go44G+44Go44KBCgotICAg44OR44OD44Kx44O844K477yIUGFja2FnZe+8ieOBruWIqeeUqO+8mgoKICAgIC0gICDjgqTjg7Pjgrnjg4jjg7zjg6vvvIhpbnN0YWxsYXRpb27vvInvvJpUb29scyBcPiBJbnN0YWxsIFBhY2thZ2VzCgogICAgLSAgIOODreODvOODie+8iGxvYWTvvIlgbGlicmFyeSh0aWR5dmVyc2UpOyBsaWJyYXJ5KFdESSk7IGxpYnJhcnkoc2hvd3RleHQpOyBsaWJyYXJ5KERlc2NUb29scylgCgotICAg44OH44O844K/44Gu5Y+W5b6X77yaYFdESShpbmRpY2F0b3IgPSBjKHBvcCA9ICJTUC5QT1AuVE9UTCIpKWAKCiAgICAtICAgYFdESShpbmRpY2F0b3IgPSBjKHJhdGlvID0gIlNJLlBPVi5OQUhDIiwgdW5kZXJfMi4xNSA9ICJTSS5QT1YuRERBWSIsIHVuZGVyXzMuNjUgPSAiU0kuUE9WLkxNSUMiLCB1bmRlcl82Ljg1ID0gIlNJLlBPVi5VTUlDIiksIGV4dHJhID0gVFJVRSlgCgogICAgLSAgIGRhdGEg44Gr5pu444GN5Ye644GX44CB44Gd44GT44GL44KJ6Kqt44G/6L6844KA44Go6Imv44GE44CCCgogICAgICAgIC0gICBgd3JpdGVfY3N2KGRmX3BvdmVydHlfcmF0ZSwgImRhdGEvcG92ZXJ0eV9yYXRlLmNzdiIpYAoKICAgICAgICAtICAgYHJlYWRfY3N2KCJkYXRhL3BvdmVydHlfcmF0ZS5jc3YiKWAKCi0gICDjg4fjg7zjgr/jgpLopovjgovvvJpgZGZfcG92ZXJ0eV9yYXRlYCAsIGBoZWFkKGRmX3BvdmVydHlfcmF0ZSlgLCBgc3RyKGRmX3BvdmVydHlfcmF0ZSlgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIyDjg4fjg7zjgr/jga7lpInlvaIKCi0gICDlpInmlbDjga7pgbjmip7vvJpgc2VsZWN0KGNvdW50cnksIHllYXIsIHJhdGlvLCB1bmRlcl8yLjE1LCB1bmRlcl8zLjY1LCB1bmRlcl82Ljg1LCByZWdpb24pYAoKLSAgIOODh+ODvOOCv+OBruWkieW9ou+8iExvbmcgZGF0Ye+8ie+8mmBwaXZvdF9sb25nZXIocmF0aW86dW5kZXJfNi44NSwgbmFtZXNfdG8gPSAibGV2ZWwiLCB2YWx1ZXNfdG8gPSAidmFsdWUiKWAKCi0gICDnibnlrprjga7ooYzjga7lj5blvpfvvJpgZmlsdGVyKCksIGRyb3BfbmEoKSwgZGlzdGluY3QoKWAKCi0gICDooYzjga7poIbnlarjga7kuKbjgbPmm7/jgYjvvJpgYXJyYW5nZShkZXNjKHllYXIpKWAKCi0gICDjgrDjg6vjg7zjg5fliIbjgZHvvJpgZ3JvdXBfYnkoKWAgLCBgZ3JvdXBfYnkoeWVhciwgbGV2ZWwpIHw+IHN1bW1hcml6ZShuID0gbigpKWAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMjIOWPr+imluWMlgoKLSAgIOaKmOOCjOe3muOCsOODqeODlQoKICAgIC0gICBgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IHVuZGVyXzIuMTUpICsgZ2VvbV9saW5lKClgCgogICAgLSAgIGBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gdW5kZXJfMi4xNSwgY29sID0gY291bnRyeSkgKyBnZW9tX2xpbmUoKWAKCi0gICDjg5Ljgrnjg4jjgrDjg6njg6DvvIjluqbmlbDliIbluIPvvIkKCiAgICAtICAgYGdncGxvdChhZXModW5kZXJfMi4xNSwgZmlsbCA9IHJlZ2lvbikpICsgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDE1KWAKCi0gICDnrrHjgbLjgZLlm7PvvIhCb3hwbG9077yJCgogICAgLSAgIGBnZ3Bsb3QoYWVzKHVuZGVyXzIuMTUsIHJlZ2lvbiwgZmlsbCA9IHJlZ2lvbikpICsgZ2VvbV9ib3hwbG90KClgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi0gICDmo5LjgrDjg6njg5UKCiAgICAtICAgYGdncGxvdChhZXMoeWVhcikpICsgZ2VvbV9iYXIoKWAKCiAgICAtICAgYGdncGxvdChhZXMobGV2ZWxzLCB2YWx1ZSkpICsgZ2VvbV9jb2woKWAKCiAgICAtICAgYGdncGxvdChhZXMoeCA9IGxldmVscywgeSA9IHZhbHVlLCBmaWxsID0gY291bnRyeSkpICsgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKWAKCiAgICAtICAgYGdncGxvdChhZXMoeCA9IGdpbmksIGZpbGwgPSByZWdpb24pKSArIGdlb21faGlzdG9ncmFtKClgCgotICAg5pWj5biD5Zuz77yIK+WbnuW4sOebtOe3mu+8iQoKICAgIC0gICBgZ2dwbG90KGFlcyhnaW5pLCA5MC0xMDApKSArIGdlb21fcG9pbnQoKWAKCiAgICAtICAgYGdncGxvdChhZXMoZ2luaSwgODAtMTAwKSkgKyBnZW9tX3BvaW50KCkgKyBnZW9tX3Ntb290aChmb3JtdWxhID0gJ3kgfiB4JywgbWV0aG9kID0gImxtIilgCgoqKirluLjjgavjgIHogIPlr5/jgIHmsJfjgaXjgYTjgZ/jgZPjgajjgpLjgIHoqJjpjLLjgZfjgabjgY/jgaDjgZXjgYTjgIIqKioKCiMjIOiqsumhjAoK44OH44O844K/44Gv44CB5LiK44Gn5L2/44Gj44Gf5LqM44Gk44Gu44OH44O844K/44KS5L2/44GE44G+44GZ44CCCgotICAgYGRmX3BvdmVydHlfcmF0ZV9zZWxlY3RlZGAgOiB3aWRlIOODh+ODvOOCv+OBqOiogOOCj+OCjOOCi+OCguOBruOBp+OBmeOAguiyp+WbsOeOh++8iGB1bmRlcl8yLjE1YO+8ieOBruODh+ODvOOCv+OCkuWQq+OBvuOBquOBhOOCguOBruOBr+WJiumZpOOBl+OBpuOBguOCiuOBvuOBmeOAggoKLSAgIGBkZl9wb3ZlcnR5X3JhdGVfbG9uZ2Ag77yabG9uZyDjg4fjg7zjgr/jgajoqIDjgo/jgozjgovjgoLjga7jgafjgZnjgIIKCiMjIyDnt7Tnv5LvvJrjg4fjg7zjgr/jga7norroqo0KCjEuICBgZGZfcG92ZXJ0eV9yYXRlX3NlbGVjdGVkYCDjgajjgIFgZGZfcG92ZXJ0eV9yYXRlX2xvbmdgIOOCkuimi+OBpuOBv+OBvuOBl+OCh+OBhuOAguOBqeOBhuOBl+OBvuOBmeOBi+OAggoKKipIaW5077yaKirjgZ3jga7jgb7jgb7jg4fjg7zjgr/jgIFoZWFkKOODh+ODvOOCvynjgIFFbnZpcm9ubWVudCDjgYvjgonjgIHjg4fjg7zjgr/jgpLpgbjmip4KCjIuICDljZfjgqLjg6Hjg6rjgqvjgafjgIHjgrjjg4vmjIfmlbDjgYzlpKfjgY3jgYTjga7jga/jgIHku6XkuIvjga7vvJTjgaTjga7lm73jgafjgZnjgIJTdXJpbmFtZSwgQmVsaXplLCBCcmF6aWwsIENvbG9tYmlh44CC44Gd44KM44KS44CBQ0hPU0VOX0dJTklfQ09VTlRSSUVTIOOBq+S7o+WFpeOBl+OBpuOBj+OBoOOBleOBhOOAggoKKipIaW5077ya44CMKipTT1VUSF9BRlJJQ0FfRklWRSDjgavjgIFTb3V0aCBBZnJpY2EsIE5hbWliaWEsIEVzd2F0aW5pLCBCb3Rzd2FuYSwgTGVzb3RobyDjgpLoqK3lrprjgI3jgpLlj4LnhacKCjMuICBgZGZfcG92ZXJ0eV9yYXRlX3NlbGVjdGVkYOOBruWNl+OCouODoeODquOCq++8lOOCq+WbveOBruacgOaWsOOBruODh+ODvOOCv+OBoOOBkeOCkuihqOekuuOBl+OBpuOBv+OBvuOBl+OCh+OBhuOAggoKKipIaW5077yaKipTT1VUSF9BRlJJQ0FfRklWRSDjga7loLTlkIjjganjga7jgojjgYbjgavjgZfjgZ/jgYvogIPjgYjjgabjgb/jgb7jgZfjgofjgYbjgIIKCioq5rCX44Gl44GE44Gf44GT44GoKioKCi0gICAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMjIOWNl+OCouODoeODquOCq++8lOOCq+WbveOBq+OBpOOBhOOBpuOBruWIhuaekAoKNC4gIO+8lOOCq+WbveOAgeOBneOCjOOBnuOCjOOBruOAgeiyp+WbsOeOh+OBruW5tOasoeWkieWMluOCkuaKmOOCjOe3muOCsOODqeODleOBq+OCiOOCiuihqOekugoK5LiL44Gv44CB44OW44Op44K444Or44Gr44Gk44GE44Gm44Gu44KC44Gu44Gn44GZ44GM44CB5LuW44Gu77yT44Kr5Zu944Gn44CB44OH44O844K/44GM44GC44KL44KC44Gu44Gr44Gk44GE44Gm44Gv44CB5ZCM5qeY44Gu44Kw44Op44OV44KS5o+P44GE44Gm44GP44Gg44GV44GE44CCCgpgYGB7cn0KZGZfcG92ZXJ0eV9yYXRlX2xvbmcgfD4gZmlsdGVyKGNvdW50cnkgPT0gIkJyYXppbCIpIHw+IGRyb3BfbmEodmFsdWUpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCB2YWx1ZSwgY29sID0gbGV2ZWwpKSArIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gIlBvdmVydHkgUmF0aW8gb2YgQnJhc2lsIikKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqCoqCgotICAgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIyMg5Y2X44Ki44Oh44Oq44Kr77yU44Kr5Zu944Gu6LKn5Zuw5bqm44GU44Go44Gu5Lq65Y+j5q+U44Gu5qOS44Kw44Op44OVCgo1LiAg6LKn5Zuw5bqm44GU44Go44Gu5Lq65Y+j5q+U44Gu5qOS44Kw44Op44OV44KS5o+P44GE44Gm44G/44G+44GX44KH44GG44CCCgpIaW50OiDljZfjgqLjg5Xjg6rjgqvvvJXjgqvlm73jga7osqflm7DluqbjgZTjgajjga7kurrlj6Pmr5Tjga7mo5LjgrDjg6njg5UKCioq5rCX44Gl44GE44Gf44GT44GoKioKCi0gICAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMjIOe3tOe/ku+8muiyp+WbsOW6puOBlOOBqOOBruS6uuWPo+avlAoK6Kqy6aGM44Gr44GC44KLIDEg44GL44KJIDUuCgrmj5Dlh7rjga/jgZfjgarjgY/jgaboia/jgYTjgafjgZnjgYzjgIHjgZzjgbLlrp/pmpvjgavmiYvjgpLli5XjgYvjgZfjgablrp/ooYzjgZfjgabjgY/jgaDjgZXjgYTjgIIKCiMjIOWPguiAg+aWh+eMrgoKMS4gIOOAjOOBv+OCk+OBquOBruODh+ODvOOCv+OCteOCpOOCqOODs+OCuSAtIERhdGEgU2NpZW5jZSBmb3IgQWxs44CNW1vjga/jgZjjgoHjgabjga7jg4fjg7zjgr/jgrXjgqTjgqjjg7PjgrldKGh0dHBzOi8vaWN1LWhzdXp1a2kuZ2l0aHViLmlvL2RzNGFqL2ZpcnN0LWV4YW1wbGUuaHRtbCNmaXJzdC1leGFtcGxlKV0KCiAgICAtICAg5bCO5YWl44Go44GX44Gm44CBR0RQ77yI5Zu95YaF57eP55Sf55Sj77yJ44Gu44OH44O844K/44KS5L2/44Gj44Gm6Kqs5piO44GX44Gm44GE44G+44GZ44CCCgoyLiAgUG9zaXQgUmVjaXBlc++8iOaXpyBQb3NpdCBQcmltZXJz77yJOiBUaGUgQmFzaWNzIOWvvuipseWei+OBrua8lOe/kuOCteOCpOODiOOBruacgOWInSBbW0xpbmtdKGh0dHBzOi8vcG9zaXQuY2xvdWQvbGVhcm4vcmVjaXBlcyldCgozLiAgUG9zaXQgQ2hlYXQgU2hlZXQuIOaXqeimi+ihqOOBp+OBmeOAguWNsOWIt+OBl+OBpuS9v+OBhuOBn+OCgeOBq+OAgVBERiDjgoLmj5DkvpvjgZfjgabjgYTjgb7jgZnjgIJbW1NpdGUgTGlua10oaHR0cHM6Ly9yc3R1ZGlvLmdpdGh1Yi5pby9jaGVhdHNoZWV0cy8pXQoKNC4gIERhdGFDYW1wIENoZWF0IFNoZWV0OiBUaWR5dmVyc2UgZm9yIEJpZ2lubmVycy4g44OH44O844K/44K144Kk44Ko44Oz44K544Gu5pWZ6IKy44KS44GX44Gm44GE44KL5Lya56S+44Gu5pep6KaL6KGo44Gu5LiA44Gk44Gn44GZ44CC5Z+65pys44GM57Ch5Y2Y44Gr44G+44Go44G+44Gj44Gm44GE44G+44GZ44CCW1tMaW5rXShodHRwczovL2ltYWdlcy5kYXRhY2FtcC5jb20vaW1hZ2UvdXBsb2FkL3YxNjc2MzAyNjk3L01hcmtldGluZy9CbG9nL1RpZHl2ZXJzZV9DaGVhdF9TaGVldC5wZGYpXQo=