Skip to content

Instantly share code, notes, and snippets.

@MasoudAali
Created April 23, 2020 18:38
Show Gist options
  • Save MasoudAali/ac4be524323680caa36deb8240397e71 to your computer and use it in GitHub Desktop.
Save MasoudAali/ac4be524323680caa36deb8240397e71 to your computer and use it in GitHub Desktop.
Created on Skills Network Labs
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" Postal code Borough \\\n",
"0 M1A Not assigned \n",
"1 M2A Not assigned \n",
"2 M3A North York \n",
"3 M4A North York \n",
"4 M5A Downtown Toronto \n",
".. ... ... \n",
"175 M5Z Not assigned \n",
"176 M6Z Not assigned \n",
"177 M7Z Not assigned \n",
"178 M8Z Etobicoke \n",
"179 M9Z Not assigned \n",
"\n",
" Neighborhood \n",
"0 NaN \n",
"1 NaN \n",
"2 Parkwoods \n",
"3 Victoria Village \n",
"4 Regent Park / Harbourfront \n",
".. ... \n",
"175 NaN \n",
"176 NaN \n",
"177 NaN \n",
"178 Mimico NW / The Queensway West / South of Bloo... \n",
"179 NaN \n",
"\n",
"[180 rows x 3 columns]\n"
]
}
],
"source": [
"import requests\n",
"import pandas as pd\n",
"# Importing the trable from the wikipedia webpage as a data frame\n",
"url = 'https://en.wikipedia.org/wiki/List_of_postal_codes_of_Canada:_M'\n",
"html = requests.get(url).content\n",
"df_list = pd.read_html(html)\n",
"df = df_list[0]\n",
"print(df)"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'Lawrence Manor / Lawrence Heights'"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Removing cells with Borough value not assigned\n",
"df = df[df.Borough != 'Not assigned']"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [
{
"ename": "SyntaxError",
"evalue": "invalid syntax (<ipython-input-39-c3c0de095a4a>, line 2)",
"output_type": "error",
"traceback": [
"\u001b[0;36m File \u001b[0;32m\"<ipython-input-39-c3c0de095a4a>\"\u001b[0;36m, line \u001b[0;32m2\u001b[0m\n\u001b[0;31m if (df.iloc[i,2] == 'Not assigned'):\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n"
]
}
],
"source": [
"# Replace the un-assigned Neigborhood value with their Borough value\n",
"for (i in range(df.shape[0]) \n",
" if (df.iloc[i,2] == 'Not assigned'):\n",
" df.iloc[i,2] = df.iloc[i,1]"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [],
"source": [
"# Cleaning the data \n",
"# It includes replacing the separator between the Neighborhoods\n",
"# removing the duplicated columns\n",
"\n",
"df['Neighborhood'] = df['Neighborhood'].str.replace('/', ',')"
]
},
{
"cell_type": "code",
"execution_count": 41,
"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>Postal code</th>\n",
" <th>Borough</th>\n",
" <th>Neighborhood</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>M3A</td>\n",
" <td>North York</td>\n",
" <td>Parkwoods</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>M4A</td>\n",
" <td>North York</td>\n",
" <td>Victoria Village</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>M5A</td>\n",
" <td>Downtown Toronto</td>\n",
" <td>Regent Park , Harbourfront</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>M6A</td>\n",
" <td>North York</td>\n",
" <td>Lawrence Manor , Lawrence Heights</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>M7A</td>\n",
" <td>Downtown Toronto</td>\n",
" <td>Queen's Park , Ontario Provincial Government</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>160</th>\n",
" <td>M8X</td>\n",
" <td>Etobicoke</td>\n",
" <td>The Kingsway , Montgomery Road , Old Mill North</td>\n",
" </tr>\n",
" <tr>\n",
" <th>165</th>\n",
" <td>M4Y</td>\n",
" <td>Downtown Toronto</td>\n",
" <td>Church and Wellesley</td>\n",
" </tr>\n",
" <tr>\n",
" <th>168</th>\n",
" <td>M7Y</td>\n",
" <td>East Toronto</td>\n",
" <td>Business reply mail Processing CentrE</td>\n",
" </tr>\n",
" <tr>\n",
" <th>169</th>\n",
" <td>M8Y</td>\n",
" <td>Etobicoke</td>\n",
" <td>Old Mill South , King's Mill Park , Sunnylea ,...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>178</th>\n",
" <td>M8Z</td>\n",
" <td>Etobicoke</td>\n",
" <td>Mimico NW , The Queensway West , South of Bloo...</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>103 rows × 3 columns</p>\n",
"</div>"
],
"text/plain": [
" Postal code Borough \\\n",
"2 M3A North York \n",
"3 M4A North York \n",
"4 M5A Downtown Toronto \n",
"5 M6A North York \n",
"6 M7A Downtown Toronto \n",
".. ... ... \n",
"160 M8X Etobicoke \n",
"165 M4Y Downtown Toronto \n",
"168 M7Y East Toronto \n",
"169 M8Y Etobicoke \n",
"178 M8Z Etobicoke \n",
"\n",
" Neighborhood \n",
"2 Parkwoods \n",
"3 Victoria Village \n",
"4 Regent Park , Harbourfront \n",
"5 Lawrence Manor , Lawrence Heights \n",
"6 Queen's Park , Ontario Provincial Government \n",
".. ... \n",
"160 The Kingsway , Montgomery Road , Old Mill North \n",
"165 Church and Wellesley \n",
"168 Business reply mail Processing CentrE \n",
"169 Old Mill South , King's Mill Park , Sunnylea ,... \n",
"178 Mimico NW , The Queensway West , South of Bloo... \n",
"\n",
"[103 rows x 3 columns]"
]
},
"execution_count": 41,
"metadata": {},
"output_type": "execute_result"
}
],
"source": []
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {},
"outputs": [],
"source": [
"df2 = pd.read_csv(\"https://cocl.us/Geospatial_data\")\n",
"df = df.merge(df2, how = 'inner', left_on = 'Postal code', right_on = 'Postal Code')\n",
"df = df.iloc[:,[0,1,2,4,5]]"
]
},
{
"cell_type": "code",
"execution_count": 43,
"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>Postal Code</th>\n",
" <th>Latitude</th>\n",
" <th>Longitude</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>M1B</td>\n",
" <td>43.806686</td>\n",
" <td>-79.194353</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>M1C</td>\n",
" <td>43.784535</td>\n",
" <td>-79.160497</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>M1E</td>\n",
" <td>43.763573</td>\n",
" <td>-79.188711</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>M1G</td>\n",
" <td>43.770992</td>\n",
" <td>-79.216917</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>M1H</td>\n",
" <td>43.773136</td>\n",
" <td>-79.239476</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Postal Code Latitude Longitude\n",
"0 M1B 43.806686 -79.194353\n",
"1 M1C 43.784535 -79.160497\n",
"2 M1E 43.763573 -79.188711\n",
"3 M1G 43.770992 -79.216917\n",
"4 M1H 43.773136 -79.239476"
]
},
"execution_count": 43,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df2.head()"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 50,
"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>Postal code</th>\n",
" <th>Borough</th>\n",
" <th>Neighborhood</th>\n",
" <th>Latitude_x</th>\n",
" <th>Longitude_x</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>M3A</td>\n",
" <td>North York</td>\n",
" <td>Parkwoods</td>\n",
" <td>43.753259</td>\n",
" <td>-79.329656</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>M4A</td>\n",
" <td>North York</td>\n",
" <td>Victoria Village</td>\n",
" <td>43.725882</td>\n",
" <td>-79.315572</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>M5A</td>\n",
" <td>Downtown Toronto</td>\n",
" <td>Regent Park , Harbourfront</td>\n",
" <td>43.654260</td>\n",
" <td>-79.360636</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>M6A</td>\n",
" <td>North York</td>\n",
" <td>Lawrence Manor , Lawrence Heights</td>\n",
" <td>43.718518</td>\n",
" <td>-79.464763</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>M7A</td>\n",
" <td>Downtown Toronto</td>\n",
" <td>Queen's Park , Ontario Provincial Government</td>\n",
" <td>43.662301</td>\n",
" <td>-79.389494</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Postal code Borough Neighborhood \\\n",
"0 M3A North York Parkwoods \n",
"1 M4A North York Victoria Village \n",
"2 M5A Downtown Toronto Regent Park , Harbourfront \n",
"3 M6A North York Lawrence Manor , Lawrence Heights \n",
"4 M7A Downtown Toronto Queen's Park , Ontario Provincial Government \n",
"\n",
" Latitude_x Longitude_x \n",
"0 43.753259 -79.329656 \n",
"1 43.725882 -79.315572 \n",
"2 43.654260 -79.360636 \n",
"3 43.718518 -79.464763 \n",
"4 43.662301 -79.389494 "
]
},
"execution_count": 50,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"about:blank\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" data-html=PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfOWI2NDJjMTdhNDU5NDczYjhhY2RlMzQ2Y2FjNDVmMWUgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzliNjQyYzE3YTQ1OTQ3M2I4YWNkZTM0NmNhYzQ1ZjFlIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF85YjY0MmMxN2E0NTk0NzNiOGFjZGUzNDZjYWM0NWYxZSA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF85YjY0MmMxN2E0NTk0NzNiOGFjZGUzNDZjYWM0NWYxZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNDMuNzUzMjU4NiwtNzkuMzI5NjU2NV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfNTA4YmU5OTkzOWFlNDA1ZjhkYjI0NTE5NjI4MTY5MWEgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI2NDJjMTdhNDU5NDczYjhhY2RlMzQ2Y2FjNDVmMWUpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzkyNzVhNjRlYmIzODQxYzU4MTZjMjhkOTdjN2ZlODE0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzUzMjU4NiwtNzkuMzI5NjU2NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjY0MmMxN2E0NTk0NzNiOGFjZGUzNDZjYWM0NWYxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMDZiOTgyY2NmOTU0MGY0YjQ2YTRmYjgxMTMyYTMyOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80MTk0ZmIwNjk5OTk0MGFjYjBlODY5ZjYwNTk0NzVkMyA9ICQoJzxkaXYgaWQ9Imh0bWxfNDE5NGZiMDY5OTk5NDBhY2IwZTg2OWY2MDU5NDc1ZDMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBhcmt3b29kcywgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjA2Yjk4MmNjZjk1NDBmNGI0NmE0ZmI4MTEzMmEzMjguc2V0Q29udGVudChodG1sXzQxOTRmYjA2OTk5OTQwYWNiMGU4NjlmNjA1OTQ3NWQzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzkyNzVhNjRlYmIzODQxYzU4MTZjMjhkOTdjN2ZlODE0LmJpbmRQb3B1cChwb3B1cF9iMDZiOTgyY2NmOTU0MGY0YjQ2YTRmYjgxMTMyYTMyOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82YjlkOGNmMzliNmE0ZTdhYTgxOWEyOTYzZmUwYjczNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcyNTg4MjI5OTk5OTk5NSwtNzkuMzE1NTcxNTk5OTk5OThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI2NDJjMTdhNDU5NDczYjhhY2RlMzQ2Y2FjNDVmMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWY4YjU5MDIxMjA1NDc3MTk5ZTNlOTE0MjRjNmYwOTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWJmYzllNDE2NDEzNDY5YmI3ZTc3MDAyODJiNTQ0MDEgPSAkKCc8ZGl2IGlkPSJodG1sXzFiZmM5ZTQxNjQxMzQ2OWJiN2U3NzAwMjgyYjU0NDAxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WaWN0b3JpYSBWaWxsYWdlLCBOb3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lZjhiNTkwMjEyMDU0NzcxOTllM2U5MTQyNGM2ZjA5OC5zZXRDb250ZW50KGh0bWxfMWJmYzllNDE2NDEzNDY5YmI3ZTc3MDAyODJiNTQ0MDEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmI5ZDhjZjM5YjZhNGU3YWE4MTlhMjk2M2ZlMGI3MzQuYmluZFBvcHVwKHBvcHVwX2VmOGI1OTAyMTIwNTQ3NzE5OWUzZTkxNDI0YzZmMDk4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzgyZTg4ZDdiYTJiZjRmZTliMTgyMDBlOTBhYjJlMjZmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjU0MjU5OSwtNzkuMzYwNjM1OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjY0MmMxN2E0NTk0NzNiOGFjZGUzNDZjYWM0NWYxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mN2ZhZDFjYmU0OGU0MTJmODg2MjQ5YjI5MTcxOGFhNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81ZGVjNzVlNDg1OTI0NDZkOGI4ZjU4YjdlYWYzNjEzMiA9ICQoJzxkaXYgaWQ9Imh0bWxfNWRlYzc1ZTQ4NTkyNDQ2ZDhiOGY1OGI3ZWFmMzYxMzIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJlZ2VudCBQYXJrICwgSGFyYm91cmZyb250LCBEb3dudG93biBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mN2ZhZDFjYmU0OGU0MTJmODg2MjQ5YjI5MTcxOGFhNS5zZXRDb250ZW50KGh0bWxfNWRlYzc1ZTQ4NTkyNDQ2ZDhiOGY1OGI3ZWFmMzYxMzIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODJlODhkN2JhMmJmNGZlOWIxODIwMGU5MGFiMmUyNmYuYmluZFBvcHVwKHBvcHVwX2Y3ZmFkMWNiZTQ4ZTQxMmY4ODYyNDliMjkxNzE4YWE1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzcwODAwNDhjNzgxMTQzYTdhYWJjNDU3ODAzNzcyOWEzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzE4NTE3OTk5OTk5OTk2LC03OS40NjQ3NjMyOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjY0MmMxN2E0NTk0NzNiOGFjZGUzNDZjYWM0NWYxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kNGU5MDVjZTY0NWY0NWQyYmIyNDA4NmU1MTQ3MTk5ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hY2VlNTY2ZGIxZTc0MGUxOWFlNTQwYmYzZDcxYmNhYSA9ICQoJzxkaXYgaWQ9Imh0bWxfYWNlZTU2NmRiMWU3NDBlMTlhZTU0MGJmM2Q3MWJjYWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxhd3JlbmNlIE1hbm9yICwgTGF3cmVuY2UgSGVpZ2h0cywgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDRlOTA1Y2U2NDVmNDVkMmJiMjQwODZlNTE0NzE5OWYuc2V0Q29udGVudChodG1sX2FjZWU1NjZkYjFlNzQwZTE5YWU1NDBiZjNkNzFiY2FhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzcwODAwNDhjNzgxMTQzYTdhYWJjNDU3ODAzNzcyOWEzLmJpbmRQb3B1cChwb3B1cF9kNGU5MDVjZTY0NWY0NWQyYmIyNDA4NmU1MTQ3MTk5Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zOGNkYjMyOGI3NmM0NzFiYWQ2ZGQ4YTA0ZDczNzlmNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY2MjMwMTUsLTc5LjM4OTQ5MzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI2NDJjMTdhNDU5NDczYjhhY2RlMzQ2Y2FjNDVmMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmQwMDY4YmJmNTMwNDIzZWEwZGU5ZGU3NjY1MTViOWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDM1ODk3YzU5YzZiNDllZWE2YmNkYTc5ZjFjZDlhNGEgPSAkKCc8ZGl2IGlkPSJodG1sXzAzNTg5N2M1OWM2YjQ5ZWVhNmJjZGE3OWYxY2Q5YTRhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5RdWVlbiYjMzk7cyBQYXJrICwgT250YXJpbyBQcm92aW5jaWFsIEdvdmVybm1lbnQsIERvd250b3duIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZkMDA2OGJiZjUzMDQyM2VhMGRlOWRlNzY2NTE1YjlhLnNldENvbnRlbnQoaHRtbF8wMzU4OTdjNTljNmI0OWVlYTZiY2RhNzlmMWNkOWE0YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zOGNkYjMyOGI3NmM0NzFiYWQ2ZGQ4YTA0ZDczNzlmNi5iaW5kUG9wdXAocG9wdXBfNmQwMDY4YmJmNTMwNDIzZWEwZGU5ZGU3NjY1MTViOWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDBiMmRmMzU1NjVkNGFmZTg4ZGRiZTU0NmU1YmE4YTUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42Njc4NTU2LC03OS41MzIyNDI0MDAwMDAwMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjY0MmMxN2E0NTk0NzNiOGFjZGUzNDZjYWM0NWYxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84YzJhMTliZDkyZTk0OGVhODE3Y2Y0NWI2MjQ0OGViNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hY2I3Mzc1MzFkMzA0ZWQ3OTdjYmM5YmE4NzZiMDc0YyA9ICQoJzxkaXYgaWQ9Imh0bWxfYWNiNzM3NTMxZDMwNGVkNzk3Y2JjOWJhODc2YjA3NGMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPklzbGluZ3RvbiBBdmVudWUsIEV0b2JpY29rZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOGMyYTE5YmQ5MmU5NDhlYTgxN2NmNDViNjI0NDhlYjUuc2V0Q29udGVudChodG1sX2FjYjczNzUzMWQzMDRlZDc5N2NiYzliYTg3NmIwNzRjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQwYjJkZjM1NTY1ZDRhZmU4OGRkYmU1NDZlNWJhOGE1LmJpbmRQb3B1cChwb3B1cF84YzJhMTliZDkyZTk0OGVhODE3Y2Y0NWI2MjQ0OGViNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83MjQ0NTk0ZmQyNDQ0YmQzODcwYzkyOTUwN2VhNjkyZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjgwNjY4NjI5OTk5OTk5NiwtNzkuMTk0MzUzNDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI2NDJjMTdhNDU5NDczYjhhY2RlMzQ2Y2FjNDVmMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGEzZGZjY2MzNTM2NDkyMDg5MzZlZjMxNjIyNmIyNWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmEwZTUwNDQ2MjFiNDUwODhhOTk5YzI3NzA0YmNhNjIgPSAkKCc8ZGl2IGlkPSJodG1sX2ZhMGU1MDQ0NjIxYjQ1MDg4YTk5OWMyNzcwNGJjYTYyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYWx2ZXJuICwgUm91Z2UsIFNjYXJib3JvdWdoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kYTNkZmNjYzM1MzY0OTIwODkzNmVmMzE2MjI2YjI1ZS5zZXRDb250ZW50KGh0bWxfZmEwZTUwNDQ2MjFiNDUwODhhOTk5YzI3NzA0YmNhNjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzI0NDU5NGZkMjQ0NGJkMzg3MGM5Mjk1MDdlYTY5MmQuYmluZFBvcHVwKHBvcHVwX2RhM2RmY2NjMzUzNjQ5MjA4OTM2ZWYzMTYyMjZiMjVlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2QyNDQ0ZDdjYjdkYzRjOWQ5Y2RjZTQ3NWM1YzhhNGYyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzQ1OTA1Nzk5OTk5OTk2LC03OS4zNTIxODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI2NDJjMTdhNDU5NDczYjhhY2RlMzQ2Y2FjNDVmMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjdkN2E5MjQzNGM1NGFjOWE1MzA1NGQ1ODNhMDM1YTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2NiOTkzMDM0YzkxNGM3M2ExMjFmZjJkNWYwMzYwZDkgPSAkKCc8ZGl2IGlkPSJodG1sXzdjYjk5MzAzNGM5MTRjNzNhMTIxZmYyZDVmMDM2MGQ5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Eb24gTWlsbHMsIE5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY3ZDdhOTI0MzRjNTRhYzlhNTMwNTRkNTgzYTAzNWE4LnNldENvbnRlbnQoaHRtbF83Y2I5OTMwMzRjOTE0YzczYTEyMWZmMmQ1ZjAzNjBkOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kMjQ0NGQ3Y2I3ZGM0YzlkOWNkY2U0NzVjNWM4YTRmMi5iaW5kUG9wdXAocG9wdXBfNjdkN2E5MjQzNGM1NGFjOWE1MzA1NGQ1ODNhMDM1YTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTIyYjZmNjJkNzIyNDQxNDkwYjQ2YmUzNTRkNzljMGMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MDYzOTcyLC03OS4zMDk5MzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI2NDJjMTdhNDU5NDczYjhhY2RlMzQ2Y2FjNDVmMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmI3YmYwNGIyNzE0NDVmZDkxNDczZGVmNmMzMzE0NzAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWMzMTY5MTQxZTIyNDYwNDkzYjQwYTlkZGZlNGRmZmEgPSAkKCc8ZGl2IGlkPSJodG1sX2VjMzE2OTE0MWUyMjQ2MDQ5M2I0MGE5ZGRmZTRkZmZhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QYXJrdmlldyBIaWxsICwgV29vZGJpbmUgR2FyZGVucywgRWFzdCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82YjdiZjA0YjI3MTQ0NWZkOTE0NzNkZWY2YzMzMTQ3MC5zZXRDb250ZW50KGh0bWxfZWMzMTY5MTQxZTIyNDYwNDkzYjQwYTlkZGZlNGRmZmEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTIyYjZmNjJkNzIyNDQxNDkwYjQ2YmUzNTRkNzljMGMuYmluZFBvcHVwKHBvcHVwXzZiN2JmMDRiMjcxNDQ1ZmQ5MTQ3M2RlZjZjMzMxNDcwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RkZmQzZmMwZjFkOTQ0NjZiODYxYzcxZDA0NGJhNjRmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjU3MTYxOCwtNzkuMzc4OTM3MDk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI2NDJjMTdhNDU5NDczYjhhY2RlMzQ2Y2FjNDVmMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmFlOGM0MDYyZjVlNDAxYjhhOTljZGM3YjQ0YmYyMWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDYyZThmZWZkNGMwNGNmZGIyMzY2MmQ0OThmNTc2ZWIgPSAkKCc8ZGl2IGlkPSJodG1sX2Q2MmU4ZmVmZDRjMDRjZmRiMjM2NjJkNDk4ZjU3NmViIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HYXJkZW4gRGlzdHJpY3QsIFJ5ZXJzb24sIERvd250b3duIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JhZThjNDA2MmY1ZTQwMWI4YTk5Y2RjN2I0NGJmMjFlLnNldENvbnRlbnQoaHRtbF9kNjJlOGZlZmQ0YzA0Y2ZkYjIzNjYyZDQ5OGY1NzZlYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kZGZkM2ZjMGYxZDk0NDY2Yjg2MWM3MWQwNDRiYTY0Zi5iaW5kUG9wdXAocG9wdXBfYmFlOGM0MDYyZjVlNDAxYjhhOTljZGM3YjQ0YmYyMWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2E3YmZiMDE4ZGI0NGIxM2JkYzU3MTQxNThlZTFiOTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MDk1NzcsLTc5LjQ0NTA3MjU5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNjQyYzE3YTQ1OTQ3M2I4YWNkZTM0NmNhYzQ1ZjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MxMTAyMzQxZDZiNDRiOGNhODZmYmUyZjc0NWE1YWFjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg3NTA5ZGExMWM2NzRiOWY4ZDdkOWE2OTNiZWQ5OTFjID0gJCgnPGRpdiBpZD0iaHRtbF84NzUwOWRhMTFjNjc0YjlmOGQ3ZDlhNjkzYmVkOTkxYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+R2xlbmNhaXJuLCBOb3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jMTEwMjM0MWQ2YjQ0YjhjYTg2ZmJlMmY3NDVhNWFhYy5zZXRDb250ZW50KGh0bWxfODc1MDlkYTExYzY3NGI5ZjhkN2Q5YTY5M2JlZDk5MWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfN2E3YmZiMDE4ZGI0NGIxM2JkYzU3MTQxNThlZTFiOTAuYmluZFBvcHVwKHBvcHVwX2MxMTAyMzQxZDZiNDRiOGNhODZmYmUyZjc0NWE1YWFjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJhMTQ4NDBmODYzZTRhNTE5ZjNiYTgwNDQ0MmFhM2I3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjUwOTQzMiwtNzkuNTU0NzI0NDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI2NDJjMTdhNDU5NDczYjhhY2RlMzQ2Y2FjNDVmMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDY1YmMzNDJjNWFiNGUzZGE0N2I3YmQwMWZmZTg3OTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjZkNWFiN2Y2NGRkNDcwYmExYjNlY2M3MTcwOTU5NDkgPSAkKCc8ZGl2IGlkPSJodG1sX2I2ZDVhYjdmNjRkZDQ3MGJhMWIzZWNjNzE3MDk1OTQ5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZXN0IERlYW5lIFBhcmsgLCBQcmluY2VzcyBHYXJkZW5zICwgTWFydGluIEdyb3ZlICwgSXNsaW5ndG9uICwgQ2xvdmVyZGFsZSwgRXRvYmljb2tlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wNjViYzM0MmM1YWI0ZTNkYTQ3YjdiZDAxZmZlODc5Mi5zZXRDb250ZW50KGh0bWxfYjZkNWFiN2Y2NGRkNDcwYmExYjNlY2M3MTcwOTU5NDkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmExNDg0MGY4NjNlNGE1MTlmM2JhODA0NDQyYWEzYjcuYmluZFBvcHVwKHBvcHVwXzA2NWJjMzQyYzVhYjRlM2RhNDdiN2JkMDFmZmU4NzkyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM2NzBiOTQ3MDgxNjQ4ZTdhMjAwNGYyYzMyODc2NDBkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzg0NTM1MSwtNzkuMTYwNDk3MDk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI2NDJjMTdhNDU5NDczYjhhY2RlMzQ2Y2FjNDVmMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTE3NDNlMTAyNjljNGYxOGEyNzQ1ZDlmNGQyZWYzYjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2U5MWViYjYzYWFlNGJhNWFlNThiODI4MGJiZjA3YmYgPSAkKCc8ZGl2IGlkPSJodG1sXzdlOTFlYmI2M2FhZTRiYTVhZTU4YjgyODBiYmYwN2JmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Sb3VnZSBIaWxsICwgUG9ydCBVbmlvbiAsIEhpZ2hsYW5kIENyZWVrLCBTY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTE3NDNlMTAyNjljNGYxOGEyNzQ1ZDlmNGQyZWYzYjUuc2V0Q29udGVudChodG1sXzdlOTFlYmI2M2FhZTRiYTVhZTU4YjgyODBiYmYwN2JmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzM2NzBiOTQ3MDgxNjQ4ZTdhMjAwNGYyYzMyODc2NDBkLmJpbmRQb3B1cChwb3B1cF8xMTc0M2UxMDI2OWM0ZjE4YTI3NDVkOWY0ZDJlZjNiNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84ZTRhNjQyMTBjMWE0MjMzYmM3NmVjNWI1NTMxN2VhOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcyNTg5OTcwMDAwMDAxLC03OS4zNDA5MjNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI2NDJjMTdhNDU5NDczYjhhY2RlMzQ2Y2FjNDVmMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzIxOTIxMTM3ZmMxNDc3OGFkZjcyOTFmOTI4MzE1MGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDNiYzA3ZGI0MTk2NGMxMTk4NjdlMzQ5ZjExOGNmZDAgPSAkKCc8ZGl2IGlkPSJodG1sX2QzYmMwN2RiNDE5NjRjMTE5ODY3ZTM0OWYxMThjZmQwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Eb24gTWlsbHMsIE5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2MyMTkyMTEzN2ZjMTQ3NzhhZGY3MjkxZjkyODMxNTBiLnNldENvbnRlbnQoaHRtbF9kM2JjMDdkYjQxOTY0YzExOTg2N2UzNDlmMTE4Y2ZkMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84ZTRhNjQyMTBjMWE0MjMzYmM3NmVjNWI1NTMxN2VhOC5iaW5kUG9wdXAocG9wdXBfYzIxOTIxMTM3ZmMxNDc3OGFkZjcyOTFmOTI4MzE1MGIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTcyOWQ5Y2RkZGQ1NDkwYTkyMjlmNTE2YmY4MWI1MTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42OTUzNDM5MDAwMDAwMDUsLTc5LjMxODM4ODddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI2NDJjMTdhNDU5NDczYjhhY2RlMzQ2Y2FjNDVmMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWY5MzI4OTQ0YTc5NGQzNGI5NWNiM2I0ZmM1MDllMzAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzUxODc0NjdkNThhNGMzNjhlOTYzMTI2ZDJmODc0MWEgPSAkKCc8ZGl2IGlkPSJodG1sXzc1MTg3NDY3ZDU4YTRjMzY4ZTk2MzEyNmQyZjg3NDFhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Xb29kYmluZSBIZWlnaHRzLCBFYXN0IFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FmOTMyODk0NGE3OTRkMzRiOTVjYjNiNGZjNTA5ZTMwLnNldENvbnRlbnQoaHRtbF83NTE4NzQ2N2Q1OGE0YzM2OGU5NjMxMjZkMmY4NzQxYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81NzI5ZDljZGRkZDU0OTBhOTIyOWY1MTZiZjgxYjUxNy5iaW5kUG9wdXAocG9wdXBfYWY5MzI4OTQ0YTc5NGQzNGI5NWNiM2I0ZmM1MDllMzApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGE0ODUyM2RiNWRiNDJlNGEyOWQxOWMzYmMzMzEyMTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NTE0OTM5LC03OS4zNzU0MTc5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNjQyYzE3YTQ1OTQ3M2I4YWNkZTM0NmNhYzQ1ZjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2IzYTNmNWY3YmQ3YzRlMWE5YjkwNzJjZjlkZmYzNmRkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzkwOWMwNzYwNTk0ZTQ0NjViNjRhODc3MTJmYzkzMWE4ID0gJCgnPGRpdiBpZD0iaHRtbF85MDljMDc2MDU5NGU0NDY1YjY0YTg3NzEyZmM5MzFhOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3QuIEphbWVzIFRvd24sIERvd250b3duIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2IzYTNmNWY3YmQ3YzRlMWE5YjkwNzJjZjlkZmYzNmRkLnNldENvbnRlbnQoaHRtbF85MDljMDc2MDU5NGU0NDY1YjY0YTg3NzEyZmM5MzFhOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80YTQ4NTIzZGI1ZGI0MmU0YTI5ZDE5YzNiYzMzMTIxMi5iaW5kUG9wdXAocG9wdXBfYjNhM2Y1ZjdiZDdjNGUxYTliOTA3MmNmOWRmZjM2ZGQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTliYTQ5M2YyNjQwNGQ4MmI1OGQyODk3MmI1MWQ4YjYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42OTM3ODEzLC03OS40MjgxOTE0MDAwMDAwMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjY0MmMxN2E0NTk0NzNiOGFjZGUzNDZjYWM0NWYxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84OGZkYmU4ZmVkYjY0ZDY2ODMxMjUwYzkyN2U1YmVhNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lODg2M2Q2NTRlODE0NmNmODFkZDI4Y2ZhNWQ2ZDAwMiA9ICQoJzxkaXYgaWQ9Imh0bWxfZTg4NjNkNjU0ZTgxNDZjZjgxZGQyOGNmYTVkNmQwMDIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkh1bWV3b29kLUNlZGFydmFsZSwgWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODhmZGJlOGZlZGI2NGQ2NjgzMTI1MGM5MjdlNWJlYTYuc2V0Q29udGVudChodG1sX2U4ODYzZDY1NGU4MTQ2Y2Y4MWRkMjhjZmE1ZDZkMDAyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzU5YmE0OTNmMjY0MDRkODJiNThkMjg5NzJiNTFkOGI2LmJpbmRQb3B1cChwb3B1cF84OGZkYmU4ZmVkYjY0ZDY2ODMxMjUwYzkyN2U1YmVhNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81NGEzYmQ2ZDk5MGI0NDMxODYzYWNhMDQ0MjdlMWI2YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY0MzUxNTIsLTc5LjU3NzIwMDc5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNjQyYzE3YTQ1OTQ3M2I4YWNkZTM0NmNhYzQ1ZjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NhYTc3ZWU2ZmVjZTQxOGFhODdhM2U3OGM4MDEwY2U1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE1MmI0OTM4MWUxMjRhMDg4ODJkYjI0ZmY1MmQ3OWZhID0gJCgnPGRpdiBpZD0iaHRtbF8xNTJiNDkzODFlMTI0YTA4ODgyZGIyNGZmNTJkNzlmYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RXJpbmdhdGUgLCBCbG9vcmRhbGUgR2FyZGVucyAsIE9sZCBCdXJuaGFtdGhvcnBlICwgTWFya2xhbmQgV29vZCwgRXRvYmljb2tlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jYWE3N2VlNmZlY2U0MThhYTg3YTNlNzhjODAxMGNlNS5zZXRDb250ZW50KGh0bWxfMTUyYjQ5MzgxZTEyNGEwODg4MmRiMjRmZjUyZDc5ZmEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTRhM2JkNmQ5OTBiNDQzMTg2M2FjYTA0NDI3ZTFiNmEuYmluZFBvcHVwKHBvcHVwX2NhYTc3ZWU2ZmVjZTQxOGFhODdhM2U3OGM4MDEwY2U1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFhYWU3OTQ4MDEzODRhNDBiMjQ0OGQzMTk0ZjJhMjIzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzYzNTcyNiwtNzkuMTg4NzExNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjY0MmMxN2E0NTk0NzNiOGFjZGUzNDZjYWM0NWYxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85MmI1YzJjMjViNTg0MjJjYWI2Y2MwYjBhZDk3Njk2NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMzJkYWZhYzAzZTA0YzQyYTEwZDgzMzM2MzNhOThhMiA9ICQoJzxkaXYgaWQ9Imh0bWxfZjMyZGFmYWMwM2UwNGM0MmExMGQ4MzMzNjMzYTk4YTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkd1aWxkd29vZCAsIE1vcm5pbmdzaWRlICwgV2VzdCBIaWxsLCBTY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTJiNWMyYzI1YjU4NDIyY2FiNmNjMGIwYWQ5NzY5NjQuc2V0Q29udGVudChodG1sX2YzMmRhZmFjMDNlMDRjNDJhMTBkODMzMzYzM2E5OGEyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzFhYWU3OTQ4MDEzODRhNDBiMjQ0OGQzMTk0ZjJhMjIzLmJpbmRQb3B1cChwb3B1cF85MmI1YzJjMjViNTg0MjJjYWI2Y2MwYjBhZDk3Njk2NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jZjk0ZGY4MTRmYjU0M2JiYjkwMTM0ODQyNjFlNzcxZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY3NjM1NzM5OTk5OTk5LC03OS4yOTMwMzEyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNjQyYzE3YTQ1OTQ3M2I4YWNkZTM0NmNhYzQ1ZjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I0MTdjYzQ4ZTU2ZDRkODM5NjFiYTkwNzY4ODgzMGQxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJmYjcyNDIzZWQyODRlY2FhN2M4ODdmNzk2MjU2MTRjID0gJCgnPGRpdiBpZD0iaHRtbF8yZmI3MjQyM2VkMjg0ZWNhYTdjODg3Zjc5NjI1NjE0YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VGhlIEJlYWNoZXMsIEVhc3QgVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjQxN2NjNDhlNTZkNGQ4Mzk2MWJhOTA3Njg4ODMwZDEuc2V0Q29udGVudChodG1sXzJmYjcyNDIzZWQyODRlY2FhN2M4ODdmNzk2MjU2MTRjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NmOTRkZjgxNGZiNTQzYmJiOTAxMzQ4NDI2MWU3NzFlLmJpbmRQb3B1cChwb3B1cF9iNDE3Y2M0OGU1NmQ0ZDgzOTYxYmE5MDc2ODg4MzBkMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yMjFjNTgxYTcyODI0NWJlYTU5NDRjOWYzYzQ0NjdkMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY0NDc3MDc5OTk5OTk5NiwtNzkuMzczMzA2NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjY0MmMxN2E0NTk0NzNiOGFjZGUzNDZjYWM0NWYxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yZWM3MmVjNzY0MzQ0ZWEzYTUyNjllNWE0OWZlODNmYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83MDg3NTQ3ZTI0Mjk0YjI1ODdiMWU1ZjdhMDc5Yjc3MCA9ICQoJzxkaXYgaWQ9Imh0bWxfNzA4NzU0N2UyNDI5NGIyNTg3YjFlNWY3YTA3OWI3NzAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJlcmN6eSBQYXJrLCBEb3dudG93biBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZWM3MmVjNzY0MzQ0ZWEzYTUyNjllNWE0OWZlODNmYi5zZXRDb250ZW50KGh0bWxfNzA4NzU0N2UyNDI5NGIyNTg3YjFlNWY3YTA3OWI3NzApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjIxYzU4MWE3MjgyNDViZWE1OTQ0YzlmM2M0NDY3ZDIuYmluZFBvcHVwKHBvcHVwXzJlYzcyZWM3NjQzNDRlYTNhNTI2OWU1YTQ5ZmU4M2ZiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RhMTA5YjZjZTdkMDQ3NTNhZDI3YTY0OWM4NjJmMDFjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjg5MDI1NiwtNzkuNDUzNTEyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNjQyYzE3YTQ1OTQ3M2I4YWNkZTM0NmNhYzQ1ZjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y5ZWZiZmM1NGE0ZDRjNTY4MDgyZGY2MTI0NmU1ZWM0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBkZmJiYmVmY2RjNjRhMzE4ZDhiYzAxOTdhZjk0NmNkID0gJCgnPGRpdiBpZD0iaHRtbF8wZGZiYmJlZmNkYzY0YTMxOGQ4YmMwMTk3YWY5NDZjZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2FsZWRvbmlhLUZhaXJiYW5rcywgWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjllZmJmYzU0YTRkNGM1NjgwODJkZjYxMjQ2ZTVlYzQuc2V0Q29udGVudChodG1sXzBkZmJiYmVmY2RjNjRhMzE4ZDhiYzAxOTdhZjk0NmNkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RhMTA5YjZjZTdkMDQ3NTNhZDI3YTY0OWM4NjJmMDFjLmJpbmRQb3B1cChwb3B1cF9mOWVmYmZjNTRhNGQ0YzU2ODA4MmRmNjEyNDZlNWVjNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zOTY3NzMyZDFhYjg0MzVkYjZiOWIyMzNlMWM1ZTc0YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc3MDk5MjEsLTc5LjIxNjkxNzQwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNjQyYzE3YTQ1OTQ3M2I4YWNkZTM0NmNhYzQ1ZjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzEyYmE0MzI0MzM5ZDQwMGRiZDZlNGUxOTUzMGE2NGIzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVhMWNmMjdhYjQyNTRlYWRiOGYxNjZkZTA0MzZiZGMwID0gJCgnPGRpdiBpZD0iaHRtbF81YTFjZjI3YWI0MjU0ZWFkYjhmMTY2ZGUwNDM2YmRjMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V29idXJuLCBTY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTJiYTQzMjQzMzlkNDAwZGJkNmU0ZTE5NTMwYTY0YjMuc2V0Q29udGVudChodG1sXzVhMWNmMjdhYjQyNTRlYWRiOGYxNjZkZTA0MzZiZGMwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzM5Njc3MzJkMWFiODQzNWRiNmI5YjIzM2UxYzVlNzRjLmJpbmRQb3B1cChwb3B1cF8xMmJhNDMyNDMzOWQ0MDBkYmQ2ZTRlMTk1MzBhNjRiMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kZjhlODkwNTBkYzM0MGE5YWVmMDc2ZWY1ZWJiN2MxZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcwOTA2MDQsLTc5LjM2MzQ1MTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI2NDJjMTdhNDU5NDczYjhhY2RlMzQ2Y2FjNDVmMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDBiNGMxMjg3NGJiNDljMjg5YWM3ODFiYjZkMWZjYTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjBmYzUzZDcyMzAyNDJjYjg3Zjk2M2MwZjhmNzlmYWUgPSAkKCc8ZGl2IGlkPSJodG1sXzYwZmM1M2Q3MjMwMjQyY2I4N2Y5NjNjMGY4Zjc5ZmFlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MZWFzaWRlLCBFYXN0IFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAwYjRjMTI4NzRiYjQ5YzI4OWFjNzgxYmI2ZDFmY2E0LnNldENvbnRlbnQoaHRtbF82MGZjNTNkNzIzMDI0MmNiODdmOTYzYzBmOGY3OWZhZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kZjhlODkwNTBkYzM0MGE5YWVmMDc2ZWY1ZWJiN2MxZS5iaW5kUG9wdXAocG9wdXBfMDBiNGMxMjg3NGJiNDljMjg5YWM3ODFiYjZkMWZjYTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWEyNmNkMjc1YjcwNDRiYzlkNmVlNjVlZjUzOGY5OGUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NTc5NTI0LC03OS4zODczODI2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNjQyYzE3YTQ1OTQ3M2I4YWNkZTM0NmNhYzQ1ZjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzcwMWM5NzM3MmU0MDQxNWFiYTI1ZGQ0N2Q4ZDMwMzUxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2QzMzcyNGIyNWI5MzQ3MGM4OTEzYjE1OTg5Yzk0YjQ2ID0gJCgnPGRpdiBpZD0iaHRtbF9kMzM3MjRiMjViOTM0NzBjODkxM2IxNTk4OWM5NGI0NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2VudHJhbCBCYXkgU3RyZWV0LCBEb3dudG93biBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83MDFjOTczNzJlNDA0MTVhYmEyNWRkNDdkOGQzMDM1MS5zZXRDb250ZW50KGh0bWxfZDMzNzI0YjI1YjkzNDcwYzg5MTNiMTU5ODljOTRiNDYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWEyNmNkMjc1YjcwNDRiYzlkNmVlNjVlZjUzOGY5OGUuYmluZFBvcHVwKHBvcHVwXzcwMWM5NzM3MmU0MDQxNWFiYTI1ZGQ0N2Q4ZDMwMzUxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBlOGY5YjZhYzRkODRjMjliZTM4Yzc5NGM3OTNiOGE4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjY5NTQyLC03OS40MjI1NjM3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNjQyYzE3YTQ1OTQ3M2I4YWNkZTM0NmNhYzQ1ZjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMwY2NjOWQ3OGI0YzQ0MjJhODhiMWY1N2E5MTM1YjE3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzkzMmFmYjM3YzU0YTQyNWRiOGVkM2QyZGM5MjkwZTVlID0gJCgnPGRpdiBpZD0iaHRtbF85MzJhZmIzN2M1NGE0MjVkYjhlZDNkMmRjOTI5MGU1ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2hyaXN0aWUsIERvd250b3duIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMwY2NjOWQ3OGI0YzQ0MjJhODhiMWY1N2E5MTM1YjE3LnNldENvbnRlbnQoaHRtbF85MzJhZmIzN2M1NGE0MjVkYjhlZDNkMmRjOTI5MGU1ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wZThmOWI2YWM0ZDg0YzI5YmUzOGM3OTRjNzkzYjhhOC5iaW5kUG9wdXAocG9wdXBfMzBjY2M5ZDc4YjRjNDQyMmE4OGIxZjU3YTkxMzViMTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGQ3MmYwYTJmNWQ3NGNhYTkyZDk4MTI0MDUyMjQ3YzggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NzMxMzYsLTc5LjIzOTQ3NjA5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNjQyYzE3YTQ1OTQ3M2I4YWNkZTM0NmNhYzQ1ZjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJhMDJhNDI5NWRhYjRmMzZiZTM2OGEwZjRmZmU4MTg2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNjNjRiMzhkOWU5MjQ4NDY5MGZmMzY2ZWUzZWNiYTMwID0gJCgnPGRpdiBpZD0iaHRtbF8zYzY0YjM4ZDllOTI0ODQ2OTBmZjM2NmVlM2VjYmEzMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2VkYXJicmFlLCBTY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmEwMmE0Mjk1ZGFiNGYzNmJlMzY4YTBmNGZmZTgxODYuc2V0Q29udGVudChodG1sXzNjNjRiMzhkOWU5MjQ4NDY5MGZmMzY2ZWUzZWNiYTMwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhkNzJmMGEyZjVkNzRjYWE5MmQ5ODEyNDA1MjI0N2M4LmJpbmRQb3B1cChwb3B1cF8yYTAyYTQyOTVkYWI0ZjM2YmUzNjhhMGY0ZmZlODE4Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81MTA4MTVhYWRjYTY0YWVmYTFmZWIyODk1Zjg3ZTUzMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjgwMzc2MjIsLTc5LjM2MzQ1MTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI2NDJjMTdhNDU5NDczYjhhY2RlMzQ2Y2FjNDVmMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDIxMDExNjhkNWQ5NDczNmEyMjc3OTQ5YTU2ZmRiYzggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzlmM2ExMGNiZDYyNDg0ZTg3YWYxNjNmMzNjMDIyYmQgPSAkKCc8ZGl2IGlkPSJodG1sXzM5ZjNhMTBjYmQ2MjQ4NGU4N2FmMTYzZjMzYzAyMmJkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IaWxsY3Jlc3QgVmlsbGFnZSwgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDIxMDExNjhkNWQ5NDczNmEyMjc3OTQ5YTU2ZmRiYzguc2V0Q29udGVudChodG1sXzM5ZjNhMTBjYmQ2MjQ4NGU4N2FmMTYzZjMzYzAyMmJkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzUxMDgxNWFhZGNhNjRhZWZhMWZlYjI4OTVmODdlNTMyLmJpbmRQb3B1cChwb3B1cF9kMjEwMTE2OGQ1ZDk0NzM2YTIyNzc5NDlhNTZmZGJjOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84YjYwZjliZTg5MWY0NWYwODJmNmYwZDBkMDdiODE0MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc1NDMyODMsLTc5LjQ0MjI1OTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI2NDJjMTdhNDU5NDczYjhhY2RlMzQ2Y2FjNDVmMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTVkODhlODZhZTk0NGU2YmIxNDM0YmI5ODI3NzEzMzQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGMwMWEzMjI2Njg0NGFhODhiYTE1OWM2NGU0ZTdjZTMgPSAkKCc8ZGl2IGlkPSJodG1sXzBjMDFhMzIyNjY4NDRhYTg4YmExNTljNjRlNGU3Y2UzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CYXRodXJzdCBNYW5vciAsIFdpbHNvbiBIZWlnaHRzICwgRG93bnN2aWV3IE5vcnRoLCBOb3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NWQ4OGU4NmFlOTQ0ZTZiYjE0MzRiYjk4Mjc3MTMzNC5zZXRDb250ZW50KGh0bWxfMGMwMWEzMjI2Njg0NGFhODhiYTE1OWM2NGU0ZTdjZTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGI2MGY5YmU4OTFmNDVmMDgyZjZmMGQwZDA3YjgxNDIuYmluZFBvcHVwKHBvcHVwXzk1ZDg4ZTg2YWU5NDRlNmJiMTQzNGJiOTgyNzcxMzM0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA1MTU5Njk5NzYwOTRkOTg5NWRlYTU0ZDgwNDM3MTY0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzA1MzY4OSwtNzkuMzQ5MzcxOTAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI2NDJjMTdhNDU5NDczYjhhY2RlMzQ2Y2FjNDVmMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzdiMGU3ZDNiNDhiNGUzZGFkMjAwNTVhZDc5ZDQ2NGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzhmN2JkY2MxN2IyNDRmZDhmMzZjOGIxMmE4N2YyODIgPSAkKCc8ZGl2IGlkPSJodG1sXzc4ZjdiZGNjMTdiMjQ0ZmQ4ZjM2YzhiMTJhODdmMjgyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UaG9ybmNsaWZmZSBQYXJrLCBFYXN0IFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc3YjBlN2QzYjQ4YjRlM2RhZDIwMDU1YWQ3OWQ0NjRjLnNldENvbnRlbnQoaHRtbF83OGY3YmRjYzE3YjI0NGZkOGYzNmM4YjEyYTg3ZjI4Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wNTE1OTY5OTc2MDk0ZDk4OTVkZWE1NGQ4MDQzNzE2NC5iaW5kUG9wdXAocG9wdXBfNzdiMGU3ZDNiNDhiNGUzZGFkMjAwNTVhZDc5ZDQ2NGMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTk4YTVmODA0MWQ3NGVhZWJhMjQ2MmNjZjdiMTg2OTEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NTA1NzEyMDAwMDAwMSwtNzkuMzg0NTY3NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjY0MmMxN2E0NTk0NzNiOGFjZGUzNDZjYWM0NWYxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jNDkyZDQ1NmZlZDY0MjFhOWFiNGZjZWJjZmZhNDYyOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lY2I3NmEzNTVhMzY0YTAyYWQxMTY1MDNhMjRiMTFlYyA9ICQoJzxkaXYgaWQ9Imh0bWxfZWNiNzZhMzU1YTM2NGEwMmFkMTE2NTAzYTI0YjExZWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJpY2htb25kICwgQWRlbGFpZGUgLCBLaW5nLCBEb3dudG93biBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNDkyZDQ1NmZlZDY0MjFhOWFiNGZjZWJjZmZhNDYyOS5zZXRDb250ZW50KGh0bWxfZWNiNzZhMzU1YTM2NGEwMmFkMTE2NTAzYTI0YjExZWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTk4YTVmODA0MWQ3NGVhZWJhMjQ2MmNjZjdiMTg2OTEuYmluZFBvcHVwKHBvcHVwX2M0OTJkNDU2ZmVkNjQyMWE5YWI0ZmNlYmNmZmE0NjI5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzcwMWJjMWVlNWQ0NTQwYjNhZWU4MjA2ZjlkOWY4MDkwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjY5MDA1MTAwMDAwMDEsLTc5LjQ0MjI1OTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI2NDJjMTdhNDU5NDczYjhhY2RlMzQ2Y2FjNDVmMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGVhOTVkYTE4ODk5NDZmYThjYjQxYjg4MzhiMWM0NjQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODlmMWI5NjEyOTZjNGE4YWI5NmI3MWJkOThkM2FlYWEgPSAkKCc8ZGl2IGlkPSJodG1sXzg5ZjFiOTYxMjk2YzRhOGFiOTZiNzFiZDk4ZDNhZWFhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EdWZmZXJpbiAsIERvdmVyY291cnQgVmlsbGFnZSwgV2VzdCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kZWE5NWRhMTg4OTk0NmZhOGNiNDFiODgzOGIxYzQ2NC5zZXRDb250ZW50KGh0bWxfODlmMWI5NjEyOTZjNGE4YWI5NmI3MWJkOThkM2FlYWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzAxYmMxZWU1ZDQ1NDBiM2FlZTgyMDZmOWQ5ZjgwOTAuYmluZFBvcHVwKHBvcHVwX2RlYTk1ZGExODg5OTQ2ZmE4Y2I0MWI4ODM4YjFjNDY0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FmOWFmNGFhZjUxZDQwOTBiY2NkYzZiZTk5ZDU2ZjY3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzQ0NzM0MiwtNzkuMjM5NDc2MDk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI2NDJjMTdhNDU5NDczYjhhY2RlMzQ2Y2FjNDVmMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTI1N2VmZmViZTM1NDJmY2JjNjI1MDU0ZGU5MTM2MmMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWM4NTg4MmViZWRhNDcwMjlkNDJmODE5YWIzYjMyZDIgPSAkKCc8ZGl2IGlkPSJodG1sXzVjODU4ODJlYmVkYTQ3MDI5ZDQyZjgxOWFiM2IzMmQyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TY2FyYm9yb3VnaCBWaWxsYWdlLCBTY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTI1N2VmZmViZTM1NDJmY2JjNjI1MDU0ZGU5MTM2MmMuc2V0Q29udGVudChodG1sXzVjODU4ODJlYmVkYTQ3MDI5ZDQyZjgxOWFiM2IzMmQyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2FmOWFmNGFhZjUxZDQwOTBiY2NkYzZiZTk5ZDU2ZjY3LmJpbmRQb3B1cChwb3B1cF81MjU3ZWZmZWJlMzU0MmZjYmM2MjUwNTRkZTkxMzYyYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81NWI4NDk3MGEwZjY0NTRkODQ3YzMwMTIyMWY3NmRmZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc3ODUxNzUsLTc5LjM0NjU1NTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI2NDJjMTdhNDU5NDczYjhhY2RlMzQ2Y2FjNDVmMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDg2ZTk0MjFmMTcwNDkwZWIxNzg0OGM1ZWQwN2MwYzcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2ZlYmNjZDRhMTRjNGM2Y2FhZjZiNzRiNmM0YzRjZTggPSAkKCc8ZGl2IGlkPSJodG1sXzdmZWJjY2Q0YTE0YzRjNmNhYWY2Yjc0YjZjNGM0Y2U4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GYWlydmlldyAsIEhlbnJ5IEZhcm0gLCBPcmlvbGUsIE5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q4NmU5NDIxZjE3MDQ5MGViMTc4NDhjNWVkMDdjMGM3LnNldENvbnRlbnQoaHRtbF83ZmViY2NkNGExNGM0YzZjYWFmNmI3NGI2YzRjNGNlOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81NWI4NDk3MGEwZjY0NTRkODQ3YzMwMTIyMWY3NmRmZi5iaW5kUG9wdXAocG9wdXBfZDg2ZTk0MjFmMTcwNDkwZWIxNzg0OGM1ZWQwN2MwYzcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODU4ZjMxMzExZTlhNGU4Y2I5YmM2ZTc4YjhmMjUyMzIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43Njc5ODAzLC03OS40ODcyNjE5MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjY0MmMxN2E0NTk0NzNiOGFjZGUzNDZjYWM0NWYxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xYWQwNTRjNDUwNzI0N2UyODIwZjNiY2MxYjRiMjcxNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hYmEzZmIzYzgyOWI0M2I4ODQyODRlOWJlMzBjN2EzYyA9ICQoJzxkaXYgaWQ9Imh0bWxfYWJhM2ZiM2M4MjliNDNiODg0Mjg0ZTliZTMwYzdhM2MiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5vcnRod29vZCBQYXJrICwgWW9yayBVbml2ZXJzaXR5LCBOb3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xYWQwNTRjNDUwNzI0N2UyODIwZjNiY2MxYjRiMjcxNy5zZXRDb250ZW50KGh0bWxfYWJhM2ZiM2M4MjliNDNiODg0Mjg0ZTliZTMwYzdhM2MpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODU4ZjMxMzExZTlhNGU4Y2I5YmM2ZTc4YjhmMjUyMzIuYmluZFBvcHVwKHBvcHVwXzFhZDA1NGM0NTA3MjQ3ZTI4MjBmM2JjYzFiNGIyNzE3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ4NWQzZTMxNTdlZTRkMGFiOTJlY2Y3NTM4NjliMzhiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjg1MzQ3LC03OS4zMzgxMDY1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNjQyYzE3YTQ1OTQ3M2I4YWNkZTM0NmNhYzQ1ZjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZkOTgxOTdkN2IyZDQ3YTFiYzcwOWI4MWI0MTJhOGNmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYyNWU0NTU5NTI2YjRiODViYzdkYmU2MWMwNTg3MjE5ID0gJCgnPGRpdiBpZD0iaHRtbF82MjVlNDU1OTUyNmI0Yjg1YmM3ZGJlNjFjMDU4NzIxOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWFzdCBUb3JvbnRvLCBFYXN0IFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZkOTgxOTdkN2IyZDQ3YTFiYzcwOWI4MWI0MTJhOGNmLnNldENvbnRlbnQoaHRtbF82MjVlNDU1OTUyNmI0Yjg1YmM3ZGJlNjFjMDU4NzIxOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80ODVkM2UzMTU3ZWU0ZDBhYjkyZWNmNzUzODY5YjM4Yi5iaW5kUG9wdXAocG9wdXBfZmQ5ODE5N2Q3YjJkNDdhMWJjNzA5YjgxYjQxMmE4Y2YpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZThlMjNiZTllMDBlNDBkZmEwZWNjODIyN2M0ZDg0MTQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NDA4MTU3LC03OS4zODE3NTIyOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjY0MmMxN2E0NTk0NzNiOGFjZGUzNDZjYWM0NWYxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82MzQ5MmU3NWQ4MDM0NTg5YTFmODgwMmZmMDVhMGFlNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82NGJiNTZkYzE4ODY0NTFmOGI1MGM3MjJlNDRiMjM1MCA9ICQoJzxkaXYgaWQ9Imh0bWxfNjRiYjU2ZGMxODg2NDUxZjhiNTBjNzIyZTQ0YjIzNTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhhcmJvdXJmcm9udCBFYXN0ICwgVW5pb24gU3RhdGlvbiAsIFRvcm9udG8gSXNsYW5kcywgRG93bnRvd24gVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjM0OTJlNzVkODAzNDU4OWExZjg4MDJmZjA1YTBhZTQuc2V0Q29udGVudChodG1sXzY0YmI1NmRjMTg4NjQ1MWY4YjUwYzcyMmU0NGIyMzUwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U4ZTIzYmU5ZTAwZTQwZGZhMGVjYzgyMjdjNGQ4NDE0LmJpbmRQb3B1cChwb3B1cF82MzQ5MmU3NWQ4MDM0NTg5YTFmODgwMmZmMDVhMGFlNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kNzY0OWE1MmNmZDI0NDk2OGJlZDhlNWUxYWI5NWQ3NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY0NzkyNjcwMDAwMDAwNiwtNzkuNDE5NzQ5N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjY0MmMxN2E0NTk0NzNiOGFjZGUzNDZjYWM0NWYxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xYzVhZDJiYzEzMDc0ZDQ0YmVlYTBiOTFhMWEyYThkMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yZTU4MWEzMWZiZGM0OTViOGQyNjY0MTVmMGVjNDJiNSA9ICQoJzxkaXYgaWQ9Imh0bWxfMmU1ODFhMzFmYmRjNDk1YjhkMjY2NDE1ZjBlYzQyYjUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxpdHRsZSBQb3J0dWdhbCAsIFRyaW5pdHksIFdlc3QgVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWM1YWQyYmMxMzA3NGQ0NGJlZWEwYjkxYTFhMmE4ZDMuc2V0Q29udGVudChodG1sXzJlNTgxYTMxZmJkYzQ5NWI4ZDI2NjQxNWYwZWM0MmI1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q3NjQ5YTUyY2ZkMjQ0OTY4YmVkOGU1ZTFhYjk1ZDc1LmJpbmRQb3B1cChwb3B1cF8xYzVhZDJiYzEzMDc0ZDQ0YmVlYTBiOTFhMWEyYThkMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yOTk5YmIxYWJhNDQ0YzNjYWU1MmY3OTUyZjM4NWE2NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcyNzkyOTIsLTc5LjI2MjAyOTQwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNjQyYzE3YTQ1OTQ3M2I4YWNkZTM0NmNhYzQ1ZjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJmNGY3NDQxNTg5ZjRjZGZiNGJkYjZiMWE4MjBhMDdhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NiOWUyYjA0MWQ2MTQyOTZhNjBiZThiNmI2NjA3MDVlID0gJCgnPGRpdiBpZD0iaHRtbF9jYjllMmIwNDFkNjE0Mjk2YTYwYmU4YjZiNjYwNzA1ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+S2VubmVkeSBQYXJrICwgSW9udmlldyAsIEVhc3QgQmlyY2htb3VudCBQYXJrLCBTY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmY0Zjc0NDE1ODlmNGNkZmI0YmRiNmIxYTgyMGEwN2Euc2V0Q29udGVudChodG1sX2NiOWUyYjA0MWQ2MTQyOTZhNjBiZThiNmI2NjA3MDVlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI5OTliYjFhYmE0NDRjM2NhZTUyZjc5NTJmMzg1YTY1LmJpbmRQb3B1cChwb3B1cF8yZjRmNzQ0MTU4OWY0Y2RmYjRiZGI2YjFhODIwYTA3YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80YWY5YTMzMzEyODM0ZDEwYTdlYmQwMWVkNzc3MTQ5NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc4Njk0NzMsLTc5LjM4NTk3NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjY0MmMxN2E0NTk0NzNiOGFjZGUzNDZjYWM0NWYxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iODZhYmYwNDIwZmY0NmU0YTE3YzllZGJlYjViMTkxMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMDM4ZGIwMTUwOGI0OTdjYWFiYzgwZThiZDBjZjE5MyA9ICQoJzxkaXYgaWQ9Imh0bWxfZDAzOGRiMDE1MDhiNDk3Y2FhYmM4MGU4YmQwY2YxOTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJheXZpZXcgVmlsbGFnZSwgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjg2YWJmMDQyMGZmNDZlNGExN2M5ZWRiZWI1YjE5MTMuc2V0Q29udGVudChodG1sX2QwMzhkYjAxNTA4YjQ5N2NhYWJjODBlOGJkMGNmMTkzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzRhZjlhMzMzMTI4MzRkMTBhN2ViZDAxZWQ3NzcxNDk1LmJpbmRQb3B1cChwb3B1cF9iODZhYmYwNDIwZmY0NmU0YTE3YzllZGJlYjViMTkxMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83MzUzZWI3NjUyMjQ0M2ExODA1N2VjOThlYjQ1YmQ3NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjczNzQ3MzIwMDAwMDAwNCwtNzkuNDY0NzYzMjk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI2NDJjMTdhNDU5NDczYjhhY2RlMzQ2Y2FjNDVmMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjhiODk5MWZkNTQwNDcyMjg2ZmIwYjZjOWM0ZWVmZGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGJlODBkN2Q3ZGE3NGU4NWFmZWZhN2M0ZDUwZDVkMzUgPSAkKCc8ZGl2IGlkPSJodG1sXzRiZTgwZDdkN2RhNzRlODVhZmVmYTdjNGQ1MGQ1ZDM1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Eb3duc3ZpZXcsIE5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY4Yjg5OTFmZDU0MDQ3MjI4NmZiMGI2YzljNGVlZmRiLnNldENvbnRlbnQoaHRtbF80YmU4MGQ3ZDdkYTc0ZTg1YWZlZmE3YzRkNTBkNWQzNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83MzUzZWI3NjUyMjQ0M2ExODA1N2VjOThlYjQ1YmQ3NC5iaW5kUG9wdXAocG9wdXBfNjhiODk5MWZkNTQwNDcyMjg2ZmIwYjZjOWM0ZWVmZGIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmFkNjZhZDYyYzc0NDI0MWE3ODUzOWZkMjUzMDY0MWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42Nzk1NTcxLC03OS4zNTIxODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI2NDJjMTdhNDU5NDczYjhhY2RlMzQ2Y2FjNDVmMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTBmMGZlM2Y3MDZiNDkxY2E3NDYwOTA1YzVhOWI1NDYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTJjNTIyZjhiZTEwNGU3Mjg4MjRhNzliM2UxMjJjMmQgPSAkKCc8ZGl2IGlkPSJodG1sX2EyYzUyMmY4YmUxMDRlNzI4ODI0YTc5YjNlMTIyYzJkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UaGUgRGFuZm9ydGggV2VzdCAsIFJpdmVyZGFsZSwgRWFzdCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lMGYwZmUzZjcwNmI0OTFjYTc0NjA5MDVjNWE5YjU0Ni5zZXRDb250ZW50KGh0bWxfYTJjNTIyZjhiZTEwNGU3Mjg4MjRhNzliM2UxMjJjMmQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmFkNjZhZDYyYzc0NDI0MWE3ODUzOWZkMjUzMDY0MWMuYmluZFBvcHVwKHBvcHVwX2UwZjBmZTNmNzA2YjQ5MWNhNzQ2MDkwNWM1YTliNTQ2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FmMjc3MDEwNmIwNDQzOTk4MjNjZDhlNzdmMWJkZjRkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjQ3MTc2OCwtNzkuMzgxNTc2NDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI2NDJjMTdhNDU5NDczYjhhY2RlMzQ2Y2FjNDVmMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmQzMDM5NjFmNWRlNGUwZTk4OTA5NDYxMWQzYWM2NjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTM3OWEyMTk2MWQwNGEyYzk2YzI5ZTBiNjZkMDAzNmIgPSAkKCc8ZGl2IGlkPSJodG1sX2EzNzlhMjE5NjFkMDRhMmM5NmMyOWUwYjY2ZDAwMzZiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ub3JvbnRvIERvbWluaW9uIENlbnRyZSAsIERlc2lnbiBFeGNoYW5nZSwgRG93bnRvd24gVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmQzMDM5NjFmNWRlNGUwZTk4OTA5NDYxMWQzYWM2NjUuc2V0Q29udGVudChodG1sX2EzNzlhMjE5NjFkMDRhMmM5NmMyOWUwYjY2ZDAwMzZiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2FmMjc3MDEwNmIwNDQzOTk4MjNjZDhlNzdmMWJkZjRkLmJpbmRQb3B1cChwb3B1cF8yZDMwMzk2MWY1ZGU0ZTBlOTg5MDk0NjExZDNhYzY2NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mYjI1MDc4OTlhYzY0NDY1YmMyMjJhYTIwMWQ0YTU1MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjYzNjg0NzIsLTc5LjQyODE5MTQwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNjQyYzE3YTQ1OTQ3M2I4YWNkZTM0NmNhYzQ1ZjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y3NzViMTEyYjYxZTQ0MjNiOGJiZTY3YmU0ZjI4MzY0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzUyNWNiMThjNmFjYjQwYTA5NDkyMDc2ZTdkNGZmZWYwID0gJCgnPGRpdiBpZD0iaHRtbF81MjVjYjE4YzZhY2I0MGEwOTQ5MjA3NmU3ZDRmZmVmMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJvY2t0b24gLCBQYXJrZGFsZSBWaWxsYWdlICwgRXhoaWJpdGlvbiBQbGFjZSwgV2VzdCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mNzc1YjExMmI2MWU0NDIzYjhiYmU2N2JlNGYyODM2NC5zZXRDb250ZW50KGh0bWxfNTI1Y2IxOGM2YWNiNDBhMDk0OTIwNzZlN2Q0ZmZlZjApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmIyNTA3ODk5YWM2NDQ2NWJjMjIyYWEyMDFkNGE1NTMuYmluZFBvcHVwKHBvcHVwX2Y3NzViMTEyYjYxZTQ0MjNiOGJiZTY3YmU0ZjI4MzY0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NmMzRmODBjM2ZkODQzYTZiODY5MjJmMmI4YTM3OTEwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzExMTExNzAwMDAwMDA0LC03OS4yODQ1NzcyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNjQyYzE3YTQ1OTQ3M2I4YWNkZTM0NmNhYzQ1ZjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E0MTEwOTk2ZmFkOTQzMGI5YWMyMzcwZmEyNWMxYjE1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JhMzlmZGNhYWJkYTQ0ZTZiN2I3OTA0Nzk2ZDI3MzRkID0gJCgnPGRpdiBpZD0iaHRtbF9iYTM5ZmRjYWFiZGE0NGU2YjdiNzkwNDc5NmQyNzM0ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+R29sZGVuIE1pbGUgLCBDbGFpcmxlYSAsIE9ha3JpZGdlLCBTY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTQxMTA5OTZmYWQ5NDMwYjlhYzIzNzBmYTI1YzFiMTUuc2V0Q29udGVudChodG1sX2JhMzlmZGNhYWJkYTQ0ZTZiN2I3OTA0Nzk2ZDI3MzRkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NmMzRmODBjM2ZkODQzYTZiODY5MjJmMmI4YTM3OTEwLmJpbmRQb3B1cChwb3B1cF9hNDExMDk5NmZhZDk0MzBiOWFjMjM3MGZhMjVjMWIxNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yN2YzNDdjMGQ1YTg0OWI5YjUxMzYzNzQ4MDNkYzhkMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc1NzQ5MDIsLTc5LjM3NDcxNDA5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNjQyYzE3YTQ1OTQ3M2I4YWNkZTM0NmNhYzQ1ZjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgyOGIyNjMzNTk4YTRmYWFiNTc2NTk4YjRhOWFhMDIxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q1NmUxM2MwNGQwMDQyYjBiMzYwYmQ0OTQxNzVmYzI0ID0gJCgnPGRpdiBpZD0iaHRtbF9kNTZlMTNjMDRkMDA0MmIwYjM2MGJkNDk0MTc1ZmMyNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WW9yayBNaWxscyAsIFNpbHZlciBIaWxscywgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODI4YjI2MzM1OThhNGZhYWI1NzY1OThiNGE5YWEwMjEuc2V0Q29udGVudChodG1sX2Q1NmUxM2MwNGQwMDQyYjBiMzYwYmQ0OTQxNzVmYzI0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI3ZjM0N2MwZDVhODQ5YjliNTEzNjM3NDgwM2RjOGQxLmJpbmRQb3B1cChwb3B1cF84MjhiMjYzMzU5OGE0ZmFhYjU3NjU5OGI0YTlhYTAyMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mODczYzRiMjlmMDQ0NWNjYTJiZjY0N2U3YmNlMzVlZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjczOTAxNDYsLTc5LjUwNjk0MzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI2NDJjMTdhNDU5NDczYjhhY2RlMzQ2Y2FjNDVmMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTRkNjM2Y2NkZTA5NDM1Njg3MGJlZWQ1MjljZmNiY2UgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzQ2MGZlODdmMTcwNDBkMzk2MzhhNTQ5NDk1M2I1NTQgPSAkKCc8ZGl2IGlkPSJodG1sXzc0NjBmZTg3ZjE3MDQwZDM5NjM4YTU0OTQ5NTNiNTU0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Eb3duc3ZpZXcsIE5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U0ZDYzNmNjZGUwOTQzNTY4NzBiZWVkNTI5Y2ZjYmNlLnNldENvbnRlbnQoaHRtbF83NDYwZmU4N2YxNzA0MGQzOTYzOGE1NDk0OTUzYjU1NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mODczYzRiMjlmMDQ0NWNjYTJiZjY0N2U3YmNlMzVlZS5iaW5kUG9wdXAocG9wdXBfZTRkNjM2Y2NkZTA5NDM1Njg3MGJlZWQ1MjljZmNiY2UpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTA0YzdlYjhmODQyNDQ2OTg0Y2RmNjE3MDUyZDdmZDAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42Njg5OTg1LC03OS4zMTU1NzE1OTk5OTk5OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjY0MmMxN2E0NTk0NzNiOGFjZGUzNDZjYWM0NWYxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lYThkODM0YzU5NGM0OGFlOThmMjhhNTUxZjYzYzg0NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83MDgwOTIxN2IyN2E0MjA2YmYwNzY5NjU5NzViY2E1ZiA9ICQoJzxkaXYgaWQ9Imh0bWxfNzA4MDkyMTdiMjdhNDIwNmJmMDc2OTY1OTc1YmNhNWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkluZGlhIEJhemFhciAsIFRoZSBCZWFjaGVzIFdlc3QsIEVhc3QgVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWE4ZDgzNGM1OTRjNDhhZTk4ZjI4YTU1MWY2M2M4NDYuc2V0Q29udGVudChodG1sXzcwODA5MjE3YjI3YTQyMDZiZjA3Njk2NTk3NWJjYTVmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzEwNGM3ZWI4Zjg0MjQ0Njk4NGNkZjYxNzA1MmQ3ZmQwLmJpbmRQb3B1cChwb3B1cF9lYThkODM0YzU5NGM0OGFlOThmMjhhNTUxZjYzYzg0Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82MjE0NmI4NmM0ZGI0YjkwODk4OTAyYjY1MWIxMDc3MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY0ODE5ODUsLTc5LjM3OTgxNjkwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNjQyYzE3YTQ1OTQ3M2I4YWNkZTM0NmNhYzQ1ZjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q3ZDVlNTY3YzA0MjRjNDE5MzUwY2ZkN2Q2NjIyNDNlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2QzZjI2NzI3MTAzNDQzZTc4NDI2NWM5MWQ4MWM5YTQ2ID0gJCgnPGRpdiBpZD0iaHRtbF9kM2YyNjcyNzEwMzQ0M2U3ODQyNjVjOTFkODFjOWE0NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q29tbWVyY2UgQ291cnQgLCBWaWN0b3JpYSBIb3RlbCwgRG93bnRvd24gVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDdkNWU1NjdjMDQyNGM0MTkzNTBjZmQ3ZDY2MjI0M2Uuc2V0Q29udGVudChodG1sX2QzZjI2NzI3MTAzNDQzZTc4NDI2NWM5MWQ4MWM5YTQ2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzYyMTQ2Yjg2YzRkYjRiOTA4OTg5MDJiNjUxYjEwNzczLmJpbmRQb3B1cChwb3B1cF9kN2Q1ZTU2N2MwNDI0YzQxOTM1MGNmZDdkNjYyMjQzZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81MDkyZDc3OGQxZDA0NDU4YTNmOTFjMDNmZjljYTg1OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcxMzc1NjIwMDAwMDAwNiwtNzkuNDkwMDczOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjY0MmMxN2E0NTk0NzNiOGFjZGUzNDZjYWM0NWYxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kYjA2ZWIxOGQ5YjM0Y2E0YTM3M2M1ZWQzNWQ2YzZlNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81MmYyNGI3MmE1MGE0Yjg4OThkYmYyNWJiMDg0MDU2NiA9ICQoJzxkaXYgaWQ9Imh0bWxfNTJmMjRiNzJhNTBhNGI4ODk4ZGJmMjViYjA4NDA1NjYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5vcnRoIFBhcmsgLCBNYXBsZSBMZWFmIFBhcmsgLCBVcHdvb2QgUGFyaywgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGIwNmViMThkOWIzNGNhNGEzNzNjNWVkMzVkNmM2ZTcuc2V0Q29udGVudChodG1sXzUyZjI0YjcyYTUwYTRiODg5OGRiZjI1YmIwODQwNTY2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzUwOTJkNzc4ZDFkMDQ0NThhM2Y5MWMwM2ZmOWNhODU5LmJpbmRQb3B1cChwb3B1cF9kYjA2ZWIxOGQ5YjM0Y2E0YTM3M2M1ZWQzNWQ2YzZlNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yYTY0NDViMGMxMjY0MzI1YTI5ODRlNGZiYzY5YjEwZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc1NjMwMzMsLTc5LjU2NTk2MzI5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNjQyYzE3YTQ1OTQ3M2I4YWNkZTM0NmNhYzQ1ZjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2UwYmJjODk3YjcxYTQzZmJhM2VhZDI1ODFjYjg2NDc0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q5NWQ1MGFiYmVlMjQxMGM5MDMxM2U5OGU1ZmMyZTlkID0gJCgnPGRpdiBpZD0iaHRtbF9kOTVkNTBhYmJlZTI0MTBjOTAzMTNlOThlNWZjMmU5ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SHVtYmVyIFN1bW1pdCwgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTBiYmM4OTdiNzFhNDNmYmEzZWFkMjU4MWNiODY0NzQuc2V0Q29udGVudChodG1sX2Q5NWQ1MGFiYmVlMjQxMGM5MDMxM2U5OGU1ZmMyZTlkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzJhNjQ0NWIwYzEyNjQzMjVhMjk4NGU0ZmJjNjliMTBmLmJpbmRQb3B1cChwb3B1cF9lMGJiYzg5N2I3MWE0M2ZiYTNlYWQyNTgxY2I4NjQ3NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83OTM5ODAwMDViOTg0Y2VjODQwYjVjYzJmZTVkZGI3YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcxNjMxNiwtNzkuMjM5NDc2MDk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI2NDJjMTdhNDU5NDczYjhhY2RlMzQ2Y2FjNDVmMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWJiMmE2YTcxZjZiNDk4N2FiNGQ2MTI1OGY3NTFlNTcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmUwZDE4ZDhjNWYzNGNkYTk1ZWNiOGYwZjZhMWI5YmMgPSAkKCc8ZGl2IGlkPSJodG1sX2ZlMGQxOGQ4YzVmMzRjZGE5NWVjYjhmMGY2YTFiOWJjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGlmZnNpZGUgLCBDbGlmZmNyZXN0ICwgU2NhcmJvcm91Z2ggVmlsbGFnZSBXZXN0LCBTY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWJiMmE2YTcxZjZiNDk4N2FiNGQ2MTI1OGY3NTFlNTcuc2V0Q29udGVudChodG1sX2ZlMGQxOGQ4YzVmMzRjZGE5NWVjYjhmMGY2YTFiOWJjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzc5Mzk4MDAwNWI5ODRjZWM4NDBiNWNjMmZlNWRkYjdhLmJpbmRQb3B1cChwb3B1cF9hYmIyYTZhNzFmNmI0OTg3YWI0ZDYxMjU4Zjc1MWU1Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85OWViNWMyOTg3ODk0MTA3ODg2N2IxOTdhM2M1OTAzZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc4OTA1MywtNzkuNDA4NDkyNzk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI2NDJjMTdhNDU5NDczYjhhY2RlMzQ2Y2FjNDVmMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmRmZWIwMjYwYjBlNGQ2YTlkYmNlYzI1OTUzMDE4NDYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDllNjg3ZWQxOWFjNGEyODgyOTJkNDkzY2YyNjNkMDkgPSAkKCc8ZGl2IGlkPSJodG1sX2Q5ZTY4N2VkMTlhYzRhMjg4MjkyZDQ5M2NmMjYzZDA5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XaWxsb3dkYWxlICwgTmV3dG9uYnJvb2ssIE5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZkZmViMDI2MGIwZTRkNmE5ZGJjZWMyNTk1MzAxODQ2LnNldENvbnRlbnQoaHRtbF9kOWU2ODdlZDE5YWM0YTI4ODI5MmQ0OTNjZjI2M2QwOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85OWViNWMyOTg3ODk0MTA3ODg2N2IxOTdhM2M1OTAzZi5iaW5kUG9wdXAocG9wdXBfNmRmZWIwMjYwYjBlNGQ2YTlkYmNlYzI1OTUzMDE4NDYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmFmYjkyOGY2ZTkyNDM3MmI5YmM4OWQ1MTk1ZDYzMjEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43Mjg0OTY0LC03OS40OTU2OTc0MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjY0MmMxN2E0NTk0NzNiOGFjZGUzNDZjYWM0NWYxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81NDE3MDJlZjQyYjI0NjViOGYxZjU5NjgzM2JjNzVhNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zYWZkNDdjYzIyNzI0ZTdiOTNiYmY1ZTZmOWM4MmFiMSA9ICQoJzxkaXYgaWQ9Imh0bWxfM2FmZDQ3Y2MyMjcyNGU3YjkzYmJmNWU2ZjljODJhYjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvd25zdmlldywgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTQxNzAyZWY0MmIyNDY1YjhmMWY1OTY4MzNiYzc1YTcuc2V0Q29udGVudChodG1sXzNhZmQ0N2NjMjI3MjRlN2I5M2JiZjVlNmY5YzgyYWIxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZhZmI5MjhmNmU5MjQzNzJiOWJjODlkNTE5NWQ2MzIxLmJpbmRQb3B1cChwb3B1cF81NDE3MDJlZjQyYjI0NjViOGYxZjU5NjgzM2JjNzVhNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yN2YwNGM5MjAwZTU0MTFhODE1ZmMxODQ4MzZlOGE5NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY1OTUyNTUsLTc5LjM0MDkyM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjY0MmMxN2E0NTk0NzNiOGFjZGUzNDZjYWM0NWYxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jMGYzYWQzNzQzZDE0NzRmODJkOGU3NDQyZDc2ZGIxMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jMzIzZmMyYjY1YWQ0YWEzOTg4ZTJhZDhkNTg1ZGZmNiA9ICQoJzxkaXYgaWQ9Imh0bWxfYzMyM2ZjMmI2NWFkNGFhMzk4OGUyYWQ4ZDU4NWRmZjYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN0dWRpbyBEaXN0cmljdCwgRWFzdCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jMGYzYWQzNzQzZDE0NzRmODJkOGU3NDQyZDc2ZGIxMC5zZXRDb250ZW50KGh0bWxfYzMyM2ZjMmI2NWFkNGFhMzk4OGUyYWQ4ZDU4NWRmZjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjdmMDRjOTIwMGU1NDExYTgxNWZjMTg0ODM2ZThhOTcuYmluZFBvcHVwKHBvcHVwX2MwZjNhZDM3NDNkMTQ3NGY4MmQ4ZTc0NDJkNzZkYjEwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU1NzI5YzUxYzI5MjRjNjQ4Y2UwYjFlZTQ1YmIxNGVmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzMzMjgyNSwtNzkuNDE5NzQ5N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjY0MmMxN2E0NTk0NzNiOGFjZGUzNDZjYWM0NWYxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jYzQwNmE0NDQ5NDk0NmM2YWJjNWE1YzBlMTZlYTkxZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zYWI5MDVlMjAzYTE0MDRiYjM0YjVmNmEzNmUwZmE2YSA9ICQoJzxkaXYgaWQ9Imh0bWxfM2FiOTA1ZTIwM2ExNDA0YmIzNGI1ZjZhMzZlMGZhNmEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJlZGZvcmQgUGFyayAsIExhd3JlbmNlIE1hbm9yIEVhc3QsIE5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NjNDA2YTQ0NDk0OTQ2YzZhYmM1YTVjMGUxNmVhOTFkLnNldENvbnRlbnQoaHRtbF8zYWI5MDVlMjAzYTE0MDRiYjM0YjVmNmEzNmUwZmE2YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81NTcyOWM1MWMyOTI0YzY0OGNlMGIxZWU0NWJiMTRlZi5iaW5kUG9wdXAocG9wdXBfY2M0MDZhNDQ0OTQ5NDZjNmFiYzVhNWMwZTE2ZWE5MWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjk0NDhjNDA3NTE4NGQ5NGExYWM4YmRjMmI2ZjU4NmQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42OTExMTU4LC03OS40NzYwMTMyOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjY0MmMxN2E0NTk0NzNiOGFjZGUzNDZjYWM0NWYxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84ZGJjZmExN2RmNjA0ZDNjYjM2NDI1NmM3M2YyY2M3YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85YTc1MTFhYTM1NWI0YmRmOTFiMjk1NjBmOWE5YmVlZiA9ICQoJzxkaXYgaWQ9Imh0bWxfOWE3NTExYWEzNTViNGJkZjkxYjI5NTYwZjlhOWJlZWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRlbCBSYXkgLCBNb3VudCBEZW5uaXMgLCBLZWVsc2RhbGUgYW5kIFNpbHZlcnRob3JuLCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84ZGJjZmExN2RmNjA0ZDNjYjM2NDI1NmM3M2YyY2M3Yy5zZXRDb250ZW50KGh0bWxfOWE3NTExYWEzNTViNGJkZjkxYjI5NTYwZjlhOWJlZWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjk0NDhjNDA3NTE4NGQ5NGExYWM4YmRjMmI2ZjU4NmQuYmluZFBvcHVwKHBvcHVwXzhkYmNmYTE3ZGY2MDRkM2NiMzY0MjU2YzczZjJjYzdjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY5MmZiNzMzNGRmNzRjYTJiMWNlYjQ1MTc1YzY1ZjA2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzI0NzY1OSwtNzkuNTMyMjQyNDAwMDAwMDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI2NDJjMTdhNDU5NDczYjhhY2RlMzQ2Y2FjNDVmMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjhkMDc3YWYwYTAyNGEyMTlmZjEwMTY0MDIwZWVhODEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjk4NjNlM2MzMTViNDFmYmE0MTY5OWI1NDI0YWFmNjIgPSAkKCc8ZGl2IGlkPSJodG1sX2Y5ODYzZTNjMzE1YjQxZmJhNDE2OTliNTQyNGFhZjYyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IdW1iZXJsZWEgLCBFbWVyeSwgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjhkMDc3YWYwYTAyNGEyMTlmZjEwMTY0MDIwZWVhODEuc2V0Q29udGVudChodG1sX2Y5ODYzZTNjMzE1YjQxZmJhNDE2OTliNTQyNGFhZjYyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY5MmZiNzMzNGRmNzRjYTJiMWNlYjQ1MTc1YzY1ZjA2LmJpbmRQb3B1cChwb3B1cF8yOGQwNzdhZjBhMDI0YTIxOWZmMTAxNjQwMjBlZWE4MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lY2ZjOWQzZTNlNmM0YTIwYWJkMmJhM2RjYjBkMTljYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY5MjY1NzAwMDAwMDAwNCwtNzkuMjY0ODQ4MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjY0MmMxN2E0NTk0NzNiOGFjZGUzNDZjYWM0NWYxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wMWRlMWI2NzUxOTI0Y2JkOTdiZWIwMWJkMjg1MDg4ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lYmM4NTYyODM5ZjQ0YTdjOWI5MzhhZmE3NGZmOTlhZSA9ICQoJzxkaXYgaWQ9Imh0bWxfZWJjODU2MjgzOWY0NGE3YzliOTM4YWZhNzRmZjk5YWUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJpcmNoIENsaWZmICwgQ2xpZmZzaWRlIFdlc3QsIFNjYXJib3JvdWdoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMWRlMWI2NzUxOTI0Y2JkOTdiZWIwMWJkMjg1MDg4ZC5zZXRDb250ZW50KGh0bWxfZWJjODU2MjgzOWY0NGE3YzliOTM4YWZhNzRmZjk5YWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWNmYzlkM2UzZTZjNGEyMGFiZDJiYTNkY2IwZDE5Y2IuYmluZFBvcHVwKHBvcHVwXzAxZGUxYjY3NTE5MjRjYmQ5N2JlYjAxYmQyODUwODhkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJmYTNjMzYxZWQ0YzQ0NDY5MzdiZmJmMmIzNTQwYmI3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzcwMTE5OSwtNzkuNDA4NDkyNzk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI2NDJjMTdhNDU5NDczYjhhY2RlMzQ2Y2FjNDVmMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzlkYmIzZWJiNGU5NDc5Mjg2YmE0YTExMTc3NDQ3MjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmEwODg3NzY5MWQxNDkzMzk4MjQ4YmQ1MWM1MjUyODAgPSAkKCc8ZGl2IGlkPSJodG1sX2ZhMDg4Nzc2OTFkMTQ5MzM5ODI0OGJkNTFjNTI1MjgwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XaWxsb3dkYWxlLCBOb3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83OWRiYjNlYmI0ZTk0NzkyODZiYTRhMTExNzc0NDcyNy5zZXRDb250ZW50KGh0bWxfZmEwODg3NzY5MWQxNDkzMzk4MjQ4YmQ1MWM1MjUyODApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmZhM2MzNjFlZDRjNDQ0NjkzN2JmYmYyYjM1NDBiYjcuYmluZFBvcHVwKHBvcHVwXzc5ZGJiM2ViYjRlOTQ3OTI4NmJhNGExMTE3NzQ0NzI3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdiNzhkN2ZhN2ZiYTQ1YjE4MmFjMzZmMjYyMTcwM2Q4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzYxNjMxMywtNzkuNTIwOTk5NDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI2NDJjMTdhNDU5NDczYjhhY2RlMzQ2Y2FjNDVmMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmFhNGQ1Mzg0OGMwNGE5OGI0MWUwZDkxMmIyMjQ2NjMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTkxMzYyYTBiZTdkNGZlODkwOGFkNzMyODgxOTNkODkgPSAkKCc8ZGl2IGlkPSJodG1sXzk5MTM2MmEwYmU3ZDRmZTg5MDhhZDczMjg4MTkzZDg5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Eb3duc3ZpZXcsIE5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZhYTRkNTM4NDhjMDRhOThiNDFlMGQ5MTJiMjI0NjYzLnNldENvbnRlbnQoaHRtbF85OTEzNjJhMGJlN2Q0ZmU4OTA4YWQ3MzI4ODE5M2Q4OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83Yjc4ZDdmYTdmYmE0NWIxODJhYzM2ZjI2MjE3MDNkOC5iaW5kUG9wdXAocG9wdXBfZmFhNGQ1Mzg0OGMwNGE5OGI0MWUwZDkxMmIyMjQ2NjMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmFjM2ZhMmIwOWY0NDk4MGFjOGEwZmZkYjhlMWE2MjcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MjgwMjA1LC03OS4zODg3OTAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNjQyYzE3YTQ1OTQ3M2I4YWNkZTM0NmNhYzQ1ZjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZmYWE0OGI0NDU4YzQ3YWZhOGUyYzUwZDRiMmJkMmVkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FiNjAzMjJhZDZjMTQwMGNhOWNlZmYxMWRjNzY1NjhiID0gJCgnPGRpdiBpZD0iaHRtbF9hYjYwMzIyYWQ2YzE0MDBjYTljZWZmMTFkYzc2NTY4YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGF3cmVuY2UgUGFyaywgQ2VudHJhbCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ZmFhNDhiNDQ1OGM0N2FmYThlMmM1MGQ0YjJiZDJlZC5zZXRDb250ZW50KGh0bWxfYWI2MDMyMmFkNmMxNDAwY2E5Y2VmZjExZGM3NjU2OGIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmFjM2ZhMmIwOWY0NDk4MGFjOGEwZmZkYjhlMWE2MjcuYmluZFBvcHVwKHBvcHVwXzZmYWE0OGI0NDU4YzQ3YWZhOGUyYzUwZDRiMmJkMmVkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBjMjVmMzA3ZmFiMjQxNGI5ZWE4NGJjNmU1NzA3OWMwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzExNjk0OCwtNzkuNDE2OTM1NTk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI2NDJjMTdhNDU5NDczYjhhY2RlMzQ2Y2FjNDVmMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzllMjQ3ZDE3OTBlNDdhZGE1ZWM5MmMxOGE0OTk5MTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmY2YmZiZTAzZWJiNGI1Njg0ZmIwYmQ3Njc5MjgxNzUgPSAkKCc8ZGl2IGlkPSJodG1sX2JmNmJmYmUwM2ViYjRiNTY4NGZiMGJkNzY3OTI4MTc1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Sb3NlbGF3biwgQ2VudHJhbCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jOWUyNDdkMTc5MGU0N2FkYTVlYzkyYzE4YTQ5OTkxMy5zZXRDb250ZW50KGh0bWxfYmY2YmZiZTAzZWJiNGI1Njg0ZmIwYmQ3Njc5MjgxNzUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMGMyNWYzMDdmYWIyNDE0YjllYTg0YmM2ZTU3MDc5YzAuYmluZFBvcHVwKHBvcHVwX2M5ZTI0N2QxNzkwZTQ3YWRhNWVjOTJjMThhNDk5OTEzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzMwMWRjOTJiYjViMDQxMmI4YjExYTgyNDRkYjM5MmU0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjczMTg1Mjk5OTk5OTksLTc5LjQ4NzI2MTkwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNjQyYzE3YTQ1OTQ3M2I4YWNkZTM0NmNhYzQ1ZjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2QyZDE1ZTkxNmFjNDQ3NWVhM2Y3YjZhYmRmMmIwZGZiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MwNGQ0MGE0YjM3NDQwMDNhMGViNWJkNjZmYzY5N2UzID0gJCgnPGRpdiBpZD0iaHRtbF9jMDRkNDBhNGIzNzQ0MDAzYTBlYjViZDY2ZmM2OTdlMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UnVubnltZWRlICwgVGhlIEp1bmN0aW9uIE5vcnRoLCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kMmQxNWU5MTZhYzQ0NzVlYTNmN2I2YWJkZjJiMGRmYi5zZXRDb250ZW50KGh0bWxfYzA0ZDQwYTRiMzc0NDAwM2EwZWI1YmQ2NmZjNjk3ZTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzAxZGM5MmJiNWIwNDEyYjhiMTFhODI0NGRiMzkyZTQuYmluZFBvcHVwKHBvcHVwX2QyZDE1ZTkxNmFjNDQ3NWVhM2Y3YjZhYmRmMmIwZGZiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2QwZjM1ZGY1OGUwMzQzNmU5MGI0MTI2ZjJjM2E3MDUwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzA2ODc2LC03OS41MTgxODg0MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjY0MmMxN2E0NTk0NzNiOGFjZGUzNDZjYWM0NWYxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zY2I2MDk2MDI5MjE0Y2MyOGE2YzkwZjFjNTM3OTVmMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83ZjU4MTdiNTZiNzE0ZjhlYTA5MWU4NjUwNzM5MDA4YiA9ICQoJzxkaXYgaWQ9Imh0bWxfN2Y1ODE3YjU2YjcxNGY4ZWEwOTFlODY1MDczOTAwOGIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldlc3RvbiwgWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2NiNjA5NjAyOTIxNGNjMjhhNmM5MGYxYzUzNzk1ZjAuc2V0Q29udGVudChodG1sXzdmNTgxN2I1NmI3MTRmOGVhMDkxZTg2NTA3MzkwMDhiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2QwZjM1ZGY1OGUwMzQzNmU5MGI0MTI2ZjJjM2E3MDUwLmJpbmRQb3B1cChwb3B1cF8zY2I2MDk2MDI5MjE0Y2MyOGE2YzkwZjFjNTM3OTVmMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iMGExZWFlZWZlMGU0ZjU5YTBmMzQ5MDhlOTY1YWE1NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc1NzQwOTYsLTc5LjI3MzMwNDAwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNjQyYzE3YTQ1OTQ3M2I4YWNkZTM0NmNhYzQ1ZjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFlNDgwY2JkN2MyNDQxNjRhMzg1N2I5OWNjMTc0MzZmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NjZDljMTg0Njg3ZTQyOWM5MjliZjg0ODU5MmY3MzNhID0gJCgnPGRpdiBpZD0iaHRtbF9jY2Q5YzE4NDY4N2U0MjljOTI5YmY4NDg1OTJmNzMzYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RG9yc2V0IFBhcmsgLCBXZXhmb3JkIEhlaWdodHMgLCBTY2FyYm9yb3VnaCBUb3duIENlbnRyZSwgU2NhcmJvcm91Z2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFlNDgwY2JkN2MyNDQxNjRhMzg1N2I5OWNjMTc0MzZmLnNldENvbnRlbnQoaHRtbF9jY2Q5YzE4NDY4N2U0MjljOTI5YmY4NDg1OTJmNzMzYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iMGExZWFlZWZlMGU0ZjU5YTBmMzQ5MDhlOTY1YWE1NS5iaW5kUG9wdXAocG9wdXBfMWU0ODBjYmQ3YzI0NDE2NGEzODU3Yjk5Y2MxNzQzNmYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2YyZDk5MTcyOTQ1NDU2MTk3YWRiMjBlMGJmZWI4YTQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NTI3NTgyOTk5OTk5OTYsLTc5LjQwMDA0OTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI2NDJjMTdhNDU5NDczYjhhY2RlMzQ2Y2FjNDVmMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTRlZDE2ODAxMDM0NDFlMDgwOTNjZDMxN2IzYzcyYTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2RmZWFlODNjZjcyNDc0ZTgzOWVkNmM1ZjViZGE5YmYgPSAkKCc8ZGl2IGlkPSJodG1sXzNkZmVhZTgzY2Y3MjQ3NGU4MzllZDZjNWY1YmRhOWJmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Zb3JrIE1pbGxzIFdlc3QsIE5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk0ZWQxNjgwMTAzNDQxZTA4MDkzY2QzMTdiM2M3MmE4LnNldENvbnRlbnQoaHRtbF8zZGZlYWU4M2NmNzI0NzRlODM5ZWQ2YzVmNWJkYTliZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83ZjJkOTkxNzI5NDU0NTYxOTdhZGIyMGUwYmZlYjhhNC5iaW5kUG9wdXAocG9wdXBfOTRlZDE2ODAxMDM0NDFlMDgwOTNjZDMxN2IzYzcyYTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjA2NDI1MWQ3OWM5NDI5YTkxOGFlMmZiN2IxNTUzYzYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MTI3NTExLC03OS4zOTAxOTc1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNjQyYzE3YTQ1OTQ3M2I4YWNkZTM0NmNhYzQ1ZjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQwNzQ0ZTdiNmRmMzRjNDdiNWI5NzBiYWRlNzZhM2EyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2QwYzQ0ZTk4YjlmMjRiNjE5MjMxYmQyZjBlNTg4YzA2ID0gJCgnPGRpdiBpZD0iaHRtbF9kMGM0NGU5OGI5ZjI0YjYxOTIzMWJkMmYwZTU4OGMwNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RGF2aXN2aWxsZSBOb3J0aCwgQ2VudHJhbCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MDc0NGU3YjZkZjM0YzQ3YjViOTcwYmFkZTc2YTNhMi5zZXRDb250ZW50KGh0bWxfZDBjNDRlOThiOWYyNGI2MTkyMzFiZDJmMGU1ODhjMDYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjA2NDI1MWQ3OWM5NDI5YTkxOGFlMmZiN2IxNTUzYzYuYmluZFBvcHVwKHBvcHVwXzQwNzQ0ZTdiNmRmMzRjNDdiNWI5NzBiYWRlNzZhM2EyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2QyMjAxNWI0ODJhMDQ0YzM4N2RiZDY5YTkyNDBiNzYxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjk2OTQ3NiwtNzkuNDExMzA3MjAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI2NDJjMTdhNDU5NDczYjhhY2RlMzQ2Y2FjNDVmMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDgwYWMzZmQ5ZmEzNDg2NDk3ODUwODU2NmNkYTRiZWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2I2MDg5MTU2YzBjNDFiMmFiNmQ1ODQxNzhlYTc0OWQgPSAkKCc8ZGl2IGlkPSJodG1sX2NiNjA4OTE1NmMwYzQxYjJhYjZkNTg0MTc4ZWE3NDlkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Gb3Jlc3QgSGlsbCBOb3J0aCAmYW1wOyBXZXN0LCBDZW50cmFsIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ4MGFjM2ZkOWZhMzQ4NjQ5Nzg1MDg1NjZjZGE0YmVhLnNldENvbnRlbnQoaHRtbF9jYjYwODkxNTZjMGM0MWIyYWI2ZDU4NDE3OGVhNzQ5ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kMjIwMTViNDgyYTA0NGMzODdkYmQ2OWE5MjQwYjc2MS5iaW5kUG9wdXAocG9wdXBfNDgwYWMzZmQ5ZmEzNDg2NDk3ODUwODU2NmNkYTRiZWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzQ0ZWMzNWJkZjM5NDczMGFlYzcwZjY4NmVlNDY0NTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NjE2MDgzLC03OS40NjQ3NjMyOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjY0MmMxN2E0NTk0NzNiOGFjZGUzNDZjYWM0NWYxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yNWUxYzU2NTI2Yjg0OGI1YmJlMTM4MjRkNTVhZThiOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMjlhMmRmNmU3MjY0NGU1OTkzMTIyZDBlOTM0YmMyNSA9ICQoJzxkaXYgaWQ9Imh0bWxfZDI5YTJkZjZlNzI2NDRlNTk5MzEyMmQwZTkzNGJjMjUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhpZ2ggUGFyayAsIFRoZSBKdW5jdGlvbiBTb3V0aCwgV2VzdCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yNWUxYzU2NTI2Yjg0OGI1YmJlMTM4MjRkNTVhZThiOC5zZXRDb250ZW50KGh0bWxfZDI5YTJkZjZlNzI2NDRlNTk5MzEyMmQwZTkzNGJjMjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzQ0ZWMzNWJkZjM5NDczMGFlYzcwZjY4NmVlNDY0NTcuYmluZFBvcHVwKHBvcHVwXzI1ZTFjNTY1MjZiODQ4YjViYmUxMzgyNGQ1NWFlOGI4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRiZTc5N2M3NGRmMzQxNWJhNjA2M2Y4ZGVhNzdmOTBjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjk2MzE5LC03OS41MzIyNDI0MDAwMDAwMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjY0MmMxN2E0NTk0NzNiOGFjZGUzNDZjYWM0NWYxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lZWRmMzg3OGIzNTI0NGUyOGI3YWU1OGY3NzI1ZWQ3YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83ZmVlMjg2OGMxMDE0MDZlOWI3OTc2MWViNzAwZDJkMCA9ICQoJzxkaXYgaWQ9Imh0bWxfN2ZlZTI4NjhjMTAxNDA2ZTliNzk3NjFlYjcwMGQyZDAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldlc3Rtb3VudCwgRXRvYmljb2tlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lZWRmMzg3OGIzNTI0NGUyOGI3YWU1OGY3NzI1ZWQ3Yi5zZXRDb250ZW50KGh0bWxfN2ZlZTI4NjhjMTAxNDA2ZTliNzk3NjFlYjcwMGQyZDApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGJlNzk3Yzc0ZGYzNDE1YmE2MDYzZjhkZWE3N2Y5MGMuYmluZFBvcHVwKHBvcHVwX2VlZGYzODc4YjM1MjQ0ZTI4YjdhZTU4Zjc3MjVlZDdiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk1NWJkYTg5YTEyZTQxZTg5YzJmNDFjZTQ4OGQwMWFhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzUwMDcxNTAwMDAwMDA0LC03OS4yOTU4NDkxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNjQyYzE3YTQ1OTQ3M2I4YWNkZTM0NmNhYzQ1ZjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E3Mjg4MTYyMDczZDQ3ZTliY2MwZjM5MjdiMzg1Zjg3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q5ZTg4YTdhNWVjNTQ0NzhiMTY0NjdkNTY5NDRiNzYwID0gJCgnPGRpdiBpZD0iaHRtbF9kOWU4OGE3YTVlYzU0NDc4YjE2NDY3ZDU2OTQ0Yjc2MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2V4Zm9yZCAsIE1hcnl2YWxlLCBTY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTcyODgxNjIwNzNkNDdlOWJjYzBmMzkyN2IzODVmODcuc2V0Q29udGVudChodG1sX2Q5ZTg4YTdhNWVjNTQ0NzhiMTY0NjdkNTY5NDRiNzYwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk1NWJkYTg5YTEyZTQxZTg5YzJmNDFjZTQ4OGQwMWFhLmJpbmRQb3B1cChwb3B1cF9hNzI4ODE2MjA3M2Q0N2U5YmNjMGYzOTI3YjM4NWY4Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zZTkwOWUzMWNhOGY0NjljOTNkYmY0YzU2OTFjMDY5NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc4MjczNjQsLTc5LjQ0MjI1OTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI2NDJjMTdhNDU5NDczYjhhY2RlMzQ2Y2FjNDVmMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzU4YWM5Njc5NDhmNGFlNzk3MWVlZjBmNzZiOGQzOTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTZiMDcxYTA5YTYwNDBjN2E1YzNmMmMwZWVjMjBiMDYgPSAkKCc8ZGl2IGlkPSJodG1sXzU2YjA3MWEwOWE2MDQwYzdhNWMzZjJjMGVlYzIwYjA2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XaWxsb3dkYWxlLCBOb3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNThhYzk2Nzk0OGY0YWU3OTcxZWVmMGY3NmI4ZDM5Ni5zZXRDb250ZW50KGh0bWxfNTZiMDcxYTA5YTYwNDBjN2E1YzNmMmMwZWVjMjBiMDYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2U5MDllMzFjYThmNDY5YzkzZGJmNGM1NjkxYzA2OTQuYmluZFBvcHVwKHBvcHVwX2M1OGFjOTY3OTQ4ZjRhZTc5NzFlZWYwZjc2YjhkMzk2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM5YjY0ZDUyZDk0MzQ1NDViNGVjYjE2Mzg3Y2M0ODBhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzE1MzgzNCwtNzkuNDA1Njc4NDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI2NDJjMTdhNDU5NDczYjhhY2RlMzQ2Y2FjNDVmMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTgwNThkNTM3MWYxNDhjMDhhMDMwZmQzYTcwMjA2NmYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWEyYWY3M2VmYzA2NGIyMmI5YzlkNWFkNzBiNTI3ZGIgPSAkKCc8ZGl2IGlkPSJodG1sXzlhMmFmNzNlZmMwNjRiMjJiOWM5ZDVhZDcwYjUyN2RiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob3J0aCBUb3JvbnRvIFdlc3QsIENlbnRyYWwgVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTgwNThkNTM3MWYxNDhjMDhhMDMwZmQzYTcwMjA2NmYuc2V0Q29udGVudChodG1sXzlhMmFmNzNlZmMwNjRiMjJiOWM5ZDVhZDcwYjUyN2RiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzM5YjY0ZDUyZDk0MzQ1NDViNGVjYjE2Mzg3Y2M0ODBhLmJpbmRQb3B1cChwb3B1cF8xODA1OGQ1MzcxZjE0OGMwOGEwMzBmZDNhNzAyMDY2Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84ZGI1ZjE2Y2U1OWQ0ZTVjYTUzZTg0MzY2ZTE5ZWNkMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY3MjcwOTcsLTc5LjQwNTY3ODQwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNjQyYzE3YTQ1OTQ3M2I4YWNkZTM0NmNhYzQ1ZjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY5MGI5MjgyNWE5NTRiMWFhOGIwYzY4MzYxYTJjMDYzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRlOTQxZDgyY2M0NTQwZmQ4ZTlhYjI2NzIzODBmMjY0ID0gJCgnPGRpdiBpZD0iaHRtbF80ZTk0MWQ4MmNjNDU0MGZkOGU5YWIyNjcyMzgwZjI2NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VGhlIEFubmV4ICwgTm9ydGggTWlkdG93biAsIFlvcmt2aWxsZSwgQ2VudHJhbCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82OTBiOTI4MjVhOTU0YjFhYThiMGM2ODM2MWEyYzA2My5zZXRDb250ZW50KGh0bWxfNGU5NDFkODJjYzQ1NDBmZDhlOWFiMjY3MjM4MGYyNjQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGRiNWYxNmNlNTlkNGU1Y2E1M2U4NDM2NmUxOWVjZDIuYmluZFBvcHVwKHBvcHVwXzY5MGI5MjgyNWE5NTRiMWFhOGIwYzY4MzYxYTJjMDYzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U0M2VmNThkN2RiODQ3ZjE4YWVjYTEyZmNhZTVlOGE4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjQ4OTU5NywtNzkuNDU2MzI1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNjQyYzE3YTQ1OTQ3M2I4YWNkZTM0NmNhYzQ1ZjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgxZjI1MWRiMzQ5ZTQwYWY5ODhmODE4MDFkNjk5YzQ1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYyOTczYTZmYmI5ZTQ2ODBiYTZhZjEyODE5Mzk1NjE2ID0gJCgnPGRpdiBpZD0iaHRtbF82Mjk3M2E2ZmJiOWU0NjgwYmE2YWYxMjgxOTM5NTYxNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGFya2RhbGUgLCBSb25jZXN2YWxsZXMsIFdlc3QgVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODFmMjUxZGIzNDllNDBhZjk4OGY4MTgwMWQ2OTljNDUuc2V0Q29udGVudChodG1sXzYyOTczYTZmYmI5ZTQ2ODBiYTZhZjEyODE5Mzk1NjE2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U0M2VmNThkN2RiODQ3ZjE4YWVjYTEyZmNhZTVlOGE4LmJpbmRQb3B1cChwb3B1cF84MWYyNTFkYjM0OWU0MGFmOTg4ZjgxODAxZDY5OWM0NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jZTJmOGI0NjE4ZTM0YjJmYTI0NDdkMjQ5NGEzYWNhOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjYzNjk2NTYsLTc5LjYxNTgxODk5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNjQyYzE3YTQ1OTQ3M2I4YWNkZTM0NmNhYzQ1ZjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNkZDA3YzgxMDc0NzQ3ODlhYzA5NjlhZGQxOGNjNTM4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYxYjBkN2RkYmQyYzQ1MjViNGMxNmNjMjE4NDFjN2I5ID0gJCgnPGRpdiBpZD0iaHRtbF82MWIwZDdkZGJkMmM0NTI1YjRjMTZjYzIxODQxYzdiOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2FuYWRhIFBvc3QgR2F0ZXdheSBQcm9jZXNzaW5nIENlbnRyZSwgTWlzc2lzc2F1Z2E8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNkZDA3YzgxMDc0NzQ3ODlhYzA5NjlhZGQxOGNjNTM4LnNldENvbnRlbnQoaHRtbF82MWIwZDdkZGJkMmM0NTI1YjRjMTZjYzIxODQxYzdiOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jZTJmOGI0NjE4ZTM0YjJmYTI0NDdkMjQ5NGEzYWNhOC5iaW5kUG9wdXAocG9wdXBfM2RkMDdjODEwNzQ3NDc4OWFjMDk2OWFkZDE4Y2M1MzgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjg1NGRlNGMwNTE3NDM1YTgwOGI4ZDQ3ODBmZWI1M2QgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42ODg5MDU0LC03OS41NTQ3MjQ0MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjY0MmMxN2E0NTk0NzNiOGFjZGUzNDZjYWM0NWYxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zODVkMTI4Yjk4YmY0NTNiYjZkMTUzYTAwN2JlMmRlZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iMTIxYmNiNzZmNGM0MjhhYjUzZDEzMzNjYWY5YWMxNyA9ICQoJzxkaXYgaWQ9Imh0bWxfYjEyMWJjYjc2ZjRjNDI4YWI1M2QxMzMzY2FmOWFjMTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPktpbmdzdmlldyBWaWxsYWdlICwgU3QuIFBoaWxsaXBzICwgTWFydGluIEdyb3ZlIEdhcmRlbnMgLCBSaWNodmlldyBHYXJkZW5zLCBFdG9iaWNva2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM4NWQxMjhiOThiZjQ1M2JiNmQxNTNhMDA3YmUyZGVmLnNldENvbnRlbnQoaHRtbF9iMTIxYmNiNzZmNGM0MjhhYjUzZDEzMzNjYWY5YWMxNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iODU0ZGU0YzA1MTc0MzVhODA4YjhkNDc4MGZlYjUzZC5iaW5kUG9wdXAocG9wdXBfMzg1ZDEyOGI5OGJmNDUzYmI2ZDE1M2EwMDdiZTJkZWYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmI4MTlmZjllNGFkNGI4NmE1YWNkMmY4NTMxMDQ0N2QgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43OTQyMDAzLC03OS4yNjIwMjk0MDAwMDAwMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjY0MmMxN2E0NTk0NzNiOGFjZGUzNDZjYWM0NWYxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iZTEyZDFkNGZhNmM0NDViYmVmYzQzZjUwYTUzY2NhMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82NTNmY2U0NzhkZGU0NTJkODc4M2M4ZmFkNTM3ZmUyMyA9ICQoJzxkaXYgaWQ9Imh0bWxfNjUzZmNlNDc4ZGRlNDUyZDg3ODNjOGZhZDUzN2ZlMjMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFnaW5jb3VydCwgU2NhcmJvcm91Z2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JlMTJkMWQ0ZmE2YzQ0NWJiZWZjNDNmNTBhNTNjY2EwLnNldENvbnRlbnQoaHRtbF82NTNmY2U0NzhkZGU0NTJkODc4M2M4ZmFkNTM3ZmUyMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mYjgxOWZmOWU0YWQ0Yjg2YTVhY2QyZjg1MzEwNDQ3ZC5iaW5kUG9wdXAocG9wdXBfYmUxMmQxZDRmYTZjNDQ1YmJlZmM0M2Y1MGE1M2NjYTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODY0M2E0NGY0ZDE1NGM1M2IzMzE5NDM4NWQxMWNiMjYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MDQzMjQ0LC03OS4zODg3OTAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNjQyYzE3YTQ1OTQ3M2I4YWNkZTM0NmNhYzQ1ZjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUyMzcxNmYxNTYwZTRlYzZhZDk4MWU4NTVlZTNiMTNjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVkZDEyNTdjZjUwMzQ1OWY5ZTM5NmZhZThiMmQyZjA4ID0gJCgnPGRpdiBpZD0iaHRtbF81ZGQxMjU3Y2Y1MDM0NTlmOWUzOTZmYWU4YjJkMmYwOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RGF2aXN2aWxsZSwgQ2VudHJhbCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MjM3MTZmMTU2MGU0ZWM2YWQ5ODFlODU1ZWUzYjEzYy5zZXRDb250ZW50KGh0bWxfNWRkMTI1N2NmNTAzNDU5ZjllMzk2ZmFlOGIyZDJmMDgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODY0M2E0NGY0ZDE1NGM1M2IzMzE5NDM4NWQxMWNiMjYuYmluZFBvcHVwKHBvcHVwXzUyMzcxNmYxNTYwZTRlYzZhZDk4MWU4NTVlZTNiMTNjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJkMTc3MjZkNGNkYzRlM2U5ZmEyZGI4YjMyZDM2NDZmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjYyNjk1NiwtNzkuNDAwMDQ5M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjY0MmMxN2E0NTk0NzNiOGFjZGUzNDZjYWM0NWYxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xMDZmY2M4ZDgyMTQ0YWEzOTYxOWM1NjRhMjI0YzYxYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80NTk5ZGE4NDA0ZDI0ZjgwOTFkYzBjZTNkZjJjMzhkYyA9ICQoJzxkaXYgaWQ9Imh0bWxfNDU5OWRhODQwNGQyNGY4MDkxZGMwY2UzZGYyYzM4ZGMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlVuaXZlcnNpdHkgb2YgVG9yb250byAsIEhhcmJvcmQsIERvd250b3duIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzEwNmZjYzhkODIxNDRhYTM5NjE5YzU2NGEyMjRjNjFhLnNldENvbnRlbnQoaHRtbF80NTk5ZGE4NDA0ZDI0ZjgwOTFkYzBjZTNkZjJjMzhkYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yZDE3NzI2ZDRjZGM0ZTNlOWZhMmRiOGIzMmQzNjQ2Zi5iaW5kUG9wdXAocG9wdXBfMTA2ZmNjOGQ4MjE0NGFhMzk2MTljNTY0YTIyNGM2MWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGJlMThlNzQyYjk2NGRhN2ExYzM5MzRhNzliM2UyMDggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NTE1NzA2LC03OS40ODQ0NDk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNjQyYzE3YTQ1OTQ3M2I4YWNkZTM0NmNhYzQ1ZjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2QyNGZjMjE0NGNhYTRkY2M5MGYxYzFkNjFjNTRkOWU4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA0ZWMyNThiNTk2YzQzNjQ5N2YwZGRiNmQ5ZWIxOWMzID0gJCgnPGRpdiBpZD0iaHRtbF8wNGVjMjU4YjU5NmM0MzY0OTdmMGRkYjZkOWViMTljMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UnVubnltZWRlICwgU3dhbnNlYSwgV2VzdCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kMjRmYzIxNDRjYWE0ZGNjOTBmMWMxZDYxYzU0ZDllOC5zZXRDb250ZW50KGh0bWxfMDRlYzI1OGI1OTZjNDM2NDk3ZjBkZGI2ZDllYjE5YzMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGJlMThlNzQyYjk2NGRhN2ExYzM5MzRhNzliM2UyMDguYmluZFBvcHVwKHBvcHVwX2QyNGZjMjE0NGNhYTRkY2M5MGYxYzFkNjFjNTRkOWU4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIxOTE4MmY5ZDA4NTQ5MGQ4Y2UyOTczNmM3ZjRkNTJhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzgxNjM3NSwtNzkuMzA0MzAyMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjY0MmMxN2E0NTk0NzNiOGFjZGUzNDZjYWM0NWYxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zNzU1OTU4YTZiY2U0YjAzYjZhMTBmNTc5ZDUwOWY1ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zMTVlMDIyNzZkNGY0M2QzOTViY2YyYTNmZDhlNTQzMCA9ICQoJzxkaXYgaWQ9Imh0bWxfMzE1ZTAyMjc2ZDRmNDNkMzk1YmNmMmEzZmQ4ZTU0MzAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNsYXJrcyBDb3JuZXJzICwgVGFtIE8mIzM5O1NoYW50ZXIgLCBTdWxsaXZhbiwgU2NhcmJvcm91Z2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM3NTU5NThhNmJjZTRiMDNiNmExMGY1NzlkNTA5ZjVkLnNldENvbnRlbnQoaHRtbF8zMTVlMDIyNzZkNGY0M2QzOTViY2YyYTNmZDhlNTQzMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yMTkxODJmOWQwODU0OTBkOGNlMjk3MzZjN2Y0ZDUyYS5iaW5kUG9wdXAocG9wdXBfMzc1NTk1OGE2YmNlNGIwM2I2YTEwZjU3OWQ1MDlmNWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTg0MzM2MjI2MTU4NDljZmJiYTNlZjQ1YzU4YTNiYjAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42ODk1NzQzLC03OS4zODMxNTk5MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjY0MmMxN2E0NTk0NzNiOGFjZGUzNDZjYWM0NWYxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80NzBhN2JjN2NkYWE0M2IwODc2MjQzZDEwMDAyMDhiZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82NjhjZWRjMDkzZTM0NGVhYjYwNDY4YmRhOGEwNzlhZiA9ICQoJzxkaXYgaWQ9Imh0bWxfNjY4Y2VkYzA5M2UzNDRlYWI2MDQ2OGJkYThhMDc5YWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1vb3JlIFBhcmsgLCBTdW1tZXJoaWxsIEVhc3QsIENlbnRyYWwgVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDcwYTdiYzdjZGFhNDNiMDg3NjI0M2QxMDAwMjA4YmQuc2V0Q29udGVudChodG1sXzY2OGNlZGMwOTNlMzQ0ZWFiNjA0NjhiZGE4YTA3OWFmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk4NDMzNjIyNjE1ODQ5Y2ZiYmEzZWY0NWM1OGEzYmIwLmJpbmRQb3B1cChwb3B1cF80NzBhN2JjN2NkYWE0M2IwODc2MjQzZDEwMDAyMDhiZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82YWI5NTMzMjBiMDE0Mzg1YjRkODg0ZGE5MTZhNzcyOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY1MzIwNTcsLTc5LjQwMDA0OTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI2NDJjMTdhNDU5NDczYjhhY2RlMzQ2Y2FjNDVmMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWJhOTNmNmIwYTFhNGJiZGFkNTVkOWU4MjRmOWI2MDIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGI4ZTlkODc2OTE2NDI2NmJmNWQ2NzYwNWZiZjgxY2IgPSAkKCc8ZGl2IGlkPSJodG1sXzhiOGU5ZDg3NjkxNjQyNjZiZjVkNjc2MDVmYmY4MWNiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5LZW5zaW5ndG9uIE1hcmtldCAsIENoaW5hdG93biAsIEdyYW5nZSBQYXJrLCBEb3dudG93biBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lYmE5M2Y2YjBhMWE0YmJkYWQ1NWQ5ZTgyNGY5YjYwMi5zZXRDb250ZW50KGh0bWxfOGI4ZTlkODc2OTE2NDI2NmJmNWQ2NzYwNWZiZjgxY2IpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmFiOTUzMzIwYjAxNDM4NWI0ZDg4NGRhOTE2YTc3MjguYmluZFBvcHVwKHBvcHVwX2ViYTkzZjZiMGExYTRiYmRhZDU1ZDllODI0ZjliNjAyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc4NDZkZDczOTdhMzQ5OGQ4OTMyNTliNTk2NjljNzUxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuODE1MjUyMiwtNzkuMjg0NTc3Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjY0MmMxN2E0NTk0NzNiOGFjZGUzNDZjYWM0NWYxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80OWZiZTEwOTEzOGM0MDM5YmE2YWYyNjQ4NTZhOWQ5ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jYjlkOTAwYWM1N2M0MjFiYTZiZTMzMzQ2YmUwYTcwOSA9ICQoJzxkaXYgaWQ9Imh0bWxfY2I5ZDkwMGFjNTdjNDIxYmE2YmUzMzM0NmJlMGE3MDkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1pbGxpa2VuICwgQWdpbmNvdXJ0IE5vcnRoICwgU3RlZWxlcyBFYXN0ICwgTCYjMzk7QW1vcmVhdXggRWFzdCwgU2NhcmJvcm91Z2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ5ZmJlMTA5MTM4YzQwMzliYTZhZjI2NDg1NmE5ZDlkLnNldENvbnRlbnQoaHRtbF9jYjlkOTAwYWM1N2M0MjFiYTZiZTMzMzQ2YmUwYTcwOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83ODQ2ZGQ3Mzk3YTM0OThkODkzMjU5YjU5NjY5Yzc1MS5iaW5kUG9wdXAocG9wdXBfNDlmYmUxMDkxMzhjNDAzOWJhNmFmMjY0ODU2YTlkOWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTU1NmE3NzcxNjU5NGJjNDgxYTA3NDJhYWFmMWJjNDggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42ODY0MTIyOTk5OTk5OSwtNzkuNDAwMDQ5M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjY0MmMxN2E0NTk0NzNiOGFjZGUzNDZjYWM0NWYxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jYzY3NTNlYjcxZWM0NGI3ODI0MzdlOWU4MTdhYjk5YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84ZjRhOGU2ZmNlNDc0ZWI2YjFkZDIwZWJhZjBhMGEzOSA9ICQoJzxkaXYgaWQ9Imh0bWxfOGY0YThlNmZjZTQ3NGViNmIxZGQyMGViYWYwYTBhMzkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN1bW1lcmhpbGwgV2VzdCAsIFJhdGhuZWxseSAsIFNvdXRoIEhpbGwgLCBGb3Jlc3QgSGlsbCBTRSAsIERlZXIgUGFyaywgQ2VudHJhbCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jYzY3NTNlYjcxZWM0NGI3ODI0MzdlOWU4MTdhYjk5Yy5zZXRDb250ZW50KGh0bWxfOGY0YThlNmZjZTQ3NGViNmIxZGQyMGViYWYwYTBhMzkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTU1NmE3NzcxNjU5NGJjNDgxYTA3NDJhYWFmMWJjNDguYmluZFBvcHVwKHBvcHVwX2NjNjc1M2ViNzFlYzQ0Yjc4MjQzN2U5ZTgxN2FiOTljKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFiN2JkZDIwMjIxNTQxZGI5N2YxODBkNTVkYWExYmE1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjI4OTQ2NywtNzkuMzk0NDE5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjY0MmMxN2E0NTk0NzNiOGFjZGUzNDZjYWM0NWYxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kNmI1YjdiZDViZjU0ZjMxYTkxYjljY2RkMGU0NTYxYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wMjc5MTBlZWE2MjE0MGE5OWM0MGQ1MzA1YTQ5NDFmMCA9ICQoJzxkaXYgaWQ9Imh0bWxfMDI3OTEwZWVhNjIxNDBhOTljNDBkNTMwNWE0OTQxZjAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNOIFRvd2VyICwgS2luZyBhbmQgU3BhZGluYSAsIFJhaWx3YXkgTGFuZHMgLCBIYXJib3VyZnJvbnQgV2VzdCAsIEJhdGh1cnN0IFF1YXkgLCBTb3V0aCBOaWFnYXJhICwgSXNsYW5kIGFpcnBvcnQsIERvd250b3duIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q2YjViN2JkNWJmNTRmMzFhOTFiOWNjZGQwZTQ1NjFiLnNldENvbnRlbnQoaHRtbF8wMjc5MTBlZWE2MjE0MGE5OWM0MGQ1MzA1YTQ5NDFmMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xYjdiZGQyMDIyMTU0MWRiOTdmMTgwZDU1ZGFhMWJhNS5iaW5kUG9wdXAocG9wdXBfZDZiNWI3YmQ1YmY1NGYzMWE5MWI5Y2NkZDBlNDU2MWIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzFjZTViNzgwYjk1NDEyN2IyYjRiMTRhMjZkMjk3ZmEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42MDU2NDY2LC03OS41MDEzMjA3MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjY0MmMxN2E0NTk0NzNiOGFjZGUzNDZjYWM0NWYxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMmNiMWY3YTg5MzM0OGQ3YjlhZTkwMGIxZmUwOWE1NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yMjc0NTJlNTEyODM0ZWY4OGU3ZGFmZTIzMjkyMTY5NiA9ICQoJzxkaXYgaWQ9Imh0bWxfMjI3NDUyZTUxMjgzNGVmODhlN2RhZmUyMzI5MjE2OTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5ldyBUb3JvbnRvICwgTWltaWNvIFNvdXRoICwgSHVtYmVyIEJheSBTaG9yZXMsIEV0b2JpY29rZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTJjYjFmN2E4OTMzNDhkN2I5YWU5MDBiMWZlMDlhNTQuc2V0Q29udGVudChodG1sXzIyNzQ1MmU1MTI4MzRlZjg4ZTdkYWZlMjMyOTIxNjk2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzMxY2U1Yjc4MGI5NTQxMjdiMmI0YjE0YTI2ZDI5N2ZhLmJpbmRQb3B1cChwb3B1cF9hMmNiMWY3YTg5MzM0OGQ3YjlhZTkwMGIxZmUwOWE1NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82ODBjMWE5MDE2NmI0ODU5YTVjODkzNGQ3OGJkOTkwYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjczOTQxNjM5OTk5OTk5NiwtNzkuNTg4NDM2OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjY0MmMxN2E0NTk0NzNiOGFjZGUzNDZjYWM0NWYxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iNGRjM2M3NWY5MWY0ZDU3OWYxODc2MWJkYWVmYzU1MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81NTVmYThiYzNmNzQ0NjVlODY0NjA0MDRjY2ZjNjFkZiA9ICQoJzxkaXYgaWQ9Imh0bWxfNTU1ZmE4YmMzZjc0NDY1ZTg2NDYwNDA0Y2NmYzYxZGYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNvdXRoIFN0ZWVsZXMgLCBTaWx2ZXJzdG9uZSAsIEh1bWJlcmdhdGUgLCBKYW1lc3Rvd24gLCBNb3VudCBPbGl2ZSAsIEJlYXVtb25kIEhlaWdodHMgLCBUaGlzdGxldG93biAsIEFsYmlvbiBHYXJkZW5zLCBFdG9iaWNva2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I0ZGMzYzc1ZjkxZjRkNTc5ZjE4NzYxYmRhZWZjNTUwLnNldENvbnRlbnQoaHRtbF81NTVmYThiYzNmNzQ0NjVlODY0NjA0MDRjY2ZjNjFkZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82ODBjMWE5MDE2NmI0ODU5YTVjODkzNGQ3OGJkOTkwYy5iaW5kUG9wdXAocG9wdXBfYjRkYzNjNzVmOTFmNGQ1NzlmMTg3NjFiZGFlZmM1NTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjEyNTkwNjhjNTFkNDY0OThkN2Q0ZTY1YmI2MzkxMGEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43OTk1MjUyMDAwMDAwMDUsLTc5LjMxODM4ODddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI2NDJjMTdhNDU5NDczYjhhY2RlMzQ2Y2FjNDVmMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzNhZWFkMDkyYTQwNDg3MGFiNjJiMzc2YTI1NDQ5NmIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTZjOGQzNzgwNTc3NDJhZTgxZmYxOGExMGU2NzRjNWUgPSAkKCc8ZGl2IGlkPSJodG1sX2E2YzhkMzc4MDU3NzQyYWU4MWZmMThhMTBlNjc0YzVlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdGVlbGVzIFdlc3QgLCBMJiMzOTtBbW9yZWF1eCBXZXN0LCBTY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzNhZWFkMDkyYTQwNDg3MGFiNjJiMzc2YTI1NDQ5NmIuc2V0Q29udGVudChodG1sX2E2YzhkMzc4MDU3NzQyYWU4MWZmMThhMTBlNjc0YzVlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzIxMjU5MDY4YzUxZDQ2NDk4ZDdkNGU2NWJiNjM5MTBhLmJpbmRQb3B1cChwb3B1cF8zM2FlYWQwOTJhNDA0ODcwYWI2MmIzNzZhMjU0NDk2Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wMTI3ZjIxOGZmMzE0NGNkYTFkODM4YmE5MGVjODQyZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY3OTU2MjYsLTc5LjM3NzUyOTQwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNjQyYzE3YTQ1OTQ3M2I4YWNkZTM0NmNhYzQ1ZjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY3ZGFmMWM1YTY5YjQwZmE4ZmZiMWExMjg4OGFlZjJiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2QzZGNhMTM1NmRkYjQwNDliMjcwYThhZTg1Y2Y0MzJhID0gJCgnPGRpdiBpZD0iaHRtbF9kM2RjYTEzNTZkZGI0MDQ5YjI3MGE4YWU4NWNmNDMyYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um9zZWRhbGUsIERvd250b3duIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY3ZGFmMWM1YTY5YjQwZmE4ZmZiMWExMjg4OGFlZjJiLnNldENvbnRlbnQoaHRtbF9kM2RjYTEzNTZkZGI0MDQ5YjI3MGE4YWU4NWNmNDMyYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wMTI3ZjIxOGZmMzE0NGNkYTFkODM4YmE5MGVjODQyZC5iaW5kUG9wdXAocG9wdXBfNjdkYWYxYzVhNjliNDBmYThmZmIxYTEyODg4YWVmMmIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzkxOTQ3NTYyZGZhNGQzMmE0YTlmNDE2NDBhM2MxZDQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NDY0MzUyLC03OS4zNzQ4NDU5OTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjY0MmMxN2E0NTk0NzNiOGFjZGUzNDZjYWM0NWYxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xMWM1ZGI4MWNmOGY0OTI0OGZlYTI5YzMwZTMyMDk2ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yMmJlNzAwMzliNzk0MWRhODk4MjVkMWRjYzY0NTkyZiA9ICQoJzxkaXYgaWQ9Imh0bWxfMjJiZTcwMDM5Yjc5NDFkYTg5ODI1ZDFkY2M2NDU5MmYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN0biBBIFBPIEJveGVzLCBEb3dudG93biBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xMWM1ZGI4MWNmOGY0OTI0OGZlYTI5YzMwZTMyMDk2Zi5zZXRDb250ZW50KGh0bWxfMjJiZTcwMDM5Yjc5NDFkYTg5ODI1ZDFkY2M2NDU5MmYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzkxOTQ3NTYyZGZhNGQzMmE0YTlmNDE2NDBhM2MxZDQuYmluZFBvcHVwKHBvcHVwXzExYzVkYjgxY2Y4ZjQ5MjQ4ZmVhMjljMzBlMzIwOTZmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzgzZTMxMmI1OTQ1ZDQ3YzViNjU4MDY1OWI0NzMxNGZjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjAyNDEzNzAwMDAwMDEsLTc5LjU0MzQ4NDA5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNjQyYzE3YTQ1OTQ3M2I4YWNkZTM0NmNhYzQ1ZjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk1ZmJlNWFhZDBkMTQ3YjNhZDVmNGIzNzZiNGViNGRlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NhMGRiYmJiZmIyNjQyODliOWQxNjYxMDUwMzNjZTQzID0gJCgnPGRpdiBpZD0iaHRtbF9jYTBkYmJiYmZiMjY0Mjg5YjlkMTY2MTA1MDMzY2U0MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QWxkZXJ3b29kICwgTG9uZyBCcmFuY2gsIEV0b2JpY29rZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTVmYmU1YWFkMGQxNDdiM2FkNWY0YjM3NmI0ZWI0ZGUuc2V0Q29udGVudChodG1sX2NhMGRiYmJiZmIyNjQyODliOWQxNjYxMDUwMzNjZTQzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzgzZTMxMmI1OTQ1ZDQ3YzViNjU4MDY1OWI0NzMxNGZjLmJpbmRQb3B1cChwb3B1cF85NWZiZTVhYWQwZDE0N2IzYWQ1ZjRiMzc2YjRlYjRkZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80NzI4MmM3ZDEzYzA0MzkxYWIzMTRmNjhiMGZjZTUxMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcwNjc0ODI5OTk5OTk5NCwtNzkuNTk0MDU0NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjY0MmMxN2E0NTk0NzNiOGFjZGUzNDZjYWM0NWYxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jNDAzYjEyZmRiYjc0N2Q5OTUwYTFmZDAyMTVhZWEwYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jNzg0Y2MxOGQ2NDM0MzQwOTVmZTBhMmMwYTVlMGZmYyA9ICQoJzxkaXYgaWQ9Imh0bWxfYzc4NGNjMThkNjQzNDM0MDk1ZmUwYTJjMGE1ZTBmZmMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5vcnRod2VzdCwgRXRvYmljb2tlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNDAzYjEyZmRiYjc0N2Q5OTUwYTFmZDAyMTVhZWEwYi5zZXRDb250ZW50KGh0bWxfYzc4NGNjMThkNjQzNDM0MDk1ZmUwYTJjMGE1ZTBmZmMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDcyODJjN2QxM2MwNDM5MWFiMzE0ZjY4YjBmY2U1MTEuYmluZFBvcHVwKHBvcHVwX2M0MDNiMTJmZGJiNzQ3ZDk5NTBhMWZkMDIxNWFlYTBiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc1YTc0MjU2NTkwOTRmNDM5YTI0NTRjMTYzOGZjMGIxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuODM2MTI0NzAwMDAwMDA2LC03OS4yMDU2MzYwOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjY0MmMxN2E0NTk0NzNiOGFjZGUzNDZjYWM0NWYxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wOThkYzExZTdmYTc0MWE0YTgzM2UwYmUyNGVkNDBlMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kYjNiZmIxZWQ5ZmE0MDk3OWM4ZWJkNTYzODU1Mjc4OSA9ICQoJzxkaXYgaWQ9Imh0bWxfZGIzYmZiMWVkOWZhNDA5NzljOGViZDU2Mzg1NTI3ODkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlVwcGVyIFJvdWdlLCBTY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDk4ZGMxMWU3ZmE3NDFhNGE4MzNlMGJlMjRlZDQwZTIuc2V0Q29udGVudChodG1sX2RiM2JmYjFlZDlmYTQwOTc5YzhlYmQ1NjM4NTUyNzg5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzc1YTc0MjU2NTkwOTRmNDM5YTI0NTRjMTYzOGZjMGIxLmJpbmRQb3B1cChwb3B1cF8wOThkYzExZTdmYTc0MWE0YTgzM2UwYmUyNGVkNDBlMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMjRmMDFjM2I4NGQ0YzQxOTk2MWE2NmUxMGQxZTFlMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY2Nzk2NywtNzkuMzY3Njc1M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjY0MmMxN2E0NTk0NzNiOGFjZGUzNDZjYWM0NWYxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mMGFjOTc1MzE4YzY0MTIwYmYyZWMyNzU1YzMxNzk3YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80ZDQwYTAyYmM0NWI0M2QyOTg4MWIzOTc5MjJiMTljYSA9ICQoJzxkaXYgaWQ9Imh0bWxfNGQ0MGEwMmJjNDViNDNkMjk4ODFiMzk3OTIyYjE5Y2EiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN0LiBKYW1lcyBUb3duICwgQ2FiYmFnZXRvd24sIERvd250b3duIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2YwYWM5NzUzMThjNjQxMjBiZjJlYzI3NTVjMzE3OTdhLnNldENvbnRlbnQoaHRtbF80ZDQwYTAyYmM0NWI0M2QyOTg4MWIzOTc5MjJiMTljYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mMjRmMDFjM2I4NGQ0YzQxOTk2MWE2NmUxMGQxZTFlMC5iaW5kUG9wdXAocG9wdXBfZjBhYzk3NTMxOGM2NDEyMGJmMmVjMjc1NWMzMTc5N2EpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmM2ZWM4MGEwZGNhNDdjNWI1ZmExOTIxYzI4NTBkOTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NDg0MjkyLC03OS4zODIyODAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNjQyYzE3YTQ1OTQ3M2I4YWNkZTM0NmNhYzQ1ZjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MzZDA2ZDA4OTE3ODQxMTdiMWJkNDc2YjI2ZmNjYTI4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JmMTM3MTdiMGY4YTQ3MzVhNzhjOWY2NTFjMjkzY2ZhID0gJCgnPGRpdiBpZD0iaHRtbF9iZjEzNzE3YjBmOGE0NzM1YTc4YzlmNjUxYzI5M2NmYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Rmlyc3QgQ2FuYWRpYW4gUGxhY2UgLCBVbmRlcmdyb3VuZCBjaXR5LCBEb3dudG93biBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jM2QwNmQwODkxNzg0MTE3YjFiZDQ3NmIyNmZjY2EyOC5zZXRDb250ZW50KGh0bWxfYmYxMzcxN2IwZjhhNDczNWE3OGM5ZjY1MWMyOTNjZmEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmM2ZWM4MGEwZGNhNDdjNWI1ZmExOTIxYzI4NTBkOTYuYmluZFBvcHVwKHBvcHVwX2MzZDA2ZDA4OTE3ODQxMTdiMWJkNDc2YjI2ZmNjYTI4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNhOTA4YWUwYTJjNDRiNzc4OWQ0MjE3N2I0ZTMyNWUxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjUzNjUzNjAwMDAwMDA1LC03OS41MDY5NDM2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNjQyYzE3YTQ1OTQ3M2I4YWNkZTM0NmNhYzQ1ZjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M5ZTY5NTMyMDY0NjQwN2Q5ZmQwMDA1OTNhN2ZiYzFlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc0ODRmODA2OGRlMjRlMjU5OTk4NTg2OWFhYjRkM2VkID0gJCgnPGRpdiBpZD0iaHRtbF83NDg0ZjgwNjhkZTI0ZTI1OTk5ODU4NjlhYWI0ZDNlZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VGhlIEtpbmdzd2F5ICwgTW9udGdvbWVyeSBSb2FkICwgT2xkIE1pbGwgTm9ydGgsIEV0b2JpY29rZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzllNjk1MzIwNjQ2NDA3ZDlmZDAwMDU5M2E3ZmJjMWUuc2V0Q29udGVudChodG1sXzc0ODRmODA2OGRlMjRlMjU5OTk4NTg2OWFhYjRkM2VkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNhOTA4YWUwYTJjNDRiNzc4OWQ0MjE3N2I0ZTMyNWUxLmJpbmRQb3B1cChwb3B1cF9jOWU2OTUzMjA2NDY0MDdkOWZkMDAwNTkzYTdmYmMxZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84MTc2MTI0MTZjMGY0ZDc1Yjk4ZGQzY2I5ZTY3NTk0MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY2NTg1OTksLTc5LjM4MzE1OTkwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNjQyYzE3YTQ1OTQ3M2I4YWNkZTM0NmNhYzQ1ZjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk1YzgxMTE5ODQwOTQyNzU5MzRhODJkMzk4ZTgxYWYzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VlYTEzYzdhZWJmYjRhMTg4MDkzNDRmY2U1NzhhZTg5ID0gJCgnPGRpdiBpZD0iaHRtbF9lZWExM2M3YWViZmI0YTE4ODA5MzQ0ZmNlNTc4YWU4OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2h1cmNoIGFuZCBXZWxsZXNsZXksIERvd250b3duIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk1YzgxMTE5ODQwOTQyNzU5MzRhODJkMzk4ZTgxYWYzLnNldENvbnRlbnQoaHRtbF9lZWExM2M3YWViZmI0YTE4ODA5MzQ0ZmNlNTc4YWU4OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84MTc2MTI0MTZjMGY0ZDc1Yjk4ZGQzY2I5ZTY3NTk0MS5iaW5kUG9wdXAocG9wdXBfOTVjODExMTk4NDA5NDI3NTkzNGE4MmQzOThlODFhZjMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWM5NDRhZjhhZGQzNDdmZjhlZjUwZDU5NGY2MDQzMWQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NjI3NDM5LC03OS4zMjE1NThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI2NDJjMTdhNDU5NDczYjhhY2RlMzQ2Y2FjNDVmMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDcyMWY3ZjQyN2QzNGU0OTgyOTcwOTE2MGFmYWNiYjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWRmYzNkODQ0OTg1NDFhNjljYmRmMjVjMzZjMTM3N2YgPSAkKCc8ZGl2IGlkPSJodG1sXzFkZmMzZDg0NDk4NTQxYTY5Y2JkZjI1YzM2YzEzNzdmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CdXNpbmVzcyByZXBseSBtYWlsIFByb2Nlc3NpbmcgQ2VudHJFLCBFYXN0IFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q3MjFmN2Y0MjdkMzRlNDk4Mjk3MDkxNjBhZmFjYmI3LnNldENvbnRlbnQoaHRtbF8xZGZjM2Q4NDQ5ODU0MWE2OWNiZGYyNWMzNmMxMzc3Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lYzk0NGFmOGFkZDM0N2ZmOGVmNTBkNTk0ZjYwNDMxZC5iaW5kUG9wdXAocG9wdXBfZDcyMWY3ZjQyN2QzNGU0OTgyOTcwOTE2MGFmYWNiYjcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGNhN2E0NDcxMDA2NDNmNTkxOGExMDM5ZmMxNDZlMTUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42MzYyNTc5LC03OS40OTg1MDkwOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjY0MmMxN2E0NTk0NzNiOGFjZGUzNDZjYWM0NWYxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mNjc4Mjk2YjAxNGQ0MjM0ODE2MzBhZTI5NjY3ODkzYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mNjYzNjVlMzQ5YjA0M2RkODhjY2I3MjVhYWY5MmIwYSA9ICQoJzxkaXYgaWQ9Imh0bWxfZjY2MzY1ZTM0OWIwNDNkZDg4Y2NiNzI1YWFmOTJiMGEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9sZCBNaWxsIFNvdXRoICwgS2luZyYjMzk7cyBNaWxsIFBhcmsgLCBTdW5ueWxlYSAsIEh1bWJlciBCYXkgLCBNaW1pY28gTkUgLCBUaGUgUXVlZW5zd2F5IEVhc3QgLCBSb3lhbCBZb3JrIFNvdXRoIEVhc3QgLCBLaW5nc3dheSBQYXJrIFNvdXRoIEVhc3QsIEV0b2JpY29rZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjY3ODI5NmIwMTRkNDIzNDgxNjMwYWUyOTY2Nzg5M2Iuc2V0Q29udGVudChodG1sX2Y2NjM2NWUzNDliMDQzZGQ4OGNjYjcyNWFhZjkyYjBhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzRjYTdhNDQ3MTAwNjQzZjU5MThhMTAzOWZjMTQ2ZTE1LmJpbmRQb3B1cChwb3B1cF9mNjc4Mjk2YjAxNGQ0MjM0ODE2MzBhZTI5NjY3ODkzYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iYWYwZjJiZjllYTg0NTEyODkwMWVmODA0MmVjMzkxOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjYyODg0MDgsLTc5LjUyMDk5OTQwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNjQyYzE3YTQ1OTQ3M2I4YWNkZTM0NmNhYzQ1ZjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVhNGMwYWExMTIzYTRmNGJhMGVjNWQzYTQzMGRkZGVhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2QxZTFmYzg2YjQ4YTQ5NmJiZTE0MDRkZDg1MzdhNGY1ID0gJCgnPGRpdiBpZD0iaHRtbF9kMWUxZmM4NmI0OGE0OTZiYmUxNDA0ZGQ4NTM3YTRmNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWltaWNvIE5XICwgVGhlIFF1ZWVuc3dheSBXZXN0ICwgU291dGggb2YgQmxvb3IgLCBLaW5nc3dheSBQYXJrIFNvdXRoIFdlc3QgLCBSb3lhbCBZb3JrIFNvdXRoIFdlc3QsIEV0b2JpY29rZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWE0YzBhYTExMjNhNGY0YmEwZWM1ZDNhNDMwZGRkZWEuc2V0Q29udGVudChodG1sX2QxZTFmYzg2YjQ4YTQ5NmJiZTE0MDRkZDg1MzdhNGY1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JhZjBmMmJmOWVhODQ1MTI4OTAxZWY4MDQyZWMzOTE4LmJpbmRQb3B1cChwb3B1cF81YTRjMGFhMTEyM2E0ZjRiYTBlYzVkM2E0MzBkZGRlYSk7CgogICAgICAgICAgICAKICAgICAgICAKPC9zY3JpcHQ+ onload=\"this.contentDocument.open();this.contentDocument.write(atob(this.getAttribute('data-html')));this.contentDocument.close();\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x7ff42d0d21d0>"
]
},
"execution_count": 55,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Here is the fun part\n",
"# I am using fullium and one of the corrdinates in the data set to plot the map of Toronto\n",
"# Them I am plotting the Boroughs based on their coordinates\n",
"import folium # map rendering library\n",
"map_toronto = folium.Map(location=[df.iloc[0,3], df.iloc[0,4]], zoom_start=10)\n",
"\n",
"# add markers to map\n",
"for lat, lng, borough, neighborhood in zip(df['Latitude_x'], df['Longitude_x'], df['Borough'], df['Neighborhood']):\n",
" label = '{}, {}'.format(neighborhood, borough)\n",
" label = folium.Popup(label, parse_html=True)\n",
" folium.CircleMarker(\n",
" [lat, lng],\n",
" radius=5,\n",
" popup=label,\n",
" color='blue',\n",
" fill=True,\n",
" fill_color='#3186cc',\n",
" fill_opacity=0.7,\n",
" parse_html=False).add_to(map_toronto) \n",
" \n",
"map_toronto"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python",
"language": "python",
"name": "conda-env-python-py"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.10"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment