課題

以下の指標の中から、二つ以上(複数)を選択して、データの概要(description)を記録し、データを WDI で取得し、以下の分析をする。

  1. 各年毎のデータの数の棒グラフ
  2. 経年変化を表す折れ線グラフ
    1. 日本、またはデータがある国
    2. 選択したいくつかの国
  3. 複数の指標の値を一列に含む縦長の表(Long Table)を作成し  
    1. 日本、またはデータがある国の、複数の指標を色分けした経年変化のグラフ  
    2. 選択したいくつかの国についての経年変化のグラフを、国を色分けし、指標は線の種類を変えたグラフ
  4. データが十分ある最近の年の値のヒストグラム
  5. データが十分ある最近の年の値の10カ国の値の棒グラフ
    1. 値が大きい方から
    2. 値が小さい方から
  6. 二つのデータの散布図- NA は取り除くこと。(log10 スケールを用いる場合は値が正のもののみに限定)
    1. (地域を除き)国のみの散布図 (近似(回帰)直線を表示)
    2. 最近の年の(地域を除き)国のみの散布図 (近似(回帰)直線を表示)
    3. b に対応する相関係数
  7. カテゴリー変数(Categorical Variable: region, income, year など)と、数値変数(Numberical Variable)一組についての箱ヒゲ図(Boxplot)

それぞれについて考察(気づいたこと、疑問など)を記す

これは、課題1と課題2の合わせたものです。課題1も課題2も終わった人は、挑戦してください。

2023.2.17.23:59 までに Moodle の課題2追加提出ボックスに提出してくださればフィードバックを書きます。。

データ

  1. Refugee population by country or territory of asylum:SM.POP.REFG [Link]

  2. Refugee population by country or territory of origin:SM.POP.REFG.OR [Link]

  3. Net ODA received (% of GNI):DT.ODA.ODAT.GN.ZS [Link]

  4. Net official development assistance and official aid received (current US$):DT.ODA.ALLD.CD [Link]

  5. Net ODA received (% of central government expense):DT.ODA.ODAT.XP.ZS [Link]

  6. Military expenditure (current USD):MS.MIL.XPND.CD [Link]

  7. Military expenditure (% of general government expenditure):MS.MIL.XPND.ZS [Link]

  8. Arms imports (SIPRI trend indicator values):MS.MIL.MPRT.KD [Link]

  9. Arms exports (SIPRI trend indicator values):MS.MIL.XPRT.KD [Link]

難民人口

データ

データ情報

  1. 難民受け入れ人口:Refugee population by country or territory of asylum:SM.POP.REFG [Link]

  2. 難民となる人口:Refugee population by country or territory of origin:SM.POP.REFG.OR [Link]

  • 難民の庇護国とは、庇護請求が提出され、認められた国のことである。出身国とは、一般的に請求者の国籍または市民権のある国を指す。

  • Description: Refugees are people who are recognized as refugees under the 1951 Convention Relating to the Status of Refugees or its 1967 Protocol, the 1969 Organization of African Unity Convention Governing the Specific Aspects of Refugee Problems in Africa, people recognized as refugees in accordance with the UNHCR statute, people granted refugee-like humanitarian status, and people provided temporary protection. Asylum seekers–people who have applied for asylum or refugee status and who have not yet received a decision or who are registered as asylum seekers–are excluded. Palestinian refugees are people (and their descendants) whose residence was Palestine between June 1946 and May 1948 and who lost their homes and means of livelihood as a result of the 1948 Arab-Israeli conflict. Country of asylum is the country where an asylum claim was filed and granted. Country of origin generally refers to the nationality or country of citizenship of a claimant.

  • 概要: 難民とは、「難民の地位に関する1951年条約」またはその「1967年議定書」、「アフリカにおける難民問題の特定の側面を管理する1969年アフリカ統一機構条約」に基づき難民と認められた人、UNHCRの法令に基づき難民と認められた人、難民に準ずる人道的地位を与えられた人、一時的な保護を与えられた人を指す。庇護申請者–庇護または難民認定を申請し、まだ決定を受けていない人、または庇護申請者として登録されている人–は除外される。パレスチナ難民とは、1946年6月から1948年5月までの間に居住地がパレスチナであり、1948年のアラブ・イスラエル紛争の結果、住居と生計手段を失った人々(およびその子孫)である。庇護国とは、庇護請求が提出され、認められた国のことである。出身国とは、一般的に請求者の国籍または市民権のある国を指す。

データの取得

準備

これまでとも同じように二つのパッケージを読み込み(load)ます。

library(tidyverse)
library(WDI)

変数名を指定します。ここでは、refugee_asylum と、refugee_origin としました。なるべくわかりやすい名前にします。

この変数名は、今後使いますから、重要です。一応、例として、わたしが使った、変数名を書いてあります。他の変数名を使っても構いません。extra = TRUE とすると、地域名(region)や、収入レベル(income)などが追加されます。

df_unemploy <- WDI(indicator = c(female_unemploy = "SL.UEM.TOTL.FE.ZS", 
                                 male_unemploy = "SL.UEM.TOTL.MA.ZS"),
                   extra = TRUE)

data ディレクトリに書き込んでおきます。

write_csv(df_unemploy, "data/unemploy.csv")

data ディレクトリから読み出します。Run All や、Run All Chunks Above をする時は、上の二つをスキップする設定にしてあります。

df_unemploy <- read_csv("data/unemploy.csv")

データの確認

df_unemploy

データ名で、中身を表示できます。head(df_refugee) とすると、6行表示されます。

変数の情報を得ることができます。

str(df_unemploy)

変形

変数の選択(selecting)

df_unemp <- df_unemploy |> 
  select(country, iso2c, year, female_unemploy, male_unemploy, region, income)
df_unemp

データには country のところに、国だけでなく、地域も入っているので、地域のリストを、iso2cREGION に入れておきます。

REGION <- c("1A", "1W", "4E", "6F", "6N", "6X", "7E", "8S", "A4", "A5", 
"A9", "B1", "B2", "B3", "B4", "B6", "B7", "B8", "C4", "C5", "C6", 
"C7", "C8", "C9", "D2", "D3", "D4", "D5", "D6", "D7", "EU", "F1", 
"F6", "M1", "M2", "N6", "OE", "R6", "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", "ZB", "ZF", "ZG", "ZH", "ZI", 
"ZJ", "ZQ", "ZT")

地域名にはどのようなものがあるか見ておきます。

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

国名も、地域(region)と、所得レベル(income)と共に、表示しておきます。

df_unemp |> filter(!(iso2c %in% REGION)) |> distinct(country, iso2c, region, income)

分析する国のリスト

自分で分析したい国のリストを作ってください。ここでは、紛争に関係がありそうな国を CONFLICTS にします。無論、変更してくだっさって構いません

CONFLICTS <- c("Syrian Arab Republic", "Ukraine", "Afghanistan", "South Sudan", "Myanmar", "Congo, Dem. Rep.", "Turkiye", "West Bank and Gaza")

視覚化

1. 各年毎のデータの数の棒グラフ

まずは、NA の値を削除します。そのあとで、国の情報の数を数えたいので、!(iso2c %in% REGION) で、上でおいた、地域の iso2c を選択し、! は否定でしたから、地域ではないものを選択し、その数を棒グラフにしています。

df_unemp |> drop_na(female_unemploy, male_unemploy) |> filter(!(iso2c %in% REGION)) |>
  ggplot(aes(year)) + geom_bar()

気づいたこと・疑問

2. 経年変化を表す折れ線グラフ

a. 日本、またはデータがある国

df_unemp |> filter(country == "Japan") |> drop_na(female_unemploy) |>
  ggplot(aes(year, female_unemploy)) + geom_line() +
  labs(title = "日本の女性労働者失業率")
df_unemp |> filter(country == "Japan") |> drop_na(male_unemploy) |>
  ggplot(aes(year, male_unemploy)) + geom_line() +
  labs(title = "日本の男性労働者失業率")

気づいたこと・疑問

b. 選択したいくつかの国

df_unemp |> filter(iso2c %in% ASEAN) |> drop_na(female_unemploy) |>
  ggplot(aes(year, female_unemploy, col = country)) + geom_line() +
  labs(title = "ASEAN の女性労働者失業率")

CONFLICTS は、country ですから、下のようにします。

気づいたこと・疑問

df_unemp |> filter(country %in% asean) |> drop_na(male_unemploy) |>
  ggplot(aes(year, male_unemploy, col = country)) + geom_line() +
  labs(title = "ASEAN の男性労働者失業率")

