aiib <- read_dta("C:/Users/Paula/Desktop/AIIB-ForResubmission.dta")

aiib %<>% 
  select(ccode, aiibmember:adbnonregionalmember, asiapacific, chinaalignment, usmilitaryalliance)

the_df <- merge(the_df, aiib, by.x = c("cow_code"), by.y = c("ccode"), all.x = TRUE)
russia_dyad <- read.csv("C:/Users/Paula/Desktop/PD_original_datasets/russia_dyad.csv")
russia_dyad$X <- NULL

the_df <- merge(the_df, russia_dyad, by = c("cow_code", "year"), all.x = TRUE)

soviet_iron_curtain_vector <- c("Albania", "Bulgaria", "Czech Republic", 
                                "Poland",  "Kosovo",   "Romania", 
                                "Hungary",  "Slovakia",  "Bosnia and Herzegovina",
                                "Croatia",  "Macedonia", "Montenegro", "Serbia")

soviet_republics_vector <- c("Russia", "Lithuania", "Georgia",
                             "Estonia", "Latvia",  "Ukraine"    ,
                             "Belarus", "Moldova", "Kyrgyzstan",    
                             "Uzbekistan", "Tajikistan", "Armenia"  ,
                             "Azerbaijan", "Turkmenistan", "Kazakhstan")

the_df %<>%
  dplyr::mutate(soviet_iron_curtain = ifelse(country %in% soviet_iron_curtain_vector, 1, 0)) 

the_df %<>%
  dplyr::mutate(soviet_republics = ifelse(country %in% soviet_republics_vector, 1, 0)) 

the_df %<>% mutate(rus_influence = ifelse(country == "Russia", 1, 
                                          ifelse(level_contig_rus == 1, 1, 
                                              ifelse(soviet_republics == 1, 1,
                                                ifelse(soviet_iron_curtain == 1, 1, 0)))))
the_df %>% 
  mutate(budget_pc = budget / pop, na.rm = TRUE) %>%
  mutate(exports_pc = exports_bop / pop, na.rm = TRUE) %>% 
  mutate(total_trade = exports_bop + imports_bop, na.rm = TRUE) %>% 
  mutate(trade_openess = total_trade / gdp_const, na.rm = TRUE) %>% 
  mutate(us_total_trade = us_exports_to_country + us_imports_from_country, na.rm = TRUE) %>% 
  mutate(us_trade_dependence = us_total_trade / balance_trade, na.rm = TRUE) %>% 
  mutate(us_exports_pc = us_exports_to_country / pop, na.rm = TRUE) %>% 
  mutate(muslim_percent = percent_muslim_jitter / pop, na.rm = TRUE) %>% 
  mutate(us_imports_pc = us_imports_from_country / pop, na.rm = TRUE) -> the_df

Cost of living ranking

The main problem

Source: “https://www.numbeo.com/cost-of-living/rankings_by_country.jsp?title=2019

url <- "https://www.numbeo.com/cost-of-living/rankings_by_country.jsp?title=2019"

# Countries with no INDEX
col_url <- read_html(url)
col_table <- col_url %>% html_table(header = TRUE, fill = TRUE)
col_19 <- col_table[[2]]

col_19$year <- replicate(119, 2019)
col_19$rank <- NULL
col_19 %<>% 
  clean_names()

col_19$cow_code <- countrycode(col_19$country, "country.name", "cown")

col_19 %<>% dplyr::mutate(cow_code = ifelse(country == "Palestine", 6666, 
                                              ifelse(country == "Serbia", 345, 
                                                ifelse(country == "Hong Kong", 997, cow_code))))

names(col_19)

[1] “rank” “country”
[3] “cost_of_living_index” “rent_index”
[5] “cost_of_living_plus_rent_index” “groceries_index”
[7] “restaurant_price_index” “local_purchasing_power_index”
[9] “year” “cow_code”

col_19 %>% 
  arrange(desc(cost_of_living_index)) %>% 
  select(country, cost_of_living = cost_of_living_index) %>% 
  head() %>% 
  kbl() %>%
  kable_paper("striped",
              full_width = F)
country cost_of_living
Switzerland 121.16
Iceland 101.86
Norway 100.99
Bahamas 92.40
Luxembourg 86.09
Japan 83.33
col_19 %>% 
  arrange(desc(cost_of_living_index)) %>% 
  select(country, cost_of_living = cost_of_living_index) %>% 
  tail() %>% 
  kbl() %>%
  kable_paper("striped",
              full_width = F)
country cost_of_living
Egypt 26.46
Kosovo (Disputed Territory) 26.18
Venezuela 25.73
India 24.17
Tunisia 23.69
Pakistan 20.40
# df_19 %>% 
#   group_by(country) %>% 
#   mutate(ppp_budget = budget * ppp) %>% 
#   select(country, ppp_budget) %>% 
#   arrange(desc(ppp_budget)) -> table3_mult
# 
# df_19 %>% 
#   group_by(country) %>% 
#   mutate(ppp_budget = budget * ppp) %>% 
#   select(country, raw_budget = budget) %>% 
#   arrange(desc(raw_budget)) -> table4_mult

# kbl(list(table3_mult, table4_mult), digits = 0, 
#     caption = "Arranged By PPP Adjusted Budget LEFT and By PPP Raw Budget RIGHT") %>%
#     kable_paper("striped", full_width = T) 

Adjust to 2019 prices

country <- "United States"
countries_dataframe <- show_countries()

Generating URL to request all 299 results

inflation_dataframe <- retrieve_inflation_data(country, countries_dataframe)

Retrieving inflation data for US Generating URL to request all 61 results

# Provide a World Bank API URL and url_all_results will convert it into one with all results for that indicator
original_url <- "http://api.worldbank.org/v2/country" 

# "http://api.worldbank.org/v2/country?format=json&per_page=304"
url_all_results(original_url)

Generating URL to request all 299 results [1] “http://api.worldbank.org/v2/country?format=json&per_page=299

the_df$budget_const <- adjust_for_inflation(the_df$budget, 
                                                the_df$year, 
                                                country, 
                                                to_date = 2019,
                                                inflation_dataframe = inflation_dataframe,
                                                countries_dataframe = countries_dataframe)

the_df$budget_pc_const <- adjust_for_inflation(the_df$budget_pc, 
                                              the_df$year, 
                                                   country, 
                                                   to_date = 2019,
                                                   inflation_dataframe = inflation_dataframe,
                                                   countries_dataframe = countries_dataframe)

Price level ratio

Source: https://data.worldbank.org/indicator/PA.NUS.PPPC.RF

Price level ratio is the ratio of a purchasing power parity (PPP) conversion factor to an exchange rate. It provides a measure of the differences in price levels between countries by indicating the number of units of the common currency needed to buy the same volume of the aggregation level in each country.

Indicator source: International Comparison Program, World Bank

library(WDI)
ppp = WDI(indicator='PA.NUS.PPPC.RF', country="all", start=2013, end=2019)
ppp$ppp <- ppp$PA.NUS.PPPC.RF
ppp$PA.NUS.PPPC.RF <- NULL

ppp$cow_code <- countrycode(ppp$iso2c, "iso2c", "cown")

ppp %<>% 
dplyr::mutate(cow_code = ifelse(country == "West Bank and Gaza", 6666, 
                                ifelse(country == "Serbia", 345, 
                                       ifelse(country == "Hong Kong SAR, China", 997, cow_code))))

ppp$country <- NULL

the_df <- merge(the_df, ppp, by = c("cow_code", "year"), all.x = TRUE)

the_df %<>%  
  mutate(ppp_budget = budget / ppp, na.rm = TRUE) %>% 
  mutate(ppp_budget_pc = budget_pc * ppp, na.rm = TRUE) %>% 
  mutate(ppp_budget_const = budget_const / ppp, na.rm = TRUE) %>% 
  mutate(ppp_budget_pc_const = budget_pc_const * ppp, na.rm = TRUE) %>% 
  select(ppp_budget, ppp_budget_pc, ppp_budget_const, ppp_budget_pc_const, everything())
the_df %>%
  filter(year == 2014) %>% 
  filter(country != "Kosovo") %>% 
  filter(country != "Curacao") %>% 
  filter(country != "Vatican City") %>%
  select(country, ppp_budget) %>%
  arrange(desc(ppp_budget)) ->t1

the_df %>%
  filter(country != "Kosovo") %>% 
  filter(country != "Curacao") %>% 
  filter(country != "Vatican City") %>%
  filter(year == 2014) %>% 
  select(country, ppp_budget_pc) %>%
  arrange(desc(ppp_budget_pc)) -> t2

the_df %>%
  filter(country != "Kosovo") %>%
  filter(country != "Curacao") %>% 
  filter(country != "Vatican City") %>% 
  filter(year == 2014) %>% 
  select(country, ppp_budget_const) %>%
  arrange(desc(ppp_budget_const)) -> t3

the_df %>%
  filter(country != "Kosovo") %>% 
  filter(country != "Curacao") %>% 
  filter(country != "Vatican City") %>%
  filter(year == 2014) %>% 
  select(country, ppp_budget_pc_const) %>%
  arrange(desc(ppp_budget_pc_const)) -> t4

the_df %>%
  filter(country != "Kosovo") %>% 
  filter(country != "Curacao") %>% 
  filter(country != "Vatican City") %>%
  filter(year == 2014) %>% 
  select(country, budget) %>%
  arrange(desc(budget)) -> t0

the_df %>%
  filter(country != "Kosovo") %>% 
  filter(country != "Curacao") %>% 
  filter(country != "Vatican City") %>%
  filter(year == 2014) %>% 
  select(country, budget_pc) %>%
  arrange(desc(budget_pc)) -> tpc

kbl(list(t0, t1,  t3, tpc, t2, t4), digits = 4) %>% 
     kable_paper("striped", full_width = FALSE) 
country budget
Afghanistan 56507034
Pakistan 36561172
Kenya 19795614
Mozambique 15227740
Zimbabwe 13688543
Iraq 12178606
South Africa 10905073
India 10195170
Ethiopia 9929613
Botswana 9665209
Brazil 9537682
Japan 9176177
China 7760211
Germany 7058232
Nigeria 6708386
Tanzania 6015504
Mexico 5742427
Indonesia 5517627
Russia 5455594
Zambia 4703058
South Korea 4681751
Israel 4474507
France 4355206
Palestinian Territories 4037115
Italy 4011391
Vietnam 3968612
Kazakhstan 3964445
Argentina 3938010
Turkey 3691430
Colombia 3677446
Jordan 3506201
Democratic Republic of the Congo 3411433
Uganda 3302523
Burma 3126713
United Kingdom 3110483
Spain 3085913
Cameroon 3009714
Ukraine 2987964
Egypt 2906309
Canada 2707912
Australia 2648692
Tajikistan 2644280
Peru 2616332
Chile 2597870
Poland 2578556
Philippines 2577410
Venezuela 2534132
Austria 2505317
Kyrgyzstan 2421388
Turkmenistan 2361743
Morocco 2358837
United Arab Emirates 2209363
Saudi Arabia 2143931
Thailand 2086208
Malaysia 2027167
Belgium 2018477
Bangladesh 2011284
Greece 2009268
Bolivia 2008954
Namibia 1979443
Ecuador 1904677
Malawi 1882776
Niger 1747531
Nepal 1744895
Serbia 1720045
Romania 1598707
Cote D’Ivoire 1575511
Czech Republic 1555711
Lebanon 1501240
Guinea 1497955
Bosnia and Herzegovina 1473503
Slovakia 1449542
Georgia 1387092
Hong Kong 1386503
Swaziland 1378799
Netherlands 1366532
Yemen 1365845
Uruguay 1352551
Croatia 1326867
New Zealand 1314910
Hungary 1300689
Senegal 1280760
Panama 1249559
Haiti 1213622
Sweden 1178719
El Salvador 1177991
Uzbekistan 1171380
Guatemala 1168731
Costa Rica 1146747
Singapore 1138221
Ghana 1110674
Portugal 1110465
Dominican Republic 1101621
Azerbaijan 1060545
Finland 1035227
Qatar 1025813
Bulgaria 958440
Tunisia 952028
Mali 949585
Rwanda 942289
Norway 939131
Honduras 937705
Sri Lanka 928094
Denmark 917589
Paraguay 917447
Barbados 878464
Belarus 872016
Angola 866831
Macedonia 850132
Cambodia 807945
Burkina Faso 798255
Kuwait 790326
Estonia 790305
Algeria 789224
Cyprus 788327
Slovenia 780576
Benin 764483
Liberia 760289
Albania 731251
Madagascar 726846
Switzerland 718489
Nicaragua 717722
Bahrain 717495
Lesotho 710854
Latvia 710842
Chad 690727
Armenia 681237
Jamaica 674810
Togo 673389
Lithuania 658067
Sudan 643546
Mauritania 618838
Burundi 593574
Ireland 592969
Trinidad and Tobago 579294
Mongolia 553217
Somalia 537622
Moldova 519919
Laos 519120
Mauritius 489636
Oman 487697
Fiji 484194
Cuba 472517
Papua New Guinea 414550
Montenegro 399569
Djibouti 378363
Eritrea 366500
Sierra Leone 362906
Iceland 348400
Luxembourg 344249
Libya 334681
Gambia, The 297170
Republic of Congo 289381
Equatorial Guinea 262009
Bahamas, The 253473
Brunei 250151
Gabon 246842
South Sudan 224115
Cape Verde 224077
Syria 214051
Suriname 180079
Malta 176495
East Timor 134714
Central African Republic 129296
Belize 122015
Guyana 110596
Guinea-Bissau 76785
Marshall Islands 67305
Samoa 61791
Micronesia 57651
Palau 14204
country ppp_budget
Afghanistan 190495681.90
Pakistan 123859038.79
Kenya 45455933.79
India 33903556.16
Ethiopia 26512237.31
Mozambique 25735870.54
Iraq 25481387.90
Zimbabwe 24922160.74
South Africa 21224206.85
Botswana 20249109.36
Indonesia 16241992.12
Tanzania 13102254.37
China 12683156.30
Brazil 12377097.12
Nigeria 11921390.17
Burma 11637278.58
Vietnam 11230228.32
Ukraine 10339819.15
Russia 9970814.04
Mexico 9487656.16
Zambia 9445024.91
Japan 9433755.25
Egypt 9370153.68
Kyrgyzstan 8101423.84
Tajikistan 7910283.60
Uganda 7806212.75
Jordan 7791602.13
Kazakhstan 7653997.54
Turkey 7314318.97
Germany 6918650.56
Palestinian Territories 6636125.63
Argentina 6284244.58
Cameroon 6214755.63
Nepal 6087161.96
Philippines 6061906.91
Bangladesh 6054407.05
Colombia 6030966.33
Democratic Republic of the Congo 5955174.51
South Korea 5654116.38
Malawi 5471705.49
Thailand 5426003.33
Morocco 4915658.63
Saudi Arabia 4883579.15
Poland 4602943.57
Bolivia 4600065.21
Peru 4513002.30
Malaysia 4407066.08
Italy 4087789.12
France 4064877.29
Israel 4062913.23
Chile 4034951.97
Turkmenistan 4001668.89
Serbia 3820449.35
Namibia 3787871.07
United Arab Emirates 3717588.13
Niger 3536300.28
Spain 3511611.50
Ecuador 3498430.01
Guinea 3433679.14
Georgia 3387995.54
Romania 3288200.07
Bosnia and Herzegovina 3160983.35
Cote D’Ivoire 3155614.81
Ghana 3073400.98
Swaziland 3003367.27
Lebanon 2934866.70
Uzbekistan 2894451.13
Sri Lanka 2735461.39
United Kingdom 2706491.39
Senegal 2595800.55
Czech Republic 2542087.48
Haiti 2507754.96
Greece 2478089.21
Canada 2431453.30
Guatemala 2399060.72
El Salvador 2374069.95
Austria 2363972.86
Cambodia 2353530.85
Azerbaijan 2344352.27
Hungary 2337769.89
Tunisia 2309834.65
Slovakia 2250798.00
Dominican Republic 2246141.21
Panama 2235971.40
Rwanda 2162813.04
Croatia 2152422.04
Mali 2144040.23
Bulgaria 2136830.83
Madagascar 2130205.96
Macedonia 2078358.52
Belarus 1987116.55
Australia 1986397.28
Belgium 1901226.62
Honduras 1892616.08
Hong Kong 1884022.82
Algeria 1868265.86
Nicaragua 1833842.40
Albania 1798216.58
Sudan 1781927.47
Paraguay 1717601.34
Armenia 1715279.33
Burkina Faso 1703848.06
Costa Rica 1698614.84
Burundi 1678072.83
Benin 1677310.62
Singapore 1669354.14
Lesotho 1668677.63
Uruguay 1614646.80
Mauritania 1584835.00
Qatar 1578855.79
Laos 1525862.09
Mongolia 1470843.03
Bahrain 1467236.43
Liberia 1456876.09
Portugal 1445910.99
Togo 1395645.06
Moldova 1378680.35
Somalia 1337955.82
Angola 1310933.65
Netherlands 1273491.24
Kuwait 1257036.99
Jamaica 1192797.29
Chad 1135377.07
Estonia 1130553.19
Lithuania 1120612.09
New Zealand 1100161.96
Latvia 1076826.15
Slovenia 995105.40
Gambia, The 991677.21
Fiji 980111.69
Oman 940201.52
Eritrea 928052.58
Sweden 926643.32
Sierra Leone 907720.65
Mauritius 891517.95
Cyprus 872982.44
Finland 860090.18
Trinidad and Tobago 848712.92
Montenegro 831311.05
Barbados 808482.52
Libya 740221.84
Denmark 702710.71
Djibouti 658529.15
Norway 637831.26
Ireland 545685.70
Papua New Guinea 533877.23
Switzerland 513546.95
Brunei 487829.16
Equatorial Guinea 455227.15
Republic of Congo 454485.38
Gabon 392635.20
Cape Verde 358916.28
Suriname 328165.42
East Timor 297425.74
Iceland 293629.53
Luxembourg 293473.48
Bahamas, The 280307.80
South Sudan 253372.40
Malta 226564.37
Guyana 224004.35
Central African Republic 219425.66
Belize 185929.88
Guinea-Bissau 169783.00
Samoa 87377.65
Marshall Islands 72078.27
Micronesia 62353.75
Palau 17035.35
Cuba NA
Venezuela NA
Syria NA
Yemen NA
country ppp_budget_const
Afghanistan 205721139.31
Pakistan 133758531.00
Kenya 49089020.78
India 36613313.91
Ethiopia 28631240.41
Mozambique 27792822.15
Iraq 27517999.87
Zimbabwe 26914076.21
South Africa 22920561.61
Botswana 21867528.99
Indonesia 17540141.01
Tanzania 14149458.24
China 13696863.56
Brazil 13366342.46
Nigeria 12874212.91
Burma 12567393.57
Vietnam 12127809.63
Ukraine 11166234.09
Russia 10767736.06
Mexico 10245961.56
Zambia 10199922.99
Japan 10187752.60
Egypt 10119067.64
Kyrgyzstan 8748933.97
Tajikistan 8542516.76
Uganda 8430127.99
Jordan 8414349.61
Kazakhstan 8265746.91
Turkey 7898919.37
Germany 7471626.98
Palestinian Territories 7166521.11
Argentina 6786515.80
Cameroon 6711472.91
Nepal 6573681.25
Philippines 6546407.68
Bangladesh 6538308.40
Colombia 6512994.17
Democratic Republic of the Congo 6431144.64
South Korea 6106024.30
Malawi 5909034.14
Thailand 5859679.21
Morocco 5308544.97
Saudi Arabia 5273901.52
Poland 4970836.01
Bolivia 4967727.60
Peru 4873706.15
Malaysia 4759302.92
Italy 4414507.59
France 4389764.53
Israel 4387643.49
Chile 4357447.42
Turkmenistan 4321504.17
Serbia 4125800.57
Namibia 4090618.46
United Arab Emirates 4014718.12
Niger 3818940.75
Spain 3792278.70
Ecuador 3778043.68
Guinea 3708117.56
Georgia 3658782.68
Romania 3551011.01
Bosnia and Herzegovina 3413626.44
Cote D’Ivoire 3407828.81
Ghana 3319044.00
Swaziland 3243412.82
Lebanon 3169437.31
Uzbekistan 3125791.50
Sri Lanka 2954094.43
United Kingdom 2922808.99
Senegal 2803271.13
Czech Republic 2745265.02
Haiti 2708188.46
Greece 2676151.66
Canada 2625788.35
Guatemala 2590806.79
El Salvador 2563818.62
Austria 2552914.51
Cambodia 2541637.92
Azerbaijan 2531725.73
Hungary 2524617.25
Tunisia 2494449.28
Slovakia 2430694.10
Dominican Republic 2425665.10
Panama 2414682.47
Rwanda 2335676.89
Croatia 2324455.39
Mali 2315403.66
Bulgaria 2307618.04
Madagascar 2300463.67
Macedonia 2244472.30
Belarus 2145937.78
Australia 2145161.02
Belgium 2053183.05
Honduras 2043884.31
Hong Kong 2034604.24
Algeria 2017587.89
Nicaragua 1980413.12
Albania 1941939.89
Sudan 1924348.86
Paraguay 1854881.44
Armenia 1852373.85
Burkina Faso 1840028.92
Costa Rica 1834377.43
Burundi 1812193.60
Benin 1811370.46
Singapore 1802778.06
Lesotho 1802047.47
Uruguay 1743698.21
Mauritania 1711503.69
Qatar 1705046.58
Laos 1647817.34
Mongolia 1588400.85
Bahrain 1584505.99
Liberia 1573317.60
Portugal 1561476.11
Togo 1507192.65
Moldova 1488872.03
Somalia 1444892.58
Angola 1415710.65
Netherlands 1375275.63
Kuwait 1357506.27
Jamaica 1288132.17
Chad 1226122.62
Estonia 1220913.19
Lithuania 1210177.54
New Zealand 1188092.93
Latvia 1162891.99
Slovenia 1074639.66
Gambia, The 1070937.48
Fiji 1058447.58
Oman 1015347.58
Eritrea 1002227.62
Sweden 1000705.72
Sierra Leone 980270.65
Mauritius 962772.95
Cyprus 942755.97
Finland 928833.29
Trinidad and Tobago 916546.70
Montenegro 897753.97
Barbados 873100.86
Libya 799384.42
Denmark 758875.19
Djibouti 711162.41
Norway 688810.22
Ireland 589299.89
Papua New Guinea 576547.62
Switzerland 554592.43
Brunei 526819.13
Equatorial Guinea 491611.39
Republic of Congo 490810.33
Gabon 424016.76
Cape Verde 387602.84
Suriname 354394.19
East Timor 321197.63
Iceland 317098.01
Luxembourg 316929.48
Bahamas, The 302711.54
South Sudan 273623.31
Malta 244672.63
Guyana 241908.00
Central African Republic 236963.36
Belize 200790.42
Guinea-Bissau 183352.99
Samoa 94361.35
Marshall Islands 77839.16
Micronesia 67337.41
Palau 18396.91
Cuba NA
Venezuela NA
Syria NA
Yemen NA
country budget_pc
Botswana 4.6276
Barbados 3.0842
Afghanistan 1.6933
Swaziland 1.2592
Marshall Islands 1.1771
Iceland 1.0642
Zimbabwe 1.0075
Palestinian Territories 0.9673
Namibia 0.8707
Palau 0.8059
Cyprus 0.6841
Bahamas, The 0.6839
Montenegro 0.6426
Luxembourg 0.6188
Brunei 0.6105
Estonia 0.6012
Mozambique 0.5793
Fiji 0.5588
Israel 0.5446
Bahrain 0.5370
Micronesia 0.5366
Cape Verde 0.4324
Turkmenistan 0.4321
Trinidad and Tobago 0.4252
Kenya 0.4239
Bosnia and Herzegovina 0.4232
Djibouti 0.4210
Qatar 0.4171
Kyrgyzstan 0.4149
Macedonia 0.4092
Malta 0.4061
Uruguay 0.3978
Jordan 0.3931
Mauritius 0.3883
Slovenia 0.3786
Georgia 0.3729
Latvia 0.3565
Iraq 0.3539
Lesotho 0.3479
Belize 0.3453
Suriname 0.3255
Samoa 0.3215
Tajikistan 0.3204
Panama 0.3203
Croatia 0.3131
Zambia 0.3054
Austria 0.2931
New Zealand 0.2911
Slovakia 0.2675
Albania 0.2531
Serbia 0.2412
United Arab Emirates 0.2398
Lebanon 0.2397
Costa Rica 0.2391
Jamaica 0.2347
Armenia 0.2339
Equatorial Guinea 0.2335
Kazakhstan 0.2293
Lithuania 0.2244
Kuwait 0.2141
Singapore 0.2081
South Africa 0.1999
Hong Kong 0.1918
Finland 0.1895
Mongolia 0.1882
Bolivia 0.1876
Pakistan 0.1872
El Salvador 0.1871
Greece 0.1845
Norway 0.1828
Moldova 0.1820
Belgium 0.1801
Liberia 0.1744
Denmark 0.1626
Mauritania 0.1574
Czech Republic 0.1478
Gambia, The 0.1468
Chile 0.1463
Guyana 0.1449
Paraguay 0.1390
Guinea 0.1343
Cameroon 0.1327
Bulgaria 0.1327
Hungary 0.1318
Gabon 0.1310
Ireland 0.1273
Sweden 0.1216
Oman 0.1211
Tanzania 0.1204
Ecuador 0.1194
Nicaragua 0.1168
Malawi 0.1156
Haiti 0.1150
East Timor 0.1147
Australia 0.1128
Azerbaijan 0.1112
Dominican Republic 0.1084
Portugal 0.1068
Honduras 0.1047
Ethiopia 0.1012
Togo 0.0943
Argentina 0.0923
South Korea 0.0923
Belarus 0.0920
Niger 0.0908
Senegal 0.0904
Uganda 0.0895
Switzerland 0.0877
Germany 0.0872
Peru 0.0869
Tunisia 0.0861
Rwanda 0.0850
Venezuela 0.0843
Netherlands 0.0810
Romania 0.0803
Colombia 0.0783
Laos 0.0782
Canada 0.0764
Guatemala 0.0764
Benin 0.0743
Japan 0.0721
Cote D’Ivoire 0.0696
Saudi Arabia 0.0693
Morocco 0.0690
Malaysia 0.0679
Poland 0.0678
Spain 0.0664
Ukraine 0.0660
Italy 0.0660
France 0.0657
Nepal 0.0648
Republic of Congo 0.0611
Burundi 0.0603
Burma 0.0598
Mali 0.0561
Cambodia 0.0529
Yemen 0.0529
Libya 0.0526
Papua New Guinea 0.0522
Sierra Leone 0.0517
Chad 0.0506
United Kingdom 0.0481
Turkey 0.0478
Mexico 0.0477
Brazil 0.0470
Democratic Republic of the Congo 0.0462
Burkina Faso 0.0454
Guinea-Bissau 0.0454
Sri Lanka 0.0447
Vietnam 0.0433
Cuba 0.0418
Ghana 0.0408
Somalia 0.0401
Uzbekistan 0.0381
Nigeria 0.0380
Russia 0.0379
Angola 0.0322
Egypt 0.0321
Madagascar 0.0308
Thailand 0.0305
Central African Republic 0.0290
Philippines 0.0256
Indonesia 0.0216
South Sudan 0.0212
Algeria 0.0203
Sudan 0.0169
Bangladesh 0.0130
Syria 0.0114
India 0.0079
China 0.0057
Eritrea NA
country ppp_budget_pc
Barbados 3.3512
Botswana 2.2088
Iceland 1.2627
Marshall Islands 1.0991
Luxembourg 0.7259
Palau 0.6719
Bahamas, The 0.6184
Cyprus 0.6178
Israel 0.5998
Palestinian Territories 0.5885
Swaziland 0.5781
Zimbabwe 0.5534
Afghanistan 0.5023
Micronesia 0.4961
Namibia 0.4550
Estonia 0.4203
New Zealand 0.3480
Mozambique 0.3428
Uruguay 0.3332
Malta 0.3164
Brunei 0.3130
Austria 0.3107
Montenegro 0.3089
Slovenia 0.2969
Trinidad and Tobago 0.2902
Fiji 0.2761
Qatar 0.2710
Cape Verde 0.2699
Norway 0.2692
Bahrain 0.2626
Turkmenistan 0.2550
Djibouti 0.2419
Latvia 0.2354
Finland 0.2281
Samoa 0.2273
Belize 0.2266
Mauritius 0.2133
Denmark 0.2123
Bosnia and Herzegovina 0.1973
Croatia 0.1930
Belgium 0.1912
Kenya 0.1846
Panama 0.1790
Suriname 0.1786
Jordan 0.1769
Slovakia 0.1723
Iraq 0.1691
Macedonia 0.1674
Costa Rica 0.1614
Sweden 0.1546
Georgia 0.1527
Zambia 0.1521
Australia 0.1504
Greece 0.1496
Lesotho 0.1482
United Arab Emirates 0.1425
Singapore 0.1419
Hong Kong 0.1411
Ireland 0.1383
Kuwait 0.1346
Equatorial Guinea 0.1344
Jamaica 0.1328
Lithuania 0.1318
Kyrgyzstan 0.1240
Switzerland 0.1228
Lebanon 0.1226
Kazakhstan 0.1188
Serbia 0.1086
Tajikistan 0.1071
Albania 0.1029
South Africa 0.1027
Chile 0.0942
Armenia 0.0929
El Salvador 0.0929
Liberia 0.0910
Czech Republic 0.0905
Germany 0.0889
Netherlands 0.0869
Canada 0.0851
Gabon 0.0824
Portugal 0.0820
Bolivia 0.0819
South Korea 0.0764
Paraguay 0.0743
Hungary 0.0733
Guyana 0.0715
Mongolia 0.0708
France 0.0704
Japan 0.0701
Moldova 0.0686
Ecuador 0.0650
Italy 0.0648
Cameroon 0.0643
Oman 0.0628
Mauritania 0.0615
Bulgaria 0.0595
Guinea 0.0586
Spain 0.0583
Argentina 0.0578
Haiti 0.0557
United Kingdom 0.0553
Tanzania 0.0553
Pakistan 0.0553
Dominican Republic 0.0532
East Timor 0.0520
Honduras 0.0519
Peru 0.0504
Azerbaijan 0.0503
Colombia 0.0477
Nicaragua 0.0457
Togo 0.0455
Niger 0.0449
Senegal 0.0446
Gambia, The 0.0440
Papua New Guinea 0.0405
Belarus 0.0404
Malawi 0.0398
Romania 0.0390
Republic of Congo 0.0389
Poland 0.0380
Ethiopia 0.0379
Uganda 0.0379
Guatemala 0.0372
Rwanda 0.0370
Brazil 0.0362
Tunisia 0.0355
Cote D’Ivoire 0.0347
Benin 0.0339
Morocco 0.0331
Malaysia 0.0312
Chad 0.0308
Saudi Arabia 0.0304
Mexico 0.0289
Laos 0.0266
Democratic Republic of the Congo 0.0265
Mali 0.0248
Turkey 0.0241
Libya 0.0238
Nigeria 0.0214
Burundi 0.0213
Angola 0.0213
Burkina Faso 0.0213
Russia 0.0208
Sierra Leone 0.0207
Guinea-Bissau 0.0205
Ukraine 0.0191
South Sudan 0.0188
Nepal 0.0186
Cambodia 0.0182
Central African Republic 0.0171
Somalia 0.0161
Burma 0.0161
Uzbekistan 0.0154
Vietnam 0.0153
Sri Lanka 0.0152
Ghana 0.0147
Thailand 0.0117
Philippines 0.0109
Madagascar 0.0105
Egypt 0.0100
Algeria 0.0086
Indonesia 0.0073
Sudan 0.0061
Bangladesh 0.0043
China 0.0035
India 0.0024
Cuba NA
Venezuela NA
Eritrea NA
Syria NA
Yemen NA
country ppp_budget_pc_const
Barbados 3.6190
Botswana 2.3854
Iceland 1.3636
Marshall Islands 1.1870
Luxembourg 0.7839
Palau 0.7256
Bahamas, The 0.6678
Cyprus 0.6672
Israel 0.6477
Palestinian Territories 0.6355
Swaziland 0.6243
Zimbabwe 0.5976
Afghanistan 0.5424
Micronesia 0.5357
Namibia 0.4914
Estonia 0.4539
New Zealand 0.3758
Mozambique 0.3702
Uruguay 0.3598
Malta 0.3417
Brunei 0.3381
Austria 0.3355
Montenegro 0.3335
Slovenia 0.3207
Trinidad and Tobago 0.3134
Fiji 0.2981
Qatar 0.2927
Cape Verde 0.2915
Norway 0.2907
Bahrain 0.2836
Turkmenistan 0.2754
Djibouti 0.2612
Latvia 0.2542
Finland 0.2464
Samoa 0.2455
Belize 0.2447
Mauritius 0.2303
Denmark 0.2293
Bosnia and Herzegovina 0.2130
Croatia 0.2084
Belgium 0.2065
Kenya 0.1994
Panama 0.1933
Suriname 0.1929
Jordan 0.1910
Slovakia 0.1860
Iraq 0.1827
Macedonia 0.1807
Costa Rica 0.1743
Sweden 0.1670
Georgia 0.1649
Zambia 0.1642
Australia 0.1625
Greece 0.1615
Lesotho 0.1600
United Arab Emirates 0.1539
Singapore 0.1532
Hong Kong 0.1524
Ireland 0.1494
Kuwait 0.1454
Equatorial Guinea 0.1451
Jamaica 0.1434
Lithuania 0.1423
Kyrgyzstan 0.1339
Switzerland 0.1326
Lebanon 0.1324
Kazakhstan 0.1283
Serbia 0.1173
Tajikistan 0.1157
Albania 0.1112
South Africa 0.1109
Chile 0.1017
Armenia 0.1003
El Salvador 0.1003
Liberia 0.0983
Czech Republic 0.0977
Germany 0.0960
Netherlands 0.0939
Canada 0.0919
Gabon 0.0890
Portugal 0.0885
Bolivia 0.0885
South Korea 0.0825
Paraguay 0.0802
Hungary 0.0792
Guyana 0.0772
Mongolia 0.0764
France 0.0760
Japan 0.0757
Moldova 0.0741
Ecuador 0.0702
Italy 0.0699
Cameroon 0.0694
Oman 0.0678
Mauritania 0.0664
Bulgaria 0.0643
Guinea 0.0633
Spain 0.0630
Argentina 0.0625
Haiti 0.0601
United Kingdom 0.0598
Tanzania 0.0597
Pakistan 0.0597
Dominican Republic 0.0574
East Timor 0.0561
Honduras 0.0560
Peru 0.0544
Azerbaijan 0.0543
Colombia 0.0516
Nicaragua 0.0494
Togo 0.0492
Niger 0.0485
Senegal 0.0481
Gambia, The 0.0475
Papua New Guinea 0.0437
Belarus 0.0436
Malawi 0.0429
Romania 0.0422
Republic of Congo 0.0420
Poland 0.0410
Ethiopia 0.0409
Uganda 0.0409
Guatemala 0.0402
Rwanda 0.0400
Brazil 0.0391
Tunisia 0.0383
Cote D’Ivoire 0.0375
Benin 0.0366
Morocco 0.0358
Malaysia 0.0337
Chad 0.0332
Saudi Arabia 0.0329
Mexico 0.0312
Laos 0.0287
Democratic Republic of the Congo 0.0286
Mali 0.0268
Turkey 0.0261
Libya 0.0257
Nigeria 0.0231
Burundi 0.0230
Angola 0.0230
Burkina Faso 0.0230
Russia 0.0224
Sierra Leone 0.0223
Guinea-Bissau 0.0222
Ukraine 0.0206
South Sudan 0.0203
Nepal 0.0201
Cambodia 0.0196
Central African Republic 0.0184
Somalia 0.0174
Burma 0.0174
Uzbekistan 0.0166
Vietnam 0.0165
Sri Lanka 0.0164
Ghana 0.0159
Thailand 0.0127
Philippines 0.0118
Madagascar 0.0114
Egypt 0.0108
Algeria 0.0092
Indonesia 0.0079
Sudan 0.0066
Bangladesh 0.0047
China 0.0038
India 0.0026
Cuba NA
Venezuela NA
Eritrea NA
Syria NA
Yemen NA
library(troopdata)

