Skip to content

Instantly share code, notes, and snippets.

@ScienceTony
Created July 24, 2019 23:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ScienceTony/c6e53e66aba5991f1d772d1b9e4eeadc to your computer and use it in GitHub Desktop.
Save ScienceTony/c6e53e66aba5991f1d772d1b9e4eeadc to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# SQL With Pandas And Making Maps With Folium"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[Tony McDonald](https://twitter.com/ScienceTony)"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'24-07-2019'"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from datetime import datetime\n",
"datetime.today().strftime('%d-%m-%Y')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"License: MIT License with Copyright (c) 2019 Socratica https://github.com/socratica/data/blob/master/LICENSE\n",
"<p>The license allows me to freely use, manipulate and distribute the dataset.</p> "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# There is another way of using SQL in these notebooks and that is to use sqldf. "
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# <a name=\"pysqldf\"></a>import the sqldf function from pandasql: "
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"from pandasql import sqldf\n",
"\n",
"# Then create a simple wrapper function to allow us to supply the query 'q' without \n",
"# the surrounding syntax.\n",
"pysqldf = lambda q: sqldf(q, globals())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[Find the pysqldf in use](#step1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Find the directory of datasets"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Chitter with SQL.ipynb\r\n",
"Create A View And Find The Difference Between Nukes and Quakes.ipynb\r\n",
"Examine Earthquake with pandas.ipynb\r\n",
"Examine earthquake using SQL magic.ipynb\r\n",
"SQL_Pandas_and_sqldf.ipynb\r\n",
"Untitled.ipynb\r\n",
"\u001b[34mdata-master from YT\u001b[m\u001b[m\r\n",
"\u001b[34mmap-output-files\u001b[m\u001b[m\r\n",
"\u001b[31mserverRestart.command\u001b[m\u001b[m\r\n",
"\u001b[31mserverStart.command\u001b[m\u001b[m\r\n",
"\u001b[31mserverStatus.command\u001b[m\u001b[m\r\n",
"\u001b[31mserverStop.command\u001b[m\u001b[m\r\n",
"\u001b[34msql_data\u001b[m\u001b[m\r\n",
"\u001b[31msql_initial_state.py\u001b[m\u001b[m\r\n"
]
}
],
"source": [
"!ls"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"data-master from YT/songs.csv\r\n",
"data-master from YT/earthquake.csv\r\n"
]
}
],
"source": [
"!find 'data-master from YT' -name '*csv'"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>earthquake_id</th>\n",
" <th>occurred_on</th>\n",
" <th>latitude</th>\n",
" <th>longitude</th>\n",
" <th>depth</th>\n",
" <th>magnitude</th>\n",
" <th>calculation_method</th>\n",
" <th>network_id</th>\n",
" <th>place</th>\n",
" <th>cause</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>1969-01-01 9:07:06</td>\n",
" <td>51.096</td>\n",
" <td>-179.392</td>\n",
" <td>45.0</td>\n",
" <td>5.6</td>\n",
" <td>mw</td>\n",
" <td>iscgem812771</td>\n",
" <td>Andreanof Islands, Aleutian Islands, Alaska</td>\n",
" <td>earthquake</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2</td>\n",
" <td>1969-01-02 17:50:48</td>\n",
" <td>-56.096</td>\n",
" <td>-27.842</td>\n",
" <td>80.1</td>\n",
" <td>6.0</td>\n",
" <td>mw</td>\n",
" <td>iscgemsup812819</td>\n",
" <td>South Sandwich Islands region</td>\n",
" <td>earthquake</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3</td>\n",
" <td>1969-01-03 3:16:40</td>\n",
" <td>37.140</td>\n",
" <td>57.899</td>\n",
" <td>10.0</td>\n",
" <td>5.5</td>\n",
" <td>mw</td>\n",
" <td>iscgem812826</td>\n",
" <td>Turkmenistan-Iran border region</td>\n",
" <td>earthquake</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4</td>\n",
" <td>1969-01-03 13:28:12</td>\n",
" <td>51.132</td>\n",
" <td>-179.306</td>\n",
" <td>15.0</td>\n",
" <td>5.9</td>\n",
" <td>mw</td>\n",
" <td>iscgem812841</td>\n",
" <td>Andreanof Islands, Aleutian Islands, Alaska</td>\n",
" <td>earthquake</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>5</td>\n",
" <td>1969-01-04 22:36:48</td>\n",
" <td>-6.850</td>\n",
" <td>129.821</td>\n",
" <td>105.0</td>\n",
" <td>5.8</td>\n",
" <td>mw</td>\n",
" <td>iscgem812879</td>\n",
" <td>Banda Sea</td>\n",
" <td>earthquake</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" earthquake_id occurred_on latitude longitude depth magnitude \\\n",
"0 1 1969-01-01 9:07:06 51.096 -179.392 45.0 5.6 \n",
"1 2 1969-01-02 17:50:48 -56.096 -27.842 80.1 6.0 \n",
"2 3 1969-01-03 3:16:40 37.140 57.899 10.0 5.5 \n",
"3 4 1969-01-03 13:28:12 51.132 -179.306 15.0 5.9 \n",
"4 5 1969-01-04 22:36:48 -6.850 129.821 105.0 5.8 \n",
"\n",
" calculation_method network_id \\\n",
"0 mw iscgem812771 \n",
"1 mw iscgemsup812819 \n",
"2 mw iscgem812826 \n",
"3 mw iscgem812841 \n",
"4 mw iscgem812879 \n",
"\n",
" place cause \n",
"0 Andreanof Islands, Aleutian Islands, Alaska earthquake \n",
"1 South Sandwich Islands region earthquake \n",
"2 Turkmenistan-Iran border region earthquake \n",
"3 Andreanof Islands, Aleutian Islands, Alaska earthquake \n",
"4 Banda Sea earthquake "
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"earthquake_data = pd.read_csv('data-master from YT/earthquake.csv')\n",
"earthquake_data.head(5)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Now the data has been found and loaded into a variable it can be examined"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## <a name='step1'/></a> Put the query into a variable "
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"myQuery = \"\"\"\n",
" SELECT *\n",
" FROM earthquake_data\n",
" ORDER BY depth DESC\n",
" LIMIT 5\n",
" ;\n",
"\"\"\""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Wrap the query up in pysqldf, which is a variable created at the [Top](#pysqldf) of the page "
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>earthquake_id</th>\n",
" <th>occurred_on</th>\n",
" <th>latitude</th>\n",
" <th>longitude</th>\n",
" <th>depth</th>\n",
" <th>magnitude</th>\n",
" <th>calculation_method</th>\n",
" <th>network_id</th>\n",
" <th>place</th>\n",
" <th>cause</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>6583</td>\n",
" <td>1985-10-22 19:14:02</td>\n",
" <td>-20.158</td>\n",
" <td>-179.163</td>\n",
" <td>700.0</td>\n",
" <td>5.5</td>\n",
" <td>mb</td>\n",
" <td>usp0002m15</td>\n",
" <td>Fiji region</td>\n",
" <td>earthquake</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>14755</td>\n",
" <td>2002-08-19 12:52:04</td>\n",
" <td>-24.871</td>\n",
" <td>178.566</td>\n",
" <td>691.6</td>\n",
" <td>5.6</td>\n",
" <td>mb</td>\n",
" <td>usp000ba6z</td>\n",
" <td>south of the Fiji Islands</td>\n",
" <td>earthquake</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3228</td>\n",
" <td>1977-06-17 2:29:10</td>\n",
" <td>-19.876</td>\n",
" <td>-179.098</td>\n",
" <td>690.0</td>\n",
" <td>5.7</td>\n",
" <td>mb</td>\n",
" <td>usp0000pb0</td>\n",
" <td>Fiji region</td>\n",
" <td>earthquake</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>17261</td>\n",
" <td>2007-05-06 22:01:09</td>\n",
" <td>-19.406</td>\n",
" <td>-179.315</td>\n",
" <td>688.0</td>\n",
" <td>6.1</td>\n",
" <td>mwb</td>\n",
" <td>usp000fbdr</td>\n",
" <td>Fiji region</td>\n",
" <td>earthquake</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>13823</td>\n",
" <td>2000-09-02 17:02:20</td>\n",
" <td>-20.073</td>\n",
" <td>-179.135</td>\n",
" <td>687.6</td>\n",
" <td>6.0</td>\n",
" <td>mwc</td>\n",
" <td>usp0009zka</td>\n",
" <td>Fiji region</td>\n",
" <td>earthquake</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" earthquake_id occurred_on latitude longitude depth magnitude \\\n",
"0 6583 1985-10-22 19:14:02 -20.158 -179.163 700.0 5.5 \n",
"1 14755 2002-08-19 12:52:04 -24.871 178.566 691.6 5.6 \n",
"2 3228 1977-06-17 2:29:10 -19.876 -179.098 690.0 5.7 \n",
"3 17261 2007-05-06 22:01:09 -19.406 -179.315 688.0 6.1 \n",
"4 13823 2000-09-02 17:02:20 -20.073 -179.135 687.6 6.0 \n",
"\n",
" calculation_method network_id place cause \n",
"0 mb usp0002m15 Fiji region earthquake \n",
"1 mb usp000ba6z south of the Fiji Islands earthquake \n",
"2 mb usp0000pb0 Fiji region earthquake \n",
"3 mwb usp000fbdr Fiji region earthquake \n",
"4 mwc usp0009zka Fiji region earthquake "
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pysqldf(myQuery)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>MIN(magnitude)</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>5.5</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" MIN(magnitude)\n",
"0 5.5"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"myQueryMIN = \"\"\"\n",
" SELECT MIN(magnitude)\n",
" FROM earthquake_data\n",
" ;\n",
"\"\"\"\n",
"pysqldf(myQueryMIN)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>MAX(magnitude)</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>9.1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" MAX(magnitude)\n",
"0 9.1"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"myQueryMAX = \"\"\"\n",
" SELECT MAX(magnitude)\n",
" FROM earthquake_data\n",
" ;\n",
"\"\"\"\n",
"pysqldf(myQueryMAX)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"myQuery = \"\"\"\n",
" SELECT *\n",
" FROM earthquake_data\n",
" WHERE cuase = \n",
" ORDER BY magnitude DESC\n",
" LIMIT 5\n",
" ;\n",
"\"\"\""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Make a map. "
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"import folium"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"map_EQ = folium.Map(location=[37.140,57.899], width=960, height=500)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgCiAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgTF9OT19UT1VDSCA9IGZhbHNlOwogICAgICAgICAgICBMX0RJU0FCTEVfM0QgPSBmYWxzZTsKICAgICAgICA8L3NjcmlwdD4KICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjEyLjQubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9qcy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMi4wL2Nzcy9ib290c3RyYXAubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9mb250LWF3ZXNvbWUvNC42LjMvY3NzL2ZvbnQtYXdlc29tZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLzIuMC4yL2xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2Nkbi5naXRoYWNrLmNvbS9weXRob24tdmlzdWFsaXphdGlvbi9mb2xpdW0vbWFzdGVyL2ZvbGl1bS90ZW1wbGF0ZXMvbGVhZmxldC5hd2Vzb21lLnJvdGF0ZS5jc3MiLz4KICAgIDxzdHlsZT5odG1sLCBib2R5IHt3aWR0aDogMTAwJTtoZWlnaHQ6IDEwMCU7bWFyZ2luOiAwO3BhZGRpbmc6IDA7fTwvc3R5bGU+CiAgICA8c3R5bGU+I21hcCB7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7cmlnaHQ6MDtsZWZ0OjA7fTwvc3R5bGU+CiAgICAKICAgICAgICAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwKICAgICAgICAgICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgICAgICAgICAgPHN0eWxlPgogICAgICAgICAgICAgICAgI21hcF9hZGI0OTEzODhhNDg0MDljYTc0YzA0ZTc3ZWQwYzFmNSB7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgIHdpZHRoOiA5NjAuMHB4OwogICAgICAgICAgICAgICAgICAgIGhlaWdodDogNTAwLjBweDsKICAgICAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgICAgIHRvcDogMC4wJTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgPC9zdHlsZT4KICAgICAgICAKPC9oZWFkPgo8Ym9keT4gICAgCiAgICAKICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9saXVtLW1hcCIgaWQ9Im1hcF9hZGI0OTEzODhhNDg0MDljYTc0YzA0ZTc3ZWQwYzFmNSIgPjwvZGl2PgogICAgICAgIAo8L2JvZHk+CjxzY3JpcHQ+ICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXBfYWRiNDkxMzg4YTQ4NDA5Y2E3NGMwNGU3N2VkMGMxZjUgPSBMLm1hcCgKICAgICAgICAgICAgICAgICJtYXBfYWRiNDkxMzg4YTQ4NDA5Y2E3NGMwNGU3N2VkMGMxZjUiLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNlbnRlcjogWzM3LjE0LCA1Ny44OTldLAogICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcsCiAgICAgICAgICAgICAgICAgICAgem9vbTogMTAsCiAgICAgICAgICAgICAgICAgICAgem9vbUNvbnRyb2w6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgcHJlZmVyQ2FudmFzOiBmYWxzZSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIAoKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgdGlsZV9sYXllcl81MWYzODJkMDRjZWM0M2VkODdiYmZiNTU1YmRlZWQ5ZCA9IEwudGlsZUxheWVyKAogICAgICAgICAgICAgICAgImh0dHBzOi8ve3N9LnRpbGUub3BlbnN0cmVldG1hcC5vcmcve3p9L3t4fS97eX0ucG5nIiwKICAgICAgICAgICAgICAgIHsiYXR0cmlidXRpb24iOiAiRGF0YSBieSBcdTAwMjZjb3B5OyBcdTAwM2NhIGhyZWY9XCJodHRwOi8vb3BlbnN0cmVldG1hcC5vcmdcIlx1MDAzZU9wZW5TdHJlZXRNYXBcdTAwM2MvYVx1MDAzZSwgdW5kZXIgXHUwMDNjYSBocmVmPVwiaHR0cDovL3d3dy5vcGVuc3RyZWV0bWFwLm9yZy9jb3B5cmlnaHRcIlx1MDAzZU9EYkxcdTAwM2MvYVx1MDAzZS4iLCAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsICJtYXhOYXRpdmVab29tIjogMTgsICJtYXhab29tIjogMTgsICJtaW5ab29tIjogMCwgIm5vV3JhcCI6IGZhbHNlLCAib3BhY2l0eSI6IDEsICJzdWJkb21haW5zIjogImFiYyIsICJ0bXMiOiBmYWxzZX0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYWRiNDkxMzg4YTQ4NDA5Y2E3NGMwNGU3N2VkMGMxZjUpOwogICAgICAgIAo8L3NjcmlwdD4=\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x11058d0b8>"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"map_EQ"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# The above does not really show us a lot."
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"#We can save an HTML file that will render this map\n",
"#First check the output firectory path exists and create it if it doesn't\n",
"!mkdir -p map-output-files\n",
"\n",
"#Now save the HTML file\n",
"map_EQ.save('map-output-files/EQ.html')"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgCiAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgTF9OT19UT1VDSCA9IGZhbHNlOwogICAgICAgICAgICBMX0RJU0FCTEVfM0QgPSBmYWxzZTsKICAgICAgICA8L3NjcmlwdD4KICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjEyLjQubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9qcy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMi4wL2Nzcy9ib290c3RyYXAubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9mb250LWF3ZXNvbWUvNC42LjMvY3NzL2ZvbnQtYXdlc29tZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLzIuMC4yL2xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2Nkbi5naXRoYWNrLmNvbS9weXRob24tdmlzdWFsaXphdGlvbi9mb2xpdW0vbWFzdGVyL2ZvbGl1bS90ZW1wbGF0ZXMvbGVhZmxldC5hd2Vzb21lLnJvdGF0ZS5jc3MiLz4KICAgIDxzdHlsZT5odG1sLCBib2R5IHt3aWR0aDogMTAwJTtoZWlnaHQ6IDEwMCU7bWFyZ2luOiAwO3BhZGRpbmc6IDA7fTwvc3R5bGU+CiAgICA8c3R5bGU+I21hcCB7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7cmlnaHQ6MDtsZWZ0OjA7fTwvc3R5bGU+CiAgICAKICAgICAgICAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwKICAgICAgICAgICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgICAgICAgICAgPHN0eWxlPgogICAgICAgICAgICAgICAgI21hcF81OTA1ZGM0MmY5MjQ0YjRjODE1MjZmYzYyYWJhMzZjZCB7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgIHdpZHRoOiA2MDAuMHB4OwogICAgICAgICAgICAgICAgICAgIGhlaWdodDogMzAwLjBweDsKICAgICAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgICAgIHRvcDogMC4wJTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgPC9zdHlsZT4KICAgICAgICAKPC9oZWFkPgo8Ym9keT4gICAgCiAgICAKICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9saXVtLW1hcCIgaWQ9Im1hcF81OTA1ZGM0MmY5MjQ0YjRjODE1MjZmYzYyYWJhMzZjZCIgPjwvZGl2PgogICAgICAgIAo8L2JvZHk+CjxzY3JpcHQ+ICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXBfNTkwNWRjNDJmOTI0NGI0YzgxNTI2ZmM2MmFiYTM2Y2QgPSBMLm1hcCgKICAgICAgICAgICAgICAgICJtYXBfNTkwNWRjNDJmOTI0NGI0YzgxNTI2ZmM2MmFiYTM2Y2QiLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNlbnRlcjogWzM3LjE0LCA1Ny44OTldLAogICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcsCiAgICAgICAgICAgICAgICAgICAgem9vbTogMTIsCiAgICAgICAgICAgICAgICAgICAgem9vbUNvbnRyb2w6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgcHJlZmVyQ2FudmFzOiBmYWxzZSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIAoKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgdGlsZV9sYXllcl9hOGM0NDNlZmIxZWI0Y2VhYjNiMWY3ZWUwNjVjNmNlMyA9IEwudGlsZUxheWVyKAogICAgICAgICAgICAgICAgImh0dHBzOi8ve3N9LnRpbGUub3BlbnN0cmVldG1hcC5vcmcve3p9L3t4fS97eX0ucG5nIiwKICAgICAgICAgICAgICAgIHsiYXR0cmlidXRpb24iOiAiRGF0YSBieSBcdTAwMjZjb3B5OyBcdTAwM2NhIGhyZWY9XCJodHRwOi8vb3BlbnN0cmVldG1hcC5vcmdcIlx1MDAzZU9wZW5TdHJlZXRNYXBcdTAwM2MvYVx1MDAzZSwgdW5kZXIgXHUwMDNjYSBocmVmPVwiaHR0cDovL3d3dy5vcGVuc3RyZWV0bWFwLm9yZy9jb3B5cmlnaHRcIlx1MDAzZU9EYkxcdTAwM2MvYVx1MDAzZS4iLCAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsICJtYXhOYXRpdmVab29tIjogMjAsICJtYXhab29tIjogMjAsICJtaW5ab29tIjogMCwgIm5vV3JhcCI6IGZhbHNlLCAib3BhY2l0eSI6IDEsICJzdWJkb21haW5zIjogImFiYyIsICJ0bXMiOiBmYWxzZX0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNTkwNWRjNDJmOTI0NGI0YzgxNTI2ZmM2MmFiYTM2Y2QpOwogICAgICAgIAo8L3NjcmlwdD4=\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x110583940>"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Perhaps it is possible to map all of the nuckes on one map\n",
"map_EQ_More_Detial = folium.Map(location=[37.140,57.899], width=600, height=300,\n",
" zoom_start=12, max_zoom=20)\n",
"\n",
"\n",
"map_EQ_More_Detial"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Adding a marker to the map. "
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgCiAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgTF9OT19UT1VDSCA9IGZhbHNlOwogICAgICAgICAgICBMX0RJU0FCTEVfM0QgPSBmYWxzZTsKICAgICAgICA8L3NjcmlwdD4KICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjEyLjQubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9qcy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMi4wL2Nzcy9ib290c3RyYXAubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9mb250LWF3ZXNvbWUvNC42LjMvY3NzL2ZvbnQtYXdlc29tZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLzIuMC4yL2xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2Nkbi5naXRoYWNrLmNvbS9weXRob24tdmlzdWFsaXphdGlvbi9mb2xpdW0vbWFzdGVyL2ZvbGl1bS90ZW1wbGF0ZXMvbGVhZmxldC5hd2Vzb21lLnJvdGF0ZS5jc3MiLz4KICAgIDxzdHlsZT5odG1sLCBib2R5IHt3aWR0aDogMTAwJTtoZWlnaHQ6IDEwMCU7bWFyZ2luOiAwO3BhZGRpbmc6IDA7fTwvc3R5bGU+CiAgICA8c3R5bGU+I21hcCB7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7cmlnaHQ6MDtsZWZ0OjA7fTwvc3R5bGU+CiAgICAKICAgICAgICAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwKICAgICAgICAgICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgICAgICAgICAgPHN0eWxlPgogICAgICAgICAgICAgICAgI21hcF9hZGI0OTEzODhhNDg0MDljYTc0YzA0ZTc3ZWQwYzFmNSB7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgIHdpZHRoOiA5NjAuMHB4OwogICAgICAgICAgICAgICAgICAgIGhlaWdodDogNTAwLjBweDsKICAgICAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgICAgIHRvcDogMC4wJTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgPC9zdHlsZT4KICAgICAgICAKPC9oZWFkPgo8Ym9keT4gICAgCiAgICAKICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9saXVtLW1hcCIgaWQ9Im1hcF9hZGI0OTEzODhhNDg0MDljYTc0YzA0ZTc3ZWQwYzFmNSIgPjwvZGl2PgogICAgICAgIAo8L2JvZHk+CjxzY3JpcHQ+ICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXBfYWRiNDkxMzg4YTQ4NDA5Y2E3NGMwNGU3N2VkMGMxZjUgPSBMLm1hcCgKICAgICAgICAgICAgICAgICJtYXBfYWRiNDkxMzg4YTQ4NDA5Y2E3NGMwNGU3N2VkMGMxZjUiLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNlbnRlcjogWzM3LjE0LCA1Ny44OTldLAogICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcsCiAgICAgICAgICAgICAgICAgICAgem9vbTogMTAsCiAgICAgICAgICAgICAgICAgICAgem9vbUNvbnRyb2w6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgcHJlZmVyQ2FudmFzOiBmYWxzZSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIAoKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgdGlsZV9sYXllcl81MWYzODJkMDRjZWM0M2VkODdiYmZiNTU1YmRlZWQ5ZCA9IEwudGlsZUxheWVyKAogICAgICAgICAgICAgICAgImh0dHBzOi8ve3N9LnRpbGUub3BlbnN0cmVldG1hcC5vcmcve3p9L3t4fS97eX0ucG5nIiwKICAgICAgICAgICAgICAgIHsiYXR0cmlidXRpb24iOiAiRGF0YSBieSBcdTAwMjZjb3B5OyBcdTAwM2NhIGhyZWY9XCJodHRwOi8vb3BlbnN0cmVldG1hcC5vcmdcIlx1MDAzZU9wZW5TdHJlZXRNYXBcdTAwM2MvYVx1MDAzZSwgdW5kZXIgXHUwMDNjYSBocmVmPVwiaHR0cDovL3d3dy5vcGVuc3RyZWV0bWFwLm9yZy9jb3B5cmlnaHRcIlx1MDAzZU9EYkxcdTAwM2MvYVx1MDAzZS4iLCAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsICJtYXhOYXRpdmVab29tIjogMTgsICJtYXhab29tIjogMTgsICJtaW5ab29tIjogMCwgIm5vV3JhcCI6IGZhbHNlLCAib3BhY2l0eSI6IDEsICJzdWJkb21haW5zIjogImFiYyIsICJ0bXMiOiBmYWxzZX0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYWRiNDkxMzg4YTQ4NDA5Y2E3NGMwNGU3N2VkMGMxZjUpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfY2U2NzcyMjJiYzg2NGE5NzkzMWE4YjMxZmZhMzVkMjYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy4xNCwgNTcuODk5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2FkYjQ5MTM4OGE0ODQwOWNhNzRjMDRlNzdlZDBjMWY1KTsKICAgICAgICAKPC9zY3JpcHQ+\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x11058d0b8>"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"folium.Marker([37.140,57.899]).add_to(map_EQ)\n",
"\n",
"map_EQ"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Make a world map. "
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgCiAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgTF9OT19UT1VDSCA9IGZhbHNlOwogICAgICAgICAgICBMX0RJU0FCTEVfM0QgPSBmYWxzZTsKICAgICAgICA8L3NjcmlwdD4KICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjEyLjQubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9qcy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMi4wL2Nzcy9ib290c3RyYXAubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9mb250LWF3ZXNvbWUvNC42LjMvY3NzL2ZvbnQtYXdlc29tZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLzIuMC4yL2xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2Nkbi5naXRoYWNrLmNvbS9weXRob24tdmlzdWFsaXphdGlvbi9mb2xpdW0vbWFzdGVyL2ZvbGl1bS90ZW1wbGF0ZXMvbGVhZmxldC5hd2Vzb21lLnJvdGF0ZS5jc3MiLz4KICAgIDxzdHlsZT5odG1sLCBib2R5IHt3aWR0aDogMTAwJTtoZWlnaHQ6IDEwMCU7bWFyZ2luOiAwO3BhZGRpbmc6IDA7fTwvc3R5bGU+CiAgICA8c3R5bGU+I21hcCB7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7cmlnaHQ6MDtsZWZ0OjA7fTwvc3R5bGU+CiAgICAKICAgICAgICAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwKICAgICAgICAgICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgICAgICAgICAgPHN0eWxlPgogICAgICAgICAgICAgICAgI21hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSB7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgIHdpZHRoOiA1MTAuMHB4OwogICAgICAgICAgICAgICAgICAgIGhlaWdodDogNTEwLjBweDsKICAgICAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgICAgIHRvcDogMC4wJTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgPC9zdHlsZT4KICAgICAgICAKPC9oZWFkPgo8Ym9keT4gICAgCiAgICAKICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9saXVtLW1hcCIgaWQ9Im1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSIgPjwvZGl2PgogICAgICAgIAo8L2JvZHk+CjxzY3JpcHQ+ICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkgPSBMLm1hcCgKICAgICAgICAgICAgICAgICJtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkiLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNlbnRlcjogWzAuMCwgMC4wXSwKICAgICAgICAgICAgICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3LAogICAgICAgICAgICAgICAgICAgIHpvb206IC0xLAogICAgICAgICAgICAgICAgICAgIHpvb21Db250cm9sOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIHByZWZlckNhbnZhczogZmFsc2UsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICAKCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfOTQxOGRlNmJmNTRkNGU5YmE0YTNlMTIwNTkzZGE0ODkgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICJodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZyIsCiAgICAgICAgICAgICAgICB7ImF0dHJpYnV0aW9uIjogIkRhdGEgYnkgXHUwMDI2Y29weTsgXHUwMDNjYSBocmVmPVwiaHR0cDovL29wZW5zdHJlZXRtYXAub3JnXCJcdTAwM2VPcGVuU3RyZWV0TWFwXHUwMDNjL2FcdTAwM2UsIHVuZGVyIFx1MDAzY2EgaHJlZj1cImh0dHA6Ly93d3cub3BlbnN0cmVldG1hcC5vcmcvY29weXJpZ2h0XCJcdTAwM2VPRGJMXHUwMDNjL2FcdTAwM2UuIiwgImRldGVjdFJldGluYSI6IGZhbHNlLCAibWF4TmF0aXZlWm9vbSI6IDQwLCAibWF4Wm9vbSI6IDQwLCAibWluWm9vbSI6IDAsICJub1dyYXAiOiBmYWxzZSwgIm9wYWNpdHkiOiAxLCAic3ViZG9tYWlucyI6ICJhYmMiLCAidG1zIjogZmFsc2V9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKPC9zY3JpcHQ+\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x11059e710>"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Perhaps it is possible to map all of the nukes on one map\n",
"map_Nuke = folium.Map(location=[0,0], width=510, height=510,\n",
" zoom_start=-1, max_zoom=40)\n",
"\n",
"\n",
"map_Nuke"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [],
"source": [
"!mkdir -p map-output-files\n",
"\n",
"#Now save the HTML file\n",
"map_Nuke.save('map-output-files/Nukes.html')"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgCiAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgTF9OT19UT1VDSCA9IGZhbHNlOwogICAgICAgICAgICBMX0RJU0FCTEVfM0QgPSBmYWxzZTsKICAgICAgICA8L3NjcmlwdD4KICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjEyLjQubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9qcy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMi4wL2Nzcy9ib290c3RyYXAubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9mb250LWF3ZXNvbWUvNC42LjMvY3NzL2ZvbnQtYXdlc29tZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLzIuMC4yL2xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2Nkbi5naXRoYWNrLmNvbS9weXRob24tdmlzdWFsaXphdGlvbi9mb2xpdW0vbWFzdGVyL2ZvbGl1bS90ZW1wbGF0ZXMvbGVhZmxldC5hd2Vzb21lLnJvdGF0ZS5jc3MiLz4KICAgIDxzdHlsZT5odG1sLCBib2R5IHt3aWR0aDogMTAwJTtoZWlnaHQ6IDEwMCU7bWFyZ2luOiAwO3BhZGRpbmc6IDA7fTwvc3R5bGU+CiAgICA8c3R5bGU+I21hcCB7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7cmlnaHQ6MDtsZWZ0OjA7fTwvc3R5bGU+CiAgICAKICAgICAgICAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwKICAgICAgICAgICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgICAgICAgICAgPHN0eWxlPgogICAgICAgICAgICAgICAgI21hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSB7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgIHdpZHRoOiA1MTAuMHB4OwogICAgICAgICAgICAgICAgICAgIGhlaWdodDogNTEwLjBweDsKICAgICAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgICAgIHRvcDogMC4wJTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgPC9zdHlsZT4KICAgICAgICAKPC9oZWFkPgo8Ym9keT4gICAgCiAgICAKICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9saXVtLW1hcCIgaWQ9Im1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSIgPjwvZGl2PgogICAgICAgIAo8L2JvZHk+CjxzY3JpcHQ+ICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkgPSBMLm1hcCgKICAgICAgICAgICAgICAgICJtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkiLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNlbnRlcjogWzAuMCwgMC4wXSwKICAgICAgICAgICAgICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3LAogICAgICAgICAgICAgICAgICAgIHpvb206IC0xLAogICAgICAgICAgICAgICAgICAgIHpvb21Db250cm9sOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIHByZWZlckNhbnZhczogZmFsc2UsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICAKCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfOTQxOGRlNmJmNTRkNGU5YmE0YTNlMTIwNTkzZGE0ODkgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICJodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZyIsCiAgICAgICAgICAgICAgICB7ImF0dHJpYnV0aW9uIjogIkRhdGEgYnkgXHUwMDI2Y29weTsgXHUwMDNjYSBocmVmPVwiaHR0cDovL29wZW5zdHJlZXRtYXAub3JnXCJcdTAwM2VPcGVuU3RyZWV0TWFwXHUwMDNjL2FcdTAwM2UsIHVuZGVyIFx1MDAzY2EgaHJlZj1cImh0dHA6Ly93d3cub3BlbnN0cmVldG1hcC5vcmcvY29weXJpZ2h0XCJcdTAwM2VPRGJMXHUwMDNjL2FcdTAwM2UuIiwgImRldGVjdFJldGluYSI6IGZhbHNlLCAibWF4TmF0aXZlWm9vbSI6IDQwLCAibWF4Wm9vbSI6IDQwLCAibWluWm9vbSI6IDAsICJub1dyYXAiOiBmYWxzZSwgIm9wYWNpdHkiOiAxLCAic3ViZG9tYWlucyI6ICJhYmMiLCAidG1zIjogZmFsc2V9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzY0ZTVhOWZkMThlZjRlOTViNzhmM2QwYjdjMDk4MGFjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuMTQsIDU3Ljg5OV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCjwvc2NyaXB0Pg==\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x11059e710>"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"folium.Marker([37.140,57.899]).add_to(map_Nuke)\n",
"\n",
"map_Nuke"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgCiAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgTF9OT19UT1VDSCA9IGZhbHNlOwogICAgICAgICAgICBMX0RJU0FCTEVfM0QgPSBmYWxzZTsKICAgICAgICA8L3NjcmlwdD4KICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjEyLjQubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9qcy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMi4wL2Nzcy9ib290c3RyYXAubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9mb250LWF3ZXNvbWUvNC42LjMvY3NzL2ZvbnQtYXdlc29tZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLzIuMC4yL2xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2Nkbi5naXRoYWNrLmNvbS9weXRob24tdmlzdWFsaXphdGlvbi9mb2xpdW0vbWFzdGVyL2ZvbGl1bS90ZW1wbGF0ZXMvbGVhZmxldC5hd2Vzb21lLnJvdGF0ZS5jc3MiLz4KICAgIDxzdHlsZT5odG1sLCBib2R5IHt3aWR0aDogMTAwJTtoZWlnaHQ6IDEwMCU7bWFyZ2luOiAwO3BhZGRpbmc6IDA7fTwvc3R5bGU+CiAgICA8c3R5bGU+I21hcCB7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7cmlnaHQ6MDtsZWZ0OjA7fTwvc3R5bGU+CiAgICAKICAgICAgICAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwKICAgICAgICAgICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgICAgICAgICAgPHN0eWxlPgogICAgICAgICAgICAgICAgI21hcF80YmZjYTM3NTlmZjk0OTBiOTMxZGE3MDY4MGM4NTJjMSB7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgIHdpZHRoOiA1MTAuMHB4OwogICAgICAgICAgICAgICAgICAgIGhlaWdodDogNTEwLjBweDsKICAgICAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgICAgIHRvcDogMC4wJTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgPC9zdHlsZT4KICAgICAgICAKPC9oZWFkPgo8Ym9keT4gICAgCiAgICAKICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9saXVtLW1hcCIgaWQ9Im1hcF80YmZjYTM3NTlmZjk0OTBiOTMxZGE3MDY4MGM4NTJjMSIgPjwvZGl2PgogICAgICAgIAo8L2JvZHk+CjxzY3JpcHQ+ICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXBfNGJmY2EzNzU5ZmY5NDkwYjkzMWRhNzA2ODBjODUyYzEgPSBMLm1hcCgKICAgICAgICAgICAgICAgICJtYXBfNGJmY2EzNzU5ZmY5NDkwYjkzMWRhNzA2ODBjODUyYzEiLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNlbnRlcjogWzAuMCwgMC4wXSwKICAgICAgICAgICAgICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3LAogICAgICAgICAgICAgICAgICAgIHpvb206IDEsCiAgICAgICAgICAgICAgICAgICAgem9vbUNvbnRyb2w6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgcHJlZmVyQ2FudmFzOiBmYWxzZSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIAoKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgdGlsZV9sYXllcl9jNmY1NTY3MmMwNGI0OTI5OTdiMzdkN2MzZDc2YmUxOCA9IEwudGlsZUxheWVyKAogICAgICAgICAgICAgICAgImh0dHBzOi8ve3N9LnRpbGUub3BlbnN0cmVldG1hcC5vcmcve3p9L3t4fS97eX0ucG5nIiwKICAgICAgICAgICAgICAgIHsiYXR0cmlidXRpb24iOiAiRGF0YSBieSBcdTAwMjZjb3B5OyBcdTAwM2NhIGhyZWY9XCJodHRwOi8vb3BlbnN0cmVldG1hcC5vcmdcIlx1MDAzZU9wZW5TdHJlZXRNYXBcdTAwM2MvYVx1MDAzZSwgdW5kZXIgXHUwMDNjYSBocmVmPVwiaHR0cDovL3d3dy5vcGVuc3RyZWV0bWFwLm9yZy9jb3B5cmlnaHRcIlx1MDAzZU9EYkxcdTAwM2MvYVx1MDAzZS4iLCAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsICJtYXhOYXRpdmVab29tIjogNDAsICJtYXhab29tIjogNDAsICJtaW5ab29tIjogMCwgIm5vV3JhcCI6IGZhbHNlLCAib3BhY2l0eSI6IDEsICJzdWJkb21haW5zIjogImFiYyIsICJ0bXMiOiBmYWxzZX0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmY2EzNzU5ZmY5NDkwYjkzMWRhNzA2ODBjODUyYzEpOwogICAgICAgIAo8L3NjcmlwdD4=\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x1153b7198>"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"map_EQ = folium.Map(location=[0,0], width=510, height=510,\n",
" zoom_start=1, max_zoom=40)\n",
"\n",
"\n",
"map_EQ"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [],
"source": [
"!mkdir -p map-output-files\n",
"\n",
"#Now save the HTML file\n",
"map_EQ.save('map-output-files/Nukes.html')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Earthquake query for map"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>earthquake_id</th>\n",
" <th>occurred_on</th>\n",
" <th>latitude</th>\n",
" <th>longitude</th>\n",
" <th>depth</th>\n",
" <th>magnitude</th>\n",
" <th>calculation_method</th>\n",
" <th>network_id</th>\n",
" <th>place</th>\n",
" <th>cause</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>15909</td>\n",
" <td>2004-12-26 0:58:53</td>\n",
" <td>3.295</td>\n",
" <td>95.982</td>\n",
" <td>30.0</td>\n",
" <td>9.1</td>\n",
" <td>mw</td>\n",
" <td>official20041226005853450_30</td>\n",
" <td>off the west coast of northern Sumatra</td>\n",
" <td>earthquake</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>19328</td>\n",
" <td>2011-03-11 5:46:24</td>\n",
" <td>38.297</td>\n",
" <td>142.373</td>\n",
" <td>29.0</td>\n",
" <td>9.1</td>\n",
" <td>mww</td>\n",
" <td>official20110311054624120_30</td>\n",
" <td>near the east coast of Honshu, Japan</td>\n",
" <td>earthquake</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>18756</td>\n",
" <td>2010-02-27 6:34:12</td>\n",
" <td>-36.122</td>\n",
" <td>-72.898</td>\n",
" <td>22.9</td>\n",
" <td>8.8</td>\n",
" <td>mww</td>\n",
" <td>official20100227063411530_30</td>\n",
" <td>offshore Bio-Bio, Chile</td>\n",
" <td>earthquake</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>16154</td>\n",
" <td>2005-03-28 16:09:37</td>\n",
" <td>2.085</td>\n",
" <td>97.108</td>\n",
" <td>30.0</td>\n",
" <td>8.6</td>\n",
" <td>mww</td>\n",
" <td>official20050328160936530_30</td>\n",
" <td>northern Sumatra, Indonesia</td>\n",
" <td>earthquake</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>20044</td>\n",
" <td>2012-04-11 8:38:37</td>\n",
" <td>2.327</td>\n",
" <td>93.063</td>\n",
" <td>20.0</td>\n",
" <td>8.6</td>\n",
" <td>mw</td>\n",
" <td>official20120411083836720_20</td>\n",
" <td>off the west coast of northern Sumatra</td>\n",
" <td>earthquake</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" earthquake_id occurred_on latitude longitude depth magnitude \\\n",
"0 15909 2004-12-26 0:58:53 3.295 95.982 30.0 9.1 \n",
"1 19328 2011-03-11 5:46:24 38.297 142.373 29.0 9.1 \n",
"2 18756 2010-02-27 6:34:12 -36.122 -72.898 22.9 8.8 \n",
"3 16154 2005-03-28 16:09:37 2.085 97.108 30.0 8.6 \n",
"4 20044 2012-04-11 8:38:37 2.327 93.063 20.0 8.6 \n",
"\n",
" calculation_method network_id \\\n",
"0 mw official20041226005853450_30 \n",
"1 mww official20110311054624120_30 \n",
"2 mww official20100227063411530_30 \n",
"3 mww official20050328160936530_30 \n",
"4 mw official20120411083836720_20 \n",
"\n",
" place cause \n",
"0 off the west coast of northern Sumatra earthquake \n",
"1 near the east coast of Honshu, Japan earthquake \n",
"2 offshore Bio-Bio, Chile earthquake \n",
"3 northern Sumatra, Indonesia earthquake \n",
"4 off the west coast of northern Sumatra earthquake "
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"EQ_Query = \"\"\"\n",
" SELECT *\n",
" FROM earthquake_data\n",
" WHERE cause = 'earthquake'\n",
" ORDER BY magnitude DESC\n",
" LIMIT 100\n",
" ;\n",
"\"\"\"\n",
"pysqldf(EQ_Query)[:5]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# The next cell may take awhile to run that is why i limited the above code to the top 100 quakes."
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [],
"source": [
"for i in range (len(pysqldf(EQ_Query)['latitude'])):\n",
" folium.Marker(location = [pysqldf(EQ_Query)['latitude'][i],\n",
" pysqldf(EQ_Query)['longitude'][i]]).add_to(map_EQ) "
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgCiAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgTF9OT19UT1VDSCA9IGZhbHNlOwogICAgICAgICAgICBMX0RJU0FCTEVfM0QgPSBmYWxzZTsKICAgICAgICA8L3NjcmlwdD4KICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjEyLjQubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9qcy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMi4wL2Nzcy9ib290c3RyYXAubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9mb250LWF3ZXNvbWUvNC42LjMvY3NzL2ZvbnQtYXdlc29tZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLzIuMC4yL2xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2Nkbi5naXRoYWNrLmNvbS9weXRob24tdmlzdWFsaXphdGlvbi9mb2xpdW0vbWFzdGVyL2ZvbGl1bS90ZW1wbGF0ZXMvbGVhZmxldC5hd2Vzb21lLnJvdGF0ZS5jc3MiLz4KICAgIDxzdHlsZT5odG1sLCBib2R5IHt3aWR0aDogMTAwJTtoZWlnaHQ6IDEwMCU7bWFyZ2luOiAwO3BhZGRpbmc6IDA7fTwvc3R5bGU+CiAgICA8c3R5bGU+I21hcCB7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7cmlnaHQ6MDtsZWZ0OjA7fTwvc3R5bGU+CiAgICAKICAgICAgICAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwKICAgICAgICAgICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgICAgICAgICAgPHN0eWxlPgogICAgICAgICAgICAgICAgI21hcF80YmZjYTM3NTlmZjk0OTBiOTMxZGE3MDY4MGM4NTJjMSB7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgIHdpZHRoOiA1MTAuMHB4OwogICAgICAgICAgICAgICAgICAgIGhlaWdodDogNTEwLjBweDsKICAgICAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgICAgIHRvcDogMC4wJTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgPC9zdHlsZT4KICAgICAgICAKPC9oZWFkPgo8Ym9keT4gICAgCiAgICAKICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9saXVtLW1hcCIgaWQ9Im1hcF80YmZjYTM3NTlmZjk0OTBiOTMxZGE3MDY4MGM4NTJjMSIgPjwvZGl2PgogICAgICAgIAo8L2JvZHk+CjxzY3JpcHQ+ICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXBfNGJmY2EzNzU5ZmY5NDkwYjkzMWRhNzA2ODBjODUyYzEgPSBMLm1hcCgKICAgICAgICAgICAgICAgICJtYXBfNGJmY2EzNzU5ZmY5NDkwYjkzMWRhNzA2ODBjODUyYzEiLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNlbnRlcjogWzAuMCwgMC4wXSwKICAgICAgICAgICAgICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3LAogICAgICAgICAgICAgICAgICAgIHpvb206IDEsCiAgICAgICAgICAgICAgICAgICAgem9vbUNvbnRyb2w6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgcHJlZmVyQ2FudmFzOiBmYWxzZSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIAoKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgdGlsZV9sYXllcl9jNmY1NTY3MmMwNGI0OTI5OTdiMzdkN2MzZDc2YmUxOCA9IEwudGlsZUxheWVyKAogICAgICAgICAgICAgICAgImh0dHBzOi8ve3N9LnRpbGUub3BlbnN0cmVldG1hcC5vcmcve3p9L3t4fS97eX0ucG5nIiwKICAgICAgICAgICAgICAgIHsiYXR0cmlidXRpb24iOiAiRGF0YSBieSBcdTAwMjZjb3B5OyBcdTAwM2NhIGhyZWY9XCJodHRwOi8vb3BlbnN0cmVldG1hcC5vcmdcIlx1MDAzZU9wZW5TdHJlZXRNYXBcdTAwM2MvYVx1MDAzZSwgdW5kZXIgXHUwMDNjYSBocmVmPVwiaHR0cDovL3d3dy5vcGVuc3RyZWV0bWFwLm9yZy9jb3B5cmlnaHRcIlx1MDAzZU9EYkxcdTAwM2MvYVx1MDAzZS4iLCAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsICJtYXhOYXRpdmVab29tIjogNDAsICJtYXhab29tIjogNDAsICJtaW5ab29tIjogMCwgIm5vV3JhcCI6IGZhbHNlLCAib3BhY2l0eSI6IDEsICJzdWJkb21haW5zIjogImFiYyIsICJ0bXMiOiBmYWxzZX0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmY2EzNzU5ZmY5NDkwYjkzMWRhNzA2ODBjODUyYzEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZmY4MjEyMWU4YmY2NDY3NDkwMGY2YzZjNjA1NTk4ZDkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszLjI5NSwgOTUuOTgyMDAwMDAwMDAwMDFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmY2EzNzU5ZmY5NDkwYjkzMWRhNzA2ODBjODUyYzEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNDI2OTk4YTIwMGY0NGFkMGFjYzNmNzA1NDhmM2E4MzEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszOC4yOTcsIDE0Mi4zNzNdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmY2EzNzU5ZmY5NDkwYjkzMWRhNzA2ODBjODUyYzEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfOTI2OGVlMGM1YTdkNGNmZmFmYzg3Y2I3YmQxOGY4NzUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMzYuMTIyLCAtNzIuODk4XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZmNhMzc1OWZmOTQ5MGI5MzFkYTcwNjgwYzg1MmMxKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzYxYjE3ZjA5NzM1NzQ1ODdiMzY0YTY3YjExOTY2YjkzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMi4wODUsIDk3LjEwNzk5OTk5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZmNhMzc1OWZmOTQ5MGI5MzFkYTcwNjgwYzg1MmMxKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzFkNzJjOTZiYjQwOTRmOTg5YTVkOTcyNjg2NTRlYWM1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMi4zMjcsIDkzLjA2Mjk5OTk5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZmNhMzc1OWZmOTQ5MGI5MzFkYTcwNjgwYzg1MmMxKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2YxMzcwYzYyYmZmMzQzNjQ4ZWNiZGQyYzViYTNiOWFjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE2LjI2NSwgLTczLjY0MV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80YmZjYTM3NTlmZjk0OTBiOTMxZGE3MDY4MGM4NTJjMSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9mMDNhYjE1YThmMWE0YzE4YWZlODBlMGQxZjBjOWZlOCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy00LjQzOCwgMTAxLjM2N10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80YmZjYTM3NTlmZjk0OTBiOTMxZGE3MDY4MGM4NTJjMSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8xZmY5MmM1MmYxNGU0NTY2OWQ1ZTU0NGViMTE4N2ViOCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0xMS4xNjQwMDAwMDAwMDAwMDEsIDExOC4zNzc5OTk5OTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80YmZjYTM3NTlmZjk0OTBiOTMxZGE3MDY4MGM4NTJjMSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9iMDQyODQ1YWEzOTQ0ZmUyYmVmNWYwMmNiOGZhMjI2NCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc3MywgMTQ3LjMyMV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80YmZjYTM3NTlmZjk0OTBiOTMxZGE3MDY4MGM4NTJjMSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl84MmU5MDkwNTVkOTM0NzgyODIzNmU2NTZiM2YwMTdjYiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQxLjgxNSwgMTQzLjkxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZmNhMzc1OWZmOTQ5MGI5MzFkYTcwNjgwYzg1MmMxKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzE5MjY3NTIyYWM1YTQ5NGNiODQ1NzM4ODM4Mzk2MmI0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDYuNTkyLCAxNTMuMjY2XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZmNhMzc1OWZmOTQ5MGI5MzFkYTcwNjgwYzg1MmMxKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzhkOGNlMTY0ZDEyNDRkNTM5OThhZjExYWQxNTIxZDE2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTQuODkxOTk5OTk5OTk5OTk2LCAxNTMuMjIxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZmNhMzc1OWZmOTQ5MGI5MzFkYTcwNjgwYzg1MmMxKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2NhMWE2ZTI3YjZhYTQxNDA5NTE2MmM0OTQ2ZWQ2ZjRmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTMxLjU3MjksIC03MS42NzQ0XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZmNhMzc1OWZmOTQ5MGI5MzFkYTcwNjgwYzg1MmMxKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzMxMjRlZTU5OWY4ZDQ1YWU4NzU0MGU3NTUzY2UyMzhjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNDI0LCAxNDcuODU5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZmNhMzc1OWZmOTQ5MGI5MzFkYTcwNjgwYzg1MmMxKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzMyYzQ3OGUzN2E3NjRlZWY5MmNjZjFlMDlkNDQ1NTNmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTUyLjM0MSwgMTYwLjU2Nzk5OTk5OTk5OTk4XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZmNhMzc1OWZmOTQ5MGI5MzFkYTcwNjgwYzg1MmMxKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzVlNThiZTRlYzRkZDRiNGM5MGU0Y2ZlYzVjY2U4MGU1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTEzLjg0MSwgLTY3LjU1M10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80YmZjYTM3NTlmZjk0OTBiOTMxZGE3MDY4MGM4NTJjMSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9mOWFlMGI0MmNjYzc0NzNjOGM0NGM5NDVmY2QxYjZkNSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0wLjg5MDk5OTk5OTk5OTk5OTksIDEzNi45NTJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmY2EzNzU5ZmY5NDkwYjkzMWRhNzA2ODBjODUyYzEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMTBlNzFhMzEzNjY5NGZlZjkxM2NjYzcxMzdhZjZkNTQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFswLjgwMiwgOTIuNDYzXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZmNhMzc1OWZmOTQ5MGI5MzFkYTcwNjgwYzg1MmMxKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2ZiNWQ3MDAyNzUyYjQ5OWViZjkyMmExNGZmYmZiNDBmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5LjYwOTcsIC03MC43NjkxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZmNhMzc1OWZmOTQ5MGI5MzFkYTcwNjgwYzg1MmMxKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzAwZDQxYmUxZDI5MTRjODc5N2JlYmZjNzI4ZmFjOWViID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMTUuMDIyMiwgLTkzLjg5OTNdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmY2EzNzU5ZmY5NDkwYjkzMWRhNzA2ODBjODUyYzEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfN2YwNjhhZjU4NmFkNGRhYjhhNWE5NjM3MzQ3MjcyOGUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMTguMTEyNSwgLTE3OC4xNTNdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmY2EzNzU5ZmY5NDkwYjkzMWRhNzA2ODBjODUyYzEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYWY3NGViYzdkNWMxNGIwMzk0YWIwMTRmNTU3ZDQyMDggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstNC44MTcsIDE1My4xNzJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmY2EzNzU5ZmY5NDkwYjkzMWRhNzA2ODBjODUyYzEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYzZiNDJhNmJhN2Y4NGY0N2JkNGY2ZjlkNDA2ZTI1ZmEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstNjIuODc2OTk5OTk5OTk5OTk1LCAxNDkuNTI3MDAwMDAwMDAwMDJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmY2EzNzU5ZmY5NDkwYjkzMWRhNzA2ODBjODUyYzEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNDhlYmM0M2YzMGFhNDgxNmE5NTliM2IwNmRhZjE4Y2EgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstNDkuMzEyLCAxNjEuMzQ1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZmNhMzc1OWZmOTQ5MGI5MzFkYTcwNjgwYzg1MmMxKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzg2NGM4NDM5NDEwMTQwM2Q5NjJiMmEwOTNkYjAzODk0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDYuMjQzLCAxNTQuNTI0XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZmNhMzc1OWZmOTQ5MGI5MzFkYTcwNjgwYzg1MmMxKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzNkZDdkYWFjMWUzYjQ4YWY5Y2Q5MmNhYTYwMDE5ZmRmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTguNDY2MDAwMDAwMDAwMDAxLCAxNTcuMDQzXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZmNhMzc1OWZmOTQ5MGI5MzFkYTcwNjgwYzg1MmMxKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2FhNWZjZGRkNmM3YTQ0MDY5MTlmMzg2OGQ3Y2RkZjI5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE1LjQ4OSwgLTE3Mi4wOTVdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmY2EzNzU5ZmY5NDkwYjkzMWRhNzA2ODBjODUyYzEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMjEyYjIxNDRhYmFiNDc3YmFkMDgzODI3MjNiMGFkNTEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMS41OTcsIC03Mi41MzJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmY2EzNzU5ZmY5NDkwYjkzMWRhNzA2ODBjODUyYzEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYzQyMjJjOTI5ZDMyNDkyYTk0MDczMTVjN2ZhZjQwMTQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstNS41MjQsIDE1My44NV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80YmZjYTM3NTlmZjk0OTBiOTMxZGE3MDY4MGM4NTJjMSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9jYTNiNzVkZGQyNWI0ZDZkOGQ5YjcwODM2YTMzODI0OCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzYuNDA1LCAxMjYuNjRdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmY2EzNzU5ZmY5NDkwYjkzMWRhNzA2ODBjODUyYzEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNjY4M2JmNDM1YjUyNGUzN2I3MmM4NjVjNmQzNGQ3NjcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjguNDI3LCAtMTc3LjY1N10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80YmZjYTM3NTlmZjk0OTBiOTMxZGE3MDY4MGM4NTJjMSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8wNzA1YjE5NTQ0Y2I0MWNiYTQ1ODU3Yjk1YzExZDNjMCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0zMy4xMzUsIC03MS44NzEwMDAwMDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80YmZjYTM3NTlmZjk0OTBiOTMxZGE3MDY4MGM4NTJjMSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8zMGIzYjgwZTk2Yjg0MWFhOGQ4NWI2NjkwYmRjYzIyYyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzE4LjE5LCAtMTAyLjUzMjk5OTk5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZmNhMzc1OWZmOTQ5MGI5MzFkYTcwNjgwYzg1MmMxKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2VhMTgwNjU2MTMzYjRhODFhNzg3ZmNhNzc1NmU4ODYzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTIsIC0xNzQuNzc1OTk5OTk5OTk5OThdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmY2EzNzU5ZmY5NDkwYjkzMWRhNzA2ODBjODUyYzEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNmU3MmVkN2VkZjE4NDAyZWJkMTIzOGU1YWIxMTc5YzggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjMuMzQsIC03MC4yOTRdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmY2EzNzU5ZmY5NDkwYjkzMWRhNzA2ODBjODUyYzEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfODQwYTk3NjZkYzU4NDA4Yzk0ZGMwN2JmZGFlZGJmNTYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFsxOS4wNTUsIC0xMDQuMjA1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZmNhMzc1OWZmOTQ5MGI5MzFkYTcwNjgwYzg1MmMxKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzk2YTQ2N2M0NDVjZTQ1MmE4NGMxODFkZjY4OGI0MWNmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTMuOTgsIDE1Mi4xNjg5OTk5OTk5OTk5OF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80YmZjYTM3NTlmZjk0OTBiOTMxZGE3MDY4MGM4NTJjMSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9lMTZmOGFiZTgwOTA0ZDg3OWVhOWY4YTVkYzU4YjhkZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0yMC4xODcsIC0xNzQuMTIzXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZmNhMzc1OWZmOTQ5MGI5MzFkYTcwNjgwYzg1MmMxKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzRkODEzMGM5YzhhMzQ4NjFhNTZmNGNmYWQ3NWFjMTBkID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTEzLjM4NiwgLTc2LjYwMzAwMDAwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZmNhMzc1OWZmOTQ5MGI5MzFkYTcwNjgwYzg1MmMxKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzExYmY3MzJiNWY4YjQyYTA5OWM2N2YxM2Q3NzYxNGM2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTEwLjc5OTAwMDAwMDAwMDAwMSwgMTY1LjExNF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80YmZjYTM3NTlmZjk0OTBiOTMxZGE3MDY4MGM4NTJjMSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl81ZGEzMmIwN2I3MTI0OWJjYTNkZDEyNGJlMGUxMmFhZSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy05LjE4MywgLTc4LjczN10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80YmZjYTM3NTlmZjk0OTBiOTMxZGE3MDY4MGM4NTJjMSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8yNDY1NjgzYTg3MjQ0NGM2ODhiZmQ5ZWM5NmIxNWQ5MSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1Ljk5NywgLTE3LjY0OV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80YmZjYTM3NTlmZjk0OTBiOTMxZGE3MDY4MGM4NTJjMSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9iNTExNTFkYzczMTM0MWE1YTNlMGM0MDRhZjFjN2JiZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy02LjU5LCAxNTUuMDU0XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZmNhMzc1OWZmOTQ5MGI5MzFkYTcwNjgwYzg1MmMxKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzcwN2E2YmM3MzQ2NTRhMzViOTI5NTVkNGFhYjhlYWU0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNi4yNjIwMDAwMDAwMDAwMDA1LCAxMjQuMDIzXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZmNhMzc1OWZmOTQ5MGI5MzFkYTcwNjgwYzg1MmMxKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2IyOTFkMTgyOWM4YTQ2ZDk4OWYwZDAwNzU1NGRmMTA5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTEuNjc5LCAxMzYuMDRdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmY2EzNzU5ZmY5NDkwYjkzMWRhNzA2ODBjODUyYzEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMTU4YWQxZTYxNmQ4NDZjMGFiOWI0YjI0OTQ2MTU2ODAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMTIuNTI1LCAxNjUuOTE2XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZmNhMzc1OWZmOTQ5MGI5MzFkYTcwNjgwYzg1MmMxKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzkxNWEzNmU2NzNjMjRjMjliMjQ5ZGE5MzUxZjUzYzdlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTguNjc4OTk5OTk5OTk5OTk1LCAtMTQyLjc4Nl0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80YmZjYTM3NTlmZjk0OTBiOTMxZGE3MDY4MGM4NTJjMSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl82MDUzMGFhZjAyNWU0ZTBlYjJiOGU2ZjhkNmJjZDE1MSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ0LjY2MzAwMDAwMDAwMDAwNCwgMTQ5LjNdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmY2EzNzU5ZmY5NDkwYjkzMWRhNzA2ODBjODUyYzEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMDkyMmZhZWMzZjNkNGI1OWFmNGQwNThhZTVhMzNiZmUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFswLjcyOTAwMDAwMDAwMDAwMDEsIDExOS45MzFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmY2EzNzU5ZmY5NDkwYjkzMWRhNzA2ODBjODUyYzEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZmQwYjNiODFkMTM0NDEyMzlhYzExZWUzNWMxZTU1ZjcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41NjM5OTk5OTk5OTk5OSwgLTE3Ny42MzJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmY2EzNzU5ZmY5NDkwYjkzMWRhNzA2ODBjODUyYzEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNzk2YjVjMjZmOWVjNDMwNTgzMGZmNDFmMjAzZmUxZTggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstNy4xMzcwMDAwMDAwMDAwMDA1LCAxMjIuNTg5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZmNhMzc1OWZmOTQ5MGI5MzFkYTcwNjgwYzg1MmMxKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzk2NjMxYTY1ZGE5YzRkYzk5NmQ0YTFkYjUxM2RkMDM2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTQuNzIxLCAxMDIuMDg3XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZmNhMzc1OWZmOTQ5MGI5MzFkYTcwNjgwYzg1MmMxKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzFkNjQwY2Q5MTZkZTQ5ODZiYTFlYTdlYjVkNDc1MGU2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTEzLjgwMiwgOTcuNDUyOTk5OTk5OTk5OTldLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmY2EzNzU5ZmY5NDkwYjkzMWRhNzA2ODBjODUyYzEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNjE5MWJkYmQyOGMwNDg3MmIwYzg5NTI5YWFlNDdhNTYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs2My41MTY5OTk5OTk5OTk5OTYsIC0xNDcuNDQ0XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZmNhMzc1OWZmOTQ5MGI5MzFkYTcwNjgwYzg1MmMxKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzVmNzQ4ZmRjZDI0ZjRhMzBiYzQyODZjMmNhNWNmMWI1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNjMuNTE0MSwgLTE0Ny40NTI5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZmNhMzc1OWZmOTQ5MGI5MzFkYTcwNjgwYzg1MmMxKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzBhN2FjYzYzNDc1NzRmYWJhYmVlMTM1ZTRiNTYwM2I4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTIuNjI1LCAxMDAuODQxMDAwMDAwMDAwMDFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmY2EzNzU5ZmY5NDkwYjkzMWRhNzA2ODBjODUyYzEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfODk1YzkwZTIzYWNhNDBjYmE5Nzk1MDM3ZjllOWFiYTIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszMS4wMDIsIDEwMy4zMjJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmY2EzNzU5ZmY5NDkwYjkzMWRhNzA2ODBjODUyYzEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfODE1NzVhZDA1MmM5NDYwOWFlZmMzMzU0MTgwY2Y2MDQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNi4yODEsIDE0MS4xMTFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmY2EzNzU5ZmY5NDkwYjkzMWRhNzA2ODBjODUyYzEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZmJjMmZhMmMxMGRmNGVkNmI0NzNiOWM1NjZhZTMyOWYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS44NDg2LCAxNzguNzM1Ml0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80YmZjYTM3NTlmZjk0OTBiOTMxZGE3MDY4MGM4NTJjMSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl82YjAzMjFjYWRkZTY0NTY0ODk5ODg1NzZlMjk5OTI0ZSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy00LjUwNDksIDE1My41MjE2XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZmNhMzc1OWZmOTQ5MGI5MzFkYTcwNjgwYzg1MmMxKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzUxMGE0Zjg5ZTYxNTQ4MDM5OGU3NzczMGVjZjBkZGIyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTYuMjQ2NCwgMTU1LjE3MThdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmY2EzNzU5ZmY5NDkwYjkzMWRhNzA2ODBjODUyYzEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNjQ4ODEwMjI4ZDU2NDMxYWFmZGRjYzY0NzFhZmY5NjAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1Ni4wMDM5LCAtMTQ5LjE2NThdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmY2EzNzU5ZmY5NDkwYjkzMWRhNzA2ODBjODUyYzEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZDcyN2ZmYTUwMzRlNGQwNGJlNjAyMTZkZDFiMzZiZTggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMTguNDc0MywgMTc5LjM1MDJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmY2EzNzU5ZmY5NDkwYjkzMWRhNzA2ODBjODUyYzEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZWE2NTQ5ODkwMTA0NDM1Y2FlYjFhM2IyMzAyZjk1NmYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNi4wMzMsIC0xMC42MTNdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmY2EzNzU5ZmY5NDkwYjkzMWRhNzA2ODBjODUyYzEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfY2Q1Njc4Mjg3Y2JiNDBmNzhiYzkwZmE2YjM3YmJkNGUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMzIuNjAxLCAtNzEuMDc2MDAwMDAwMDAwMDFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmY2EzNzU5ZmY5NDkwYjkzMWRhNzA2ODBjODUyYzEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMmZiYzllNmFiZWY4NDMyNjk1ZmRiMjRjNGJjNGQxYzkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjQuODk0MDAwMDAwMDAwMDAyLCAtMTc1LjExOTAwMDAwMDAwMDAzXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZmNhMzc1OWZmOTQ5MGI5MzFkYTcwNjgwYzg1MmMxKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2MxN2U0NDdiOTYyZDQzZGM4MTE1MTg5MmQxZjRhNmY2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE2LjI2NCwgLTE3Mi40NjddLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmY2EzNzU5ZmY5NDkwYjkzMWRhNzA2ODBjODUyYzEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNmQ0NDMwZGZjOWExNGJmZTg1OWJjZmQ4NTA2NTA4YzkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1Ni45NTMsIC0xNDMuMDMyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZmNhMzc1OWZmOTQ5MGI5MzFkYTcwNjgwYzg1MmMxKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzNkNGUzNzFmZDAyZjRhOWRiODE4ZjIxZDQ4NzZhYWM3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMS4xODYsIDEyMi44NTcwMDAwMDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80YmZjYTM3NTlmZjk0OTBiOTMxZGE3MDY4MGM4NTJjMSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl80NmYwOGM0MzZhYzQ0ZTU5OTkxMGVmZmU5OTQ3OGI0NCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy04LjQ4LCAxMjEuODk2XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZmNhMzc1OWZmOTQ5MGI5MzFkYTcwNjgwYzg1MmMxKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzhiMzhkZDE1ZjI4NjQ5ZTBhNTUwYTk2MDdiMGQyNGU4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMTIuOTgyMDAwMDAwMDAwMDAxLCAxNDQuODAxMDAwMDAwMDAwMDJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmY2EzNzU5ZmY5NDkwYjkzMWRhNzA2ODBjODUyYzEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYjg5YTI2ODc3ZGZmNGM5MzlmM2QzZDVkMDk2MThmMmEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMTAuNDc3LCAxMTIuODM1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZmNhMzc1OWZmOTQ5MGI5MzFkYTcwNjgwYzg1MmMxKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzJlMTJkODg4OTM5NTQ4NmRhZDY1OWU3NDhmOGQ2NjM4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTI1LCAxNDMuNDE4OTk5OTk5OTk5OThdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmY2EzNzU5ZmY5NDkwYjkzMWRhNzA2ODBjODUyYzEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMGNhOWViODk2OGI5NDA1Y2IzNmVkYTgyODE2NWE1Y2YgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjIuMTAxLCAtMTc2Ljc3MjAwMDAwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZmNhMzc1OWZmOTQ5MGI5MzFkYTcwNjgwYzg1MmMxKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzBiOTQ5NDhlM2VmYzRhNGFiY2U1MWQyZTllOWFhYzE1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTQuODQxLCAxNjIuMDM1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZmNhMzc1OWZmOTQ5MGI5MzFkYTcwNjgwYzg1MmMxKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2RiYjc4MDA1MzMxODRhOTQ4NDQ5ODExZWI3MGI2NWQzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTUuMjMzLCAxNTMuMTAyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZmNhMzc1OWZmOTQ5MGI5MzFkYTcwNjgwYzg1MmMxKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2VjNDIzYjVjZjM5MjQ5MzM5MDQwZjIzMmUxNjFkYmEwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTUuNDk2LCAxNTEuNzgxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZmNhMzc1OWZmOTQ5MGI5MzFkYTcwNjgwYzg1MmMxKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2Y5MGEyMDUyNDM1OTRhZGViNzFkMTdmZjIzYTg3MzQwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuOTQ2LCA5MC41NDFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmY2EzNzU5ZmY5NDkwYjkzMWRhNzA2ODBjODUyYzEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMTllZGE4ZmRlODA2NGUwZWFjNzYzOTY4NTkxMjE5OWEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS4xNDYsIDE3OC42NV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80YmZjYTM3NTlmZjk0OTBiOTMxZGE3MDY4MGM4NTJjMSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9hYmViZjU0ZWU0YWU0N2E3YjA2MDk4OTg5YmI1MGZmNSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS45ODcwMDAwMDAwMDAwMDIsIC02OS4xOTddLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmY2EzNzU5ZmY5NDkwYjkzMWRhNzA2ODBjODUyYzEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNjM3ZDg0ZDU4Y2I2NDg3ZTlmOThmNjhjYzI1OWY0OTUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjUuOTk2LCAtMTc3LjUxNF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80YmZjYTM3NTlmZjk0OTBiOTMxZGE3MDY4MGM4NTJjMSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl81MmZjZGU5OTBkZjA0MTA5OWUyYzFkYWU4Mjg1YzcwMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy00NS43NjIsIDE2Ni41NjJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmY2EzNzU5ZmY5NDkwYjkzMWRhNzA2ODBjODUyYzEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZmI5MGU2MGQwMzY3NGFmMTgxZWYzYmY3OGQ4ZjUwYzMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMTIuNTE3MDAwMDAwMDAwMDAxLCAxNjYuMzgyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZmNhMzc1OWZmOTQ5MGI5MzFkYTcwNjgwYzg1MmMxKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzJmM2RmYjAwMzVkODQ3ODlhZDU0ZmZmZDQ0MGI5NDdmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMi4zODMsIDk3LjA0Nzk5OTk5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZmNhMzc1OWZmOTQ5MGI5MzFkYTcwNjgwYzg1MmMxKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzM1N2JiNmM2NzBiYjRiYTg5YmI2ZGY2MmQ0ZjA1NTM1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTMuNDg3LCAxMDAuMDgyMDAwMDAwMDAwMDFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmY2EzNzU5ZmY5NDkwYjkzMWRhNzA2ODBjODUyYzEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYjcxMjI5MjY2ZGMxNDRkYzk4NzAyYmIwZWY0M2NjZjIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1Mi43ODgwMDAwMDAwMDAwMDQsIC0xMzIuMTAxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZmNhMzc1OWZmOTQ5MGI5MzFkYTcwNjgwYzg1MmMxKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2YyMWU3OTQyYTU1NzQxOTNiZmRjMDk3OTNkMmZhNmJjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMjguMjMwNSwgODQuNzMxNF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80YmZjYTM3NTlmZjk0OTBiOTMxZGE3MDY4MGM4NTJjMSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9jNmM1ZDdhODdjYmI0ODc0ODdjYTEzOTJmN2FmZTQzYyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzI3LjgzODYsIDE0MC40OTMxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZmNhMzc1OWZmOTQ5MGI5MzFkYTcwNjgwYzg1MmMxKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzBmNGZmMmEyMTQ0YzRiNzNhMGE5OWE3NjIyZTlhODFkID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTQuOTUyMSwgOTQuMzI5OV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80YmZjYTM3NTlmZjk0OTBiOTMxZGE3MDY4MGM4NTJjMSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9iNGVhNDFjMDVlZWM0MTM4YTQ2OGIzNzQxZWVlYTdlOSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzAuMzgxOSwgLTc5LjkyMThdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmY2EzNzU5ZmY5NDkwYjkzMWRhNzA2ODBjODUyYzEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNmE1YWM0ZDUyMTcwNGY2NGE0ZjJmZTE0OWQ1OGFkNjUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstNDIuNzM3MywgMTczLjA1NF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80YmZjYTM3NTlmZjk0OTBiOTMxZGE3MDY4MGM4NTJjMSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9jMTYxY2I2NDIxMTk0ZTdkYWZiN2Y5NmZlYmQ3ZWZiNyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0xMC42ODEyLCAxNjEuMzI3M10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80YmZjYTM3NTlmZjk0OTBiOTMxZGE3MDY4MGM4NTJjMSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8wMDI3MWQ5OGM5ZTQ0MDhhOTU0Mjg3MmNlZWNkMDIyMCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0zLjE4Mzk5OTk5OTk5OTk5OTcsIDEzOS43MjJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmY2EzNzU5ZmY5NDkwYjkzMWRhNzA2ODBjODUyYzEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMWJiMWU5NTZiYjEyNDEwNWJmYjc2M2U2NTY4NDNlZDEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszLjc1MiwgMTI0LjIyMV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80YmZjYTM3NTlmZjk0OTBiOTMxZGE3MDY4MGM4NTJjMSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl81NzZhMTkwZjkwM2Y0ZTFjYWVkOWJmMDhhNmI1ZWViMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjIzMzAwMDAwMDAwMDAwNCwgMTQ1Ljc4NV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80YmZjYTM3NTlmZjk0OTBiOTMxZGE3MDY4MGM4NTJjMSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9lN2MzZWRhZmVkNTY0N2RmOTlmNTZkNTVmY2E2NjQ5MCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0zOC4xODMsIC03My4yMzJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmY2EzNzU5ZmY5NDkwYjkzMWRhNzA2ODBjODUyYzEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNzc1ZDBiYWU2ZjljNGI1MmEwZDIxNTc4YjZmZjFjOTYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstNy4xMDQsIDE1NS4xNTIwMDAwMDAwMDAwMl0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80YmZjYTM3NTlmZjk0OTBiOTMxZGE3MDY4MGM4NTJjMSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl82NDYzNzE4ZWUwMjM0ZmNiYTg3NjgyZWQzZTMxODM4MyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzE5LjMzMywgLTE1NS4wMDE1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZmNhMzc1OWZmOTQ5MGI5MzFkYTcwNjgwYzg1MmMxKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2NlZGY2NDM1ODZmZjQ3MjZiYTc3NzkyMDM5Y2FmNGZmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzguMTksIDE0Mi4wMjhdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmY2EzNzU5ZmY5NDkwYjkzMWRhNzA2ODBjODUyYzEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMjFkODUyNTE0YTdjNDA3NzlmY2I4Njk0NDkyMGUxNDAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFsxNi4wMSwgLTk2LjU5MTAwMDAwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZmNhMzc1OWZmOTQ5MGI5MzFkYTcwNjgwYzg1MmMxKTsKICAgICAgICAKPC9zY3JpcHQ+\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x1153b7198>"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"map_EQ"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# This may take a few minutes to run"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [],
"source": [
"map_EQ_with_popups = folium.Map(location=[0,0], width=510, height=510,\n",
" zoom_start=1, max_zoom=40)\n",
"\n",
"for i in range (len(pysqldf(EQ_Query)['latitude'])):\n",
" # Generate a caption using HTML, embedded within an iframe inside the popup\n",
" html=\"\"\"\n",
" <h3> Magnitude: <font color=\"blue\">{}</font></h3>\n",
" <h3> Date: <font color=\"blue\">{}</font></h3>\n",
" <h3> Location: <font color=\"blue\">{}</font></h3>\n",
" \"\"\".format(pysqldf(EQ_Query)['magnitude'][i], pysqldf(EQ_Query)['occurred_on'][i][:7],pysqldf(EQ_Query)['place'][i])\n",
" iframe = folium.IFrame(html=html, width=260, height=160)\n",
" \n",
" popup = folium.Popup(iframe, max_width=800)\n",
" folium.Marker(location = [pysqldf(EQ_Query)['latitude'][i],\n",
" pysqldf(EQ_Query)['longitude'][i]], popup=popup,).add_to(map_EQ_with_popups) \n",
"# popup = folium.LatLngPopup().add_to(map_Nuke3)\n"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgCiAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgTF9OT19UT1VDSCA9IGZhbHNlOwogICAgICAgICAgICBMX0RJU0FCTEVfM0QgPSBmYWxzZTsKICAgICAgICA8L3NjcmlwdD4KICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjEyLjQubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9qcy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMi4wL2Nzcy9ib290c3RyYXAubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9mb250LWF3ZXNvbWUvNC42LjMvY3NzL2ZvbnQtYXdlc29tZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLzIuMC4yL2xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2Nkbi5naXRoYWNrLmNvbS9weXRob24tdmlzdWFsaXphdGlvbi9mb2xpdW0vbWFzdGVyL2ZvbGl1bS90ZW1wbGF0ZXMvbGVhZmxldC5hd2Vzb21lLnJvdGF0ZS5jc3MiLz4KICAgIDxzdHlsZT5odG1sLCBib2R5IHt3aWR0aDogMTAwJTtoZWlnaHQ6IDEwMCU7bWFyZ2luOiAwO3BhZGRpbmc6IDA7fTwvc3R5bGU+CiAgICA8c3R5bGU+I21hcCB7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7cmlnaHQ6MDtsZWZ0OjA7fTwvc3R5bGU+CiAgICAKICAgICAgICAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwKICAgICAgICAgICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgICAgICAgICAgPHN0eWxlPgogICAgICAgICAgICAgICAgI21hcF9jZWY2OWEwNmM5OTQ0NTFmYTJhMzFmOTkyZTFkN2QzMiB7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgIHdpZHRoOiA1MTAuMHB4OwogICAgICAgICAgICAgICAgICAgIGhlaWdodDogNTEwLjBweDsKICAgICAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgICAgIHRvcDogMC4wJTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgPC9zdHlsZT4KICAgICAgICAKPC9oZWFkPgo8Ym9keT4gICAgCiAgICAKICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9saXVtLW1hcCIgaWQ9Im1hcF9jZWY2OWEwNmM5OTQ0NTFmYTJhMzFmOTkyZTFkN2QzMiIgPjwvZGl2PgogICAgICAgIAo8L2JvZHk+CjxzY3JpcHQ+ICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXBfY2VmNjlhMDZjOTk0NDUxZmEyYTMxZjk5MmUxZDdkMzIgPSBMLm1hcCgKICAgICAgICAgICAgICAgICJtYXBfY2VmNjlhMDZjOTk0NDUxZmEyYTMxZjk5MmUxZDdkMzIiLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNlbnRlcjogWzAuMCwgMC4wXSwKICAgICAgICAgICAgICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3LAogICAgICAgICAgICAgICAgICAgIHpvb206IDEsCiAgICAgICAgICAgICAgICAgICAgem9vbUNvbnRyb2w6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgcHJlZmVyQ2FudmFzOiBmYWxzZSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIAoKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgdGlsZV9sYXllcl9mZTRjODdkNjgwYWY0Nzk3YjBhYTliOTEwZWNhMWI2NCA9IEwudGlsZUxheWVyKAogICAgICAgICAgICAgICAgImh0dHBzOi8ve3N9LnRpbGUub3BlbnN0cmVldG1hcC5vcmcve3p9L3t4fS97eX0ucG5nIiwKICAgICAgICAgICAgICAgIHsiYXR0cmlidXRpb24iOiAiRGF0YSBieSBcdTAwMjZjb3B5OyBcdTAwM2NhIGhyZWY9XCJodHRwOi8vb3BlbnN0cmVldG1hcC5vcmdcIlx1MDAzZU9wZW5TdHJlZXRNYXBcdTAwM2MvYVx1MDAzZSwgdW5kZXIgXHUwMDNjYSBocmVmPVwiaHR0cDovL3d3dy5vcGVuc3RyZWV0bWFwLm9yZy9jb3B5cmlnaHRcIlx1MDAzZU9EYkxcdTAwM2MvYVx1MDAzZS4iLCAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsICJtYXhOYXRpdmVab29tIjogNDAsICJtYXhab29tIjogNDAsICJtaW5ab29tIjogMCwgIm5vV3JhcCI6IGZhbHNlLCAib3BhY2l0eSI6IDEsICJzdWJkb21haW5zIjogImFiYyIsICJ0bXMiOiBmYWxzZX0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfY2VmNjlhMDZjOTk0NDUxZmEyYTMxZjk5MmUxZDdkMzIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNTU5NjAxMDFlNjRiNDFhZTkyYmVmZGIxYTQzNTQzZTAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszLjI5NSwgOTUuOTgyMDAwMDAwMDAwMDFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfY2VmNjlhMDZjOTk0NDUxZmEyYTMxZjk5MmUxZDdkMzIpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2IyMmYzYTlmMDA0NDQzMDQ5Y2IwMWNjNTZlN2RiMGViID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV82OTU3ZTc2YjFmYWY0YjE4OGFlZmMyY2NiMDhlZmI5NCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGprdU1Ud3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZ0lDQWdJRHhvTXo0Z1JHRjBaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpJd01EUXRNVEk4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBOGFETStJRXh2WTJGMGFXOXVPaUE4Wm05dWRDQmpiMnh2Y2owaVlteDFaU0krYjJabUlIUm9aU0IzWlhOMElHTnZZWE4wSUc5bUlHNXZjblJvWlhKdUlGTjFiV0YwY21FOEwyWnZiblErUEM5b016NEtJQ0FnSUE9PSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE2MCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2IyMmYzYTlmMDA0NDQzMDQ5Y2IwMWNjNTZlN2RiMGViLnNldENvbnRlbnQoaV9mcmFtZV82OTU3ZTc2YjFmYWY0YjE4OGFlZmMyY2NiMDhlZmI5NCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl81NTk2MDEwMWU2NGI0MWFlOTJiZWZkYjFhNDM1NDNlMC5iaW5kUG9wdXAocG9wdXBfYjIyZjNhOWYwMDQ0NDMwNDljYjAxY2M1NmU3ZGIwZWIpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMDczYmJhZTJmY2MzNGJhZThkMzgxOTBiODhmMTM1MGUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszOC4yOTcsIDE0Mi4zNzNdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfY2VmNjlhMDZjOTk0NDUxZmEyYTMxZjk5MmUxZDdkMzIpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzkzMTM2ZjhlZjRmMTRhZjhhYzNhNWVmNjUzYzQwNDQ5ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV85ZGNmNTdhZTM4Nzc0MGU0ODcyMzVjOTExNmE3OTYzZSA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGprdU1Ud3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZ0lDQWdJRHhvTXo0Z1JHRjBaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpJd01URXRNRE04TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBOGFETStJRXh2WTJGMGFXOXVPaUE4Wm05dWRDQmpiMnh2Y2owaVlteDFaU0krYm1WaGNpQjBhR1VnWldGemRDQmpiMkZ6ZENCdlppQkliMjV6YUhVc0lFcGhjR0Z1UEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTYwIj48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfOTMxMzZmOGVmNGYxNGFmOGFjM2E1ZWY2NTNjNDA0NDkuc2V0Q29udGVudChpX2ZyYW1lXzlkY2Y1N2FlMzg3NzQwZTQ4NzIzNWM5MTE2YTc5NjNlKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzA3M2JiYWUyZmNjMzRiYWU4ZDM4MTkwYjg4ZjEzNTBlLmJpbmRQb3B1cChwb3B1cF85MzEzNmY4ZWY0ZjE0YWY4YWMzYTVlZjY1M2M0MDQ0OSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9iZjMwODYzZDI4Nzg0ZmFlYmM4YmVkYzkyZTlhMDg4YyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0zNi4xMjIsIC03Mi44OThdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfY2VmNjlhMDZjOTk0NDUxZmEyYTMxZjk5MmUxZDdkMzIpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzNmMDY4ZjYzMjdkNDQ5MWZhZmUwMDlhMzY0ZjU0MzdjID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV8xYjg2OGJmNDc4NzI0MTJjOGM4YjNkZDViODAwNDdlYyA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpndU9Ed3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZ0lDQWdJRHhvTXo0Z1JHRjBaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpJd01UQXRNREk4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBOGFETStJRXh2WTJGMGFXOXVPaUE4Wm05dWRDQmpiMnh2Y2owaVlteDFaU0krYjJabWMyaHZjbVVnUW1sdkxVSnBieXdnUTJocGJHVThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lBPT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNjAiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF8zZjA2OGY2MzI3ZDQ0OTFmYWZlMDA5YTM2NGY1NDM3Yy5zZXRDb250ZW50KGlfZnJhbWVfMWI4NjhiZjQ3ODcyNDEyYzhjOGIzZGQ1YjgwMDQ3ZWMpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfYmYzMDg2M2QyODc4NGZhZWJjOGJlZGM5MmU5YTA4OGMuYmluZFBvcHVwKHBvcHVwXzNmMDY4ZjYzMjdkNDQ5MWZhZmUwMDlhMzY0ZjU0MzdjKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2JhNTI2OTFlNTdjOTRmYTc4YzI5MmE5ZWJiMTFhODViID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMi4wODUsIDk3LjEwNzk5OTk5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2NlZjY5YTA2Yzk5NDQ1MWZhMmEzMWY5OTJlMWQ3ZDMyKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8xOGY0NmUwNzlkMDA0ODcxODRiMjA4ZTIwOTc2MWY0NSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfOGRhMWQzOGNmNDJhNGZlODlkNzQ5MTNiM2QxNTlkNDUgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqZ3VOand2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqSXdNRFV0TURNOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQThhRE0rSUV4dlkyRjBhVzl1T2lBOFptOXVkQ0JqYjJ4dmNqMGlZbXgxWlNJK2JtOXlkR2hsY200Z1UzVnRZWFJ5WVN3Z1NXNWtiMjVsYzJsaFBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE2MCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzE4ZjQ2ZTA3OWQwMDQ4NzE4NGIyMDhlMjA5NzYxZjQ1LnNldENvbnRlbnQoaV9mcmFtZV84ZGExZDM4Y2Y0MmE0ZmU4OWQ3NDkxM2IzZDE1OWQ0NSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9iYTUyNjkxZTU3Yzk0ZmE3OGMyOTJhOWViYjExYTg1Yi5iaW5kUG9wdXAocG9wdXBfMThmNDZlMDc5ZDAwNDg3MTg0YjIwOGUyMDk3NjFmNDUpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNTg2NjMzZWUzZDQzNDYzMjljNjhhODRjZDY4NzJiODcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFsyLjMyNywgOTMuMDYyOTk5OTk5OTk5OTldLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfY2VmNjlhMDZjOTk0NDUxZmEyYTMxZjk5MmUxZDdkMzIpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2QxNzJlMDVjYjhjYzRjOWM5ZWVlMTQ1MDVlY2JkMmIyID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9jZGY3NGJjMmE4MzE0NGRmOTQ0MmFjZWU5YzA2Mzc1YSA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpndU5qd3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZ0lDQWdJRHhvTXo0Z1JHRjBaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpJd01USXRNRFE4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBOGFETStJRXh2WTJGMGFXOXVPaUE4Wm05dWRDQmpiMnh2Y2owaVlteDFaU0krYjJabUlIUm9aU0IzWlhOMElHTnZZWE4wSUc5bUlHNXZjblJvWlhKdUlGTjFiV0YwY21FOEwyWnZiblErUEM5b016NEtJQ0FnSUE9PSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE2MCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2QxNzJlMDVjYjhjYzRjOWM5ZWVlMTQ1MDVlY2JkMmIyLnNldENvbnRlbnQoaV9mcmFtZV9jZGY3NGJjMmE4MzE0NGRmOTQ0MmFjZWU5YzA2Mzc1YSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl81ODY2MzNlZTNkNDM0NjMyOWM2OGE4NGNkNjg3MmI4Ny5iaW5kUG9wdXAocG9wdXBfZDE3MmUwNWNiOGNjNGM5YzllZWUxNDUwNWVjYmQyYjIpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZWEzZThkM2JjMTFiNDk0OGFhN2U2OTQ4MDFiZWU3NDkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMTYuMjY1LCAtNzMuNjQxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2NlZjY5YTA2Yzk5NDQ1MWZhMmEzMWY5OTJlMWQ3ZDMyKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF84NjVhNmM4MjgzZDI0YTE2YjBjMmQwNmQ2MjYwNGExOSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfYjc4M2FkZThiMTFhNDBmYzkzMjEzODdhZDhhNDZhMWIgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqZ3VORHd2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqSXdNREV0TURZOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQThhRE0rSUV4dlkyRjBhVzl1T2lBOFptOXVkQ0JqYjJ4dmNqMGlZbXgxWlNJK2JtVmhjaUIwYUdVZ1kyOWhjM1FnYjJZZ2MyOTFkR2hsY200Z1VHVnlkVHd2Wm05dWRENDhMMmd6UGdvZ0lDQWciIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNjAiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF84NjVhNmM4MjgzZDI0YTE2YjBjMmQwNmQ2MjYwNGExOS5zZXRDb250ZW50KGlfZnJhbWVfYjc4M2FkZThiMTFhNDBmYzkzMjEzODdhZDhhNDZhMWIpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZWEzZThkM2JjMTFiNDk0OGFhN2U2OTQ4MDFiZWU3NDkuYmluZFBvcHVwKHBvcHVwXzg2NWE2YzgyODNkMjRhMTZiMGMyZDA2ZDYyNjA0YTE5KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2RkMjNiZTIxNTJmMzRkNmRiMzhiNDY0ZGJmYTgxYjBmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTQuNDM4LCAxMDEuMzY3XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2NlZjY5YTA2Yzk5NDQ1MWZhMmEzMWY5OTJlMWQ3ZDMyKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9iMGE0MzVkMGEwOWI0ZjI0ODQwNDE0NWZhOWY3OWNhYyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfNDQ3NzM4Mjg5YmYzNDQ3NWJmMjNiYWZhMzAyZTBlY2EgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqZ3VORHd2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqSXdNRGN0TURrOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQThhRE0rSUV4dlkyRjBhVzl1T2lBOFptOXVkQ0JqYjJ4dmNqMGlZbXgxWlNJK2MyOTFkR2hsY200Z1UzVnRZWFJ5WVN3Z1NXNWtiMjVsYzJsaFBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE2MCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2IwYTQzNWQwYTA5YjRmMjQ4NDA0MTQ1ZmE5Zjc5Y2FjLnNldENvbnRlbnQoaV9mcmFtZV80NDc3MzgyODliZjM0NDc1YmYyM2JhZmEzMDJlMGVjYSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9kZDIzYmUyMTUyZjM0ZDZkYjM4YjQ2NGRiZmE4MWIwZi5iaW5kUG9wdXAocG9wdXBfYjBhNDM1ZDBhMDliNGYyNDg0MDQxNDVmYTlmNzljYWMpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYWFmYWJjNDkxZWY0NGM3NWJkZGQyODg3ZDc0Y2YxODEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMTEuMTY0MDAwMDAwMDAwMDAxLCAxMTguMzc3OTk5OTk5OTk5OTldLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfY2VmNjlhMDZjOTk0NDUxZmEyYTMxZjk5MmUxZDdkMzIpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2FhYjQ3NDVhOTY0NzQ1YzA4MmYyNmVhYTRlNmMzZTY3ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV83NDU1Y2RiMzA0YzU0N2VjYjE3MTBkMzM4OTI4NmVmNyA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpndU16d3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZ0lDQWdJRHhvTXo0Z1JHRjBaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpFNU56Y3RNRGc4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBOGFETStJRXh2WTJGMGFXOXVPaUE4Wm05dWRDQmpiMnh2Y2owaVlteDFaU0krYzI5MWRHZ2diMllnVTNWdFltRjNZU3dnU1c1a2IyNWxjMmxoUEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTYwIj48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYWFiNDc0NWE5NjQ3NDVjMDgyZjI2ZWFhNGU2YzNlNjcuc2V0Q29udGVudChpX2ZyYW1lXzc0NTVjZGIzMDRjNTQ3ZWNiMTcxMGQzMzg5Mjg2ZWY3KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2FhZmFiYzQ5MWVmNDRjNzViZGRkMjg4N2Q3NGNmMTgxLmJpbmRQb3B1cChwb3B1cF9hYWI0NzQ1YTk2NDc0NWMwODJmMjZlYWE0ZTZjM2U2NykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8xNGZhYjUxN2JhNmM0ZmRlOWU5YTA3NjYzMGUyNTYxMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc3MywgMTQ3LjMyMV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF9jZWY2OWEwNmM5OTQ0NTFmYTJhMzFmOTkyZTFkN2QzMik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNTgzNDBjZDc2NmRiNGNmZjkwYzJiYjkwYmI2MThjODkgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2MxNmQ1OTU5MmU0MzRlYzJhOWM1MDU4YzI2OTIwMTE2ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQamd1TXp3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnUkdGMFpUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQakU1T1RRdE1UQThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0E4YURNK0lFeHZZMkYwYVc5dU9pQThabTl1ZENCamIyeHZjajBpWW14MVpTSStTM1Z5YVd3Z1NYTnNZVzVrY3p3dlptOXVkRDQ4TDJnelBnb2dJQ0FnIiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTYwIj48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNTgzNDBjZDc2NmRiNGNmZjkwYzJiYjkwYmI2MThjODkuc2V0Q29udGVudChpX2ZyYW1lX2MxNmQ1OTU5MmU0MzRlYzJhOWM1MDU4YzI2OTIwMTE2KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzE0ZmFiNTE3YmE2YzRmZGU5ZTlhMDc2NjMwZTI1NjExLmJpbmRQb3B1cChwb3B1cF81ODM0MGNkNzY2ZGI0Y2ZmOTBjMmJiOTBiYjYxOGM4OSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl84YWY5N2E5MjVhNTY0N2VkYWJmMGY1NzJmNzdkM2Q5ZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQxLjgxNSwgMTQzLjkxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2NlZjY5YTA2Yzk5NDQ1MWZhMmEzMWY5OTJlMWQ3ZDMyKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF85ZWNlNGI3MTg1YjI0ZjQwOThjYmQxOTQ3Mzg2MzA3ZCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfZmE2ZTllMmIzNWI4NDNhYjhhN2RiOTgyZTQ4N2MzZjkgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqZ3VNend2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqSXdNRE10TURrOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQThhRE0rSUV4dlkyRjBhVzl1T2lBOFptOXVkQ0JqYjJ4dmNqMGlZbXgxWlNJK1NHOXJhMkZwWkc4c0lFcGhjR0Z1SUhKbFoybHZiand2Wm05dWRENDhMMmd6UGdvZ0lDQWciIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNjAiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF85ZWNlNGI3MTg1YjI0ZjQwOThjYmQxOTQ3Mzg2MzA3ZC5zZXRDb250ZW50KGlfZnJhbWVfZmE2ZTllMmIzNWI4NDNhYjhhN2RiOTgyZTQ4N2MzZjkpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfOGFmOTdhOTI1YTU2NDdlZGFiZjBmNTcyZjc3ZDNkOWQuYmluZFBvcHVwKHBvcHVwXzllY2U0YjcxODViMjRmNDA5OGNiZDE5NDczODYzMDdkKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2NjYTAwYjM4ZmE0ZjQ1ZmVhZDBmZGZhNDNiNmE0MDk2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDYuNTkyLCAxNTMuMjY2XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2NlZjY5YTA2Yzk5NDQ1MWZhMmEzMWY5OTJlMWQ3ZDMyKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF80MGY3MWY0NzZmZDM0YTgzYjVmNDYzY2M4ODlkNTBiMiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfNTYwNzJkMTg3ZWY5NDJhZWJhN2Y4Y2ExNDI3NmExNDAgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqZ3VNend2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqSXdNRFl0TVRFOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQThhRE0rSUV4dlkyRjBhVzl1T2lBOFptOXVkQ0JqYjJ4dmNqMGlZbXgxWlNJK1MzVnlhV3dnU1hOc1lXNWtjend2Wm05dWRENDhMMmd6UGdvZ0lDQWciIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNjAiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF80MGY3MWY0NzZmZDM0YTgzYjVmNDYzY2M4ODlkNTBiMi5zZXRDb250ZW50KGlfZnJhbWVfNTYwNzJkMTg3ZWY5NDJhZWJhN2Y4Y2ExNDI3NmExNDApOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfY2NhMDBiMzhmYTRmNDVmZWFkMGZkZmE0M2I2YTQwOTYuYmluZFBvcHVwKHBvcHVwXzQwZjcxZjQ3NmZkMzRhODNiNWY0NjNjYzg4OWQ1MGIyKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzVkMTI2ZjA0ZTdiZTQ2OGVhNDIzZjJjZTgzYzAxNWFhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTQuODkxOTk5OTk5OTk5OTk2LCAxNTMuMjIxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2NlZjY5YTA2Yzk5NDQ1MWZhMmEzMWY5OTJlMWQ3ZDMyKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF82YTZjOGVhZTg0YzU0ZGU0OTAyZmRhZDc3OGQyMWUxYSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfNGI2ZTk3ZGRjN2UxNGI3MGEwYWRjNjc0Yzk5MWY2MzMgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqZ3VNend2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqSXdNVE10TURVOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQThhRE0rSUV4dlkyRjBhVzl1T2lBOFptOXVkQ0JqYjJ4dmNqMGlZbXgxWlNJK1UyVmhJRzltSUU5cmFHOTBjMnM4TDJadmJuUStQQzlvTXo0S0lDQWdJQT09IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTYwIj48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNmE2YzhlYWU4NGM1NGRlNDkwMmZkYWQ3NzhkMjFlMWEuc2V0Q29udGVudChpX2ZyYW1lXzRiNmU5N2RkYzdlMTRiNzBhMGFkYzY3NGM5OTFmNjMzKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzVkMTI2ZjA0ZTdiZTQ2OGVhNDIzZjJjZTgzYzAxNWFhLmJpbmRQb3B1cChwb3B1cF82YTZjOGVhZTg0YzU0ZGU0OTAyZmRhZDc3OGQyMWUxYSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl81NWViNjVhMzk1MjM0YjNkOTk1NGRiNWM1YTczMWM2ZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0zMS41NzI5LCAtNzEuNjc0NF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF9jZWY2OWEwNmM5OTQ0NTFmYTJhMzFmOTkyZTFkN2QzMik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMDlkNGVmMGRlMTM1NDIwM2JhYjg1MWNmNmNiNWQ0YjcgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzlkNzg0YjRiYTcxZTQwZDZhMmNmOWU0M2RiOTNlMTZjID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQamd1TXp3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnUkdGMFpUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQakl3TVRVdE1EazhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0E4YURNK0lFeHZZMkYwYVc5dU9pQThabTl1ZENCamIyeHZjajBpWW14MVpTSStORGhyYlNCWElHOW1JRWxzYkdGd1pXd3NJRU5vYVd4bFBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE2MCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzA5ZDRlZjBkZTEzNTQyMDNiYWI4NTFjZjZjYjVkNGI3LnNldENvbnRlbnQoaV9mcmFtZV85ZDc4NGI0YmE3MWU0MGQ2YTJjZjllNDNkYjkzZTE2Yyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl81NWViNjVhMzk1MjM0YjNkOTk1NGRiNWM1YTczMWM2Zi5iaW5kUG9wdXAocG9wdXBfMDlkNGVmMGRlMTM1NDIwM2JhYjg1MWNmNmNiNWQ0YjcpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZTY0NmVjMzk0MjZiNDAyMGEzYmFkNWY5YTVhNWYwOTAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0My40MjQsIDE0Ny44NTldLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfY2VmNjlhMDZjOTk0NDUxZmEyYTMxZjk5MmUxZDdkMzIpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2Q2Y2VkYmYyNDg5OTQ0ZTRiZGFjYTQ5MWI3YTlmMmZlID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9hMjc0NjZiZGFlNzM0MmYxOGM2MDg0OTU0MTRhZmJkNCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpndU1qd3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZ0lDQWdJRHhvTXo0Z1JHRjBaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpFNU5qa3RNRGc4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBOGFETStJRXh2WTJGMGFXOXVPaUE4Wm05dWRDQmpiMnh2Y2owaVlteDFaU0krUzNWeWFXd2dTWE5zWVc1a2N6d3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZyIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE2MCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2Q2Y2VkYmYyNDg5OTQ0ZTRiZGFjYTQ5MWI3YTlmMmZlLnNldENvbnRlbnQoaV9mcmFtZV9hMjc0NjZiZGFlNzM0MmYxOGM2MDg0OTU0MTRhZmJkNCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9lNjQ2ZWMzOTQyNmI0MDIwYTNiYWQ1ZjlhNWE1ZjA5MC5iaW5kUG9wdXAocG9wdXBfZDZjZWRiZjI0ODk5NDRlNGJkYWNhNDkxYjdhOWYyZmUpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfOWFhNTMyZmRjNWQ1NDRjMmI2ZGIyZjIwMDMzZjFlZDEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstNTIuMzQxLCAxNjAuNTY3OTk5OTk5OTk5OThdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfY2VmNjlhMDZjOTk0NDUxZmEyYTMxZjk5MmUxZDdkMzIpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzJlOWJkMGU3ZGQyMzQ5MjZiNzJmNTdjYzgwOTc4YmYyID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV82YjEyOWNmM2ExOWQ0YWRjODVhZjQwODhlYjgxYWE4ZiA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpndU1qd3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZ0lDQWdJRHhvTXo0Z1JHRjBaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpFNU9Ea3RNRFU4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBOGFETStJRXh2WTJGMGFXOXVPaUE4Wm05dWRDQmpiMnh2Y2owaVlteDFaU0krVFdGamNYVmhjbWxsSUVsemJHRnVaQ0J5WldkcGIyNDhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lBPT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNjAiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF8yZTliZDBlN2RkMjM0OTI2YjcyZjU3Y2M4MDk3OGJmMi5zZXRDb250ZW50KGlfZnJhbWVfNmIxMjljZjNhMTlkNGFkYzg1YWY0MDg4ZWI4MWFhOGYpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfOWFhNTMyZmRjNWQ1NDRjMmI2ZGIyZjIwMDMzZjFlZDEuYmluZFBvcHVwKHBvcHVwXzJlOWJkMGU3ZGQyMzQ5MjZiNzJmNTdjYzgwOTc4YmYyKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzYyNTI5YTVkOWExYzQ4ZWI4YThiZGRhYTlmMGY3Yjk3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTEzLjg0MSwgLTY3LjU1M10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF9jZWY2OWEwNmM5OTQ0NTFmYTJhMzFmOTkyZTFkN2QzMik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMmY1NjcyMTFjZDE3NGRjNGEzMjY1MTYzMGUyM2FjNzUgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzJjODhmYjFmZGFlNTRlMzVhNGUyNzc2ZTBlYWY3Njc1ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQamd1TWp3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnUkdGMFpUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQakU1T1RRdE1EWThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0E4YURNK0lFeHZZMkYwYVc5dU9pQThabTl1ZENCamIyeHZjajBpWW14MVpTSStUR0VnVUdGNkxDQkNiMnhwZG1saFBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE2MCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzJmNTY3MjExY2QxNzRkYzRhMzI2NTE2MzBlMjNhYzc1LnNldENvbnRlbnQoaV9mcmFtZV8yYzg4ZmIxZmRhZTU0ZTM1YTRlMjc3NmUwZWFmNzY3NSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl82MjUyOWE1ZDlhMWM0OGViOGE4YmRkYWE5ZjBmN2I5Ny5iaW5kUG9wdXAocG9wdXBfMmY1NjcyMTFjZDE3NGRjNGEzMjY1MTYzMGUyM2FjNzUpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZWYxZWFlMTViZTNmNDkxMDhhNzNjZDEyNDUxZDA5YjkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMC44OTA5OTk5OTk5OTk5OTk5LCAxMzYuOTUyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2NlZjY5YTA2Yzk5NDQ1MWZhMmEzMWY5OTJlMWQ3ZDMyKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9mMThiZWVlYTgxNzE0NjZkODQ0MThlNDkyNjkxNzFiMiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfOWIyY2EyNjZmNmY5NDE1MGEzOTFkMmQ4ZjBhNDI2NGUgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqZ3VNand2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqRTVPVFl0TURJOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQThhRE0rSUV4dlkyRjBhVzl1T2lBOFptOXVkQ0JqYjJ4dmNqMGlZbXgxWlNJK1FtbGhheUJ5WldkcGIyNHNJRWx1Wkc5dVpYTnBZVHd2Wm05dWRENDhMMmd6UGdvZ0lDQWciIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNjAiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9mMThiZWVlYTgxNzE0NjZkODQ0MThlNDkyNjkxNzFiMi5zZXRDb250ZW50KGlfZnJhbWVfOWIyY2EyNjZmNmY5NDE1MGEzOTFkMmQ4ZjBhNDI2NGUpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZWYxZWFlMTViZTNmNDkxMDhhNzNjZDEyNDUxZDA5YjkuYmluZFBvcHVwKHBvcHVwX2YxOGJlZWVhODE3MTQ2NmQ4NDQxOGU0OTI2OTE3MWIyKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzgyNjc4OGQ1NGQ3YjQzZjdiZjAwNDA5ODdjODkxMWMyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMC44MDIsIDkyLjQ2M10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF9jZWY2OWEwNmM5OTQ0NTFmYTJhMzFmOTkyZTFkN2QzMik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYWI3ZDBjZWQyNDg1NDcyMWEzOTgyZDUyMmEzZmRlMjEgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzJiYWJkZjllMDhkZDQ4ODg4NzRiZDA0NWNhMzlmNDkwID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQamd1TWp3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnUkdGMFpUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQakl3TVRJdE1EUThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0E4YURNK0lFeHZZMkYwYVc5dU9pQThabTl1ZENCamIyeHZjajBpWW14MVpTSStiMlptSUhSb1pTQjNaWE4wSUdOdllYTjBJRzltSUc1dmNuUm9aWEp1SUZOMWJXRjBjbUU4TDJadmJuUStQQzlvTXo0S0lDQWdJQT09IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTYwIj48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYWI3ZDBjZWQyNDg1NDcyMWEzOTgyZDUyMmEzZmRlMjEuc2V0Q29udGVudChpX2ZyYW1lXzJiYWJkZjllMDhkZDQ4ODg4NzRiZDA0NWNhMzlmNDkwKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzgyNjc4OGQ1NGQ3YjQzZjdiZjAwNDA5ODdjODkxMWMyLmJpbmRQb3B1cChwb3B1cF9hYjdkMGNlZDI0ODU0NzIxYTM5ODJkNTIyYTNmZGUyMSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl83NDI1MDM1MjMzZWI0OWJmYjk3OGMyZGE4ODkzZjJiZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS42MDk3LCAtNzAuNzY5MV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF9jZWY2OWEwNmM5OTQ0NTFmYTJhMzFmOTkyZTFkN2QzMik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfODg2ZDAxMmEyZjk2NGZiOTk2ODU5OGIwNDYwMTZmMzUgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2Y3ZTJmYTEzOGEzMzRlNjk5ZjY2MDY0ZGQ5ZWZiNzdiID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQamd1TWp3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnUkdGMFpUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQakl3TVRRdE1EUThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0E4YURNK0lFeHZZMkYwYVc5dU9pQThabTl1ZENCamIyeHZjajBpWW14MVpTSStPVFJyYlNCT1Z5QnZaaUJKY1hWcGNYVmxMQ0JEYUdsc1pUd3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZyIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE2MCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzg4NmQwMTJhMmY5NjRmYjk5Njg1OThiMDQ2MDE2ZjM1LnNldENvbnRlbnQoaV9mcmFtZV9mN2UyZmExMzhhMzM0ZTY5OWY2NjA2NGRkOWVmYjc3Yik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl83NDI1MDM1MjMzZWI0OWJmYjk3OGMyZGE4ODkzZjJiZi5iaW5kUG9wdXAocG9wdXBfODg2ZDAxMmEyZjk2NGZiOTk2ODU5OGIwNDYwMTZmMzUpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfOWExYTRmYTdmOTQ5NDA3Mjk5ZjM5MTZiMmVjYWNiN2YgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFsxNS4wMjIyLCAtOTMuODk5M10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF9jZWY2OWEwNmM5OTQ0NTFmYTJhMzFmOTkyZTFkN2QzMik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfODY3YjMzOWJkZjM2NDg3MmFjYWU4YjAyZTdkODQ1ZmQgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2JlZWJlZGQ3YWE3NDRlOGZhOWQ0ZDlhZTlhN2JjYjU4ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQamd1TWp3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnUkdGMFpUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQakl3TVRjdE1EazhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0E4YURNK0lFeHZZMkYwYVc5dU9pQThabTl1ZENCamIyeHZjajBpWW14MVpTSStNVEF4YTIwZ1UxTlhJRzltSUZSeVpYTWdVR2xqYjNNc0lFMWxlR2xqYnp3dlptOXVkRDQ4TDJnelBnb2dJQ0FnIiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTYwIj48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfODY3YjMzOWJkZjM2NDg3MmFjYWU4YjAyZTdkODQ1ZmQuc2V0Q29udGVudChpX2ZyYW1lX2JlZWJlZGQ3YWE3NDRlOGZhOWQ0ZDlhZTlhN2JjYjU4KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzlhMWE0ZmE3Zjk0OTQwNzI5OWYzOTE2YjJlY2FjYjdmLmJpbmRQb3B1cChwb3B1cF84NjdiMzM5YmRmMzY0ODcyYWNhZThiMDJlN2Q4NDVmZCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl83MmQ5NGFmOGU4NWQ0NDYyYjJlZGEwMzRjMWJmNzI4ZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0xOC4xMTI1LCAtMTc4LjE1M10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF9jZWY2OWEwNmM5OTQ0NTFmYTJhMzFmOTkyZTFkN2QzMik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZjRhNDhhZWQzNDNjNGYyM2I3ZjAzZGIzNWYxM2MyZGUgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzg5YjkyNzVlMTQ3ODQ4NzY4MWEzYmZiYTJkZWNjMTY1ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQamd1TWp3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnUkdGMFpUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQakl3TVRndE1EZzhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0E4YURNK0lFeHZZMkYwYVc5dU9pQThabTl1ZENCamIyeHZjajBpWW14MVpTSStNamcyYTIwZ1RrNUZJRzltSUU1a2Iya2dTWE5zWVc1a0xDQkdhV3BwUEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTYwIj48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZjRhNDhhZWQzNDNjNGYyM2I3ZjAzZGIzNWYxM2MyZGUuc2V0Q29udGVudChpX2ZyYW1lXzg5YjkyNzVlMTQ3ODQ4NzY4MWEzYmZiYTJkZWNjMTY1KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzcyZDk0YWY4ZTg1ZDQ0NjJiMmVkYTAzNGMxYmY3MjhkLmJpbmRQb3B1cChwb3B1cF9mNGE0OGFlZDM0M2M0ZjIzYjdmMDNkYjM1ZjEzYzJkZSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9lY2RlOTM2YWU1Nzc0YmYwYmE0Y2E0MmIxM2QyNTA1NyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy00LjgxNywgMTUzLjE3Ml0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF9jZWY2OWEwNmM5OTQ0NTFmYTJhMzFmOTkyZTFkN2QzMik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMjlkYzE1NjM4MDljNGYyYjg5MmI5MTdhZGI0MDVjOWEgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzVkN2JmNzA4NjZjZTQ5NGE4YzU2OTI2N2M2MjZhZWM3ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQamd1TVR3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnUkdGMFpUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQakU1TnpFdE1EYzhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0E4YURNK0lFeHZZMkYwYVc5dU9pQThabTl1ZENCamIyeHZjajBpWW14MVpTSStUbVYzSUVseVpXeGhibVFnY21WbmFXOXVMQ0JRWVhCMVlTQk9aWGNnUjNWcGJtVmhQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNjAiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF8yOWRjMTU2MzgwOWM0ZjJiODkyYjkxN2FkYjQwNWM5YS5zZXRDb250ZW50KGlfZnJhbWVfNWQ3YmY3MDg2NmNlNDk0YThjNTY5MjY3YzYyNmFlYzcpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZWNkZTkzNmFlNTc3NGJmMGJhNGNhNDJiMTNkMjUwNTcuYmluZFBvcHVwKHBvcHVwXzI5ZGMxNTYzODA5YzRmMmI4OTJiOTE3YWRiNDA1YzlhKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2RlYWMwOWFhM2NhMDQ0YTc4NjdiYjUwYWU1NTZhYjU4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTYyLjg3Njk5OTk5OTk5OTk5NSwgMTQ5LjUyNzAwMDAwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2NlZjY5YTA2Yzk5NDQ1MWZhMmEzMWY5OTJlMWQ3ZDMyKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF83ZmRkNDVhM2I1MTM0NWRkYmU0YzczODdhODBmMWIzYiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfY2EwZWFhZjZiOTI3NDYyNzlkMTIwYmJiOTM3OGNkNDcgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqZ3VNVHd2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqRTVPVGd0TURNOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQThhRE0rSUV4dlkyRjBhVzl1T2lBOFptOXVkQ0JqYjJ4dmNqMGlZbXgxWlNJK1FtRnNiR1Z1ZVNCSmMyeGhibVJ6SUhKbFoybHZiand2Wm05dWRENDhMMmd6UGdvZ0lDQWciIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNjAiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF83ZmRkNDVhM2I1MTM0NWRkYmU0YzczODdhODBmMWIzYi5zZXRDb250ZW50KGlfZnJhbWVfY2EwZWFhZjZiOTI3NDYyNzlkMTIwYmJiOTM3OGNkNDcpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZGVhYzA5YWEzY2EwNDRhNzg2N2JiNTBhZTU1NmFiNTguYmluZFBvcHVwKHBvcHVwXzdmZGQ0NWEzYjUxMzQ1ZGRiZTRjNzM4N2E4MGYxYjNiKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzE5NzYwYzdjNGQwZTQ0NGI4N2I1Yzc0Zjg5ZDcyNjM3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTQ5LjMxMiwgMTYxLjM0NV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF9jZWY2OWEwNmM5OTQ0NTFmYTJhMzFmOTkyZTFkN2QzMik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNGU1MmMxZDA5ODdjNDBkOThlODRhZjEzNDQxY2U3ZWEgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2NkMGYwYWEzOGUwNTQ3NzViNjAyMjM1NjQ1Yjk0NDMzID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQamd1TVR3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnUkdGMFpUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQakl3TURRdE1USThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0E4YURNK0lFeHZZMkYwYVc5dU9pQThabTl1ZENCamIyeHZjajBpWW14MVpTSStibTl5ZEdnZ2IyWWdUV0ZqY1hWaGNtbGxJRWx6YkdGdVpEd3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZyIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE2MCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzRlNTJjMWQwOTg3YzQwZDk4ZTg0YWYxMzQ0MWNlN2VhLnNldENvbnRlbnQoaV9mcmFtZV9jZDBmMGFhMzhlMDU0Nzc1YjYwMjIzNTY0NWI5NDQzMyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8xOTc2MGM3YzRkMGU0NDRiODdiNWM3NGY4OWQ3MjYzNy5iaW5kUG9wdXAocG9wdXBfNGU1MmMxZDA5ODdjNDBkOThlODRhZjEzNDQxY2U3ZWEpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZGU0NzVlMjUxNTM2NDYwODkxMTJlYmYyYWJkMDIxOTAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ni4yNDMsIDE1NC41MjRdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfY2VmNjlhMDZjOTk0NDUxZmEyYTMxZjk5MmUxZDdkMzIpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzY1NTYxZTlkZDAwZTQ0ZWZhMjliODNlNTEzYzhiZjUyID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV8wZmZjNGVkMzg2Yzc0MTE0OWM1MzE4YTFjNTYwZTVmMiA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpndU1Ud3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZ0lDQWdJRHhvTXo0Z1JHRjBaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpJd01EY3RNREU4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBOGFETStJRXh2WTJGMGFXOXVPaUE4Wm05dWRDQmpiMnh2Y2owaVlteDFaU0krWldGemRDQnZaaUIwYUdVZ1MzVnlhV3dnU1hOc1lXNWtjend2Wm05dWRENDhMMmd6UGdvZ0lDQWciIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNjAiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF82NTU2MWU5ZGQwMGU0NGVmYTI5YjgzZTUxM2M4YmY1Mi5zZXRDb250ZW50KGlfZnJhbWVfMGZmYzRlZDM4NmM3NDExNDljNTMxOGExYzU2MGU1ZjIpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZGU0NzVlMjUxNTM2NDYwODkxMTJlYmYyYWJkMDIxOTAuYmluZFBvcHVwKHBvcHVwXzY1NTYxZTlkZDAwZTQ0ZWZhMjliODNlNTEzYzhiZjUyKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2EwZTZjMTU5NDc5MjQ3Y2Y5ZDU5NWFjYWViZjQ2ZTE5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTguNDY2MDAwMDAwMDAwMDAxLCAxNTcuMDQzXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2NlZjY5YTA2Yzk5NDQ1MWZhMmEzMWY5OTJlMWQ3ZDMyKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9hMzJlYjk3NThiMzg0ZWEwYmNhODcyNjdlMGJlYzQ2NyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfNmRhNjExNTdmNDk1NGM5NDllMDUwZDBlOWUwNDA2ZjAgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqZ3VNVHd2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqSXdNRGN0TURROEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQThhRE0rSUV4dlkyRjBhVzl1T2lBOFptOXVkQ0JqYjJ4dmNqMGlZbXgxWlNJK1UyOXNiMjF2YmlCSmMyeGhibVJ6UEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTYwIj48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYTMyZWI5NzU4YjM4NGVhMGJjYTg3MjY3ZTBiZWM0Njcuc2V0Q29udGVudChpX2ZyYW1lXzZkYTYxMTU3ZjQ5NTRjOTQ5ZTA1MGQwZTllMDQwNmYwKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2EwZTZjMTU5NDc5MjQ3Y2Y5ZDU5NWFjYWViZjQ2ZTE5LmJpbmRQb3B1cChwb3B1cF9hMzJlYjk3NThiMzg0ZWEwYmNhODcyNjdlMGJlYzQ2NykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8zNWYxOGQ4MzYzNTk0NmEyYjAyMzBhMDczYWJjZmRiYyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0xNS40ODksIC0xNzIuMDk1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2NlZjY5YTA2Yzk5NDQ1MWZhMmEzMWY5OTJlMWQ3ZDMyKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF85MjEyODk5NjNhMDY0YTVmOTdmOWVkMjVlODg5ODBkOSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfMDBjMjRiNGNiZjg5NDgwYmJjZjlkNmQ4OTY0OGM2OTIgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqZ3VNVHd2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqSXdNRGt0TURrOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQThhRE0rSUV4dlkyRjBhVzl1T2lBOFptOXVkQ0JqYjJ4dmNqMGlZbXgxWlNJK1UyRnRiMkVnU1hOc1lXNWtjeUJ5WldkcGIyNDhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lBPT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNjAiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF85MjEyODk5NjNhMDY0YTVmOTdmOWVkMjVlODg5ODBkOS5zZXRDb250ZW50KGlfZnJhbWVfMDBjMjRiNGNiZjg5NDgwYmJjZjlkNmQ4OTY0OGM2OTIpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMzVmMThkODM2MzU5NDZhMmIwMjMwYTA3M2FiY2ZkYmMuYmluZFBvcHVwKHBvcHVwXzkyMTI4OTk2M2EwNjRhNWY5N2Y5ZWQyNWU4ODk4MGQ5KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzdjODkwOTNkM2JhMDRhM2NhMTMxNTNmMTY1YTJmNjYwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTEuNTk3LCAtNzIuNTMyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2NlZjY5YTA2Yzk5NDQ1MWZhMmEzMWY5OTJlMWQ3ZDMyKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9lMTAyZDQ5NDRhNTg0OTM0YjM4NTQ2MTM0ZTUwNzlmNiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfM2IyZGI2MDhkYTUyNDdmMmExMWFkNWI1NDQyOTQ0OTQgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqZ3VNRHd2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqRTVOekF0TURjOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQThhRE0rSUV4dlkyRjBhVzl1T2lBOFptOXVkQ0JqYjJ4dmNqMGlZbXgxWlNJK1EyOXNiMjFpYVdFOEwyWnZiblErUEM5b016NEtJQ0FnSUE9PSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE2MCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2UxMDJkNDk0NGE1ODQ5MzRiMzg1NDYxMzRlNTA3OWY2LnNldENvbnRlbnQoaV9mcmFtZV8zYjJkYjYwOGRhNTI0N2YyYTExYWQ1YjU0NDI5NDQ5NCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl83Yzg5MDkzZDNiYTA0YTNjYTEzMTUzZjE2NWEyZjY2MC5iaW5kUG9wdXAocG9wdXBfZTEwMmQ0OTQ0YTU4NDkzNGIzODU0NjEzNGU1MDc5ZjYpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZTZmOTFlYzdjOGY4NDVmNjk0NzFkNTA5NWUxNDA5YmYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstNS41MjQsIDE1My44NV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF9jZWY2OWEwNmM5OTQ0NTFmYTJhMzFmOTkyZTFkN2QzMik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMTA3MjlkMzAwMDVjNDBmM2FhMWI2YTBkMDhhZmI3ZjAgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2FhMjkzYTM2YTdmMjQ3NjY5MmE0NDJlMTY3NTNlYWVlID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQamd1TUR3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnUkdGMFpUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQakU1TnpFdE1EYzhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0E4YURNK0lFeHZZMkYwYVc5dU9pQThabTl1ZENCamIyeHZjajBpWW14MVpTSStUbVYzSUVseVpXeGhibVFnY21WbmFXOXVMQ0JRWVhCMVlTQk9aWGNnUjNWcGJtVmhQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNjAiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF8xMDcyOWQzMDAwNWM0MGYzYWExYjZhMGQwOGFmYjdmMC5zZXRDb250ZW50KGlfZnJhbWVfYWEyOTNhMzZhN2YyNDc2NjkyYTQ0MmUxNjc1M2VhZWUpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZTZmOTFlYzdjOGY4NDVmNjk0NzFkNTA5NWUxNDA5YmYuYmluZFBvcHVwKHBvcHVwXzEwNzI5ZDMwMDA1YzQwZjNhYTFiNmEwZDA4YWZiN2YwKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2IwYjA0OWUyZjY0OTQ1MjhhYjdiNzA2NDJiMmNkZjFmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNi40MDUsIDEyNi42NF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF9jZWY2OWEwNmM5OTQ0NTFmYTJhMzFmOTkyZTFkN2QzMik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZDY2MWU3NDk3ZTI3NDg0NzkyZTI5ZjY0NjU2NmNmZmIgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2VlM2E2ZmI2MzgyMDQ3OTI5ZjBhYWQ5YzM1MGEyNThiID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQamd1TUR3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnUkdGMFpUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQakU1TnpJdE1USThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0E4YURNK0lFeHZZMkYwYVc5dU9pQThabTl1ZENCamIyeHZjajBpWW14MVpTSStUV2x1WkdGdVlXOHNJRkJvYVd4cGNIQnBibVZ6UEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTYwIj48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZDY2MWU3NDk3ZTI3NDg0NzkyZTI5ZjY0NjU2NmNmZmIuc2V0Q29udGVudChpX2ZyYW1lX2VlM2E2ZmI2MzgyMDQ3OTI5ZjBhYWQ5YzM1MGEyNThiKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2IwYjA0OWUyZjY0OTQ1MjhhYjdiNzA2NDJiMmNkZjFmLmJpbmRQb3B1cChwb3B1cF9kNjYxZTc0OTdlMjc0ODQ3OTJlMjlmNjQ2NTY2Y2ZmYikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8zNmE4MmZhZDM5NmI0MTVhOGM0ZjI2NTU2YTRkODQzMiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0yOC40MjcsIC0xNzcuNjU3XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2NlZjY5YTA2Yzk5NDQ1MWZhMmEzMWY5OTJlMWQ3ZDMyKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9kNzk3YmU1NTA2ODc0OWYxYTIyNmI2NjYxN2ZmMjk3OCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfNTJjMmM4MjkxNTI1NDQzYjg4NTMyMDA3ZDk0MjYyMWYgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqZ3VNRHd2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqRTVOell0TURFOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQThhRE0rSUV4dlkyRjBhVzl1T2lBOFptOXVkQ0JqYjJ4dmNqMGlZbXgxWlNJK1MyVnliV0ZrWldNZ1NYTnNZVzVrY3lCeVpXZHBiMjQ4TDJadmJuUStQQzlvTXo0S0lDQWdJQT09IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTYwIj48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZDc5N2JlNTUwNjg3NDlmMWEyMjZiNjY2MTdmZjI5Nzguc2V0Q29udGVudChpX2ZyYW1lXzUyYzJjODI5MTUyNTQ0M2I4ODUzMjAwN2Q5NDI2MjFmKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzM2YTgyZmFkMzk2YjQxNWE4YzRmMjY1NTZhNGQ4NDMyLmJpbmRQb3B1cChwb3B1cF9kNzk3YmU1NTA2ODc0OWYxYTIyNmI2NjYxN2ZmMjk3OCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8yNDMwYTg1OTllMzY0MjQ0YjBkZmUyMWRhZWIzZjI0YyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0zMy4xMzUsIC03MS44NzEwMDAwMDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF9jZWY2OWEwNmM5OTQ0NTFmYTJhMzFmOTkyZTFkN2QzMik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYjgwZGI3YTUxMGQ3NDZmNTkwMGY3Y2U3Zjc0NWJiYjAgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzFjNjFjZmI3YWNiYTQwMmE4MWEwMTYzNjFlZTlkNTliID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQamd1TUR3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnUkdGMFpUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQakU1T0RVdE1ETThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0E4YURNK0lFeHZZMkYwYVc5dU9pQThabTl1ZENCamIyeHZjajBpWW14MVpTSStiMlptYzJodmNtVWdWbUZzY0dGeVlXbHpieXdnUTJocGJHVThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lBPT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNjAiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9iODBkYjdhNTEwZDc0NmY1OTAwZjdjZTdmNzQ1YmJiMC5zZXRDb250ZW50KGlfZnJhbWVfMWM2MWNmYjdhY2JhNDAyYTgxYTAxNjM2MWVlOWQ1OWIpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMjQzMGE4NTk5ZTM2NDI0NGIwZGZlMjFkYWViM2YyNGMuYmluZFBvcHVwKHBvcHVwX2I4MGRiN2E1MTBkNzQ2ZjU5MDBmN2NlN2Y3NDViYmIwKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2YwMjZlN2IyMTg3ZDQ1ZGM4MTk3ZDY0M2I2ZmIxNWQ0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMTguMTksIC0xMDIuNTMyOTk5OTk5OTk5OTldLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfY2VmNjlhMDZjOTk0NDUxZmEyYTMxZjk5MmUxZDdkMzIpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2NiMWMyMDc3YmMxZjRkMjZiMTkyODJhM2M1N2U4ZjdmID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV83ZDRkMGI0ZTc5MWU0M2NhODAzM2M2ZTcwMTMyMTNiMSA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpndU1Ed3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZ0lDQWdJRHhvTXo0Z1JHRjBaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpFNU9EVXRNRGs4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBOGFETStJRXh2WTJGMGFXOXVPaUE4Wm05dWRDQmpiMnh2Y2owaVlteDFaU0krVFdsamFHOWhZMkZ1TENCTlpYaHBZMjg4TDJadmJuUStQQzlvTXo0S0lDQWdJQT09IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTYwIj48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfY2IxYzIwNzdiYzFmNGQyNmIxOTI4MmEzYzU3ZThmN2Yuc2V0Q29udGVudChpX2ZyYW1lXzdkNGQwYjRlNzkxZTQzY2E4MDMzYzZlNzAxMzIxM2IxKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2YwMjZlN2IyMTg3ZDQ1ZGM4MTk3ZDY0M2I2ZmIxNWQ0LmJpbmRQb3B1cChwb3B1cF9jYjFjMjA3N2JjMWY0ZDI2YjE5MjgyYTNjNTdlOGY3ZikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl83OTU4MzQxMDgzODM0ZjQyOTc2NmE1ZmVlMmMzOGI4NCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUyLCAtMTc0Ljc3NTk5OTk5OTk5OTk4XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2NlZjY5YTA2Yzk5NDQ1MWZhMmEzMWY5OTJlMWQ3ZDMyKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9kZDlmOGYyOTI4OTY0ODBmOWFjZDMzZDc5YTJjOTQyMiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfNjRlZDU0OGMwNTAwNGZiMWI1YmZhMGEzNTdmMmQ4YzUgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqZ3VNRHd2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqRTVPRFl0TURVOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQThhRE0rSUV4dlkyRjBhVzl1T2lBOFptOXVkQ0JqYjJ4dmNqMGlZbXgxWlNJK1FXNWtjbVZoYm05bUlFbHpiR0Z1WkhNc0lFRnNaWFYwYVdGdUlFbHpiR0Z1WkhNc0lFRnNZWE5yWVR3dlptOXVkRDQ4TDJnelBnb2dJQ0FnIiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTYwIj48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZGQ5ZjhmMjkyODk2NDgwZjlhY2QzM2Q3OWEyYzk0MjIuc2V0Q29udGVudChpX2ZyYW1lXzY0ZWQ1NDhjMDUwMDRmYjFiNWJmYTBhMzU3ZjJkOGM1KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzc5NTgzNDEwODM4MzRmNDI5NzY2YTVmZWUyYzM4Yjg0LmJpbmRQb3B1cChwb3B1cF9kZDlmOGYyOTI4OTY0ODBmOWFjZDMzZDc5YTJjOTQyMikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8xNzVhMGFiNGM1Nzg0ZWFmODAyYTMxMmI1Njc5ZTVjZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0yMy4zNCwgLTcwLjI5NF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF9jZWY2OWEwNmM5OTQ0NTFmYTJhMzFmOTkyZTFkN2QzMik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYTY2MjNmYzlkMTgxNGRmNjhjZDE2YjRiZjQwODllNGIgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzExNTI1ODM5NzNkMDRiOGU5MGFjNjNjNzBkYjM0OTA3ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQamd1TUR3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnUkdGMFpUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQakU1T1RVdE1EYzhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0E4YURNK0lFeHZZMkYwYVc5dU9pQThabTl1ZENCamIyeHZjajBpWW14MVpTSStRVzUwYjJaaFoyRnpkR0VzSUVOb2FXeGxQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNjAiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9hNjYyM2ZjOWQxODE0ZGY2OGNkMTZiNGJmNDA4OWU0Yi5zZXRDb250ZW50KGlfZnJhbWVfMTE1MjU4Mzk3M2QwNGI4ZTkwYWM2M2M3MGRiMzQ5MDcpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMTc1YTBhYjRjNTc4NGVhZjgwMmEzMTJiNTY3OWU1Y2YuYmluZFBvcHVwKHBvcHVwX2E2NjIzZmM5ZDE4MTRkZjY4Y2QxNmI0YmY0MDg5ZTRiKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzI0NzcyYThhNmJhMzRjY2U5YjU4ZjAzNjc4M2Q1MjZhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMTkuMDU1LCAtMTA0LjIwNV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF9jZWY2OWEwNmM5OTQ0NTFmYTJhMzFmOTkyZTFkN2QzMik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNzNmYWQ5MTA5NTBhNDlhM2FlODRhZjM4YmIyYjFhM2YgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzljMjZmN2VkOGZiNDQyMTRhMzFjNjAzODE0YjY1ZjE5ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQamd1TUR3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnUkdGMFpUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQakU1T1RVdE1UQThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0E4YURNK0lFeHZZMkYwYVc5dU9pQThabTl1ZENCamIyeHZjajBpWW14MVpTSStRMjlzYVcxaExDQk5aWGhwWTI4OEwyWnZiblErUEM5b016NEtJQ0FnSUE9PSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE2MCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzczZmFkOTEwOTUwYTQ5YTNhZTg0YWYzOGJiMmIxYTNmLnNldENvbnRlbnQoaV9mcmFtZV85YzI2ZjdlZDhmYjQ0MjE0YTMxYzYwMzgxNGI2NWYxOSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8yNDc3MmE4YTZiYTM0Y2NlOWI1OGYwMzY3ODNkNTI2YS5iaW5kUG9wdXAocG9wdXBfNzNmYWQ5MTA5NTBhNDlhM2FlODRhZjM4YmIyYjFhM2YpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfODUwOWNhMjA1NGNiNGE3YmE3NmYyNTZjNWJlNWE5YzEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMy45OCwgMTUyLjE2ODk5OTk5OTk5OTk4XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2NlZjY5YTA2Yzk5NDQ1MWZhMmEzMWY5OTJlMWQ3ZDMyKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9iOGZhZTMwMjRjY2E0MzhkOWViMTlmOTVhN2NkNzRlMyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfY2MxNjE2Mzk3NmU3NDUwZWIzM2MwYWU0ODYzODBiZDUgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqZ3VNRHd2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqSXdNREF0TVRFOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQThhRE0rSUV4dlkyRjBhVzl1T2lBOFptOXVkQ0JqYjJ4dmNqMGlZbXgxWlNJK1RtVjNJRWx5Wld4aGJtUWdjbVZuYVc5dUxDQlFZWEIxWVNCT1pYY2dSM1ZwYm1WaFBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE2MCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2I4ZmFlMzAyNGNjYTQzOGQ5ZWIxOWY5NWE3Y2Q3NGUzLnNldENvbnRlbnQoaV9mcmFtZV9jYzE2MTYzOTc2ZTc0NTBlYjMzYzBhZTQ4NjM4MGJkNSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl84NTA5Y2EyMDU0Y2I0YTdiYTc2ZjI1NmM1YmU1YTljMS5iaW5kUG9wdXAocG9wdXBfYjhmYWUzMDI0Y2NhNDM4ZDllYjE5Zjk1YTdjZDc0ZTMpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZDVmN2NiNmMwOGRjNDkxZmE1NjJkMWIxMDIwY2IxODAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjAuMTg3LCAtMTc0LjEyM10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF9jZWY2OWEwNmM5OTQ0NTFmYTJhMzFmOTkyZTFkN2QzMik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfODVlZGFjNmFmYmRmNDNlOGIyMGM0NjY0MDAzMGFlOGQgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzQxMTA2MTI2MmUzNDRjMjRiMmEyMTBhZTU4NzRiYzJhID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQamd1TUR3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnUkdGMFpUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQakl3TURZdE1EVThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0E4YURNK0lFeHZZMkYwYVc5dU9pQThabTl1ZENCamIyeHZjajBpWW14MVpTSStWRzl1WjJFOEwyWnZiblErUEM5b016NEtJQ0FnSUE9PSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE2MCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzg1ZWRhYzZhZmJkZjQzZThiMjBjNDY2NDAwMzBhZThkLnNldENvbnRlbnQoaV9mcmFtZV80MTEwNjEyNjJlMzQ0YzI0YjJhMjEwYWU1ODc0YmMyYSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9kNWY3Y2I2YzA4ZGM0OTFmYTU2MmQxYjEwMjBjYjE4MC5iaW5kUG9wdXAocG9wdXBfODVlZGFjNmFmYmRmNDNlOGIyMGM0NjY0MDAzMGFlOGQpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfY2FlODc2YzY1OGUzNDcxYmE1YTFlODUzNzFlNjhmY2IgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMTMuMzg2LCAtNzYuNjAzMDAwMDAwMDAwMDFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfY2VmNjlhMDZjOTk0NDUxZmEyYTMxZjk5MmUxZDdkMzIpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2Y2NGViNGFjNDljODQxMjg5ZjEwNjQwYTg4OGQ2YTljID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV85M2JmZjZjOTk1MmQ0MzNjOTkzNDVjYmYyYWM2MjBmMiA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpndU1Ed3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZ0lDQWdJRHhvTXo0Z1JHRjBaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpJd01EY3RNRGc4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBOGFETStJRXh2WTJGMGFXOXVPaUE4Wm05dWRDQmpiMnh2Y2owaVlteDFaU0krYm1WaGNpQjBhR1VnWTI5aGMzUWdiMllnWTJWdWRISmhiQ0JRWlhKMVBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE2MCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2Y2NGViNGFjNDljODQxMjg5ZjEwNjQwYTg4OGQ2YTljLnNldENvbnRlbnQoaV9mcmFtZV85M2JmZjZjOTk1MmQ0MzNjOTkzNDVjYmYyYWM2MjBmMik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9jYWU4NzZjNjU4ZTM0NzFiYTVhMWU4NTM3MWU2OGZjYi5iaW5kUG9wdXAocG9wdXBfZjY0ZWI0YWM0OWM4NDEyODlmMTA2NDBhODg4ZDZhOWMpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNDY1MGZkODU4M2IwNGQ5M2E4ODE0ZjY1ZjBiZTQ0NWMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMTAuNzk5MDAwMDAwMDAwMDAxLCAxNjUuMTE0XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2NlZjY5YTA2Yzk5NDQ1MWZhMmEzMWY5OTJlMWQ3ZDMyKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9jZTFmMTFiOWQzOGU0ZGM1ODE2NGM4MjU3M2NmZGY0OCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfYTRlNmUyOWQ4ZTRjNGExOWE1MjJjOWQwOGUzNTkzMjMgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqZ3VNRHd2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqSXdNVE10TURJOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQThhRE0rSUV4dlkyRjBhVzl1T2lBOFptOXVkQ0JqYjJ4dmNqMGlZbXgxWlNJK056WnJiU0JYSUc5bUlFeGhkR0VzSUZOdmJHOXRiMjRnU1hOc1lXNWtjend2Wm05dWRENDhMMmd6UGdvZ0lDQWciIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNjAiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9jZTFmMTFiOWQzOGU0ZGM1ODE2NGM4MjU3M2NmZGY0OC5zZXRDb250ZW50KGlfZnJhbWVfYTRlNmUyOWQ4ZTRjNGExOWE1MjJjOWQwOGUzNTkzMjMpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNDY1MGZkODU4M2IwNGQ5M2E4ODE0ZjY1ZjBiZTQ0NWMuYmluZFBvcHVwKHBvcHVwX2NlMWYxMWI5ZDM4ZTRkYzU4MTY0YzgyNTczY2ZkZjQ4KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2YzODY1MjllYjNlYjQxM2M5ZGZmYjlkYTkyNjM0NGVhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTkuMTgzLCAtNzguNzM3XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2NlZjY5YTA2Yzk5NDQ1MWZhMmEzMWY5OTJlMWQ3ZDMyKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9lYmIxMGUzNWI1ZGQ0MTY3YTY5MWJjZDBhZDZhYzE1ZiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfNDYyOWU4ZWI5YzFhNDM0ZjliZWI0NzJhMDM0YzU2MTUgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqY3VPVHd2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqRTVOekF0TURVOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQThhRE0rSUV4dlkyRjBhVzl1T2lBOFptOXVkQ0JqYjJ4dmNqMGlZbXgxWlNJK2JtVmhjaUIwYUdVZ1kyOWhjM1FnYjJZZ2JtOXlkR2hsY200Z1VHVnlkVHd2Wm05dWRENDhMMmd6UGdvZ0lDQWciIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNjAiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9lYmIxMGUzNWI1ZGQ0MTY3YTY5MWJjZDBhZDZhYzE1Zi5zZXRDb250ZW50KGlfZnJhbWVfNDYyOWU4ZWI5YzFhNDM0ZjliZWI0NzJhMDM0YzU2MTUpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZjM4NjUyOWViM2ViNDEzYzlkZmZiOWRhOTI2MzQ0ZWEuYmluZFBvcHVwKHBvcHVwX2ViYjEwZTM1YjVkZDQxNjdhNjkxYmNkMGFkNmFjMTVmKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzA2ZjEzYWY5MDAyMjQ5ODBhZTNmMTcwYzk5OTQ0NTIwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuOTk3LCAtMTcuNjQ5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2NlZjY5YTA2Yzk5NDQ1MWZhMmEzMWY5OTJlMWQ3ZDMyKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF80ZjZkZjY5ZGQ5OGI0NzcxYjVkMTA2YjgyZjM5M2UyZSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfZmRjNTgxYmU0YmY1NGZiODkxM2Q5MmUyM2Y1ZjNlNDIgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqY3VPVHd2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqRTVOelV0TURVOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQThhRE0rSUV4dlkyRjBhVzl1T2lBOFptOXVkQ0JqYjJ4dmNqMGlZbXgxWlNJK1FYcHZjbVZ6TFVOaGNHVWdVM1F1SUZacGJtTmxiblFnVW1sa1oyVThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lBPT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNjAiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF80ZjZkZjY5ZGQ5OGI0NzcxYjVkMTA2YjgyZjM5M2UyZS5zZXRDb250ZW50KGlfZnJhbWVfZmRjNTgxYmU0YmY1NGZiODkxM2Q5MmUyM2Y1ZjNlNDIpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMDZmMTNhZjkwMDIyNDk4MGFlM2YxNzBjOTk5NDQ1MjAuYmluZFBvcHVwKHBvcHVwXzRmNmRmNjlkZDk4YjQ3NzFiNWQxMDZiODJmMzkzZTJlKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzllMzAwZmFiMjI4ZjRmY2ZhNThhMzI2ZmU0MDI1YmEwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTYuNTksIDE1NS4wNTRdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfY2VmNjlhMDZjOTk0NDUxZmEyYTMxZjk5MmUxZDdkMzIpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2E4MzhhZDM1MzY0YzQ2MDc5NWQzZWRkNDU2MjI4ZjNjID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9hZDlmZDdjNDkwNzQ0ODI2ODc0MzRhZDA1NmUxNzk2MSA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpjdU9Ud3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZ0lDQWdJRHhvTXo0Z1JHRjBaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpFNU56VXRNRGM4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBOGFETStJRXh2WTJGMGFXOXVPaUE4Wm05dWRDQmpiMnh2Y2owaVlteDFaU0krUW05MVoyRnBiblpwYkd4bElISmxaMmx2Yml3Z1VHRndkV0VnVG1WM0lFZDFhVzVsWVR3dlptOXVkRDQ4TDJnelBnb2dJQ0FnIiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTYwIj48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYTgzOGFkMzUzNjRjNDYwNzk1ZDNlZGQ0NTYyMjhmM2Muc2V0Q29udGVudChpX2ZyYW1lX2FkOWZkN2M0OTA3NDQ4MjY4NzQzNGFkMDU2ZTE3OTYxKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzllMzAwZmFiMjI4ZjRmY2ZhNThhMzI2ZmU0MDI1YmEwLmJpbmRQb3B1cChwb3B1cF9hODM4YWQzNTM2NGM0NjA3OTVkM2VkZDQ1NjIyOGYzYykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8xZTcxMWRhMTdmZTQ0MmNlYTI1OWI3MmYzM2Y4NDNkMyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzYuMjYyMDAwMDAwMDAwMDAwNSwgMTI0LjAyM10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF9jZWY2OWEwNmM5OTQ0NTFmYTJhMzFmOTkyZTFkN2QzMik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYzJiZGEzMDFlNjQxNGU0YWJmMzhjMzE0MTNjZTAwZDcgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2EzNjczZWI5M2M0ZDQ3YTlhNzM5NTg0ZDFhNjhmNjY2ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQamN1T1R3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnUkdGMFpUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQakU1TnpZdE1EZzhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0E4YURNK0lFeHZZMkYwYVc5dU9pQThabTl1ZENCamIyeHZjajBpWW14MVpTSStUV2x1WkdGdVlXOHNJRkJvYVd4cGNIQnBibVZ6UEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTYwIj48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYzJiZGEzMDFlNjQxNGU0YWJmMzhjMzE0MTNjZTAwZDcuc2V0Q29udGVudChpX2ZyYW1lX2EzNjczZWI5M2M0ZDQ3YTlhNzM5NTg0ZDFhNjhmNjY2KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzFlNzExZGExN2ZlNDQyY2VhMjU5YjcyZjMzZjg0M2QzLmJpbmRQb3B1cChwb3B1cF9jMmJkYTMwMWU2NDE0ZTRhYmYzOGMzMTQxM2NlMDBkNykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl82ZTY4Mzc5ZmQ1YmM0NDVjYTA1MzU0N2VjOWU4ZTg4ZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0xLjY3OSwgMTM2LjA0XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2NlZjY5YTA2Yzk5NDQ1MWZhMmEzMWY5OTJlMWQ3ZDMyKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9iMWM2YmZhZTIwMGI0MzFmOGEyOWJhMTAyZjkyMTUwNyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfMmE2ODJkMWU1ODk5NDk1NDlhMGIzNTllOTIxNzUxYjggPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqY3VPVHd2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqRTVOemt0TURrOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQThhRE0rSUV4dlkyRjBhVzl1T2lBOFptOXVkQ0JqYjJ4dmNqMGlZbXgxWlNJK1FtbGhheUJ5WldkcGIyNHNJRWx1Wkc5dVpYTnBZVHd2Wm05dWRENDhMMmd6UGdvZ0lDQWciIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNjAiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9iMWM2YmZhZTIwMGI0MzFmOGEyOWJhMTAyZjkyMTUwNy5zZXRDb250ZW50KGlfZnJhbWVfMmE2ODJkMWU1ODk5NDk1NDlhMGIzNTllOTIxNzUxYjgpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNmU2ODM3OWZkNWJjNDQ1Y2EwNTM1NDdlYzllOGU4OGYuYmluZFBvcHVwKHBvcHVwX2IxYzZiZmFlMjAwYjQzMWY4YTI5YmExMDJmOTIxNTA3KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2E0NjM5MzNjOGExMTQ5ZDc5MTQwYjRkMjJiY2Q2YjEzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTEyLjUyNSwgMTY1LjkxNl0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF9jZWY2OWEwNmM5OTQ0NTFmYTJhMzFmOTkyZTFkN2QzMik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNzU3ZDJlYzU0NTdjNGJkOWIyZTAyZDMwZGM5MzZmNGMgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2EyNjJiZGFkYWViZjQ2YzQ5MWFjMTI2NGE3YjYxYWEwID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQamN1T1R3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnUkdGMFpUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQakU1T0RBdE1EYzhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0E4YURNK0lFeHZZMkYwYVc5dU9pQThabTl1ZENCamIyeHZjajBpWW14MVpTSStVMkZ1ZEdFZ1EzSjFlaUJKYzJ4aGJtUnpQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNjAiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF83NTdkMmVjNTQ1N2M0YmQ5YjJlMDJkMzBkYzkzNmY0Yy5zZXRDb250ZW50KGlfZnJhbWVfYTI2MmJkYWRhZWJmNDZjNDkxYWMxMjY0YTdiNjFhYTApOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfYTQ2MzkzM2M4YTExNDlkNzkxNDBiNGQyMmJjZDZiMTMuYmluZFBvcHVwKHBvcHVwXzc1N2QyZWM1NDU3YzRiZDliMmUwMmQzMGRjOTM2ZjRjKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzM0OWQyZjlhYWMxNjQwZWQ4ZjI3ZDJlMmQ5ZWIyODMxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTguNjc4OTk5OTk5OTk5OTk1LCAtMTQyLjc4Nl0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF9jZWY2OWEwNmM5OTQ0NTFmYTJhMzFmOTkyZTFkN2QzMik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMDk2NTNjNDE2NDZkNDdmY2I1N2FhMWQ4ZTRlOGNkNjcgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2YzMjBmM2IxMzJmOTQ0NDM4YTExZWFhYjNmYTkxNTcxID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQamN1T1R3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnUkdGMFpUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQakU1T0RjdE1URThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0E4YURNK0lFeHZZMkYwYVc5dU9pQThabTl1ZENCamIyeHZjajBpWW14MVpTSStSM1ZzWmlCdlppQkJiR0Z6YTJFOEwyWnZiblErUEM5b016NEtJQ0FnSUE9PSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE2MCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzA5NjUzYzQxNjQ2ZDQ3ZmNiNTdhYTFkOGU0ZThjZDY3LnNldENvbnRlbnQoaV9mcmFtZV9mMzIwZjNiMTMyZjk0NDQzOGExMWVhYWIzZmE5MTU3MSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8zNDlkMmY5YWFjMTY0MGVkOGYyN2QyZTJkOWViMjgzMS5iaW5kUG9wdXAocG9wdXBfMDk2NTNjNDE2NDZkNDdmY2I1N2FhMWQ4ZTRlOGNkNjcpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNDlmYzM4ZjBjYTVlNDc2OTliNTViMjViMjNhMTJmYzUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0NC42NjMwMDAwMDAwMDAwMDQsIDE0OS4zXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2NlZjY5YTA2Yzk5NDQ1MWZhMmEzMWY5OTJlMWQ3ZDMyKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF82YWRiNWU2OTEyNTM0MGNiOGE0ZjA5ZjdiNWJmMjU0MCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfODUyM2FiZDc0NDkwNDZjNGJlY2JhM2RmNzY3MjcyOWIgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqY3VPVHd2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqRTVPVFV0TVRJOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQThhRE0rSUV4dlkyRjBhVzl1T2lBOFptOXVkQ0JqYjJ4dmNqMGlZbXgxWlNJK1MzVnlhV3dnU1hOc1lXNWtjend2Wm05dWRENDhMMmd6UGdvZ0lDQWciIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNjAiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF82YWRiNWU2OTEyNTM0MGNiOGE0ZjA5ZjdiNWJmMjU0MC5zZXRDb250ZW50KGlfZnJhbWVfODUyM2FiZDc0NDkwNDZjNGJlY2JhM2RmNzY3MjcyOWIpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNDlmYzM4ZjBjYTVlNDc2OTliNTViMjViMjNhMTJmYzUuYmluZFBvcHVwKHBvcHVwXzZhZGI1ZTY5MTI1MzQwY2I4YTRmMDlmN2I1YmYyNTQwKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzczODQzZTIyNmU2NjRmZTJhNzYxNDYxODFhYTEzZWI3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMC43MjkwMDAwMDAwMDAwMDAxLCAxMTkuOTMxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2NlZjY5YTA2Yzk5NDQ1MWZhMmEzMWY5OTJlMWQ3ZDMyKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF85NjFkNmViYzgwN2Q0ODZkOTRiYjc1NTkwMGIyMTA2NCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfMTE2NzEyMDU3MTg0NGU0MzgxNTQ0OTY1ZTBiNTY0MjAgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqY3VPVHd2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqRTVPVFl0TURFOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQThhRE0rSUV4dlkyRjBhVzl1T2lBOFptOXVkQ0JqYjJ4dmNqMGlZbXgxWlNJK1RXbHVZV2hoYzJFc0lGTjFiR0YzWlhOcExDQkpibVJ2Ym1WemFXRThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lBPT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNjAiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF85NjFkNmViYzgwN2Q0ODZkOTRiYjc1NTkwMGIyMTA2NC5zZXRDb250ZW50KGlfZnJhbWVfMTE2NzEyMDU3MTg0NGU0MzgxNTQ0OTY1ZTBiNTY0MjApOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNzM4NDNlMjI2ZTY2NGZlMmE3NjE0NjE4MWFhMTNlYjcuYmluZFBvcHVwKHBvcHVwXzk2MWQ2ZWJjODA3ZDQ4NmQ5NGJiNzU1OTAwYjIxMDY0KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzc0NTlhMmE1YmJjNjQxYzg4ZDg2ZGIzNzMwMmRkYzZkID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTYzOTk5OTk5OTk5OTksIC0xNzcuNjMyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2NlZjY5YTA2Yzk5NDQ1MWZhMmEzMWY5OTJlMWQ3ZDMyKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF80MDQxYzgwZDBhN2U0OTVhOWIzNThhOGE3YTY0YTdjOCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfOGE0YWMyOWI3NGI1NGI3MWIwZWExMmVhNDY1ZDI0ZjUgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqY3VPVHd2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqRTVPVFl0TURZOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQThhRE0rSUV4dlkyRjBhVzl1T2lBOFptOXVkQ0JqYjJ4dmNqMGlZbXgxWlNJK1FXNWtjbVZoYm05bUlFbHpiR0Z1WkhNc0lFRnNaWFYwYVdGdUlFbHpiR0Z1WkhNc0lFRnNZWE5yWVR3dlptOXVkRDQ4TDJnelBnb2dJQ0FnIiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTYwIj48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNDA0MWM4MGQwYTdlNDk1YTliMzU4YThhN2E2NGE3Yzguc2V0Q29udGVudChpX2ZyYW1lXzhhNGFjMjliNzRiNTRiNzFiMGVhMTJlYTQ2NWQyNGY1KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzc0NTlhMmE1YmJjNjQxYzg4ZDg2ZGIzNzMwMmRkYzZkLmJpbmRQb3B1cChwb3B1cF80MDQxYzgwZDBhN2U0OTVhOWIzNThhOGE3YTY0YTdjOCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl85MzUyZWQyOGIxY2U0YjIwYWE2NGU2NzFiMDZjYmY4YiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy03LjEzNzAwMDAwMDAwMDAwMDUsIDEyMi41ODldLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfY2VmNjlhMDZjOTk0NDUxZmEyYTMxZjk5MmUxZDdkMzIpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzY2MTkwNGY3NDhkMzRhNWRiYWUxNmZiOTUzZmE1ZDhmID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV8wYzYxNWQ0OWI2NWI0NjkxODM5ZGY4ODkxOTRhMmQ3YSA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpjdU9Ud3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZ0lDQWdJRHhvTXo0Z1JHRjBaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpFNU9UWXRNRFk4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBOGFETStJRXh2WTJGMGFXOXVPaUE4Wm05dWRDQmpiMnh2Y2owaVlteDFaU0krUm14dmNtVnpJRk5sWVR3dlptOXVkRDQ4TDJnelBnb2dJQ0FnIiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTYwIj48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNjYxOTA0Zjc0OGQzNGE1ZGJhZTE2ZmI5NTNmYTVkOGYuc2V0Q29udGVudChpX2ZyYW1lXzBjNjE1ZDQ5YjY1YjQ2OTE4MzlkZjg4OTE5NGEyZDdhKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzkzNTJlZDI4YjFjZTRiMjBhYTY0ZTY3MWIwNmNiZjhiLmJpbmRQb3B1cChwb3B1cF82NjE5MDRmNzQ4ZDM0YTVkYmFlMTZmYjk1M2ZhNWQ4ZikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9iNWI4ZjQxZjljYTQ0OTk5ODUzMzg1NzJlODc2OTkyYiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy00LjcyMSwgMTAyLjA4N10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF9jZWY2OWEwNmM5OTQ0NTFmYTJhMzFmOTkyZTFkN2QzMik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNmQ2MmM0OTEwYjdhNDMwNmE5NjJlNzZiMmZmZGE2OGEgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzNkMTM1YTg5OWMwOTQ1ZWFhZWNlMjFmMDIzMTdkZTEwID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQamN1T1R3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnUkdGMFpUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQakl3TURBdE1EWThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0E4YURNK0lFeHZZMkYwYVc5dU9pQThabTl1ZENCamIyeHZjajBpWW14MVpTSStjMjkxZEdobGNtNGdVM1Z0WVhSeVlTd2dTVzVrYjI1bGMybGhQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNjAiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF82ZDYyYzQ5MTBiN2E0MzA2YTk2MmU3NmIyZmZkYTY4YS5zZXRDb250ZW50KGlfZnJhbWVfM2QxMzVhODk5YzA5NDVlYWFlY2UyMWYwMjMxN2RlMTApOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfYjViOGY0MWY5Y2E0NDk5OTg1MzM4NTcyZTg3Njk5MmIuYmluZFBvcHVwKHBvcHVwXzZkNjJjNDkxMGI3YTQzMDZhOTYyZTc2YjJmZmRhNjhhKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzc3ZDNjOGE4YzE3YTQ5YzE4OWFhOGZlMmM4ZDFjNTQyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTEzLjgwMiwgOTcuNDUyOTk5OTk5OTk5OTldLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfY2VmNjlhMDZjOTk0NDUxZmEyYTMxZjk5MmUxZDdkMzIpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzExNWIzYWZiMWM2NTQ5YWVhNzIxN2ZhNTY4MGQ2YmQ1ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV83OWU5ZDQ5MzQ2OGE0NTMwYTcwYThkMzQyNjZiMThlOCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpjdU9Ud3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZ0lDQWdJRHhvTXo0Z1JHRjBaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpJd01EQXRNRFk4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBOGFETStJRXh2WTJGMGFXOXVPaUE4Wm05dWRDQmpiMnh2Y2owaVlteDFaU0krVTI5MWRHZ2dTVzVrYVdGdUlFOWpaV0Z1UEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTYwIj48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMTE1YjNhZmIxYzY1NDlhZWE3MjE3ZmE1NjgwZDZiZDUuc2V0Q29udGVudChpX2ZyYW1lXzc5ZTlkNDkzNDY4YTQ1MzBhNzBhOGQzNDI2NmIxOGU4KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzc3ZDNjOGE4YzE3YTQ5YzE4OWFhOGZlMmM4ZDFjNTQyLmJpbmRQb3B1cChwb3B1cF8xMTViM2FmYjFjNjU0OWFlYTcyMTdmYTU2ODBkNmJkNSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9jMzk5NmUzZGI2OTA0YTkxYTI4NGNkODMyYzBlNjRhNCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzYzLjUxNjk5OTk5OTk5OTk5NiwgLTE0Ny40NDRdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfY2VmNjlhMDZjOTk0NDUxZmEyYTMxZjk5MmUxZDdkMzIpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzYxMmExMGRjNTNjYTQ0ZDE4ZDNiNzcyYzExYjFjOTRjID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV8zMzlhMmM1NWE5YTU0OTQ2ODVkNmQ0ZWFlZDkxNzhlNiA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpjdU9Ud3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZ0lDQWdJRHhvTXo0Z1JHRjBaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpJd01ESXRNVEU4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBOGFETStJRXh2WTJGMGFXOXVPaUE4Wm05dWRDQmpiMnh2Y2owaVlteDFaU0krUTJWdWRISmhiQ0JCYkdGemEyRThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lBPT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNjAiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF82MTJhMTBkYzUzY2E0NGQxOGQzYjc3MmMxMWIxYzk0Yy5zZXRDb250ZW50KGlfZnJhbWVfMzM5YTJjNTVhOWE1NDk0Njg1ZDZkNGVhZWQ5MTc4ZTYpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfYzM5OTZlM2RiNjkwNGE5MWEyODRjZDgzMmMwZTY0YTQuYmluZFBvcHVwKHBvcHVwXzYxMmExMGRjNTNjYTQ0ZDE4ZDNiNzcyYzExYjFjOTRjKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2EzYTVmZTUxYzYxNzQwYTBiMTQxYTE0MWRjMzk0OWY1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNjMuNTE0MSwgLTE0Ny40NTI5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2NlZjY5YTA2Yzk5NDQ1MWZhMmEzMWY5OTJlMWQ3ZDMyKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8wNjc3M2I4ZWEwODc0OGE4OTkxYjVjZDc4YWNkZGU5NCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfNjc4NTUxMTA1MjFlNDMwZDk5MWM5MzM3YmU2OTliZjYgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqY3VPVHd2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqSXdNREl0TVRFOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQThhRE0rSUV4dlkyRjBhVzl1T2lBOFptOXVkQ0JqYjJ4dmNqMGlZbXgxWlNJK1EyVnVkSEpoYkNCQmJHRnphMkU4TDJadmJuUStQQzlvTXo0S0lDQWdJQT09IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTYwIj48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMDY3NzNiOGVhMDg3NDhhODk5MWI1Y2Q3OGFjZGRlOTQuc2V0Q29udGVudChpX2ZyYW1lXzY3ODU1MTEwNTIxZTQzMGQ5OTFjOTMzN2JlNjk5YmY2KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2EzYTVmZTUxYzYxNzQwYTBiMTQxYTE0MWRjMzk0OWY1LmJpbmRQb3B1cChwb3B1cF8wNjc3M2I4ZWEwODc0OGE4OTkxYjVjZDc4YWNkZGU5NCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl81ZGYxN2QxNDY1Nzg0MDZiODJmN2NhZjU4MDlhOWM0YiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0yLjYyNSwgMTAwLjg0MTAwMDAwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2NlZjY5YTA2Yzk5NDQ1MWZhMmEzMWY5OTJlMWQ3ZDMyKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF83NjU5YzllZTAyZDc0NzMxYmQ2N2Y3OTE0MmEzYWM0NCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfNTA1NjllM2ZkMGE3NDA1NmI2ZDY3MTA3YjIyYzEyZWUgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqY3VPVHd2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqSXdNRGN0TURrOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQThhRE0rSUV4dlkyRjBhVzl1T2lBOFptOXVkQ0JqYjJ4dmNqMGlZbXgxWlNJK1MyVndkV3hoZFdGdUlFMWxiblJoZDJGcElISmxaMmx2Yml3Z1NXNWtiMjVsYzJsaFBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE2MCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzc2NTljOWVlMDJkNzQ3MzFiZDY3Zjc5MTQyYTNhYzQ0LnNldENvbnRlbnQoaV9mcmFtZV81MDU2OWUzZmQwYTc0MDU2YjZkNjcxMDdiMjJjMTJlZSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl81ZGYxN2QxNDY1Nzg0MDZiODJmN2NhZjU4MDlhOWM0Yi5iaW5kUG9wdXAocG9wdXBfNzY1OWM5ZWUwMmQ3NDczMWJkNjdmNzkxNDJhM2FjNDQpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYWIwM2EwZjIxOTc2NDliYjhkNzU1NjI3YmJjNzVhNWEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszMS4wMDIsIDEwMy4zMjJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfY2VmNjlhMDZjOTk0NDUxZmEyYTMxZjk5MmUxZDdkMzIpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2FkOGY0ZTRkYmE1NTQ5YWJhYzg4ZTI0Y2U4YzZhZWJhID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9kNmQyM2E3OTdkYjE0ZDNhYmQ0NTg1ODAwMzM3MjA4ZiA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpjdU9Ud3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZ0lDQWdJRHhvTXo0Z1JHRjBaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpJd01EZ3RNRFU4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBOGFETStJRXh2WTJGMGFXOXVPaUE4Wm05dWRDQmpiMnh2Y2owaVlteDFaU0krWldGemRHVnliaUJUYVdOb2RXRnVMQ0JEYUdsdVlUd3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZyIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE2MCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2FkOGY0ZTRkYmE1NTQ5YWJhYzg4ZTI0Y2U4YzZhZWJhLnNldENvbnRlbnQoaV9mcmFtZV9kNmQyM2E3OTdkYjE0ZDNhYmQ0NTg1ODAwMzM3MjA4Zik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9hYjAzYTBmMjE5NzY0OWJiOGQ3NTU2MjdiYmM3NWE1YS5iaW5kUG9wdXAocG9wdXBfYWQ4ZjRlNGRiYTU1NDlhYmFjODhlMjRjZThjNmFlYmEpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMTM0MzgzNTg3ZDA0NGQ2NTg1ZWMzMTUwZGZlNzgxNzcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNi4yODEsIDE0MS4xMTFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfY2VmNjlhMDZjOTk0NDUxZmEyYTMxZjk5MmUxZDdkMzIpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2VjYmZkMmQxZDU0ZTQxZDBiNDQ2ZWEwMTUzNzQ5NzhlID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV80NWQ1NzA2YWQyMTI0N2VmOTdlM2JjYzIwYmU4MzQ4ZSA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpjdU9Ud3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZ0lDQWdJRHhvTXo0Z1JHRjBaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpJd01URXRNRE04TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBOGFETStJRXh2WTJGMGFXOXVPaUE4Wm05dWRDQmpiMnh2Y2owaVlteDFaU0krYm1WaGNpQjBhR1VnWldGemRDQmpiMkZ6ZENCdlppQkliMjV6YUhVc0lFcGhjR0Z1UEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTYwIj48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZWNiZmQyZDFkNTRlNDFkMGI0NDZlYTAxNTM3NDk3OGUuc2V0Q29udGVudChpX2ZyYW1lXzQ1ZDU3MDZhZDIxMjQ3ZWY5N2UzYmNjMjBiZTgzNDhlKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzEzNDM4MzU4N2QwNDRkNjU4NWVjMzE1MGRmZTc4MTc3LmJpbmRQb3B1cChwb3B1cF9lY2JmZDJkMWQ1NGU0MWQwYjQ0NmVhMDE1Mzc0OTc4ZSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9kMWEyYzJkNjFlZjg0OTA0YjQ1ODJlMTNhNzFlNzdmYSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjg0ODYsIDE3OC43MzUyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2NlZjY5YTA2Yzk5NDQ1MWZhMmEzMWY5OTJlMWQ3ZDMyKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF84NzRhZGYwMzVlMDk0Yzg1YTBiZjkyY2M4MDBiMDUwNCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfYzAwMWJhZmI5YmIxNDE1Mzk2NjExMTVjZGMwOTQ4YTEgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqY3VPVHd2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqSXdNVFF0TURZOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQThhRE0rSUV4dlkyRjBhVzl1T2lBOFptOXVkQ0JqYjJ4dmNqMGlZbXgxWlNJK01UbHJiU0JUUlNCdlppQk1hWFIwYkdVZ1UybDBhMmx1SUVsemJHRnVaQ3dnUVd4aGMydGhQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNjAiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF84NzRhZGYwMzVlMDk0Yzg1YTBiZjkyY2M4MDBiMDUwNC5zZXRDb250ZW50KGlfZnJhbWVfYzAwMWJhZmI5YmIxNDE1Mzk2NjExMTVjZGMwOTQ4YTEpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZDFhMmMyZDYxZWY4NDkwNGI0NTgyZTEzYTcxZTc3ZmEuYmluZFBvcHVwKHBvcHVwXzg3NGFkZjAzNWUwOTRjODVhMGJmOTJjYzgwMGIwNTA0KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2RlZDdmODE3Y2M0NzQxYjg4MTliYjg0MTZmZTM5NzU1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTQuNTA0OSwgMTUzLjUyMTZdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfY2VmNjlhMDZjOTk0NDUxZmEyYTMxZjk5MmUxZDdkMzIpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzllYzVmYmU2ZDY5MDQxMzdhYjIxYmQ2NTZlM2ZkMTJjID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9iZDdiMGFkNDQwNDU0YzQwODI2NmNhNDAxNjgzZmM5OSA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpjdU9Ud3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZ0lDQWdJRHhvTXo0Z1JHRjBaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpJd01UWXRNVEk4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBOGFETStJRXh2WTJGMGFXOXVPaUE4Wm05dWRDQmpiMnh2Y2owaVlteDFaU0krTlRScmJTQkZJRzltSUZSaGNtOXVMQ0JRWVhCMVlTQk9aWGNnUjNWcGJtVmhQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNjAiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF85ZWM1ZmJlNmQ2OTA0MTM3YWIyMWJkNjU2ZTNmZDEyYy5zZXRDb250ZW50KGlfZnJhbWVfYmQ3YjBhZDQ0MDQ1NGM0MDgyNjZjYTQwMTY4M2ZjOTkpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZGVkN2Y4MTdjYzQ3NDFiODgxOWJiODQxNmZlMzk3NTUuYmluZFBvcHVwKHBvcHVwXzllYzVmYmU2ZDY5MDQxMzdhYjIxYmQ2NTZlM2ZkMTJjKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzk4NWFlNDVkODdlMDRlZTM4NTZkNzQ1MDU1OTk5MDQ1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTYuMjQ2NCwgMTU1LjE3MThdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfY2VmNjlhMDZjOTk0NDUxZmEyYTMxZjk5MmUxZDdkMzIpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzA5NzhmNWZlNTZhNDQ0ODk5YTU5OWZjYmM2MGI0MjY2ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV8yOTc5ZTZkYTAyZDM0N2Y3OGMxY2EwODFhZTgwOTE1MCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpjdU9Ud3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZ0lDQWdJRHhvTXo0Z1JHRjBaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpJd01UY3RNREU4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBOGFETStJRXh2WTJGMGFXOXVPaUE4Wm05dWRDQmpiMnh2Y2owaVlteDFaU0krTXpWcmJTQlhUbGNnYjJZZ1VHRnVaM1Z1WVN3Z1VHRndkV0VnVG1WM0lFZDFhVzVsWVR3dlptOXVkRDQ4TDJnelBnb2dJQ0FnIiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTYwIj48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMDk3OGY1ZmU1NmE0NDQ4OTlhNTk5ZmNiYzYwYjQyNjYuc2V0Q29udGVudChpX2ZyYW1lXzI5NzllNmRhMDJkMzQ3Zjc4YzFjYTA4MWFlODA5MTUwKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzk4NWFlNDVkODdlMDRlZTM4NTZkNzQ1MDU1OTk5MDQ1LmJpbmRQb3B1cChwb3B1cF8wOTc4ZjVmZTU2YTQ0NDg5OWE1OTlmY2JjNjBiNDI2NikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl83OGRkZjhjZjJlZDY0MjlmOTQ4NWQ1YTZlYzAwNmE1YSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzU2LjAwMzksIC0xNDkuMTY1OF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF9jZWY2OWEwNmM5OTQ0NTFmYTJhMzFmOTkyZTFkN2QzMik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfOWY2MWQxOGZjMzZmNGVhOTk4ZjNkNWM3YjdjYzY5YmUgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2FmYzU3MjAwZmE4MjRhN2M5NWNiYTQzNDc2NTMyMTc1ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQamN1T1R3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnUkdGMFpUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQakl3TVRndE1ERThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0E4YURNK0lFeHZZMkYwYVc5dU9pQThabTl1ZENCamIyeHZjajBpWW14MVpTSStNamd3YTIwZ1UwVWdiMllnUzI5a2FXRnJMQ0JCYkdGemEyRThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lBPT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNjAiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF85ZjYxZDE4ZmMzNmY0ZWE5OThmM2Q1YzdiN2NjNjliZS5zZXRDb250ZW50KGlfZnJhbWVfYWZjNTcyMDBmYTgyNGE3Yzk1Y2JhNDM0NzY1MzIxNzUpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNzhkZGY4Y2YyZWQ2NDI5Zjk0ODVkNWE2ZWMwMDZhNWEuYmluZFBvcHVwKHBvcHVwXzlmNjFkMThmYzM2ZjRlYTk5OGYzZDVjN2I3Y2M2OWJlKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2I1ZjkzZGY4ZGUzYTRkMjg4MDFlNzI4ZDBmYmJkOWNjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE4LjQ3NDMsIDE3OS4zNTAyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2NlZjY5YTA2Yzk5NDQ1MWZhMmEzMWY5OTJlMWQ3ZDMyKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF81N2EwNDFhOTc4Nzg0ZWM2OWMwYWY4MjQ5NDBhMTMwYSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfMDkyNmRhYWZkZjc2NGExNzk1YTk4ZjRiNGViMWYzMDkgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqY3VPVHd2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqSXdNVGd0TURrOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQThhRE0rSUV4dlkyRjBhVzl1T2lBOFptOXVkQ0JqYjJ4dmNqMGlZbXgxWlNJK01UQXlhMjBnUlZORklHOW1JRk4xZG1Fc0lFWnBhbWs4TDJadmJuUStQQzlvTXo0S0lDQWdJQT09IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTYwIj48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNTdhMDQxYTk3ODc4NGVjNjljMGFmODI0OTQwYTEzMGEuc2V0Q29udGVudChpX2ZyYW1lXzA5MjZkYWFmZGY3NjRhMTc5NWE5OGY0YjRlYjFmMzA5KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2I1ZjkzZGY4ZGUzYTRkMjg4MDFlNzI4ZDBmYmJkOWNjLmJpbmRQb3B1cChwb3B1cF81N2EwNDFhOTc4Nzg0ZWM2OWMwYWY4MjQ5NDBhMTMwYSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl82ZTE0MjhlNDJhZjU0NzA3ODBmMTE5NWU2MzJlMTIwZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM2LjAzMywgLTEwLjYxM10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF9jZWY2OWEwNmM5OTQ0NTFmYTJhMzFmOTkyZTFkN2QzMik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZTQzYjNjMGJlMGJlNGM5Zjk4OGM4NmMyY2IxMjgyYTUgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzFkOGRjYzVmNjY2YjQ0MTBiYzFlYzdiMDcyN2ViMTI1ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQamN1T0R3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnUkdGMFpUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQakU1TmprdE1ESThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0E4YURNK0lFeHZZMkYwYVc5dU9pQThabTl1ZENCamIyeHZjajBpWW14MVpTSStRWHB2Y21WekxVTmhjR1VnVTNRdUlGWnBibU5sYm5RZ1VtbGtaMlU4TDJadmJuUStQQzlvTXo0S0lDQWdJQT09IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTYwIj48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZTQzYjNjMGJlMGJlNGM5Zjk4OGM4NmMyY2IxMjgyYTUuc2V0Q29udGVudChpX2ZyYW1lXzFkOGRjYzVmNjY2YjQ0MTBiYzFlYzdiMDcyN2ViMTI1KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzZlMTQyOGU0MmFmNTQ3MDc4MGYxMTk1ZTYzMmUxMjBmLmJpbmRQb3B1cChwb3B1cF9lNDNiM2MwYmUwYmU0YzlmOTg4Yzg2YzJjYjEyODJhNSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9lZWRiNjEwMzcyN2I0MmM4YTg4MTRiNmQ3YTQ0ZjQwMyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0zMi42MDEsIC03MS4wNzYwMDAwMDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF9jZWY2OWEwNmM5OTQ0NTFmYTJhMzFmOTkyZTFkN2QzMik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfM2UwMWVmMjgyMTM1NDc3ZmE5MTdkMWRkYjBjOTExZDggPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzFmNDVlODRmNmZmMDQ5ZDQ5NGI5NTIyNzI3MzQxNDU2ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQamN1T0R3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnUkdGMFpUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQakU1TnpFdE1EYzhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0E4YURNK0lFeHZZMkYwYVc5dU9pQThabTl1ZENCamIyeHZjajBpWW14MVpTSStWbUZzY0dGeVlXbHpieXdnUTJocGJHVThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lBPT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNjAiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF8zZTAxZWYyODIxMzU0NzdmYTkxN2QxZGRiMGM5MTFkOC5zZXRDb250ZW50KGlfZnJhbWVfMWY0NWU4NGY2ZmYwNDlkNDk0Yjk1MjI3MjczNDE0NTYpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZWVkYjYxMDM3MjdiNDJjOGE4ODE0YjZkN2E0NGY0MDMuYmluZFBvcHVwKHBvcHVwXzNlMDFlZjI4MjEzNTQ3N2ZhOTE3ZDFkZGIwYzkxMWQ4KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2NkNmYyYzIxNGZkMjQ5YmFiYzY2NjFmYTc3YzI4NzkyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTI0Ljg5NDAwMDAwMDAwMDAwMiwgLTE3NS4xMTkwMDAwMDAwMDAwM10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF9jZWY2OWEwNmM5OTQ0NTFmYTJhMzFmOTkyZTFkN2QzMik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYjg5MGFlNmVjNmM4NDQwOTk4NzRkODVjZGI5MGM1OGEgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2M3M2M0NTVkNTZlMDRiYzNhYmU1OWY3MWQ5NTc1MWNjID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQamN1T0R3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnUkdGMFpUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQakU1TnpVdE1UQThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0E4YURNK0lFeHZZMkYwYVc5dU9pQThabTl1ZENCamIyeHZjajBpWW14MVpTSStjMjkxZEdnZ2IyWWdWRzl1WjJFOEwyWnZiblErUEM5b016NEtJQ0FnSUE9PSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE2MCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2I4OTBhZTZlYzZjODQ0MDk5ODc0ZDg1Y2RiOTBjNThhLnNldENvbnRlbnQoaV9mcmFtZV9jNzNjNDU1ZDU2ZTA0YmMzYWJlNTlmNzFkOTU3NTFjYyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9jZDZmMmMyMTRmZDI0OWJhYmM2NjYxZmE3N2MyODc5Mi5iaW5kUG9wdXAocG9wdXBfYjg5MGFlNmVjNmM4NDQwOTk4NzRkODVjZGI5MGM1OGEpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMTg5ZTM5NDYwNWI0NDE2NzkwNGRiNDNkOWFkOTdmOWMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMTYuMjY0LCAtMTcyLjQ2N10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF9jZWY2OWEwNmM5OTQ0NTFmYTJhMzFmOTkyZTFkN2QzMik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfOWIxZGFkMDI5MmNiNDM0ZGFjZjk0OGI3ZWEyYTYyN2EgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2NiMjc0M2U3YjQ0MjQxNDJiMjFlMDVmMmJjYzlmODU4ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQamN1T0R3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnUkdGMFpUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQakU1TnpVdE1USThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0E4YURNK0lFeHZZMkYwYVc5dU9pQThabTl1ZENCamIyeHZjajBpWW14MVpTSStVMkZ0YjJFZ1NYTnNZVzVrY3lCeVpXZHBiMjQ4TDJadmJuUStQQzlvTXo0S0lDQWdJQT09IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTYwIj48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfOWIxZGFkMDI5MmNiNDM0ZGFjZjk0OGI3ZWEyYTYyN2Euc2V0Q29udGVudChpX2ZyYW1lX2NiMjc0M2U3YjQ0MjQxNDJiMjFlMDVmMmJjYzlmODU4KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzE4OWUzOTQ2MDViNDQxNjc5MDRkYjQzZDlhZDk3ZjljLmJpbmRQb3B1cChwb3B1cF85YjFkYWQwMjkyY2I0MzRkYWNmOTQ4YjdlYTJhNjI3YSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9jZTc4OTkxYjUxODI0OWJmODU0Njg0NTViZDlmMGUzNiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzU2Ljk1MywgLTE0My4wMzJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfY2VmNjlhMDZjOTk0NDUxZmEyYTMxZjk5MmUxZDdkMzIpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2UwZjQ1MmI2NjViODQyYTA5ZDQ1ZDE4MzUwZDYxMTMyID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV84NzFlNDVhMTE5MjQ0MTZhYjc2NGQzOWMzYTMyNWJjZCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpjdU9Ed3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZ0lDQWdJRHhvTXo0Z1JHRjBaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpFNU9EZ3RNRE04TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBOGFETStJRXh2WTJGMGFXOXVPaUE4Wm05dWRDQmpiMnh2Y2owaVlteDFaU0krUjNWc1ppQnZaaUJCYkdGemEyRThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lBPT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNjAiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9lMGY0NTJiNjY1Yjg0MmEwOWQ0NWQxODM1MGQ2MTEzMi5zZXRDb250ZW50KGlfZnJhbWVfODcxZTQ1YTExOTI0NDE2YWI3NjRkMzljM2EzMjViY2QpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfY2U3ODk5MWI1MTgyNDliZjg1NDY4NDU1YmQ5ZjBlMzYuYmluZFBvcHVwKHBvcHVwX2UwZjQ1MmI2NjViODQyYTA5ZDQ1ZDE4MzUwZDYxMTMyKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzJjYmEyMzkzNGYzODRlNTliZTc2MDNkZGI1MDg5MmQ3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMS4xODYsIDEyMi44NTcwMDAwMDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF9jZWY2OWEwNmM5OTQ0NTFmYTJhMzFmOTkyZTFkN2QzMik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMTIyY2QyYTk1MzNiNDM1MmIyYzJiZDg5NDk5MWVkZjggPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2E2NDZkNjIxYjYwZTQzMjg5YTI5Y2UwNDA5YTZkZDY5ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQamN1T0R3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnUkdGMFpUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQakU1T1RBdE1EUThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0E4YURNK0lFeHZZMkYwYVc5dU9pQThabTl1ZENCamIyeHZjajBpWW14MVpTSStUV2x1WVdoaGMyRXNJRk4xYkdGM1pYTnBMQ0JKYm1SdmJtVnphV0U4TDJadmJuUStQQzlvTXo0S0lDQWdJQT09IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTYwIj48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMTIyY2QyYTk1MzNiNDM1MmIyYzJiZDg5NDk5MWVkZjguc2V0Q29udGVudChpX2ZyYW1lX2E2NDZkNjIxYjYwZTQzMjg5YTI5Y2UwNDA5YTZkZDY5KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzJjYmEyMzkzNGYzODRlNTliZTc2MDNkZGI1MDg5MmQ3LmJpbmRQb3B1cChwb3B1cF8xMjJjZDJhOTUzM2I0MzUyYjJjMmJkODk0OTkxZWRmOCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl82OGRkNmVjNTIwMDc0MDQ2OWY0M2MxMzcxZDExMzEzNyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy04LjQ4LCAxMjEuODk2XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2NlZjY5YTA2Yzk5NDQ1MWZhMmEzMWY5OTJlMWQ3ZDMyKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9kMjY1OTI4ZDViYzQ0ZDM5YWYyMjUyM2E5OTI3ZWM5OSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfN2IzMjU1ZDc3ZjRhNGZmNTgzMGI4Njg4ZmNmOGI2NGYgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqY3VPRHd2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqRTVPVEl0TVRJOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQThhRE0rSUV4dlkyRjBhVzl1T2lBOFptOXVkQ0JqYjJ4dmNqMGlZbXgxWlNJK1JteHZjbVZ6SUhKbFoybHZiaXdnU1c1a2IyNWxjMmxoUEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTYwIj48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZDI2NTkyOGQ1YmM0NGQzOWFmMjI1MjNhOTkyN2VjOTkuc2V0Q29udGVudChpX2ZyYW1lXzdiMzI1NWQ3N2Y0YTRmZjU4MzBiODY4OGZjZjhiNjRmKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzY4ZGQ2ZWM1MjAwNzQwNDY5ZjQzYzEzNzFkMTEzMTM3LmJpbmRQb3B1cChwb3B1cF9kMjY1OTI4ZDViYzQ0ZDM5YWYyMjUyM2E5OTI3ZWM5OSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl82MGE0NGQ0MWU3NDY0NzFkYWVhOGQ2NGNiYTIyMWVhYSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzEyLjk4MjAwMDAwMDAwMDAwMSwgMTQ0LjgwMTAwMDAwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2NlZjY5YTA2Yzk5NDQ1MWZhMmEzMWY5OTJlMWQ3ZDMyKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9lNDcyYzhlNTIwOWM0ODRkYmYzZTIxYjlhM2E2NmQxZCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfNTNiMDBkNzY2NTE5NGRjODk0MzY4NTRiNTdhNDYxNmUgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqY3VPRHd2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqRTVPVE10TURnOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQThhRE0rSUV4dlkyRjBhVzl1T2lBOFptOXVkQ0JqYjJ4dmNqMGlZbXgxWlNJK1IzVmhiU0J5WldkcGIyNDhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lBPT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNjAiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9lNDcyYzhlNTIwOWM0ODRkYmYzZTIxYjlhM2E2NmQxZC5zZXRDb250ZW50KGlfZnJhbWVfNTNiMDBkNzY2NTE5NGRjODk0MzY4NTRiNTdhNDYxNmUpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNjBhNDRkNDFlNzQ2NDcxZGFlYThkNjRjYmEyMjFlYWEuYmluZFBvcHVwKHBvcHVwX2U0NzJjOGU1MjA5YzQ4NGRiZjNlMjFiOWEzYTY2ZDFkKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzFkN2M4ZTQwMjU3YjRhMDU5MjlhYjc4OTNlZjJiZTJmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTEwLjQ3NywgMTEyLjgzNV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF9jZWY2OWEwNmM5OTQ0NTFmYTJhMzFmOTkyZTFkN2QzMik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMjM0YzU5OWI5ZDY0NDk4Yzk5NDdiNjI5M2IyNTg2OGUgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzcyMjljN2RlZmUzZjRlNjk5NTM3NjliYTM5MWIyMDYzID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQamN1T0R3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnUkdGMFpUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQakU1T1RRdE1EWThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0E4YURNK0lFeHZZMkYwYVc5dU9pQThabTl1ZENCamIyeHZjajBpWW14MVpTSStjMjkxZEdnZ2IyWWdTbUYyWVN3Z1NXNWtiMjVsYzJsaFBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE2MCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzIzNGM1OTliOWQ2NDQ5OGM5OTQ3YjYyOTNiMjU4NjhlLnNldENvbnRlbnQoaV9mcmFtZV83MjI5YzdkZWZlM2Y0ZTY5OTUzNzY5YmEzOTFiMjA2Myk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8xZDdjOGU0MDI1N2I0YTA1OTI5YWI3ODkzZWYyYmUyZi5iaW5kUG9wdXAocG9wdXBfMjM0YzU5OWI5ZDY0NDk4Yzk5NDdiNjI5M2IyNTg2OGUpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNTAyZTExYjQ4NmM3NDE4NmJlZjVmZTFkOGJhZTU1ZmYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41MjUsIDE0My40MTg5OTk5OTk5OTk5OF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF9jZWY2OWEwNmM5OTQ0NTFmYTJhMzFmOTkyZTFkN2QzMik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZGFkMjVjZjViNzJmNDJiNzkzMDViZDJmZThkODE0ZGQgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzU4NmJkNjlmMDNiNzQxM2Q5ZGFiMmZlNmMzZjEyZWQ0ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQamN1T0R3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnUkdGMFpUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQakU1T1RRdE1USThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0E4YURNK0lFeHZZMkYwYVc5dU9pQThabTl1ZENCamIyeHZjajBpWW14MVpTSStiMlptSUhSb1pTQmxZWE4wSUdOdllYTjBJRzltSUVodmJuTm9kU3dnU21Gd1lXNDhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lBPT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNjAiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9kYWQyNWNmNWI3MmY0MmI3OTMwNWJkMmZlOGQ4MTRkZC5zZXRDb250ZW50KGlfZnJhbWVfNTg2YmQ2OWYwM2I3NDEzZDlkYWIyZmU2YzNmMTJlZDQpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNTAyZTExYjQ4NmM3NDE4NmJlZjVmZTFkOGJhZTU1ZmYuYmluZFBvcHVwKHBvcHVwX2RhZDI1Y2Y1YjcyZjQyYjc5MzA1YmQyZmU4ZDgxNGRkKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzhhNzE4YjQ3ZGQxYjQwYjBhMGI4YTRmNTgzNjFlZGU5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTIyLjEwMSwgLTE3Ni43NzIwMDAwMDAwMDAwMl0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF9jZWY2OWEwNmM5OTQ0NTFmYTJhMzFmOTkyZTFkN2QzMik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNjE1ZmJlMWQ3ZTdiNDE4MjhkZjhkZDI0MDU5YTUwMDcgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2NlYjRkN2RjNjhkYzQ4NjVhN2ViNjFlMTMzZmYwZjA2ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQamN1T0R3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnUkdGMFpUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQakU1T1RjdE1UQThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0E4YURNK0lFeHZZMkYwYVc5dU9pQThabTl1ZENCamIyeHZjajBpWW14MVpTSStjMjkxZEdnZ2IyWWdkR2hsSUVacGFta2dTWE5zWVc1a2N6d3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZyIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE2MCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzYxNWZiZTFkN2U3YjQxODI4ZGY4ZGQyNDA1OWE1MDA3LnNldENvbnRlbnQoaV9mcmFtZV9jZWI0ZDdkYzY4ZGM0ODY1YTdlYjYxZTEzM2ZmMGYwNik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl84YTcxOGI0N2RkMWI0MGIwYTBiOGE0ZjU4MzYxZWRlOS5iaW5kUG9wdXAocG9wdXBfNjE1ZmJlMWQ3ZTdiNDE4MjhkZjhkZDI0MDU5YTUwMDcpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMThhNDgzNzgzM2EzNGVhY2IzNGI4NTI5ODBkMjRmZjcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1NC44NDEsIDE2Mi4wMzVdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfY2VmNjlhMDZjOTk0NDUxZmEyYTMxZjk5MmUxZDdkMzIpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzZhM2YxYzZkYjdjYzQ0MDFhNDkxY2I0ZDZkYTdkYWQ0ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV8zNTEwYTFmNGRjMjc0YTAyYTQ0ZGVlZmYwMjljNWZjNiA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpjdU9Ed3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZ0lDQWdJRHhvTXo0Z1JHRjBaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpFNU9UY3RNVEk4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBOGFETStJRXh2WTJGMGFXOXVPaUE4Wm05dWRDQmpiMnh2Y2owaVlteDFaU0krYm1WaGNpQjBhR1VnWldGemRDQmpiMkZ6ZENCdlppQjBhR1VnUzJGdFkyaGhkR3RoSUZCbGJtbHVjM1ZzWVN3Z1VuVnpjMmxoUEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTYwIj48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNmEzZjFjNmRiN2NjNDQwMWE0OTFjYjRkNmRhN2RhZDQuc2V0Q29udGVudChpX2ZyYW1lXzM1MTBhMWY0ZGMyNzRhMDJhNDRkZWVmZjAyOWM1ZmM2KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzE4YTQ4Mzc4MzNhMzRlYWNiMzRiODUyOTgwZDI0ZmY3LmJpbmRQb3B1cChwb3B1cF82YTNmMWM2ZGI3Y2M0NDAxYTQ5MWNiNGQ2ZGE3ZGFkNCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9mZDNiZmQ4ZTA3MjU0MWI3ODJkNTkxYTE1ZWFkNjNkNCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy01LjIzMywgMTUzLjEwMl0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF9jZWY2OWEwNmM5OTQ0NTFmYTJhMzFmOTkyZTFkN2QzMik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNTc0ZDNjNTdlMDIzNDVhYzgxNGYxYTI4ZWQ1YmUxNDIgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzFlZDk3YmY5ZDQxMDQwOGFiYTk3NTU4MjM0NGE0ZGViID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQamN1T0R3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnUkdGMFpUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQakl3TURBdE1URThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0E4YURNK0lFeHZZMkYwYVc5dU9pQThabTl1ZENCamIyeHZjajBpWW14MVpTSStUbVYzSUVseVpXeGhibVFnY21WbmFXOXVMQ0JRWVhCMVlTQk9aWGNnUjNWcGJtVmhQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNjAiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF81NzRkM2M1N2UwMjM0NWFjODE0ZjFhMjhlZDViZTE0Mi5zZXRDb250ZW50KGlfZnJhbWVfMWVkOTdiZjlkNDEwNDA4YWJhOTc1NTgyMzQ0YTRkZWIpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZmQzYmZkOGUwNzI1NDFiNzgyZDU5MWExNWVhZDYzZDQuYmluZFBvcHVwKHBvcHVwXzU3NGQzYzU3ZTAyMzQ1YWM4MTRmMWEyOGVkNWJlMTQyKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2I5MDg3YzNkOGY3NTRjOGRiYjlhNTAyMWRkNTBjMzI5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTUuNDk2LCAxNTEuNzgxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2NlZjY5YTA2Yzk5NDQ1MWZhMmEzMWY5OTJlMWQ3ZDMyKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9lM2MwZjViMjU0NDI0Nzk3ODFkZmM2NzJhMWI1ZWFjZCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfODAxN2ZlMjcyMTAzNGYxZmFjZjk3NGUwMzc4ZTFjM2EgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqY3VPRHd2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqSXdNREF0TVRFOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQThhRE0rSUV4dlkyRjBhVzl1T2lBOFptOXVkQ0JqYjJ4dmNqMGlZbXgxWlNJK1RtVjNJRUp5YVhSaGFXNGdjbVZuYVc5dUxDQlFZWEIxWVNCT1pYY2dSM1ZwYm1WaFBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE2MCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2UzYzBmNWIyNTQ0MjQ3OTc4MWRmYzY3MmExYjVlYWNkLnNldENvbnRlbnQoaV9mcmFtZV84MDE3ZmUyNzIxMDM0ZjFmYWNmOTc0ZTAzNzhlMWMzYSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9iOTA4N2MzZDhmNzU0YzhkYmI5YTUwMjFkZDUwYzMyOS5iaW5kUG9wdXAocG9wdXBfZTNjMGY1YjI1NDQyNDc5NzgxZGZjNjcyYTFiNWVhY2QpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMmQ3MTIzNjY4ZmZkNDJkMmJhZDJiZTZjNmZjNWZhOGYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS45NDYsIDkwLjU0MV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF9jZWY2OWEwNmM5OTQ0NTFmYTJhMzFmOTkyZTFkN2QzMik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMDIzZmRmMGNhMDFhNDlkNDkzYTk0ZGYzZGQ2ZTkzODEgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzczMDM2NjUwZGMyZjQ5ZmZhMmUzZDVkOWFiYTZiMDhmID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQamN1T0R3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnUkdGMFpUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQakl3TURFdE1URThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0E4YURNK0lFeHZZMkYwYVc5dU9pQThabTl1ZENCamIyeHZjajBpWW14MVpTSStjMjkxZEdobGNtNGdVV2x1WjJoaGFTd2dRMmhwYm1FOEwyWnZiblErUEM5b016NEtJQ0FnSUE9PSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE2MCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzAyM2ZkZjBjYTAxYTQ5ZDQ5M2E5NGRmM2RkNmU5MzgxLnNldENvbnRlbnQoaV9mcmFtZV83MzAzNjY1MGRjMmY0OWZmYTJlM2Q1ZDlhYmE2YjA4Zik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8yZDcxMjM2NjhmZmQ0MmQyYmFkMmJlNmM2ZmM1ZmE4Zi5iaW5kUG9wdXAocG9wdXBfMDIzZmRmMGNhMDFhNDlkNDkzYTk0ZGYzZGQ2ZTkzODEpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYWE5ZTUzNWQ4YzU5NGJhMTgyNDc1MDJhZDliOWRhODUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS4xNDYsIDE3OC42NV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF9jZWY2OWEwNmM5OTQ0NTFmYTJhMzFmOTkyZTFkN2QzMik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNWFiNjk0YmE4NWMyNDgxNmE5YjlhODQ4NWNiODk1ZmUgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2E1ZWJhYmM2Zjg5ODQ1ZmE4ZGY2Mzk0MjgxZjY3OGJiID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQamN1T0R3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnUkdGMFpUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQakl3TURNdE1URThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0E4YURNK0lFeHZZMkYwYVc5dU9pQThabTl1ZENCamIyeHZjajBpWW14MVpTSStVbUYwSUVsemJHRnVaSE1zSUVGc1pYVjBhV0Z1SUVsemJHRnVaSE1zSUVGc1lYTnJZVHd2Wm05dWRENDhMMmd6UGdvZ0lDQWciIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNjAiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF81YWI2OTRiYTg1YzI0ODE2YTliOWE4NDg1Y2I4OTVmZS5zZXRDb250ZW50KGlfZnJhbWVfYTVlYmFiYzZmODk4NDVmYThkZjYzOTQyODFmNjc4YmIpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfYWE5ZTUzNWQ4YzU5NGJhMTgyNDc1MDJhZDliOWRhODUuYmluZFBvcHVwKHBvcHVwXzVhYjY5NGJhODVjMjQ4MTZhOWI5YTg0ODVjYjg5NWZlKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzM5NDcwNTcwM2U2NjQ4ODE5YWUzNTJjMjU1YTQ3NmM3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljk4NzAwMDAwMDAwMDAwMiwgLTY5LjE5N10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF9jZWY2OWEwNmM5OTQ0NTFmYTJhMzFmOTkyZTFkN2QzMik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZThlNGMyMGYxNTQyNDNhZjk4NTIyODAzZTdiNzMwMTggPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzFmZjQ5YTBlYjczMTQ1YmFiMjE0ODA2MzRjMTkyODVmID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQamN1T0R3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnUkdGMFpUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQakl3TURVdE1EWThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0E4YURNK0lFeHZZMkYwYVc5dU9pQThabTl1ZENCamIyeHZjajBpWW14MVpTSStWR0Z5WVhCaFkyRXNJRU5vYVd4bFBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE2MCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2U4ZTRjMjBmMTU0MjQzYWY5ODUyMjgwM2U3YjczMDE4LnNldENvbnRlbnQoaV9mcmFtZV8xZmY0OWEwZWI3MzE0NWJhYjIxNDgwNjM0YzE5Mjg1Zik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8zOTQ3MDU3MDNlNjY0ODgxOWFlMzUyYzI1NWE0NzZjNy5iaW5kUG9wdXAocG9wdXBfZThlNGMyMGYxNTQyNDNhZjk4NTIyODAzZTdiNzMwMTgpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMmIxMzU1MjNiNjlkNGRkMWE2YzBhZDA4ZWUyOWIzNDIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjUuOTk2LCAtMTc3LjUxNF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF9jZWY2OWEwNmM5OTQ0NTFmYTJhMzFmOTkyZTFkN2QzMik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYWEzNTlmYmVlMWRkNDMzYThjZDAxNTI4NDY3MWZhMTIgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2ZiMTZlNmQ5ZDI3MTRiOWRiMGFmNzg3MTNkOGZhZGI3ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQamN1T0R3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnUkdGMFpUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQakl3TURjdE1USThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0E4YURNK0lFeHZZMkYwYVc5dU9pQThabTl1ZENCamIyeHZjajBpWW14MVpTSStjMjkxZEdnZ2IyWWdkR2hsSUVacGFta2dTWE5zWVc1a2N6d3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZyIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE2MCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2FhMzU5ZmJlZTFkZDQzM2E4Y2QwMTUyODQ2NzFmYTEyLnNldENvbnRlbnQoaV9mcmFtZV9mYjE2ZTZkOWQyNzE0YjlkYjBhZjc4NzEzZDhmYWRiNyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8yYjEzNTUyM2I2OWQ0ZGQxYTZjMGFkMDhlZTI5YjM0Mi5iaW5kUG9wdXAocG9wdXBfYWEzNTlmYmVlMWRkNDMzYThjZDAxNTI4NDY3MWZhMTIpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYjhlZmY3NmIxOWRlNDcwYWFhYzBmOWEyMmEyNWQ4NGYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstNDUuNzYyLCAxNjYuNTYyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2NlZjY5YTA2Yzk5NDQ1MWZhMmEzMWY5OTJlMWQ3ZDMyKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF85NWVhNWI5MDA0MGQ0Yzg2OGFhYzM1ZWFkMDYxOGExNCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfMDAzM2Q3ZTljYmE5NGQwNjg0OTAwZWRhMGU1N2Q2MGUgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqY3VPRHd2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqSXdNRGt0TURjOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQThhRE0rSUV4dlkyRjBhVzl1T2lBOFptOXVkQ0JqYjJ4dmNqMGlZbXgxWlNJK2IyWm1JSFJvWlNCM1pYTjBJR052WVhOMElHOW1JSFJvWlNCVGIzVjBhQ0JKYzJ4aGJtUWdiMllnVG1WM0lGcGxZV3hoYm1ROEwyWnZiblErUEM5b016NEtJQ0FnSUE9PSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE2MCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzk1ZWE1YjkwMDQwZDRjODY4YWFjMzVlYWQwNjE4YTE0LnNldENvbnRlbnQoaV9mcmFtZV8wMDMzZDdlOWNiYTk0ZDA2ODQ5MDBlZGEwZTU3ZDYwZSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9iOGVmZjc2YjE5ZGU0NzBhYWFjMGY5YTIyYTI1ZDg0Zi5iaW5kUG9wdXAocG9wdXBfOTVlYTViOTAwNDBkNGM4NjhhYWMzNWVhZDA2MThhMTQpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfODRkY2NlMzMzZDE2NGRlN2E5ZTQ3ZWFmYTFkODY0YmUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMTIuNTE3MDAwMDAwMDAwMDAxLCAxNjYuMzgyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2NlZjY5YTA2Yzk5NDQ1MWZhMmEzMWY5OTJlMWQ3ZDMyKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8yZGJhNjU0OTkzNDM0NWUyODE5MGZjMzg0MjdiMWM5YSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfYTRmYmQyZDQyOGMyNDMzM2EzMWNjY2MwMDE5ZDZmOTcgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqY3VPRHd2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqSXdNRGt0TVRBOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQThhRE0rSUV4dlkyRjBhVzl1T2lBOFptOXVkQ0JqYjJ4dmNqMGlZbXgxWlNJK1UyRnVkR0VnUTNKMWVpQkpjMnhoYm1SelBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE2MCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzJkYmE2NTQ5OTM0MzQ1ZTI4MTkwZmMzODQyN2IxYzlhLnNldENvbnRlbnQoaV9mcmFtZV9hNGZiZDJkNDI4YzI0MzMzYTMxY2NjYzAwMTlkNmY5Nyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl84NGRjY2UzMzNkMTY0ZGU3YTllNDdlYWZhMWQ4NjRiZS5iaW5kUG9wdXAocG9wdXBfMmRiYTY1NDk5MzQzNDVlMjgxOTBmYzM4NDI3YjFjOWEpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNThmYjIyNjU1YzE5NDRjNThmZGRkMDE4ZGNmMjJiODYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFsyLjM4MywgOTcuMDQ3OTk5OTk5OTk5OTldLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfY2VmNjlhMDZjOTk0NDUxZmEyYTMxZjk5MmUxZDdkMzIpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzg3YTUyMmYwNjE1NTQ2Y2VhMmVmYzNkMGE4NmU4ZGJjID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9kZDMwZGMzYjZmYTk0MDA1YjgxMWEzODRlZDJlMzA4YSA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpjdU9Ed3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZ0lDQWdJRHhvTXo0Z1JHRjBaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpJd01UQXRNRFE4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBOGFETStJRXh2WTJGMGFXOXVPaUE4Wm05dWRDQmpiMnh2Y2owaVlteDFaU0krYm05eWRHaGxjbTRnVTNWdFlYUnlZU3dnU1c1a2IyNWxjMmxoUEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTYwIj48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfODdhNTIyZjA2MTU1NDZjZWEyZWZjM2QwYTg2ZThkYmMuc2V0Q29udGVudChpX2ZyYW1lX2RkMzBkYzNiNmZhOTQwMDViODExYTM4NGVkMmUzMDhhKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzU4ZmIyMjY1NWMxOTQ0YzU4ZmRkZDAxOGRjZjIyYjg2LmJpbmRQb3B1cChwb3B1cF84N2E1MjJmMDYxNTU0NmNlYTJlZmMzZDBhODZlOGRiYykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9lYTc5ZDk5NDFjN2E0YjMzOGY5YzBiYWFmN2UxYTJjOCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0zLjQ4NywgMTAwLjA4MjAwMDAwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2NlZjY5YTA2Yzk5NDQ1MWZhMmEzMWY5OTJlMWQ3ZDMyKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF81OGQ3MjNkMjc0ZDA0Y2I0OGZhMjg5Y2E0MDBlZTM5OCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfNjA4NjViOWQ4NDkzNDM3ZDg2YmRmOWYwZDYyNDQ0MGYgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqY3VPRHd2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqSXdNVEF0TVRBOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQThhRE0rSUV4dlkyRjBhVzl1T2lBOFptOXVkQ0JqYjJ4dmNqMGlZbXgxWlNJK1MyVndkV3hoZFdGdUlFMWxiblJoZDJGcElISmxaMmx2Yml3Z1NXNWtiMjVsYzJsaFBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE2MCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzU4ZDcyM2QyNzRkMDRjYjQ4ZmEyODljYTQwMGVlMzk4LnNldENvbnRlbnQoaV9mcmFtZV82MDg2NWI5ZDg0OTM0MzdkODZiZGY5ZjBkNjI0NDQwZik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9lYTc5ZDk5NDFjN2E0YjMzOGY5YzBiYWFmN2UxYTJjOC5iaW5kUG9wdXAocG9wdXBfNThkNzIzZDI3NGQwNGNiNDhmYTI4OWNhNDAwZWUzOTgpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZTM1OGQ4ODlmNTJkNGFhNzg0MGY2M2YyZTQ2OGY0ZTMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1Mi43ODgwMDAwMDAwMDAwMDQsIC0xMzIuMTAxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2NlZjY5YTA2Yzk5NDQ1MWZhMmEzMWY5OTJlMWQ3ZDMyKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8wYWY1NWMxMWY5OWY0MWM5OTM0ZWQyMGY3ZDlkOTA5MCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfNWY3NzA1NmQzYTE2NGQzZGFiODAxYmM0Y2YzZTU4OTMgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqY3VPRHd2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqSXdNVEl0TVRBOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQThhRE0rSUV4dlkyRjBhVzl1T2lBOFptOXVkQ0JqYjJ4dmNqMGlZbXgxWlNJK1NHRnBaR0VnUjNkaGFXa3NJRU5oYm1Ga1lUd3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZyIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE2MCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzBhZjU1YzExZjk5ZjQxYzk5MzRlZDIwZjdkOWQ5MDkwLnNldENvbnRlbnQoaV9mcmFtZV81Zjc3MDU2ZDNhMTY0ZDNkYWI4MDFiYzRjZjNlNTg5Myk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9lMzU4ZDg4OWY1MmQ0YWE3ODQwZjYzZjJlNDY4ZjRlMy5iaW5kUG9wdXAocG9wdXBfMGFmNTVjMTFmOTlmNDFjOTkzNGVkMjBmN2Q5ZDkwOTApCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNzhlN2FiMzY4YmEzNGUxM2IzYzU1ZDZmZDM4ZmFmOGQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFsyOC4yMzA1LCA4NC43MzE0XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2NlZjY5YTA2Yzk5NDQ1MWZhMmEzMWY5OTJlMWQ3ZDMyKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF82MTJmMTk0NzU5NmQ0ZGYwYjY4MzVmOTkyYzY3Y2MwNSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfNjBjMDAxMzU5M2Y3NDg2NDkzNjZhZjRkNzYxZjA5NzIgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqY3VPRHd2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqSXdNVFV0TURROEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQThhRE0rSUV4dlkyRjBhVzl1T2lBOFptOXVkQ0JqYjJ4dmNqMGlZbXgxWlNJK016WnJiU0JGSUc5bUlFdG9kV1JwTENCT1pYQmhiRHd2Wm05dWRENDhMMmd6UGdvZ0lDQWciIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNjAiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF82MTJmMTk0NzU5NmQ0ZGYwYjY4MzVmOTkyYzY3Y2MwNS5zZXRDb250ZW50KGlfZnJhbWVfNjBjMDAxMzU5M2Y3NDg2NDkzNjZhZjRkNzYxZjA5NzIpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNzhlN2FiMzY4YmEzNGUxM2IzYzU1ZDZmZDM4ZmFmOGQuYmluZFBvcHVwKHBvcHVwXzYxMmYxOTQ3NTk2ZDRkZjBiNjgzNWY5OTJjNjdjYzA1KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2Q4ZWZlYzhlZTUzNjRjMTQ5MTI2YTZkMWRjYTBkNGVhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMjcuODM4NiwgMTQwLjQ5MzFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfY2VmNjlhMDZjOTk0NDUxZmEyYTMxZjk5MmUxZDdkMzIpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzg0MTE0MWIzZWM0NDRkYjRiYzRlOWE2MjYwMjQ5MjBkID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9mNDEzYzAxOWRhNjI0MzdiODE5MjM4OGU5ZDg2MWRhNyA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpjdU9Ed3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZ0lDQWdJRHhvTXo0Z1JHRjBaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpJd01UVXRNRFU4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBOGFETStJRXh2WTJGMGFXOXVPaUE4Wm05dWRDQmpiMnh2Y2owaVlteDFaU0krTVRnNWEyMGdWMDVYSUc5bUlFTm9hV05vYVMxemFHbHRZU3dnU21Gd1lXNDhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lBPT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNjAiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF84NDExNDFiM2VjNDQ0ZGI0YmM0ZTlhNjI2MDI0OTIwZC5zZXRDb250ZW50KGlfZnJhbWVfZjQxM2MwMTlkYTYyNDM3YjgxOTIzODhlOWQ4NjFkYTcpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZDhlZmVjOGVlNTM2NGMxNDkxMjZhNmQxZGNhMGQ0ZWEuYmluZFBvcHVwKHBvcHVwXzg0MTE0MWIzZWM0NDRkYjRiYzRlOWE2MjYwMjQ5MjBkKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2NiMjEzYmVmNzNlNTQ3NjRiZTE3YTMzZWZlZTQwN2VjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTQuOTUyMSwgOTQuMzI5OV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF9jZWY2OWEwNmM5OTQ0NTFmYTJhMzFmOTkyZTFkN2QzMik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZGE0N2QwNjQxNzQ1NDY1Njk4YTUwNGIxOTdkNGRkMzkgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzFlNWY5OWFkYmFkYzQzOGRiMmRmYTI3ZTBjNTdhMmYwID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQamN1T0R3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnUkdGMFpUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQakl3TVRZdE1ETThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0E4YURNK0lFeHZZMkYwYVc5dU9pQThabTl1ZENCamIyeHZjajBpWW14MVpTSStVMjkxZEdoM1pYTjBJRzltSUZOMWJXRjBjbUVzSUVsdVpHOXVaWE5wWVR3dlptOXVkRDQ4TDJnelBnb2dJQ0FnIiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTYwIj48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZGE0N2QwNjQxNzQ1NDY1Njk4YTUwNGIxOTdkNGRkMzkuc2V0Q29udGVudChpX2ZyYW1lXzFlNWY5OWFkYmFkYzQzOGRiMmRmYTI3ZTBjNTdhMmYwKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2NiMjEzYmVmNzNlNTQ3NjRiZTE3YTMzZWZlZTQwN2VjLmJpbmRQb3B1cChwb3B1cF9kYTQ3ZDA2NDE3NDU0NjU2OThhNTA0YjE5N2Q0ZGQzOSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl82NmI1OGRkM2ExODE0MTEzOTY1OTVkNDdkZWIyNDlhMCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzAuMzgxOSwgLTc5LjkyMThdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfY2VmNjlhMDZjOTk0NDUxZmEyYTMxZjk5MmUxZDdkMzIpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2E5ODQ0MTY5M2RjMTQyMmZiOTgyM2E2ODExOTZiMGI1ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV84ZjliYzIwOWU1NzU0Njc2YjFlZjM1NDUxMGZhNWZjZSA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpjdU9Ed3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZ0lDQWdJRHhvTXo0Z1JHRjBaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpJd01UWXRNRFE4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBOGFETStJRXh2WTJGMGFXOXVPaUE4Wm05dWRDQmpiMnh2Y2owaVlteDFaU0krTWpkcmJTQlRVMFVnYjJZZ1RYVnBjMjVsTENCRlkzVmhaRzl5UEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTYwIj48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYTk4NDQxNjkzZGMxNDIyZmI5ODIzYTY4MTE5NmIwYjUuc2V0Q29udGVudChpX2ZyYW1lXzhmOWJjMjA5ZTU3NTQ2NzZiMWVmMzU0NTEwZmE1ZmNlKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzY2YjU4ZGQzYTE4MTQxMTM5NjU5NWQ0N2RlYjI0OWEwLmJpbmRQb3B1cChwb3B1cF9hOTg0NDE2OTNkYzE0MjJmYjk4MjNhNjgxMTk2YjBiNSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9mZDQyNzc0NWUzMWE0YWE3YTdjMjJmYWE5ODI5OTVhYyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy00Mi43MzczLCAxNzMuMDU0XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2NlZjY5YTA2Yzk5NDQ1MWZhMmEzMWY5OTJlMWQ3ZDMyKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8wZDI1ZjJkNjMyOGU0NmMwOTMzMjQwMjhkYjYwODc3MCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfY2RiNWI5ZWY2MTM1NGE3MGIxOGU3YWJkNjA4MjE1NTcgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqY3VPRHd2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqSXdNVFl0TVRFOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQThhRE0rSUV4dlkyRjBhVzl1T2lBOFptOXVkQ0JqYjJ4dmNqMGlZbXgxWlNJK05UUnJiU0JPVGtVZ2IyWWdRVzFpWlhKc1pYa3NJRTVsZHlCYVpXRnNZVzVrUEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTYwIj48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMGQyNWYyZDYzMjhlNDZjMDkzMzI0MDI4ZGI2MDg3NzAuc2V0Q29udGVudChpX2ZyYW1lX2NkYjViOWVmNjEzNTRhNzBiMThlN2FiZDYwODIxNTU3KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2ZkNDI3NzQ1ZTMxYTRhYTdhN2MyMmZhYTk4Mjk5NWFjLmJpbmRQb3B1cChwb3B1cF8wZDI1ZjJkNjMyOGU0NmMwOTMzMjQwMjhkYjYwODc3MCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9jZWU3MDBkMTQwOTE0Njk3ODBjNGVjZWI5YTEyZjZiMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0xMC42ODEyLCAxNjEuMzI3M10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF9jZWY2OWEwNmM5OTQ0NTFmYTJhMzFmOTkyZTFkN2QzMik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMTI3MGRkMjQyOTc3NDNmMGI1YTZkYTdhY2EwN2Y1ODAgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2MyOTM0NTc3ODM5MzQzYTA5MDg1YWRiOTU5ZjU0OWNkID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQamN1T0R3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnUkdGMFpUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQakl3TVRZdE1USThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0E4YURNK0lFeHZZMkYwYVc5dU9pQThabTl1ZENCamIyeHZjajBpWW14MVpTSStOamxyYlNCWFUxY2diMllnUzJseVlXdHBjbUVzSUZOdmJHOXRiMjRnU1hOc1lXNWtjend2Wm05dWRENDhMMmd6UGdvZ0lDQWciIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNjAiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF8xMjcwZGQyNDI5Nzc0M2YwYjVhNmRhN2FjYTA3ZjU4MC5zZXRDb250ZW50KGlfZnJhbWVfYzI5MzQ1Nzc4MzkzNDNhMDkwODVhZGI5NTlmNTQ5Y2QpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfY2VlNzAwZDE0MDkxNDY5NzgwYzRlY2ViOWExMmY2YjEuYmluZFBvcHVwKHBvcHVwXzEyNzBkZDI0Mjk3NzQzZjBiNWE2ZGE3YWNhMDdmNTgwKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzUyN2VhZTk5YjhkNTQxYzBhMWMyZWE2YmQ0OWE0ZWI3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTMuMTgzOTk5OTk5OTk5OTk5NywgMTM5LjcyMl0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF9jZWY2OWEwNmM5OTQ0NTFmYTJhMzFmOTkyZTFkN2QzMik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfOGY2YWNkMDE5YTBiNDVlMmJhNzc3ZDcwYWM3Yzc3MWUgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzVlNjUwYjExZDEwYTQ1MmViNjc1YWQ2MDA0N2I2NGYwID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQamN1Tnp3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnUkdGMFpUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQakU1TnpFdE1ERThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0E4YURNK0lFeHZZMkYwYVc5dU9pQThabTl1ZENCamIyeHZjajBpWW14MVpTSStVR0Z3ZFdFc0lFbHVaRzl1WlhOcFlUd3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZyIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE2MCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzhmNmFjZDAxOWEwYjQ1ZTJiYTc3N2Q3MGFjN2M3NzFlLnNldENvbnRlbnQoaV9mcmFtZV81ZTY1MGIxMWQxMGE0NTJlYjY3NWFkNjAwNDdiNjRmMCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl81MjdlYWU5OWI4ZDU0MWMwYTFjMmVhNmJkNDlhNGViNy5iaW5kUG9wdXAocG9wdXBfOGY2YWNkMDE5YTBiNDVlMmJhNzc3ZDcwYWM3Yzc3MWUpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYWQzMjdhYmFhMTA5NGY2OThhNGY2YzY3OWU0MjQ2NmQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszLjc1MiwgMTI0LjIyMV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF9jZWY2OWEwNmM5OTQ0NTFmYTJhMzFmOTkyZTFkN2QzMik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNWUyZTc3ZTFkZTFiNGM4N2E5MjczZThmOTMxNDYzNTYgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2JmODMxMTNiZjJiMzRjNWFhMjU0NDBlZTdmOTQ1OWQzID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQamN1Tnp3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnUkdGMFpUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQakU1TnpJdE1EWThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0E4YURNK0lFeHZZMkYwYVc5dU9pQThabTl1ZENCamIyeHZjajBpWW14MVpTSStRMlZzWldKbGN5QlRaV0U4TDJadmJuUStQQzlvTXo0S0lDQWdJQT09IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTYwIj48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNWUyZTc3ZTFkZTFiNGM4N2E5MjczZThmOTMxNDYzNTYuc2V0Q29udGVudChpX2ZyYW1lX2JmODMxMTNiZjJiMzRjNWFhMjU0NDBlZTdmOTQ1OWQzKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2FkMzI3YWJhYTEwOTRmNjk4YTRmNmM2NzllNDI0NjZkLmJpbmRQb3B1cChwb3B1cF81ZTJlNzdlMWRlMWI0Yzg3YTkyNzNlOGY5MzE0NjM1NikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9lYzk4ZTU3MWYzN2I0MTViYTg1Yzk3ZWZlMDg3ZDhmZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjIzMzAwMDAwMDAwMDAwNCwgMTQ1Ljc4NV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF9jZWY2OWEwNmM5OTQ0NTFmYTJhMzFmOTkyZTFkN2QzMik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYTkzZWY4ZTY1YjZmNGRmNTg2ZjhkMTgwYTUyYWVjZTcgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzA3M2Q1NDZiNjQxNjQwY2M5ZjVlNDgyMDMzMDczOTU3ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQamN1Tnp3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnUkdGMFpUb2dQR1p2Ym5RZ1kyOXNiM0k5SW1Kc2RXVWlQakU1TnpNdE1EWThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0E4YURNK0lFeHZZMkYwYVc5dU9pQThabTl1ZENCamIyeHZjajBpWW14MVpTSStTRzlyYTJGcFpHOHNJRXBoY0dGdUlISmxaMmx2Ymp3dlptOXVkRDQ4TDJnelBnb2dJQ0FnIiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTYwIj48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYTkzZWY4ZTY1YjZmNGRmNTg2ZjhkMTgwYTUyYWVjZTcuc2V0Q29udGVudChpX2ZyYW1lXzA3M2Q1NDZiNjQxNjQwY2M5ZjVlNDgyMDMzMDczOTU3KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2VjOThlNTcxZjM3YjQxNWJhODVjOTdlZmUwODdkOGZkLmJpbmRQb3B1cChwb3B1cF9hOTNlZjhlNjViNmY0ZGY1ODZmOGQxODBhNTJhZWNlNykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl81ZGUxYjI5MDIwYjc0ZDgzYWYwYjEwMmYyNjM0MzQ2MSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0zOC4xODMsIC03My4yMzJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfY2VmNjlhMDZjOTk0NDUxZmEyYTMxZjk5MmUxZDdkMzIpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzg4YzFmNzY1YmI1MjQ0ZGRhMGQ3MTExZmNjNzJhMmY5ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV8xZDQ5NTMyNTI5N2E0MDY4OTk5MmViYzM2M2E2NmY5MyA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpjdU56d3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZ0lDQWdJRHhvTXo0Z1JHRjBaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpFNU56VXRNRFU4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBOGFETStJRXh2WTJGMGFXOXVPaUE4Wm05dWRDQmpiMnh2Y2owaVlteDFaU0krUW1sdkxVSnBieXdnUTJocGJHVThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lBPT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNjAiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF84OGMxZjc2NWJiNTI0NGRkYTBkNzExMWZjYzcyYTJmOS5zZXRDb250ZW50KGlfZnJhbWVfMWQ0OTUzMjUyOTdhNDA2ODk5OTJlYmMzNjNhNjZmOTMpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNWRlMWIyOTAyMGI3NGQ4M2FmMGIxMDJmMjYzNDM0NjEuYmluZFBvcHVwKHBvcHVwXzg4YzFmNzY1YmI1MjQ0ZGRhMGQ3MTExZmNjNzJhMmY5KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2Q1NjY1NzIzZDZjNjQzYWZiOGI2YTI1ZGNmNzE5YzhiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTcuMTA0LCAxNTUuMTUyMDAwMDAwMDAwMDJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfY2VmNjlhMDZjOTk0NDUxZmEyYTMxZjk5MmUxZDdkMzIpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzk4ZjI2NWZiNmNjODRmNDg4MDI3NTc5ZTkyMTdkZjhkID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV8zNjNlN2ZlMDBiMzM0ZjEwOTJkZGY0ZTY5ZjVkMmIxYiA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpjdU56d3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZ0lDQWdJRHhvTXo0Z1JHRjBaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpFNU56VXRNRGM4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBOGFETStJRXh2WTJGMGFXOXVPaUE4Wm05dWRDQmpiMnh2Y2owaVlteDFaU0krVTI5c2IyMXZiaUJKYzJ4aGJtUnpQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNjAiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF85OGYyNjVmYjZjYzg0ZjQ4ODAyNzU3OWU5MjE3ZGY4ZC5zZXRDb250ZW50KGlfZnJhbWVfMzYzZTdmZTAwYjMzNGYxMDkyZGRmNGU2OWY1ZDJiMWIpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZDU2NjU3MjNkNmM2NDNhZmI4YjZhMjVkY2Y3MTljOGIuYmluZFBvcHVwKHBvcHVwXzk4ZjI2NWZiNmNjODRmNDg4MDI3NTc5ZTkyMTdkZjhkKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzlkYzljMGUyZmMwNzQ1NGQ5ZWZmZjc1NmQ1NDczOGViID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMTkuMzMzLCAtMTU1LjAwMTVdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfY2VmNjlhMDZjOTk0NDUxZmEyYTMxZjk5MmUxZDdkMzIpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2U5NTVlZGRlZDgwNjQ5MmJhMWIzNzE4NTlmMDVjMzFjID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV81ZDQxNGI5NDQ2OGU0ODc2YTE1NDQ1NjQ4YTA5NmM0MiA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpjdU56d3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZ0lDQWdJRHhvTXo0Z1JHRjBaVG9nUEdadmJuUWdZMjlzYjNJOUltSnNkV1VpUGpFNU56VXRNVEU4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBOGFETStJRXh2WTJGMGFXOXVPaUE4Wm05dWRDQmpiMnh2Y2owaVlteDFaU0krUzJGc1lYQmhibUVnUldGeWRHaHhkV0ZyWlR3dlptOXVkRDQ4TDJnelBnb2dJQ0FnIiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTYwIj48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZTk1NWVkZGVkODA2NDkyYmExYjM3MTg1OWYwNWMzMWMuc2V0Q29udGVudChpX2ZyYW1lXzVkNDE0Yjk0NDY4ZTQ4NzZhMTU0NDU2NDhhMDk2YzQyKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzlkYzljMGUyZmMwNzQ1NGQ5ZWZmZjc1NmQ1NDczOGViLmJpbmRQb3B1cChwb3B1cF9lOTU1ZWRkZWQ4MDY0OTJiYTFiMzcxODU5ZjA1YzMxYykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8wN2NhNGQ5M2RjMDc0ZWRlYTUzOGVhODUwOTRjOTE1NCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM4LjE5LCAxNDIuMDI4XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2NlZjY5YTA2Yzk5NDQ1MWZhMmEzMWY5OTJlMWQ3ZDMyKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9lODllMTRjMWU4YzM0MzNiOWU3MDIzNGE3ZGY3NjcwNiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfM2MzMjhiNTRhY2NiNDllZDk1NzE4NmNjMjNhODQ1NGUgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqY3VOend2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqRTVOemd0TURZOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQThhRE0rSUV4dlkyRjBhVzl1T2lBOFptOXVkQ0JqYjJ4dmNqMGlZbXgxWlNJK2JtVmhjaUIwYUdVZ1pXRnpkQ0JqYjJGemRDQnZaaUJJYjI1emFIVXNJRXBoY0dGdVBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE2MCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2U4OWUxNGMxZThjMzQzM2I5ZTcwMjM0YTdkZjc2NzA2LnNldENvbnRlbnQoaV9mcmFtZV8zYzMyOGI1NGFjY2I0OWVkOTU3MTg2Y2MyM2E4NDU0ZSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8wN2NhNGQ5M2RjMDc0ZWRlYTUzOGVhODUwOTRjOTE1NC5iaW5kUG9wdXAocG9wdXBfZTg5ZTE0YzFlOGMzNDMzYjllNzAyMzRhN2RmNzY3MDYpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYmNiNzM0MTQ4OTU0NDJiYzgzNTM2MTZkZWRhNDRiMTEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFsxNi4wMSwgLTk2LjU5MTAwMDAwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2NlZjY5YTA2Yzk5NDQ1MWZhMmEzMWY5OTJlMWQ3ZDMyKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9mMzI5MzlmNzUyYzI0Y2M3OGQ5ZmVhZGNhYTAzNWM2YyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfOTZhYjJlMDBjZjY0NGVhZWI5NTI5OGU0ZWVkYmNmZDYgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqY3VOend2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbUpzZFdVaVBqRTVOemd0TVRFOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQThhRE0rSUV4dlkyRjBhVzl1T2lBOFptOXVkQ0JqYjJ4dmNqMGlZbXgxWlNJK1QyRjRZV05oTENCTlpYaHBZMjg4TDJadmJuUStQQzlvTXo0S0lDQWdJQT09IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTYwIj48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZjMyOTM5Zjc1MmMyNGNjNzhkOWZlYWRjYWEwMzVjNmMuc2V0Q29udGVudChpX2ZyYW1lXzk2YWIyZTAwY2Y2NDRlYWViOTUyOThlNGVlZGJjZmQ2KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2JjYjczNDE0ODk1NDQyYmM4MzUzNjE2ZGVkYTQ0YjExLmJpbmRQb3B1cChwb3B1cF9mMzI5MzlmNzUyYzI0Y2M3OGQ5ZmVhZGNhYTAzNWM2YykKICAgICAgICA7CgogICAgICAgIAogICAgCjwvc2NyaXB0Pg==\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x114b86f60>"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"map_EQ_with_popups"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [],
"source": [
"!mkdir -p map-output-files\n",
"\n",
"#Now save the HTML file\n",
"map_EQ_with_popups.save('map-output-files/earthquakes.html')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# In this query i look into the nuclear explosions."
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>earthquake_id</th>\n",
" <th>occurred_on</th>\n",
" <th>latitude</th>\n",
" <th>longitude</th>\n",
" <th>depth</th>\n",
" <th>magnitude</th>\n",
" <th>calculation_method</th>\n",
" <th>network_id</th>\n",
" <th>place</th>\n",
" <th>cause</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1767</td>\n",
" <td>1973-10-27 6:59:57</td>\n",
" <td>70.779000</td>\n",
" <td>54.177000</td>\n",
" <td>0.0</td>\n",
" <td>6.90</td>\n",
" <td>mb</td>\n",
" <td>usp00003ya</td>\n",
" <td>Novaya Zemlya, Russia</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1728</td>\n",
" <td>1973-09-12 6:59:54</td>\n",
" <td>73.302000</td>\n",
" <td>55.161000</td>\n",
" <td>0.0</td>\n",
" <td>6.80</td>\n",
" <td>mb</td>\n",
" <td>usp00003dp</td>\n",
" <td>Novaya Zemlya, Russia</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2156</td>\n",
" <td>1974-11-02 4:59:57</td>\n",
" <td>70.817000</td>\n",
" <td>54.063000</td>\n",
" <td>0.0</td>\n",
" <td>6.70</td>\n",
" <td>mb</td>\n",
" <td>usp00008n6</td>\n",
" <td>Novaya Zemlya, Russia</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>2529</td>\n",
" <td>1975-10-18 8:59:56</td>\n",
" <td>70.843000</td>\n",
" <td>53.690000</td>\n",
" <td>0.0</td>\n",
" <td>6.70</td>\n",
" <td>mb</td>\n",
" <td>usp0000d69</td>\n",
" <td>Novaya Zemlya, Russia</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2531</td>\n",
" <td>1975-10-21 11:59:57</td>\n",
" <td>73.351000</td>\n",
" <td>55.078000</td>\n",
" <td>0.0</td>\n",
" <td>6.50</td>\n",
" <td>mb</td>\n",
" <td>usp0000d7g</td>\n",
" <td>Novaya Zemlya, Russia</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>9743</td>\n",
" <td>1992-05-21 4:59:58</td>\n",
" <td>41.604000</td>\n",
" <td>88.813000</td>\n",
" <td>0.0</td>\n",
" <td>6.50</td>\n",
" <td>mb</td>\n",
" <td>usp00057t0</td>\n",
" <td>southern Xinjiang, China</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>2088</td>\n",
" <td>1974-08-29 9:59:56</td>\n",
" <td>73.366000</td>\n",
" <td>55.094000</td>\n",
" <td>0.0</td>\n",
" <td>6.40</td>\n",
" <td>mb</td>\n",
" <td>usp00007ug</td>\n",
" <td>Novaya Zemlya, Russia</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>2461</td>\n",
" <td>1975-08-23 8:59:58</td>\n",
" <td>73.369000</td>\n",
" <td>54.641000</td>\n",
" <td>0.0</td>\n",
" <td>6.40</td>\n",
" <td>mb</td>\n",
" <td>usp0000cjx</td>\n",
" <td>Novaya Zemlya, Russia</td>\n",
" <td>explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>1666</td>\n",
" <td>1973-07-23 1:22:58</td>\n",
" <td>49.986000</td>\n",
" <td>78.853000</td>\n",
" <td>0.0</td>\n",
" <td>6.30</td>\n",
" <td>mb</td>\n",
" <td>usp00002tp</td>\n",
" <td>eastern Kazakhstan</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>4063</td>\n",
" <td>1979-06-23 2:56:58</td>\n",
" <td>49.918000</td>\n",
" <td>78.915000</td>\n",
" <td>0.0</td>\n",
" <td>6.30</td>\n",
" <td>mb</td>\n",
" <td>usp00011g5</td>\n",
" <td>eastern Kazakhstan</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>22483</td>\n",
" <td>2017-09-03 3:30:02</td>\n",
" <td>41.332400</td>\n",
" <td>129.029700</td>\n",
" <td>0.0</td>\n",
" <td>6.30</td>\n",
" <td>mb</td>\n",
" <td>us2000aert</td>\n",
" <td>21km ENE of Sungjibaegam, North Korea</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>4497</td>\n",
" <td>1980-09-14 2:42:39</td>\n",
" <td>49.976000</td>\n",
" <td>78.889000</td>\n",
" <td>0.0</td>\n",
" <td>6.20</td>\n",
" <td>mb</td>\n",
" <td>usp00019td</td>\n",
" <td>eastern Kazakhstan</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>4921</td>\n",
" <td>1981-12-27 3:43:14</td>\n",
" <td>49.909000</td>\n",
" <td>78.873000</td>\n",
" <td>0.0</td>\n",
" <td>6.20</td>\n",
" <td>mb</td>\n",
" <td>usp0001hpj</td>\n",
" <td>eastern Kazakhstan</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>5962</td>\n",
" <td>1984-07-14 1:09:11</td>\n",
" <td>49.891000</td>\n",
" <td>78.963000</td>\n",
" <td>0.0</td>\n",
" <td>6.20</td>\n",
" <td>mb</td>\n",
" <td>usp00025qv</td>\n",
" <td>eastern Kazakhstan</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>6096</td>\n",
" <td>1984-10-27 1:50:11</td>\n",
" <td>49.949000</td>\n",
" <td>78.834000</td>\n",
" <td>0.0</td>\n",
" <td>6.20</td>\n",
" <td>mb</td>\n",
" <td>usp00028j4</td>\n",
" <td>eastern Kazakhstan</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>7302</td>\n",
" <td>1987-04-03 1:17:08</td>\n",
" <td>49.928000</td>\n",
" <td>78.829000</td>\n",
" <td>0.0</td>\n",
" <td>6.20</td>\n",
" <td>mb</td>\n",
" <td>usp00033vd</td>\n",
" <td>eastern Kazakhstan</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>7376</td>\n",
" <td>1987-06-05 4:59:58</td>\n",
" <td>41.584000</td>\n",
" <td>88.737000</td>\n",
" <td>0.0</td>\n",
" <td>6.20</td>\n",
" <td>mb</td>\n",
" <td>usp00035hr</td>\n",
" <td>southern Xinjiang, China</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>8964</td>\n",
" <td>1990-08-16 4:59:58</td>\n",
" <td>41.564000</td>\n",
" <td>88.770000</td>\n",
" <td>0.0</td>\n",
" <td>6.20</td>\n",
" <td>mb</td>\n",
" <td>usp0004dfg</td>\n",
" <td>southern Xinjiang, China</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>4099</td>\n",
" <td>1979-08-04 3:56:57</td>\n",
" <td>49.901000</td>\n",
" <td>78.959000</td>\n",
" <td>0.0</td>\n",
" <td>6.10</td>\n",
" <td>mb</td>\n",
" <td>usp000127h</td>\n",
" <td>eastern Kazakhstan</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>4113</td>\n",
" <td>1979-08-18 2:51:57</td>\n",
" <td>49.971000</td>\n",
" <td>79.010000</td>\n",
" <td>0.0</td>\n",
" <td>6.10</td>\n",
" <td>mb</td>\n",
" <td>usp00012ge</td>\n",
" <td>eastern Kazakhstan</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <td>4251</td>\n",
" <td>1979-12-23 4:56:58</td>\n",
" <td>49.964000</td>\n",
" <td>78.827000</td>\n",
" <td>0.0</td>\n",
" <td>6.10</td>\n",
" <td>mb</td>\n",
" <td>usp00014nn</td>\n",
" <td>eastern Kazakhstan</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <td>5036</td>\n",
" <td>1982-04-25 3:23:05</td>\n",
" <td>49.889000</td>\n",
" <td>78.931000</td>\n",
" <td>0.0</td>\n",
" <td>6.10</td>\n",
" <td>mb</td>\n",
" <td>usp0001kx8</td>\n",
" <td>eastern Kazakhstan</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22</th>\n",
" <td>5089</td>\n",
" <td>1982-07-04 1:17:14</td>\n",
" <td>49.995000</td>\n",
" <td>78.856000</td>\n",
" <td>0.0</td>\n",
" <td>6.10</td>\n",
" <td>mb</td>\n",
" <td>usp0001n8v</td>\n",
" <td>eastern Kazakhstan</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>23</th>\n",
" <td>5220</td>\n",
" <td>1982-12-05 3:37:13</td>\n",
" <td>49.928000</td>\n",
" <td>78.869000</td>\n",
" <td>0.0</td>\n",
" <td>6.10</td>\n",
" <td>mb</td>\n",
" <td>usp0001r99</td>\n",
" <td>eastern Kazakhstan</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>5469</td>\n",
" <td>1983-06-12 2:36:44</td>\n",
" <td>49.906000</td>\n",
" <td>78.981000</td>\n",
" <td>0.0</td>\n",
" <td>6.10</td>\n",
" <td>mb</td>\n",
" <td>usp0001w19</td>\n",
" <td>eastern Kazakhstan</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25</th>\n",
" <td>5628</td>\n",
" <td>1983-10-26 1:55:05</td>\n",
" <td>49.921000</td>\n",
" <td>78.907000</td>\n",
" <td>0.0</td>\n",
" <td>6.10</td>\n",
" <td>mb</td>\n",
" <td>usp0001z9k</td>\n",
" <td>eastern Kazakhstan</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <td>6173</td>\n",
" <td>1984-12-16 3:55:03</td>\n",
" <td>49.957000</td>\n",
" <td>78.862000</td>\n",
" <td>0.0</td>\n",
" <td>6.10</td>\n",
" <td>mb</td>\n",
" <td>usp0002a3e</td>\n",
" <td>eastern Kazakhstan</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>27</th>\n",
" <td>7407</td>\n",
" <td>1987-06-20 0:53:05</td>\n",
" <td>49.913000</td>\n",
" <td>78.735000</td>\n",
" <td>0.0</td>\n",
" <td>6.10</td>\n",
" <td>mb</td>\n",
" <td>usp00035xc</td>\n",
" <td>eastern Kazakhstan</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28</th>\n",
" <td>7637</td>\n",
" <td>1987-12-13 3:21:05</td>\n",
" <td>49.989000</td>\n",
" <td>78.844000</td>\n",
" <td>0.0</td>\n",
" <td>6.10</td>\n",
" <td>mb</td>\n",
" <td>usp0003b88</td>\n",
" <td>eastern Kazakhstan</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29</th>\n",
" <td>7650</td>\n",
" <td>1987-12-27 3:05:05</td>\n",
" <td>49.864000</td>\n",
" <td>78.758000</td>\n",
" <td>0.0</td>\n",
" <td>6.10</td>\n",
" <td>mb</td>\n",
" <td>usp0003bkh</td>\n",
" <td>eastern Kazakhstan</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>147</th>\n",
" <td>7365</td>\n",
" <td>1987-05-20 17:04:58</td>\n",
" <td>-21.893000</td>\n",
" <td>-138.964000</td>\n",
" <td>0.0</td>\n",
" <td>5.60</td>\n",
" <td>mb</td>\n",
" <td>usp000354z</td>\n",
" <td>Tuamotu Archipelago, French Polynesia region</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>148</th>\n",
" <td>7844</td>\n",
" <td>1988-05-07 22:49:58</td>\n",
" <td>73.364000</td>\n",
" <td>54.445000</td>\n",
" <td>0.0</td>\n",
" <td>5.60</td>\n",
" <td>mb</td>\n",
" <td>usp0003frv</td>\n",
" <td>Novaya Zemlya, Russia</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>149</th>\n",
" <td>7867</td>\n",
" <td>1988-05-25 17:00:58</td>\n",
" <td>-21.903000</td>\n",
" <td>-139.009000</td>\n",
" <td>0.0</td>\n",
" <td>5.60</td>\n",
" <td>mb</td>\n",
" <td>usp0003gcs</td>\n",
" <td>Tuamotu Archipelago, French Polynesia region</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>150</th>\n",
" <td>8309</td>\n",
" <td>1989-05-11 16:44:58</td>\n",
" <td>-21.853000</td>\n",
" <td>-139.006000</td>\n",
" <td>0.0</td>\n",
" <td>5.60</td>\n",
" <td>mb</td>\n",
" <td>usp0003v5a</td>\n",
" <td>Tuamotu Archipelago, French Polynesia region</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>151</th>\n",
" <td>8388</td>\n",
" <td>1989-07-08 3:46:58</td>\n",
" <td>49.888000</td>\n",
" <td>78.802000</td>\n",
" <td>0.0</td>\n",
" <td>5.60</td>\n",
" <td>mb</td>\n",
" <td>usp0003x3f</td>\n",
" <td>eastern Kazakhstan</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>152</th>\n",
" <td>8570</td>\n",
" <td>1989-11-27 16:59:58</td>\n",
" <td>-22.276000</td>\n",
" <td>-138.836000</td>\n",
" <td>0.0</td>\n",
" <td>5.60</td>\n",
" <td>mb</td>\n",
" <td>usp00042gb</td>\n",
" <td>Tuamotu Archipelago, French Polynesia region</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>153</th>\n",
" <td>400</td>\n",
" <td>1970-03-26 19:00:01</td>\n",
" <td>37.300500</td>\n",
" <td>-116.534167</td>\n",
" <td>1.2</td>\n",
" <td>5.54</td>\n",
" <td>ml</td>\n",
" <td>ci3325031</td>\n",
" <td>48km NNE of Beatty, NV</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>154</th>\n",
" <td>2385</td>\n",
" <td>1975-06-26 12:30:01</td>\n",
" <td>37.278833</td>\n",
" <td>-116.368667</td>\n",
" <td>6.0</td>\n",
" <td>5.52</td>\n",
" <td>ml</td>\n",
" <td>ci12328563</td>\n",
" <td>54km NE of Beatty, NV</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>155</th>\n",
" <td>2733</td>\n",
" <td>1976-03-17 14:15:01</td>\n",
" <td>37.255833</td>\n",
" <td>-116.311833</td>\n",
" <td>0.9</td>\n",
" <td>5.52</td>\n",
" <td>ml</td>\n",
" <td>ci3002390</td>\n",
" <td>55km NE of Beatty, NV</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>156</th>\n",
" <td>2075</td>\n",
" <td>1974-08-14 14:59:58</td>\n",
" <td>68.913000</td>\n",
" <td>75.899000</td>\n",
" <td>0.0</td>\n",
" <td>5.50</td>\n",
" <td>mb</td>\n",
" <td>usp00007mb</td>\n",
" <td>northwestern Siberia, Russia</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>157</th>\n",
" <td>2139</td>\n",
" <td>1974-10-16 6:32:58</td>\n",
" <td>49.972000</td>\n",
" <td>78.968000</td>\n",
" <td>0.0</td>\n",
" <td>5.50</td>\n",
" <td>mb</td>\n",
" <td>usp00008ec</td>\n",
" <td>eastern Kazakhstan</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>158</th>\n",
" <td>2358</td>\n",
" <td>1975-06-08 3:26:58</td>\n",
" <td>49.764000</td>\n",
" <td>78.089000</td>\n",
" <td>0.0</td>\n",
" <td>5.50</td>\n",
" <td>mb</td>\n",
" <td>usp0000bcb</td>\n",
" <td>eastern Kazakhstan</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>159</th>\n",
" <td>3411</td>\n",
" <td>1977-10-29 3:06:58</td>\n",
" <td>49.841000</td>\n",
" <td>78.174000</td>\n",
" <td>0.0</td>\n",
" <td>5.50</td>\n",
" <td>mb</td>\n",
" <td>usp0000r98</td>\n",
" <td>eastern Kazakhstan</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>160</th>\n",
" <td>3622</td>\n",
" <td>1978-03-26 3:56:58</td>\n",
" <td>49.734000</td>\n",
" <td>78.074000</td>\n",
" <td>0.0</td>\n",
" <td>5.50</td>\n",
" <td>mb</td>\n",
" <td>usp0000tqx</td>\n",
" <td>eastern Kazakhstan</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>161</th>\n",
" <td>3837</td>\n",
" <td>1978-10-17 13:59:58</td>\n",
" <td>63.143000</td>\n",
" <td>63.392000</td>\n",
" <td>0.0</td>\n",
" <td>5.50</td>\n",
" <td>mb</td>\n",
" <td>usp0000x1a</td>\n",
" <td>Ural Mountains region, Russia</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>162</th>\n",
" <td>4369</td>\n",
" <td>1980-04-25 3:56:57</td>\n",
" <td>49.947000</td>\n",
" <td>78.799000</td>\n",
" <td>0.0</td>\n",
" <td>5.50</td>\n",
" <td>mb</td>\n",
" <td>usp00016vg</td>\n",
" <td>eastern Kazakhstan</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>163</th>\n",
" <td>4389</td>\n",
" <td>1980-05-22 3:56:58</td>\n",
" <td>49.729000</td>\n",
" <td>78.100000</td>\n",
" <td>0.0</td>\n",
" <td>5.50</td>\n",
" <td>mb</td>\n",
" <td>usp00017cc</td>\n",
" <td>eastern Kazakhstan</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>164</th>\n",
" <td>4420</td>\n",
" <td>1980-06-16 18:26:58</td>\n",
" <td>-22.023000</td>\n",
" <td>-138.873000</td>\n",
" <td>0.0</td>\n",
" <td>5.50</td>\n",
" <td>mb</td>\n",
" <td>usp0001898</td>\n",
" <td>Tuamotu Archipelago, French Polynesia region</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>165</th>\n",
" <td>4740</td>\n",
" <td>1981-05-25 4:59:57</td>\n",
" <td>68.205000</td>\n",
" <td>53.656000</td>\n",
" <td>0.0</td>\n",
" <td>5.50</td>\n",
" <td>mb</td>\n",
" <td>usp0001dv0</td>\n",
" <td>northwestern Russia</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>166</th>\n",
" <td>5602</td>\n",
" <td>1983-10-06 10:00:03</td>\n",
" <td>41.566000</td>\n",
" <td>88.766000</td>\n",
" <td>33.0</td>\n",
" <td>5.50</td>\n",
" <td>mb</td>\n",
" <td>usp0001yu6</td>\n",
" <td>southern Xinjiang, China</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>167</th>\n",
" <td>5655</td>\n",
" <td>1983-11-20 3:27:04</td>\n",
" <td>50.066000</td>\n",
" <td>79.036000</td>\n",
" <td>0.0</td>\n",
" <td>5.50</td>\n",
" <td>mb</td>\n",
" <td>usp0001zy6</td>\n",
" <td>eastern Kazakhstan</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>168</th>\n",
" <td>5710</td>\n",
" <td>1983-12-26 4:29:07</td>\n",
" <td>49.838000</td>\n",
" <td>78.218000</td>\n",
" <td>0.0</td>\n",
" <td>5.50</td>\n",
" <td>mb</td>\n",
" <td>usp00020tm</td>\n",
" <td>eastern Kazakhstan</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>169</th>\n",
" <td>7264</td>\n",
" <td>1987-03-12 1:57:17</td>\n",
" <td>49.939000</td>\n",
" <td>78.823000</td>\n",
" <td>0.0</td>\n",
" <td>5.50</td>\n",
" <td>mb</td>\n",
" <td>usp000337f</td>\n",
" <td>eastern Kazakhstan</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>170</th>\n",
" <td>7567</td>\n",
" <td>1987-10-23 16:49:59</td>\n",
" <td>-21.822000</td>\n",
" <td>-139.029000</td>\n",
" <td>0.0</td>\n",
" <td>5.50</td>\n",
" <td>mb</td>\n",
" <td>usp00039hn</td>\n",
" <td>Tuamotu Archipelago, French Polynesia region</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>171</th>\n",
" <td>7846</td>\n",
" <td>1988-05-11 16:59:58</td>\n",
" <td>-21.867000</td>\n",
" <td>-139.072000</td>\n",
" <td>0.0</td>\n",
" <td>5.50</td>\n",
" <td>mb</td>\n",
" <td>usp0003fvp</td>\n",
" <td>Tuamotu Archipelago, French Polynesia region</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>172</th>\n",
" <td>8109</td>\n",
" <td>1988-11-30 17:54:58</td>\n",
" <td>-22.244000</td>\n",
" <td>-138.836000</td>\n",
" <td>0.0</td>\n",
" <td>5.50</td>\n",
" <td>mb</td>\n",
" <td>usp0003pd7</td>\n",
" <td>Tuamotu Archipelago, French Polynesia region</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>173</th>\n",
" <td>8356</td>\n",
" <td>1989-06-10 17:29:58</td>\n",
" <td>-22.252000</td>\n",
" <td>-138.734000</td>\n",
" <td>0.0</td>\n",
" <td>5.50</td>\n",
" <td>mb</td>\n",
" <td>usp0003w5c</td>\n",
" <td>Tuamotu Archipelago, French Polynesia region</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>174</th>\n",
" <td>8889</td>\n",
" <td>1990-06-26 17:59:58</td>\n",
" <td>-22.215000</td>\n",
" <td>-138.841000</td>\n",
" <td>0.0</td>\n",
" <td>5.50</td>\n",
" <td>mb</td>\n",
" <td>usp0004b1a</td>\n",
" <td>Tuamotu Archipelago, French Polynesia region</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>175</th>\n",
" <td>9072</td>\n",
" <td>1990-11-14 18:11:58</td>\n",
" <td>-22.258000</td>\n",
" <td>-138.805000</td>\n",
" <td>0.0</td>\n",
" <td>5.50</td>\n",
" <td>mb</td>\n",
" <td>usp0004gxs</td>\n",
" <td>Tuamotu Archipelago, French Polynesia region</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" <tr>\n",
" <th>176</th>\n",
" <td>9325</td>\n",
" <td>1991-05-29 18:59:58</td>\n",
" <td>-22.256000</td>\n",
" <td>-138.794000</td>\n",
" <td>0.0</td>\n",
" <td>5.50</td>\n",
" <td>mb</td>\n",
" <td>usp0004s8a</td>\n",
" <td>Tuamotu Archipelago, French Polynesia region</td>\n",
" <td>nuclear explosion</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>177 rows × 10 columns</p>\n",
"</div>"
],
"text/plain": [
" earthquake_id occurred_on latitude longitude depth \\\n",
"0 1767 1973-10-27 6:59:57 70.779000 54.177000 0.0 \n",
"1 1728 1973-09-12 6:59:54 73.302000 55.161000 0.0 \n",
"2 2156 1974-11-02 4:59:57 70.817000 54.063000 0.0 \n",
"3 2529 1975-10-18 8:59:56 70.843000 53.690000 0.0 \n",
"4 2531 1975-10-21 11:59:57 73.351000 55.078000 0.0 \n",
"5 9743 1992-05-21 4:59:58 41.604000 88.813000 0.0 \n",
"6 2088 1974-08-29 9:59:56 73.366000 55.094000 0.0 \n",
"7 2461 1975-08-23 8:59:58 73.369000 54.641000 0.0 \n",
"8 1666 1973-07-23 1:22:58 49.986000 78.853000 0.0 \n",
"9 4063 1979-06-23 2:56:58 49.918000 78.915000 0.0 \n",
"10 22483 2017-09-03 3:30:02 41.332400 129.029700 0.0 \n",
"11 4497 1980-09-14 2:42:39 49.976000 78.889000 0.0 \n",
"12 4921 1981-12-27 3:43:14 49.909000 78.873000 0.0 \n",
"13 5962 1984-07-14 1:09:11 49.891000 78.963000 0.0 \n",
"14 6096 1984-10-27 1:50:11 49.949000 78.834000 0.0 \n",
"15 7302 1987-04-03 1:17:08 49.928000 78.829000 0.0 \n",
"16 7376 1987-06-05 4:59:58 41.584000 88.737000 0.0 \n",
"17 8964 1990-08-16 4:59:58 41.564000 88.770000 0.0 \n",
"18 4099 1979-08-04 3:56:57 49.901000 78.959000 0.0 \n",
"19 4113 1979-08-18 2:51:57 49.971000 79.010000 0.0 \n",
"20 4251 1979-12-23 4:56:58 49.964000 78.827000 0.0 \n",
"21 5036 1982-04-25 3:23:05 49.889000 78.931000 0.0 \n",
"22 5089 1982-07-04 1:17:14 49.995000 78.856000 0.0 \n",
"23 5220 1982-12-05 3:37:13 49.928000 78.869000 0.0 \n",
"24 5469 1983-06-12 2:36:44 49.906000 78.981000 0.0 \n",
"25 5628 1983-10-26 1:55:05 49.921000 78.907000 0.0 \n",
"26 6173 1984-12-16 3:55:03 49.957000 78.862000 0.0 \n",
"27 7407 1987-06-20 0:53:05 49.913000 78.735000 0.0 \n",
"28 7637 1987-12-13 3:21:05 49.989000 78.844000 0.0 \n",
"29 7650 1987-12-27 3:05:05 49.864000 78.758000 0.0 \n",
".. ... ... ... ... ... \n",
"147 7365 1987-05-20 17:04:58 -21.893000 -138.964000 0.0 \n",
"148 7844 1988-05-07 22:49:58 73.364000 54.445000 0.0 \n",
"149 7867 1988-05-25 17:00:58 -21.903000 -139.009000 0.0 \n",
"150 8309 1989-05-11 16:44:58 -21.853000 -139.006000 0.0 \n",
"151 8388 1989-07-08 3:46:58 49.888000 78.802000 0.0 \n",
"152 8570 1989-11-27 16:59:58 -22.276000 -138.836000 0.0 \n",
"153 400 1970-03-26 19:00:01 37.300500 -116.534167 1.2 \n",
"154 2385 1975-06-26 12:30:01 37.278833 -116.368667 6.0 \n",
"155 2733 1976-03-17 14:15:01 37.255833 -116.311833 0.9 \n",
"156 2075 1974-08-14 14:59:58 68.913000 75.899000 0.0 \n",
"157 2139 1974-10-16 6:32:58 49.972000 78.968000 0.0 \n",
"158 2358 1975-06-08 3:26:58 49.764000 78.089000 0.0 \n",
"159 3411 1977-10-29 3:06:58 49.841000 78.174000 0.0 \n",
"160 3622 1978-03-26 3:56:58 49.734000 78.074000 0.0 \n",
"161 3837 1978-10-17 13:59:58 63.143000 63.392000 0.0 \n",
"162 4369 1980-04-25 3:56:57 49.947000 78.799000 0.0 \n",
"163 4389 1980-05-22 3:56:58 49.729000 78.100000 0.0 \n",
"164 4420 1980-06-16 18:26:58 -22.023000 -138.873000 0.0 \n",
"165 4740 1981-05-25 4:59:57 68.205000 53.656000 0.0 \n",
"166 5602 1983-10-06 10:00:03 41.566000 88.766000 33.0 \n",
"167 5655 1983-11-20 3:27:04 50.066000 79.036000 0.0 \n",
"168 5710 1983-12-26 4:29:07 49.838000 78.218000 0.0 \n",
"169 7264 1987-03-12 1:57:17 49.939000 78.823000 0.0 \n",
"170 7567 1987-10-23 16:49:59 -21.822000 -139.029000 0.0 \n",
"171 7846 1988-05-11 16:59:58 -21.867000 -139.072000 0.0 \n",
"172 8109 1988-11-30 17:54:58 -22.244000 -138.836000 0.0 \n",
"173 8356 1989-06-10 17:29:58 -22.252000 -138.734000 0.0 \n",
"174 8889 1990-06-26 17:59:58 -22.215000 -138.841000 0.0 \n",
"175 9072 1990-11-14 18:11:58 -22.258000 -138.805000 0.0 \n",
"176 9325 1991-05-29 18:59:58 -22.256000 -138.794000 0.0 \n",
"\n",
" magnitude calculation_method network_id \\\n",
"0 6.90 mb usp00003ya \n",
"1 6.80 mb usp00003dp \n",
"2 6.70 mb usp00008n6 \n",
"3 6.70 mb usp0000d69 \n",
"4 6.50 mb usp0000d7g \n",
"5 6.50 mb usp00057t0 \n",
"6 6.40 mb usp00007ug \n",
"7 6.40 mb usp0000cjx \n",
"8 6.30 mb usp00002tp \n",
"9 6.30 mb usp00011g5 \n",
"10 6.30 mb us2000aert \n",
"11 6.20 mb usp00019td \n",
"12 6.20 mb usp0001hpj \n",
"13 6.20 mb usp00025qv \n",
"14 6.20 mb usp00028j4 \n",
"15 6.20 mb usp00033vd \n",
"16 6.20 mb usp00035hr \n",
"17 6.20 mb usp0004dfg \n",
"18 6.10 mb usp000127h \n",
"19 6.10 mb usp00012ge \n",
"20 6.10 mb usp00014nn \n",
"21 6.10 mb usp0001kx8 \n",
"22 6.10 mb usp0001n8v \n",
"23 6.10 mb usp0001r99 \n",
"24 6.10 mb usp0001w19 \n",
"25 6.10 mb usp0001z9k \n",
"26 6.10 mb usp0002a3e \n",
"27 6.10 mb usp00035xc \n",
"28 6.10 mb usp0003b88 \n",
"29 6.10 mb usp0003bkh \n",
".. ... ... ... \n",
"147 5.60 mb usp000354z \n",
"148 5.60 mb usp0003frv \n",
"149 5.60 mb usp0003gcs \n",
"150 5.60 mb usp0003v5a \n",
"151 5.60 mb usp0003x3f \n",
"152 5.60 mb usp00042gb \n",
"153 5.54 ml ci3325031 \n",
"154 5.52 ml ci12328563 \n",
"155 5.52 ml ci3002390 \n",
"156 5.50 mb usp00007mb \n",
"157 5.50 mb usp00008ec \n",
"158 5.50 mb usp0000bcb \n",
"159 5.50 mb usp0000r98 \n",
"160 5.50 mb usp0000tqx \n",
"161 5.50 mb usp0000x1a \n",
"162 5.50 mb usp00016vg \n",
"163 5.50 mb usp00017cc \n",
"164 5.50 mb usp0001898 \n",
"165 5.50 mb usp0001dv0 \n",
"166 5.50 mb usp0001yu6 \n",
"167 5.50 mb usp0001zy6 \n",
"168 5.50 mb usp00020tm \n",
"169 5.50 mb usp000337f \n",
"170 5.50 mb usp00039hn \n",
"171 5.50 mb usp0003fvp \n",
"172 5.50 mb usp0003pd7 \n",
"173 5.50 mb usp0003w5c \n",
"174 5.50 mb usp0004b1a \n",
"175 5.50 mb usp0004gxs \n",
"176 5.50 mb usp0004s8a \n",
"\n",
" place cause \n",
"0 Novaya Zemlya, Russia nuclear explosion \n",
"1 Novaya Zemlya, Russia nuclear explosion \n",
"2 Novaya Zemlya, Russia nuclear explosion \n",
"3 Novaya Zemlya, Russia nuclear explosion \n",
"4 Novaya Zemlya, Russia nuclear explosion \n",
"5 southern Xinjiang, China nuclear explosion \n",
"6 Novaya Zemlya, Russia nuclear explosion \n",
"7 Novaya Zemlya, Russia explosion \n",
"8 eastern Kazakhstan nuclear explosion \n",
"9 eastern Kazakhstan nuclear explosion \n",
"10 21km ENE of Sungjibaegam, North Korea nuclear explosion \n",
"11 eastern Kazakhstan nuclear explosion \n",
"12 eastern Kazakhstan nuclear explosion \n",
"13 eastern Kazakhstan nuclear explosion \n",
"14 eastern Kazakhstan nuclear explosion \n",
"15 eastern Kazakhstan nuclear explosion \n",
"16 southern Xinjiang, China nuclear explosion \n",
"17 southern Xinjiang, China nuclear explosion \n",
"18 eastern Kazakhstan nuclear explosion \n",
"19 eastern Kazakhstan nuclear explosion \n",
"20 eastern Kazakhstan nuclear explosion \n",
"21 eastern Kazakhstan nuclear explosion \n",
"22 eastern Kazakhstan nuclear explosion \n",
"23 eastern Kazakhstan nuclear explosion \n",
"24 eastern Kazakhstan nuclear explosion \n",
"25 eastern Kazakhstan nuclear explosion \n",
"26 eastern Kazakhstan nuclear explosion \n",
"27 eastern Kazakhstan nuclear explosion \n",
"28 eastern Kazakhstan nuclear explosion \n",
"29 eastern Kazakhstan nuclear explosion \n",
".. ... ... \n",
"147 Tuamotu Archipelago, French Polynesia region nuclear explosion \n",
"148 Novaya Zemlya, Russia nuclear explosion \n",
"149 Tuamotu Archipelago, French Polynesia region nuclear explosion \n",
"150 Tuamotu Archipelago, French Polynesia region nuclear explosion \n",
"151 eastern Kazakhstan nuclear explosion \n",
"152 Tuamotu Archipelago, French Polynesia region nuclear explosion \n",
"153 48km NNE of Beatty, NV nuclear explosion \n",
"154 54km NE of Beatty, NV nuclear explosion \n",
"155 55km NE of Beatty, NV nuclear explosion \n",
"156 northwestern Siberia, Russia nuclear explosion \n",
"157 eastern Kazakhstan nuclear explosion \n",
"158 eastern Kazakhstan nuclear explosion \n",
"159 eastern Kazakhstan nuclear explosion \n",
"160 eastern Kazakhstan nuclear explosion \n",
"161 Ural Mountains region, Russia nuclear explosion \n",
"162 eastern Kazakhstan nuclear explosion \n",
"163 eastern Kazakhstan nuclear explosion \n",
"164 Tuamotu Archipelago, French Polynesia region nuclear explosion \n",
"165 northwestern Russia nuclear explosion \n",
"166 southern Xinjiang, China nuclear explosion \n",
"167 eastern Kazakhstan nuclear explosion \n",
"168 eastern Kazakhstan nuclear explosion \n",
"169 eastern Kazakhstan nuclear explosion \n",
"170 Tuamotu Archipelago, French Polynesia region nuclear explosion \n",
"171 Tuamotu Archipelago, French Polynesia region nuclear explosion \n",
"172 Tuamotu Archipelago, French Polynesia region nuclear explosion \n",
"173 Tuamotu Archipelago, French Polynesia region nuclear explosion \n",
"174 Tuamotu Archipelago, French Polynesia region nuclear explosion \n",
"175 Tuamotu Archipelago, French Polynesia region nuclear explosion \n",
"176 Tuamotu Archipelago, French Polynesia region nuclear explosion \n",
"\n",
"[177 rows x 10 columns]"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"Nuke_Query = \"\"\"\n",
" SELECT *\n",
" FROM earthquake_data\n",
" WHERE cause = 'nuclear explosion' OR cause = 'explosion'\n",
" ORDER BY magnitude DESC\n",
" \n",
" ;\n",
"\"\"\"\n",
"pysqldf(Nuke_Query)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# This may take awhile. "
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [],
"source": [
"for i in range (len(pysqldf(Nuke_Query)['latitude'])):\n",
" folium.Marker(location = [pysqldf(Nuke_Query)['latitude'][i],\n",
" pysqldf(Nuke_Query)['longitude'][i]]).add_to(map_Nuke) \n",
" popup = folium.LatLngPopup().add_to(map_Nuke)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Note: this map still has the marker from earlier, so it has one extra "
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgCiAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgTF9OT19UT1VDSCA9IGZhbHNlOwogICAgICAgICAgICBMX0RJU0FCTEVfM0QgPSBmYWxzZTsKICAgICAgICA8L3NjcmlwdD4KICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjEyLjQubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9qcy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMi4wL2Nzcy9ib290c3RyYXAubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9mb250LWF3ZXNvbWUvNC42LjMvY3NzL2ZvbnQtYXdlc29tZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLzIuMC4yL2xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2Nkbi5naXRoYWNrLmNvbS9weXRob24tdmlzdWFsaXphdGlvbi9mb2xpdW0vbWFzdGVyL2ZvbGl1bS90ZW1wbGF0ZXMvbGVhZmxldC5hd2Vzb21lLnJvdGF0ZS5jc3MiLz4KICAgIDxzdHlsZT5odG1sLCBib2R5IHt3aWR0aDogMTAwJTtoZWlnaHQ6IDEwMCU7bWFyZ2luOiAwO3BhZGRpbmc6IDA7fTwvc3R5bGU+CiAgICA8c3R5bGU+I21hcCB7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7cmlnaHQ6MDtsZWZ0OjA7fTwvc3R5bGU+CiAgICAKICAgICAgICAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwKICAgICAgICAgICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgICAgICAgICAgPHN0eWxlPgogICAgICAgICAgICAgICAgI21hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSB7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgIHdpZHRoOiA1MTAuMHB4OwogICAgICAgICAgICAgICAgICAgIGhlaWdodDogNTEwLjBweDsKICAgICAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgICAgIHRvcDogMC4wJTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgPC9zdHlsZT4KICAgICAgICAKPC9oZWFkPgo8Ym9keT4gICAgCiAgICAKICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9saXVtLW1hcCIgaWQ9Im1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSIgPjwvZGl2PgogICAgICAgIAo8L2JvZHk+CjxzY3JpcHQ+ICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkgPSBMLm1hcCgKICAgICAgICAgICAgICAgICJtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkiLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNlbnRlcjogWzAuMCwgMC4wXSwKICAgICAgICAgICAgICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3LAogICAgICAgICAgICAgICAgICAgIHpvb206IC0xLAogICAgICAgICAgICAgICAgICAgIHpvb21Db250cm9sOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIHByZWZlckNhbnZhczogZmFsc2UsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICAKCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfOTQxOGRlNmJmNTRkNGU5YmE0YTNlMTIwNTkzZGE0ODkgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICJodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZyIsCiAgICAgICAgICAgICAgICB7ImF0dHJpYnV0aW9uIjogIkRhdGEgYnkgXHUwMDI2Y29weTsgXHUwMDNjYSBocmVmPVwiaHR0cDovL29wZW5zdHJlZXRtYXAub3JnXCJcdTAwM2VPcGVuU3RyZWV0TWFwXHUwMDNjL2FcdTAwM2UsIHVuZGVyIFx1MDAzY2EgaHJlZj1cImh0dHA6Ly93d3cub3BlbnN0cmVldG1hcC5vcmcvY29weXJpZ2h0XCJcdTAwM2VPRGJMXHUwMDNjL2FcdTAwM2UuIiwgImRldGVjdFJldGluYSI6IGZhbHNlLCAibWF4TmF0aXZlWm9vbSI6IDQwLCAibWF4Wm9vbSI6IDQwLCAibWluWm9vbSI6IDAsICJub1dyYXAiOiBmYWxzZSwgIm9wYWNpdHkiOiAxLCAic3ViZG9tYWlucyI6ICJhYmMiLCAidG1zIjogZmFsc2V9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzY0ZTVhOWZkMThlZjRlOTViNzhmM2QwYjdjMDk4MGFjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuMTQsIDU3Ljg5OV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8xMzE2Y2MwOWRlYjU0NGFhOTM0Yjk5ODIzOTRiNmI5ZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzcwLjc3OSwgNTQuMTc3XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfOGIxYTQzYWNlNzZlNDg4YTgzN2QzZGZlYTIzNmFkNjMgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfOGIxYTQzYWNlNzZlNDg4YTgzN2QzZGZlYTIzNmFkNjMKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYWZiMWIwM2QxYzU5NGJmMGEyOThmMTYwZWYxMzBjMmQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs3My4zMDE5OTk5OTk5OTk5OSwgNTUuMTYxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfNjE1YTc5MWE0NzY3NGUyMzgwNDQ0ZDUxNTQzNGZmMjQgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfNjE1YTc5MWE0NzY3NGUyMzgwNDQ0ZDUxNTQzNGZmMjQKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMDhkMzhhMTY4Y2M4NDhhNzk5YmU1NDJlYjljYTA0M2UgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs3MC44MTcsIDU0LjA2M10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwXzU2YTEzMTM1N2M1MDQ5ZWFhNWRkNjZkYjE1NTU1ZGI0ID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwXzU2YTEzMTM1N2M1MDQ5ZWFhNWRkNjZkYjE1NTU1ZGI0CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzc0ZDA4ZGYyOWExMjQxM2FiM2ZjY2M1MTZhMTA0MTA1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNzAuODQzLCA1My42OV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwX2JlNTdlZDVjZjg0NzRkZGRhYmZiY2IwYzEwMGNjNTYwID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwX2JlNTdlZDVjZjg0NzRkZGRhYmZiY2IwYzEwMGNjNTYwCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzI3NDZjYTAxYzI5OTRiZWZhZTVkZWFlZGZmOGJkNzhmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNzMuMzUxLCA1NS4wNzhdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF85OTA5MTQ4Yjg4NjA0MDE5YjllZGQxZTY5YWNkZDBmYSA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF85OTA5MTQ4Yjg4NjA0MDE5YjllZGQxZTY5YWNkZDBmYQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl85MTVjOTlmNmVlYTA0MjhhOGNjZmI1ZjQ5ZWQxM2EzMiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQxLjYwNCwgODguODEyOTk5OTk5OTk5OTldLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF83NWI4MWZiZDJhZWY0Y2EwOGNiMjk4ZjNiNzBlMjYzNyA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF83NWI4MWZiZDJhZWY0Y2EwOGNiMjk4ZjNiNzBlMjYzNwogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9kN2Q2ODU0OWQ0MjM0ODg4YjEyNzA4NTBjYjdhMmI5YyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzczLjM2NiwgNTUuMDkzOTk5OTk5OTk5OTk0XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfYThjMjM4MzA2MGYyNGNmNTkwM2ZkMjkyMzBiYzJhYzMgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfYThjMjM4MzA2MGYyNGNmNTkwM2ZkMjkyMzBiYzJhYzMKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYzQ2OGFlODEwZDViNDQ4MGE2MThkODk5MTAwMzQyOWMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs3My4zNjksIDU0LjY0MTAwMDAwMDAwMDAwNV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwXzdjYWFmNjk0MWEzZDQ0NThhMzJkMTk5ODVjZWE1MjBhID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwXzdjYWFmNjk0MWEzZDQ0NThhMzJkMTk5ODVjZWE1MjBhCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2ZmZTg3YzVlYjJiNDQ4NTliNWExNTg0YjFlZWJlMTdlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTg2MDAwMDAwMDAwMDA0LCA3OC44NTMwMDAwMDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwXzcxODhlYWY1NWM2ZDRkZjk5NjYwYjQxNmM1YzI5N2IxID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwXzcxODhlYWY1NWM2ZDRkZjk5NjYwYjQxNmM1YzI5N2IxCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2E4NWZlNTRmNTA1ZjQwZGRiZjhlMzY3ZWY2ZGQ1YzUzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTE4LCA3OC45MTVdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF82Y2M2YzUwZjk5NzM0ZjJhODUzNmU4Y2U3MGEwODZmZSA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF82Y2M2YzUwZjk5NzM0ZjJhODUzNmU4Y2U3MGEwODZmZQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9mMmNmY2Q2NmJkMTU0ZTgwYmU1ZmRmNGNmYzhkYjcwNSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQxLjMzMjQsIDEyOS4wMjk3XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfMGIzMTU4ZTBkM2QzNDc3ZGE0NTUzOTQ3YzE4NDU4ZDYgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfMGIzMTU4ZTBkM2QzNDc3ZGE0NTUzOTQ3YzE4NDU4ZDYKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNWJjMDJmZDI1N2U4NDQwNzgzNDVhMjBiYTdkZWE3NzkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS45NzYwMDAwMDAwMDAwMDYsIDc4Ljg4OV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwX2NlMzRlNGI0NDlmNDRjMWY4MjRlNDYzNjgwNmRhZTljID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwX2NlMzRlNGI0NDlmNDRjMWY4MjRlNDYzNjgwNmRhZTljCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2I3NzBjMWQwMmMwYTRmNDZiOGY4NzRlMWNhZDE2OWQ2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTA5LCA3OC44NzNdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF83YjcxNGI4ODI0NDY0MTJhOTFhNGMwOTY5MjE3MGI1NiA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF83YjcxNGI4ODI0NDY0MTJhOTFhNGMwOTY5MjE3MGI1NgogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9iNmVjNmY2OGRjZTg0ZTNmYWY5ZThhNTQ5MjA4MjAwOCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljg5MTAwMDAwMDAwMDAwNSwgNzguOTYzMDAwMDAwMDAwMDFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF82MWNjNmVkYzNhZGM0NGFiYjc0NjRhZGFjNTRiNjU1NiA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF82MWNjNmVkYzNhZGM0NGFiYjc0NjRhZGFjNTRiNjU1NgogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8xYmMzMGFhMWYwMDU0NDlkOGQ3ZTIzZGZmNjk1NDU3MCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljk0OSwgNzguODM0XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfMWJiZjM1N2Y0OGQ0NDMwZjg5M2RhMjFkY2M5OTVjNTUgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfMWJiZjM1N2Y0OGQ0NDMwZjg5M2RhMjFkY2M5OTVjNTUKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZTgyOTg3ZjlkYzk4NDAzOGFmYTczZTlmNDA5ZjkzZDAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS45MjgwMDAwMDAwMDAwMDQsIDc4LjgyOV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwX2QzMmZhZjY0Y2U3YTRkODQ4OGQ3YTRjNGJjMDE2NGJkID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwX2QzMmZhZjY0Y2U3YTRkODQ4OGQ3YTRjNGJjMDE2NGJkCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzFlMWFjYjc3NTM3ZjQxYjdhNmVkMmRjOTE4ZjE2YzgxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDEuNTgzOTk5OTk5OTk5OTk2LCA4OC43MzcwMDAwMDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwX2I3Y2ZhN2Q1NjVlYTRjNjU5YzIwODdjMDI1ZGNjOWQ5ID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwX2I3Y2ZhN2Q1NjVlYTRjNjU5YzIwODdjMDI1ZGNjOWQ5CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzNlYTcxNzg4MjNhZDRiZWM5MGVkYzEzMmM4MTZmOWRjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDEuNTYzOTk5OTk5OTk5OTksIDg4Ljc3XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfN2YxNzQzZTgyNWQxNDM5ZjlhMDIyMWQzOGE4NmVkMjkgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfN2YxNzQzZTgyNWQxNDM5ZjlhMDIyMWQzOGE4NmVkMjkKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNGNjMGM5OWUxMmFkNGI4MzhkOGVmZDc1YTczZTdmMDYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS45MDEsIDc4Ljk1OV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwXzBhZWRjOGRmMGY4YzRmMTZhY2JiNWNiZWQyOGQxZGMwID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwXzBhZWRjOGRmMGY4YzRmMTZhY2JiNWNiZWQyOGQxZGMwCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2UxMjc0NmI2YzQ0MDQyMGVhZDQ3MTYxMmZmZjAwNmNhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTcxMDAwMDAwMDAwMDA0LCA3OS4wMV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwXzViN2E1NzVjMTc5NDQxNzE4ODI1Y2QzM2E3YTYxODRmID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwXzViN2E1NzVjMTc5NDQxNzE4ODI1Y2QzM2E3YTYxODRmCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2MxZTA3ZTUzNGE5YjRmNzc4MTAzZGY5N2I1NzA1ZjQwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTY0LCA3OC44MjddLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF9kY2U0ZTRiZGY5NTU0ODZkYjhkZjE4ODJhZGQ4Y2QxNCA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF9kY2U0ZTRiZGY5NTU0ODZkYjhkZjE4ODJhZGQ4Y2QxNAogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9mNjg4ZGZhZDVmNGQ0ZjIzYTVmMmY5MmJmMGE0MjZhMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljg4ODk5OTk5OTk5OTk5NiwgNzguOTMxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfMWYxNGMwNWY4OWNjNGIwNzg2NDcxZmQzMzgwNDc0YTAgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfMWYxNGMwNWY4OWNjNGIwNzg2NDcxZmQzMzgwNDc0YTAKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfODJlNzE0ZDZjMTVmNGQ1NGI2ZWM4Nzk4MjY0OWVjOGIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS45OTUsIDc4Ljg1NjAwMDAwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfMjAyZTM4ODk4Y2U4NDI5YWE2ZTczZmY4NGY2NTY2OTUgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfMjAyZTM4ODk4Y2U4NDI5YWE2ZTczZmY4NGY2NTY2OTUKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfOTA4NjQ2MTEwNzc4NDY0OWIwY2E0MjA1YWYwYzg4N2QgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS45MjgwMDAwMDAwMDAwMDQsIDc4Ljg2OV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwXzBhYWU0NTBiYmExZjQ2YzE5MTMyNzczZmY1NGMxNDYwID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwXzBhYWU0NTBiYmExZjQ2YzE5MTMyNzczZmY1NGMxNDYwCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2VhZWY2MmYyMjIzNDQyOWU5YWU2NjAyYTNlYzU4NzgwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTA2MDAwMDAwMDAwMDA2LCA3OC45ODEwMDAwMDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwXzhlNjJiYTFiNThjZjQ3OWE5N2U3OWE3MGEwYTY4YjMwID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwXzhlNjJiYTFiNThjZjQ3OWE5N2U3OWE3MGEwYTY4YjMwCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzg2YjVhYjU0NGFkNTRmNTFiMTEyOWI1NDZkMjRjYjlmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTIxMDAwMDAwMDAwMDEsIDc4LjkwN10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwX2ZlMGNlNjBmYjU5YjRjYWJhNjA4ZmUxZjcxOGYyMzNhID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwX2ZlMGNlNjBmYjU5YjRjYWJhNjA4ZmUxZjcxOGYyMzNhCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzJkMTU5ODI4MjFkMDRiMjk5ZDQwY2JjOGZiNzQ3OTQ5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTU3LCA3OC44NjJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF8zODMzNDNhMTMzMTY0ZjFjYTdkZTIwNjkzZTcxYjRjNyA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF8zODMzNDNhMTMzMTY0ZjFjYTdkZTIwNjkzZTcxYjRjNwogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl83N2ExMTBhODFjMGQ0MjFiOTBlMmVkN2M1MWY2MjM5NSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjkxMzAwMDAwMDAwMDAwNCwgNzguNzM1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfOWI5MmM0NDVlNmJmNGU1ODg0ZGY5NWVlZWI2ZjQ1NmMgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfOWI5MmM0NDVlNmJmNGU1ODg0ZGY5NWVlZWI2ZjQ1NmMKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfOGFiMmZlYTU1ZmNjNDU2ZGI1Yzk3NmQ5OGQxNjYyMjYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS45ODksIDc4Ljg0NF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwX2Q5MzJkNWRhMjMzOTQ0ZWZiOTc5YmExZjQ0MWI1M2M0ID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwX2Q5MzJkNWRhMjMzOTQ0ZWZiOTc5YmExZjQ0MWI1M2M0CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2Y5M2Q2YmMyMWRhMzRkNDc4MGVkNDY5Njg0ZjYzMjM4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuODY0LCA3OC43NThdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF9mNWFlNzM0ZDM0NzM0ZmU4ODJmYWQ5OTkyODQ3ZGZjZiA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF9mNWFlNzM0ZDM0NzM0ZmU4ODJmYWQ5OTkyODQ3ZGZjZgogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl82ZTBhODVjOTc4Yjc0ZGIyOGM5ZWRkNGQ5OWY3OGM3YiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljk1Mzk5OTk5OTk5OTk5LCA3OC45MV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwXzhmOGNjMTE0NjMzMjQ2YTFhZWYyZTEyYmViNTkxM2Q0ID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwXzhmOGNjMTE0NjMzMjQ2YTFhZWYyZTEyYmViNTkxM2Q0CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2JiYTM1NjM3OGQ3MjRlZGI4NTUzMDg4ZmJjNDYxYTg5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTE3LCA3OC45NDVdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF85ZjU0MDAwNTQ3ZmI0N2RiODgzZGM0MjM5NjgyNTNkOCA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF85ZjU0MDAwNTQ3ZmI0N2RiODgzZGM0MjM5NjgyNTNkOAogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl85MDFiM2EzNDY0Y2Q0MGJmOGQ4MWIxYmY0YzFkZDBhNyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjkyODAwMDAwMDAwMDAwNCwgNzguNzY4OTk5OTk5OTk5OTldLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF84NGMzOTRiMmQ1Y2E0ZWRjODBmNzIyYmUxMjMyNzg2YyA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF84NGMzOTRiMmQ1Y2E0ZWRjODBmNzIyYmUxMjMyNzg2YwogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl80ODA2MWEyMjU0MmQ0YmE0OTkyYzk1ZDU2YzBkMDRhMyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjgzMywgNzguODA4XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfMDU1ODQ4MzBjZTg3NDE1MmFkOWZkNDJlZjQ2OGFlNjIgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfMDU1ODQ4MzBjZTg3NDE1MmFkOWZkNDJlZjQ2OGFlNjIKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZDgzNmIwM2U3NmM2NGRkOGI2Y2FlMzdkM2VmMDI0ODUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS45MjQsIDc4LjgzMV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwXzY4NDg4MzI4MGEyMTRkYTFhYTVmNWE3ZmFhOWU2ZGVlID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwXzY4NDg4MzI4MGEyMTRkYTFhYTVmNWE3ZmFhOWU2ZGVlCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2MyZTg0MzIyZTU5ODQ2ZTg4ODA4MzRiNWE1MGNmYzg0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDEuNjAzLCA4OC44Ml0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwXzgzMTBhYWNjZjVkNzQ0YmZhYmRkZDY5YmI5NmRkMWJkID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwXzgzMTBhYWNjZjVkNzQ0YmZhYmRkZDY5YmI5NmRkMWJkCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzZiNjZmZTU0MjE1NjRkMTE5ZDMyOWEwMGZjZWRlNTMxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNzAuNzU2LCA1My44NzJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF85N2ZiMWI3NGQ2ZDU0NTllODc4ZDY1YjRjZGY2ZjQ2YSA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF85N2ZiMWI3NGQ2ZDU0NTllODc4ZDY1YjRjZGY2ZjQ2YQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl85NDA2NzFkODVkNGQ0MzZmOTVhZDdkYjgyN2Q1MjgyNSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUwLjAzNiwgNzkuMDExMDAwMDAwMDAwMDFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF9lYzdlM2Y1ODEyYTU0ZmNmYjVlZTMwOTJhZjViM2U1ZSA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF9lYzdlM2Y1ODEyYTU0ZmNmYjVlZTMwOTJhZjViM2U1ZQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9jMjVhZWQ5OWMyYmE0ZWMwYTgwOTQ4ZjUwYWQ4MmVjZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0yMS44OTQwMDAwMDAwMDAwMDIsIC0xMzguOTU5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfYWUxYzE3NzMzZTlmNDcyZTk2ZGM1Y2IyYzk2NDgyZTggPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfYWUxYzE3NzMzZTlmNDcyZTk2ZGM1Y2IyYzk2NDgyZTgKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNGNkN2Q3NzNlYzgyNDkyYTg4ZmU4MjZhYTc4M2FjMTkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS44OTgsIDc4LjkyNV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwXzVmZjJkOTM2MTU5MzRmNjViNjkzZDBlZDVjNDYwYzg5ID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwXzVmZjJkOTM2MTU5MzRmNjViNjkzZDBlZDVjNDYwYzg5CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzAwNzZmMDM4ZGIzZDQ5OWZiNTkwZGU3ZTZjOTAzOTg1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTU2LCA3OC43NjVdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF8zNzk0NWJlNzEwMjc0Mjg1YjIzNWVmMWRhYzMwMzAxYyA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF8zNzk0NWJlNzEwMjc0Mjg1YjIzNWVmMWRhYzMwMzAxYwogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9lMzlmYzM4ZTVhOWU0NTI2ODI1M2ExZTY3YjdkM2M0ZSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ3Ljc4NywgNDguMTkyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfZmJhYjNiNmQ4NDEwNDcwZGE1ODA4ZGU2YWVmOWJiYmMgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfZmJhYjNiNmQ4NDEwNDcwZGE1ODA4ZGU2YWVmOWJiYmMKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfOTI4MjFhN2RiMDNkNDA0NTlhMzAwZjg0NGQxMmFiNGIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny44ODMsIDQ4LjEyOF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwXzE4ZmIyZjBhMTE1ZDRlODU4Y2UwM2UwNzM0MGQ1MzdlID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwXzE4ZmIyZjBhMTE1ZDRlODU4Y2UwM2UwNzM0MGQ1MzdlCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzU3MWFiYTllYmI2YTQxMDA4ZGVkODk2NTU3MzJhNDRkID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTIxLjg5MiwgLTEzOC45OTNdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF8wOTc0ZjIxNzk0MzE0ZGMyYTI1YTgxNTA2NDM3NjQxMiA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF8wOTc0ZjIxNzk0MzE0ZGMyYTI1YTgxNTA2NDM3NjQxMgogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl82ZDEyMDUxMjkzZDU0YWU3OTBiOGE2YjE3NWRiZjNkMiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljk2NywgNzkuMDZdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF8zMTExZGFiYzI4YmI0OWY2OWQ4Zjk0MTMyOGRhNGE1MSA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF8zMTExZGFiYzI4YmI0OWY2OWQ4Zjk0MTMyOGRhNGE1MQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8yNDU0YWIyMDNkZjc0NGM0OGI3YmI5YmQzM2U2NDFhZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljg5NCwgNzguODQzXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfNDU2MzY3YTBmN2IyNDZkZTg2NDQ2ZDNmYWY5MTRlNGQgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfNDU2MzY3YTBmN2IyNDZkZTg2NDQ2ZDNmYWY5MTRlNGQKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMTU5OTg4OGNhZDBlNDgxN2IwNWY4Yzk3NTRlOGZkYjkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS44OTcsIDc4Ljk4M10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwX2Q3ZGRiOTk5MjQzNTQ1NzBhMGI5MDZhMmY0YTM4Yzc2ID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwX2Q3ZGRiOTk5MjQzNTQ1NzBhMGI5MDZhMmY0YTM4Yzc2CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2M5MzlmMTk3OWQ2ZTRmOThhZTYzNDI1MTIxZjJhODdkID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuODg2LCA3OC44OThdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF8xYjgzNDIyZGFhMWQ0ODc0ODJmMTYyODczZGNlMTYwZiA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF8xYjgzNDIyZGFhMWQ0ODc0ODJmMTYyODczZGNlMTYwZgogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8wODFiYWM5ZjJmNDE0MDkyYjZhYzVhYzZlOTk4ZjY5MSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjkzMTk5OTk5OTk5OTk5NSwgNzguODQzXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfOTIxMTE4MWVjMTE1NDI4YTlhYTkwYWQ0NzljYWNkM2UgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfOTIxMTE4MWVjMTE1NDI4YTlhYTkwYWQ0NzljYWNkM2UKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNmZjZmYxYTZhYjIzNDBmMzgyZGFkM2RjNmQ0Mjk4MzcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS45OCwgNzkuMDZdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF9lMjZjZDFlYzUwY2I0MzY4YTVlYzk0NGYzODZiNzJmMyA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF9lMjZjZDFlYzUwY2I0MzY4YTVlYzk0NGYzODZiNzJmMwogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl81MjBjZWVmNmUxOTE0NWI3YjYyYjU3NDI2N2E4NWUyYyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljg2MTAwMDAwMDAwMDAwNCwgNzguNzUyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfNDFkMzQxOWJhZDE2NDNkOWJlZDQwNjE5MWM0YWRhZjkgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfNDFkMzQxOWJhZDE2NDNkOWJlZDQwNjE5MWM0YWRhZjkKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNDUzYTQ0YTdlYjUxNGNjOThlZTdhNjQ3NmEwM2FiNDMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS44ODg5OTk5OTk5OTk5OTYsIDc4Ljg4MV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwXzI4NGZmM2U5N2JiMjQ5NDI5NWQ0ZGE4MDE3NjMzZWU5ID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwXzI4NGZmM2U5N2JiMjQ5NDI5NWQ0ZGE4MDE3NjMzZWU5CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzI5YjQ1Njc5OWY4ZjQ0MGY4MjlhZjI1ZDFkMzJhZGZlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuODYxMDAwMDAwMDAwMDA0LCA3OC42OTZdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF8zNWYyNTY2Mjk5YWM0MGY4OWIzOWQ2ZTQ2OGJiOWI5NSA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF8zNWYyNTY2Mjk5YWM0MGY4OWIzOWQ2ZTQ2OGJiOWI5NQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl83ZGRiOTM2OGQxZTY0YThlYTQ2MGQ3ZjBiYmMyYTQ4NCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljg4NiwgNzguNjkxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfMGNjNGU1ZjY3ZjJiNDQxYmE2YWZlMDNjYTA5YTJlMjQgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfMGNjNGU1ZjY3ZjJiNDQxYmE2YWZlMDNjYTA5YTJlMjQKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfN2Y4NzU5MmI2OTY4NDRkYTlhZDMxYTJlMDNhMmEyMzcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS44NzEsIDc4Ljc5MV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwXzE0NjU5YzQzMWU5ODQzOWZiNjI2MzAxZTA2NTY5OTFjID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwXzE0NjU5YzQzMWU5ODQzOWZiNjI2MzAxZTA2NTY5OTFjCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzE1ZTMwZWNiZGFhNzQ0ZGU4YmU1MGE4Mzg0MjExNGZlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTM3LCA3OC45NzJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF8wOTk0NDM4M2ZiN2M0MGMxOGIyNWM2ZTMxMGJhNDg2YiA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF8wOTk0NDM4M2ZiN2M0MGMxOGIyNWM2ZTMxMGJhNDg2YgogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl81YzhmMzFiYzJhNTM0YzZkOTdkNWFmODk4ODgzODg2YSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQxLjY2MiwgODguNzUyOTk5OTk5OTk5OTldLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF9lMjBkMTU4NGE4Yzk0OTBhYWI0OGM0MGFiYzc5MDJlYyA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF9lMjBkMTU4NGE4Yzk0OTBhYWI0OGM0MGFiYzc5MDJlYwogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9kN2Q4NjE1NmY1MmU0ZmJhODhmMGY2N2ZkZmM1NDZiMiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQxLjU1OSwgODguOF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwXzlhYmY5YTgxZGFhODRiMjliYmEzNjU1NWQ2ZWE4ODM2ID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwXzlhYmY5YTgxZGFhODRiMjliYmEzNjU1NWQ2ZWE4ODM2CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzY5OTBiYmY4Y2I5YzRjZjI5MTE1NTRmNmI3ZTIyYjQ4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTUyLCA3OC44NDRdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF9mYjEwODYzZmRiNzY0ODY1OWE5M2JhODAwNWZkMmEyOCA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF9mYjEwODYzZmRiNzY0ODY1OWE5M2JhODAwNWZkMmEyOAogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8yMGFiNDBhMmJjYjY0ZjdkOTZhOGRjZGJhZTEwYzE4YSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ3Ljc4MiwgNDguMTJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF82MjFhNWVlNzk2NjM0Y2M2YjBhZTg4ZGVhOWQwMGI5YyA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF82MjFhNWVlNzk2NjM0Y2M2YjBhZTg4ZGVhOWQwMGI5YwogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9kY2IxOWRkNjcyZDE0YjU0OGY1MmZiNGY1ZjFhN2JmYSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljk5MTAwMDAwMDAwMDAxLCA3OS4wMDVdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF80NGRlMzMyYzYzYzM0MjM4OTQ0MTVlMzYyOWY1YTM4NiA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF80NGRlMzMyYzYzYzM0MjM4OTQ0MTVlMzYyOWY1YTM4NgogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl80YWZlMWIyNWNhZGU0MDljOTQwNTUzYTEwMWQ4OGFjNiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljg4Mzk5OTk5OTk5OTk5LCA3OC45MDVdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF8zMjU2MDQzMWNlZDY0YmIxYmE5YTQ0NmU0NmViOTRlNSA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF8zMjU2MDQzMWNlZDY0YmIxYmE5YTQ0NmU0NmViOTRlNQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9lMmYwYzRlMTc0ZDc0ODBkOWJkMGMxNmIzZWEzNzQ1YSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0yMS45MzIsIC0xMzguOTU4XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfNzMzODE3YmVhZDE0NDY2NDljOTYxYWE4MThmNDhkM2EgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfNzMzODE3YmVhZDE0NDY2NDljOTYxYWE4MThmNDhkM2EKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZjU0NTNhOWYzMTExNDc5Nzg1N2ZmMmY2ZTM1YWE5MmMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MC4wOTIsIDc4Ljk2MV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwXzEzOTg5NDliM2EwMTQxMzFhNjcwMDU4YWU2YzYwMDRjID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwXzEzOTg5NDliM2EwMTQxMzFhNjcwMDU4YWU2YzYwMDRjCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzA0YjVhN2JjOWVmMTQ2ODBhN2ZiODIwZWRiZTBiMDVkID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTU3LCA3OC45MzFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF80ZmNlMmIxMzJlNmQ0ZjNmYjY5NmIwZDIyZGJkOTgxYSA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF80ZmNlMmIxMzJlNmQ0ZjNmYjY5NmIwZDIyZGJkOTgxYQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9mMzg2YTkyMGNiNDM0ZmRhYmFjY2NjYWFjODg0MTg1YiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljg3OSwgNzguODM4MDAwMDAwMDAwMDFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF82OTg3ZDc0NDdlMWY0ZTM2YTIyZjRhOWYyNTNiMGM5ZCA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF82OTg3ZDc0NDdlMWY0ZTM2YTIyZjRhOWYyNTNiMGM5ZAogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9lNDcwNjdhYzc1MmU0NzU3OGI0NGRiODhiNGM1NDVhZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzczLjMzNiwgNTQuNzkyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfZmY5MTZiMTY2N2JlNGQ2MjhiMWQ5YjU0NTBkMWYwNjcgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfZmY5MTZiMTY2N2JlNGQ2MjhiMWQ5YjU0NTBkMWYwNjcKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYjAyNzJmNzg0M2JkNGM5Y2E5NmMyNTY4ODdhMDcwZDYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MC4wMDgsIDc4Ljk5NjAwMDAwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfMDg3NmE4NzY5MDQyNDFiY2ExOWJmMDYwNmVhODg2OTggPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfMDg3NmE4NzY5MDQyNDFiY2ExOWJmMDYwNmVhODg2OTgKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMjkxNmE4ZjEzY2Y4NDFlZGFlZTIyYjAzNGJjY2U3NmYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjEuOTAzMDAwMDAwMDAwMDAyLCAtMTM4Ljk3NV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwX2U2N2VjODczMGU1ZTQ3MWM4MTM5OTNhNWIwMTQxMDU3ID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwX2U2N2VjODczMGU1ZTQ3MWM4MTM5OTNhNWIwMTQxMDU3CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzBkNWQ0YTBjN2Q4MDQwODY4NDJlODkwZjY2NjU3ODEyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTIxLjg4NiwgLTEzOS4wMTldLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF8zNWRmNzYwMzcxODg0NzE5YjZmMTQwNDZlMDE0MzdhZiA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF8zNWRmNzYwMzcxODg0NzE5YjZmMTQwNDZlMDE0MzdhZgogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl85OGIxMTk4ODIwNmY0MWRlYmZmNTI3Y2Q0YjMwNzM1YSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljk1OCwgNzkuMDg1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfYjg1MDcwMjdjYTJlNGYzM2E0OWY5NDgyM2FkNDliNjAgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfYjg1MDcwMjdjYTJlNGYzM2E0OWY5NDgyM2FkNDliNjAKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfN2Y0OGU3Y2IzZDVkNGMwMTgyMWE0ZjRmMGZkOGUyNzUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS45MzE5OTk5OTk5OTk5OTUsIDc5LjAwNV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwXzI2ZDkwYTY1NDI3ZDRhODc4YWJiYTFjMzhmYjAxM2E1ID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwXzI2ZDkwYTY1NDI3ZDRhODc4YWJiYTFjMzhmYjAxM2E1CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzM1ZDJmM2U2ZWQxOTRhZGFhYzFkNzZjM2MwMzY5NjYxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTAuMDQsIDc5LjA0Nl0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwXzhlZTliMTcxYzE2MDQzNmE5ZGU4YTk3NzdkMDUyNTVlID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwXzhlZTliMTcxYzE2MDQzNmE5ZGU4YTk3NzdkMDUyNTVlCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzViMTQwN2RhOTBlMTRkYzc4YjNiMGUwMjk2OWRjNWZlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTAxLCA3OC45MDEwMDAwMDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwX2RjNGY2YjQ3YmVkZDQ0YjhiZDhjYjEyMTU5ODQ5ODE5ID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwX2RjNGY2YjQ3YmVkZDQ0YjhiZDhjYjEyMTU5ODQ5ODE5CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2UxMTMzZWUzNTJkMDQ0YjA4ZjRlMTlkNzliNjJjODFhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNzMuMzE3LCA1NC44MTJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF9jZDA1Y2EwODNlODA0MGY3OWMyMzk3OTQ0NjQ5MjJlNSA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF9jZDA1Y2EwODNlODA0MGY3OWMyMzk3OTQ0NjQ5MjJlNQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl81Y2Y5Y2E5ZDZlMWQ0NTMzOGEwODcxYjFiODFlZWY3MiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0yMS44OTUsIC0xMzguOTE4XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfOTcwMDcyMGY2NzI3NGEzMzg3MDgwYjNiNDEwYjkwZDIgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfOTcwMDcyMGY2NzI3NGEzMzg3MDgwYjNiNDEwYjkwZDIKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYzQ2NjEyZjM0ZmY1NGQ1OTk5NmZhOGI5MDIxZTQzYWMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs3My4zODMsIDU0LjkxMzAwMDAwMDAwMDAwNF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwX2U4ZjZiNzE5ZTFhOTQ5N2NhNzM0MTMzNzFlNGYxYTQzID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwX2U4ZjZiNzE5ZTFhOTQ5N2NhNzM0MTMzNzFlNGYxYTQzCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzcxMDdhNWQyODBlZDRmN2JhNTBlMjAxNmNmYWJjOTgzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTM3LCA3OS4wMTddLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF81MGU2MzhjN2ZmMzc0MDIwYWI5YWQxZTAwN2ZjNzdhZCA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF81MGU2MzhjN2ZmMzc0MDIwYWI5YWQxZTAwN2ZjNzdhZAogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9iNWUyYzFiMWM1MDU0YmQzODYwYTFhMGVhYTAxOTIwZSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljk1MywgNzguOTRdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF80ZWExYmUxOWI0ZTc0MGRmOTQ4NGNlMmM4OTcwOTc2MiA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF80ZWExYmUxOWI0ZTc0MGRmOTQ4NGNlMmM4OTcwOTc2MgogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl85ZGE2ZDVlMTc1NDY0NDFkYTkyOWQ5MDFmYjQxMGY3MyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzczLjM3LCA1NC45NTVdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF8xOWRkMmUwZTI0NDQ0N2VjYjA3ZGJhZTk4MmY3MzI5MCA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF8xOWRkMmUwZTI0NDQ0N2VjYjA3ZGJhZTk4MmY3MzI5MAogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl81YjIzOGIyNGNhYjU0Nzg4YTU0MTY4OGQ2YmU5Mjk2ZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljg3Njk5OTk5OTk5OTk5NSwgNzguODE2XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfNGRlM2M4ZTZmYjUwNDM1ZWJjYjE1OGI1MTEyZTc1YjMgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfNGRlM2M4ZTZmYjUwNDM1ZWJjYjE1OGI1MTEyZTc1YjMKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNjkxZGE1NWY5ODA4NDM4ZDkwMjMzZGJhNTA4YWZmZDQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS45MjQsIDc4Ljk2OV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwXzkxZGNmMjljNTFmODQ0MGNiOTllZjQ2OWRjODNmMWQxID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwXzkxZGNmMjljNTFmODQ0MGNiOTllZjQ2OWRjODNmMWQxCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2Q0MGYxMjNkYWQxZDQ4MGU5MTE2YjQyZDZlZjI3NzI4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTUxLCA3OC44MjldLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF82YzMzNzc0ODQ1YjU0ODYxODRhYWMxNTg4ODc3ZThlOSA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF82YzMzNzc0ODQ1YjU0ODYxODRhYWMxNTg4ODc3ZThlOQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8yODA0OGU1ODYyMDk0ZjI0OWM2YjU1YzY3MzgzODFhYiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljg4LCA3OC45MTddLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF8xOWJiMmZhMTgxNjY0YjMzYjNlZjk0NTc4N2VjNzFiZSA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF8xOWJiMmZhMTgxNjY0YjMzYjNlZjk0NTc4N2VjNzFiZQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8xODU1MjFmYjg4YzM0Yzc4YTQ1NTNhMDQzYTc0ZWFmYSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0yMS45MDQsIC0xMzguOTk1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfMjBhOGIyMGUwY2I3NDg2ZGE1MGY5ZWJiODVhOGZkNzIgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfMjBhOGIyMGUwY2I3NDg2ZGE1MGY5ZWJiODVhOGZkNzIKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZTEzOTQ4NzNkMThjNGE0ZWE2YmFhZjE5NGI3ZTdkNjMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs3My4zODcsIDU0Ljk5ODAwMDAwMDAwMDAwNV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwX2UwYjY5NmEzM2M5MjRlZjRhNDg4NzY1ZTgwOGZhNzJlID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwX2UwYjY5NmEzM2M5MjRlZjRhNDg4NzY1ZTgwOGZhNzJlCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzQ3ZmZlNDY3ZWExMTQxN2JiM2YyM2U5MGZlMjMyNWJlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuODg2LCA3OC45MjZdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF9mMjI2NjBmM2Y1OTM0YTk1YjY3ZGE4ODY5NGU2MjNkMSA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF9mMjI2NjBmM2Y1OTM0YTk1YjY3ZGE4ODY5NGU2MjNkMQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9lMGVlZDNiMDk4ODc0OGQyOTdkYjU5N2U0Yjg3OGFjNiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjkyNSwgNzguNzRdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF9iNzg3YjAzMWJhYWQ0MTY5ODQ3NGI4OTU2YjZkMDFjZCA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF9iNzg3YjAzMWJhYWQ0MTY5ODQ3NGI4OTU2YjZkMDFjZAogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8xOWMzMDFhZWI5ZDA0ZDJhYTVmODZjYmU3MTZiNjQ4NyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQxLjY2NywgODguNjk1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfZjY2ZWQwNzM4OTMwNDZhMWEzYmI3ZGE0MDI1N2JhZjMgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfZjY2ZWQwNzM4OTMwNDZhMWEzYmI3ZGE0MDI1N2JhZjMKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZjMzNWJhMDgxMDUxNDg0ZThiZjg2ZGY4ZTc4NGJhN2UgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0MS42NTcsIDg4LjY5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfOTlhZGQwOWUwMWRmNGJlN2I1MDMxMWFiN2IxMzZmODYgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfOTlhZGQwOWUwMWRmNGJlN2I1MDMxMWFiN2IxMzZmODYKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNmU0OTZkOTZmMmE4NGJiZDkyM2Q1N2NkMTY0ODA5NTggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy4yOTY1LCAtMTE2LjMzMzE2NjddLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF83N2I3ODBlOTZkYWQ0ODA2YjZhZmRkZGQ0ZmViZDgxYSA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF83N2I3ODBlOTZkYWQ0ODA2YjZhZmRkZGQ0ZmViZDgxYQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8yY2Y4ZGI2NGY0MmI0NmFjYjc1NDdmNjMxNjRkNDQzNCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjMwNiwgLTExNi40NzE1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfMWUyYTI3MDc4NjJlNGVmNjk4ZWE4ZTYyMDIxZmFhYmIgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfMWUyYTI3MDc4NjJlNGVmNjk4ZWE4ZTYyMDIxZmFhYmIKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYjMxMzdkYzRjZGQ2NDY2NDkwNTkzMDYzMjE3ZmVhMjUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy4zMTQxNjY3LCAtMTE2LjQ2MDY2NjcwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfNjljODAxZTBkZDYzNGU0ZmEyOTc1ZTU3YzY0NWYyZTkgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfNjljODAxZTBkZDYzNGU0ZmEyOTc1ZTU3YzY0NWYyZTkKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfN2I0YWMxYjJmMDkwNGYyMmFjM2VkNjhmNjkxZjI4ZWYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy4yNzEzMzMyOTk5OTk5OTUsIC0xMTYuNDg4MzMzM10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwXzBhZGU4ZWEyMjFmMTRkOWRiNTA1ZDAwYjExYTFiM2ExID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwXzBhZGU4ZWEyMjFmMTRkOWRiNTA1ZDAwYjExYTFiM2ExCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2M0NzBmZTJiMmEyZjQ2YzBiMGNhYjJjNDViYTQwZDRlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTgzOTk5OTk5OTk5OTk1LCA3OC45NzVdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF9jYzY5Njk5ZjIzODY0NDQ1YWU0ZDdiZTZhMzJjOGM3MyA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF9jYzY5Njk5ZjIzODY0NDQ1YWU0ZDdiZTZhMzJjOGM3MwogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl82MDE1ZTQ1NzEwYzI0YTViYjRkOTY1MTZmN2ZlNWRmOCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUwLjA0MywgNzguODk5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfZDQ3Y2VkYTc5ODY1NDJmNWIwZTk0NTIzZDQ1MzE0YTEgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfZDQ3Y2VkYTc5ODY1NDJmNWIwZTk0NTIzZDQ1MzE0YTEKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfODFhZWY1YzNlODg4NGU3OGE2OGI2NjI3ZjRlNTc1Y2UgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS45MTUsIDc4Ljk1Ml0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwX2IxN2E4Mjc0Y2M2ZDRiZWQ5NzBiYTI0NTQ5NDZlYThmID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwX2IxN2E4Mjc0Y2M2ZDRiZWQ5NzBiYTI0NTQ5NDZlYThmCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzhiZjRmYzYxZjdjOTQ4ODRhY2M1ODI3YzE1YzJhYTU3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTY4OTk5OTk5OTk5OTk0LCA3OS4wMDFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF8zNjM1YWJkMThkNWU0ZTQ1YWNlZDkxYTFkYjFiOWUyYiA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF8zNjM1YWJkMThkNWU0ZTQ1YWNlZDkxYTFkYjFiOWUyYgogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl80NGE1ZjViNDRlMDc0Mzk0YjcxOGUzMWEzM2MyNmM5ZSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzczLjQwNCwgNTQuODE3XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfNjg0YWY0OWJmMDVhNGU3OWIzNGNiNDFhZDQ4OWRlYjcgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfNjg0YWY0OWJmMDVhNGU3OWIzNGNiNDFhZDQ4OWRlYjcKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZGVmZTUzYjQ4MjRmNGI0MDgzZGM0OTBmZGUzODc3ZTQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS44MzksIDc4LjkwNl0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwX2JhZjU3MGFiODkxNDQxZWFhMzU1YTI5Zjk5ZjE1NjYzID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwX2JhZjU3MGFiODkxNDQxZWFhMzU1YTI5Zjk5ZjE1NjYzCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzIxNjlhNTdiM2VlOTQ1ODNhMzE4MDkyYTVhMTg1ODA5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuODE4MDAwMDAwMDAwMDA1LCA0OC4xMTRdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF8wNzkzZWE1ZTIxMTI0ZDc2YTVjOWQ5YTU4ODE3ZjIwYyA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF8wNzkzZWE1ZTIxMTI0ZDc2YTVjOWQ5YTU4ODE3ZjIwYwogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8wZWE2MDQ2NTk5NDc0ZGFiODBhNDQ3ODlkNTQ1MmIzOCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUwLjA1MzAwMDAwMDAwMDAwNCwgNzkuMDY1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfZjQwNWI0NjA3NDA0NDQ3ODk0MzRkMDNhYTk1N2NlYzIgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfZjQwNWI0NjA3NDA0NDQ3ODk0MzRkMDNhYTk1N2NlYzIKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMDIzYWUxNzhlYmE4NDkyOTgyNjUxMmQzM2YyN2MyYjggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs3My4zMzgwMDAwMDAwMDAwMSwgNTQuODA2OTk5OTk5OTk5OTk1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfZmYyMWNhM2Y1MWI4NDI5ZDk4MGZlNzY2N2ExZDliZTkgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfZmYyMWNhM2Y1MWI4NDI5ZDk4MGZlNzY2N2ExZDliZTkKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMGQwYTVkYTcyN2ZjNDZkODk3ZTkyZWM1YzU3NmYyZGMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny44MDYwMDAwMDAwMDAwMDQsIDQ4LjE1OF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwXzU3MTQ4MDg4ZWNmNDQ1MDQ5NzkwYzhhNjViMTViYzAwID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwXzU3MTQ4MDg4ZWNmNDQ1MDQ5NzkwYzhhNjViMTViYzAwCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzZkNDhhMTM0NDc2NTQ1MzM5MTlkYjMzM2RhNWVjMTRjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNzMuMzUzMDAwMDAwMDAwMDEsIDU0Ljk5N10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwXzUzY2ZiZTQxYjUwMTRhYTM4NGRmMTIzY2EwNmFkNzZkID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwXzUzY2ZiZTQxYjUwMTRhYTM4NGRmMTIzY2EwNmFkNzZkCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2VhZGQ4YWQ3YWE0OTQ5N2I5YzllMjQ2NmI0OTI1ZjEwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNzMuMzQ4LCA1NC40OTVdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF9kMDViZjUzODM3NTM0ZWIxYWNmYjc3NTc0ZmIwNGIyMyA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF9kMDViZjUzODM3NTM0ZWIxYWNmYjc3NTc0ZmIwNGIyMwogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9kN2Y4MGYyNDU2YTM0YzZiYTg0ZWQ3Mzg1NmIyY2MyNSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjkwOCwgNzguODA3XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfYjdmYzk2YTFiZjJiNGI1ZGE5MGE5NzZmMmE2ZDIyNDIgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfYjdmYzk2YTFiZjJiNGI1ZGE5MGE5NzZmMmE2ZDIyNDIKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZTJkMzA0NzI1MjI4NGU0OGEwZGE3OGJiOGU3NGEyMTcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS45OTMsIDc5LjA3Ml0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwXzQxZTI2ZGZhNGRkYTQzZjI5NGMxMzEwMTQ4MTA0NzdlID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwXzQxZTI2ZGZhNGRkYTQzZjI5NGMxMzEwMTQ4MTA0NzdlCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzQxNzk5ODc5OWY3MzQ2YWQ4YjM4MjY3OTM5MmUzMGYzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTIxLjg2Njk5OTk5OTk5OTk5NywgLTEzOC45MjldLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF82NTIzMWJjN2QxMjM0MTdlODhiYjNhNzI3MjJlMzlkZiA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF82NTIzMWJjN2QxMjM0MTdlODhiYjNhNzI3MjJlMzlkZgogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9hMGJiZTc1ZTBmZDU0MjI4OGM4NTZkYzQ3MDA2NGNhNyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljc5OSwgNzguMTFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF9kNjFiMmJkMzEwZTg0OTI0YTJiNDkwNjg4NmU5YmYzOCA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF9kNjFiMmJkMzEwZTg0OTI0YTJiNDkwNjg4NmU5YmYzOAogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9mNDE2ODBjZjc4YjU0MTlhYjBhYzg2ODAzNzFkZjZhMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzczLjMzOSwgNTQuNjI2MDAwMDAwMDAwMDA1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfMTk5ZTBkZmU0ODU0NGQxOGFhYjUzYjYzZGU2MTQ0MzMgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfMTk5ZTBkZmU0ODU0NGQxOGFhYjUzYjYzZGU2MTQ0MzMKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMDU5MGFhNzhhMTBjNGZjYzlhNjJhNTRiMGJkMDA3ODYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0MS41MjcsIDg4LjcxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfNTE1MDA2NWYxNzdhNGM5YmE4NDU2YmRiNzA1MTc5YjcgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfNTE1MDA2NWYxNzdhNGM5YmE4NDU2YmRiNzA1MTc5YjcKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYmY1M2E2YmFjYTU2NDllMTg1MGNiYzA2NjRiNTgwM2YgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS44MiwgNzguMDc4XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfYTA2MDg2NGQ3MjRmNGU4Y2E0YWQ0NjZkMzlmNTM3MTkgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfYTA2MDg2NGQ3MjRmNGU4Y2E0YWQ0NjZkMzlmNTM3MTkKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfM2YzOGU4Njc3ZGMyNDc5ZGJjMWQ2NDg1M2NiNTFhMDIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs3My4zNzYsIDU0LjU4MV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwXzA0MjhlODY0M2YyMjRlOTFhYzliYTU4NjhlMjRjZjE0ID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwXzA0MjhlODY0M2YyMjRlOTFhYzliYTU4NjhlMjRjZjE0CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzg0YjJlYWJiMGQ1MzQ1NWVhODQ4NzYwNWE0MDJlN2M4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuNzQ0LCA3OC4xNjhdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF9jM2M5ODEyZTNmNDQ0YWI1ODliNmQ0ZmRiYmI3OWY0OCA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF9jM2M5ODEyZTNmNDQ0YWI1ODliNmQ0ZmRiYmI3OWY0OAogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9kNDRlZTg4ZGI3NDA0NWFiOWUxOTk0MDJhOWRmY2IyMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzczLjM2OSwgNTQuNzA4XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfZmIxYzVmMDJhODk0NGFkZjhkZDRmODNiMTI4MGQ4MTEgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfZmIxYzVmMDJhODk0NGFkZjhkZDRmODNiMTI4MGQ4MTEKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNWNmYTg1MDNkNWZkNDVmZTgyNWJlYmY0ZGQ3YWMwNTYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjEuODc4LCAtMTM5LjAyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfOGM0MjA3NDhkMDU4NGJkZTliZmNmNGFkYzMxY2IxZWIgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfOGM0MjA3NDhkMDU4NGJkZTliZmNmNGFkYzMxY2IxZWIKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMjU4ZGFjZDk2MjZkNGU4Y2FiNTIwNDU4YzRkMGY0ZGIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS45MiwgNzguODQ4OTk5OTk5OTk5OTldLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF9lOTQ5YzUyOWExOWY0OTA5ODYwMzhmODY5ZjgxNTI2NiA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF9lOTQ5YzUyOWExOWY0OTA5ODYwMzhmODY5ZjgxNTI2NgogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl81YTIyNDNmZTdlMzc0MjJkYjcxOGIzN2Y1M2Y4ODk2MyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUwLjA2NiwgNzkuMDQzXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfM2I5MjdjNzhhODdlNDRlNjgwNGNmMmFmNjEwNzVmNmEgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfM2I5MjdjNzhhODdlNDRlNjgwNGNmMmFmNjEwNzVmNmEKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZWMwNTI4NjE2Njk3NDgzMWFjNjExMGIyMzUxN2Y0ZWEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MC4wNjEwMDAwMDAwMDAwMSwgNzkuMDAzXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfYmFlZjM2ZjdmYTU5NGI2N2E2ZWVmZTY5M2QyNjAyZWIgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfYmFlZjM2ZjdmYTU5NGI2N2E2ZWVmZTY5M2QyNjAyZWIKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNTFiZWE4YjEyNzE4NDQ0ZGE4ZTQ5YjdkY2ViOTE0NTIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS43NCwgNzguMTYzXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfMGFiZWY2ZGI1NTZjNDQ4NWJjMTYzOWU2YzU1MzEwZmMgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfMGFiZWY2ZGI1NTZjNDQ4NWJjMTYzOWU2YzU1MzEwZmMKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYmMyMzliNmRjYTBkNDQ1NThkY2EyMzRjYTJjZjk0YTMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjEuODUxOTk5OTk5OTk5OTk3LCAtMTM4Ljk2MV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwXzFhOTQwYTFlZTFjMzQxYzViMTg1ZmE0NDgxZWI2N2Q0ID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwXzFhOTQwYTFlZTFjMzQxYzViMTg1ZmE0NDgxZWI2N2Q0CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2FlZDE0NmI4MDFkNDRmYjRhYTQ1Y2Q5YTkwOTE1YWI4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTIxLjg4MzAwMDAwMDAwMDAwMywgLTEzOC45OTRdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF83YTBmYzA2M2EwMTA0MjY4OTZiMjM5MzBiYWYwOTFhZiA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF83YTBmYzA2M2EwMTA0MjY4OTZiMjM5MzBiYWYwOTFhZgogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9lYzc3Nzg1YTlmNTk0MDE2YWFjODMwMWI1Mjc1N2E4MSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0yMS44MjMsIC0xMzkuMDQ4XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfNzA3ZTY0ZjFkYTNlNDZiNzg1MDkzMjFmZDg0N2NhYWQgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfNzA3ZTY0ZjFkYTNlNDZiNzg1MDkzMjFmZDg0N2NhYWQKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZjBiMTNhMDk1MWU1NDNkM2E4OGYyN2U5YzI1YzBmZmUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjEuODk4MDAwMDAwMDAwMDAzLCAtMTM5LjAyNl0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwX2M5NDQ4NTNkMGZlYjRhNmRhYzE0YjEzOTFhNThmMzQ1ID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwX2M5NDQ4NTNkMGZlYjRhNmRhYzE0YjEzOTFhNThmMzQ1CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzUwNmU3MGI4MDQ1MDQ1YzI5Yjk1MDhmMDRjMWIwZGE1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTIxLjgxMTk5OTk5OTk5OTk5OCwgLTEzOC45NTldLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF81ZDJjMTU5NDVlYTQ0ZGUxOTExOTZjNTc2NGVlNDc4ZiA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF81ZDJjMTU5NDVlYTQ0ZGUxOTExOTZjNTc2NGVlNDc4ZgogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8yYmIyMDUzY2IzMzg0OTlmYWI0YmYzMzdjZTRiNWM1YyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzczLjM2MSwgNTQuNzA3XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfNjNiNmQ0YjVhZWMxNDcwZmIyOTg0NzIxNmY0ZmMyNmEgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfNjNiNmQ0YjVhZWMxNDcwZmIyOTg0NzIxNmY0ZmMyNmEKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNTA1NTI0ZDE4MjM4NDE0ODhkNTQ1NGJlN2QwYzY4NmQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy4yOTAxNjY3LCAtMTE2LjQxMTVdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF8wOTgzMGQxNTM4YjY0YmRjOGM4ZDljMzUxNmRjYTA3MCA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF8wOTgzMGQxNTM4YjY0YmRjOGM4ZDljMzUxNmRjYTA3MAogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9hMWUyZmRmNTA5ZWM0Yzg0OTFlZGZlNjYwZTk5ZmQwZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjI0NSwgLTExNi4zNDZdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF8xMzY1YWY2MmFmYTQ0M2NjYjEyZDUwMmQxMGE3YjM1YyA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF8xMzY1YWY2MmFmYTQ0M2NjYjEyZDUwMmQxMGE3YjM1YwogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9jY2NjMjg0MmRjMjk0ZWVmODM3YTkwZmQ5NjQ0YTg2OCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjgzNSwgNzguMjMyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfNGU0YmVjMGJkMDY2NDE1OWJiN2Y4ODc3ZjA0ZGFhYjUgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfNGU0YmVjMGJkMDY2NDE1OWJiN2Y4ODc3ZjA0ZGFhYjUKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMjNjMTgxYTA3ZDc4NDZjM2E0ZDEwMmRjMTA0N2U0ZTYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS45NiwgNzkuMDQ2XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfNzA4M2NjMTE4YWI5NDhmZjgwMmQ3ZWRkNDgzYTllZWYgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfNzA4M2NjMTE4YWI5NDhmZjgwMmQ3ZWRkNDgzYTllZWYKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNThjMzE1YjZmNzliNGMxZWEwNzFkZDQyMDM2YzMyMTQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS45OSwgNzguOTg0XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfYTc1OWEzODExZTQwNDMxMmE4OGQ5NzA5OGMwZDllZWUgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfYTc1OWEzODExZTQwNDMxMmE4OGQ5NzA5OGMwZDllZWUKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZWNiODdhODQ4ZTNiNGM0Y2FkODJiMDVmY2M4YzIzMTMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS45NDM5OTk5OTk5OTk5OTYsIDc4Ljg0Nl0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwXzM1MmY0YTE5NDRmZjQ5ZDNhOTFiNzk3ZjNjNjRjN2U0ID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwXzM1MmY0YTE5NDRmZjQ5ZDNhOTFiNzk3ZjNjNjRjN2U0CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzNkZDZjOTU0NzA2ZDRmOGFiMDEwNDk4ZDdmZDFhNDMxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTAuMDU5LCA3OC45MDddLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF81MGU0MTY3MzM3ODc0ODFkOGYyMWMyNjEzY2FlYTMzYiA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF81MGU0MTY3MzM3ODc0ODFkOGYyMWMyNjEzY2FlYTMzYgogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl83ZTI0ZTdhNmQ4YWE0YTUwYTAxYTJmMDk1ZjM3ODUzYSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzYzLjcwNiwgMTI1LjMyMV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwX2Y2YWEwNjViMTQ2ODQyMTM5MWIxNzBiZGZkOGUyMmZjID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwX2Y2YWEwNjViMTQ2ODQyMTM5MWIxNzBiZGZkOGUyMmZjCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzAzYzkyMzAwY2VlNzRkOWNhZDM3NGI4YWMxMDk0YWZhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNzMuMzgsIDU0LjY2OV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwXzI0YWNjZWQ0NmI3OTRmN2ViYjdiYjk3N2NjZTI3M2Q3ID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwXzI0YWNjZWQ0NmI3OTRmN2ViYjdiYjk3N2NjZTI3M2Q3CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2NmNGEyN2M2NjVjZjRkNzg5ODI5OTk0NTkwOWUwMmM3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTAuMDQ2MDAwMDAwMDAwMDEsIDc4Ljk4M10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwXzZhYjZmYWMwMTc2ODRkNTU4MjlmZTVhMjU5ZjU3ODY0ID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwXzZhYjZmYWMwMTc2ODRkNTU4MjlmZTVhMjU5ZjU3ODY0CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzlhMzkwYzZkZDczNDRlOTA4ZThmYzY2MWY3NGI5M2UyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuODEzLCA0OC4wOTddLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF84ZTM3YTg0NTNhM2I0YTMwOTQ5MzZiOTIzOTZlN2VhNSA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF84ZTM3YTg0NTNhM2I0YTMwOTQ5MzZiOTIzOTZlN2VhNQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8yZjQzYjZlMGJjN2M0MTNjYmQ1NjRlM2FiMzkzYTcyOSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljk0Mzk5OTk5OTk5OTk5NiwgNzkuMDM4XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfZDg1ZTM1OGEzMDE5NGQ1ZmJhZTk5NjllZWUzNTc5MjYgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfZDg1ZTM1OGEzMDE5NGQ1ZmJhZTk5NjllZWUzNTc5MjYKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMTkwODZlMzEwOWExNGVhYzg0N2U2MGU3OTNhMmIzNDAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjEuOTM4MDAwMDAwMDAwMDAyLCAtMTM4Ljk2MV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwX2Y2YzZjODJhNzVmZjQ0ZDNhYjIyMTU3ZTZjMTFhODg1ID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwX2Y2YzZjODJhNzVmZjQ0ZDNhYjIyMTU3ZTZjMTFhODg1CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzU2ZjZhZWQ4YjQxMzQ0ZWU5NTQ5MzgzNWI5ZTI1MGFjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTAuMDA4LCA3OS4wMjNdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF80MDJlZTcyNzIyZjE0ZGFlYjk5ODBmZWVmN2ZkODc2NSA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF80MDJlZTcyNzIyZjE0ZGFlYjk5ODBmZWVmN2ZkODc2NQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8yNDMzZTY1ZmU5ZTE0OGEwYWZiNWQxYjBlZDViNDc0OCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljg2LCA3OC44NTddLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF9kNTFiZjg5MDFkOTM0MDQyOTFjMzBkNjQ4NWYwZDEwYiA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF9kNTFiZjg5MDFkOTM0MDQyOTFjMzBkNjQ4NWYwZDEwYgogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8xYmFjODg2NGM4MjM0OTRiYWFmNDc0ZGMxNDljNzk5MyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0yMS44NjQsIC0xMzguOTQyOTk5OTk5OTk5OThdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF84ZTk4ZDRiOTA3OTQ0OWI2OGRjNDk1NmZiZmYwYTUxZiA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF84ZTk4ZDRiOTA3OTQ0OWI2OGRjNDk1NmZiZmYwYTUxZgogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl84OTAxODAwY2ZmZWM0MWU5YTZkZGQ4ZmI1YzRiNTg1YSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzczLjM5MiwgNTQuNTU5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfYWUxNjk0NDA5YzEwNDE0NTkwNTgyZTk4MzU5NzZlNzggPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfYWUxNjk0NDA5YzEwNDE0NTkwNTgyZTk4MzU5NzZlNzgKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMTNhNTFmMzlmYWExNGFjNDgzNTg5ZmJhMmExYmFhYTMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjEuODQ2OTk5OTk5OTk5OTk4LCAtMTM4LjkwNl0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwXzJlYmZiMGZmYjJiODQzZmNhNjcxZTlkN2ZjYjBlNWMwID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwXzJlYmZiMGZmYjJiODQzZmNhNjcxZTlkN2ZjYjBlNWMwCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzIwZGQ0ZjhmZjJmNjQwMjc5NjI1ZmIxYjUxZWFkNTM4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTIxLjg0ODAwMDAwMDAwMDAwMywgLTEzOC45MTI5OTk5OTk5OTk5OF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwXzQ0NWI1NWE0YWI0OTQxZjlhNjM4MjlhODA1YTQxMTdmID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwXzQ0NWI1NWE0YWI0OTQxZjlhNjM4MjlhODA1YTQxMTdmCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2NhMTg0YTg5MmViZTRiZWM5NzhiYmFiZjYyYzEzNjFjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuODMsIDc4LjEyNV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwXzBkZjAxZGJmMTVlNzQ5YmNiMzQwYmM2YTM3ZWJhNzE3ID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwXzBkZjAxZGJmMTVlNzQ5YmNiMzQwYmM2YTM3ZWJhNzE3CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2FlM2UwMGU5MzBlNTQ3OTBhYTY0NGYwMDRhM2JkNzY5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTIxLjg5MywgLTEzOC45NjRdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF8yMmE2MWQyODE5NzQ0ZmMwYmQ4N2QyY2UxZTMyZjg2NyA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF8yMmE2MWQyODE5NzQ0ZmMwYmQ4N2QyY2UxZTMyZjg2NwogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl84YmI5YzY4NDBkZDU0MWI2ODE0YjNkOTE2MDRjNGFiZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzczLjM2Mzk5OTk5OTk5OTk5LCA1NC40NDVdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF83ZmQ3NzIzNDMwOWI0YWI2OTRlYTdmMjEyMWM3YmQxYSA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF83ZmQ3NzIzNDMwOWI0YWI2OTRlYTdmMjEyMWM3YmQxYQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl81MjNiNmJlZTY1OGU0MDg5OTljMmJhZTk4MWZkMjQ0ZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0yMS45MDMwMDAwMDAwMDAwMDIsIC0xMzkuMDA5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfZmU2MDI5N2I3NjJkNGZlZjlhNDA4ZGMyZDgzZjQ0ZDIgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfZmU2MDI5N2I3NjJkNGZlZjlhNDA4ZGMyZDgzZjQ0ZDIKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZDE3ZDQyNDJhODE4NDk2MmIwYjdhOWNiZjJjYTZiN2MgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjEuODUzLCAtMTM5LjAwNl0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwXzA4OWUzM2VmOWZhNDQzZDBiYmE4ZjAyMDM4YmJjYmZlID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwXzA4OWUzM2VmOWZhNDQzZDBiYmE4ZjAyMDM4YmJjYmZlCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzkyZTFmMWEzMzY0MDRiMGNiZjIwYjIwODhhNWVkMTg0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuODg4MDAwMDAwMDAwMDA1LCA3OC44MDE5OTk5OTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwX2YzNTIyMGIyMDc4ZTRhNTc4ZDcyYjA2MzA5NWUyNTQzID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwX2YzNTIyMGIyMDc4ZTRhNTc4ZDcyYjA2MzA5NWUyNTQzCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzMwZDM5ZjViMDAxMjQ2ODU4MGJkOTlhMzBmZTgyYjY2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTIyLjI3NiwgLTEzOC44MzZdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF9kNDBlNzVlODYxY2I0NzM5YmE3NDIxM2QwOTdmYWRlNSA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF9kNDBlNzVlODYxY2I0NzM5YmE3NDIxM2QwOTdmYWRlNQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9kNzNiYzljNTIwZTQ0OTZmYjE2ZDc5NjU0ZmRjZDFkMCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjMwMDUsIC0xMTYuNTM0MTY2NzAwMDAwMDFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF82Y2Y3MWYxNzAxNTY0ZWQ4ODY3ZDZhNDI1MGE4YjE0MCA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF82Y2Y3MWYxNzAxNTY0ZWQ4ODY3ZDZhNDI1MGE4YjE0MAogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl81OGY2YTFjNjg5NWU0MThlOTVkZTg3OGEwNDU1M2QyNyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjI3ODgzMzI5OTk5OTk5NSwgLTExNi4zNjg2NjY3MDAwMDAwMl0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwX2Q1NDM2N2NkYmM1NzRlMTBiMGU1YjE0NTVmZGI3ZTU3ID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwX2Q1NDM2N2NkYmM1NzRlMTBiMGU1YjE0NTVmZGI3ZTU3CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2ZlYjc0ZWUzNTgwZTRiYWRhNDRlNjIyOTMyM2FmNGFjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuMjU1ODMzMywgLTExNi4zMTE4MzMyOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwXzY2MDg4ZjFkM2NkNDQwYzY5YjkyZDZkZDg5ZDQ2NDQ3ID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwXzY2MDg4ZjFkM2NkNDQwYzY5YjkyZDZkZDg5ZDQ2NDQ3CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2E5Mjg1MTFjOGIyMjQyZTZiZmM1NGRiOGNkM2FjNzhhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNjguOTEzLCA3NS44OTldLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF85MTM5OGE1ZDI3OTI0NWY5ODczNGU3OGQ1Y2U1OWEzZiA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF85MTM5OGE1ZDI3OTI0NWY5ODczNGU3OGQ1Y2U1OWEzZgogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl82NmU0ZTMyZGQ0MjQ0OGZjYjU2ZWM2ZmZmZjYzZTFjMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljk3MiwgNzguOTY4XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfMmUzNzYxZDczNDRiNDRjNzgzMjczOTQwY2NiOGExMzMgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfMmUzNzYxZDczNDRiNDRjNzgzMjczOTQwY2NiOGExMzMKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYWEzYjAwMjgwMmEzNGQ4YmFhYzEwOTdmYTI3YjM1NDcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS43NjM5OTk5OTk5OTk5OTYsIDc4LjA4OV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwX2I3YjhkNWYxZTVkYTQxOWI5ZDZhYjAyMTQ1YjZiYjU1ID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwX2I3YjhkNWYxZTVkYTQxOWI5ZDZhYjAyMTQ1YjZiYjU1CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzY2ZTllYWQ3YTkyMDQ5NDJhM2MwNGZjYjU5ZmNmZmFhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuODQxLCA3OC4xNzM5OTk5OTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwX2M0ZjZiZTA1ODA1MzQwYjViMzdjMmU3ZWYzYzcyZjAzID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwX2M0ZjZiZTA1ODA1MzQwYjViMzdjMmU3ZWYzYzcyZjAzCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzZjODkyNzg3MGFlZTQzZTY4OTk5YmQyZGUyMzMxMTk4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuNzMzOTk5OTk5OTk5OTk1LCA3OC4wNzRdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF8xZTI4ODlhYmIxNmE0YzBhOTA2NTNhMzA3OGU5NDg1NiA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF8xZTI4ODlhYmIxNmE0YzBhOTA2NTNhMzA3OGU5NDg1NgogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8xMDFhNzViZjdkZjk0ZDI1YjA0ZTQ5ZTExYTM5YjU2NiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzYzLjE0MywgNjMuMzkxOTk5OTk5OTk5OTk2XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfZDNjZjZjMWQ5ZjEyNDEyYjgzNzIwNTFlN2M2MDVmZDYgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfZDNjZjZjMWQ5ZjEyNDEyYjgzNzIwNTFlN2M2MDVmZDYKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNzdjMTBlNDY1MmNlNDQ4YjliN2M2ODc4MjE3MjhkMGYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS45NDY5OTk5OTk5OTk5OTYsIDc4Ljc5ODk5OTk5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfZDM0YzI1MjY4NjE2NDcwOGFkYTI4OGE0N2JlNDc4NTYgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfZDM0YzI1MjY4NjE2NDcwOGFkYTI4OGE0N2JlNDc4NTYKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMjJkNzAwNWE3ZDZhNDhmYmI0NDFkMDhjYWMyMzM3OTggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS43MjksIDc4LjFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF9hNmM2ZGI1MTUxZjE0YWI0YTZjYzk1ZTE5OGVlZjYzOSA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF9hNmM2ZGI1MTUxZjE0YWI0YTZjYzk1ZTE5OGVlZjYzOQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl83MGZmN2UyZmFjNDc0ZjExOTU0OTFjOTU1NDdkMjg5NCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0yMi4wMjMwMDAwMDAwMDAwMDMsIC0xMzguODczXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfZmY2MDNhMTc4NjVkNDdiOGFmZmZkMWZlNDYzZjdiMmEgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfZmY2MDNhMTc4NjVkNDdiOGFmZmZkMWZlNDYzZjdiMmEKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfN2Q2MDI0NzIwYTZiNGQ3OGEyMjZmYjk3ZGYyYWQyMDcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs2OC4yMDUsIDUzLjY1NjAwMDAwMDAwMDAwNl0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwXzc0ZmJiZTkwMGE1ZDQ1MjQ5MDJmOWNjNGIzMjQyNzk2ID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwXzc0ZmJiZTkwMGE1ZDQ1MjQ5MDJmOWNjNGIzMjQyNzk2CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzBlYTEyOGRiNTZkNjQzZjU5NjM5YmUzMDZmYmNmY2Q4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDEuNTY2LCA4OC43NjZdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF8wYThhODkxODVjYTA0NTM1OWE3OGUyMmQxNzAxZWUwNyA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF8wYThhODkxODVjYTA0NTM1OWE3OGUyMmQxNzAxZWUwNwogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8wNTU5NzAwNGE5MzQ0YWZiOTY2YTg4YmVkMjFlZDU4ZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUwLjA2NiwgNzkuMDM2XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfMTEzOTJhZTBmMTA0NGY1ZmIyZDI2ZGE5ZDIxM2YyZDMgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfMTEzOTJhZTBmMTA0NGY1ZmIyZDI2ZGE5ZDIxM2YyZDMKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZTUyYTllNjdjYjFiNDE2MTgxZGVkMGQwMzcxYjY2NzcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS44MzgsIDc4LjIxOF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwX2JiMDhiNzhlNjg5OTRlYjRhMDkyY2FiY2IyZTI4ZjNiID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwX2JiMDhiNzhlNjg5OTRlYjRhMDkyY2FiY2IyZTI4ZjNiCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2Q4MDk4MDFkYTBjYTRiYWM5ODJlMjc4MDJjNGU0Yjk1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTM4OTk5OTk5OTk5OTksIDc4LjgyMzAwMDAwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfZDY1ODAxMWM1NmYwNGE5YWEzMDBmMGFlMTAwMDAxNWUgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfZDY1ODAxMWM1NmYwNGE5YWEzMDBmMGFlMTAwMDAxNWUKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMzRhOWJhMDhlZjg4NGUxN2JhMDIzMDIwMzFiYjkwODIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjEuODIyLCAtMTM5LjAyOV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwXzFjZWQ2NWM0OGIyMzRjZTFiOGU0Mjg5ZmM4MzA5Nzk5ID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwXzFjZWQ2NWM0OGIyMzRjZTFiOGU0Mjg5ZmM4MzA5Nzk5CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzhlM2Q5OTBmMjc2ZjRjNjRhY2ViYTkwODFjZGU3NDhjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTIxLjg2Njk5OTk5OTk5OTk5NywgLTEzOS4wNzJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF9iZjhiOWUyNzc2NjM0NjU5ODYxOGFhMWEyOGIwYjQ0NSA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF9iZjhiOWUyNzc2NjM0NjU5ODYxOGFhMWEyOGIwYjQ0NQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl82NGYyMjNhNmE3ZTc0OWI0ODlhOTg4ZjBkZjE3ZTlhYSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0yMi4yNDQsIC0xMzguODM2XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfZTg1Mzk3MDI4MDgwNDk5ODg4ZjZkNzU4NDlmMzhlYWUgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfZTg1Mzk3MDI4MDgwNDk5ODg4ZjZkNzU4NDlmMzhlYWUKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZjc1ZmVjMTljYzFhNDk0ZGE4ZTlmY2U4ZDAyMDBmZDkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjIuMjUyLCAtMTM4LjczNF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwX2ZlYzNjNTVhOTMwNDQxN2E4YzRlMDFkMmY3ZTBmMmUzID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwX2ZlYzNjNTVhOTMwNDQxN2E4YzRlMDFkMmY3ZTBmMmUzCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOS5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzVjNTg4ZWJhOWNmMTQ2OGY5Zjg3NDAzOWIxYTM4NTQzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTIyLjIxNSwgLTEzOC44NDFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgbGF0X2xuZ19wb3B1cF8yNDg2M2Q4ZjEyNjA0OTY0YWUzMTY0Zjk1NWE1M2U3MCA9IEwucG9wdXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxhdExuZ1BvcChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF0X2xuZ19wb3B1cF8yNDg2M2Q4ZjEyNjA0OTY0YWUzMTY0Zjk1NWE1M2U3MAogICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGF0TG5nKGUubGF0bG5nKQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudCgiTGF0aXR1ZGU6ICIgKyBlLmxhdGxuZy5sYXQudG9GaXhlZCg0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TG9uZ2l0dWRlOiAiICsgZS5sYXRsbmcubG5nLnRvRml4ZWQoNCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT24obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXBfNjBjY2VlMjllZWMxNDY1ZDkxOTBlNDQzYTdkNzc0YTkub24oJ2NsaWNrJywgbGF0TG5nUG9wKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9lY2M5MjBkZjVlM2M0NGI5YTgwYzNhZmU3NTU2ZGQyOSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0yMi4yNTgwMDAwMDAwMDAwMDMsIC0xMzguODA1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfNzNlMzg1NDAxNTEyNDI3Njk0YmMwZGJkZmE3MDlhODEgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfNzNlMzg1NDAxNTEyNDI3Njk0YmMwZGJkZmE3MDlhODEKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZmM2OTMxYmI5M2E2NGE5YjhjMTNmMDRkZTgxYzNkM2MgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjIuMjU2LCAtMTM4Ljc5Mzk5OTk5OTk5OTk4XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIGxhdF9sbmdfcG9wdXBfMjM2Yjg0YjEwZDBkNDIzMzk2ZGMzNTFmYWYxOGEwNWMgPSBMLnBvcHVwKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXRMbmdQb3AoZSkgewogICAgICAgICAgICAgICAgICAgIGxhdF9sbmdfcG9wdXBfMjM2Yjg0YjEwZDBkNDIzMzk2ZGMzNTFmYWYxOGEwNWMKICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhdExuZyhlLmxhdGxuZykKICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQoIkxhdGl0dWRlOiAiICsgZS5sYXRsbmcubGF0LnRvRml4ZWQoNCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkxvbmdpdHVkZTogIiArIGUubGF0bG5nLmxuZy50b0ZpeGVkKDQpKQogICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9uKG1hcF82MGNjZWUyOWVlYzE0NjVkOTE5MGU0NDNhN2Q3NzRhOSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwXzYwY2NlZTI5ZWVjMTQ2NWQ5MTkwZTQ0M2E3ZDc3NGE5Lm9uKCdjbGljaycsIGxhdExuZ1BvcCk7CiAgICAgICAgICAgIAo8L3NjcmlwdD4=\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x11059e710>"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"map_Nuke"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# At first, it looks as if there are only a few nuclear explosions, but if I zoom in on one of these markers, i see that one marker is actually many closer together."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Furthermore, i have added a popup with the magnitude and year. "
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [],
"source": [
"map_Nuke2 = folium.Map(location=[37.2959,-116.4221], width=510, height=510,\n",
" zoom_start=11, max_zoom=15)\n",
"\n",
"for i in range (len(pysqldf(Nuke_Query)['latitude'])):\n",
" # Generate a caption using HTML, embedded within an iframe inside the popup\n",
" html=\"\"\"\n",
" <h3> Magnitude: <font color=\"red\">{}</font></h3>\n",
" <h3> Date: <font color=\"red\">{}</font></h3>\n",
" \n",
" \"\"\".format(pysqldf(Nuke_Query)['magnitude'][i], pysqldf(Nuke_Query)['occurred_on'][i])\n",
" iframe = folium.IFrame(html=html, width=260, height=144)\n",
" \n",
" popup = folium.Popup(iframe, max_width=800)\n",
" folium.Marker(location = [pysqldf(Nuke_Query)['latitude'][i],\n",
" pysqldf(Nuke_Query)['longitude'][i]], popup=popup,).add_to(map_Nuke2) \n",
"# popup = folium.LatLngPopup().add_to(map_Nuke2)\n"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgCiAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgTF9OT19UT1VDSCA9IGZhbHNlOwogICAgICAgICAgICBMX0RJU0FCTEVfM0QgPSBmYWxzZTsKICAgICAgICA8L3NjcmlwdD4KICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjEyLjQubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9qcy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMi4wL2Nzcy9ib290c3RyYXAubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9mb250LWF3ZXNvbWUvNC42LjMvY3NzL2ZvbnQtYXdlc29tZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLzIuMC4yL2xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2Nkbi5naXRoYWNrLmNvbS9weXRob24tdmlzdWFsaXphdGlvbi9mb2xpdW0vbWFzdGVyL2ZvbGl1bS90ZW1wbGF0ZXMvbGVhZmxldC5hd2Vzb21lLnJvdGF0ZS5jc3MiLz4KICAgIDxzdHlsZT5odG1sLCBib2R5IHt3aWR0aDogMTAwJTtoZWlnaHQ6IDEwMCU7bWFyZ2luOiAwO3BhZGRpbmc6IDA7fTwvc3R5bGU+CiAgICA8c3R5bGU+I21hcCB7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7cmlnaHQ6MDtsZWZ0OjA7fTwvc3R5bGU+CiAgICAKICAgICAgICAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwKICAgICAgICAgICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgICAgICAgICAgPHN0eWxlPgogICAgICAgICAgICAgICAgI21hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCB7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgIHdpZHRoOiA1MTAuMHB4OwogICAgICAgICAgICAgICAgICAgIGhlaWdodDogNTEwLjBweDsKICAgICAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgICAgIHRvcDogMC4wJTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgPC9zdHlsZT4KICAgICAgICAKPC9oZWFkPgo8Ym9keT4gICAgCiAgICAKICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9saXVtLW1hcCIgaWQ9Im1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCIgPjwvZGl2PgogICAgICAgIAo8L2JvZHk+CjxzY3JpcHQ+ICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzAgPSBMLm1hcCgKICAgICAgICAgICAgICAgICJtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzAiLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNlbnRlcjogWzM3LjI5NTksIC0xMTYuNDIyMV0sCiAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NywKICAgICAgICAgICAgICAgICAgICB6b29tOiAxMSwKICAgICAgICAgICAgICAgICAgICB6b29tQ29udHJvbDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBwcmVmZXJDYW52YXM6IGZhbHNlLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwoKICAgICAgICAgICAgCgogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyX2VhZDg1YjAwNjI2MTQ1NWViZmViOGFjNjMzODMxZGMxID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAiaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmciLAogICAgICAgICAgICAgICAgeyJhdHRyaWJ1dGlvbiI6ICJEYXRhIGJ5IFx1MDAyNmNvcHk7IFx1MDAzY2EgaHJlZj1cImh0dHA6Ly9vcGVuc3RyZWV0bWFwLm9yZ1wiXHUwMDNlT3BlblN0cmVldE1hcFx1MDAzYy9hXHUwMDNlLCB1bmRlciBcdTAwM2NhIGhyZWY9XCJodHRwOi8vd3d3Lm9wZW5zdHJlZXRtYXAub3JnL2NvcHlyaWdodFwiXHUwMDNlT0RiTFx1MDAzYy9hXHUwMDNlLiIsICJkZXRlY3RSZXRpbmEiOiBmYWxzZSwgIm1heE5hdGl2ZVpvb20iOiAxNSwgIm1heFpvb20iOiAxNSwgIm1pblpvb20iOiAwLCAibm9XcmFwIjogZmFsc2UsICJvcGFjaXR5IjogMSwgInN1YmRvbWFpbnMiOiAiYWJjIiwgInRtcyI6IGZhbHNlfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9hMzAzMDY4M2JjNWM0MGZjOWUxNmU5MmQwYjAzYTg5ZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzcwLjc3OSwgNTQuMTc3XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF81ZTY4MmFiNzFmNWQ0ZDExYjlkZjQ2YmJmMjcyN2QzNiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfNjkzNTM2NzA5MGYwNGZkNjk0MGFkMjMyNWIyN2Q0OTMgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05pNDVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UY3pMVEV3TFRJM0lEWTZOVGs2TlRjOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQWdDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzVlNjgyYWI3MWY1ZDRkMTFiOWRmNDZiYmYyNzI3ZDM2LnNldENvbnRlbnQoaV9mcmFtZV82OTM1MzY3MDkwZjA0ZmQ2OTQwYWQyMzI1YjI3ZDQ5Myk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9hMzAzMDY4M2JjNWM0MGZjOWUxNmU5MmQwYjAzYTg5ZC5iaW5kUG9wdXAocG9wdXBfNWU2ODJhYjcxZjVkNGQxMWI5ZGY0NmJiZjI3MjdkMzYpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMmVjZTZmYmQ4NTMyNDY5M2EwOTUyNGQzNWE4ZTM0ZmIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs3My4zMDE5OTk5OTk5OTk5OSwgNTUuMTYxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF82YzRkNWFkMjQ1ODI0N2NjYjViNzY0ZTY2NWE1ZGJlMSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfNTExYjc3OTM4NmQ0NDQ1NDg5MmZhNWVkYjMyZWQ3NWYgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05pNDRQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UY3pMVEE1TFRFeUlEWTZOVGs2TlRROEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQWdDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzZjNGQ1YWQyNDU4MjQ3Y2NiNWI3NjRlNjY1YTVkYmUxLnNldENvbnRlbnQoaV9mcmFtZV81MTFiNzc5Mzg2ZDQ0NDU0ODkyZmE1ZWRiMzJlZDc1Zik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8yZWNlNmZiZDg1MzI0NjkzYTA5NTI0ZDM1YThlMzRmYi5iaW5kUG9wdXAocG9wdXBfNmM0ZDVhZDI0NTgyNDdjY2I1Yjc2NGU2NjVhNWRiZTEpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZDg2ZjE1ZjFjNDY5NDE5M2I1MTFjYmJkMDIzNDJhZjIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs3MC44MTcsIDU0LjA2M10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfOTg1ZDk2MWU3NzA0NDczZGFjM2Q3NmU3MTYwMDY5ZjcgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzZjMDk3ZTlmNDE5MzQ1ZTNiOTE3Njg3NDhmZGNjZmJkID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOaTQzUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGMwTFRFeExUQXlJRFE2TlRrNk5UYzhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF85ODVkOTYxZTc3MDQ0NzNkYWMzZDc2ZTcxNjAwNjlmNy5zZXRDb250ZW50KGlfZnJhbWVfNmMwOTdlOWY0MTkzNDVlM2I5MTc2ODc0OGZkY2NmYmQpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZDg2ZjE1ZjFjNDY5NDE5M2I1MTFjYmJkMDIzNDJhZjIuYmluZFBvcHVwKHBvcHVwXzk4NWQ5NjFlNzcwNDQ3M2RhYzNkNzZlNzE2MDA2OWY3KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzA3YmYxZmE2MjYxYzQ0ZTU5MWIxZGRlZWUwMzc1ZDg1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNzAuODQzLCA1My42OV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZmRjY2M5YjM0ZTA0NDI4ZWFkNTliOWZkMTBiZjRkMmIgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzZlZjRmNGViNjA4MDRkNzM5ZTdlNjRhYzJkY2NjMGYwID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOaTQzUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGMxTFRFd0xURTRJRGc2TlRrNk5UWThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9mZGNjYzliMzRlMDQ0MjhlYWQ1OWI5ZmQxMGJmNGQyYi5zZXRDb250ZW50KGlfZnJhbWVfNmVmNGY0ZWI2MDgwNGQ3MzllN2U2NGFjMmRjY2MwZjApOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMDdiZjFmYTYyNjFjNDRlNTkxYjFkZGVlZTAzNzVkODUuYmluZFBvcHVwKHBvcHVwX2ZkY2NjOWIzNGUwNDQyOGVhZDU5YjlmZDEwYmY0ZDJiKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2ZiZWM0ODZlZGU3ZTRhZDVhMjU4OGY1NDljNTZiZGQxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNzMuMzUxLCA1NS4wNzhdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2Q0OGMzMDhhYjg1NTRiZjE4ZjM0MjgyNWY1OWY1OTMyID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9kYTVmMzZmODNmMDk0OTk2YTkwNjZhOGFiZGZiNmE5NiA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0MVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RjMUxURXdMVEl4SURFeE9qVTVPalUzUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ0lBb2dJQ0FnIiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZDQ4YzMwOGFiODU1NGJmMThmMzQyODI1ZjU5ZjU5MzIuc2V0Q29udGVudChpX2ZyYW1lX2RhNWYzNmY4M2YwOTQ5OTZhOTA2NmE4YWJkZmI2YTk2KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2ZiZWM0ODZlZGU3ZTRhZDVhMjU4OGY1NDljNTZiZGQxLmJpbmRQb3B1cChwb3B1cF9kNDhjMzA4YWI4NTU0YmYxOGYzNDI4MjVmNTlmNTkzMikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl83MmU3YzkyODQ5ZTc0YjFjYThhMDY0OGY3MjNjZDIyMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQxLjYwNCwgODguODEyOTk5OTk5OTk5OTldLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2EzNDQ2Mzg2M2RjNzQ4YTk4NmFiNzRhMzNhZGY0YWFkID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9mOGRhNjkxZWZiYmQ0MzAyOTQ2NDdkOTgwNjE1MWY5YiA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0MVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RreUxUQTFMVEl4SURRNk5UazZOVGc4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYTM0NDYzODYzZGM3NDhhOTg2YWI3NGEzM2FkZjRhYWQuc2V0Q29udGVudChpX2ZyYW1lX2Y4ZGE2OTFlZmJiZDQzMDI5NDY0N2Q5ODA2MTUxZjliKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzcyZTdjOTI4NDllNzRiMWNhOGEwNjQ4ZjcyM2NkMjIxLmJpbmRQb3B1cChwb3B1cF9hMzQ0NjM4NjNkYzc0OGE5ODZhYjc0YTMzYWRmNGFhZCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl80NzBiZGU5NDdhY2U0NmE3OWI1ZTdlM2UwMTJiNGQwOSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzczLjM2NiwgNTUuMDkzOTk5OTk5OTk5OTk0XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF80MzhiYTNkM2FjMWI0YWZiYjc2NDZmN2EzM2M0ZTY3NCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfNDU2MTUzODYxOGRjNDUzMDgwMDQ4ZjcyM2FkMzM4MTMgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05pNDBQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UYzBMVEE0TFRJNUlEazZOVGs2TlRZOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQWdDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzQzOGJhM2QzYWMxYjRhZmJiNzY0NmY3YTMzYzRlNjc0LnNldENvbnRlbnQoaV9mcmFtZV80NTYxNTM4NjE4ZGM0NTMwODAwNDhmNzIzYWQzMzgxMyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl80NzBiZGU5NDdhY2U0NmE3OWI1ZTdlM2UwMTJiNGQwOS5iaW5kUG9wdXAocG9wdXBfNDM4YmEzZDNhYzFiNGFmYmI3NjQ2ZjdhMzNjNGU2NzQpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMzhiZjg0Zjc4Mzg1NGUwNTlkZDg0NjIyYmUzZWNkODUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs3My4zNjksIDU0LjY0MTAwMDAwMDAwMDAwNV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNjI4ZjQ1Mjc2YjY4NDJmNDhkZTkyY2E5NTdiMGE2NGIgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2M1ZWI0NDhhMjI3MjRiNTBhMTQ2MzcyZDQ2YjUyMzFmID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOaTQwUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGMxTFRBNExUSXpJRGc2TlRrNk5UZzhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF82MjhmNDUyNzZiNjg0MmY0OGRlOTJjYTk1N2IwYTY0Yi5zZXRDb250ZW50KGlfZnJhbWVfYzVlYjQ0OGEyMjcyNGI1MGExNDYzNzJkNDZiNTIzMWYpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMzhiZjg0Zjc4Mzg1NGUwNTlkZDg0NjIyYmUzZWNkODUuYmluZFBvcHVwKHBvcHVwXzYyOGY0NTI3NmI2ODQyZjQ4ZGU5MmNhOTU3YjBhNjRiKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2NhNDg1ZmZmZGZkZDQyN2Y4YjQwNmM1Y2Y1YzUzMjNiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTg2MDAwMDAwMDAwMDA0LCA3OC44NTMwMDAwMDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMjdlNmI1NTNlZmViNDJjOWJhYTUyMjEzYTBmMzQ5NDYgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzg5ZTYwMjQxZTdhZDQ2OWJhNWQ0ODJhMmQxNzc5M2RhID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOaTR6UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGN6TFRBM0xUSXpJREU2TWpJNk5UZzhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF8yN2U2YjU1M2VmZWI0MmM5YmFhNTIyMTNhMGYzNDk0Ni5zZXRDb250ZW50KGlfZnJhbWVfODllNjAyNDFlN2FkNDY5YmE1ZDQ4MmEyZDE3NzkzZGEpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfY2E0ODVmZmZkZmRkNDI3ZjhiNDA2YzVjZjVjNTMyM2IuYmluZFBvcHVwKHBvcHVwXzI3ZTZiNTUzZWZlYjQyYzliYWE1MjIxM2EwZjM0OTQ2KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2ExOGE1ZTRkM2EzYTQzMmVhNTFlMzc1ZWZiN2I2YjhiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTE4LCA3OC45MTVdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2I2NmI1YmU3YmQyNTQyNWE5NGY3MTE0ZTFhMzVlYTJkID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV81YjE2ODBkZjU0YzE0N2VhYjliYjAwYzg2NjVjYjdmYyA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0elBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RjNUxUQTJMVEl6SURJNk5UWTZOVGc4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYjY2YjViZTdiZDI1NDI1YTk0ZjcxMTRlMWEzNWVhMmQuc2V0Q29udGVudChpX2ZyYW1lXzViMTY4MGRmNTRjMTQ3ZWFiOWJiMDBjODY2NWNiN2ZjKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2ExOGE1ZTRkM2EzYTQzMmVhNTFlMzc1ZWZiN2I2YjhiLmJpbmRQb3B1cChwb3B1cF9iNjZiNWJlN2JkMjU0MjVhOTRmNzExNGUxYTM1ZWEyZCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8zZGUzZGQ3MzYwNzU0NWE3ODM5NjA5NDUwOGM3ZjhmNCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQxLjMzMjQsIDEyOS4wMjk3XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF85NWZmMDAyMWE3ZDc0OTAyOTNhMTM2OWQwNGIwMWFjOCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfMzkwYTk3M2RjZGY2NGM4ZTk2NmY0ZTkwZjJlOWIxYzIgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05pNHpQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eU1ERTNMVEE1TFRBeklETTZNekE2TURJOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQWdDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzk1ZmYwMDIxYTdkNzQ5MDI5M2ExMzY5ZDA0YjAxYWM4LnNldENvbnRlbnQoaV9mcmFtZV8zOTBhOTczZGNkZjY0YzhlOTY2ZjRlOTBmMmU5YjFjMik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8zZGUzZGQ3MzYwNzU0NWE3ODM5NjA5NDUwOGM3ZjhmNC5iaW5kUG9wdXAocG9wdXBfOTVmZjAwMjFhN2Q3NDkwMjkzYTEzNjlkMDRiMDFhYzgpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZjEzNjg4ZGU3MDY4NGM3Y2JjYjQwODllMjE1Yjk2NTQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS45NzYwMDAwMDAwMDAwMDYsIDc4Ljg4OV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNmRhMjg0NWYwMDQ2NDI1MDhkNGYyOTg0NTU3YTNhMzEgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzkyYzg1OTk0YmJjODRhOWRhMjlhMjgwMTI5MDY0MDk3ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOaTR5UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGd3TFRBNUxURTBJREk2TkRJNk16azhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF82ZGEyODQ1ZjAwNDY0MjUwOGQ0ZjI5ODQ1NTdhM2EzMS5zZXRDb250ZW50KGlfZnJhbWVfOTJjODU5OTRiYmM4NGE5ZGEyOWEyODAxMjkwNjQwOTcpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZjEzNjg4ZGU3MDY4NGM3Y2JjYjQwODllMjE1Yjk2NTQuYmluZFBvcHVwKHBvcHVwXzZkYTI4NDVmMDA0NjQyNTA4ZDRmMjk4NDU1N2EzYTMxKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzY2ZTYzYjMzNjYzMjQzM2U5MmY4MmQ1N2U2NGQ0MzZlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTA5LCA3OC44NzNdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2JmYmMwNTI5YzFjOTQ3NzI4ZGIyMmYyYzY2Y2UyNWY3ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV80MDIxYzYyN2Y1NDU0ZWIzOWUyZTkyMDRhN2MzY2UxZiA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0eVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RneExURXlMVEkzSURNNk5ETTZNVFE4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYmZiYzA1MjljMWM5NDc3MjhkYjIyZjJjNjZjZTI1Zjcuc2V0Q29udGVudChpX2ZyYW1lXzQwMjFjNjI3ZjU0NTRlYjM5ZTJlOTIwNGE3YzNjZTFmKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzY2ZTYzYjMzNjYzMjQzM2U5MmY4MmQ1N2U2NGQ0MzZlLmJpbmRQb3B1cChwb3B1cF9iZmJjMDUyOWMxYzk0NzcyOGRiMjJmMmM2NmNlMjVmNykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9jZDdhZDQ2OTM2NjM0YjFmODU0NWJkZjc5MWQ2YmE3ZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljg5MTAwMDAwMDAwMDAwNSwgNzguOTYzMDAwMDAwMDAwMDFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2VlNGExYTAzMTE2NTRhNTA4YmFmZmFmNWRjY2QwNTk0ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9mY2JhNzAxOGNmNjg0NDA2OTE1M2E5MjNhYmJiMjY3NCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0eVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnMExUQTNMVEUwSURFNk1EazZNVEU4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZWU0YTFhMDMxMTY1NGE1MDhiYWZmYWY1ZGNjZDA1OTQuc2V0Q29udGVudChpX2ZyYW1lX2ZjYmE3MDE4Y2Y2ODQ0MDY5MTUzYTkyM2FiYmIyNjc0KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2NkN2FkNDY5MzY2MzRiMWY4NTQ1YmRmNzkxZDZiYTdmLmJpbmRQb3B1cChwb3B1cF9lZTRhMWEwMzExNjU0YTUwOGJhZmZhZjVkY2NkMDU5NCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8wZDdlNzQ3ODBjZjg0NWRiODFmY2E3YjcxMWNjYmUzMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljk0OSwgNzguODM0XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF80ZTc1NmVjODg1MGU0ZTdjOTA3MmQ2MTU1YTk5MTNlZiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfYWExOGIxZWE1MDVjNGFmZWFiYzUzZDUxM2M2NGJmY2IgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05pNHlQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZzBMVEV3TFRJM0lERTZOVEE2TVRFOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQWdDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzRlNzU2ZWM4ODUwZTRlN2M5MDcyZDYxNTVhOTkxM2VmLnNldENvbnRlbnQoaV9mcmFtZV9hYTE4YjFlYTUwNWM0YWZlYWJjNTNkNTEzYzY0YmZjYik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8wZDdlNzQ3ODBjZjg0NWRiODFmY2E3YjcxMWNjYmUzMS5iaW5kUG9wdXAocG9wdXBfNGU3NTZlYzg4NTBlNGU3YzkwNzJkNjE1NWE5OTEzZWYpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfODVjNWJkNjZkMmEzNDZjNWI5Yzk0YTU3ZDY5NzRiYjcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS45MjgwMDAwMDAwMDAwMDQsIDc4LjgyOV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYmQxZDliZmQ5YzA4NDA0YWIyOGMzYzNhYWQyZjU4YjMgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzljMDVjZDBjYmNiMjRhYmRiNWRkNmNjZDY5MTM4YjJjID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOaTR5UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGczTFRBMExUQXpJREU2TVRjNk1EZzhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9iZDFkOWJmZDljMDg0MDRhYjI4YzNjM2FhZDJmNThiMy5zZXRDb250ZW50KGlfZnJhbWVfOWMwNWNkMGNiY2IyNGFiZGI1ZGQ2Y2NkNjkxMzhiMmMpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfODVjNWJkNjZkMmEzNDZjNWI5Yzk0YTU3ZDY5NzRiYjcuYmluZFBvcHVwKHBvcHVwX2JkMWQ5YmZkOWMwODQwNGFiMjhjM2MzYWFkMmY1OGIzKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2QxMDgzMTE0ZWZjOTRhMDU5NzVmZjVmMmZmN2RkMWI1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDEuNTgzOTk5OTk5OTk5OTk2LCA4OC43MzcwMDAwMDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYzgyYjAyOGYzMDc1NDU5ZmFiNWQ2NjM4NDM1NjEzOTIgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzZlZWU5NmI0NzEzNDRjMWI4OTYxMjFlNmJiY2U1YjFjID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOaTR5UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGczTFRBMkxUQTFJRFE2TlRrNk5UZzhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9jODJiMDI4ZjMwNzU0NTlmYWI1ZDY2Mzg0MzU2MTM5Mi5zZXRDb250ZW50KGlfZnJhbWVfNmVlZTk2YjQ3MTM0NGMxYjg5NjEyMWU2YmJjZTViMWMpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZDEwODMxMTRlZmM5NGEwNTk3NWZmNWYyZmY3ZGQxYjUuYmluZFBvcHVwKHBvcHVwX2M4MmIwMjhmMzA3NTQ1OWZhYjVkNjYzODQzNTYxMzkyKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzIxYWM3NTJkNTU1MTQxYjdiMWZiNTdkYWI3MjMxMjM2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDEuNTYzOTk5OTk5OTk5OTksIDg4Ljc3XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF82YTJmMTQwNjE1MzA0NWM4OGUyNmE5MWMxYmNkYTQzNSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfYTM2MTVmNDcyODQ4NGY4OGFkNDE5ODc4MzhhMGZjOTIgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05pNHlQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9Ua3dMVEE0TFRFMklEUTZOVGs2TlRnOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQWdDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzZhMmYxNDA2MTUzMDQ1Yzg4ZTI2YTkxYzFiY2RhNDM1LnNldENvbnRlbnQoaV9mcmFtZV9hMzYxNWY0NzI4NDg0Zjg4YWQ0MTk4NzgzOGEwZmM5Mik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8yMWFjNzUyZDU1NTE0MWI3YjFmYjU3ZGFiNzIzMTIzNi5iaW5kUG9wdXAocG9wdXBfNmEyZjE0MDYxNTMwNDVjODhlMjZhOTFjMWJjZGE0MzUpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNjdhYWUzMmZjNGQ0NGVkMDgwMjMyYmVhNDVjODg3MTQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS45MDEsIDc4Ljk1OV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYWU5YTRmNTJiODRjNDY4NzlmYjhmMTg3NDU4YTFhOWYgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzNjOGJjMjQ5ZDc1YjQ5ZjBiOTUzODc5MmI0OWVkY2NiID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOaTR4UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGM1TFRBNExUQTBJRE02TlRZNk5UYzhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9hZTlhNGY1MmI4NGM0Njg3OWZiOGYxODc0NThhMWE5Zi5zZXRDb250ZW50KGlfZnJhbWVfM2M4YmMyNDlkNzViNDlmMGI5NTM4NzkyYjQ5ZWRjY2IpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNjdhYWUzMmZjNGQ0NGVkMDgwMjMyYmVhNDVjODg3MTQuYmluZFBvcHVwKHBvcHVwX2FlOWE0ZjUyYjg0YzQ2ODc5ZmI4ZjE4NzQ1OGExYTlmKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzdiYjZkNWViZWUwZTQ1OGM5ZWZhZmJlZTk2MjY2NTg5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTcxMDAwMDAwMDAwMDA0LCA3OS4wMV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNzA1NTk1ZjExMjJkNDU5OTg4ZjQ1NzVmNjdkOGJjNjMgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzkwYzNiNGFjZGVkZjRiZDRhNjY0ODBiYWViZGE0MDdkID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOaTR4UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGM1TFRBNExURTRJREk2TlRFNk5UYzhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF83MDU1OTVmMTEyMmQ0NTk5ODhmNDU3NWY2N2Q4YmM2My5zZXRDb250ZW50KGlfZnJhbWVfOTBjM2I0YWNkZWRmNGJkNGE2NjQ4MGJhZWJkYTQwN2QpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfN2JiNmQ1ZWJlZTBlNDU4YzllZmFmYmVlOTYyNjY1ODkuYmluZFBvcHVwKHBvcHVwXzcwNTU5NWYxMTIyZDQ1OTk4OGY0NTc1ZjY3ZDhiYzYzKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzg0Zjg1MDhlOTUyZDQzZGFiZjkzMGY4NjczYjIyZmY4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTY0LCA3OC44MjddLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzFjN2I1MjI2OGUwOTQxOTBhNzVlYjc3NGViZTAwNTVlID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV84MGUyNzY3ZWQ0MTY0NjY2OGVjZjViZjAxYjdkZDMyMCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0eFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RjNUxURXlMVEl6SURRNk5UWTZOVGc4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMWM3YjUyMjY4ZTA5NDE5MGE3NWViNzc0ZWJlMDA1NWUuc2V0Q29udGVudChpX2ZyYW1lXzgwZTI3NjdlZDQxNjQ2NjY4ZWNmNWJmMDFiN2RkMzIwKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzg0Zjg1MDhlOTUyZDQzZGFiZjkzMGY4NjczYjIyZmY4LmJpbmRQb3B1cChwb3B1cF8xYzdiNTIyNjhlMDk0MTkwYTc1ZWI3NzRlYmUwMDU1ZSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9kZTM1NjNmZDgyOTI0ODJhYWFkMTVhNDI4YjNhY2EzMyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljg4ODk5OTk5OTk5OTk5NiwgNzguOTMxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF82NjM1NmU4MmI4NjU0MDFiYjVhN2Y2ODhkZWNiNjU4YyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfZDliNTFjOGY2ODVmNDVhZGE5MDY4MjE2MzFhMzJkMDYgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05pNHhQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZ3lMVEEwTFRJMUlETTZNak02TURVOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQWdDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzY2MzU2ZTgyYjg2NTQwMWJiNWE3ZjY4OGRlY2I2NThjLnNldENvbnRlbnQoaV9mcmFtZV9kOWI1MWM4ZjY4NWY0NWFkYTkwNjgyMTYzMWEzMmQwNik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9kZTM1NjNmZDgyOTI0ODJhYWFkMTVhNDI4YjNhY2EzMy5iaW5kUG9wdXAocG9wdXBfNjYzNTZlODJiODY1NDAxYmI1YTdmNjg4ZGVjYjY1OGMpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYmY1MWMwY2JlZWExNDg3Y2FkMmE4YTgxMTJhZGFjNTcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS45OTUsIDc4Ljg1NjAwMDAwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8zZDU2ZTZmY2Q3MTE0ZGY5ODE1ZGI2NTgxYTliNWM1ZiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfYzAxNWM5NTgyMTU2NDhkZTliNDA0NDViZjM4MDIyY2QgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05pNHhQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZ3lMVEEzTFRBMElERTZNVGM2TVRROEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQWdDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzNkNTZlNmZjZDcxMTRkZjk4MTVkYjY1ODFhOWI1YzVmLnNldENvbnRlbnQoaV9mcmFtZV9jMDE1Yzk1ODIxNTY0OGRlOWI0MDQ0NWJmMzgwMjJjZCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9iZjUxYzBjYmVlYTE0ODdjYWQyYThhODExMmFkYWM1Ny5iaW5kUG9wdXAocG9wdXBfM2Q1NmU2ZmNkNzExNGRmOTgxNWRiNjU4MWE5YjVjNWYpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfOGU2OGU5NzMyMDk1NDE2YmJjMDA1YjU1Nzg4NDFmMGIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS45MjgwMDAwMDAwMDAwMDQsIDc4Ljg2OV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMjI4NTA5M2NmYmVmNGU5NjhhZTdjMzA4NmI2MjJjOGYgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzNmMjQxNTNhZDliZDQ2MDk4M2JmOTE3MjAwZGU3NWZjID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOaTR4UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGd5TFRFeUxUQTFJRE02TXpjNk1UTThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF8yMjg1MDkzY2ZiZWY0ZTk2OGFlN2MzMDg2YjYyMmM4Zi5zZXRDb250ZW50KGlfZnJhbWVfM2YyNDE1M2FkOWJkNDYwOTgzYmY5MTcyMDBkZTc1ZmMpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfOGU2OGU5NzMyMDk1NDE2YmJjMDA1YjU1Nzg4NDFmMGIuYmluZFBvcHVwKHBvcHVwXzIyODUwOTNjZmJlZjRlOTY4YWU3YzMwODZiNjIyYzhmKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2EwZGU0NWIzYjhmZDRmMTNhN2QzMzMzNDA0NDEzOGYxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTA2MDAwMDAwMDAwMDA2LCA3OC45ODEwMDAwMDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZTc3YTA3NGQ4MjljNGFiZmJkNjIwMDkzY2I4ZGUxMjIgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzFhM2ZhZGNhOTliYTQ0MGM5YjMxODBkZTQxMTMxZWQ0ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOaTR4UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGd6TFRBMkxURXlJREk2TXpZNk5EUThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9lNzdhMDc0ZDgyOWM0YWJmYmQ2MjAwOTNjYjhkZTEyMi5zZXRDb250ZW50KGlfZnJhbWVfMWEzZmFkY2E5OWJhNDQwYzliMzE4MGRlNDExMzFlZDQpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfYTBkZTQ1YjNiOGZkNGYxM2E3ZDMzMzM0MDQ0MTM4ZjEuYmluZFBvcHVwKHBvcHVwX2U3N2EwNzRkODI5YzRhYmZiZDYyMDA5M2NiOGRlMTIyKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzdmODU5ZWM2NDA5ZTRjNzJhMmNkMzUzNmMyMDA0MjJlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTIxMDAwMDAwMDAwMDEsIDc4LjkwN10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfODcwYjg0Zjk4MDY4NDMwNWJmYmNmZTMyMWMwYWJmNTIgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2U0MzBlZDE5MDliMjQ4NWE4MjFmMzcyOWFmOTUyNThjID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOaTR4UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGd6TFRFd0xUSTJJREU2TlRVNk1EVThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF84NzBiODRmOTgwNjg0MzA1YmZiY2ZlMzIxYzBhYmY1Mi5zZXRDb250ZW50KGlfZnJhbWVfZTQzMGVkMTkwOWIyNDg1YTgyMWYzNzI5YWY5NTI1OGMpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfN2Y4NTllYzY0MDllNGM3MmEyY2QzNTM2YzIwMDQyMmUuYmluZFBvcHVwKHBvcHVwXzg3MGI4NGY5ODA2ODQzMDViZmJjZmUzMjFjMGFiZjUyKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzVhZmY1MjI2YzkwODQ4MGU4ZDIwMjY5NWVkOTk5YzdiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTU3LCA3OC44NjJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2ZkNTAxMzE0Y2FjMTRkNjRiYmE4MmU1ZThkN2M4ZjcyID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV81ZWZhMTU5MWRmNzQ0OGI1Yjc3ZTI5NTJkNjc5NWY0MiA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0eFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnMExURXlMVEUySURNNk5UVTZNRE04TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZmQ1MDEzMTRjYWMxNGQ2NGJiYTgyZTVlOGQ3YzhmNzIuc2V0Q29udGVudChpX2ZyYW1lXzVlZmExNTkxZGY3NDQ4YjViNzdlMjk1MmQ2Nzk1ZjQyKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzVhZmY1MjI2YzkwODQ4MGU4ZDIwMjY5NWVkOTk5YzdiLmJpbmRQb3B1cChwb3B1cF9mZDUwMTMxNGNhYzE0ZDY0YmJhODJlNWU4ZDdjOGY3MikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl84ZjRiYTJhZmVjOTE0MWRiOWFhMzk2YTM1NzIwYTY0ZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjkxMzAwMDAwMDAwMDAwNCwgNzguNzM1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8zMTlkN2E4MTA4ZjU0MDNlOGE0NWRkNDI1ZTQxZTFjZiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfNDI0ZmJlZWU2MjhkNDE5YjhlMTFiYzA3N2UyOTg0NGMgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05pNHhQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZzNMVEEyTFRJd0lEQTZOVE02TURVOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQWdDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzMxOWQ3YTgxMDhmNTQwM2U4YTQ1ZGQ0MjVlNDFlMWNmLnNldENvbnRlbnQoaV9mcmFtZV80MjRmYmVlZTYyOGQ0MTliOGUxMWJjMDc3ZTI5ODQ0Yyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl84ZjRiYTJhZmVjOTE0MWRiOWFhMzk2YTM1NzIwYTY0Zi5iaW5kUG9wdXAocG9wdXBfMzE5ZDdhODEwOGY1NDAzZThhNDVkZDQyNWU0MWUxY2YpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNmI4ZWJhYmMxNDg5NDU0NzlmY2YyY2M2NGJlNThjNGEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS45ODksIDc4Ljg0NF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZDI3MjMxZGZiYjg5NDNiZTk4ZDY3MTg5N2U2NzZhMWUgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2Y4MjA5Y2YyZGIyNDQ4OTk5OTk4Y2RmMDlkN2E0ODYwID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOaTR4UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGczTFRFeUxURXpJRE02TWpFNk1EVThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9kMjcyMzFkZmJiODk0M2JlOThkNjcxODk3ZTY3NmExZS5zZXRDb250ZW50KGlfZnJhbWVfZjgyMDljZjJkYjI0NDg5OTk5OThjZGYwOWQ3YTQ4NjApOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNmI4ZWJhYmMxNDg5NDU0NzlmY2YyY2M2NGJlNThjNGEuYmluZFBvcHVwKHBvcHVwX2QyNzIzMWRmYmI4OTQzYmU5OGQ2NzE4OTdlNjc2YTFlKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzE0ODVhZGIxMjU4MjRkY2NhNDMyNjdkYjE5OTQzNTgwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuODY0LCA3OC43NThdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2UyYjAzYzhlYTQ4NDRmMDVhMTJlNmIzNGE2NTEwZjEzID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9iZmNjY2E2YjI3MmY0ZjBiYTk0YzI5M2FlYzA1N2IyNSA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0eFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnM0xURXlMVEkzSURNNk1EVTZNRFU4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZTJiMDNjOGVhNDg0NGYwNWExMmU2YjM0YTY1MTBmMTMuc2V0Q29udGVudChpX2ZyYW1lX2JmY2NjYTZiMjcyZjRmMGJhOTRjMjkzYWVjMDU3YjI1KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzE0ODVhZGIxMjU4MjRkY2NhNDMyNjdkYjE5OTQzNTgwLmJpbmRQb3B1cChwb3B1cF9lMmIwM2M4ZWE0ODQ0ZjA1YTEyZTZiMzRhNjUxMGYxMykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9lNGU1NDRmYmQ4YjM0ZGE0YWM1MzE1YzlkNDFhYzU0OCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljk1Mzk5OTk5OTk5OTk5LCA3OC45MV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNmFhODAxYmY3NTlmNDQ2OTg0YTdjZmVhYTE2NDQzY2EgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzQyZTA3ZjY0NmMzOTRlODE5M2EwY2ZhYzUzYTkzNDcxID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOaTR4UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGc0TFRBeUxURXpJRE02TURVNk1EWThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF82YWE4MDFiZjc1OWY0NDY5ODRhN2NmZWFhMTY0NDNjYS5zZXRDb250ZW50KGlfZnJhbWVfNDJlMDdmNjQ2YzM5NGU4MTkzYTBjZmFjNTNhOTM0NzEpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZTRlNTQ0ZmJkOGIzNGRhNGFjNTMxNWM5ZDQxYWM1NDguYmluZFBvcHVwKHBvcHVwXzZhYTgwMWJmNzU5ZjQ0Njk4NGE3Y2ZlYWExNjQ0M2NhKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2NhNDEwYTRmNTcwYzRjNzhiOWNlNWYxZjk0YTRkNWJkID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTE3LCA3OC45NDVdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzExYzEwZGI5MDY5ZjQzODc5Y2MyMzI4YjAwZTg5NTQ2ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV84YjQzMWVkNTViNTI0MDM5OGVlMTU1Yjg3MWQ2MGNmYiA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0eFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnNExUQTBMVEF6SURFNk16TTZNRFk4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMTFjMTBkYjkwNjlmNDM4NzljYzIzMjhiMDBlODk1NDYuc2V0Q29udGVudChpX2ZyYW1lXzhiNDMxZWQ1NWI1MjQwMzk4ZWUxNTViODcxZDYwY2ZiKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2NhNDEwYTRmNTcwYzRjNzhiOWNlNWYxZjk0YTRkNWJkLmJpbmRQb3B1cChwb3B1cF8xMWMxMGRiOTA2OWY0Mzg3OWNjMjMyOGIwMGU4OTU0NikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8yMmQ5YWNjYTg1YjI0MDA0YmE1ZmQ2NDhlNDEwMDg0OCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjkyODAwMDAwMDAwMDAwNCwgNzguNzY4OTk5OTk5OTk5OTldLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2IwMzQzODAzZmYwOTRiYWVhOWYxNWRhNTFmYTdmNjVkID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9iYTQ1MzNkMDMzYWM0ZTJlYjk3NTI4MTAwYmNjMDU2OSA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0eFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnNExUQTFMVEEwSURBNk5UYzZNRGM4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYjAzNDM4MDNmZjA5NGJhZWE5ZjE1ZGE1MWZhN2Y2NWQuc2V0Q29udGVudChpX2ZyYW1lX2JhNDUzM2QwMzNhYzRlMmViOTc1MjgxMDBiY2MwNTY5KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzIyZDlhY2NhODViMjQwMDRiYTVmZDY0OGU0MTAwODQ4LmJpbmRQb3B1cChwb3B1cF9iMDM0MzgwM2ZmMDk0YmFlYTlmMTVkYTUxZmE3ZjY1ZCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl80NTc2YTliNjQxOWU0MWRkOTg3OGY1ZDZiMTViYWEyNSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjgzMywgNzguODA4XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9mMTk2MWM2OGRiOTU0YjVhOTJiNGJkOTQ3Mjg2Y2VmYiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfOGZlZGQ2NzZhNjYyNDVlNzg1ZDY0MjQwODgyN2NhYTAgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05pNHhQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZzRMVEE1TFRFMElETTZOVGs2TlRjOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQWdDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2YxOTYxYzY4ZGI5NTRiNWE5MmI0YmQ5NDcyODZjZWZiLnNldENvbnRlbnQoaV9mcmFtZV84ZmVkZDY3NmE2NjI0NWU3ODVkNjQyNDA4ODI3Y2FhMCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl80NTc2YTliNjQxOWU0MWRkOTg3OGY1ZDZiMTViYWEyNS5iaW5kUG9wdXAocG9wdXBfZjE5NjFjNjhkYjk1NGI1YTkyYjRiZDk0NzI4NmNlZmIpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfOTQ0YTMyM2NlYmY3NDI4ODkwMmM4NzI1YWQ0ZDk4YWMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS45MjQsIDc4LjgzMV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNDFhMjZkOTBkZjdlNDYyMmI4MjdjNTc2YmIyN2MwZWQgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2M3OWY2M2YzMmVmMDQ0YmZiMzhhOTA0ZGQ0YjBlMzMxID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOaTR4UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGc1TFRBeExUSXlJRE02TlRjNk1EYzhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF80MWEyNmQ5MGRmN2U0NjIyYjgyN2M1NzZiYjI3YzBlZC5zZXRDb250ZW50KGlfZnJhbWVfYzc5ZjYzZjMyZWYwNDRiZmIzOGE5MDRkZDRiMGUzMzEpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfOTQ0YTMyM2NlYmY3NDI4ODkwMmM4NzI1YWQ0ZDk4YWMuYmluZFBvcHVwKHBvcHVwXzQxYTI2ZDkwZGY3ZTQ2MjJiODI3YzU3NmJiMjdjMGVkKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzFlNjY5ODU2YmRhODQ1YmRiNDU3NWRiMzMxMWNhMDFiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDEuNjAzLCA4OC44Ml0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMjY0ZWMwNzkyNTA0NDM0N2JiNTVlODZmMTYzOWE2ZWMgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzg5NzUyOWViZTBkMDRlZmJhZDEyZTZiZmYyN2FkZjdiID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOaTR4UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGsxTFRBMUxURTFJRFE2TURVNk5UZzhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF8yNjRlYzA3OTI1MDQ0MzQ3YmI1NWU4NmYxNjM5YTZlYy5zZXRDb250ZW50KGlfZnJhbWVfODk3NTI5ZWJlMGQwNGVmYmFkMTJlNmJmZjI3YWRmN2IpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMWU2Njk4NTZiZGE4NDViZGI0NTc1ZGIzMzExY2EwMWIuYmluZFBvcHVwKHBvcHVwXzI2NGVjMDc5MjUwNDQzNDdiYjU1ZTg2ZjE2MzlhNmVjKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzBjNTI4NzgwYjIwZTRlZDc5NjY4NzRjNGE5ZmRmYTg4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNzAuNzU2LCA1My44NzJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzJhNTk2ZTI5ZTYxMjQ0ZGNiNmZhZWQ3MDkxMmJlYTg5ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV81ZDEwODg2NjEyZDg0OGI5YWU5YmYyMzEzNmM0ODEyZiA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0d1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RjekxUQTVMVEkzSURZNk5UazZOVGc4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMmE1OTZlMjllNjEyNDRkY2I2ZmFlZDcwOTEyYmVhODkuc2V0Q29udGVudChpX2ZyYW1lXzVkMTA4ODY2MTJkODQ4YjlhZTliZjIzMTM2YzQ4MTJmKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzBjNTI4NzgwYjIwZTRlZDc5NjY4NzRjNGE5ZmRmYTg4LmJpbmRQb3B1cChwb3B1cF8yYTU5NmUyOWU2MTI0NGRjYjZmYWVkNzA5MTJiZWE4OSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9mNzgyZmYyMDdmNDU0Mzk2ODhhMjlhMWMxNTYxOTRmYyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUwLjAzNiwgNzkuMDExMDAwMDAwMDAwMDFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2M1MTgwNTEzMDVhOTRmNDFhOTBiOGYxNDU5Zjk0MzUyID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV85YThjZTA2Yzk1NDE0NDZkOTM3YjhlODE4YWUzODUyZSA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0d1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RjekxURXlMVEUwSURjNk5EWTZOVGM4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYzUxODA1MTMwNWE5NGY0MWE5MGI4ZjE0NTlmOTQzNTIuc2V0Q29udGVudChpX2ZyYW1lXzlhOGNlMDZjOTU0MTQ0NmQ5MzdiOGU4MThhZTM4NTJlKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2Y3ODJmZjIwN2Y0NTQzOTY4OGEyOWExYzE1NjE5NGZjLmJpbmRQb3B1cChwb3B1cF9jNTE4MDUxMzA1YTk0ZjQxYTkwYjhmMTQ1OWY5NDM1MikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9iMjg5NzgwZjYxNGU0NDQ4OWRmM2JiMmIxYjI2NGZkZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0yMS44OTQwMDAwMDAwMDAwMDIsIC0xMzguOTU5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF80NDgwNDU0OTg5OGM0MzMxYTc3MjE3Y2E4YWQ3YzQzNiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfMDA0YTlhOWI3NTdmNGQ1NDgyZWM2NmQxMzlkMzc0OWUgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05pNHdQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UYzNMVEV4TFRJMElERTJPalU1T2pVNVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdJQW9nSUNBZyIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzQ0ODA0NTQ5ODk4YzQzMzFhNzcyMTdjYThhZDdjNDM2LnNldENvbnRlbnQoaV9mcmFtZV8wMDRhOWE5Yjc1N2Y0ZDU0ODJlYzY2ZDEzOWQzNzQ5ZSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9iMjg5NzgwZjYxNGU0NDQ4OWRmM2JiMmIxYjI2NGZkZi5iaW5kUG9wdXAocG9wdXBfNDQ4MDQ1NDk4OThjNDMzMWE3NzIxN2NhOGFkN2M0MzYpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNmMxNWFmYjE2NTIwNDBmZThlZGYxNjJkZjJkODUxMjkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS44OTgsIDc4LjkyNV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZWQ3ZDAwZWY3NGVhNGI1Y2I4NjdkYWVkMTkzNTc5NzQgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2MxY2MzNWZmN2VkNTRhNjY4ODAyYjA4YzFmYmNkOWE4ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOaTR3UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGM0TFRBNUxURTFJREk2TXpZNk5UYzhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9lZDdkMDBlZjc0ZWE0YjVjYjg2N2RhZWQxOTM1Nzk3NC5zZXRDb250ZW50KGlfZnJhbWVfYzFjYzM1ZmY3ZWQ1NGE2Njg4MDJiMDhjMWZiY2Q5YTgpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNmMxNWFmYjE2NTIwNDBmZThlZGYxNjJkZjJkODUxMjkuYmluZFBvcHVwKHBvcHVwX2VkN2QwMGVmNzRlYTRiNWNiODY3ZGFlZDE5MzU3OTc0KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzVlYTRkMTE3YmQ3ZjQzZjU5OTY5YjY4NjBhNGIwZGY5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTU2LCA3OC43NjVdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzczNzE5ZmM2MDkwMTRkOTBhZDQwMTJlMTEyMWI5OGVhID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV8xYjY4MWZkMjUzOGI0ZmFhOGQxN2IzMmE0Y2U5ZjY1MCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0d1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RjNExURXhMVEk1SURRNk16TTZNRE04TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNzM3MTlmYzYwOTAxNGQ5MGFkNDAxMmUxMTIxYjk4ZWEuc2V0Q29udGVudChpX2ZyYW1lXzFiNjgxZmQyNTM4YjRmYWE4ZDE3YjMyYTRjZTlmNjUwKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzVlYTRkMTE3YmQ3ZjQzZjU5OTY5YjY4NjBhNGIwZGY5LmJpbmRQb3B1cChwb3B1cF83MzcxOWZjNjA5MDE0ZDkwYWQ0MDEyZTExMjFiOThlYSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl81YWViYjVhNWE2ODQ0MTdjOGI4OWI4M2JkZjNlZTNkMyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ3Ljc4NywgNDguMTkyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF82NzQzMTk2NDkwMDg0Mjk0OTgwYzU1NzYzNmUwMDliNSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfMzAxN2EzNjYwN2FkNGI3Yjk0YWU3ZGFjMTg5NTIyYjMgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05pNHdQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UYzRMVEV5TFRFNElEYzZOVGs2TlRZOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQWdDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzY3NDMxOTY0OTAwODQyOTQ5ODBjNTU3NjM2ZTAwOWI1LnNldENvbnRlbnQoaV9mcmFtZV8zMDE3YTM2NjA3YWQ0YjdiOTRhZTdkYWMxODk1MjJiMyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl81YWViYjVhNWE2ODQ0MTdjOGI4OWI4M2JkZjNlZTNkMy5iaW5kUG9wdXAocG9wdXBfNjc0MzE5NjQ5MDA4NDI5NDk4MGM1NTc2MzZlMDA5YjUpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNGQ4NzViY2M1YzAwNDhlMzhhNGY3ODJhZWU4MDk1ZWYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny44ODMsIDQ4LjEyOF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYTgxZDhhNjM5MGZhNGU1NDgzY2JkOWRlNjIyYjkwYTUgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzVhMmQ2YjYxM2NhZjQ3ZjNiM2ZkMTQ1NWU2MjNkNDkyID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOaTR3UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGM1TFRBeExURTNJRGM2TlRrNk5UWThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9hODFkOGE2MzkwZmE0ZTU0ODNjYmQ5ZGU2MjJiOTBhNS5zZXRDb250ZW50KGlfZnJhbWVfNWEyZDZiNjEzY2FmNDdmM2IzZmQxNDU1ZTYyM2Q0OTIpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNGQ4NzViY2M1YzAwNDhlMzhhNGY3ODJhZWU4MDk1ZWYuYmluZFBvcHVwKHBvcHVwX2E4MWQ4YTYzOTBmYTRlNTQ4M2NiZDlkZTYyMmI5MGE1KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzYwOTI4NjBjMDNhMjQwZGJhMjkyNTQyOGQwOWNmMTAyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTIxLjg5MiwgLTEzOC45OTNdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2VlNzE5MTlkYmU0MDQyMjc5NWUxMjcyYzk3MzJhNzUyID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV8zZWRhZjExM2I1MjE0ZWU3YjdjNjk3NGNiMzJiYjQ5MyA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0d1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RjNUxUQTNMVEkxSURFM09qVTJPalU0UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ0lBb2dJQ0FnIiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZWU3MTkxOWRiZTQwNDIyNzk1ZTEyNzJjOTczMmE3NTIuc2V0Q29udGVudChpX2ZyYW1lXzNlZGFmMTEzYjUyMTRlZTdiN2M2OTc0Y2IzMmJiNDkzKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzYwOTI4NjBjMDNhMjQwZGJhMjkyNTQyOGQwOWNmMTAyLmJpbmRQb3B1cChwb3B1cF9lZTcxOTE5ZGJlNDA0MjI3OTVlMTI3MmM5NzMyYTc1MikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl82Njk4ZDI3Njk2NzY0Y2QzYjkzMGQ2NzYxOTcwNjExNyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljk2NywgNzkuMDZdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzI1ODM3Njg4NmI1YzQ2NGJhODI3Y2E2ZDdjNzJjMGI1ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9kODdjNjlhMzBkNmI0YTM2YjAyOThmOGFiMjEwYTcyOCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0d1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RjNUxURXdMVEk0SURNNk1UWTZOVGM4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMjU4Mzc2ODg2YjVjNDY0YmE4MjdjYTZkN2M3MmMwYjUuc2V0Q29udGVudChpX2ZyYW1lX2Q4N2M2OWEzMGQ2YjRhMzZiMDI5OGY4YWIyMTBhNzI4KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzY2OThkMjc2OTY3NjRjZDNiOTMwZDY3NjE5NzA2MTE3LmJpbmRQb3B1cChwb3B1cF8yNTgzNzY4ODZiNWM0NjRiYTgyN2NhNmQ3YzcyYzBiNSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8xZTM1NGNjZDY0N2M0OTVmOTM3YjAxNzM3MWYyNzY0YyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljg5NCwgNzguODQzXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF81MDRjMGMxNDdlYTU0ZmViYmZlNjhkNmM5ODdlMDZmMyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfZGY5MWVkZDNjOWRkNDYwMjlmMThjMGQwZjc3M2EwY2QgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05pNHdQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UYzVMVEV5TFRBeUlEUTZNelk2TlRnOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQWdDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzUwNGMwYzE0N2VhNTRmZWJiZmU2OGQ2Yzk4N2UwNmYzLnNldENvbnRlbnQoaV9mcmFtZV9kZjkxZWRkM2M5ZGQ0NjAyOWYxOGMwZDBmNzczYTBjZCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8xZTM1NGNjZDY0N2M0OTVmOTM3YjAxNzM3MWYyNzY0Yy5iaW5kUG9wdXAocG9wdXBfNTA0YzBjMTQ3ZWE1NGZlYmJmZTY4ZDZjOTg3ZTA2ZjMpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfY2NlMTFjMWJmMjE3NGYzODhkMWZkYjAxNjkzN2U3NTkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS44OTcsIDc4Ljk4M10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMGY4MTA3NTZjMTI4NGNkM2FkMTA1YmYwMTRlMzk3NTIgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzQ0NmMxN2I0YWQ5ZTQ1MjM4ZWU1MjBmZDQ1ODYxZWY3ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOaTR3UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGd4TFRBNUxURXpJREk2TVRjNk1UZzhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF8wZjgxMDc1NmMxMjg0Y2QzYWQxMDViZjAxNGUzOTc1Mi5zZXRDb250ZW50KGlfZnJhbWVfNDQ2YzE3YjRhZDllNDUyMzhlZTUyMGZkNDU4NjFlZjcpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfY2NlMTFjMWJmMjE3NGYzODhkMWZkYjAxNjkzN2U3NTkuYmluZFBvcHVwKHBvcHVwXzBmODEwNzU2YzEyODRjZDNhZDEwNWJmMDE0ZTM5NzUyKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzQzZjNjZjkwMDk1MTRlZDlhZjFmZGViZDVjNWZhNjZhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuODg2LCA3OC44OThdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2UyZTIwMmFlMGE0ODQzNTFhYTYzNDFhOWUwMmM4NTg1ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9lZjMzN2JkNDYxNTY0YzM5YmY1NWE2NmQ1YWFjYzQxNyA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0d1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RneExURXdMVEU0SURNNk5UYzZNRE04TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZTJlMjAyYWUwYTQ4NDM1MWFhNjM0MWE5ZTAyYzg1ODUuc2V0Q29udGVudChpX2ZyYW1lX2VmMzM3YmQ0NjE1NjRjMzliZjU1YTY2ZDVhYWNjNDE3KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzQzZjNjZjkwMDk1MTRlZDlhZjFmZGViZDVjNWZhNjZhLmJpbmRQb3B1cChwb3B1cF9lMmUyMDJhZTBhNDg0MzUxYWE2MzQxYTllMDJjODU4NSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl83ODgwNDU5ZjM1ODk0NTIxOTUxOTAzMDZmODc0Yzk3ZSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjkzMTk5OTk5OTk5OTk5NSwgNzguODQzXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9lMDVmNTFjNDExODk0NDE5ODg0OTgzZDgwOTY5NWJlOSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfMmJjYTEwNzc1YTJiNGJmNjgyMjM0MjUyYjJjODY5YmMgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05pNHdQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZ3pMVEV3TFRBMklERTZORGM2TURjOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQWdDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2UwNWY1MWM0MTE4OTQ0MTk4ODQ5ODNkODA5Njk1YmU5LnNldENvbnRlbnQoaV9mcmFtZV8yYmNhMTA3NzVhMmI0YmY2ODIyMzQyNTJiMmM4NjliYyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl83ODgwNDU5ZjM1ODk0NTIxOTUxOTAzMDZmODc0Yzk3ZS5iaW5kUG9wdXAocG9wdXBfZTA1ZjUxYzQxMTg5NDQxOTg4NDk4M2Q4MDk2OTViZTkpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNjAyMzhmYTUxMTFmNGMxOWJhMjU5NmY5NTQwOGNkOWEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS45OCwgNzkuMDZdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzI1NTY1Zjk5OTcwMTQ5OWQ5NTVkNjBlOGYxN2M2MDcyID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9hNzNiZTM4YmM5MzQ0Y2M2OGE1YjljZmU5ZTUwZjA5MiA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0d1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnMExUQTFMVEkySURNNk1UTTZNVEk4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMjU1NjVmOTk5NzAxNDk5ZDk1NWQ2MGU4ZjE3YzYwNzIuc2V0Q29udGVudChpX2ZyYW1lX2E3M2JlMzhiYzkzNDRjYzY4YTViOWNmZTllNTBmMDkyKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzYwMjM4ZmE1MTExZjRjMTliYTI1OTZmOTU0MDhjZDlhLmJpbmRQb3B1cChwb3B1cF8yNTU2NWY5OTk3MDE0OTlkOTU1ZDYwZThmMTdjNjA3MikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9lNDI4MjcxMmNhZTM0MmUxODBiMjZkZmU0YTQ4ZDc5MCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljg2MTAwMDAwMDAwMDAwNCwgNzguNzUyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF85OTMwYjdjN2ZhMzU0NDk3OWUyYzc4Nzc4ODRkOWNlOSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfNDJmZWM1NDBjMGMwNDFmNGI3MGMyOGJhNzczYmQ2OTEgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05pNHdQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZzBMVEV5TFRJNElETTZOVEE2TVRFOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQWdDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzk5MzBiN2M3ZmEzNTQ0OTc5ZTJjNzg3Nzg4NGQ5Y2U5LnNldENvbnRlbnQoaV9mcmFtZV80MmZlYzU0MGMwYzA0MWY0YjcwYzI4YmE3NzNiZDY5MSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9lNDI4MjcxMmNhZTM0MmUxODBiMjZkZmU0YTQ4ZDc5MC5iaW5kUG9wdXAocG9wdXBfOTkzMGI3YzdmYTM1NDQ5NzllMmM3ODc3ODg0ZDljZTkpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYTIwMzJlZTg5N2JmNDMwNjkyYWZlYzMyN2EzNmI0YjcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS44ODg5OTk5OTk5OTk5OTYsIDc4Ljg4MV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMDdlZTI1MTQ5Mzk2NGRkZjliMDdmODRjMDIzYmNjZGYgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzdiZTU4MmQyNDJjNDRlODJhOTYwYjFmYjE1ODEyMmZmID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOaTR3UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGcxTFRBMkxURTFJREE2TlRjNk1ERThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF8wN2VlMjUxNDkzOTY0ZGRmOWIwN2Y4NGMwMjNiY2NkZi5zZXRDb250ZW50KGlfZnJhbWVfN2JlNTgyZDI0MmM0NGU4MmE5NjBiMWZiMTU4MTIyZmYpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfYTIwMzJlZTg5N2JmNDMwNjkyYWZlYzMyN2EzNmI0YjcuYmluZFBvcHVwKHBvcHVwXzA3ZWUyNTE0OTM5NjRkZGY5YjA3Zjg0YzAyM2JjY2RmKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzg2ODIwMjBhMmFiOTQ0ZDU4YTA1NGMyYmMyYzE1ZWE3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuODYxMDAwMDAwMDAwMDA0LCA3OC42OTZdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzZlOWJhMTQ1NTczYTQ3YjQ4NWQxZGUzZWU4YjhiMDk5ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV83N2ZiMDZiMjZkZDU0MjZkYTc5ZDM2YmVlMDNhYmY2OSA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0d1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnMUxUQTJMVE13SURJNk16azZNRE04TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNmU5YmExNDU1NzNhNDdiNDg1ZDFkZTNlZThiOGIwOTkuc2V0Q29udGVudChpX2ZyYW1lXzc3ZmIwNmIyNmRkNTQyNmRhNzlkMzZiZWUwM2FiZjY5KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzg2ODIwMjBhMmFiOTQ0ZDU4YTA1NGMyYmMyYzE1ZWE3LmJpbmRQb3B1cChwb3B1cF82ZTliYTE0NTU3M2E0N2I0ODVkMWRlM2VlOGI4YjA5OSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8yZjI1MzQ1MDJhZWM0Nzg3OTI1ZmNmMjkwN2VhNmNiZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljg4NiwgNzguNjkxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8wZmIxZTA4NmIwMTQ0Y2U2YmYzNWIxN2E0YzNjOTQwZSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfMjczMDVkNGU2ZjY4NGQ1NTg2Njk1YTc0YzY1ZGQ5ODMgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05pNHdQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZzNMVEEwTFRFM0lERTZNRE02TURVOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQWdDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzBmYjFlMDg2YjAxNDRjZTZiZjM1YjE3YTRjM2M5NDBlLnNldENvbnRlbnQoaV9mcmFtZV8yNzMwNWQ0ZTZmNjg0ZDU1ODY2OTVhNzRjNjVkZDk4Myk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8yZjI1MzQ1MDJhZWM0Nzg3OTI1ZmNmMjkwN2VhNmNiZC5iaW5kUG9wdXAocG9wdXBfMGZiMWUwODZiMDE0NGNlNmJmMzViMTdhNGMzYzk0MGUpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZTA1MmIxNWRkMTc2NGM3YmI0ODk3MDZiOWIwNzY5NzkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS44NzEsIDc4Ljc5MV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZTMxZGM5MDc5YmVmNDgxNjllODIxN2EyMzMxNzU0NmQgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzBkODk0NGM3OTNkZjQ4NzhiM2YwN2E5MTRjZTNkM2E4ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOaTR3UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGczTFRFeExURTFJRE02TXpFNk1EYzhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9lMzFkYzkwNzliZWY0ODE2OWU4MjE3YTIzMzE3NTQ2ZC5zZXRDb250ZW50KGlfZnJhbWVfMGQ4OTQ0Yzc5M2RmNDg3OGIzZjA3YTkxNGNlM2QzYTgpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZTA1MmIxNWRkMTc2NGM3YmI0ODk3MDZiOWIwNzY5NzkuYmluZFBvcHVwKHBvcHVwX2UzMWRjOTA3OWJlZjQ4MTY5ZTgyMTdhMjMzMTc1NDZkKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2FkYzMzMTM2ODM3MTRhNzc5MDBjNDBjMjgzM2ZhNWU0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTM3LCA3OC45NzJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzkzNmZhZDJkYjBkMjRlYTJhM2E5NTczYjZjM2MzYTI0ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9jN2IxYWRhNDgxYWQ0NzhiYjhmYTlkYjI4MDNmODVlMyA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0d1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnNUxURXdMVEU1SURrNk5EazZOVGM4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfOTM2ZmFkMmRiMGQyNGVhMmEzYTk1NzNiNmMzYzNhMjQuc2V0Q29udGVudChpX2ZyYW1lX2M3YjFhZGE0ODFhZDQ3OGJiOGZhOWRiMjgwM2Y4NWUzKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2FkYzMzMTM2ODM3MTRhNzc5MDBjNDBjMjgzM2ZhNWU0LmJpbmRQb3B1cChwb3B1cF85MzZmYWQyZGIwZDI0ZWEyYTNhOTU3M2I2YzNjM2EyNCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8xYjQyYTBjOTI5ZDE0YmY1ODI3NGM5OTE2MGFiMmNlOSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQxLjY2MiwgODguNzUyOTk5OTk5OTk5OTldLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzIwM2E2ZjZjYWZkNjQ2OWJiNTFlNzQ0ZjBhMGNjNjA2ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV80OGViYmY2OGYxYjI0MWM1YWFjZTdiOWZiNTljNzc3ZSA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0d1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RrMExURXdMVEEzSURNNk1qVTZOVGc4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMjAzYTZmNmNhZmQ2NDY5YmI1MWU3NDRmMGEwY2M2MDYuc2V0Q29udGVudChpX2ZyYW1lXzQ4ZWJiZjY4ZjFiMjQxYzVhYWNlN2I5ZmI1OWM3NzdlKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzFiNDJhMGM5MjlkMTRiZjU4Mjc0Yzk5MTYwYWIyY2U5LmJpbmRQb3B1cChwb3B1cF8yMDNhNmY2Y2FmZDY0NjliYjUxZTc0NGYwYTBjYzYwNikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8xMjU2ODk3YWYzYmU0ZTBjYThhNTg0NDY4ODljNmMzMiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQxLjU1OSwgODguOF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfN2IyYjI4NGVhMDMyNDMwNTgxYTllYmY0NGNjOTgzOWIgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2UyNTI2YTg1Y2ZlMzRmYWM4MDljZWYwNmEyZWQ5NGU4ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOaTR3UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGsxTFRBNExURTNJREE2TlRrNk5UZzhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF83YjJiMjg0ZWEwMzI0MzA1ODFhOWViZjQ0Y2M5ODM5Yi5zZXRDb250ZW50KGlfZnJhbWVfZTI1MjZhODVjZmUzNGZhYzgwOWNlZjA2YTJlZDk0ZTgpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMTI1Njg5N2FmM2JlNGUwY2E4YTU4NDQ2ODg5YzZjMzIuYmluZFBvcHVwKHBvcHVwXzdiMmIyODRlYTAzMjQzMDU4MWE5ZWJmNDRjYzk4MzliKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2M2NDhmNDM1ODA3ZTRhMTQ5YmI2ZjM1YzI4ZTA1YTMzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTUyLCA3OC44NDRdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzQ1OTVmMDg1OWViYzRjZTZhNzQ5OGYyNzE2ZTBmZDYzID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV83OGM1YjY0NDA1M2U0YmUzYTllNzVhM2UwYWY4OWEzZCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RjMExUQTFMVE14SURNNk1qWTZOVGM4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNDU5NWYwODU5ZWJjNGNlNmE3NDk4ZjI3MTZlMGZkNjMuc2V0Q29udGVudChpX2ZyYW1lXzc4YzViNjQ0MDUzZTRiZTNhOWU3NWEzZTBhZjg5YTNkKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2M2NDhmNDM1ODA3ZTRhMTQ5YmI2ZjM1YzI4ZTA1YTMzLmJpbmRQb3B1cChwb3B1cF80NTk1ZjA4NTllYmM0Y2U2YTc0OThmMjcxNmUwZmQ2MykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9mM2ExMWE3ZTkwZmQ0YTZiOGVmZTZlNDliNzNkZWNmZSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ3Ljc4MiwgNDguMTJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2JlNTNmOGQxNzBkZjQ1ZWE4MzAyMmQxZTcwODUzZDlkID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9hNDhmYzdiZDA5OGQ0YzJlOWUxYWFmMjYyYWYwN2VjZCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RjMkxUQTNMVEk1SURRNk5UazZOVGc4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYmU1M2Y4ZDE3MGRmNDVlYTgzMDIyZDFlNzA4NTNkOWQuc2V0Q29udGVudChpX2ZyYW1lX2E0OGZjN2JkMDk4ZDRjMmU5ZTFhYWYyNjJhZjA3ZWNkKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2YzYTExYTdlOTBmZDRhNmI4ZWZlNmU0OWI3M2RlY2ZlLmJpbmRQb3B1cChwb3B1cF9iZTUzZjhkMTcwZGY0NWVhODMwMjJkMWU3MDg1M2Q5ZCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8yNGM5NzU3MzRlMWU0N2I4YTAyZGZhYjUyNjE4NGZhNiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljk5MTAwMDAwMDAwMDAxLCA3OS4wMDVdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzVmY2JhMmY1ODJkYzQzNGI5YzUxNzU2MDk4NmVlYzBhID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9lMmI4MzE0YmNkMmU0MGU4ODE3M2ZmZTU5ZTg5MDdlZSA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RjMkxURXhMVEl6SURVNk1ESTZOVGM4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNWZjYmEyZjU4MmRjNDM0YjljNTE3NTYwOTg2ZWVjMGEuc2V0Q29udGVudChpX2ZyYW1lX2UyYjgzMTRiY2QyZTQwZTg4MTczZmZlNTllODkwN2VlKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzI0Yzk3NTczNGUxZTQ3YjhhMDJkZmFiNTI2MTg0ZmE2LmJpbmRQb3B1cChwb3B1cF81ZmNiYTJmNTgyZGM0MzRiOWM1MTc1NjA5ODZlZWMwYSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl80OTY1ZGJiYjcwZjA0YzJlOGUxYzVmZGFmNzQ1MGJjOCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljg4Mzk5OTk5OTk5OTk5LCA3OC45MDVdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2Y5YjYyYTA0Y2E4NDRkMDM5OWY3N2Q1ZmE1YTk2NmYzID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV83NmQ2OTZmZjgwNDc0MjViOGRjZjljODI4NWZhMDZhZiA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RjMkxURXlMVEEzSURRNk5UWTZOVGM4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZjliNjJhMDRjYTg0NGQwMzk5Zjc3ZDVmYTVhOTY2ZjMuc2V0Q29udGVudChpX2ZyYW1lXzc2ZDY5NmZmODA0NzQyNWI4ZGNmOWM4Mjg1ZmEwNmFmKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzQ5NjVkYmJiNzBmMDRjMmU4ZTFjNWZkYWY3NDUwYmM4LmJpbmRQb3B1cChwb3B1cF9mOWI2MmEwNGNhODQ0ZDAzOTlmNzdkNWZhNWE5NjZmMykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8wYzI2MjNhNWI2YjM0NzQyYWRjNzI4ZTI4ZjQzNDc4YiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0yMS45MzIsIC0xMzguOTU4XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF82NGNkNDcyNzZlYTk0MTMxYTQ5OTAwYTJkNmRlMjIzZSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfNjAzODE5NjgwZWY1NDQwYThkZDhkNDBjOGQwOWQ1ZjEgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UYzNMVEF6TFRFNUlESXpPakF3T2pVNFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdJQW9nSUNBZyIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzY0Y2Q0NzI3NmVhOTQxMzFhNDk5MDBhMmQ2ZGUyMjNlLnNldENvbnRlbnQoaV9mcmFtZV82MDM4MTk2ODBlZjU0NDBhOGRkOGQ0MGM4ZDA5ZDVmMSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8wYzI2MjNhNWI2YjM0NzQyYWRjNzI4ZTI4ZjQzNDc4Yi5iaW5kUG9wdXAocG9wdXBfNjRjZDQ3Mjc2ZWE5NDEzMWE0OTkwMGEyZDZkZTIyM2UpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNzM0NWYzNzA4MmMwNDY1OGIzNDFjYWVkNTk5M2IzYTYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MC4wOTIsIDc4Ljk2MV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYTViMTY2ZjM4NzAwNDE2OWE2YWFkNTQ3MWYxMTZiYTMgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzQ2MjFhNTNiYzg4OTQ2MzI4NGE2M2NhNmM2N2NmOTdlID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQ1UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGMzTFRBNUxUQTFJRE02TURJNk5UZzhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9hNWIxNjZmMzg3MDA0MTY5YTZhYWQ1NDcxZjExNmJhMy5zZXRDb250ZW50KGlfZnJhbWVfNDYyMWE1M2JjODg5NDYzMjg0YTYzY2E2YzY3Y2Y5N2UpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNzM0NWYzNzA4MmMwNDY1OGIzNDFjYWVkNTk5M2IzYTYuYmluZFBvcHVwKHBvcHVwX2E1YjE2NmYzODcwMDQxNjlhNmFhZDU0NzFmMTE2YmEzKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzZkMjk5ZWRkZTA5MzQ2NDdiNGMxN2ZmZjRjMjdlODM4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTU3LCA3OC45MzFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzYwNDM1OGZmMjFiODQxYzliNzdhZWE1MTk4YmJkZWNjID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9iMDNkNzVjMjViYmI0NTU3YTQ5Y2U2ZWUzZGU5Yjg4ZCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RjM0xURXhMVE13SURRNk1EWTZOVGc4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNjA0MzU4ZmYyMWI4NDFjOWI3N2FlYTUxOThiYmRlY2Muc2V0Q29udGVudChpX2ZyYW1lX2IwM2Q3NWMyNWJiYjQ1NTdhNDljZTZlZTNkZTliODhkKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzZkMjk5ZWRkZTA5MzQ2NDdiNGMxN2ZmZjRjMjdlODM4LmJpbmRQb3B1cChwb3B1cF82MDQzNThmZjIxYjg0MWM5Yjc3YWVhNTE5OGJiZGVjYykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8zMjc4M2U2OWUxZmE0OGFiYWJmNjA1MWMzZDhhZDY5NCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljg3OSwgNzguODM4MDAwMDAwMDAwMDFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2M0ZTM4YjMxMWE5MTQ5Y2Q4OTJjODhjMTgyMmQ3NjJlID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9kYmVkZjJkNmFlNzE0NmM4YjAyY2U5YmJkOTE3MmRjOCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RjNExUQTJMVEV4SURJNk5UWTZOVGc4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYzRlMzhiMzExYTkxNDljZDg5MmM4OGMxODIyZDc2MmUuc2V0Q29udGVudChpX2ZyYW1lX2RiZWRmMmQ2YWU3MTQ2YzhiMDJjZTliYmQ5MTcyZGM4KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzMyNzgzZTY5ZTFmYTQ4YWJhYmY2MDUxYzNkOGFkNjk0LmJpbmRQb3B1cChwb3B1cF9jNGUzOGIzMTFhOTE0OWNkODkyYzg4YzE4MjJkNzYyZSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl81NGNkMWNlOWVmMGY0MjdmYjlhMjk5YmY1MzAzNjg0YyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzczLjMzNiwgNTQuNzkyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF84MDkzYzgxOTQzODc0N2IxOGNjNGY3MDJiYmVjNjRkYSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfNGFmN2YzYmRjZDU0NDIwMTg4ZGUxYjUxZTgzOTRiNzkgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UYzRMVEE0TFRFd0lEYzZOVGs2TlRnOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQWdDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzgwOTNjODE5NDM4NzQ3YjE4Y2M0ZjcwMmJiZWM2NGRhLnNldENvbnRlbnQoaV9mcmFtZV80YWY3ZjNiZGNkNTQ0MjAxODhkZTFiNTFlODM5NGI3OSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl81NGNkMWNlOWVmMGY0MjdmYjlhMjk5YmY1MzAzNjg0Yy5iaW5kUG9wdXAocG9wdXBfODA5M2M4MTk0Mzg3NDdiMThjYzRmNzAyYmJlYzY0ZGEpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMjdiMzdmYTQ0ZDE5NGE3Y2JjOTBiZGEyMWVjNDRmMGYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MC4wMDgsIDc4Ljk5NjAwMDAwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF82ZjhhMWQzNzFmMWI0OTMwYmU5ZjQ5MzAwZjYzMTM3MiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfOWVmMTgxM2EwYzAxNDk0MmE2MGQ0OTYxNjBiYzQ5M2UgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UYzRMVEE0TFRJNUlESTZNemM2TURjOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQWdDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzZmOGExZDM3MWYxYjQ5MzBiZTlmNDkzMDBmNjMxMzcyLnNldENvbnRlbnQoaV9mcmFtZV85ZWYxODEzYTBjMDE0OTQyYTYwZDQ5NjE2MGJjNDkzZSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8yN2IzN2ZhNDRkMTk0YTdjYmM5MGJkYTIxZWM0NGYwZi5iaW5kUG9wdXAocG9wdXBfNmY4YTFkMzcxZjFiNDkzMGJlOWY0OTMwMGY2MzEzNzIpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYzIyZTRhNGViYzhkNDhiZmJjNjBmOTE1NzNhNzhlMmYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjEuOTAzMDAwMDAwMDAwMDAyLCAtMTM4Ljk3NV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNmNmNTFjMTNkYjZjNDU5NGE2MjcyOTFmZmUxMTJjYWMgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzE5MGRiNmRiOTI2NTQzZTU5MzhhODVmOGI5MzI2NmI3ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQ1UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGM0TFRFeExUTXdJREUzT2pNeE9qVTRQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnSUFvZ0lDQWciIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF82Y2Y1MWMxM2RiNmM0NTk0YTYyNzI5MWZmZTExMmNhYy5zZXRDb250ZW50KGlfZnJhbWVfMTkwZGI2ZGI5MjY1NDNlNTkzOGE4NWY4YjkzMjY2YjcpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfYzIyZTRhNGViYzhkNDhiZmJjNjBmOTE1NzNhNzhlMmYuYmluZFBvcHVwKHBvcHVwXzZjZjUxYzEzZGI2YzQ1OTRhNjI3MjkxZmZlMTEyY2FjKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzBmZjRlYjE0ZjJiODQxYjRiZTU5YmU4YmNkMDU5OGUxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTIxLjg4NiwgLTEzOS4wMTldLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzQzYmY0NDk5ZDQwYjRjMjc4MjVmMjZlNjJkNzI0OWFmID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV8yOWQxOWYyOWFjOGQ0MzFiOWQ0ZTBiMTc5MjIyNjc3NyA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1Rnd0xUQTNMVEU1SURJek9qUTJPalU0UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ0lBb2dJQ0FnIiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNDNiZjQ0OTlkNDBiNGMyNzgyNWYyNmU2MmQ3MjQ5YWYuc2V0Q29udGVudChpX2ZyYW1lXzI5ZDE5ZjI5YWM4ZDQzMWI5ZDRlMGIxNzkyMjI2Nzc3KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzBmZjRlYjE0ZjJiODQxYjRiZTU5YmU4YmNkMDU5OGUxLmJpbmRQb3B1cChwb3B1cF80M2JmNDQ5OWQ0MGI0YzI3ODI1ZjI2ZTYyZDcyNDlhZikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl81MjU4NjViNDQ3MGU0YWEyYWMyZDc0ZTNkMjhiZjc1ZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljk1OCwgNzkuMDg1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF84MDRlYzM5ODFmZGQ0YmRkOGU4NjIwOWQyZTMzM2JjZCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfMjIxYjhiMWQyNjJlNGQzNGEzZTJmODFlMTM5NDFjODcgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZ3dMVEV3TFRFeUlETTZNelE2TVRROEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQWdDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzgwNGVjMzk4MWZkZDRiZGQ4ZTg2MjA5ZDJlMzMzYmNkLnNldENvbnRlbnQoaV9mcmFtZV8yMjFiOGIxZDI2MmU0ZDM0YTNlMmY4MWUxMzk0MWM4Nyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl81MjU4NjViNDQ3MGU0YWEyYWMyZDc0ZTNkMjhiZjc1ZC5iaW5kUG9wdXAocG9wdXBfODA0ZWMzOTgxZmRkNGJkZDhlODYyMDlkMmUzMzNiY2QpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMjUyZWYxMjhlZTEyNDYwZGI5MzUzMzA0OTMzZTFmNWIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS45MzE5OTk5OTk5OTk5OTUsIDc5LjAwNV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMjNlNzIzZjIyMTE0NDkxNTg3ZjUwZTQxZWI1N2Q4YjggPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzY1ZTg3NTg0NGZhZTRhZDZiMjE1NzEyZjYzODZjNGQ4ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQ1UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGd3TFRFeUxURTBJRE02TkRjNk1EYzhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF8yM2U3MjNmMjIxMTQ0OTE1ODdmNTBlNDFlYjU3ZDhiOC5zZXRDb250ZW50KGlfZnJhbWVfNjVlODc1ODQ0ZmFlNGFkNmIyMTU3MTJmNjM4NmM0ZDgpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMjUyZWYxMjhlZTEyNDYwZGI5MzUzMzA0OTMzZTFmNWIuYmluZFBvcHVwKHBvcHVwXzIzZTcyM2YyMjExNDQ5MTU4N2Y1MGU0MWViNTdkOGI4KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzEzYzhkMGYwYjA3MjQwN2Y5MzRiMGUyM2RjMGJlYjM3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTAuMDQsIDc5LjA0Nl0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZDRkOWE2OTMyMjEzNDkwY2EzYmFhMDJmNDlkN2ZhZGMgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzIyMzkzNDE2NWI5YTRkNDA4OTk1NTYwYTJmOWU0NWFmID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQ1UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGd3TFRFeUxUSTNJRFE2TURrNk1EZzhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9kNGQ5YTY5MzIyMTM0OTBjYTNiYWEwMmY0OWQ3ZmFkYy5zZXRDb250ZW50KGlfZnJhbWVfMjIzOTM0MTY1YjlhNGQ0MDg5OTU1NjBhMmY5ZTQ1YWYpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMTNjOGQwZjBiMDcyNDA3ZjkzNGIwZTIzZGMwYmViMzcuYmluZFBvcHVwKHBvcHVwX2Q0ZDlhNjkzMjIxMzQ5MGNhM2JhYTAyZjQ5ZDdmYWRjKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzZkYTY0NzcwOTJhMDRlZjBhNzk5OGNlZTA1YmI2MmMzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTAxLCA3OC45MDEwMDAwMDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYTgxNjMyNzc2OWY0NDZmZDg4YzMyZmU0NjljOWI2ODEgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2ZiNGM3ZWIyNmNlMTQ0ZTk4YWQ2ODcxMDc3YmJiODg5ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQ1UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGd4TFRBMExUSXlJREU2TVRjNk1URThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9hODE2MzI3NzY5ZjQ0NmZkODhjMzJmZTQ2OWM5YjY4MS5zZXRDb250ZW50KGlfZnJhbWVfZmI0YzdlYjI2Y2UxNDRlOThhZDY4NzEwNzdiYmI4ODkpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNmRhNjQ3NzA5MmEwNGVmMGE3OTk4Y2VlMDViYjYyYzMuYmluZFBvcHVwKHBvcHVwX2E4MTYzMjc3NjlmNDQ2ZmQ4OGMzMmZlNDY5YzliNjgxKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzdmNGJjZmM0ZTU4OTQ2Y2ViZTczYjM2MTNmNzNjMzk5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNzMuMzE3LCA1NC44MTJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2Y4ODhlN2UzZmE4NzRjODBhYmRkYjY4MjVjM2NkZWYyID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV8yZWE0NWExYTA4YjQ0NjEwODNlZWQ5NTViN2U5NzgwNiA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RneExURXdMVEF4SURFeU9qRTBPalUzUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ0lBb2dJQ0FnIiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZjg4OGU3ZTNmYTg3NGM4MGFiZGRiNjgyNWMzY2RlZjIuc2V0Q29udGVudChpX2ZyYW1lXzJlYTQ1YTFhMDhiNDQ2MTA4M2VlZDk1NWI3ZTk3ODA2KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzdmNGJjZmM0ZTU4OTQ2Y2ViZTczYjM2MTNmNzNjMzk5LmJpbmRQb3B1cChwb3B1cF9mODg4ZTdlM2ZhODc0YzgwYWJkZGI2ODI1YzNjZGVmMikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9mNDQzZDI2NGFjYjA0YTdlODliYjk5MDVmM2UwZDVhMyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0yMS44OTUsIC0xMzguOTE4XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF82N2IxZGM0YzkyMjU0OTRmYWFkODQ4ODM5ODE1N2EzOCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfZmUzYjQ3OTJmN2I4NDY1NjkxZTZhMjYwYjBkOTBhYTUgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZ3pMVEExTFRJMUlERTNPak13T2pVNFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdJQW9nSUNBZyIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzY3YjFkYzRjOTIyNTQ5NGZhYWQ4NDg4Mzk4MTU3YTM4LnNldENvbnRlbnQoaV9mcmFtZV9mZTNiNDc5MmY3Yjg0NjU2OTFlNmEyNjBiMGQ5MGFhNSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9mNDQzZDI2NGFjYjA0YTdlODliYjk5MDVmM2UwZDVhMy5iaW5kUG9wdXAocG9wdXBfNjdiMWRjNGM5MjI1NDk0ZmFhZDg0ODgzOTgxNTdhMzgpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMzJmZjdhYzViZjQzNGJjZDhkOTM4YmJmMzAxYWQ4ZjQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs3My4zODMsIDU0LjkxMzAwMDAwMDAwMDAwNF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNGU4YzQ3ZTBjYTY1NGMwOWI4MDU0NWU5ZWY1Njc5ZjggPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzRkZGNjZDg0YmZmNzRiYWNiZGIwODFmZDZhNzYwOTZmID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQ1UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGd6TFRBNExURTRJREUyT2pBNU9qVTVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnSUFvZ0lDQWciIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF80ZThjNDdlMGNhNjU0YzA5YjgwNTQ1ZTllZjU2NzlmOC5zZXRDb250ZW50KGlfZnJhbWVfNGRkY2NkODRiZmY3NGJhY2JkYjA4MWZkNmE3NjA5NmYpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMzJmZjdhYzViZjQzNGJjZDhkOTM4YmJmMzAxYWQ4ZjQuYmluZFBvcHVwKHBvcHVwXzRlOGM0N2UwY2E2NTRjMDliODA1NDVlOWVmNTY3OWY4KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2Y1MjJmMzUyN2EzZTQ3ZWViMWM0MTRjYmNiMWQzYTA2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTM3LCA3OS4wMTddLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2U3Mjk3YTYwMzA4YjQzNWVhZDYzNDJjNzE0Y2ExY2EwID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV83MTUwYzVlMDAyOTM0MzAxODViYTIzMjM4Y2UyYTNkOCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnMExUQXpMVEk1SURVNk1UazZNRGc4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZTcyOTdhNjAzMDhiNDM1ZWFkNjM0MmM3MTRjYTFjYTAuc2V0Q29udGVudChpX2ZyYW1lXzcxNTBjNWUwMDI5MzQzMDE4NWJhMjMyMzhjZTJhM2Q4KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2Y1MjJmMzUyN2EzZTQ3ZWViMWM0MTRjYmNiMWQzYTA2LmJpbmRQb3B1cChwb3B1cF9lNzI5N2E2MDMwOGI0MzVlYWQ2MzQyYzcxNGNhMWNhMCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9jY2U1NDJjNThhYTg0MmQzOWU2MmMyMmY1Y2FiZDliNyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljk1MywgNzguOTRdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzlkZWYwMTRiZTJhYTRlMDFhOGE4NjJmODk1MzcwMTJhID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV8zNGIwY2EzY2I5MzQ0ZGE4YWIxMWVhNWYxNjljOTY5ZCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnMExUQTBMVEkxSURFNk1EazZNRFE4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfOWRlZjAxNGJlMmFhNGUwMWE4YTg2MmY4OTUzNzAxMmEuc2V0Q29udGVudChpX2ZyYW1lXzM0YjBjYTNjYjkzNDRkYThhYjExZWE1ZjE2OWM5NjlkKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2NjZTU0MmM1OGFhODQyZDM5ZTYyYzIyZjVjYWJkOWI3LmJpbmRQb3B1cChwb3B1cF85ZGVmMDE0YmUyYWE0ZTAxYThhODYyZjg5NTM3MDEyYSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl81M2ZhYzIyMzVmZTk0N2QwOTI3MjU4MjA1NTY4OWU3NCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzczLjM3LCA1NC45NTVdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2Y1YjhhMWYyZDA2YTQyYjk5MGZhNDkyMGZlZmQ4NzhjID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV82NjUyMzU0M2M4ZDc0YzZiYjk3NDVkZGMxNTZiM2ZlNCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnMExURXdMVEkxSURZNk1qazZOVGc4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZjViOGExZjJkMDZhNDJiOTkwZmE0OTIwZmVmZDg3OGMuc2V0Q29udGVudChpX2ZyYW1lXzY2NTIzNTQzYzhkNzRjNmJiOTc0NWRkYzE1NmIzZmU0KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzUzZmFjMjIzNWZlOTQ3ZDA5MjcyNTgyMDU1Njg5ZTc0LmJpbmRQb3B1cChwb3B1cF9mNWI4YTFmMmQwNmE0MmI5OTBmYTQ5MjBmZWZkODc4YykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl81MzBhYjQ2MDFlY2U0MGFjYjJmNDQ5ZjA5MzlmYWNjYyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljg3Njk5OTk5OTk5OTk5NSwgNzguODE2XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8zODUyMzIxODdjOGQ0NzM5YjVjNDVjZWU2NmUzNGJiNyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfZjgwMjJlY2YzMjY2NDIzOTk0NTM2OWVkMDE3NjY2ZTcgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZzFMVEF5TFRFd0lETTZNamM2TURnOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQWdDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzM4NTIzMjE4N2M4ZDQ3MzliNWM0NWNlZTY2ZTM0YmI3LnNldENvbnRlbnQoaV9mcmFtZV9mODAyMmVjZjMyNjY0MjM5OTQ1MzY5ZWQwMTc2NjZlNyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl81MzBhYjQ2MDFlY2U0MGFjYjJmNDQ5ZjA5MzlmYWNjYy5iaW5kUG9wdXAocG9wdXBfMzg1MjMyMTg3YzhkNDczOWI1YzQ1Y2VlNjZlMzRiYjcpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZTYwYzY3ZTlmZTM4NDFhMTgxOTdiM2IyM2UyMzE1ZjkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS45MjQsIDc4Ljk2OV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYjI2MzE3NTEwYzEzNDIyOGEyYjQ2YWQxMTVlMWIwZjggPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzdiMGVhMmU2OTYyMjRlMDJhYjIyOWQ4ODg4MWNmOTIxID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQ1UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGcxTFRBMExUSTFJREE2TlRjNk1EYzhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9iMjYzMTc1MTBjMTM0MjI4YTJiNDZhZDExNWUxYjBmOC5zZXRDb250ZW50KGlfZnJhbWVfN2IwZWEyZTY5NjIyNGUwMmFiMjI5ZDg4ODgxY2Y5MjEpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZTYwYzY3ZTlmZTM4NDFhMTgxOTdiM2IyM2UyMzE1ZjkuYmluZFBvcHVwKHBvcHVwX2IyNjMxNzUxMGMxMzQyMjhhMmI0NmFkMTE1ZTFiMGY4KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2Q3Yjk1OGY3ZTI1MDQ2MjhhYjFhNDcwMWEyZjZhMjQ5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTUxLCA3OC44MjldLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzQ2ODc1MGUxMDYxODQxOTZiNGUxYzQ0MjE1MzJlMmZmID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9kMjgxZDQxNmQ5OTI0MGMxODc1NzdjYzU5MDdmOGJlYiA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnMUxUQTNMVEl3SURBNk5UTTZNVFU4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNDY4NzUwZTEwNjE4NDE5NmI0ZTFjNDQyMTUzMmUyZmYuc2V0Q29udGVudChpX2ZyYW1lX2QyODFkNDE2ZDk5MjQwYzE4NzU3N2NjNTkwN2Y4YmViKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2Q3Yjk1OGY3ZTI1MDQ2MjhhYjFhNDcwMWEyZjZhMjQ5LmJpbmRQb3B1cChwb3B1cF80Njg3NTBlMTA2MTg0MTk2YjRlMWM0NDIxNTMyZTJmZikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl84ZTY3ZjVjMTUwMDY0MWU3OTZhOTQyNTNlNDkyYWY3ZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljg4LCA3OC45MTddLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzc3MzIzYmE1MmExYTQxZTM5M2Q1ZjcyMGJhNTI1ODM5ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV81Zjc3ODI4YmVmYmM0NWQ1YjYzYzdmNTA2YzUzOTU2NCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnM0xUQTRMVEF5SURBNk5UZzZNRGM4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNzczMjNiYTUyYTFhNDFlMzkzZDVmNzIwYmE1MjU4Mzkuc2V0Q29udGVudChpX2ZyYW1lXzVmNzc4MjhiZWZiYzQ1ZDViNjNjN2Y1MDZjNTM5NTY0KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzhlNjdmNWMxNTAwNjQxZTc5NmE5NDI1M2U0OTJhZjdmLmJpbmRQb3B1cChwb3B1cF83NzMyM2JhNTJhMWE0MWUzOTNkNWY3MjBiYTUyNTgzOSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl81OWY5YjIxNDU2MDQ0MjQzYjMyMWE3ZGIxZTJkZmY1NyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0yMS45MDQsIC0xMzguOTk1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8yOGM1MzQwZjk3OTE0ZGIwYjBmOWFkNGFkODZiZjU2YSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfMmU3M2M4ZWQxN2RmNDk4YmE4ZDI0YWEwZTgwMzA4MzMgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZzNMVEV4TFRFNUlERTJPak13T2pVNFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdJQW9nSUNBZyIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzI4YzUzNDBmOTc5MTRkYjBiMGY5YWQ0YWQ4NmJmNTZhLnNldENvbnRlbnQoaV9mcmFtZV8yZTczYzhlZDE3ZGY0OThiYThkMjRhYTBlODAzMDgzMyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl81OWY5YjIxNDU2MDQ0MjQzYjMyMWE3ZGIxZTJkZmY1Ny5iaW5kUG9wdXAocG9wdXBfMjhjNTM0MGY5NzkxNGRiMGIwZjlhZDRhZDg2YmY1NmEpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYjk5YzYyYjI4MmUzNGFiZjgyNTRlNWNmNGM5ZTI1MGYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs3My4zODcsIDU0Ljk5ODAwMDAwMDAwMDAwNV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfODdlYzVkOTIyZjIwNGMxZjk5NzMwY2U3MDExM2Q2OWEgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzM3MmQzNmIyZjdmZjRmMzNhMDA3ZmU1ZTNjMTQ5NDlkID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQ1UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGc0TFRFeUxUQTBJRFU2TVRrNk5UTThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF84N2VjNWQ5MjJmMjA0YzFmOTk3MzBjZTcwMTEzZDY5YS5zZXRDb250ZW50KGlfZnJhbWVfMzcyZDM2YjJmN2ZmNGYzM2EwMDdmZTVlM2MxNDk0OWQpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfYjk5YzYyYjI4MmUzNGFiZjgyNTRlNWNmNGM5ZTI1MGYuYmluZFBvcHVwKHBvcHVwXzg3ZWM1ZDkyMmYyMDRjMWY5OTczMGNlNzAxMTNkNjlhKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzJhMjI0NWY1MTQ0YzRkMTRiMWVjYTFiOTAzMzY2NjhlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuODg2LCA3OC45MjZdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzQ5YjQ0MWNjYjZhZTQ5ZDVhNDQ4YjcxNTk5NjAyM2FmID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV80YzNkNDI3ZjNlYWM0MzRjYTA5N2I1MTNlMWI0ZjE5MCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnNExURXlMVEUzSURRNk1UZzZNRGM4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNDliNDQxY2NiNmFlNDlkNWE0NDhiNzE1OTk2MDIzYWYuc2V0Q29udGVudChpX2ZyYW1lXzRjM2Q0MjdmM2VhYzQzNGNhMDk3YjUxM2UxYjRmMTkwKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzJhMjI0NWY1MTQ0YzRkMTRiMWVjYTFiOTAzMzY2NjhlLmJpbmRQb3B1cChwb3B1cF80OWI0NDFjY2I2YWU0OWQ1YTQ0OGI3MTU5OTYwMjNhZikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl84NDMwNWY4OTUwMTU0YTdlOTJjMGVjZTljNzUzOTU0NiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjkyNSwgNzguNzRdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzE3YzYzNmM2ODhlMjQ3ZWRiNTU5NGI0M2FlMGM2ZDM0ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV83NDgwYTQ1MWMxNDM0ZGU4YjRiZTg3ZTlkMTQ5ZjQyMiA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnNUxUQXlMVEV5SURRNk1UVTZNRGM4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMTdjNjM2YzY4OGUyNDdlZGI1NTk0YjQzYWUwYzZkMzQuc2V0Q29udGVudChpX2ZyYW1lXzc0ODBhNDUxYzE0MzRkZThiNGJlODdlOWQxNDlmNDIyKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzg0MzA1Zjg5NTAxNTRhN2U5MmMwZWNlOWM3NTM5NTQ2LmJpbmRQb3B1cChwb3B1cF8xN2M2MzZjNjg4ZTI0N2VkYjU1OTRiNDNhZTBjNmQzNCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl82OWExM2QwMWQ2ZjU0OGZjYmExMjdlMzQ1ZWI4NmYyNyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQxLjY2NywgODguNjk1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9jZmFiZTJlOWEyZjM0ZmVjOTBlNGM1ZGNjNWM3OGZkYSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfZDFhM2VkZTUxY2Y4NDVhYzk5YzcwMWU4MDFiMGIzODEgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9Ua3pMVEV3TFRBMUlERTZOVGs2TlRjOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQWdDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2NmYWJlMmU5YTJmMzRmZWM5MGU0YzVkY2M1Yzc4ZmRhLnNldENvbnRlbnQoaV9mcmFtZV9kMWEzZWRlNTFjZjg0NWFjOTljNzAxZTgwMWIwYjM4MSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl82OWExM2QwMWQ2ZjU0OGZjYmExMjdlMzQ1ZWI4NmYyNy5iaW5kUG9wdXAocG9wdXBfY2ZhYmUyZTlhMmYzNGZlYzkwZTRjNWRjYzVjNzhmZGEpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfN2I3MTcxNDJhOTEzNDY3OGJkODFiOWJmNTNiZGE0ZmIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0MS42NTcsIDg4LjY5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9kMDE2MmE2MzVmNDk0YWZhOGQ3MDgzMzBlYTcwNGZlOCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfNDU3YmFkNDY1NzRlNDQ4OGI2NDc1NGUwYzkwYTFhZjQgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UazJMVEEyTFRBNElESTZOVFU2TlRnOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQWdDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2QwMTYyYTYzNWY0OTRhZmE4ZDcwODMzMGVhNzA0ZmU4LnNldENvbnRlbnQoaV9mcmFtZV80NTdiYWQ0NjU3NGU0NDg4YjY0NzU0ZTBjOTBhMWFmNCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl83YjcxNzE0MmE5MTM0Njc4YmQ4MWI5YmY1M2JkYTRmYi5iaW5kUG9wdXAocG9wdXBfZDAxNjJhNjM1ZjQ5NGFmYThkNzA4MzMwZWE3MDRmZTgpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYjNjMDQyZGJmYmI0NGU4MTg2NmNhYWY4M2M3NjFiZTggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy4yOTY1LCAtMTE2LjMzMzE2NjddLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzk5OTZiY2M5YmJlNDQ5Mjg4MDEzMDkwM2JkNmFhODlmID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9kMmZjMWE3NmY3Y2U0NTRkYTAzNzdkY2NmMThkZjAzMSA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NE5Ed3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZ0lDQWdJRHhvTXo0Z1JHRjBaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTVRrM05pMHdNUzB3TXlBeE9Ub3hOVG93TVR3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lDQUtJQ0FnSUE9PSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzk5OTZiY2M5YmJlNDQ5Mjg4MDEzMDkwM2JkNmFhODlmLnNldENvbnRlbnQoaV9mcmFtZV9kMmZjMWE3NmY3Y2U0NTRkYTAzNzdkY2NmMThkZjAzMSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9iM2MwNDJkYmZiYjQ0ZTgxODY2Y2FhZjgzYzc2MWJlOC5iaW5kUG9wdXAocG9wdXBfOTk5NmJjYzliYmU0NDkyODgwMTMwOTAzYmQ2YWE4OWYpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZWE0ZDM1M2EzOWE3NDcyY2E5NjUwODFmMzY5MzdkMTcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy4zMDYsIC0xMTYuNDcxNV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYzc4N2ZlMzQwNGU4NGM1MWIyOThhN2VlMjA2MjQwMGEgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2ZlMDI2NTI3Y2UzZjQ5Y2M4YTEwN2U3MDA0MTA3M2E4ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQ0TkR3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnUkdGMFpUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStNVGszTmkwd015MHhOQ0F4TWpvek1Eb3dNVHd2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUNBS0lDQWdJQT09IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYzc4N2ZlMzQwNGU4NGM1MWIyOThhN2VlMjA2MjQwMGEuc2V0Q29udGVudChpX2ZyYW1lX2ZlMDI2NTI3Y2UzZjQ5Y2M4YTEwN2U3MDA0MTA3M2E4KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2VhNGQzNTNhMzlhNzQ3MmNhOTY1MDgxZjM2OTM3ZDE3LmJpbmRQb3B1cChwb3B1cF9jNzg3ZmUzNDA0ZTg0YzUxYjI5OGE3ZWUyMDYyNDAwYSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8wN2IyZGY1Nzc1YjE0OWIxOWE0M2VlNmE1NjE4ZmQ5OSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjMxNDE2NjcsIC0xMTYuNDYwNjY2NzAwMDAwMDJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2M3MzQxZTAxYWQ2ZjRmOTQ5OGJjZTBhNTc5NmI3OWFlID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV82YjFlMjBiZjAwMWM0MTk2OTY3MDc5NTk3NWQyM2EwYSA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NE1qd3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZ0lDQWdJRHhvTXo0Z1JHRjBaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTVRrMk9TMHdPUzB4TmlBeE5Eb3pNRG93TVR3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lDQUtJQ0FnSUE9PSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2M3MzQxZTAxYWQ2ZjRmOTQ5OGJjZTBhNTc5NmI3OWFlLnNldENvbnRlbnQoaV9mcmFtZV82YjFlMjBiZjAwMWM0MTk2OTY3MDc5NTk3NWQyM2EwYSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8wN2IyZGY1Nzc1YjE0OWIxOWE0M2VlNmE1NjE4ZmQ5OS5iaW5kUG9wdXAocG9wdXBfYzczNDFlMDFhZDZmNGY5NDk4YmNlMGE1Nzk2Yjc5YWUpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYzJlYzA5MjY0OTJmNDg1ZmI4ZGU0MTFjZmY3OTBmMGIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy4yNzEzMzMyOTk5OTk5OTUsIC0xMTYuNDg4MzMzM10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNGFmMzE0OTgzYjkzNGNhYjkyNmE3ZjRjMTRkNzg2NzEgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2JjMmQxN2YzN2Q2NDQyOTlhYTg3ZmI4YWY3N2E0OTU2ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQ0TVR3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnUkdGMFpUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStNVGszTmkwd01pMHhNaUF4TkRvME5Ub3dNVHd2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUNBS0lDQWdJQT09IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNGFmMzE0OTgzYjkzNGNhYjkyNmE3ZjRjMTRkNzg2NzEuc2V0Q29udGVudChpX2ZyYW1lX2JjMmQxN2YzN2Q2NDQyOTlhYTg3ZmI4YWY3N2E0OTU2KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2MyZWMwOTI2NDkyZjQ4NWZiOGRlNDExY2ZmNzkwZjBiLmJpbmRQb3B1cChwb3B1cF80YWYzMTQ5ODNiOTM0Y2FiOTI2YTdmNGMxNGQ3ODY3MSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl83ZGU3M2FmMjEzYjI0M2Q1ODljMmY1NjUzODhkMTg4NSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljk4Mzk5OTk5OTk5OTk5NSwgNzguOTc1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF84NWRiODJmOTdkNWM0YmVkYTZkNzRkMjY2MjhkM2FiZSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfMjUzN2QzODYwMjAxNDc3MTljMTk2NDgyZmQyMjlmYTkgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDRQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UYzFMVEV3TFRJNUlEUTZORFk2TlRnOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQWdDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzg1ZGI4MmY5N2Q1YzRiZWRhNmQ3NGQyNjYyOGQzYWJlLnNldENvbnRlbnQoaV9mcmFtZV8yNTM3ZDM4NjAyMDE0NzcxOWMxOTY0ODJmZDIyOWZhOSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl83ZGU3M2FmMjEzYjI0M2Q1ODljMmY1NjUzODhkMTg4NS5iaW5kUG9wdXAocG9wdXBfODVkYjgyZjk3ZDVjNGJlZGE2ZDc0ZDI2NjI4ZDNhYmUpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNmRkZDA5NjJiN2U0NDhmZWIxZGQwZTIzOGQ5YzY2MWEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MC4wNDMsIDc4Ljg5OV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZjNjMDhjMDUwZWJlNDRmN2E5MDg3OTIyNmRhODhjODQgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzExNGMzYmIyMmIxZTQwOTE5YjNiODU0NzI0ZGRhZTBhID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQ0UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGMxTFRFeUxUSTFJRFU2TVRZNk5UYzhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9mM2MwOGMwNTBlYmU0NGY3YTkwODc5MjI2ZGE4OGM4NC5zZXRDb250ZW50KGlfZnJhbWVfMTE0YzNiYjIyYjFlNDA5MTliM2I4NTQ3MjRkZGFlMGEpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNmRkZDA5NjJiN2U0NDhmZWIxZGQwZTIzOGQ5YzY2MWEuYmluZFBvcHVwKHBvcHVwX2YzYzA4YzA1MGViZTQ0ZjdhOTA4NzkyMjZkYTg4Yzg0KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzQ2NGY1N2FjMGUzMTQzZGFhMTY2N2Y1MTlkZTg3ZDQzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTE1LCA3OC45NTJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzQwZWQ1MDAwZWY4MzRjOTg4MjY4YmJmNjI2YWFkNGVkID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV80YjhkNzVmMmZlNTA0MGVhYjFkYjgyZWMyZjU2YTJhZSA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RjMkxUQTNMVEEwSURJNk5UWTZOVGc4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNDBlZDUwMDBlZjgzNGM5ODgyNjhiYmY2MjZhYWQ0ZWQuc2V0Q29udGVudChpX2ZyYW1lXzRiOGQ3NWYyZmU1MDQwZWFiMWRiODJlYzJmNTZhMmFlKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzQ2NGY1N2FjMGUzMTQzZGFhMTY2N2Y1MTlkZTg3ZDQzLmJpbmRQb3B1cChwb3B1cF80MGVkNTAwMGVmODM0Yzk4ODI2OGJiZjYyNmFhZDRlZCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9jODEzNzJjMDUxZDY0M2I1YjA5MzUzMGUwM2JlZjBjMiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljk2ODk5OTk5OTk5OTk5NCwgNzkuMDAxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF81MTY4N2UxNzJkZDk0M2Q0ODhlMGNjYmFmYmRiMGI5YyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfMjBlYjljMTdkMWVjNDgxZTkzZjdlNjcxOGI3MTM0NWQgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDRQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UYzJMVEE0TFRJNElESTZOVFk2TlRnOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQWdDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzUxNjg3ZTE3MmRkOTQzZDQ4OGUwY2NiYWZiZGIwYjljLnNldENvbnRlbnQoaV9mcmFtZV8yMGViOWMxN2QxZWM0ODFlOTNmN2U2NzE4YjcxMzQ1ZCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9jODEzNzJjMDUxZDY0M2I1YjA5MzUzMGUwM2JlZjBjMi5iaW5kUG9wdXAocG9wdXBfNTE2ODdlMTcyZGQ5NDNkNDg4ZTBjY2JhZmJkYjBiOWMpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNTI0M2MyMzJjMzFkNGQwOTg5NjRkOGQ5MWVmNGI3NDcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs3My40MDQsIDU0LjgxN10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZDEzMWFhZjM1OTEwNDNhYWJkN2FiN2E2Mjc3NDJiYTkgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2Q4ZGViZTUyMzRkYTRmMWI5MTJkYThmMTYwMjYyNjBhID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQ0UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGMyTFRBNUxUSTVJREk2TlRrNk5UYzhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9kMTMxYWFmMzU5MTA0M2FhYmQ3YWI3YTYyNzc0MmJhOS5zZXRDb250ZW50KGlfZnJhbWVfZDhkZWJlNTIzNGRhNGYxYjkxMmRhOGYxNjAyNjI2MGEpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNTI0M2MyMzJjMzFkNGQwOTg5NjRkOGQ5MWVmNGI3NDcuYmluZFBvcHVwKHBvcHVwX2QxMzFhYWYzNTkxMDQzYWFiZDdhYjdhNjI3NzQyYmE5KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzI1MjhhYTdkZWM5ZjRlNjE4MzBhZTY4MDJjOTRiNTMwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuODM5LCA3OC45MDZdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzQxNjRlMmY1NWU3NDQzYzViOWUwNTA2NDJkNTExNzVlID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV8wYTFhNTRhZGY1NTA0OGMzYTdhNDFlYmQ2OWE1OTU5OCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RjNExUQTNMVEExSURJNk5EWTZOVGM4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNDE2NGUyZjU1ZTc0NDNjNWI5ZTA1MDY0MmQ1MTE3NWUuc2V0Q29udGVudChpX2ZyYW1lXzBhMWE1NGFkZjU1MDQ4YzNhN2E0MWViZDY5YTU5NTk4KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzI1MjhhYTdkZWM5ZjRlNjE4MzBhZTY4MDJjOTRiNTMwLmJpbmRQb3B1cChwb3B1cF80MTY0ZTJmNTVlNzQ0M2M1YjllMDUwNjQyZDUxMTc1ZSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8xNTA5MDA1MTYxODU0YjdjYjI0Zjg1MDI5NWJkMTdkOSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjgxODAwMDAwMDAwMDAwNSwgNDguMTE0XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8xYjkyZTUxNWU5YWY0M2UxOGEyMjdhOGNmMDAyZDE5NiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfM2Y1MWVmNzk5NmFlNGJiMmJjN2U3OTVlMzUzOGVjOWYgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDRQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UYzRMVEV3TFRFM0lEUTZOVGs2TlRjOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQWdDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzFiOTJlNTE1ZTlhZjQzZTE4YTIyN2E4Y2YwMDJkMTk2LnNldENvbnRlbnQoaV9mcmFtZV8zZjUxZWY3OTk2YWU0YmIyYmM3ZTc5NWUzNTM4ZWM5Zik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8xNTA5MDA1MTYxODU0YjdjYjI0Zjg1MDI5NWJkMTdkOS5iaW5kUG9wdXAocG9wdXBfMWI5MmU1MTVlOWFmNDNlMThhMjI3YThjZjAwMmQxOTYpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYzliMzc0MzVlNjU4NDgyOWFhNmUzYWQ3NzFlYjIyMTUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MC4wNTMwMDAwMDAwMDAwMDQsIDc5LjA2NV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNjE2ZTEzNjYyMTVmNDE2NTljODIxYmFjZGJhOTNiMTkgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzYxYjFkODJmOGJlNjQxNjM5YTY2MjAyZGJhMTMxYzU0ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQ0UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGM1TFRBM0xUQTNJRE02TkRZNk5UYzhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF82MTZlMTM2NjIxNWY0MTY1OWM4MjFiYWNkYmE5M2IxOS5zZXRDb250ZW50KGlfZnJhbWVfNjFiMWQ4MmY4YmU2NDE2MzlhNjYyMDJkYmExMzFjNTQpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfYzliMzc0MzVlNjU4NDgyOWFhNmUzYWQ3NzFlYjIyMTUuYmluZFBvcHVwKHBvcHVwXzYxNmUxMzY2MjE1ZjQxNjU5YzgyMWJhY2RiYTkzYjE5KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzM3NWU5YjFiZDhmYjQyZWY4NTk3ZDhjYzJiMjQwYWI0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNzMuMzM4MDAwMDAwMDAwMDEsIDU0LjgwNjk5OTk5OTk5OTk5NV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYmMzODkyM2IxZDMyNDBkYjkxN2M1NTg2NWFiYjlhYmQgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzFlYzliNGFjMmM5YTQyNjI5MTM0M2U4NDhlZjUxMDI1ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQ0UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGM1TFRFd0xURTRJRGM2TURrNk5UZzhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9iYzM4OTIzYjFkMzI0MGRiOTE3YzU1ODY1YWJiOWFiZC5zZXRDb250ZW50KGlfZnJhbWVfMWVjOWI0YWMyYzlhNDI2MjkxMzQzZTg0OGVmNTEwMjUpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMzc1ZTliMWJkOGZiNDJlZjg1OTdkOGNjMmIyNDBhYjQuYmluZFBvcHVwKHBvcHVwX2JjMzg5MjNiMWQzMjQwZGI5MTdjNTU4NjVhYmI5YWJkKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2QyOGI1MWRkMThhMTQ3NmZhYjQzZjQ0ZjhmMGVhYTJjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuODA2MDAwMDAwMDAwMDA0LCA0OC4xNThdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2U0YWRkYWY1Yjc1MTQ0MTQ4Y2ZhMmY2OWQwZTA0NDY3ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV81OThhZDNjZGY5NGU0MmUzYWQyMTkxMmFmODk4ZTEwZiA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RjNUxURXdMVEkwSURVNk5UazZOVGM4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZTRhZGRhZjViNzUxNDQxNDhjZmEyZjY5ZDBlMDQ0Njcuc2V0Q29udGVudChpX2ZyYW1lXzU5OGFkM2NkZjk0ZTQyZTNhZDIxOTEyYWY4OThlMTBmKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2QyOGI1MWRkMThhMTQ3NmZhYjQzZjQ0ZjhmMGVhYTJjLmJpbmRQb3B1cChwb3B1cF9lNGFkZGFmNWI3NTE0NDE0OGNmYTJmNjlkMGUwNDQ2NykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9kYWE2OTUyYjE3NDU0ZjYyODFmM2Q5MTUzNzg4Y2E0NSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzczLjM1MzAwMDAwMDAwMDAxLCA1NC45OTddLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzNiNTBmZjM0N2IwODRmOWZiNGUyZjZjOTBiZGY1MmQ3ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9jODE0YmMwODdmOWM0MDVlYWMwZjA0ZjY0N2E2NDZlYSA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1Rnd0xURXdMVEV4SURjNk1EazZOVGM4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfM2I1MGZmMzQ3YjA4NGY5ZmI0ZTJmNmM5MGJkZjUyZDcuc2V0Q29udGVudChpX2ZyYW1lX2M4MTRiYzA4N2Y5YzQwNWVhYzBmMDRmNjQ3YTY0NmVhKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2RhYTY5NTJiMTc0NTRmNjI4MWYzZDkxNTM3ODhjYTQ1LmJpbmRQb3B1cChwb3B1cF8zYjUwZmYzNDdiMDg0ZjlmYjRlMmY2YzkwYmRmNTJkNykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9hNGI1YTgzMmJjYTM0ZDI5ODQ4ZjBlOGFlNDliZWViNSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzczLjM0OCwgNTQuNDk1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8zNTEwOTBjOThkYTg0MjlkYjNlYzgzYzMyM2UyNDcyZSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfNjA1MGM3NmZmMzA3NDBmNThhMDI2NDY3NGUyZTliYzYgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDRQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZ3pMVEE1TFRJMUlERXpPakE1T2pVNFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdJQW9nSUNBZyIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzM1MTA5MGM5OGRhODQyOWRiM2VjODNjMzIzZTI0NzJlLnNldENvbnRlbnQoaV9mcmFtZV82MDUwYzc2ZmYzMDc0MGY1OGEwMjY0Njc0ZTJlOWJjNik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9hNGI1YTgzMmJjYTM0ZDI5ODQ4ZjBlOGFlNDliZWViNS5iaW5kUG9wdXAocG9wdXBfMzUxMDkwYzk4ZGE4NDI5ZGIzZWM4M2MzMjNlMjQ3MmUpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNmY2NzdjZDdmYjJhNDY5Y2IzYzQ2OGNjMTFiYmI2NmQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS45MDgsIDc4LjgwN10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYzc2NTA2ZDlmMDUyNDFjZThkZWJhN2ZjZjZiODQwMWQgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzU1NmEwYWYzYWVjYTRiOTE5NWIyMGM0YmFmMWZjNjU2ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQ0UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGcwTFRBeUxURTVJRE02TlRjNk1ETThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9jNzY1MDZkOWYwNTI0MWNlOGRlYmE3ZmNmNmI4NDAxZC5zZXRDb250ZW50KGlfZnJhbWVfNTU2YTBhZjNhZWNhNGI5MTk1YjIwYzRiYWYxZmM2NTYpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNmY2NzdjZDdmYjJhNDY5Y2IzYzQ2OGNjMTFiYmI2NmQuYmluZFBvcHVwKHBvcHVwX2M3NjUwNmQ5ZjA1MjQxY2U4ZGViYTdmY2Y2Yjg0MDFkKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzlkNWQxOTI5NmNiNjQzYjU4ZmJiZGJjYjRhODQ1ZjQ0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTkzLCA3OS4wNzJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2JmYTQzNWY3ZWZhMDQ2MTY4MDMxYzIxMDg3Y2FmMThiID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV85NzY4ZDMwMjFkMzc0YmIyOWVkZTExMzU5MmUxZThjYSA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnMExURXlMVEF5SURNNk1UazZNRFk4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYmZhNDM1ZjdlZmEwNDYxNjgwMzFjMjEwODdjYWYxOGIuc2V0Q29udGVudChpX2ZyYW1lXzk3NjhkMzAyMWQzNzRiYjI5ZWRlMTEzNTkyZTFlOGNhKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzlkNWQxOTI5NmNiNjQzYjU4ZmJiZGJjYjRhODQ1ZjQ0LmJpbmRQb3B1cChwb3B1cF9iZmE0MzVmN2VmYTA0NjE2ODAzMWMyMTA4N2NhZjE4YikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl80MTk2OTRjNjkxNDY0YWIxODYwZmE5Y2M2N2Y3NGY1MSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0yMS44NjY5OTk5OTk5OTk5OTcsIC0xMzguOTI5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8zMTY4MmY3NDg1Zjg0YWEyYTg0NmQwNzU0MjI3NTQzMiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfYmY0OWZjMDEyZDU1NDQyYWE0YjUzNmYwNTJkZWZkNGUgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDRQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZzFMVEV4TFRJMklERTNPalF4T2pVNFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdJQW9nSUNBZyIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzMxNjgyZjc0ODVmODRhYTJhODQ2ZDA3NTQyMjc1NDMyLnNldENvbnRlbnQoaV9mcmFtZV9iZjQ5ZmMwMTJkNTU0NDJhYTRiNTM2ZjA1MmRlZmQ0ZSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl80MTk2OTRjNjkxNDY0YWIxODYwZmE5Y2M2N2Y3NGY1MS5iaW5kUG9wdXAocG9wdXBfMzE2ODJmNzQ4NWY4NGFhMmE4NDZkMDc1NDIyNzU0MzIpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfY2M5ZWE3YmU4OGViNGMzNmFjOWRhZDVmNzlkZmM3OWMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS43OTksIDc4LjExXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9kYjUwN2EwZDNkOWI0NmI3OTc2NzQ5ZjFjNzJhY2QzMiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfZjJkM2I4Yjg1YzA3NDIyMWI1N2Y2ZmIxOWRlOTA3NGUgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDRQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZzNMVEEzTFRFM0lERTZNVGM2TURjOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQWdDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2RiNTA3YTBkM2Q5YjQ2Yjc5NzY3NDlmMWM3MmFjZDMyLnNldENvbnRlbnQoaV9mcmFtZV9mMmQzYjhiODVjMDc0MjIxYjU3ZjZmYjE5ZGU5MDc0ZSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9jYzllYTdiZTg4ZWI0YzM2YWM5ZGFkNWY3OWRmYzc5Yy5iaW5kUG9wdXAocG9wdXBfZGI1MDdhMGQzZDliNDZiNzk3Njc0OWYxYzcyYWNkMzIpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfM2M0OWUzNmEzMjFiNDVhODgxNGY1OTVjNDE2NTVlMjIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs3My4zMzksIDU0LjYyNjAwMDAwMDAwMDAwNV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNzJiMjc3OGExZDNhNDY5ODgwNGU3YzgwZTA2YmU4NWYgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzZmZmEyNzliZDA2MDRjNjNiOTllNWI1N2JjNGUwZGVlID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQ0UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGczTFRBNExUQXlJREk2TURBNk1EQThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF83MmIyNzc4YTFkM2E0Njk4ODA0ZTdjODBlMDZiZTg1Zi5zZXRDb250ZW50KGlfZnJhbWVfNmZmYTI3OWJkMDYwNGM2M2I5OWU1YjU3YmM0ZTBkZWUpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfM2M0OWUzNmEzMjFiNDVhODgxNGY1OTVjNDE2NTVlMjIuYmluZFBvcHVwKHBvcHVwXzcyYjI3NzhhMWQzYTQ2OTg4MDRlN2M4MGUwNmJlODVmKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzdjNWU0MmM5YTlkMDRiYjRhYzI5MjlkM2Y0NDFhNjBkID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDEuNTI3LCA4OC43MV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMGUyNWQzMzI1ODRhNDMxMWEzZjQzYTNiNGZiYWM2ZDEgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2ExMGQzZGJlY2VkZjQ2MGRhZGU5NDQyM2UxZmYxM2U4ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQ0UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGswTFRBMkxURXdJRFk2TWpVNk5UZzhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF8wZTI1ZDMzMjU4NGE0MzExYTNmNDNhM2I0ZmJhYzZkMS5zZXRDb250ZW50KGlfZnJhbWVfYTEwZDNkYmVjZWRmNDYwZGFkZTk0NDIzZTFmZjEzZTgpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfN2M1ZTQyYzlhOWQwNGJiNGFjMjkyOWQzZjQ0MWE2MGQuYmluZFBvcHVwKHBvcHVwXzBlMjVkMzMyNTg0YTQzMTFhM2Y0M2EzYjRmYmFjNmQxKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzVkNzFhZjE3NGY0NTQwYTQ5ZmMxMWZhMDQzYTc5Mzk3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuODIsIDc4LjA3OF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNzM5MTE0NWI5YTI2NGYzY2FmYWFlMmVkM2M3NjgxOTQgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2ZhYTRlOWUxZWMyODRlOGE5MzRiMjgxMTE3MWMzNDkwID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQzUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGMxTFRBeUxUSXdJRFU2TXpJNk5UZzhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF83MzkxMTQ1YjlhMjY0ZjNjYWZhYWUyZWQzYzc2ODE5NC5zZXRDb250ZW50KGlfZnJhbWVfZmFhNGU5ZTFlYzI4NGU4YTkzNGIyODExMTcxYzM0OTApOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNWQ3MWFmMTc0ZjQ1NDBhNDlmYzExZmEwNDNhNzkzOTcuYmluZFBvcHVwKHBvcHVwXzczOTExNDViOWEyNjRmM2NhZmFhZTJlZDNjNzY4MTk0KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2ZiZDRmMjIzODU3NDQwMjBhOTRhNTYxNGNiNTBiYjhhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNzMuMzc2LCA1NC41ODFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzA5YjcxM2FlNGU3YzQwMzJhNWMwNDVmNDk5OTNkMGM3ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9mODFjYTFmZDVhNTE0ODY1YmNhMTIzZGQ5ZmE5YzAxNCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0M1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RjM0xUQTVMVEF4SURJNk5UazZOVGc4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMDliNzEzYWU0ZTdjNDAzMmE1YzA0NWY0OTk5M2QwYzcuc2V0Q29udGVudChpX2ZyYW1lX2Y4MWNhMWZkNWE1MTQ4NjViY2ExMjNkZDlmYTljMDE0KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2ZiZDRmMjIzODU3NDQwMjBhOTRhNTYxNGNiNTBiYjhhLmJpbmRQb3B1cChwb3B1cF8wOWI3MTNhZTRlN2M0MDMyYTVjMDQ1ZjQ5OTkzZDBjNykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9jZDhjNTgxMTM2ZjM0ODg5ODNlNzhhYTI0YmMzMTQzYSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljc0NCwgNzguMTY4XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8yMmM1Y2M4MDc2OWM0ZWZhYWNiNDliN2YwMzkwYjY0NCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfOTk0NGFiMzAzMmYzNGMwMzk3MmY5NmI4N2NiZjMzMzcgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDNQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UYzRMVEEzTFRJNElESTZORFk2TlRnOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQWdDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzIyYzVjYzgwNzY5YzRlZmFhY2I0OWI3ZjAzOTBiNjQ0LnNldENvbnRlbnQoaV9mcmFtZV85OTQ0YWIzMDMyZjM0YzAzOTcyZjk2Yjg3Y2JmMzMzNyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9jZDhjNTgxMTM2ZjM0ODg5ODNlNzhhYTI0YmMzMTQzYS5iaW5kUG9wdXAocG9wdXBfMjJjNWNjODA3NjljNGVmYWFjYjQ5YjdmMDM5MGI2NDQpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZDE2NGU4MThjN2VkNDg3YzlmMzJlNzc2ZjE4NzEzZTMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs3My4zNjksIDU0LjcwOF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfODI3OTI4MzYzOTUzNGUzZWIyNmEwOTVjM2JkMWQ2YmUgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2UyN2U5ZGY2YjU3MjRhNGViMDZkZGNhYmY5YTMxODlmID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQzUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGM1TFRBNUxUSTBJRE02TWprNk5UZzhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF84Mjc5MjgzNjM5NTM0ZTNlYjI2YTA5NWMzYmQxZDZiZS5zZXRDb250ZW50KGlfZnJhbWVfZTI3ZTlkZjZiNTcyNGE0ZWIwNmRkY2FiZjlhMzE4OWYpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZDE2NGU4MThjN2VkNDg3YzlmMzJlNzc2ZjE4NzEzZTMuYmluZFBvcHVwKHBvcHVwXzgyNzkyODM2Mzk1MzRlM2ViMjZhMDk1YzNiZDFkNmJlKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2Y1OTYxY2U0YTZhYTQzNDU4YThmZTUzMjRmOTQwMWIxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTIxLjg3OCwgLTEzOS4wMl0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfODA0ZGE5ZmIyNjU3NGJhZThkNTM1NGEwZjM4NmI5M2YgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2M4OTJiNjc5YTFlODQyMjM4Y2VlOWQ4MGQ4NTdhZTlmID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQzUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGd3TFRBekxUSXpJREU1T2pNMk9qVTRQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnSUFvZ0lDQWciIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF84MDRkYTlmYjI2NTc0YmFlOGQ1MzU0YTBmMzg2YjkzZi5zZXRDb250ZW50KGlfZnJhbWVfYzg5MmI2NzlhMWU4NDIyMzhjZWU5ZDgwZDg1N2FlOWYpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZjU5NjFjZTRhNmFhNDM0NThhOGZlNTMyNGY5NDAxYjEuYmluZFBvcHVwKHBvcHVwXzgwNGRhOWZiMjY1NzRiYWU4ZDUzNTRhMGYzODZiOTNmKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2UzN2FmNDkwMjZkZTQ1MzFhOTIxMDY2ZWQxNzg0MjJmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTIsIDc4Ljg0ODk5OTk5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9mMTBiYTgwNWIyYjA0YTI4YmQ0OTg2YWEzOGI1NjZhYiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfNTBjMDBiMjY1MmVlNDhkM2I2MzgwNDBlMzhkYjZlNzQgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDNQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZ3dMVEEyTFRJNUlESTZNekk2TlRnOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQWdDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2YxMGJhODA1YjJiMDRhMjhiZDQ5ODZhYTM4YjU2NmFiLnNldENvbnRlbnQoaV9mcmFtZV81MGMwMGIyNjUyZWU0OGQzYjYzODA0MGUzOGRiNmU3NCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9lMzdhZjQ5MDI2ZGU0NTMxYTkyMTA2NmVkMTc4NDIyZi5iaW5kUG9wdXAocG9wdXBfZjEwYmE4MDViMmIwNGEyOGJkNDk4NmFhMzhiNTY2YWIpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNTJjYWI4OWU5MGVlNGJkZGE3ZTk3NWVjZDM0YTg4ZDQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MC4wNjYsIDc5LjA0M10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNDkzMmM1Y2RiNDY1NGY2OGI3NzNmYTUyOTEwMDQ1NzYgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzk0ZWE2Y2JiNWIyNzQyNmY5NTQ5MGRhZTE0ODI1ZjBhID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQzUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGd5TFRFeUxUSTJJRE02TXpVNk1UUThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF80OTMyYzVjZGI0NjU0ZjY4Yjc3M2ZhNTI5MTAwNDU3Ni5zZXRDb250ZW50KGlfZnJhbWVfOTRlYTZjYmI1YjI3NDI2Zjk1NDkwZGFlMTQ4MjVmMGEpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNTJjYWI4OWU5MGVlNGJkZGE3ZTk3NWVjZDM0YTg4ZDQuYmluZFBvcHVwKHBvcHVwXzQ5MzJjNWNkYjQ2NTRmNjhiNzczZmE1MjkxMDA0NTc2KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2FmNDBlZTViZTAxODRiMTQ4ZGQzNzgxYmRjZTEzYzZjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTAuMDYxMDAwMDAwMDAwMDEsIDc5LjAwM10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfOWY3YTViNzI4NTNjNDlhMWE1M2UxYmNiNTkyZDMyMmMgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2ZmMGNkZTU1MGM1MzQyNjU4MmNkYTRhNzYyNTg5YzViID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQzUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGcwTFRBekxUQTNJREk2TXprNk1EWThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF85ZjdhNWI3Mjg1M2M0OWExYTUzZTFiY2I1OTJkMzIyYy5zZXRDb250ZW50KGlfZnJhbWVfZmYwY2RlNTUwYzUzNDI2NTgyY2RhNGE3NjI1ODljNWIpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfYWY0MGVlNWJlMDE4NGIxNDhkZDM3ODFiZGNlMTNjNmMuYmluZFBvcHVwKHBvcHVwXzlmN2E1YjcyODUzYzQ5YTFhNTNlMWJjYjU5MmQzMjJjKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzI1Zjg4ZjMwMDc2NzRkYjM5ZDQwNjQ5NDAyMWUyZWY3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuNzQsIDc4LjE2M10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfY2ZkODAyODY3N2NiNDM1YWJiN2QwNjMwOWQ4ZWMxYmIgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzk0ZjgzMWQ5Zjg1NTRmOWM5ZmY4ZDU1NjVkMTEyYzEzID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQzUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGcwTFRBMExURTFJRE02TVRjNk1EazhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9jZmQ4MDI4Njc3Y2I0MzVhYmI3ZDA2MzA5ZDhlYzFiYi5zZXRDb250ZW50KGlfZnJhbWVfOTRmODMxZDlmODU1NGY5YzlmZjhkNTU2NWQxMTJjMTMpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMjVmODhmMzAwNzY3NGRiMzlkNDA2NDk0MDIxZTJlZjcuYmluZFBvcHVwKHBvcHVwX2NmZDgwMjg2NzdjYjQzNWFiYjdkMDYzMDlkOGVjMWJiKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzcyNDY1ZTI3YjZjYzRjOWQ4YThhMWMyYmZjMzU3MTI3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTIxLjg1MTk5OTk5OTk5OTk5NywgLTEzOC45NjFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzIyNDY2NTEzMDVmNzQ1Njc4ZGYyNTQ3ZmZiYmEwYTM5ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9kNTA3MjhjODg0YzE0NDAyODlkYWI3NTBjYzkxZjk3MyA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0M1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnMExUQTFMVEV5SURFM09qTXdPalU0UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ0lBb2dJQ0FnIiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMjI0NjY1MTMwNWY3NDU2NzhkZjI1NDdmZmJiYTBhMzkuc2V0Q29udGVudChpX2ZyYW1lX2Q1MDcyOGM4ODRjMTQ0MDI4OWRhYjc1MGNjOTFmOTczKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzcyNDY1ZTI3YjZjYzRjOWQ4YThhMWMyYmZjMzU3MTI3LmJpbmRQb3B1cChwb3B1cF8yMjQ2NjUxMzA1Zjc0NTY3OGRmMjU0N2ZmYmJhMGEzOSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl83NTRlZTIxOWRiZjA0MmJlOGZjMTBjZTRiZWRkMTQ3MiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0yMS44ODMwMDAwMDAwMDAwMDMsIC0xMzguOTk0XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9kOTc2ZDE3YmJjMmI0OTRlOWM3ZmUyMzYwZjdjNGM1OCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfMGQzZGVhNGUxNThjNDYwOGI1MDIwYmU4N2ZjODAwNzEgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDNQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZzBMVEV4TFRBeUlESXdPalEwT2pVNVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdJQW9nSUNBZyIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2Q5NzZkMTdiYmMyYjQ5NGU5YzdmZTIzNjBmN2M0YzU4LnNldENvbnRlbnQoaV9mcmFtZV8wZDNkZWE0ZTE1OGM0NjA4YjUwMjBiZTg3ZmM4MDA3MSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl83NTRlZTIxOWRiZjA0MmJlOGZjMTBjZTRiZWRkMTQ3Mi5iaW5kUG9wdXAocG9wdXBfZDk3NmQxN2JiYzJiNDk0ZTljN2ZlMjM2MGY3YzRjNTgpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMzA1NTc1MDdkNGYxNDZmZjljYTczNWFmMWE3ZDcwOTQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjEuODIzLCAtMTM5LjA0OF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYzZkNTAzOGFlMTM0NGViYTk0ODZkMTdmMjZmMzE3NmEgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzA5M2I5YTYwNTA3NjRhYjM5OWU1YjQxZjNjMTA1ZWRhID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQzUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGcxTFRBMUxUQTRJREl3T2pJM09qVTVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnSUFvZ0lDQWciIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9jNmQ1MDM4YWUxMzQ0ZWJhOTQ4NmQxN2YyNmYzMTc2YS5zZXRDb250ZW50KGlfZnJhbWVfMDkzYjlhNjA1MDc2NGFiMzk5ZTViNDFmM2MxMDVlZGEpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMzA1NTc1MDdkNGYxNDZmZjljYTczNWFmMWE3ZDcwOTQuYmluZFBvcHVwKHBvcHVwX2M2ZDUwMzhhZTEzNDRlYmE5NDg2ZDE3ZjI2ZjMxNzZhKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2MwOTgwODI4MTgzMjQxMTNhZjdkOTUyOGU5ZTRmNmMzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTIxLjg5ODAwMDAwMDAwMDAwMywgLTEzOS4wMjZdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzYxMzM2NTE0ZmM5MDQxYjE5M2QyNjYxNjVlYTI0ZjRiID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV82Mjg1ZGYzMWZiYzY0ODI5YWM5ZWE5MDcwYWUzMzc3MCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0M1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnMkxUQTFMVE13SURFM09qSTBPalU0UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ0lBb2dJQ0FnIiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNjEzMzY1MTRmYzkwNDFiMTkzZDI2NjE2NWVhMjRmNGIuc2V0Q29udGVudChpX2ZyYW1lXzYyODVkZjMxZmJjNjQ4MjlhYzllYTkwNzBhZTMzNzcwKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2MwOTgwODI4MTgzMjQxMTNhZjdkOTUyOGU5ZTRmNmMzLmJpbmRQb3B1cChwb3B1cF82MTMzNjUxNGZjOTA0MWIxOTNkMjY2MTY1ZWEyNGY0YikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9kMzZkY2NlOGMxMTI0MTI5YWQzOGYxNDczMWU1YzhmYiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0yMS44MTE5OTk5OTk5OTk5OTgsIC0xMzguOTU5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8yNzViMmI4ZmYyMjk0ZjE0OTg5NmIxMTk2ZmYwMTFiZSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfZGFjZDI0NzQyMTBkNGE1M2FmMTRiYmRmNDBkYWNmNDIgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDNQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZzNMVEV4TFRBMUlERTNPakk1T2pVNVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdJQW9nSUNBZyIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzI3NWIyYjhmZjIyOTRmMTQ5ODk2YjExOTZmZjAxMWJlLnNldENvbnRlbnQoaV9mcmFtZV9kYWNkMjQ3NDIxMGQ0YTUzYWYxNGJiZGY0MGRhY2Y0Mik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9kMzZkY2NlOGMxMTI0MTI5YWQzOGYxNDczMWU1YzhmYi5iaW5kUG9wdXAocG9wdXBfMjc1YjJiOGZmMjI5NGYxNDk4OTZiMTE5NmZmMDExYmUpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZjFkY2M2YWM0ZWRhNDhkYzk0YjNiNGUxYjdjMjYyMTMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs3My4zNjEsIDU0LjcwN10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMWRhM2MzODBlMWNhNDBhZmFiYzUwZjg3N2M0NGZhNWIgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2VlNDI2OGY1Y2I1NzRjYjlhMzE0OGVlMTI1YzdhM2NjID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQzUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGt3TFRFd0xUSTBJREUwT2pVM09qVTRQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnSUFvZ0lDQWciIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF8xZGEzYzM4MGUxY2E0MGFmYWJjNTBmODc3YzQ0ZmE1Yi5zZXRDb250ZW50KGlfZnJhbWVfZWU0MjY4ZjVjYjU3NGNiOWEzMTQ4ZWUxMjVjN2EzY2MpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZjFkY2M2YWM0ZWRhNDhkYzk0YjNiNGUxYjdjMjYyMTMuYmluZFBvcHVwKHBvcHVwXzFkYTNjMzgwZTFjYTQwYWZhYmM1MGY4NzdjNDRmYTViKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzAzNThjYWM0NmZmNTQ0N2E5NTNkZWJkMWE4NzM5ZDY4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuMjkwMTY2NywgLTExNi40MTE1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9hNTg2NjdmNzAxOTM0ZjRlYTA2ZWEwZDJlZTkxMmU4YiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfNmRmNGRmNTkxN2M0NDg3ZWI2NGIxYjEyNDExYjdiODggPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDJOend2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK01UazNOUzB4TUMweU9DQXhORG96TURvd01Ed3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZ0lDQWdJQ0FLSUNBZ0lBPT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9hNTg2NjdmNzAxOTM0ZjRlYTA2ZWEwZDJlZTkxMmU4Yi5zZXRDb250ZW50KGlfZnJhbWVfNmRmNGRmNTkxN2M0NDg3ZWI2NGIxYjEyNDExYjdiODgpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMDM1OGNhYzQ2ZmY1NDQ3YTk1M2RlYmQxYTg3MzlkNjguYmluZFBvcHVwKHBvcHVwX2E1ODY2N2Y3MDE5MzRmNGVhMDZlYTBkMmVlOTEyZThiKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzQ1Njk3M2E4YzdkOTRjZDU5ZTRlYmViOGUxYTBmY2IxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuMjQ1LCAtMTE2LjM0Nl0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfN2I0OWFjZjBhMzNkNGQyMWFlMzhiZmNiNzczZmIyNTcgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzdmZjg3NDA1OTcyODQzMWFiMzZiZDIxOWI5ODk5ZjYwID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQyTkR3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnUkdGMFpUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStNVGszTXkwd05pMHdOaUF4TXpvd01Eb3dNVHd2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUNBS0lDQWdJQT09IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfN2I0OWFjZjBhMzNkNGQyMWFlMzhiZmNiNzczZmIyNTcuc2V0Q29udGVudChpX2ZyYW1lXzdmZjg3NDA1OTcyODQzMWFiMzZiZDIxOWI5ODk5ZjYwKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzQ1Njk3M2E4YzdkOTRjZDU5ZTRlYmViOGUxYTBmY2IxLmJpbmRQb3B1cChwb3B1cF83YjQ5YWNmMGEzM2Q0ZDIxYWUzOGJmY2I3NzNmYjI1NykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl80ZDMwYTNiODRhNmU0ZjhlODcwMzgwOGY0OGY2NDk2MyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjgzNSwgNzguMjMyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9lYmY5NDJiNzdhZTA0Y2JmYjI3MjM2NTk2ZDBhOGUxNyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfMDdhZThlNzMyMmRjNGExNzgzMmY4ZmU5MmViOTkwM2QgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDJQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UY3pMVEF5TFRFMklEVTZNREk2TlRnOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQWdDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2ViZjk0MmI3N2FlMDRjYmZiMjcyMzY1OTZkMGE4ZTE3LnNldENvbnRlbnQoaV9mcmFtZV8wN2FlOGU3MzIyZGM0YTE3ODMyZjhmZTkyZWI5OTAzZCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl80ZDMwYTNiODRhNmU0ZjhlODcwMzgwOGY0OGY2NDk2My5iaW5kUG9wdXAocG9wdXBfZWJmOTQyYjc3YWUwNGNiZmIyNzIzNjU5NmQwYThlMTcpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYTk4MzFiM2ZiOTEyNDBhMGIyYzZjMzcyZDdiZGEzZmEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS45NiwgNzkuMDQ2XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9hZTFkZmIwY2VmMWI0ZTJhYjMyNDE1N2Y3ODk4OWM2ZiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfNzdlNzhhNWMwYzc3NGUzYmJiNGZhNjczMzNhMGZlZDMgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDJQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UYzBMVEV5TFRJM0lEVTZORFk2TlRjOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQWdDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2FlMWRmYjBjZWYxYjRlMmFiMzI0MTU3Zjc4OTg5YzZmLnNldENvbnRlbnQoaV9mcmFtZV83N2U3OGE1YzBjNzc0ZTNiYmI0ZmE2NzMzM2EwZmVkMyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9hOTgzMWIzZmI5MTI0MGEwYjJjNmMzNzJkN2JkYTNmYS5iaW5kUG9wdXAocG9wdXBfYWUxZGZiMGNlZjFiNGUyYWIzMjQxNTdmNzg5ODljNmYpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfY2E5NWY5ZDA4OTA1NDU0Njg2MWZlZjZjZTlhYzM2NGMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS45OSwgNzguOTg0XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9mNzI0NDE0YWU2NDY0ZWI5YjE4MzU0YTFmNGU3ODYyYyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfNTE4YzBhYjllMTZkNDMwZmIxYzgyZjY3YmRhZjRiYTYgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDJQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UYzFMVEEwTFRJM0lEVTZNelk2TlRjOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQWdDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2Y3MjQ0MTRhZTY0NjRlYjliMTgzNTRhMWY0ZTc4NjJjLnNldENvbnRlbnQoaV9mcmFtZV81MThjMGFiOWUxNmQ0MzBmYjFjODJmNjdiZGFmNGJhNik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9jYTk1ZjlkMDg5MDU0NTQ2ODYxZmVmNmNlOWFjMzY0Yy5iaW5kUG9wdXAocG9wdXBfZjcyNDQxNGFlNjQ2NGViOWIxODM1NGExZjRlNzg2MmMpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMGNkYTMzNjcyYjcyNDJlM2I4OTEzZGU4YThjN2RiNzggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS45NDM5OTk5OTk5OTk5OTYsIDc4Ljg0Nl0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYTZjZWY4YzkyNjhkNDFlZmEwNDRkZDgwZTYwYzg0ZGYgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2FmNjIzOGYzZWFiMDRhODU4YjA2ODUwNGZmN2FkZDI5ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQyUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGMzTFRBMUxUSTVJREk2TlRZNk5UZzhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9hNmNlZjhjOTI2OGQ0MWVmYTA0NGRkODBlNjBjODRkZi5zZXRDb250ZW50KGlfZnJhbWVfYWY2MjM4ZjNlYWIwNGE4NThiMDY4NTA0ZmY3YWRkMjkpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMGNkYTMzNjcyYjcyNDJlM2I4OTEzZGU4YThjN2RiNzguYmluZFBvcHVwKHBvcHVwX2E2Y2VmOGM5MjY4ZDQxZWZhMDQ0ZGQ4MGU2MGM4NGRmKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2NjYmFkYjNiODJmNjQ1OGE4ZTRjNDZhZjFjMzI4MzcwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTAuMDU5LCA3OC45MDddLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzk3ZDJlMmEzZDdkYTRmMDdhNTVhZjgwMDIyMDRmODAwID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9lNTAwNmE4ZmM2NGM0YjMyYjQ3NmRlMTJhODg3MzFkYyA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0MlBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RjM0xURXdMVEk1SURNNk1EYzZNRE04TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfOTdkMmUyYTNkN2RhNGYwN2E1NWFmODAwMjIwNGY4MDAuc2V0Q29udGVudChpX2ZyYW1lX2U1MDA2YThmYzY0YzRiMzJiNDc2ZGUxMmE4ODczMWRjKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2NjYmFkYjNiODJmNjQ1OGE4ZTRjNDZhZjFjMzI4MzcwLmJpbmRQb3B1cChwb3B1cF85N2QyZTJhM2Q3ZGE0ZjA3YTU1YWY4MDAyMjA0ZjgwMCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl80YjQ2ZWFhMGMyYTY0NGU3YTMzMmRiMWE3ZGJhMWI2NyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzYzLjcwNiwgMTI1LjMyMV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMjAxNzJmYzliZGI4NDRlYThhZDYwZGFmNDk0YzBhYTMgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzhhMzRlNjEwOGU1ZTQ1OTI4NzZhNTk3YjMzMGQwZjI5ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQyUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGM0TFRBNExUQTVJREUzT2pVNU9qVTRQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnSUFvZ0lDQWciIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF8yMDE3MmZjOWJkYjg0NGVhOGFkNjBkYWY0OTRjMGFhMy5zZXRDb250ZW50KGlfZnJhbWVfOGEzNGU2MTA4ZTVlNDU5Mjg3NmE1OTdiMzMwZDBmMjkpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNGI0NmVhYTBjMmE2NDRlN2EzMzJkYjFhN2RiYTFiNjcuYmluZFBvcHVwKHBvcHVwXzIwMTcyZmM5YmRiODQ0ZWE4YWQ2MGRhZjQ5NGMwYWEzKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzE3MzA1ZDU2YjRhNjQ1NDViNzFkMzg0YjZiOTAzYWRlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNzMuMzgsIDU0LjY2OV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZGEyOGUzMmM3ODEwNDEyYThmYzM0NmFlMTUwOTgyNzMgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2Y2MjRjMDZmMmE5ZjQ4ODJiMTIxYzIxNzcwZDlkODJlID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQyUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGM0TFRBNUxUSTNJREk2TURRNk5UZzhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9kYTI4ZTMyYzc4MTA0MTJhOGZjMzQ2YWUxNTA5ODI3My5zZXRDb250ZW50KGlfZnJhbWVfZjYyNGMwNmYyYTlmNDg4MmIxMjFjMjE3NzBkOWQ4MmUpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMTczMDVkNTZiNGE2NDU0NWI3MWQzODRiNmI5MDNhZGUuYmluZFBvcHVwKHBvcHVwX2RhMjhlMzJjNzgxMDQxMmE4ZmMzNDZhZTE1MDk4MjczKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2JkMzAyNTliM2NjZDQ1OTVhNTM2ZTI5YmE2OTRkNDVmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTAuMDQ2MDAwMDAwMDAwMDEsIDc4Ljk4M10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMDZiNjE0MzAyYmY4NGIwZDgxYWUzYjRmMWQ1NDM4NTcgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2UyZjc3M2YyNjJmODRiY2Y4Y2Q3NTkwMmM4MzdhYzEwID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQyUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGM0TFRFeExUQTBJRFU2TURVNk5UZzhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF8wNmI2MTQzMDJiZjg0YjBkODFhZTNiNGYxZDU0Mzg1Ny5zZXRDb250ZW50KGlfZnJhbWVfZTJmNzczZjI2MmY4NGJjZjhjZDc1OTAyYzgzN2FjMTApOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfYmQzMDI1OWIzY2NkNDU5NWE1MzZlMjliYTY5NGQ0NWYuYmluZFBvcHVwKHBvcHVwXzA2YjYxNDMwMmJmODRiMGQ4MWFlM2I0ZjFkNTQzODU3KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2JiOTlmM2MxZmYzZTQ4M2ZiZjUzOGUzZDQ0MzQ3ZTFmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuODEzLCA0OC4wOTddLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzlkOGJiMmI2ZDk3NzQzY2Y4Zjk4NTgwOGEyODk4MDI1ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV82NGZlMzY2YWNjM2I0YTc5OTI4YWM5MTc4OGZiMDZmMiA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0MlBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RjNUxUQTNMVEUwSURRNk5UazZOVFU4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfOWQ4YmIyYjZkOTc3NDNjZjhmOTg1ODA4YTI4OTgwMjUuc2V0Q29udGVudChpX2ZyYW1lXzY0ZmUzNjZhY2MzYjRhNzk5MjhhYzkxNzg4ZmIwNmYyKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2JiOTlmM2MxZmYzZTQ4M2ZiZjUzOGUzZDQ0MzQ3ZTFmLmJpbmRQb3B1cChwb3B1cF85ZDhiYjJiNmQ5Nzc0M2NmOGY5ODU4MDhhMjg5ODAyNSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl82NDFmYWFkMTFmZmQ0MTcwODE2YjhhOTQ4NDk3MTVhMyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljk0Mzk5OTk5OTk5OTk5NiwgNzkuMDM4XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9kMGIwODU0MmNhNzk0NTc0OTZhM2JjODFlOTkwNDI0OSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfZmNlMzUxYzIxODczNGZlMDk3MDEyMmRhOGJiYzYzOTEgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDJQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZ3dMVEEyTFRFeUlETTZNalk2TlRnOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQWdDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2QwYjA4NTQyY2E3OTQ1NzQ5NmEzYmM4MWU5OTA0MjQ5LnNldENvbnRlbnQoaV9mcmFtZV9mY2UzNTFjMjE4NzM0ZmUwOTcwMTIyZGE4YmJjNjM5MSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl82NDFmYWFkMTFmZmQ0MTcwODE2YjhhOTQ4NDk3MTVhMy5iaW5kUG9wdXAocG9wdXBfZDBiMDg1NDJjYTc5NDU3NDk2YTNiYzgxZTk5MDQyNDkpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYTI4ZmFkZTg0NjdiNDViY2I2Mzc4YTljMzRlYzAzZWEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjEuOTM4MDAwMDAwMDAwMDAyLCAtMTM4Ljk2MV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfOTM4MDQ0Y2IzOWFiNGJmNjg5NGUzOGYwZjc3NzViZWMgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzFmZjBhZDAwNWFhOTQyMWZiNjQ3MWM3NWI3N2NlYWJlID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQyUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGd3TFRFeUxUQXpJREUzT2pNeU9qVTRQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnSUFvZ0lDQWciIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF85MzgwNDRjYjM5YWI0YmY2ODk0ZTM4ZjBmNzc3NWJlYy5zZXRDb250ZW50KGlfZnJhbWVfMWZmMGFkMDA1YWE5NDIxZmI2NDcxYzc1Yjc3Y2VhYmUpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfYTI4ZmFkZTg0NjdiNDViY2I2Mzc4YTljMzRlYzAzZWEuYmluZFBvcHVwKHBvcHVwXzkzODA0NGNiMzlhYjRiZjY4OTRlMzhmMGY3Nzc1YmVjKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2E3YmI1ZmNjODM3MDRkZTRiNTVmMThkMzFkN2IyZWZkID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTAuMDA4LCA3OS4wMjNdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzJkMDkyYTU3Mjg3ODQwZmM4ZjllZTEzNTJmNDc5M2QxID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9lYmMyYWE0ZDFhNTI0ODM0Yjc0NzhmN2QwNjhiMjg4NCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0MlBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RneExUQXpMVEk1SURRNk1ETTZOVEE4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMmQwOTJhNTcyODc4NDBmYzhmOWVlMTM1MmY0NzkzZDEuc2V0Q29udGVudChpX2ZyYW1lX2ViYzJhYTRkMWE1MjQ4MzRiNzQ3OGY3ZDA2OGIyODg0KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2E3YmI1ZmNjODM3MDRkZTRiNTVmMThkMzFkN2IyZWZkLmJpbmRQb3B1cChwb3B1cF8yZDA5MmE1NzI4Nzg0MGZjOGY5ZWUxMzUyZjQ3OTNkMSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9lMjljMzBlYmE5Y2I0MjMyODNiODQxZjk0NWYxZjVjNiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljg2LCA3OC44NTddLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2Q1MzUwNjFkYjMxZTRiMDE4MWZkMWU4Y2E3N2MxMjFhID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV8wNWM2ODg1MDFiNmQ0ZjEwYjU1OTM3OTRiYjdmYjhjNCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0MlBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RneExURXhMVEk1SURNNk16VTZNRGs4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZDUzNTA2MWRiMzFlNGIwMTgxZmQxZThjYTc3YzEyMWEuc2V0Q29udGVudChpX2ZyYW1lXzA1YzY4ODUwMWI2ZDRmMTBiNTU5Mzc5NGJiN2ZiOGM0KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2UyOWMzMGViYTljYjQyMzI4M2I4NDFmOTQ1ZjFmNWM2LmJpbmRQb3B1cChwb3B1cF9kNTM1MDYxZGIzMWU0YjAxODFmZDFlOGNhNzdjMTIxYSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9kMDZkMjAyM2NkYTc0NWUyODg5NTgyYWQ5ZTg1OWYyMyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0yMS44NjQsIC0xMzguOTQyOTk5OTk5OTk5OThdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzUzZWI2MDg1NWIyMjQxODM5YWYwZDFhYzU2Y2NhZGUxID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV84NmI4NmM4YzY0ZGE0MmI0YTc4MDE2ZDMwYmMyYjRkNCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0MlBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RneUxUQTNMVEkxSURFNE9qQXhPalU0UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ0lBb2dJQ0FnIiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNTNlYjYwODU1YjIyNDE4MzlhZjBkMWFjNTZjY2FkZTEuc2V0Q29udGVudChpX2ZyYW1lXzg2Yjg2YzhjNjRkYTQyYjRhNzgwMTZkMzBiYzJiNGQ0KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2QwNmQyMDIzY2RhNzQ1ZTI4ODk1ODJhZDllODU5ZjIzLmJpbmRQb3B1cChwb3B1cF81M2ViNjA4NTViMjI0MTgzOWFmMGQxYWM1NmNjYWRlMSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl81YmZlOWVhZDNjNTc0N2UzOGNkM2VkNGJkZGRkOWQ5NSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzczLjM5MiwgNTQuNTU5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8wOWU4ZTA3OWU0ZGQ0MjE1Yjc0ODZmOTRjOGUwYTVmNCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfODg3ZDg0YzUwMWRhNDE0ZjkyYTY5MmNjMWY2ZGM5MmQgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDJQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZ3lMVEV3TFRFeElEYzZNVFE2TlRnOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQWdDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzA5ZThlMDc5ZTRkZDQyMTViNzQ4NmY5NGM4ZTBhNWY0LnNldENvbnRlbnQoaV9mcmFtZV84ODdkODRjNTAxZGE0MTRmOTJhNjkyY2MxZjZkYzkyZCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl81YmZlOWVhZDNjNTc0N2UzOGNkM2VkNGJkZGRkOWQ5NS5iaW5kUG9wdXAocG9wdXBfMDllOGUwNzllNGRkNDIxNWI3NDg2Zjk0YzhlMGE1ZjQpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNDdlOGE0ZGZiYzY2NGE3YmE5ZTMzY2RkOTE1N2I5NzAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjEuODQ2OTk5OTk5OTk5OTk4LCAtMTM4LjkwNl0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfODc1YmZjNTZiNGUwNDQ1OTkzNmVjNmMzNTU3MGZlYjcgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzU3MmJlZjE2NTVhYTQ1ZjA5ODZlYzcwMDc5ZjcxYWVmID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQyUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGd6TFRBMExURTVJREU0T2pVeU9qVTRQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnSUFvZ0lDQWciIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF84NzViZmM1NmI0ZTA0NDU5OTM2ZWM2YzM1NTcwZmViNy5zZXRDb250ZW50KGlfZnJhbWVfNTcyYmVmMTY1NWFhNDVmMDk4NmVjNzAwNzlmNzFhZWYpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNDdlOGE0ZGZiYzY2NGE3YmE5ZTMzY2RkOTE1N2I5NzAuYmluZFBvcHVwKHBvcHVwXzg3NWJmYzU2YjRlMDQ0NTk5MzZlYzZjMzU1NzBmZWI3KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2RlMjI2NDM5MGE5MzQ2NDg5OTFhYzI0ZTQzNTg4ZjliID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTIxLjg0ODAwMDAwMDAwMDAwMywgLTEzOC45MTI5OTk5OTk5OTk5OF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfOGRlYjAzMTU3OWRjNGVmZGE4ZmFhZTFhYTYxNGIwODcgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2MyNDQ1Zjk3Y2RhNjRmMTFhZjliMGUwZTRlMTBmZDJjID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQyUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGcwTFRFeUxUQTJJREUzT2pJNE9qVTVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnSUFvZ0lDQWciIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF84ZGViMDMxNTc5ZGM0ZWZkYThmYWFlMWFhNjE0YjA4Ny5zZXRDb250ZW50KGlfZnJhbWVfYzI0NDVmOTdjZGE2NGYxMWFmOWIwZTBlNGUxMGZkMmMpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZGUyMjY0MzkwYTkzNDY0ODk5MWFjMjRlNDM1ODhmOWIuYmluZFBvcHVwKHBvcHVwXzhkZWIwMzE1NzlkYzRlZmRhOGZhYWUxYWE2MTRiMDg3KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2U0YmU1Njg5NmIzODQzYzZhYTE5MGU4NjE0ZThhZDU1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuODMsIDc4LjEyNV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfM2I4NDhmYzI4NjQ1NGNlMjk5MjUzYzg1M2ZjOGNlYmQgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzlhZWFkM2EwYWQzMDQ3NjI5ZmZjZjBhZTg1MzhmMjRiID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQyUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGczTFRBMUxUQTJJRFE2TURJNk1EWThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF8zYjg0OGZjMjg2NDU0Y2UyOTkyNTNjODUzZmM4Y2ViZC5zZXRDb250ZW50KGlfZnJhbWVfOWFlYWQzYTBhZDMwNDc2MjlmZmNmMGFlODUzOGYyNGIpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZTRiZTU2ODk2YjM4NDNjNmFhMTkwZTg2MTRlOGFkNTUuYmluZFBvcHVwKHBvcHVwXzNiODQ4ZmMyODY0NTRjZTI5OTI1M2M4NTNmYzhjZWJkKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzE5ZGRlNzZiOGQ2NDRjZWM5NWZiNzNiNDE3MmVmOWMzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTIxLjg5MywgLTEzOC45NjRdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzI1Mjk4YzNmMjkzZDQ3YzRiOTkzZDM0ODA3MmYwMWMxID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV8yYjRmMjQxNGM5MzA0ZTdlYTNiY2Y0OTNjYmE2Yzg3NCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0MlBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnM0xUQTFMVEl3SURFM09qQTBPalU0UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ0lBb2dJQ0FnIiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMjUyOThjM2YyOTNkNDdjNGI5OTNkMzQ4MDcyZjAxYzEuc2V0Q29udGVudChpX2ZyYW1lXzJiNGYyNDE0YzkzMDRlN2VhM2JjZjQ5M2NiYTZjODc0KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzE5ZGRlNzZiOGQ2NDRjZWM5NWZiNzNiNDE3MmVmOWMzLmJpbmRQb3B1cChwb3B1cF8yNTI5OGMzZjI5M2Q0N2M0Yjk5M2QzNDgwNzJmMDFjMSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9hNmFmMjU1MmQ2Yzc0NWZlOGFhYTNhZmQwMmRlOTkzNCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzczLjM2Mzk5OTk5OTk5OTk5LCA1NC40NDVdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzBkYWZiNGJjZjM4OTQyODc5NzNlYmQ5MGRmN2QwOTYwID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV8zOWNiNzRjNGM4NGM0ZjMzYWFhNzhjZjg5MjVjNWNjYyA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0MlBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnNExUQTFMVEEzSURJeU9qUTVPalU0UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ0lBb2dJQ0FnIiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMGRhZmI0YmNmMzg5NDI4Nzk3M2ViZDkwZGY3ZDA5NjAuc2V0Q29udGVudChpX2ZyYW1lXzM5Y2I3NGM0Yzg0YzRmMzNhYWE3OGNmODkyNWM1Y2NjKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2E2YWYyNTUyZDZjNzQ1ZmU4YWFhM2FmZDAyZGU5OTM0LmJpbmRQb3B1cChwb3B1cF8wZGFmYjRiY2YzODk0Mjg3OTczZWJkOTBkZjdkMDk2MCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl80MjNhY2Y5MDEwNTU0OWEzODQ3NTlkNGQ3MDA0MmE3YiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0yMS45MDMwMDAwMDAwMDAwMDIsIC0xMzkuMDA5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8xMTliNDMzYzIxMWM0N2EzYWJkYWY1ZDg0NWU4NzNlZCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfMmJlMzc0ZGNiNjI2NGVlNDk2ZmZmNzYwYTY3OTFjNWYgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDJQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZzRMVEExTFRJMUlERTNPakF3T2pVNFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdJQW9nSUNBZyIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzExOWI0MzNjMjExYzQ3YTNhYmRhZjVkODQ1ZTg3M2VkLnNldENvbnRlbnQoaV9mcmFtZV8yYmUzNzRkY2I2MjY0ZWU0OTZmZmY3NjBhNjc5MWM1Zik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl80MjNhY2Y5MDEwNTU0OWEzODQ3NTlkNGQ3MDA0MmE3Yi5iaW5kUG9wdXAocG9wdXBfMTE5YjQzM2MyMTFjNDdhM2FiZGFmNWQ4NDVlODczZWQpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMGI4NjQzNGY5OWU5NDAyMWJlMmVmMmY0NzYxNTY2MTQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjEuODUzLCAtMTM5LjAwNl0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfOTFmYTM2YWY0NzMxNDFjMTg5N2I4MzA3MjM0MjcxNjIgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzg0YmUxY2ViYjk4YTQ4MTM4OWU0ZDcwYjM3NGQ4N2FlID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQyUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGc1TFRBMUxURXhJREUyT2pRME9qVTRQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnSUFvZ0lDQWciIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF85MWZhMzZhZjQ3MzE0MWMxODk3YjgzMDcyMzQyNzE2Mi5zZXRDb250ZW50KGlfZnJhbWVfODRiZTFjZWJiOThhNDgxMzg5ZTRkNzBiMzc0ZDg3YWUpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMGI4NjQzNGY5OWU5NDAyMWJlMmVmMmY0NzYxNTY2MTQuYmluZFBvcHVwKHBvcHVwXzkxZmEzNmFmNDczMTQxYzE4OTdiODMwNzIzNDI3MTYyKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzBkNGQ2MjExMDgxNTRhMmE4ZmQzNGIzNjY2OTRkZTgzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuODg4MDAwMDAwMDAwMDA1LCA3OC44MDE5OTk5OTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMjI4MDJiN2M0MGZmNDJhNzlhNTkyNzczNzQyNTAyZGQgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzAzMTE1YmQxZThjMTQzNmZhM2EyNTk3NzkwNzNhZDQzID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQyUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGc1TFRBM0xUQTRJRE02TkRZNk5UZzhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF8yMjgwMmI3YzQwZmY0MmE3OWE1OTI3NzM3NDI1MDJkZC5zZXRDb250ZW50KGlfZnJhbWVfMDMxMTViZDFlOGMxNDM2ZmEzYTI1OTc3OTA3M2FkNDMpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMGQ0ZDYyMTEwODE1NGEyYThmZDM0YjM2NjY5NGRlODMuYmluZFBvcHVwKHBvcHVwXzIyODAyYjdjNDBmZjQyYTc5YTU5Mjc3Mzc0MjUwMmRkKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2U5ZTU1MzhiOWVmNjQwNGU5MGRjNDJmOTU2N2ZiZGNiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTIyLjI3NiwgLTEzOC44MzZdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzFkMDUyMThhOTE4NDRjMmE5MDIxZTE1OGEwMGYzY2Q2ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV80ZDFlMzc5NmI3ODg0Y2M0YWFiNTQ1MmViNjVhMjA1ZCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0MlBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnNUxURXhMVEkzSURFMk9qVTVPalU0UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ0lBb2dJQ0FnIiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMWQwNTIxOGE5MTg0NGMyYTkwMjFlMTU4YTAwZjNjZDYuc2V0Q29udGVudChpX2ZyYW1lXzRkMWUzNzk2Yjc4ODRjYzRhYWI1NDUyZWI2NWEyMDVkKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2U5ZTU1MzhiOWVmNjQwNGU5MGRjNDJmOTU2N2ZiZGNiLmJpbmRQb3B1cChwb3B1cF8xZDA1MjE4YTkxODQ0YzJhOTAyMWUxNThhMDBmM2NkNikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl84ZjUwYmZmZWVmNDE0ZTkxODhhMzEwZjNiNTE3ZGMzMiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjMwMDUsIC0xMTYuNTM0MTY2NzAwMDAwMDFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2FhOTk4MmFkMWI2NDQ0NjdiYzY2YjgxM2IwNGEwMzMyID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV83OGVlMzUyODZhYWM0NzQzYjk2MGI3MTlhNGZlM2JlNyA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0MU5Ed3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZ0lDQWdJRHhvTXo0Z1JHRjBaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTVRrM01DMHdNeTB5TmlBeE9Ub3dNRG93TVR3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lDQUtJQ0FnSUE9PSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2FhOTk4MmFkMWI2NDQ0NjdiYzY2YjgxM2IwNGEwMzMyLnNldENvbnRlbnQoaV9mcmFtZV83OGVlMzUyODZhYWM0NzQzYjk2MGI3MTlhNGZlM2JlNyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl84ZjUwYmZmZWVmNDE0ZTkxODhhMzEwZjNiNTE3ZGMzMi5iaW5kUG9wdXAocG9wdXBfYWE5OTgyYWQxYjY0NDQ2N2JjNjZiODEzYjA0YTAzMzIpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfODIwYzg2NWVmN2UzNDM3Y2I2YzY3OWUwODRjMjI5NGMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy4yNzg4MzMyOTk5OTk5OTUsIC0xMTYuMzY4NjY2NzAwMDAwMDJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzY1ZDk0YTA4NDVhODRkZmNhNjI2ZTU2NTBjNDU3MWZkID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV80MzFhMDFlOTc4ZmI0MjBlOGM2NTJiYTkwNTgyMDBiYyA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0MU1qd3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZ0lDQWdJRHhvTXo0Z1JHRjBaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTVRrM05TMHdOaTB5TmlBeE1qb3pNRG93TVR3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lDQUtJQ0FnSUE9PSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzY1ZDk0YTA4NDVhODRkZmNhNjI2ZTU2NTBjNDU3MWZkLnNldENvbnRlbnQoaV9mcmFtZV80MzFhMDFlOTc4ZmI0MjBlOGM2NTJiYTkwNTgyMDBiYyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl84MjBjODY1ZWY3ZTM0MzdjYjZjNjc5ZTA4NGMyMjk0Yy5iaW5kUG9wdXAocG9wdXBfNjVkOTRhMDg0NWE4NGRmY2E2MjZlNTY1MGM0NTcxZmQpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYzc2MmYxMjU5ZWQ1NDI5NDlmMzMwNzRjN2M4ZWE5NzggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy4yNTU4MzMzLCAtMTE2LjMxMTgzMzI5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF85MmE1Mzk4YWZmYWM0NDE4YmM1NTFlOWViZjIxZjUyZSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfOTI3MDliZTJhYTJhNDU4MDkxYzJkYzRjNzVjMTA1NDEgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDFNand2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK01UazNOaTB3TXkweE55QXhORG94TlRvd01Ud3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZ0lDQWdJQ0FLSUNBZ0lBPT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF85MmE1Mzk4YWZmYWM0NDE4YmM1NTFlOWViZjIxZjUyZS5zZXRDb250ZW50KGlfZnJhbWVfOTI3MDliZTJhYTJhNDU4MDkxYzJkYzRjNzVjMTA1NDEpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfYzc2MmYxMjU5ZWQ1NDI5NDlmMzMwNzRjN2M4ZWE5NzguYmluZFBvcHVwKHBvcHVwXzkyYTUzOThhZmZhYzQ0MThiYzU1MWU5ZWJmMjFmNTJlKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzM3ODM5MzJkNWIwODQ0YjNiOTc2NmQ4YTYyZDNmMDIxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNjguOTEzLCA3NS44OTldLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2U1ZGE0MTBlY2RjMDQzZDdhZTU2MzYxZjA2MWY1NDk0ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV8wNWJlYzQ5ZmQ4MmI0M2QwYjA3MDdiZWE5NTI5MGQxOCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0MVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RjMExUQTRMVEUwSURFME9qVTVPalU0UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ0lBb2dJQ0FnIiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZTVkYTQxMGVjZGMwNDNkN2FlNTYzNjFmMDYxZjU0OTQuc2V0Q29udGVudChpX2ZyYW1lXzA1YmVjNDlmZDgyYjQzZDBiMDcwN2JlYTk1MjkwZDE4KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzM3ODM5MzJkNWIwODQ0YjNiOTc2NmQ4YTYyZDNmMDIxLmJpbmRQb3B1cChwb3B1cF9lNWRhNDEwZWNkYzA0M2Q3YWU1NjM2MWYwNjFmNTQ5NCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9hNTU0MWVmYTM5ZGM0MjNiODZjZWU2ZWM3OGI2NGI3ZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljk3MiwgNzguOTY4XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9kMzNjMTZmODM2OGQ0OTU1YmY4OTMzNTQ1NGRmNDAyYiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfM2Y5NmNiODZiYjkwNDhlNTljNGI1YzE3ZGJhMmQ2ODIgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDFQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UYzBMVEV3TFRFMklEWTZNekk2TlRnOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQWdDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2QzM2MxNmY4MzY4ZDQ5NTViZjg5MzM1NDU0ZGY0MDJiLnNldENvbnRlbnQoaV9mcmFtZV8zZjk2Y2I4NmJiOTA0OGU1OWM0YjVjMTdkYmEyZDY4Mik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9hNTU0MWVmYTM5ZGM0MjNiODZjZWU2ZWM3OGI2NGI3ZC5iaW5kUG9wdXAocG9wdXBfZDMzYzE2ZjgzNjhkNDk1NWJmODkzMzU0NTRkZjQwMmIpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNjI3N2VkZWYwNjFmNGRiOWE1NzFlMWU0MWNkMmFjOTEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS43NjM5OTk5OTk5OTk5OTYsIDc4LjA4OV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYjJjMTBhZjk4ODE1NDc5Zjk4ZGVmYzBiNzFmODhlN2MgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzhjNDkxZDlmNzRiNjRjNzQ5ZTBhOGQwNTJhNGVjZmNmID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQxUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGMxTFRBMkxUQTRJRE02TWpZNk5UZzhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9iMmMxMGFmOTg4MTU0NzlmOThkZWZjMGI3MWY4OGU3Yy5zZXRDb250ZW50KGlfZnJhbWVfOGM0OTFkOWY3NGI2NGM3NDllMGE4ZDA1MmE0ZWNmY2YpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNjI3N2VkZWYwNjFmNGRiOWE1NzFlMWU0MWNkMmFjOTEuYmluZFBvcHVwKHBvcHVwX2IyYzEwYWY5ODgxNTQ3OWY5OGRlZmMwYjcxZjg4ZTdjKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzcyZjY0ZGJiYTRkNzRlOThiN2ExNjFkMDkwNWZhYjY4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuODQxLCA3OC4xNzM5OTk5OTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfOThiZGU0ZmI5ZDBmNGJkZDg3MzQ5MjMxNDVjMGQwOTUgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2VlZTkzNWQ2YTY4NTQ5MjZiNDY1Yjk2OWU3NTE2NGVjID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQxUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGMzTFRFd0xUSTVJRE02TURZNk5UZzhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF85OGJkZTRmYjlkMGY0YmRkODczNDkyMzE0NWMwZDA5NS5zZXRDb250ZW50KGlfZnJhbWVfZWVlOTM1ZDZhNjg1NDkyNmI0NjViOTY5ZTc1MTY0ZWMpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNzJmNjRkYmJhNGQ3NGU5OGI3YTE2MWQwOTA1ZmFiNjguYmluZFBvcHVwKHBvcHVwXzk4YmRlNGZiOWQwZjRiZGQ4NzM0OTIzMTQ1YzBkMDk1KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2ExZDJiNWE3NGExYTQ3YjJhMDc1Mzc0M2Q2ZTA5YzY2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuNzMzOTk5OTk5OTk5OTk1LCA3OC4wNzRdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzdlNDMwYjM4MmU1MzQ3NTdhZTQ4YmQ5OWE1Yzg4ZjRjID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV8zMWRmMGI5MWYyNGM0NjE0OWVkM2VkMGFjMTdmNmFiMCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0MVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RjNExUQXpMVEkySURNNk5UWTZOVGc4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfN2U0MzBiMzgyZTUzNDc1N2FlNDhiZDk5YTVjODhmNGMuc2V0Q29udGVudChpX2ZyYW1lXzMxZGYwYjkxZjI0YzQ2MTQ5ZWQzZWQwYWMxN2Y2YWIwKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2ExZDJiNWE3NGExYTQ3YjJhMDc1Mzc0M2Q2ZTA5YzY2LmJpbmRQb3B1cChwb3B1cF83ZTQzMGIzODJlNTM0NzU3YWU0OGJkOTlhNWM4OGY0YykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9mN2UwM2JlMTdkODc0ODM0OTEyOTJlZmFlNTQwOTllYSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzYzLjE0MywgNjMuMzkxOTk5OTk5OTk5OTk2XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9lY2I5YTZiZDFhNGQ0MDNmODZhNjE2OGQ3ZDM2N2M5MiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfNjIzYTZlNDJlNDI5NGIyNmI2ODc0NGRjZjczNTExMTkgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDFQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UYzRMVEV3TFRFM0lERXpPalU1T2pVNFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdJQW9nSUNBZyIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2VjYjlhNmJkMWE0ZDQwM2Y4NmE2MTY4ZDdkMzY3YzkyLnNldENvbnRlbnQoaV9mcmFtZV82MjNhNmU0MmU0Mjk0YjI2YjY4NzQ0ZGNmNzM1MTExOSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9mN2UwM2JlMTdkODc0ODM0OTEyOTJlZmFlNTQwOTllYS5iaW5kUG9wdXAocG9wdXBfZWNiOWE2YmQxYTRkNDAzZjg2YTYxNjhkN2QzNjdjOTIpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMmE3NDc1NGNlZTEyNDlkNDgyMjRjMTg1Nzg4NWM1YmQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS45NDY5OTk5OTk5OTk5OTYsIDc4Ljc5ODk5OTk5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8wODQ0MjU1ZDAwYjc0MzJmODE5NzA1YzExZDJkYjk2YyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfNDI5ZWZiYTlmOGNlNDYxM2I5NTdmODA2NzNiOWUyOTMgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDFQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZ3dMVEEwTFRJMUlETTZOVFk2TlRjOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQWdDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzA4NDQyNTVkMDBiNzQzMmY4MTk3MDVjMTFkMmRiOTZjLnNldENvbnRlbnQoaV9mcmFtZV80MjllZmJhOWY4Y2U0NjEzYjk1N2Y4MDY3M2I5ZTI5Myk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8yYTc0NzU0Y2VlMTI0OWQ0ODIyNGMxODU3ODg1YzViZC5iaW5kUG9wdXAocG9wdXBfMDg0NDI1NWQwMGI3NDMyZjgxOTcwNWMxMWQyZGI5NmMpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZDBjMzRjMzU3Zjc2NGE5MGI4NmQzMmQyYzNkYzNmYjIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS43MjksIDc4LjFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2JiYzlhNzUwYzlhNzQ0OTc4YzExMDFlYjFmN2I1NTlmID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV84NjM5ZjlmMzcyNTY0MmQ2YWRjYTliNjY0OTBiZjcxMSA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0MVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1Rnd0xUQTFMVEl5SURNNk5UWTZOVGc4TDJadmJuUStQQzlvTXo0S0lDQWdJQ0FnSUNBZ0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYmJjOWE3NTBjOWE3NDQ5NzhjMTEwMWViMWY3YjU1OWYuc2V0Q29udGVudChpX2ZyYW1lXzg2MzlmOWYzNzI1NjQyZDZhZGNhOWI2NjQ5MGJmNzExKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2QwYzM0YzM1N2Y3NjRhOTBiODZkMzJkMmMzZGMzZmIyLmJpbmRQb3B1cChwb3B1cF9iYmM5YTc1MGM5YTc0NDk3OGMxMTAxZWIxZjdiNTU5ZikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl84ZjJhY2U3ODc4NDk0ODA2OGE1NTQwMjU5MDE1NWI0YyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0yMi4wMjMwMDAwMDAwMDAwMDMsIC0xMzguODczXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8zNTJkN2VjM2M5OTY0MWJmYmExMGRkZDk0ZmY0OTg5YiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfMjVkNGYzMWQ2MzhjNGQ0YThjNTFlN2E2MjMwZDI0ZjMgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDFQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZ3dMVEEyTFRFMklERTRPakkyT2pVNFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdJQW9nSUNBZyIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzM1MmQ3ZWMzYzk5NjQxYmZiYTEwZGRkOTRmZjQ5ODliLnNldENvbnRlbnQoaV9mcmFtZV8yNWQ0ZjMxZDYzOGM0ZDRhOGM1MWU3YTYyMzBkMjRmMyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl84ZjJhY2U3ODc4NDk0ODA2OGE1NTQwMjU5MDE1NWI0Yy5iaW5kUG9wdXAocG9wdXBfMzUyZDdlYzNjOTk2NDFiZmJhMTBkZGQ5NGZmNDk4OWIpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNTZkZjBjNWQ3YTJhNDVmYmEwZDI5ZjkxZjMzMjE5MjQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs2OC4yMDUsIDUzLjY1NjAwMDAwMDAwMDAwNl0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfM2JjNGY1NjkzZjhjNDI3MmJlZjMyNzNlOTZlMTFkNjEgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2IxYWYzMzljNGQwMTQ3Y2VhNzEzMzU3OGYyMDlhMzBhID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQxUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGd4TFRBMUxUSTFJRFE2TlRrNk5UYzhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF8zYmM0ZjU2OTNmOGM0MjcyYmVmMzI3M2U5NmUxMWQ2MS5zZXRDb250ZW50KGlfZnJhbWVfYjFhZjMzOWM0ZDAxNDdjZWE3MTMzNTc4ZjIwOWEzMGEpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNTZkZjBjNWQ3YTJhNDVmYmEwZDI5ZjkxZjMzMjE5MjQuYmluZFBvcHVwKHBvcHVwXzNiYzRmNTY5M2Y4YzQyNzJiZWYzMjczZTk2ZTExZDYxKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2YwMWNlNGQ5ZDhkNTQ2OTZiYmVmYjdhNzg2MzJkNjFlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDEuNTY2LCA4OC43NjZdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzQ5OGIwOGU3M2VlZjQwY2NiNTJjYzE2OTBjZmEyOTUxID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV80YmU3ZGFkY2NkODk0MTE3YjE3MmI5N2ZhZWE1MTZmMiA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0MVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnekxURXdMVEEySURFd09qQXdPakF6UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ0lBb2dJQ0FnIiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNDk4YjA4ZTczZWVmNDBjY2I1MmNjMTY5MGNmYTI5NTEuc2V0Q29udGVudChpX2ZyYW1lXzRiZTdkYWRjY2Q4OTQxMTdiMTcyYjk3ZmFlYTUxNmYyKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2YwMWNlNGQ5ZDhkNTQ2OTZiYmVmYjdhNzg2MzJkNjFlLmJpbmRQb3B1cChwb3B1cF80OThiMDhlNzNlZWY0MGNjYjUyY2MxNjkwY2ZhMjk1MSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9hNjhhMzA1MzY5NGQ0N2I5YWIyNWJiZmNkMWYyN2VlZSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUwLjA2NiwgNzkuMDM2XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8zOWUwN2M0OTEwNzE0MThkOWFkZTI0ZjMxZDcxOWY2MSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfY2I3ZGI3ZmZlMGI4NDhhNThlYTFiMDdhMDJjMzE0ZWIgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDFQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZ3pMVEV4TFRJd0lETTZNamM2TURROEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQWdDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzM5ZTA3YzQ5MTA3MTQxOGQ5YWRlMjRmMzFkNzE5ZjYxLnNldENvbnRlbnQoaV9mcmFtZV9jYjdkYjdmZmUwYjg0OGE1OGVhMWIwN2EwMmMzMTRlYik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9hNjhhMzA1MzY5NGQ0N2I5YWIyNWJiZmNkMWYyN2VlZS5iaW5kUG9wdXAocG9wdXBfMzllMDdjNDkxMDcxNDE4ZDlhZGUyNGYzMWQ3MTlmNjEpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMDg0ZDUyMzFhNWEwNDFjYjhlYmJlZmJmNWVhZTdkN2UgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS44MzgsIDc4LjIxOF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNWQ0MDhmNDcyZWU1NDhkZDg4OTNlNmE0ZGQzY2Q5YmMgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzM5YjM2YjU4NTRiZTQ5NTViM2VkZTMxYjNlYWYyODFjID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQxUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGd6TFRFeUxUSTJJRFE2TWprNk1EYzhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lDQWdJQ0FnQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF81ZDQwOGY0NzJlZTU0OGRkODg5M2U2YTRkZDNjZDliYy5zZXRDb250ZW50KGlfZnJhbWVfMzliMzZiNTg1NGJlNDk1NWIzZWRlMzFiM2VhZjI4MWMpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMDg0ZDUyMzFhNWEwNDFjYjhlYmJlZmJmNWVhZTdkN2UuYmluZFBvcHVwKHBvcHVwXzVkNDA4ZjQ3MmVlNTQ4ZGQ4ODkzZTZhNGRkM2NkOWJjKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzExNjA1ZTJkYjRhYjQ2NDA5OWQ3MThlNWFhYWVhY2Q2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTM4OTk5OTk5OTk5OTksIDc4LjgyMzAwMDAwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF84NTVkNDVkNjcyYjA0OGYwOTc0MWQ1NjIwZmYzNGFjOCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfNmVhMDhkNDQ4YWQwNDFjMmJjNmNkNmY0ZjM4NjhkZTYgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDFQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZzNMVEF6TFRFeUlERTZOVGM2TVRjOEwyWnZiblErUEM5b016NEtJQ0FnSUNBZ0lDQWdDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzg1NWQ0NWQ2NzJiMDQ4ZjA5NzQxZDU2MjBmZjM0YWM4LnNldENvbnRlbnQoaV9mcmFtZV82ZWEwOGQ0NDhhZDA0MWMyYmM2Y2Q2ZjRmMzg2OGRlNik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8xMTYwNWUyZGI0YWI0NjQwOTlkNzE4ZTVhYWFlYWNkNi5iaW5kUG9wdXAocG9wdXBfODU1ZDQ1ZDY3MmIwNDhmMDk3NDFkNTYyMGZmMzRhYzgpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNmJlODNlMzAxYTI1NDdlZjhlMjllOGEzYWJiYzdiNTMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjEuODIyLCAtMTM5LjAyOV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfOGY4MzVmMmFlZjhiNDcwYTgwMjlhM2QxZWQwNDg1ZGYgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzBjZjkxNGRmMDRiNjRhZGI4MWQwNWRhMmIwZDcxNWZjID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQxUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGczTFRFd0xUSXpJREUyT2pRNU9qVTVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnSUFvZ0lDQWciIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF84ZjgzNWYyYWVmOGI0NzBhODAyOWEzZDFlZDA0ODVkZi5zZXRDb250ZW50KGlfZnJhbWVfMGNmOTE0ZGYwNGI2NGFkYjgxZDA1ZGEyYjBkNzE1ZmMpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNmJlODNlMzAxYTI1NDdlZjhlMjllOGEzYWJiYzdiNTMuYmluZFBvcHVwKHBvcHVwXzhmODM1ZjJhZWY4YjQ3MGE4MDI5YTNkMWVkMDQ4NWRmKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2E4ZjdmMGFiYTU0MzRiZTY4ZTc1MjNmNTNjODAyMzRhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTIxLjg2Njk5OTk5OTk5OTk5NywgLTEzOS4wNzJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzNkZjE0ZGUxOTZjNjRjZTdhN2YzMzA1ODM2NzE3OGRlID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV8zY2U0NzNkYWQ2OTk0NTk5ODM0ZDg4MmZhYTQ5MjE4MyA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0MVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnNExUQTFMVEV4SURFMk9qVTVPalU0UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ0lBb2dJQ0FnIiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfM2RmMTRkZTE5NmM2NGNlN2E3ZjMzMDU4MzY3MTc4ZGUuc2V0Q29udGVudChpX2ZyYW1lXzNjZTQ3M2RhZDY5OTQ1OTk4MzRkODgyZmFhNDkyMTgzKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2E4ZjdmMGFiYTU0MzRiZTY4ZTc1MjNmNTNjODAyMzRhLmJpbmRQb3B1cChwb3B1cF8zZGYxNGRlMTk2YzY0Y2U3YTdmMzMwNTgzNjcxNzhkZSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl85OGFjMzQ4ODM5ZTk0Y2ExYmI5MGY0MzcyOTY2YjE1YiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0yMi4yNDQsIC0xMzguODM2XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9hMjRlOTI2ZmZlMzQ0OTQ4OTE4NWQ1YWFkMjViOGUzNSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfNGQyNzU2ZjBjMzZhNGI3MWEzZjc1MDQwZGU0MWIzNzkgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDFQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZzRMVEV4TFRNd0lERTNPalUwT2pVNFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdJQW9nSUNBZyIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2EyNGU5MjZmZmUzNDQ5NDg5MTg1ZDVhYWQyNWI4ZTM1LnNldENvbnRlbnQoaV9mcmFtZV80ZDI3NTZmMGMzNmE0YjcxYTNmNzUwNDBkZTQxYjM3OSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl85OGFjMzQ4ODM5ZTk0Y2ExYmI5MGY0MzcyOTY2YjE1Yi5iaW5kUG9wdXAocG9wdXBfYTI0ZTkyNmZmZTM0NDk0ODkxODVkNWFhZDI1YjhlMzUpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZDI0ZTg2OGZlZmY3NDk5NGIyY2VmYjNmZGU3OTZhZGUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjIuMjUyLCAtMTM4LjczNF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGJjNGZkZmFhOGQ0MmNjYjg3ZWIxMzc5NzJkNGRjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNTU4YmNjZTY5NTI4NDBkOTk1Y2U1NjNkZmI3MTZhZmQgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2FkZmQxODc2YWJiZjQxZGNhNTRhNzJhODQ1YjViMDcyID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQxUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGc1TFRBMkxURXdJREUzT2pJNU9qVTRQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnSUFvZ0lDQWciIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNDQiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF81NThiY2NlNjk1Mjg0MGQ5OTVjZTU2M2RmYjcxNmFmZC5zZXRDb250ZW50KGlfZnJhbWVfYWRmZDE4NzZhYmJmNDFkY2E1NGE3MmE4NDViNWIwNzIpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZDI0ZTg2OGZlZmY3NDk5NGIyY2VmYjNmZGU3OTZhZGUuYmluZFBvcHVwKHBvcHVwXzU1OGJjY2U2OTUyODQwZDk5NWNlNTYzZGZiNzE2YWZkKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2JhZDUwZTkxOGFlOTQ0MTM4ZjA1YWFjZWMyYWYyYzJkID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTIyLjIxNSwgLTEzOC44NDFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRiYzRmZGZhYThkNDJjY2I4N2ViMTM3OTcyZDRkYzApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2U5ODQwNTZkYWYzMjRkMDViNjQ5ODI5ZTE5YTg0YTdkID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9hNmQ0Nzc4MDk5YWQ0ODBlOGUzOWZlN2RiNGUxZGYwZSA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0MVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1Rrd0xUQTJMVEkySURFM09qVTVPalU0UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ0lBb2dJQ0FnIiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTQ0Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZTk4NDA1NmRhZjMyNGQwNWI2NDk4MjllMTlhODRhN2Quc2V0Q29udGVudChpX2ZyYW1lX2E2ZDQ3NzgwOTlhZDQ4MGU4ZTM5ZmU3ZGI0ZTFkZjBlKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2JhZDUwZTkxOGFlOTQ0MTM4ZjA1YWFjZWMyYWYyYzJkLmJpbmRQb3B1cChwb3B1cF9lOTg0MDU2ZGFmMzI0ZDA1YjY0OTgyOWUxOWE4NGE3ZCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9lZDlkNzVmYWNiNDE0ODkyOThmM2Y4NWJlMDA3YmM4ZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0yMi4yNTgwMDAwMDAwMDAwMDMsIC0xMzguODA1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8xY2Q5YzU0Yjg1MTE0ZDBjODkwYmY0MDk5MTY2NGI3ZiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfNjc4MDYwMGIwYmY4NDZiNGIxOTVjMTc5MDdhMWY1ZDggPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDFQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9Ua3dMVEV4TFRFMElERTRPakV4T2pVNFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdJQW9nSUNBZyIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzFjZDljNTRiODUxMTRkMGM4OTBiZjQwOTkxNjY0YjdmLnNldENvbnRlbnQoaV9mcmFtZV82NzgwNjAwYjBiZjg0NmI0YjE5NWMxNzkwN2ExZjVkOCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9lZDlkNzVmYWNiNDE0ODkyOThmM2Y4NWJlMDA3YmM4Zi5iaW5kUG9wdXAocG9wdXBfMWNkOWM1NGI4NTExNGQwYzg5MGJmNDA5OTE2NjRiN2YpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMDkzYzA4NTM3ZmEzNDk5MThjMmM3ZmNkMDQ3YjAxYTQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjIuMjU2LCAtMTM4Ljc5Mzk5OTk5OTk5OTk4XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0YmM0ZmRmYWE4ZDQyY2NiODdlYjEzNzk3MmQ0ZGMwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9lMzI1MzM3ODAwMGM0ZGQ3YTg1ZjJlMzA0NDRlMzMzOCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfMDQ3YTU2NGE3MmM4NDdiNTg2YTZmMTAwMzMxYmUxMTQgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDFQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9Ua3hMVEExTFRJNUlERTRPalU1T2pVNFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdJQW9nSUNBZyIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE0NCI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2UzMjUzMzc4MDAwYzRkZDdhODVmMmUzMDQ0NGUzMzM4LnNldENvbnRlbnQoaV9mcmFtZV8wNDdhNTY0YTcyYzg0N2I1ODZhNmYxMDAzMzFiZTExNCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8wOTNjMDg1MzdmYTM0OTkxOGMyYzdmY2QwNDdiMDFhNC5iaW5kUG9wdXAocG9wdXBfZTMyNTMzNzgwMDBjNGRkN2E4NWYyZTMwNDQ0ZTMzMzgpCiAgICAgICAgOwoKICAgICAgICAKICAgIAo8L3NjcmlwdD4=\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x114e7a550>"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"map_Nuke2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Here i have added place to the popup and trimmed the date so it no longer shows the time and day just year and month. "
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [],
"source": [
"map_Nuke3 = folium.Map(location=[0,0], width=510, height=510,\n",
" zoom_start=1, max_zoom=40)\n",
"\n",
"for i in range (len(pysqldf(Nuke_Query)['latitude'])):\n",
" # Generate a caption using HTML, embedded within an iframe inside the popup\n",
" html=\"\"\"\n",
" <h3> Magnitude: <font color=\"red\">{}</font></h3>\n",
" <h3> Date: <font color=\"red\">{}</font></h3>\n",
" <h3> Location: <font color=\"red\">{}</font></h3>\n",
" \"\"\".format(pysqldf(Nuke_Query)['magnitude'][i], pysqldf(Nuke_Query)['occurred_on'][i][:7],pysqldf(Nuke_Query)['place'][i])\n",
" iframe = folium.IFrame(html=html, width=260, height=155)\n",
" \n",
" popup = folium.Popup(iframe, max_width=800)\n",
" folium.Marker(location = [pysqldf(Nuke_Query)['latitude'][i],\n",
" pysqldf(Nuke_Query)['longitude'][i]], popup=popup,).add_to(map_Nuke3) \n",
"# popup = folium.LatLngPopup().add_to(map_Nuke3)\n"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgCiAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgTF9OT19UT1VDSCA9IGZhbHNlOwogICAgICAgICAgICBMX0RJU0FCTEVfM0QgPSBmYWxzZTsKICAgICAgICA8L3NjcmlwdD4KICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjEyLjQubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9qcy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjQuMC9kaXN0L2xlYWZsZXQuY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMi4wL2Nzcy9ib290c3RyYXAubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9mb250LWF3ZXNvbWUvNC42LjMvY3NzL2ZvbnQtYXdlc29tZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLzIuMC4yL2xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2Nkbi5naXRoYWNrLmNvbS9weXRob24tdmlzdWFsaXphdGlvbi9mb2xpdW0vbWFzdGVyL2ZvbGl1bS90ZW1wbGF0ZXMvbGVhZmxldC5hd2Vzb21lLnJvdGF0ZS5jc3MiLz4KICAgIDxzdHlsZT5odG1sLCBib2R5IHt3aWR0aDogMTAwJTtoZWlnaHQ6IDEwMCU7bWFyZ2luOiAwO3BhZGRpbmc6IDA7fTwvc3R5bGU+CiAgICA8c3R5bGU+I21hcCB7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7cmlnaHQ6MDtsZWZ0OjA7fTwvc3R5bGU+CiAgICAKICAgICAgICAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwKICAgICAgICAgICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgICAgICAgICAgPHN0eWxlPgogICAgICAgICAgICAgICAgI21hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1NyB7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgIHdpZHRoOiA1MTAuMHB4OwogICAgICAgICAgICAgICAgICAgIGhlaWdodDogNTEwLjBweDsKICAgICAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgICAgIHRvcDogMC4wJTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgPC9zdHlsZT4KICAgICAgICAKPC9oZWFkPgo8Ym9keT4gICAgCiAgICAKICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9saXVtLW1hcCIgaWQ9Im1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1NyIgPjwvZGl2PgogICAgICAgIAo8L2JvZHk+CjxzY3JpcHQ+ICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcgPSBMLm1hcCgKICAgICAgICAgICAgICAgICJtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTciLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNlbnRlcjogWzAuMCwgMC4wXSwKICAgICAgICAgICAgICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3LAogICAgICAgICAgICAgICAgICAgIHpvb206IDEsCiAgICAgICAgICAgICAgICAgICAgem9vbUNvbnRyb2w6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgcHJlZmVyQ2FudmFzOiBmYWxzZSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIAoKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgdGlsZV9sYXllcl8wZjhlZTc0ZjRiODQ0OGJlYTdlZmI3YmU3NWFhZmFhZCA9IEwudGlsZUxheWVyKAogICAgICAgICAgICAgICAgImh0dHBzOi8ve3N9LnRpbGUub3BlbnN0cmVldG1hcC5vcmcve3p9L3t4fS97eX0ucG5nIiwKICAgICAgICAgICAgICAgIHsiYXR0cmlidXRpb24iOiAiRGF0YSBieSBcdTAwMjZjb3B5OyBcdTAwM2NhIGhyZWY9XCJodHRwOi8vb3BlbnN0cmVldG1hcC5vcmdcIlx1MDAzZU9wZW5TdHJlZXRNYXBcdTAwM2MvYVx1MDAzZSwgdW5kZXIgXHUwMDNjYSBocmVmPVwiaHR0cDovL3d3dy5vcGVuc3RyZWV0bWFwLm9yZy9jb3B5cmlnaHRcIlx1MDAzZU9EYkxcdTAwM2MvYVx1MDAzZS4iLCAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsICJtYXhOYXRpdmVab29tIjogNDAsICJtYXhab29tIjogNDAsICJtaW5ab29tIjogMCwgIm5vV3JhcCI6IGZhbHNlLCAib3BhY2l0eSI6IDEsICJzdWJkb21haW5zIjogImFiYyIsICJ0bXMiOiBmYWxzZX0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZWVmMmY2NjZkYzc2NGVlZGFhZDI4MDc5YmY4NzYwYzcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs3MC43NzksIDU0LjE3N10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYTA4OTg1OTVmMWQyNDlkYmFkY2I5N2Q0MGUwYTFkYWIgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2IwYmZmYjg0NTZhNDQwYjRiNTFlYTFlNjEzNGRkMzQyID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOaTQ1UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGN6TFRFd1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1RtOTJZWGxoSUZwbGJXeDVZU3dnVW5WemMybGhQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9hMDg5ODU5NWYxZDI0OWRiYWRjYjk3ZDQwZTBhMWRhYi5zZXRDb250ZW50KGlfZnJhbWVfYjBiZmZiODQ1NmE0NDBiNGI1MWVhMWU2MTM0ZGQzNDIpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZWVmMmY2NjZkYzc2NGVlZGFhZDI4MDc5YmY4NzYwYzcuYmluZFBvcHVwKHBvcHVwX2EwODk4NTk1ZjFkMjQ5ZGJhZGNiOTdkNDBlMGExZGFiKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzc1NGI2ODk1MDMyZDQ2YThiZTA3MTg0NTMwNjJjY2M0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNzMuMzAxOTk5OTk5OTk5OTksIDU1LjE2MV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNTNiMGIxYzkxNWI1NGEzM2IwZjgwNTI1ZDc2MGE2MWUgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2Q1MTUxZDdmZTgxZjRhNWJhM2I1ZmI0YWEyZWRiYjIwID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOaTQ0UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGN6TFRBNVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1RtOTJZWGxoSUZwbGJXeDVZU3dnVW5WemMybGhQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF81M2IwYjFjOTE1YjU0YTMzYjBmODA1MjVkNzYwYTYxZS5zZXRDb250ZW50KGlfZnJhbWVfZDUxNTFkN2ZlODFmNGE1YmEzYjVmYjRhYTJlZGJiMjApOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNzU0YjY4OTUwMzJkNDZhOGJlMDcxODQ1MzA2MmNjYzQuYmluZFBvcHVwKHBvcHVwXzUzYjBiMWM5MTViNTRhMzNiMGY4MDUyNWQ3NjBhNjFlKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2I3NWE5MjlkYjFkNTRlYTBiMjU4ZTMzODcwNWRhMjkwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNzAuODE3LCA1NC4wNjNdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzliYjMxYTkzNmEyZDRhMTg4YWE5MjQzNzNmNWI1NGYxID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV83Nzg5YTliOTc5NzI0MTczYmU1ZTQyMjBmNGZkZDViNiA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0M1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RjMExURXhQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStUbTkyWVhsaElGcGxiV3g1WVN3Z1VuVnpjMmxoUEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfOWJiMzFhOTM2YTJkNGExODhhYTkyNDM3M2Y1YjU0ZjEuc2V0Q29udGVudChpX2ZyYW1lXzc3ODlhOWI5Nzk3MjQxNzNiZTVlNDIyMGY0ZmRkNWI2KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2I3NWE5MjlkYjFkNTRlYTBiMjU4ZTMzODcwNWRhMjkwLmJpbmRQb3B1cChwb3B1cF85YmIzMWE5MzZhMmQ0YTE4OGFhOTI0MzczZjViNTRmMSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl80YTEzZjkxZTM5MWM0NDM4YTk3ZTNlMjQyZWM1Mzc0YiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzcwLjg0MywgNTMuNjldLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzhiMzBmNzBlNDMzOTQ4ZWViMGU4OTQ3NDFmOTllOTgxID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV8zNmE1NTQ4NzI3N2I0NGIyOWQzOGQzMDAzMGUxOWRhMCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0M1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RjMUxURXdQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStUbTkyWVhsaElGcGxiV3g1WVN3Z1VuVnpjMmxoUEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfOGIzMGY3MGU0MzM5NDhlZWIwZTg5NDc0MWY5OWU5ODEuc2V0Q29udGVudChpX2ZyYW1lXzM2YTU1NDg3Mjc3YjQ0YjI5ZDM4ZDMwMDMwZTE5ZGEwKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzRhMTNmOTFlMzkxYzQ0MzhhOTdlM2UyNDJlYzUzNzRiLmJpbmRQb3B1cChwb3B1cF84YjMwZjcwZTQzMzk0OGVlYjBlODk0NzQxZjk5ZTk4MSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9iN2FmZTA2MjI3YWI0YTZiODJhYjgyYzE2ODZkZDUxMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzczLjM1MSwgNTUuMDc4XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF82OTkyN2NkMTVmOWY0ZDA5YjZjN2M1M2Q1ZjA0NDgzNCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfYWQ1NzVjZDI1Njc3NGQ0ZDkwNjgwMjA1OTdjNjM2OTAgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05pNDFQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UYzFMVEV3UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krVG05MllYbGhJRnBsYld4NVlTd2dVblZ6YzJsaFBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzY5OTI3Y2QxNWY5ZjRkMDliNmM3YzUzZDVmMDQ0ODM0LnNldENvbnRlbnQoaV9mcmFtZV9hZDU3NWNkMjU2Nzc0ZDRkOTA2ODAyMDU5N2M2MzY5MCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9iN2FmZTA2MjI3YWI0YTZiODJhYjgyYzE2ODZkZDUxMS5iaW5kUG9wdXAocG9wdXBfNjk5MjdjZDE1ZjlmNGQwOWI2YzdjNTNkNWYwNDQ4MzQpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfOGVjMmU1M2I3YjgyNDAzMjgwNzJjYTVjMjM2ZGZlMjIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0MS42MDQsIDg4LjgxMjk5OTk5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9lOTMwZGIwOWY5YjI0OTFlYTRmNjQzYjc1Mjk2YmIzMiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfODQxOWIxYmQxMTcyNDk5ZThhYjA1ODRmNjcwYmRhZjkgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05pNDFQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9Ua3lMVEExUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krYzI5MWRHaGxjbTRnV0dsdWFtbGhibWNzSUVOb2FXNWhQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9lOTMwZGIwOWY5YjI0OTFlYTRmNjQzYjc1Mjk2YmIzMi5zZXRDb250ZW50KGlfZnJhbWVfODQxOWIxYmQxMTcyNDk5ZThhYjA1ODRmNjcwYmRhZjkpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfOGVjMmU1M2I3YjgyNDAzMjgwNzJjYTVjMjM2ZGZlMjIuYmluZFBvcHVwKHBvcHVwX2U5MzBkYjA5ZjliMjQ5MWVhNGY2NDNiNzUyOTZiYjMyKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzU5ZTcxMjJiNWZhMDQ1YjU4MzFhOTJkZGNlZGNmMzRiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNzMuMzY2LCA1NS4wOTM5OTk5OTk5OTk5OTRdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzFhMjEzZGJmN2IwYjRmNjNiNDA2NDI4MGYzNDY2OGIzID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9kODE5ZTRkMDEzNTQ0N2U3YjQ3MTA1ZDlhMzg1N2UxNiA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0MFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RjMExUQTRQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStUbTkyWVhsaElGcGxiV3g1WVN3Z1VuVnpjMmxoUEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMWEyMTNkYmY3YjBiNGY2M2I0MDY0MjgwZjM0NjY4YjMuc2V0Q29udGVudChpX2ZyYW1lX2Q4MTllNGQwMTM1NDQ3ZTdiNDcxMDVkOWEzODU3ZTE2KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzU5ZTcxMjJiNWZhMDQ1YjU4MzFhOTJkZGNlZGNmMzRiLmJpbmRQb3B1cChwb3B1cF8xYTIxM2RiZjdiMGI0ZjYzYjQwNjQyODBmMzQ2NjhiMykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl84NmRiYzgxZmE2NmU0MDkxOGVlOTMzOWNhZTYyNjI0YiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzczLjM2OSwgNTQuNjQxMDAwMDAwMDAwMDA1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF80YTNiODRmMzEyMmI0ODVlYWM3ZmIxMDk1YmI4MjM5MSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfZmFmZDYzNGU4ZjhlNGQyY2IzZjI3NDcxMzQzOTIxMTEgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05pNDBQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UYzFMVEE0UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krVG05MllYbGhJRnBsYld4NVlTd2dVblZ6YzJsaFBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzRhM2I4NGYzMTIyYjQ4NWVhYzdmYjEwOTViYjgyMzkxLnNldENvbnRlbnQoaV9mcmFtZV9mYWZkNjM0ZThmOGU0ZDJjYjNmMjc0NzEzNDM5MjExMSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl84NmRiYzgxZmE2NmU0MDkxOGVlOTMzOWNhZTYyNjI0Yi5iaW5kUG9wdXAocG9wdXBfNGEzYjg0ZjMxMjJiNDg1ZWFjN2ZiMTA5NWJiODIzOTEpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMGQ0ZDBjMTEwMzA0NDYzYmFjMWJjNGY5ZDA1OTdlMjAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS45ODYwMDAwMDAwMDAwMDQsIDc4Ljg1MzAwMDAwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9hYzU1ZWEzMmQ1MzE0MWQxYmNhZWQ1NmRlMTA5YTEyMSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfZDhiMzhiYWYxMTAwNGY2OGIyZjcyNGNiODM3N2MwNGMgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05pNHpQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UY3pMVEEzUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krWldGemRHVnliaUJMWVhwaGEyaHpkR0Z1UEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYWM1NWVhMzJkNTMxNDFkMWJjYWVkNTZkZTEwOWExMjEuc2V0Q29udGVudChpX2ZyYW1lX2Q4YjM4YmFmMTEwMDRmNjhiMmY3MjRjYjgzNzdjMDRjKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzBkNGQwYzExMDMwNDQ2M2JhYzFiYzRmOWQwNTk3ZTIwLmJpbmRQb3B1cChwb3B1cF9hYzU1ZWEzMmQ1MzE0MWQxYmNhZWQ1NmRlMTA5YTEyMSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9iZDdlNDJjNmVhMTU0Mjg0OGMxODAwNjdiNGIyMWU2MyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjkxOCwgNzguOTE1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF83MzAzY2I1MDI4NzY0MDFjYjlkYjg1ZDU5YTUzYjIzMiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfNjZiZDZkNWNiOWI0NDI3ZThhMjgzM2NiNzgwYzNmNzEgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05pNHpQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UYzVMVEEyUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krWldGemRHVnliaUJMWVhwaGEyaHpkR0Z1UEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNzMwM2NiNTAyODc2NDAxY2I5ZGI4NWQ1OWE1M2IyMzIuc2V0Q29udGVudChpX2ZyYW1lXzY2YmQ2ZDVjYjliNDQyN2U4YTI4MzNjYjc4MGMzZjcxKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2JkN2U0MmM2ZWExNTQyODQ4YzE4MDA2N2I0YjIxZTYzLmJpbmRQb3B1cChwb3B1cF83MzAzY2I1MDI4NzY0MDFjYjlkYjg1ZDU5YTUzYjIzMikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9lYzllZDA1NTM4YmU0MzdiYjA1Y2FkNDU0OWUxZDllMiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQxLjMzMjQsIDEyOS4wMjk3XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9jNzY2ZGRmZWI0ODk0MjM2YmZlOWQ3ZDdiNjEwMjI3NyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfNDllMTg0ZTBiODcxNDc4OThiZmQyNzUzYWM1MDE4YTQgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05pNHpQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eU1ERTNMVEE1UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTWpGcmJTQkZUa1VnYjJZZ1UzVnVaMnBwWW1GbFoyRnRMQ0JPYjNKMGFDQkxiM0psWVR3dlptOXVkRDQ4TDJnelBnb2dJQ0FnIiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYzc2NmRkZmViNDg5NDIzNmJmZTlkN2Q3YjYxMDIyNzcuc2V0Q29udGVudChpX2ZyYW1lXzQ5ZTE4NGUwYjg3MTQ3ODk4YmZkMjc1M2FjNTAxOGE0KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2VjOWVkMDU1MzhiZTQzN2JiMDVjYWQ0NTQ5ZTFkOWUyLmJpbmRQb3B1cChwb3B1cF9jNzY2ZGRmZWI0ODk0MjM2YmZlOWQ3ZDdiNjEwMjI3NykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9kYzM0YWEwZWY5N2U0NjAwYjA5OGQ3NWQxNWIwM2RmNSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljk3NjAwMDAwMDAwMDAwNiwgNzguODg5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9kZGIwY2U3ZTk3YjY0Y2U3ODFjYzc3ZmY2Mjk3NWZlZCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfMzdjOWNhMDc3MThkNGI2ZTliY2Q3YjIxYjQ0YzI3ZGMgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05pNHlQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZ3dMVEE1UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krWldGemRHVnliaUJMWVhwaGEyaHpkR0Z1UEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZGRiMGNlN2U5N2I2NGNlNzgxY2M3N2ZmNjI5NzVmZWQuc2V0Q29udGVudChpX2ZyYW1lXzM3YzljYTA3NzE4ZDRiNmU5YmNkN2IyMWI0NGMyN2RjKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2RjMzRhYTBlZjk3ZTQ2MDBiMDk4ZDc1ZDE1YjAzZGY1LmJpbmRQb3B1cChwb3B1cF9kZGIwY2U3ZTk3YjY0Y2U3ODFjYzc3ZmY2Mjk3NWZlZCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9lMDJkNmYwYTgzZWQ0Yzk1YWZiMDcyNmFjNGQ4YWEzMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjkwOSwgNzguODczXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9jZTk1M2ZmODc1YzA0ODk4OTU3Y2NiZTRiZjg2ODI0YyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfZDViMzE2MjMxYTc2NGY2ZTgxMDY3NTdjZmRlMzgzNjggPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05pNHlQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZ3hMVEV5UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krWldGemRHVnliaUJMWVhwaGEyaHpkR0Z1UEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfY2U5NTNmZjg3NWMwNDg5ODk1N2NjYmU0YmY4NjgyNGMuc2V0Q29udGVudChpX2ZyYW1lX2Q1YjMxNjIzMWE3NjRmNmU4MTA2NzU3Y2ZkZTM4MzY4KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2UwMmQ2ZjBhODNlZDRjOTVhZmIwNzI2YWM0ZDhhYTMxLmJpbmRQb3B1cChwb3B1cF9jZTk1M2ZmODc1YzA0ODk4OTU3Y2NiZTRiZjg2ODI0YykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl81NjdjZDNiZmE4NjM0MWQ1YjFhMTE4MjdmODZmYWI2NyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljg5MTAwMDAwMDAwMDAwNSwgNzguOTYzMDAwMDAwMDAwMDFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzljYzUwYzM4ZDY1ZTRkMjZiYzEzNGVjZWQ2NDFkODg5ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV8wZTkzYjYxZDIyNjI0N2E5YmU5NmU3MTMxMWQ5NTIyMSA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0eVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnMExUQTNQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStaV0Z6ZEdWeWJpQkxZWHBoYTJoemRHRnVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF85Y2M1MGMzOGQ2NWU0ZDI2YmMxMzRlY2VkNjQxZDg4OS5zZXRDb250ZW50KGlfZnJhbWVfMGU5M2I2MWQyMjYyNDdhOWJlOTZlNzEzMTFkOTUyMjEpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNTY3Y2QzYmZhODYzNDFkNWIxYTExODI3Zjg2ZmFiNjcuYmluZFBvcHVwKHBvcHVwXzljYzUwYzM4ZDY1ZTRkMjZiYzEzNGVjZWQ2NDFkODg5KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzY1YmMzNjMyZDg3MzQ2MDZhYWNmNDJkMzlmM2ZiMTIyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTQ5LCA3OC44MzRdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2VhZmQ3YTRkYjA2YzRmZDBiMjVkN2U2NzIyNWJkMWM3ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV80NDY3NjZkMWJmOTA0MzdlYjg0OTczODNiZjU3NjQ2ZCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0eVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnMExURXdQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStaV0Z6ZEdWeWJpQkxZWHBoYTJoemRHRnVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9lYWZkN2E0ZGIwNmM0ZmQwYjI1ZDdlNjcyMjViZDFjNy5zZXRDb250ZW50KGlfZnJhbWVfNDQ2NzY2ZDFiZjkwNDM3ZWI4NDk3MzgzYmY1NzY0NmQpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNjViYzM2MzJkODczNDYwNmFhY2Y0MmQzOWYzZmIxMjIuYmluZFBvcHVwKHBvcHVwX2VhZmQ3YTRkYjA2YzRmZDBiMjVkN2U2NzIyNWJkMWM3KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2U5Zjc2ZTY5OThjNjQyOWM5NjdhOTc5ODk5OWU4NWUwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTI4MDAwMDAwMDAwMDA0LCA3OC44MjldLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2JiYmRmODAyYWFjZTRhZjg5Mzc4M2M4YzE5NGU0MTYwID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV8xMzc3NjVhNzk1YjU0MjQxYTlkYTcxNTg2NTk2NTAzOSA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0eVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnM0xUQTBQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStaV0Z6ZEdWeWJpQkxZWHBoYTJoemRHRnVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9iYmJkZjgwMmFhY2U0YWY4OTM3ODNjOGMxOTRlNDE2MC5zZXRDb250ZW50KGlfZnJhbWVfMTM3NzY1YTc5NWI1NDI0MWE5ZGE3MTU4NjU5NjUwMzkpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZTlmNzZlNjk5OGM2NDI5Yzk2N2E5Nzk4OTk5ZTg1ZTAuYmluZFBvcHVwKHBvcHVwX2JiYmRmODAyYWFjZTRhZjg5Mzc4M2M4YzE5NGU0MTYwKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzMyYmM4NmJjMjQ5ZDQwMTU5MzA2MDY2N2FmZGY5MDA4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDEuNTgzOTk5OTk5OTk5OTk2LCA4OC43MzcwMDAwMDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMzcwMjZjYmFmY2JlNDhjYWE5ZWQwNjQzZjYwMTY5OWQgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2IwNTY5ZmZkNTA0MjQxMGVhNGVmNWMzZGY3NWNlMGNhID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOaTR5UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGczTFRBMlBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK2MyOTFkR2hsY200Z1dHbHVhbWxoYm1jc0lFTm9hVzVoUEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMzcwMjZjYmFmY2JlNDhjYWE5ZWQwNjQzZjYwMTY5OWQuc2V0Q29udGVudChpX2ZyYW1lX2IwNTY5ZmZkNTA0MjQxMGVhNGVmNWMzZGY3NWNlMGNhKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzMyYmM4NmJjMjQ5ZDQwMTU5MzA2MDY2N2FmZGY5MDA4LmJpbmRQb3B1cChwb3B1cF8zNzAyNmNiYWZjYmU0OGNhYTllZDA2NDNmNjAxNjk5ZCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl84YmZkMGRhMzBhMGI0ZDhkYTE2MGFkYTg0MWU2ZDdlZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQxLjU2Mzk5OTk5OTk5OTk5LCA4OC43N10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZDZmZTE5NGMwZTQ4NGY0YzlhNWMwYzg2OWEwZmNkYTkgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzBlYjE5ZDU2YTM2YTQ4NjQ5NmYzMjdhN2Y3YmI3ODY2ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOaTR5UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGt3TFRBNFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK2MyOTFkR2hsY200Z1dHbHVhbWxoYm1jc0lFTm9hVzVoUEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZDZmZTE5NGMwZTQ4NGY0YzlhNWMwYzg2OWEwZmNkYTkuc2V0Q29udGVudChpX2ZyYW1lXzBlYjE5ZDU2YTM2YTQ4NjQ5NmYzMjdhN2Y3YmI3ODY2KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzhiZmQwZGEzMGEwYjRkOGRhMTYwYWRhODQxZTZkN2VkLmJpbmRQb3B1cChwb3B1cF9kNmZlMTk0YzBlNDg0ZjRjOWE1YzBjODY5YTBmY2RhOSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9hZDU3Y2MzMDZlZmI0M2E3OGRjMWRiNGQ5ZWRjNjY4OCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjkwMSwgNzguOTU5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF85YjlhM2E4M2ViOWQ0MDBkYWNlY2ZmNmMzNDJmNTdlMiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfYzE0MTg5NTY0ZDZhNGRmMWEyZTZkNjE3YWI3MmU3MDkgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05pNHhQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UYzVMVEE0UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krWldGemRHVnliaUJMWVhwaGEyaHpkR0Z1UEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfOWI5YTNhODNlYjlkNDAwZGFjZWNmZjZjMzQyZjU3ZTIuc2V0Q29udGVudChpX2ZyYW1lX2MxNDE4OTU2NGQ2YTRkZjFhMmU2ZDYxN2FiNzJlNzA5KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2FkNTdjYzMwNmVmYjQzYTc4ZGMxZGI0ZDllZGM2Njg4LmJpbmRQb3B1cChwb3B1cF85YjlhM2E4M2ViOWQ0MDBkYWNlY2ZmNmMzNDJmNTdlMikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9mY2RkNGI5MzMxMGI0YTU1OWYwYTgzZmUyMjJmYzNjYiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljk3MTAwMDAwMDAwMDAwNCwgNzkuMDFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzJmYjljODA1NDdiZTRlYTNhNDEyMWUyNDRmMGU2Y2JiID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9jZjBiZjk3MGYyYTg0NjMzOGI4NDg2MTdkN2FiNmU0YyA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0eFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RjNUxUQTRQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStaV0Z6ZEdWeWJpQkxZWHBoYTJoemRHRnVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF8yZmI5YzgwNTQ3YmU0ZWEzYTQxMjFlMjQ0ZjBlNmNiYi5zZXRDb250ZW50KGlfZnJhbWVfY2YwYmY5NzBmMmE4NDYzMzhiODQ4NjE3ZDdhYjZlNGMpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZmNkZDRiOTMzMTBiNGE1NTlmMGE4M2ZlMjIyZmMzY2IuYmluZFBvcHVwKHBvcHVwXzJmYjljODA1NDdiZTRlYTNhNDEyMWUyNDRmMGU2Y2JiKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2NhN2RiOGE4ZTM5NzQ5OTFiYTg0NTcxOTk4MTJhNTc2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTY0LCA3OC44MjddLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzg1MDcyYzRlMDY1YjQ4ODlhZTBmYTkxMmRmM2U5NTRiID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV85MzkzNDI4ODZhMjg0MmY2ODc3MDUwZWI3NGVhOTZjYiA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0eFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RjNUxURXlQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStaV0Z6ZEdWeWJpQkxZWHBoYTJoemRHRnVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF84NTA3MmM0ZTA2NWI0ODg5YWUwZmE5MTJkZjNlOTU0Yi5zZXRDb250ZW50KGlfZnJhbWVfOTM5MzQyODg2YTI4NDJmNjg3NzA1MGViNzRlYTk2Y2IpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfY2E3ZGI4YThlMzk3NDk5MWJhODQ1NzE5OTgxMmE1NzYuYmluZFBvcHVwKHBvcHVwXzg1MDcyYzRlMDY1YjQ4ODlhZTBmYTkxMmRmM2U5NTRiKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzhhNzg4YzBmNjA1OTQxY2RhZDExMWZjZTRkMzRkZmE4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuODg4OTk5OTk5OTk5OTk2LCA3OC45MzFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2RhNGIzYWQ3MzllMzQ3Mzk5OTAxYTVkNDhjY2E1NDJmID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9mYjU4MzBiZTAyOGI0NTFjYWYzZjJmZDMwNzczZmQxNyA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0eFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RneUxUQTBQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStaV0Z6ZEdWeWJpQkxZWHBoYTJoemRHRnVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9kYTRiM2FkNzM5ZTM0NzM5OTkwMWE1ZDQ4Y2NhNTQyZi5zZXRDb250ZW50KGlfZnJhbWVfZmI1ODMwYmUwMjhiNDUxY2FmM2YyZmQzMDc3M2ZkMTcpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfOGE3ODhjMGY2MDU5NDFjZGFkMTExZmNlNGQzNGRmYTguYmluZFBvcHVwKHBvcHVwX2RhNGIzYWQ3MzllMzQ3Mzk5OTAxYTVkNDhjY2E1NDJmKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2Q5MTVmMzMyYTBmZDQxYjVhZGE4OTNkOTExZjM0ZWVmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTk1LCA3OC44NTYwMDAwMDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMjhkMDc0YmE1ZDhmNDUzMDg5OWU1MDE4ZTQ3MTM5ZjUgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2NhODMyM2U1OWFiMzRlNzZiYjAyMDFkYzU2ODA0ZWEyID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOaTR4UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGd5TFRBM1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1pXRnpkR1Z5YmlCTFlYcGhhMmh6ZEdGdVBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzI4ZDA3NGJhNWQ4ZjQ1MzA4OTllNTAxOGU0NzEzOWY1LnNldENvbnRlbnQoaV9mcmFtZV9jYTgzMjNlNTlhYjM0ZTc2YmIwMjAxZGM1NjgwNGVhMik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9kOTE1ZjMzMmEwZmQ0MWI1YWRhODkzZDkxMWYzNGVlZi5iaW5kUG9wdXAocG9wdXBfMjhkMDc0YmE1ZDhmNDUzMDg5OWU1MDE4ZTQ3MTM5ZjUpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfY2E0N2VlYzM2Y2Q3NGVjODhmYWRlZDhjZjhhOTc0MjUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS45MjgwMDAwMDAwMDAwMDQsIDc4Ljg2OV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYjc4YWQzMTQ1NDA4NGZlOTg5MzllN2M2NmM1YWNiM2EgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzY5MDkyMWU1MTRhZTQ0YjNiMTk4MzZjMjZkYzlmZWVkID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOaTR4UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGd5TFRFeVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1pXRnpkR1Z5YmlCTFlYcGhhMmh6ZEdGdVBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2I3OGFkMzE0NTQwODRmZTk4OTM5ZTdjNjZjNWFjYjNhLnNldENvbnRlbnQoaV9mcmFtZV82OTA5MjFlNTE0YWU0NGIzYjE5ODM2YzI2ZGM5ZmVlZCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9jYTQ3ZWVjMzZjZDc0ZWM4OGZhZGVkOGNmOGE5NzQyNS5iaW5kUG9wdXAocG9wdXBfYjc4YWQzMTQ1NDA4NGZlOTg5MzllN2M2NmM1YWNiM2EpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfY2VjZTYwOTEwOTU2NGRkYmI5MWQwNWI1YWZlMzZmZDggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS45MDYwMDAwMDAwMDAwMDYsIDc4Ljk4MTAwMDAwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9kOGNiYWZkMTdhMzQ0MTRkODUyOTE1MGZmMTA0OTlmNSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfZjk5Yzg0Y2Q2ZDY5NDhmNDk2NzViMTA5MDQzYzA0YTkgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05pNHhQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZ3pMVEEyUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krWldGemRHVnliaUJMWVhwaGEyaHpkR0Z1UEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZDhjYmFmZDE3YTM0NDE0ZDg1MjkxNTBmZjEwNDk5ZjUuc2V0Q29udGVudChpX2ZyYW1lX2Y5OWM4NGNkNmQ2OTQ4ZjQ5Njc1YjEwOTA0M2MwNGE5KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2NlY2U2MDkxMDk1NjRkZGJiOTFkMDViNWFmZTM2ZmQ4LmJpbmRQb3B1cChwb3B1cF9kOGNiYWZkMTdhMzQ0MTRkODUyOTE1MGZmMTA0OTlmNSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9mNTQ0MGVlYzhmMGI0MTIxYmZkYTg5YTliMTg5YjViOSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjkyMTAwMDAwMDAwMDAxLCA3OC45MDddLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2QxZjg5NTVkMjBkNjQwNGJhZTJjMmE3ZmU5NDdhMjIzID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV81ZWMyNDM0YTRhN2Q0YTk2ODExMzExYTJjODgyNzM0MCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0eFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnekxURXdQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStaV0Z6ZEdWeWJpQkxZWHBoYTJoemRHRnVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9kMWY4OTU1ZDIwZDY0MDRiYWUyYzJhN2ZlOTQ3YTIyMy5zZXRDb250ZW50KGlfZnJhbWVfNWVjMjQzNGE0YTdkNGE5NjgxMTMxMWEyYzg4MjczNDApOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZjU0NDBlZWM4ZjBiNDEyMWJmZGE4OWE5YjE4OWI1YjkuYmluZFBvcHVwKHBvcHVwX2QxZjg5NTVkMjBkNjQwNGJhZTJjMmE3ZmU5NDdhMjIzKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzdjMjQ5M2Q1YmQ1YTRiNmRiMWU2ZjVkYzZiNjE3YjVlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTU3LCA3OC44NjJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzA2YzkxODU2MmQ4ZDQyM2Y4MmQyY2E4NWM4NWU3MDdjID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV8wYzY4MzA4MDIwZjQ0ZDlkODM4OTAwNzk0NTNmZmI5YiA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0eFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnMExURXlQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStaV0Z6ZEdWeWJpQkxZWHBoYTJoemRHRnVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF8wNmM5MTg1NjJkOGQ0MjNmODJkMmNhODVjODVlNzA3Yy5zZXRDb250ZW50KGlfZnJhbWVfMGM2ODMwODAyMGY0NGQ5ZDgzODkwMDc5NDUzZmZiOWIpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfN2MyNDkzZDViZDVhNGI2ZGIxZTZmNWRjNmI2MTdiNWUuYmluZFBvcHVwKHBvcHVwXzA2YzkxODU2MmQ4ZDQyM2Y4MmQyY2E4NWM4NWU3MDdjKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2U5NjMwZWJmMDFlYzRlNTBiNTkwZmMyYTViOGQzYzAxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTEzMDAwMDAwMDAwMDA0LCA3OC43MzVdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzBiYWJlZGNiMDUzMzQ2Yzk4NzBmOWE3Y2EyNDk2MTAzID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9kNzg4MjY2YjM5ODk0ZTU1ODVkZWMxMGE5N2QyYjQwOCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0eFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnM0xUQTJQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStaV0Z6ZEdWeWJpQkxZWHBoYTJoemRHRnVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF8wYmFiZWRjYjA1MzM0NmM5ODcwZjlhN2NhMjQ5NjEwMy5zZXRDb250ZW50KGlfZnJhbWVfZDc4ODI2NmIzOTg5NGU1NTg1ZGVjMTBhOTdkMmI0MDgpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZTk2MzBlYmYwMWVjNGU1MGI1OTBmYzJhNWI4ZDNjMDEuYmluZFBvcHVwKHBvcHVwXzBiYWJlZGNiMDUzMzQ2Yzk4NzBmOWE3Y2EyNDk2MTAzKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2I5NzA0ZjMzMGY2ODQ3ODViOTllMWM0Yzc0MTQ2ZTExID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTg5LCA3OC44NDRdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2MwYjkwYTU4ZGE5NzQ5OTZhNjVkMzBhYzQ2NzNkZWFiID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9jZjBlZjJkNzE1NDI0Y2VjYTZhYTEyNDczNTFjZjMzMCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0eFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnM0xURXlQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStaV0Z6ZEdWeWJpQkxZWHBoYTJoemRHRnVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9jMGI5MGE1OGRhOTc0OTk2YTY1ZDMwYWM0NjczZGVhYi5zZXRDb250ZW50KGlfZnJhbWVfY2YwZWYyZDcxNTQyNGNlY2E2YWExMjQ3MzUxY2YzMzApOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfYjk3MDRmMzMwZjY4NDc4NWI5OWUxYzRjNzQxNDZlMTEuYmluZFBvcHVwKHBvcHVwX2MwYjkwYTU4ZGE5NzQ5OTZhNjVkMzBhYzQ2NzNkZWFiKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzZiMjI5ZmJhMjhlZDQ5NDM5Yjk4ZDAzYTNhODBhNDA2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuODY0LCA3OC43NThdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzRhYWVkOWMxNDMyYTQ4ZTE4ODkzYWNlM2NkNDg0ZTE3ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9hMTJhNzNjYzA1ZjM0YTNhYWZjYjE3NzM4ZjAwYTE4MyA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0eFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnM0xURXlQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStaV0Z6ZEdWeWJpQkxZWHBoYTJoemRHRnVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF80YWFlZDljMTQzMmE0OGUxODg5M2FjZTNjZDQ4NGUxNy5zZXRDb250ZW50KGlfZnJhbWVfYTEyYTczY2MwNWYzNGEzYWFmY2IxNzczOGYwMGExODMpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNmIyMjlmYmEyOGVkNDk0MzliOThkMDNhM2E4MGE0MDYuYmluZFBvcHVwKHBvcHVwXzRhYWVkOWMxNDMyYTQ4ZTE4ODkzYWNlM2NkNDg0ZTE3KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzQ3ODEwMzdkMTRjMTRiNTQ5ODM1ZDhjNWEwMWVkYTM5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTUzOTk5OTk5OTk5OTksIDc4LjkxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF84ZWU3MmE3YjI5MWI0OTBjYjY0OGJmNTE0OGQ5YjY2YyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfMDQzMGYxYTAyOGU3NDg4N2FmMWI1YjUyZmM1NDc1ZjUgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05pNHhQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZzRMVEF5UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krWldGemRHVnliaUJMWVhwaGEyaHpkR0Z1UEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfOGVlNzJhN2IyOTFiNDkwY2I2NDhiZjUxNDhkOWI2NmMuc2V0Q29udGVudChpX2ZyYW1lXzA0MzBmMWEwMjhlNzQ4ODdhZjFiNWI1MmZjNTQ3NWY1KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzQ3ODEwMzdkMTRjMTRiNTQ5ODM1ZDhjNWEwMWVkYTM5LmJpbmRQb3B1cChwb3B1cF84ZWU3MmE3YjI5MWI0OTBjYjY0OGJmNTE0OGQ5YjY2YykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl82YTgwMDA5NmJiYjE0MTkwOGM1YjVmMWYwM2JkMjNlNiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjkxNywgNzguOTQ1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF83YWViYzJhOTY1NzM0MTg1YmM5MGYwMmFhZWMzNDJlZCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfZGZlZDIwNzU3N2QyNGM5OGFhZjNmOTllYTFiYmQ3NDkgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05pNHhQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZzRMVEEwUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krWldGemRHVnliaUJMWVhwaGEyaHpkR0Z1UEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfN2FlYmMyYTk2NTczNDE4NWJjOTBmMDJhYWVjMzQyZWQuc2V0Q29udGVudChpX2ZyYW1lX2RmZWQyMDc1NzdkMjRjOThhYWYzZjk5ZWExYmJkNzQ5KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzZhODAwMDk2YmJiMTQxOTA4YzViNWYxZjAzYmQyM2U2LmJpbmRQb3B1cChwb3B1cF83YWViYzJhOTY1NzM0MTg1YmM5MGYwMmFhZWMzNDJlZCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl82ODY5ZTg0N2M3NmE0YjFiYWE2NmUzNzdkY2NlMGY4NCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjkyODAwMDAwMDAwMDAwNCwgNzguNzY4OTk5OTk5OTk5OTldLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzFkZGQ3MjMzODFlYTQ2YmE5MmM4OTAxZjg5ZmU3OTRkID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV80MmE1Zjk0YjliNDc0ZTIyOTI0ZGZkYWMyZmY0NTgyMyA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0eFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnNExUQTFQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStaV0Z6ZEdWeWJpQkxZWHBoYTJoemRHRnVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF8xZGRkNzIzMzgxZWE0NmJhOTJjODkwMWY4OWZlNzk0ZC5zZXRDb250ZW50KGlfZnJhbWVfNDJhNWY5NGI5YjQ3NGUyMjkyNGRmZGFjMmZmNDU4MjMpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNjg2OWU4NDdjNzZhNGIxYmFhNjZlMzc3ZGNjZTBmODQuYmluZFBvcHVwKHBvcHVwXzFkZGQ3MjMzODFlYTQ2YmE5MmM4OTAxZjg5ZmU3OTRkKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzYyMTAwYmNlNjYyODRlNmM5ZGQ3OTMxYWQxN2E1NjQ3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuODMzLCA3OC44MDhdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzg2YzhlMzBkM2FmOTRhYTc5NTI2YmFlOTU0YWE1MTI3ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9lOTg2NWI3MGYyMGE0MThmYTg4NjQyMjExN2MwZmQ1MyA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0eFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnNExUQTVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStaV0Z6ZEdWeWJpQkxZWHBoYTJoemRHRnVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF84NmM4ZTMwZDNhZjk0YWE3OTUyNmJhZTk1NGFhNTEyNy5zZXRDb250ZW50KGlfZnJhbWVfZTk4NjViNzBmMjBhNDE4ZmE4ODY0MjIxMTdjMGZkNTMpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNjIxMDBiY2U2NjI4NGU2YzlkZDc5MzFhZDE3YTU2NDcuYmluZFBvcHVwKHBvcHVwXzg2YzhlMzBkM2FmOTRhYTc5NTI2YmFlOTU0YWE1MTI3KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzczMjY2MWQzMjJiYTRjNjE4NGU4ZDdmMmQ0YWEyNGI1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTI0LCA3OC44MzFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzI4MmRkNTBhYWJlNjQ1NzdhODg1NjNmYjg2MWRmNzQ2ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV8xMzk3NzAxMzUyOWQ0Y2NhYTc2YWM0NzJhM2YyMzUwMSA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0eFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnNUxUQXhQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStaV0Z6ZEdWeWJpQkxZWHBoYTJoemRHRnVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF8yODJkZDUwYWFiZTY0NTc3YTg4NTYzZmI4NjFkZjc0Ni5zZXRDb250ZW50KGlfZnJhbWVfMTM5NzcwMTM1MjlkNGNjYWE3NmFjNDcyYTNmMjM1MDEpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNzMyNjYxZDMyMmJhNGM2MTg0ZThkN2YyZDRhYTI0YjUuYmluZFBvcHVwKHBvcHVwXzI4MmRkNTBhYWJlNjQ1NzdhODg1NjNmYjg2MWRmNzQ2KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2E0ZjgxOTg2NmQ2OTRhNTc4YTIxZmM2ODJiOGE0YjFkID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDEuNjAzLCA4OC44Ml0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMmRiN2I4ODcwODczNDY5M2ExN2YwMTZjNzEwY2JlNzEgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzA3NjI5NjNhMGNiMzRmMzdhNGRlYzMxYzhkYzNlMWRmID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOaTR4UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGsxTFRBMVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK2MyOTFkR2hsY200Z1dHbHVhbWxoYm1jc0lFTm9hVzVoUEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMmRiN2I4ODcwODczNDY5M2ExN2YwMTZjNzEwY2JlNzEuc2V0Q29udGVudChpX2ZyYW1lXzA3NjI5NjNhMGNiMzRmMzdhNGRlYzMxYzhkYzNlMWRmKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2E0ZjgxOTg2NmQ2OTRhNTc4YTIxZmM2ODJiOGE0YjFkLmJpbmRQb3B1cChwb3B1cF8yZGI3Yjg4NzA4NzM0NjkzYTE3ZjAxNmM3MTBjYmU3MSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl80OGJhOTM5ZTViMWM0MjQ0YWU2ODA2ZmIyZTAzOTNkMCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzcwLjc1NiwgNTMuODcyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9kM2IyNjAwNTJhOTc0MzA3OWI4YzkxZjU0NzdlNDhmNCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfOGQ4NDFlOGY4MmZiNGVhNmEwMjAwZjQyZjI1ZGJiMTggPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05pNHdQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UY3pMVEE1UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krVG05MllYbGhJRnBsYld4NVlTd2dVblZ6YzJsaFBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2QzYjI2MDA1MmE5NzQzMDc5YjhjOTFmNTQ3N2U0OGY0LnNldENvbnRlbnQoaV9mcmFtZV84ZDg0MWU4ZjgyZmI0ZWE2YTAyMDBmNDJmMjVkYmIxOCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl80OGJhOTM5ZTViMWM0MjQ0YWU2ODA2ZmIyZTAzOTNkMC5iaW5kUG9wdXAocG9wdXBfZDNiMjYwMDUyYTk3NDMwNzliOGM5MWY1NDc3ZTQ4ZjQpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZmJkZmQ0NWU1MDhmNDM5OWEzZGY4YmZiNzRlZWI4N2IgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MC4wMzYsIDc5LjAxMTAwMDAwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF81MzQzY2JhOTlkMTQ0NmVmODcyNGZkOTVkNTM0ZDQ1YiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfYTkxZDhjMGYxYjJhNDYyYmJkZjI2NzZkYzA2YTkwNzIgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05pNHdQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UY3pMVEV5UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krWldGemRHVnliaUJMWVhwaGEyaHpkR0Z1UEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNTM0M2NiYTk5ZDE0NDZlZjg3MjRmZDk1ZDUzNGQ0NWIuc2V0Q29udGVudChpX2ZyYW1lX2E5MWQ4YzBmMWIyYTQ2MmJiZGYyNjc2ZGMwNmE5MDcyKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2ZiZGZkNDVlNTA4ZjQzOTlhM2RmOGJmYjc0ZWViODdiLmJpbmRQb3B1cChwb3B1cF81MzQzY2JhOTlkMTQ0NmVmODcyNGZkOTVkNTM0ZDQ1YikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8wZjk0NjNkYWFiYmU0ZWIyYmM2MGQ2N2IzNDMyMmE0ZSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0yMS44OTQwMDAwMDAwMDAwMDIsIC0xMzguOTU5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8xNzBjZmQ5YzdlNDk0ZjE4YjZkNDY0ZTFmNmJiNTliYyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfMjBjZDcyM2FlY2ZjNGMzNTkxY2EzZjU5OGViMmFiNTkgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05pNHdQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UYzNMVEV4UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krVkhWaGJXOTBkU0JCY21Ob2FYQmxiR0ZuYnl3Z1JuSmxibU5vSUZCdmJIbHVaWE5wWVNCeVpXZHBiMjQ4TDJadmJuUStQQzlvTXo0S0lDQWdJQT09IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMTcwY2ZkOWM3ZTQ5NGYxOGI2ZDQ2NGUxZjZiYjU5YmMuc2V0Q29udGVudChpX2ZyYW1lXzIwY2Q3MjNhZWNmYzRjMzU5MWNhM2Y1OThlYjJhYjU5KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzBmOTQ2M2RhYWJiZTRlYjJiYzYwZDY3YjM0MzIyYTRlLmJpbmRQb3B1cChwb3B1cF8xNzBjZmQ5YzdlNDk0ZjE4YjZkNDY0ZTFmNmJiNTliYykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl83MmM5ZTU3NDFmYTQ0MWJiOTcxZTA1MGM1ZjJmNjczOSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljg5OCwgNzguOTI1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF82OGY5ODUzYzIyYzQ0NDA2YjUzNGU1MDJjNDdmNGIyYyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfMzA3NTdiOTgyMDhiNGVjMzgyYmViZjg0ZWUzNGU0ODIgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05pNHdQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UYzRMVEE1UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krWldGemRHVnliaUJMWVhwaGEyaHpkR0Z1UEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNjhmOTg1M2MyMmM0NDQwNmI1MzRlNTAyYzQ3ZjRiMmMuc2V0Q29udGVudChpX2ZyYW1lXzMwNzU3Yjk4MjA4YjRlYzM4MmJlYmY4NGVlMzRlNDgyKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzcyYzllNTc0MWZhNDQxYmI5NzFlMDUwYzVmMmY2NzM5LmJpbmRQb3B1cChwb3B1cF82OGY5ODUzYzIyYzQ0NDA2YjUzNGU1MDJjNDdmNGIyYykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8yMjg3OWRiMWM4NTI0MWU2YjkyYTQ1YzNlYzk0YTM1MCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljk1NiwgNzguNzY1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9hZWY0OTE5NTRkOTE0MTgxYWQ4YzZhNWU1ZjFhYTczZiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfZjQwMjBkOTllYTM0NDRkOTk3ZmVhNThiMWFlODZmYmEgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05pNHdQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UYzRMVEV4UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krWldGemRHVnliaUJMWVhwaGEyaHpkR0Z1UEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYWVmNDkxOTU0ZDkxNDE4MWFkOGM2YTVlNWYxYWE3M2Yuc2V0Q29udGVudChpX2ZyYW1lX2Y0MDIwZDk5ZWEzNDQ0ZDk5N2ZlYTU4YjFhZTg2ZmJhKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzIyODc5ZGIxYzg1MjQxZTZiOTJhNDVjM2VjOTRhMzUwLmJpbmRQb3B1cChwb3B1cF9hZWY0OTE5NTRkOTE0MTgxYWQ4YzZhNWU1ZjFhYTczZikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9jMWRiM2M4YzEyMDE0YmU3OWYzY2RlNzFjMzAyNWQxMCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ3Ljc4NywgNDguMTkyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF85YWM1Yzc1M2YyZWE0MjI0OTk5OThjOGY0MTdhOGQxNSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfZjY3NjYyZDg2OWY4NDk5NGI0MGMwODJhODkwYmZkYWQgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05pNHdQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UYzRMVEV5UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krVW5WemMybGhMVXRoZW1GcmFITjBZVzRnWW05eVpHVnlJSEpsWjJsdmJqd3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZyIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzlhYzVjNzUzZjJlYTQyMjQ5OTk5OGM4ZjQxN2E4ZDE1LnNldENvbnRlbnQoaV9mcmFtZV9mNjc2NjJkODY5Zjg0OTk0YjQwYzA4MmE4OTBiZmRhZCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9jMWRiM2M4YzEyMDE0YmU3OWYzY2RlNzFjMzAyNWQxMC5iaW5kUG9wdXAocG9wdXBfOWFjNWM3NTNmMmVhNDIyNDk5OTk4YzhmNDE3YThkMTUpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNjYwMjFkMmIzNjIzNDJkODkyY2ZlMWQ5MjVhYTZmZjAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny44ODMsIDQ4LjEyOF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMjA2MmUwNTA0OGFhNGE1NDljZjJkMzcxMDk3MzgwOGUgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2M5MDY5MzQxN2JmNjRiNjQ4YzdhZWVmYzI5NDNlNDJkID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOaTR3UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGM1TFRBeFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1VuVnpjMmxoTFV0aGVtRnJhSE4wWVc0Z1ltOXlaR1Z5SUhKbFoybHZiand2Wm05dWRENDhMMmd6UGdvZ0lDQWciIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF8yMDYyZTA1MDQ4YWE0YTU0OWNmMmQzNzEwOTczODA4ZS5zZXRDb250ZW50KGlfZnJhbWVfYzkwNjkzNDE3YmY2NGI2NDhjN2FlZWZjMjk0M2U0MmQpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNjYwMjFkMmIzNjIzNDJkODkyY2ZlMWQ5MjVhYTZmZjAuYmluZFBvcHVwKHBvcHVwXzIwNjJlMDUwNDhhYTRhNTQ5Y2YyZDM3MTA5NzM4MDhlKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2QzOTM2NWQ1OTgwMDRlNDFhZDlmMjMzNzkwMGRmZWFhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTIxLjg5MiwgLTEzOC45OTNdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzRjNWE1YTY0MzAzOTQ4ZTM4OGNhZTUxNDQ2YjliNzEyID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV80ZTgyMTc3NzZkYzc0ZGNiODlkZWQ2NmUwOTVjMTZhNyA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0d1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RjNUxUQTNQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStWSFZoYlc5MGRTQkJjbU5vYVhCbGJHRm5ieXdnUm5KbGJtTm9JRkJ2YkhsdVpYTnBZU0J5WldkcGIyNDhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lBPT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF80YzVhNWE2NDMwMzk0OGUzODhjYWU1MTQ0NmI5YjcxMi5zZXRDb250ZW50KGlfZnJhbWVfNGU4MjE3Nzc2ZGM3NGRjYjg5ZGVkNjZlMDk1YzE2YTcpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZDM5MzY1ZDU5ODAwNGU0MWFkOWYyMzM3OTAwZGZlYWEuYmluZFBvcHVwKHBvcHVwXzRjNWE1YTY0MzAzOTQ4ZTM4OGNhZTUxNDQ2YjliNzEyKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2VmYzI3OGVjMzM1NzRhZjQ4ZWQ2YjIxOWRiZjJmOTA0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTY3LCA3OS4wNl0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYjU0ZDY4MjAwNmU0NGVkMmEzY2Y1YmJhZDEyNGI3MmQgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzc0MjNlODhjY2E2NDQ4OGRiZjcwOGI4ZDdiZGEyM2U2ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOaTR3UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGM1TFRFd1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1pXRnpkR1Z5YmlCTFlYcGhhMmh6ZEdGdVBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2I1NGQ2ODIwMDZlNDRlZDJhM2NmNWJiYWQxMjRiNzJkLnNldENvbnRlbnQoaV9mcmFtZV83NDIzZTg4Y2NhNjQ0ODhkYmY3MDhiOGQ3YmRhMjNlNik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9lZmMyNzhlYzMzNTc0YWY0OGVkNmIyMTlkYmYyZjkwNC5iaW5kUG9wdXAocG9wdXBfYjU0ZDY4MjAwNmU0NGVkMmEzY2Y1YmJhZDEyNGI3MmQpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZGI1NDVkMjViNDZhNGI5NmE1NWEyMjhjNzI4OGQ1NTggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS44OTQsIDc4Ljg0M10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMmI1ZjYyODVjNjUwNDg5ZTgzN2QwMTg4OWY1MWY5MGYgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2QxMzExYTA2ZjcwMTQ1ZTVhN2Y2NmJlNDBhZTgyNDljID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOaTR3UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGM1TFRFeVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1pXRnpkR1Z5YmlCTFlYcGhhMmh6ZEdGdVBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzJiNWY2Mjg1YzY1MDQ4OWU4MzdkMDE4ODlmNTFmOTBmLnNldENvbnRlbnQoaV9mcmFtZV9kMTMxMWEwNmY3MDE0NWU1YTdmNjZiZTQwYWU4MjQ5Yyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9kYjU0NWQyNWI0NmE0Yjk2YTU1YTIyOGM3Mjg4ZDU1OC5iaW5kUG9wdXAocG9wdXBfMmI1ZjYyODVjNjUwNDg5ZTgzN2QwMTg4OWY1MWY5MGYpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNzJjN2QzZTQ4YTcwNDdlMGIzNjljZmYwMWJiNzg1ZTcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS44OTcsIDc4Ljk4M10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYWU1MjAzNzU0NzMzNDIyZTlmNThkM2EyMjZhNTExMTkgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzE1YzM5Y2EyM2FiZTQ2ZjJhMzQ4MWZlMWFkNmRmOWJkID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOaTR3UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGd4TFRBNVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1pXRnpkR1Z5YmlCTFlYcGhhMmh6ZEdGdVBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2FlNTIwMzc1NDczMzQyMmU5ZjU4ZDNhMjI2YTUxMTE5LnNldENvbnRlbnQoaV9mcmFtZV8xNWMzOWNhMjNhYmU0NmYyYTM0ODFmZTFhZDZkZjliZCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl83MmM3ZDNlNDhhNzA0N2UwYjM2OWNmZjAxYmI3ODVlNy5iaW5kUG9wdXAocG9wdXBfYWU1MjAzNzU0NzMzNDIyZTlmNThkM2EyMjZhNTExMTkpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNGUwMjdiMDg5ZDMzNDJkMTgwMTZlNDdjYjlmMDRkODkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS44ODYsIDc4Ljg5OF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNmVkN2M4MmI4NmIxNDJlOGJmYTAzMTJkZTU5MzE1OGQgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2Q3MDBhNjFiODRiMDQ4ZmQ5ZjY0ZDM3NGY2YjdiYmE4ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOaTR3UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGd4TFRFd1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1pXRnpkR1Z5YmlCTFlYcGhhMmh6ZEdGdVBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzZlZDdjODJiODZiMTQyZThiZmEwMzEyZGU1OTMxNThkLnNldENvbnRlbnQoaV9mcmFtZV9kNzAwYTYxYjg0YjA0OGZkOWY2NGQzNzRmNmI3YmJhOCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl80ZTAyN2IwODlkMzM0MmQxODAxNmU0N2NiOWYwNGQ4OS5iaW5kUG9wdXAocG9wdXBfNmVkN2M4MmI4NmIxNDJlOGJmYTAzMTJkZTU5MzE1OGQpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNDUzNTIxN2IyYWViNDFmMWFlZjUwZjU0YTIyYTA1YjQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS45MzE5OTk5OTk5OTk5OTUsIDc4Ljg0M10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMmQ0NTY1MjQwZDBjNGM2OWJhOWEzZDdmMDExZDUwOTggPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2E2NGYzOGUyM2QwMjQ5NDA5YmU5MWNlNzUwMzUzMzlmID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOaTR3UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGd6TFRFd1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1pXRnpkR1Z5YmlCTFlYcGhhMmh6ZEdGdVBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzJkNDU2NTI0MGQwYzRjNjliYTlhM2Q3ZjAxMWQ1MDk4LnNldENvbnRlbnQoaV9mcmFtZV9hNjRmMzhlMjNkMDI0OTQwOWJlOTFjZTc1MDM1MzM5Zik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl80NTM1MjE3YjJhZWI0MWYxYWVmNTBmNTRhMjJhMDViNC5iaW5kUG9wdXAocG9wdXBfMmQ0NTY1MjQwZDBjNGM2OWJhOWEzZDdmMDExZDUwOTgpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNTBiZmJhMDhhZTJjNGM3MzlmMDljMzMyNTdlMmZhMjUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS45OCwgNzkuMDZdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzM0NzFkYzg0YWM2NDRkNjc5MTY3NzQ0M2Y3ODJjMDVkID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV8xMTE0ZTAxZDYzNDc0MDRlOTUxY2E1NWZjNDM3MTVhYyA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0d1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnMExUQTFQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStaV0Z6ZEdWeWJpQkxZWHBoYTJoemRHRnVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF8zNDcxZGM4NGFjNjQ0ZDY3OTE2Nzc0NDNmNzgyYzA1ZC5zZXRDb250ZW50KGlfZnJhbWVfMTExNGUwMWQ2MzQ3NDA0ZTk1MWNhNTVmYzQzNzE1YWMpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNTBiZmJhMDhhZTJjNGM3MzlmMDljMzMyNTdlMmZhMjUuYmluZFBvcHVwKHBvcHVwXzM0NzFkYzg0YWM2NDRkNjc5MTY3NzQ0M2Y3ODJjMDVkKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2NmMzIwMDU3NGJiODQ0MzFiMWY3ZWQ3ZjI2MjRlMGNjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuODYxMDAwMDAwMDAwMDA0LCA3OC43NTJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzYyZmEyYjNmOGVmNDRiMDdiMDYwODhlM2Y2OTkxNDdiID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV8wYmI4NGZkZDQ0YWQ0YjczYTQxODc4OGM2N2I5NTM1YyA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0d1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnMExURXlQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStaV0Z6ZEdWeWJpQkxZWHBoYTJoemRHRnVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF82MmZhMmIzZjhlZjQ0YjA3YjA2MDg4ZTNmNjk5MTQ3Yi5zZXRDb250ZW50KGlfZnJhbWVfMGJiODRmZGQ0NGFkNGI3M2E0MTg3ODhjNjdiOTUzNWMpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfY2YzMjAwNTc0YmI4NDQzMWIxZjdlZDdmMjYyNGUwY2MuYmluZFBvcHVwKHBvcHVwXzYyZmEyYjNmOGVmNDRiMDdiMDYwODhlM2Y2OTkxNDdiKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzZkZjI5YWM5OWYzODQwM2M4ZWUwZTU3Yzk4ZDMyN2RiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuODg4OTk5OTk5OTk5OTk2LCA3OC44ODFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzI0YmExN2U5NmFjODRhZDQ5NDBkNjM5NjI4YWFmMTdhID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV8yYjg0Y2M0Yzc3YjE0YjhjYTFiMGFlYzYzYTc2NWZkNSA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0d1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnMUxUQTJQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStaV0Z6ZEdWeWJpQkxZWHBoYTJoemRHRnVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF8yNGJhMTdlOTZhYzg0YWQ0OTQwZDYzOTYyOGFhZjE3YS5zZXRDb250ZW50KGlfZnJhbWVfMmI4NGNjNGM3N2IxNGI4Y2ExYjBhZWM2M2E3NjVmZDUpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNmRmMjlhYzk5ZjM4NDAzYzhlZTBlNTdjOThkMzI3ZGIuYmluZFBvcHVwKHBvcHVwXzI0YmExN2U5NmFjODRhZDQ5NDBkNjM5NjI4YWFmMTdhKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzAxOTM1MzY1YmE4MDQ4MmJiZWFhYWJhZjdiYzE2OTQ0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuODYxMDAwMDAwMDAwMDA0LCA3OC42OTZdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2FlNjdhOTIwZGMxMjQyOWM5YmE5OWJjMTljZDlkZTUwID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9hMzQwMmU0ZTBlZDg0ZDRmOWNjZjQ2YmYyN2U0MGUwZiA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0d1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnMUxUQTJQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStaV0Z6ZEdWeWJpQkxZWHBoYTJoemRHRnVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9hZTY3YTkyMGRjMTI0MjljOWJhOTliYzE5Y2Q5ZGU1MC5zZXRDb250ZW50KGlfZnJhbWVfYTM0MDJlNGUwZWQ4NGQ0ZjljY2Y0NmJmMjdlNDBlMGYpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMDE5MzUzNjViYTgwNDgyYmJlYWFhYmFmN2JjMTY5NDQuYmluZFBvcHVwKHBvcHVwX2FlNjdhOTIwZGMxMjQyOWM5YmE5OWJjMTljZDlkZTUwKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2MxN2M2ZTkwOGRmYTRjNGFhMGQ3MGVkZGYyZTkyOTIwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuODg2LCA3OC42OTFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzkzZGIzZWNmN2IxMjRmODNhNGJjNzkyZDAwZmExZjI5ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV84ODAyMTk4ZjFlOTE0NmZkYjNiNzZjNWJlMzY4ODNmYiA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0d1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnM0xUQTBQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStaV0Z6ZEdWeWJpQkxZWHBoYTJoemRHRnVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF85M2RiM2VjZjdiMTI0ZjgzYTRiYzc5MmQwMGZhMWYyOS5zZXRDb250ZW50KGlfZnJhbWVfODgwMjE5OGYxZTkxNDZmZGIzYjc2YzViZTM2ODgzZmIpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfYzE3YzZlOTA4ZGZhNGM0YWEwZDcwZWRkZjJlOTI5MjAuYmluZFBvcHVwKHBvcHVwXzkzZGIzZWNmN2IxMjRmODNhNGJjNzkyZDAwZmExZjI5KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2IwMWZiOTBmZGYwMzRjYmRhOWIyZTRiN2Y3YTNhMzcxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuODcxLCA3OC43OTFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2I0OWIxZThiZDIzNzQxODNhNDUzZTBiNTQ5MzE5MTRmID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV83MTk0NTJhOGUxZDg0Mzc1OWVjY2ZmODY3NzlhMWVlYSA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0d1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnM0xURXhQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStaV0Z6ZEdWeWJpQkxZWHBoYTJoemRHRnVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9iNDliMWU4YmQyMzc0MTgzYTQ1M2UwYjU0OTMxOTE0Zi5zZXRDb250ZW50KGlfZnJhbWVfNzE5NDUyYThlMWQ4NDM3NTllY2NmZjg2Nzc5YTFlZWEpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfYjAxZmI5MGZkZjAzNGNiZGE5YjJlNGI3ZjdhM2EzNzEuYmluZFBvcHVwKHBvcHVwX2I0OWIxZThiZDIzNzQxODNhNDUzZTBiNTQ5MzE5MTRmKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzdmMjgzMWYyYTMxNjQ1ODM4ZjBiMWI2YjQzNzZhNmU2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTM3LCA3OC45NzJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2RjZWQyMzMzMmQ3NzQ3YzFhZjQ0OTI4ODdmOGIzMDY1ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV8wYjFkNzQ2NTY4MjY0MzU3OTJlMWQ0MzM3ZDllOGJhNCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTmk0d1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnNUxURXdQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStaV0Z6ZEdWeWJpQkxZWHBoYTJoemRHRnVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9kY2VkMjMzMzJkNzc0N2MxYWY0NDkyODg3ZjhiMzA2NS5zZXRDb250ZW50KGlfZnJhbWVfMGIxZDc0NjU2ODI2NDM1NzkyZTFkNDMzN2Q5ZThiYTQpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfN2YyODMxZjJhMzE2NDU4MzhmMGIxYjZiNDM3NmE2ZTYuYmluZFBvcHVwKHBvcHVwX2RjZWQyMzMzMmQ3NzQ3YzFhZjQ0OTI4ODdmOGIzMDY1KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2M5YTZlODdiMTFjNTQyOWVhNmU0MDVhMzc0YzBhNGJmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDEuNjYyLCA4OC43NTI5OTk5OTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYjNiN2Y2YzZhYzE5NGQ4ZWE3ZTEzMTViMjQ3YTVmYmQgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzBiZWY1NjBlNWViMTQzZTlhOTQ2OGY3NDYwMzVhY2QzID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOaTR3UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGswTFRFd1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK2MyOTFkR2hsY200Z1dHbHVhbWxoYm1jc0lFTm9hVzVoUEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYjNiN2Y2YzZhYzE5NGQ4ZWE3ZTEzMTViMjQ3YTVmYmQuc2V0Q29udGVudChpX2ZyYW1lXzBiZWY1NjBlNWViMTQzZTlhOTQ2OGY3NDYwMzVhY2QzKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2M5YTZlODdiMTFjNTQyOWVhNmU0MDVhMzc0YzBhNGJmLmJpbmRQb3B1cChwb3B1cF9iM2I3ZjZjNmFjMTk0ZDhlYTdlMTMxNWIyNDdhNWZiZCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl83YTBlNzI4MjYwY2Y0MzNmYjdiYjYxNmFhNjc1NzJhOCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQxLjU1OSwgODguOF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfY2MxMDFiZTZjZDJlNDMwYWEyNDE4NTVmZjQwNDIzNjEgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzBiYzZkMzQxOGQwMTRiNzJhZTExNDViMWQ0NTI4YzhkID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOaTR3UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGsxTFRBNFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK2MyOTFkR2hsY200Z1dHbHVhbWxoYm1jc0lFTm9hVzVoUEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfY2MxMDFiZTZjZDJlNDMwYWEyNDE4NTVmZjQwNDIzNjEuc2V0Q29udGVudChpX2ZyYW1lXzBiYzZkMzQxOGQwMTRiNzJhZTExNDViMWQ0NTI4YzhkKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzdhMGU3MjgyNjBjZjQzM2ZiN2JiNjE2YWE2NzU3MmE4LmJpbmRQb3B1cChwb3B1cF9jYzEwMWJlNmNkMmU0MzBhYTI0MTg1NWZmNDA0MjM2MSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9jZjkzNGZlNzNjMjg0MWViYjhmZjhjNzU5ZGZhNWJlZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljk1MiwgNzguODQ0XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9hNTU2NWMyODE4MDA0YWIzOWU2MDE0OTAxNTgzNjk3MSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfZWVkOGU4OTAzYWQ3NGFhN2EzMGM1NmM4YTZmZDJmYjggPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UYzBMVEExUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krWldGemRHVnliaUJMWVhwaGEyaHpkR0Z1UEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYTU1NjVjMjgxODAwNGFiMzllNjAxNDkwMTU4MzY5NzEuc2V0Q29udGVudChpX2ZyYW1lX2VlZDhlODkwM2FkNzRhYTdhMzBjNTZjOGE2ZmQyZmI4KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2NmOTM0ZmU3M2MyODQxZWJiOGZmOGM3NTlkZmE1YmVkLmJpbmRQb3B1cChwb3B1cF9hNTU2NWMyODE4MDA0YWIzOWU2MDE0OTAxNTgzNjk3MSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8yZTRkODI5NTQ1NzI0NzgyYWEzN2I4Zjk0YzAzMjQxMCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ3Ljc4MiwgNDguMTJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2MxOWYyNGNjZjNhNTQzODU4NWNkMWIzNTA2NjNkNjQ4ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV81YjcwMmY0ZGM5ZDg0ZjlmYjY0ZGRmZDJjMzdkNzAyMSA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RjMkxUQTNQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStVblZ6YzJsaExVdGhlbUZyYUhOMFlXNGdZbTl5WkdWeUlISmxaMmx2Ymp3dlptOXVkRDQ4TDJnelBnb2dJQ0FnIiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYzE5ZjI0Y2NmM2E1NDM4NTg1Y2QxYjM1MDY2M2Q2NDguc2V0Q29udGVudChpX2ZyYW1lXzViNzAyZjRkYzlkODRmOWZiNjRkZGZkMmMzN2Q3MDIxKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzJlNGQ4Mjk1NDU3MjQ3ODJhYTM3YjhmOTRjMDMyNDEwLmJpbmRQb3B1cChwb3B1cF9jMTlmMjRjY2YzYTU0Mzg1ODVjZDFiMzUwNjYzZDY0OCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8zN2Y1MWI1MTllODU0M2ViOGE4ZjU3MDkxOWVmMGQzMCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljk5MTAwMDAwMDAwMDAxLCA3OS4wMDVdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzExOTlmMTYyMzgwMzQ4ZTA4Zjc5MmEzZjg3Y2IxOGNlID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9lN2M0Y2NiZWY3NGY0YmU5YmQ5OTA1MzAxYzBlMmJlZiA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RjMkxURXhQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStaV0Z6ZEdWeWJpQkxZWHBoYTJoemRHRnVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF8xMTk5ZjE2MjM4MDM0OGUwOGY3OTJhM2Y4N2NiMThjZS5zZXRDb250ZW50KGlfZnJhbWVfZTdjNGNjYmVmNzRmNGJlOWJkOTkwNTMwMWMwZTJiZWYpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMzdmNTFiNTE5ZTg1NDNlYjhhOGY1NzA5MTllZjBkMzAuYmluZFBvcHVwKHBvcHVwXzExOTlmMTYyMzgwMzQ4ZTA4Zjc5MmEzZjg3Y2IxOGNlKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2NjMDliNzQzNDNkMTQzMGY4MTk1ZDVkMzY0ZDJhZDM5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuODgzOTk5OTk5OTk5OTksIDc4LjkwNV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNDA0Mzc5MDgzY2Q3NDE4Y2FlMTcyM2Q1ODhkZDIxODYgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzVkZWRjZTE0OTgwMzQ0ZDE4NGMwZDVhMWVhMzZkMmMwID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQ1UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGMyTFRFeVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1pXRnpkR1Z5YmlCTFlYcGhhMmh6ZEdGdVBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzQwNDM3OTA4M2NkNzQxOGNhZTE3MjNkNTg4ZGQyMTg2LnNldENvbnRlbnQoaV9mcmFtZV81ZGVkY2UxNDk4MDM0NGQxODRjMGQ1YTFlYTM2ZDJjMCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9jYzA5Yjc0MzQzZDE0MzBmODE5NWQ1ZDM2NGQyYWQzOS5iaW5kUG9wdXAocG9wdXBfNDA0Mzc5MDgzY2Q3NDE4Y2FlMTcyM2Q1ODhkZDIxODYpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNDFiMGMyNDIxZGI2NDlhYmIxNzcxMjgxMTlmZDM1NmIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjEuOTMyLCAtMTM4Ljk1OF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNzhmNGQzZjYxOTBmNDA4OWI2NDk4NWNkYzc3NmQ3ZmYgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzE5MmEwZDU2MTY5ZjQ2ZTQ4OWZmMjQwMDA4MDZiYmY2ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQ1UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGMzTFRBelBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1ZIVmhiVzkwZFNCQmNtTm9hWEJsYkdGbmJ5d2dSbkpsYm1Ob0lGQnZiSGx1WlhOcFlTQnlaV2RwYjI0OEwyWnZiblErUEM5b016NEtJQ0FnSUE9PSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzc4ZjRkM2Y2MTkwZjQwODliNjQ5ODVjZGM3NzZkN2ZmLnNldENvbnRlbnQoaV9mcmFtZV8xOTJhMGQ1NjE2OWY0NmU0ODlmZjI0MDAwODA2YmJmNik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl80MWIwYzI0MjFkYjY0OWFiYjE3NzEyODExOWZkMzU2Yi5iaW5kUG9wdXAocG9wdXBfNzhmNGQzZjYxOTBmNDA4OWI2NDk4NWNkYzc3NmQ3ZmYpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMTc0NTJhMDg5YWE4NDg0MTliN2FmNjkwMDBjYTkzNDYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MC4wOTIsIDc4Ljk2MV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfM2I3Yzk4ZTdkNTExNDZjYTg2M2M2ZTJlMDcxYjRmNjcgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzYxYTNlNTZiZTY5MDRjZTZiOTJjMjNlN2I3YmM0MWU2ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQ1UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGMzTFRBNVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1pXRnpkR1Z5YmlCTFlYcGhhMmh6ZEdGdVBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzNiN2M5OGU3ZDUxMTQ2Y2E4NjNjNmUyZTA3MWI0ZjY3LnNldENvbnRlbnQoaV9mcmFtZV82MWEzZTU2YmU2OTA0Y2U2YjkyYzIzZTdiN2JjNDFlNik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8xNzQ1MmEwODlhYTg0ODQxOWI3YWY2OTAwMGNhOTM0Ni5iaW5kUG9wdXAocG9wdXBfM2I3Yzk4ZTdkNTExNDZjYTg2M2M2ZTJlMDcxYjRmNjcpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMmE3MmJjZWVhMTg3NGY0MTg2N2QyNmEzYzE2YjkwOWQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS45NTcsIDc4LjkzMV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfODQ5ZmVhY2MxYzhmNDhlNzk1NGMzNDViYjA0ZTNmNWQgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2VhYmE5Y2U0OTdjZjRlZTJhNzk2OWM1ZjZhOWJlMDMzID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQ1UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGMzTFRFeFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1pXRnpkR1Z5YmlCTFlYcGhhMmh6ZEdGdVBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzg0OWZlYWNjMWM4ZjQ4ZTc5NTRjMzQ1YmIwNGUzZjVkLnNldENvbnRlbnQoaV9mcmFtZV9lYWJhOWNlNDk3Y2Y0ZWUyYTc5NjljNWY2YTliZTAzMyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8yYTcyYmNlZWExODc0ZjQxODY3ZDI2YTNjMTZiOTA5ZC5iaW5kUG9wdXAocG9wdXBfODQ5ZmVhY2MxYzhmNDhlNzk1NGMzNDViYjA0ZTNmNWQpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZjQ3MjEyNjQ2NDJlNGU0Mzg4ZTA2NjJiYjc0ZTQyMWYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS44NzksIDc4LjgzODAwMDAwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF85MDgzNWY1MzVkY2Q0ODVlYmNmMGRiODE2ZDlkNDUwMyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfMTc5MDY5NjQ4OTg5NDAzOWEwMzdjMGIzMzczODY2MzggPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UYzRMVEEyUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krWldGemRHVnliaUJMWVhwaGEyaHpkR0Z1UEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfOTA4MzVmNTM1ZGNkNDg1ZWJjZjBkYjgxNmQ5ZDQ1MDMuc2V0Q29udGVudChpX2ZyYW1lXzE3OTA2OTY0ODk4OTQwMzlhMDM3YzBiMzM3Mzg2NjM4KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2Y0NzIxMjY0NjQyZTRlNDM4OGUwNjYyYmI3NGU0MjFmLmJpbmRQb3B1cChwb3B1cF85MDgzNWY1MzVkY2Q0ODVlYmNmMGRiODE2ZDlkNDUwMykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9mNDQxMDljZmQzNDI0ZGQ1OWQwNzFhMzNjMGEyYzY4OCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzczLjMzNiwgNTQuNzkyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9lODIxZGFkNmI0ZTA0NTk5YjI5MWEyOGViNDg5YjMwMCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfM2ZmZTljYzAwYmQ3NGNlOTgyYjQwNjI3NDk1ODRkZWIgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UYzRMVEE0UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krVG05MllYbGhJRnBsYld4NVlTd2dVblZ6YzJsaFBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2U4MjFkYWQ2YjRlMDQ1OTliMjkxYTI4ZWI0ODliMzAwLnNldENvbnRlbnQoaV9mcmFtZV8zZmZlOWNjMDBiZDc0Y2U5ODJiNDA2Mjc0OTU4NGRlYik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9mNDQxMDljZmQzNDI0ZGQ1OWQwNzFhMzNjMGEyYzY4OC5iaW5kUG9wdXAocG9wdXBfZTgyMWRhZDZiNGUwNDU5OWIyOTFhMjhlYjQ4OWIzMDApCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZTkzYTRkNmJkNTdjNDMwOWEwMjMzNDcyZTliZDBjY2YgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MC4wMDgsIDc4Ljk5NjAwMDAwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF81YTM3NDczZjIyZjk0ODk2YTQ2YjA4OTI2YmRhNzUzNiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfYTJlZDZiNDVlNzg1NGU0ODk5NTQwNmU4OWI5NWU2NDMgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UYzRMVEE0UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krWldGemRHVnliaUJMWVhwaGEyaHpkR0Z1UEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNWEzNzQ3M2YyMmY5NDg5NmE0NmIwODkyNmJkYTc1MzYuc2V0Q29udGVudChpX2ZyYW1lX2EyZWQ2YjQ1ZTc4NTRlNDg5OTU0MDZlODliOTVlNjQzKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2U5M2E0ZDZiZDU3YzQzMDlhMDIzMzQ3MmU5YmQwY2NmLmJpbmRQb3B1cChwb3B1cF81YTM3NDczZjIyZjk0ODk2YTQ2YjA4OTI2YmRhNzUzNikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8zMjVmYjdjZDhhY2Y0NmYwOTQ5YzAyZGQzOWJlODFhZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0yMS45MDMwMDAwMDAwMDAwMDIsIC0xMzguOTc1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9lMDY2MjdmNDM4YjQ0NjAzOTQ1Y2I1Y2YxYzAyMzQ2NCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfZjEwZmNhZDZmYzBlNDBjNTgxZDZjZDA2YWU3MjYzN2IgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UYzRMVEV4UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krVkhWaGJXOTBkU0JCY21Ob2FYQmxiR0ZuYnl3Z1JuSmxibU5vSUZCdmJIbHVaWE5wWVNCeVpXZHBiMjQ4TDJadmJuUStQQzlvTXo0S0lDQWdJQT09IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZTA2NjI3ZjQzOGI0NDYwMzk0NWNiNWNmMWMwMjM0NjQuc2V0Q29udGVudChpX2ZyYW1lX2YxMGZjYWQ2ZmMwZTQwYzU4MWQ2Y2QwNmFlNzI2MzdiKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzMyNWZiN2NkOGFjZjQ2ZjA5NDljMDJkZDM5YmU4MWFmLmJpbmRQb3B1cChwb3B1cF9lMDY2MjdmNDM4YjQ0NjAzOTQ1Y2I1Y2YxYzAyMzQ2NCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8yYzExYjE1NmJlZWY0ZjI1OGFlNWQ2NjQ4NWI0OTRjOSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0yMS44ODYsIC0xMzkuMDE5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9kOWZhZDk3YmI4MDM0NDZiYjMzODAxZjcwN2Y4ZDRhYiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfOTk0N2M2ZjgzODljNDk1NzhjOTc5Zjc1ZGRjMjRhMjUgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZ3dMVEEzUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krVkhWaGJXOTBkU0JCY21Ob2FYQmxiR0ZuYnl3Z1JuSmxibU5vSUZCdmJIbHVaWE5wWVNCeVpXZHBiMjQ4TDJadmJuUStQQzlvTXo0S0lDQWdJQT09IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZDlmYWQ5N2JiODAzNDQ2YmIzMzgwMWY3MDdmOGQ0YWIuc2V0Q29udGVudChpX2ZyYW1lXzk5NDdjNmY4Mzg5YzQ5NTc4Yzk3OWY3NWRkYzI0YTI1KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzJjMTFiMTU2YmVlZjRmMjU4YWU1ZDY2NDg1YjQ5NGM5LmJpbmRQb3B1cChwb3B1cF9kOWZhZDk3YmI4MDM0NDZiYjMzODAxZjcwN2Y4ZDRhYikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl81ZDc1NjE5NzY1MDg0Y2U3YWMxNTIxYjAxMWQ3MzUxMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljk1OCwgNzkuMDg1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF83NmU2ZWY0N2Y0YWU0MGYyYmY1NGYxNzNjYjZiODRmNyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfOTA3MjNlOTQ0YmUzNGY4Mzg5ZGIxZWIwODE4OGE0NzMgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZ3dMVEV3UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krWldGemRHVnliaUJMWVhwaGEyaHpkR0Z1UEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNzZlNmVmNDdmNGFlNDBmMmJmNTRmMTczY2I2Yjg0Zjcuc2V0Q29udGVudChpX2ZyYW1lXzkwNzIzZTk0NGJlMzRmODM4OWRiMWViMDgxODhhNDczKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzVkNzU2MTk3NjUwODRjZTdhYzE1MjFiMDExZDczNTExLmJpbmRQb3B1cChwb3B1cF83NmU2ZWY0N2Y0YWU0MGYyYmY1NGYxNzNjYjZiODRmNykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8zZTUyMGI3YjY0ZGM0YWMzYjM3NjM0MjFmYThhNDMwNiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjkzMTk5OTk5OTk5OTk5NSwgNzkuMDA1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF80ZjgwOWRkOGMwYWQ0Mzg1YmFhYTZkZmVkYjQyYzZhYiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfZmI5NTYzNGU2OTEyNGY4NDhhOTdhNTY1ZjQ2YTMyYzIgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZ3dMVEV5UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krWldGemRHVnliaUJMWVhwaGEyaHpkR0Z1UEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNGY4MDlkZDhjMGFkNDM4NWJhYWE2ZGZlZGI0MmM2YWIuc2V0Q29udGVudChpX2ZyYW1lX2ZiOTU2MzRlNjkxMjRmODQ4YTk3YTU2NWY0NmEzMmMyKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzNlNTIwYjdiNjRkYzRhYzNiMzc2MzQyMWZhOGE0MzA2LmJpbmRQb3B1cChwb3B1cF80ZjgwOWRkOGMwYWQ0Mzg1YmFhYTZkZmVkYjQyYzZhYikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8zNDk1NTMzNDdlN2E0YTk4ODM0OTVkOGFiYTYwYWM4NSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUwLjA0LCA3OS4wNDZdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzgwZmNlN2ZmMTUzMTQ5N2Q4NGVlMmRhZWE2YzE3ZTI4ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9lNTVjNTAzYTkxZTE0MjVkYWIwNGQzNzUyNmRkYTcxMiA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1Rnd0xURXlQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStaV0Z6ZEdWeWJpQkxZWHBoYTJoemRHRnVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF84MGZjZTdmZjE1MzE0OTdkODRlZTJkYWVhNmMxN2UyOC5zZXRDb250ZW50KGlfZnJhbWVfZTU1YzUwM2E5MWUxNDI1ZGFiMDRkMzc1MjZkZGE3MTIpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMzQ5NTUzMzQ3ZTdhNGE5ODgzNDk1ZDhhYmE2MGFjODUuYmluZFBvcHVwKHBvcHVwXzgwZmNlN2ZmMTUzMTQ5N2Q4NGVlMmRhZWE2YzE3ZTI4KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzMyYjljMTU2MDJiNzRiMzNhNmQzZGY1ZTAxYzA1MzlhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTAxLCA3OC45MDEwMDAwMDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMjFmMzc4ZGNiMmU0NGNiMDlhNjkxNzU4NzkzMTVmNzkgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzRjNTJkMWU0YjA3NDQxMDBiOTJlN2FlNGFiN2RmZjM0ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQ1UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGd4TFRBMFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1pXRnpkR1Z5YmlCTFlYcGhhMmh6ZEdGdVBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzIxZjM3OGRjYjJlNDRjYjA5YTY5MTc1ODc5MzE1Zjc5LnNldENvbnRlbnQoaV9mcmFtZV80YzUyZDFlNGIwNzQ0MTAwYjkyZTdhZTRhYjdkZmYzNCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8zMmI5YzE1NjAyYjc0YjMzYTZkM2RmNWUwMWMwNTM5YS5iaW5kUG9wdXAocG9wdXBfMjFmMzc4ZGNiMmU0NGNiMDlhNjkxNzU4NzkzMTVmNzkpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYzYxNDI2OTQwZjUwNGY1ZDhmYzI1NDU5NzRmMTI3NTMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs3My4zMTcsIDU0LjgxMl0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYTE4M2U1NDU4MGU5NDVhZjlmZWQ2NmMzM2VmNDM0MzUgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzM1MGEzNDIxYjllMTRmYWJhYTIwYWM3YzgxYjg0ZjkzID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQ1UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGd4TFRFd1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1RtOTJZWGxoSUZwbGJXeDVZU3dnVW5WemMybGhQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9hMTgzZTU0NTgwZTk0NWFmOWZlZDY2YzMzZWY0MzQzNS5zZXRDb250ZW50KGlfZnJhbWVfMzUwYTM0MjFiOWUxNGZhYmFhMjBhYzdjODFiODRmOTMpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfYzYxNDI2OTQwZjUwNGY1ZDhmYzI1NDU5NzRmMTI3NTMuYmluZFBvcHVwKHBvcHVwX2ExODNlNTQ1ODBlOTQ1YWY5ZmVkNjZjMzNlZjQzNDM1KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2RmNDcyZmNhMDA4NjQxMWU5NDFhZmQzMDcyNTk4NGE4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTIxLjg5NSwgLTEzOC45MThdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzc0MTc1OGEwY2E1OTQzY2RhYWViNzM3ZjRmMmE5N2E2ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV83N2EyNDg5OGUwZTM0Y2Y5ODY4Y2NjMzBkMmI3YmU2NyA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnekxUQTFQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStWSFZoYlc5MGRTQkJjbU5vYVhCbGJHRm5ieXdnUm5KbGJtTm9JRkJ2YkhsdVpYTnBZU0J5WldkcGIyNDhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lBPT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF83NDE3NThhMGNhNTk0M2NkYWFlYjczN2Y0ZjJhOTdhNi5zZXRDb250ZW50KGlfZnJhbWVfNzdhMjQ4OThlMGUzNGNmOTg2OGNjYzMwZDJiN2JlNjcpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZGY0NzJmY2EwMDg2NDExZTk0MWFmZDMwNzI1OTg0YTguYmluZFBvcHVwKHBvcHVwXzc0MTc1OGEwY2E1OTQzY2RhYWViNzM3ZjRmMmE5N2E2KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzIwMzljMDk3ZThlNzQ1ODNiMTZhMDUyYWNlYWI2MDNiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNzMuMzgzLCA1NC45MTMwMDAwMDAwMDAwMDRdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzhkZTZhZWExODM0NzQ0MGY4M2FlODZkNDIzNmJiZGM1ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV84OTNmYTkxZDI3NmM0ZDAxYWI2NDdiMTc3MzNiNTMyYSA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnekxUQTRQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStUbTkyWVhsaElGcGxiV3g1WVN3Z1VuVnpjMmxoUEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfOGRlNmFlYTE4MzQ3NDQwZjgzYWU4NmQ0MjM2YmJkYzUuc2V0Q29udGVudChpX2ZyYW1lXzg5M2ZhOTFkMjc2YzRkMDFhYjY0N2IxNzczM2I1MzJhKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzIwMzljMDk3ZThlNzQ1ODNiMTZhMDUyYWNlYWI2MDNiLmJpbmRQb3B1cChwb3B1cF84ZGU2YWVhMTgzNDc0NDBmODNhZTg2ZDQyMzZiYmRjNSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9kNWVhYTkwM2U5Mjk0YzViODk4MjEyMWEyYjVkOGJkZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjkzNywgNzkuMDE3XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9mZTEyMTI4YmUzZTA0NDY3OTM1MDg4NTJlYWUxYjQ1MCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfM2NhMDM3OWYwMjg5NGY3NDlmYjUwYjU3MTY1YWNlYmIgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZzBMVEF6UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krWldGemRHVnliaUJMWVhwaGEyaHpkR0Z1UEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZmUxMjEyOGJlM2UwNDQ2NzkzNTA4ODUyZWFlMWI0NTAuc2V0Q29udGVudChpX2ZyYW1lXzNjYTAzNzlmMDI4OTRmNzQ5ZmI1MGI1NzE2NWFjZWJiKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2Q1ZWFhOTAzZTkyOTRjNWI4OTgyMTIxYTJiNWQ4YmRkLmJpbmRQb3B1cChwb3B1cF9mZTEyMTI4YmUzZTA0NDY3OTM1MDg4NTJlYWUxYjQ1MCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl81NGJlZjdiMjI5YjY0MjdkOTcwN2MyZmRlMzAyYzU5MSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljk1MywgNzguOTRdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2FmOWZiNWZmM2QwOTQwMDRiM2RjMjk2Y2Q0YjQ3ZDdhID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9iZTQxNWZiMjhhNzU0ZGVlODBhYzI2YjQ2N2NhZjZhYSA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnMExUQTBQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStaV0Z6ZEdWeWJpQkxZWHBoYTJoemRHRnVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9hZjlmYjVmZjNkMDk0MDA0YjNkYzI5NmNkNGI0N2Q3YS5zZXRDb250ZW50KGlfZnJhbWVfYmU0MTVmYjI4YTc1NGRlZTgwYWMyNmI0NjdjYWY2YWEpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNTRiZWY3YjIyOWI2NDI3ZDk3MDdjMmZkZTMwMmM1OTEuYmluZFBvcHVwKHBvcHVwX2FmOWZiNWZmM2QwOTQwMDRiM2RjMjk2Y2Q0YjQ3ZDdhKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2U5OTk2NzAxYzJmZjRjZTg5YWNmZTM5OTUyODlmZWZhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNzMuMzcsIDU0Ljk1NV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNWMwZGNiMTE3OTExNGZkZWFhNjU0Yzk4ZTA1ZGQwMzcgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzM2Y2E5MjM5MWYzNTQ2OTdiNjE5MDNiZGRhMjAwNjY3ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQ1UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGcwTFRFd1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1RtOTJZWGxoSUZwbGJXeDVZU3dnVW5WemMybGhQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF81YzBkY2IxMTc5MTE0ZmRlYWE2NTRjOThlMDVkZDAzNy5zZXRDb250ZW50KGlfZnJhbWVfMzZjYTkyMzkxZjM1NDY5N2I2MTkwM2JkZGEyMDA2NjcpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZTk5OTY3MDFjMmZmNGNlODlhY2ZlMzk5NTI4OWZlZmEuYmluZFBvcHVwKHBvcHVwXzVjMGRjYjExNzkxMTRmZGVhYTY1NGM5OGUwNWRkMDM3KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2NhODU1N2E3Zjk1MTQzNDRhY2UwMzViOGQwZWNkOWY5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuODc2OTk5OTk5OTk5OTk1LCA3OC44MTZdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2Y4ZjcwNDhhN2VmOTQ2OGM4ODBiMjkzZWFjYjY5MTlhID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV83NTQ0ZGQ3MTIyMGY0MmE5OWYxNGIxY2E4YzUwYTk3ZCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnMUxUQXlQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStaV0Z6ZEdWeWJpQkxZWHBoYTJoemRHRnVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9mOGY3MDQ4YTdlZjk0NjhjODgwYjI5M2VhY2I2OTE5YS5zZXRDb250ZW50KGlfZnJhbWVfNzU0NGRkNzEyMjBmNDJhOTlmMTRiMWNhOGM1MGE5N2QpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfY2E4NTU3YTdmOTUxNDM0NGFjZTAzNWI4ZDBlY2Q5ZjkuYmluZFBvcHVwKHBvcHVwX2Y4ZjcwNDhhN2VmOTQ2OGM4ODBiMjkzZWFjYjY5MTlhKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2FhNjI5MzIyNzdmZTRmMTA5ZTJiODEzMjE5OGVlZDE1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTI0LCA3OC45NjldLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2JiZGRlNmMyNWI3ZTQ1Y2NhYjljNjQ4MTAwZmYxODRmID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9lNjEyNDNhMDQ0OTA0MmEwYjFhNDA1OTQ5NTA2OGY5YSA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnMUxUQTBQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStaV0Z6ZEdWeWJpQkxZWHBoYTJoemRHRnVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9iYmRkZTZjMjViN2U0NWNjYWI5YzY0ODEwMGZmMTg0Zi5zZXRDb250ZW50KGlfZnJhbWVfZTYxMjQzYTA0NDkwNDJhMGIxYTQwNTk0OTUwNjhmOWEpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfYWE2MjkzMjI3N2ZlNGYxMDllMmI4MTMyMTk4ZWVkMTUuYmluZFBvcHVwKHBvcHVwX2JiZGRlNmMyNWI3ZTQ1Y2NhYjljNjQ4MTAwZmYxODRmKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzg3NDU5MDQxNzNiNTQwOTBiMDYyMTYxNDhlZTVkMWQ3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTUxLCA3OC44MjldLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2M1MzRhNWZiM2FiYzQwZTA4NjA3OTU4Y2ZmNWI5NGYwID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV81YzMxMzVhZWNlOGI0YjMxODYyMjdjOTI1OGNkODNlYiA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnMUxUQTNQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStaV0Z6ZEdWeWJpQkxZWHBoYTJoemRHRnVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9jNTM0YTVmYjNhYmM0MGUwODYwNzk1OGNmZjViOTRmMC5zZXRDb250ZW50KGlfZnJhbWVfNWMzMTM1YWVjZThiNGIzMTg2MjI3YzkyNThjZDgzZWIpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfODc0NTkwNDE3M2I1NDA5MGIwNjIxNjE0OGVlNWQxZDcuYmluZFBvcHVwKHBvcHVwX2M1MzRhNWZiM2FiYzQwZTA4NjA3OTU4Y2ZmNWI5NGYwKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzU3ODcyMzllZjFkYzQzZWViYzczNmY5YTkyMzFkMTM5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuODgsIDc4LjkxN10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfODI1NjQ1NDNlNzExNDQ0ZmEzNzdkNWZiYTNjMzhmMDMgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzc1OGI5ZTgxZGJiMTRkNDk4YTk5NWQ5ZTJkYzQxY2JhID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQ1UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGczTFRBNFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1pXRnpkR1Z5YmlCTFlYcGhhMmh6ZEdGdVBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzgyNTY0NTQzZTcxMTQ0NGZhMzc3ZDVmYmEzYzM4ZjAzLnNldENvbnRlbnQoaV9mcmFtZV83NThiOWU4MWRiYjE0ZDQ5OGE5OTVkOWUyZGM0MWNiYSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl81Nzg3MjM5ZWYxZGM0M2VlYmM3MzZmOWE5MjMxZDEzOS5iaW5kUG9wdXAocG9wdXBfODI1NjQ1NDNlNzExNDQ0ZmEzNzdkNWZiYTNjMzhmMDMpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMzY4ZGVlNmY1OTFjNDE5YzlkZTY5YjQzODRhYmE0OTIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjEuOTA0LCAtMTM4Ljk5NV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMzFmYTQ0Njk4ZWZkNDIzYzgzZjMwY2MwYjAyMTdhYjYgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzRlNzJmNzkzYzQxYjQwMGE4ZDMzOThjZDE3ODA2MTE5ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQ1UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGczTFRFeFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1ZIVmhiVzkwZFNCQmNtTm9hWEJsYkdGbmJ5d2dSbkpsYm1Ob0lGQnZiSGx1WlhOcFlTQnlaV2RwYjI0OEwyWnZiblErUEM5b016NEtJQ0FnSUE9PSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzMxZmE0NDY5OGVmZDQyM2M4M2YzMGNjMGIwMjE3YWI2LnNldENvbnRlbnQoaV9mcmFtZV80ZTcyZjc5M2M0MWI0MDBhOGQzMzk4Y2QxNzgwNjExOSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8zNjhkZWU2ZjU5MWM0MTljOWRlNjliNDM4NGFiYTQ5Mi5iaW5kUG9wdXAocG9wdXBfMzFmYTQ0Njk4ZWZkNDIzYzgzZjMwY2MwYjAyMTdhYjYpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZjFlMzM3ZDkzMGQyNDVkOGJhYzRjZWVlNjZkMWIxMzYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs3My4zODcsIDU0Ljk5ODAwMDAwMDAwMDAwNV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZDVkNDBmZDBmZThlNGMwN2FiNmJlNjBhN2RhNGJmNDAgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzkwOGZhNjU5MzMwZTRkODc5NjI3OGMzMGM1Y2IxNTU1ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQ1UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGc0TFRFeVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1RtOTJZWGxoSUZwbGJXeDVZU3dnVW5WemMybGhQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9kNWQ0MGZkMGZlOGU0YzA3YWI2YmU2MGE3ZGE0YmY0MC5zZXRDb250ZW50KGlfZnJhbWVfOTA4ZmE2NTkzMzBlNGQ4Nzk2Mjc4YzMwYzVjYjE1NTUpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZjFlMzM3ZDkzMGQyNDVkOGJhYzRjZWVlNjZkMWIxMzYuYmluZFBvcHVwKHBvcHVwX2Q1ZDQwZmQwZmU4ZTRjMDdhYjZiZTYwYTdkYTRiZjQwKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2MwZGUwZjlkOWVjMzQyOTZiNjk4NDYxZDkzMmQ3YTAzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuODg2LCA3OC45MjZdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzVmNDZiMmU5NTg0NDQ0YzM4YWI5NDRkY2VhYTE4OTI0ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV81ZDVkY2I1NjU5MzY0Yjk3YmNhMTgwYzIzZTE5ODU3YiA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnNExURXlQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStaV0Z6ZEdWeWJpQkxZWHBoYTJoemRHRnVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF81ZjQ2YjJlOTU4NDQ0NGMzOGFiOTQ0ZGNlYWExODkyNC5zZXRDb250ZW50KGlfZnJhbWVfNWQ1ZGNiNTY1OTM2NGI5N2JjYTE4MGMyM2UxOTg1N2IpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfYzBkZTBmOWQ5ZWMzNDI5NmI2OTg0NjFkOTMyZDdhMDMuYmluZFBvcHVwKHBvcHVwXzVmNDZiMmU5NTg0NDQ0YzM4YWI5NDRkY2VhYTE4OTI0KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2RjYzQ3YThlYmI4NTQ1OWY5Nzc2OWI1MGI2ODNjYTg0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTI1LCA3OC43NF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfOTgzOWY1Y2ExNWZhNDBlMmFjYzQwMjg2ZjcwYzVkYzQgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2Q0NTc5YmQxNDEyZDQwZjlhZThmZGU0ZjVhZTdhYTAxID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQ1UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGc1TFRBeVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1pXRnpkR1Z5YmlCTFlYcGhhMmh6ZEdGdVBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzk4MzlmNWNhMTVmYTQwZTJhY2M0MDI4NmY3MGM1ZGM0LnNldENvbnRlbnQoaV9mcmFtZV9kNDU3OWJkMTQxMmQ0MGY5YWU4ZmRlNGY1YWU3YWEwMSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9kY2M0N2E4ZWJiODU0NTlmOTc3NjliNTBiNjgzY2E4NC5iaW5kUG9wdXAocG9wdXBfOTgzOWY1Y2ExNWZhNDBlMmFjYzQwMjg2ZjcwYzVkYzQpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNzg5YWExZTRjNjhkNDEzM2E4NGQwZTMxN2ZjOGE1YzkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0MS42NjcsIDg4LjY5NV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNjQwZTVlMmM5NGQ0NDMxYWIyNWEzZGY0MzRmMzEzZTcgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzIwYWY0Zjk2MzAxMzQ2ZGNiMWQxYzViYWIzNmM4YjZkID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQ1UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGt6TFRFd1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK2MyOTFkR2hsY200Z1dHbHVhbWxoYm1jc0lFTm9hVzVoUEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNjQwZTVlMmM5NGQ0NDMxYWIyNWEzZGY0MzRmMzEzZTcuc2V0Q29udGVudChpX2ZyYW1lXzIwYWY0Zjk2MzAxMzQ2ZGNiMWQxYzViYWIzNmM4YjZkKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzc4OWFhMWU0YzY4ZDQxMzNhODRkMGUzMTdmYzhhNWM5LmJpbmRQb3B1cChwb3B1cF82NDBlNWUyYzk0ZDQ0MzFhYjI1YTNkZjQzNGYzMTNlNykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl84NzM2Mjc0NDljZmU0YWE3YTkzZDMwNzkxODAwM2VhOCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQxLjY1NywgODguNjldLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzE0NWUzYjYzZjgwMjQ5YmE5MzkxYjgxMzBhNzk5NjBjID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV8xNDcxMDc3MTIwZTY0OGMyYWQwYWUwZjY0NGUyMDJiZSA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RrMkxUQTJQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStjMjkxZEdobGNtNGdXR2x1YW1saGJtY3NJRU5vYVc1aFBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzE0NWUzYjYzZjgwMjQ5YmE5MzkxYjgxMzBhNzk5NjBjLnNldENvbnRlbnQoaV9mcmFtZV8xNDcxMDc3MTIwZTY0OGMyYWQwYWUwZjY0NGUyMDJiZSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl84NzM2Mjc0NDljZmU0YWE3YTkzZDMwNzkxODAwM2VhOC5iaW5kUG9wdXAocG9wdXBfMTQ1ZTNiNjNmODAyNDliYTkzOTFiODEzMGE3OTk2MGMpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNWI1NmI4ZmIwNmM1NDgxZmI1NDRjYWI0MzkxYjZjZTggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy4yOTY1LCAtMTE2LjMzMzE2NjddLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzczZTUwMGMzYmQxYTQ3YThhOGEyOGQ1NWM2ODBhNDM2ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9kMmQwOTE5ZWY0MzU0NGI0YTc0NmNmZGMyNTZhN2I0NiA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NE5Ed3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZ0lDQWdJRHhvTXo0Z1JHRjBaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTVRrM05pMHdNVHd2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdURzlqWVhScGIyNDZJRHhtYjI1MElHTnZiRzl5UFNKeVpXUWlQalUzYTIwZ1RrVWdiMllnUW1WaGRIUjVMQ0JPVmp3dlptOXVkRDQ4TDJnelBnb2dJQ0FnIiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNzNlNTAwYzNiZDFhNDdhOGE4YTI4ZDU1YzY4MGE0MzYuc2V0Q29udGVudChpX2ZyYW1lX2QyZDA5MTllZjQzNTQ0YjRhNzQ2Y2ZkYzI1NmE3YjQ2KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzViNTZiOGZiMDZjNTQ4MWZiNTQ0Y2FiNDM5MWI2Y2U4LmJpbmRQb3B1cChwb3B1cF83M2U1MDBjM2JkMWE0N2E4YThhMjhkNTVjNjgwYTQzNikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9mNDNhN2MwODQ3NzM0YmFhOGFmNjY3ZjRlNzJlYTQ2ZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjMwNiwgLTExNi40NzE1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9jOThiYjczMzk0Y2I0NDVkYjM1MTczMzI5NDExYTIxMCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfNmI5ZDU3YjU2ZjI2NGNlMWJiNDFkZjI1MzNiMTE2ZmUgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDRORHd2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK01UazNOaTB3TXp3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnVEc5allYUnBiMjQ2SUR4bWIyNTBJR052Ykc5eVBTSnlaV1FpUGpVeGEyMGdUazVGSUc5bUlFSmxZWFIwZVN3Z1RsWThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lBPT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9jOThiYjczMzk0Y2I0NDVkYjM1MTczMzI5NDExYTIxMC5zZXRDb250ZW50KGlfZnJhbWVfNmI5ZDU3YjU2ZjI2NGNlMWJiNDFkZjI1MzNiMTE2ZmUpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZjQzYTdjMDg0NzczNGJhYThhZjY2N2Y0ZTcyZWE0NmQuYmluZFBvcHVwKHBvcHVwX2M5OGJiNzMzOTRjYjQ0NWRiMzUxNzMzMjk0MTFhMjEwKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzNkMDNmZGEyNmEwZDQzZTVhNWNiMmJmZjRlNGExN2EyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuMzE0MTY2NywgLTExNi40NjA2NjY3MDAwMDAwMl0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMTU1ODRiNjc0M2JlNGVmYWI1YjFlNDI2NDRjMGVhNTkgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2Y5NDQ4YmIyMzM5ZDQwYzVhODA3NmZhNTUzNWZhNTk2ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQ0TWp3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnUkdGMFpUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStNVGsyT1Mwd09Ud3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZ0lDQWdJRHhvTXo0Z1RHOWpZWFJwYjI0NklEeG1iMjUwSUdOdmJHOXlQU0p5WldRaVBqVXlhMjBnVGs1RklHOW1JRUpsWVhSMGVTd2dUbFk4TDJadmJuUStQQzlvTXo0S0lDQWdJQT09IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMTU1ODRiNjc0M2JlNGVmYWI1YjFlNDI2NDRjMGVhNTkuc2V0Q29udGVudChpX2ZyYW1lX2Y5NDQ4YmIyMzM5ZDQwYzVhODA3NmZhNTUzNWZhNTk2KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzNkMDNmZGEyNmEwZDQzZTVhNWNiMmJmZjRlNGExN2EyLmJpbmRQb3B1cChwb3B1cF8xNTU4NGI2NzQzYmU0ZWZhYjViMWU0MjY0NGMwZWE1OSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9iMTE2ZWEyNzdmMTI0Yjg4YmI2ZDA0ZGFjODdmY2VjOCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjI3MTMzMzI5OTk5OTk5NSwgLTExNi40ODgzMzMzXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF81YTI2MTExYTc1ZDM0M2VjYWI1NWY4MjViYzUyYjJlYSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfMmQ2NjVjNjI3ZDdmNDNhNWEyMGU4NDBhMjU2ODkwOWIgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDRNVHd2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK01UazNOaTB3TWp3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnVEc5allYUnBiMjQ2SUR4bWIyNTBJR052Ykc5eVBTSnlaV1FpUGpRM2EyMGdUazVGSUc5bUlFSmxZWFIwZVN3Z1RsWThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lBPT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF81YTI2MTExYTc1ZDM0M2VjYWI1NWY4MjViYzUyYjJlYS5zZXRDb250ZW50KGlfZnJhbWVfMmQ2NjVjNjI3ZDdmNDNhNWEyMGU4NDBhMjU2ODkwOWIpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfYjExNmVhMjc3ZjEyNGI4OGJiNmQwNGRhYzg3ZmNlYzguYmluZFBvcHVwKHBvcHVwXzVhMjYxMTFhNzVkMzQzZWNhYjU1ZjgyNWJjNTJiMmVhKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzlmYjQ3MTQ4MTkxMjQ3YWQ4MTdlNmZhZTFhYTQyNTExID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTgzOTk5OTk5OTk5OTk1LCA3OC45NzVdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzI5NzQwN2ZkNDE5ZTQ5MTJiODk2MjZhMDMxZTlhNTNiID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV8wNDU5YmNjZDE0Yjc0YzU5OWE0N2JmZTQ1ODhkNGE3YiA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RjMUxURXdQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStaV0Z6ZEdWeWJpQkxZWHBoYTJoemRHRnVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF8yOTc0MDdmZDQxOWU0OTEyYjg5NjI2YTAzMWU5YTUzYi5zZXRDb250ZW50KGlfZnJhbWVfMDQ1OWJjY2QxNGI3NGM1OTlhNDdiZmU0NTg4ZDRhN2IpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfOWZiNDcxNDgxOTEyNDdhZDgxN2U2ZmFlMWFhNDI1MTEuYmluZFBvcHVwKHBvcHVwXzI5NzQwN2ZkNDE5ZTQ5MTJiODk2MjZhMDMxZTlhNTNiKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzU3YTNmYzI4M2MxZDQyNjE4MDc1MzUxNzI0YjVmM2ZiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTAuMDQzLCA3OC44OTldLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzk4MjFiZjBlNDM5YTQ3ZDU4NzlkMGJhNWY4NjA3NjY4ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV8zNjI5N2Y3ZmE3YmY0YzQ0YjRiZjMyYjdhZTYzMGUwMSA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RjMUxURXlQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStaV0Z6ZEdWeWJpQkxZWHBoYTJoemRHRnVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF85ODIxYmYwZTQzOWE0N2Q1ODc5ZDBiYTVmODYwNzY2OC5zZXRDb250ZW50KGlfZnJhbWVfMzYyOTdmN2ZhN2JmNGM0NGI0YmYzMmI3YWU2MzBlMDEpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNTdhM2ZjMjgzYzFkNDI2MTgwNzUzNTE3MjRiNWYzZmIuYmluZFBvcHVwKHBvcHVwXzk4MjFiZjBlNDM5YTQ3ZDU4NzlkMGJhNWY4NjA3NjY4KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzY4MTBkOThiODExOTQ0MzA5YTk5YjM4MzhjZmQ4M2U5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTE1LCA3OC45NTJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzc1ZjIxYTA0NDdjYTRkODJiMDE4MmZkM2NiNTZhOWUzID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV82YTQ4NmI2ZjFmMTI0ZWY2OWUxODA2MjNjMWFkZmMyNCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RjMkxUQTNQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStaV0Z6ZEdWeWJpQkxZWHBoYTJoemRHRnVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF83NWYyMWEwNDQ3Y2E0ZDgyYjAxODJmZDNjYjU2YTllMy5zZXRDb250ZW50KGlfZnJhbWVfNmE0ODZiNmYxZjEyNGVmNjllMTgwNjIzYzFhZGZjMjQpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNjgxMGQ5OGI4MTE5NDQzMDlhOTliMzgzOGNmZDgzZTkuYmluZFBvcHVwKHBvcHVwXzc1ZjIxYTA0NDdjYTRkODJiMDE4MmZkM2NiNTZhOWUzKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzNjNDNiMzQ3ZmY3MDRjZmI4MWUzMmRkMTBlOWI2Nzg3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTY4OTk5OTk5OTk5OTk0LCA3OS4wMDFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2Y2MmQ5YjJlNjVmOTQ0OWNiYzY3NWRjZDU1NDE0OGNiID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9jYTMxYjJlZTY4ZGQ0YWE5YWYxYjQ4YmZjYmY1ZTIwZSA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RjMkxUQTRQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStaV0Z6ZEdWeWJpQkxZWHBoYTJoemRHRnVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9mNjJkOWIyZTY1Zjk0NDljYmM2NzVkY2Q1NTQxNDhjYi5zZXRDb250ZW50KGlfZnJhbWVfY2EzMWIyZWU2OGRkNGFhOWFmMWI0OGJmY2JmNWUyMGUpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfM2M0M2IzNDdmZjcwNGNmYjgxZTMyZGQxMGU5YjY3ODcuYmluZFBvcHVwKHBvcHVwX2Y2MmQ5YjJlNjVmOTQ0OWNiYzY3NWRjZDU1NDE0OGNiKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzQxYTU5NTc2M2QzMTRkZDViMTdkZTc4MjE4ZDBhYmIzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNzMuNDA0LCA1NC44MTddLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzU5NWEwZjE0YTgxMTQzMDU4NDg0YjRhM2E1NmY1YzNkID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV85OGQ3YzhlZTZhYmE0YzYzOThmNmFkZjQ3MmUyMmI4ZiA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RjMkxUQTVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStUbTkyWVhsaElGcGxiV3g1WVN3Z1VuVnpjMmxoUEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNTk1YTBmMTRhODExNDMwNTg0ODRiNGEzYTU2ZjVjM2Quc2V0Q29udGVudChpX2ZyYW1lXzk4ZDdjOGVlNmFiYTRjNjM5OGY2YWRmNDcyZTIyYjhmKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzQxYTU5NTc2M2QzMTRkZDViMTdkZTc4MjE4ZDBhYmIzLmJpbmRQb3B1cChwb3B1cF81OTVhMGYxNGE4MTE0MzA1ODQ4NGI0YTNhNTZmNWMzZCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8xYjhhZGE3ZGMxYjQ0MTgxOGU0YjI3MGJiMDEzNzE0MSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjgzOSwgNzguOTA2XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF85MjM4Yjg3OTFlZWY0YzA4YTRkN2NkNDYzNjg0MjliZCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfMTNkMWU5MmVlOTRmNDA2MTljY2RiMDJhMGExNzJhODggPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDRQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UYzRMVEEzUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krWldGemRHVnliaUJMWVhwaGEyaHpkR0Z1UEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfOTIzOGI4NzkxZWVmNGMwOGE0ZDdjZDQ2MzY4NDI5YmQuc2V0Q29udGVudChpX2ZyYW1lXzEzZDFlOTJlZTk0ZjQwNjE5Y2NkYjAyYTBhMTcyYTg4KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzFiOGFkYTdkYzFiNDQxODE4ZTRiMjcwYmIwMTM3MTQxLmJpbmRQb3B1cChwb3B1cF85MjM4Yjg3OTFlZWY0YzA4YTRkN2NkNDYzNjg0MjliZCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8yZTkyYjgzZWQ0Y2U0MTYwOWFkOGFiZGU0NzFjZWY1MCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjgxODAwMDAwMDAwMDAwNSwgNDguMTE0XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8xNzUwZjRmMmRiMjU0OWMzYTAyNDY4YWU1OTlhNmM1MiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfMzdjNmVlNjBlODk5NGY5OWI3YjkyN2I0YWE5ZGU5NzQgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDRQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UYzRMVEV3UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krVW5WemMybGhMVXRoZW1GcmFITjBZVzRnWW05eVpHVnlJSEpsWjJsdmJqd3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZyIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzE3NTBmNGYyZGIyNTQ5YzNhMDI0NjhhZTU5OWE2YzUyLnNldENvbnRlbnQoaV9mcmFtZV8zN2M2ZWU2MGU4OTk0Zjk5YjdiOTI3YjRhYTlkZTk3NCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8yZTkyYjgzZWQ0Y2U0MTYwOWFkOGFiZGU0NzFjZWY1MC5iaW5kUG9wdXAocG9wdXBfMTc1MGY0ZjJkYjI1NDljM2EwMjQ2OGFlNTk5YTZjNTIpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMzQxYjk3ZTlkNjdhNGQ0MWFjMjkwNGEwNzBkMjYxMTAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MC4wNTMwMDAwMDAwMDAwMDQsIDc5LjA2NV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMDcwNjNkMzk1MDczNGJhYjk4M2I3ZDU0ZTQ2ZTI2YmYgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2U3ZTEzMzBkYzM1NTQ1MGFhNmJlZDNmNjY5NTk0YTg0ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQ0UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGM1TFRBM1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1pXRnpkR1Z5YmlCTFlYcGhhMmh6ZEdGdVBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzA3MDYzZDM5NTA3MzRiYWI5ODNiN2Q1NGU0NmUyNmJmLnNldENvbnRlbnQoaV9mcmFtZV9lN2UxMzMwZGMzNTU0NTBhYTZiZWQzZjY2OTU5NGE4NCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8zNDFiOTdlOWQ2N2E0ZDQxYWMyOTA0YTA3MGQyNjExMC5iaW5kUG9wdXAocG9wdXBfMDcwNjNkMzk1MDczNGJhYjk4M2I3ZDU0ZTQ2ZTI2YmYpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYTdlZmJmNzBiOWZkNGJmYmJiNDkyN2I0ZDk3NzlkNDEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs3My4zMzgwMDAwMDAwMDAwMSwgNTQuODA2OTk5OTk5OTk5OTk1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8yNDQ5YzQ5ZGQ1Nzk0ZjFkYWYwODFjNDk2MTQwMDEzYyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfZDUxZWZjMjA3MzE3NDljZTllZTg4MjAwNmU5MDhiYjIgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDRQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UYzVMVEV3UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krVG05MllYbGhJRnBsYld4NVlTd2dVblZ6YzJsaFBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzI0NDljNDlkZDU3OTRmMWRhZjA4MWM0OTYxNDAwMTNjLnNldENvbnRlbnQoaV9mcmFtZV9kNTFlZmMyMDczMTc0OWNlOWVlODgyMDA2ZTkwOGJiMik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9hN2VmYmY3MGI5ZmQ0YmZiYmI0OTI3YjRkOTc3OWQ0MS5iaW5kUG9wdXAocG9wdXBfMjQ0OWM0OWRkNTc5NGYxZGFmMDgxYzQ5NjE0MDAxM2MpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNjQ1MTYxY2ExN2U3NDI4YjhhNzFjMzY5ZDAxOTBhOTEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny44MDYwMDAwMDAwMDAwMDQsIDQ4LjE1OF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNzYwNTFhYjhlYWYxNGNlMWFhMjgwMmVmOWRhODlkMDQgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzIwYjgyYmYwZmU4NzRiOTU5NGE0MmQ3MjgyYmExMjMxID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQ0UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGM1TFRFd1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1VuVnpjMmxoTFV0aGVtRnJhSE4wWVc0Z1ltOXlaR1Z5SUhKbFoybHZiand2Wm05dWRENDhMMmd6UGdvZ0lDQWciIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF83NjA1MWFiOGVhZjE0Y2UxYWEyODAyZWY5ZGE4OWQwNC5zZXRDb250ZW50KGlfZnJhbWVfMjBiODJiZjBmZTg3NGI5NTk0YTQyZDcyODJiYTEyMzEpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNjQ1MTYxY2ExN2U3NDI4YjhhNzFjMzY5ZDAxOTBhOTEuYmluZFBvcHVwKHBvcHVwXzc2MDUxYWI4ZWFmMTRjZTFhYTI4MDJlZjlkYTg5ZDA0KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2NkNjBlNjJkMDFlYTRhMDdhOWM3YTZkMDhjOGUyZjA3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNzMuMzUzMDAwMDAwMDAwMDEsIDU0Ljk5N10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYjQ4ZTNjYjE2ODI2NDMwMDkxMzZjOWRiMTM4ZDA0YzAgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2ZlODNjYTg4OWJiMzQyODViZjk5OWEzMzdmMmZmNmY3ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQ0UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGd3TFRFd1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1RtOTJZWGxoSUZwbGJXeDVZU3dnVW5WemMybGhQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9iNDhlM2NiMTY4MjY0MzAwOTEzNmM5ZGIxMzhkMDRjMC5zZXRDb250ZW50KGlfZnJhbWVfZmU4M2NhODg5YmIzNDI4NWJmOTk5YTMzN2YyZmY2ZjcpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfY2Q2MGU2MmQwMWVhNGEwN2E5YzdhNmQwOGM4ZTJmMDcuYmluZFBvcHVwKHBvcHVwX2I0OGUzY2IxNjgyNjQzMDA5MTM2YzlkYjEzOGQwNGMwKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzdkODEzYzRmNjc1MjQzMWViZDViNDhiYmJiMGFkZGUyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNzMuMzQ4LCA1NC40OTVdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2YyYzc5ZDZiN2Y2NTQ2MzBhNTNmOTA4ZWFhOTUzNjQ2ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV85NmNmNTFlMDViYjM0ZGU5ODY3OWZiN2NjMTZjYjJmNCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnekxUQTVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStUbTkyWVhsaElGcGxiV3g1WVN3Z1VuVnpjMmxoUEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZjJjNzlkNmI3ZjY1NDYzMGE1M2Y5MDhlYWE5NTM2NDYuc2V0Q29udGVudChpX2ZyYW1lXzk2Y2Y1MWUwNWJiMzRkZTk4Njc5ZmI3Y2MxNmNiMmY0KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzdkODEzYzRmNjc1MjQzMWViZDViNDhiYmJiMGFkZGUyLmJpbmRQb3B1cChwb3B1cF9mMmM3OWQ2YjdmNjU0NjMwYTUzZjkwOGVhYTk1MzY0NikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl83Y2U4OGY5YTk1OTU0YThjOWM4M2ZiOGY0Y2M0MzAxNyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjkwOCwgNzguODA3XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF81OGRhNTI5ODg0MTA0ODNiYjhkZjUyZDE1NDIxMGEwNCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfOTFhODVjMjI1ZWZhNDBiNWI1ZDk5ZGI2ODAyN2UyMWMgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDRQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZzBMVEF5UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krWldGemRHVnliaUJMWVhwaGEyaHpkR0Z1UEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNThkYTUyOTg4NDEwNDgzYmI4ZGY1MmQxNTQyMTBhMDQuc2V0Q29udGVudChpX2ZyYW1lXzkxYTg1YzIyNWVmYTQwYjViNWQ5OWRiNjgwMjdlMjFjKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzdjZTg4ZjlhOTU5NTRhOGM5YzgzZmI4ZjRjYzQzMDE3LmJpbmRQb3B1cChwb3B1cF81OGRhNTI5ODg0MTA0ODNiYjhkZjUyZDE1NDIxMGEwNCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9mY2NmOWE3OGM4ZDI0ZWJlYTVkYWY4Yzg4MGM5OGJmMiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljk5MywgNzkuMDcyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8zMTQ0MTQ0M2IxYWI0ODRlODUzNjk4MTYxOTViMGI4NCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfZjY3YWI0MTllYzE4NGUzNDgwNmQwOGZkMjZkNjQzYTggPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDRQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZzBMVEV5UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krWldGemRHVnliaUJMWVhwaGEyaHpkR0Z1UEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMzE0NDE0NDNiMWFiNDg0ZTg1MzY5ODE2MTk1YjBiODQuc2V0Q29udGVudChpX2ZyYW1lX2Y2N2FiNDE5ZWMxODRlMzQ4MDZkMDhmZDI2ZDY0M2E4KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2ZjY2Y5YTc4YzhkMjRlYmVhNWRhZjhjODgwYzk4YmYyLmJpbmRQb3B1cChwb3B1cF8zMTQ0MTQ0M2IxYWI0ODRlODUzNjk4MTYxOTViMGI4NCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9mY2EwZTI2Y2VkMDQ0NTRhOWMzOTBjNWEwZmM0ZThiYiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0yMS44NjY5OTk5OTk5OTk5OTcsIC0xMzguOTI5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF82YmQ5MjhjN2MwMzQ0OTlhOWVhMDNmMTk0OWJjZWZjMyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfYTQyYjYzOTA1ZjI3NGQzZWFkM2Y4MDhiYTYzMzNiOTAgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDRQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZzFMVEV4UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krVkhWaGJXOTBkU0JCY21Ob2FYQmxiR0ZuYnl3Z1JuSmxibU5vSUZCdmJIbHVaWE5wWVNCeVpXZHBiMjQ4TDJadmJuUStQQzlvTXo0S0lDQWdJQT09IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNmJkOTI4YzdjMDM0NDk5YTllYTAzZjE5NDliY2VmYzMuc2V0Q29udGVudChpX2ZyYW1lX2E0MmI2MzkwNWYyNzRkM2VhZDNmODA4YmE2MzMzYjkwKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2ZjYTBlMjZjZWQwNDQ1NGE5YzM5MGM1YTBmYzRlOGJiLmJpbmRQb3B1cChwb3B1cF82YmQ5MjhjN2MwMzQ0OTlhOWVhMDNmMTk0OWJjZWZjMykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl85MzUwMTEzMTMxMmE0NmMzOTc4MGYxMGM2NGQwNDJlZSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljc5OSwgNzguMTFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzRhYjFkOTI1NzU4ZTQxNGM5MTU1YjgxOWI0ZjhiYjFlID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9jNDhkZDdlNjkxZjk0MTgxODIxNGFlMTY2Y2RmZDRkYyA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnM0xUQTNQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStaV0Z6ZEdWeWJpQkxZWHBoYTJoemRHRnVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF80YWIxZDkyNTc1OGU0MTRjOTE1NWI4MTliNGY4YmIxZS5zZXRDb250ZW50KGlfZnJhbWVfYzQ4ZGQ3ZTY5MWY5NDE4MTgyMTRhZTE2NmNkZmQ0ZGMpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfOTM1MDExMzEzMTJhNDZjMzk3ODBmMTBjNjRkMDQyZWUuYmluZFBvcHVwKHBvcHVwXzRhYjFkOTI1NzU4ZTQxNGM5MTU1YjgxOWI0ZjhiYjFlKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzcyZGNiOTQyNDAxYzRjNGViYzAxMzZlNmRlYjAxZWEwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNzMuMzM5LCA1NC42MjYwMDAwMDAwMDAwMDVdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2FjMTBmNDY0NDFkODQwZjA4OGY3YjYyYzhmY2M1MjNmID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9lOTk2MDU5NjcxMjg0MGU0YjMxMmY4MGYyMjhhZTNkNSA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnM0xUQTRQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStUbTkyWVhsaElGcGxiV3g1WVN3Z1VuVnpjMmxoUEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYWMxMGY0NjQ0MWQ4NDBmMDg4ZjdiNjJjOGZjYzUyM2Yuc2V0Q29udGVudChpX2ZyYW1lX2U5OTYwNTk2NzEyODQwZTRiMzEyZjgwZjIyOGFlM2Q1KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzcyZGNiOTQyNDAxYzRjNGViYzAxMzZlNmRlYjAxZWEwLmJpbmRQb3B1cChwb3B1cF9hYzEwZjQ2NDQxZDg0MGYwODhmN2I2MmM4ZmNjNTIzZikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl82NWYyMGJhOGVjMDc0MmVkOWMzYWVlZWNkYjg1Yzk4ZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQxLjUyNywgODguNzFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzgzYTY2ZThiNzQzMjRmYTNhZTc0YzE3YzcxZmJmNDI0ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9lNDk2NjcwYTc1Zjc0NDMzOTg1MWU5NTA1OTBjNjljMCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0NFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RrMExUQTJQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStjMjkxZEdobGNtNGdXR2x1YW1saGJtY3NJRU5vYVc1aFBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzgzYTY2ZThiNzQzMjRmYTNhZTc0YzE3YzcxZmJmNDI0LnNldENvbnRlbnQoaV9mcmFtZV9lNDk2NjcwYTc1Zjc0NDMzOTg1MWU5NTA1OTBjNjljMCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl82NWYyMGJhOGVjMDc0MmVkOWMzYWVlZWNkYjg1Yzk4ZC5iaW5kUG9wdXAocG9wdXBfODNhNjZlOGI3NDMyNGZhM2FlNzRjMTdjNzFmYmY0MjQpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfOGIyYTc5YTUzZGMxNGRlZWE0NzIzMDY5Njk3OWZkMmQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS44MiwgNzguMDc4XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF83NmJlMmEzYzVmYzg0N2E2YWY0Yjc1YWM4NjUyOTExMyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfZDg2YzllNWU5OWJkNDFlZGI1YzNhNmE3ZDYzMjQ2YjIgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDNQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UYzFMVEF5UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krWldGemRHVnliaUJMWVhwaGEyaHpkR0Z1UEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNzZiZTJhM2M1ZmM4NDdhNmFmNGI3NWFjODY1MjkxMTMuc2V0Q29udGVudChpX2ZyYW1lX2Q4NmM5ZTVlOTliZDQxZWRiNWMzYTZhN2Q2MzI0NmIyKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzhiMmE3OWE1M2RjMTRkZWVhNDcyMzA2OTY5NzlmZDJkLmJpbmRQb3B1cChwb3B1cF83NmJlMmEzYzVmYzg0N2E2YWY0Yjc1YWM4NjUyOTExMykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8xNWVmN2MyMzYxOWY0ZWU2ODMxMmFkNWY3ODk5MTJkMCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzczLjM3NiwgNTQuNTgxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9kNzk3YTcwNzQzYmQ0MTg0YTJhZDMwZTk3ZjZlN2U0NCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfOGRjMzdiNjM5ZGU0NDI3NDk3MWNmOTljNDBkZDM5NTUgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDNQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UYzNMVEE1UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krVG05MllYbGhJRnBsYld4NVlTd2dVblZ6YzJsaFBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2Q3OTdhNzA3NDNiZDQxODRhMmFkMzBlOTdmNmU3ZTQ0LnNldENvbnRlbnQoaV9mcmFtZV84ZGMzN2I2MzlkZTQ0Mjc0OTcxY2Y5OWM0MGRkMzk1NSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8xNWVmN2MyMzYxOWY0ZWU2ODMxMmFkNWY3ODk5MTJkMC5iaW5kUG9wdXAocG9wdXBfZDc5N2E3MDc0M2JkNDE4NGEyYWQzMGU5N2Y2ZTdlNDQpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNmI0ODc2NjllZDJkNDY0OWIyYTU3YWYyY2NhMDIzOTUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS43NDQsIDc4LjE2OF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZmI5ZTAwN2VkYjQ2NDBhNWFkYjg1NTA5OTU3NDFjNDAgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzVlZWFkNmI3MDU3ZDRkYWM4NDAzZGU0NmEwNzQyZWFhID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQzUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGM0TFRBM1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1pXRnpkR1Z5YmlCTFlYcGhhMmh6ZEdGdVBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2ZiOWUwMDdlZGI0NjQwYTVhZGI4NTUwOTk1NzQxYzQwLnNldENvbnRlbnQoaV9mcmFtZV81ZWVhZDZiNzA1N2Q0ZGFjODQwM2RlNDZhMDc0MmVhYSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl82YjQ4NzY2OWVkMmQ0NjQ5YjJhNTdhZjJjY2EwMjM5NS5iaW5kUG9wdXAocG9wdXBfZmI5ZTAwN2VkYjQ2NDBhNWFkYjg1NTA5OTU3NDFjNDApCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYjhlYjQ2NDczNTdhNDk3OWJhYzNlMjY1NjFkMzAxZjUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs3My4zNjksIDU0LjcwOF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNWE1OWMzYjhhMzQ0NGU2ZDhlZDcyODc4MGYyMmI4NDEgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2QwNmM1NjkzNTFiMTRiNzFhMDYzNDI3YmFhOGEyYjExID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQzUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGM1TFRBNVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1RtOTJZWGxoSUZwbGJXeDVZU3dnVW5WemMybGhQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF81YTU5YzNiOGEzNDQ0ZTZkOGVkNzI4NzgwZjIyYjg0MS5zZXRDb250ZW50KGlfZnJhbWVfZDA2YzU2OTM1MWIxNGI3MWEwNjM0MjdiYWE4YTJiMTEpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfYjhlYjQ2NDczNTdhNDk3OWJhYzNlMjY1NjFkMzAxZjUuYmluZFBvcHVwKHBvcHVwXzVhNTljM2I4YTM0NDRlNmQ4ZWQ3Mjg3ODBmMjJiODQxKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2Y2NTdlYTlkNjQ3NDQ4YWM5MWE0NjAwYjIyNGNmY2Y1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTIxLjg3OCwgLTEzOS4wMl0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNWRhZGZjYzhmMWYyNDVkMWFjOTNlZDM1M2FlYzc0MTIgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2I5YmUzNGRjZTMwNTRlNzJiNDIxN2NlMGExNjNmNDU1ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQzUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGd3TFRBelBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1ZIVmhiVzkwZFNCQmNtTm9hWEJsYkdGbmJ5d2dSbkpsYm1Ob0lGQnZiSGx1WlhOcFlTQnlaV2RwYjI0OEwyWnZiblErUEM5b016NEtJQ0FnSUE9PSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzVkYWRmY2M4ZjFmMjQ1ZDFhYzkzZWQzNTNhZWM3NDEyLnNldENvbnRlbnQoaV9mcmFtZV9iOWJlMzRkY2UzMDU0ZTcyYjQyMTdjZTBhMTYzZjQ1NSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9mNjU3ZWE5ZDY0NzQ0OGFjOTFhNDYwMGIyMjRjZmNmNS5iaW5kUG9wdXAocG9wdXBfNWRhZGZjYzhmMWYyNDVkMWFjOTNlZDM1M2FlYzc0MTIpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMGYxMWY1ZGZjY2JiNGNlNjkyZmYxNDJkZDM2ZjkxYTQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS45MiwgNzguODQ4OTk5OTk5OTk5OTldLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2U0NWY5YmJkMWM0NzQ5YWZiZmY3MDVkMzYzNjFkNDZkID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9hOWRhZjM4ODQwNGI0OWEzYjY2YzE4M2M3NDRhMDZkYiA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0M1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1Rnd0xUQTJQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStaV0Z6ZEdWeWJpQkxZWHBoYTJoemRHRnVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9lNDVmOWJiZDFjNDc0OWFmYmZmNzA1ZDM2MzYxZDQ2ZC5zZXRDb250ZW50KGlfZnJhbWVfYTlkYWYzODg0MDRiNDlhM2I2NmMxODNjNzQ0YTA2ZGIpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMGYxMWY1ZGZjY2JiNGNlNjkyZmYxNDJkZDM2ZjkxYTQuYmluZFBvcHVwKHBvcHVwX2U0NWY5YmJkMWM0NzQ5YWZiZmY3MDVkMzYzNjFkNDZkKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2EyNWQxZjAyNDZjNzQ2YjliMWM3Y2FmMTI1ZGNiYWI4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTAuMDY2LCA3OS4wNDNdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzUzYWZjOTQwNjQ0ZTQzYjRiY2ZmZTg0YzkwNGVjNGNmID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV83NDkyZDVlZTJkNDg0NmZiYTBiMTZkMWRjMTRmMzhkMCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0M1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RneUxURXlQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStaV0Z6ZEdWeWJpQkxZWHBoYTJoemRHRnVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF81M2FmYzk0MDY0NGU0M2I0YmNmZmU4NGM5MDRlYzRjZi5zZXRDb250ZW50KGlfZnJhbWVfNzQ5MmQ1ZWUyZDQ4NDZmYmEwYjE2ZDFkYzE0ZjM4ZDApOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfYTI1ZDFmMDI0NmM3NDZiOWIxYzdjYWYxMjVkY2JhYjguYmluZFBvcHVwKHBvcHVwXzUzYWZjOTQwNjQ0ZTQzYjRiY2ZmZTg0YzkwNGVjNGNmKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzljZjdjYTI3ODM0NTRjZGNiMmM0MmJkM2NiN2FlMTRhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTAuMDYxMDAwMDAwMDAwMDEsIDc5LjAwM10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNzQ0MzU2ODk1NTI1NGU3ZjhjNDU2NDBlZDBiODZlYjMgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzg3YWZlNmIyY2JjODQ0YmM5ZDQ0ZWUzMTg1NDAxYWQyID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQzUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGcwTFRBelBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1pXRnpkR1Z5YmlCTFlYcGhhMmh6ZEdGdVBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzc0NDM1Njg5NTUyNTRlN2Y4YzQ1NjQwZWQwYjg2ZWIzLnNldENvbnRlbnQoaV9mcmFtZV84N2FmZTZiMmNiYzg0NGJjOWQ0NGVlMzE4NTQwMWFkMik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl85Y2Y3Y2EyNzgzNDU0Y2RjYjJjNDJiZDNjYjdhZTE0YS5iaW5kUG9wdXAocG9wdXBfNzQ0MzU2ODk1NTI1NGU3ZjhjNDU2NDBlZDBiODZlYjMpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZmEwOTM1ZjhmMDY0NGFjZWFhMjM1ZTlhNTQwODU2ZTkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS43NCwgNzguMTYzXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9lMTc1YTE1Y2VhM2E0Yzc2OThhZjdkMjg1NWM1ODRhYyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfODI2ODZmYmJlNzExNDUyZjk1YTc2N2E3Y2VmNDQ0ZDAgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDNQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZzBMVEEwUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krWldGemRHVnliaUJMWVhwaGEyaHpkR0Z1UEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZTE3NWExNWNlYTNhNGM3Njk4YWY3ZDI4NTVjNTg0YWMuc2V0Q29udGVudChpX2ZyYW1lXzgyNjg2ZmJiZTcxMTQ1MmY5NWE3NjdhN2NlZjQ0NGQwKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2ZhMDkzNWY4ZjA2NDRhY2VhYTIzNWU5YTU0MDg1NmU5LmJpbmRQb3B1cChwb3B1cF9lMTc1YTE1Y2VhM2E0Yzc2OThhZjdkMjg1NWM1ODRhYykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9mYjU3ODllNDc0ZDg0ZmM5OGRjM2YzNDBkNjExZTUzNyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0yMS44NTE5OTk5OTk5OTk5OTcsIC0xMzguOTYxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9kYWU3NGI1YWVkZTI0NjE3YWI2YjFkZGZiOGExZDEwNyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfOGNiODMxNzU0MTQzNDM4Yzk3NDJhOGJhMzMwYzc4MzkgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDNQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZzBMVEExUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krVkhWaGJXOTBkU0JCY21Ob2FYQmxiR0ZuYnl3Z1JuSmxibU5vSUZCdmJIbHVaWE5wWVNCeVpXZHBiMjQ4TDJadmJuUStQQzlvTXo0S0lDQWdJQT09IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZGFlNzRiNWFlZGUyNDYxN2FiNmIxZGRmYjhhMWQxMDcuc2V0Q29udGVudChpX2ZyYW1lXzhjYjgzMTc1NDE0MzQzOGM5NzQyYThiYTMzMGM3ODM5KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2ZiNTc4OWU0NzRkODRmYzk4ZGMzZjM0MGQ2MTFlNTM3LmJpbmRQb3B1cChwb3B1cF9kYWU3NGI1YWVkZTI0NjE3YWI2YjFkZGZiOGExZDEwNykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8zMWRmODg3YjIyZDY0ZGQ0YTc3NjAzZGQ0NzNjZjM3ZSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0yMS44ODMwMDAwMDAwMDAwMDMsIC0xMzguOTk0XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9iMDNhOTIxNzk1OGI0NDEwYWIxY2ZmZDg2NjU3Zjk0MiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfOTFjY2E4ZTE1MDdkNDk0NWI0ZDQ2Y2MyYzk1NDc0YWYgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDNQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZzBMVEV4UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krVkhWaGJXOTBkU0JCY21Ob2FYQmxiR0ZuYnl3Z1JuSmxibU5vSUZCdmJIbHVaWE5wWVNCeVpXZHBiMjQ4TDJadmJuUStQQzlvTXo0S0lDQWdJQT09IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYjAzYTkyMTc5NThiNDQxMGFiMWNmZmQ4NjY1N2Y5NDIuc2V0Q29udGVudChpX2ZyYW1lXzkxY2NhOGUxNTA3ZDQ5NDViNGQ0NmNjMmM5NTQ3NGFmKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzMxZGY4ODdiMjJkNjRkZDRhNzc2MDNkZDQ3M2NmMzdlLmJpbmRQb3B1cChwb3B1cF9iMDNhOTIxNzk1OGI0NDEwYWIxY2ZmZDg2NjU3Zjk0MikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8yYmU2OGIyMGNlNGU0NDY0YjJjZDQ0MzIyMzQ0Y2RmNSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0yMS44MjMsIC0xMzkuMDQ4XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF82OWFlNWY1MWI4YTU0NzA2ODRhOTVjYmU2NzJhYTVhOCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfMjNkMGM0ZTAyNjZhNDhjNTg5ZmY0ZmI4YzcxOTZiYTAgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDNQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZzFMVEExUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krVkhWaGJXOTBkU0JCY21Ob2FYQmxiR0ZuYnl3Z1JuSmxibU5vSUZCdmJIbHVaWE5wWVNCeVpXZHBiMjQ4TDJadmJuUStQQzlvTXo0S0lDQWdJQT09IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNjlhZTVmNTFiOGE1NDcwNjg0YTk1Y2JlNjcyYWE1YTguc2V0Q29udGVudChpX2ZyYW1lXzIzZDBjNGUwMjY2YTQ4YzU4OWZmNGZiOGM3MTk2YmEwKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzJiZTY4YjIwY2U0ZTQ0NjRiMmNkNDQzMjIzNDRjZGY1LmJpbmRQb3B1cChwb3B1cF82OWFlNWY1MWI4YTU0NzA2ODRhOTVjYmU2NzJhYTVhOCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl80OWY3OTgzZTVkYjA0NzlkYjBlMzNhZjJjNmY5NTU0YyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0yMS44OTgwMDAwMDAwMDAwMDMsIC0xMzkuMDI2XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8yY2JkYjAwOWNiMWI0YTZjOThhMzFjZDE5YjZjNDA1NiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfNGUzM2QwZDUzZjZjNDBhYzkzODdlOTg1OTEzYTYwMDUgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDNQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZzJMVEExUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krVkhWaGJXOTBkU0JCY21Ob2FYQmxiR0ZuYnl3Z1JuSmxibU5vSUZCdmJIbHVaWE5wWVNCeVpXZHBiMjQ4TDJadmJuUStQQzlvTXo0S0lDQWdJQT09IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMmNiZGIwMDljYjFiNGE2Yzk4YTMxY2QxOWI2YzQwNTYuc2V0Q29udGVudChpX2ZyYW1lXzRlMzNkMGQ1M2Y2YzQwYWM5Mzg3ZTk4NTkxM2E2MDA1KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzQ5Zjc5ODNlNWRiMDQ3OWRiMGUzM2FmMmM2Zjk1NTRjLmJpbmRQb3B1cChwb3B1cF8yY2JkYjAwOWNiMWI0YTZjOThhMzFjZDE5YjZjNDA1NikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl80ZGYzYmJkMzU4NTQ0YmQ5YTVkZDM3YjU5ZGZiODdmMCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0yMS44MTE5OTk5OTk5OTk5OTgsIC0xMzguOTU5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF81ZWEwZmY4ODM4ZGY0MmU1OTZhMDE1OTFmOWFmOGFhYiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfZjY4M2Y5ODkwYzkyNGFiN2FiZmFiODZlYjVkZWQ4NjAgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDNQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZzNMVEV4UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krVkhWaGJXOTBkU0JCY21Ob2FYQmxiR0ZuYnl3Z1JuSmxibU5vSUZCdmJIbHVaWE5wWVNCeVpXZHBiMjQ4TDJadmJuUStQQzlvTXo0S0lDQWdJQT09IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNWVhMGZmODgzOGRmNDJlNTk2YTAxNTkxZjlhZjhhYWIuc2V0Q29udGVudChpX2ZyYW1lX2Y2ODNmOTg5MGM5MjRhYjdhYmZhYjg2ZWI1ZGVkODYwKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzRkZjNiYmQzNTg1NDRiZDlhNWRkMzdiNTlkZmI4N2YwLmJpbmRQb3B1cChwb3B1cF81ZWEwZmY4ODM4ZGY0MmU1OTZhMDE1OTFmOWFmOGFhYikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8xMTFiMWY3ZTE0NTQ0NDgxYjViYjVhM2NhMjhjNzA3NSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzczLjM2MSwgNTQuNzA3XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF82ZGQxOTFjZjA5NWE0NGY0OWFjZWRlODdiNzM1NzA1YiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfZjlmNjg1ZDRkMDJkNGRiYWFhZWI1M2RhZDJlYTUyYzUgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDNQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9Ua3dMVEV3UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krVG05MllYbGhJRnBsYld4NVlTd2dVblZ6YzJsaFBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzZkZDE5MWNmMDk1YTQ0ZjQ5YWNlZGU4N2I3MzU3MDViLnNldENvbnRlbnQoaV9mcmFtZV9mOWY2ODVkNGQwMmQ0ZGJhYWFlYjUzZGFkMmVhNTJjNSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8xMTFiMWY3ZTE0NTQ0NDgxYjViYjVhM2NhMjhjNzA3NS5iaW5kUG9wdXAocG9wdXBfNmRkMTkxY2YwOTVhNDRmNDlhY2VkZTg3YjczNTcwNWIpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfOTM4YWJiZWE4ZDgzNGQzNzhlYTVlNDc3OWMwOGNkZjUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy4yOTAxNjY3LCAtMTE2LjQxMTVdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzBkYjczZGU3YTcwZTQ4ZmJiNGRhMjVmYjVjYTM1ZjNkID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV8yYjBlN2U4ZjA2N2Q0YThkOGE1ODlmM2YyNDQwMGE4MCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0Mk56d3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZ0lDQWdJRHhvTXo0Z1JHRjBaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTVRrM05TMHhNRHd2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdURzlqWVhScGIyNDZJRHhtYjI1MElHTnZiRzl5UFNKeVpXUWlQalV5YTIwZ1RrVWdiMllnUW1WaGRIUjVMQ0JPVmp3dlptOXVkRDQ4TDJnelBnb2dJQ0FnIiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMGRiNzNkZTdhNzBlNDhmYmI0ZGEyNWZiNWNhMzVmM2Quc2V0Q29udGVudChpX2ZyYW1lXzJiMGU3ZThmMDY3ZDRhOGQ4YTU4OWYzZjI0NDAwYTgwKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzkzOGFiYmVhOGQ4MzRkMzc4ZWE1ZTQ3NzljMDhjZGY1LmJpbmRQb3B1cChwb3B1cF8wZGI3M2RlN2E3MGU0OGZiYjRkYTI1ZmI1Y2EzNWYzZCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl85M2U0NDNiYTMxMWE0MmI5OGNhMjY3Y2Y3ZjE0YjRiOCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjI0NSwgLTExNi4zNDZdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2QxMjVhZDJjMDUzZDRhNzk4NDg5NTk2NjdkMzliZDg4ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV85OTExOGY4YmUzZDg0MjNkYjlhMWU4ZTgwMDMxZTY5ZCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0Mk5Ed3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZ0lDQWdJRHhvTXo0Z1JHRjBaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTVRrM015MHdOand2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdURzlqWVhScGIyNDZJRHhtYjI1MElHTnZiRzl5UFNKeVpXUWlQalV5YTIwZ1RrVWdiMllnUW1WaGRIUjVMQ0JPVmp3dlptOXVkRDQ4TDJnelBnb2dJQ0FnIiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZDEyNWFkMmMwNTNkNGE3OTg0ODk1OTY2N2QzOWJkODguc2V0Q29udGVudChpX2ZyYW1lXzk5MTE4ZjhiZTNkODQyM2RiOWExZThlODAwMzFlNjlkKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzkzZTQ0M2JhMzExYTQyYjk4Y2EyNjdjZjdmMTRiNGI4LmJpbmRQb3B1cChwb3B1cF9kMTI1YWQyYzA1M2Q0YTc5ODQ4OTU5NjY3ZDM5YmQ4OCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8wNjNmZmU4MjZhZWY0NmViYmVkMWUwMWVhNTQxZjU2NCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjgzNSwgNzguMjMyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9kODBiYTZhNWY2ZGU0ZDM0YjQ1ODA5NjcxNWJlMjg3NiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfZWY5MWJjYWNlOWI2NGE0ZmE4YTg2YTgzMWQ0NDc4YzggPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDJQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UY3pMVEF5UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krWldGemRHVnliaUJMWVhwaGEyaHpkR0Z1UEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZDgwYmE2YTVmNmRlNGQzNGI0NTgwOTY3MTViZTI4NzYuc2V0Q29udGVudChpX2ZyYW1lX2VmOTFiY2FjZTliNjRhNGZhOGE4NmE4MzFkNDQ3OGM4KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzA2M2ZmZTgyNmFlZjQ2ZWJiZWQxZTAxZWE1NDFmNTY0LmJpbmRQb3B1cChwb3B1cF9kODBiYTZhNWY2ZGU0ZDM0YjQ1ODA5NjcxNWJlMjg3NikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl85Y2Y4YzRiOTRhMjU0ZDQ4YmM1MjkyMTY3MTkzNDJiNSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5Ljk2LCA3OS4wNDZdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2EwMmM0NTU5NmRiZTRjNzU5MjY4Y2JkZGUyZDMyYjJlID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV82YjY5Njg5OTI2NDE0YTcwOTcxNjkyMWVhOWYyZGJhOSA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0MlBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RjMExURXlQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStaV0Z6ZEdWeWJpQkxZWHBoYTJoemRHRnVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9hMDJjNDU1OTZkYmU0Yzc1OTI2OGNiZGRlMmQzMmIyZS5zZXRDb250ZW50KGlfZnJhbWVfNmI2OTY4OTkyNjQxNGE3MDk3MTY5MjFlYTlmMmRiYTkpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfOWNmOGM0Yjk0YTI1NGQ0OGJjNTI5MjE2NzE5MzQyYjUuYmluZFBvcHVwKHBvcHVwX2EwMmM0NTU5NmRiZTRjNzU5MjY4Y2JkZGUyZDMyYjJlKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzRmNjIwOTJlNGJkZDRhMTc4OGQ3OGQ2NDIwNTI1ODAwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTksIDc4Ljk4NF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNDQ0ZGNkNGU0OTQ2NGNlYzhlMDIwMTkwZjM0ZjQwMjUgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzU3NTFjNzQxNDMwZTQ5N2JiNGFlNTBiNjcxNmU3NzIyID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQyUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGMxTFRBMFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1pXRnpkR1Z5YmlCTFlYcGhhMmh6ZEdGdVBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzQ0NGRjZDRlNDk0NjRjZWM4ZTAyMDE5MGYzNGY0MDI1LnNldENvbnRlbnQoaV9mcmFtZV81NzUxYzc0MTQzMGU0OTdiYjRhZTUwYjY3MTZlNzcyMik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl80ZjYyMDkyZTRiZGQ0YTE3ODhkNzhkNjQyMDUyNTgwMC5iaW5kUG9wdXAocG9wdXBfNDQ0ZGNkNGU0OTQ2NGNlYzhlMDIwMTkwZjM0ZjQwMjUpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfM2EwZjU1NjNiOGU5NGM5MzkyYmM5ZmM5MjViOWZlNGQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS45NDM5OTk5OTk5OTk5OTYsIDc4Ljg0Nl0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNjMzMmFiZDE3Y2EzNDgzYTlmMjdmNGI0M2Q4M2Y5MjUgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzIzOGEwZmZmYzA1ZTRkYzM4NjIyMTMyNjNkNTQ1NDcwID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQyUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGMzTFRBMVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1pXRnpkR1Z5YmlCTFlYcGhhMmh6ZEdGdVBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzYzMzJhYmQxN2NhMzQ4M2E5ZjI3ZjRiNDNkODNmOTI1LnNldENvbnRlbnQoaV9mcmFtZV8yMzhhMGZmZmMwNWU0ZGMzODYyMjEzMjYzZDU0NTQ3MCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8zYTBmNTU2M2I4ZTk0YzkzOTJiYzlmYzkyNWI5ZmU0ZC5iaW5kUG9wdXAocG9wdXBfNjMzMmFiZDE3Y2EzNDgzYTlmMjdmNGI0M2Q4M2Y5MjUpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMmRlNTNjNmVmZTc5NDZjMTgyZDhkMGUyMGEzNGFkZWQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MC4wNTksIDc4LjkwN10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNjUxOTZhYTI5MzQ1NDUxMDkyODJmMWMyYzkxYmU4ZjQgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzU1NGFkYjFmMGZlMjQ1Y2RhZDU1NjYwZmY5YjgwMmQ3ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQyUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGMzTFRFd1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1pXRnpkR1Z5YmlCTFlYcGhhMmh6ZEdGdVBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzY1MTk2YWEyOTM0NTQ1MTA5MjgyZjFjMmM5MWJlOGY0LnNldENvbnRlbnQoaV9mcmFtZV81NTRhZGIxZjBmZTI0NWNkYWQ1NTY2MGZmOWI4MDJkNyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8yZGU1M2M2ZWZlNzk0NmMxODJkOGQwZTIwYTM0YWRlZC5iaW5kUG9wdXAocG9wdXBfNjUxOTZhYTI5MzQ1NDUxMDkyODJmMWMyYzkxYmU4ZjQpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNGFmYjIyNGM5YzJiNGIyYmI1YjZkMjNkOGUyZjJiY2UgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs2My43MDYsIDEyNS4zMjFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2IyMTcyNzMxZGY1MzQ0OWE4MTc5MGRjNzQ3ZTc2Zjk4ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV8yYjdiMTQwODRjYWE0OTM2OTU1MWE2OTIxZGEwOWY2ZSA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0MlBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RjNExUQTRQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStjMjkxZEdoM1pYTjBaWEp1SUZOaGEyaGhMQ0JTZFhOemFXRThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lBPT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9iMjE3MjczMWRmNTM0NDlhODE3OTBkYzc0N2U3NmY5OC5zZXRDb250ZW50KGlfZnJhbWVfMmI3YjE0MDg0Y2FhNDkzNjk1NTFhNjkyMWRhMDlmNmUpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNGFmYjIyNGM5YzJiNGIyYmI1YjZkMjNkOGUyZjJiY2UuYmluZFBvcHVwKHBvcHVwX2IyMTcyNzMxZGY1MzQ0OWE4MTc5MGRjNzQ3ZTc2Zjk4KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2QzZjZkMjAxMjU4MTRkZTA5MDhhOTA4ZGIxMjNkZmQ3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNzMuMzgsIDU0LjY2OV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYzVmYjEzZjkwMTI3NGJmZGE5MWZjNDA5YWQxZDM3ZWYgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzMxMGU1MjAyNjI5NTQ1MGViYWZhZjFkYWQ4N2FhOTAxID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQyUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGM0TFRBNVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1RtOTJZWGxoSUZwbGJXeDVZU3dnVW5WemMybGhQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9jNWZiMTNmOTAxMjc0YmZkYTkxZmM0MDlhZDFkMzdlZi5zZXRDb250ZW50KGlfZnJhbWVfMzEwZTUyMDI2Mjk1NDUwZWJhZmFmMWRhZDg3YWE5MDEpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZDNmNmQyMDEyNTgxNGRlMDkwOGE5MDhkYjEyM2RmZDcuYmluZFBvcHVwKHBvcHVwX2M1ZmIxM2Y5MDEyNzRiZmRhOTFmYzQwOWFkMWQzN2VmKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzM0ZjY1MTgwNGM1ZTQ1MDFhZTZjOTQ0NjUzYjkwMTBlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTAuMDQ2MDAwMDAwMDAwMDEsIDc4Ljk4M10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMTQ2YmRiNDU5MGEwNDQzYTk3ZDc0MmIzNWJhOWZlODIgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzE0MGUyMjMzNTMzYjQ5NDA5YzhhNTdmMDk5NjE4ZTVlID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQyUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGM0TFRFeFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1pXRnpkR1Z5YmlCTFlYcGhhMmh6ZEdGdVBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzE0NmJkYjQ1OTBhMDQ0M2E5N2Q3NDJiMzViYTlmZTgyLnNldENvbnRlbnQoaV9mcmFtZV8xNDBlMjIzMzUzM2I0OTQwOWM4YTU3ZjA5OTYxOGU1ZSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8zNGY2NTE4MDRjNWU0NTAxYWU2Yzk0NDY1M2I5MDEwZS5iaW5kUG9wdXAocG9wdXBfMTQ2YmRiNDU5MGEwNDQzYTk3ZDc0MmIzNWJhOWZlODIpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMTBkODBlODg1NzlmNDUzMGE2OWI4NmIwYzg0NDZhZDEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny44MTMsIDQ4LjA5N10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNDQxMTA0NDk3MTBjNDY2YjgwNTg5NzIzOWQ5NjA3NWUgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2ZmYTE1YjlkY2Q4ZjQxNGE4YjAyMTExYmYyZDdkNjg1ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQyUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGM1TFRBM1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1VuVnpjMmxoTFV0aGVtRnJhSE4wWVc0Z1ltOXlaR1Z5SUhKbFoybHZiand2Wm05dWRENDhMMmd6UGdvZ0lDQWciIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF80NDExMDQ0OTcxMGM0NjZiODA1ODk3MjM5ZDk2MDc1ZS5zZXRDb250ZW50KGlfZnJhbWVfZmZhMTViOWRjZDhmNDE0YThiMDIxMTFiZjJkN2Q2ODUpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMTBkODBlODg1NzlmNDUzMGE2OWI4NmIwYzg0NDZhZDEuYmluZFBvcHVwKHBvcHVwXzQ0MTEwNDQ5NzEwYzQ2NmI4MDU4OTcyMzlkOTYwNzVlKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzg4ZGM2YmZiNmVjNzRkYWU4YzU4ZDljNjE2NzkxMzVkID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuOTQzOTk5OTk5OTk5OTk2LCA3OS4wMzhdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzgzNjFiZjIwMGZlMDQ5YTc5YmNmZWMxNjU4MTMyZDI2ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9lYWVmNWQ3MDE4ZGE0OTA0OWQ4YzVkMTUyZjc5OWQ4OSA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0MlBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1Rnd0xUQTJQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStaV0Z6ZEdWeWJpQkxZWHBoYTJoemRHRnVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF84MzYxYmYyMDBmZTA0OWE3OWJjZmVjMTY1ODEzMmQyNi5zZXRDb250ZW50KGlfZnJhbWVfZWFlZjVkNzAxOGRhNDkwNDlkOGM1ZDE1MmY3OTlkODkpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfODhkYzZiZmI2ZWM3NGRhZThjNThkOWM2MTY3OTEzNWQuYmluZFBvcHVwKHBvcHVwXzgzNjFiZjIwMGZlMDQ5YTc5YmNmZWMxNjU4MTMyZDI2KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzNjZGUwYmQ1NmM5ZDRmZTdhZmQ0MWEzMDIwZjk0MmQ4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTIxLjkzODAwMDAwMDAwMDAwMiwgLTEzOC45NjFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2UxMTIyNThiNTdhMTQ4YTRiYzAwYzlmZWI2OGE1Y2JlID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV82OWVkNjc5YmI3NjI0OWEwYmU2YzU5OThkODY0YzZiOCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0MlBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1Rnd0xURXlQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStWSFZoYlc5MGRTQkJjbU5vYVhCbGJHRm5ieXdnUm5KbGJtTm9JRkJ2YkhsdVpYTnBZU0J5WldkcGIyNDhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lBPT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9lMTEyMjU4YjU3YTE0OGE0YmMwMGM5ZmViNjhhNWNiZS5zZXRDb250ZW50KGlfZnJhbWVfNjllZDY3OWJiNzYyNDlhMGJlNmM1OTk4ZDg2NGM2YjgpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfM2NkZTBiZDU2YzlkNGZlN2FmZDQxYTMwMjBmOTQyZDguYmluZFBvcHVwKHBvcHVwX2UxMTIyNThiNTdhMTQ4YTRiYzAwYzlmZWI2OGE1Y2JlKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2Y0ZWU5ZTVjOTljNTQyODk5Y2QyOTYxM2Y0YjEwYzJhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTAuMDA4LCA3OS4wMjNdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzY4NzI1NjI0N2RlZTQyYWNiZGU5Njk2MzY2NTcwZGZhID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV84OTUyM2Y4ZTI1MDg0MTE5OTc0Mjg0Njg1MTIyMmMxNCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0MlBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RneExUQXpQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStaV0Z6ZEdWeWJpQkxZWHBoYTJoemRHRnVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF82ODcyNTYyNDdkZWU0MmFjYmRlOTY5NjM2NjU3MGRmYS5zZXRDb250ZW50KGlfZnJhbWVfODk1MjNmOGUyNTA4NDExOTk3NDI4NDY4NTEyMjJjMTQpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZjRlZTllNWM5OWM1NDI4OTljZDI5NjEzZjRiMTBjMmEuYmluZFBvcHVwKHBvcHVwXzY4NzI1NjI0N2RlZTQyYWNiZGU5Njk2MzY2NTcwZGZhKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzlmZDViNmU5ZTc3ZjRiMWY5NDZkZjI1MmY1ZTA3OWMxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuODYsIDc4Ljg1N10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZDg4OWIxYzhmN2RjNDQwYjkwZDMzNzJjMGFiZTQ2NTQgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzRiNzcwMmQ3MjVlYTQxZWZhZDJhNTZjOWU0ZjQ5YzU2ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQyUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGd4TFRFeFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1pXRnpkR1Z5YmlCTFlYcGhhMmh6ZEdGdVBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2Q4ODliMWM4ZjdkYzQ0MGI5MGQzMzcyYzBhYmU0NjU0LnNldENvbnRlbnQoaV9mcmFtZV80Yjc3MDJkNzI1ZWE0MWVmYWQyYTU2YzllNGY0OWM1Nik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl85ZmQ1YjZlOWU3N2Y0YjFmOTQ2ZGYyNTJmNWUwNzljMS5iaW5kUG9wdXAocG9wdXBfZDg4OWIxYzhmN2RjNDQwYjkwZDMzNzJjMGFiZTQ2NTQpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNTg1OWExMGMxMDM0NDJhOGE0NjE4ZTI5ZGMxYjFiNTQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjEuODY0LCAtMTM4Ljk0Mjk5OTk5OTk5OTk4XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9iMmY5ZDJkYzU5NTg0NDExYmQ0ZTQ5MjZmZTgxN2NhZSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfMjhiN2RiOTRlNWI1NGY3ZmI2YmEwNTQ1NWU1ZTdmNmEgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDJQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZ3lMVEEzUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krVkhWaGJXOTBkU0JCY21Ob2FYQmxiR0ZuYnl3Z1JuSmxibU5vSUZCdmJIbHVaWE5wWVNCeVpXZHBiMjQ4TDJadmJuUStQQzlvTXo0S0lDQWdJQT09IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYjJmOWQyZGM1OTU4NDQxMWJkNGU0OTI2ZmU4MTdjYWUuc2V0Q29udGVudChpX2ZyYW1lXzI4YjdkYjk0ZTViNTRmN2ZiNmJhMDU0NTVlNWU3ZjZhKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzU4NTlhMTBjMTAzNDQyYThhNDYxOGUyOWRjMWIxYjU0LmJpbmRQb3B1cChwb3B1cF9iMmY5ZDJkYzU5NTg0NDExYmQ0ZTQ5MjZmZTgxN2NhZSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8zYWViZjA1YWIwNDk0ZjUyYWI4OGEzODBkNjY1YTMxNyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzczLjM5MiwgNTQuNTU5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF81ZDkwOGM5YTBlZGQ0MWUzODJkYmIwM2NlYTRlZjY1OSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfYmQ0ZDRkMjE2MTZjNGQ4MmFhOTAwZmE3NWY2ZWY0NjkgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDJQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZ3lMVEV3UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krVG05MllYbGhJRnBsYld4NVlTd2dVblZ6YzJsaFBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzVkOTA4YzlhMGVkZDQxZTM4MmRiYjAzY2VhNGVmNjU5LnNldENvbnRlbnQoaV9mcmFtZV9iZDRkNGQyMTYxNmM0ZDgyYWE5MDBmYTc1ZjZlZjQ2OSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8zYWViZjA1YWIwNDk0ZjUyYWI4OGEzODBkNjY1YTMxNy5iaW5kUG9wdXAocG9wdXBfNWQ5MDhjOWEwZWRkNDFlMzgyZGJiMDNjZWE0ZWY2NTkpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMWYxYWVmYzI1ZjBmNGU1MWIwZGNiZTMyMDIxODQ5ZDUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjEuODQ2OTk5OTk5OTk5OTk4LCAtMTM4LjkwNl0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNGNkMzcyOWM1YzAyNDU0ZGFjNTNmODY1NTIwYWQ3NjIgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzM3YzE4OWQwZjJmODRiMWJhMDQ0MDkyODE0ZjQzMGU2ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQyUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGd6TFRBMFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1ZIVmhiVzkwZFNCQmNtTm9hWEJsYkdGbmJ5d2dSbkpsYm1Ob0lGQnZiSGx1WlhOcFlTQnlaV2RwYjI0OEwyWnZiblErUEM5b016NEtJQ0FnSUE9PSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzRjZDM3MjljNWMwMjQ1NGRhYzUzZjg2NTUyMGFkNzYyLnNldENvbnRlbnQoaV9mcmFtZV8zN2MxODlkMGYyZjg0YjFiYTA0NDA5MjgxNGY0MzBlNik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8xZjFhZWZjMjVmMGY0ZTUxYjBkY2JlMzIwMjE4NDlkNS5iaW5kUG9wdXAocG9wdXBfNGNkMzcyOWM1YzAyNDU0ZGFjNTNmODY1NTIwYWQ3NjIpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMDg3NDRkNTE5ZWY0NDAwYzgwY2ZlNTBlMDMxNWY0ZGYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjEuODQ4MDAwMDAwMDAwMDAzLCAtMTM4LjkxMjk5OTk5OTk5OTk4XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9kYjllNTA0ZGI0ODM0NjcwOGMyYTczNDcwYzEyN2UzOCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfZDhmNTNhMjlkMjQ4NGJhOGFkODkxYzZjMTY3MGE3OTEgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDJQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZzBMVEV5UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krVkhWaGJXOTBkU0JCY21Ob2FYQmxiR0ZuYnl3Z1JuSmxibU5vSUZCdmJIbHVaWE5wWVNCeVpXZHBiMjQ4TDJadmJuUStQQzlvTXo0S0lDQWdJQT09IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZGI5ZTUwNGRiNDgzNDY3MDhjMmE3MzQ3MGMxMjdlMzguc2V0Q29udGVudChpX2ZyYW1lX2Q4ZjUzYTI5ZDI0ODRiYThhZDg5MWM2YzE2NzBhNzkxKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzA4NzQ0ZDUxOWVmNDQwMGM4MGNmZTUwZTAzMTVmNGRmLmJpbmRQb3B1cChwb3B1cF9kYjllNTA0ZGI0ODM0NjcwOGMyYTczNDcwYzEyN2UzOCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8wMzRhZTgxMmU1YmM0M2E3YWQ4NDBiNDM1ZGM0MzFmYiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjgzLCA3OC4xMjVdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzMzZThhYWEwNjVlMjQwMjRiOWI4NWY3MDBjN2U1YWE1ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9mYmIxZDE5YjM2NDI0YmIyODg3NGFjODgxZTkzNmViZCA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0MlBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnM0xUQTFQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStaV0Z6ZEdWeWJpQkxZWHBoYTJoemRHRnVQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF8zM2U4YWFhMDY1ZTI0MDI0YjliODVmNzAwYzdlNWFhNS5zZXRDb250ZW50KGlfZnJhbWVfZmJiMWQxOWIzNjQyNGJiMjg4NzRhYzg4MWU5MzZlYmQpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMDM0YWU4MTJlNWJjNDNhN2FkODQwYjQzNWRjNDMxZmIuYmluZFBvcHVwKHBvcHVwXzMzZThhYWEwNjVlMjQwMjRiOWI4NWY3MDBjN2U1YWE1KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2FhYzg3N2FmMGNhYzQ2ZTg5MmRmOWVkZDczN2M0Yzk1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTIxLjg5MywgLTEzOC45NjRdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2E3MzE3MDZjZjg2NzQwMzNiYzVmODFhMDk1ZTdjYjI4ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV82ZWYyODhmODQ0OWQ0Zjg4OTY5MzY4MzAxMTY2NjMzZiA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0MlBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnM0xUQTFQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStWSFZoYlc5MGRTQkJjbU5vYVhCbGJHRm5ieXdnUm5KbGJtTm9JRkJ2YkhsdVpYTnBZU0J5WldkcGIyNDhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lBPT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9hNzMxNzA2Y2Y4Njc0MDMzYmM1ZjgxYTA5NWU3Y2IyOC5zZXRDb250ZW50KGlfZnJhbWVfNmVmMjg4Zjg0NDlkNGY4ODk2OTM2ODMwMTE2NjYzM2YpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfYWFjODc3YWYwY2FjNDZlODkyZGY5ZWRkNzM3YzRjOTUuYmluZFBvcHVwKHBvcHVwX2E3MzE3MDZjZjg2NzQwMzNiYzVmODFhMDk1ZTdjYjI4KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzcwZjBkYmQwYTkwZDQ3NDhiZmM0OGMzMmU2NjhhYTVmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNzMuMzYzOTk5OTk5OTk5OTksIDU0LjQ0NV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNzc2MjAxMzc5YTMyNDBiMzkwZWU0YjI0YzQ5MTUzODggPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzAyMTNlNzA5NmMzMjRmZmZiNzg4ZjY4Y2MwNThhYzM5ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQyUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGc0TFRBMVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1RtOTJZWGxoSUZwbGJXeDVZU3dnVW5WemMybGhQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF83NzYyMDEzNzlhMzI0MGIzOTBlZTRiMjRjNDkxNTM4OC5zZXRDb250ZW50KGlfZnJhbWVfMDIxM2U3MDk2YzMyNGZmZmI3ODhmNjhjYzA1OGFjMzkpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNzBmMGRiZDBhOTBkNDc0OGJmYzQ4YzMyZTY2OGFhNWYuYmluZFBvcHVwKHBvcHVwXzc3NjIwMTM3OWEzMjQwYjM5MGVlNGIyNGM0OTE1Mzg4KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzQzYzM0MmMxMmFlOTQ5ODg4NGY3NmVmOWYzZGU0MjhjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTIxLjkwMzAwMDAwMDAwMDAwMiwgLTEzOS4wMDldLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2U4NjBlMDk1NmQ3ZjQwMmFiOTAxNWQ1MTE3ODc0NzBkID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV9mNTU0YWRhNTdmMDU0Y2E2ODkwODZjNDUxOTg0MmJjYSA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0MlBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnNExUQTFQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStWSFZoYlc5MGRTQkJjbU5vYVhCbGJHRm5ieXdnUm5KbGJtTm9JRkJ2YkhsdVpYTnBZU0J5WldkcGIyNDhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lBPT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9lODYwZTA5NTZkN2Y0MDJhYjkwMTVkNTExNzg3NDcwZC5zZXRDb250ZW50KGlfZnJhbWVfZjU1NGFkYTU3ZjA1NGNhNjg5MDg2YzQ1MTk4NDJiY2EpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNDNjMzQyYzEyYWU5NDk4ODg0Zjc2ZWY5ZjNkZTQyOGMuYmluZFBvcHVwKHBvcHVwX2U4NjBlMDk1NmQ3ZjQwMmFiOTAxNWQ1MTE3ODc0NzBkKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzliNjBjZDliNzhlYTRjNWViNmRjZTAyMzFkYThmODVjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTIxLjg1MywgLTEzOS4wMDZdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMDE3NjU1NzNlNzY4NGVmY2E3M2EyZDZjNDMzMmY1NTcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzE1MGY1ZTlkZWI4NzQ4OTM4YTAyYjUxOThhMWVmYzU4ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogODAwfSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaV9mcmFtZV80MGQwMjY4ODI0Mjc0MzcwYTE1MzQ3N2U4NDE4NDQwZSA9ICQoYDxpZnJhbWUgc3JjPSJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxDaUFnSUNBS0lDQWdJQ0FnSUNBOGFETStJRTFoWjI1cGRIVmtaVG9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krTlM0MlBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCRVlYUmxPaUE4Wm05dWRDQmpiMnh2Y2owaWNtVmtJajR4T1RnNUxUQTFQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQk1iMk5oZEdsdmJqb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStWSFZoYlc5MGRTQkJjbU5vYVhCbGJHRm5ieXdnUm5KbGJtTm9JRkJ2YkhsdVpYTnBZU0J5WldkcGIyNDhMMlp2Ym5RK1BDOW9NejRLSUNBZ0lBPT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF8xNTBmNWU5ZGViODc0ODkzOGEwMmI1MTk4YTFlZmM1OC5zZXRDb250ZW50KGlfZnJhbWVfNDBkMDI2ODgyNDI3NDM3MGExNTM0NzdlODQxODQ0MGUpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfOWI2MGNkOWI3OGVhNGM1ZWI2ZGNlMDIzMWRhOGY4NWMuYmluZFBvcHVwKHBvcHVwXzE1MGY1ZTlkZWI4NzQ4OTM4YTAyYjUxOThhMWVmYzU4KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzRiMmEwMmEwZGE5MjRhNmU5NGEzZGNjNWZkOWMwZGI4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuODg4MDAwMDAwMDAwMDA1LCA3OC44MDE5OTk5OTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNjQxOGY4YzU0ZGMyNDAwOWJiZTQzODhjMzI3N2MyOGUgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzJlOTQ5Nzg5MGZjZTRmNTBhNGU1YjFkNzg1ZWNjN2I2ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQyUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGc1TFRBM1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1pXRnpkR1Z5YmlCTFlYcGhhMmh6ZEdGdVBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzY0MThmOGM1NGRjMjQwMDliYmU0Mzg4YzMyNzdjMjhlLnNldENvbnRlbnQoaV9mcmFtZV8yZTk0OTc4OTBmY2U0ZjUwYTRlNWIxZDc4NWVjYzdiNik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl80YjJhMDJhMGRhOTI0YTZlOTRhM2RjYzVmZDljMGRiOC5iaW5kUG9wdXAocG9wdXBfNjQxOGY4YzU0ZGMyNDAwOWJiZTQzODhjMzI3N2MyOGUpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZWY4ZDFjYWQ2ZjNlNGIyZjg2Njg0YzkwNjVlMGVmZDcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjIuMjc2LCAtMTM4LjgzNl0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMjQ1MDliZjFhZTZhNDljMGI4ZDlhYmQ0Yzg1NjllYWMgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzY3ZmZkMjM0YTM3OTQ5NTJhNmIwNWJhZTkwNWE4NzJjID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQyUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGc1TFRFeFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1ZIVmhiVzkwZFNCQmNtTm9hWEJsYkdGbmJ5d2dSbkpsYm1Ob0lGQnZiSGx1WlhOcFlTQnlaV2RwYjI0OEwyWnZiblErUEM5b016NEtJQ0FnSUE9PSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzI0NTA5YmYxYWU2YTQ5YzBiOGQ5YWJkNGM4NTY5ZWFjLnNldENvbnRlbnQoaV9mcmFtZV82N2ZmZDIzNGEzNzk0OTUyYTZiMDViYWU5MDVhODcyYyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9lZjhkMWNhZDZmM2U0YjJmODY2ODRjOTA2NWUwZWZkNy5iaW5kUG9wdXAocG9wdXBfMjQ1MDliZjFhZTZhNDljMGI4ZDlhYmQ0Yzg1NjllYWMpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZjE3Yjk5ZmFhNmNhNGUzMWJiYjA2NjU5ZTA4MTdhNTcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy4zMDA1LCAtMTE2LjUzNDE2NjcwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9iZDIxMmIxZTM4NjI0M2MwYjBmMmYwZTExZDBhMmU4ZSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfMDhkNmUyOGIyZjM5NGNlOWIwNDg4YjZjNGM5OWRmZjggPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDFORHd2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK01UazNNQzB3TXp3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnVEc5allYUnBiMjQ2SUR4bWIyNTBJR052Ykc5eVBTSnlaV1FpUGpRNGEyMGdUazVGSUc5bUlFSmxZWFIwZVN3Z1RsWThMMlp2Ym5RK1BDOW9NejRLSUNBZ0lBPT0iIHdpZHRoPSIyNjAiIHN0eWxlPSJib3JkZXI6bm9uZSAhaW1wb3J0YW50OyIgaGVpZ2h0PSIxNTUiPjwvaWZyYW1lPmApWzBdOwogICAgICAgICAgICBwb3B1cF9iZDIxMmIxZTM4NjI0M2MwYjBmMmYwZTExZDBhMmU4ZS5zZXRDb250ZW50KGlfZnJhbWVfMDhkNmUyOGIyZjM5NGNlOWIwNDg4YjZjNGM5OWRmZjgpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZjE3Yjk5ZmFhNmNhNGUzMWJiYjA2NjU5ZTA4MTdhNTcuYmluZFBvcHVwKHBvcHVwX2JkMjEyYjFlMzg2MjQzYzBiMGYyZjBlMTFkMGEyZThlKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzU5ZmU2NmM1OGYwOTQxNTE5M2FkZWEwZjUyZDU4YWRiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuMjc4ODMzMjk5OTk5OTk1LCAtMTE2LjM2ODY2NjcwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9iY2NlOWU2MDljODQ0YzViOTUzZTc1Mzg5MzAzM2E4OSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfN2JjM2Q5MDQwZGMyNDU4ODkzZDNlZTQ5NTY0YWJlODEgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDFNand2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK01UazNOUzB3Tmp3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnVEc5allYUnBiMjQ2SUR4bWIyNTBJR052Ykc5eVBTSnlaV1FpUGpVMGEyMGdUa1VnYjJZZ1FtVmhkSFI1TENCT1Zqd3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZyIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2JjY2U5ZTYwOWM4NDRjNWI5NTNlNzUzODkzMDMzYTg5LnNldENvbnRlbnQoaV9mcmFtZV83YmMzZDkwNDBkYzI0NTg4OTNkM2VlNDk1NjRhYmU4MSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl81OWZlNjZjNThmMDk0MTUxOTNhZGVhMGY1MmQ1OGFkYi5iaW5kUG9wdXAocG9wdXBfYmNjZTllNjA5Yzg0NGM1Yjk1M2U3NTM4OTMwMzNhODkpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMmQ0ZDkwYzFlODI3NDhmYjljNTJjMWQzNjA3MGE2MTcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy4yNTU4MzMzLCAtMTE2LjMxMTgzMzI5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8yOWNhNzU3OWQyMzY0M2M3ODdlZjBlYzYzMjA4NDdlOSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfMDAxM2ZhZWQ3NDQ2NGQwOGI0MmJmYTE0OTg4Y2NiODQgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDFNand2Wm05dWRENDhMMmd6UGdvZ0lDQWdJQ0FnSUR4b016NGdSR0YwWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK01UazNOaTB3TXp3dlptOXVkRDQ4TDJnelBnb2dJQ0FnSUNBZ0lEeG9NejRnVEc5allYUnBiMjQ2SUR4bWIyNTBJR052Ykc5eVBTSnlaV1FpUGpVMWEyMGdUa1VnYjJZZ1FtVmhkSFI1TENCT1Zqd3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZyIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzI5Y2E3NTc5ZDIzNjQzYzc4N2VmMGVjNjMyMDg0N2U5LnNldENvbnRlbnQoaV9mcmFtZV8wMDEzZmFlZDc0NDY0ZDA4YjQyYmZhMTQ5ODhjY2I4NCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8yZDRkOTBjMWU4Mjc0OGZiOWM1MmMxZDM2MDcwYTYxNy5iaW5kUG9wdXAocG9wdXBfMjljYTc1NzlkMjM2NDNjNzg3ZWYwZWM2MzIwODQ3ZTkpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfN2Q0ODc4MjhjMmI1NDkwMTlmNDcyM2U3Y2UxNjIzNjAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs2OC45MTMsIDc1Ljg5OV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMDdkZTY3ODI4Y2RjNGE2YmFhOGIzYWZmNWFlZjI5ZjggPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzY0NDZmYTU2OWVjYTQ2ZmU5MmJhNTZlYjFiNTI5ZjRiID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQxUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGMwTFRBNFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK2JtOXlkR2gzWlhOMFpYSnVJRk5wWW1WeWFXRXNJRkoxYzNOcFlUd3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZyIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzA3ZGU2NzgyOGNkYzRhNmJhYThiM2FmZjVhZWYyOWY4LnNldENvbnRlbnQoaV9mcmFtZV82NDQ2ZmE1NjllY2E0NmZlOTJiYTU2ZWIxYjUyOWY0Yik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl83ZDQ4NzgyOGMyYjU0OTAxOWY0NzIzZTdjZTE2MjM2MC5iaW5kUG9wdXAocG9wdXBfMDdkZTY3ODI4Y2RjNGE2YmFhOGIzYWZmNWFlZjI5ZjgpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNWM1MWQ0ZDE3Mjg3NDc3YWI1YWYzNmFjYjRiMWNjZmUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS45NzIsIDc4Ljk2OF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNzNkYjNjZDA1ZjY4NDYxMzg4ZWVhOWEwZGMxMDYwMDEgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzEwNmY5NGNkZmQwNjQxNGE5YzUwOWIyOTIzZjdlM2QxID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQxUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGMwTFRFd1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1pXRnpkR1Z5YmlCTFlYcGhhMmh6ZEdGdVBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzczZGIzY2QwNWY2ODQ2MTM4OGVlYTlhMGRjMTA2MDAxLnNldENvbnRlbnQoaV9mcmFtZV8xMDZmOTRjZGZkMDY0MTRhOWM1MDliMjkyM2Y3ZTNkMSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl81YzUxZDRkMTcyODc0NzdhYjVhZjM2YWNiNGIxY2NmZS5iaW5kUG9wdXAocG9wdXBfNzNkYjNjZDA1ZjY4NDYxMzg4ZWVhOWEwZGMxMDYwMDEpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZjllNjMwZDNlYTUxNDUzZTlhOTY3NDE0YWQ3YWUyODggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS43NjM5OTk5OTk5OTk5OTYsIDc4LjA4OV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZmM5MTA3M2ZiYTRjNDdjNjgyYzJjZTJjZTUwODUwODYgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzg4YTMyNzU3YjY0MjRlMjRhMDM0MWE4NWExYmQ3ODNjID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQxUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGMxTFRBMlBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1pXRnpkR1Z5YmlCTFlYcGhhMmh6ZEdGdVBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2ZjOTEwNzNmYmE0YzQ3YzY4MmMyY2UyY2U1MDg1MDg2LnNldENvbnRlbnQoaV9mcmFtZV84OGEzMjc1N2I2NDI0ZTI0YTAzNDFhODVhMWJkNzgzYyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9mOWU2MzBkM2VhNTE0NTNlOWE5Njc0MTRhZDdhZTI4OC5iaW5kUG9wdXAocG9wdXBfZmM5MTA3M2ZiYTRjNDdjNjgyYzJjZTJjZTUwODUwODYpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZTA0MzhiZTZmZTliNDgwYWI4MWVlNDZiNzJkZGU5ZjIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS44NDEsIDc4LjE3Mzk5OTk5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8yMzU1MzBkZWFlZDk0OTE0OTRjNjI5MDA3MjAzNTQ3NyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfZDU4YWQxZGVkYWRlNDhlZDhmYWI1NWFhMDBhN2E0MDYgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDFQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UYzNMVEV3UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krWldGemRHVnliaUJMWVhwaGEyaHpkR0Z1UEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMjM1NTMwZGVhZWQ5NDkxNDk0YzYyOTAwNzIwMzU0Nzcuc2V0Q29udGVudChpX2ZyYW1lX2Q1OGFkMWRlZGFkZTQ4ZWQ4ZmFiNTVhYTAwYTdhNDA2KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2UwNDM4YmU2ZmU5YjQ4MGFiODFlZTQ2YjcyZGRlOWYyLmJpbmRQb3B1cChwb3B1cF8yMzU1MzBkZWFlZDk0OTE0OTRjNjI5MDA3MjAzNTQ3NykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl85MDYwNWFlYzkxOTg0ZGJiOThkZGExODgyOTQ1OGM1MCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjczMzk5OTk5OTk5OTk5NSwgNzguMDc0XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9hYTIyZWQwNGM1MzQ0YmMwYTFkMTc0NmFjNGYxNDZiNCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfYmZmYzEzYTIyMDIwNDliN2IwMjYzOTUzNDAxMzU1YTEgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDFQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UYzRMVEF6UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krWldGemRHVnliaUJMWVhwaGEyaHpkR0Z1UEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYWEyMmVkMDRjNTM0NGJjMGExZDE3NDZhYzRmMTQ2YjQuc2V0Q29udGVudChpX2ZyYW1lX2JmZmMxM2EyMjAyMDQ5YjdiMDI2Mzk1MzQwMTM1NWExKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzkwNjA1YWVjOTE5ODRkYmI5OGRkYTE4ODI5NDU4YzUwLmJpbmRQb3B1cChwb3B1cF9hYTIyZWQwNGM1MzQ0YmMwYTFkMTc0NmFjNGYxNDZiNCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9jOWQ5MTNhM2IyYjI0NTRiYWVkNTcyNjVkYTEwYmM2NSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzYzLjE0MywgNjMuMzkxOTk5OTk5OTk5OTk2XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8yMmQ3ZTFiOTRhNjc0NTUyOTZiOTI1NTc4MzQ1OWVjNyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfZWVlMGU3MzJhYmJjNDM5NzkwNDNlOTc5MGZlNzJjZTIgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDFQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UYzRMVEV3UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krVlhKaGJDQk5iM1Z1ZEdGcGJuTWdjbVZuYVc5dUxDQlNkWE56YVdFOEwyWnZiblErUEM5b016NEtJQ0FnSUE9PSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzIyZDdlMWI5NGE2NzQ1NTI5NmI5MjU1NzgzNDU5ZWM3LnNldENvbnRlbnQoaV9mcmFtZV9lZWUwZTczMmFiYmM0Mzk3OTA0M2U5NzkwZmU3MmNlMik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9jOWQ5MTNhM2IyYjI0NTRiYWVkNTcyNjVkYTEwYmM2NS5iaW5kUG9wdXAocG9wdXBfMjJkN2UxYjk0YTY3NDU1Mjk2YjkyNTU3ODM0NTllYzcpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfOGNhMTA5MGU3NzgzNGExYWJjMTVkMDgyM2RlMzc0ZmEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0OS45NDY5OTk5OTk5OTk5OTYsIDc4Ljc5ODk5OTk5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9kN2JjMjk4NDAzYTM0N2QyOTZkM2VkNmZjODMwMDY3MCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfZTRmYWI5ZmI1ZTg0NDYxNTk5YTJmY2ZmN2Q5OTQ2MGUgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDFQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZ3dMVEEwUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krWldGemRHVnliaUJMWVhwaGEyaHpkR0Z1UEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZDdiYzI5ODQwM2EzNDdkMjk2ZDNlZDZmYzgzMDA2NzAuc2V0Q29udGVudChpX2ZyYW1lX2U0ZmFiOWZiNWU4NDQ2MTU5OWEyZmNmZjdkOTk0NjBlKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzhjYTEwOTBlNzc4MzRhMWFiYzE1ZDA4MjNkZTM3NGZhLmJpbmRQb3B1cChwb3B1cF9kN2JjMjk4NDAzYTM0N2QyOTZkM2VkNmZjODMwMDY3MCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9jODM2ODUzODdkZTI0ODk4OTdmOGRlMjU0YjlkNzY0YyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjcyOSwgNzguMV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMTIyNTk5Zjg5MzdhNDVmMWI3NzBiNjQ4ZjkyYWZjZmMgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzhhYTAxYjM0ZmNmZDRlN2I5NGY0MTNiMTMyZDE2MTE0ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQxUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGd3TFRBMVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1pXRnpkR1Z5YmlCTFlYcGhhMmh6ZEdGdVBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzEyMjU5OWY4OTM3YTQ1ZjFiNzcwYjY0OGY5MmFmY2ZjLnNldENvbnRlbnQoaV9mcmFtZV84YWEwMWIzNGZjZmQ0ZTdiOTRmNDEzYjEzMmQxNjExNCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9jODM2ODUzODdkZTI0ODk4OTdmOGRlMjU0YjlkNzY0Yy5iaW5kUG9wdXAocG9wdXBfMTIyNTk5Zjg5MzdhNDVmMWI3NzBiNjQ4ZjkyYWZjZmMpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfODRiODMwMGI2NDMwNDFiOWI0NzNhM2NhYmI4ZTc1ZDkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjIuMDIzMDAwMDAwMDAwMDAzLCAtMTM4Ljg3M10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMTY4ZDBhNWVjNDA1NDNlMzg4YTk1ODg2NGFjNjJiNWYgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzEyZGYyNWM1MTFhOTQyZDk4NGU5YmNlZTc2Mjk2NmZmID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQxUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGd3TFRBMlBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1ZIVmhiVzkwZFNCQmNtTm9hWEJsYkdGbmJ5d2dSbkpsYm1Ob0lGQnZiSGx1WlhOcFlTQnlaV2RwYjI0OEwyWnZiblErUEM5b016NEtJQ0FnSUE9PSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzE2OGQwYTVlYzQwNTQzZTM4OGE5NTg4NjRhYzYyYjVmLnNldENvbnRlbnQoaV9mcmFtZV8xMmRmMjVjNTExYTk0MmQ5ODRlOWJjZWU3NjI5NjZmZik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl84NGI4MzAwYjY0MzA0MWI5YjQ3M2EzY2FiYjhlNzVkOS5iaW5kUG9wdXAocG9wdXBfMTY4ZDBhNWVjNDA1NDNlMzg4YTk1ODg2NGFjNjJiNWYpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNTUwZDhiNjdlYzkyNGVkNTg2MTg3NzQ2NGM2OGE3ZGQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs2OC4yMDUsIDUzLjY1NjAwMDAwMDAwMDAwNl0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfODU4OWQ4MGZhMmJmNGFiMDg0YjUyMzRjY2ViNjY1ODkgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzdjNmVhM2EwNDE2MzRjYjBhMjkwM2EyYzZlMGRlMDMxID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQxUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGd4TFRBMVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK2JtOXlkR2gzWlhOMFpYSnVJRkoxYzNOcFlUd3ZabTl1ZEQ0OEwyZ3pQZ29nSUNBZyIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzg1ODlkODBmYTJiZjRhYjA4NGI1MjM0Y2NlYjY2NTg5LnNldENvbnRlbnQoaV9mcmFtZV83YzZlYTNhMDQxNjM0Y2IwYTI5MDNhMmM2ZTBkZTAzMSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl81NTBkOGI2N2VjOTI0ZWQ1ODYxODc3NDY0YzY4YTdkZC5iaW5kUG9wdXAocG9wdXBfODU4OWQ4MGZhMmJmNGFiMDg0YjUyMzRjY2ViNjY1ODkpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNDhiNjg3YTMwNWE5NDBiMDk5ZDEwYjYyYTRiMzRiYzEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0MS41NjYsIDg4Ljc2Nl0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMjgzYzA5M2NiN2JjNDIzMWIyOTNmNmE1ZmE3ZDYyZjkgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzg2OWRlNDUxZDY2YTRkNjBhOTdiZWI1ZDQzZTYzYTE1ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQxUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGd6TFRFd1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK2MyOTFkR2hsY200Z1dHbHVhbWxoYm1jc0lFTm9hVzVoUEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMjgzYzA5M2NiN2JjNDIzMWIyOTNmNmE1ZmE3ZDYyZjkuc2V0Q29udGVudChpX2ZyYW1lXzg2OWRlNDUxZDY2YTRkNjBhOTdiZWI1ZDQzZTYzYTE1KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzQ4YjY4N2EzMDVhOTQwYjA5OWQxMGI2MmE0YjM0YmMxLmJpbmRQb3B1cChwb3B1cF8yODNjMDkzY2I3YmM0MjMxYjI5M2Y2YTVmYTdkNjJmOSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9hNzQwM2MxNTQ2NTU0YjJkYmVhYjQxZDJhNzc2M2RmNyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUwLjA2NiwgNzkuMDM2XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF82ZWFjNDgxZGQ4M2I0OGZjOGQ5NjliZWY0MmZmNGMxZiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfMDY0ZmJmMTg0NWNiNGUxMGE1OTBmMWQ0YWFkYjkzNjUgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDFQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZ3pMVEV4UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krWldGemRHVnliaUJMWVhwaGEyaHpkR0Z1UEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNmVhYzQ4MWRkODNiNDhmYzhkOTY5YmVmNDJmZjRjMWYuc2V0Q29udGVudChpX2ZyYW1lXzA2NGZiZjE4NDVjYjRlMTBhNTkwZjFkNGFhZGI5MzY1KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2E3NDAzYzE1NDY1NTRiMmRiZWFiNDFkMmE3NzYzZGY3LmJpbmRQb3B1cChwb3B1cF82ZWFjNDgxZGQ4M2I0OGZjOGQ5NjliZWY0MmZmNGMxZikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl81NjU0OTU0OTkzOTY0YWE1YjBjY2U5ZGEwNGZhMDRkMyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjgzOCwgNzguMjE4XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF82OGNkMjVkNjY4NTI0NjliOWM5NDM0NjdjZmU0YTk1NCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfMmQzZDgxYTRiMmFhNGNjNTliYjZkZDFlNzA0NGEwY2UgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDFQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9UZ3pMVEV5UEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krWldGemRHVnliaUJMWVhwaGEyaHpkR0Z1UEM5bWIyNTBQand2YURNK0NpQWdJQ0E9IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNjhjZDI1ZDY2ODUyNDY5YjljOTQzNDY3Y2ZlNGE5NTQuc2V0Q29udGVudChpX2ZyYW1lXzJkM2Q4MWE0YjJhYTRjYzU5YmI2ZGQxZTcwNDRhMGNlKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzU2NTQ5NTQ5OTM5NjRhYTViMGNjZTlkYTA0ZmEwNGQzLmJpbmRQb3B1cChwb3B1cF82OGNkMjVkNjY4NTI0NjliOWM5NDM0NjdjZmU0YTk1NCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9hNjYxNWE5MzZlMDA0YWRiYjljOGFkNzYyZWZjOTA5YiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjkzODk5OTk5OTk5OTk5LCA3OC44MjMwMDAwMDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZWM5ZWY3MzVhYzlhNGNmODk4ZWMzMzY2YTI2Nzk5OWQgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2Q5ODY1NjgxMmY1ODQxMzFiMGVjMTMwNzRhOTFhYTc3ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQxUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGczTFRBelBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1pXRnpkR1Z5YmlCTFlYcGhhMmh6ZEdGdVBDOW1iMjUwUGp3dmFETStDaUFnSUNBPSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2VjOWVmNzM1YWM5YTRjZjg5OGVjMzM2NmEyNjc5OTlkLnNldENvbnRlbnQoaV9mcmFtZV9kOTg2NTY4MTJmNTg0MTMxYjBlYzEzMDc0YTkxYWE3Nyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9hNjYxNWE5MzZlMDA0YWRiYjljOGFkNzYyZWZjOTA5Yi5iaW5kUG9wdXAocG9wdXBfZWM5ZWY3MzVhYzlhNGNmODk4ZWMzMzY2YTI2Nzk5OWQpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMjVjOWI0ZDhkNDRkNGYyNDk0MGY2YjJjNjU5YWEyMTggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjEuODIyLCAtMTM5LjAyOV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNjIzOGI3MjM2YWU2NGU4NmFmZWRkZjRjMWE3NTgyN2UgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2MxMTlmZWE5NTYyYTQ4Yzc4MWY2ZjA3ZDAyMGFjZjM0ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQxUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGczTFRFd1BDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1ZIVmhiVzkwZFNCQmNtTm9hWEJsYkdGbmJ5d2dSbkpsYm1Ob0lGQnZiSGx1WlhOcFlTQnlaV2RwYjI0OEwyWnZiblErUEM5b016NEtJQ0FnSUE9PSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzYyMzhiNzIzNmFlNjRlODZhZmVkZGY0YzFhNzU4MjdlLnNldENvbnRlbnQoaV9mcmFtZV9jMTE5ZmVhOTU2MmE0OGM3ODFmNmYwN2QwMjBhY2YzNCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8yNWM5YjRkOGQ0NGQ0ZjI0OTQwZjZiMmM2NTlhYTIxOC5iaW5kUG9wdXAocG9wdXBfNjIzOGI3MjM2YWU2NGU4NmFmZWRkZjRjMWE3NTgyN2UpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfN2YyN2NlY2FkNjk5NDA3Yzk3ZDI2YmUyNzBkYmI2ZmIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjEuODY2OTk5OTk5OTk5OTk3LCAtMTM5LjA3Ml0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNmFlNDUzMzA4NThmNDI3NTkwY2Q3NGI3ZGI5ZTYzZDUgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2E3MmFjNTA4MjA1YzRlZDA5Y2NhYThkYjM5MzJiNzA4ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQxUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGc0TFRBMVBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1ZIVmhiVzkwZFNCQmNtTm9hWEJsYkdGbmJ5d2dSbkpsYm1Ob0lGQnZiSGx1WlhOcFlTQnlaV2RwYjI0OEwyWnZiblErUEM5b016NEtJQ0FnSUE9PSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzZhZTQ1MzMwODU4ZjQyNzU5MGNkNzRiN2RiOWU2M2Q1LnNldENvbnRlbnQoaV9mcmFtZV9hNzJhYzUwODIwNWM0ZWQwOWNjYWE4ZGIzOTMyYjcwOCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl83ZjI3Y2VjYWQ2OTk0MDdjOTdkMjZiZTI3MGRiYjZmYi5iaW5kUG9wdXAocG9wdXBfNmFlNDUzMzA4NThmNDI3NTkwY2Q3NGI3ZGI5ZTYzZDUpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYTc1YWIxZmMwMmZlNDQ4Y2JjODg4NDNkNWU4NGU5YmMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjIuMjQ0LCAtMTM4LjgzNl0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYmU0MTI4NDdmYTBmNGUyZDhkZjFlMmFiMmQ5YzQzMTYgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzYzOTY2OWY3MjhjNzRiZjM4NmQ2YWUyYjlmNzY2MDc0ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQxUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGc0TFRFeFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1ZIVmhiVzkwZFNCQmNtTm9hWEJsYkdGbmJ5d2dSbkpsYm1Ob0lGQnZiSGx1WlhOcFlTQnlaV2RwYjI0OEwyWnZiblErUEM5b016NEtJQ0FnSUE9PSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2JlNDEyODQ3ZmEwZjRlMmQ4ZGYxZTJhYjJkOWM0MzE2LnNldENvbnRlbnQoaV9mcmFtZV82Mzk2NjlmNzI4Yzc0YmYzODZkNmFlMmI5Zjc2NjA3NCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9hNzVhYjFmYzAyZmU0NDhjYmM4ODg0M2Q1ZTg0ZTliYy5iaW5kUG9wdXAocG9wdXBfYmU0MTI4NDdmYTBmNGUyZDhkZjFlMmFiMmQ5YzQzMTYpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNjczOGYyYTEzOWIwNDI5YjhmYWFlOTI4MTkwNzAxN2YgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjIuMjUyLCAtMTM4LjczNF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYzhjNjU4YTBlNjRmNGYyNmJjNTYzM2JkNTk1YzE3OTMgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzY4NmI2YWQ1ZDM2YzRlYjliNTc1NDU5YWI0OGFiOTFjID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQxUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGc1TFRBMlBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1ZIVmhiVzkwZFNCQmNtTm9hWEJsYkdGbmJ5d2dSbkpsYm1Ob0lGQnZiSGx1WlhOcFlTQnlaV2RwYjI0OEwyWnZiblErUEM5b016NEtJQ0FnSUE9PSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2M4YzY1OGEwZTY0ZjRmMjZiYzU2MzNiZDU5NWMxNzkzLnNldENvbnRlbnQoaV9mcmFtZV82ODZiNmFkNWQzNmM0ZWI5YjU3NTQ1OWFiNDhhYjkxYyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl82NzM4ZjJhMTM5YjA0MjliOGZhYWU5MjgxOTA3MDE3Zi5iaW5kUG9wdXAocG9wdXBfYzhjNjU4YTBlNjRmNGYyNmJjNTYzM2JkNTk1YzE3OTMpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNDAyNTg0NzBmZjY4NDUxNjk0NTFjMzQ3YjU5OWY5MjggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjIuMjE1LCAtMTM4Ljg0MV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfM2QwMGY1ZTk3NzQ4NGM1YWE4NTE0Yzk3YzE1NTYyYjYgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lXzE1YzIyNDFjNDFiMDQxNWU5OTU5ZTQ4ZDAxOWNjNDI2ID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQxUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGt3TFRBMlBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1ZIVmhiVzkwZFNCQmNtTm9hWEJsYkdGbmJ5d2dSbkpsYm1Ob0lGQnZiSGx1WlhOcFlTQnlaV2RwYjI0OEwyWnZiblErUEM5b016NEtJQ0FnSUE9PSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzNkMDBmNWU5Nzc0ODRjNWFhODUxNGM5N2MxNTU2MmI2LnNldENvbnRlbnQoaV9mcmFtZV8xNWMyMjQxYzQxYjA0MTVlOTk1OWU0OGQwMTljYzQyNik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl80MDI1ODQ3MGZmNjg0NTE2OTQ1MWMzNDdiNTk5ZjkyOC5iaW5kUG9wdXAocG9wdXBfM2QwMGY1ZTk3NzQ4NGM1YWE4NTE0Yzk3YzE1NTYyYjYpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZGNiOWNjYWE4ZDZkNDRiMmIyZmU1ZTkyZWQwYmQ4MTQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjIuMjU4MDAwMDAwMDAwMDAzLCAtMTM4LjgwNV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8wMTc2NTU3M2U3Njg0ZWZjYTczYTJkNmM0MzMyZjU1Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZjliNWRiNzk2MzNjNDg1Y2IzM2NmNjc3MTk1ZjRhOTkgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiA4MDB9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBpX2ZyYW1lX2JjZTU4YmY5MjU1ODQ2NTg4NTY4Y2NiNmMyYTViNjUzID0gJChgPGlmcmFtZSBzcmM9ImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LENpQWdJQ0FLSUNBZ0lDQWdJQ0E4YURNK0lFMWhaMjVwZEhWa1pUb2dQR1p2Ym5RZ1kyOXNiM0k5SW5KbFpDSStOUzQxUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJFWVhSbE9pQThabTl1ZENCamIyeHZjajBpY21Wa0lqNHhPVGt3TFRFeFBDOW1iMjUwUGp3dmFETStDaUFnSUNBZ0lDQWdQR2d6UGlCTWIyTmhkR2x2YmpvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK1ZIVmhiVzkwZFNCQmNtTm9hWEJsYkdGbmJ5d2dSbkpsYm1Ob0lGQnZiSGx1WlhOcFlTQnlaV2RwYjI0OEwyWnZiblErUEM5b016NEtJQ0FnSUE9PSIgd2lkdGg9IjI2MCIgc3R5bGU9ImJvcmRlcjpub25lICFpbXBvcnRhbnQ7IiBoZWlnaHQ9IjE1NSI+PC9pZnJhbWU+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2Y5YjVkYjc5NjMzYzQ4NWNiMzNjZjY3NzE5NWY0YTk5LnNldENvbnRlbnQoaV9mcmFtZV9iY2U1OGJmOTI1NTg0NjU4ODU2OGNjYjZjMmE1YjY1Myk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9kY2I5Y2NhYThkNmQ0NGIyYjJmZTVlOTJlZDBiZDgxNC5iaW5kUG9wdXAocG9wdXBfZjliNWRiNzk2MzNjNDg1Y2IzM2NmNjc3MTk1ZjRhOTkpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYzdhZDNjYjZlZTdkNGU5YmE1YTNmZWFlNWFkOGQ1ZWYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMjIuMjU2LCAtMTM4Ljc5Mzk5OTk5OTk5OTk4XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzAxNzY1NTczZTc2ODRlZmNhNzNhMmQ2YzQzMzJmNTU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF83ODY4N2NkMjZjNjI0Mzk4YWYzNmRiOTg0Mjc3MzZiNCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6IDgwMH0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGlfZnJhbWVfMzg3ZjU4ZWU0Y2YyNGE3NDhiYWE2ZGM4NDViZDg3YzYgPSAkKGA8aWZyYW1lIHNyYz0iZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsQ2lBZ0lDQUtJQ0FnSUNBZ0lDQThhRE0rSUUxaFoyNXBkSFZrWlRvZ1BHWnZiblFnWTI5c2IzSTlJbkpsWkNJK05TNDFQQzltYjI1MFBqd3ZhRE0rQ2lBZ0lDQWdJQ0FnUEdnelBpQkVZWFJsT2lBOFptOXVkQ0JqYjJ4dmNqMGljbVZrSWo0eE9Ua3hMVEExUEM5bWIyNTBQand2YURNK0NpQWdJQ0FnSUNBZ1BHZ3pQaUJNYjJOaGRHbHZiam9nUEdadmJuUWdZMjlzYjNJOUluSmxaQ0krVkhWaGJXOTBkU0JCY21Ob2FYQmxiR0ZuYnl3Z1JuSmxibU5vSUZCdmJIbHVaWE5wWVNCeVpXZHBiMjQ4TDJadmJuUStQQzlvTXo0S0lDQWdJQT09IiB3aWR0aD0iMjYwIiBzdHlsZT0iYm9yZGVyOm5vbmUgIWltcG9ydGFudDsiIGhlaWdodD0iMTU1Ij48L2lmcmFtZT5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNzg2ODdjZDI2YzYyNDM5OGFmMzZkYjk4NDI3NzM2YjQuc2V0Q29udGVudChpX2ZyYW1lXzM4N2Y1OGVlNGNmMjRhNzQ4YmFhNmRjODQ1YmQ4N2M2KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2M3YWQzY2I2ZWU3ZDRlOWJhNWEzZmVhZTVhZDhkNWVmLmJpbmRQb3B1cChwb3B1cF83ODY4N2NkMjZjNjI0Mzk4YWYzNmRiOTg0Mjc3MzZiNCkKICAgICAgICA7CgogICAgICAgIAogICAgCjwvc2NyaXB0Pg==\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x115eb9e10>"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"map_Nuke3"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [],
"source": [
"# Makes a folder if one does not exist. \n",
"!mkdir -p map-output-files\n",
"\n",
"#Now save the HTML file\n",
"map_Nuke3.save('map-output-files/NukesCompleteWithMarkers.html')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Lets look at another query. "
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Last nuclear explosion</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2017-09-03 3:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment