準備

第2週

12/14(TH) 所得と富の不平等の現状1

       所得と富の不平等の現状2

講義では、第2週、第3週とWorld Inequality report 2022を使って、所得と富の不平等について議論します。

12/19(TU) Rでデータサイエンス2:人口の少子高齢化  [Main]

講義 12月14日(木)所得と富の不平等

演習 12月19日(木)人口と少子高齢化

演習の内容

パッケージとそのインストール

R のパッケージは、R の機能を拡張するもので、コード(プログラム)や、データなどが収められています。インストール(install: コンピュータに入れて使えるようにすること)と、ロード(load: いつでも使えるようにすること)が必要です。

インストール

  • RStudio (または、Posit Cloud)の、上のメニュー・バーの、Tools の Pull down から、Install Packages を選び、Packages にパッケージ名を入れて、インストール。途中まで、パッケージ名を入れると下に候補がでるので、tab キーを押すと、自動入力になり、スペルミスが防げます。(右下の窓枠(Pane)の、Packages タブの、左上の Install を押しても、同じものが出ます。)

    • install.packages("パッケージ名") でも、インストールできます。

パッケージのロード

毎回 tidyverse と WDI を使いますから、R Notebook の最初には、次のコードチャンクを作成し、実行(Run)します。

library(tidyverse)
library(WDI)
#library(showtext)

日本語表示のために

図のタイトルなどが、日本語で文字化けしないようにおまじないです。

R Notebook の Preview で図のタイトルが小さい場合には、2行目(showtext_auto())を # で、コメントアウト。

#showtext_auto(FALSE) 
#showtext_auto() # for slides etc remove # 

データの読み込み(1)

データの読み込み方法はデータの種類などにより何種類もありますが、まず、WDI パッケージの、WDI という名前のデータ取得のコード(命令、プログラム)を使って、総人口のデータを読み込みます。それには、WDI コードと呼ばれる、SP.POP.TOTL を使います。

総人口 Population, total:SP.POP.TOTL

取得した、データをそのあとで、呼び出して使うために、<- を使って、名前をつけ(assign)ます。データの形式が、data frame と呼ばれるものなので、わたしは、いつも、最初に df として、簡単な名前をつけます。名前はなんでも良いのですが、覚えやすいように、また、日本語も受け付けますが、扱いが複雑になるので、英数のみ、スペースや、ハイフンは使えないので、区切りには、_ を使っています。

読み込みには、少し時間がかかります。

df_pop <- WDI(indicator = c(pop = "SP.POP.TOTL"))
Rows: 16758 Columns: 5── Column specification ─────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): country, iso2c, iso3c
dbl (2): year, pop
ℹ 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.

データを見てみましょう

df_pop

REGION

地域名に対応する iso2c コードの取得

REGION <- c("1A", "1W", "4E", "7E", "8S", "B8", "EU", "F1", "OE", "S1", 
"S2", "S3", "S4", "T2", "T3", "T4", "T5", "T6", "T7", "V1", "V2", 
"V3", "V4", "XC", "XD", "XE", "XF", "XG", "XH", "XI", "XJ", "XL", 
"XM", "XN", "XO", "XP", "XQ", "XT", "XU", "XY", "Z4", "Z7", "ZF", 
"ZG", "ZH", "ZI", "ZJ", "ZQ", "ZT")

地域名の確認

df_pop |> filter(iso2c %in% REGION) |> distinct(country, iso2c)

国名確認

df_pop |> filter(!(iso2c %in% REGION)) |> 
  distinct(country, iso2c) |> arrange(country)