気づいたこと・疑問

3. 縦長の表(Long Table)

cols = c(refugee_asylum, refugee_origin) と、一つの指標にまとめるものをリストすると、name に指標名が入り、value に、その値が入る。書式は、pivot_longer(cols = ..., names_to = ..., values_to = ...) で、初期設定では、names_to = "name", values_to = "value" となっているので、指定しないと、下のようになる。Help 参照。

df_unemp_long <- df_unemp |> pivot_longer(cols = c(female_unemploy, male_unemploy))
df_unemp_long

a. 日本の複数の指標を色分けした経年変化のグラフ

col = name と指定すると、色で区別して、一つのグラフに描ける

df_unemp_long |> filter(country == "Japan") |> drop_na(value) |>
  ggplot(aes(year, value, col = name)) + geom_line()  +
  labs(title = "日本の男女別失業率")

気づいたこと・疑問

df_unemp_long |> filter(country == "World") |> drop_na(value) |>
  ggplot(aes(year, value, col = name)) + geom_line()  +
  labs(title = "世界の男女別失業率")

気づいたこと・疑問

b. 選択したいくつかの国の複数の指標を色分けした経年変化のグラフ

df_unemp_long |> filter(iso2c %in% ASEAN) |> drop_na(value) |>
  ggplot(aes(year, value, col = country, linetype = name)) + geom_line()  +
  labs(title = "ASEAN の男女別失業率")

気づいたこと・疑問

4. ヒストグラム

それぞれのデータが十分ある最近の年の値のヒストグラム(度数分布)

分け方の数 bins や、幅 binwidth を適切に変更

一つ目の指標

必要に応じて、log10 スケール(scale_x_log10())を使う。

df_unemp |> filter(!(iso2c %in% REGION)) |> filter(year == 2022) |> drop_na(female_unemploy) |>
  ggplot(aes(female_unemploy, fill = region)) + geom_histogram(bins = 10, col = "black", linewidth = 0.2) + scale_x_log10()
df_unemp |> filter(!(iso2c %in% REGION)) |> filter(year == 2022) |> drop_na(female_unemploy) |>
  ggplot(aes(female_unemploy, fill = income)) + geom_histogram(bins = 10, col = "black", linewidth = 0.2) 

二つ目の指標

df_unemp |> filter(!(iso2c %in% REGION)) |> filter(year == 2022) |> drop_na(male_unemploy) |>
  ggplot(aes(male_unemploy, fill = region)) + geom_histogram(bins = 10, col = "black", linewidth = 0.2) + scale_x_log10()
df_unemp |> filter(!(iso2c %in% REGION)) |> filter(year == 2022) |> drop_na(male_unemploy) |>
  ggplot(aes(male_unemploy, fill = income)) + geom_histogram(bins = 10, col = "black", linewidth = 0.2) 

気づいたこと・疑問点

5. 棒グラフ

データが十分ある最近の年の値の10カ国の値の棒グラフ

a. 一つ目の指標:値が大きい方から

df_unemp |> filter(!(iso2c %in% REGION)) |> filter(year == 2022) |> drop_na(female_unemploy) |>
  arrange(desc(female_unemploy)) |> slice_head(n = 10) |>
  ggplot(aes(fct_rev(fct_inorder(country)), female_unemploy, fill = region)) + geom_col() + coord_flip() + labs(title = "女性失業率の高い順", x = "")

b. 一つ目の指標:値が小さい方から

df_unemp |> filter(!(iso2c %in% REGION)) |> filter(year == 2022) |> drop_na(female_unemploy) |>
  arrange(female_unemploy) |> slice_head(n = 10) |>
  ggplot(aes(fct_rev(fct_inorder(country)), female_unemploy, fill = region)) + geom_col() + coord_flip() + labs(title = "女性失業率が低い順")

a. 二つ目の指標:値が大きい方から

df_unemp |> filter(!(iso2c %in% REGION)) |> filter(year == 2022) |> drop_na(male_unemploy) |>
  arrange(desc(male_unemploy)) |> slice_head(n = 10) |>
  ggplot(aes(fct_rev(fct_inorder(country)), male_unemploy, fill = region)) + geom_col() + coord_flip() + labs(title = "男性失業率の高い順", x = "")

b. 二つ目の指標:値が小さい方から

df_unemp |> filter(!(iso2c %in% REGION)) |> filter(year == 2022) |> drop_na(male_unemploy) |>
  arrange(male_unemploy) |> slice_head(n = 10) |>
  ggplot(aes(fct_rev(fct_inorder(country)), male_unemploy, fill = region)) + geom_col() + coord_flip() + labs(title = "男性失業率が低い順")

6. 散布図

必要に応じて、LOG10 (scale_x_log10(), scale_y_log10()) スケールを使う。

a.(地域を除き)国のみの散布図

df_unemp |> filter(!(iso2c %in% REGION)) |> drop_na(female_unemploy, male_unemploy) |>
  ggplot(aes(female_unemploy, male_unemploy)) + geom_point()  +
  labs(title = "失業率:男女別相関")

気づいたこと・疑問

近似(回帰)直線の表示

df_unemp |> filter(!(iso2c %in% REGION)) |> drop_na(female_unemploy, male_unemploy) |>
  ggplot(aes(female_unemploy, male_unemploy)) + geom_point() + 
  geom_smooth(formula = 'y~x', method = "lm", se = FALSE) +
  labs(title = "失業率:男女別相関(回帰直線付)")

気づいたこと・疑問

b. 最近の年の(地域を除き)国のみの散布図

df_unemp |> filter(!(iso2c %in% REGION)) |> filter(year == 2022) |> 
  drop_na(female_unemploy, male_unemploy) |>
  ggplot(aes(female_unemploy, male_unemploy)) + geom_point() +
  labs(title = "2022年の失業率:男女別相関")

気づいたこと・疑問

近似(回帰)直線の表示

df_unemp |> filter(!(iso2c %in% REGION)) |> filter(year == 2022) |> 
  drop_na(female_unemploy, male_unemploy) |>
  ggplot(aes(female_unemploy, male_unemploy)) + geom_point() + 
  geom_smooth(formula = 'y~x', method = "lm", se = FALSE) +
  labs(title = "失業率:男女別相関(回帰直線付)")

気づいたこと・疑問

c. 相関係数

df_unemp |> filter(!(iso2c %in% REGION)) |> filter(year == 2022) |> 
  drop_na(female_unemploy, male_unemploy) |> select(female_unemploy, male_unemploy) |> cor()

気づいたこと・疑問

7. 箱ヒゲ図(Boxplot)

必要時応じて、ログスケール(scale_y_log10())

df_unemp_long |> filter(!(iso2c %in% REGION)) |> filter(year == 2022) |> 
  drop_na(value) |>
  ggplot(aes(name, value)) + geom_boxplot() +
  labs(title = "労働者失業率:男女別箱ひげ図")

気づいたこと・疑問

df_unemp_long |> filter(!(iso2c %in% REGION)) |> filter(year == 2022) |> 
  drop_na(value, region) |>
  ggplot(aes(region, value, fill = name)) + geom_boxplot() + coord_flip() +
  labs(title = "労働者失業率:男女・地域別箱ひげ図")

気づいたこと・疑問

df_unemp_long |> filter(!(iso2c %in% REGION)) |> filter(year == 2022) |> 
  drop_na(value, income) |> filter(income != "Not classified") |>
  ggplot(aes(income, value, fill = name)) + geom_boxplot() + coord_flip() +
  labs(title = "労働者失業率:男女・収入レベル別箱ひげ図")

気づいたこと・疑問

df_unemp_long |> filter(!(iso2c %in% REGION)) |> filter(year %in% c(1991, 2001, 2011, 2021)) |>
  drop_na(value) |> 
  ggplot(aes(factor(year), value, fill = name)) + geom_boxplot() +
  labs(title = "労働者失業率:男女別・10年ごとの箱ひげ図")

気づいたこと・疑問

df_unemp_long |> filter(iso2c %in% ASEAN) |> drop_na(value) |> 
  ggplot(aes(country, value, fill = name)) + geom_boxplot() + coord_flip() +
  labs(title = "ASEAN の労働者失業率:男女別箱ひげ図")

気づいたこと・疑問