troops_us <- get_troopdata(startyear = 2013, endyear = 2020)

the_df <- merge(the_df, troops_us, by.x = c("cow_code", "year"), by.y = c("ccode", "year"), all.x = TRUE)
us_base_df <-read.csv("C:/Users/Paula/Desktop/PD_original_datasets/Bases.csv") 
  
us_base_df %>% 
  filter(base == 1) %>%
  group_by(Country.Name) %>% 
  count() %>% 
  arrange(desc(n)) %>% 
  filter(n > 2) %>% 
  kbl() %>%
  kable_paper("striped",
              full_width = F)
Country.Name n
Japan 42
Germany 40
Korea, South 30
Puerto Rico 19
United Kingdom 16
Italy 14
Afghanistan 9
Kuwait 9
Marshall Islands 6
Oman 6
Turkey 6
Belgium 5
Qatar 5
Bahrain 4
Australia 3
Guam 3
Northern Mariana Islands 3
Romania 3
United Arab Emirates 3
  us_base_df %>% 
  filter(lilypad == 1) %>%
  group_by(Country.Name) %>% 
  count() %>% 
  arrange(desc(n)) %>% 
  filter(n > 2) %>% 
  kbl() %>%
  kable_paper("striped",
              full_width = F)
Country.Name n
Saudi Arabia 9
Syria 8
Israel 6
Pakistan 6
Philippines 6
Colombia 4
Germany 4
Netherlands 4
Bulgaria 3
Cameroon 3
Peru 3
us_base_df %>% 
  group_by(Country.Name) %>% 
  count() %>% 
  arrange(desc(n)) %>% 
  filter(n > 5) %>% 
  kbl() %>%
  kable_paper("striped",
              full_width = F)
Country.Name n
Germany 44
Japan 42
Korea, South 32
Puerto Rico 19
United Kingdom 16
Italy 15
Syria 10
Afghanistan 9
Honduras 9
Kuwait 9
Saudi Arabia 9
Belize 8
Guatemala 7
Belgium 6
Israel 6
Marshall Islands 6
Netherlands 6
Oman 6
Pakistan 6
Panama 6
Philippines 6
Turkey 6
war_on_terror <- c("Afghanistan", "Yemen", "Syria", "Iraq", "Pakistan")

 the_df %<>%
   dplyr::mutate(war_on_terror = ifelse(country %in% war_on_terror, 1, 0)) 

Drone attacks

# drone_wars <- read.csv("C:/Users/Paula/Desktop/drone_war.csv")

# substrRight <- function(x, n){
#   substr(x, nchar(x)-n+1, nchar(x)) }
 
# drone_wars$year <- as.numeric(substrRight(drone_wars$Date..MM.DD.YYYY., 4))
 
# drone_wars %<>% 
#   mutate(Country = ifelse(grepl('Afghanistan', Country), 'Afghanistan', as.character(Country)))

# drone_wars %>%
#   clean_names() %>% 
#   group_by(country) %>%
#   summarise(sum_drone = n()) %>% 
#   arrange(desc(sum_drone)) %>% 
#   ggplot(aes(x = reorder(country, sum_drone),  
#              y = sum_drone, 
#              fill = as.factor(country))) + 
#   geom_bar(stat = "identity") + 
#   coord_flip() + 
#   scale_fill_manual(values = c("#9b2226","#0a9396","#94d2bd","#ee9b00"), 
#                     name = NULL) +
#   theme(axis.text.y = element_text(size = 10),
#         axis.title.y = element_blank(), 
#         legend.position = "bottom") + 
#   xlab("country") +
#   ylab("Total drone strikes") +
#   ggthemes::theme_pander() 
# drone_wars %>%
#   clean_names() %>%
#   group_by(country, year) %>%
#   summarise(sum_drone = n()) -> drone_sum

# drone_sum$cow_code <- countrycode(drone_sum$country, "country.name", "cown")
# 
# the_df <- merge(the_df, drone_sum, by = c("cow_code", "year"), all.x = TRUE)
# the_df$sum_drone[is.na(the_df$sum_drone)] <- 0

# the_df %>% 
#   select(country, 
#          year,
#          sum_drone.x) %>% 
#   arrange(desc(sum_drone))

# the_df %>%
#   mutate(drones_binary = ifelse(sum_drone > 0, 1, 0)) %>% 
#   mutate(drones_binary = as.factor(drones_binary)) %>% 
#   group_by(country.x) %>% 
#   # filter(country.x == "Afghanistan" | country.x  == "Somalia" | country.x  == "Yemen" | country.x  == "Pakistan" ) %>% 
#   ggplot(aes(budget)) +
#   # geom_smooth(method = "lm", aes(color = as.factor(region_6)), se = FALSE) + 
#   geom_histogram() +
#   # scale_shape_manual(values = c(15,16,17,18,19,10),
#   #                    name = NULL) +
#   facet_wrap(~drones_binary) +
#   ggtitle("Drone attacks and PD spending") +
#   ylab("Logged PD budget per capita") +
#   theme(legend.position = "left") + 
#   ggthemes::theme_pander()
the_df %>% 
  group_by(president, cow_code) %>% 
  
  mutate(pres_pd_budget_pc = sum(budget_pc_const, na.rm = TRUE)) %>% 
  mutate(pres_pd_budget = sum(budget_const, na.rm = TRUE)) %>% 
  
  mutate(pres_avg_pd_budget_pc = mean(budget_pc_const, na.rm = TRUE)) %>% 
  mutate(pres_avg_pd_budget = mean(budget_const, na.rm = TRUE)) %>% 
  
  mutate(pres_ppp_budget = sum(ppp_budget, na.rm = TRUE)) %>% 
  mutate(pres_ppp_budget_pc = sum(ppp_budget_pc, na.rm = TRUE)) %>% 
  
  mutate(pres_ppp_budget_const = sum(ppp_budget_const, na.rm = TRUE)) %>% 
  mutate(pres_ppp_budget_pc_const = sum(ppp_budget_pc_const, na.rm = TRUE)) %>% 

  mutate(pres_avg_polity = mean(polity_index, na.rm = TRUE)) %>%
  mutate(pres_avg_elect = mean(electoral_demo, na.rm = TRUE)) %>%

  mutate(pres_avg_gdp = mean(gdp_const, na.rm = TRUE)) %>% 
  mutate(pres_avg_gdp_pc = mean(gdp_pc_const, na.rm = TRUE)) %>% 

  mutate(pres_avg_pop = mean(pop, na.rm = TRUE)) %>%  
  mutate(pres_avg_un_dist = mean(ideal_point_distance, na.rm = TRUE)) %>% 
  
  mutate(pres_avg_pol_rights = mean(pol_right_fh, na.rm = TRUE)) %>% 
  mutate(pres_avg_civ_lib = mean(civ_lib_fh, na.rm = TRUE)) %>%  

  mutate(pres_avg_mil_exp = mean(mil_exp_gdp, na.rm = TRUE)) %>% 
  mutate(pres_avg_trade_dep_us = mean(us_trade_dependence, na.rm = TRUE)) %>%  
  
  mutate(pres_avg_us_exp = mean(us_exports_pc, na.rm = TRUE)) %>%  
  mutate(pres_sum_us_exp = sum(us_exports_pc, na.rm = TRUE)) %>%  

  mutate(pres_avg_us_imp = mean(us_imports_pc, na.rm = TRUE)) %>% 
  mutate(pres_sum_us_imp = sum(us_imports_pc, na.rm = TRUE)) %>% 

  mutate(pres_avg_trade_open = mean(trade_openess, na.rm = TRUE)) %>% 
  mutate(pres_avg_ethno_frac = mean(ethno_frac, na.rm = TRUE)) %>%  
 
  mutate(pres_avg_mus_perc = mean(muslim_percent, na.rm = TRUE)) %>%
  
  mutate(pres_avg_us_troops = mean(troops, na.rm = TRUE)) %>%  
  mutate(pres_sum_us_troops = sum(troops, na.rm = TRUE)) %>%  

  mutate(pres_avg_suicide = mean(sum_suicides, na.rm = TRUE)) %>%  
  mutate(pres_sum_suicide = sum(sum_suicides, na.rm = TRUE)) %>%  

  mutate(pres_avg_cso_repress = mean(cso_repress, na.rm = TRUE)) %>% 
  mutate(pres_avg_mountain = mean(mountainous, na.rm = TRUE))  %>% 
  
  distinct(pres_pd_budget_pc, .keep_all = TRUE) %>% 
  filter(!is.na(president)) %>% 
  select(president, 
         year, 
         country, 
         region_6,
         pres_ppp_budget,
         pres_ppp_budget_pc,
         pres_ppp_budget_const,
         pres_ppp_budget_pc_const,
         pres_avg_pd_budget_pc,
         pres_avg_pd_budget,
         pres_pd_budget_pc,
         pres_pd_budget,
         pres_avg_polity,
         pres_avg_elect,
         pres_avg_us_troops,
         pres_sum_us_troops,
         pres_avg_pol_rights,
         pres_avg_civ_lib,
         pres_avg_gdp,
         pres_avg_gdp_pc,
         pres_avg_pop,
         pres_avg_mil_exp,
         pres_avg_un_dist,
         pres_avg_trade_dep_us,
         pres_avg_us_exp,
         pres_sum_us_exp,
         pres_avg_us_imp,
         pres_sum_us_imp,
         pres_avg_trade_open,
         pres_avg_ethno_frac,
         pres_avg_mus_perc,
         pres_avg_cso_repress,
         pres_avg_mountain,
         defense_pact_us,
         pres_avg_suicide,
         pres_sum_suicide,
         dist_moscow = dist_soto_moscow,
         dist_dc = dist_to_wash_dc,
         dist_beijing = dist_to_beijing)  %>% 
    ungroup() -> pd_pres
pooling_model1 <-lm(log(pres_ppp_budget + 1) ~ 
               log(pres_avg_gdp_pc) +
               log(pres_avg_pop) +
               pres_avg_mus_perc +
               log(pres_avg_us_exp + 1) +
               # pres_avg_un_dist +
               log(pres_sum_suicide + 1) +
               pres_avg_elect +
               # I(pres_avg_elect^2) +
               log(pres_sum_us_troops + 1) +
               # as.factor(region_6) +
               as.factor(president),
               data = pd_pres)


pooling_model2 <-lm(log(pres_ppp_budget_pc + 1) ~ 
               log(pres_avg_gdp_pc) +
               log(pres_avg_pop) +
               pres_avg_mus_perc +
               log(pres_avg_us_exp + 1) +
               # pres_avg_un_dist +
               log(pres_sum_suicide + 1) +
               pres_avg_elect +
               # I(pres_avg_elect^2) +
               log(pres_sum_us_troops + 1) +
               # as.factor(region_6) +
               as.factor(president),
               data = pd_pres)


stargazer(pooling_model1, pooling_model2,
          type = "html")
