準備

第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)
── Attaching core tidyverse packages ───────────────────────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.4.4     ✔ tibble    3.2.1
✔ lubridate 1.9.3     ✔ tidyr     1.3.1
✔ purrr     1.0.2     ── Conflicts ─────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
library(WDI)
library(showtext)
Loading required package: sysfonts
Loading required package: showtextdb

日本語表示のために

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

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

データの読み込み(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")
Rows: 16758 Columns: 9── Column specification ─────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): country, iso2c, iso3c
dbl (6): year, pop, birth_rate, death_rate, young, old
ℹ 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.

データの確認

head(df_pop_related)

データの構造(Structure)

str(df_pop_related[])
tibble [16,758 × 9] (S3: 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] 1960 1961 1962 1963 1964 ...
 $ pop       : num [1:16758] 8622466 8790140 8969047 9157465 9355514 ...
 $ birth_rate: num [1:16758] 50.3 50.4 50.6 50.7 50.8 ...
 $ death_rate: num [1:16758] 31.9 31.3 30.8 30.4 29.9 ...
 $ young     : num [1:16758] 75 75.1 75.4 75.7 76.2 ...
 $ old       : num [1:16758] 5.1 5.08 5.05 5.02 5 ...

{glimpse(df_pop_extra)}

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 = "日本の総人口")


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

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

練習3. 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
dput(pop_top5)

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 = "地域ごとの総人口")

変形

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人あたり)")


練習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 = "日本の出生率・死亡率・労働人口に対する高齢・若年扶養率(%)")


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 = "ドイツと日本の出生率・死亡率\n労働人口に対する高齢・若年扶養率(%)")


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 = "ドイツと日本の人口")

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

復習

課題

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

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

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

  3. イギリスとドイツとフランスと日本を他の国に変えてください。[練習3]

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

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

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

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

  8. いくつかの国または地域の、高齢者・若年者の扶養率のグラフを描いてください。[練習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]

