Required packages
library(dplyr)
library(tidyr)
library(outliers)
Executive Summary
- It is highly recommended that before starting investigation, one should understand the data and preprocesss the data in the required form.
- I have merged two datasets namely, worldgdp and Incomegroup data.
- I have renamed the columns names in both the datasets.
- I have merged the datasets and I have done character to factor conversion.
- I have created mutate variable called GDP_Per_Capita by existing variables GDP_BY_IMF and Population.
- I have scanned for any missing/null values.
- I have scanned for outliers in data frames and found there using Turkey’s method.using Capping method, I have replaced the outliers and transformed the GDP_Per_Capita distribution into a symmetric one.
Data
– Worldgdp
The first dataset represent the GDP data of countries in the world.
Source : http://worldpopulationreview.com/countries/countries-by-gdp/
Variable representation:
- rank - rank as per latest GDP value
- country - Name of The country
- imfGDP - GDP value calculated by International Monetary Fund(in US$)
- unGDP - GDP value calculated by United Nation(in US$)
- pop - population of the country
– Income Group
The second dataset represent the income classification of a country in the world by region.
Source : https://www.kaggle.com/uddipta/world-bank-unemployment-data-19912017 (full data.csv)
Variable representation:
- Country Name - Name of The country
- Region - Region the world
- IncomeGroup - Income classification of the country
# read gdp data set
worldgdp <- read.csv("worldgdp.csv",stringsAsFactors = FALSE)
colnames(worldgdp)[colnames(worldgdp)=="country"] <- "Country Name"
colnames(worldgdp)[colnames(worldgdp)=="imfGDP"] <- "GDP_BY_IMF (in US$)"
colnames(worldgdp)[colnames(worldgdp)=="unGDP"] <- "GDP_BY_UN (in US$)"
colnames(worldgdp)[colnames(worldgdp)=="pop"] <- "population"
head(worldgdp)
# read incomegroup data set
incomegroup <- read.csv("incomecluster.csv",stringsAsFactors = FALSE)
incomegroup <- incomegroup %>% select(Country.Name,Region,IncomeGroup)
colnames(incomegroup)[colnames(incomegroup)=="Country.Name"] <- "Country Name"
head(incomegroup)
# Merge two dataset
data_1<-merge(x=worldgdp,y=incomegroup,by="Country Name")
head(data_1)
# Rearranging columns order and sorting the data as per the rank
data_1<- data_1[,c(2,1,6,7,5,3,4)]
# sorting the data as per the rank
data_1<-data_1[order(as.integer(data_1$rank),decreasing = FALSE),]
# Remove by default rownumber generated by r
row.names(data_1) <- NULL
head(data_1)
Understand
#Checking class of attributes
class(data_1$rank)
[1] "integer"
class(data_1$`Country Name`)
[1] "character"
class(data_1$Region)
[1] "character"
class(data_1$IncomeGroup)
[1] "character"
class(data_1$population)
[1] "numeric"
class(data_1$`GDP_BY_IMF (in US$)`)
[1] "numeric"
class(data_1$`GDP_BY_UN (in US$)`)
[1] "numeric"
# Converting charactor datatype of IncomeGroup column to ordinal factor.
data_1$IncomeGroup<- factor(data_1$IncomeGroup,levels=c("High income","Upper middle income","Lower middle income","Low income"),labels=c("High income","Upper middle income","Lower middle income","Low income"),ordered=TRUE)
class(data_1$IncomeGroup)
[1] "ordered" "factor"
#To check the structure of dataset
str(data_1)
'data.frame': 159 obs. of 7 variables:
$ rank : int 1 2 3 4 5 6 7 8 9 10 ...
$ Country Name : chr "United States" "China" "Japan" "Germany" ...
$ Region : chr "North America" "East Asia & Pacific" "East Asia & Pacific" "Europe & Central Asia" ...
$ IncomeGroup : Ord.factor w/ 4 levels "High income"<..: 1 2 1 1 3 1 1 1 2 1 ...
$ population : num 329065 1433784 126860 83517 1366418 ...
$ GDP_BY_IMF (in US$): num 21344700000000 14216500000000 5176210000000 3963880000000 2972000000000 ...
$ GDP_BY_UN (in US$) : num 18624500000000 11218300000000 4936210000000 3477800000000 2259640000000 ...
head(data_1)
Tidy & Manipulate Data I
As per Hadley Wickham and Grolemund (2016), the three tidy data rules are:
- Each variable must have its own column.
- Each observation must have its own row.
- Each value must have its own cell
By following above rules, we can say that data_1 is in tidy format.
Tidy & Manipulate Data II
# Mutating GDP_Per_Capita variable
data_1<-mutate(data_1,`GDP_Per_Capita (in US$)`=(data_1$`GDP_BY_IMF (in US$)`/data_1$population))
head(data_1)
GDP Per capita is the average amount of goods and services produced per person.GDP Per capita can be calculated by dividing GDP by population of a country.
Mutate() is used to create GDP_Per_capita variable by diving GDP_BY_IMF (in US$) to population.
Scan I
#scan for missing value
colSums(is.na(data_1))
rank Country Name
0 0
Region IncomeGroup
0 0
population GDP_BY_IMF (in US$)
0 0
GDP_BY_UN (in US$) GDP_Per_Capita (in US$)
0 0
#scan for errors
sum(is.nan(data_1$`Country Name`))
[1] 0
sum(is.nan(data_1$Region))
[1] 0
sum(is.nan(data_1$IncomeGroup))
[1] 0
sum(is.nan(data_1$population))
[1] 0
sum(is.nan(data_1$`GDP_BY_IMF (in US$)`))
[1] 0
sum(is.nan(data_1$`GDP_BY_UN (in US$)`))
[1] 0
sum(is.nan(data_1$`GDP_Per_Capita (in US$)`))
[1] 0
we have 0 Missing values in each variable. The output is zero hence, there is no error in dataset.
Scan II
# outliers detection in numeric variable
GDP_IMF<-boxplot(data_1$`GDP_BY_IMF (in US$)`, main = "GDP by IMF")

GDP_per_Cap<-boxplot(data_1$`GDP_Per_Capita (in US$)`, main = "Box plot of GDP Per Capita")

z_scores_GDP_per_Cap <- data_1$`GDP_Per_Capita (in US$)` %>% scores(type = "z")
z_scores_GDP_per_Cap %>% summary()
Min. 1st Qu. Median Mean 3rd Qu. Max.
-0.7074 -0.6152 -0.4367 0.0000 0.1349 4.7630
length (which( abs(z_scores_GDP_per_Cap) >3 ))
[1] 4
cap <- function(x){
quantiles <- quantile( x, c(.05, 0.25, 0.75, .95))
x[ x < quantiles[2] - 1.5*IQR(x) ] <- quantiles[1]
x[ x > quantiles[3] + 1.5*IQR(x) ] <- quantiles[3]+1.5*IQR(x)
x
}
GDP_per_Capita_capped <- sapply(data_1 %>% select(`GDP_Per_Capita (in US$)`),FUN = cap)
data_1_capped <- cbind (data_1 %>% select(-`GDP_Per_Capita (in US$)`),GDP_per_Capita_capped)
boxplot(data_1_capped$`GDP_Per_Capita (in US$)` ,main ="Box Plot for GDP_Per_Capita (in US$)")

LS0tDQp0aXRsZTogIk1BVEgyMzQ5IFNlbWVzdGVyIDIsIDIwMTkiDQphdXRob3I6ICJOaXNoYW50IER1ZGh3YWxhIChTMzc1Mjg2OCkiDQpzdWJ0aXRsZTogQXNzaWdubWVudCAzDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCi0tLQ0KDQojIyBSZXF1aXJlZCBwYWNrYWdlcyANCg0KYGBge3J9DQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkob3V0bGllcnMpDQpgYGANCg0KDQojIyBFeGVjdXRpdmUgU3VtbWFyeSANCg0KKiBJdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCBiZWZvcmUgc3RhcnRpbmcgaW52ZXN0aWdhdGlvbiwgb25lIHNob3VsZCB1bmRlcnN0YW5kIHRoZSBkYXRhIGFuZCBwcmVwcm9jZXNzcyB0aGUgZGF0YSBpbiB0aGUgcmVxdWlyZWQgZm9ybS4NCiogSSBoYXZlIG1lcmdlZCB0d28gZGF0YXNldHMgbmFtZWx5LCB3b3JsZGdkcCBhbmQgSW5jb21lZ3JvdXAgZGF0YS4NCiogSSBoYXZlIHJlbmFtZWQgdGhlIGNvbHVtbnMgbmFtZXMgaW4gYm90aCB0aGUgZGF0YXNldHMuIA0KKiBJIGhhdmUgbWVyZ2VkIHRoZSBkYXRhc2V0cyBhbmQgSSBoYXZlIGRvbmUgY2hhcmFjdGVyIHRvIGZhY3RvciBjb252ZXJzaW9uLg0KKiBJIGhhdmUgY3JlYXRlZCBtdXRhdGUgdmFyaWFibGUgY2FsbGVkIEdEUF9QZXJfQ2FwaXRhIGJ5IGV4aXN0aW5nIHZhcmlhYmxlcyBHRFBfQllfSU1GIGFuZCBQb3B1bGF0aW9uLg0KKiBJIGhhdmUgc2Nhbm5lZCBmb3IgYW55IG1pc3NpbmcvbnVsbCB2YWx1ZXMuDQoqIEkgaGF2ZSBzY2FubmVkIGZvciBvdXRsaWVycyBpbiBkYXRhIGZyYW1lcyBhbmQgZm91bmQgdGhlcmUgdXNpbmcgVHVya2V5J3MgbWV0aG9kLnVzaW5nIENhcHBpbmcgbWV0aG9kLCBJIGhhdmUgcmVwbGFjZWQgdGhlIG91dGxpZXJzIGFuZCB0cmFuc2Zvcm1lZCB0aGUgR0RQX1Blcl9DYXBpdGEgZGlzdHJpYnV0aW9uIGludG8gYSBzeW1tZXRyaWMgb25lLg0KDQojIyBEYXRhIA0KDQotLSBXb3JsZGdkcA0KDQpUaGUgZmlyc3QgZGF0YXNldCByZXByZXNlbnQgdGhlIEdEUCBkYXRhIG9mIGNvdW50cmllcyBpbiB0aGUgd29ybGQuDQoNClNvdXJjZSA6IGh0dHA6Ly93b3JsZHBvcHVsYXRpb25yZXZpZXcuY29tL2NvdW50cmllcy9jb3VudHJpZXMtYnktZ2RwLw0KDQpWYXJpYWJsZSByZXByZXNlbnRhdGlvbjoNCg0KKiByYW5rIC0gcmFuayBhcyBwZXIgbGF0ZXN0IEdEUCB2YWx1ZQ0KKiBjb3VudHJ5IC0gTmFtZSBvZiBUaGUgY291bnRyeQ0KKiBpbWZHRFAgLSBHRFAgdmFsdWUgY2FsY3VsYXRlZCBieSBJbnRlcm5hdGlvbmFsIE1vbmV0YXJ5IEZ1bmQoaW4gVVMkKQ0KKiB1bkdEUCAtIEdEUCB2YWx1ZSBjYWxjdWxhdGVkIGJ5IFVuaXRlZCBOYXRpb24oaW4gVVMkKQ0KKiBwb3AgLSBwb3B1bGF0aW9uIG9mIHRoZSBjb3VudHJ5DQoNCi0tIEluY29tZSBHcm91cA0KDQpUaGUgc2Vjb25kIGRhdGFzZXQgcmVwcmVzZW50IHRoZSBpbmNvbWUgY2xhc3NpZmljYXRpb24gb2YgYSBjb3VudHJ5IGluIHRoZSB3b3JsZCBieSByZWdpb24uDQoNClNvdXJjZSA6IGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vdWRkaXB0YS93b3JsZC1iYW5rLXVuZW1wbG95bWVudC1kYXRhLTE5OTEyMDE3IChmdWxsIGRhdGEuY3N2KQ0KDQpWYXJpYWJsZSByZXByZXNlbnRhdGlvbjoNCg0KKiBDb3VudHJ5IE5hbWUgLSBOYW1lIG9mIFRoZSBjb3VudHJ5DQoqIFJlZ2lvbiAtIFJlZ2lvbiB0aGUgd29ybGQNCiogSW5jb21lR3JvdXAgLSBJbmNvbWUgY2xhc3NpZmljYXRpb24gb2YgdGhlIGNvdW50cnkNCg0KYGBge3J9DQojIHJlYWQgZ2RwIGRhdGEgc2V0DQp3b3JsZGdkcCA8LSByZWFkLmNzdigid29ybGRnZHAuY3N2IixzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpDQpjb2xuYW1lcyh3b3JsZGdkcClbY29sbmFtZXMod29ybGRnZHApPT0iY291bnRyeSJdIDwtICJDb3VudHJ5IE5hbWUiDQpjb2xuYW1lcyh3b3JsZGdkcClbY29sbmFtZXMod29ybGRnZHApPT0iaW1mR0RQIl0gPC0gIkdEUF9CWV9JTUYgKGluIFVTJCkiDQpjb2xuYW1lcyh3b3JsZGdkcClbY29sbmFtZXMod29ybGRnZHApPT0idW5HRFAiXSA8LSAiR0RQX0JZX1VOIChpbiBVUyQpIg0KY29sbmFtZXMod29ybGRnZHApW2NvbG5hbWVzKHdvcmxkZ2RwKT09InBvcCJdIDwtICJwb3B1bGF0aW9uIg0KDQpoZWFkKHdvcmxkZ2RwKQ0KDQojIHJlYWQgaW5jb21lZ3JvdXAgZGF0YSBzZXQNCmluY29tZWdyb3VwIDwtIHJlYWQuY3N2KCJpbmNvbWVjbHVzdGVyLmNzdiIsc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQ0KaW5jb21lZ3JvdXAgPC0gaW5jb21lZ3JvdXAgJT4lIHNlbGVjdChDb3VudHJ5Lk5hbWUsUmVnaW9uLEluY29tZUdyb3VwKQ0KDQpjb2xuYW1lcyhpbmNvbWVncm91cClbY29sbmFtZXMoaW5jb21lZ3JvdXApPT0iQ291bnRyeS5OYW1lIl0gPC0gIkNvdW50cnkgTmFtZSINCg0KaGVhZChpbmNvbWVncm91cCkNCg0KIyBNZXJnZSB0d28gZGF0YXNldA0KZGF0YV8xPC1tZXJnZSh4PXdvcmxkZ2RwLHk9aW5jb21lZ3JvdXAsYnk9IkNvdW50cnkgTmFtZSIpDQpoZWFkKGRhdGFfMSkNCg0KIyBSZWFycmFuZ2luZyBjb2x1bW5zIG9yZGVyIGFuZCBzb3J0aW5nIHRoZSBkYXRhIGFzIHBlciB0aGUgcmFuaw0KZGF0YV8xPC0gZGF0YV8xWyxjKDIsMSw2LDcsNSwzLDQpXQ0KDQojIHNvcnRpbmcgdGhlIGRhdGEgYXMgcGVyIHRoZSByYW5rDQpkYXRhXzE8LWRhdGFfMVtvcmRlcihhcy5pbnRlZ2VyKGRhdGFfMSRyYW5rKSxkZWNyZWFzaW5nID0gRkFMU0UpLF0NCg0KIyBSZW1vdmUgYnkgZGVmYXVsdCByb3dudW1iZXIgZ2VuZXJhdGVkIGJ5IHINCnJvdy5uYW1lcyhkYXRhXzEpIDwtIE5VTEwNCmhlYWQoZGF0YV8xKQ0KDQpgYGANCg0KIyMgVW5kZXJzdGFuZCANCg0KYGBge3J9DQojQ2hlY2tpbmcgY2xhc3Mgb2YgYXR0cmlidXRlcw0KDQpjbGFzcyhkYXRhXzEkcmFuaykNCmNsYXNzKGRhdGFfMSRgQ291bnRyeSBOYW1lYCkNCmNsYXNzKGRhdGFfMSRSZWdpb24pDQpjbGFzcyhkYXRhXzEkSW5jb21lR3JvdXApDQpjbGFzcyhkYXRhXzEkcG9wdWxhdGlvbikNCmNsYXNzKGRhdGFfMSRgR0RQX0JZX0lNRiAoaW4gVVMkKWApDQpjbGFzcyhkYXRhXzEkYEdEUF9CWV9VTiAoaW4gVVMkKWApDQoNCiMgQ29udmVydGluZyBjaGFyYWN0b3IgZGF0YXR5cGUgb2YgSW5jb21lR3JvdXAgY29sdW1uIHRvIG9yZGluYWwgZmFjdG9yLg0KZGF0YV8xJEluY29tZUdyb3VwPC0gZmFjdG9yKGRhdGFfMSRJbmNvbWVHcm91cCxsZXZlbHM9YygiSGlnaCBpbmNvbWUiLCJVcHBlciBtaWRkbGUgaW5jb21lIiwiTG93ZXIgbWlkZGxlIGluY29tZSIsIkxvdyBpbmNvbWUiKSxsYWJlbHM9YygiSGlnaCBpbmNvbWUiLCJVcHBlciBtaWRkbGUgaW5jb21lIiwiTG93ZXIgbWlkZGxlIGluY29tZSIsIkxvdyBpbmNvbWUiKSxvcmRlcmVkPVRSVUUpDQpjbGFzcyhkYXRhXzEkSW5jb21lR3JvdXApDQoNCiNUbyBjaGVjayB0aGUgc3RydWN0dXJlIG9mIGRhdGFzZXQNCnN0cihkYXRhXzEpDQoNCmhlYWQoZGF0YV8xKQ0KYGBgDQoNCg0KIyMJVGlkeSAmIE1hbmlwdWxhdGUgRGF0YSBJIA0KDQpBcyBwZXIgSGFkbGV5IFdpY2toYW0gYW5kIEdyb2xlbXVuZCAoMjAxNiksIHRoZSB0aHJlZSB0aWR5IGRhdGEgcnVsZXMgYXJlOg0KDQoqIEVhY2ggdmFyaWFibGUgbXVzdCBoYXZlIGl0cyBvd24gY29sdW1uLg0KKiBFYWNoIG9ic2VydmF0aW9uIG11c3QgaGF2ZSBpdHMgb3duIHJvdy4NCiogRWFjaCB2YWx1ZSBtdXN0IGhhdmUgaXRzIG93biBjZWxsDQoNCkJ5IGZvbGxvd2luZyBhYm92ZSBydWxlcywgd2UgY2FuIHNheSB0aGF0IGRhdGFfMSBpcyBpbiB0aWR5IGZvcm1hdC4NCg0KIyMJVGlkeSAmIE1hbmlwdWxhdGUgRGF0YSBJSSANCg0KYGBge3J9DQojIE11dGF0aW5nIEdEUF9QZXJfQ2FwaXRhIHZhcmlhYmxlDQpkYXRhXzE8LW11dGF0ZShkYXRhXzEsYEdEUF9QZXJfQ2FwaXRhIChpbiBVUyQpYD0oZGF0YV8xJGBHRFBfQllfSU1GIChpbiBVUyQpYC9kYXRhXzEkcG9wdWxhdGlvbikpDQpoZWFkKGRhdGFfMSkNCmBgYA0KDQpHRFAgUGVyIGNhcGl0YSBpcyB0aGUgYXZlcmFnZSBhbW91bnQgb2YgZ29vZHMgYW5kIHNlcnZpY2VzIHByb2R1Y2VkIHBlciBwZXJzb24uR0RQIFBlciBjYXBpdGEgY2FuIGJlIGNhbGN1bGF0ZWQgYnkgZGl2aWRpbmcgR0RQIGJ5IHBvcHVsYXRpb24gb2YgYSBjb3VudHJ5Lg0KDQpNdXRhdGUoKSBpcyB1c2VkIHRvIGNyZWF0ZSBHRFBfUGVyX2NhcGl0YSB2YXJpYWJsZSBieSBkaXZpbmcgYEdEUF9CWV9JTUYgKGluIFVTJClgIHRvIGBwb3B1bGF0aW9uYC4NCg0KIyMJU2NhbiBJIA0KDQpgYGB7cn0NCiNzY2FuIGZvciBtaXNzaW5nIHZhbHVlDQpjb2xTdW1zKGlzLm5hKGRhdGFfMSkpDQoNCiNzY2FuIGZvciBlcnJvcnMNCnN1bShpcy5uYW4oZGF0YV8xJGBDb3VudHJ5IE5hbWVgKSkNCnN1bShpcy5uYW4oZGF0YV8xJFJlZ2lvbikpDQpzdW0oaXMubmFuKGRhdGFfMSRJbmNvbWVHcm91cCkpDQpzdW0oaXMubmFuKGRhdGFfMSRwb3B1bGF0aW9uKSkNCnN1bShpcy5uYW4oZGF0YV8xJGBHRFBfQllfSU1GIChpbiBVUyQpYCkpDQpzdW0oaXMubmFuKGRhdGFfMSRgR0RQX0JZX1VOIChpbiBVUyQpYCkpDQpzdW0oaXMubmFuKGRhdGFfMSRgR0RQX1Blcl9DYXBpdGEgKGluIFVTJClgKSkNCmBgYA0KDQp3ZSBoYXZlIDAgTWlzc2luZyB2YWx1ZXMgaW4gZWFjaCB2YXJpYWJsZS4NClRoZSBvdXRwdXQgaXMgemVybyBoZW5jZSwgdGhlcmUgaXMgbm8gZXJyb3IgaW4gZGF0YXNldC4NCg0KIyMJU2NhbiBJSQ0KDQpgYGB7cn0NCiMgb3V0bGllcnMgZGV0ZWN0aW9uIGluIG51bWVyaWMgdmFyaWFibGUNCkdEUF9JTUY8LWJveHBsb3QoZGF0YV8xJGBHRFBfQllfSU1GIChpbiBVUyQpYCwgbWFpbiA9ICJHRFAgYnkgSU1GIikNCg0KR0RQX3Blcl9DYXA8LWJveHBsb3QoZGF0YV8xJGBHRFBfUGVyX0NhcGl0YSAoaW4gVVMkKWAsIG1haW4gPSAiQm94IHBsb3Qgb2YgR0RQIFBlciBDYXBpdGEiKQ0KDQp6X3Njb3Jlc19HRFBfcGVyX0NhcCA8LSBkYXRhXzEkYEdEUF9QZXJfQ2FwaXRhIChpbiBVUyQpYCAlPiUgIHNjb3Jlcyh0eXBlID0gInoiKQ0Kel9zY29yZXNfR0RQX3Blcl9DYXAgJT4lIHN1bW1hcnkoKQ0KDQpsZW5ndGggKHdoaWNoKCBhYnMoel9zY29yZXNfR0RQX3Blcl9DYXApID4zICkpDQoNCmNhcCA8LSBmdW5jdGlvbih4KXsNCnF1YW50aWxlcyA8LSBxdWFudGlsZSggeCwgYyguMDUsIDAuMjUsIDAuNzUsIC45NSkpDQp4WyB4IDwgcXVhbnRpbGVzWzJdIC0gMS41KklRUih4KSBdIDwtIHF1YW50aWxlc1sxXQ0KeFsgeCA+IHF1YW50aWxlc1szXSArIDEuNSpJUVIoeCkgXSA8LSBxdWFudGlsZXNbM10rMS41KklRUih4KQ0KeA0KfQ0KDQpHRFBfcGVyX0NhcGl0YV9jYXBwZWQgPC0gc2FwcGx5KGRhdGFfMSAlPiUgc2VsZWN0KGBHRFBfUGVyX0NhcGl0YSAoaW4gVVMkKWApLEZVTiA9IGNhcCkNCmRhdGFfMV9jYXBwZWQgPC0gY2JpbmQgKGRhdGFfMSAlPiUgc2VsZWN0KC1gR0RQX1Blcl9DYXBpdGEgKGluIFVTJClgKSxHRFBfcGVyX0NhcGl0YV9jYXBwZWQpDQoNCmJveHBsb3QoZGF0YV8xX2NhcHBlZCRgR0RQX1Blcl9DYXBpdGEgKGluIFVTJClgICxtYWluID0iQm94IFBsb3QgZm9yIEdEUF9QZXJfQ2FwaXRhIChpbiBVUyQpIikNCg0KYGBgDQoNCiMjCVRyYW5zZm9ybSANCg0KYGBge3J9DQpoaXN0KGRhdGFfMSRgR0RQX1Blcl9DYXBpdGEgKGluIFVTJClgLCBtYWluID0gIkdEUCBwZXIgQ2FwaXRhIGJlZm9yZSB0cmFuc2Zvcm1hdGlvbiIseGxhYj0iR0RQIHBlciBDYXBpdGEiLGNvbD0ibGlnaHRibHVlIixicmVha3M9MTApDQoNCmhpc3QobG9nKGRhdGFfMSRgR0RQX1Blcl9DYXBpdGEgKGluIFVTJClgKSwgbWFpbiA9ICJHRFAgcGVyIENhcGl0YSBhZnRlciB0cmFuc2Zvcm1hdGlvbiIseGxhYj0iR0RQIHBlciBDYXBpdGEiLGNvbD0ib3JhbmdlIixicmVha3M9MTApDQoNCmBgYA0KDQpHRFBfUGVyX0NhcGl0YSBEaXN0cmlidXRpb24gaXMgcmlnaHQtc2tld2VkLkluIG9yZGVyIHRvIHRyYW5mb3JtIGl0IGludG8gc3ltbWV0cmljIE9uZSwgbG9nKCkgZnVuY3Rpb24gaXMgdXNlZCB0byBsb3dlciB0aGUgcmlnaHQtU2tld25lc3Mu