1. Introduction: History Nobel Prizes
The Nobel Prize is perhaps the worlds most well known scientific
award. Except for the honor, prestige and substantial prize money the
recipient also gets a gold medal showing Alfred Nobel (1833 - 1896) who
established the prize. Every year it’s given to scientists and scholars
in the categories chemistry, literature, physics, physiology or
medicine, economics, and peace. The first Nobel Prize was handed out in
1901, and at that time the Prize was very Eurocentric and male-focused,
but nowadays it’s not biased in any way whatsoever. Surely. Right?
Well, we’re going to find out! The Nobel Foundation has made a
dataset available of all prize winners from the start of the prize, in
1901, to 2016. Let’s load it in and take a look.
2. About the Dataset
The dataset is available on Kaggle. The dataset contains only one
file “archive.csv”. Link to the dataset - here
2.1 Context
Between 1901 and 2016, the Nobel Prizes and the Prize in Economic
Sciences were awarded 579 times to 911 people and organizations. The
Nobel Prize is an international award administered by the Nobel
Foundation in Stockholm, Sweden, and based on the fortune of Alfred
Nobel, Swedish inventor and entrepreneur. In 1968, Sveriges Riksbank
established The Sveriges Riksbank Prize in Economic Sciences in Memory
of Alfred Nobel, founder of the Nobel Prize. Each Prize consists of a
medal, a personal diploma, and a cash award.
A person or organization awarded the Nobel Prize is called Nobel
Laureate. The word “laureate” refers to being signified by the laurel
wreath. In ancient Greece, laurel wreaths were awarded to victors as a
sign of honor.
3. Preparing the Data
3.1 Installing & Loading the required packages
install.packages("tidyverse")
Installing package into ‘C:/Users/mohit/AppData/Local/R/win-library/4.3’
(as ‘lib’ is unspecified)
trying URL 'https://cran.rstudio.com/bin/windows/contrib/4.3/tidyverse_2.0.0.zip'
Content type 'application/zip' length 430702 bytes (420 KB)
downloaded 420 KB
package ‘tidyverse’ successfully unpacked and MD5 sums checked
The downloaded binary packages are in
C:\Users\mohit\AppData\Local\Temp\RtmpERyazU\downloaded_packages
install.packages("lubridate")
Installing package into ‘C:/Users/mohit/AppData/Local/R/win-library/4.3’
(as ‘lib’ is unspecified)
trying URL 'https://cran.rstudio.com/bin/windows/contrib/4.3/lubridate_1.9.2.zip'
Content type 'application/zip' length 982251 bytes (959 KB)
downloaded 959 KB
package ‘lubridate’ successfully unpacked and MD5 sums checked
The downloaded binary packages are in
C:\Users\mohit\AppData\Local\Temp\RtmpERyazU\downloaded_packages
library(tidyverse)
── Attaching core tidyverse packages ────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse 2.0.0 ──
✔ dplyr 1.1.2 ✔ readr 2.1.4
✔ forcats 1.0.0 ✔ stringr 1.5.0
✔ ggplot2 3.4.2 ✔ tibble 3.2.1
✔ lubridate 1.9.2 ✔ tidyr 1.3.0
✔ purrr 1.0.1 ── Conflicts ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
library(lubridate)
3.2 Loading the Data
nobel <- read_csv("data/nobel.csv")
Rows: 911 Columns: 18── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (14): category, prize, motivation, prize_share, laureate_type, full_name, birth_city, birth_country, sex, organization_name, organization_city, organ...
dbl (2): year, laureate_id
date (2): birth_date, death_date
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# Checking the data is working or not
head(nobel)
4. Analyzing the Data
Just looking at the first couple of prize winners, or Nobel laureates
as they are also called, we already see a celebrity: Wilhelm Conrad
Röntgen, the guy who discovered X-rays. And actually, we see that all of
the winners in 1901 were guys that came from Europe. But that was back
in 1901, looking at all winners in the dataset, from 1901 to 2016, which
sex and which country is the most commonly represented?
(For country, we will use the birth_country of the winner, as the
organization_country is NA for all shared Nobel Prizes.)
4.1 How many Nobel Prizes had handed out from 1901 to 2016?
nobel %>% count()
4.2 What is the breakdown of the number of prizes won by male and
female recipients?
nobel %>%
count(sex)
4.3 How many prizes have been won by recipients of different
nationalities?
nobel %>%
count(birth_country) %>%
arrange(desc(n)) %>%
head(20)
Note: From above table we can see that the most
common Nobel laureate between 1901 and 2016 was a man born in the United
States of America. But in 1901 all the laureates were European. When did
the USA start to dominate the Nobel Prize charts? Let’s check:
4.4 What is the proportion of winners born in the USA per
decade?
prop_usa_winners <- nobel %>%
mutate(
usa_born_winner = birth_country == "United States of America",
decade = floor(year / 10) * 10
) %>%
group_by(decade) %>%
summarize(proportion = mean(usa_born_winner, na.rm = TRUE))
# Display the proportions of USA born winners per decade
prop_usa_winners
4.5 Who is the first woman to win the Nobel Prize and which
catagory?
nobel %>%
filter(sex == "Female") %>%
top_n(1, desc(year))
4.6 Who is the youngest winner of Nobel Prize as of 2016?
You can also find this name in this section.
youngest_winner <- "Malala Yousafzai"
youngest_winner
[1] "Malala Yousafzai"
5. Data Visualization
From the above table illustration, we can see the proportion of Nobel
Prize winners born in the USA per decade. We need a visualization so
that we can determine the point in time when the USA started to dominate
the Nobel Prize charts.
5.1 Plotting the winners who have been born in the US:
ggplot(prop_usa_winners, aes(x = decade, y = proportion)) +
geom_line(color = "skyblue") +
geom_point(color = "red") +
scale_y_continuous(labels = scales::percent, limits = 0:1, expand = c(0, 0))
ggsave("img/plot01.png", dpi=1000)
Saving 6.89 x 4.25 in image
So, we can see that USA started dominating the charts from the 1930s
and has kept the leading position ever since. Now let’s calculate the
female winners per decade:
prop_female_winners <- nobel %>%
mutate(
female_winner = sex == "Female",
decade = floor(year / 10) * 10
) %>%
group_by(decade, category) %>%
summarize(proportion = mean(female_winner, na.rm = TRUE))
`summarise()` has grouped output by 'decade'. You can override using the `.groups` argument.
And finally visualizing the female winners per decade:
ggplot(prop_female_winners, aes(x = decade, y = proportion, color = category)) +
geom_line() +
geom_point() +
scale_y_continuous(labels = scales::percent, limits = 0:1, expand = c(0, 0))
ggsave("img/plot02.png", dpi=1000)
Saving 6.89 x 4.25 in image
The plot above is a bit messy as the lines are overplotting. But it
does show some interesting trends and patterns. Overall the imbalance is
pretty large with physics, economics, and chemistry having the largest
imbalance. Medicine has a somewhat positive trend, and since the 1990s
the literature prize is also now more balanced. The big outlier is the
peace prize during the 2010s, but keep in mind that this just covers the
years 2010 to 2016.
5.2 Who is the Nobel Prize laureate who has won the award more than
once?
For most scientists/writers/activists a Nobel Prize would be the
crowning achievement of a long career. But for some people, one is just
not enough, and there are few that have gotten it more than once. To
find that:
nobel %>%
count(full_name) %>%
filter(n > 1)
We again meet Marie Curie, who got the prize in physics for
discovering radiation and in chemistry for isolating radium and
polonium. John Bardeen got it twice in physics for transistors and
superconductivity, Frederick Sanger got it twice in chemistry, and Linus
Carl Pauling got it first in chemistry and later in peace for his work
in promoting nuclear disarmament. We also learn that organizations also
get the prize as both the Red Cross and the UNHCR have gotten it
twice.
5.3 Age distribution of Nobel Prize Winners
To visualize the age distribution of the Nobel Prize laureate, first
we need to calculate the age of individual winners.
nobel_age <- nobel %>%
mutate(age = year - year(birth_date))
After calculating the ages of the winners let’s plot the data for
better understanding.
ggplot(nobel_age, aes(x = age, y = year)) +
geom_point(color = "blue") +
geom_smooth(color = "red")
ggsave("img/plot03.png", dpi=1000)
Saving 6.89 x 4.25 in image
The plot above shows us a lot! We see that people use to be around 55
when they received the price, but nowadays the average is closer to 65.
But there is a large spread in the laureates’ ages, and while most are
50+, some are very young.
We also see that the density of points is much high nowadays than in
the early 1900s – nowadays many more of the prizes are shared, and so
there are many more winners. We also see that there was a disruption in
awarded prizes around the Second World War (1939 - 1945).
5.4 Age differences between prize categories
In the previous plot we visualized the age distribution but it was
not within different prize categories. So, let us visualize that:
ggplot(nobel_age, aes(x = age, y = year)) +
geom_point(color = "lightslateblue") +
geom_smooth(se = FALSE, color = "red") +
facet_wrap(~ category)
ggsave("img/plot04.png", dpi=1000)
Saving 6.89 x 4.25 in image
Another plot with lots of exciting stuff going on! We see that both
winners of the chemistry, medicine, and physics prize have gotten older
over time. The trend is strongest for physics: the average age used to
be below 50, and now it’s almost 70. Literature and economics are more
stable, and we also see that economics is a newer category.
5.5 Oldest and Youngest Winners
But notice, Peace shows an opposite trend where winners are getting
younger!
In the peace category we also a winner around 2010 that seems
exceptionally young. This begs the questions, who are the oldest and
youngest people ever to have won a Nobel Prize?
5.5.1 Oldest Winner of 2016
# The oldest winner of a Nobel Prize as of 2016
nobel_age %>% top_n(1, age)
5.5.2 Youngest Winner of 2016
# The youngest winner of a Nobel Prize as of 2016
nobel_age %>% top_n(1, desc(age))
6. Conclusion
In conclusion, we have analyzed the Nobel Prize dataset from 1901 to
2016 and found some interesting insights. We saw that the USA started
dominating the Nobel Prize charts from the 1930s and has kept the
leading position ever since. We also observed that physics, economics,
and chemistry have the largest imbalance in gender representation. We
found out that Marie Curie is one of the few people who have won the
award more than once, and we also visualized the age distribution of
Nobel Prize winners over time. Finally, we discovered that Leonid
Hurwicz was the oldest winner of a Nobel Prize as of 2016 while Malala
Yousafzai was the youngest. Overall, this dataset provides a fascinating
insight into one of the world’s most prestigious scientific awards and
its history.
LS0tDQp0aXRsZTogIkEgVmlzdWFsIEhpc3Rvcnkgb2YgTm9iZWwgUHJpemUgV2lubmVycyINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdA0KICBodG1sX2RvY3VtZW50OiBkZWZhdWx0DQogIHBkZl9kb2N1bWVudDogZGVmYXVsdA0KLS0tDQoNCiMgMS4gSW50cm9kdWN0aW9uOiBIaXN0b3J5IE5vYmVsIFByaXplcw0KDQohW10oaW1nL25vYmVsLnBuZyl7d2lkdGg9IjMwMCIgaGVpZ2h0PSIzMDAifQ0KDQpUaGUgTm9iZWwgUHJpemUgaXMgcGVyaGFwcyB0aGUgd29ybGRzIG1vc3Qgd2VsbCBrbm93biBzY2llbnRpZmljIGF3YXJkLiBFeGNlcHQgZm9yIHRoZSBob25vciwgcHJlc3RpZ2UgYW5kIHN1YnN0YW50aWFsIHByaXplIG1vbmV5IHRoZSByZWNpcGllbnQgYWxzbyBnZXRzIGEgZ29sZCBtZWRhbCBzaG93aW5nIEFsZnJlZCBOb2JlbCAoMTgzMyAtIDE4OTYpIHdobyBlc3RhYmxpc2hlZCB0aGUgcHJpemUuIEV2ZXJ5IHllYXIgaXQncyBnaXZlbiB0byBzY2llbnRpc3RzIGFuZCBzY2hvbGFycyBpbiB0aGUgY2F0ZWdvcmllcyBjaGVtaXN0cnksIGxpdGVyYXR1cmUsIHBoeXNpY3MsIHBoeXNpb2xvZ3kgb3IgbWVkaWNpbmUsIGVjb25vbWljcywgYW5kIHBlYWNlLiBUaGUgZmlyc3QgTm9iZWwgUHJpemUgd2FzIGhhbmRlZCBvdXQgaW4gMTkwMSwgYW5kIGF0IHRoYXQgdGltZSB0aGUgUHJpemUgd2FzIHZlcnkgRXVyb2NlbnRyaWMgYW5kIG1hbGUtZm9jdXNlZCwgYnV0IG5vd2FkYXlzIGl0J3Mgbm90IGJpYXNlZCBpbiBhbnkgd2F5IHdoYXRzb2V2ZXIuIFN1cmVseS4gUmlnaHQ/DQoNCldlbGwsIHdlJ3JlIGdvaW5nIHRvIGZpbmQgb3V0ISBUaGUgTm9iZWwgRm91bmRhdGlvbiBoYXMgbWFkZSBhIGRhdGFzZXQgYXZhaWxhYmxlIG9mIGFsbCBwcml6ZSB3aW5uZXJzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBwcml6ZSwgaW4gMTkwMSwgdG8gMjAxNi4gTGV0J3MgbG9hZCBpdCBpbiBhbmQgdGFrZSBhIGxvb2suDQoNCiMgMi4gQWJvdXQgdGhlIERhdGFzZXQNCg0KVGhlIGRhdGFzZXQgaXMgYXZhaWxhYmxlIG9uIEthZ2dsZS4gVGhlIGRhdGFzZXQgY29udGFpbnMgb25seSBvbmUgZmlsZSAiYXJjaGl2ZS5jc3YiLiBMaW5rIHRvIHRoZSBkYXRhc2V0IC0gW2hlcmVdKGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vZGF0YXNldHMvbm9iZWxmb3VuZGF0aW9uL25vYmVsLWxhdXJlYXRlcykNCg0KIyMgMi4xIENvbnRleHQNCg0KQmV0d2VlbiAxOTAxIGFuZCAyMDE2LCB0aGUgTm9iZWwgUHJpemVzIGFuZCB0aGUgUHJpemUgaW4gRWNvbm9taWMgU2NpZW5jZXMgd2VyZSBhd2FyZGVkIDU3OSB0aW1lcyB0byA5MTEgcGVvcGxlIGFuZCBvcmdhbml6YXRpb25zLiBUaGUgTm9iZWwgUHJpemUgaXMgYW4gaW50ZXJuYXRpb25hbCBhd2FyZCBhZG1pbmlzdGVyZWQgYnkgdGhlIE5vYmVsIEZvdW5kYXRpb24gaW4gU3RvY2tob2xtLCBTd2VkZW4sIGFuZCBiYXNlZCBvbiB0aGUgZm9ydHVuZSBvZiBBbGZyZWQgTm9iZWwsIFN3ZWRpc2ggaW52ZW50b3IgYW5kIGVudHJlcHJlbmV1ci4gSW4gMTk2OCwgU3ZlcmlnZXMgUmlrc2JhbmsgZXN0YWJsaXNoZWQgVGhlIFN2ZXJpZ2VzIFJpa3NiYW5rIFByaXplIGluIEVjb25vbWljIFNjaWVuY2VzIGluIE1lbW9yeSBvZiBBbGZyZWQgTm9iZWwsIGZvdW5kZXIgb2YgdGhlIE5vYmVsIFByaXplLiBFYWNoIFByaXplIGNvbnNpc3RzIG9mIGEgbWVkYWwsIGEgcGVyc29uYWwgZGlwbG9tYSwgYW5kIGEgY2FzaCBhd2FyZC4NCg0KQSBwZXJzb24gb3Igb3JnYW5pemF0aW9uIGF3YXJkZWQgdGhlIE5vYmVsIFByaXplIGlzIGNhbGxlZCBOb2JlbCBMYXVyZWF0ZS4gVGhlIHdvcmQgImxhdXJlYXRlIiByZWZlcnMgdG8gYmVpbmcgc2lnbmlmaWVkIGJ5IHRoZSBsYXVyZWwgd3JlYXRoLiBJbiBhbmNpZW50IEdyZWVjZSwgbGF1cmVsIHdyZWF0aHMgd2VyZSBhd2FyZGVkIHRvIHZpY3RvcnMgYXMgYSBzaWduIG9mIGhvbm9yLg0KDQojIDMuIFByZXBhcmluZyB0aGUgRGF0YQ0KDQojIyMgMy4xIEluc3RhbGxpbmcgJiBMb2FkaW5nIHRoZSByZXF1aXJlZCBwYWNrYWdlcw0KDQpgYGB7cn0NCmluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpDQppbnN0YWxsLnBhY2thZ2VzKCJsdWJyaWRhdGUiKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmBgYA0KDQojIyMgMy4yIExvYWRpbmcgdGhlIERhdGENCg0KYGBge3J9DQpub2JlbCA8LSByZWFkX2NzdigiZGF0YS9ub2JlbC5jc3YiKQ0KIyBDaGVja2luZyB0aGUgZGF0YSBpcyB3b3JraW5nIG9yIG5vdA0KaGVhZChub2JlbCkNCmBgYA0KDQojIDQuIEFuYWx5emluZyB0aGUgRGF0YQ0KDQpKdXN0IGxvb2tpbmcgYXQgdGhlIGZpcnN0IGNvdXBsZSBvZiBwcml6ZSB3aW5uZXJzLCBvciBOb2JlbCBsYXVyZWF0ZXMgYXMgdGhleSBhcmUgYWxzbyBjYWxsZWQsIHdlIGFscmVhZHkgc2VlIGEgY2VsZWJyaXR5OiBXaWxoZWxtIENvbnJhZCBSw7ZudGdlbiwgdGhlIGd1eSB3aG8gZGlzY292ZXJlZCBYLXJheXMuIEFuZCBhY3R1YWxseSwgd2Ugc2VlIHRoYXQgYWxsIG9mIHRoZSB3aW5uZXJzIGluIDE5MDEgd2VyZSBndXlzIHRoYXQgY2FtZSBmcm9tIEV1cm9wZS4gQnV0IHRoYXQgd2FzIGJhY2sgaW4gMTkwMSwgbG9va2luZyBhdCBhbGwgd2lubmVycyBpbiB0aGUgZGF0YXNldCwgZnJvbSAxOTAxIHRvIDIwMTYsIHdoaWNoIHNleCBhbmQgd2hpY2ggY291bnRyeSBpcyB0aGUgbW9zdCBjb21tb25seSByZXByZXNlbnRlZD8NCg0KKEZvciBjb3VudHJ5LCB3ZSB3aWxsIHVzZSB0aGUgYmlydGhfY291bnRyeSBvZiB0aGUgd2lubmVyLCBhcyB0aGUgb3JnYW5pemF0aW9uX2NvdW50cnkgaXMgTkEgZm9yIGFsbCBzaGFyZWQgTm9iZWwgUHJpemVzLikNCg0KIyMjIDQuMSBIb3cgbWFueSBOb2JlbCBQcml6ZXMgaGFkIGhhbmRlZCBvdXQgZnJvbSAxOTAxIHRvIDIwMTY/DQoNCmBgYHtyfQ0Kbm9iZWwgJT4lIGNvdW50KCkNCmBgYA0KDQojIyMgNC4yIFdoYXQgaXMgdGhlIGJyZWFrZG93biBvZiB0aGUgbnVtYmVyIG9mIHByaXplcyB3b24gYnkgbWFsZSBhbmQgZmVtYWxlIHJlY2lwaWVudHM/DQoNCmBgYHtyfQ0Kbm9iZWwgJT4lDQogIGNvdW50KHNleCkNCmBgYA0KDQojIyMgNC4zIEhvdyBtYW55IHByaXplcyBoYXZlIGJlZW4gd29uIGJ5IHJlY2lwaWVudHMgb2YgZGlmZmVyZW50IG5hdGlvbmFsaXRpZXM/DQoNCmBgYHtyfQ0Kbm9iZWwgJT4lDQogIGNvdW50KGJpcnRoX2NvdW50cnkpICU+JQ0KICBhcnJhbmdlKGRlc2MobikpICU+JQ0KICBoZWFkKDIwKQ0KYGBgDQoNCioqTm90ZToqKiBGcm9tIGFib3ZlIHRhYmxlIHdlIGNhbiBzZWUgdGhhdCB0aGUgbW9zdCBjb21tb24gTm9iZWwgbGF1cmVhdGUgYmV0d2VlbiAxOTAxIGFuZCAyMDE2IHdhcyBhIG1hbiBib3JuIGluIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIEJ1dCBpbiAxOTAxIGFsbCB0aGUgbGF1cmVhdGVzIHdlcmUgRXVyb3BlYW4uIFdoZW4gZGlkIHRoZSBVU0Egc3RhcnQgdG8gZG9taW5hdGUgdGhlIE5vYmVsIFByaXplIGNoYXJ0cz8gTGV0J3MgY2hlY2s6DQoNCiMjIyA0LjQgV2hhdCBpcyB0aGUgcHJvcG9ydGlvbiBvZiB3aW5uZXJzIGJvcm4gaW4gdGhlIFVTQSBwZXIgZGVjYWRlPw0KDQpgYGB7cn0NCnByb3BfdXNhX3dpbm5lcnMgPC0gbm9iZWwgJT4lIA0KICBtdXRhdGUoDQogICAgdXNhX2Jvcm5fd2lubmVyID0gYmlydGhfY291bnRyeSA9PSAiVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhIiwNCiAgICBkZWNhZGUgPSBmbG9vcih5ZWFyIC8gMTApICogMTANCiAgKSAlPiUNCiAgZ3JvdXBfYnkoZGVjYWRlKSAlPiUNCiAgc3VtbWFyaXplKHByb3BvcnRpb24gPSBtZWFuKHVzYV9ib3JuX3dpbm5lciwgbmEucm0gPSBUUlVFKSkNCg0KIyBEaXNwbGF5IHRoZSBwcm9wb3J0aW9ucyBvZiBVU0EgYm9ybiB3aW5uZXJzIHBlciBkZWNhZGUNCnByb3BfdXNhX3dpbm5lcnMNCmBgYA0KDQojIyMgNC41IFdobyBpcyB0aGUgZmlyc3Qgd29tYW4gdG8gd2luIHRoZSBOb2JlbCBQcml6ZSBhbmQgd2hpY2ggY2F0YWdvcnk/DQoNCmBgYHtyfQ0Kbm9iZWwgJT4lDQogICAgZmlsdGVyKHNleCA9PSAiRmVtYWxlIikgJT4lDQogICAgdG9wX24oMSwgZGVzYyh5ZWFyKSkNCmBgYA0KDQojIyMgNC42IFdobyBpcyB0aGUgeW91bmdlc3Qgd2lubmVyIG9mIE5vYmVsIFByaXplIGFzIG9mIDIwMTY/DQoNCllvdSBjYW4gYWxzbyBmaW5kIHRoaXMgbmFtZSBpbiB0aGlzIFtzZWN0aW9uXSgjY3VzdG9tKS4NCg0KYGBge3J9DQp5b3VuZ2VzdF93aW5uZXIgPC0gIk1hbGFsYSBZb3VzYWZ6YWkiDQp5b3VuZ2VzdF93aW5uZXINCmBgYA0KDQojIDUuIERhdGEgVmlzdWFsaXphdGlvbg0KDQpGcm9tIHRoZSBhYm92ZSB0YWJsZSBpbGx1c3RyYXRpb24sIHdlIGNhbiBzZWUgdGhlIHByb3BvcnRpb24gb2YgTm9iZWwgUHJpemUgd2lubmVycyBib3JuIGluIHRoZSBVU0EgcGVyIGRlY2FkZS4gV2UgbmVlZCBhIHZpc3VhbGl6YXRpb24gc28gdGhhdCB3ZSBjYW4gZGV0ZXJtaW5lIHRoZSBwb2ludCBpbiB0aW1lIHdoZW4gdGhlIFVTQSBzdGFydGVkIHRvIGRvbWluYXRlIHRoZSBOb2JlbCBQcml6ZSBjaGFydHMuDQoNCiMjIyA1LjEgUGxvdHRpbmcgdGhlIHdpbm5lcnMgd2hvIGhhdmUgYmVlbiBib3JuIGluIHRoZSBVUzoNCg0KYGBge3J9DQpnZ3Bsb3QocHJvcF91c2Ffd2lubmVycywgYWVzKHggPSBkZWNhZGUsIHkgPSBwcm9wb3J0aW9uKSkgKw0KICBnZW9tX2xpbmUoY29sb3IgPSAic2t5Ymx1ZSIpICsNCiAgZ2VvbV9wb2ludChjb2xvciA9ICJyZWQiKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQsIGxpbWl0cyA9IDA6MSwgZXhwYW5kID0gYygwLCAwKSkNCmdnc2F2ZSgiaW1nL3Bsb3QwMS5wbmciLCBkcGk9MTAwMCkNCmBgYA0KDQpTbywgd2UgY2FuIHNlZSB0aGF0IFVTQSBzdGFydGVkIGRvbWluYXRpbmcgdGhlIGNoYXJ0cyBmcm9tIHRoZSAxOTMwcyBhbmQgaGFzIGtlcHQgdGhlIGxlYWRpbmcgcG9zaXRpb24gZXZlciBzaW5jZS4gTm93IGxldCdzIGNhbGN1bGF0ZSB0aGUgZmVtYWxlIHdpbm5lcnMgcGVyIGRlY2FkZToNCg0KYGBge3J9DQpwcm9wX2ZlbWFsZV93aW5uZXJzIDwtIG5vYmVsICU+JQ0KICAgIG11dGF0ZSgNCiAgICAgICAgZmVtYWxlX3dpbm5lciA9IHNleCA9PSAiRmVtYWxlIiwNCiAgICAgICAgZGVjYWRlID0gZmxvb3IoeWVhciAvIDEwKSAqIDEwDQogICAgKSAlPiUNCiAgICBncm91cF9ieShkZWNhZGUsIGNhdGVnb3J5KSAlPiUNCiAgICBzdW1tYXJpemUocHJvcG9ydGlvbiA9IG1lYW4oZmVtYWxlX3dpbm5lciwgbmEucm0gPSBUUlVFKSkNCmBgYA0KDQpBbmQgZmluYWxseSB2aXN1YWxpemluZyB0aGUgZmVtYWxlIHdpbm5lcnMgcGVyIGRlY2FkZToNCg0KYGBge3J9DQpnZ3Bsb3QocHJvcF9mZW1hbGVfd2lubmVycywgYWVzKHggPSBkZWNhZGUsIHkgPSBwcm9wb3J0aW9uLCBjb2xvciA9IGNhdGVnb3J5KSkgKw0KICBnZW9tX2xpbmUoKSArDQogIGdlb21fcG9pbnQoKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQsIGxpbWl0cyA9IDA6MSwgZXhwYW5kID0gYygwLCAwKSkNCmdnc2F2ZSgiaW1nL3Bsb3QwMi5wbmciLCBkcGk9MTAwMCkNCmBgYA0KDQpUaGUgcGxvdCBhYm92ZSBpcyBhIGJpdCBtZXNzeSBhcyB0aGUgbGluZXMgYXJlIG92ZXJwbG90dGluZy4gQnV0IGl0IGRvZXMgc2hvdyBzb21lIGludGVyZXN0aW5nIHRyZW5kcyBhbmQgcGF0dGVybnMuIE92ZXJhbGwgdGhlIGltYmFsYW5jZSBpcyBwcmV0dHkgbGFyZ2Ugd2l0aCBwaHlzaWNzLCBlY29ub21pY3MsIGFuZCBjaGVtaXN0cnkgaGF2aW5nIHRoZSBsYXJnZXN0IGltYmFsYW5jZS4gTWVkaWNpbmUgaGFzIGEgc29tZXdoYXQgcG9zaXRpdmUgdHJlbmQsIGFuZCBzaW5jZSB0aGUgMTk5MHMgdGhlIGxpdGVyYXR1cmUgcHJpemUgaXMgYWxzbyBub3cgbW9yZSBiYWxhbmNlZC4gVGhlIGJpZyBvdXRsaWVyIGlzIHRoZSBwZWFjZSBwcml6ZSBkdXJpbmcgdGhlIDIwMTBzLCBidXQga2VlcCBpbiBtaW5kIHRoYXQgdGhpcyBqdXN0IGNvdmVycyB0aGUgeWVhcnMgMjAxMCB0byAyMDE2Lg0KDQojIyMgNS4yIFdobyBpcyB0aGUgTm9iZWwgUHJpemUgbGF1cmVhdGUgd2hvIGhhcyB3b24gdGhlIGF3YXJkIG1vcmUgdGhhbiBvbmNlPw0KDQpGb3IgbW9zdCBzY2llbnRpc3RzL3dyaXRlcnMvYWN0aXZpc3RzIGEgTm9iZWwgUHJpemUgd291bGQgYmUgdGhlIGNyb3duaW5nIGFjaGlldmVtZW50IG9mIGEgbG9uZyBjYXJlZXIuIEJ1dCBmb3Igc29tZSBwZW9wbGUsIG9uZSBpcyBqdXN0IG5vdCBlbm91Z2gsIGFuZCB0aGVyZSBhcmUgZmV3IHRoYXQgaGF2ZSBnb3R0ZW4gaXQgbW9yZSB0aGFuIG9uY2UuIFRvIGZpbmQgdGhhdDoNCg0KYGBge3J9DQpub2JlbCAlPiUNCiAgY291bnQoZnVsbF9uYW1lKSAlPiUNCiAgZmlsdGVyKG4gPiAxKQ0KYGBgDQoNCldlIGFnYWluIG1lZXQgTWFyaWUgQ3VyaWUsIHdobyBnb3QgdGhlIHByaXplIGluIHBoeXNpY3MgZm9yIGRpc2NvdmVyaW5nIHJhZGlhdGlvbiBhbmQgaW4gY2hlbWlzdHJ5IGZvciBpc29sYXRpbmcgcmFkaXVtIGFuZCBwb2xvbml1bS4gSm9obiBCYXJkZWVuIGdvdCBpdCB0d2ljZSBpbiBwaHlzaWNzIGZvciB0cmFuc2lzdG9ycyBhbmQgc3VwZXJjb25kdWN0aXZpdHksIEZyZWRlcmljayBTYW5nZXIgZ290IGl0IHR3aWNlIGluIGNoZW1pc3RyeSwgYW5kIExpbnVzIENhcmwgUGF1bGluZyBnb3QgaXQgZmlyc3QgaW4gY2hlbWlzdHJ5IGFuZCBsYXRlciBpbiBwZWFjZSBmb3IgaGlzIHdvcmsgaW4gcHJvbW90aW5nIG51Y2xlYXIgZGlzYXJtYW1lbnQuIFdlIGFsc28gbGVhcm4gdGhhdCBvcmdhbml6YXRpb25zIGFsc28gZ2V0IHRoZSBwcml6ZSBhcyBib3RoIHRoZSBSZWQgQ3Jvc3MgYW5kIHRoZSBVTkhDUiBoYXZlIGdvdHRlbiBpdCB0d2ljZS4NCg0KIyMjIDUuMyBBZ2UgZGlzdHJpYnV0aW9uIG9mIE5vYmVsIFByaXplIFdpbm5lcnMNCg0KVG8gdmlzdWFsaXplIHRoZSBhZ2UgZGlzdHJpYnV0aW9uIG9mIHRoZSBOb2JlbCBQcml6ZSBsYXVyZWF0ZSwgZmlyc3Qgd2UgbmVlZCB0byBjYWxjdWxhdGUgdGhlIGFnZSBvZiBpbmRpdmlkdWFsIHdpbm5lcnMuDQoNCmBgYHtyfQ0Kbm9iZWxfYWdlIDwtIG5vYmVsICU+JQ0KICBtdXRhdGUoYWdlID0geWVhciAtIHllYXIoYmlydGhfZGF0ZSkpDQpgYGANCg0KQWZ0ZXIgY2FsY3VsYXRpbmcgdGhlIGFnZXMgb2YgdGhlIHdpbm5lcnMgbGV0J3MgcGxvdCB0aGUgZGF0YSBmb3IgYmV0dGVyIHVuZGVyc3RhbmRpbmcuDQoNCmBgYHtyfQ0KZ2dwbG90KG5vYmVsX2FnZSwgYWVzKHggPSBhZ2UsIHkgPSB5ZWFyKSkgKw0KICBnZW9tX3BvaW50KGNvbG9yID0gImJsdWUiKSArDQogIGdlb21fc21vb3RoKGNvbG9yID0gInJlZCIpDQpnZ3NhdmUoImltZy9wbG90MDMucG5nIiwgZHBpPTEwMDApDQpgYGANCg0KVGhlIHBsb3QgYWJvdmUgc2hvd3MgdXMgYSBsb3QhIFdlIHNlZSB0aGF0IHBlb3BsZSB1c2UgdG8gYmUgYXJvdW5kIDU1IHdoZW4gdGhleSByZWNlaXZlZCB0aGUgcHJpY2UsIGJ1dCBub3dhZGF5cyB0aGUgYXZlcmFnZSBpcyBjbG9zZXIgdG8gNjUuIEJ1dCB0aGVyZSBpcyBhIGxhcmdlIHNwcmVhZCBpbiB0aGUgbGF1cmVhdGVzJyBhZ2VzLCBhbmQgd2hpbGUgbW9zdCBhcmUgNTArLCBzb21lIGFyZSB2ZXJ5IHlvdW5nLg0KDQpXZSBhbHNvIHNlZSB0aGF0IHRoZSBkZW5zaXR5IG9mIHBvaW50cyBpcyBtdWNoIGhpZ2ggbm93YWRheXMgdGhhbiBpbiB0aGUgZWFybHkgMTkwMHMgLS0gbm93YWRheXMgbWFueSBtb3JlIG9mIHRoZSBwcml6ZXMgYXJlIHNoYXJlZCwgYW5kIHNvIHRoZXJlIGFyZSBtYW55IG1vcmUgd2lubmVycy4gV2UgYWxzbyBzZWUgdGhhdCB0aGVyZSB3YXMgYSBkaXNydXB0aW9uIGluIGF3YXJkZWQgcHJpemVzIGFyb3VuZCB0aGUgU2Vjb25kIFdvcmxkIFdhciAoMTkzOSAtIDE5NDUpLg0KDQojIyMgNS40IEFnZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHByaXplIGNhdGVnb3JpZXMNCg0KSW4gdGhlIHByZXZpb3VzIHBsb3Qgd2UgdmlzdWFsaXplZCB0aGUgYWdlIGRpc3RyaWJ1dGlvbiBidXQgaXQgd2FzIG5vdCB3aXRoaW4gZGlmZmVyZW50IHByaXplIGNhdGVnb3JpZXMuIFNvLCBsZXQgdXMgdmlzdWFsaXplIHRoYXQ6DQoNCmBgYHtyfQ0KZ2dwbG90KG5vYmVsX2FnZSwgYWVzKHggPSBhZ2UsIHkgPSB5ZWFyKSkgKw0KICBnZW9tX3BvaW50KGNvbG9yID0gImxpZ2h0c2xhdGVibHVlIikgKw0KICBnZW9tX3Ntb290aChzZSA9IEZBTFNFLCBjb2xvciA9ICJyZWQiKSArDQogIGZhY2V0X3dyYXAofiBjYXRlZ29yeSkNCmdnc2F2ZSgiaW1nL3Bsb3QwNC5wbmciLCBkcGk9MTAwMCkNCmBgYA0KDQpBbm90aGVyIHBsb3Qgd2l0aCBsb3RzIG9mIGV4Y2l0aW5nIHN0dWZmIGdvaW5nIG9uISBXZSBzZWUgdGhhdCBib3RoIHdpbm5lcnMgb2YgdGhlIGNoZW1pc3RyeSwgbWVkaWNpbmUsIGFuZCBwaHlzaWNzIHByaXplIGhhdmUgZ290dGVuIG9sZGVyIG92ZXIgdGltZS4gVGhlIHRyZW5kIGlzIHN0cm9uZ2VzdCBmb3IgcGh5c2ljczogdGhlIGF2ZXJhZ2UgYWdlIHVzZWQgdG8gYmUgYmVsb3cgNTAsIGFuZCBub3cgaXQncyBhbG1vc3QgNzAuIExpdGVyYXR1cmUgYW5kIGVjb25vbWljcyBhcmUgbW9yZSBzdGFibGUsIGFuZCB3ZSBhbHNvIHNlZSB0aGF0IGVjb25vbWljcyBpcyBhIG5ld2VyIGNhdGVnb3J5Lg0KDQojIyMgNS41IE9sZGVzdCBhbmQgWW91bmdlc3QgV2lubmVycw0KDQpCdXQgbm90aWNlLCBQZWFjZSBzaG93cyBhbiBvcHBvc2l0ZSB0cmVuZCB3aGVyZSB3aW5uZXJzIGFyZSBnZXR0aW5nIHlvdW5nZXIhDQoNCkluIHRoZSBwZWFjZSBjYXRlZ29yeSB3ZSBhbHNvIGEgd2lubmVyIGFyb3VuZCAyMDEwIHRoYXQgc2VlbXMgZXhjZXB0aW9uYWxseSB5b3VuZy4gVGhpcyBiZWdzIHRoZSBxdWVzdGlvbnMsIHdobyBhcmUgdGhlIG9sZGVzdCBhbmQgeW91bmdlc3QgcGVvcGxlIGV2ZXIgdG8gaGF2ZSB3b24gYSBOb2JlbCBQcml6ZT8NCg0KIyMjIyA1LjUuMSBPbGRlc3QgV2lubmVyIG9mIDIwMTYNCg0KYGBge3J9DQojIFRoZSBvbGRlc3Qgd2lubmVyIG9mIGEgTm9iZWwgUHJpemUgYXMgb2YgMjAxNg0Kbm9iZWxfYWdlICU+JSB0b3BfbigxLCBhZ2UpDQpgYGANCg0KIyMjIyA1LjUuMiBZb3VuZ2VzdCBXaW5uZXIgb2YgMjAxNiB7I2N1c3RvbX0NCg0KYGBge3J9DQojIFRoZSB5b3VuZ2VzdCB3aW5uZXIgb2YgYSBOb2JlbCBQcml6ZSBhcyBvZiAyMDE2DQpub2JlbF9hZ2UgJT4lIHRvcF9uKDEsIGRlc2MoYWdlKSkNCmBgYA0KDQojIDYuIENvbmNsdXNpb24NCg0KSW4gY29uY2x1c2lvbiwgd2UgaGF2ZSBhbmFseXplZCB0aGUgTm9iZWwgUHJpemUgZGF0YXNldCBmcm9tIDE5MDEgdG8gMjAxNiBhbmQgZm91bmQgc29tZSBpbnRlcmVzdGluZyBpbnNpZ2h0cy4gV2Ugc2F3IHRoYXQgdGhlIFVTQSBzdGFydGVkIGRvbWluYXRpbmcgdGhlIE5vYmVsIFByaXplIGNoYXJ0cyBmcm9tIHRoZSAxOTMwcyBhbmQgaGFzIGtlcHQgdGhlIGxlYWRpbmcgcG9zaXRpb24gZXZlciBzaW5jZS4gV2UgYWxzbyBvYnNlcnZlZCB0aGF0IHBoeXNpY3MsIGVjb25vbWljcywgYW5kIGNoZW1pc3RyeSBoYXZlIHRoZSBsYXJnZXN0IGltYmFsYW5jZSBpbiBnZW5kZXIgcmVwcmVzZW50YXRpb24uIFdlIGZvdW5kIG91dCB0aGF0IE1hcmllIEN1cmllIGlzIG9uZSBvZiB0aGUgZmV3IHBlb3BsZSB3aG8gaGF2ZSB3b24gdGhlIGF3YXJkIG1vcmUgdGhhbiBvbmNlLCBhbmQgd2UgYWxzbyB2aXN1YWxpemVkIHRoZSBhZ2UgZGlzdHJpYnV0aW9uIG9mIE5vYmVsIFByaXplIHdpbm5lcnMgb3ZlciB0aW1lLiBGaW5hbGx5LCB3ZSBkaXNjb3ZlcmVkIHRoYXQgTGVvbmlkIEh1cndpY3ogd2FzIHRoZSBvbGRlc3Qgd2lubmVyIG9mIGEgTm9iZWwgUHJpemUgYXMgb2YgMjAxNiB3aGlsZSBNYWxhbGEgWW91c2FmemFpIHdhcyB0aGUgeW91bmdlc3QuIE92ZXJhbGwsIHRoaXMgZGF0YXNldCBwcm92aWRlcyBhIGZhc2NpbmF0aW5nIGluc2lnaHQgaW50byBvbmUgb2YgdGhlIHdvcmxkJ3MgbW9zdCBwcmVzdGlnaW91cyBzY2llbnRpZmljIGF3YXJkcyBhbmQgaXRzIGhpc3RvcnkuDQo=