行の選択(filter()

パイプ・折れ線グラフ


df_pop |> filter(country == "World") |> 
  ggplot(aes(year, pop)) + geom_line() + 
  labs(title = "世界の総人口")


df_pop |> filter(country == "Japan") |> 
  ggplot(aes(year, pop)) + geom_line() +
  labs(title = "日本の総人口")


練習1:Germany と ドイツの部分を他の国名に変えてみてください。

COUNTRY <- "Germany"
df_pop |> filter(country == COUNTRY) |> 
  ggplot(aes(year, pop)) + geom_line() +
  labs(title = "ドイツの総人口")


練習2. COUNTRIES を編集して、イギリスとドイツとフランスと日本を他の国に変えてみてください。

COUNTRIES <- c("United Kingdom", "Germany", "France", "Japan")
df_pop |> filter(country %in% COUNTRIES) |> 
  ggplot(aes(year, pop, col =  country)) + geom_line() +
  labs(title = "イギリスとドイツとフランスと日本の総人口")

2022年の総人口の多い順

df_pop |> filter(!(iso2c %in% REGION)) |> filter(year == 2022) |> 
  arrange(desc(pop))

2022年の総人口の TOP 11

pop_top11 <- df_pop |> filter(!(iso2c %in% REGION)) |> filter(year == 2022) |> 
  arrange(desc(pop)) |> slice_head(n=11) |> pull(iso2c)
pop_top11
 [1] "IN" "CN" "US" "ID" "PK" "NG" "BR" "BD" "RU" "MX" "JP"
dput(pop_top11)
c("IN", "CN", "US", "ID", "PK", "NG", "BR", "BD", "RU", "MX", 
"JP")

練習4. 1960年の総人口が多い順に五番目までリストしてください。

pop_top5 <- df_pop |> filter(!(iso2c %in% REGION)) |> 
  filter(year == 2022) |> 
  arrange(desc(pop)) |> slice_head(n=5) |> pull(iso2c)
pop_top5
[1] "IN" "CN" "US" "ID" "PK"
dput(pop_top5)
c("IN", "CN", "US", "ID", "PK")

df_pop |> filter(iso2c %in% pop_top11) |>
  ggplot(aes(year, pop, color = iso2c)) + geom_line() + labs(title = "TOP11の総人口")

中国とインド以外のTOP11 の人口推移

df_pop |> filter(iso2c %in% pop_top11) |> 
  filter(!(iso2c %in% c("CN", "IN"))) |> 
  ggplot(aes(year, pop, color = country)) + geom_line() +
  labs(title = "中国とインド以外のTOP11の総人口")

地域ごとの人口推移

df_pop |> filter(country %in% c("South Asia", "Europe & Central Asia", "Middle East & North Africa", 
"East Asia & Pacific", "Sub-Saharan Africa", "Latin America & Caribbean", "North America")) |>
  ggplot(aes(year, pop, color = country)) + geom_line() + labs(title = "地域ごとの総人口")

データの読み込み(2)

総人口 Population, total:SP.POP.TOTL

出生率(千人)Birth rate, crude (per 1,000 people):SP.DYN.CBRT.IN

死亡率(千人)Death rate, crude (per 1,000 people):SP.DYN.CDRT.IN

若年労働人口率 Age dependency ratio, young (% of working-age population):SP.POP.DPND.YG

高齢者労働人口率 Age dependency ratio, old (% of working-age population):SP.POP.DPND.OL

df_pop_related <- WDI(indicator = c(pop = "SP.POP.TOTL",
                            birth_rate = "SP.DYN.CBRT.IN",
                            death_rate = "SP.DYN.CDRT.IN",
                            young = "SP.POP.DPND.YG",
                            old = "SP.POP.DPND.OL"))

保存と読み込み

write_csv(df_pop_related, "data/pop_related.csv")
df_pop_related <- read_csv("data/pop_related.csv")

データの確認

head(df_pop_related)

データの構造(Structure)

str(df_pop_related[])

{glimpse(df_pop_extra)}

変形

wide データを long データに変形します。いずれ説明します。

df_pop_long <- df_pop_related |> 
  pivot_longer(pop:old, names_to = "name", values_to = "value")

出生率と死亡率

出生率(千人)Birth rate, crude (per 1,000 people):SP.DYN.CBRT.IN [Link]

死亡率(千人)Death rate, crude (per 1,000 people):SP.DYN.CDRT.IN [Link]


df_pop_long |> filter(name %in% c("birth_rate", "death_rate")) |>
  filter(country == "World") |> drop_na(value) |> # NA value を削除
  ggplot(aes(year, value, col = name)) + geom_line() + 
  labs(title = "出生率、死亡率(1000人当たり)")

練習5 国を選択して、出生率、死亡率のグラフを描いてください。

df_pop_long |> filter(name %in% c("birth_rate", "death_rate")) |>
  filter(country == "World") |> drop_na(value) |> # NA value を削除
  ggplot(aes(year, value, col = name)) + geom_line() + 
  labs(title = "出生率、死亡率(1000人当たり)")

df_pop_long |> filter(name %in% c("birth_rate", "death_rate")) |>
  filter(iso2c %in% c("BD", "BR", "CN", "ID", "NG", "JP")) |> drop_na(value) |>
  ggplot(aes(year, value, col = country, linetype = name)) + 
  geom_line() + labs(title = "国々の、出生率、死亡率(1000人当たり)")

df_pop_long |> filter(name %in% c("birth_rate", "death_rate")) |>
  filter(iso2c %in% c("Z4", "Z7", "ZJ", "ZQ", "XU", "8S", "ZG")) |> drop_na() |>
  ggplot(aes(year, value, col = country, linetype = name)) + 
  geom_line() + labs(title = "地域ごとの出生率・死亡率(1000人あたり)")

df_pop_long |> filter(name %in% c("birth_rate", "death_rate")) |>
  filter(iso2c %in% c("BD", "BR", "CN", "ID", "NG", "JP")) |> drop_na(value) |>
  ggplot(aes(year, value, col = country, linetype = name)) + 
  geom_line() + labs(title = "国々の、出生率、死亡率(1000人当たり)")

練習6. いくつかの国または地域の、出生率、死亡率のグラフを描いてください。

df_pop_long |> filter(name %in% c("birth_rate", "death_rate")) |>
  filter(iso2c %in% c("BD", "BR", "CN", "ID", "NG", "JP")) |> drop_na(value) |>
  ggplot(aes(year, value, col = country, linetype = name)) + 
  geom_line() + labs(title = "国々の、出生率、死亡率(1000人当たり)")

扶養家族の労働人口に対する割合

若年労働人口率 Age dependency ratio, young (% of working-age population):SP.POP.DPND.YG [Link]

年齢別扶養比率(若年)は、15歳未満の扶養家族の、15歳から64歳までの生産年齢人口に対する比率である。データは、生産年齢人口100人当たりの扶養家族の割合で示されている。

高齢者労働人口率 Age dependency ratio, old (% of working-age population):SP.POP.DPND.OL [Link to Metadata]

年齢別扶養比率(高齢)は、生産年齢人口(15~64歳)に対する高齢扶養家族(64歳以上)の比率。データは、生産年齢人口100人当たりの扶養家族の割合で示されている。


df_pop_long |> filter(name %in% c("young", "old")) |>
  filter(country == "World") |> 
  ggplot(aes(year, value, col = name)) + geom_line() + 
  labs(title = "世界の高齢者・若年者扶養率")

練習7. 国を選択して、高齢者・若年者の扶養率のグラフを描いてください。

df_pop_long |> filter(name %in% c("young", "old")) |>
  filter(country == "World") |> 
  ggplot(aes(year, value, col = name)) + geom_line() + 
  labs(title = "世界の高齢者・若年者扶養率")

df_pop_long |> filter(name %in% c("young", "old")) |>
  filter(iso2c %in% c("BD", "BR", "CN", "ID", "NG", "JP")) |> 
  ggplot(aes(year, value, col = country, linetype = name)) + 
  geom_line() + labs(title = "国々の高齢者・若年者扶養率")

df_pop_long |> filter(name %in% c("young", "old")) |>
  filter(iso2c %in% c("US", "GB", "CN", "DE", "FR", "JP", "IN")) |> 
  ggplot(aes(year, value, col = country, linetype = name)) + 
  geom_line() + labs(title = "国々の高齢者・若年者扶養率")

df_pop_long |> filter(name %in% c("young", "old")) |>
  filter(country %in% c("South Asia", "Europe & Central Asia", "Middle East & North Africa", 
"East Asia & Pacific", "Sub-Saharan Africa", "Latin America & Caribbean", "North America")) |> 
  ggplot(aes(year, value, col = country, linetype = name)) + 
  geom_line() + labs(title = "地域別の労働人口に対する高齢・若年扶養率(%)", 
       subtitle = "実線:高齢者、点線:若年者", x = "", col = "", linetype = "")

練習8. いくつかの国または地域の、高齢者・若年者の扶養率のグラフを描いてください。

df_pop_long |> filter(name %in% c("young", "old")) |>
  filter(iso2c %in% c("US", "GB", "CN", "DE", "FR", "JP", "IN")) |> 
  ggplot(aes(year, value, col = country, linetype = name)) + 
  geom_line() + labs(title = "国々の高齢者・若年者扶養率")

df_pop_long |> filter(name %in% c("young", "old")) |>
  filter(country %in% c("South Asia", "Europe & Central Asia", "Middle East & North Africa", 
"East Asia & Pacific", "Sub-Saharan Africa", "Latin America & Caribbean", "North America")) |> 
  ggplot(aes(year, value, col = country, linetype = name)) + 
  geom_line() + facet_wrap(~country) + theme(legend.position = "none") +
  labs(title = "地域別の労働人口に対する高齢・若年扶養率(%)", 
       subtitle = "実線:高齢者、点線:若年者", x = "", y = "")

Default is fig. width = 7 and fig. height = 5


df_pop_long |> filter(name %in% c("young", "old")) |>
  filter(country %in% c("South Asia", "Europe & Central Asia", "Middle East & North Africa", 
"East Asia & Pacific", "Sub-Saharan Africa", "Latin America & Caribbean", "North America")) |> 
  ggplot(aes(year, value, col = country, linetype = name)) + 
  geom_line() + facet_wrap(~country, 2,4) + theme(legend.position = "none") +
  labs(title = "地域別の労働人口に対する高齢・若年扶養率(%)", 
       subtitle = "実線:高齢者、点線:若年者", x = "", y = "")

df_pop_long |> filter(name %in% c("birth_rate", "death_rate", "young", "old")) |>
  filter(country == "Japan") |> drop_na(value) |>
  ggplot(aes(year, value, col = name)) + geom_line() +
  labs(title = "日本の出生率・死亡率・労働人口に対する高齢・若年扶養率(%)")

練習7. 国を選択し(ドイツを変更し)て、高齢者・若年者の扶養率のグラフを描いてください。

df_pop_long |> filter(name %in% c("birth_rate", "death_rate", "young", "old")) |>
  filter(country == "Germany") |> drop_na(value) |>
  ggplot(aes(year, value, col = name)) + geom_line() +
  labs(title = "ドイツの出生率・死亡率・労働人口に対する高齢・若年扶養率(%)")

df_pop_long |> filter(name %in% c("birth_rate", "death_rate", "young", "old")) |>
  filter(country  %in%  c("Germany", "Japan")) |> drop_na(value) |>
  ggplot(aes(year, value, col = country, linetype = name)) + geom_line() +
  labs(title = "ドイツと日本の出生率・死亡率・労働人口に対する高齢・若年扶養率(%)")

df_pop_long |> filter(name == "pop") |>
  filter(country  %in%  c("Germany", "Japan")) |> drop_na(value) |>
  ggplot(aes(year, value, col = country)) + geom_line() +
  labs(title = "ドイツと日本の人口")

問い:どんなことがわかりますか。


練習8. (ドイツと日本を変更し)いくつかの国または地域の、高齢者・若年者の扶養率のグラフを描いてください。

df_pop_long |> filter(name %in% c("birth_rate", "death_rate", "young", "old")) |>
  filter(country  %in%  c("Germany", "Japan")) |> drop_na(value) |>
  ggplot(aes(year, value, col = country, linetype = name)) + geom_line() +
  labs(title = "ドイツと日本の出生率・死亡率・労働人口に対する高齢・若年扶養率(%)")

復習

課題・練習

提出はしなくて良いですが、ぜひ実際に手を動かして実行してください。考えたこと、疑問があれば、記録しておいてください。

  1. WDI のサイトで、興味のある指標の、名前と、WDI コードを選んでください。できれば、選択した理由も記録してください。

  2. Germany と ドイツの部分を他の国名に変えてみてください。(図

  3. 1960年の総人口が多い順に五番目までリストしてみましょう。

  4. いくつかの国を選択して、総人口の推移のグラフを描いてください。

  5. 国を選択して、出生率、死亡率のグラフを描いてください。

  6. いくつかの国または地域の、出生率、死亡率のグラフを描いてください。

  7. 国を選択して、高齢者・若年者の扶養率のグラフを描いてください。

  8. いくつかの国または地域の、高齢者・若年者の扶養率のグラフを描いてください。

参考文献

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

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

    1. Visualization Basics

    2. Programming Basics

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

LS0tCnRpdGxlOiAiR0VTIDAwMSDmvJTnv5IyIgphdXRob3I6ICJJRCwgWW91ciBOYW1lIgpkYXRlOiAiMjAyM+W5tDEy5pyIMTnml6UiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCiMjIOa6luWCmQoKLSAgIOiHquWIhuOBrlBD44G+44Gf44Gv5pWZ5a6k44GuUEMKCiAgICAxLiAg44Ot44Kw44Kk44OzCgogICAgMi4gIOOCpuOCp+ODg+ODluODu+ODluODqeOCpuOCtuODvO+8iEdvb2dsZSBDaHJvbWUg44Gq44Gp77yJ44KS6LW35YuVCgogICAgICAgIC0gICBNb29kbGUg44GuIEdFUzAwMSDntYzmuIjjgajntYzmuIjlrabjga7jgrXjgqTjg4jjgYvjgonjgIHjgZPjga7jgrnjg6njgqTjg4njga7jg5rjg7zjgrjjgpLooajnpLrvvIjjg6rjg7Pjgq/jgIxS44Gn44OH44O844K/44K144Kk44Ko44Oz44K544CN44Gu56ysMumAse+8iQoKICAgICAgICAtICAg77yI5Yil44Gu44K/44OW44G+44Gf44GvIOOCpuOCo+ODs+ODieOCpuOBp++8iVBvc2l0Q2xvdWQg44Gr44Ot44Kw44Kk44Oz77yI44Ki44Kr44Km44Oz44OI44Gu44Gq44GE5Lq644Gv44K144Kk44Oz44O744Ki44OD44OX77yJCgogICAgMy4gIFJTdHVkaW8g44KS6LW35YuVCgogICAgICAgIC0gICDoh6rliIbjga5QQ+OBq1Ig44GoIFJTdHVkaW8g44KS44Kk44Oz44K544OI44O844Or44GX44Gm44GE44Gq44GE44Gy44Go44Gv5LiN6KaB44CCCgogICAgICAgIC0gICDmnIDlvozjgavmmYLplpPjgYzjgYLjgozjgbDjgIHjgqTjg7Pjgrnjg4jjg7zjg6vjgavjgaTjgYTjgaboqqzmmI7jgZfjgb7jgZnjgIIKCiMjIOesrDLpgLEKCjEyLzE0KFRIKeOAgOaJgOW+l+OBqOWvjOOBruS4jeW5s+etieOBruePvueKtu+8kQoK44CA44CA44CA44CA44CAIMKg5omA5b6X44Go5a+M44Gu5LiN5bmz562J44Gu54++54q277ySCgrorJvnvqnjgafjga/jgIHnrKwy6YCx44CB56ysM+mAseOBqFdvcmxkIEluZXF1YWxpdHkgcmVwb3J0IDIwMjLjgpLkvb/jgaPjgabjgIHmiYDlvpfjgajlr4zjga7kuI3lubPnrYnjgavjgaTjgYTjgaborbDoq5bjgZfjgb7jgZnjgIIKCjEyLzE5KFRVKeOAgFLjgafjg4fjg7zjgr/jgrXjgqTjgqjjg7PjgrnvvJLvvJrkurrlj6Pjga7lsJHlrZDpq5jpvaLljJbjgIAgW1tNYWluXShodHRwczovL2RzLXNsLmdpdGh1Yi5pby9pbnRybzJyL2dlczAwMS9pbmRleC5odG1sKV0KCiMjIOism+e+qSAxMuaciDE05pel77yI5pyo77yJ5omA5b6X44Go5a+M44Gu5LiN5bmz562JCgojIyMgV29ybGQgSW5lcXVhbGl0eSBSZXBvcnQgMjAyMiBbW0xpbmtdKGh0dHBzOi8vd2lyMjAyMi53aWQud29ybGQpXQoKLSAgIEV4ZWN1dGl2ZSBTdW1tYXJ5IFtbTGlua10oaHR0cHM6Ly93aXIyMDIyLndpZC53b3JsZC9leGVjdXRpdmUtc3VtbWFyeS8pXeODu1tb44G/44KT44Gq44Gu44OH44O844K/44K144Kk44Ko44Oz44K544G444Gu44Oq44Oz44KvXShodHRwczovL2ljdS1oc3V6dWtpLmdpdGh1Yi5pby9kczRhai93aWQuaHRtbCN3aWQpXQoKLSAgIEludHJvZHVjdGlvbiBbW0xpbmtdKGh0dHBzOi8vd2lyMjAyMi53aWQud29ybGQvaW50cm9kdWN0aW9uLyldCgotICAgQ2hhcHRlciAxIEdsb2JhbCBlY29ub21pYyBpbmVxdWFsaXR5OiBpbnNpZ2h0czogW1tMaW5rXShodHRwczovL3dpcjIwMjIud2lkLndvcmxkL2NoYXB0ZXItMS8pXQoKLSAgIENoYXB0ZXIgMiBHbG9iYWwgaW5lcXVhbGl0eSBmcm9tIDE4MjAgdG8gbm93OiB0aGUgcGVyc2lzdGVuY2UgYW5kIG11dGF0aW9uIG9mIGV4dHJlbWUgaW5lcXVhbGl0eSBbW0xpbmtdKGh0dHBzOi8vd2lyMjAyMi53aWQud29ybGQvY2hhcHRlci0yLyldCgotICAgQ2hhcHRlciAzIFJpY2ggY291bnRyaWVzLCBwb29yIGdvdmVybm1lbnRzIFtbTGlua10oaHR0cHM6Ly93aXIyMDIyLndpZC53b3JsZC9jaGFwdGVyLTMvKV0KCi0gICBDaGFwdGVyIDQgR2xvYmFsIHdlYWx0aCBpbmVxdWFsaXR5OiB0aGUgcmlzZSBvZiBtdWx0aW1pbGxpb25haXJlcyBbW0xpbmtdKGh0dHBzOi8vd2lyMjAyMi53aWQud29ybGQvY2hhcHRlci00LyldCgojIyDmvJTnv5IgMTLmnIgxOeaXpe+8iOacqO+8ieS6uuWPo+OBqOWwkeWtkOmrmOm9ouWMlgoKIyMjIOS4lueVjOmWi+eZuuaMh+aome+8iFdvcmxkIERldmVsb3BtZW50IEluZGljYXRvcnPvvIlbW0xpbmtdKGh0dHBzOi8vZGF0YXRvcGljcy53b3JsZGJhbmsub3JnL3dvcmxkLWRldmVsb3BtZW50LWluZGljYXRvcnMvKV0KCioq57e057+SMS4qKiBXREkg44Gu44K144Kk44OI44Gn44CB6IiI5ZGz44Gu44GC44KL5oyH5qiZ44Gu44CB5ZCN5YmN44Go44CBV0RJIOOCs+ODvOODieOCkumBuOOCk+OBp+OBj+OBoOOBleOBhOOAguOBp+OBjeOCjOOBsOOAgemBuOaKnuOBl+OBn+eQhueUseOCguiomOmMsuOBl+OBpuOBj+OBoOOBleOBhOOAggoKIyMjIyAqKuS6uuOAhe+8iFBlb3BsZe+8iS0g5Lq65Y+j5YuV5oWL77yIUG9wdWxhdGlvbiBkeW5hbWljc++8iSoqCgrnt4/kurrlj6PjgIBQb3B1bGF0aW9uLCB0b3RhbO+8mlNQLlBPUC5UT1RMIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NQLlBPUC5UT1RMKV0KCuWHuueUn+eOh++8iOWNg+S6uu+8iUJpcnRoIHJhdGUsIGNydWRlIChwZXIgMSwwMDAgcGVvcGxlKe+8mlNQLkRZTi5DQlJULklOIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NQLkRZTi5DQlJULklOKV0KCuatu+S6oeeOh++8iOWNg+S6uu+8iURlYXRoIHJhdGUsIGNydWRlIChwZXIgMSwwMDAgcGVvcGxlKe+8mlNQLkRZTi5DRFJULklOIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NQLkRZTi5DRFJULklOKV0KCuiLpeW5tOWKtOWDjeS6uuWPo+eOh+OAgEFnZSBkZXBlbmRlbmN5IHJhdGlvLCB5b3VuZyAoJSBvZiB3b3JraW5nLWFnZSBwb3B1bGF0aW9uKe+8mlNQLlBPUC5EUE5ELllHIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NQLlBPUC5EUE5ELllHKV0KCumrmOm9ouiAheWKtOWDjeS6uuWPo+eOh+OAgEFnZSBkZXBlbmRlbmN5IHJhdGlvLCBvbGQgKCUgb2Ygd29ya2luZy1hZ2UgcG9wdWxhdGlvbinvvJpTUC5QT1AuRFBORC5PTCBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TUC5QT1AuRFBORC5PTCldCgojIyDmvJTnv5Ljga7lhoXlrrkKCi0gICDjg5Hjg4PjgrHjg7zjgrjvvIhQYWNrYWdl77yJ44Kk44Oz44K544OI44O844Or77yI44Kz44Oz44OU44Ol44O844K/44Gr5YWl44KM44Gm44GK44GP77yJCgotICAg44OR44OD44Kx44O844K444Gu44Ot44O844OJ77yI44GZ44GQ5L2/44GI44KL44KI44GG44Gr44GZ44KL77yJ77yadGlkeXZlcnNlLCBXREksIHNob3d0ZXh0CgotICAg44OH44O844K/44Gu5Y+W5b6X77yaV0RJKCkKCi0gICDnibnlrprjga7mnaHku7bjgavjgYLjgaPjgZ/ooYzjgpLpgbjmip7vvJpmaWx0ZXIoKQoKLSAgIOmghueVquOBq+OAgeWkieW9ouOAgeimluimmuWMluOBquOBqeOCkuOBmeOCi+OBn+OCgeOBruODkeOCpOODl++8mmB8PmAg77yI44G+44Gf44Gv44CBYCU+JWDvvIkKCi0gICDmipjjgoznt5rjgrDjg6njg5XvvJpnZ3Bsb3QoLi4uKSArIGdlb21fcG9pbnQoKQoKIyMg44OR44OD44Kx44O844K444Go44Gd44Gu44Kk44Oz44K544OI44O844OrCgo+IFIg44Gu44OR44OD44Kx44O844K444Gv44CBUiDjga7mqZ/og73jgpLmi6HlvLXjgZnjgovjgoLjga7jgafjgIHjgrPjg7zjg4nvvIjjg5fjg63jgrDjg6njg6DvvInjgoTjgIHjg4fjg7zjgr/jgarjganjgYzlj47jgoHjgonjgozjgabjgYTjgb7jgZnjgILjgqTjg7Pjgrnjg4jjg7zjg6vvvIhpbnN0YWxsOiDjgrPjg7Pjg5Tjg6Xjg7zjgr/jgavlhaXjgozjgabkvb/jgYjjgovjgojjgYbjgavjgZnjgovjgZPjgajvvInjgajjgIHjg63jg7zjg4nvvIhsb2FkOiDjgYTjgaTjgafjgoLkvb/jgYjjgovjgojjgYbjgavjgZnjgovjgZPjgajvvInjgYzlv4XopoHjgafjgZnjgIIKCiMjIyDjgqTjg7Pjgrnjg4jjg7zjg6sKCi0gICBSU3R1ZGlvIO+8iOOBvuOBn+OBr+OAgVBvc2l0IENsb3Vk77yJ44Gu44CB5LiK44Gu44Oh44OL44Ol44O844O744OQ44O844Gu44CBVG9vbHMg44GuIFB1bGwgZG93biDjgYvjgonjgIFJbnN0YWxsIFBhY2thZ2VzIOOCkumBuOOBs+OAgVBhY2thZ2VzIOOBq+ODkeODg+OCseODvOOCuOWQjeOCkuWFpeOCjOOBpuOAgeOCpOODs+OCueODiOODvOODq+OAgumAlOS4reOBvuOBp+OAgeODkeODg+OCseODvOOCuOWQjeOCkuWFpeOCjOOCi+OBqOS4i+OBq+WAmeijnOOBjOOBp+OCi+OBruOBp+OAgXRhYiDjgq3jg7zjgpLmirzjgZnjgajjgIHoh6rli5XlhaXlipvjgavjgarjgorjgIHjgrnjg5rjg6vjg5/jgrnjgYzpmLLjgZLjgb7jgZnjgILvvIjlj7PkuIvjga7nqpPmnqDvvIhQYW5l77yJ44Gu44CBUGFja2FnZXMg44K/44OW44Gu44CB5bem5LiK44Gu44CASW5zdGFsbCDjgpLmirzjgZfjgabjgoLjgIHlkIzjgZjjgoLjga7jgYzlh7rjgb7jgZnjgILvvIkKCiAgICAtICAgYGluc3RhbGwucGFja2FnZXMoIuODkeODg+OCseODvOOCuOWQjSIpYCDjgafjgoLjgIHjgqTjg7Pjgrnjg4jjg7zjg6vjgafjgY3jgb7jgZnjgIIKCiMjIOODkeODg+OCseODvOOCuOOBruODreODvOODiQoKLSAgIOODkeODg+OCseODvOOCuOOBq+WPjuOCgeOCieOCjOOBpuOBhOOCi+OAgeOCs+ODvOODie+8iOODl+ODreOCsOODqeODoOOAgeWRveS7pO+8ieOChOOAgeODh+ODvOOCv+OCkuOBmeOBkOOBq+S9v+OBiOOCi+OCiOOBhuOBq+OBl+OBvuOBmeOAgmBsaWJyYXJ5KOODkeODg+OCseODvOOCuOWQjSlgIOOBqOOBl+OBvuOBmeOAggoK5q+O5ZueIHRpZHl2ZXJzZSDjgaggV0RJIOOCkuS9v+OBhOOBvuOBmeOBi+OCieOAgVIgTm90ZWJvb2sg44Gu5pyA5Yid44Gr44Gv44CB5qyh44Gu44Kz44O844OJ44OB44Oj44Oz44Kv44KS5L2c5oiQ44GX44CB5a6f6KGM77yIUnVu77yJ44GX44G+44GZ44CCCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoV0RJKQojbGlicmFyeShzaG93dGV4dCkKYGBgCgojIyDml6XmnKzoqp7ooajnpLrjga7jgZ/jgoHjgasKCuWbs+OBruOCv+OCpOODiOODq+OBquOBqeOBjOOAgeaXpeacrOiqnuOBp+aWh+Wtl+WMluOBkeOBl+OBquOBhOOCiOOBhuOBq+OBiuOBvuOBmOOBquOBhOOBp+OBmeOAggoKUiBOb3RlYm9vayDjga4gUHJldmlldyDjgaflm7Pjga7jgr/jgqTjg4jjg6vjgYzlsI/jgZXjgYTloLTlkIjjgavjga/jgIHvvJLooYznm67vvIhgc2hvd3RleHRfYXV0bygpYO+8ieOCkiBcIyDjgafjgIHjgrPjg6Hjg7Pjg4jjgqLjgqbjg4jjgIIKCmBgYHtyfQojc2hvd3RleHRfYXV0byhGQUxTRSkgCiNzaG93dGV4dF9hdXRvKCkgIyBmb3Igc2xpZGVzIGV0YyByZW1vdmUgIyAKYGBgCgojIyDjg4fjg7zjgr/jga7oqq3jgb/ovrzjgb/vvIgx77yJCgrjg4fjg7zjgr/jga7oqq3jgb/ovrzjgb/mlrnms5Xjga/jg4fjg7zjgr/jga7nqK7poZ7jgarjganjgavjgojjgorkvZXnqK7poZ7jgoLjgYLjgorjgb7jgZnjgYzjgIHjgb7jgZrjgIFXREkg44OR44OD44Kx44O844K444Gu44CBV0RJIOOBqOOBhOOBhuWQjeWJjeOBruODh+ODvOOCv+WPluW+l+OBruOCs+ODvOODie+8iOWRveS7pOOAgeODl+ODreOCsOODqeODoO+8ieOCkuS9v+OBo+OBpuOAgee3j+S6uuWPo+OBruODh+ODvOOCv+OCkuiqreOBv+i+vOOBv+OBvuOBmeOAguOBneOCjOOBq+OBr+OAgVdESSDjgrPjg7zjg4njgajlkbzjgbDjgozjgovjgIFTUC5QT1AuVE9UTCDjgpLkvb/jgYTjgb7jgZnjgIIKCue3j+S6uuWPo+OAgFBvcHVsYXRpb24sIHRvdGFs77yaU1AuUE9QLlRPVEwKCuWPluW+l+OBl+OBn+OAgeODh+ODvOOCv+OCkuOBneOBruOBguOBqOOBp+OAgeWRvOOBs+WHuuOBl+OBpuS9v+OBhuOBn+OCgeOBq+OAgWA8LWAg44KS5L2/44Gj44Gm44CB5ZCN5YmN44KS44Gk44GR77yIYXNzaWdu77yJ44G+44GZ44CC44OH44O844K/44Gu5b2i5byP44GM44CBZGF0YSBmcmFtZSDjgajlkbzjgbDjgozjgovjgoLjga7jgarjga7jgafjgIHjgo/jgZ/jgZfjga/jgIHjgYTjgaTjgoLjgIHmnIDliJ3jgasgZGYg44Go44GX44Gm44CB57Ch5Y2Y44Gq5ZCN5YmN44KS44Gk44GR44G+44GZ44CC5ZCN5YmN44Gv44Gq44KT44Gn44KC6Imv44GE44Gu44Gn44GZ44GM44CB6Kaa44GI44KE44GZ44GE44KI44GG44Gr44CB44G+44Gf44CB5pel5pys6Kqe44KC5Y+X44GR5LuY44GR44G+44GZ44GM44CB5omx44GE44GM6KSH6ZuR44Gr44Gq44KL44Gu44Gn44CB6Iux5pWw44Gu44G/44CB44K544Oa44O844K544KE44CB44OP44Kk44OV44Oz44Gv5L2/44GI44Gq44GE44Gu44Gn44CB5Yy65YiH44KK44Gr44Gv44CBXF8g44KS5L2/44Gj44Gm44GE44G+44GZ44CCCgroqq3jgb/ovrzjgb/jgavjga/jgIHlsJHjgZfmmYLplpPjgYzjgYvjgYvjgorjgb7jgZnjgIIKCmBgYHtyIGV2YWwgPSBGQUxTRX0KZGZfcG9wIDwtIFdESShpbmRpY2F0b3IgPSBjKHBvcCA9ICJTUC5QT1AuVE9UTCIpKQpgYGAKCmBgYHtyIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CndyaXRlX2NzdihkZl9wb3AsICJkYXRhL3BvcC5jc3YiKQpgYGAKCmBgYHtyIGVjaG89RkFMU0V9CmRmX3BvcCA8LSByZWFkX2NzdigiZGF0YS9wb3AuY3N2IikKYGBgCgojIyDjg4fjg7zjgr/jgpLopovjgabjgb/jgb7jgZfjgofjgYYKCmBgYHtyfQpkZl9wb3AKYGBgCgojIyBgUkVHSU9OYAoK5Zyw5Z+f5ZCN44Gr5a++5b+c44GZ44KLIGlzbzJjIOOCs+ODvOODieOBruWPluW+lwoKYGBge3J9ClJFR0lPTiA8LSBjKCIxQSIsICIxVyIsICI0RSIsICI3RSIsICI4UyIsICJCOCIsICJFVSIsICJGMSIsICJPRSIsICJTMSIsIAoiUzIiLCAiUzMiLCAiUzQiLCAiVDIiLCAiVDMiLCAiVDQiLCAiVDUiLCAiVDYiLCAiVDciLCAiVjEiLCAiVjIiLCAKIlYzIiwgIlY0IiwgIlhDIiwgIlhEIiwgIlhFIiwgIlhGIiwgIlhHIiwgIlhIIiwgIlhJIiwgIlhKIiwgIlhMIiwgCiJYTSIsICJYTiIsICJYTyIsICJYUCIsICJYUSIsICJYVCIsICJYVSIsICJYWSIsICJaNCIsICJaNyIsICJaRiIsIAoiWkciLCAiWkgiLCAiWkkiLCAiWkoiLCAiWlEiLCAiWlQiKQpgYGAKCiMjIOWcsOWfn+WQjeOBrueiuuiqjQoKYGBge3J9CmRmX3BvcCB8PiBmaWx0ZXIoaXNvMmMgJWluJSBSRUdJT04pIHw+IGRpc3RpbmN0KGNvdW50cnksIGlzbzJjKQpgYGAKCiMjIOWbveWQjeeiuuiqjQoKYGBge3J9CmRmX3BvcCB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+IAogIGRpc3RpbmN0KGNvdW50cnksIGlzbzJjKSB8PiBhcnJhbmdlKGNvdW50cnkpCmBgYAoKIyMg6KGM44Gu6YG45oqe77yIYGZpbHRlcigpYO+8iQoKLSAgIGBmaWx0ZXJgKCrmnaHku7YqKSDvvJrmnaHku7bjgavjgYLjgaPjgZ/ooYzjgpLpgbjmip7mir3lh7rjgZfjgb7jgZnjgIIKCiAgICAtICAgYGZpbHRlcmAoKuWkieaVsCogYD09YCAiKuaWh+Wtl+WIlyoiKSDvvJrlpInmlbDjgYzmloflrZfliJfjgajkuIDoh7TjgZnjgovjgoLjga7jgpLmir3lh7rvvIg9IOOBp+OBr+OBquOBj+OAgT09IOOBq+azqOaEj++8iQoKICAgIC0gICBgZmlsdGVyYCgq5aSJ5pWwKiBgJWluJSBjYCgqIuaWh+Wtl+WIlzEiLCAuLi4sICLmloflrZfliJduIiopIO+8miDlpInmlbDjgYzmloflrZfliJcxIOOBi+OCiSDmloflrZfliJduIOOBruOBqeOCjOOBi+OBq+S4gOiHtOOBl+OBn+OCguOBruOCkuaKveWHugoKICAgIC0gICBgZmlsdGVyYChgIWAq5p2h5Lu2Kikg77ya5p2h5Lu244Go5LiA6Ie044GX44Gq44GE44KC44Gu44KS5oq95Ye644CCCgogICAgLSAgIGBmaWx0ZXJgKCrmnaHku7YxLCDmnaHku7YyKinvvJrmnaHku7YxIOOBq+S4gOiHtOOBmeOCi+OCguOBruOBruOBquOBi+OBp+OAgeadoeS7tjIg44Gr5LiA6Ie044GZ44KL44KC44Gu44KS5oq95Ye644CCCgogICAgLSAgIGBmaWx0ZXJgKCrlpInmlbAqIGA8YCAq5pWw5YCkKinvvJrmlbDlgKTjga7jgajjgY3jga/jgIHlvJXnlKjnrKbjgarjgZfjgIJgPD0sID4sID49YCDjgoLlkIzmp5jjgIIKCi0gICBgZGlzdGluY3RgKOWkieaVsCnvvJrlpInmlbDjga7lgKTjgYznlbDjgarjgovjgoLjga7jga7jgb/mir3lh7oKCi0gICBgZHJvcF9uYWAo5aSJ5pWwKe+8muWkieaVsOOBruWApOOBjCAqTkEqIOOBruOCguOBruOBr+OAgeWJiumZpAoKIyMg44OR44Kk44OX44O75oqY44KM57ea44Kw44Op44OVCgotICAgYHw+YCA6IOODkeOCpOODl++8iHBpcGUgb3BlcmF0b3LvvInmrKHjgIXjgavjg4fjg7zjgr/jgpLpgIHjgaPjgablrp/ooYzjgZXjgZvjgovjgZ/jgoHjgavkvb/jgYTjgb7jgZnjgIIKCiAgICAtICAgYGRhdGEgfD4gZmlsdGVyKOadoeS7tilgIOOBr+OAgWBmaWx0ZXIoZGF0YSwg5p2h5Lu2KWAg44Go5ZCM44GYCgogICAgLSAgIGBkYXRhIHw+IGZpbHRlcihpc28yYyAlaW4lIFJFR0lPTilgIOOBr+OAgWBmaWx0ZXIoZGF0YSwgaXNvMmMgJWluJSBSRUdJT04pYCDjgajlkIzjgZjjgIIKCi0gICBgZ2dwbG90KGFlcyh5ZWFyLCBwb3ApKSArIGdlb21fbGluZSgpYO+8muaKmOOCjOe3muOCsOODqeODleOCkuaPj+eUu+OBl+OBvuOBmeOAggoKICAgIC0gICBgYWVzKHllYXIsIHBvcClg77yaeWVhciDjgYwgeCDou7jjgIFwb3DvvIjnt4/kurrlj6PvvInjgpIgeSDou7jjgavmjIflrprjgZfjgb7jgZnjgIIKCiAgICAgICAgLSAgIGBhZXMoeCA9IHllYXIsIHkgPSBwb3ApYCDjga7nnIHnlaXlvaLjgIIKCiAgICAtICAg44Kw44Op44OV44Gu5o+P55S744Gr44Gk44GE44Gm44Gv44CB5qyh5Zue5Lul6ZmN44Gr5bCR44GX44Ga44Gk6Kqs5piO44CCCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmBgYHtyfQpkZl9wb3AgfD4gZmlsdGVyKGNvdW50cnkgPT0gIldvcmxkIikgfD4gCiAgZ2dwbG90KGFlcyh5ZWFyLCBwb3ApKSArIGdlb21fbGluZSgpICsgCiAgbGFicyh0aXRsZSA9ICLkuJbnlYzjga7nt4/kurrlj6MiKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3J9CmRmX3BvcCB8PiBmaWx0ZXIoY291bnRyeSA9PSAiSmFwYW4iKSB8PiAKICBnZ3Bsb3QoYWVzKHllYXIsIHBvcCkpICsgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSAi5pel5pys44Gu57eP5Lq65Y+jIikKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCioq57e057+SMe+8mkdlcm1hbnkg44GoIOODieOCpOODhOOBrumDqOWIhuOCkuS7luOBruWbveWQjeOBq+WkieOBiOOBpuOBv+OBpuOBj+OBoOOBleOBhOOAgioqCgpgYGB7cn0KQ09VTlRSWSA8LSAiR2VybWFueSIKZGZfcG9wIHw+IGZpbHRlcihjb3VudHJ5ID09IENPVU5UUlkpIHw+IAogIGdncGxvdChhZXMoeWVhciwgcG9wKSkgKyBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9ICLjg4njgqTjg4Tjga7nt4/kurrlj6MiKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKKirnt7Tnv5IyLiBDT1VOVFJJRVMg44KS57eo6ZuG44GX44Gm44CB44Kk44Ku44Oq44K544Go44OJ44Kk44OE44Go44OV44Op44Oz44K544Go5pel5pys44KS5LuW44Gu5Zu944Gr5aSJ44GI44Gm44G/44Gm44GP44Gg44GV44GE44CCKioKCmBgYHtyfQpDT1VOVFJJRVMgPC0gYygiVW5pdGVkIEtpbmdkb20iLCAiR2VybWFueSIsICJGcmFuY2UiLCAiSmFwYW4iKQpkZl9wb3AgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBDT1VOVFJJRVMpIHw+IAogIGdncGxvdChhZXMoeWVhciwgcG9wLCBjb2wgPSAgY291bnRyeSkpICsgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSAi44Kk44Ku44Oq44K544Go44OJ44Kk44OE44Go44OV44Op44Oz44K544Go5pel5pys44Gu57eP5Lq65Y+jIikKYGBgCgojIyAyMDIy5bm044Gu57eP5Lq65Y+j44Gu5aSa44GE6aCGCgpgYGB7cn0KZGZfcG9wIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gZmlsdGVyKHllYXIgPT0gMjAyMikgfD4gCiAgYXJyYW5nZShkZXNjKHBvcCkpCmBgYAoKIyMgMjAyMuW5tOOBrue3j+S6uuWPo+OBriBUT1AgMTEKCmBgYHtyfQpwb3BfdG9wMTEgPC0gZGZfcG9wIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gZmlsdGVyKHllYXIgPT0gMjAyMikgfD4gCiAgYXJyYW5nZShkZXNjKHBvcCkpIHw+IHNsaWNlX2hlYWQobj0xMSkgfD4gcHVsbChpc28yYykKcG9wX3RvcDExCmRwdXQocG9wX3RvcDExKQpgYGAKCioq57e057+SNC4gMTk2MOW5tOOBrue3j+S6uuWPo+OBjOWkmuOBhOmghuOBq+S6lOeVquebruOBvuOBp+ODquOCueODiOOBl+OBpuOBj+OBoOOBleOBhOOAgioqCgpgYGB7cn0KcG9wX3RvcDUgPC0gZGZfcG9wIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gCiAgZmlsdGVyKHllYXIgPT0gMjAyMikgfD4gCiAgYXJyYW5nZShkZXNjKHBvcCkpIHw+IHNsaWNlX2hlYWQobj01KSB8PiBwdWxsKGlzbzJjKQpwb3BfdG9wNQpkcHV0KHBvcF90b3A1KQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3J9CmRmX3BvcCB8PiBmaWx0ZXIoaXNvMmMgJWluJSBwb3BfdG9wMTEpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBwb3AsIGNvbG9yID0gaXNvMmMpKSArIGdlb21fbGluZSgpICsgbGFicyh0aXRsZSA9ICJUT1AxMeOBrue3j+S6uuWPoyIpCmBgYAoKIyMg5Lit5Zu944Go44Kk44Oz44OJ5Lul5aSW44GuVE9QMTEg44Gu5Lq65Y+j5o6o56e7CgpgYGB7cn0KZGZfcG9wIHw+IGZpbHRlcihpc28yYyAlaW4lIHBvcF90b3AxMSkgfD4gCiAgZmlsdGVyKCEoaXNvMmMgJWluJSBjKCJDTiIsICJJTiIpKSkgfD4gCiAgZ2dwbG90KGFlcyh5ZWFyLCBwb3AsIGNvbG9yID0gY291bnRyeSkpICsgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSAi5Lit5Zu944Go44Kk44Oz44OJ5Lul5aSW44GuVE9QMTHjga7nt4/kurrlj6MiKQpgYGAKCiMjIOWcsOWfn+OBlOOBqOOBruS6uuWPo+aOqOenuwoKYGBge3J9CmRmX3BvcCB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIGMoIlNvdXRoIEFzaWEiLCAiRXVyb3BlICYgQ2VudHJhbCBBc2lhIiwgIk1pZGRsZSBFYXN0ICYgTm9ydGggQWZyaWNhIiwgCiJFYXN0IEFzaWEgJiBQYWNpZmljIiwgIlN1Yi1TYWhhcmFuIEFmcmljYSIsICJMYXRpbiBBbWVyaWNhICYgQ2FyaWJiZWFuIiwgIk5vcnRoIEFtZXJpY2EiKSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHBvcCwgY29sb3IgPSBjb3VudHJ5KSkgKyBnZW9tX2xpbmUoKSArIGxhYnModGl0bGUgPSAi5Zyw5Z+f44GU44Go44Gu57eP5Lq65Y+jIikKYGBgCgojIyDjg4fjg7zjgr/jga7oqq3jgb/ovrzjgb/vvIgy77yJCgrnt4/kurrlj6PjgIBQb3B1bGF0aW9uLCB0b3RhbO+8mlNQLlBPUC5UT1RMCgrlh7rnlJ/njofvvIjljYPkurrvvIlCaXJ0aCByYXRlLCBjcnVkZSAocGVyIDEsMDAwIHBlb3BsZSnvvJpTUC5EWU4uQ0JSVC5JTgoK5q275Lqh546H77yI5Y2D5Lq677yJRGVhdGggcmF0ZSwgY3J1ZGUgKHBlciAxLDAwMCBwZW9wbGUp77yaU1AuRFlOLkNEUlQuSU4KCuiLpeW5tOWKtOWDjeS6uuWPo+eOh+OAgEFnZSBkZXBlbmRlbmN5IHJhdGlvLCB5b3VuZyAoJSBvZiB3b3JraW5nLWFnZSBwb3B1bGF0aW9uKe+8mlNQLlBPUC5EUE5ELllHCgrpq5jpvaLogIXlirTlg43kurrlj6PnjofjgIBBZ2UgZGVwZW5kZW5jeSByYXRpbywgb2xkICglIG9mIHdvcmtpbmctYWdlIHBvcHVsYXRpb24p77yaU1AuUE9QLkRQTkQuT0wKCmBgYHtyIGV2YWwgPSBGQUxTRX0KZGZfcG9wX3JlbGF0ZWQgPC0gV0RJKGluZGljYXRvciA9IGMocG9wID0gIlNQLlBPUC5UT1RMIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpcnRoX3JhdGUgPSAiU1AuRFlOLkNCUlQuSU4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVhdGhfcmF0ZSA9ICJTUC5EWU4uQ0RSVC5JTiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5b3VuZyA9ICJTUC5QT1AuRFBORC5ZRyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQgPSAiU1AuUE9QLkRQTkQuT0wiKSkKYGBgCgojIyDkv53lrZjjgajoqq3jgb/ovrzjgb8KCmBgYHtyIGV2YWwgPSBGQUxTRX0Kd3JpdGVfY3N2KGRmX3BvcF9yZWxhdGVkLCAiZGF0YS9wb3BfcmVsYXRlZC5jc3YiKQpgYGAKCmBgYHtyfQpkZl9wb3BfcmVsYXRlZCA8LSByZWFkX2NzdigiZGF0YS9wb3BfcmVsYXRlZC5jc3YiKQpgYGAKCiMjIOODh+ODvOOCv+OBrueiuuiqjQoKYGBge3J9CmhlYWQoZGZfcG9wX3JlbGF0ZWQpCmBgYAoKIyMg44OH44O844K/44Gu5qeL6YCg77yIU3RydWN0dXJl77yJCgpgYGB7ciBldmFsID0gRkFMU0V9CnN0cihkZl9wb3BfcmVsYXRlZFtdKQpgYGAKCmBgYHtyIGVjaG89RkFMU0V9CnN0cihkZl9wb3BfcmVsYXRlZFtdKQpgYGAKCmB7Z2xpbXBzZShkZl9wb3BfZXh0cmEpfWAKCiMjIAoKIyMg5aSJ5b2iCgp3aWRlIOODh+ODvOOCv+OCkiBsb25nIOODh+ODvOOCv+OBq+WkieW9ouOBl+OBvuOBmeOAguOBhOOBmuOCjOiqrOaYjuOBl+OBvuOBmeOAggoKYGBge3J9CmRmX3BvcF9sb25nIDwtIGRmX3BvcF9yZWxhdGVkIHw+IAogIHBpdm90X2xvbmdlcihwb3A6b2xkLCBuYW1lc190byA9ICJuYW1lIiwgdmFsdWVzX3RvID0gInZhbHVlIikKYGBgCgojIyDlh7rnlJ/njofjgajmrbvkuqHnjocKCuWHuueUn+eOh++8iOWNg+S6uu+8iUJpcnRoIHJhdGUsIGNydWRlIChwZXIgMSwwMDAgcGVvcGxlKe+8mlNQLkRZTi5DQlJULklOIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NQLkRZTi5DQlJULklOKV0KCuatu+S6oeeOh++8iOWNg+S6uu+8iURlYXRoIHJhdGUsIGNydWRlIChwZXIgMSwwMDAgcGVvcGxlKe+8mlNQLkRZTi5DRFJULklOIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NQLkRZTi5DRFJULklOKV0KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3J9CmRmX3BvcF9sb25nIHw+IGZpbHRlcihuYW1lICVpbiUgYygiYmlydGhfcmF0ZSIsICJkZWF0aF9yYXRlIikpIHw+CiAgZmlsdGVyKGNvdW50cnkgPT0gIldvcmxkIikgfD4gZHJvcF9uYSh2YWx1ZSkgfD4gIyBOQSB2YWx1ZSDjgpLliYrpmaQKICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBjb2wgPSBuYW1lKSkgKyBnZW9tX2xpbmUoKSArIAogIGxhYnModGl0bGUgPSAi5Ye655Sf546H44CB5q275Lqh546H77yIMTAwMOS6uuW9k+OBn+OCiu+8iSIpCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoqKue3tOe/kjUg5Zu944KS6YG45oqe44GX44Gm44CB5Ye655Sf546H44CB5q275Lqh546H44Gu44Kw44Op44OV44KS5o+P44GE44Gm44GP44Gg44GV44GE44CCKioKCmBgYHtyfQpkZl9wb3BfbG9uZyB8PiBmaWx0ZXIobmFtZSAlaW4lIGMoImJpcnRoX3JhdGUiLCAiZGVhdGhfcmF0ZSIpKSB8PgogIGZpbHRlcihjb3VudHJ5ID09ICJXb3JsZCIpIHw+IGRyb3BfbmEodmFsdWUpIHw+ICMgTkEgdmFsdWUg44KS5YmK6ZmkCiAgZ2dwbG90KGFlcyh5ZWFyLCB2YWx1ZSwgY29sID0gbmFtZSkpICsgZ2VvbV9saW5lKCkgKyAKICBsYWJzKHRpdGxlID0gIuWHuueUn+eOh+OAgeatu+S6oeeOh++8iDEwMDDkurrlvZPjgZ/jgorvvIkiKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3J9CmRmX3BvcF9sb25nIHw+IGZpbHRlcihuYW1lICVpbiUgYygiYmlydGhfcmF0ZSIsICJkZWF0aF9yYXRlIikpIHw+CiAgZmlsdGVyKGlzbzJjICVpbiUgYygiQkQiLCAiQlIiLCAiQ04iLCAiSUQiLCAiTkciLCAiSlAiKSkgfD4gZHJvcF9uYSh2YWx1ZSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBjb2wgPSBjb3VudHJ5LCBsaW5ldHlwZSA9IG5hbWUpKSArIAogIGdlb21fbGluZSgpICsgbGFicyh0aXRsZSA9ICLlm73jgIXjga7jgIHlh7rnlJ/njofjgIHmrbvkuqHnjofvvIgxMDAw5Lq65b2T44Gf44KK77yJIikKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmBgYHtyfQpkZl9wb3BfbG9uZyB8PiBmaWx0ZXIobmFtZSAlaW4lIGMoImJpcnRoX3JhdGUiLCAiZGVhdGhfcmF0ZSIpKSB8PgogIGZpbHRlcihpc28yYyAlaW4lIGMoIlo0IiwgIlo3IiwgIlpKIiwgIlpRIiwgIlhVIiwgIjhTIiwgIlpHIikpIHw+IGRyb3BfbmEoKSB8PgogIGdncGxvdChhZXMoeWVhciwgdmFsdWUsIGNvbCA9IGNvdW50cnksIGxpbmV0eXBlID0gbmFtZSkpICsgCiAgZ2VvbV9saW5lKCkgKyBsYWJzKHRpdGxlID0gIuWcsOWfn+OBlOOBqOOBruWHuueUn+eOh+ODu+atu+S6oeeOh++8iDEwMDDkurrjgYLjgZ/jgorvvIkiKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3J9CmRmX3BvcF9sb25nIHw+IGZpbHRlcihuYW1lICVpbiUgYygiYmlydGhfcmF0ZSIsICJkZWF0aF9yYXRlIikpIHw+CiAgZmlsdGVyKGlzbzJjICVpbiUgYygiQkQiLCAiQlIiLCAiQ04iLCAiSUQiLCAiTkciLCAiSlAiKSkgfD4gZHJvcF9uYSh2YWx1ZSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBjb2wgPSBjb3VudHJ5LCBsaW5ldHlwZSA9IG5hbWUpKSArIAogIGdlb21fbGluZSgpICsgbGFicyh0aXRsZSA9ICLlm73jgIXjga7jgIHlh7rnlJ/njofjgIHmrbvkuqHnjofvvIgxMDAw5Lq65b2T44Gf44KK77yJIikKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCioq57e057+SNi4g44GE44GP44Gk44GL44Gu5Zu944G+44Gf44Gv5Zyw5Z+f44Gu44CB5Ye655Sf546H44CB5q275Lqh546H44Gu44Kw44Op44OV44KS5o+P44GE44Gm44GP44Gg44GV44GE44CCKioKCmBgYHtyfQpkZl9wb3BfbG9uZyB8PiBmaWx0ZXIobmFtZSAlaW4lIGMoImJpcnRoX3JhdGUiLCAiZGVhdGhfcmF0ZSIpKSB8PgogIGZpbHRlcihpc28yYyAlaW4lIGMoIkJEIiwgIkJSIiwgIkNOIiwgIklEIiwgIk5HIiwgIkpQIikpIHw+IGRyb3BfbmEodmFsdWUpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCB2YWx1ZSwgY29sID0gY291bnRyeSwgbGluZXR5cGUgPSBuYW1lKSkgKyAKICBnZW9tX2xpbmUoKSArIGxhYnModGl0bGUgPSAi5Zu944CF44Gu44CB5Ye655Sf546H44CB5q275Lqh546H77yIMTAwMOS6uuW9k+OBn+OCiu+8iSIpCmBgYAoKIyMg5om26aSK5a625peP44Gu5Yq05YON5Lq65Y+j44Gr5a++44GZ44KL5Ymy5ZCICgroi6XlubTlirTlg43kurrlj6PnjofjgIBBZ2UgZGVwZW5kZW5jeSByYXRpbywgeW91bmcgKCUgb2Ygd29ya2luZy1hZ2UgcG9wdWxhdGlvbinvvJpTUC5QT1AuRFBORC5ZRyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TUC5QT1AuRFBORC5ZRyldCgrlubTpvaLliKXmibbppIrmr5TnjofvvIjoi6XlubTvvInjga/jgIExNeats+acqua6gOOBruaJtumkiuWutuaXj+OBruOAgTE15q2z44GL44KJNjTmrbPjgb7jgafjga7nlJ/nlKPlubTpvaLkurrlj6Pjgavlr77jgZnjgovmr5TnjofjgafjgYLjgovjgILjg4fjg7zjgr/jga/jgIHnlJ/nlKPlubTpvaLkurrlj6MxMDDkurrlvZPjgZ/jgorjga7mibbppIrlrrbml4/jga7libLlkIjjgafnpLrjgZXjgozjgabjgYTjgovjgIIKCumrmOm9ouiAheWKtOWDjeS6uuWPo+eOh+OAgEFnZSBkZXBlbmRlbmN5IHJhdGlvLCBvbGQgKCUgb2Ygd29ya2luZy1hZ2UgcG9wdWxhdGlvbinvvJpTUC5QT1AuRFBORC5PTCBbW0xpbmsgdG8gTWV0YWRhdGFdKGh0dHBzOi8vZGF0YWJhbmsud29ybGRiYW5rLm9yZy9tZXRhZGF0YWdsb3NzYXJ5L2hlYWx0aC1udXRyaXRpb24tYW5kLXBvcHVsYXRpb24tc3RhdGlzdGljcy9zZXJpZXMvU1AuUE9QLkRQTkQuT0wpXQoK5bm06b2i5Yil5om26aSK5q+U546H77yI6auY6b2i77yJ44Gv44CB55Sf55Sj5bm06b2i5Lq65Y+j77yIMTXvvZ42NOats++8ieOBq+WvvuOBmeOCi+mrmOm9ouaJtumkiuWutuaXj++8iDY05q2z5Lul5LiK77yJ44Gu5q+U546H44CC44OH44O844K/44Gv44CB55Sf55Sj5bm06b2i5Lq65Y+jMTAw5Lq65b2T44Gf44KK44Gu5om26aSK5a625peP44Gu5Ymy5ZCI44Gn56S644GV44KM44Gm44GE44KL44CCCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmBgYHtyfQpkZl9wb3BfbG9uZyB8PiBmaWx0ZXIobmFtZSAlaW4lIGMoInlvdW5nIiwgIm9sZCIpKSB8PgogIGZpbHRlcihjb3VudHJ5ID09ICJXb3JsZCIpIHw+IAogIGdncGxvdChhZXMoeWVhciwgdmFsdWUsIGNvbCA9IG5hbWUpKSArIGdlb21fbGluZSgpICsgCiAgbGFicyh0aXRsZSA9ICLkuJbnlYzjga7pq5jpvaLogIXjg7voi6XlubTogIXmibbppIrnjociKQpgYGAKCioq57e057+SNy4g5Zu944KS6YG45oqe44GX44Gm44CB6auY6b2i6ICF44O76Iul5bm06ICF44Gu5om26aSK546H44Gu44Kw44Op44OV44KS5o+P44GE44Gm44GP44Gg44GV44GE44CCKioKCmBgYHtyIGV2YWwgPSBGQUxTRX0KZGZfcG9wX2xvbmcgfD4gZmlsdGVyKG5hbWUgJWluJSBjKCJ5b3VuZyIsICJvbGQiKSkgfD4KICBmaWx0ZXIoY291bnRyeSA9PSAiV29ybGQiKSB8PiAKICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBjb2wgPSBuYW1lKSkgKyBnZW9tX2xpbmUoKSArIAogIGxhYnModGl0bGUgPSAi5LiW55WM44Gu6auY6b2i6ICF44O76Iul5bm06ICF5om26aSK546HIikKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmBgYHtyfQpkZl9wb3BfbG9uZyB8PiBmaWx0ZXIobmFtZSAlaW4lIGMoInlvdW5nIiwgIm9sZCIpKSB8PgogIGZpbHRlcihpc28yYyAlaW4lIGMoIkJEIiwgIkJSIiwgIkNOIiwgIklEIiwgIk5HIiwgIkpQIikpIHw+IAogIGdncGxvdChhZXMoeWVhciwgdmFsdWUsIGNvbCA9IGNvdW50cnksIGxpbmV0eXBlID0gbmFtZSkpICsgCiAgZ2VvbV9saW5lKCkgKyBsYWJzKHRpdGxlID0gIuWbveOAheOBrumrmOm9ouiAheODu+iLpeW5tOiAheaJtumkiueOhyIpCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpgYGB7cn0KZGZfcG9wX2xvbmcgfD4gZmlsdGVyKG5hbWUgJWluJSBjKCJ5b3VuZyIsICJvbGQiKSkgfD4KICBmaWx0ZXIoaXNvMmMgJWluJSBjKCJVUyIsICJHQiIsICJDTiIsICJERSIsICJGUiIsICJKUCIsICJJTiIpKSB8PiAKICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBjb2wgPSBjb3VudHJ5LCBsaW5ldHlwZSA9IG5hbWUpKSArIAogIGdlb21fbGluZSgpICsgbGFicyh0aXRsZSA9ICLlm73jgIXjga7pq5jpvaLogIXjg7voi6XlubTogIXmibbppIrnjociKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3J9CmRmX3BvcF9sb25nIHw+IGZpbHRlcihuYW1lICVpbiUgYygieW91bmciLCAib2xkIikpIHw+CiAgZmlsdGVyKGNvdW50cnkgJWluJSBjKCJTb3V0aCBBc2lhIiwgIkV1cm9wZSAmIENlbnRyYWwgQXNpYSIsICJNaWRkbGUgRWFzdCAmIE5vcnRoIEFmcmljYSIsIAoiRWFzdCBBc2lhICYgUGFjaWZpYyIsICJTdWItU2FoYXJhbiBBZnJpY2EiLCAiTGF0aW4gQW1lcmljYSAmIENhcmliYmVhbiIsICJOb3J0aCBBbWVyaWNhIikpIHw+IAogIGdncGxvdChhZXMoeWVhciwgdmFsdWUsIGNvbCA9IGNvdW50cnksIGxpbmV0eXBlID0gbmFtZSkpICsgCiAgZ2VvbV9saW5lKCkgKyBsYWJzKHRpdGxlID0gIuWcsOWfn+WIpeOBruWKtOWDjeS6uuWPo+OBq+WvvuOBmeOCi+mrmOm9ouODu+iLpeW5tOaJtumkiueOh++8iO+8he+8iSIsIAogICAgICAgc3VidGl0bGUgPSAi5a6f57ea77ya6auY6b2i6ICF44CB54K557ea77ya6Iul5bm06ICFIiwgeCA9ICIiLCBjb2wgPSAiIiwgbGluZXR5cGUgPSAiIikKYGBgCgoqKue3tOe/kjguIOOBhOOBj+OBpOOBi+OBruWbveOBvuOBn+OBr+WcsOWfn+OBruOAgemrmOm9ouiAheODu+iLpeW5tOiAheOBruaJtumkiueOh+OBruOCsOODqeODleOCkuaPj+OBhOOBpuOBj+OBoOOBleOBhOOAgioqCgpgYGB7ciBldmFsID0gRkFMU0V9CmRmX3BvcF9sb25nIHw+IGZpbHRlcihuYW1lICVpbiUgYygieW91bmciLCAib2xkIikpIHw+CiAgZmlsdGVyKGlzbzJjICVpbiUgYygiVVMiLCAiR0IiLCAiQ04iLCAiREUiLCAiRlIiLCAiSlAiLCAiSU4iKSkgfD4gCiAgZ2dwbG90KGFlcyh5ZWFyLCB2YWx1ZSwgY29sID0gY291bnRyeSwgbGluZXR5cGUgPSBuYW1lKSkgKyAKICBnZW9tX2xpbmUoKeOAgCsgbGFicyh0aXRsZSA9ICLlm73jgIXjga7pq5jpvaLogIXjg7voi6XlubTogIXmibbppIrnjociKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3IgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9N30KZGZfcG9wX2xvbmcgfD4gZmlsdGVyKG5hbWUgJWluJSBjKCJ5b3VuZyIsICJvbGQiKSkgfD4KICBmaWx0ZXIoY291bnRyeSAlaW4lIGMoIlNvdXRoIEFzaWEiLCAiRXVyb3BlICYgQ2VudHJhbCBBc2lhIiwgIk1pZGRsZSBFYXN0ICYgTm9ydGggQWZyaWNhIiwgCiJFYXN0IEFzaWEgJiBQYWNpZmljIiwgIlN1Yi1TYWhhcmFuIEFmcmljYSIsICJMYXRpbiBBbWVyaWNhICYgQ2FyaWJiZWFuIiwgIk5vcnRoIEFtZXJpY2EiKSkgfD4gCiAgZ2dwbG90KGFlcyh5ZWFyLCB2YWx1ZSwgY29sID0gY291bnRyeSwgbGluZXR5cGUgPSBuYW1lKSkgKyAKICBnZW9tX2xpbmUoKSArIGZhY2V0X3dyYXAofmNvdW50cnkpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgbGFicyh0aXRsZSA9ICLlnLDln5/liKXjga7lirTlg43kurrlj6Pjgavlr77jgZnjgovpq5jpvaLjg7voi6XlubTmibbppIrnjofvvIjvvIXvvIkiLCAKICAgICAgIHN1YnRpdGxlID0gIuWun+e3mu+8mumrmOm9ouiAheOAgeeCuee3mu+8muiLpeW5tOiAhSIsIHggPSAiIiwgeSA9ICIiKQpgYGAKCkRlZmF1bHQgaXPCoCoqZmlnLioqwqAqKndpZHRoID0gNyBhbmQgZmlnLioqwqAqKmhlaWdodCA9IDUqKgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpgYGB7cn0KZGZfcG9wX2xvbmcgfD4gZmlsdGVyKG5hbWUgJWluJSBjKCJ5b3VuZyIsICJvbGQiKSkgfD4KICBmaWx0ZXIoY291bnRyeSAlaW4lIGMoIlNvdXRoIEFzaWEiLCAiRXVyb3BlICYgQ2VudHJhbCBBc2lhIiwgIk1pZGRsZSBFYXN0ICYgTm9ydGggQWZyaWNhIiwgCiJFYXN0IEFzaWEgJiBQYWNpZmljIiwgIlN1Yi1TYWhhcmFuIEFmcmljYSIsICJMYXRpbiBBbWVyaWNhICYgQ2FyaWJiZWFuIiwgIk5vcnRoIEFtZXJpY2EiKSkgfD4gCiAgZ2dwbG90KGFlcyh5ZWFyLCB2YWx1ZSwgY29sID0gY291bnRyeSwgbGluZXR5cGUgPSBuYW1lKSkgKyAKICBnZW9tX2xpbmUoKSArIGZhY2V0X3dyYXAofmNvdW50cnksIDIsNCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBsYWJzKHRpdGxlID0gIuWcsOWfn+WIpeOBruWKtOWDjeS6uuWPo+OBq+WvvuOBmeOCi+mrmOm9ouODu+iLpeW5tOaJtumkiueOh++8iO+8he+8iSIsIAogICAgICAgc3VidGl0bGUgPSAi5a6f57ea77ya6auY6b2i6ICF44CB54K557ea77ya6Iul5bm06ICFIiwgeCA9ICIiLCB5ID0gIiIpCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpgYGB7cn0KZGZfcG9wX2xvbmcgfD4gZmlsdGVyKG5hbWUgJWluJSBjKCJiaXJ0aF9yYXRlIiwgImRlYXRoX3JhdGUiLCAieW91bmciLCAib2xkIikpIHw+CiAgZmlsdGVyKGNvdW50cnkgPT0gIkphcGFuIikgfD4gZHJvcF9uYSh2YWx1ZSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBjb2wgPSBuYW1lKSkgKyBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9ICLml6XmnKzjga7lh7rnlJ/njofjg7vmrbvkuqHnjofjg7vlirTlg43kurrlj6Pjgavlr77jgZnjgovpq5jpvaLjg7voi6XlubTmibbppIrnjofvvIjvvIXvvIkiKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKKirnt7Tnv5I3LiDlm73jgpLpgbjmip7jgZfvvIjjg4njgqTjg4TjgpLlpInmm7TjgZfvvInjgabjgIHpq5jpvaLogIXjg7voi6XlubTogIXjga7mibbppIrnjofjga7jgrDjg6njg5XjgpLmj4/jgYTjgabjgY/jgaDjgZXjgYTjgIIqKgoKYGBge3J9CmRmX3BvcF9sb25nIHw+IGZpbHRlcihuYW1lICVpbiUgYygiYmlydGhfcmF0ZSIsICJkZWF0aF9yYXRlIiwgInlvdW5nIiwgIm9sZCIpKSB8PgogIGZpbHRlcihjb3VudHJ5ID09ICJHZXJtYW55IikgfD4gZHJvcF9uYSh2YWx1ZSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBjb2wgPSBuYW1lKSkgKyBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9ICLjg4njgqTjg4Tjga7lh7rnlJ/njofjg7vmrbvkuqHnjofjg7vlirTlg43kurrlj6Pjgavlr77jgZnjgovpq5jpvaLjg7voi6XlubTmibbppIrnjofvvIjvvIXvvIkiKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3J9CmRmX3BvcF9sb25nIHw+IGZpbHRlcihuYW1lICVpbiUgYygiYmlydGhfcmF0ZSIsICJkZWF0aF9yYXRlIiwgInlvdW5nIiwgIm9sZCIpKSB8PgogIGZpbHRlcihjb3VudHJ5ICAlaW4lICBjKCJHZXJtYW55IiwgIkphcGFuIikpIHw+IGRyb3BfbmEodmFsdWUpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCB2YWx1ZSwgY29sID0gY291bnRyeSwgbGluZXR5cGUgPSBuYW1lKSkgKyBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9ICLjg4njgqTjg4Tjgajml6XmnKzjga7lh7rnlJ/njofjg7vmrbvkuqHnjofjg7vlirTlg43kurrlj6Pjgavlr77jgZnjgovpq5jpvaLjg7voi6XlubTmibbppIrnjofvvIjvvIXvvIkiKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3J9CmRmX3BvcF9sb25nIHw+IGZpbHRlcihuYW1lID09ICJwb3AiKSB8PgogIGZpbHRlcihjb3VudHJ5ICAlaW4lICBjKCJHZXJtYW55IiwgIkphcGFuIikpIHw+IGRyb3BfbmEodmFsdWUpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCB2YWx1ZSwgY29sID0gY291bnRyeSkpICsgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSAi44OJ44Kk44OE44Go5pel5pys44Gu5Lq65Y+jIikKYGBgCgoqKuWVj+OBhO+8muOBqeOCk+OBquOBk+OBqOOBjOOCj+OBi+OCiuOBvuOBmeOBi+OAgioqCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCioq57e057+SOC4g77yI44OJ44Kk44OE44Go5pel5pys44KS5aSJ5pu044GX77yJ44GE44GP44Gk44GL44Gu5Zu944G+44Gf44Gv5Zyw5Z+f44Gu44CB6auY6b2i6ICF44O76Iul5bm06ICF44Gu5om26aSK546H44Gu44Kw44Op44OV44KS5o+P44GE44Gm44GP44Gg44GV44GE44CCKioKCmBgYHtyfQpkZl9wb3BfbG9uZyB8PiBmaWx0ZXIobmFtZSAlaW4lIGMoImJpcnRoX3JhdGUiLCAiZGVhdGhfcmF0ZSIsICJ5b3VuZyIsICJvbGQiKSkgfD4KICBmaWx0ZXIoY291bnRyeSAgJWluJSAgYygiR2VybWFueSIsICJKYXBhbiIpKSB8PiBkcm9wX25hKHZhbHVlKSB8PgogIGdncGxvdChhZXMoeWVhciwgdmFsdWUsIGNvbCA9IGNvdW50cnksIGxpbmV0eXBlID0gbmFtZSkpICsgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSAi44OJ44Kk44OE44Go5pel5pys44Gu5Ye655Sf546H44O75q275Lqh546H44O75Yq05YON5Lq65Y+j44Gr5a++44GZ44KL6auY6b2i44O76Iul5bm05om26aSK546H77yI77yF77yJIikKYGBgCgojIyAKCiMjIOW+qee/kgoKLSAgIOODkeODg+OCseODvOOCuO+8iFBhY2thZ2XvvInjga7liKnnlKjvvJoKCiAgICAtICAg44Kk44Oz44K544OI44O844Or77yIaW5zdGFsbGF0aW9u77yJ77yaVG9vbHMgXD4gSW5zdGFsbCBQYWNrYWdlcwoKICAgIC0gICDjg63jg7zjg4nvvIhsb2Fk77yJYGxpYnJhcnkodGlkeXZlcnNlKTsgbGlicmFyeShXREkpOyBsaWJyYXJ5KHNob3d0ZXh0KWAKCi0gICDjg4fjg7zjgr/jga7lj5blvpfvvJpgV0RJKGluZGljYXRvciA9IGMocG9wID0gIlNQLlBPUC5UT1RMIikpYAoKLSAgIOeJueWumuOBruihjOOBruWPluW+l++8mmBmaWx0ZXIoKSwgZHJvcF9uYSgpLCBkaXN0aW5jdCgpYAoKLSAgIOaKmOOCjOe3muOCsOODqeODlQoKICAgIC0gICBgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IHBvcCkgKyBnZW9tX2xpbmUoKWAKCiAgICAtICAgYGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBwb3AsIGNvbCA9IGNvdW50cnkpICsgZ2VvbV9saW5lKClgCgojIyDoqrLpoYzjg7vnt7Tnv5IKCuaPkOWHuuOBr+OBl+OBquOBj+OBpuiJr+OBhOOBp+OBmeOBjOOAgeOBnOOBsuWun+mam+OBq+aJi+OCkuWLleOBi+OBl+OBpuWun+ihjOOBl+OBpuOBj+OBoOOBleOBhOOAguiAg+OBiOOBn+OBk+OBqOOAgeeWkeWVj+OBjOOBguOCjOOBsOOAgeiomOmMsuOBl+OBpuOBiuOBhOOBpuOBj+OBoOOBleOBhOOAggoKMS4gIFdESSDjga7jgrXjgqTjg4jjgafjgIHoiIjlkbPjga7jgYLjgovmjIfmqJnjga7jgIHlkI3liY3jgajjgIFXREkg44Kz44O844OJ44KS6YG444KT44Gn44GP44Gg44GV44GE44CC44Gn44GN44KM44Gw44CB6YG45oqe44GX44Gf55CG55Sx44KC6KiY6Yyy44GX44Gm44GP44Gg44GV44GE44CCCgoyLiAgR2VybWFueSDjgagg44OJ44Kk44OE44Gu6YOo5YiG44KS5LuW44Gu5Zu95ZCN44Gr5aSJ44GI44Gm44G/44Gm44GP44Gg44GV44GE44CCKOWbswoKMy4gIDE5NjDlubTjga7nt4/kurrlj6PjgYzlpJrjgYTpoIbjgavkupTnlarnm67jgb7jgafjg6rjgrnjg4jjgZfjgabjgb/jgb7jgZfjgofjgYbjgIIKCjQuICDjgYTjgY/jgaTjgYvjga7lm73jgpLpgbjmip7jgZfjgabjgIHnt4/kurrlj6Pjga7mjqjnp7vjga7jgrDjg6njg5XjgpLmj4/jgYTjgabjgY/jgaDjgZXjgYTjgIIKCjUuICDlm73jgpLpgbjmip7jgZfjgabjgIHlh7rnlJ/njofjgIHmrbvkuqHnjofjga7jgrDjg6njg5XjgpLmj4/jgYTjgabjgY/jgaDjgZXjgYTjgIIKCjYuICDjgYTjgY/jgaTjgYvjga7lm73jgb7jgZ/jga/lnLDln5/jga7jgIHlh7rnlJ/njofjgIHmrbvkuqHnjofjga7jgrDjg6njg5XjgpLmj4/jgYTjgabjgY/jgaDjgZXjgYTjgIIKCjcuICDlm73jgpLpgbjmip7jgZfjgabjgIHpq5jpvaLogIXjg7voi6XlubTogIXjga7mibbppIrnjofjga7jgrDjg6njg5XjgpLmj4/jgYTjgabjgY/jgaDjgZXjgYTjgIIKCjguICDjgYTjgY/jgaTjgYvjga7lm73jgb7jgZ/jga/lnLDln5/jga7jgIHpq5jpvaLogIXjg7voi6XlubTogIXjga7mibbppIrnjofjga7jgrDjg6njg5XjgpLmj4/jgYTjgabjgY/jgaDjgZXjgYTjgIIKCiMjIOWPguiAg+aWh+eMrgoKMS4gIOOAjOOBv+OCk+OBquOBruODh+ODvOOCv+OCteOCpOOCqOODs+OCuSAtIERhdGEgU2NpZW5jZSBmb3IgQWxs44CNW1vjga/jgZjjgoHjgabjga7jg4fjg7zjgr/jgrXjgqTjgqjjg7PjgrldKGh0dHBzOi8vaWN1LWhzdXp1a2kuZ2l0aHViLmlvL2RzNGFqL2ZpcnN0LWV4YW1wbGUuaHRtbCNmaXJzdC1leGFtcGxlKV0KCiAgICAtICAg5bCO5YWl44Go44GX44Gm44CBR0RQ77yI5Zu95YaF57eP55Sf55Sj77yJ44Gu44OH44O844K/44KS5L2/44Gj44Gm6Kqs5piO44GX44Gm44GE44G+44GZ44CCCgoyLiAgUG9zaXQgUHJpbWVyczogVGhlIEJhc2ljcyDlr77oqbHlnovjga7mvJTnv5LjgrXjgqTjg4jjga7mnIDliJ0gW1tMaW5rXShodHRwczovL3Bvc2l0LmNsb3VkL2xlYXJuL3ByaW1lcnMvMSldCgogICAgMS4gIFtWaXN1YWxpemF0aW9uIEJhc2ljc10oaHR0cHM6Ly9wb3NpdC5jbG91ZC9sZWFybi9wcmltZXJzLzEuMSkKCiAgICAyLiAgW1Byb2dyYW1taW5nIEJhc2ljc10oaHR0cHM6Ly9wb3NpdC5jbG91ZC9sZWFybi9wcmltZXJzLzEuMikKCjMuICBSU3R1ZGlvIElERSBDaGVhdCBTaGVldC4g5pep6KaL6KGo44Gn44GZ44CC5Y2w5Yi344GX44Gm5L2/44GG44Gf44KB44Gr44CBUERGIOOCguaPkOS+m+OBl+OBpuOBhOOBvuOBmeOAgltbU2l0ZSBMaW5rXShodHRwczovL3JzdHVkaW8uZ2l0aHViLmlvL2NoZWF0c2hlZXRzL2h0bWwvcnN0dWRpby1pZGUuaHRtbCldCg==