Dependent variable:
log(pres_ppp_budget + 1) log(pres_ppp_budget_pc + 1)
(1) (2)
log(pres_avg_gdp_pc) -0.210 0.057***
(0.149) (0.018)
log(pres_avg_pop) 0.460*** -0.150***
(0.095) (0.012)
pres_avg_mus_perc 0.910** -0.020
(0.435) (0.053)
log(pres_avg_us_exp + 1) 0.067 0.007
(0.107) (0.013)
log(pres_sum_suicide + 1) 0.068 0.052***
(0.115) (0.014)
pres_avg_elect 1.491** 0.123*
(0.588) (0.072)
log(pres_sum_us_troops + 1) 0.025 0.004
(0.061) (0.007)
as.factor(president)Trump -0.599** -0.180***
(0.238) (0.029)
Constant 9.198*** 2.235***
(1.864) (0.229)
Observations 299 299
R2 0.173 0.557
Adjusted R2 0.150 0.545
Residual Std. Error (df = 290) 2.035 0.250
F Statistic (df = 8; 290) 7.588*** 45.545***
Note: p<0.1; p<0.05; p<0.01
pd_pres %>% 
   filter(pres_avg_un_dist < 2.8) -> high_un
 
pd_pres %>% 
   filter(pres_avg_un_dist >= 2.8) -> low_un



high_pc <-lm(log(pres_ppp_budget_pc + 1) ~ 
               log(pres_avg_gdp_pc) +
               log(pres_avg_pop) +
               pres_avg_mus_perc +
               log(pres_avg_us_exp + 1) +
               # pres_avg_un_dist +
               log(pres_sum_suicide + 1) +
               pres_avg_elect +
                # I(pres_avg_elect^2) +
               log(pres_sum_us_troops + 1) +
               # (region_6) +
               as.factor(president),
               data = high_un)


low_pc <-lm(log(pres_ppp_budget_pc + 1) ~ 
               log(pres_avg_gdp_pc) +
               log(pres_avg_pop) +
               pres_avg_mus_perc +
               log(pres_avg_us_exp + 1) +
               log(pres_sum_suicide + 1) +
               pres_avg_elect +
                # I(pres_avg_elect^2) +
               log(pres_sum_us_troops + 1) +
               # as.factor(region_6) +
               as.factor(president),
               data = low_un)



high_total <-lm(log(pres_ppp_budget + 1) ~ 
               log(pres_avg_gdp_pc) +
               log(pres_avg_pop) +
               pres_avg_mus_perc +
               log(pres_avg_us_exp + 1) +
               # pres_avg_un_dist +
               log(pres_sum_suicide + 1) +
               pres_avg_elect +
                # I(pres_avg_elect^2) +
               log(pres_sum_us_troops + 1) +
               # (region_6) +
               as.factor(president),
               data = high_un)


low_total <-lm(log(pres_ppp_budget + 1) ~ 
               log(pres_avg_gdp_pc) +
               log(pres_avg_pop) +
               pres_avg_mus_perc +
               log(pres_avg_us_exp + 1) +
               log(pres_sum_suicide + 1) +
               pres_avg_elect +
                # I(pres_avg_elect^2) +
               log(pres_sum_us_troops + 1) +
               # as.factor(region_6) +
               as.factor(president),
               data = low_un)


stargazer(high_total, low_total, high_pc, low_pc, 
          # column.labels = c("High_total", "Low_total", "High PC", "Low PC"),
          type = "html")
Dependent variable:
log(pres_ppp_budget + 1) log(pres_ppp_budget_pc + 1)
(1) (2) (3) (4)
log(pres_avg_gdp_pc) 0.023 -0.212 0.088*** 0.066**
(0.100) (0.286) (0.033) (0.029)
log(pres_avg_pop) 0.484*** 0.496*** -0.182*** -0.130***
(0.065) (0.141) (0.022) (0.014)
pres_avg_mus_perc 0.590 1.115* 0.257** -0.099
(0.384) (0.597) (0.128) (0.061)
log(pres_avg_us_exp + 1) -0.135** 0.121 0.023 -0.006
(0.055) (0.193) (0.018) (0.020)
log(pres_sum_suicide + 1) -0.142 0.031 0.018 0.044***
(0.103) (0.161) (0.034) (0.016)
pres_avg_elect -1.177* 2.052** -0.084 0.193**
(0.688) (0.948) (0.229) (0.097)
log(pres_sum_us_troops + 1) 0.018 0.046 -0.005 0.028**
(0.034) (0.107) (0.011) (0.011)
as.factor(president)Trump -0.437*** -0.719* -0.177*** -0.179***
(0.123) (0.376) (0.041) (0.038)
Constant 9.745*** 8.030** 2.559*** 1.798***
(1.180) (3.137) (0.394) (0.320)
Observations 113 185 113 185
R2 0.645 0.156 0.689 0.512
Adjusted R2 0.618 0.118 0.665 0.490
Residual Std. Error 0.644 (df = 104) 2.526 (df = 176) 0.215 (df = 104) 0.257 (df = 176)
F Statistic 23.650*** (df = 8; 104) 4.064*** (df = 8; 176) 28.834*** (df = 8; 104) 23.080*** (df = 8; 176)
Note: p<0.1; p<0.05; p<0.01
dv <- "log(budget + 1)"

ivs <- c("electoral_demo",
         "log(gdp_pc_const)",
         "log(pop)",
         "muslim_percent"
         )

form_1 <- as.formula(paste(dv, paste(ivs, collapse = " + "), sep = " ~ "))

the_df %>% 
   filter(ideal_point_distance < 2.7) -> high_df
 
the_df %>% 
   filter(ideal_point_distance >= 2.7) -> low_df

pooled <- plm(form_1, data = high_df, model = "pooling")

fixed_ind <- plm(form_1, data = high_df, model = "within", effect = "individual")

fixed_time <- plm(form_1, data = high_df, model = "within", effect = "time")

fixed_two <- plm(form_1, data = high_df, model = "within", effect = "twoways")

rand_ind <- plm(form_1, data = high_df, model = "random", effect = "individual")

rand_time <- plm(form_1, data = high_df, model = "random", effect = "time")

rand_two <- plm(form_1, data = high_df, model = "random", effect = "twoways")

Hausman Test

When we run the Hausman test with phtest() command, we see the p-value is is 0.8.

It is not less that 0.05 so we can look at random effects model.

phtest(fixed_time, rand_time)
Hausman Test

data: form_1 chisq = 0.1681, df = 4, p-value = 0.9967 alternative hypothesis: one model is inconsistent

Regression output

stargazer(rand_ind, 
          rand_time, 
          rand_two, 
          column.labels = c(
            # "Fixed Ind", "Fixed Time", "Fixed Two",
                            "Rand Ind", "Rand Time", "Rand Two"), 
          type = "html")
Dependent variable:
log(budget + 1)
Rand Ind Rand Time Rand Two
(1) (2) (3)
electoral_demo 0.909* -0.221 0.163
(0.480) (0.294) (1.460)
log(gdp_pc_const) -0.002 0.052 0.113
(0.072) (0.042) (0.239)
log(pop) 0.479*** 0.479*** 0.468***
(0.049) (0.021) (0.172)
muslim_percent 0.984** 0.558*** 0.909
(0.399) (0.172) (1.408)
Constant 5.881*** 6.260*** 5.501*
(0.913) (0.422) (3.297)
Observations 353 353 353
R2 0.785 0.639 0.559
Adjusted R2 0.783 0.635 0.554
F Statistic 102.985*** 610.171*** 8.258*
Note: p<0.1; p<0.05; p<0.01

Correct for heteroskedasticity with robust standard errors

stargazer(
# coeftest(fixed_ind, vcov = vcovHC, type = "HC1"),
# coeftest(fixed_time, vcov = vcovHC, type = "HC1"),
# coeftest(fixed_two, vcov = vcovHC, type = "HC1"),
coeftest(rand_ind, vcov = vcovHC, type = "HC1"),
coeftest(rand_time, vcov = vcovHC, type = "HC1"),
coeftest(rand_two, vcov = vcovHC, type = "HC1"),
          column.labels = c(
            # "Fixed Ind", "Fixed Time", "Fixed Two",
                            "Rand Ind", "Rand Time", "Rand Two"), 
          type = "html")
Dependent variable:
Rand Ind Rand Time Rand Two
(1) (2) (3)
electoral_demo 0.909 -0.221 0.163
(0.782) (0.670) (0.812)
log(gdp_pc_const) -0.002 0.052 0.113
(0.112) (0.105) (0.115)
log(pop) 0.479*** 0.479*** 0.468***
(0.044) (0.041) (0.044)
muslim_percent 0.984*** 0.558 0.909*
(0.375) (0.455) (0.470)
Constant 5.881*** 6.260*** 5.501***
(1.054) (1.108) (1.049)
Note: p<0.1; p<0.05; p<0.01

Lagrange Multiplier Test

Time effects (Breusch-Pagan)

We look at the Lagrange Multiplier test to see if there are time-effects in the model.

If the p-value < 0.05 then use time-fixed effects.

In our model, the , p-value is far below 0.05 so we can support the alternative hypothesis that there are time effects in the model

plmtest(pooled, c("time"), type=("bp"))
Lagrange Multiplier Test - time effects (Breusch-Pagan) for unbalanced
panels

data: form_1 chisq = 330.26, df = 1, p-value < 2.2e-16 alternative hypothesis: significant effects

Test of individual and/or time effects

We can use the pFtest() to also look at whether we use individual or time effects, based on the comparison of the within and the pooling model.

pFtest(fixed_time, pooled)
F test for time effects

data: form_1 F = 16.092, df1 = 6, df2 = 342, p-value = 2.566e-16 alternative hypothesis: significant effects

stargazer(rand_time, coeftest(rand_time, vcov = vcovHC, type = "HC1"),
          column.labels = c("Random Model (Time Effects) ||", " Rand Time Robust Std. Error"), 
          type = "html")