LS0tCnRpdGxlOiAiR0VTIDAwMSDmvJTnv5IyIgphdXRob3I6ICJILiBTdXp1a2kiCmRhdGU6ICIyMDIz5bm0MTLmnIgxOeaXpWAiCm91dHB1dDoKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgaW9zbGlkZXNfcHJlc2VudGF0aW9uOgogICAgd2lkZXNjcmVlbjogeWVzCiAgICBkZl9wcmludDogcGFnZWQKLS0tCgojIyDmupblgpkKCi0gICDoh6rliIbjga5QQ+OBvuOBn+OBr+aVmeWupOOBrlBDCgogICAgMS4gIOODreOCsOOCpOODswoKICAgIDIuICDjgqbjgqfjg4Pjg5bjg7vjg5bjg6njgqbjgrbjg7zvvIhHb29nbGUgQ2hyb21lIOOBquOBqe+8ieOCkui1t+WLlQoKICAgICAgICAtICAgTW9vZGxlIOOBriBHRVMwMDEg57WM5riI44Go57WM5riI5a2m44Gu44K144Kk44OI44GL44KJ44CB44GT44Gu44K544Op44Kk44OJ44Gu44Oa44O844K444KS6KGo56S677yI44Oq44Oz44Kv44CMUuOBp+ODh+ODvOOCv+OCteOCpOOCqOODs+OCueOAjeOBruesrDLpgLHvvIkKCiAgICAgICAgLSAgIO+8iOWIpeOBruOCv+ODluOBvuOBn+OBryDjgqbjgqPjg7Pjg4njgqbjgafvvIlQb3NpdENsb3VkIOOBq+ODreOCsOOCpOODs++8iOOCouOCq+OCpuODs+ODiOOBruOBquOBhOS6uuOBr+OCteOCpOODs+ODu+OCouODg+ODl++8iVtbUG9zaXQuY2xvdWRdKGh0dHBzOi8vcG9zaXQuY2xvdWQvKV3jg7tbW+WFseacieODl+ODreOCuOOCp+OCr+ODiF0oaHR0cHM6Ly9wb3NpdC5jbG91ZC9jb250ZW50LzU1Mzk3NjMpXQoKICAgIDMuICBSU3R1ZGlvIOOCkui1t+WLlQoKICAgICAgICAtICAg6Ieq5YiG44GuUEPjgatSIOOBqCBSU3R1ZGlvIOOCkuOCpOODs+OCueODiOODvOODq+OBl+OBpuOBhOOBquOBhOOBsuOBqOOBr+S4jeimgeOAggoKICAgICAgICAtICAg5pyA5b6M44Gr5pmC6ZaT44GM44GC44KM44Gw44CB44Kk44Oz44K544OI44O844Or44Gr44Gk44GE44Gm6Kqs5piO44GX44G+44GZ44CCW1vjg6rjg7Pjgq9dKGh0dHBzOi8vcG9zaXQuY28vZG93bmxvYWQvcnN0dWRpby1kZXNrdG9wLyldCgojIyDnrKwy6YCxCgoxMi8xNChUSCnjgIDmiYDlvpfjgajlr4zjga7kuI3lubPnrYnjga7nj77nirbvvJEKCuOAgOOAgOOAgOOAgOOAgCDCoOaJgOW+l+OBqOWvjOOBruS4jeW5s+etieOBruePvueKtu+8kgoK6Kyb576p44Gn44Gv44CB56ysMumAseOAgeesrDPpgLHjgahXb3JsZCBJbmVxdWFsaXR5IHJlcG9ydCAyMDIy44KS5L2/44Gj44Gm44CB5omA5b6X44Go5a+M44Gu5LiN5bmz562J44Gr44Gk44GE44Gm6K2w6KuW44GX44G+44GZ44CCCgoxMi8xOShUVSnjgIBS44Gn44OH44O844K/44K144Kk44Ko44Oz44K577yS77ya5Lq65Y+j44Gu5bCR5a2Q6auY6b2i5YyW44CAIFtbTWFpbl0oaHR0cHM6Ly9kcy1zbC5naXRodWIuaW8vaW50cm8yci9nZXMwMDEvaW5kZXguaHRtbCldCgojIyDorJvnvqkgMTLmnIgxNOaXpe+8iOacqO+8ieaJgOW+l+OBqOWvjOOBruS4jeW5s+etiQoKIyMjIFdvcmxkIEluZXF1YWxpdHkgUmVwb3J0IDIwMjIgW1tMaW5rXShodHRwczovL3dpcjIwMjIud2lkLndvcmxkKV0KCi0gICBFeGVjdXRpdmUgU3VtbWFyeSBbW0xpbmtdKGh0dHBzOi8vd2lyMjAyMi53aWQud29ybGQvZXhlY3V0aXZlLXN1bW1hcnkvKV3jg7tbW+OBv+OCk+OBquOBruODh+ODvOOCv+OCteOCpOOCqOODs+OCueOBuOOBruODquODs+OCr10oaHR0cHM6Ly9pY3UtaHN1enVraS5naXRodWIuaW8vZHM0YWovd2lkLmh0bWwjd2lkKV0KCi0gICBJbnRyb2R1Y3Rpb24gW1tMaW5rXShodHRwczovL3dpcjIwMjIud2lkLndvcmxkL2ludHJvZHVjdGlvbi8pXQoKLSAgIENoYXB0ZXIgMSBHbG9iYWwgZWNvbm9taWMgaW5lcXVhbGl0eTogaW5zaWdodHM6IFtbTGlua10oaHR0cHM6Ly93aXIyMDIyLndpZC53b3JsZC9jaGFwdGVyLTEvKV0KCi0gICBDaGFwdGVyIDIgR2xvYmFsIGluZXF1YWxpdHkgZnJvbSAxODIwIHRvIG5vdzogdGhlIHBlcnNpc3RlbmNlIGFuZCBtdXRhdGlvbiBvZiBleHRyZW1lIGluZXF1YWxpdHkgW1tMaW5rXShodHRwczovL3dpcjIwMjIud2lkLndvcmxkL2NoYXB0ZXItMi8pXQoKLSAgIENoYXB0ZXIgMyBSaWNoIGNvdW50cmllcywgcG9vciBnb3Zlcm5tZW50cyBbW0xpbmtdKGh0dHBzOi8vd2lyMjAyMi53aWQud29ybGQvY2hhcHRlci0zLyldCgotICAgQ2hhcHRlciA0IEdsb2JhbCB3ZWFsdGggaW5lcXVhbGl0eTogdGhlIHJpc2Ugb2YgbXVsdGltaWxsaW9uYWlyZXMgW1tMaW5rXShodHRwczovL3dpcjIwMjIud2lkLndvcmxkL2NoYXB0ZXItNC8pXQoKIyMg5ryU57+SIDEy5pyIMTnml6XvvIjngavvvInkurrlj6PjgajlsJHlrZDpq5jpvaLljJYKCiMjIyDkuJbnlYzplovnmbrmjIfmqJnvvIhXb3JsZCBEZXZlbG9wbWVudCBJbmRpY2F0b3Jz77yJW1tMaW5rXShodHRwczovL2RhdGF0b3BpY3Mud29ybGRiYW5rLm9yZy93b3JsZC1kZXZlbG9wbWVudC1pbmRpY2F0b3JzLyldCgoqKue3tOe/kjEuKiogV0RJIOOBruOCteOCpOODiOOBp+OAgeiIiOWRs+OBruOBguOCi+aMh+aomeOBruOAgeWQjeWJjeOBqOOAgVdESSDjgrPjg7zjg4njgpLpgbjjgpPjgafjgY/jgaDjgZXjgYTjgILjgafjgY3jgozjgbDjgIHpgbjmip7jgZfjgZ/nkIbnlLHjgoLoqJjpjLLjgZfjgabjgY/jgaDjgZXjgYTjgIIKCiMjIyMgKirkurrjgIXvvIhQZW9wbGXvvIktIOS6uuWPo+WLleaFi++8iFBvcHVsYXRpb24gZHluYW1pY3PvvIkqKgoK57eP5Lq65Y+j44CAUG9wdWxhdGlvbiwgdG90YWzvvJpTUC5QT1AuVE9UTCBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TUC5QT1AuVE9UTCldCgrlh7rnlJ/njofvvIjljYPkurrvvIlCaXJ0aCByYXRlLCBjcnVkZSAocGVyIDEsMDAwIHBlb3BsZSnvvJpTUC5EWU4uQ0JSVC5JTiBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TUC5EWU4uQ0JSVC5JTildCgrmrbvkuqHnjofvvIjljYPkurrvvIlEZWF0aCByYXRlLCBjcnVkZSAocGVyIDEsMDAwIHBlb3BsZSnvvJpTUC5EWU4uQ0RSVC5JTiBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TUC5EWU4uQ0RSVC5JTildCgroi6XlubTlirTlg43kurrlj6PnjofjgIBBZ2UgZGVwZW5kZW5jeSByYXRpbywgeW91bmcgKCUgb2Ygd29ya2luZy1hZ2UgcG9wdWxhdGlvbinvvJpTUC5QT1AuRFBORC5ZRyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TUC5QT1AuRFBORC5ZRyldCgrpq5jpvaLogIXlirTlg43kurrlj6PnjofjgIBBZ2UgZGVwZW5kZW5jeSByYXRpbywgb2xkICglIG9mIHdvcmtpbmctYWdlIHBvcHVsYXRpb24p77yaU1AuUE9QLkRQTkQuT0wgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU1AuUE9QLkRQTkQuT0wpXQoKIyMg5ryU57+S44Gu5YaF5a65CgotICAg44OR44OD44Kx44O844K477yIUGFja2FnZe+8ieOCpOODs+OCueODiOODvOODq++8iOOCs+ODs+ODlOODpeODvOOCv+OBq+WFpeOCjOOBpuOBiuOBj++8iQoKLSAgIOODkeODg+OCseODvOOCuOOBruODreODvOODie+8iOOBmeOBkOS9v+OBiOOCi+OCiOOBhuOBq+OBmeOCi++8ie+8mnRpZHl2ZXJzZSwgV0RJLCBzaG93dGV4dAoKLSAgIOODh+ODvOOCv+OBruWPluW+l++8mldESSgpCgotICAg54m55a6a44Gu5p2h5Lu244Gr44GC44Gj44Gf6KGM44KS6YG45oqe77yaZmlsdGVyKCkKCi0gICDpoIbnlarjgavjgIHlpInlvaLjgIHoppbopprljJbjgarjganjgpLjgZnjgovjgZ/jgoHjga7jg5HjgqTjg5fvvJpgfD5gIO+8iOOBvuOBn+OBr+OAgWAlPiVg77yJCgotICAg5oqY44KM57ea44Kw44Op44OV77yaZ2dwbG90KC4uLikgKyBnZW9tX3BvaW50KCkKCiMjIyDjg5XjgqHjgqTjg6vjg6rjg7Pjgq8KCi0gICBQb3NpdENsb3VkIOWFseacieODquODs+OCr++8mjxodHRwczovL3Bvc2l0LmNsb3VkL2NvbnRlbnQvNTUzOTc2Mz4KCiAgICAtICAgZGVtb2dyYXBoeTEuUm1kIFtb44Oq44Oz44KvXShodHRwczovL2dpdGh1Yi5jb20vZHMtc2wvaW50cm8yci9ibG9iL21haW4vZG9jcy9nZXMwMDEvZGVtb2dyYXBoeTEuUm1kKV0sIGRlbW9ncmFwaHkyLlJtZCBbW+ODquODs+OCr10oaHR0cHM6Ly9naXRodWIuY29tL2RzLXNsL2ludHJvMnIvYmxvYi9tYWluL2RvY3MvZ2VzMDAxL2RlbW9ncmFwaHkyLlJtZCldLCBkZW1vZ3JhcGh5LlJtZCBbW+ODquODs+OCr10oaHR0cHM6Ly9naXRodWIuY29tL2RzLXNsL2ludHJvMnIvYmxvYi9tYWluL2RvY3MvZ2VzMDAxL2RlbW9ncmFwaHkuUm1kKV0KCiMjIOODkeODg+OCseODvOOCuOOBqOOBneOBruOCpOODs+OCueODiOODvOODqwoKPiBSIOOBruODkeODg+OCseODvOOCuOOBr+OAgVIg44Gu5qmf6IO944KS5ouh5by144GZ44KL44KC44Gu44Gn44CB44Kz44O844OJ77yI44OX44Ot44Kw44Op44Og77yJ44KE44CB44OH44O844K/44Gq44Gp44GM5Y+O44KB44KJ44KM44Gm44GE44G+44GZ44CC44Kk44Oz44K544OI44O844Or77yIaW5zdGFsbDog44Kz44Oz44OU44Ol44O844K/44Gr5YWl44KM44Gm5L2/44GI44KL44KI44GG44Gr44GZ44KL44GT44Go77yJ44Go44CB44Ot44O844OJ77yIbG9hZDog44GE44Gk44Gn44KC5L2/44GI44KL44KI44GG44Gr44GZ44KL44GT44Go77yJ44GM5b+F6KaB44Gn44GZ44CCCgojIyMg44Kk44Oz44K544OI44O844OrCgotICAgUlN0dWRpbyDvvIjjgb7jgZ/jga/jgIFQb3NpdCBDbG91ZO+8ieOBruOAgeS4iuOBruODoeODi+ODpeODvOODu+ODkOODvOOBruOAgVRvb2xzIOOBriBQdWxsIGRvd24g44GL44KJ44CBSW5zdGFsbCBQYWNrYWdlcyDjgpLpgbjjgbPjgIFQYWNrYWdlcyDjgavjg5Hjg4PjgrHjg7zjgrjlkI3jgpLlhaXjgozjgabjgIHjgqTjg7Pjgrnjg4jjg7zjg6vjgILpgJTkuK3jgb7jgafjgIHjg5Hjg4PjgrHjg7zjgrjlkI3jgpLlhaXjgozjgovjgajkuIvjgavlgJnoo5zjgYzjgafjgovjga7jgafjgIF0YWIg44Kt44O844KS5oq844GZ44Go44CB6Ieq5YuV5YWl5Yqb44Gr44Gq44KK44CB44K544Oa44Or44Of44K544GM6Ziy44GS44G+44GZ44CC77yI5Y+z5LiL44Gu56qT5p6g77yIUGFuZe+8ieOBruOAgVBhY2thZ2VzIOOCv+ODluOBruOAgeW3puS4iuOBruOAgEluc3RhbGwg44KS5oq844GX44Gm44KC44CB5ZCM44GY44KC44Gu44GM5Ye644G+44GZ44CC77yJCgogICAgLSAgIGBpbnN0YWxsLnBhY2thZ2VzKCLjg5Hjg4PjgrHjg7zjgrjlkI0iKWAg44Gn44KC44CB44Kk44Oz44K544OI44O844Or44Gn44GN44G+44GZ44CCCgojIyDjg5Hjg4PjgrHjg7zjgrjjga7jg63jg7zjg4kKCi0gICDjg5Hjg4PjgrHjg7zjgrjjgavlj47jgoHjgonjgozjgabjgYTjgovjgIHjgrPjg7zjg4nvvIjjg5fjg63jgrDjg6njg6DjgIHlkb3ku6TvvInjgoTjgIHjg4fjg7zjgr/jgpLjgZnjgZDjgavkvb/jgYjjgovjgojjgYbjgavjgZfjgb7jgZnjgIJgbGlicmFyeSjjg5Hjg4PjgrHjg7zjgrjlkI0pYCDjgajjgZfjgb7jgZnjgIIKCuavjuWbniB0aWR5dmVyc2Ug44GoIFdESSDjgpLkvb/jgYTjgb7jgZnjgYvjgonjgIFSIE5vdGVib29rIOOBruacgOWIneOBq+OBr+OAgeasoeOBruOCs+ODvOODieODgeODo+ODs+OCr+OCkuS9nOaIkOOBl+OAgeWun+ihjO+8iFJ1bu+8ieOBl+OBvuOBmeOAggoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KFdESSkKbGlicmFyeShzaG93dGV4dCkKYGBgCgojIyDml6XmnKzoqp7ooajnpLrjga7jgZ/jgoHjgasKCuWbs+OBruOCv+OCpOODiOODq+OBquOBqeOBjOOAgeaXpeacrOiqnuOBp+aWh+Wtl+WMluOBkeOBl+OBquOBhOOCiOOBhuOBq+OBiuOBvuOBmOOBquOBhOOBp+OBmeOAggoKUiBOb3RlYm9vayDjga4gUHJldmlldyDjgaflm7Pjga7jgr/jgqTjg4jjg6vjgYzlsI/jgZXjgYTloLTlkIjjgavjga/jgIHvvJLooYznm67vvIhgc2hvd3RleHRfYXV0bygpYO+8ieOCkiBcIyDjgafjgIHjgrPjg6Hjg7Pjg4jjgqLjgqbjg4jjgIIKCmBgYHtyfQpzaG93dGV4dF9hdXRvKEZBTFNFKSAKc2hvd3RleHRfYXV0bygpICMgZm9yIHNsaWRlcyBldGMgcmVtb3ZlICMgCmBgYAoKIyMg44OH44O844K/44Gu6Kqt44G/6L6844G/77yIMe+8iQoK44OH44O844K/44Gu6Kqt44G/6L6844G/5pa55rOV44Gv44OH44O844K/44Gu56iu6aGe44Gq44Gp44Gr44KI44KK5L2V56iu6aGe44KC44GC44KK44G+44GZ44GM44CB44G+44Ga44CBV0RJIOODkeODg+OCseODvOOCuOOBruOAgVdESSDjgajjgYTjgYblkI3liY3jga7jg4fjg7zjgr/lj5blvpfjga7jgrPjg7zjg4nvvIjlkb3ku6TjgIHjg5fjg63jgrDjg6njg6DvvInjgpLkvb/jgaPjgabjgIHnt4/kurrlj6Pjga7jg4fjg7zjgr/jgpLoqq3jgb/ovrzjgb/jgb7jgZnjgILjgZ3jgozjgavjga/jgIFXREkg44Kz44O844OJ44Go5ZG844Gw44KM44KL44CBU1AuUE9QLlRPVEwg44KS5L2/44GE44G+44GZ44CCCgrnt4/kurrlj6PjgIBQb3B1bGF0aW9uLCB0b3RhbO+8mlNQLlBPUC5UT1RMCgrlj5blvpfjgZfjgZ/jgIHjg4fjg7zjgr/jgpLjgZ3jga7jgYLjgajjgafjgIHlkbzjgbPlh7rjgZfjgabkvb/jgYbjgZ/jgoHjgavjgIFgPC1gIOOCkuS9v+OBo+OBpuOAgeWQjeWJjeOCkuOBpOOBke+8iGFzc2lnbu+8ieOBvuOBmeOAguODh+ODvOOCv+OBruW9ouW8j+OBjOOAgWRhdGEgZnJhbWUg44Go5ZG844Gw44KM44KL44KC44Gu44Gq44Gu44Gn44CB44KP44Gf44GX44Gv44CB44GE44Gk44KC44CB5pyA5Yid44GrIGRmIOOBqOOBl+OBpuOAgeewoeWNmOOBquWQjeWJjeOCkuOBpOOBkeOBvuOBmeOAguWQjeWJjeOBr+OBquOCk+OBp+OCguiJr+OBhOOBruOBp+OBmeOBjOOAgeimmuOBiOOChOOBmeOBhOOCiOOBhuOBq+OAgeOBvuOBn+OAgeaXpeacrOiqnuOCguWPl+OBkeS7mOOBkeOBvuOBmeOBjOOAgeaJseOBhOOBjOikh+mbkeOBq+OBquOCi+OBruOBp+OAgeiLseaVsOOBruOBv+OAgeOCueODmuODvOOCueOChOOAgeODj+OCpOODleODs+OBr+S9v+OBiOOBquOBhOOBruOBp+OAgeWMuuWIh+OCiuOBq+OBr+OAgVxfIOOCkuS9v+OBo+OBpuOBhOOBvuOBmeOAggoK6Kqt44G/6L6844G/44Gr44Gv44CB5bCR44GX5pmC6ZaT44GM44GL44GL44KK44G+44GZ44CCCgpgYGB7ciBldmFsID0gRkFMU0V9CmRmX3BvcCA8LSBXREkoaW5kaWNhdG9yID0gYyhwb3AgPSAiU1AuUE9QLlRPVEwiKSkKYGBgCgpgYGB7ciBldmFsPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQp3cml0ZV9jc3YoZGZfcG9wLCAiZGF0YS9wb3AuY3N2IikKYGBgCgpgYGB7ciBlY2hvPUZBTFNFfQpkZl9wb3AgPC0gcmVhZF9jc3YoImRhdGEvcG9wLmNzdiIpCmBgYAoKIyMg44OH44O844K/44KS6KaL44Gm44G/44G+44GX44KH44GGCgpgYGB7cn0KZGZfcG9wCmBgYAoKIyMg44OH44O844K/44Gu6Kqt44G/6L6844G/77yIMu+8iQoK57eP5Lq65Y+j44CAUG9wdWxhdGlvbiwgdG90YWzvvJpTUC5QT1AuVE9UTAoK5Ye655Sf546H77yI5Y2D5Lq677yJQmlydGggcmF0ZSwgY3J1ZGUgKHBlciAxLDAwMCBwZW9wbGUp77yaU1AuRFlOLkNCUlQuSU4KCuatu+S6oeeOh++8iOWNg+S6uu+8iURlYXRoIHJhdGUsIGNydWRlIChwZXIgMSwwMDAgcGVvcGxlKe+8mlNQLkRZTi5DRFJULklOCgroi6XlubTlirTlg43kurrlj6PnjofjgIBBZ2UgZGVwZW5kZW5jeSByYXRpbywgeW91bmcgKCUgb2Ygd29ya2luZy1hZ2UgcG9wdWxhdGlvbinvvJpTUC5QT1AuRFBORC5ZRwoK6auY6b2i6ICF5Yq05YON5Lq65Y+j546H44CAQWdlIGRlcGVuZGVuY3kgcmF0aW8sIG9sZCAoJSBvZiB3b3JraW5nLWFnZSBwb3B1bGF0aW9uKe+8mlNQLlBPUC5EUE5ELk9MCgpgYGB7ciBldmFsID0gRkFMU0V9CmRmX3BvcF9yZWxhdGVkIDwtIFdESShpbmRpY2F0b3IgPSBjKHBvcCA9ICJTUC5QT1AuVE9UTCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXJ0aF9yYXRlID0gIlNQLkRZTi5DQlJULklOIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYXRoX3JhdGUgPSAiU1AuRFlOLkNEUlQuSU4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeW91bmcgPSAiU1AuUE9QLkRQTkQuWUciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkID0gIlNQLlBPUC5EUE5ELk9MIikpCmBgYAoKIyMg5L+d5a2Y44Go6Kqt44G/6L6844G/CgpgYGB7ciBldmFsID0gRkFMU0V9CndyaXRlX2NzdihkZl9wb3BfcmVsYXRlZCwgImRhdGEvcG9wX3JlbGF0ZWQuY3N2IikKYGBgCgpgYGB7cn0KZGZfcG9wX3JlbGF0ZWQgPC0gcmVhZF9jc3YoImRhdGEvcG9wX3JlbGF0ZWQuY3N2IikKYGBgCgojIyDjg4fjg7zjgr/jga7norroqo0KCmBgYHtyfQpoZWFkKGRmX3BvcF9yZWxhdGVkKQpgYGAKCiMjIOODh+ODvOOCv+OBruani+mAoO+8iFN0cnVjdHVyZe+8iQoKYGBge3IgZXZhbCA9IEZBTFNFfQpzdHIoZGZfcG9wX3JlbGF0ZWRbXSkKYGBgCgpgYGB7ciBlY2hvPUZBTFNFfQpzdHIoZGZfcG9wX3JlbGF0ZWRbXSkKYGBgCgpge2dsaW1wc2UoZGZfcG9wX2V4dHJhKX1gCgojIyBgUkVHSU9OYAoK5Zyw5Z+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+SMi4gR2VybWFueSDjgagg44OJ44Kk44OE44Gu6YOo5YiG44KS5LuW44Gu5Zu95ZCN44Gr5aSJ44GI44Gm44G/44Gm44GP44Gg44GV44GE44CCKioKCmBgYHtyIGV2YWwgPSBGQUxTRX0KQ09VTlRSWSA8LSAiR2VybWFueSIKZGZfcG9wIHw+IGZpbHRlcihjb3VudHJ5ID09IENPVU5UUlkpIHw+IAogIGdncGxvdChhZXMoeWVhciwgcG9wKSkgKyBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9ICLjg4njgqTjg4Tjga7nt4/kurrlj6MiKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKKirnt7Tnv5IzLiBDT1VOVFJJRVMg44KS57eo6ZuG44GX44Gm44CB44Kk44Ku44Oq44K544Go44OJ44Kk44OE44Go44OV44Op44Oz44K544Go5pel5pys44KS5LuW44Gu5Zu944Gr5aSJ44GI44Gm44GP44Gg44GV44GE44CCKioKCmBgYHtyIGV2YWwgPSBGQUxTRX0KQ09VTlRSSUVTIDwtIGMoIlVuaXRlZCBLaW5nZG9tIiwgIkdlcm1hbnkiLCAiRnJhbmNlIiwgIkphcGFuIikKZGZfcG9wIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgQ09VTlRSSUVTKSB8PiAKICBnZ3Bsb3QoYWVzKHllYXIsIHBvcCwgY29sID0gIGNvdW50cnkpKSArIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gIuOCpOOCruODquOCueOBqOODieOCpOODhOOBqOODleODqeODs+OCueOBqOaXpeacrOOBrue3j+S6uuWPoyIpCmBgYAoKIyMgMjAyMuW5tOOBrue3j+S6uuWPo+OBruWkmuOBhOmghgoKYGBge3J9CmRmX3BvcCB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+IGZpbHRlcih5ZWFyID09IDIwMjIpIHw+IAogIGFycmFuZ2UoZGVzYyhwb3ApKQpgYGAKCiMjIDIwMjLlubTjga7nt4/kurrlj6Pjga4gVE9QIDExCgpgYGB7cn0KcG9wX3RvcDExIDwtIGRmX3BvcCB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+IGZpbHRlcih5ZWFyID09IDIwMjIpIHw+IAogIGFycmFuZ2UoZGVzYyhwb3ApKSB8PiBzbGljZV9oZWFkKG49MTEpIHw+IHB1bGwoaXNvMmMpCnBvcF90b3AxMQpkcHV0KHBvcF90b3AxMSkKYGBgCgoqKue3tOe/kjQuIDE5NjDlubTjga7nt4/kurrlj6PjgYzlpJrjgYTpoIbjgavkupTnlarnm67jgb7jgafjg6rjgrnjg4jjgZfjgabjgY/jgaDjgZXjgYTjgIIqKgoKYGBge3IgZXZhbCA9IEZBTFNFfQpwb3BfdG9wNSA8LSBkZl9wb3AgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIyKSB8PiAKICBhcnJhbmdlKGRlc2MocG9wKSkgfD4gc2xpY2VfaGVhZChuPTUpIHw+IHB1bGwoaXNvMmMpCnBvcF90b3A1CmRwdXQocG9wX3RvcDUpCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpgYGB7cn0KZGZfcG9wIHw+IGZpbHRlcihpc28yYyAlaW4lIHBvcF90b3AxMSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHBvcCwgY29sb3IgPSBpc28yYykpICsgZ2VvbV9saW5lKCkgKyBsYWJzKHRpdGxlID0gIlRPUDEx44Gu57eP5Lq65Y+jIikKYGBgCgojIyDkuK3lm73jgajjgqTjg7Pjg4nku6XlpJbjga5UT1AxMSDjga7kurrlj6Pmjqjnp7sKCmBgYHtyfQpkZl9wb3AgfD4gZmlsdGVyKGlzbzJjICVpbiUgcG9wX3RvcDExKSB8PiAKICBmaWx0ZXIoIShpc28yYyAlaW4lIGMoIkNOIiwgIklOIikpKSB8PiAKICBnZ3Bsb3QoYWVzKHllYXIsIHBvcCwgY29sb3IgPSBjb3VudHJ5KSkgKyBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9ICLkuK3lm73jgajjgqTjg7Pjg4nku6XlpJbjga5UT1AxMeOBrue3j+S6uuWPoyIpCmBgYAoKIyMg5Zyw5Z+f44GU44Go44Gu5Lq65Y+j5o6o56e7CgpgYGB7cn0KZGZfcG9wIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgYygiU291dGggQXNpYSIsICJFdXJvcGUgJiBDZW50cmFsIEFzaWEiLCAiTWlkZGxlIEVhc3QgJiBOb3J0aCBBZnJpY2EiLCAKIkVhc3QgQXNpYSAmIFBhY2lmaWMiLCAiU3ViLVNhaGFyYW4gQWZyaWNhIiwgIkxhdGluIEFtZXJpY2EgJiBDYXJpYmJlYW4iLCAiTm9ydGggQW1lcmljYSIpKSB8PgogIGdncGxvdChhZXMoeWVhciwgcG9wLCBjb2xvciA9IGNvdW50cnkpKSArIGdlb21fbGluZSgpICsgbGFicyh0aXRsZSA9ICLlnLDln5/jgZTjgajjga7nt4/kurrlj6MiKQpgYGAKCiMjIOWkieW9ogoKd2lkZSDjg4fjg7zjgr/jgpIgbG9uZyDjg4fjg7zjgr/jgavlpInlvaLjgZfjgb7jgZnjgILjgYTjgZrjgozoqqzmmI7jgZfjgb7jgZnjgIIKCmBgYHtyfQpkZl9wb3BfbG9uZyA8LSBkZl9wb3BfcmVsYXRlZCB8PiAKICBwaXZvdF9sb25nZXIocG9wOm9sZCwgbmFtZXNfdG8gPSAibmFtZSIsIHZhbHVlc190byA9ICJ2YWx1ZSIpCmBgYAoKIyMg5Ye655Sf546H44Go5q275Lqh546HCgrlh7rnlJ/njofvvIjljYPkurrvvIlCaXJ0aCByYXRlLCBjcnVkZSAocGVyIDEsMDAwIHBlb3BsZSnvvJpTUC5EWU4uQ0JSVC5JTiBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TUC5EWU4uQ0JSVC5JTildCgrmrbvkuqHnjofvvIjljYPkurrvvIlEZWF0aCByYXRlLCBjcnVkZSAocGVyIDEsMDAwIHBlb3BsZSnvvJpTUC5EWU4uQ0RSVC5JTiBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TUC5EWU4uQ0RSVC5JTildCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmBgYHtyfQpkZl9wb3BfbG9uZyB8PiBmaWx0ZXIobmFtZSAlaW4lIGMoImJpcnRoX3JhdGUiLCAiZGVhdGhfcmF0ZSIpKSB8PgogIGZpbHRlcihjb3VudHJ5ID09ICJXb3JsZCIpIHw+IGRyb3BfbmEodmFsdWUpIHw+ICMgTkEgdmFsdWUg44KS5YmK6ZmkCiAgZ2dwbG90KGFlcyh5ZWFyLCB2YWx1ZSwgY29sID0gbmFtZSkpICsgZ2VvbV9saW5lKCkgKyAKICBsYWJzKHRpdGxlID0gIuWHuueUn+eOh+OAgeatu+S6oeeOh++8iDEwMDDkurrlvZPjgZ/jgorvvIkiKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKKirnt7Tnv5I1LiDlm73jgpLpgbjmip7jgZfjgabjgIHlh7rnlJ/njofjgIHmrbvkuqHnjofjga7jgrDjg6njg5XjgpLmj4/jgYTjgabjgY/jgaDjgZXjgYTjgIIqKgoKYGBge3IgZXZhbCA9IEZBTFNFfQpkZl9wb3BfbG9uZyB8PiBmaWx0ZXIobmFtZSAlaW4lIGMoImJpcnRoX3JhdGUiLCAiZGVhdGhfcmF0ZSIpKSB8PgogIGZpbHRlcihjb3VudHJ5ID09ICJXb3JsZCIpIHw+IGRyb3BfbmEodmFsdWUpIHw+ICMgTkEgdmFsdWUg44KS5YmK6ZmkCiAgZ2dwbG90KGFlcyh5ZWFyLCB2YWx1ZSwgY29sID0gbmFtZSkpICsgZ2VvbV9saW5lKCkgKyAKICBsYWJzKHRpdGxlID0gIuWHuueUn+eOh+OAgeatu+S6oeeOh++8iDEwMDDkurrlvZPjgZ/jgorvvIkiKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3J9CmRmX3BvcF9sb25nIHw+IGZpbHRlcihuYW1lICVpbiUgYygiYmlydGhfcmF0ZSIsICJkZWF0aF9yYXRlIikpIHw+CiAgZmlsdGVyKGlzbzJjICVpbiUgYygiQkQiLCAiQlIiLCAiQ04iLCAiSUQiLCAiTkciLCAiSlAiKSkgfD4gZHJvcF9uYSh2YWx1ZSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBjb2wgPSBjb3VudHJ5LCBsaW5ldHlwZSA9IG5hbWUpKSArIAogIGdlb21fbGluZSgpICsgbGFicyh0aXRsZSA9ICLlm73jgIXjga7jgIHlh7rnlJ/njofjgIHmrbvkuqHnjofvvIgxMDAw5Lq65b2T44Gf44KK77yJIikKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmBgYHtyfQpkZl9wb3BfbG9uZyB8PiBmaWx0ZXIobmFtZSAlaW4lIGMoImJpcnRoX3JhdGUiLCAiZGVhdGhfcmF0ZSIpKSB8PgogIGZpbHRlcihpc28yYyAlaW4lIGMoIlo0IiwgIlo3IiwgIlpKIiwgIlpRIiwgIlhVIiwgIjhTIiwgIlpHIikpIHw+IGRyb3BfbmEoKSB8PgogIGdncGxvdChhZXMoeWVhciwgdmFsdWUsIGNvbCA9IGNvdW50cnksIGxpbmV0eXBlID0gbmFtZSkpICsgCiAgZ2VvbV9saW5lKCkgKyBsYWJzKHRpdGxlID0gIuWcsOWfn+OBlOOBqOOBruWHuueUn+eOh+ODu+atu+S6oeeOh++8iDEwMDDkurrjgYLjgZ/jgorvvIkiKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKKirnt7Tnv5I2LiDjgYTjgY/jgaTjgYvjga7lm73jgb7jgZ/jga/lnLDln5/jga7jgIHlh7rnlJ/njofjgIHmrbvkuqHnjofjga7jgrDjg6njg5XjgpLmj4/jgYTjgabjgY/jgaDjgZXjgYTjgIIqKgoKYGBge3IgZXZhbCA9IEZBTFNFfQpkZl9wb3BfbG9uZyB8PiBmaWx0ZXIobmFtZSAlaW4lIGMoImJpcnRoX3JhdGUiLCAiZGVhdGhfcmF0ZSIpKSB8PgogIGZpbHRlcihpc28yYyAlaW4lIGMoIkJEIiwgIkJSIiwgIkNOIiwgIklEIiwgIk5HIiwgIkpQIikpIHw+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+IAogIGdncGxvdChhZXMoeWVhciwgdmFsdWUsIGNvbCA9IG5hbWUpKSArIGdlb21fbGluZSgpICsgCiAgbGFicyh0aXRsZSA9ICLkuJbnlYzjga7pq5jpvaLogIXjg7voi6XlubTogIXmibbppIrnjociKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKKirnt7Tnv5I3LiDlm73jgpLpgbjmip7jgZfjgabjgIHpq5jpvaLogIXjg7voi6XlubTogIXjga7mibbppIrnjofjga7jgrDjg6njg5XjgpLmj4/jgYTjgabjgY/jgaDjgZXjgYTjgIIqKgoKYGBge3IgZXZhbCA9IEZBTFNFfQpkZl9wb3BfbG9uZyB8PiBmaWx0ZXIobmFtZSAlaW4lIGMoInlvdW5nIiwgIm9sZCIpKSB8PgogIGZpbHRlcihjb3VudHJ5ID09ICJXb3JsZCIpIHw+IAogIGdncGxvdChhZXMoeWVhciwgdmFsdWUsIGNvbCA9IG5hbWUpKSArIGdlb21fbGluZSgpICsgCiAgbGFicyh0aXRsZSA9ICLkuJbnlYzjga7pq5jpvaLogIXjg7voi6XlubTogIXmibbppIrnjociKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3J9CmRmX3BvcF9sb25nIHw+IGZpbHRlcihuYW1lICVpbiUgYygieW91bmciLCAib2xkIikpIHw+CiAgZmlsdGVyKGlzbzJjICVpbiUgYygiQkQiLCAiQlIiLCAiQ04iLCAiSUQiLCAiTkciLCAiSlAiKSkgfD4gCiAgZ2dwbG90KGFlcyh5ZWFyLCB2YWx1ZSwgY29sID0gY291bnRyeSwgbGluZXR5cGUgPSBuYW1lKSkgKyAKICBnZW9tX2xpbmUoKSArIGxhYnModGl0bGUgPSAi5Zu944CF44Gu6auY6b2i6ICF44O76Iul5bm06ICF5om26aSK546HIikKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmBgYHtyfQpkZl9wb3BfbG9uZyB8PiBmaWx0ZXIobmFtZSAlaW4lIGMoInlvdW5nIiwgIm9sZCIpKSB8PgogIGZpbHRlcihpc28yYyAlaW4lIGMoIlVTIiwgIkdCIiwgIkNOIiwgIkRFIiwgIkZSIiwgIkpQIiwgIklOIikpIHw+IAogIGdncGxvdChhZXMoeWVhciwgdmFsdWUsIGNvbCA9IGNvdW50cnksIGxpbmV0eXBlID0gbmFtZSkpICsgCiAgZ2VvbV9saW5lKCnjgIArIGxhYnModGl0bGUgPSAi5Zu944CF44Gu6auY6b2i6ICF44O76Iul5bm06ICF5om26aSK546HIikKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmBgYHtyfQpkZl9wb3BfbG9uZyB8PiBmaWx0ZXIobmFtZSAlaW4lIGMoInlvdW5nIiwgIm9sZCIpKSB8PgogIGZpbHRlcihjb3VudHJ5ICVpbiUgYygiU291dGggQXNpYSIsICJFdXJvcGUgJiBDZW50cmFsIEFzaWEiLCAiTWlkZGxlIEVhc3QgJiBOb3J0aCBBZnJpY2EiLCAKIkVhc3QgQXNpYSAmIFBhY2lmaWMiLCAiU3ViLVNhaGFyYW4gQWZyaWNhIiwgIkxhdGluIEFtZXJpY2EgJiBDYXJpYmJlYW4iLCAiTm9ydGggQW1lcmljYSIpKSB8PiAKICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBjb2wgPSBjb3VudHJ5LCBsaW5ldHlwZSA9IG5hbWUpKSArIAogIGdlb21fbGluZSgpICsgbGFicyh0aXRsZSA9ICLlnLDln5/liKXjga7lirTlg43kurrlj6Pjgavlr77jgZnjgovpq5jpvaLjg7voi6XlubTmibbppIrnjofvvIjvvIXvvIkiLCAKICAgICAgIHN1YnRpdGxlID0gIuWun+e3mu+8mumrmOm9ouiAheOAgeeCuee3mu+8muiLpeW5tOiAhSIsIHggPSAiIiwgY29sID0gIiIsIGxpbmV0eXBlID0gIiIpCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoqKue3tOe/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/njofjg7vmrbvkuqHnjofjg7vlirTlg43kurrlj6Pjgavlr77jgZnjgovpq5jpvaLjg7voi6XlubTmibbppIrnjofvvIjvvIXvvIkiKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3J9CmRmX3BvcF9sb25nIHw+IGZpbHRlcihuYW1lICVpbiUgYygiYmlydGhfcmF0ZSIsICJkZWF0aF9yYXRlIiwgInlvdW5nIiwgIm9sZCIpKSB8PgogIGZpbHRlcihjb3VudHJ5ID09ICJHZXJtYW55IikgfD4gZHJvcF9uYSh2YWx1ZSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBjb2wgPSBuYW1lKSkgKyBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9ICLjg4njgqTjg4Tjga7lh7rnlJ/njofjg7vmrbvkuqHnjofjg7vlirTlg43kurrlj6Pjgavlr77jgZnjgovpq5jpvaLjg7voi6XlubTmibbppIrnjofvvIjvvIXvvIkiKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3J9CmRmX3BvcF9sb25nIHw+IGZpbHRlcihuYW1lICVpbiUgYygiYmlydGhfcmF0ZSIsICJkZWF0aF9yYXRlIiwgInlvdW5nIiwgIm9sZCIpKSB8PgogIGZpbHRlcihjb3VudHJ5ICAlaW4lICBjKCJHZXJtYW55IiwgIkphcGFuIikpIHw+IGRyb3BfbmEodmFsdWUpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCB2YWx1ZSwgY29sID0gY291bnRyeSwgbGluZXR5cGUgPSBuYW1lKSkgKyBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9ICLjg4njgqTjg4Tjgajml6XmnKzjga7lh7rnlJ/njofjg7vmrbvkuqHnjodcbuWKtOWDjeS6uuWPo+OBq+WvvuOBmeOCi+mrmOm9ouODu+iLpeW5tOaJtumkiueOh++8iO+8he+8iSIpCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpgYGB7cn0KZGZfcG9wX2xvbmcgfD4gZmlsdGVyKG5hbWUgPT0gInBvcCIpIHw+CiAgZmlsdGVyKGNvdW50cnkgICVpbiUgIGMoIkdlcm1hbnkiLCAiSmFwYW4iKSkgfD4gZHJvcF9uYSh2YWx1ZSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBjb2wgPSBjb3VudHJ5KSkgKyBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9ICLjg4njgqTjg4Tjgajml6XmnKzjga7kurrlj6MiKQpgYGAKCuWVj+OBhO+8muOBqeOCk+OBquOBk+OBqOOBjOOCj+OBi+OCiuOBvuOBmeOBi+OAggoKIyMg5b6p57+SCgotICAg44OR44OD44Kx44O844K477yIUGFja2FnZe+8ieOBruWIqeeUqO+8mgoKICAgIC0gICDjgqTjg7Pjgrnjg4jjg7zjg6vvvIhpbnN0YWxsYXRpb27vvInvvJpUb29scyBcPiBJbnN0YWxsIFBhY2thZ2VzCgogICAgLSAgIOODreODvOODie+8iGxvYWTvvIlgbGlicmFyeSh0aWR5dmVyc2UpOyBsaWJyYXJ5KFdESSk7IGxpYnJhcnkoc2hvd3RleHQpYAoKLSAgIOODh+ODvOOCv+OBruWPluW+l++8mmBXREkoaW5kaWNhdG9yID0gYyhwb3AgPSAiU1AuUE9QLlRPVEwiKSlgCgotICAg54m55a6a44Gu6KGM44Gu5Y+W5b6X77yaYGZpbHRlcigpLCBkcm9wX25hKCksIGRpc3RpbmN0KClgCgotICAg5oqY44KM57ea44Kw44Op44OVCgogICAgLSAgIGBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gcG9wKSArIGdlb21fbGluZSgpYAoKICAgIC0gICBgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IHBvcCwgY29sID0gY291bnRyeSkgKyBnZW9tX2xpbmUoKWAKCiMjIOiqsumhjAoK5o+Q5Ye644Gv44GX44Gq44GP44Gm6Imv44GE44Gn44GZ44GM44CB44Gc44Gy5a6f6Zqb44Gr5omL44KS5YuV44GL44GX44Gm5a6f6KGM44GX44Gm44GP44Gg44GV44GE44CCCgoxLiAgV0RJIOOBruOCteOCpOODiOOBp+OAgeiIiOWRs+OBruOBguOCi+aMh+aomeOBruOAgeWQjeWJjeOBqOOAgVdESSDjgrPjg7zjg4njgpLpgbjjgpPjgafjgY/jgaDjgZXjgYTjgILjgafjgY3jgozjgbDjgIHpgbjmip7jgZfjgZ/nkIbnlLHjgoLoqJjpjLLjgZfjgabjgY/jgaDjgZXjgYTjgIJb57e057+SMV0KCjIuICBHZXJtYW55IOOBqCDjg4njgqTjg4Tjga7pg6jliIbjgpLku5bjga7lm73lkI3jgavlpInjgYjjgabjgb/jgabjgY/jgaDjgZXjgYTjgIJb57e057+SMl0KCjMuICDjgqTjgq7jg6rjgrnjgajjg4njgqTjg4Tjgajjg5Xjg6njg7Pjgrnjgajml6XmnKzjgpLku5bjga7lm73jgavlpInjgYjjgabjgY/jgaDjgZXjgYTjgIJb57e057+SM10KCjQuICAxOTYw5bm044Gu57eP5Lq65Y+j44GM5aSa44GE6aCG44Gr5LqU55Wq55uu44G+44Gn44Oq44K544OI44GX44Gm44GP44Gg44GV44GE44CCW+e3tOe/kjRdCgo1LiAg5Zu944KS6YG45oqe44GX44Gm44CB5Ye655Sf546H44CB5q275Lqh546H44Gu44Kw44Op44OV44KS5o+P44GE44Gm44GP44Gg44GV44GE44CCW+e3tOe/kjVdCgo2LiAg44GE44GP44Gk44GL44Gu5Zu944G+44Gf44Gv5Zyw5Z+f44Gu44CB5Ye655Sf546H44CB5q275Lqh546H44Gu44Kw44Op44OV44KS5o+P44GE44Gm44GP44Gg44GV44GE44CCW+e3tOe/kjZdCgo3LiAg5Zu944KS6YG45oqe44GX44Gm44CB6auY6b2i6ICF44O76Iul5bm06ICF44Gu5om26aSK546H44Gu44Kw44Op44OV44KS5o+P44GE44Gm44GP44Gg44GV44GE44CCW+e3tOe/kjddCgo4LiAg44GE44GP44Gk44GL44Gu5Zu944G+44Gf44Gv5Zyw5Z+f44Gu44CB6auY6b2i6ICF44O76Iul5bm06ICF44Gu5om26aSK546H44Gu44Kw44Op44OV44KS5o+P44GE44Gm44GP44Gg44GV44GE44CCW+e3tOe/kjhdCgojIyDlj4LogIPmlofnjK4KCjEuICDjgIzjgb/jgpPjgarjga7jg4fjg7zjgr/jgrXjgqTjgqjjg7PjgrkgLSBEYXRhIFNjaWVuY2UgZm9yIEFsbOOAjVtb44Gv44GY44KB44Gm44Gu44OH44O844K/44K144Kk44Ko44Oz44K5XShodHRwczovL2ljdS1oc3V6dWtpLmdpdGh1Yi5pby9kczRhai9maXJzdC1leGFtcGxlLmh0bWwjZmlyc3QtZXhhbXBsZSldCgogICAgLSAgIOWwjuWFpeOBqOOBl+OBpuOAgUdEUO+8iOWbveWGhee3j+eUn+eUo++8ieOBruODh+ODvOOCv+OCkuS9v+OBo+OBpuiqrOaYjuOBl+OBpuOBhOOBvuOBmeOAggoKMi4gIFBvc2l0IFByaW1lcnM6IFRoZSBCYXNpY3Mg5a++6Kmx5Z6L44Gu5ryU57+S44K144Kk44OI44Gu5pyA5YidIFtbTGlua10oaHR0cHM6Ly9wb3NpdC5jbG91ZC9sZWFybi9wcmltZXJzLzEpXQoKICAgIDEuICBbVmlzdWFsaXphdGlvbiBCYXNpY3NdKGh0dHBzOi8vcG9zaXQuY2xvdWQvbGVhcm4vcHJpbWVycy8xLjEpCgogICAgMi4gIFtQcm9ncmFtbWluZyBCYXNpY3NdKGh0dHBzOi8vcG9zaXQuY2xvdWQvbGVhcm4vcHJpbWVycy8xLjIpCgozLiAgUlN0dWRpbyBJREUgQ2hlYXQgU2hlZXQuIOaXqeimi+ihqOOBp+OBmeOAguWNsOWIt+OBl+OBpuS9v+OBhuOBn+OCgeOBq+OAgVBERiDjgoLmj5DkvpvjgZfjgabjgYTjgb7jgZnjgIJbW1NpdGUgTGlua10oaHR0cHM6Ly9yc3R1ZGlvLmdpdGh1Yi5pby9jaGVhdHNoZWV0cy9odG1sL3JzdHVkaW8taWRlLmh0bWwpXQo=