LS0tCnRpdGxlOiAi5o6i57Si55qE44OH44O844K/5YiG5p6QIC0gRURBIgphdXRob3I6ICJJRCwgTGFzdCwgRmlyc3QiCmRhdGU6ICIyMDI05bm0MuaciDEz5pelIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAotLS0KCiMjIOiqsumhjAoK5Lul5LiL44Gu5oyH5qiZ44Gu5Lit44GL44KJ44CB5LqM44Gk5Lul5LiK77yI6KSH5pWw77yJ44KS6YG45oqe44GX44Gm44CB44OH44O844K/44Gu5qaC6KaB77yIZGVzY3JpcHRpb27vvInjgpLoqJjpjLLjgZfjgIHjg4fjg7zjgr/jgpIgV0RJIOOBp+WPluW+l+OBl+OAgeS7peS4i+OBruWIhuaekOOCkuOBmeOCi+OAggoKMS4gIOWQhOW5tOavjuOBruODh+ODvOOCv+OBruaVsOOBruajkuOCsOODqeODlQoyLiAg57WM5bm05aSJ5YyW44KS6KGo44GZ5oqY44KM57ea44Kw44Op44OVCiAgICBhLiAg5pel5pys44CB44G+44Gf44Gv44OH44O844K/44GM44GC44KL5Zu9CiAgICBiLiAg6YG45oqe44GX44Gf44GE44GP44Gk44GL44Gu5Zu9CjMuICDopIfmlbDjga7mjIfmqJnjga7lgKTjgpLkuIDliJfjgavlkKvjgoDnuKbplbfjga7ooajvvIhMb25nIFRhYmxl77yJ44KS5L2c5oiQ44GXIOOAgAogICAgYS4g5pel5pys44CB44G+44Gf44Gv44OH44O844K/44GM44GC44KL5Zu944Gu44CB6KSH5pWw44Gu5oyH5qiZ44KS6Imy5YiG44GR44GX44Gf57WM5bm05aSJ5YyW44Gu44Kw44Op44OVIOOAgAogICAgYi4g6YG45oqe44GX44Gf44GE44GP44Gk44GL44Gu5Zu944Gr44Gk44GE44Gm44Gu57WM5bm05aSJ5YyW44Gu44Kw44Op44OV44KS44CB5Zu944KS6Imy5YiG44GR44GX44CB5oyH5qiZ44Gv57ea44Gu56iu6aGe44KS5aSJ44GI44Gf44Kw44Op44OVCjQuICDjg4fjg7zjgr/jgYzljYHliIbjgYLjgovmnIDov5Hjga7lubTjga7lgKTjga7jg5Ljgrnjg4jjgrDjg6njg6AKNS4gIOODh+ODvOOCv+OBjOWNgeWIhuOBguOCi+acgOi/keOBruW5tOOBruWApOOBrjEw44Kr5Zu944Gu5YCk44Gu5qOS44Kw44Op44OVCiAgICBhLiAg5YCk44GM5aSn44GN44GE5pa544GL44KJCiAgICBiLiAg5YCk44GM5bCP44GV44GE5pa544GL44KJCjYuICDkuozjgaTjga7jg4fjg7zjgr/jga7mlaPluIPlm7MtIE5BIOOBr+WPluOCiumZpOOBj+OBk+OBqOOAgu+8iGxvZzEwIOOCueOCseODvOODq+OCkueUqOOBhOOCi+WgtOWQiOOBr+WApOOBjOato+OBruOCguOBruOBruOBv+OBq+mZkOWumu+8iQogICAgYS4gIO+8iOWcsOWfn+OCkumZpOOBje+8ieWbveOBruOBv+OBruaVo+W4g+WbsyDvvIjov5HkvLzvvIjlm57luLDvvInnm7Tnt5rjgpLooajnpLrvvIkKICAgIGIuICDmnIDov5Hjga7lubTjga7vvIjlnLDln5/jgpLpmaTjgY3vvInlm73jga7jgb/jga7mlaPluIPlm7PjgIDvvIjov5HkvLzvvIjlm57luLDvvInnm7Tnt5rjgpLooajnpLrvvIkKICAgIGMuICBiIOOBq+WvvuW/nOOBmeOCi+ebuOmWouS/guaVsAo3LiAg44Kr44OG44K044Oq44O85aSJ5pWw77yIQ2F0ZWdvcmljYWwgVmFyaWFibGU6IHJlZ2lvbiwgaW5jb21lLCB5ZWFyIOOBquOBqe+8ieOBqOOAgeaVsOWApOWkieaVsO+8iE51bWJlcmljYWwgVmFyaWFibGXvvInkuIDntYTjgavjgaTjgYTjgabjga7nrrHjg5LjgrLlm7PvvIhCb3hwbG9077yJCgrjgZ3jgozjgZ7jgozjgavjgaTjgYTjgabogIPlr5/vvIjmsJfjgaXjgYTjgZ/jgZPjgajjgIHnlpHllY/jgarjganvvInjgpLoqJjjgZkKCuOBk+OCjOOBr+OAgeiqsumhjO+8keOBqOiqsumhjO+8kuOBruWQiOOCj+OBm+OBn+OCguOBruOBp+OBmeOAguiqsumhjO+8keOCguiqsumhjO+8kuOCgue1guOCj+OBo+OBn+S6uuOBr+OAgeaMkeaIpuOBl+OBpuOBj+OBoOOBleOBhOOAggoKKioyMDIzLjIuMTcuMjM6NTkqKiDjgb7jgafjgasgTW9vZGxlIOOBruiqsumhjO+8kui/veWKoOaPkOWHuuODnOODg+OCr+OCueOBq+aPkOWHuuOBl+OBpuOBj+OBoOOBleOCjOOBsOODleOCo+ODvOODieODkOODg+OCr+OCkuabuOOBjeOBvuOBmeOAguOAggoKIyMjIOODh+ODvOOCvwoKMS4gICBSZWZ1Z2VlIHBvcHVsYXRpb24gYnkgY291bnRyeSBvciB0ZXJyaXRvcnkgb2YgYXN5bHVt77yaU00uUE9QLlJFRkcgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU00uUE9QLlJFRkcpXQoKMi4gICBSZWZ1Z2VlIHBvcHVsYXRpb24gYnkgY291bnRyeSBvciB0ZXJyaXRvcnkgb2Ygb3JpZ2lu77yaU00uUE9QLlJFRkcuT1IgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU00uUE9QLlJFRkcuT1IpXQoKMy4gICBOZXQgT0RBIHJlY2VpdmVkICglIG9mIEdOSSnvvJpEVC5PREEuT0RBVC5HTi5aUyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9EVC5PREEuT0RBVC5HTi5aUyldCgo0LiAgIE5ldCBvZmZpY2lhbCBkZXZlbG9wbWVudCBhc3Npc3RhbmNlIGFuZCBvZmZpY2lhbCBhaWQgcmVjZWl2ZWQgKGN1cnJlbnQgVVNcJCnvvJpEVC5PREEuQUxMRC5DRCBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9EVC5PREEuQUxMRC5DRCldCgo1LiAgIE5ldCBPREEgcmVjZWl2ZWQgKCUgb2YgY2VudHJhbCBnb3Zlcm5tZW50IGV4cGVuc2Up77yaRFQuT0RBLk9EQVQuWFAuWlMgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvRFQuT0RBLk9EQVQuWFAuWlMpXQoKNi4gICBNaWxpdGFyeSBleHBlbmRpdHVyZSAoY3VycmVudCBVU0Qp77yaTVMuTUlMLlhQTkQuQ0QgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvTVMuTUlMLlhQTkQuQ0QpXQoKNy4gICBNaWxpdGFyeSBleHBlbmRpdHVyZSAoJSBvZiBnZW5lcmFsIGdvdmVybm1lbnQgZXhwZW5kaXR1cmUp77yaTVMuTUlMLlhQTkQuWlMgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvTVMuTUlMLlhQTkQuWlMpXQoKOC4gICBBcm1zIGltcG9ydHMgKFNJUFJJIHRyZW5kIGluZGljYXRvciB2YWx1ZXMp77yaTVMuTUlMLk1QUlQuS0QgW1tMaW5rXShodHRwczovL2RhdGFiYW5rLndvcmxkYmFuay5vcmcvbWV0YWRhdGFnbG9zc2FyeS93b3JsZC1kZXZlbG9wbWVudC1pbmRpY2F0b3JzL3Nlcmllcy9NUy5NSUwuTVBSVC5LRCldCgo5LiAgIEFybXMgZXhwb3J0cyAoU0lQUkkgdHJlbmQgaW5kaWNhdG9yIHZhbHVlcynvvJpNUy5NSUwuWFBSVC5LRCBbW0xpbmtdKGh0dHBzOi8vZGF0YWJhbmsud29ybGRiYW5rLm9yZy9tZXRhZGF0YWdsb3NzYXJ5L3dvcmxkLWRldmVsb3BtZW50LWluZGljYXRvcnMvc2VyaWVzL01TLk1JTC5YUFJULktEKV0KCiMg6Zuj5rCR5Lq65Y+jCgojIyDjg4fjg7zjgr8KCiMjIyDjg4fjg7zjgr/mg4XloLEKCjEuICAg6Zuj5rCR5Y+X44GR5YWl44KM5Lq65Y+j77yaUmVmdWdlZSBwb3B1bGF0aW9uIGJ5IGNvdW50cnkgb3IgdGVycml0b3J5IG9mIGFzeWx1be+8mlNNLlBPUC5SRUZHIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NNLlBPUC5SRUZHKV0KCjIuICAg6Zuj5rCR44Go44Gq44KL5Lq65Y+j77yaUmVmdWdlZSBwb3B1bGF0aW9uIGJ5IGNvdW50cnkgb3IgdGVycml0b3J5IG9mIG9yaWdpbu+8mlNNLlBPUC5SRUZHLk9SIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NNLlBPUC5SRUZHLk9SKV0KCi0gICDpm6PmsJHjga7luoforbflm73jgajjga/jgIHluoforbfoq4vmsYLjgYzmj5Dlh7rjgZXjgozjgIHoqo3jgoHjgonjgozjgZ/lm73jga7jgZPjgajjgafjgYLjgovjgILlh7rouqvlm73jgajjga/jgIHkuIDoiKznmoTjgavoq4vmsYLogIXjga7lm73nsY3jgb7jgZ/jga/luILmsJHmqKnjga7jgYLjgovlm73jgpLmjIfjgZnjgIIKCi0gICAqKkRlc2NyaXB0aW9uOioqIFJlZnVnZWVzIGFyZSBwZW9wbGUgd2hvIGFyZSByZWNvZ25pemVkIGFzIHJlZnVnZWVzIHVuZGVyIHRoZSAxOTUxIENvbnZlbnRpb24gUmVsYXRpbmcgdG8gdGhlIFN0YXR1cyBvZiBSZWZ1Z2VlcyBvciBpdHMgMTk2NyBQcm90b2NvbCwgdGhlIDE5NjkgT3JnYW5pemF0aW9uIG9mIEFmcmljYW4gVW5pdHkgQ29udmVudGlvbiBHb3Zlcm5pbmcgdGhlIFNwZWNpZmljIEFzcGVjdHMgb2YgUmVmdWdlZSBQcm9ibGVtcyBpbiBBZnJpY2EsIHBlb3BsZSByZWNvZ25pemVkIGFzIHJlZnVnZWVzIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgVU5IQ1Igc3RhdHV0ZSwgcGVvcGxlIGdyYW50ZWQgcmVmdWdlZS1saWtlIGh1bWFuaXRhcmlhbiBzdGF0dXMsIGFuZCBwZW9wbGUgcHJvdmlkZWQgdGVtcG9yYXJ5IHByb3RlY3Rpb24uIEFzeWx1bSBzZWVrZXJzLS1wZW9wbGUgd2hvIGhhdmUgYXBwbGllZCBmb3IgYXN5bHVtIG9yIHJlZnVnZWUgc3RhdHVzIGFuZCB3aG8gaGF2ZSBub3QgeWV0IHJlY2VpdmVkIGEgZGVjaXNpb24gb3Igd2hvIGFyZSByZWdpc3RlcmVkIGFzIGFzeWx1bSBzZWVrZXJzLS1hcmUgZXhjbHVkZWQuIFBhbGVzdGluaWFuIHJlZnVnZWVzIGFyZSBwZW9wbGUgKGFuZCB0aGVpciBkZXNjZW5kYW50cykgd2hvc2UgcmVzaWRlbmNlIHdhcyBQYWxlc3RpbmUgYmV0d2VlbiBKdW5lIDE5NDYgYW5kIE1heSAxOTQ4IGFuZCB3aG8gbG9zdCB0aGVpciBob21lcyBhbmQgbWVhbnMgb2YgbGl2ZWxpaG9vZCBhcyBhIHJlc3VsdCBvZiB0aGUgMTk0OCBBcmFiLUlzcmFlbGkgY29uZmxpY3QuIENvdW50cnkgb2YgYXN5bHVtIGlzIHRoZSBjb3VudHJ5IHdoZXJlIGFuIGFzeWx1bSBjbGFpbSB3YXMgZmlsZWQgYW5kIGdyYW50ZWQuIENvdW50cnkgb2Ygb3JpZ2luIGdlbmVyYWxseSByZWZlcnMgdG8gdGhlIG5hdGlvbmFsaXR5IG9yIGNvdW50cnkgb2YgY2l0aXplbnNoaXAgb2YgYSBjbGFpbWFudC4KCi0gICAqKuamguimgToqKiDpm6PmsJHjgajjga/jgIHjgIzpm6PmsJHjga7lnLDkvY3jgavplqLjgZnjgosxOTUx5bm05p2h57SE44CN44G+44Gf44Gv44Gd44Gu44CMMTk2N+W5tOitsOWumuabuOOAjeOAgeOAjOOCouODleODquOCq+OBq+OBiuOBkeOCi+mbo+awkeWVj+mhjOOBrueJueWumuOBruWBtOmdouOCkueuoeeQhuOBmeOCizE5NjnlubTjgqLjg5Xjg6rjgqvntbHkuIDmqZ/mp4vmnaHntITjgI3jgavln7rjgaXjgY3pm6PmsJHjgajoqo3jgoHjgonjgozjgZ/kurrjgIFVTkhDUuOBruazleS7pOOBq+WfuuOBpeOBjembo+awkeOBqOiqjeOCgeOCieOCjOOBn+S6uuOAgembo+awkeOBq+a6luOBmuOCi+S6uumBk+eahOWcsOS9jeOCkuS4juOBiOOCieOCjOOBn+S6uuOAgeS4gOaZgueahOOBquS/neitt+OCkuS4juOBiOOCieOCjOOBn+S6uuOCkuaMh+OBmeOAguW6h+itt+eUs+iri+iAhS0t5bqH6K2344G+44Gf44Gv6Zuj5rCR6KqN5a6a44KS55Sz6KuL44GX44CB44G+44Gg5rG65a6a44KS5Y+X44GR44Gm44GE44Gq44GE5Lq644CB44G+44Gf44Gv5bqH6K2355Sz6KuL6ICF44Go44GX44Gm55m76Yyy44GV44KM44Gm44GE44KL5Lq6LS3jga/pmaTlpJbjgZXjgozjgovjgILjg5Hjg6zjgrnjg4Hjg4rpm6PmsJHjgajjga/jgIExOTQ25bm0NuaciOOBi+OCiTE5NDjlubQ15pyI44G+44Gn44Gu6ZaT44Gr5bGF5L2P5Zyw44GM44OR44Os44K544OB44OK44Gn44GC44KK44CBMTk0OOW5tOOBruOCouODqeODluODu+OCpOOCueODqeOCqOODq+e0m+S6ieOBrue1kOaenOOAgeS9j+WxheOBqOeUn+ioiOaJi+auteOCkuWkseOBo+OBn+S6uuOAhe+8iOOBiuOCiOOBs+OBneOBruWtkOWtq++8ieOBp+OBguOCi+OAguW6h+itt+WbveOBqOOBr+OAgeW6h+itt+iri+axguOBjOaPkOWHuuOBleOCjOOAgeiqjeOCgeOCieOCjOOBn+WbveOBruOBk+OBqOOBp+OBguOCi+OAguWHuui6q+WbveOBqOOBr+OAgeS4gOiIrOeahOOBq+iri+axguiAheOBruWbveexjeOBvuOBn+OBr+W4guawkeaoqeOBruOBguOCi+WbveOCkuaMh+OBmeOAggoKIyMjIOODh+ODvOOCv+OBruWPluW+lwoKIyMjIyDmupblgpkKCirjgZPjgozjgb7jgafjgajjgoLlkIzjgZjjgojjgYbjgavkuozjgaTjga7jg5Hjg4PjgrHjg7zjgrjjgpLoqq3jgb/ovrzjgb/vvIhsb2Fk77yJ44G+44GZ44CCKgoKYGBgCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KFdESSkKYGBgCgpgYGB7cn0KCmBgYAoKKuWkieaVsOWQjeOCkuaMh+WumuOBl+OBvuOBmeOAguOBk+OBk+OBp+OBr+OAgWByZWZ1Z2VlX2FzeWx1bWAg44Go44CBYHJlZnVnZWVfb3JpZ2luYCDjgajjgZfjgb7jgZfjgZ/jgILjgarjgovjgbnjgY/jgo/jgYvjgorjgoTjgZnjgYTlkI3liY3jgavjgZfjgb7jgZnjgIIqCgoq44GT44Gu5aSJ5pWw5ZCN44Gv44CB5LuK5b6M5L2/44GE44G+44GZ44GL44KJ44CB6YeN6KaB44Gn44GZ44CC5LiA5b+c44CB5L6L44Go44GX44Gm44CB44KP44Gf44GX44GM5L2/44Gj44Gf44CB5aSJ5pWw5ZCN44KS5pu444GE44Gm44GC44KK44G+44GZ44CC5LuW44Gu5aSJ5pWw5ZCN44KS5L2/44Gj44Gm44KC5qeL44GE44G+44Gb44KT44CCYGV4dHJhID0gVFJVRWAg44Go44GZ44KL44Go44CB5Zyw5Z+f5ZCN77yIcmVnaW9u77yJ44KE44CB5Y+O5YWl44Os44OZ44Or77yIaW5jb21l77yJ44Gq44Gp44GM6L+95Yqg44GV44KM44G+44GZ44CCKgoKYGBgCmRmX3VuZW1wbG95IDwtIFdESShpbmRpY2F0b3IgPSBjKGZlbWFsZV91bmVtcGxveSA9ICJTTC5VRU0uVE9UTC5GRS5aUyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWxlX3VuZW1wbG95ID0gIlNMLlVFTS5UT1RMLk1BLlpTIiksCiAgICAgICAgICAgICAgICAgICBleHRyYSA9IFRSVUUpCmBgYAoKYGBge3IgZXZhbCA9IEZBTFNFfQoKCmBgYAoKKmRhdGEg44OH44Kj44Os44Kv44OI44Oq44Gr5pu444GN6L6844KT44Gn44GK44GN44G+44GZ44CCKgoKCmBgYAp3cml0ZV9jc3YoZGZfdW5lbXBsb3ksICJkYXRhL3VuZW1wbG95LmNzdiIpCmBgYAoKYGBge3IgZXZhbCA9IEZBTFNFfQoKYGBgCgoqZGF0YSDjg4fjgqPjg6zjgq/jg4jjg6rjgYvjgonoqq3jgb/lh7rjgZfjgb7jgZnjgIJSdW4gQWxsIOOChOOAgVJ1biBBbGwgQ2h1bmtzIEFib3ZlIOOCkuOBmeOCi+aZguOBr+OAgeS4iuOBruS6jOOBpOOCkuOCueOCreODg+ODl+OBmeOCi+ioreWumuOBq+OBl+OBpuOBguOCiuOBvuOBmeOAgioKCmBgYApkZl91bmVtcGxveSA8LSByZWFkX2NzdigiZGF0YS91bmVtcGxveS5jc3YiKQpgYGAKCgpgYGB7cn0KCmBgYAoKIyMjIOODh+ODvOOCv+OBrueiuuiqjQoKYGBgCmRmX3VuZW1wbG95CmBgYAoKCirjg4fjg7zjgr/lkI3jgafjgIHkuK3ouqvjgpLooajnpLrjgafjgY3jgb7jgZnjgIJgaGVhZChkZl9yZWZ1Z2VlKWAg44Go44GZ44KL44Go44CBNuihjOihqOekuuOBleOCjOOBvuOBmeOAgioKCmBgYHtyfQoKYGBgCgoq5aSJ5pWw44Gu5oOF5aCx44KS5b6X44KL44GT44Go44GM44Gn44GN44G+44GZ44CCKgoKYGBgCnN0cihkZl91bmVtcGxveSkKYGBgCgoKYGBge3J9CgpgYGAKCiMjIyDlpInlvaIKCiMjIyMg5aSJ5pWw44Gu6YG45oqe77yIc2VsZWN0aW5n77yJCgpgYGAKZGZfdW5lbXAgPC0gZGZfdW5lbXBsb3kgfD4gCiAgc2VsZWN0KGNvdW50cnksIGlzbzJjLCB5ZWFyLCBmZW1hbGVfdW5lbXBsb3ksIG1hbGVfdW5lbXBsb3ksIHJlZ2lvbiwgaW5jb21lKQpkZl91bmVtcApgYGAKCgpgYGB7cn0KCmBgYAoKKuODh+ODvOOCv+OBq+OBryBjb3VudHJ5IOOBruOBqOOBk+OCjeOBq+OAgeWbveOBoOOBkeOBp+OBquOBj+OAgeWcsOWfn+OCguWFpeOBo+OBpuOBhOOCi+OBruOBp+OAgeWcsOWfn+OBruODquOCueODiOOCkuOAgWBpc28yY2Ag44GnIGBSRUdJT05gIOOBq+WFpeOCjOOBpuOBiuOBjeOBvuOBmeOAgioKCmBgYApSRUdJT04gPC0gYygiMUEiLCAiMVciLCAiNEUiLCAiNkYiLCAiNk4iLCAiNlgiLCAiN0UiLCAiOFMiLCAiQTQiLCAiQTUiLCAKIkE5IiwgIkIxIiwgIkIyIiwgIkIzIiwgIkI0IiwgIkI2IiwgIkI3IiwgIkI4IiwgIkM0IiwgIkM1IiwgIkM2IiwgCiJDNyIsICJDOCIsICJDOSIsICJEMiIsICJEMyIsICJENCIsICJENSIsICJENiIsICJENyIsICJFVSIsICJGMSIsIAoiRjYiLCAiTTEiLCAiTTIiLCAiTjYiLCAiT0UiLCAiUjYiLCAiUzEiLCAiUzIiLCAiUzMiLCAiUzQiLCAiVDIiLCAKIlQzIiwgIlQ0IiwgIlQ1IiwgIlQ2IiwgIlQ3IiwgIlYxIiwgIlYyIiwgIlYzIiwgIlY0IiwgIlhDIiwgIlhEIiwgCiJYRSIsICJYRiIsICJYRyIsICJYSCIsICJYSSIsICJYSiIsICJYTCIsICJYTSIsICJYTiIsICJYTyIsICJYUCIsIAoiWFEiLCAiWFQiLCAiWFUiLCAiWFkiLCAiWjQiLCAiWjciLCAiWkIiLCAiWkYiLCAiWkciLCAiWkgiLCAiWkkiLCAKIlpKIiwgIlpRIiwgIlpUIikKYGBgCgpgYGB7cn0KCmBgYAoKKuWcsOWfn+WQjeOBq+OBr+OBqeOBruOCiOOBhuOBquOCguOBruOBjOOBguOCi+OBi+imi+OBpuOBiuOBjeOBvuOBmeOAgioKCmBgYApkZl91bmVtcCB8PiBmaWx0ZXIoaXNvMmMgJWluJSBSRUdJT04pIHw+IGRpc3RpbmN0KGNvdW50cnksIGlzbzJjKQpgYGAKCgpgYGB7cn0KCmBgYAoKKuWbveWQjeOCguOAgeWcsOWfn++8iHJlZ2lvbu+8ieOBqOOAgeaJgOW+l+ODrOODmeODq++8iGluY29tZe+8ieOBqOWFseOBq+OAgeihqOekuuOBl+OBpuOBiuOBjeOBvuOBmeOAgioKCmBgYApkZl91bmVtcCB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+IGRpc3RpbmN0KGNvdW50cnksIGlzbzJjLCByZWdpb24sIGluY29tZSkKYGBgCgoKYGBge3J9CgpgYGAKCiMjIyDliIbmnpDjgZnjgovlm73jga7jg6rjgrnjg4gKCiroh6rliIbjgafliIbmnpDjgZfjgZ/jgYTlm73jga7jg6rjgrnjg4jjgpLkvZzjgaPjgabjgY/jgaDjgZXjgYTjgILjgZPjgZPjgafjga/jgIHntJvkuonjgavplqLkv4LjgYzjgYLjgorjgZ3jgYbjgarlm73jgpIgQ09ORkxJQ1RTIOOBq+OBl+OBvuOBmeOAgueEoeirluOAgeWkieabtOOBl+OBpuOBj+OBoOOBo+OBleOBo+OBpuani+OBhOOBvuOBm+OCkyoKCmBgYApDT05GTElDVFMgPC0gYygiU3lyaWFuIEFyYWIgUmVwdWJsaWMiLCAiVWtyYWluZSIsICJBZmdoYW5pc3RhbiIsICJTb3V0aCBTdWRhbiIsICJNeWFubWFyIiwgIkNvbmdvLCBEZW0uIFJlcC4iLCAiVHVya2l5ZSIsICJXZXN0IEJhbmsgYW5kIEdhemEiKQpgYGAKCmBgYHtyfQoKYGBgCgoKIyMg6KaW6Kaa5YyWCgojIyMgMS4g5ZCE5bm05q+O44Gu44OH44O844K/44Gu5pWw44Gu5qOS44Kw44Op44OVCgoq44G+44Ga44Gv44CBTkEg44Gu5YCk44KS5YmK6Zmk44GX44G+44GZ44CC44Gd44Gu44GC44Go44Gn44CB5Zu944Gu5oOF5aCx44Gu5pWw44KS5pWw44GI44Gf44GE44Gu44Gn44CBYCEoaXNvMmMgJWluJSBSRUdJT04pYCDjgafjgIHkuIrjgafjgYrjgYTjgZ/jgIHlnLDln5/jga4gaXNvMmMg44KS6YG45oqe44GX44CBISDjga/lkKblrprjgafjgZfjgZ/jgYvjgonjgIHlnLDln5/jgafjga/jgarjgYTjgoLjga7jgpLpgbjmip7jgZfjgIHjgZ3jga7mlbDjgpLmo5LjgrDjg6njg5XjgavjgZfjgabjgYTjgb7jgZnjgIIqCgpgYGAKZGZfdW5lbXAgfD4gZHJvcF9uYShmZW1hbGVfdW5lbXBsb3ksIG1hbGVfdW5lbXBsb3kpIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIpKSArIGdlb21fYmFyKCkKYGBgCgoKYGBge3J9CgoKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgotICAKCiMjIyAyLiDntYzlubTlpInljJbjgpLooajjgZnmipjjgoznt5rjgrDjg6njg5UKCiMjIyMgYS4g5pel5pys44CB44G+44Gf44Gv44OH44O844K/44GM44GC44KL5Zu9CgpgYGAKZGZfdW5lbXAgfD4gZmlsdGVyKGNvdW50cnkgPT0gIkphcGFuIikgfD4gZHJvcF9uYShmZW1hbGVfdW5lbXBsb3kpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBmZW1hbGVfdW5lbXBsb3kpKSArIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gIuaXpeacrOOBruWls+aAp+WKtOWDjeiAheWksealreeOhyIpCmBgYAoKCmBgYHtyfQoKCmBgYAoKYGBgCmRmX3VuZW1wIHw+IGZpbHRlcihjb3VudHJ5ID09ICJKYXBhbiIpIHw+IGRyb3BfbmEobWFsZV91bmVtcGxveSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIG1hbGVfdW5lbXBsb3kpKSArIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gIuaXpeacrOOBrueUt+aAp+WKtOWDjeiAheWksealreeOhyIpCmBgYAoKYGBge3J9CgoKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgotICAgCgojIyMjIGIuIOmBuOaKnuOBl+OBn+OBhOOBj+OBpOOBi+OBruWbvQoKYGBgCmRmX3VuZW1wIHw+IGZpbHRlcihpc28yYyAlaW4lIEFTRUFOKSB8PiBkcm9wX25hKGZlbWFsZV91bmVtcGxveSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIGZlbWFsZV91bmVtcGxveSwgY29sID0gY291bnRyeSkpICsgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSAiQVNFQU4g44Gu5aWz5oCn5Yq05YON6ICF5aSx5qWt546HIikKYGBgCgpDT05GTElDVFMg44Gv44CBYGNvdW50cnlgIOOBp+OBmeOBi+OCieOAgeS4i+OBruOCiOOBhuOBq+OBl+OBvuOBmeOAggoKYGBge3J9CgoKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgotICAgCgpgYGAKZGZfdW5lbXAgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBhc2VhbikgfD4gZHJvcF9uYShtYWxlX3VuZW1wbG95KSB8PgogIGdncGxvdChhZXMoeWVhciwgbWFsZV91bmVtcGxveSwgY29sID0gY291bnRyeSkpICsgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSAiQVNFQU4g44Gu55S35oCn5Yq05YON6ICF5aSx5qWt546HIikKYGBgCgoKYGBge3J9CgoKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgotICAKCiMjIyAzLiDnuKbplbfjga7ooajvvIhMb25nIFRhYmxl77yJCgoqYGNvbHMgPSBjKHJlZnVnZWVfYXN5bHVtLCByZWZ1Z2VlX29yaWdpbilgIOOBqOOAgeS4gOOBpOOBruaMh+aomeOBq+OBvuOBqOOCgeOCi+OCguOBruOCkuODquOCueODiOOBmeOCi+OBqOOAgWBuYW1lYCDjgavmjIfmqJnlkI3jgYzlhaXjgorjgIFgdmFsdWVgIOOBq+OAgeOBneOBruWApOOBjOWFpeOCi+OAguabuOW8j+OBr+OAgWBwaXZvdF9sb25nZXIoY29scyA9IC4uLiwgbmFtZXNfdG8gPSAuLi4sIHZhbHVlc190byA9IC4uLilgIOOBp+OAgeWIneacn+ioreWumuOBp+OBr+OAgWBuYW1lc190byA9ICJuYW1lIiwgdmFsdWVzX3RvID0gInZhbHVlImAg44Go44Gq44Gj44Gm44GE44KL44Gu44Gn44CB5oyH5a6a44GX44Gq44GE44Go44CB5LiL44Gu44KI44GG44Gr44Gq44KL44CCSGVscCDlj4LnhafjgIIqCgpgYGAKZGZfdW5lbXBfbG9uZyA8LSBkZl91bmVtcCB8PiBwaXZvdF9sb25nZXIoY29scyA9IGMoZmVtYWxlX3VuZW1wbG95LCBtYWxlX3VuZW1wbG95KSkKZGZfdW5lbXBfbG9uZwpgYGAKCmBgYHtyfQoKCmBgYAoKIyMjIyBhLiDml6XmnKzjga7opIfmlbDjga7mjIfmqJnjgpLoibLliIbjgZHjgZfjgZ/ntYzlubTlpInljJbjga7jgrDjg6njg5UgCgoqYGNvbCA9IG5hbWVgIOOBqOaMh+WumuOBmeOCi+OBqOOAgeiJsuOBp+WMuuWIpeOBl+OBpuOAgeS4gOOBpOOBruOCsOODqeODleOBq+aPj+OBkeOCiyoKCmBgYApkZl91bmVtcF9sb25nIHw+IGZpbHRlcihjb3VudHJ5ID09ICJKYXBhbiIpIHw+IGRyb3BfbmEodmFsdWUpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCB2YWx1ZSwgY29sID0gbmFtZSkpICsgZ2VvbV9saW5lKCkgICsKICBsYWJzKHRpdGxlID0gIuaXpeacrOOBrueUt+Wls+WIpeWksealreeOhyIpCmBgYAoKCmBgYHtyfQoKCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjg7vnlpHllY8qKgoKLSAgIAoKYGBgCmRmX3VuZW1wX2xvbmcgfD4gZmlsdGVyKGNvdW50cnkgPT0gIldvcmxkIikgfD4gZHJvcF9uYSh2YWx1ZSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBjb2wgPSBuYW1lKSkgKyBnZW9tX2xpbmUoKSAgKwogIGxhYnModGl0bGUgPSAi5LiW55WM44Gu55S35aWz5Yil5aSx5qWt546HIikKYGBgCgpgYGB7cn0KCgpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioKCi0gCgojIyMjIGIuIOmBuOaKnuOBl+OBn+OBhOOBj+OBpOOBi+OBruWbveOBruikh+aVsOOBruaMh+aomeOCkuiJsuWIhuOBkeOBl+OBn+e1jOW5tOWkieWMluOBruOCsOODqeODlSAKCmBgYApkZl91bmVtcF9sb25nIHw+IGZpbHRlcihpc28yYyAlaW4lIEFTRUFOKSB8PiBkcm9wX25hKHZhbHVlKSB8PgogIGdncGxvdChhZXMoeWVhciwgdmFsdWUsIGNvbCA9IGNvdW50cnksIGxpbmV0eXBlID0gbmFtZSkpICsgZ2VvbV9saW5lKCkgICsKICBsYWJzKHRpdGxlID0gIkFTRUFOIOOBrueUt+Wls+WIpeWksealreeOhyIpCmBgYAoKYGBge3J9CgoKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgotICAgCgoKIyMjIDQuIOODkuOCueODiOOCsOODqeODoAoK44Gd44KM44Ge44KM44Gu44OH44O844K/44GM5Y2B5YiG44GC44KL5pyA6L+R44Gu5bm044Gu5YCk44Gu44OS44K544OI44Kw44Op44Og77yI5bqm5pWw5YiG5biD77yJCgpf5YiG44GR5pa544Gu5pWwIGJpbnMg44KE44CB5bmFIGJpbndpZHRoIOOCkumBqeWIh+OBq+WkieabtF8KCiMjIyMg5LiA44Gk55uu44Gu5oyH5qiZCgpf5b+F6KaB44Gr5b+c44GY44Gm44CBbG9nMTAg44K544Kx44O844Or77yIc2NhbGVfeF9sb2cxMCgp77yJ44KS5L2/44GG44CCXwoKYGBgCmRmX3VuZW1wIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gZmlsdGVyKHllYXIgPT0gMjAyMikgfD4gZHJvcF9uYShmZW1hbGVfdW5lbXBsb3kpIHw+CiAgZ2dwbG90KGFlcyhmZW1hbGVfdW5lbXBsb3ksIGZpbGwgPSByZWdpb24pKSArIGdlb21faGlzdG9ncmFtKGJpbnMgPSAxMCwgY29sID0gImJsYWNrIiwgbGluZXdpZHRoID0gMC4yKSArIHNjYWxlX3hfbG9nMTAoKQpgYGAKCgpgYGB7cn0KCmBgYAoKCmBgYApkZl91bmVtcCB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+IGZpbHRlcih5ZWFyID09IDIwMjIpIHw+IGRyb3BfbmEoZmVtYWxlX3VuZW1wbG95KSB8PgogIGdncGxvdChhZXMoZmVtYWxlX3VuZW1wbG95LCBmaWxsID0gaW5jb21lKSkgKyBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTAsIGNvbCA9ICJibGFjayIsIGxpbmV3aWR0aCA9IDAuMikgCmBgYAoKYGBge3J9CgoKYGBgCgojIyMjIOS6jOOBpOebruOBruaMh+aomQoKYGBgCmRmX3VuZW1wIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gZmlsdGVyKHllYXIgPT0gMjAyMikgfD4gZHJvcF9uYShtYWxlX3VuZW1wbG95KSB8PgogIGdncGxvdChhZXMobWFsZV91bmVtcGxveSwgZmlsbCA9IHJlZ2lvbikpICsgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDEwLCBjb2wgPSAiYmxhY2siLCBsaW5ld2lkdGggPSAwLjIpICsgc2NhbGVfeF9sb2cxMCgpCmBgYAoKYGBge3J9CgoKYGBgCgpgYGAKZGZfdW5lbXAgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIyKSB8PiBkcm9wX25hKG1hbGVfdW5lbXBsb3kpIHw+CiAgZ2dwbG90KGFlcyhtYWxlX3VuZW1wbG95LCBmaWxsID0gaW5jb21lKSkgKyBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTAsIGNvbCA9ICJibGFjayIsIGxpbmV3aWR0aCA9IDAuMikgCmBgYAoKYGBge3J9CgoKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVj+eCuSoqCgotIAoKIyMjIDUuIOajkuOCsOODqeODlQoK44OH44O844K/44GM5Y2B5YiG44GC44KL5pyA6L+R44Gu5bm044Gu5YCk44GuMTDjgqvlm73jga7lgKTjga7mo5LjgrDjg6njg5UKCiMjIyMgYS4gIOS4gOOBpOebruOBruaMh+aome+8muWApOOBjOWkp+OBjeOBhOaWueOBi+OCiQoKYGBgCmRmX3VuZW1wIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gZmlsdGVyKHllYXIgPT0gMjAyMikgfD4gZHJvcF9uYShmZW1hbGVfdW5lbXBsb3kpIHw+CiAgYXJyYW5nZShkZXNjKGZlbWFsZV91bmVtcGxveSkpIHw+IHNsaWNlX2hlYWQobiA9IDEwKSB8PgogIGdncGxvdChhZXMoZmN0X3JldihmY3RfaW5vcmRlcihjb3VudHJ5KSksIGZlbWFsZV91bmVtcGxveSwgZmlsbCA9IHJlZ2lvbikpICsgZ2VvbV9jb2woKSArIGNvb3JkX2ZsaXAoKSArIGxhYnModGl0bGUgPSAi5aWz5oCn5aSx5qWt546H44Gu6auY44GE6aCGIiwgeCA9ICIiKQpgYGAKCmBgYHtyfQoKYGBgCgoKIyMjIyBiLiAg5LiA44Gk55uu44Gu5oyH5qiZ77ya5YCk44GM5bCP44GV44GE5pa544GL44KJCgpgYGAKZGZfdW5lbXAgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIyKSB8PiBkcm9wX25hKGZlbWFsZV91bmVtcGxveSkgfD4KICBhcnJhbmdlKGZlbWFsZV91bmVtcGxveSkgfD4gc2xpY2VfaGVhZChuID0gMTApIHw+CiAgZ2dwbG90KGFlcyhmY3RfcmV2KGZjdF9pbm9yZGVyKGNvdW50cnkpKSwgZmVtYWxlX3VuZW1wbG95LCBmaWxsID0gcmVnaW9uKSkgKyBnZW9tX2NvbCgpICsgY29vcmRfZmxpcCgpICsgbGFicyh0aXRsZSA9ICLlpbPmgKflpLHmpa3njofjgYzkvY7jgYTpoIYiKQpgYGAKCmBgYHtyfQoKCmBgYAoKIyMjIyBhLiAg5LqM44Gk55uu44Gu5oyH5qiZ77ya5YCk44GM5aSn44GN44GE5pa544GL44KJCgpgYGAKZGZfdW5lbXAgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIyKSB8PiBkcm9wX25hKG1hbGVfdW5lbXBsb3kpIHw+CiAgYXJyYW5nZShkZXNjKG1hbGVfdW5lbXBsb3kpKSB8PiBzbGljZV9oZWFkKG4gPSAxMCkgfD4KICBnZ3Bsb3QoYWVzKGZjdF9yZXYoZmN0X2lub3JkZXIoY291bnRyeSkpLCBtYWxlX3VuZW1wbG95LCBmaWxsID0gcmVnaW9uKSkgKyBnZW9tX2NvbCgpICsgY29vcmRfZmxpcCgpICsgbGFicyh0aXRsZSA9ICLnlLfmgKflpLHmpa3njofjga7pq5jjgYTpoIYiLCB4ID0gIiIpCmBgYAoKYGBge3J9CgpgYGAKCiMjIyMgYi4gIOS6jOOBpOebruOBruaMh+aome+8muWApOOBjOWwj+OBleOBhOaWueOBi+OCiQoKYGBgCmRmX3VuZW1wIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gZmlsdGVyKHllYXIgPT0gMjAyMikgfD4gZHJvcF9uYShtYWxlX3VuZW1wbG95KSB8PgogIGFycmFuZ2UobWFsZV91bmVtcGxveSkgfD4gc2xpY2VfaGVhZChuID0gMTApIHw+CiAgZ2dwbG90KGFlcyhmY3RfcmV2KGZjdF9pbm9yZGVyKGNvdW50cnkpKSwgbWFsZV91bmVtcGxveSwgZmlsbCA9IHJlZ2lvbikpICsgZ2VvbV9jb2woKSArIGNvb3JkX2ZsaXAoKSArIGxhYnModGl0bGUgPSAi55S35oCn5aSx5qWt546H44GM5L2O44GE6aCGIikKYGBgCgpgYGB7cn0KCmBgYAoKIyMjIDYuIOaVo+W4g+WbswoKX+W/heimgeOBq+W/nOOBmOOBpuOAgUxPRzEwIChzY2FsZV94X2xvZzEwKCksIHNjYWxlX3lfbG9nMTAoKSkg44K544Kx44O844Or44KS5L2/44GG44CCXwoKIyMjIyBhLu+8iOWcsOWfn+OCkumZpOOBje+8ieWbveOBruOBv+OBruaVo+W4g+WbsyAKCmBgYApkZl91bmVtcCB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+IGRyb3BfbmEoZmVtYWxlX3VuZW1wbG95LCBtYWxlX3VuZW1wbG95KSB8PgogIGdncGxvdChhZXMoZmVtYWxlX3VuZW1wbG95LCBtYWxlX3VuZW1wbG95KSkgKyBnZW9tX3BvaW50KCkgICsKICBsYWJzKHRpdGxlID0gIuWksealreeOh++8mueUt+Wls+WIpeebuOmWoiIpCmBgYAoKCmBgYHtyfQoKCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjg7vnlpHllY8qKgoKLSAgIAoKIyMjIyDov5HkvLzvvIjlm57luLDvvInnm7Tnt5rjga7ooajnpLoKCmBgYApkZl91bmVtcCB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+IGRyb3BfbmEoZmVtYWxlX3VuZW1wbG95LCBtYWxlX3VuZW1wbG95KSB8PgogIGdncGxvdChhZXMoZmVtYWxlX3VuZW1wbG95LCBtYWxlX3VuZW1wbG95KSkgKyBnZW9tX3BvaW50KCkgKyAKICBnZW9tX3Ntb290aChmb3JtdWxhID0gJ3l+eCcsIG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UpICsKICBsYWJzKHRpdGxlID0gIuWksealreeOh++8mueUt+Wls+WIpeebuOmWou+8iOWbnuW4sOebtOe3muS7mO+8iSIpCmBgYAoKCmBgYHtyfQoKCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjg7vnlpHllY8qKgoKLSAgIAoKIyMjIyBiLiDmnIDov5Hjga7lubTjga7vvIjlnLDln5/jgpLpmaTjgY3vvInlm73jga7jgb/jga7mlaPluIPlm7MKCmBgYApkZl91bmVtcCB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+IGZpbHRlcih5ZWFyID09IDIwMjIpIHw+IAogIGRyb3BfbmEoZmVtYWxlX3VuZW1wbG95LCBtYWxlX3VuZW1wbG95KSB8PgogIGdncGxvdChhZXMoZmVtYWxlX3VuZW1wbG95LCBtYWxlX3VuZW1wbG95KSkgKyBnZW9tX3BvaW50KCkgKwogIGxhYnModGl0bGUgPSAiMjAyMuW5tOOBruWksealreeOh++8mueUt+Wls+WIpeebuOmWoiIpCmBgYAoKCmBgYHtyfQoKCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjg7vnlpHllY8qKgoKLSAgIAoKIyMjIyDov5HkvLzvvIjlm57luLDvvInnm7Tnt5rjga7ooajnpLoKCmBgYApkZl91bmVtcCB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+IGZpbHRlcih5ZWFyID09IDIwMjIpIHw+IAogIGRyb3BfbmEoZmVtYWxlX3VuZW1wbG95LCBtYWxlX3VuZW1wbG95KSB8PgogIGdncGxvdChhZXMoZmVtYWxlX3VuZW1wbG95LCBtYWxlX3VuZW1wbG95KSkgKyBnZW9tX3BvaW50KCkgKyAKICBnZW9tX3Ntb290aChmb3JtdWxhID0gJ3l+eCcsIG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UpICsKICBsYWJzKHRpdGxlID0gIuWksealreeOh++8mueUt+Wls+WIpeebuOmWou+8iOWbnuW4sOebtOe3muS7mO+8iSIpCmBgYAoKCmBgYHtyfQoKCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjg7vnlpHllY8qKgoKLSAgIAoKIyMjIyBjLiDnm7jplqLkv4LmlbAKCmBgYApkZl91bmVtcCB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+IGZpbHRlcih5ZWFyID09IDIwMjIpIHw+IAogIGRyb3BfbmEoZmVtYWxlX3VuZW1wbG95LCBtYWxlX3VuZW1wbG95KSB8PiBzZWxlY3QoZmVtYWxlX3VuZW1wbG95LCBtYWxlX3VuZW1wbG95KSB8PiBjb3IoKQpgYGAKCgpgYGB7cn0KCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjg7vnlpHllY8qKgoKLSAgIAoKCiMjIyA3LiDnrrHjg5LjgrLlm7PvvIhCb3hwbG9077yJCgrlv4XopoHmmYLlv5zjgZjjgabjgIHjg63jgrDjgrnjgrHjg7zjg6vvvIhzY2FsZV95X2xvZzEwKCnvvIkKCmBgYApkZl91bmVtcF9sb25nIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gZmlsdGVyKHllYXIgPT0gMjAyMikgfD4gCiAgZHJvcF9uYSh2YWx1ZSkgfD4KICBnZ3Bsb3QoYWVzKG5hbWUsIHZhbHVlKSkgKyBnZW9tX2JveHBsb3QoKSArCiAgbGFicyh0aXRsZSA9ICLlirTlg43ogIXlpLHmpa3njofvvJrnlLflpbPliKXnrrHjgbLjgZLlm7MiKQpgYGAKCgpgYGB7cn0KCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjg7vnlpHllY8qKgoKLSAgIAoKYGBgCmRmX3VuZW1wX2xvbmcgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIyKSB8PiAKICBkcm9wX25hKHZhbHVlLCByZWdpb24pIHw+CiAgZ2dwbG90KGFlcyhyZWdpb24sIHZhbHVlLCBmaWxsID0gbmFtZSkpICsgZ2VvbV9ib3hwbG90KCkgKyBjb29yZF9mbGlwKCkgKwogIGxhYnModGl0bGUgPSAi5Yq05YON6ICF5aSx5qWt546H77ya55S35aWz44O75Zyw5Z+f5Yil566x44Gy44GS5ZuzIikKYGBgCgoKYGBge3J9CgpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioKCi0gICAKCmBgYApkZl91bmVtcF9sb25nIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gZmlsdGVyKHllYXIgPT0gMjAyMikgfD4gCiAgZHJvcF9uYSh2YWx1ZSwgaW5jb21lKSB8PiBmaWx0ZXIoaW5jb21lICE9ICJOb3QgY2xhc3NpZmllZCIpIHw+CiAgZ2dwbG90KGFlcyhpbmNvbWUsIHZhbHVlLCBmaWxsID0gbmFtZSkpICsgZ2VvbV9ib3hwbG90KCkgKyBjb29yZF9mbGlwKCkgKwogIGxhYnModGl0bGUgPSAi5Yq05YON6ICF5aSx5qWt546H77ya55S35aWz44O75Y+O5YWl44Os44OZ44Or5Yil566x44Gy44GS5ZuzIikKYGBgCgoKYGBge3J9CgoKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgotICAgCgpgYGAKZGZfdW5lbXBfbG9uZyB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+IGZpbHRlcih5ZWFyICVpbiUgYygxOTkxLCAyMDAxLCAyMDExLCAyMDIxKSkgfD4KICBkcm9wX25hKHZhbHVlKSB8PiAKICBnZ3Bsb3QoYWVzKGZhY3Rvcih5ZWFyKSwgdmFsdWUsIGZpbGwgPSBuYW1lKSkgKyBnZW9tX2JveHBsb3QoKSArCiAgbGFicyh0aXRsZSA9ICLlirTlg43ogIXlpLHmpa3njofvvJrnlLflpbPliKXjg7sxMOW5tOOBlOOBqOOBrueuseOBsuOBkuWbsyIpCmBgYAoKCmBgYHtyfQoKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgotICAgCgpgYGAKZGZfdW5lbXBfbG9uZyB8PiBmaWx0ZXIoaXNvMmMgJWluJSBBU0VBTikgfD4gZHJvcF9uYSh2YWx1ZSkgfD4gCiAgZ2dwbG90KGFlcyhjb3VudHJ5LCB2YWx1ZSwgZmlsbCA9IG5hbWUpKSArIGdlb21fYm94cGxvdCgpICsgY29vcmRfZmxpcCgpICsKICBsYWJzKHRpdGxlID0gIkFTRUFOIOOBruWKtOWDjeiAheWksealreeOh++8mueUt+Wls+WIpeeuseOBsuOBkuWbsyIpCmBgYAoKCmBgYHtyfQoKCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjg7vnlpHllY8qKgoKLSAgIAo=