Dependent variable:
log(budget + 1)
panel coefficient
linear test
Random Model (Time Effects) || Rand Time Robust Std. Error
(1) (2)
electoral_demo -0.221 -0.221
(0.294) (0.670)
log(gdp_pc_const) 0.052 0.052
(0.042) (0.105)
log(pop) 0.479*** 0.479***
(0.021) (0.041)
muslim_percent 0.558*** 0.558
(0.172) (0.455)
Constant 6.260*** 6.260***
(0.422) (1.108)
Observations 353
R2 0.639
Adjusted R2 0.635
F Statistic 610.171***
Note: p<0.1; p<0.05; p<0.01
LS0tDQp0aXRsZTogIlNjYXR0ZXJwbG90cyBhbmQgYmFyY2hhcnRzIg0KYXV0aG9yOiAiUGF1bGEiDQpkYXRlOiAiOC8xOS8yMDIxIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRoZW1lOiBmbGF0bHkNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgdG9jX2RlcHRoOiA1DQogICAgDQotLS0NCg0KYGBge2NzcywgZWNobyA9IEZBTFNFfQ0KDQojIHRib2R5IHRyOm50aC1jaGlsZChvZGQpIHtiYWNrZ3JvdW5kOiAjZWVlO30NCiAgICANCmgxLCBoMiwgaDMge3RleHQtYWxpZ246IGNlbnRlcjt9DQoNCmBgYA0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlID0gRkFMU0V9DQoNCmxpYnJhcnkocGxtKQ0KbGlicmFyeShzdGFyZ2F6ZXIpDQpsaWJyYXJ5KGxtdGVzdCkNCmxpYnJhcnkoc2FuZHdpY2gpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkobWFncml0dHIpDQpsaWJyYXJ5KHdlc2FuZGVyc29uKQ0KbGlicmFyeShjb3VudHJ5Y29kZSkNCmxpYnJhcnkoc2tpbXIpDQpsaWJyYXJ5KHByaWNlUikNCmxpYnJhcnkoa25pdHIpIA0KbGlicmFyeShrYWJsZUV4dHJhKQ0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KHJlc2hhcGUyKQ0KbGlicmFyeShqYW5pdG9yKQ0KbGlicmFyeShybmF0dXJhbGVhcnRoKQ0KbGlicmFyeShzZikNCmxpYnJhcnkocnZlc3QpDQpsaWJyYXJ5KGhhdmVuKQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQpsaWJyYXJ5KGpzb25saXRlKQ0KbGlicmFyeShwcmljZVIpDQpsaWJyYXJ5KGZvcmVpZ24pDQpsaWJyYXJ5KHJlYWR4bCkNCg0KDQp0aGVfZGYgPC0gcmVhZC5jc3YoIkM6L1VzZXJzL1BhdWxhL0Rlc2t0b3AvUERfb3JpZ2luYWxfZGF0YXNldHMvcHJvdG8yLmNzdiIpDQoNCnRoZV9kZiRYLjEgPC0gTlVMTA0KdGhlX2RmJFgxIDwtIE5VTEwNCnRoZV9kZiRYIDwtIE5VTEwNCg0KdGhlX2RmICU8PiUgDQogIG11dGF0ZShjb3VudHJ5ID0gaWZlbHNlKGNvdW50cnkgPT0gIlRyaW5pZGFkIEFuZCBUb2JhZ28iLCAiVHJpbmlkYWQgYW5kIFRvYmFnbyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShjb3VudHJ5ID09ICJCb3NuaWEgQW5kIEhlcnplZ292aW5hIiwgIkJvc25pYSBhbmQgSGVyemVnb3ZpbmEiLCBjb3VudHJ5KSkpICU+JSANCiAgbXV0YXRlKGNvd19jb2RlID0gaWZlbHNlKGNvdW50cnkgPT0gIlRhaXdhbiIsIDcxMywgY293X2NvZGUpKQ0KDQpndGQgPC0gcmVhZC5jc3YoIkM6L1VzZXJzL1BhdWxhL0Rlc2t0b3AvUERfb3JpZ2luYWxfZGF0YXNldHMvZ3RkLmNzdiIpDQoNCnRoZV9kZiRyZWdpb25fNiA8LSByZWNvZGVfZmFjdG9yKHRoZV9kZiRyZWdpb25fNiwgIkFzaWEgYW5kIFBhY2lmaWMiID0gIkFzaWEiLA0KICAgICAgICAgICAgICAgICJMYXRpbiBBbWVyaWNhIENhcmliYmVhbiIgPSAiTGF0aW4iLA0KICAgICAgICAgICAgICAgICJTdWItU2FoYXJhIiA9ICJBZnJpY2EiKQ0KDQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCByZXN1bHRzID0gImFzaXMiLCBvdXQud2lkdGggPSAiNDAwJSIpDQoNCm9wdGlvbnMoa25pdHIudGFibGUuZm9ybWF0ID0gImh0bWwiKSANCmBgYA0KDQoNCmBgYHtyIGFkZF90ZXJyb3Jpc3RfdmFyaWFibGVzLCBlY2hvID0gRkFMU0V9DQoNCmd0ZCRjb3dfY29kZSA8LSBjb3VudHJ5Y29kZShndGQkY291bnRyeV90eHQsICJjb3VudHJ5Lm5hbWUiLCAiY293biIpDQoNCmd0ZCAlPD4lIA0KICAgbXV0YXRlKGNvd19jb2RlID0gaWZlbHNlKGNvdW50cnlfdHh0ID09ICJXZXN0IEJhbmsgYW5kIEdhemEgU3RyaXAiLCA2NjY2LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShjb3VudHJ5X3R4dCA9PSAiU2VyYmlhIiwgMzQ1LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShjb3VudHJ5X3R4dCA9PSAiSG9uZyBLb25nIiwgOTk3LCBjb3dfY29kZSkpKSkNCg0KZ3RkJGNvdW50cnkgPC0gTlVMTA0KDQoNCmd0ZCAlPiUgDQogIGdyb3VwX2J5KGNvd19jb2RlLCBpeWVhcikgJT4lIA0KICBzZWxlY3QoeWVhciA9IGl5ZWFyLCBldmVyeXRoaW5nKCkpICU+JSANCiAgc3VtbWFyaXNlKHN1bV9hdHRhY2tzID0gbigpKSAlPiUgDQogIHVuZ3JvdXAoKSAtPiBndGRfYW5udWFsX3N1bQ0KDQpndGQgJT4lIA0KICBncm91cF9ieShjb3dfY29kZSwgaXllYXIpICU+JSANCiAgc2VsZWN0KHllYXIgPSBpeWVhciwgZXZlcnl0aGluZygpKSAlPiUgDQogIGZpbHRlcihzdWljaWRlID09IDEpICU+JSANCiAgc3VtbWFyaXNlKHN1bV9zdWljaWRlcyA9IG4oKSkgJT4lIA0KICB1bmdyb3VwKCkgLT4gZ3RkX2FubnVhbF9zdWljaWRlDQoNCmd0ZCAlPiUgDQogIGdyb3VwX2J5KGNvd19jb2RlLCBpeWVhcikgJT4lIA0KICBzZWxlY3QoeWVhciA9IGl5ZWFyLCBldmVyeXRoaW5nKCkpICU+JSANCiAgZmlsdGVyKHN1aWNpZGUgPT0gMSkgJT4lIA0KICBzdW1tYXJpc2Uoc3VtX2FsbF95ZWFyX3N1aWNpZGVzID0gbigpKSAlPiUgDQogIHVuZ3JvdXAoKSAtPiBndGRfdG90YWxfc3VpY2lkZQ0KDQpndGQgJT4lIA0KICBncm91cF9ieShjb3dfY29kZSwgaXllYXIsIHJlZ2lvbl90eHQpICU+JSANCiAgc2VsZWN0KHllYXIgPSBpeWVhciwgZXZlcnl0aGluZygpKSAlPiUgDQogIHN1bW1hcmlzZShzdW1fYWxsX3llYXJfYXR0YWNrcyA9IG4oKSkgJT4lIA0KICB1bmdyb3VwKCkgLT4gZ3RkX3RvdGFsX3N1bQ0KDQp0aGVfZGYgPC0gbWVyZ2UodGhlX2RmLCBndGRfYW5udWFsX3N1bSwgYnkgPSBjKCJjb3dfY29kZSIsICJ5ZWFyIiksIGFsbC54ID0gVFJVRSkNCnRoZV9kZiA8LSBtZXJnZSh0aGVfZGYsIGd0ZF9hbm51YWxfc3VpY2lkZSwgYnkgPSBjKCJjb3dfY29kZSIsICJ5ZWFyIiksIGFsbC54ID0gVFJVRSkNCnRoZV9kZiA8LSBtZXJnZSh0aGVfZGYsIGd0ZF90b3RhbF9zdWljaWRlLCBieSA9IGMoImNvd19jb2RlIiwgInllYXIiKSwgYWxsLnggPSBUUlVFKQ0KdGhlX2RmIDwtIG1lcmdlKHRoZV9kZiwgZ3RkX3RvdGFsX3N1bSwgYnkgPSBjKCJjb3dfY29kZSIsICJ5ZWFyIiksIGFsbC54ID0gVFJVRSkNCg0KYGBgDQoNCmBgYHtyIGFkZF9haWliX3ZhcnN9DQoNCmFpaWIgPC0gcmVhZF9kdGEoIkM6L1VzZXJzL1BhdWxhL0Rlc2t0b3AvQUlJQi1Gb3JSZXN1Ym1pc3Npb24uZHRhIikNCg0KYWlpYiAlPD4lIA0KICBzZWxlY3QoY2NvZGUsIGFpaWJtZW1iZXI6YWRibm9ucmVnaW9uYWxtZW1iZXIsIGFzaWFwYWNpZmljLCBjaGluYWFsaWdubWVudCwgdXNtaWxpdGFyeWFsbGlhbmNlKQ0KDQp0aGVfZGYgPC0gbWVyZ2UodGhlX2RmLCBhaWliLCBieS54ID0gYygiY293X2NvZGUiKSwgYnkueSA9IGMoImNjb2RlIiksIGFsbC54ID0gVFJVRSkNCg0KYGBgDQoNCmBgYHtyfQ0KDQpydXNzaWFfZHlhZCA8LSByZWFkLmNzdigiQzovVXNlcnMvUGF1bGEvRGVza3RvcC9QRF9vcmlnaW5hbF9kYXRhc2V0cy9ydXNzaWFfZHlhZC5jc3YiKQ0KcnVzc2lhX2R5YWQkWCA8LSBOVUxMDQoNCnRoZV9kZiA8LSBtZXJnZSh0aGVfZGYsIHJ1c3NpYV9keWFkLCBieSA9IGMoImNvd19jb2RlIiwgInllYXIiKSwgYWxsLnggPSBUUlVFKQ0KDQpzb3ZpZXRfaXJvbl9jdXJ0YWluX3ZlY3RvciA8LSBjKCJBbGJhbmlhIiwgIkJ1bGdhcmlhIiwgIkN6ZWNoIFJlcHVibGljIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb2xhbmQiLCAgIktvc292byIsICAgIlJvbWFuaWEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkh1bmdhcnkiLCAgIlNsb3Zha2lhIiwgICJCb3NuaWEgYW5kIEhlcnplZ292aW5hIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNyb2F0aWEiLCAgIk1hY2Vkb25pYSIsICJNb250ZW5lZ3JvIiwgIlNlcmJpYSIpDQoNCnNvdmlldF9yZXB1YmxpY3NfdmVjdG9yIDwtIGMoIlJ1c3NpYSIsICJMaXRodWFuaWEiLCAiR2VvcmdpYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFc3RvbmlhIiwgIkxhdHZpYSIsICAiVWtyYWluZSIJLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmVsYXJ1cyIsICJNb2xkb3ZhIiwgIkt5cmd5enN0YW4iLAkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlV6YmVraXN0YW4iLCAiVGFqaWtpc3RhbiIsICJBcm1lbmlhIgksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBemVyYmFpamFuIiwgIlR1cmttZW5pc3RhbiIsICJLYXpha2hzdGFuIikNCg0KdGhlX2RmICU8PiUNCiAgZHBseXI6Om11dGF0ZShzb3ZpZXRfaXJvbl9jdXJ0YWluID0gaWZlbHNlKGNvdW50cnkgJWluJSBzb3ZpZXRfaXJvbl9jdXJ0YWluX3ZlY3RvciwgMSwgMCkpIA0KDQp0aGVfZGYgJTw+JQ0KICBkcGx5cjo6bXV0YXRlKHNvdmlldF9yZXB1YmxpY3MgPSBpZmVsc2UoY291bnRyeSAlaW4lIHNvdmlldF9yZXB1YmxpY3NfdmVjdG9yLCAxLCAwKSkgDQoNCnRoZV9kZiAlPD4lIG11dGF0ZShydXNfaW5mbHVlbmNlID0gaWZlbHNlKGNvdW50cnkgPT0gIlJ1c3NpYSIsIDEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGxldmVsX2NvbnRpZ19ydXMgPT0gMSwgMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHNvdmlldF9yZXB1YmxpY3MgPT0gMSwgMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzb3ZpZXRfaXJvbl9jdXJ0YWluID09IDEsIDEsIDApKSkpKQ0KYGBgDQoNCmBgYHtyfQ0KdGhlX2RmICU+JSANCiAgbXV0YXRlKGJ1ZGdldF9wYyA9IGJ1ZGdldCAvIHBvcCwgbmEucm0gPSBUUlVFKSAlPiUNCiAgbXV0YXRlKGV4cG9ydHNfcGMgPSBleHBvcnRzX2JvcCAvIHBvcCwgbmEucm0gPSBUUlVFKSAlPiUgDQogIG11dGF0ZSh0b3RhbF90cmFkZSA9IGV4cG9ydHNfYm9wICsgaW1wb3J0c19ib3AsIG5hLnJtID0gVFJVRSkgJT4lIA0KICBtdXRhdGUodHJhZGVfb3BlbmVzcyA9IHRvdGFsX3RyYWRlIC8gZ2RwX2NvbnN0LCBuYS5ybSA9IFRSVUUpICU+JSANCiAgbXV0YXRlKHVzX3RvdGFsX3RyYWRlID0gdXNfZXhwb3J0c190b19jb3VudHJ5ICsgdXNfaW1wb3J0c19mcm9tX2NvdW50cnksIG5hLnJtID0gVFJVRSkgJT4lIA0KICBtdXRhdGUodXNfdHJhZGVfZGVwZW5kZW5jZSA9IHVzX3RvdGFsX3RyYWRlIC8gYmFsYW5jZV90cmFkZSwgbmEucm0gPSBUUlVFKSAlPiUgDQogIG11dGF0ZSh1c19leHBvcnRzX3BjID0gdXNfZXhwb3J0c190b19jb3VudHJ5IC8gcG9wLCBuYS5ybSA9IFRSVUUpICU+JSANCiAgbXV0YXRlKG11c2xpbV9wZXJjZW50ID0gcGVyY2VudF9tdXNsaW1faml0dGVyIC8gcG9wLCBuYS5ybSA9IFRSVUUpICU+JSANCiAgbXV0YXRlKHVzX2ltcG9ydHNfcGMgPSB1c19pbXBvcnRzX2Zyb21fY291bnRyeSAvIHBvcCwgbmEucm0gPSBUUlVFKSAtPiB0aGVfZGYNCg0KYGBgDQoNCiMgQ29zdCBvZiBsaXZpbmcgcmFua2luZw0KDQpUaGUgbWFpbiBwcm9ibGVtIA0KDQpTb3VyY2U6ICAiaHR0cHM6Ly93d3cubnVtYmVvLmNvbS9jb3N0LW9mLWxpdmluZy9yYW5raW5nc19ieV9jb3VudHJ5LmpzcD90aXRsZT0yMDE5Ig0KDQpgYGB7cn0NCg0KDQp1cmwgPC0gImh0dHBzOi8vd3d3Lm51bWJlby5jb20vY29zdC1vZi1saXZpbmcvcmFua2luZ3NfYnlfY291bnRyeS5qc3A/dGl0bGU9MjAxOSINCg0KIyBDb3VudHJpZXMgd2l0aCBubyBJTkRFWA0KY29sX3VybCA8LSByZWFkX2h0bWwodXJsKQ0KY29sX3RhYmxlIDwtIGNvbF91cmwgJT4lIGh0bWxfdGFibGUoaGVhZGVyID0gVFJVRSwgZmlsbCA9IFRSVUUpDQpjb2xfMTkgPC0gY29sX3RhYmxlW1syXV0NCg0KY29sXzE5JHllYXIgPC0gcmVwbGljYXRlKDExOSwgMjAxOSkNCmNvbF8xOSRyYW5rIDwtIE5VTEwNCmNvbF8xOSAlPD4lIA0KICBjbGVhbl9uYW1lcygpDQoNCmNvbF8xOSRjb3dfY29kZSA8LSBjb3VudHJ5Y29kZShjb2xfMTkkY291bnRyeSwgImNvdW50cnkubmFtZSIsICJjb3duIikNCg0KY29sXzE5ICU8PiUgZHBseXI6Om11dGF0ZShjb3dfY29kZSA9IGlmZWxzZShjb3VudHJ5ID09ICJQYWxlc3RpbmUiLCA2NjY2LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoY291bnRyeSA9PSAiU2VyYmlhIiwgMzQ1LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShjb3VudHJ5ID09ICJIb25nIEtvbmciLCA5OTcsIGNvd19jb2RlKSkpKQ0KDQpuYW1lcyhjb2xfMTkpDQpjb2xfMTkgJT4lIA0KICBhcnJhbmdlKGRlc2MoY29zdF9vZl9saXZpbmdfaW5kZXgpKSAlPiUgDQogIHNlbGVjdChjb3VudHJ5LCBjb3N0X29mX2xpdmluZyA9IGNvc3Rfb2ZfbGl2aW5nX2luZGV4KSAlPiUgDQogIGhlYWQoKSAlPiUgDQogIGtibCgpICU+JQ0KICBrYWJsZV9wYXBlcigic3RyaXBlZCIsDQogICAgICAgICAgICAgIGZ1bGxfd2lkdGggPSBGKQ0KDQpjb2xfMTkgJT4lIA0KICBhcnJhbmdlKGRlc2MoY29zdF9vZl9saXZpbmdfaW5kZXgpKSAlPiUgDQogIHNlbGVjdChjb3VudHJ5LCBjb3N0X29mX2xpdmluZyA9IGNvc3Rfb2ZfbGl2aW5nX2luZGV4KSAlPiUgDQogIHRhaWwoKSAlPiUgDQogIGtibCgpICU+JQ0KICBrYWJsZV9wYXBlcigic3RyaXBlZCIsDQogICAgICAgICAgICAgIGZ1bGxfd2lkdGggPSBGKQ0KDQpgYGANCg0KYGBge3IsIGVjaG8gLSBGQUxTRX0NCg0KIyBkZl8xOSAlPiUgDQojICAgZ3JvdXBfYnkoY291bnRyeSkgJT4lIA0KIyAgIG11dGF0ZShwcHBfYnVkZ2V0ID0gYnVkZ2V0ICogcHBwKSAlPiUgDQojICAgc2VsZWN0KGNvdW50cnksIHBwcF9idWRnZXQpICU+JSANCiMgICBhcnJhbmdlKGRlc2MocHBwX2J1ZGdldCkpIC0+IHRhYmxlM19tdWx0DQojIA0KIyBkZl8xOSAlPiUgDQojICAgZ3JvdXBfYnkoY291bnRyeSkgJT4lIA0KIyAgIG11dGF0ZShwcHBfYnVkZ2V0ID0gYnVkZ2V0ICogcHBwKSAlPiUgDQojICAgc2VsZWN0KGNvdW50cnksIHJhd19idWRnZXQgPSBidWRnZXQpICU+JSANCiMgICBhcnJhbmdlKGRlc2MocmF3X2J1ZGdldCkpIC0+IHRhYmxlNF9tdWx0DQoNCiMga2JsKGxpc3QodGFibGUzX211bHQsIHRhYmxlNF9tdWx0KSwgZGlnaXRzID0gMCwgDQojICAgICBjYXB0aW9uID0gIkFycmFuZ2VkIEJ5IFBQUCBBZGp1c3RlZCBCdWRnZXQgTEVGVCBhbmQgQnkgUFBQIFJhdyBCdWRnZXQgUklHSFQiKSAlPiUNCiMgICAgIGthYmxlX3BhcGVyKCJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IFQpIA0KDQpgYGANCg0KIyBBZGp1c3QgdG8gMjAxOSBwcmljZXMNCg0KDQpgYGB7cn0NCg0KY291bnRyeSA8LSAiVW5pdGVkIFN0YXRlcyINCmNvdW50cmllc19kYXRhZnJhbWUgPC0gc2hvd19jb3VudHJpZXMoKQ0KaW5mbGF0aW9uX2RhdGFmcmFtZSA8LSByZXRyaWV2ZV9pbmZsYXRpb25fZGF0YShjb3VudHJ5LCBjb3VudHJpZXNfZGF0YWZyYW1lKQ0KDQojIFByb3ZpZGUgYSBXb3JsZCBCYW5rIEFQSSBVUkwgYW5kIHVybF9hbGxfcmVzdWx0cyB3aWxsIGNvbnZlcnQgaXQgaW50byBvbmUgd2l0aCBhbGwgcmVzdWx0cyBmb3IgdGhhdCBpbmRpY2F0b3INCm9yaWdpbmFsX3VybCA8LSAiaHR0cDovL2FwaS53b3JsZGJhbmsub3JnL3YyL2NvdW50cnkiIA0KDQojICJodHRwOi8vYXBpLndvcmxkYmFuay5vcmcvdjIvY291bnRyeT9mb3JtYXQ9anNvbiZwZXJfcGFnZT0zMDQiDQp1cmxfYWxsX3Jlc3VsdHMob3JpZ2luYWxfdXJsKQ0KDQp0aGVfZGYkYnVkZ2V0X2NvbnN0IDwtIGFkanVzdF9mb3JfaW5mbGF0aW9uKHRoZV9kZiRidWRnZXQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlX2RmJHllYXIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRyeSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b19kYXRlID0gMjAxOSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZmxhdGlvbl9kYXRhZnJhbWUgPSBpbmZsYXRpb25fZGF0YWZyYW1lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRyaWVzX2RhdGFmcmFtZSA9IGNvdW50cmllc19kYXRhZnJhbWUpDQoNCnRoZV9kZiRidWRnZXRfcGNfY29uc3QgPC0gYWRqdXN0X2Zvcl9pbmZsYXRpb24odGhlX2RmJGJ1ZGdldF9wYywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlX2RmJHllYXIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRyeSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b19kYXRlID0gMjAxOSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZmxhdGlvbl9kYXRhZnJhbWUgPSBpbmZsYXRpb25fZGF0YWZyYW1lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRyaWVzX2RhdGFmcmFtZSA9IGNvdW50cmllc19kYXRhZnJhbWUpDQoNCmBgYA0KDQoNCiMgUHJpY2UgbGV2ZWwgcmF0aW8NCiANClNvdXJjZTogaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1BBLk5VUy5QUFBDLlJGDQoNClByaWNlIGxldmVsIHJhdGlvIGlzIHRoZSByYXRpbyBvZiBhIHB1cmNoYXNpbmcgcG93ZXIgcGFyaXR5IChQUFApIGNvbnZlcnNpb24gZmFjdG9yIHRvIGFuIGV4Y2hhbmdlIHJhdGUuIEl0IHByb3ZpZGVzIGEgbWVhc3VyZSBvZiB0aGUgZGlmZmVyZW5jZXMgaW4gcHJpY2UgbGV2ZWxzIGJldHdlZW4gY291bnRyaWVzIGJ5IGluZGljYXRpbmcgdGhlIG51bWJlciBvZiB1bml0cyBvZiB0aGUgY29tbW9uIGN1cnJlbmN5IG5lZWRlZCB0byBidXkgdGhlIHNhbWUgdm9sdW1lIG9mIHRoZSBhZ2dyZWdhdGlvbiBsZXZlbCBpbiBlYWNoIGNvdW50cnkuDQoNCkluZGljYXRvciBzb3VyY2U6IA0KSW50ZXJuYXRpb25hbCBDb21wYXJpc29uIFByb2dyYW0sIFdvcmxkIEJhbmsNCg0KDQpgYGB7cn0NCg0KbGlicmFyeShXREkpDQpwcHAgPSBXREkoaW5kaWNhdG9yPSdQQS5OVVMuUFBQQy5SRicsIGNvdW50cnk9ImFsbCIsIHN0YXJ0PTIwMTMsIGVuZD0yMDE5KQ0KcHBwJHBwcCA8LSBwcHAkUEEuTlVTLlBQUEMuUkYNCnBwcCRQQS5OVVMuUFBQQy5SRiA8LSBOVUxMDQoNCnBwcCRjb3dfY29kZSA8LSBjb3VudHJ5Y29kZShwcHAkaXNvMmMsICJpc28yYyIsICJjb3duIikNCg0KcHBwICU8PiUgDQpkcGx5cjo6bXV0YXRlKGNvd19jb2RlID0gaWZlbHNlKGNvdW50cnkgPT0gIldlc3QgQmFuayBhbmQgR2F6YSIsIDY2NjYsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoY291bnRyeSA9PSAiU2VyYmlhIiwgMzQ1LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShjb3VudHJ5ID09ICJIb25nIEtvbmcgU0FSLCBDaGluYSIsIDk5NywgY293X2NvZGUpKSkpDQoNCnBwcCRjb3VudHJ5IDwtIE5VTEwNCg0KdGhlX2RmIDwtIG1lcmdlKHRoZV9kZiwgcHBwLCBieSA9IGMoImNvd19jb2RlIiwgInllYXIiKSwgYWxsLnggPSBUUlVFKQ0KDQp0aGVfZGYgJTw+JSAgDQogIG11dGF0ZShwcHBfYnVkZ2V0ID0gYnVkZ2V0IC8gcHBwLCBuYS5ybSA9IFRSVUUpICU+JSANCiAgbXV0YXRlKHBwcF9idWRnZXRfcGMgPSBidWRnZXRfcGMgKiBwcHAsIG5hLnJtID0gVFJVRSkgJT4lIA0KICBtdXRhdGUocHBwX2J1ZGdldF9jb25zdCA9IGJ1ZGdldF9jb25zdCAvIHBwcCwgbmEucm0gPSBUUlVFKSAlPiUgDQogIG11dGF0ZShwcHBfYnVkZ2V0X3BjX2NvbnN0ID0gYnVkZ2V0X3BjX2NvbnN0ICogcHBwLCBuYS5ybSA9IFRSVUUpICU+JSANCiAgc2VsZWN0KHBwcF9idWRnZXQsIHBwcF9idWRnZXRfcGMsIHBwcF9idWRnZXRfY29uc3QsIHBwcF9idWRnZXRfcGNfY29uc3QsIGV2ZXJ5dGhpbmcoKSkNCg0KYGBgDQoNCg0KYGBge3J9DQoNCnRoZV9kZiAlPiUNCiAgZmlsdGVyKHllYXIgPT0gMjAxNCkgJT4lIA0KICBmaWx0ZXIoY291bnRyeSAhPSAiS29zb3ZvIikgJT4lIA0KICBmaWx0ZXIoY291bnRyeSAhPSAiQ3VyYWNhbyIpICU+JSANCiAgZmlsdGVyKGNvdW50cnkgIT0gIlZhdGljYW4gQ2l0eSIpICU+JQ0KICBzZWxlY3QoY291bnRyeSwgcHBwX2J1ZGdldCkgJT4lDQogIGFycmFuZ2UoZGVzYyhwcHBfYnVkZ2V0KSkgLT50MQ0KDQp0aGVfZGYgJT4lDQogIGZpbHRlcihjb3VudHJ5ICE9ICJLb3Nvdm8iKSAlPiUgDQogIGZpbHRlcihjb3VudHJ5ICE9ICJDdXJhY2FvIikgJT4lIA0KICBmaWx0ZXIoY291bnRyeSAhPSAiVmF0aWNhbiBDaXR5IikgJT4lDQogIGZpbHRlcih5ZWFyID09IDIwMTQpICU+JSANCiAgc2VsZWN0KGNvdW50cnksIHBwcF9idWRnZXRfcGMpICU+JQ0KICBhcnJhbmdlKGRlc2MocHBwX2J1ZGdldF9wYykpIC0+IHQyDQoNCnRoZV9kZiAlPiUNCiAgZmlsdGVyKGNvdW50cnkgIT0gIktvc292byIpICU+JQ0KICBmaWx0ZXIoY291bnRyeSAhPSAiQ3VyYWNhbyIpICU+JSANCiAgZmlsdGVyKGNvdW50cnkgIT0gIlZhdGljYW4gQ2l0eSIpICU+JSANCiAgZmlsdGVyKHllYXIgPT0gMjAxNCkgJT4lIA0KICBzZWxlY3QoY291bnRyeSwgcHBwX2J1ZGdldF9jb25zdCkgJT4lDQogIGFycmFuZ2UoZGVzYyhwcHBfYnVkZ2V0X2NvbnN0KSkgLT4gdDMNCg0KdGhlX2RmICU+JQ0KICBmaWx0ZXIoY291bnRyeSAhPSAiS29zb3ZvIikgJT4lIA0KICBmaWx0ZXIoY291bnRyeSAhPSAiQ3VyYWNhbyIpICU+JSANCiAgZmlsdGVyKGNvdW50cnkgIT0gIlZhdGljYW4gQ2l0eSIpICU+JQ0KICBmaWx0ZXIoeWVhciA9PSAyMDE0KSAlPiUgDQogIHNlbGVjdChjb3VudHJ5LCBwcHBfYnVkZ2V0X3BjX2NvbnN0KSAlPiUNCiAgYXJyYW5nZShkZXNjKHBwcF9idWRnZXRfcGNfY29uc3QpKSAtPiB0NA0KDQp0aGVfZGYgJT4lDQogIGZpbHRlcihjb3VudHJ5ICE9ICJLb3Nvdm8iKSAlPiUgDQogIGZpbHRlcihjb3VudHJ5ICE9ICJDdXJhY2FvIikgJT4lIA0KICBmaWx0ZXIoY291bnRyeSAhPSAiVmF0aWNhbiBDaXR5IikgJT4lDQogIGZpbHRlcih5ZWFyID09IDIwMTQpICU+JSANCiAgc2VsZWN0KGNvdW50cnksIGJ1ZGdldCkgJT4lDQogIGFycmFuZ2UoZGVzYyhidWRnZXQpKSAtPiB0MA0KDQp0aGVfZGYgJT4lDQogIGZpbHRlcihjb3VudHJ5ICE9ICJLb3Nvdm8iKSAlPiUgDQogIGZpbHRlcihjb3VudHJ5ICE9ICJDdXJhY2FvIikgJT4lIA0KICBmaWx0ZXIoY291bnRyeSAhPSAiVmF0aWNhbiBDaXR5IikgJT4lDQogIGZpbHRlcih5ZWFyID09IDIwMTQpICU+JSANCiAgc2VsZWN0KGNvdW50cnksIGJ1ZGdldF9wYykgJT4lDQogIGFycmFuZ2UoZGVzYyhidWRnZXRfcGMpKSAtPiB0cGMNCg0Ka2JsKGxpc3QodDAsIHQxLCAgdDMsIHRwYywgdDIsIHQ0KSwgZGlnaXRzID0gNCkgJT4lIA0KICAgICBrYWJsZV9wYXBlcigic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGQUxTRSkgDQoNCmBgYA0KDQpgYGB7cn0NCg0KbGlicmFyeSh0cm9vcGRhdGEpDQoNCnRyb29wc191cyA8LSBnZXRfdHJvb3BkYXRhKHN0YXJ0eWVhciA9IDIwMTMsIGVuZHllYXIgPSAyMDIwKQ0KDQp0aGVfZGYgPC0gbWVyZ2UodGhlX2RmLCB0cm9vcHNfdXMsIGJ5LnggPSBjKCJjb3dfY29kZSIsICJ5ZWFyIiksIGJ5LnkgPSBjKCJjY29kZSIsICJ5ZWFyIiksIGFsbC54ID0gVFJVRSkNCg0KYGBgDQoNCg0KDQpgYGB7cn0NCg0KdXNfYmFzZV9kZiA8LXJlYWQuY3N2KCJDOi9Vc2Vycy9QYXVsYS9EZXNrdG9wL1BEX29yaWdpbmFsX2RhdGFzZXRzL0Jhc2VzLmNzdiIpIA0KICANCnVzX2Jhc2VfZGYgJT4lIA0KICBmaWx0ZXIoYmFzZSA9PSAxKSAlPiUNCiAgZ3JvdXBfYnkoQ291bnRyeS5OYW1lKSAlPiUgDQogIGNvdW50KCkgJT4lIA0KICBhcnJhbmdlKGRlc2MobikpICU+JSANCiAgZmlsdGVyKG4gPiAyKSAlPiUgDQogIGtibCgpICU+JQ0KICBrYWJsZV9wYXBlcigic3RyaXBlZCIsDQogICAgICAgICAgICAgIGZ1bGxfd2lkdGggPSBGKQ0KDQogIHVzX2Jhc2VfZGYgJT4lIA0KICBmaWx0ZXIobGlseXBhZCA9PSAxKSAlPiUNCiAgZ3JvdXBfYnkoQ291bnRyeS5OYW1lKSAlPiUgDQogIGNvdW50KCkgJT4lIA0KICBhcnJhbmdlKGRlc2MobikpICU+JSANCiAgZmlsdGVyKG4gPiAyKSAlPiUgDQogIGtibCgpICU+JQ0KICBrYWJsZV9wYXBlcigic3RyaXBlZCIsDQogICAgICAgICAgICAgIGZ1bGxfd2lkdGggPSBGKQ0KDQp1c19iYXNlX2RmICU+JSANCiAgZ3JvdXBfYnkoQ291bnRyeS5OYW1lKSAlPiUgDQogIGNvdW50KCkgJT4lIA0KICBhcnJhbmdlKGRlc2MobikpICU+JSANCiAgZmlsdGVyKG4gPiA1KSAlPiUgDQogIGtibCgpICU+JQ0KICBrYWJsZV9wYXBlcigic3RyaXBlZCIsDQogICAgICAgICAgICAgIGZ1bGxfd2lkdGggPSBGKQ0KICANCiANCndhcl9vbl90ZXJyb3IgPC0gYygiQWZnaGFuaXN0YW4iLCAiWWVtZW4iLCAiU3lyaWEiLCAiSXJhcSIsICJQYWtpc3RhbiIpDQoNCiB0aGVfZGYgJTw+JQ0KICAgZHBseXI6Om11dGF0ZSh3YXJfb25fdGVycm9yID0gaWZlbHNlKGNvdW50cnkgJWluJSB3YXJfb25fdGVycm9yLCAxLCAwKSkgDQoNCiAgDQpgYGANCg0KDQojIERyb25lIGF0dGFja3MNCg0KYGBge3J9DQogDQojIGRyb25lX3dhcnMgPC0gcmVhZC5jc3YoIkM6L1VzZXJzL1BhdWxhL0Rlc2t0b3AvZHJvbmVfd2FyLmNzdiIpDQoNCiMgc3Vic3RyUmlnaHQgPC0gZnVuY3Rpb24oeCwgbil7DQojICAgc3Vic3RyKHgsIG5jaGFyKHgpLW4rMSwgbmNoYXIoeCkpIH0NCiANCiMgZHJvbmVfd2FycyR5ZWFyIDwtIGFzLm51bWVyaWMoc3Vic3RyUmlnaHQoZHJvbmVfd2FycyREYXRlLi5NTS5ERC5ZWVlZLiwgNCkpDQogDQojIGRyb25lX3dhcnMgJTw+JSANCiMgICBtdXRhdGUoQ291bnRyeSA9IGlmZWxzZShncmVwbCgnQWZnaGFuaXN0YW4nLCBDb3VudHJ5KSwgJ0FmZ2hhbmlzdGFuJywgYXMuY2hhcmFjdGVyKENvdW50cnkpKSkNCg0KIyBkcm9uZV93YXJzICU+JQ0KIyAgIGNsZWFuX25hbWVzKCkgJT4lIA0KIyAgIGdyb3VwX2J5KGNvdW50cnkpICU+JQ0KIyAgIHN1bW1hcmlzZShzdW1fZHJvbmUgPSBuKCkpICU+JSANCiMgICBhcnJhbmdlKGRlc2Moc3VtX2Ryb25lKSkgJT4lIA0KIyAgIGdncGxvdChhZXMoeCA9IHJlb3JkZXIoY291bnRyeSwgc3VtX2Ryb25lKSwgIA0KIyAgICAgICAgICAgICAgeSA9IHN1bV9kcm9uZSwgDQojICAgICAgICAgICAgICBmaWxsID0gYXMuZmFjdG9yKGNvdW50cnkpKSkgKyANCiMgICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKyANCiMgICBjb29yZF9mbGlwKCkgKyANCiMgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjOWIyMjI2IiwiIzBhOTM5NiIsIiM5NGQyYmQiLCIjZWU5YjAwIiksIA0KIyAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBOVUxMKSArDQojICAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiMgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksIA0KIyAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArIA0KIyAgIHhsYWIoImNvdW50cnkiKSArDQojICAgeWxhYigiVG90YWwgZHJvbmUgc3RyaWtlcyIpICsNCiMgICBnZ3RoZW1lczo6dGhlbWVfcGFuZGVyKCkgDQoNCmBgYA0KDQpgYGB7cn0NCg0KIyBkcm9uZV93YXJzICU+JQ0KIyAgIGNsZWFuX25hbWVzKCkgJT4lDQojICAgZ3JvdXBfYnkoY291bnRyeSwgeWVhcikgJT4lDQojICAgc3VtbWFyaXNlKHN1bV9kcm9uZSA9IG4oKSkgLT4gZHJvbmVfc3VtDQoNCiMgZHJvbmVfc3VtJGNvd19jb2RlIDwtIGNvdW50cnljb2RlKGRyb25lX3N1bSRjb3VudHJ5LCAiY291bnRyeS5uYW1lIiwgImNvd24iKQ0KIyANCiMgdGhlX2RmIDwtIG1lcmdlKHRoZV9kZiwgZHJvbmVfc3VtLCBieSA9IGMoImNvd19jb2RlIiwgInllYXIiKSwgYWxsLnggPSBUUlVFKQ0KIyB0aGVfZGYkc3VtX2Ryb25lW2lzLm5hKHRoZV9kZiRzdW1fZHJvbmUpXSA8LSAwDQoNCiMgdGhlX2RmICU+JSANCiMgICBzZWxlY3QoY291bnRyeSwgDQojICAgICAgICAgIHllYXIsDQojICAgICAgICAgIHN1bV9kcm9uZS54KSAlPiUgDQojICAgYXJyYW5nZShkZXNjKHN1bV9kcm9uZSkpDQoNCiMgdGhlX2RmICU+JQ0KIyAgIG11dGF0ZShkcm9uZXNfYmluYXJ5ID0gaWZlbHNlKHN1bV9kcm9uZSA+IDAsIDEsIDApKSAlPiUgDQojICAgbXV0YXRlKGRyb25lc19iaW5hcnkgPSBhcy5mYWN0b3IoZHJvbmVzX2JpbmFyeSkpICU+JSANCiMgICBncm91cF9ieShjb3VudHJ5LngpICU+JSANCiMgICAjIGZpbHRlcihjb3VudHJ5LnggPT0gIkFmZ2hhbmlzdGFuIiB8IGNvdW50cnkueCAgPT0gIlNvbWFsaWEiIHwgY291bnRyeS54ICA9PSAiWWVtZW4iIHwgY291bnRyeS54ICA9PSAiUGFraXN0YW4iICkgJT4lIA0KIyAgIGdncGxvdChhZXMoYnVkZ2V0KSkgKw0KIyAgICMgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgYWVzKGNvbG9yID0gYXMuZmFjdG9yKHJlZ2lvbl82KSksIHNlID0gRkFMU0UpICsgDQojICAgZ2VvbV9oaXN0b2dyYW0oKSArDQojICAgIyBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxNSwxNiwxNywxOCwxOSwxMCksDQojICAgIyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IE5VTEwpICsNCiMgICBmYWNldF93cmFwKH5kcm9uZXNfYmluYXJ5KSArDQojICAgZ2d0aXRsZSgiRHJvbmUgYXR0YWNrcyBhbmQgUEQgc3BlbmRpbmciKSArDQojICAgeWxhYigiTG9nZ2VkIFBEIGJ1ZGdldCBwZXIgY2FwaXRhIikgKw0KIyAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJsZWZ0IikgKyANCiMgICBnZ3RoZW1lczo6dGhlbWVfcGFuZGVyKCkNCg0KYGBgDQoNCg0KYGBge3J9DQoNCnRoZV9kZiAlPiUgDQogIGdyb3VwX2J5KHByZXNpZGVudCwgY293X2NvZGUpICU+JSANCiAgDQogIG11dGF0ZShwcmVzX3BkX2J1ZGdldF9wYyA9IHN1bShidWRnZXRfcGNfY29uc3QsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgbXV0YXRlKHByZXNfcGRfYnVkZ2V0ID0gc3VtKGJ1ZGdldF9jb25zdCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICANCiAgbXV0YXRlKHByZXNfYXZnX3BkX2J1ZGdldF9wYyA9IG1lYW4oYnVkZ2V0X3BjX2NvbnN0LCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIG11dGF0ZShwcmVzX2F2Z19wZF9idWRnZXQgPSBtZWFuKGJ1ZGdldF9jb25zdCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICANCiAgbXV0YXRlKHByZXNfcHBwX2J1ZGdldCA9IHN1bShwcHBfYnVkZ2V0LCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIG11dGF0ZShwcmVzX3BwcF9idWRnZXRfcGMgPSBzdW0ocHBwX2J1ZGdldF9wYywgbmEucm0gPSBUUlVFKSkgJT4lIA0KICANCiAgbXV0YXRlKHByZXNfcHBwX2J1ZGdldF9jb25zdCA9IHN1bShwcHBfYnVkZ2V0X2NvbnN0LCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIG11dGF0ZShwcmVzX3BwcF9idWRnZXRfcGNfY29uc3QgPSBzdW0ocHBwX2J1ZGdldF9wY19jb25zdCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KDQogIG11dGF0ZShwcmVzX2F2Z19wb2xpdHkgPSBtZWFuKHBvbGl0eV9pbmRleCwgbmEucm0gPSBUUlVFKSkgJT4lDQogIG11dGF0ZShwcmVzX2F2Z19lbGVjdCA9IG1lYW4oZWxlY3RvcmFsX2RlbW8sIG5hLnJtID0gVFJVRSkpICU+JQ0KDQogIG11dGF0ZShwcmVzX2F2Z19nZHAgPSBtZWFuKGdkcF9jb25zdCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBtdXRhdGUocHJlc19hdmdfZ2RwX3BjID0gbWVhbihnZHBfcGNfY29uc3QsIG5hLnJtID0gVFJVRSkpICU+JSANCg0KICBtdXRhdGUocHJlc19hdmdfcG9wID0gbWVhbihwb3AsIG5hLnJtID0gVFJVRSkpICU+JSAgDQogIG11dGF0ZShwcmVzX2F2Z191bl9kaXN0ID0gbWVhbihpZGVhbF9wb2ludF9kaXN0YW5jZSwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICANCiAgbXV0YXRlKHByZXNfYXZnX3BvbF9yaWdodHMgPSBtZWFuKHBvbF9yaWdodF9maCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBtdXRhdGUocHJlc19hdmdfY2l2X2xpYiA9IG1lYW4oY2l2X2xpYl9maCwgbmEucm0gPSBUUlVFKSkgJT4lICANCg0KICBtdXRhdGUocHJlc19hdmdfbWlsX2V4cCA9IG1lYW4obWlsX2V4cF9nZHAsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgbXV0YXRlKHByZXNfYXZnX3RyYWRlX2RlcF91cyA9IG1lYW4odXNfdHJhZGVfZGVwZW5kZW5jZSwgbmEucm0gPSBUUlVFKSkgJT4lICANCiAgDQogIG11dGF0ZShwcmVzX2F2Z191c19leHAgPSBtZWFuKHVzX2V4cG9ydHNfcGMsIG5hLnJtID0gVFJVRSkpICU+JSAgDQogIG11dGF0ZShwcmVzX3N1bV91c19leHAgPSBzdW0odXNfZXhwb3J0c19wYywgbmEucm0gPSBUUlVFKSkgJT4lICANCg0KICBtdXRhdGUocHJlc19hdmdfdXNfaW1wID0gbWVhbih1c19pbXBvcnRzX3BjLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIG11dGF0ZShwcmVzX3N1bV91c19pbXAgPSBzdW0odXNfaW1wb3J0c19wYywgbmEucm0gPSBUUlVFKSkgJT4lIA0KDQogIG11dGF0ZShwcmVzX2F2Z190cmFkZV9vcGVuID0gbWVhbih0cmFkZV9vcGVuZXNzLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIG11dGF0ZShwcmVzX2F2Z19ldGhub19mcmFjID0gbWVhbihldGhub19mcmFjLCBuYS5ybSA9IFRSVUUpKSAlPiUgIA0KIA0KICBtdXRhdGUocHJlc19hdmdfbXVzX3BlcmMgPSBtZWFuKG11c2xpbV9wZXJjZW50LCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgDQogIG11dGF0ZShwcmVzX2F2Z191c190cm9vcHMgPSBtZWFuKHRyb29wcywgbmEucm0gPSBUUlVFKSkgJT4lICANCiAgbXV0YXRlKHByZXNfc3VtX3VzX3Ryb29wcyA9IHN1bSh0cm9vcHMsIG5hLnJtID0gVFJVRSkpICU+JSAgDQoNCiAgbXV0YXRlKHByZXNfYXZnX3N1aWNpZGUgPSBtZWFuKHN1bV9zdWljaWRlcywgbmEucm0gPSBUUlVFKSkgJT4lICANCiAgbXV0YXRlKHByZXNfc3VtX3N1aWNpZGUgPSBzdW0oc3VtX3N1aWNpZGVzLCBuYS5ybSA9IFRSVUUpKSAlPiUgIA0KDQogIG11dGF0ZShwcmVzX2F2Z19jc29fcmVwcmVzcyA9IG1lYW4oY3NvX3JlcHJlc3MsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgbXV0YXRlKHByZXNfYXZnX21vdW50YWluID0gbWVhbihtb3VudGFpbm91cywgbmEucm0gPSBUUlVFKSkgICU+JSANCiAgDQogIGRpc3RpbmN0KHByZXNfcGRfYnVkZ2V0X3BjLCAua2VlcF9hbGwgPSBUUlVFKSAlPiUgDQogIGZpbHRlcighaXMubmEocHJlc2lkZW50KSkgJT4lIA0KICBzZWxlY3QocHJlc2lkZW50LCANCiAgICAgICAgIHllYXIsIA0KICAgICAgICAgY291bnRyeSwgDQogICAgICAgICByZWdpb25fNiwNCiAgICAgICAgIHByZXNfcHBwX2J1ZGdldCwNCiAgICAgICAgIHByZXNfcHBwX2J1ZGdldF9wYywNCiAgICAgICAgIHByZXNfcHBwX2J1ZGdldF9jb25zdCwNCiAgICAgICAgIHByZXNfcHBwX2J1ZGdldF9wY19jb25zdCwNCiAgICAgICAgIHByZXNfYXZnX3BkX2J1ZGdldF9wYywNCiAgICAgICAgIHByZXNfYXZnX3BkX2J1ZGdldCwNCiAgICAgICAgIHByZXNfcGRfYnVkZ2V0X3BjLA0KICAgICAgICAgcHJlc19wZF9idWRnZXQsDQogICAgICAgICBwcmVzX2F2Z19wb2xpdHksDQogICAgICAgICBwcmVzX2F2Z19lbGVjdCwNCiAgICAgICAgIHByZXNfYXZnX3VzX3Ryb29wcywNCiAgICAgICAgIHByZXNfc3VtX3VzX3Ryb29wcywNCiAgICAgICAgIHByZXNfYXZnX3BvbF9yaWdodHMsDQogICAgICAgICBwcmVzX2F2Z19jaXZfbGliLA0KICAgICAgICAgcHJlc19hdmdfZ2RwLA0KICAgICAgICAgcHJlc19hdmdfZ2RwX3BjLA0KICAgICAgICAgcHJlc19hdmdfcG9wLA0KICAgICAgICAgcHJlc19hdmdfbWlsX2V4cCwNCiAgICAgICAgIHByZXNfYXZnX3VuX2Rpc3QsDQogICAgICAgICBwcmVzX2F2Z190cmFkZV9kZXBfdXMsDQogICAgICAgICBwcmVzX2F2Z191c19leHAsDQogICAgICAgICBwcmVzX3N1bV91c19leHAsDQogICAgICAgICBwcmVzX2F2Z191c19pbXAsDQogICAgICAgICBwcmVzX3N1bV91c19pbXAsDQogICAgICAgICBwcmVzX2F2Z190cmFkZV9vcGVuLA0KICAgICAgICAgcHJlc19hdmdfZXRobm9fZnJhYywNCiAgICAgICAgIHByZXNfYXZnX211c19wZXJjLA0KICAgICAgICAgcHJlc19hdmdfY3NvX3JlcHJlc3MsDQogICAgICAgICBwcmVzX2F2Z19tb3VudGFpbiwNCiAgICAgICAgIGRlZmVuc2VfcGFjdF91cywNCiAgICAgICAgIHByZXNfYXZnX3N1aWNpZGUsDQogICAgICAgICBwcmVzX3N1bV9zdWljaWRlLA0KICAgICAgICAgZGlzdF9tb3Njb3cgPSBkaXN0X3NvdG9fbW9zY293LA0KICAgICAgICAgZGlzdF9kYyA9IGRpc3RfdG9fd2FzaF9kYywNCiAgICAgICAgIGRpc3RfYmVpamluZyA9IGRpc3RfdG9fYmVpamluZykgICU+JSANCiAgICB1bmdyb3VwKCkgLT4gcGRfcHJlcw0KDQpgYGANCg0KDQpgYGB7cn0NCg0KcG9vbGluZ19tb2RlbDEgPC1sbShsb2cocHJlc19wcHBfYnVkZ2V0ICsgMSkgfiANCiAgICAgICAgICAgICAgIGxvZyhwcmVzX2F2Z19nZHBfcGMpICsNCiAgICAgICAgICAgICAgIGxvZyhwcmVzX2F2Z19wb3ApICsNCiAgICAgICAgICAgICAgIHByZXNfYXZnX211c19wZXJjICsNCiAgICAgICAgICAgICAgIGxvZyhwcmVzX2F2Z191c19leHAgKyAxKSArDQogICAgICAgICAgICAgICAjIHByZXNfYXZnX3VuX2Rpc3QgKw0KICAgICAgICAgICAgICAgbG9nKHByZXNfc3VtX3N1aWNpZGUgKyAxKSArDQogICAgICAgICAgICAgICBwcmVzX2F2Z19lbGVjdCArDQogICAgICAgICAgICAgICAjIEkocHJlc19hdmdfZWxlY3ReMikgKw0KICAgICAgICAgICAgICAgbG9nKHByZXNfc3VtX3VzX3Ryb29wcyArIDEpICsNCiAgICAgICAgICAgICAgICMgYXMuZmFjdG9yKHJlZ2lvbl82KSArDQogICAgICAgICAgICAgICBhcy5mYWN0b3IocHJlc2lkZW50KSwNCiAgICAgICAgICAgICAgIGRhdGEgPSBwZF9wcmVzKQ0KDQoNCnBvb2xpbmdfbW9kZWwyIDwtbG0obG9nKHByZXNfcHBwX2J1ZGdldF9wYyArIDEpIH4gDQogICAgICAgICAgICAgICBsb2cocHJlc19hdmdfZ2RwX3BjKSArDQogICAgICAgICAgICAgICBsb2cocHJlc19hdmdfcG9wKSArDQogICAgICAgICAgICAgICBwcmVzX2F2Z19tdXNfcGVyYyArDQogICAgICAgICAgICAgICBsb2cocHJlc19hdmdfdXNfZXhwICsgMSkgKw0KICAgICAgICAgICAgICAgIyBwcmVzX2F2Z191bl9kaXN0ICsNCiAgICAgICAgICAgICAgIGxvZyhwcmVzX3N1bV9zdWljaWRlICsgMSkgKw0KICAgICAgICAgICAgICAgcHJlc19hdmdfZWxlY3QgKw0KICAgICAgICAgICAgICAgIyBJKHByZXNfYXZnX2VsZWN0XjIpICsNCiAgICAgICAgICAgICAgIGxvZyhwcmVzX3N1bV91c190cm9vcHMgKyAxKSArDQogICAgICAgICAgICAgICAjIGFzLmZhY3RvcihyZWdpb25fNikgKw0KICAgICAgICAgICAgICAgYXMuZmFjdG9yKHByZXNpZGVudCksDQogICAgICAgICAgICAgICBkYXRhID0gcGRfcHJlcykNCg0KDQpzdGFyZ2F6ZXIocG9vbGluZ19tb2RlbDEsIHBvb2xpbmdfbW9kZWwyLA0KICAgICAgICAgIHR5cGUgPSAiaHRtbCIpDQoNCg0KDQpgYGANCg0KDQpgYGB7cn0NCg0KcGRfcHJlcyAlPiUgDQogICBmaWx0ZXIocHJlc19hdmdfdW5fZGlzdCA8IDIuOCkgLT4gaGlnaF91bg0KIA0KcGRfcHJlcyAlPiUgDQogICBmaWx0ZXIocHJlc19hdmdfdW5fZGlzdCA+PSAyLjgpIC0+IGxvd191bg0KDQoNCg0KaGlnaF9wYyA8LWxtKGxvZyhwcmVzX3BwcF9idWRnZXRfcGMgKyAxKSB+IA0KICAgICAgICAgICAgICAgbG9nKHByZXNfYXZnX2dkcF9wYykgKw0KICAgICAgICAgICAgICAgbG9nKHByZXNfYXZnX3BvcCkgKw0KICAgICAgICAgICAgICAgcHJlc19hdmdfbXVzX3BlcmMgKw0KICAgICAgICAgICAgICAgbG9nKHByZXNfYXZnX3VzX2V4cCArIDEpICsNCiAgICAgICAgICAgICAgICMgcHJlc19hdmdfdW5fZGlzdCArDQogICAgICAgICAgICAgICBsb2cocHJlc19zdW1fc3VpY2lkZSArIDEpICsNCiAgICAgICAgICAgICAgIHByZXNfYXZnX2VsZWN0ICsNCiAgICAgICAgICAgICAgICAjIEkocHJlc19hdmdfZWxlY3ReMikgKw0KICAgICAgICAgICAgICAgbG9nKHByZXNfc3VtX3VzX3Ryb29wcyArIDEpICsNCiAgICAgICAgICAgICAgICMgKHJlZ2lvbl82KSArDQogICAgICAgICAgICAgICBhcy5mYWN0b3IocHJlc2lkZW50KSwNCiAgICAgICAgICAgICAgIGRhdGEgPSBoaWdoX3VuKQ0KDQoNCmxvd19wYyA8LWxtKGxvZyhwcmVzX3BwcF9idWRnZXRfcGMgKyAxKSB+IA0KICAgICAgICAgICAgICAgbG9nKHByZXNfYXZnX2dkcF9wYykgKw0KICAgICAgICAgICAgICAgbG9nKHByZXNfYXZnX3BvcCkgKw0KICAgICAgICAgICAgICAgcHJlc19hdmdfbXVzX3BlcmMgKw0KICAgICAgICAgICAgICAgbG9nKHByZXNfYXZnX3VzX2V4cCArIDEpICsNCiAgICAgICAgICAgICAgIGxvZyhwcmVzX3N1bV9zdWljaWRlICsgMSkgKw0KICAgICAgICAgICAgICAgcHJlc19hdmdfZWxlY3QgKw0KICAgICAgICAgICAgICAgICMgSShwcmVzX2F2Z19lbGVjdF4yKSArDQogICAgICAgICAgICAgICBsb2cocHJlc19zdW1fdXNfdHJvb3BzICsgMSkgKw0KICAgICAgICAgICAgICAgIyBhcy5mYWN0b3IocmVnaW9uXzYpICsNCiAgICAgICAgICAgICAgIGFzLmZhY3RvcihwcmVzaWRlbnQpLA0KICAgICAgICAgICAgICAgZGF0YSA9IGxvd191bikNCg0KDQoNCmhpZ2hfdG90YWwgPC1sbShsb2cocHJlc19wcHBfYnVkZ2V0ICsgMSkgfiANCiAgICAgICAgICAgICAgIGxvZyhwcmVzX2F2Z19nZHBfcGMpICsNCiAgICAgICAgICAgICAgIGxvZyhwcmVzX2F2Z19wb3ApICsNCiAgICAgICAgICAgICAgIHByZXNfYXZnX211c19wZXJjICsNCiAgICAgICAgICAgICAgIGxvZyhwcmVzX2F2Z191c19leHAgKyAxKSArDQogICAgICAgICAgICAgICAjIHByZXNfYXZnX3VuX2Rpc3QgKw0KICAgICAgICAgICAgICAgbG9nKHByZXNfc3VtX3N1aWNpZGUgKyAxKSArDQogICAgICAgICAgICAgICBwcmVzX2F2Z19lbGVjdCArDQogICAgICAgICAgICAgICAgIyBJKHByZXNfYXZnX2VsZWN0XjIpICsNCiAgICAgICAgICAgICAgIGxvZyhwcmVzX3N1bV91c190cm9vcHMgKyAxKSArDQogICAgICAgICAgICAgICAjIChyZWdpb25fNikgKw0KICAgICAgICAgICAgICAgYXMuZmFjdG9yKHByZXNpZGVudCksDQogICAgICAgICAgICAgICBkYXRhID0gaGlnaF91bikNCg0KDQpsb3dfdG90YWwgPC1sbShsb2cocHJlc19wcHBfYnVkZ2V0ICsgMSkgfiANCiAgICAgICAgICAgICAgIGxvZyhwcmVzX2F2Z19nZHBfcGMpICsNCiAgICAgICAgICAgICAgIGxvZyhwcmVzX2F2Z19wb3ApICsNCiAgICAgICAgICAgICAgIHByZXNfYXZnX211c19wZXJjICsNCiAgICAgICAgICAgICAgIGxvZyhwcmVzX2F2Z191c19leHAgKyAxKSArDQogICAgICAgICAgICAgICBsb2cocHJlc19zdW1fc3VpY2lkZSArIDEpICsNCiAgICAgICAgICAgICAgIHByZXNfYXZnX2VsZWN0ICsNCiAgICAgICAgICAgICAgICAjIEkocHJlc19hdmdfZWxlY3ReMikgKw0KICAgICAgICAgICAgICAgbG9nKHByZXNfc3VtX3VzX3Ryb29wcyArIDEpICsNCiAgICAgICAgICAgICAgICMgYXMuZmFjdG9yKHJlZ2lvbl82KSArDQogICAgICAgICAgICAgICBhcy5mYWN0b3IocHJlc2lkZW50KSwNCiAgICAgICAgICAgICAgIGRhdGEgPSBsb3dfdW4pDQoNCg0Kc3RhcmdhemVyKGhpZ2hfdG90YWwsIGxvd190b3RhbCwgaGlnaF9wYywgbG93X3BjLCANCiAgICAgICAgICAjIGNvbHVtbi5sYWJlbHMgPSBjKCJIaWdoX3RvdGFsIiwgIkxvd190b3RhbCIsICJIaWdoIFBDIiwgIkxvdyBQQyIpLA0KICAgICAgICAgIHR5cGUgPSAiaHRtbCIpDQoNCg0KYGBgDQoNCg0KYGBge3J9DQoNCmR2IDwtICJsb2coYnVkZ2V0ICsgMSkiDQoNCml2cyA8LSBjKCJlbGVjdG9yYWxfZGVtbyIsDQogICAgICAgICAibG9nKGdkcF9wY19jb25zdCkiLA0KICAgICAgICAgImxvZyhwb3ApIiwNCiAgICAgICAgICJtdXNsaW1fcGVyY2VudCINCiAgICAgICAgICkNCg0KZm9ybV8xIDwtIGFzLmZvcm11bGEocGFzdGUoZHYsIHBhc3RlKGl2cywgY29sbGFwc2UgPSAiICsgIiksIHNlcCA9ICIgfiAiKSkNCg0KdGhlX2RmICU+JSANCiAgIGZpbHRlcihpZGVhbF9wb2ludF9kaXN0YW5jZSA8IDIuNykgLT4gaGlnaF9kZg0KIA0KdGhlX2RmICU+JSANCiAgIGZpbHRlcihpZGVhbF9wb2ludF9kaXN0YW5jZSA+PSAyLjcpIC0+IGxvd19kZg0KDQpwb29sZWQgPC0gcGxtKGZvcm1fMSwgZGF0YSA9IGhpZ2hfZGYsIG1vZGVsID0gInBvb2xpbmciKQ0KDQpmaXhlZF9pbmQgPC0gcGxtKGZvcm1fMSwgZGF0YSA9IGhpZ2hfZGYsIG1vZGVsID0gIndpdGhpbiIsIGVmZmVjdCA9ICJpbmRpdmlkdWFsIikNCg0KZml4ZWRfdGltZSA8LSBwbG0oZm9ybV8xLCBkYXRhID0gaGlnaF9kZiwgbW9kZWwgPSAid2l0aGluIiwgZWZmZWN0ID0gInRpbWUiKQ0KDQpmaXhlZF90d28gPC0gcGxtKGZvcm1fMSwgZGF0YSA9IGhpZ2hfZGYsIG1vZGVsID0gIndpdGhpbiIsIGVmZmVjdCA9ICJ0d293YXlzIikNCg0KcmFuZF9pbmQgPC0gcGxtKGZvcm1fMSwgZGF0YSA9IGhpZ2hfZGYsIG1vZGVsID0gInJhbmRvbSIsIGVmZmVjdCA9ICJpbmRpdmlkdWFsIikNCg0KcmFuZF90aW1lIDwtIHBsbShmb3JtXzEsIGRhdGEgPSBoaWdoX2RmLCBtb2RlbCA9ICJyYW5kb20iLCBlZmZlY3QgPSAidGltZSIpDQoNCnJhbmRfdHdvIDwtIHBsbShmb3JtXzEsIGRhdGEgPSBoaWdoX2RmLCBtb2RlbCA9ICJyYW5kb20iLCBlZmZlY3QgPSAidHdvd2F5cyIpDQoNCg0KYGBgDQoNCg0KIyBIYXVzbWFuIFRlc3QNCg0KV2hlbiB3ZSBydW4gdGhlIEhhdXNtYW4gdGVzdCB3aXRoIHBodGVzdCgpIGNvbW1hbmQsIHdlIHNlZSB0aGUgcC12YWx1ZSBpcyBpcyAwLjguIA0KDQpJdCBpcyBub3QgbGVzcyB0aGF0IDAuMDUgc28gd2UgY2FuIGxvb2sgYXQgcmFuZG9tIGVmZmVjdHMgbW9kZWwuDQoNCg0KYGBge3J9DQoNCnBodGVzdChmaXhlZF90aW1lLCByYW5kX3RpbWUpDQoNCmBgYA0KDQojIFJlZ3Jlc3Npb24gb3V0cHV0IA0KDQpgYGB7cn0NCnN0YXJnYXplcihyYW5kX2luZCwgDQogICAgICAgICAgcmFuZF90aW1lLCANCiAgICAgICAgICByYW5kX3R3bywgDQogICAgICAgICAgY29sdW1uLmxhYmVscyA9IGMoDQogICAgICAgICAgICAjICJGaXhlZCBJbmQiLCAiRml4ZWQgVGltZSIsICJGaXhlZCBUd28iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSYW5kIEluZCIsICJSYW5kIFRpbWUiLCAiUmFuZCBUd28iKSwgDQogICAgICAgICAgdHlwZSA9ICJodG1sIikNCg0KYGBgDQoNCiMgQ29ycmVjdCBmb3IgaGV0ZXJvc2tlZGFzdGljaXR5IHdpdGggcm9idXN0IHN0YW5kYXJkIGVycm9ycw0KDQpgYGB7cn0NCg0Kc3RhcmdhemVyKA0KIyBjb2VmdGVzdChmaXhlZF9pbmQsIHZjb3YgPSB2Y292SEMsIHR5cGUgPSAiSEMxIiksDQojIGNvZWZ0ZXN0KGZpeGVkX3RpbWUsIHZjb3YgPSB2Y292SEMsIHR5cGUgPSAiSEMxIiksDQojIGNvZWZ0ZXN0KGZpeGVkX3R3bywgdmNvdiA9IHZjb3ZIQywgdHlwZSA9ICJIQzEiKSwNCmNvZWZ0ZXN0KHJhbmRfaW5kLCB2Y292ID0gdmNvdkhDLCB0eXBlID0gIkhDMSIpLA0KY29lZnRlc3QocmFuZF90aW1lLCB2Y292ID0gdmNvdkhDLCB0eXBlID0gIkhDMSIpLA0KY29lZnRlc3QocmFuZF90d28sIHZjb3YgPSB2Y292SEMsIHR5cGUgPSAiSEMxIiksDQogICAgICAgICAgY29sdW1uLmxhYmVscyA9IGMoDQogICAgICAgICAgICAjICJGaXhlZCBJbmQiLCAiRml4ZWQgVGltZSIsICJGaXhlZCBUd28iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSYW5kIEluZCIsICJSYW5kIFRpbWUiLCAiUmFuZCBUd28iKSwgDQogICAgICAgICAgdHlwZSA9ICJodG1sIikNCg0KDQpgYGANCg0KDQoNCiMgTGFncmFuZ2UgTXVsdGlwbGllciBUZXN0IA0KDQojIyMgVGltZSBlZmZlY3RzIChCcmV1c2NoLVBhZ2FuKQ0KDQpXZSBsb29rIGF0IHRoZSBMYWdyYW5nZSBNdWx0aXBsaWVyIHRlc3QgdG8gc2VlIGlmIHRoZXJlIGFyZSB0aW1lLWVmZmVjdHMgaW4gdGhlIG1vZGVsLiANCg0KSWYgdGhlIHAtdmFsdWUgPCAwLjA1IHRoZW4gdXNlIHRpbWUtZml4ZWQgZWZmZWN0cy4NCg0KSW4gb3VyIG1vZGVsLCB0aGUgLCBwLXZhbHVlIGlzIGZhciBiZWxvdyAwLjA1IHNvIHdlIGNhbiBzdXBwb3J0IHRoZSBhbHRlcm5hdGl2ZSBoeXBvdGhlc2lzIHRoYXQgdGhlcmUgYXJlIHRpbWUgZWZmZWN0cyBpbiB0aGUgbW9kZWwNCmBgYHtyfQ0KDQpwbG10ZXN0KHBvb2xlZCwgYygidGltZSIpLCB0eXBlPSgiYnAiKSkNCg0KYGBgDQoNCiMgVGVzdCBvZiBpbmRpdmlkdWFsIGFuZC9vciB0aW1lIGVmZmVjdHMNCg0KV2UgY2FuIHVzZSB0aGUgcEZ0ZXN0KCkgdG8gYWxzbyBsb29rIGF0IHdoZXRoZXIgd2UgdXNlIGluZGl2aWR1YWwgb3IgdGltZSBlZmZlY3RzLCBiYXNlZCBvbiB0aGUgY29tcGFyaXNvbiBvZiB0aGUgd2l0aGluIGFuZCB0aGUgcG9vbGluZyBtb2RlbC4gDQoNCg0KYGBge3J9DQoNCnBGdGVzdChmaXhlZF90aW1lLCBwb29sZWQpDQpgYGANCg0KDQpgYGB7cn0NCg0KDQpzdGFyZ2F6ZXIocmFuZF90aW1lLCBjb2VmdGVzdChyYW5kX3RpbWUsIHZjb3YgPSB2Y292SEMsIHR5cGUgPSAiSEMxIiksDQogICAgICAgICAgY29sdW1uLmxhYmVscyA9IGMoIlJhbmRvbSBNb2RlbCAoVGltZSBFZmZlY3RzKSB8fCIsICIgUmFuZCBUaW1lIFJvYnVzdCBTdGQuIEVycm9yIiksIA0KICAgICAgICAgIHR5cGUgPSAiaHRtbCIpDQoNCmBgYA0KDQo=